webaccessibility.cc revision 21d179b334e59e9a3bfcaed4c4430bef1bc5759d
1c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Copyright (c) 2010 The Chromium Authors. All rights reserved.
2c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Use of this source code is governed by a BSD-style license that can be
3c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// found in the LICENSE file.
4c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
5c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "webkit/glue/webaccessibility.h"
6c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
7731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick#include "base/string_number_conversions.h"
83345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick#include "base/string_util.h"
9731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick#include "base/utf_string_conversions.h"
10c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "third_party/WebKit/WebKit/chromium/public/WebAccessibilityCache.h"
11c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "third_party/WebKit/WebKit/chromium/public/WebAccessibilityObject.h"
12c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "third_party/WebKit/WebKit/chromium/public/WebAccessibilityRole.h"
133345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick#include "third_party/WebKit/WebKit/chromium/public/WebAttribute.h"
143345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick#include "third_party/WebKit/WebKit/chromium/public/WebDocument.h"
153345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick#include "third_party/WebKit/WebKit/chromium/public/WebDocumentType.h"
163345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick#include "third_party/WebKit/WebKit/chromium/public/WebElement.h"
17731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick#include "third_party/WebKit/WebKit/chromium/public/WebFormControlElement.h"
183345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick#include "third_party/WebKit/WebKit/chromium/public/WebFrame.h"
19731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick#include "third_party/WebKit/WebKit/chromium/public/WebInputElement.h"
203345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick#include "third_party/WebKit/WebKit/chromium/public/WebNamedNodeMap.h"
213345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick#include "third_party/WebKit/WebKit/chromium/public/WebNode.h"
22513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch#include "third_party/WebKit/WebKit/chromium/public/WebSize.h"
23c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "third_party/WebKit/WebKit/chromium/public/WebString.h"
24c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
25c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochusing WebKit::WebAccessibilityCache;
26c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochusing WebKit::WebAccessibilityRole;
27c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochusing WebKit::WebAccessibilityObject;
28c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
29c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochnamespace webkit_glue {
30c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
31c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Provides a conversion between the WebKit::WebAccessibilityRole and a role
32c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// supported on the Browser side. Listed alphabetically by the
33c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// WebAccessibilityRole (except for default role).
34c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochWebAccessibility::Role ConvertRole(WebKit::WebAccessibilityRole role) {
35c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  switch (role) {
36c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    case WebKit::WebAccessibilityRoleAnnotation:
37c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      return WebAccessibility::ROLE_ANNOTATION;
38c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    case WebKit::WebAccessibilityRoleApplication:
39c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      return WebAccessibility::ROLE_APPLICATION;
40c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    case WebKit::WebAccessibilityRoleApplicationAlert:
41c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      return WebAccessibility::ROLE_ALERT;
42c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    case WebKit::WebAccessibilityRoleApplicationAlertDialog:
43c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      return WebAccessibility::ROLE_ALERT_DIALOG;
44c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    case WebKit::WebAccessibilityRoleApplicationDialog:
45c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      return WebAccessibility::ROLE_DIALOG;
46c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    case WebKit::WebAccessibilityRoleApplicationLog:
47c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      return WebAccessibility::ROLE_LOG;
48c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    case WebKit::WebAccessibilityRoleApplicationMarquee:
49c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      return WebAccessibility::ROLE_MARQUEE;
50c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    case WebKit::WebAccessibilityRoleApplicationStatus:
51c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      return WebAccessibility::ROLE_STATUS;
52c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    case WebKit::WebAccessibilityRoleApplicationTimer:
53c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      return WebAccessibility::ROLE_TIMER;
54c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    case WebKit::WebAccessibilityRoleBrowser:
55c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      return WebAccessibility::ROLE_BROWSER;
56c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    case WebKit::WebAccessibilityRoleBusyIndicator:
57c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      return WebAccessibility::ROLE_BUSY_INDICATOR;
58c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    case WebKit::WebAccessibilityRoleButton:
59c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      return WebAccessibility::ROLE_BUTTON;
60c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    case WebKit::WebAccessibilityRoleCell:
61c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      return WebAccessibility::ROLE_CELL;
62c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    case WebKit::WebAccessibilityRoleCheckBox:
63c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      return WebAccessibility::ROLE_CHECKBOX;
64c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    case WebKit::WebAccessibilityRoleColorWell:
65c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      return WebAccessibility::ROLE_COLOR_WELL;
66c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    case WebKit::WebAccessibilityRoleColumn:
67c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      return WebAccessibility::ROLE_COLUMN;
68c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    case WebKit::WebAccessibilityRoleColumnHeader:
69c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      return WebAccessibility::ROLE_COLUMN_HEADER;
70c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    case WebKit::WebAccessibilityRoleComboBox:
71c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      return WebAccessibility::ROLE_COMBO_BOX;
72c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    case WebKit::WebAccessibilityRoleDefinitionListDefinition:
73c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      return WebAccessibility::ROLE_DEFINITION_LIST_DEFINITION;
74c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    case WebKit::WebAccessibilityRoleDefinitionListTerm:
75c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      return WebAccessibility::ROLE_DEFINITION_LIST_TERM;
76c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    case WebKit::WebAccessibilityRoleDirectory:
77c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      return WebAccessibility::ROLE_DIRECTORY;
78c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    case WebKit::WebAccessibilityRoleDisclosureTriangle:
79c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      return WebAccessibility::ROLE_DISCLOSURE_TRIANGLE;
80c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    case WebKit::WebAccessibilityRoleDocument:
81c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      return WebAccessibility::ROLE_DOCUMENT;
82c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    case WebKit::WebAccessibilityRoleDocumentArticle:
83c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      return WebAccessibility::ROLE_ARTICLE;
84c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    case WebKit::WebAccessibilityRoleDocumentMath:
85c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      return WebAccessibility::ROLE_MATH;
86c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    case WebKit::WebAccessibilityRoleDocumentNote:
87c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      return WebAccessibility::ROLE_NOTE;
88c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    case WebKit::WebAccessibilityRoleDocumentRegion:
89c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      return WebAccessibility::ROLE_REGION;
90c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    case WebKit::WebAccessibilityRoleDrawer:
91c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      return WebAccessibility::ROLE_DRAWER;
92c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    case WebKit::WebAccessibilityRoleEditableText:
93c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      return WebAccessibility::ROLE_EDITABLE_TEXT;
94c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    case WebKit::WebAccessibilityRoleGrid:
95c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      return WebAccessibility::ROLE_GRID;
96c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    case WebKit::WebAccessibilityRoleGroup:
97c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      return WebAccessibility::ROLE_GROUP;
98c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    case WebKit::WebAccessibilityRoleGrowArea:
99c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      return WebAccessibility::ROLE_GROW_AREA;
100c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    case WebKit::WebAccessibilityRoleHeading:
101c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      return WebAccessibility::ROLE_HEADING;
102c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    case WebKit::WebAccessibilityRoleHelpTag:
103c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      return WebAccessibility::ROLE_HELP_TAG;
104c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    case WebKit::WebAccessibilityRoleIgnored:
105c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      return WebAccessibility::ROLE_IGNORED;
106c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    case WebKit::WebAccessibilityRoleImage:
107c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      return WebAccessibility::ROLE_IMAGE;
108c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    case WebKit::WebAccessibilityRoleImageMap:
109c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      return WebAccessibility::ROLE_IMAGE_MAP;
110c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    case WebKit::WebAccessibilityRoleImageMapLink:
111c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      return WebAccessibility::ROLE_IMAGE_MAP_LINK;
112c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    case WebKit::WebAccessibilityRoleIncrementor:
113c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      return WebAccessibility::ROLE_INCREMENTOR;
114c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    case WebKit::WebAccessibilityRoleLandmarkApplication:
115c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      return WebAccessibility::ROLE_LANDMARK_APPLICATION;
116c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    case WebKit::WebAccessibilityRoleLandmarkBanner:
117c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      return WebAccessibility::ROLE_LANDMARK_BANNER;
118c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    case WebKit::WebAccessibilityRoleLandmarkComplementary:
119c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      return WebAccessibility::ROLE_LANDMARK_COMPLEMENTARY;
120c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    case WebKit::WebAccessibilityRoleLandmarkContentInfo:
121c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      return WebAccessibility::ROLE_LANDMARK_CONTENTINFO;
122c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    case WebKit::WebAccessibilityRoleLandmarkMain:
123c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      return WebAccessibility::ROLE_LANDMARK_MAIN;
124c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    case WebKit::WebAccessibilityRoleLandmarkNavigation:
125c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      return WebAccessibility::ROLE_LANDMARK_NAVIGATION;
126c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    case WebKit::WebAccessibilityRoleLandmarkSearch:
127c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      return WebAccessibility::ROLE_LANDMARK_SEARCH;
128c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    case WebKit::WebAccessibilityRoleLink:
129c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      return WebAccessibility::ROLE_LINK;
130c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    case WebKit::WebAccessibilityRoleList:
131c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      return WebAccessibility::ROLE_LIST;
132c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    case WebKit::WebAccessibilityRoleListBox:
133c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      return WebAccessibility::ROLE_LISTBOX;
134c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    case WebKit::WebAccessibilityRoleListBoxOption:
135c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      return WebAccessibility::ROLE_LISTBOX_OPTION;
136c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    case WebKit::WebAccessibilityRoleListItem:
137c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      return WebAccessibility::ROLE_LIST_ITEM;
138c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    case WebKit::WebAccessibilityRoleListMarker:
139c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      return WebAccessibility::ROLE_LIST_MARKER;
140c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    case WebKit::WebAccessibilityRoleMatte:
141c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      return WebAccessibility::ROLE_MATTE;
142c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    case WebKit::WebAccessibilityRoleMenu:
143c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      return WebAccessibility::ROLE_MENU;
144c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    case WebKit::WebAccessibilityRoleMenuBar:
145c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      return WebAccessibility::ROLE_MENU_BAR;
146c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    case WebKit::WebAccessibilityRoleMenuButton:
147c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      return WebAccessibility::ROLE_MENU_BUTTON;
148c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    case WebKit::WebAccessibilityRoleMenuItem:
149c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      return WebAccessibility::ROLE_MENU_ITEM;
150c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    case WebKit::WebAccessibilityRoleMenuListOption:
151c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      return WebAccessibility::ROLE_MENU_LIST_OPTION;
152c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    case WebKit::WebAccessibilityRoleMenuListPopup:
153c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      return WebAccessibility::ROLE_MENU_LIST_POPUP;
154c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    case WebKit::WebAccessibilityRoleOutline:
155c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      return WebAccessibility::ROLE_OUTLINE;
156c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    case WebKit::WebAccessibilityRolePopUpButton:
157c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      return WebAccessibility::ROLE_POPUP_BUTTON;
158c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    case WebKit::WebAccessibilityRoleProgressIndicator:
159c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      return WebAccessibility::ROLE_PROGRESS_INDICATOR;
160c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    case WebKit::WebAccessibilityRoleRadioButton:
161c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      return WebAccessibility::ROLE_RADIO_BUTTON;
162c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    case WebKit::WebAccessibilityRoleRadioGroup:
163c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      return WebAccessibility::ROLE_RADIO_GROUP;
164c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    case WebKit::WebAccessibilityRoleRow:
165c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      return WebAccessibility::ROLE_ROW;
166c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    case WebKit::WebAccessibilityRoleRowHeader:
167c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      return WebAccessibility::ROLE_ROW_HEADER;
168c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    case WebKit::WebAccessibilityRoleRuler:
169c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      return WebAccessibility::ROLE_RULER;
170c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    case WebKit::WebAccessibilityRoleRulerMarker:
171c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      return WebAccessibility::ROLE_RULER_MARKER;
172c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    case WebKit::WebAccessibilityRoleScrollArea:
173c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      return WebAccessibility::ROLE_SCROLLAREA;
174c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    case WebKit::WebAccessibilityRoleScrollBar:
175c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      return WebAccessibility::ROLE_SCROLLBAR;
176c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    case WebKit::WebAccessibilityRoleSheet:
177c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      return WebAccessibility::ROLE_SHEET;
178c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    case WebKit::WebAccessibilityRoleSlider:
179c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      return WebAccessibility::ROLE_SLIDER;
180c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    case WebKit::WebAccessibilityRoleSliderThumb:
181c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      return WebAccessibility::ROLE_SLIDER_THUMB;
182c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    case WebKit::WebAccessibilityRoleSplitGroup:
183c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      return WebAccessibility::ROLE_SPLIT_GROUP;
184c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    case WebKit::WebAccessibilityRoleSplitter:
185c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      return WebAccessibility::ROLE_SPLITTER;
186c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    case WebKit::WebAccessibilityRoleStaticText:
187c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      return WebAccessibility::ROLE_STATIC_TEXT;
188c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    case WebKit::WebAccessibilityRoleSystemWide:
189c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      return WebAccessibility::ROLE_SYSTEM_WIDE;
190c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    case WebKit::WebAccessibilityRoleTab:
191c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      return WebAccessibility::ROLE_TAB;
192c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    case WebKit::WebAccessibilityRoleTabGroup:
193c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      return WebAccessibility::ROLE_TAB_GROUP;
194c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    case WebKit::WebAccessibilityRoleTabList:
195c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      return WebAccessibility::ROLE_TAB_LIST;
196c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    case WebKit::WebAccessibilityRoleTabPanel:
197c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      return WebAccessibility::ROLE_TAB_PANEL;
198c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    case WebKit::WebAccessibilityRoleTable:
199c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      return WebAccessibility::ROLE_TABLE;
200c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    case WebKit::WebAccessibilityRoleTableHeaderContainer:
201c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      return WebAccessibility::ROLE_TABLE_HEADER_CONTAINER;
202c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    case WebKit::WebAccessibilityRoleTextArea:
203c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      return WebAccessibility::ROLE_TEXTAREA;
204c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    case WebKit::WebAccessibilityRoleTextField:
205c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      return WebAccessibility::ROLE_TEXT_FIELD;
206c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    case WebKit::WebAccessibilityRoleToolbar:
207c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      return WebAccessibility::ROLE_TOOLBAR;
208c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    case WebKit::WebAccessibilityRoleTreeGrid:
209c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      return WebAccessibility::ROLE_TREE_GRID;
210c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    case WebKit::WebAccessibilityRoleTreeItemRole:
211c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      return WebAccessibility::ROLE_TREE_ITEM;
212c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    case WebKit::WebAccessibilityRoleTreeRole:
213c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      return WebAccessibility::ROLE_TREE;
214c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    case WebKit::WebAccessibilityRoleUserInterfaceTooltip:
215c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      return WebAccessibility::ROLE_TOOLTIP;
216c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    case WebKit::WebAccessibilityRoleValueIndicator:
217c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      return WebAccessibility::ROLE_VALUE_INDICATOR;
218c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    case WebKit::WebAccessibilityRoleWebArea:
219c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      return WebAccessibility::ROLE_WEB_AREA;
220c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    case WebKit::WebAccessibilityRoleWebCoreLink:
221c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      return WebAccessibility::ROLE_WEBCORE_LINK;
222c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    case WebKit::WebAccessibilityRoleWindow:
223c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      return WebAccessibility::ROLE_WINDOW;
224c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
225c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    default:
226c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      return WebAccessibility::ROLE_UNKNOWN;
227c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  }
228c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
229c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
230c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochuint32 ConvertState(const WebAccessibilityObject& o) {
231c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  uint32 state = 0;
232c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  if (o.isChecked())
233c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    state |= (1 << WebAccessibility::STATE_CHECKED);
234c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
2353345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  if (o.isCollapsed())
2363345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    state |= (1 << WebAccessibility::STATE_COLLAPSED);
2373345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
238c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  if (o.canSetFocusAttribute())
239c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    state |= (1 << WebAccessibility::STATE_FOCUSABLE);
240c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
241c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  if (o.isFocused())
242c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    state |= (1 << WebAccessibility::STATE_FOCUSED);
243c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
2443345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  if (o.roleValue() == WebKit::WebAccessibilityRolePopUpButton) {
2453345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    state |= (1 << WebAccessibility::STATE_HASPOPUP);
2463345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
2473345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    if (!o.isCollapsed())
2483345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick      state |= (1 << WebAccessibility::STATE_EXPANDED);
2493345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  }
2503345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
251c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  if (o.isHovered())
252c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    state |= (1 << WebAccessibility::STATE_HOTTRACKED);
253c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
254c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  if (o.isIndeterminate())
255c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    state |= (1 << WebAccessibility::STATE_INDETERMINATE);
256c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
2573345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  if (!o.isVisible())
2583345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    state |= (1 << WebAccessibility::STATE_INVISIBLE);
2593345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
2603345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  if (o.isLinked())
261c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    state |= (1 << WebAccessibility::STATE_LINKED);
262c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
263c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  if (o.isMultiSelectable())
264c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    state |= (1 << WebAccessibility::STATE_MULTISELECTABLE);
265c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
266c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  if (o.isOffScreen())
267c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    state |= (1 << WebAccessibility::STATE_OFFSCREEN);
268c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
269c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  if (o.isPressed())
270c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    state |= (1 << WebAccessibility::STATE_PRESSED);
271c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
272c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  if (o.isPasswordField())
273c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    state |= (1 << WebAccessibility::STATE_PROTECTED);
274c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
275c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  if (o.isReadOnly())
276c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    state |= (1 << WebAccessibility::STATE_READONLY);
277c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
2783345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  if (o.canSetSelectedAttribute())
2793345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    state |= (1 << WebAccessibility::STATE_SELECTABLE);
2803345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
2813345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  if (o.isSelected())
2823345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    state |= (1 << WebAccessibility::STATE_SELECTED);
2833345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
284c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  if (o.isVisited())
285c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    state |= (1 << WebAccessibility::STATE_TRAVERSED);
286c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
287c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  if (!o.isEnabled())
288c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    state |= (1 << WebAccessibility::STATE_UNAVAILABLE);
289c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
290c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  return state;
291c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
292c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
293c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochWebAccessibility::WebAccessibility()
294c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    : id(-1),
295c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      role(ROLE_NONE),
296c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      state(-1) {
297c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
298c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
299c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochWebAccessibility::WebAccessibility(const WebKit::WebAccessibilityObject& src,
300513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch                                   WebKit::WebAccessibilityCache* cache,
301513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch                                   bool include_children) {
302513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  Init(src, cache, include_children);
303c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
304c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
3053345a6884c488ff3a535c2c9acdd33d74b37e311Iain MerrickWebAccessibility::~WebAccessibility() {
3063345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick}
3073345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
308c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochvoid WebAccessibility::Init(const WebKit::WebAccessibilityObject& src,
309513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch                            WebKit::WebAccessibilityCache* cache,
310513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch                            bool include_children) {
311c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  name = src.title();
312c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  value = src.stringValue();
313c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  role = ConvertRole(src.roleValue());
314c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  state = ConvertState(src);
315c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  location = src.boundingBoxRect();
316c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
317c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  if (src.actionVerb().length())
318c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    attributes[ATTR_ACTION] = src.actionVerb();
319c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  if (src.accessibilityDescription().length())
320c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    attributes[ATTR_DESCRIPTION] = src.accessibilityDescription();
321c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  if (src.helpText().length())
322c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    attributes[ATTR_HELP] = src.helpText();
323c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  if (src.keyboardShortcut().length())
324c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    attributes[ATTR_SHORTCUT] = src.keyboardShortcut();
3253345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  if (src.hasComputedStyle())
3263345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    attributes[ATTR_DISPLAY] = src.computedStyleDisplay();
32721d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen  if (!src.url().isEmpty())
32821d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen    attributes[ATTR_URL] = src.url().spec().utf16();
3293345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
3303345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  WebKit::WebNode node = src.node();
3313345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
3323345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  if (!node.isNull() && node.isElementNode()) {
3333345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    WebKit::WebElement element = node.to<WebKit::WebElement>();
3343345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    // TODO(ctguil): The tagName in WebKit is lower cased but
3353345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    // HTMLElement::nodeName calls localNameUpper. Consider adding
3363345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    // a WebElement method that returns the original lower cased tagName.
3373345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    attributes[ATTR_HTML_TAG] = StringToLowerASCII(string16(element.tagName()));
3383345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    for (unsigned i = 0; i < element.attributes().length(); i++) {
3393345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick      html_attributes.push_back(
3403345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick          std::pair<string16, string16>(
3413345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick              element.attributes().attributeItem(i).localName(),
3423345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick              element.attributes().attributeItem(i).value()));
3433345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    }
344731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick
345731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick    if (element.isFormControlElement()) {
346731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick      WebKit::WebFormControlElement form_element =
347731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick          element.to<WebKit::WebFormControlElement>();
348731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick      if (form_element.formControlType() == ASCIIToUTF16("text")) {
349731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick        WebKit::WebInputElement input_element =
350731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick            form_element.to<WebKit::WebInputElement>();
351731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick        attributes[ATTR_TEXT_SEL_START] = base::IntToString16(
352731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick            input_element.selectionStart());
353731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick        attributes[ATTR_TEXT_SEL_END] = base::IntToString16(
354731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick            input_element.selectionEnd());
355731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick      }
356731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick    }
3573345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  }
3583345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
3593345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  if (role == WebAccessibility::ROLE_DOCUMENT ||
3603345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick      role == WebAccessibility::ROLE_WEB_AREA) {
361731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick    const WebKit::WebDocument& document = src.document();
3623345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    if (name.empty())
3633345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick      name = document.title();
3643345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    attributes[ATTR_DOC_TITLE] = document.title();
3653345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    attributes[ATTR_DOC_URL] = document.frame()->url().spec().utf16();
3663345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    if (document.isXHTMLDocument())
3673345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick      attributes[ATTR_DOC_MIMETYPE] = WebKit::WebString("text/xhtml");
3683345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    else
3693345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick      attributes[ATTR_DOC_MIMETYPE] = WebKit::WebString("text/html");
3703345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
371731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick    const WebKit::WebDocumentType& doctype = document.doctype();
3723345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    if (!doctype.isNull())
3733345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick      attributes[ATTR_DOC_DOCTYPE] = doctype.name();
374513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch
375513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch    const gfx::Size& scroll_offset = document.frame()->scrollOffset();
376513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch    attributes[ATTR_DOC_SCROLLX] = base::IntToString16(scroll_offset.width());
377513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch    attributes[ATTR_DOC_SCROLLY] = base::IntToString16(scroll_offset.height());
3783345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  }
379c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
380c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Add the source object to the cache and store its id.
381c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  id = cache->addOrGetId(src);
382c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
383513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  if (include_children) {
384513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch    // Recursively create children.
385513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch    int child_count = src.childCount();
386513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch    for (int i = 0; i < child_count; i++) {
387513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch      WebAccessibilityObject child = src.childAt(i);
388513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch
389513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch      // The child may be invalid due to issues in webkit accessibility code.
390513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch      // Don't add children are invalid thus preventing a crash.
391513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch      // https://bugs.webkit.org/show_bug.cgi?id=44149
392513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch      // TODO(ctguil): We may want to remove this check as webkit stabilizes.
393513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch      if (child.isValid())
394513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch        children.push_back(WebAccessibility(child, cache, include_children));
395513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch    }
396c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  }
397c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
398c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
399c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}  // namespace webkit_glue
400