Update To 11.40.268.0
[platform/framework/web/crosswalk.git] / src / content / browser / accessibility / browser_accessibility_win.cc
index 95535f4..924ad75 100644 (file)
@@ -21,6 +21,7 @@
 #include "ui/accessibility/ax_text_utils.h"
 #include "ui/base/win/accessibility_ids_win.h"
 #include "ui/base/win/accessibility_misc_utils.h"
+#include "ui/base/win/atl_module.h"
 
 namespace content {
 
@@ -114,7 +115,7 @@ STDMETHODIMP BrowserAccessibilityRelation::get_nTargets(long* n_targets) {
 
   BrowserAccessibilityManager* manager = owner_->manager();
   for (long i = *n_targets - 1; i >= 0; --i) {
-    BrowserAccessibility* result = manager->GetFromRendererID(target_ids_[i]);
+    BrowserAccessibility* result = manager->GetFromID(target_ids_[i]);
     if (!result || !result->instance_active()) {
       *n_targets = 0;
       break;
@@ -138,7 +139,7 @@ STDMETHODIMP BrowserAccessibilityRelation::get_target(long target_index,
 
   BrowserAccessibilityManager* manager = owner_->manager();
   BrowserAccessibility* result =
-      manager->GetFromRendererID(target_ids_[target_index]);
+      manager->GetFromID(target_ids_[target_index]);
   if (!result || !result->instance_active())
     return E_FAIL;
 
@@ -179,6 +180,7 @@ STDMETHODIMP BrowserAccessibilityRelation::get_targets(long max_targets,
 
 // static
 BrowserAccessibility* BrowserAccessibility::Create() {
+  ui::win::CreateATLModuleIfNeeded();
   CComObject<BrowserAccessibilityWin>* instance;
   HRESULT hr = CComObject<BrowserAccessibilityWin>::CreateInstance(&instance);
   DCHECK(SUCCEEDED(hr));
@@ -471,7 +473,7 @@ STDMETHODIMP BrowserAccessibilityWin::get_accName(VARIANT var_id, BSTR* name) {
     if (target->GetIntAttribute(ui::AX_ATTR_TITLE_UI_ELEMENT,
                                 &title_elem_id)) {
       BrowserAccessibility* title_elem =
-          manager()->GetFromRendererID(title_elem_id);
+          manager()->GetFromID(title_elem_id);
       if (title_elem)
         name_str = title_elem->GetTextRecursive();
     }
@@ -493,12 +495,12 @@ STDMETHODIMP BrowserAccessibilityWin::get_accParent(IDispatch** disp_parent) {
   if (!disp_parent)
     return E_INVALIDARG;
 
-  IAccessible* parent_obj = parent()->ToBrowserAccessibilityWin();
+  IAccessible* parent_obj = GetParent()->ToBrowserAccessibilityWin();
   if (parent_obj == NULL) {
     // This happens if we're the root of the tree;
     // return the IAccessible for the window.
     parent_obj =
-         manager()->ToBrowserAccessibilityManagerWin()->parent_iaccessible();
+        manager()->ToBrowserAccessibilityManagerWin()->GetParentIAccessible();
     // |parent| can only be NULL if the manager was created before the parent
     // IAccessible was known and it wasn't subsequently set before a client
     // requested it. This has been fixed. |parent| may also be NULL during
@@ -611,12 +613,12 @@ STDMETHODIMP BrowserAccessibilityWin::get_accSelection(VARIANT* selected) {
   if (!instance_active())
     return E_FAIL;
 
-  if (blink_role() != ui::AX_ROLE_LIST_BOX)
+  if (GetRole() != ui::AX_ROLE_LIST_BOX)
     return E_NOTIMPL;
 
   unsigned long selected_count = 0;
-  for (size_t i = 0; i < children().size(); ++i) {
-    if (children()[i]->HasState(ui::AX_STATE_SELECTED))
+  for (size_t i = 0; i < InternalChildCount(); ++i) {
+    if (InternalGetChild(i)->HasState(ui::AX_STATE_SELECTED))
       ++selected_count;
   }
 
@@ -626,11 +628,11 @@ STDMETHODIMP BrowserAccessibilityWin::get_accSelection(VARIANT* selected) {
   }
 
   if (selected_count == 1) {
-    for (size_t i = 0; i < children().size(); ++i) {
-      if (children()[i]->HasState(ui::AX_STATE_SELECTED)) {
+    for (size_t i = 0; i < InternalChildCount(); ++i) {
+      if (InternalGetChild(i)->HasState(ui::AX_STATE_SELECTED)) {
         selected->vt = VT_DISPATCH;
         selected->pdispVal =
-            children()[i]->ToBrowserAccessibilityWin()->NewReference();
+            InternalGetChild(i)->ToBrowserAccessibilityWin()->NewReference();
         return S_OK;
       }
     }
@@ -641,11 +643,11 @@ STDMETHODIMP BrowserAccessibilityWin::get_accSelection(VARIANT* selected) {
       new base::win::EnumVariant(selected_count);
   enum_variant->AddRef();
   unsigned long index = 0;
-  for (size_t i = 0; i < children().size(); ++i) {
-    if (children()[i]->HasState(ui::AX_STATE_SELECTED)) {
+  for (size_t i = 0; i < InternalChildCount(); ++i) {
+    if (InternalGetChild(i)->HasState(ui::AX_STATE_SELECTED)) {
       enum_variant->ItemAt(index)->vt = VT_DISPATCH;
       enum_variant->ItemAt(index)->pdispVal =
-        children()[i]->ToBrowserAccessibilityWin()->NewReference();
+        InternalGetChild(i)->ToBrowserAccessibilityWin()->NewReference();
       ++index;
     }
   }
@@ -738,7 +740,11 @@ STDMETHODIMP BrowserAccessibilityWin::get_windowHandle(HWND* window_handle) {
   if (!window_handle)
     return E_INVALIDARG;
 
-  *window_handle = manager()->ToBrowserAccessibilityManagerWin()->parent_hwnd();
+  *window_handle =
+      manager()->ToBrowserAccessibilityManagerWin()->GetParentHWND();
+  if (!*window_handle)
+    return E_FAIL;
+
   return S_OK;
 }
 
@@ -749,7 +755,7 @@ STDMETHODIMP BrowserAccessibilityWin::get_indexInParent(LONG* index_in_parent) {
   if (!index_in_parent)
     return E_INVALIDARG;
 
-  *index_in_parent = this->index_in_parent();
+  *index_in_parent = this->GetIndexInParent();
   return S_OK;
 }
 
@@ -810,7 +816,7 @@ STDMETHODIMP BrowserAccessibilityWin::scrollTo(enum IA2ScrollType scroll_type) {
   if (!instance_active())
     return E_FAIL;
 
-  gfx::Rect r = location();
+  gfx::Rect r = GetLocation();
   switch(scroll_type) {
     case IA2_SCROLL_TYPE_TOP_LEFT:
       manager()->ScrollToMakeVisible(*this, gfx::Rect(r.x(), r.y(), 0, 0));
@@ -858,8 +864,8 @@ STDMETHODIMP BrowserAccessibilityWin::scrollToPoint(
   if (coordinate_type == IA2_COORDTYPE_SCREEN_RELATIVE) {
     scroll_to -= manager()->GetViewBounds().OffsetFromOrigin();
   } else if (coordinate_type == IA2_COORDTYPE_PARENT_RELATIVE) {
-    if (parent())
-      scroll_to += parent()->location().OffsetFromOrigin();
+    if (GetParent())
+      scroll_to += GetParent()->GetLocation().OffsetFromOrigin();
   } else {
     return E_INVALIDARG;
   }
@@ -880,12 +886,12 @@ STDMETHODIMP BrowserAccessibilityWin::get_groupPosition(
   if (!group_level || !similar_items_in_group || !position_in_group)
     return E_INVALIDARG;
 
-  if (blink_role() == ui::AX_ROLE_LIST_BOX_OPTION &&
-      parent() &&
-      parent()->role() == ui::AX_ROLE_LIST_BOX) {
+  if (GetRole() == ui::AX_ROLE_LIST_BOX_OPTION &&
+      GetParent() &&
+      GetParent()->GetRole() == ui::AX_ROLE_LIST_BOX) {
     *group_level = 0;
-    *similar_items_in_group = parent()->PlatformChildCount();
-    *position_in_group = index_in_parent() + 1;
+    *similar_items_in_group = GetParent()->PlatformChildCount();
+    *position_in_group = GetIndexInParent() + 1;
     return S_OK;
   }
 
@@ -991,17 +997,19 @@ STDMETHODIMP BrowserAccessibilityWin::get_imagePosition(
 
   if (coordinate_type == IA2_COORDTYPE_SCREEN_RELATIVE) {
     HWND parent_hwnd =
-        manager()->ToBrowserAccessibilityManagerWin()->parent_hwnd();
+        manager()->ToBrowserAccessibilityManagerWin()->GetParentHWND();
+    if (!parent_hwnd)
+      return E_FAIL;
     POINT top_left = {0, 0};
     ::ClientToScreen(parent_hwnd, &top_left);
-    *x = location().x() + top_left.x;
-    *y = location().y() + top_left.y;
+    *x = GetLocation().x() + top_left.x;
+    *y = GetLocation().y() + top_left.y;
   } else if (coordinate_type == IA2_COORDTYPE_PARENT_RELATIVE) {
-    *x = location().x();
-    *y = location().y();
-    if (parent()) {
-      *x -= parent()->location().x();
-      *y -= parent()->location().y();
+    *x = GetLocation().x();
+    *y = GetLocation().y();
+    if (GetParent()) {
+      *x -= GetParent()->GetLocation().x();
+      *y -= GetParent()->GetLocation().y();
     }
   } else {
     return E_INVALIDARG;
@@ -1017,8 +1025,8 @@ STDMETHODIMP BrowserAccessibilityWin::get_imageSize(LONG* height, LONG* width) {
   if (!height || !width)
     return E_INVALIDARG;
 
-  *height = location().height();
-  *width = location().width();
+  *height = GetLocation().height();
+  *width = GetLocation().width();
   return S_OK;
 }
 
@@ -1055,7 +1063,7 @@ STDMETHODIMP BrowserAccessibilityWin::get_accessibleAt(
   DCHECK_EQ(columns * rows, static_cast<int>(cell_ids.size()));
 
   int cell_id = cell_ids[row * columns + column];
-  BrowserAccessibilityWin* cell = GetFromRendererID(cell_id);
+  BrowserAccessibilityWin* cell = GetFromID(cell_id);
   if (cell) {
     *accessible = static_cast<IAccessible*>(cell->NewReference());
     return S_OK;
@@ -1141,8 +1149,8 @@ STDMETHODIMP BrowserAccessibilityWin::get_columnDescription(long column,
   for (int i = 0; i < rows; ++i) {
     int cell_id = cell_ids[i * columns + column];
     BrowserAccessibilityWin* cell = static_cast<BrowserAccessibilityWin*>(
-        manager()->GetFromRendererID(cell_id));
-    if (cell && cell->blink_role() == ui::AX_ROLE_COLUMN_HEADER) {
+        manager()->GetFromID(cell_id));
+    if (cell && cell->GetRole() == ui::AX_ROLE_COLUMN_HEADER) {
       base::string16 cell_name = cell->GetString16Attribute(
           ui::AX_ATTR_NAME);
       if (cell_name.size() > 0) {
@@ -1185,7 +1193,7 @@ STDMETHODIMP BrowserAccessibilityWin::get_columnExtentAt(
       ui::AX_ATTR_CELL_IDS);
   int cell_id = cell_ids[row * columns + column];
   BrowserAccessibilityWin* cell = static_cast<BrowserAccessibilityWin*>(
-      manager()->GetFromRendererID(cell_id));
+      manager()->GetFromID(cell_id));
   int colspan;
   if (cell &&
       cell->GetIntAttribute(
@@ -1223,7 +1231,7 @@ STDMETHODIMP BrowserAccessibilityWin::get_columnIndex(long cell_index,
 
   int cell_id = unique_cell_ids[cell_index];
   BrowserAccessibilityWin* cell =
-      manager()->GetFromRendererID(cell_id)->ToBrowserAccessibilityWin();
+      manager()->GetFromID(cell_id)->ToBrowserAccessibilityWin();
   int col_index;
   if (cell &&
       cell->GetIntAttribute(
@@ -1328,8 +1336,8 @@ STDMETHODIMP BrowserAccessibilityWin::get_rowDescription(long row,
   for (int i = 0; i < columns; ++i) {
     int cell_id = cell_ids[row * columns + i];
     BrowserAccessibilityWin* cell =
-        manager()->GetFromRendererID(cell_id)->ToBrowserAccessibilityWin();
-    if (cell && cell->blink_role() == ui::AX_ROLE_ROW_HEADER) {
+        manager()->GetFromID(cell_id)->ToBrowserAccessibilityWin();
+    if (cell && cell->GetRole() == ui::AX_ROLE_ROW_HEADER) {
       base::string16 cell_name = cell->GetString16Attribute(
           ui::AX_ATTR_NAME);
       if (cell_name.size() > 0) {
@@ -1371,7 +1379,7 @@ STDMETHODIMP BrowserAccessibilityWin::get_rowExtentAt(long row,
       ui::AX_ATTR_CELL_IDS);
   int cell_id = cell_ids[row * columns + column];
   BrowserAccessibilityWin* cell =
-      manager()->GetFromRendererID(cell_id)->ToBrowserAccessibilityWin();
+      manager()->GetFromID(cell_id)->ToBrowserAccessibilityWin();
   int rowspan;
   if (cell &&
       cell->GetIntAttribute(
@@ -1409,7 +1417,7 @@ STDMETHODIMP BrowserAccessibilityWin::get_rowIndex(long cell_index,
 
   int cell_id = unique_cell_ids[cell_index];
   BrowserAccessibilityWin* cell =
-      manager()->GetFromRendererID(cell_id)->ToBrowserAccessibilityWin();
+      manager()->GetFromID(cell_id)->ToBrowserAccessibilityWin();
   int cell_row_index;
   if (cell &&
       cell->GetIntAttribute(
@@ -1538,7 +1546,7 @@ STDMETHODIMP BrowserAccessibilityWin::get_rowColumnExtentsAtIndex(
 
   int cell_id = unique_cell_ids[index];
   BrowserAccessibilityWin* cell =
-      manager()->GetFromRendererID(cell_id)->ToBrowserAccessibilityWin();
+      manager()->GetFromID(cell_id)->ToBrowserAccessibilityWin();
   int rowspan;
   int colspan;
   if (cell &&
@@ -1651,9 +1659,9 @@ STDMETHODIMP BrowserAccessibilityWin::get_columnHeaderCells(
     return S_FALSE;
   }
 
-  BrowserAccessibility* table = parent();
-  while (table && table->role() != ui::AX_ROLE_TABLE)
-    table = table->parent();
+  BrowserAccessibility* table = GetParent();
+  while (table && table->GetRole() != ui::AX_ROLE_TABLE)
+    table = table->GetParent();
   if (!table) {
     NOTREACHED();
     return S_FALSE;
@@ -1676,8 +1684,8 @@ STDMETHODIMP BrowserAccessibilityWin::get_columnHeaderCells(
   for (int i = 0; i < rows; ++i) {
     int cell_id = cell_ids[i * columns + column];
     BrowserAccessibilityWin* cell =
-        manager()->GetFromRendererID(cell_id)->ToBrowserAccessibilityWin();
-    if (cell && cell->blink_role() == ui::AX_ROLE_COLUMN_HEADER)
+        manager()->GetFromID(cell_id)->ToBrowserAccessibilityWin();
+    if (cell && cell->GetRole() == ui::AX_ROLE_COLUMN_HEADER)
       (*n_column_header_cells)++;
   }
 
@@ -1686,8 +1694,8 @@ STDMETHODIMP BrowserAccessibilityWin::get_columnHeaderCells(
   int index = 0;
   for (int i = 0; i < rows; ++i) {
     int cell_id = cell_ids[i * columns + column];
-    BrowserAccessibility* cell = manager()->GetFromRendererID(cell_id);
-    if (cell && cell->role() == ui::AX_ROLE_COLUMN_HEADER) {
+    BrowserAccessibility* cell = manager()->GetFromID(cell_id);
+    if (cell && cell->GetRole() == ui::AX_ROLE_COLUMN_HEADER) {
       (*cell_accessibles)[index] = static_cast<IAccessible*>(
           cell->ToBrowserAccessibilityWin()->NewReference());
       ++index;
@@ -1749,9 +1757,9 @@ STDMETHODIMP BrowserAccessibilityWin::get_rowHeaderCells(
     return S_FALSE;
   }
 
-  BrowserAccessibility* table = parent();
-  while (table && table->role() != ui::AX_ROLE_TABLE)
-    table = table->parent();
+  BrowserAccessibility* table = GetParent();
+  while (table && table->GetRole() != ui::AX_ROLE_TABLE)
+    table = table->GetParent();
   if (!table) {
     NOTREACHED();
     return S_FALSE;
@@ -1773,8 +1781,8 @@ STDMETHODIMP BrowserAccessibilityWin::get_rowHeaderCells(
 
   for (int i = 0; i < columns; ++i) {
     int cell_id = cell_ids[row * columns + i];
-    BrowserAccessibility* cell = manager()->GetFromRendererID(cell_id);
-    if (cell && cell->role() == ui::AX_ROLE_ROW_HEADER)
+    BrowserAccessibility* cell = manager()->GetFromID(cell_id);
+    if (cell && cell->GetRole() == ui::AX_ROLE_ROW_HEADER)
       (*n_row_header_cells)++;
   }
 
@@ -1783,8 +1791,8 @@ STDMETHODIMP BrowserAccessibilityWin::get_rowHeaderCells(
   int index = 0;
   for (int i = 0; i < columns; ++i) {
     int cell_id = cell_ids[row * columns + i];
-    BrowserAccessibility* cell = manager()->GetFromRendererID(cell_id);
-    if (cell && cell->role() == ui::AX_ROLE_ROW_HEADER) {
+    BrowserAccessibility* cell = manager()->GetFromID(cell_id);
+    if (cell && cell->GetRole() == ui::AX_ROLE_ROW_HEADER) {
       (*cell_accessibles)[index] = static_cast<IAccessible*>(
           cell->ToBrowserAccessibilityWin()->NewReference());
       ++index;
@@ -1872,9 +1880,9 @@ STDMETHODIMP BrowserAccessibilityWin::get_table(IUnknown** table) {
   GetIntAttribute(ui::AX_ATTR_TABLE_CELL_ROW_INDEX, &row);
   GetIntAttribute(ui::AX_ATTR_TABLE_CELL_COLUMN_INDEX, &column);
 
-  BrowserAccessibility* find_table = parent();
-  while (find_table && find_table->role() != ui::AX_ROLE_TABLE)
-    find_table = find_table->parent();
+  BrowserAccessibility* find_table = GetParent();
+  while (find_table && find_table->GetRole() != ui::AX_ROLE_TABLE)
+    find_table = find_table->GetParent();
   if (!find_table) {
     NOTREACHED();
     return S_FALSE;
@@ -1909,8 +1917,8 @@ STDMETHODIMP BrowserAccessibilityWin::get_caretOffset(LONG* offset) {
     return E_INVALIDARG;
 
   *offset = 0;
-  if (blink_role() == ui::AX_ROLE_TEXT_FIELD ||
-      blink_role() == ui::AX_ROLE_TEXT_AREA) {
+  if (GetRole() == ui::AX_ROLE_TEXT_FIELD ||
+      GetRole() == ui::AX_ROLE_TEXT_AREA) {
     int sel_start = 0;
     if (GetIntAttribute(ui::AX_ATTR_TEXT_SEL_START,
                         &sel_start))
@@ -1944,7 +1952,7 @@ STDMETHODIMP BrowserAccessibilityWin::get_characterExtents(
     character_bounds = GetGlobalBoundsForRange(offset, 1);
   } else if (coordinate_type == IA2_COORDTYPE_PARENT_RELATIVE) {
     character_bounds = GetLocalBoundsForRange(offset, 1);
-    character_bounds -= location().OffsetFromOrigin();
+    character_bounds -= GetLocation().OffsetFromOrigin();
   } else {
     return E_INVALIDARG;
   }
@@ -1965,8 +1973,8 @@ STDMETHODIMP BrowserAccessibilityWin::get_nSelections(LONG* n_selections) {
     return E_INVALIDARG;
 
   *n_selections = 0;
-  if (blink_role() == ui::AX_ROLE_TEXT_FIELD ||
-      blink_role() == ui::AX_ROLE_TEXT_AREA) {
+  if (GetRole() == ui::AX_ROLE_TEXT_FIELD ||
+      GetRole() == ui::AX_ROLE_TEXT_AREA) {
     int sel_start = 0;
     int sel_end = 0;
     if (GetIntAttribute(ui::AX_ATTR_TEXT_SEL_START,
@@ -1990,8 +1998,8 @@ STDMETHODIMP BrowserAccessibilityWin::get_selection(LONG selection_index,
 
   *start_offset = 0;
   *end_offset = 0;
-  if (blink_role() == ui::AX_ROLE_TEXT_FIELD ||
-      blink_role() == ui::AX_ROLE_TEXT_AREA) {
+  if (GetRole() == ui::AX_ROLE_TEXT_FIELD ||
+      GetRole() == ui::AX_ROLE_TEXT_AREA) {
     int sel_start = 0;
     int sel_end = 0;
     if (GetIntAttribute(
@@ -2275,7 +2283,7 @@ STDMETHODIMP BrowserAccessibilityWin::get_hyperlink(
   }
 
   BrowserAccessibilityWin* child =
-      children()[hyperlinks_[index]]->ToBrowserAccessibilityWin();
+      InternalGetChild(hyperlinks_[index])->ToBrowserAccessibilityWin();
   *hyperlink = static_cast<IAccessibleHyperlink*>(child->NewReference());
   return S_OK;
 }
@@ -2470,15 +2478,15 @@ STDMETHODIMP BrowserAccessibilityWin::get_attributes(
     return E_INVALIDARG;
 
   *num_attribs = max_attribs;
-  if (*num_attribs > html_attributes().size())
-    *num_attribs = html_attributes().size();
+  if (*num_attribs > GetHtmlAttributes().size())
+    *num_attribs = GetHtmlAttributes().size();
 
   for (unsigned short i = 0; i < *num_attribs; ++i) {
     attrib_names[i] = SysAllocString(
-        base::UTF8ToUTF16(html_attributes()[i].first).c_str());
+        base::UTF8ToUTF16(GetHtmlAttributes()[i].first).c_str());
     name_space_id[i] = 0;
     attrib_values[i] = SysAllocString(
-        base::UTF8ToUTF16(html_attributes()[i].second).c_str());
+        base::UTF8ToUTF16(GetHtmlAttributes()[i].second).c_str());
   }
   return S_OK;
 }
@@ -2498,10 +2506,10 @@ STDMETHODIMP BrowserAccessibilityWin::get_attributesForNames(
     name_space_id[i] = 0;
     bool found = false;
     std::string name = base::UTF16ToUTF8((LPCWSTR)attrib_names[i]);
-    for (unsigned int j = 0;  j < html_attributes().size(); ++j) {
-      if (html_attributes()[j].first == name) {
+    for (unsigned int j = 0;  j < GetHtmlAttributes().size(); ++j) {
+      if (GetHtmlAttributes()[j].first == name) {
         attrib_values[i] = SysAllocString(
-            base::UTF8ToUTF16(html_attributes()[j].second).c_str());
+            base::UTF8ToUTF16(GetHtmlAttributes()[j].second).c_str());
         found = true;
         break;
       }
@@ -2556,7 +2564,7 @@ STDMETHODIMP BrowserAccessibilityWin::get_computedStyleForProperties(
 
   for (unsigned short i = 0; i < num_style_properties; ++i) {
     base::string16 name = (LPCWSTR)style_properties[i];
-    StringToLowerASCII(&name);
+    base::StringToLowerASCII(&name);
     if (name == L"display") {
       base::string16 display = GetString16Attribute(
           ui::AX_ATTR_DISPLAY);
@@ -2581,7 +2589,7 @@ STDMETHODIMP BrowserAccessibilityWin::get_parentNode(ISimpleDOMNode** node) {
   if (!node)
     return E_INVALIDARG;
 
-  *node = parent()->ToBrowserAccessibilityWin()->NewReference();
+  *node = GetParent()->ToBrowserAccessibilityWin()->NewReference();
   return S_OK;
 }
 
@@ -2626,12 +2634,12 @@ STDMETHODIMP BrowserAccessibilityWin::get_previousSibling(
   if (!node)
     return E_INVALIDARG;
 
-  if (!parent() || index_in_parent() <= 0) {
+  if (!GetParent() || GetIndexInParent() <= 0) {
     *node = NULL;
     return S_FALSE;
   }
 
-  *node = parent()->children()[index_in_parent() - 1]->
+  *node = GetParent()->InternalGetChild(GetIndexInParent() - 1)->
       ToBrowserAccessibilityWin()->NewReference();
   return S_OK;
 }
@@ -2643,14 +2651,15 @@ STDMETHODIMP BrowserAccessibilityWin::get_nextSibling(ISimpleDOMNode** node) {
   if (!node)
     return E_INVALIDARG;
 
-  if (!parent() ||
-      index_in_parent() < 0 ||
-      index_in_parent() >= static_cast<int>(parent()->children().size()) - 1) {
+  if (!GetParent() ||
+      GetIndexInParent() < 0 ||
+      GetIndexInParent() >= static_cast<int>(
+          GetParent()->InternalChildCount()) - 1) {
     *node = NULL;
     return S_FALSE;
   }
 
-  *node = parent()->children()[index_in_parent() + 1]->
+  *node = GetParent()->InternalGetChild(GetIndexInParent() + 1)->
       ToBrowserAccessibilityWin()->NewReference();
   return S_OK;
 }
@@ -2818,13 +2827,9 @@ STDMETHODIMP BrowserAccessibilityWin::GetPatternProvider(PATTERNID id,
            << id;
   if (id == UIA_ValuePatternId || id == UIA_TextPatternId) {
     if (IsEditableText()) {
-      // The BrowserAccessibilityManager keeps track of instances when
-      // we don't want to show the on-screen keyboard.
-      if (!manager()->IsOSKAllowed(GetGlobalBoundsRect()))
-        return E_NOTIMPL;
-
       DVLOG(1) << "Returning UIA text provider";
-      base::win::UIATextProvider::CreateTextProvider(true, provider);
+      base::win::UIATextProvider::CreateTextProvider(
+          GetValueText(), true, provider);
       return S_OK;
     }
   }
@@ -2854,35 +2859,38 @@ STDMETHODIMP BrowserAccessibilityWin::GetPropertyValue(PROPERTYID id,
 // CComObjectRootEx methods.
 //
 
+// static
 HRESULT WINAPI BrowserAccessibilityWin::InternalQueryInterface(
     void* this_ptr,
     const _ATL_INTMAP_ENTRY* entries,
     REFIID iid,
     void** object) {
+  int32 ia_role =
+      reinterpret_cast<BrowserAccessibilityWin*>(this_ptr)->ia_role_;
   if (iid == IID_IAccessibleImage) {
-    if (ia_role_ != ROLE_SYSTEM_GRAPHIC) {
+    if (ia_role != ROLE_SYSTEM_GRAPHIC) {
       *object = NULL;
       return E_NOINTERFACE;
     }
   } else if (iid == IID_IAccessibleTable || iid == IID_IAccessibleTable2) {
-    if (ia_role_ != ROLE_SYSTEM_TABLE) {
+    if (ia_role != ROLE_SYSTEM_TABLE) {
       *object = NULL;
       return E_NOINTERFACE;
     }
   } else if (iid == IID_IAccessibleTableCell) {
-    if (ia_role_ != ROLE_SYSTEM_CELL) {
+    if (ia_role != ROLE_SYSTEM_CELL) {
       *object = NULL;
       return E_NOINTERFACE;
     }
   } else if (iid == IID_IAccessibleValue) {
-    if (ia_role_ != ROLE_SYSTEM_PROGRESSBAR &&
-        ia_role_ != ROLE_SYSTEM_SCROLLBAR &&
-        ia_role_ != ROLE_SYSTEM_SLIDER) {
+    if (ia_role != ROLE_SYSTEM_PROGRESSBAR &&
+        ia_role != ROLE_SYSTEM_SCROLLBAR &&
+        ia_role != ROLE_SYSTEM_SLIDER) {
       *object = NULL;
       return E_NOINTERFACE;
     }
   } else if (iid == IID_ISimpleDOMDocument) {
-    if (ia_role_ != ROLE_SYSTEM_DOCUMENT) {
+    if (ia_role != ROLE_SYSTEM_DOCUMENT) {
       *object = NULL;
       return E_NOINTERFACE;
     }
@@ -2896,14 +2904,15 @@ HRESULT WINAPI BrowserAccessibilityWin::InternalQueryInterface(
 // Private methods.
 //
 
-// Initialize this object and mark it as active.
-void BrowserAccessibilityWin::PreInitialize() {
-  BrowserAccessibility::PreInitialize();
+// Called every time this node's data changes.
+void BrowserAccessibilityWin::OnDataChanged() {
+  BrowserAccessibility::OnDataChanged();
 
   InitRoleAndState();
 
   // Expose the "display" and "tag" attributes.
   StringAttributeToIA2(ui::AX_ATTR_DISPLAY, "display");
+  StringAttributeToIA2(ui::AX_ATTR_TEXT_INPUT_TYPE, "text-input-type");
   StringAttributeToIA2(ui::AX_ATTR_HTML_TAG, "tag");
   StringAttributeToIA2(ui::AX_ATTR_ROLE, "xml-roles");
 
@@ -2911,17 +2920,19 @@ void BrowserAccessibilityWin::PreInitialize() {
   IntAttributeToIA2(ui::AX_ATTR_HIERARCHICAL_LEVEL, "level");
 
   // Expose the set size and position in set for listbox options.
-  if (blink_role() == ui::AX_ROLE_LIST_BOX_OPTION &&
-      parent() &&
-      parent()->role() == ui::AX_ROLE_LIST_BOX) {
+  if (GetRole() == ui::AX_ROLE_LIST_BOX_OPTION &&
+      GetParent() &&
+      GetParent()->GetRole() == ui::AX_ROLE_LIST_BOX) {
     ia2_attributes_.push_back(
-        L"setsize:" + base::IntToString16(parent()->PlatformChildCount()));
+        L"setsize:" + base::IntToString16(GetParent()->PlatformChildCount()));
     ia2_attributes_.push_back(
-        L"setsize:" + base::IntToString16(index_in_parent() + 1));
+        L"setsize:" + base::IntToString16(GetIndexInParent() + 1));
   }
 
   if (ia_role_ == ROLE_SYSTEM_CHECKBUTTON ||
       ia_role_ == ROLE_SYSTEM_RADIOBUTTON ||
+      ia2_role_ == IA2_ROLE_CHECK_MENU_ITEM ||
+      ia2_role_ == IA2_ROLE_RADIO_MENU_ITEM ||
       ia2_role_ == IA2_ROLE_TOGGLE_BUTTON) {
     ia2_attributes_.push_back(L"checkable:true");
   }
@@ -2951,14 +2962,14 @@ void BrowserAccessibilityWin::PreInitialize() {
 
   // Expose table cell index.
   if (ia_role_ == ROLE_SYSTEM_CELL) {
-    BrowserAccessibility* table = parent();
-    while (table && table->role() != ui::AX_ROLE_TABLE)
-      table = table->parent();
+    BrowserAccessibility* table = GetParent();
+    while (table && table->GetRole() != ui::AX_ROLE_TABLE)
+      table = table->GetParent();
     if (table) {
       const std::vector<int32>& unique_cell_ids = table->GetIntListAttribute(
           ui::AX_ATTR_UNIQUE_CELL_IDS);
       for (size_t i = 0; i < unique_cell_ids.size(); ++i) {
-        if (unique_cell_ids[i] == renderer_id()) {
+        if (unique_cell_ids[i] == GetId()) {
           ia2_attributes_.push_back(
               base::string16(L"table-cell-index:") + base::IntToString16(i));
         }
@@ -3022,7 +3033,7 @@ void BrowserAccessibilityWin::PreInitialize() {
 
   // If it's a text field, also consider the placeholder.
   std::string placeholder;
-  if (blink_role() == ui::AX_ROLE_TEXT_FIELD &&
+  if (GetRole() == ui::AX_ROLE_TEXT_FIELD &&
       HasState(ui::AX_STATE_FOCUSABLE) &&
       GetHtmlAttribute("placeholder", &placeholder)) {
     if (name().empty() && !title_elem_id) {
@@ -3036,8 +3047,8 @@ void BrowserAccessibilityWin::PreInitialize() {
   SetStringAttribute(ui::AX_ATTR_HELP, help);
 
   // On Windows, the value of a document should be its url.
-  if (blink_role() == ui::AX_ROLE_ROOT_WEB_AREA ||
-      blink_role() == ui::AX_ROLE_WEB_AREA) {
+  if (GetRole() == ui::AX_ROLE_ROOT_WEB_AREA ||
+      GetRole() == ui::AX_ROLE_WEB_AREA) {
     set_value(GetStringAttribute(ui::AX_ATTR_DOC_URL));
   }
 
@@ -3045,9 +3056,9 @@ void BrowserAccessibilityWin::PreInitialize() {
   // WebKit stores the main accessible text in the "value" - swap it so
   // that it's the "name".
   if (name().empty() &&
-      (blink_role() == ui::AX_ROLE_LIST_BOX_OPTION ||
-       blink_role() == ui::AX_ROLE_STATIC_TEXT ||
-       blink_role() == ui::AX_ROLE_LIST_MARKER)) {
+      (GetRole() == ui::AX_ROLE_LIST_BOX_OPTION ||
+       GetRole() == ui::AX_ROLE_STATIC_TEXT ||
+       GetRole() == ui::AX_ROLE_LIST_MARKER)) {
     std::string tmp = value();
     set_value(name());
     set_name(tmp);
@@ -3077,16 +3088,14 @@ void BrowserAccessibilityWin::PreInitialize() {
   }
 }
 
-void BrowserAccessibilityWin::PostInitialize() {
-  BrowserAccessibility::PostInitialize();
-
+void BrowserAccessibilityWin::OnUpdateFinished() {
   // Construct the hypertext for this node.
   hyperlink_offset_to_index_.clear();
   hyperlinks_.clear();
   hypertext_.clear();
   for (unsigned int i = 0; i < PlatformChildCount(); ++i) {
     BrowserAccessibility* child = PlatformGetChild(i);
-    if (child->role() == ui::AX_ROLE_STATIC_TEXT) {
+    if (child->GetRole() == ui::AX_ROLE_STATIC_TEXT) {
       hypertext_ += base::UTF8ToUTF16(child->name());
     } else {
       hyperlink_offset_to_index_[hypertext_.size()] = hyperlinks_.size();
@@ -3097,7 +3106,7 @@ void BrowserAccessibilityWin::PostInitialize() {
   DCHECK_EQ(hyperlink_offset_to_index_.size(), hyperlinks_.size());
 
   // Fire an event when an alert first appears.
-  if (blink_role() == ui::AX_ROLE_ALERT && first_time_)
+  if (GetRole() == ui::AX_ROLE_ALERT && first_time_)
     manager()->NotifyAccessibilityEvent(ui::AX_EVENT_ALERT, this);
 
   // Fire events if text has changed.
@@ -3123,7 +3132,7 @@ void BrowserAccessibilityWin::PostInitialize() {
     // focus for managed descendants is platform-specific.
     // Fire a focus event if the focused descendant in a multi-select
     // list box changes.
-    if (blink_role() == ui::AX_ROLE_LIST_BOX_OPTION &&
+    if (GetRole() == ui::AX_ROLE_LIST_BOX_OPTION &&
         (ia_state_ & STATE_SYSTEM_FOCUSABLE) &&
         (ia_state_ & STATE_SYSTEM_SELECTABLE) &&
         (ia_state_ & STATE_SYSTEM_FOCUSED) &&
@@ -3173,8 +3182,7 @@ bool BrowserAccessibilityWin::IsNative() const {
   return true;
 }
 
-void BrowserAccessibilityWin::SetLocation(const gfx::Rect& new_location) {
-  BrowserAccessibility::SetLocation(new_location);
+void BrowserAccessibilityWin::OnLocationChanged() {
   manager()->ToBrowserAccessibilityManagerWin()->MaybeCallNotifyWinEvent(
       EVENT_OBJECT_LOCATIONCHANGE, unique_id_win());
 }
@@ -3259,7 +3267,7 @@ base::string16 BrowserAccessibilityWin::GetValueText() {
 base::string16 BrowserAccessibilityWin::TextForIAccessibleText() {
   if (IsEditableText())
     return base::UTF8ToUTF16(value());
-  return (blink_role() == ui::AX_ROLE_STATIC_TEXT) ?
+  return (GetRole() == ui::AX_ROLE_STATIC_TEXT) ?
       base::UTF8ToUTF16(name()) : hypertext_;
 }
 
@@ -3300,9 +3308,8 @@ LONG BrowserAccessibilityWin::FindBoundary(
       text, line_breaks, boundary, start_offset, direction);
 }
 
-BrowserAccessibilityWin* BrowserAccessibilityWin::GetFromRendererID(
-    int32 renderer_id) {
-  return manager()->GetFromRendererID(renderer_id)->ToBrowserAccessibilityWin();
+BrowserAccessibilityWin* BrowserAccessibilityWin::GetFromID(int32 id) {
+  return manager()->GetFromID(id)->ToBrowserAccessibilityWin();
 }
 
 void BrowserAccessibilityWin::InitRoleAndState() {
@@ -3379,7 +3386,7 @@ void BrowserAccessibilityWin::InitRoleAndState() {
       ui::AX_ATTR_HTML_TAG);
   ia_role_ = 0;
   ia2_role_ = 0;
-  switch (blink_role()) {
+  switch (GetRole()) {
     case ui::AX_ROLE_ALERT:
       ia_role_ = ROLE_SYSTEM_ALERT;
       break;
@@ -3390,9 +3397,16 @@ void BrowserAccessibilityWin::InitRoleAndState() {
       ia_role_ = ROLE_SYSTEM_APPLICATION;
       break;
     case ui::AX_ROLE_ARTICLE:
+      ia_role_ = ROLE_SYSTEM_DOCUMENT;
+      ia_state_ |= STATE_SYSTEM_READONLY;
+      break;
+    case ui::AX_ROLE_BANNER:
       ia_role_ = ROLE_SYSTEM_GROUPING;
+      ia2_role_ = IA2_ROLE_HEADER;
+      break;
+    case ui::AX_ROLE_BLOCKQUOTE:
+      role_name_ = html_tag;
       ia2_role_ = IA2_ROLE_SECTION;
-      ia_state_ |= STATE_SYSTEM_READONLY;
       break;
     case ui::AX_ROLE_BUSY_INDICATOR:
       ia_role_ = ROLE_SYSTEM_ANIMATION;
@@ -3422,6 +3436,7 @@ void BrowserAccessibilityWin::InitRoleAndState() {
       break;
     case ui::AX_ROLE_CHECK_BOX:
       ia_role_ = ROLE_SYSTEM_CHECKBUTTON;
+      ia2_state_ |= IA2_STATE_CHECKABLE;
       break;
     case ui::AX_ROLE_COLOR_WELL:
       ia_role_ = ROLE_SYSTEM_CLIENT;
@@ -3429,17 +3444,32 @@ void BrowserAccessibilityWin::InitRoleAndState() {
       break;
     case ui::AX_ROLE_COLUMN:
       ia_role_ = ROLE_SYSTEM_COLUMN;
-      ia_state_ |= STATE_SYSTEM_READONLY;
       break;
     case ui::AX_ROLE_COLUMN_HEADER:
       ia_role_ = ROLE_SYSTEM_COLUMNHEADER;
-      ia_state_ |= STATE_SYSTEM_READONLY;
       break;
     case ui::AX_ROLE_COMBO_BOX:
       ia_role_ = ROLE_SYSTEM_COMBOBOX;
       break;
+    case ui::AX_ROLE_COMPLEMENTARY:
+      ia_role_ = ROLE_SYSTEM_GROUPING;
+      ia2_role_ = IA2_ROLE_NOTE;
+      break;
+    case ui::AX_ROLE_CONTENT_INFO:
+      ia_role_ = ROLE_SYSTEM_TEXT;
+      ia2_role_ = IA2_ROLE_PARAGRAPH;
+      break;
+    case ui::AX_ROLE_DATE:
+      ia_role_ = ROLE_SYSTEM_DROPLIST;
+      ia2_role_ = IA2_ROLE_DATE_EDITOR;
+      break;
+    case ui::AX_ROLE_DATE_TIME:
+      ia_role_ = ROLE_SYSTEM_DROPLIST;
+      ia2_role_ = IA2_ROLE_DATE_EDITOR;
+      break;
     case ui::AX_ROLE_DIV:
       role_name_ = L"div";
+      ia_role_ = ROLE_SYSTEM_GROUPING;
       ia2_role_ = IA2_ROLE_SECTION;
       break;
     case ui::AX_ROLE_DEFINITION:
@@ -3452,17 +3482,24 @@ void BrowserAccessibilityWin::InitRoleAndState() {
       ia2_role_ = IA2_ROLE_PARAGRAPH;
       ia_state_ |= STATE_SYSTEM_READONLY;
       break;
+    case ui::AX_ROLE_DESCRIPTION_LIST:
+      role_name_ = html_tag;
+      ia_role_ = ROLE_SYSTEM_LIST;
+      ia_state_ |= STATE_SYSTEM_READONLY;
+      break;
     case ui::AX_ROLE_DESCRIPTION_LIST_TERM:
       ia_role_ = ROLE_SYSTEM_LISTITEM;
       ia_state_ |= STATE_SYSTEM_READONLY;
       break;
+    case ui::AX_ROLE_DETAILS:
+      role_name_ = html_tag;
+      ia_role_ = ROLE_SYSTEM_GROUPING;
+      break;
     case ui::AX_ROLE_DIALOG:
       ia_role_ = ROLE_SYSTEM_DIALOG;
-      ia_state_ |= STATE_SYSTEM_READONLY;
       break;
     case ui::AX_ROLE_DISCLOSURE_TRIANGLE:
-      ia_role_ = ROLE_SYSTEM_OUTLINEBUTTON;
-      ia_state_ |= STATE_SYSTEM_READONLY;
+      ia_role_ = ROLE_SYSTEM_PUSHBUTTON;
       break;
     case ui::AX_ROLE_DOCUMENT:
     case ui::AX_ROLE_ROOT_WEB_AREA:
@@ -3476,6 +3513,15 @@ void BrowserAccessibilityWin::InitRoleAndState() {
       ia2_state_ |= IA2_STATE_SINGLE_LINE;
       ia2_state_ |= IA2_STATE_EDITABLE;
       break;
+    case ui::AX_ROLE_FIGCAPTION:
+      role_name_ = html_tag;
+      ia2_role_ = IA2_ROLE_CAPTION;
+      break;
+    case ui::AX_ROLE_FIGURE:
+      role_name_ = html_tag;
+      ia_role_ = ROLE_SYSTEM_GROUPING;
+      ia2_role_ = IA2_ROLE_SECTION;
+      break;
     case ui::AX_ROLE_FORM:
       role_name_ = L"form";
       ia2_role_ = IA2_ROLE_FORM;
@@ -3495,6 +3541,7 @@ void BrowserAccessibilityWin::InitRoleAndState() {
         ia_role_ = ROLE_SYSTEM_GROUPING;
       } else if (html_tag == L"li") {
         ia_role_ = ROLE_SYSTEM_LISTITEM;
+        ia_state_ |= STATE_SYSTEM_READONLY;
       } else {
         if (html_tag.empty())
           role_name_ = L"div";
@@ -3502,7 +3549,6 @@ void BrowserAccessibilityWin::InitRoleAndState() {
           role_name_ = html_tag;
         ia2_role_ = IA2_ROLE_SECTION;
       }
-      ia_state_ |= STATE_SYSTEM_READONLY;
       break;
     }
     case ui::AX_ROLE_GROW_AREA:
@@ -3512,11 +3558,15 @@ void BrowserAccessibilityWin::InitRoleAndState() {
     case ui::AX_ROLE_HEADING:
       role_name_ = html_tag;
       ia2_role_ = IA2_ROLE_HEADING;
-      ia_state_ |= STATE_SYSTEM_READONLY;
       break;
     case ui::AX_ROLE_HORIZONTAL_RULE:
       ia_role_ = ROLE_SYSTEM_SEPARATOR;
       break;
+    case ui::AX_ROLE_IFRAME:
+      ia_role_ = ROLE_SYSTEM_DOCUMENT;
+      ia2_role_ = IA2_ROLE_INTERNAL_FRAME;
+      ia_state_ = STATE_SYSTEM_READONLY;
+      break;
     case ui::AX_ROLE_IMAGE:
       ia_role_ = ROLE_SYSTEM_GRAPHIC;
       ia_state_ |= STATE_SYSTEM_READONLY;
@@ -3535,15 +3585,9 @@ void BrowserAccessibilityWin::InitRoleAndState() {
       ia_role_ = ROLE_SYSTEM_TEXT;
       ia2_role_ = IA2_ROLE_LABEL;
       break;
-    case ui::AX_ROLE_BANNER:
-    case ui::AX_ROLE_COMPLEMENTARY:
-    case ui::AX_ROLE_CONTENT_INFO:
-    case ui::AX_ROLE_MAIN:
-    case ui::AX_ROLE_NAVIGATION:
     case ui::AX_ROLE_SEARCH:
       ia_role_ = ROLE_SYSTEM_GROUPING;
       ia2_role_ = IA2_ROLE_SECTION;
-      ia_state_ |= STATE_SYSTEM_READONLY;
       break;
     case ui::AX_ROLE_LINK:
       ia_role_ = ROLE_SYSTEM_LINK;
@@ -3568,9 +3612,15 @@ void BrowserAccessibilityWin::InitRoleAndState() {
       ia_role_ = ROLE_SYSTEM_LISTITEM;
       ia_state_ |= STATE_SYSTEM_READONLY;
       break;
-    case ui::AX_ROLE_MATH_ELEMENT:
+    case ui::AX_ROLE_MAIN:
+      ia_role_ = ROLE_SYSTEM_GROUPING;
+      ia2_role_ = IA2_ROLE_PARAGRAPH;
+      break;
+    case ui::AX_ROLE_MARQUEE:
+      ia_role_ = ROLE_SYSTEM_ANIMATION;
+      break;
+    case ui::AX_ROLE_MATH:
       ia_role_ = ROLE_SYSTEM_EQUATION;
-      ia_state_ |= STATE_SYSTEM_READONLY;
       break;
     case ui::AX_ROLE_MENU:
     case ui::AX_ROLE_MENU_BUTTON:
@@ -3582,6 +3632,15 @@ void BrowserAccessibilityWin::InitRoleAndState() {
     case ui::AX_ROLE_MENU_ITEM:
       ia_role_ = ROLE_SYSTEM_MENUITEM;
       break;
+    case ui::AX_ROLE_MENU_ITEM_CHECK_BOX:
+      ia_role_ = ROLE_SYSTEM_MENUITEM;
+      ia2_role_ = IA2_ROLE_CHECK_MENU_ITEM;
+      ia2_state_ |= IA2_STATE_CHECKABLE;
+      break;
+    case ui::AX_ROLE_MENU_ITEM_RADIO:
+      ia_role_ = ROLE_SYSTEM_MENUITEM;
+      ia2_role_ = IA2_ROLE_RADIO_MENU_ITEM;
+      break;
     case ui::AX_ROLE_MENU_LIST_POPUP:
       ia_role_ = ROLE_SYSTEM_CLIENT;
       break;
@@ -3593,6 +3652,14 @@ void BrowserAccessibilityWin::InitRoleAndState() {
           ia_state_ |= STATE_SYSTEM_FOCUSED;
       }
       break;
+    case ui::AX_ROLE_METER:
+      role_name_ = html_tag;
+      ia_role_ = ROLE_SYSTEM_PROGRESSBAR;
+      break;
+    case ui::AX_ROLE_NAVIGATION:
+      ia_role_ = ROLE_SYSTEM_GROUPING;
+      ia2_role_ = IA2_ROLE_SECTION;
+      break;
     case ui::AX_ROLE_NOTE:
       ia_role_ = ROLE_SYSTEM_GROUPING;
       ia2_role_ = IA2_ROLE_NOTE;
@@ -3600,7 +3667,6 @@ void BrowserAccessibilityWin::InitRoleAndState() {
       break;
     case ui::AX_ROLE_OUTLINE:
       ia_role_ = ROLE_SYSTEM_OUTLINE;
-      ia_state_ |= STATE_SYSTEM_READONLY;
       break;
     case ui::AX_ROLE_PARAGRAPH:
       role_name_ = L"P";
@@ -3613,6 +3679,11 @@ void BrowserAccessibilityWin::InitRoleAndState() {
         ia_role_ = ROLE_SYSTEM_BUTTONMENU;
       }
       break;
+    case ui::AX_ROLE_PRE:
+      role_name_ = html_tag;
+      ia_role_ = ROLE_SYSTEM_TEXT;
+      ia2_role_ = IA2_ROLE_PARAGRAPH;
+      break;
     case ui::AX_ROLE_PROGRESS_INDICATOR:
       ia_role_ = ROLE_SYSTEM_PROGRESSBAR;
       ia_state_ |= STATE_SYSTEM_READONLY;
@@ -3622,20 +3693,20 @@ void BrowserAccessibilityWin::InitRoleAndState() {
       break;
     case ui::AX_ROLE_RADIO_GROUP:
       ia_role_ = ROLE_SYSTEM_GROUPING;
-      ia2_role_ = IA2_ROLE_SECTION;
       break;
     case ui::AX_ROLE_REGION:
-      ia_role_ = ROLE_SYSTEM_GROUPING;
-      ia2_role_ = IA2_ROLE_SECTION;
-      ia_state_ |= STATE_SYSTEM_READONLY;
+      if (html_tag == L"section") {
+        ia_role_ = ROLE_SYSTEM_GROUPING;
+        ia2_role_ = IA2_ROLE_SECTION;
+      } else {
+        ia_role_ = ROLE_SYSTEM_PANE;
+      }
       break;
     case ui::AX_ROLE_ROW:
       ia_role_ = ROLE_SYSTEM_ROW;
-      ia_state_ |= STATE_SYSTEM_READONLY;
       break;
     case ui::AX_ROLE_ROW_HEADER:
       ia_role_ = ROLE_SYSTEM_ROWHEADER;
-      ia_state_ |= STATE_SYSTEM_READONLY;
       break;
     case ui::AX_ROLE_RULER:
       ia_role_ = ROLE_SYSTEM_CLIENT;
@@ -3646,6 +3717,7 @@ void BrowserAccessibilityWin::InitRoleAndState() {
       ia_role_ = ROLE_SYSTEM_CLIENT;
       ia2_role_ = IA2_ROLE_SCROLL_PANE;
       ia_state_ |= STATE_SYSTEM_READONLY;
+      ia2_state_ &= ~(IA2_STATE_EDITABLE);
       break;
     case ui::AX_ROLE_SCROLL_BAR:
       ia_role_ = ROLE_SYSTEM_SCROLLBAR;
@@ -3689,7 +3761,6 @@ void BrowserAccessibilityWin::InitRoleAndState() {
         ia_role_ = ROLE_SYSTEM_OUTLINE;
       } else {
         ia_role_ = ROLE_SYSTEM_TABLE;
-        ia_state_ |= STATE_SYSTEM_READONLY;
       }
       break;
     }
@@ -3720,6 +3791,9 @@ void BrowserAccessibilityWin::InitRoleAndState() {
       ia2_state_ |= IA2_STATE_EDITABLE;
       ia2_state_ |= IA2_STATE_SELECTABLE_TEXT;
       break;
+    case ui::AX_ROLE_TIME:
+      ia_role_ = ROLE_SYSTEM_SPINBUTTON;
+      break;
     case ui::AX_ROLE_TIMER:
       ia_role_ = ROLE_SYSTEM_CLOCK;
       ia_state_ |= STATE_SYSTEM_READONLY;
@@ -3734,15 +3808,12 @@ void BrowserAccessibilityWin::InitRoleAndState() {
       break;
     case ui::AX_ROLE_TREE:
       ia_role_ = ROLE_SYSTEM_OUTLINE;
-      ia_state_ |= STATE_SYSTEM_READONLY;
       break;
     case ui::AX_ROLE_TREE_GRID:
       ia_role_ = ROLE_SYSTEM_OUTLINE;
-      ia_state_ |= STATE_SYSTEM_READONLY;
       break;
     case ui::AX_ROLE_TREE_ITEM:
       ia_role_ = ROLE_SYSTEM_OUTLINEITEM;
-      ia_state_ |= STATE_SYSTEM_READONLY;
       break;
     case ui::AX_ROLE_WINDOW:
       ia_role_ = ROLE_SYSTEM_WINDOW;
@@ -3756,8 +3827,8 @@ void BrowserAccessibilityWin::InitRoleAndState() {
     case ui::AX_ROLE_IGNORED:
     case ui::AX_ROLE_INCREMENTOR:
     case ui::AX_ROLE_LOG:
-    case ui::AX_ROLE_MARQUEE:
     case ui::AX_ROLE_MATTE:
+    case ui::AX_ROLE_NONE:
     case ui::AX_ROLE_PRESENTATIONAL:
     case ui::AX_ROLE_RULER_MARKER:
     case ui::AX_ROLE_SHEET: