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