| OLD | NEW |
| 1 /* | 1 /* |
| 2 * Copyright (C) 2012, Google Inc. All rights reserved. | 2 * Copyright (C) 2012, Google Inc. All rights reserved. |
| 3 * | 3 * |
| 4 * Redistribution and use in source and binary forms, with or without | 4 * Redistribution and use in source and binary forms, with or without |
| 5 * modification, are permitted provided that the following conditions | 5 * modification, are permitted provided that the following conditions |
| 6 * are met: | 6 * are met: |
| 7 * | 7 * |
| 8 * 1. Redistributions of source code must retain the above copyright | 8 * 1. Redistributions of source code must retain the above copyright |
| 9 * notice, this list of conditions and the following disclaimer. | 9 * notice, this list of conditions and the following disclaimer. |
| 10 * 2. Redistributions in binary form must reproduce the above copyright | 10 * 2. Redistributions in binary form must reproduce the above copyright |
| (...skipping 165 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 176 return true; | 176 return true; |
| 177 | 177 |
| 178 // Ignore labels that are already referenced by a control's title UI element
. | 178 // Ignore labels that are already referenced by a control's title UI element
. |
| 179 AXObject* controlObject = correspondingControlForLabelElement(); | 179 AXObject* controlObject = correspondingControlForLabelElement(); |
| 180 if (controlObject && !controlObject->exposesTitleUIElement() && controlObjec
t->isCheckboxOrRadio()) | 180 if (controlObject && !controlObject->exposesTitleUIElement() && controlObjec
t->isCheckboxOrRadio()) |
| 181 return true; | 181 return true; |
| 182 | 182 |
| 183 return m_role == UnknownRole; | 183 return m_role == UnknownRole; |
| 184 } | 184 } |
| 185 | 185 |
| 186 bool AXNodeObject::isDescendantOfElementType(const HTMLQualifiedName& tagName) c
onst |
| 187 { |
| 188 if (!node()) |
| 189 return false; |
| 190 |
| 191 for (Element* parent = node()->parentElement(); parent; parent = parent->par
entElement()) { |
| 192 if (parent->hasTagName(tagName)) |
| 193 return true; |
| 194 } |
| 195 return false; |
| 196 } |
| 197 |
| 186 AccessibilityRole AXNodeObject::determineAccessibilityRoleUtil() | 198 AccessibilityRole AXNodeObject::determineAccessibilityRoleUtil() |
| 187 { | 199 { |
| 188 if (!node()) | 200 if (!node()) |
| 189 return UnknownRole; | 201 return UnknownRole; |
| 190 if (node()->isLink()) | 202 // HTMLAnchorElement sets isLink only when it has hrefAttr. |
| 203 // We assume that it is also LinkRole if it has event listners even though i
t doesn't have hrefAttr. |
| 204 if (node()->isLink() || (isHTMLAnchorElement(*node()) && isClickable())) |
| 191 return LinkRole; | 205 return LinkRole; |
| 206 |
| 192 if (isHTMLButtonElement(*node())) | 207 if (isHTMLButtonElement(*node())) |
| 193 return buttonRoleType(); | 208 return buttonRoleType(); |
| 209 |
| 194 if (isHTMLDetailsElement(*node())) | 210 if (isHTMLDetailsElement(*node())) |
| 195 return DetailsRole; | 211 return DetailsRole; |
| 212 |
| 196 if (isHTMLSummaryElement(*node())) { | 213 if (isHTMLSummaryElement(*node())) { |
| 197 if (node()->parentNode() && isHTMLDetailsElement(node()->parentNode())) | 214 if (node()->parentNode() && isHTMLDetailsElement(node()->parentNode())) |
| 198 return DisclosureTriangleRole; | 215 return DisclosureTriangleRole; |
| 199 return UnknownRole; | 216 return UnknownRole; |
| 200 } | 217 } |
| 201 | 218 |
| 202 if (isHTMLInputElement(*node())) { | 219 if (isHTMLInputElement(*node())) { |
| 203 HTMLInputElement& input = toHTMLInputElement(*node()); | 220 HTMLInputElement& input = toHTMLInputElement(*node()); |
| 204 const AtomicString& type = input.type(); | 221 const AtomicString& type = input.type(); |
| 205 if (input.dataList()) | 222 if (input.dataList()) |
| (...skipping 27 matching lines...) Expand all Loading... |
| 233 if (input.isTextButton()) | 250 if (input.isTextButton()) |
| 234 return buttonRoleType(); | 251 return buttonRoleType(); |
| 235 if (type == InputTypeNames::range) | 252 if (type == InputTypeNames::range) |
| 236 return SliderRole; | 253 return SliderRole; |
| 237 if (type == InputTypeNames::color) | 254 if (type == InputTypeNames::color) |
| 238 return ColorWellRole; | 255 return ColorWellRole; |
| 239 if (type == InputTypeNames::time) | 256 if (type == InputTypeNames::time) |
| 240 return TimeRole; | 257 return TimeRole; |
| 241 return TextFieldRole; | 258 return TextFieldRole; |
| 242 } | 259 } |
| 260 |
| 243 if (isHTMLSelectElement(*node())) { | 261 if (isHTMLSelectElement(*node())) { |
| 244 HTMLSelectElement& selectElement = toHTMLSelectElement(*node()); | 262 HTMLSelectElement& selectElement = toHTMLSelectElement(*node()); |
| 245 return selectElement.multiple() ? ListBoxRole : PopUpButtonRole; | 263 return selectElement.multiple() ? ListBoxRole : PopUpButtonRole; |
| 246 } | 264 } |
| 265 |
| 247 if (isHTMLTextAreaElement(*node())) | 266 if (isHTMLTextAreaElement(*node())) |
| 248 return TextAreaRole; | 267 return TextAreaRole; |
| 268 |
| 249 if (headingLevel()) | 269 if (headingLevel()) |
| 250 return HeadingRole; | 270 return HeadingRole; |
| 271 |
| 251 if (isHTMLDivElement(*node())) | 272 if (isHTMLDivElement(*node())) |
| 252 return DivRole; | 273 return DivRole; |
| 274 |
| 253 if (isHTMLMeterElement(*node())) | 275 if (isHTMLMeterElement(*node())) |
| 254 return MeterRole; | 276 return MeterRole; |
| 277 |
| 255 if (isHTMLOutputElement(*node())) | 278 if (isHTMLOutputElement(*node())) |
| 256 return StatusRole; | 279 return StatusRole; |
| 280 |
| 257 if (isHTMLParagraphElement(*node())) | 281 if (isHTMLParagraphElement(*node())) |
| 258 return ParagraphRole; | 282 return ParagraphRole; |
| 283 |
| 259 if (isHTMLLabelElement(*node())) | 284 if (isHTMLLabelElement(*node())) |
| 260 return LabelRole; | 285 return LabelRole; |
| 286 |
| 287 if (isHTMLLegendElement(*node())) |
| 288 return LegendRole; |
| 289 |
| 261 if (isHTMLRubyElement(*node())) | 290 if (isHTMLRubyElement(*node())) |
| 262 return RubyRole; | 291 return RubyRole; |
| 292 |
| 263 if (isHTMLDListElement(*node())) | 293 if (isHTMLDListElement(*node())) |
| 264 return DescriptionListRole; | 294 return DescriptionListRole; |
| 265 if (node()->isElementNode() && node()->hasTagName(blockquoteTag)) | 295 |
| 296 if (node()->hasTagName(ddTag)) |
| 297 return DescriptionListDetailRole; |
| 298 |
| 299 if (node()->hasTagName(dtTag)) |
| 300 return DescriptionListTermRole; |
| 301 |
| 302 if (node()->nodeName() == "math") |
| 303 return MathRole; |
| 304 |
| 305 if (node()->hasTagName(rpTag) || node()->hasTagName(rtTag)) |
| 306 return AnnotationRole; |
| 307 |
| 308 if (isHTMLFormElement(*node())) |
| 309 return FormRole; |
| 310 |
| 311 if (node()->hasTagName(articleTag)) |
| 312 return ArticleRole; |
| 313 |
| 314 if (node()->hasTagName(mainTag)) |
| 315 return MainRole; |
| 316 |
| 317 if (node()->hasTagName(navTag)) |
| 318 return NavigationRole; |
| 319 |
| 320 if (node()->hasTagName(asideTag)) |
| 321 return ComplementaryRole; |
| 322 |
| 323 if (node()->hasTagName(preTag)) |
| 324 return PreRole; |
| 325 |
| 326 if (node()->hasTagName(sectionTag)) |
| 327 return RegionRole; |
| 328 |
| 329 if (node()->hasTagName(addressTag)) |
| 330 return ContentInfoRole; |
| 331 |
| 332 if (isHTMLDialogElement(*node())) |
| 333 return DialogRole; |
| 334 |
| 335 // The HTML element should not be exposed as an element. That's what the Lay
outView element does. |
| 336 if (isHTMLHtmlElement(*node())) |
| 337 return IgnoredRole; |
| 338 |
| 339 if (isHTMLIFrameElement(*node())) { |
| 340 const AtomicString& ariaRole = getAttribute(roleAttr); |
| 341 if (ariaRole == "none" || ariaRole == "presentation") |
| 342 return IframePresentationalRole; |
| 343 return IframeRole; |
| 344 } |
| 345 |
| 346 // There should only be one banner/contentInfo per page. If header/footer ar
e being used within an article or section |
| 347 // then it should not be exposed as whole page's banner/contentInfo |
| 348 if (node()->hasTagName(headerTag) && !isDescendantOfElementType(articleTag)
&& !isDescendantOfElementType(sectionTag)) |
| 349 return BannerRole; |
| 350 |
| 351 if (node()->hasTagName(footerTag) && !isDescendantOfElementType(articleTag)
&& !isDescendantOfElementType(sectionTag)) |
| 352 return FooterRole; |
| 353 |
| 354 if (node()->hasTagName(blockquoteTag)) |
| 266 return BlockquoteRole; | 355 return BlockquoteRole; |
| 267 if (node()->isElementNode() && node()->hasTagName(captionTag)) | 356 |
| 357 if (node()->hasTagName(captionTag)) |
| 268 return CaptionRole; | 358 return CaptionRole; |
| 269 if (node()->isElementNode() && node()->hasTagName(figcaptionTag)) | 359 |
| 360 if (node()->hasTagName(figcaptionTag)) |
| 270 return FigcaptionRole; | 361 return FigcaptionRole; |
| 271 if (node()->isElementNode() && node()->hasTagName(figureTag)) | 362 |
| 363 if (node()->hasTagName(figureTag)) |
| 272 return FigureRole; | 364 return FigureRole; |
| 273 if (isHTMLAnchorElement(*node()) && isClickable()) | 365 |
| 274 return LinkRole; | |
| 275 if (isHTMLIFrameElement(*node())) | |
| 276 return IframeRole; | |
| 277 if (isEmbeddedObject()) | 366 if (isEmbeddedObject()) |
| 278 return EmbeddedObjectRole; | 367 return EmbeddedObjectRole; |
| 368 |
| 279 return UnknownRole; | 369 return UnknownRole; |
| 280 } | 370 } |
| 281 | 371 |
| 282 AccessibilityRole AXNodeObject::determineAccessibilityRole() | 372 AccessibilityRole AXNodeObject::determineAccessibilityRole() |
| 283 { | 373 { |
| 284 if (!node()) | 374 if (!node()) |
| 285 return UnknownRole; | 375 return UnknownRole; |
| 286 | 376 |
| 287 if ((m_ariaRole = determineAriaRoleAttribute()) != UnknownRole) | 377 if ((m_ariaRole = determineAriaRoleAttribute()) != UnknownRole) |
| 288 return m_ariaRole; | 378 return m_ariaRole; |
| (...skipping 1708 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1997 float range = maxValueForRange() - minValueForRange(); | 2087 float range = maxValueForRange() - minValueForRange(); |
| 1998 float value = valueForRange(); | 2088 float value = valueForRange(); |
| 1999 | 2089 |
| 2000 value += range * (percentChange / 100); | 2090 value += range * (percentChange / 100); |
| 2001 setValue(String::number(value)); | 2091 setValue(String::number(value)); |
| 2002 | 2092 |
| 2003 axObjectCache()->postNotification(node(), AXObjectCacheImpl::AXValueChanged,
true); | 2093 axObjectCache()->postNotification(node(), AXObjectCacheImpl::AXValueChanged,
true); |
| 2004 } | 2094 } |
| 2005 | 2095 |
| 2006 } // namespace blink | 2096 } // namespace blink |
| OLD | NEW |