1ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen// Copyright (c) 2011 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
7ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include <set>
8ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
9731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick#include "base/string_number_conversions.h"
103345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick#include "base/string_util.h"
11731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick#include "base/utf_string_conversions.h"
1272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen#include "third_party/WebKit/Source/WebKit/chromium/public/WebAccessibilityCache.h"
1372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen#include "third_party/WebKit/Source/WebKit/chromium/public/WebAccessibilityObject.h"
1472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen#include "third_party/WebKit/Source/WebKit/chromium/public/WebAccessibilityRole.h"
1572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen#include "third_party/WebKit/Source/WebKit/chromium/public/WebAttribute.h"
1672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen#include "third_party/WebKit/Source/WebKit/chromium/public/WebDocument.h"
1772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen#include "third_party/WebKit/Source/WebKit/chromium/public/WebDocumentType.h"
1872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen#include "third_party/WebKit/Source/WebKit/chromium/public/WebElement.h"
1972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen#include "third_party/WebKit/Source/WebKit/chromium/public/WebFormControlElement.h"
2072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen#include "third_party/WebKit/Source/WebKit/chromium/public/WebFrame.h"
2172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen#include "third_party/WebKit/Source/WebKit/chromium/public/WebInputElement.h"
2272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen#include "third_party/WebKit/Source/WebKit/chromium/public/WebNamedNodeMap.h"
2372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen#include "third_party/WebKit/Source/WebKit/chromium/public/WebNode.h"
24ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "third_party/WebKit/Source/WebKit/chromium/public/WebRect.h"
2572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen#include "third_party/WebKit/Source/WebKit/chromium/public/WebSize.h"
2672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen#include "third_party/WebKit/Source/WebKit/chromium/public/WebString.h"
27c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
28c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochusing WebKit::WebAccessibilityCache;
29c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochusing WebKit::WebAccessibilityRole;
30c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochusing WebKit::WebAccessibilityObject;
31c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
32c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochnamespace webkit_glue {
33c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
34c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Provides a conversion between the WebKit::WebAccessibilityRole and a role
35c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// supported on the Browser side. Listed alphabetically by the
36c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// WebAccessibilityRole (except for default role).
37c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochWebAccessibility::Role ConvertRole(WebKit::WebAccessibilityRole role) {
38c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  switch (role) {
39c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    case WebKit::WebAccessibilityRoleAnnotation:
40c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      return WebAccessibility::ROLE_ANNOTATION;
41c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    case WebKit::WebAccessibilityRoleApplication:
42c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      return WebAccessibility::ROLE_APPLICATION;
43c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    case WebKit::WebAccessibilityRoleApplicationAlert:
44c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      return WebAccessibility::ROLE_ALERT;
45c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    case WebKit::WebAccessibilityRoleApplicationAlertDialog:
46c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      return WebAccessibility::ROLE_ALERT_DIALOG;
47c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    case WebKit::WebAccessibilityRoleApplicationDialog:
48c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      return WebAccessibility::ROLE_DIALOG;
49c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    case WebKit::WebAccessibilityRoleApplicationLog:
50c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      return WebAccessibility::ROLE_LOG;
51c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    case WebKit::WebAccessibilityRoleApplicationMarquee:
52c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      return WebAccessibility::ROLE_MARQUEE;
53c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    case WebKit::WebAccessibilityRoleApplicationStatus:
54c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      return WebAccessibility::ROLE_STATUS;
55c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    case WebKit::WebAccessibilityRoleApplicationTimer:
56c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      return WebAccessibility::ROLE_TIMER;
57c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    case WebKit::WebAccessibilityRoleBrowser:
58c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      return WebAccessibility::ROLE_BROWSER;
59c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    case WebKit::WebAccessibilityRoleBusyIndicator:
60c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      return WebAccessibility::ROLE_BUSY_INDICATOR;
61c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    case WebKit::WebAccessibilityRoleButton:
62c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      return WebAccessibility::ROLE_BUTTON;
63c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    case WebKit::WebAccessibilityRoleCell:
64c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      return WebAccessibility::ROLE_CELL;
65c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    case WebKit::WebAccessibilityRoleCheckBox:
66c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      return WebAccessibility::ROLE_CHECKBOX;
67c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    case WebKit::WebAccessibilityRoleColorWell:
68c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      return WebAccessibility::ROLE_COLOR_WELL;
69c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    case WebKit::WebAccessibilityRoleColumn:
70c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      return WebAccessibility::ROLE_COLUMN;
71c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    case WebKit::WebAccessibilityRoleColumnHeader:
72c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      return WebAccessibility::ROLE_COLUMN_HEADER;
73c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    case WebKit::WebAccessibilityRoleComboBox:
74c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      return WebAccessibility::ROLE_COMBO_BOX;
75c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    case WebKit::WebAccessibilityRoleDefinitionListDefinition:
76c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      return WebAccessibility::ROLE_DEFINITION_LIST_DEFINITION;
77c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    case WebKit::WebAccessibilityRoleDefinitionListTerm:
78c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      return WebAccessibility::ROLE_DEFINITION_LIST_TERM;
79c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    case WebKit::WebAccessibilityRoleDirectory:
80c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      return WebAccessibility::ROLE_DIRECTORY;
81c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    case WebKit::WebAccessibilityRoleDisclosureTriangle:
82c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      return WebAccessibility::ROLE_DISCLOSURE_TRIANGLE;
83c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    case WebKit::WebAccessibilityRoleDocument:
84c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      return WebAccessibility::ROLE_DOCUMENT;
85c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    case WebKit::WebAccessibilityRoleDocumentArticle:
86c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      return WebAccessibility::ROLE_ARTICLE;
87c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    case WebKit::WebAccessibilityRoleDocumentMath:
88c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      return WebAccessibility::ROLE_MATH;
89c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    case WebKit::WebAccessibilityRoleDocumentNote:
90c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      return WebAccessibility::ROLE_NOTE;
91c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    case WebKit::WebAccessibilityRoleDocumentRegion:
92c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      return WebAccessibility::ROLE_REGION;
93c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    case WebKit::WebAccessibilityRoleDrawer:
94c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      return WebAccessibility::ROLE_DRAWER;
95c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    case WebKit::WebAccessibilityRoleEditableText:
96c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      return WebAccessibility::ROLE_EDITABLE_TEXT;
97c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    case WebKit::WebAccessibilityRoleGrid:
98c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      return WebAccessibility::ROLE_GRID;
99c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    case WebKit::WebAccessibilityRoleGroup:
100c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      return WebAccessibility::ROLE_GROUP;
101c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    case WebKit::WebAccessibilityRoleGrowArea:
102c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      return WebAccessibility::ROLE_GROW_AREA;
103c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    case WebKit::WebAccessibilityRoleHeading:
104c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      return WebAccessibility::ROLE_HEADING;
105c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    case WebKit::WebAccessibilityRoleHelpTag:
106c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      return WebAccessibility::ROLE_HELP_TAG;
107c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    case WebKit::WebAccessibilityRoleIgnored:
108c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      return WebAccessibility::ROLE_IGNORED;
109c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    case WebKit::WebAccessibilityRoleImage:
110c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      return WebAccessibility::ROLE_IMAGE;
111c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    case WebKit::WebAccessibilityRoleImageMap:
112c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      return WebAccessibility::ROLE_IMAGE_MAP;
113c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    case WebKit::WebAccessibilityRoleImageMapLink:
114c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      return WebAccessibility::ROLE_IMAGE_MAP_LINK;
115c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    case WebKit::WebAccessibilityRoleIncrementor:
116c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      return WebAccessibility::ROLE_INCREMENTOR;
117c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    case WebKit::WebAccessibilityRoleLandmarkApplication:
118c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      return WebAccessibility::ROLE_LANDMARK_APPLICATION;
119c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    case WebKit::WebAccessibilityRoleLandmarkBanner:
120c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      return WebAccessibility::ROLE_LANDMARK_BANNER;
121c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    case WebKit::WebAccessibilityRoleLandmarkComplementary:
122c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      return WebAccessibility::ROLE_LANDMARK_COMPLEMENTARY;
123c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    case WebKit::WebAccessibilityRoleLandmarkContentInfo:
124c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      return WebAccessibility::ROLE_LANDMARK_CONTENTINFO;
125c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    case WebKit::WebAccessibilityRoleLandmarkMain:
126c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      return WebAccessibility::ROLE_LANDMARK_MAIN;
127c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    case WebKit::WebAccessibilityRoleLandmarkNavigation:
128c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      return WebAccessibility::ROLE_LANDMARK_NAVIGATION;
129c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    case WebKit::WebAccessibilityRoleLandmarkSearch:
130c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      return WebAccessibility::ROLE_LANDMARK_SEARCH;
131c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    case WebKit::WebAccessibilityRoleLink:
132c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      return WebAccessibility::ROLE_LINK;
133c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    case WebKit::WebAccessibilityRoleList:
134c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      return WebAccessibility::ROLE_LIST;
135c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    case WebKit::WebAccessibilityRoleListBox:
136c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      return WebAccessibility::ROLE_LISTBOX;
137c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    case WebKit::WebAccessibilityRoleListBoxOption:
138c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      return WebAccessibility::ROLE_LISTBOX_OPTION;
139c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    case WebKit::WebAccessibilityRoleListItem:
140c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      return WebAccessibility::ROLE_LIST_ITEM;
141c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    case WebKit::WebAccessibilityRoleListMarker:
142c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      return WebAccessibility::ROLE_LIST_MARKER;
143c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    case WebKit::WebAccessibilityRoleMatte:
144c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      return WebAccessibility::ROLE_MATTE;
145c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    case WebKit::WebAccessibilityRoleMenu:
146c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      return WebAccessibility::ROLE_MENU;
147c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    case WebKit::WebAccessibilityRoleMenuBar:
148c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      return WebAccessibility::ROLE_MENU_BAR;
149c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    case WebKit::WebAccessibilityRoleMenuButton:
150c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      return WebAccessibility::ROLE_MENU_BUTTON;
151c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    case WebKit::WebAccessibilityRoleMenuItem:
152c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      return WebAccessibility::ROLE_MENU_ITEM;
153c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    case WebKit::WebAccessibilityRoleMenuListOption:
154c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      return WebAccessibility::ROLE_MENU_LIST_OPTION;
155c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    case WebKit::WebAccessibilityRoleMenuListPopup:
156c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      return WebAccessibility::ROLE_MENU_LIST_POPUP;
157c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    case WebKit::WebAccessibilityRoleOutline:
158c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      return WebAccessibility::ROLE_OUTLINE;
159c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    case WebKit::WebAccessibilityRolePopUpButton:
160c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      return WebAccessibility::ROLE_POPUP_BUTTON;
161c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    case WebKit::WebAccessibilityRoleProgressIndicator:
162c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      return WebAccessibility::ROLE_PROGRESS_INDICATOR;
163c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    case WebKit::WebAccessibilityRoleRadioButton:
164c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      return WebAccessibility::ROLE_RADIO_BUTTON;
165c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    case WebKit::WebAccessibilityRoleRadioGroup:
166c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      return WebAccessibility::ROLE_RADIO_GROUP;
167c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    case WebKit::WebAccessibilityRoleRow:
168c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      return WebAccessibility::ROLE_ROW;
169c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    case WebKit::WebAccessibilityRoleRowHeader:
170c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      return WebAccessibility::ROLE_ROW_HEADER;
171c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    case WebKit::WebAccessibilityRoleRuler:
172c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      return WebAccessibility::ROLE_RULER;
173c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    case WebKit::WebAccessibilityRoleRulerMarker:
174c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      return WebAccessibility::ROLE_RULER_MARKER;
175c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    case WebKit::WebAccessibilityRoleScrollArea:
176c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      return WebAccessibility::ROLE_SCROLLAREA;
177c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    case WebKit::WebAccessibilityRoleScrollBar:
178c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      return WebAccessibility::ROLE_SCROLLBAR;
179c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    case WebKit::WebAccessibilityRoleSheet:
180c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      return WebAccessibility::ROLE_SHEET;
181c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    case WebKit::WebAccessibilityRoleSlider:
182c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      return WebAccessibility::ROLE_SLIDER;
183c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    case WebKit::WebAccessibilityRoleSliderThumb:
184c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      return WebAccessibility::ROLE_SLIDER_THUMB;
185c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    case WebKit::WebAccessibilityRoleSplitGroup:
186c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      return WebAccessibility::ROLE_SPLIT_GROUP;
187c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    case WebKit::WebAccessibilityRoleSplitter:
188c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      return WebAccessibility::ROLE_SPLITTER;
189c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    case WebKit::WebAccessibilityRoleStaticText:
190c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      return WebAccessibility::ROLE_STATIC_TEXT;
191c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    case WebKit::WebAccessibilityRoleSystemWide:
192c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      return WebAccessibility::ROLE_SYSTEM_WIDE;
193c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    case WebKit::WebAccessibilityRoleTab:
194c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      return WebAccessibility::ROLE_TAB;
195c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    case WebKit::WebAccessibilityRoleTabGroup:
196c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      return WebAccessibility::ROLE_TAB_GROUP;
197c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    case WebKit::WebAccessibilityRoleTabList:
198c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      return WebAccessibility::ROLE_TAB_LIST;
199c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    case WebKit::WebAccessibilityRoleTabPanel:
200c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      return WebAccessibility::ROLE_TAB_PANEL;
201c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    case WebKit::WebAccessibilityRoleTable:
202c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      return WebAccessibility::ROLE_TABLE;
203c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    case WebKit::WebAccessibilityRoleTableHeaderContainer:
204c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      return WebAccessibility::ROLE_TABLE_HEADER_CONTAINER;
205c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    case WebKit::WebAccessibilityRoleTextArea:
206c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      return WebAccessibility::ROLE_TEXTAREA;
207c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    case WebKit::WebAccessibilityRoleTextField:
208c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      return WebAccessibility::ROLE_TEXT_FIELD;
209c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    case WebKit::WebAccessibilityRoleToolbar:
210c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      return WebAccessibility::ROLE_TOOLBAR;
211c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    case WebKit::WebAccessibilityRoleTreeGrid:
212c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      return WebAccessibility::ROLE_TREE_GRID;
213c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    case WebKit::WebAccessibilityRoleTreeItemRole:
214c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      return WebAccessibility::ROLE_TREE_ITEM;
215c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    case WebKit::WebAccessibilityRoleTreeRole:
216c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      return WebAccessibility::ROLE_TREE;
217c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    case WebKit::WebAccessibilityRoleUserInterfaceTooltip:
218c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      return WebAccessibility::ROLE_TOOLTIP;
219c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    case WebKit::WebAccessibilityRoleValueIndicator:
220c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      return WebAccessibility::ROLE_VALUE_INDICATOR;
221c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    case WebKit::WebAccessibilityRoleWebArea:
222c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      return WebAccessibility::ROLE_WEB_AREA;
223c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    case WebKit::WebAccessibilityRoleWebCoreLink:
224c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      return WebAccessibility::ROLE_WEBCORE_LINK;
225c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    case WebKit::WebAccessibilityRoleWindow:
226c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      return WebAccessibility::ROLE_WINDOW;
227c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
228c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    default:
229c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      return WebAccessibility::ROLE_UNKNOWN;
230c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  }
231c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
232c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
233c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochuint32 ConvertState(const WebAccessibilityObject& o) {
234c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  uint32 state = 0;
235c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  if (o.isChecked())
236c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    state |= (1 << WebAccessibility::STATE_CHECKED);
237c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
2383345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  if (o.isCollapsed())
2393345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    state |= (1 << WebAccessibility::STATE_COLLAPSED);
2403345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
241c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  if (o.canSetFocusAttribute())
242c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    state |= (1 << WebAccessibility::STATE_FOCUSABLE);
243c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
244c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  if (o.isFocused())
245c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    state |= (1 << WebAccessibility::STATE_FOCUSED);
246c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
2473345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  if (o.roleValue() == WebKit::WebAccessibilityRolePopUpButton) {
2483345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    state |= (1 << WebAccessibility::STATE_HASPOPUP);
2493345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
2503345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    if (!o.isCollapsed())
2513345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick      state |= (1 << WebAccessibility::STATE_EXPANDED);
2523345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  }
2533345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
254c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  if (o.isHovered())
255c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    state |= (1 << WebAccessibility::STATE_HOTTRACKED);
256c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
257c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  if (o.isIndeterminate())
258c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    state |= (1 << WebAccessibility::STATE_INDETERMINATE);
259c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
2603345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  if (!o.isVisible())
2613345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    state |= (1 << WebAccessibility::STATE_INVISIBLE);
2623345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
2633345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  if (o.isLinked())
264c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    state |= (1 << WebAccessibility::STATE_LINKED);
265c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
266c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  if (o.isMultiSelectable())
267c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    state |= (1 << WebAccessibility::STATE_MULTISELECTABLE);
268c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
269c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  if (o.isOffScreen())
270c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    state |= (1 << WebAccessibility::STATE_OFFSCREEN);
271c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
272c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  if (o.isPressed())
273c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    state |= (1 << WebAccessibility::STATE_PRESSED);
274c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
275c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  if (o.isPasswordField())
276c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    state |= (1 << WebAccessibility::STATE_PROTECTED);
277c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
278c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  if (o.isReadOnly())
279c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    state |= (1 << WebAccessibility::STATE_READONLY);
280c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
2813345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  if (o.canSetSelectedAttribute())
2823345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    state |= (1 << WebAccessibility::STATE_SELECTABLE);
2833345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
2843345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  if (o.isSelected())
2853345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    state |= (1 << WebAccessibility::STATE_SELECTED);
2863345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
287c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  if (o.isVisited())
288c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    state |= (1 << WebAccessibility::STATE_TRAVERSED);
289c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
290c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  if (!o.isEnabled())
291c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    state |= (1 << WebAccessibility::STATE_UNAVAILABLE);
292c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
293c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  return state;
294c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
295c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
296c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochWebAccessibility::WebAccessibility()
297c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    : id(-1),
298c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      role(ROLE_NONE),
299c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      state(-1) {
300c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
301c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
302c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochWebAccessibility::WebAccessibility(const WebKit::WebAccessibilityObject& src,
303513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch                                   WebKit::WebAccessibilityCache* cache,
304513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch                                   bool include_children) {
305513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  Init(src, cache, include_children);
306c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
307c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
3083345a6884c488ff3a535c2c9acdd33d74b37e311Iain MerrickWebAccessibility::~WebAccessibility() {
3093345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick}
3103345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
311c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochvoid WebAccessibility::Init(const WebKit::WebAccessibilityObject& src,
312513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch                            WebKit::WebAccessibilityCache* cache,
313513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch                            bool include_children) {
314c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  name = src.title();
315c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  value = src.stringValue();
316c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  role = ConvertRole(src.roleValue());
317c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  state = ConvertState(src);
318c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  location = src.boundingBoxRect();
319c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
320c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  if (src.actionVerb().length())
321c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    attributes[ATTR_ACTION] = src.actionVerb();
322c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  if (src.accessibilityDescription().length())
323c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    attributes[ATTR_DESCRIPTION] = src.accessibilityDescription();
324c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  if (src.helpText().length())
325c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    attributes[ATTR_HELP] = src.helpText();
326c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  if (src.keyboardShortcut().length())
327c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    attributes[ATTR_SHORTCUT] = src.keyboardShortcut();
3283345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  if (src.hasComputedStyle())
3293345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    attributes[ATTR_DISPLAY] = src.computedStyleDisplay();
33021d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen  if (!src.url().isEmpty())
33121d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen    attributes[ATTR_URL] = src.url().spec().utf16();
3323345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
3333345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  WebKit::WebNode node = src.node();
334ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  bool is_iframe = false;
3353345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
3363345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  if (!node.isNull() && node.isElementNode()) {
3373345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    WebKit::WebElement element = node.to<WebKit::WebElement>();
338ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    is_iframe = (element.tagName() == ASCIIToUTF16("IFRAME"));
339ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
3403345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    // TODO(ctguil): The tagName in WebKit is lower cased but
3413345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    // HTMLElement::nodeName calls localNameUpper. Consider adding
3423345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    // a WebElement method that returns the original lower cased tagName.
3433345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    attributes[ATTR_HTML_TAG] = StringToLowerASCII(string16(element.tagName()));
3443345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    for (unsigned i = 0; i < element.attributes().length(); i++) {
3453345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick      html_attributes.push_back(
3463345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick          std::pair<string16, string16>(
3473345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick              element.attributes().attributeItem(i).localName(),
3483345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick              element.attributes().attributeItem(i).value()));
3493345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    }
350731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick
351731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick    if (element.isFormControlElement()) {
352731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick      WebKit::WebFormControlElement form_element =
353731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick          element.to<WebKit::WebFormControlElement>();
354731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick      if (form_element.formControlType() == ASCIIToUTF16("text")) {
355731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick        WebKit::WebInputElement input_element =
356731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick            form_element.to<WebKit::WebInputElement>();
357731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick        attributes[ATTR_TEXT_SEL_START] = base::IntToString16(
358731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick            input_element.selectionStart());
359731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick        attributes[ATTR_TEXT_SEL_END] = base::IntToString16(
360731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick            input_element.selectionEnd());
361731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick      }
362731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick    }
3633345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  }
3643345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
3653345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  if (role == WebAccessibility::ROLE_DOCUMENT ||
3663345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick      role == WebAccessibility::ROLE_WEB_AREA) {
367731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick    const WebKit::WebDocument& document = src.document();
3683345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    if (name.empty())
3693345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick      name = document.title();
3703345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    attributes[ATTR_DOC_TITLE] = document.title();
3713345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    attributes[ATTR_DOC_URL] = document.frame()->url().spec().utf16();
3723345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    if (document.isXHTMLDocument())
3733345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick      attributes[ATTR_DOC_MIMETYPE] = WebKit::WebString("text/xhtml");
3743345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    else
3753345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick      attributes[ATTR_DOC_MIMETYPE] = WebKit::WebString("text/html");
3763345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
377731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick    const WebKit::WebDocumentType& doctype = document.doctype();
3783345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    if (!doctype.isNull())
3793345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick      attributes[ATTR_DOC_DOCTYPE] = doctype.name();
380513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch
381513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch    const gfx::Size& scroll_offset = document.frame()->scrollOffset();
382513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch    attributes[ATTR_DOC_SCROLLX] = base::IntToString16(scroll_offset.width());
383513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch    attributes[ATTR_DOC_SCROLLY] = base::IntToString16(scroll_offset.height());
3843345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  }
385c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
386c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Add the source object to the cache and store its id.
387c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  id = cache->addOrGetId(src);
388c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
389513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  if (include_children) {
390513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch    // Recursively create children.
391513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch    int child_count = src.childCount();
392ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    std::set<int32> child_ids;
393513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch    for (int i = 0; i < child_count; i++) {
394513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch      WebAccessibilityObject child = src.childAt(i);
395ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      int32 child_id = cache->addOrGetId(child);
396513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch
397513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch      // The child may be invalid due to issues in webkit accessibility code.
398ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      // Don't add children that are invalid thus preventing a crash.
399513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch      // https://bugs.webkit.org/show_bug.cgi?id=44149
400513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch      // TODO(ctguil): We may want to remove this check as webkit stabilizes.
401ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      if (!child.isValid())
402ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen        continue;
403ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
404ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      // Children may duplicated in the webkit accessibility tree. Only add a
405ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      // child once for the web accessibility tree.
406ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      // https://bugs.webkit.org/show_bug.cgi?id=58930
407ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      if (child_ids.find(child_id) != child_ids.end())
408ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen        continue;
409ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      child_ids.insert(child_id);
410ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
411ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      // Some nodes appear in the tree in more than one place: for example,
412ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      // a cell in a table appears as a child of both a row and a column.
413ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      // Only recursively add child nodes that have this node as its
414ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      // unignored parent. For child nodes that are actually parented to
415ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      // somethinng else, store only the ID.
416ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      //
417ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      // As an exception, also add children of an iframe element.
418ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      // https://bugs.webkit.org/show_bug.cgi?id=57066
419ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      if (is_iframe || IsParentUnignoredOf(src, child)) {
420513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch        children.push_back(WebAccessibility(child, cache, include_children));
421ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      } else {
422ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen        indirect_child_ids.push_back(child_id);
423ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      }
424513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch    }
425c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  }
426c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
427c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
428ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsenbool WebAccessibility::IsParentUnignoredOf(
429ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    const WebKit::WebAccessibilityObject& ancestor,
430ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    const WebKit::WebAccessibilityObject& child) {
431ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  WebKit::WebAccessibilityObject parent = child.parentObject();
432ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  while (!parent.isNull() && parent.accessibilityIsIgnored())
433ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    parent = parent.parentObject();
434ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  return parent.equals(ancestor);
435ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen}
436ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
437c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}  // namespace webkit_glue
438