| 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 253 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 264 Node* curNode = node(); | 264 Node* curNode = node(); |
| 265 if (!parent->hasInheritedPresentationalRole() | 265 if (!parent->hasInheritedPresentationalRole() |
| 266 && !isPresentationRoleInTable(parent, curNode)) | 266 && !isPresentationRoleInTable(parent, curNode)) |
| 267 return false; | 267 return false; |
| 268 | 268 |
| 269 // ARIA spec says that when a parent object is presentational and this objec
t | 269 // ARIA spec says that when a parent object is presentational and this objec
t |
| 270 // is a required owned element of that parent, then this object is also pres
entational. | 270 // is a required owned element of that parent, then this object is also pres
entational. |
| 271 return isRequiredOwnedElement(parent, roleValue(), curNode); | 271 return isRequiredOwnedElement(parent, roleValue(), curNode); |
| 272 } | 272 } |
| 273 | 273 |
| 274 bool AXNodeObject::isDescendantOfElementType(const HTMLQualifiedName& tagName) c
onst |
| 275 { |
| 276 if (!node()) |
| 277 return false; |
| 278 |
| 279 for (Element* parent = node()->parentElement(); parent; parent = parent->par
entElement()) { |
| 280 if (parent->hasTagName(tagName)) |
| 281 return true; |
| 282 } |
| 283 return false; |
| 284 } |
| 285 |
| 274 AccessibilityRole AXNodeObject::determineAccessibilityRoleUtil() | 286 AccessibilityRole AXNodeObject::determineAccessibilityRoleUtil() |
| 275 { | 287 { |
| 276 if (!node()) | 288 if (!node()) |
| 277 return UnknownRole; | 289 return UnknownRole; |
| 278 if (node()->isLink()) | 290 // HTMLAnchorElement sets isLink only when it has hrefAttr. |
| 291 // We assume that it is also LinkRole if it has event listners even though i
t doesn't have hrefAttr. |
| 292 if (node()->isLink() || (isHTMLAnchorElement(*node()) && isClickable())) |
| 279 return LinkRole; | 293 return LinkRole; |
| 294 |
| 280 if (isHTMLButtonElement(*node())) | 295 if (isHTMLButtonElement(*node())) |
| 281 return buttonRoleType(); | 296 return buttonRoleType(); |
| 297 |
| 282 if (isHTMLDetailsElement(*node())) | 298 if (isHTMLDetailsElement(*node())) |
| 283 return DetailsRole; | 299 return DetailsRole; |
| 300 |
| 284 if (isHTMLSummaryElement(*node())) { | 301 if (isHTMLSummaryElement(*node())) { |
| 285 if (node()->parentNode() && isHTMLDetailsElement(node()->parentNode())) | 302 if (node()->parentNode() && isHTMLDetailsElement(node()->parentNode())) |
| 286 return DisclosureTriangleRole; | 303 return DisclosureTriangleRole; |
| 287 return UnknownRole; | 304 return UnknownRole; |
| 288 } | 305 } |
| 289 | 306 |
| 290 if (isHTMLInputElement(*node())) { | 307 if (isHTMLInputElement(*node())) { |
| 291 HTMLInputElement& input = toHTMLInputElement(*node()); | 308 HTMLInputElement& input = toHTMLInputElement(*node()); |
| 292 const AtomicString& type = input.type(); | 309 const AtomicString& type = input.type(); |
| 293 if (input.dataList()) | 310 if (input.dataList()) |
| (...skipping 27 matching lines...) Expand all Loading... |
| 321 if (input.isTextButton()) | 338 if (input.isTextButton()) |
| 322 return buttonRoleType(); | 339 return buttonRoleType(); |
| 323 if (type == InputTypeNames::range) | 340 if (type == InputTypeNames::range) |
| 324 return SliderRole; | 341 return SliderRole; |
| 325 if (type == InputTypeNames::color) | 342 if (type == InputTypeNames::color) |
| 326 return ColorWellRole; | 343 return ColorWellRole; |
| 327 if (type == InputTypeNames::time) | 344 if (type == InputTypeNames::time) |
| 328 return TimeRole; | 345 return TimeRole; |
| 329 return TextFieldRole; | 346 return TextFieldRole; |
| 330 } | 347 } |
| 348 |
| 331 if (isHTMLSelectElement(*node())) { | 349 if (isHTMLSelectElement(*node())) { |
| 332 HTMLSelectElement& selectElement = toHTMLSelectElement(*node()); | 350 HTMLSelectElement& selectElement = toHTMLSelectElement(*node()); |
| 333 return selectElement.multiple() ? ListBoxRole : PopUpButtonRole; | 351 return selectElement.multiple() ? ListBoxRole : PopUpButtonRole; |
| 334 } | 352 } |
| 353 |
| 335 if (isHTMLTextAreaElement(*node())) | 354 if (isHTMLTextAreaElement(*node())) |
| 336 return TextFieldRole; | 355 return TextFieldRole; |
| 356 |
| 337 if (headingLevel()) | 357 if (headingLevel()) |
| 338 return HeadingRole; | 358 return HeadingRole; |
| 359 |
| 339 if (isHTMLDivElement(*node())) | 360 if (isHTMLDivElement(*node())) |
| 340 return DivRole; | 361 return DivRole; |
| 362 |
| 341 if (isHTMLMeterElement(*node())) | 363 if (isHTMLMeterElement(*node())) |
| 342 return MeterRole; | 364 return MeterRole; |
| 365 |
| 343 if (isHTMLOutputElement(*node())) | 366 if (isHTMLOutputElement(*node())) |
| 344 return StatusRole; | 367 return StatusRole; |
| 368 |
| 345 if (isHTMLParagraphElement(*node())) | 369 if (isHTMLParagraphElement(*node())) |
| 346 return ParagraphRole; | 370 return ParagraphRole; |
| 371 |
| 347 if (isHTMLLabelElement(*node())) | 372 if (isHTMLLabelElement(*node())) |
| 348 return LabelRole; | 373 return LabelRole; |
| 374 |
| 375 if (isHTMLLegendElement(*node())) |
| 376 return LegendRole; |
| 377 |
| 349 if (isHTMLRubyElement(*node())) | 378 if (isHTMLRubyElement(*node())) |
| 350 return RubyRole; | 379 return RubyRole; |
| 380 |
| 351 if (isHTMLDListElement(*node())) | 381 if (isHTMLDListElement(*node())) |
| 352 return DescriptionListRole; | 382 return DescriptionListRole; |
| 353 if (node()->isElementNode() && node()->hasTagName(blockquoteTag)) | 383 |
| 384 if (node()->hasTagName(ddTag)) |
| 385 return DescriptionListDetailRole; |
| 386 |
| 387 if (node()->hasTagName(dtTag)) |
| 388 return DescriptionListTermRole; |
| 389 |
| 390 if (node()->nodeName() == "math") |
| 391 return MathRole; |
| 392 |
| 393 if (node()->hasTagName(rpTag) || node()->hasTagName(rtTag)) |
| 394 return AnnotationRole; |
| 395 |
| 396 if (isHTMLFormElement(*node())) |
| 397 return FormRole; |
| 398 |
| 399 if (node()->hasTagName(articleTag)) |
| 400 return ArticleRole; |
| 401 |
| 402 if (node()->hasTagName(mainTag)) |
| 403 return MainRole; |
| 404 |
| 405 if (node()->hasTagName(navTag)) |
| 406 return NavigationRole; |
| 407 |
| 408 if (node()->hasTagName(asideTag)) |
| 409 return ComplementaryRole; |
| 410 |
| 411 if (node()->hasTagName(preTag)) |
| 412 return PreRole; |
| 413 |
| 414 if (node()->hasTagName(sectionTag)) |
| 415 return RegionRole; |
| 416 |
| 417 if (node()->hasTagName(addressTag)) |
| 418 return ContentInfoRole; |
| 419 |
| 420 if (isHTMLDialogElement(*node())) |
| 421 return DialogRole; |
| 422 |
| 423 // The HTML element should not be exposed as an element. That's what the Lay
outView element does. |
| 424 if (isHTMLHtmlElement(*node())) |
| 425 return IgnoredRole; |
| 426 |
| 427 if (isHTMLIFrameElement(*node())) { |
| 428 const AtomicString& ariaRole = getAttribute(roleAttr); |
| 429 if (ariaRole == "none" || ariaRole == "presentation") |
| 430 return IframePresentationalRole; |
| 431 return IframeRole; |
| 432 } |
| 433 |
| 434 // There should only be one banner/contentInfo per page. If header/footer ar
e being used within an article or section |
| 435 // then it should not be exposed as whole page's banner/contentInfo |
| 436 if (node()->hasTagName(headerTag) && !isDescendantOfElementType(articleTag)
&& !isDescendantOfElementType(sectionTag)) |
| 437 return BannerRole; |
| 438 |
| 439 if (node()->hasTagName(footerTag) && !isDescendantOfElementType(articleTag)
&& !isDescendantOfElementType(sectionTag)) |
| 440 return FooterRole; |
| 441 |
| 442 if (node()->hasTagName(blockquoteTag)) |
| 354 return BlockquoteRole; | 443 return BlockquoteRole; |
| 355 if (node()->isElementNode() && node()->hasTagName(captionTag)) | 444 |
| 445 if (node()->hasTagName(captionTag)) |
| 356 return CaptionRole; | 446 return CaptionRole; |
| 357 if (node()->isElementNode() && node()->hasTagName(figcaptionTag)) | 447 |
| 448 if (node()->hasTagName(figcaptionTag)) |
| 358 return FigcaptionRole; | 449 return FigcaptionRole; |
| 359 if (node()->isElementNode() && node()->hasTagName(figureTag)) | 450 |
| 451 if (node()->hasTagName(figureTag)) |
| 360 return FigureRole; | 452 return FigureRole; |
| 361 if (isHTMLAnchorElement(*node()) && isClickable()) | 453 |
| 362 return LinkRole; | |
| 363 if (isHTMLIFrameElement(*node())) | |
| 364 return IframeRole; | |
| 365 if (isEmbeddedObject()) | 454 if (isEmbeddedObject()) |
| 366 return EmbeddedObjectRole; | 455 return EmbeddedObjectRole; |
| 456 |
| 367 return UnknownRole; | 457 return UnknownRole; |
| 368 } | 458 } |
| 369 | 459 |
| 370 AccessibilityRole AXNodeObject::determineAccessibilityRole() | 460 AccessibilityRole AXNodeObject::determineAccessibilityRole() |
| 371 { | 461 { |
| 372 if (!node()) | 462 if (!node()) |
| 373 return UnknownRole; | 463 return UnknownRole; |
| 374 | 464 |
| 375 if ((m_ariaRole = determineAriaRoleAttribute()) != UnknownRole) | 465 if ((m_ariaRole = determineAriaRoleAttribute()) != UnknownRole) |
| 376 return m_ariaRole; | 466 return m_ariaRole; |
| (...skipping 1705 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2082 float range = maxValueForRange() - minValueForRange(); | 2172 float range = maxValueForRange() - minValueForRange(); |
| 2083 float value = valueForRange(); | 2173 float value = valueForRange(); |
| 2084 | 2174 |
| 2085 value += range * (percentChange / 100); | 2175 value += range * (percentChange / 100); |
| 2086 setValue(String::number(value)); | 2176 setValue(String::number(value)); |
| 2087 | 2177 |
| 2088 axObjectCache()->postNotification(node(), AXObjectCacheImpl::AXValueChanged)
; | 2178 axObjectCache()->postNotification(node(), AXObjectCacheImpl::AXValueChanged)
; |
| 2089 } | 2179 } |
| 2090 | 2180 |
| 2091 } // namespace blink | 2181 } // namespace blink |
| OLD | NEW |