Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(717)

Side by Side Diff: third_party/WebKit/Source/modules/accessibility/AXLayoutObject.cpp

Issue 2858493002: Rename AXObject to AXObjectImpl in modules/ and web/ (Closed)
Patch Set: Reverted unexpected change to blink rename merge helper Created 3 years, 7 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
1 /* 1 /*
2 * Copyright (C) 2008 Apple Inc. All rights reserved. 2 * Copyright (C) 2008 Apple 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 308 matching lines...) Expand 10 before | Expand all | Expand 10 after
319 if (layout_object_) 319 if (layout_object_)
320 layout_object_->SetHasAXObject(false); 320 layout_object_->SetHasAXObject(false);
321 #endif 321 #endif
322 layout_object_ = 0; 322 layout_object_ = 0;
323 } 323 }
324 324
325 // 325 //
326 // Check object role or purpose. 326 // Check object role or purpose.
327 // 327 //
328 328
329 static bool IsLinkable(const AXObject& object) { 329 static bool IsLinkable(const AXObjectImpl& object) {
330 if (!object.GetLayoutObject()) 330 if (!object.GetLayoutObject())
331 return false; 331 return false;
332 332
333 // See https://wiki.mozilla.org/Accessibility/AT-Windows-API for the elements 333 // See https://wiki.mozilla.org/Accessibility/AT-Windows-API for the elements
334 // Mozilla considers linkable. 334 // Mozilla considers linkable.
335 return object.IsLink() || object.IsImage() || 335 return object.IsLink() || object.IsImage() ||
336 object.GetLayoutObject()->IsText(); 336 object.GetLayoutObject()->IsText();
337 } 337 }
338 338
339 // Requires layoutObject to be present because it relies on style 339 // Requires layoutObject to be present because it relies on style
340 // user-modify. Don't move this logic to AXNodeObject. 340 // user-modify. Don't move this logic to AXNodeObject.
341 bool AXLayoutObject::IsEditable() const { 341 bool AXLayoutObject::IsEditable() const {
342 if (GetLayoutObject() && GetLayoutObject()->IsTextControl()) 342 if (GetLayoutObject() && GetLayoutObject()->IsTextControl())
343 return true; 343 return true;
344 344
345 if (GetNode() && HasEditableStyle(*GetNode())) 345 if (GetNode() && HasEditableStyle(*GetNode()))
346 return true; 346 return true;
347 347
348 if (IsWebArea()) { 348 if (IsWebArea()) {
349 Document& document = GetLayoutObject()->GetDocument(); 349 Document& document = GetLayoutObject()->GetDocument();
350 HTMLElement* body = document.body(); 350 HTMLElement* body = document.body();
351 if (body && HasEditableStyle(*body)) { 351 if (body && HasEditableStyle(*body)) {
352 AXObject* ax_body = AxObjectCache().GetOrCreate(body); 352 AXObjectImpl* ax_body = AxObjectCache().GetOrCreate(body);
353 return ax_body && ax_body != ax_body->AriaHiddenRoot(); 353 return ax_body && ax_body != ax_body->AriaHiddenRoot();
354 } 354 }
355 355
356 return HasEditableStyle(document); 356 return HasEditableStyle(document);
357 } 357 }
358 358
359 return AXNodeObject::IsEditable(); 359 return AXNodeObject::IsEditable();
360 } 360 }
361 361
362 // Requires layoutObject to be present because it relies on style 362 // Requires layoutObject to be present because it relies on style
363 // user-modify. Don't move this logic to AXNodeObject. 363 // user-modify. Don't move this logic to AXNodeObject.
364 bool AXLayoutObject::IsRichlyEditable() const { 364 bool AXLayoutObject::IsRichlyEditable() const {
365 if (GetNode() && HasRichlyEditableStyle(*GetNode())) 365 if (GetNode() && HasRichlyEditableStyle(*GetNode()))
366 return true; 366 return true;
367 367
368 if (IsWebArea()) { 368 if (IsWebArea()) {
369 Document& document = layout_object_->GetDocument(); 369 Document& document = layout_object_->GetDocument();
370 HTMLElement* body = document.body(); 370 HTMLElement* body = document.body();
371 if (body && HasRichlyEditableStyle(*body)) { 371 if (body && HasRichlyEditableStyle(*body)) {
372 AXObject* ax_body = AxObjectCache().GetOrCreate(body); 372 AXObjectImpl* ax_body = AxObjectCache().GetOrCreate(body);
373 return ax_body && ax_body != ax_body->AriaHiddenRoot(); 373 return ax_body && ax_body != ax_body->AriaHiddenRoot();
374 } 374 }
375 375
376 return HasRichlyEditableStyle(document); 376 return HasRichlyEditableStyle(document);
377 } 377 }
378 378
379 return AXNodeObject::IsRichlyEditable(); 379 return AXNodeObject::IsRichlyEditable();
380 } 380 }
381 381
382 bool AXLayoutObject::IsLinked() const { 382 bool AXLayoutObject::IsLinked() const {
(...skipping 21 matching lines...) Expand all
404 return view_rect.IsEmpty(); 404 return view_rect.IsEmpty();
405 } 405 }
406 406
407 bool AXLayoutObject::IsReadOnly() const { 407 bool AXLayoutObject::IsReadOnly() const {
408 DCHECK(layout_object_); 408 DCHECK(layout_object_);
409 409
410 if (IsWebArea()) { 410 if (IsWebArea()) {
411 Document& document = layout_object_->GetDocument(); 411 Document& document = layout_object_->GetDocument();
412 HTMLElement* body = document.body(); 412 HTMLElement* body = document.body();
413 if (body && HasEditableStyle(*body)) { 413 if (body && HasEditableStyle(*body)) {
414 AXObject* ax_body = AxObjectCache().GetOrCreate(body); 414 AXObjectImpl* ax_body = AxObjectCache().GetOrCreate(body);
415 return !ax_body || ax_body == ax_body->AriaHiddenRoot(); 415 return !ax_body || ax_body == ax_body->AriaHiddenRoot();
416 } 416 }
417 417
418 return !HasEditableStyle(document); 418 return !HasEditableStyle(document);
419 } 419 }
420 420
421 return AXNodeObject::IsReadOnly(); 421 return AXNodeObject::IsReadOnly();
422 } 422 }
423 423
424 bool AXLayoutObject::IsVisited() const { 424 bool AXLayoutObject::IsVisited() const {
425 // FIXME: Is it a privacy violation to expose visited information to 425 // FIXME: Is it a privacy violation to expose visited information to
426 // accessibility APIs? 426 // accessibility APIs?
427 return layout_object_->Style()->IsLink() && 427 return layout_object_->Style()->IsLink() &&
428 layout_object_->Style()->InsideLink() == 428 layout_object_->Style()->InsideLink() ==
429 EInsideLink::kInsideVisitedLink; 429 EInsideLink::kInsideVisitedLink;
430 } 430 }
431 431
432 // 432 //
433 // Check object state. 433 // Check object state.
434 // 434 //
435 435
436 bool AXLayoutObject::IsFocused() const { 436 bool AXLayoutObject::IsFocused() const {
437 if (!GetDocument()) 437 if (!GetDocument())
438 return false; 438 return false;
439 439
440 Element* focused_element = GetDocument()->FocusedElement(); 440 Element* focused_element = GetDocument()->FocusedElement();
441 if (!focused_element) 441 if (!focused_element)
442 return false; 442 return false;
443 AXObject* focused_object = AxObjectCache().GetOrCreate(focused_element); 443 AXObjectImpl* focused_object = AxObjectCache().GetOrCreate(focused_element);
444 if (!focused_object || !focused_object->IsAXLayoutObject()) 444 if (!focused_object || !focused_object->IsAXLayoutObject())
445 return false; 445 return false;
446 446
447 // A web area is represented by the Document node in the DOM tree, which isn't 447 // A web area is represented by the Document node in the DOM tree, which isn't
448 // focusable. Check instead if the frame's selection controller is focused 448 // focusable. Check instead if the frame's selection controller is focused
449 if (focused_object == this || 449 if (focused_object == this ||
450 (RoleValue() == kWebAreaRole && 450 (RoleValue() == kWebAreaRole &&
451 GetDocument()->GetFrame()->Selection().IsFocusedAndActive())) 451 GetDocument()->GetFrame()->Selection().IsFocusedAndActive()))
452 return true; 452 return true;
453 453
454 return false; 454 return false;
455 } 455 }
456 456
457 bool AXLayoutObject::IsSelected() const { 457 bool AXLayoutObject::IsSelected() const {
458 if (!GetLayoutObject() || !GetNode()) 458 if (!GetLayoutObject() || !GetNode())
459 return false; 459 return false;
460 460
461 const AtomicString& aria_selected = GetAttribute(aria_selectedAttr); 461 const AtomicString& aria_selected = GetAttribute(aria_selectedAttr);
462 if (EqualIgnoringASCIICase(aria_selected, "true")) 462 if (EqualIgnoringASCIICase(aria_selected, "true"))
463 return true; 463 return true;
464 464
465 AXObject* focused_object = AxObjectCache().FocusedObject(); 465 AXObjectImpl* focused_object = AxObjectCache().FocusedObject();
466 if (AriaRoleAttribute() == kListBoxOptionRole && focused_object && 466 if (AriaRoleAttribute() == kListBoxOptionRole && focused_object &&
467 focused_object->ActiveDescendant() == this) { 467 focused_object->ActiveDescendant() == this) {
468 return true; 468 return true;
469 } 469 }
470 470
471 if (IsTabItem() && IsTabItemSelected()) 471 if (IsTabItem() && IsTabItemSelected())
472 return true; 472 return true;
473 473
474 return false; 474 return false;
475 } 475 }
(...skipping 17 matching lines...) Expand all
493 // aria-hidden is meant to override visibility as the determinant in AX 493 // aria-hidden is meant to override visibility as the determinant in AX
494 // hierarchy inclusion. 494 // hierarchy inclusion.
495 if (EqualIgnoringASCIICase(GetAttribute(aria_hiddenAttr), "false")) 495 if (EqualIgnoringASCIICase(GetAttribute(aria_hiddenAttr), "false"))
496 return kDefaultBehavior; 496 return kDefaultBehavior;
497 497
498 if (ignored_reasons) 498 if (ignored_reasons)
499 ignored_reasons->push_back(IgnoredReason(kAXNotVisible)); 499 ignored_reasons->push_back(IgnoredReason(kAXNotVisible));
500 return kIgnoreObject; 500 return kIgnoreObject;
501 } 501 }
502 502
503 return AXObject::DefaultObjectInclusion(ignored_reasons); 503 return AXObjectImpl::DefaultObjectInclusion(ignored_reasons);
504 } 504 }
505 505
506 bool AXLayoutObject::ComputeAccessibilityIsIgnored( 506 bool AXLayoutObject::ComputeAccessibilityIsIgnored(
507 IgnoredReasons* ignored_reasons) const { 507 IgnoredReasons* ignored_reasons) const {
508 #if DCHECK_IS_ON() 508 #if DCHECK_IS_ON()
509 DCHECK(initialized_); 509 DCHECK(initialized_);
510 #endif 510 #endif
511 511
512 if (!layout_object_) 512 if (!layout_object_)
513 return true; 513 return true;
(...skipping 20 matching lines...) Expand all
534 } 534 }
535 535
536 if (RoleValue() == kIgnoredRole) { 536 if (RoleValue() == kIgnoredRole) {
537 if (ignored_reasons) 537 if (ignored_reasons)
538 ignored_reasons->push_back(IgnoredReason(kAXUninteresting)); 538 ignored_reasons->push_back(IgnoredReason(kAXUninteresting));
539 return true; 539 return true;
540 } 540 }
541 541
542 if (HasInheritedPresentationalRole()) { 542 if (HasInheritedPresentationalRole()) {
543 if (ignored_reasons) { 543 if (ignored_reasons) {
544 const AXObject* inherits_from = InheritsPresentationalRoleFrom(); 544 const AXObjectImpl* inherits_from = InheritsPresentationalRoleFrom();
545 if (inherits_from == this) 545 if (inherits_from == this)
546 ignored_reasons->push_back(IgnoredReason(kAXPresentationalRole)); 546 ignored_reasons->push_back(IgnoredReason(kAXPresentationalRole));
547 else 547 else
548 ignored_reasons->push_back( 548 ignored_reasons->push_back(
549 IgnoredReason(kAXInheritsPresentation, inherits_from)); 549 IgnoredReason(kAXInheritsPresentation, inherits_from));
550 } 550 }
551 return true; 551 return true;
552 } 552 }
553 553
554 // An ARIA tree can only have tree items and static text as children. 554 // An ARIA tree can only have tree items and static text as children.
555 if (AXObject* tree_ancestor = TreeAncestorDisallowingChild()) { 555 if (AXObjectImpl* tree_ancestor = TreeAncestorDisallowingChild()) {
556 if (ignored_reasons) 556 if (ignored_reasons)
557 ignored_reasons->push_back( 557 ignored_reasons->push_back(
558 IgnoredReason(kAXAncestorDisallowsChild, tree_ancestor)); 558 IgnoredReason(kAXAncestorDisallowsChild, tree_ancestor));
559 return true; 559 return true;
560 } 560 }
561 561
562 // A LayoutPart is an iframe element or embedded object element or something 562 // A LayoutPart is an iframe element or embedded object element or something
563 // like that. We don't want to ignore those. 563 // like that. We don't want to ignore those.
564 if (layout_object_->IsLayoutPart()) 564 if (layout_object_->IsLayoutPart())
565 return false; 565 return false;
566 566
567 // Make sure renderers with layers stay in the tree. 567 // Make sure renderers with layers stay in the tree.
568 if (GetLayoutObject() && GetLayoutObject()->HasLayer() && GetNode() && 568 if (GetLayoutObject() && GetLayoutObject()->HasLayer() && GetNode() &&
569 GetNode()->hasChildren()) 569 GetNode()->hasChildren())
570 return false; 570 return false;
571 571
572 // Find out if this element is inside of a label element. If so, it may be 572 // Find out if this element is inside of a label element. If so, it may be
573 // ignored because it's the label for a checkbox or radio button. 573 // ignored because it's the label for a checkbox or radio button.
574 AXObject* control_object = CorrespondingControlForLabelElement(); 574 AXObjectImpl* control_object = CorrespondingControlForLabelElement();
575 if (control_object && control_object->IsCheckboxOrRadio() && 575 if (control_object && control_object->IsCheckboxOrRadio() &&
576 control_object->NameFromLabelElement()) { 576 control_object->NameFromLabelElement()) {
577 if (ignored_reasons) { 577 if (ignored_reasons) {
578 HTMLLabelElement* label = LabelElementContainer(); 578 HTMLLabelElement* label = LabelElementContainer();
579 if (label && label != GetNode()) { 579 if (label && label != GetNode()) {
580 AXObject* label_ax_object = AxObjectCache().GetOrCreate(label); 580 AXObjectImpl* label_ax_object = AxObjectCache().GetOrCreate(label);
581 ignored_reasons->push_back( 581 ignored_reasons->push_back(
582 IgnoredReason(kAXLabelContainer, label_ax_object)); 582 IgnoredReason(kAXLabelContainer, label_ax_object));
583 } 583 }
584 584
585 ignored_reasons->push_back(IgnoredReason(kAXLabelFor, control_object)); 585 ignored_reasons->push_back(IgnoredReason(kAXLabelFor, control_object));
586 } 586 }
587 return true; 587 return true;
588 } 588 }
589 589
590 if (layout_object_->IsBR()) 590 if (layout_object_->IsBR())
591 return false; 591 return false;
592 592
593 if (IsLink()) 593 if (IsLink())
594 return false; 594 return false;
595 595
596 if (IsInPageLinkTarget()) 596 if (IsInPageLinkTarget())
597 return false; 597 return false;
598 598
599 if (layout_object_->IsText()) { 599 if (layout_object_->IsText()) {
600 // Static text beneath MenuItems and MenuButtons are just reported along 600 // Static text beneath MenuItems and MenuButtons are just reported along
601 // with the menu item, so it's ignored on an individual level. 601 // with the menu item, so it's ignored on an individual level.
602 AXObject* parent = ParentObjectUnignored(); 602 AXObjectImpl* parent = ParentObjectUnignored();
603 if (parent && (parent->AriaRoleAttribute() == kMenuItemRole || 603 if (parent && (parent->AriaRoleAttribute() == kMenuItemRole ||
604 parent->AriaRoleAttribute() == kMenuButtonRole)) { 604 parent->AriaRoleAttribute() == kMenuButtonRole)) {
605 if (ignored_reasons) 605 if (ignored_reasons)
606 ignored_reasons->push_back( 606 ignored_reasons->push_back(
607 IgnoredReason(kAXStaticTextUsedAsNameFor, parent)); 607 IgnoredReason(kAXStaticTextUsedAsNameFor, parent));
608 return true; 608 return true;
609 } 609 }
610 LayoutText* layout_text = ToLayoutText(layout_object_); 610 LayoutText* layout_text = ToLayoutText(layout_object_);
611 if (!layout_text->HasTextBoxes()) { 611 if (!layout_text->HasTextBoxes()) {
612 if (ignored_reasons) 612 if (ignored_reasons)
613 ignored_reasons->push_back(IgnoredReason(kAXEmptyText)); 613 ignored_reasons->push_back(IgnoredReason(kAXEmptyText));
614 return true; 614 return true;
615 } 615 }
616 616
617 // Don't ignore static text in editable text controls. 617 // Don't ignore static text in editable text controls.
618 for (AXObject* parent = ParentObject(); parent; 618 for (AXObjectImpl* parent = ParentObject(); parent;
619 parent = parent->ParentObject()) { 619 parent = parent->ParentObject()) {
620 if (parent->RoleValue() == kTextFieldRole) 620 if (parent->RoleValue() == kTextFieldRole)
621 return false; 621 return false;
622 } 622 }
623 623
624 // Text elements that are just empty whitespace should not be returned. 624 // Text elements that are just empty whitespace should not be returned.
625 // FIXME(dmazzoni): we probably shouldn't ignore this if the style is 'pre', 625 // FIXME(dmazzoni): we probably shouldn't ignore this if the style is 'pre',
626 // or similar... 626 // or similar...
627 if (layout_text->GetText().Impl()->ContainsOnlyWhitespace()) { 627 if (layout_text->GetText().Impl()->ContainsOnlyWhitespace()) {
628 if (ignored_reasons) 628 if (ignored_reasons)
(...skipping 172 matching lines...) Expand 10 before | Expand all | Expand 10 after
801 } 801 }
802 802
803 RGBA32 AXLayoutObject::ComputeBackgroundColor() const { 803 RGBA32 AXLayoutObject::ComputeBackgroundColor() const {
804 if (!GetLayoutObject()) 804 if (!GetLayoutObject())
805 return AXNodeObject::BackgroundColor(); 805 return AXNodeObject::BackgroundColor();
806 806
807 Color blended_color = Color::kTransparent; 807 Color blended_color = Color::kTransparent;
808 // Color::blend should be called like this: background.blend(foreground). 808 // Color::blend should be called like this: background.blend(foreground).
809 for (LayoutObject* layout_object = GetLayoutObject(); layout_object; 809 for (LayoutObject* layout_object = GetLayoutObject(); layout_object;
810 layout_object = layout_object->Parent()) { 810 layout_object = layout_object->Parent()) {
811 const AXObject* ax_parent = AxObjectCache().GetOrCreate(layout_object); 811 const AXObjectImpl* ax_parent = AxObjectCache().GetOrCreate(layout_object);
812 if (ax_parent && ax_parent != this) { 812 if (ax_parent && ax_parent != this) {
813 Color parent_color = ax_parent->BackgroundColor(); 813 Color parent_color = ax_parent->BackgroundColor();
814 blended_color = parent_color.Blend(blended_color); 814 blended_color = parent_color.Blend(blended_color);
815 return blended_color.Rgb(); 815 return blended_color.Rgb();
816 } 816 }
817 817
818 const ComputedStyle* style = layout_object->Style(); 818 const ComputedStyle* style = layout_object->Style();
819 if (!style || !style->HasBackground()) 819 if (!style || !style->HasBackground())
820 continue; 820 continue;
821 821
(...skipping 250 matching lines...) Expand 10 before | Expand all | Expand 10 after
1072 ClearChildren(); 1072 ClearChildren();
1073 AddInlineTextBoxChildren(true); 1073 AddInlineTextBoxChildren(true);
1074 return; 1074 return;
1075 } 1075 }
1076 1076
1077 for (const auto& child : children_) { 1077 for (const auto& child : children_) {
1078 child->LoadInlineTextBoxes(); 1078 child->LoadInlineTextBoxes();
1079 } 1079 }
1080 } 1080 }
1081 1081
1082 AXObject* AXLayoutObject::NextOnLine() const { 1082 AXObjectImpl* AXLayoutObject::NextOnLine() const {
1083 if (!GetLayoutObject()) 1083 if (!GetLayoutObject())
1084 return nullptr; 1084 return nullptr;
1085 1085
1086 InlineBox* inline_box = nullptr; 1086 InlineBox* inline_box = nullptr;
1087 if (GetLayoutObject()->IsLayoutInline()) 1087 if (GetLayoutObject()->IsLayoutInline())
1088 inline_box = ToLayoutInline(GetLayoutObject())->LastLineBox(); 1088 inline_box = ToLayoutInline(GetLayoutObject())->LastLineBox();
1089 else if (GetLayoutObject()->IsText()) 1089 else if (GetLayoutObject()->IsText())
1090 inline_box = ToLayoutText(GetLayoutObject())->LastTextBox(); 1090 inline_box = ToLayoutText(GetLayoutObject())->LastTextBox();
1091 1091
1092 if (!inline_box) 1092 if (!inline_box)
1093 return nullptr; 1093 return nullptr;
1094 1094
1095 AXObject* result = nullptr; 1095 AXObjectImpl* result = nullptr;
1096 for (InlineBox* next = inline_box->NextOnLine(); next; 1096 for (InlineBox* next = inline_box->NextOnLine(); next;
1097 next = next->NextOnLine()) { 1097 next = next->NextOnLine()) {
1098 LayoutObject* layout_object = 1098 LayoutObject* layout_object =
1099 LineLayoutAPIShim::LayoutObjectFrom(next->GetLineLayoutItem()); 1099 LineLayoutAPIShim::LayoutObjectFrom(next->GetLineLayoutItem());
1100 result = AxObjectCache().GetOrCreate(layout_object); 1100 result = AxObjectCache().GetOrCreate(layout_object);
1101 if (result) 1101 if (result)
1102 break; 1102 break;
1103 } 1103 }
1104 1104
1105 // A static text node might span multiple lines. Try to return the first 1105 // A static text node might span multiple lines. Try to return the first
1106 // inline text box within that static text if possible. 1106 // inline text box within that static text if possible.
1107 if (result && result->RoleValue() == kStaticTextRole && 1107 if (result && result->RoleValue() == kStaticTextRole &&
1108 result->Children().size()) 1108 result->Children().size())
1109 result = result->Children()[0].Get(); 1109 result = result->Children()[0].Get();
1110 1110
1111 return result; 1111 return result;
1112 } 1112 }
1113 1113
1114 AXObject* AXLayoutObject::PreviousOnLine() const { 1114 AXObjectImpl* AXLayoutObject::PreviousOnLine() const {
1115 if (!GetLayoutObject()) 1115 if (!GetLayoutObject())
1116 return nullptr; 1116 return nullptr;
1117 1117
1118 InlineBox* inline_box = nullptr; 1118 InlineBox* inline_box = nullptr;
1119 if (GetLayoutObject()->IsLayoutInline()) 1119 if (GetLayoutObject()->IsLayoutInline())
1120 inline_box = ToLayoutInline(GetLayoutObject())->FirstLineBox(); 1120 inline_box = ToLayoutInline(GetLayoutObject())->FirstLineBox();
1121 else if (GetLayoutObject()->IsText()) 1121 else if (GetLayoutObject()->IsText())
1122 inline_box = ToLayoutText(GetLayoutObject())->FirstTextBox(); 1122 inline_box = ToLayoutText(GetLayoutObject())->FirstTextBox();
1123 1123
1124 if (!inline_box) 1124 if (!inline_box)
1125 return nullptr; 1125 return nullptr;
1126 1126
1127 AXObject* result = nullptr; 1127 AXObjectImpl* result = nullptr;
1128 for (InlineBox* prev = inline_box->PrevOnLine(); prev; 1128 for (InlineBox* prev = inline_box->PrevOnLine(); prev;
1129 prev = prev->PrevOnLine()) { 1129 prev = prev->PrevOnLine()) {
1130 LayoutObject* layout_object = 1130 LayoutObject* layout_object =
1131 LineLayoutAPIShim::LayoutObjectFrom(prev->GetLineLayoutItem()); 1131 LineLayoutAPIShim::LayoutObjectFrom(prev->GetLineLayoutItem());
1132 result = AxObjectCache().GetOrCreate(layout_object); 1132 result = AxObjectCache().GetOrCreate(layout_object);
1133 if (result) 1133 if (result)
1134 break; 1134 break;
1135 } 1135 }
1136 1136
1137 // A static text node might span multiple lines. Try to return the last inline 1137 // A static text node might span multiple lines. Try to return the last inline
(...skipping 138 matching lines...) Expand 10 before | Expand all | Expand 10 after
1276 case kImageRole: 1276 case kImageRole:
1277 case kProgressIndicatorRole: 1277 case kProgressIndicatorRole:
1278 case kSpinButtonRole: 1278 case kSpinButtonRole:
1279 // case SeparatorRole: 1279 // case SeparatorRole:
1280 return true; 1280 return true;
1281 default: 1281 default:
1282 return false; 1282 return false;
1283 } 1283 }
1284 } 1284 }
1285 1285
1286 AXObject* AXLayoutObject::AncestorForWhichThisIsAPresentationalChild() const { 1286 AXObjectImpl* AXLayoutObject::AncestorForWhichThisIsAPresentationalChild()
1287 const {
1287 // Walk the parent chain looking for a parent that has presentational children 1288 // Walk the parent chain looking for a parent that has presentational children
1288 AXObject* parent = ParentObjectIfExists(); 1289 AXObjectImpl* parent = ParentObjectIfExists();
1289 while (parent) { 1290 while (parent) {
1290 if (parent->AriaRoleHasPresentationalChildren()) 1291 if (parent->AriaRoleHasPresentationalChildren())
1291 break; 1292 break;
1292 1293
1293 // The descendants of a AXMenuList that are AXLayoutObjects are all 1294 // The descendants of a AXMenuList that are AXLayoutObjects are all
1294 // presentational. (The real descendants are an AXMenuListPopup and 1295 // presentational. (The real descendants are an AXMenuListPopup and
1295 // AXMenuListOptions, which are not AXLayoutObjects.) 1296 // AXMenuListOptions, which are not AXLayoutObjects.)
1296 if (parent->IsMenuList()) 1297 if (parent->IsMenuList())
1297 break; 1298 break;
1298 1299
(...skipping 83 matching lines...) Expand 10 before | Expand all | Expand 10 after
1382 } 1383 }
1383 1384
1384 bool AXLayoutObject::LiveRegionBusy() const { 1385 bool AXLayoutObject::LiveRegionBusy() const {
1385 return ElementAttributeValue(aria_busyAttr); 1386 return ElementAttributeValue(aria_busyAttr);
1386 } 1387 }
1387 1388
1388 // 1389 //
1389 // Hit testing. 1390 // Hit testing.
1390 // 1391 //
1391 1392
1392 AXObject* AXLayoutObject::AccessibilityHitTest(const IntPoint& point) const { 1393 AXObjectImpl* AXLayoutObject::AccessibilityHitTest(
1394 const IntPoint& point) const {
1393 if (!layout_object_ || !layout_object_->HasLayer()) 1395 if (!layout_object_ || !layout_object_->HasLayer())
1394 return nullptr; 1396 return nullptr;
1395 1397
1396 PaintLayer* layer = ToLayoutBox(layout_object_)->Layer(); 1398 PaintLayer* layer = ToLayoutBox(layout_object_)->Layer();
1397 1399
1398 HitTestRequest request(HitTestRequest::kReadOnly | HitTestRequest::kActive); 1400 HitTestRequest request(HitTestRequest::kReadOnly | HitTestRequest::kActive);
1399 HitTestResult hit_test_result = HitTestResult(request, point); 1401 HitTestResult hit_test_result = HitTestResult(request, point);
1400 layer->HitTest(hit_test_result); 1402 layer->HitTest(hit_test_result);
1401 1403
1402 Node* node = hit_test_result.InnerNode(); 1404 Node* node = hit_test_result.InnerNode();
1403 if (!node) 1405 if (!node)
1404 return nullptr; 1406 return nullptr;
1405 1407
1406 if (isHTMLAreaElement(node)) 1408 if (isHTMLAreaElement(node))
1407 return AccessibilityImageMapHitTest(toHTMLAreaElement(node), point); 1409 return AccessibilityImageMapHitTest(toHTMLAreaElement(node), point);
1408 1410
1409 if (isHTMLOptionElement(node)) { 1411 if (isHTMLOptionElement(node)) {
1410 node = toHTMLOptionElement(*node).OwnerSelectElement(); 1412 node = toHTMLOptionElement(*node).OwnerSelectElement();
1411 if (!node) 1413 if (!node)
1412 return nullptr; 1414 return nullptr;
1413 } 1415 }
1414 1416
1415 LayoutObject* obj = node->GetLayoutObject(); 1417 LayoutObject* obj = node->GetLayoutObject();
1416 if (!obj) 1418 if (!obj)
1417 return nullptr; 1419 return nullptr;
1418 1420
1419 AXObject* result = AxObjectCache().GetOrCreate(obj); 1421 AXObjectImpl* result = AxObjectCache().GetOrCreate(obj);
1420 result->UpdateChildrenIfNecessary(); 1422 result->UpdateChildrenIfNecessary();
1421 1423
1422 // Allow the element to perform any hit-testing it might need to do to reach 1424 // Allow the element to perform any hit-testing it might need to do to reach
1423 // non-layout children. 1425 // non-layout children.
1424 result = result->ElementAccessibilityHitTest(point); 1426 result = result->ElementAccessibilityHitTest(point);
1425 if (result && result->AccessibilityIsIgnored()) { 1427 if (result && result->AccessibilityIsIgnored()) {
1426 // If this element is the label of a control, a hit test should return the 1428 // If this element is the label of a control, a hit test should return the
1427 // control. 1429 // control.
1428 if (result->IsAXLayoutObject()) { 1430 if (result->IsAXLayoutObject()) {
1429 AXObject* control_object = 1431 AXObjectImpl* control_object =
1430 ToAXLayoutObject(result)->CorrespondingControlForLabelElement(); 1432 ToAXLayoutObject(result)->CorrespondingControlForLabelElement();
1431 if (control_object && control_object->NameFromLabelElement()) 1433 if (control_object && control_object->NameFromLabelElement())
1432 return control_object; 1434 return control_object;
1433 } 1435 }
1434 1436
1435 result = result->ParentObjectUnignored(); 1437 result = result->ParentObjectUnignored();
1436 } 1438 }
1437 1439
1438 return result; 1440 return result;
1439 } 1441 }
1440 1442
1441 AXObject* AXLayoutObject::ElementAccessibilityHitTest( 1443 AXObjectImpl* AXLayoutObject::ElementAccessibilityHitTest(
1442 const IntPoint& point) const { 1444 const IntPoint& point) const {
1443 if (IsSVGImage()) 1445 if (IsSVGImage())
1444 return RemoteSVGElementHitTest(point); 1446 return RemoteSVGElementHitTest(point);
1445 1447
1446 return AXObject::ElementAccessibilityHitTest(point); 1448 return AXObjectImpl::ElementAccessibilityHitTest(point);
1447 } 1449 }
1448 1450
1449 // 1451 //
1450 // High-level accessibility tree access. 1452 // High-level accessibility tree access.
1451 // 1453 //
1452 1454
1453 AXObject* AXLayoutObject::ComputeParent() const { 1455 AXObjectImpl* AXLayoutObject::ComputeParent() const {
1454 DCHECK(!IsDetached()); 1456 DCHECK(!IsDetached());
1455 if (!layout_object_) 1457 if (!layout_object_)
1456 return 0; 1458 return 0;
1457 1459
1458 if (AriaRoleAttribute() == kMenuBarRole) 1460 if (AriaRoleAttribute() == kMenuBarRole)
1459 return AxObjectCache().GetOrCreate(layout_object_->Parent()); 1461 return AxObjectCache().GetOrCreate(layout_object_->Parent());
1460 1462
1461 // menuButton and its corresponding menu are DOM siblings, but Accessibility 1463 // menuButton and its corresponding menu are DOM siblings, but Accessibility
1462 // needs them to be parent/child. 1464 // needs them to be parent/child.
1463 if (AriaRoleAttribute() == kMenuRole) { 1465 if (AriaRoleAttribute() == kMenuRole) {
1464 AXObject* parent = MenuButtonForMenu(); 1466 AXObjectImpl* parent = MenuButtonForMenu();
1465 if (parent) 1467 if (parent)
1466 return parent; 1468 return parent;
1467 } 1469 }
1468 1470
1469 LayoutObject* parent_obj = LayoutParentObject(); 1471 LayoutObject* parent_obj = LayoutParentObject();
1470 if (parent_obj) 1472 if (parent_obj)
1471 return AxObjectCache().GetOrCreate(parent_obj); 1473 return AxObjectCache().GetOrCreate(parent_obj);
1472 1474
1473 // A WebArea's parent should be the page popup owner, if any, otherwise null. 1475 // A WebArea's parent should be the page popup owner, if any, otherwise null.
1474 if (IsWebArea()) { 1476 if (IsWebArea()) {
1475 LocalFrame* frame = layout_object_->GetFrame(); 1477 LocalFrame* frame = layout_object_->GetFrame();
1476 return AxObjectCache().GetOrCreate(frame->PagePopupOwner()); 1478 return AxObjectCache().GetOrCreate(frame->PagePopupOwner());
1477 } 1479 }
1478 1480
1479 return 0; 1481 return 0;
1480 } 1482 }
1481 1483
1482 AXObject* AXLayoutObject::ComputeParentIfExists() const { 1484 AXObjectImpl* AXLayoutObject::ComputeParentIfExists() const {
1483 if (!layout_object_) 1485 if (!layout_object_)
1484 return 0; 1486 return 0;
1485 1487
1486 if (AriaRoleAttribute() == kMenuBarRole) 1488 if (AriaRoleAttribute() == kMenuBarRole)
1487 return AxObjectCache().Get(layout_object_->Parent()); 1489 return AxObjectCache().Get(layout_object_->Parent());
1488 1490
1489 // menuButton and its corresponding menu are DOM siblings, but Accessibility 1491 // menuButton and its corresponding menu are DOM siblings, but Accessibility
1490 // needs them to be parent/child. 1492 // needs them to be parent/child.
1491 if (AriaRoleAttribute() == kMenuRole) { 1493 if (AriaRoleAttribute() == kMenuRole) {
1492 AXObject* parent = MenuButtonForMenu(); 1494 AXObjectImpl* parent = MenuButtonForMenu();
1493 if (parent) 1495 if (parent)
1494 return parent; 1496 return parent;
1495 } 1497 }
1496 1498
1497 LayoutObject* parent_obj = LayoutParentObject(); 1499 LayoutObject* parent_obj = LayoutParentObject();
1498 if (parent_obj) 1500 if (parent_obj)
1499 return AxObjectCache().Get(parent_obj); 1501 return AxObjectCache().Get(parent_obj);
1500 1502
1501 // A WebArea's parent should be the page popup owner, if any, otherwise null. 1503 // A WebArea's parent should be the page popup owner, if any, otherwise null.
1502 if (IsWebArea()) { 1504 if (IsWebArea()) {
1503 LocalFrame* frame = layout_object_->GetFrame(); 1505 LocalFrame* frame = layout_object_->GetFrame();
1504 return AxObjectCache().Get(frame->PagePopupOwner()); 1506 return AxObjectCache().Get(frame->PagePopupOwner());
1505 } 1507 }
1506 1508
1507 return 0; 1509 return 0;
1508 } 1510 }
1509 1511
1510 // 1512 //
1511 // Low-level accessibility tree exploration, only for use within the 1513 // Low-level accessibility tree exploration, only for use within the
1512 // accessibility module. 1514 // accessibility module.
1513 // 1515 //
1514 1516
1515 AXObject* AXLayoutObject::RawFirstChild() const { 1517 AXObjectImpl* AXLayoutObject::RawFirstChild() const {
1516 if (!layout_object_) 1518 if (!layout_object_)
1517 return 0; 1519 return 0;
1518 1520
1519 LayoutObject* first_child = FirstChildConsideringContinuation(layout_object_); 1521 LayoutObject* first_child = FirstChildConsideringContinuation(layout_object_);
1520 1522
1521 if (!first_child) 1523 if (!first_child)
1522 return 0; 1524 return 0;
1523 1525
1524 return AxObjectCache().GetOrCreate(first_child); 1526 return AxObjectCache().GetOrCreate(first_child);
1525 } 1527 }
1526 1528
1527 AXObject* AXLayoutObject::RawNextSibling() const { 1529 AXObjectImpl* AXLayoutObject::RawNextSibling() const {
1528 if (!layout_object_) 1530 if (!layout_object_)
1529 return 0; 1531 return 0;
1530 1532
1531 LayoutObject* next_sibling = 0; 1533 LayoutObject* next_sibling = 0;
1532 1534
1533 LayoutInline* inline_continuation = 1535 LayoutInline* inline_continuation =
1534 layout_object_->IsLayoutBlockFlow() 1536 layout_object_->IsLayoutBlockFlow()
1535 ? ToLayoutBlockFlow(layout_object_)->InlineElementContinuation() 1537 ? ToLayoutBlockFlow(layout_object_)->InlineElementContinuation()
1536 : nullptr; 1538 : nullptr;
1537 if (inline_continuation) { 1539 if (inline_continuation) {
(...skipping 47 matching lines...) Expand 10 before | Expand all | Expand 10 after
1585 // If the need to add more children in addition to existing children arises, 1587 // If the need to add more children in addition to existing children arises,
1586 // childrenChanged should have been called, leaving the object with no 1588 // childrenChanged should have been called, leaving the object with no
1587 // children. 1589 // children.
1588 DCHECK(!have_children_); 1590 DCHECK(!have_children_);
1589 1591
1590 have_children_ = true; 1592 have_children_ = true;
1591 1593
1592 if (!CanHaveChildren()) 1594 if (!CanHaveChildren())
1593 return; 1595 return;
1594 1596
1595 HeapVector<Member<AXObject>> owned_children; 1597 HeapVector<Member<AXObjectImpl>> owned_children;
1596 ComputeAriaOwnsChildren(owned_children); 1598 ComputeAriaOwnsChildren(owned_children);
1597 1599
1598 for (AXObject* obj = RawFirstChild(); obj; obj = obj->RawNextSibling()) { 1600 for (AXObjectImpl* obj = RawFirstChild(); obj; obj = obj->RawNextSibling()) {
1599 if (!AxObjectCache().IsAriaOwned(obj)) { 1601 if (!AxObjectCache().IsAriaOwned(obj)) {
1600 obj->SetParent(this); 1602 obj->SetParent(this);
1601 AddChild(obj); 1603 AddChild(obj);
1602 } 1604 }
1603 } 1605 }
1604 1606
1605 AddHiddenChildren(); 1607 AddHiddenChildren();
1606 AddPopupChildren(); 1608 AddPopupChildren();
1607 AddImageMapChildren(); 1609 AddImageMapChildren();
1608 AddTextFieldChildren(); 1610 AddTextFieldChildren();
(...skipping 14 matching lines...) Expand all
1623 if (!layout_object_) 1625 if (!layout_object_)
1624 return false; 1626 return false;
1625 1627
1626 return AXNodeObject::CanHaveChildren(); 1628 return AXNodeObject::CanHaveChildren();
1627 } 1629 }
1628 1630
1629 void AXLayoutObject::UpdateChildrenIfNecessary() { 1631 void AXLayoutObject::UpdateChildrenIfNecessary() {
1630 if (NeedsToUpdateChildren()) 1632 if (NeedsToUpdateChildren())
1631 ClearChildren(); 1633 ClearChildren();
1632 1634
1633 AXObject::UpdateChildrenIfNecessary(); 1635 AXObjectImpl::UpdateChildrenIfNecessary();
1634 } 1636 }
1635 1637
1636 void AXLayoutObject::ClearChildren() { 1638 void AXLayoutObject::ClearChildren() {
1637 AXObject::ClearChildren(); 1639 AXObjectImpl::ClearChildren();
1638 children_dirty_ = false; 1640 children_dirty_ = false;
1639 } 1641 }
1640 1642
1641 // 1643 //
1642 // Properties of the object's owning document or page. 1644 // Properties of the object's owning document or page.
1643 // 1645 //
1644 1646
1645 double AXLayoutObject::EstimatedLoadingProgress() const { 1647 double AXLayoutObject::EstimatedLoadingProgress() const {
1646 if (!layout_object_) 1648 if (!layout_object_)
1647 return 0; 1649 return 0;
(...skipping 66 matching lines...) Expand 10 before | Expand all | Expand 10 after
1714 return ToElement(&runner); 1716 return ToElement(&runner);
1715 } 1717 }
1716 1718
1717 return 0; 1719 return 0;
1718 } 1720 }
1719 1721
1720 // 1722 //
1721 // Functions that retrieve the current selection. 1723 // Functions that retrieve the current selection.
1722 // 1724 //
1723 1725
1724 AXObject::AXRange AXLayoutObject::Selection() const { 1726 AXObjectImpl::AXRange AXLayoutObject::Selection() const {
1725 AXRange text_selection = TextControlSelection(); 1727 AXRange text_selection = TextControlSelection();
1726 if (text_selection.IsValid()) 1728 if (text_selection.IsValid())
1727 return text_selection; 1729 return text_selection;
1728 1730
1729 if (!GetLayoutObject() || !GetLayoutObject()->GetFrame()) 1731 if (!GetLayoutObject() || !GetLayoutObject()->GetFrame())
1730 return AXRange(); 1732 return AXRange();
1731 1733
1732 VisibleSelection selection = 1734 VisibleSelection selection =
1733 GetLayoutObject() 1735 GetLayoutObject()
1734 ->GetFrame() 1736 ->GetFrame()
1735 ->Selection() 1737 ->Selection()
1736 .ComputeVisibleSelectionInDOMTreeDeprecated(); 1738 .ComputeVisibleSelectionInDOMTreeDeprecated();
1737 if (selection.IsNone()) 1739 if (selection.IsNone())
1738 return AXRange(); 1740 return AXRange();
1739 1741
1740 VisiblePosition visible_start = selection.VisibleStart(); 1742 VisiblePosition visible_start = selection.VisibleStart();
1741 Position start = visible_start.ToParentAnchoredPosition(); 1743 Position start = visible_start.ToParentAnchoredPosition();
1742 TextAffinity start_affinity = visible_start.Affinity(); 1744 TextAffinity start_affinity = visible_start.Affinity();
1743 VisiblePosition visible_end = selection.VisibleEnd(); 1745 VisiblePosition visible_end = selection.VisibleEnd();
1744 Position end = visible_end.ToParentAnchoredPosition(); 1746 Position end = visible_end.ToParentAnchoredPosition();
1745 TextAffinity end_affinity = visible_end.Affinity(); 1747 TextAffinity end_affinity = visible_end.Affinity();
1746 1748
1747 Node* anchor_node = start.AnchorNode(); 1749 Node* anchor_node = start.AnchorNode();
1748 DCHECK(anchor_node); 1750 DCHECK(anchor_node);
1749 1751
1750 AXLayoutObject* anchor_object = nullptr; 1752 AXLayoutObject* anchor_object = nullptr;
1751 // Find the closest node that has a corresponding AXObject. 1753 // Find the closest node that has a corresponding AXObjectImpl.
1752 // This is because some nodes may be aria hidden or might not even have 1754 // This is because some nodes may be aria hidden or might not even have
1753 // a layout object if they are part of the shadow DOM. 1755 // a layout object if they are part of the shadow DOM.
1754 while (anchor_node) { 1756 while (anchor_node) {
1755 anchor_object = GetUnignoredObjectFromNode(*anchor_node); 1757 anchor_object = GetUnignoredObjectFromNode(*anchor_node);
1756 if (anchor_object) 1758 if (anchor_object)
1757 break; 1759 break;
1758 1760
1759 if (anchor_node->nextSibling()) 1761 if (anchor_node->nextSibling())
1760 anchor_node = anchor_node->nextSibling(); 1762 anchor_node = anchor_node->nextSibling();
1761 else 1763 else
(...skipping 22 matching lines...) Expand all
1784 DCHECK_GE(anchor_offset, 0); 1786 DCHECK_GE(anchor_offset, 0);
1785 int focus_offset = focus_object->IndexForVisiblePosition(visible_end); 1787 int focus_offset = focus_object->IndexForVisiblePosition(visible_end);
1786 DCHECK_GE(focus_offset, 0); 1788 DCHECK_GE(focus_offset, 0);
1787 return AXRange(anchor_object, anchor_offset, start_affinity, focus_object, 1789 return AXRange(anchor_object, anchor_offset, start_affinity, focus_object,
1788 focus_offset, end_affinity); 1790 focus_offset, end_affinity);
1789 } 1791 }
1790 1792
1791 // Gets only the start and end offsets of the selection computed using the 1793 // Gets only the start and end offsets of the selection computed using the
1792 // current object as the starting point. Returns a null selection if there is 1794 // current object as the starting point. Returns a null selection if there is
1793 // no selection in the subtree rooted at this object. 1795 // no selection in the subtree rooted at this object.
1794 AXObject::AXRange AXLayoutObject::SelectionUnderObject() const { 1796 AXObjectImpl::AXRange AXLayoutObject::SelectionUnderObject() const {
1795 AXRange text_selection = TextControlSelection(); 1797 AXRange text_selection = TextControlSelection();
1796 if (text_selection.IsValid()) 1798 if (text_selection.IsValid())
1797 return text_selection; 1799 return text_selection;
1798 1800
1799 if (!GetNode() || !GetLayoutObject()->GetFrame()) 1801 if (!GetNode() || !GetLayoutObject()->GetFrame())
1800 return AXRange(); 1802 return AXRange();
1801 1803
1802 VisibleSelection selection = 1804 VisibleSelection selection =
1803 GetLayoutObject() 1805 GetLayoutObject()
1804 ->GetFrame() 1806 ->GetFrame()
(...skipping 13 matching lines...) Expand all
1818 } 1820 }
1819 1821
1820 int start = IndexForVisiblePosition(selection.VisibleStart()); 1822 int start = IndexForVisiblePosition(selection.VisibleStart());
1821 DCHECK_GE(start, 0); 1823 DCHECK_GE(start, 0);
1822 int end = IndexForVisiblePosition(selection.VisibleEnd()); 1824 int end = IndexForVisiblePosition(selection.VisibleEnd());
1823 DCHECK_GE(end, 0); 1825 DCHECK_GE(end, 0);
1824 1826
1825 return AXRange(start, end); 1827 return AXRange(start, end);
1826 } 1828 }
1827 1829
1828 AXObject::AXRange AXLayoutObject::TextControlSelection() const { 1830 AXObjectImpl::AXRange AXLayoutObject::TextControlSelection() const {
1829 if (!GetLayoutObject()) 1831 if (!GetLayoutObject())
1830 return AXRange(); 1832 return AXRange();
1831 1833
1832 LayoutObject* layout = nullptr; 1834 LayoutObject* layout = nullptr;
1833 if (GetLayoutObject()->IsTextControl()) { 1835 if (GetLayoutObject()->IsTextControl()) {
1834 layout = GetLayoutObject(); 1836 layout = GetLayoutObject();
1835 } else { 1837 } else {
1836 Element* focused_element = GetDocument()->FocusedElement(); 1838 Element* focused_element = GetDocument()->FocusedElement();
1837 if (focused_element && focused_element->GetLayoutObject() && 1839 if (focused_element && focused_element->GetLayoutObject() &&
1838 focused_element->GetLayoutObject()->IsTextControl()) 1840 focused_element->GetLayoutObject()->IsTextControl())
1839 layout = focused_element->GetLayoutObject(); 1841 layout = focused_element->GetLayoutObject();
1840 } 1842 }
1841 1843
1842 if (!layout) 1844 if (!layout)
1843 return AXRange(); 1845 return AXRange();
1844 1846
1845 AXObject* ax_object = AxObjectCache().GetOrCreate(layout); 1847 AXObjectImpl* ax_object = AxObjectCache().GetOrCreate(layout);
1846 if (!ax_object || !ax_object->IsAXLayoutObject()) 1848 if (!ax_object || !ax_object->IsAXLayoutObject())
1847 return AXRange(); 1849 return AXRange();
1848 1850
1849 VisibleSelection selection = 1851 VisibleSelection selection =
1850 layout->GetFrame() 1852 layout->GetFrame()
1851 ->Selection() 1853 ->Selection()
1852 .ComputeVisibleSelectionInDOMTreeDeprecated(); 1854 .ComputeVisibleSelectionInDOMTreeDeprecated();
1853 TextControlElement* text_control = 1855 TextControlElement* text_control =
1854 ToLayoutTextControl(layout)->GetTextControlElement(); 1856 ToLayoutTextControl(layout)->GetTextControlElement();
1855 DCHECK(text_control); 1857 DCHECK(text_control);
(...skipping 24 matching lines...) Expand all
1880 range->setEnd(index_position, IGNORE_EXCEPTION_FOR_TESTING); 1882 range->setEnd(index_position, IGNORE_EXCEPTION_FOR_TESTING);
1881 1883
1882 return TextIterator::RangeLength(range->StartPosition(), 1884 return TextIterator::RangeLength(range->StartPosition(),
1883 range->EndPosition()); 1885 range->EndPosition());
1884 } 1886 }
1885 1887
1886 AXLayoutObject* AXLayoutObject::GetUnignoredObjectFromNode(Node& node) const { 1888 AXLayoutObject* AXLayoutObject::GetUnignoredObjectFromNode(Node& node) const {
1887 if (IsDetached()) 1889 if (IsDetached())
1888 return nullptr; 1890 return nullptr;
1889 1891
1890 AXObject* ax_object = AxObjectCache().GetOrCreate(&node); 1892 AXObjectImpl* ax_object = AxObjectCache().GetOrCreate(&node);
1891 if (!ax_object) 1893 if (!ax_object)
1892 return nullptr; 1894 return nullptr;
1893 1895
1894 if (ax_object->IsAXLayoutObject() && !ax_object->AccessibilityIsIgnored()) 1896 if (ax_object->IsAXLayoutObject() && !ax_object->AccessibilityIsIgnored())
1895 return ToAXLayoutObject(ax_object); 1897 return ToAXLayoutObject(ax_object);
1896 1898
1897 return nullptr; 1899 return nullptr;
1898 } 1900 }
1899 1901
1900 // 1902 //
1901 // Modify or take an action on an object. 1903 // Modify or take an action on an object.
1902 // 1904 //
1903 1905
1904 // Convert from an accessible object and offset to a VisiblePosition. 1906 // Convert from an accessible object and offset to a VisiblePosition.
1905 static VisiblePosition ToVisiblePosition(AXObject* obj, int offset) { 1907 static VisiblePosition ToVisiblePosition(AXObjectImpl* obj, int offset) {
1906 if (!obj->GetNode()) 1908 if (!obj->GetNode())
1907 return VisiblePosition(); 1909 return VisiblePosition();
1908 1910
1909 Node* node = obj->GetNode(); 1911 Node* node = obj->GetNode();
1910 if (!node->IsTextNode()) { 1912 if (!node->IsTextNode()) {
1911 int child_count = obj->Children().size(); 1913 int child_count = obj->Children().size();
1912 1914
1913 // Place position immediately before the container node, if there was no 1915 // Place position immediately before the container node, if there was no
1914 // children. 1916 // children.
1915 if (child_count == 0) { 1917 if (child_count == 0) {
1916 if (!obj->ParentObject()) 1918 if (!obj->ParentObject())
1917 return VisiblePosition(); 1919 return VisiblePosition();
1918 return ToVisiblePosition(obj->ParentObject(), obj->IndexInParent()); 1920 return ToVisiblePosition(obj->ParentObject(), obj->IndexInParent());
1919 } 1921 }
1920 1922
1921 // The offsets are child offsets over the AX tree. Note that we allow 1923 // The offsets are child offsets over the AX tree. Note that we allow
1922 // for the offset to equal the number of children as |Range| does. 1924 // for the offset to equal the number of children as |Range| does.
1923 if (offset < 0 || offset > child_count) 1925 if (offset < 0 || offset > child_count)
1924 return VisiblePosition(); 1926 return VisiblePosition();
1925 1927
1926 // Clamp to between 0 and child count - 1. 1928 // Clamp to between 0 and child count - 1.
1927 int clamped_offset = 1929 int clamped_offset =
1928 static_cast<unsigned>(offset) > (obj->Children().size() - 1) 1930 static_cast<unsigned>(offset) > (obj->Children().size() - 1)
1929 ? offset - 1 1931 ? offset - 1
1930 : offset; 1932 : offset;
1931 AXObject* child_obj = obj->Children()[clamped_offset]; 1933 AXObjectImpl* child_obj = obj->Children()[clamped_offset];
1932 Node* child_node = child_obj->GetNode(); 1934 Node* child_node = child_obj->GetNode();
1933 if (!child_node || !child_node->parentNode()) 1935 if (!child_node || !child_node->parentNode())
1934 return VisiblePosition(); 1936 return VisiblePosition();
1935 1937
1936 // The index in parent. 1938 // The index in parent.
1937 int adjusted_offset = child_node->NodeIndex(); 1939 int adjusted_offset = child_node->NodeIndex();
1938 1940
1939 // If we had to clamp the offset above, the client wants to select the 1941 // If we had to clamp the offset above, the client wants to select the
1940 // end of the node. 1942 // end of the node.
1941 if (clamped_offset != offset) 1943 if (clamped_offset != offset)
(...skipping 12 matching lines...) Expand all
1954 1956
1955 VisiblePosition node_position = blink::VisiblePositionBeforeNode(*node); 1957 VisiblePosition node_position = blink::VisiblePositionBeforeNode(*node);
1956 int node_index = blink::IndexForVisiblePosition(node_position, parent); 1958 int node_index = blink::IndexForVisiblePosition(node_position, parent);
1957 return blink::VisiblePositionForIndex(node_index + offset, parent); 1959 return blink::VisiblePositionForIndex(node_index + offset, parent);
1958 } 1960 }
1959 1961
1960 void AXLayoutObject::SetSelection(const AXRange& selection) { 1962 void AXLayoutObject::SetSelection(const AXRange& selection) {
1961 if (!GetLayoutObject() || !selection.IsValid()) 1963 if (!GetLayoutObject() || !selection.IsValid())
1962 return; 1964 return;
1963 1965
1964 AXObject* anchor_object = 1966 AXObjectImpl* anchor_object =
1965 selection.anchor_object ? selection.anchor_object.Get() : this; 1967 selection.anchor_object ? selection.anchor_object.Get() : this;
1966 AXObject* focus_object = 1968 AXObjectImpl* focus_object =
1967 selection.focus_object ? selection.focus_object.Get() : this; 1969 selection.focus_object ? selection.focus_object.Get() : this;
1968 1970
1969 if (!IsValidSelectionBound(anchor_object) || 1971 if (!IsValidSelectionBound(anchor_object) ||
1970 !IsValidSelectionBound(focus_object)) { 1972 !IsValidSelectionBound(focus_object)) {
1971 return; 1973 return;
1972 } 1974 }
1973 1975
1974 // The selection offsets are offsets into the accessible value. 1976 // The selection offsets are offsets into the accessible value.
1975 if (anchor_object == focus_object && 1977 if (anchor_object == focus_object &&
1976 anchor_object->GetLayoutObject()->IsTextControl()) { 1978 anchor_object->GetLayoutObject()->IsTextControl()) {
(...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after
2008 if (anchor_visible_position.IsNull() || focus_visible_position.IsNull()) 2010 if (anchor_visible_position.IsNull() || focus_visible_position.IsNull())
2009 return; 2011 return;
2010 2012
2011 frame->Selection().SetSelection( 2013 frame->Selection().SetSelection(
2012 SelectionInDOMTree::Builder() 2014 SelectionInDOMTree::Builder()
2013 .Collapse(anchor_visible_position.ToPositionWithAffinity()) 2015 .Collapse(anchor_visible_position.ToPositionWithAffinity())
2014 .Extend(focus_visible_position.DeepEquivalent()) 2016 .Extend(focus_visible_position.DeepEquivalent())
2015 .Build()); 2017 .Build());
2016 } 2018 }
2017 2019
2018 bool AXLayoutObject::IsValidSelectionBound(const AXObject* bound_object) const { 2020 bool AXLayoutObject::IsValidSelectionBound(
2021 const AXObjectImpl* bound_object) const {
2019 return GetLayoutObject() && bound_object && !bound_object->IsDetached() && 2022 return GetLayoutObject() && bound_object && !bound_object->IsDetached() &&
2020 bound_object->IsAXLayoutObject() && bound_object->GetLayoutObject() && 2023 bound_object->IsAXLayoutObject() && bound_object->GetLayoutObject() &&
2021 bound_object->GetLayoutObject()->GetFrame() == 2024 bound_object->GetLayoutObject()->GetFrame() ==
2022 GetLayoutObject()->GetFrame() && 2025 GetLayoutObject()->GetFrame() &&
2023 &bound_object->AxObjectCache() == &AxObjectCache(); 2026 &bound_object->AxObjectCache() == &AxObjectCache();
2024 } 2027 }
2025 2028
2026 void AXLayoutObject::SetValue(const String& string) { 2029 void AXLayoutObject::SetValue(const String& string) {
2027 if (!GetNode() || !GetNode()->IsElementNode()) 2030 if (!GetNode() || !GetNode()->IsElementNode())
2028 return; 2031 return;
(...skipping 10 matching lines...) Expand all
2039 } 2042 }
2040 2043
2041 // 2044 //
2042 // Notifications that this object may have changed. 2045 // Notifications that this object may have changed.
2043 // 2046 //
2044 2047
2045 void AXLayoutObject::HandleActiveDescendantChanged() { 2048 void AXLayoutObject::HandleActiveDescendantChanged() {
2046 if (!GetLayoutObject()) 2049 if (!GetLayoutObject())
2047 return; 2050 return;
2048 2051
2049 AXObject* focused_object = AxObjectCache().FocusedObject(); 2052 AXObjectImpl* focused_object = AxObjectCache().FocusedObject();
2050 if (focused_object == this && SupportsActiveDescendant()) { 2053 if (focused_object == this && SupportsActiveDescendant()) {
2051 AxObjectCache().PostNotification( 2054 AxObjectCache().PostNotification(
2052 GetLayoutObject(), AXObjectCacheImpl::kAXActiveDescendantChanged); 2055 GetLayoutObject(), AXObjectCacheImpl::kAXActiveDescendantChanged);
2053 } 2056 }
2054 } 2057 }
2055 2058
2056 void AXLayoutObject::HandleAriaExpandedChanged() { 2059 void AXLayoutObject::HandleAriaExpandedChanged() {
2057 // Find if a parent of this object should handle aria-expanded changes. 2060 // Find if a parent of this object should handle aria-expanded changes.
2058 AXObject* container_parent = this->ParentObject(); 2061 AXObjectImpl* container_parent = this->ParentObject();
2059 while (container_parent) { 2062 while (container_parent) {
2060 bool found_parent = false; 2063 bool found_parent = false;
2061 2064
2062 switch (container_parent->RoleValue()) { 2065 switch (container_parent->RoleValue()) {
2063 case kTreeRole: 2066 case kTreeRole:
2064 case kTreeGridRole: 2067 case kTreeGridRole:
2065 case kGridRole: 2068 case kGridRole:
2066 case kTableRole: 2069 case kTableRole:
2067 found_parent = true; 2070 found_parent = true;
2068 break; 2071 break;
(...skipping 99 matching lines...) Expand 10 before | Expand all | Expand 10 after
2168 // If a LayoutText needs layout, its inline text boxes are either 2171 // If a LayoutText needs layout, its inline text boxes are either
2169 // nonexistent or invalid, so defer until the layout happens and 2172 // nonexistent or invalid, so defer until the layout happens and
2170 // the layoutObject calls AXObjectCacheImpl::inlineTextBoxesUpdated. 2173 // the layoutObject calls AXObjectCacheImpl::inlineTextBoxesUpdated.
2171 return; 2174 return;
2172 } 2175 }
2173 2176
2174 LayoutText* layout_text = ToLayoutText(GetLayoutObject()); 2177 LayoutText* layout_text = ToLayoutText(GetLayoutObject());
2175 for (RefPtr<AbstractInlineTextBox> box = 2178 for (RefPtr<AbstractInlineTextBox> box =
2176 layout_text->FirstAbstractInlineTextBox(); 2179 layout_text->FirstAbstractInlineTextBox();
2177 box.Get(); box = box->NextInlineTextBox()) { 2180 box.Get(); box = box->NextInlineTextBox()) {
2178 AXObject* ax_object = AxObjectCache().GetOrCreate(box.Get()); 2181 AXObjectImpl* ax_object = AxObjectCache().GetOrCreate(box.Get());
2179 if (!ax_object->AccessibilityIsIgnored()) 2182 if (!ax_object->AccessibilityIsIgnored())
2180 children_.push_back(ax_object); 2183 children_.push_back(ax_object);
2181 } 2184 }
2182 } 2185 }
2183 2186
2184 void AXLayoutObject::LineBreaks(Vector<int>& line_breaks) const { 2187 void AXLayoutObject::LineBreaks(Vector<int>& line_breaks) const {
2185 if (!IsTextControl()) 2188 if (!IsTextControl())
2186 return; 2189 return;
2187 2190
2188 VisiblePosition visible_pos = VisiblePositionForIndex(0); 2191 VisiblePosition visible_pos = VisiblePositionForIndex(0);
(...skipping 12 matching lines...) Expand all
2201 if (visible_pos.DeepEquivalent().CompareTo( 2204 if (visible_pos.DeepEquivalent().CompareTo(
2202 prev_visible_pos.DeepEquivalent()) < 0) 2205 prev_visible_pos.DeepEquivalent()) < 0)
2203 break; 2206 break;
2204 } 2207 }
2205 } 2208 }
2206 2209
2207 // 2210 //
2208 // Private. 2211 // Private.
2209 // 2212 //
2210 2213
2211 AXObject* AXLayoutObject::TreeAncestorDisallowingChild() const { 2214 AXObjectImpl* AXLayoutObject::TreeAncestorDisallowingChild() const {
2212 // Determine if this is in a tree. If so, we apply special behavior to make it 2215 // Determine if this is in a tree. If so, we apply special behavior to make it
2213 // work like an AXOutline. 2216 // work like an AXOutline.
2214 AXObject* ax_obj = ParentObject(); 2217 AXObjectImpl* ax_obj = ParentObject();
2215 AXObject* tree_ancestor = 0; 2218 AXObjectImpl* tree_ancestor = 0;
2216 while (ax_obj) { 2219 while (ax_obj) {
2217 if (ax_obj->IsTree()) { 2220 if (ax_obj->IsTree()) {
2218 tree_ancestor = ax_obj; 2221 tree_ancestor = ax_obj;
2219 break; 2222 break;
2220 } 2223 }
2221 ax_obj = ax_obj->ParentObject(); 2224 ax_obj = ax_obj->ParentObject();
2222 } 2225 }
2223 2226
2224 // If the object is in a tree, only tree items should be exposed (and the 2227 // If the object is in a tree, only tree items should be exposed (and the
2225 // children of tree items). 2228 // children of tree items).
2226 if (tree_ancestor) { 2229 if (tree_ancestor) {
2227 AccessibilityRole role = RoleValue(); 2230 AccessibilityRole role = RoleValue();
2228 if (role != kTreeItemRole && role != kStaticTextRole) 2231 if (role != kTreeItemRole && role != kStaticTextRole)
2229 return tree_ancestor; 2232 return tree_ancestor;
2230 } 2233 }
2231 return 0; 2234 return 0;
2232 } 2235 }
2233 2236
2234 bool AXLayoutObject::IsTabItemSelected() const { 2237 bool AXLayoutObject::IsTabItemSelected() const {
2235 if (!IsTabItem() || !GetLayoutObject()) 2238 if (!IsTabItem() || !GetLayoutObject())
2236 return false; 2239 return false;
2237 2240
2238 Node* node = GetNode(); 2241 Node* node = GetNode();
2239 if (!node || !node->IsElementNode()) 2242 if (!node || !node->IsElementNode())
2240 return false; 2243 return false;
2241 2244
2242 // The ARIA spec says a tab item can also be selected if it is aria-labeled by 2245 // The ARIA spec says a tab item can also be selected if it is aria-labeled by
2243 // a tabpanel that has keyboard focus inside of it, or if a tabpanel in its 2246 // a tabpanel that has keyboard focus inside of it, or if a tabpanel in its
2244 // aria-controls list has KB focus inside of it. 2247 // aria-controls list has KB focus inside of it.
2245 AXObject* focused_element = AxObjectCache().FocusedObject(); 2248 AXObjectImpl* focused_element = AxObjectCache().FocusedObject();
2246 if (!focused_element) 2249 if (!focused_element)
2247 return false; 2250 return false;
2248 2251
2249 HeapVector<Member<Element>> elements; 2252 HeapVector<Member<Element>> elements;
2250 ElementsFromAttribute(elements, aria_controlsAttr); 2253 ElementsFromAttribute(elements, aria_controlsAttr);
2251 2254
2252 for (const auto& element : elements) { 2255 for (const auto& element : elements) {
2253 AXObject* tab_panel = AxObjectCache().GetOrCreate(element); 2256 AXObjectImpl* tab_panel = AxObjectCache().GetOrCreate(element);
2254 2257
2255 // A tab item should only control tab panels. 2258 // A tab item should only control tab panels.
2256 if (!tab_panel || tab_panel->RoleValue() != kTabPanelRole) 2259 if (!tab_panel || tab_panel->RoleValue() != kTabPanelRole)
2257 continue; 2260 continue;
2258 2261
2259 AXObject* check_focus_element = focused_element; 2262 AXObjectImpl* check_focus_element = focused_element;
2260 // Check if the focused element is a descendant of the element controlled by 2263 // Check if the focused element is a descendant of the element controlled by
2261 // the tab item. 2264 // the tab item.
2262 while (check_focus_element) { 2265 while (check_focus_element) {
2263 if (tab_panel == check_focus_element) 2266 if (tab_panel == check_focus_element)
2264 return true; 2267 return true;
2265 check_focus_element = check_focus_element->ParentObject(); 2268 check_focus_element = check_focus_element->ParentObject();
2266 } 2269 }
2267 } 2270 }
2268 2271
2269 return false; 2272 return false;
2270 } 2273 }
2271 2274
2272 AXObject* AXLayoutObject::AccessibilityImageMapHitTest( 2275 AXObjectImpl* AXLayoutObject::AccessibilityImageMapHitTest(
2273 HTMLAreaElement* area, 2276 HTMLAreaElement* area,
2274 const IntPoint& point) const { 2277 const IntPoint& point) const {
2275 if (!area) 2278 if (!area)
2276 return 0; 2279 return 0;
2277 2280
2278 AXObject* parent = AxObjectCache().GetOrCreate(area->ImageElement()); 2281 AXObjectImpl* parent = AxObjectCache().GetOrCreate(area->ImageElement());
2279 if (!parent) 2282 if (!parent)
2280 return 0; 2283 return 0;
2281 2284
2282 for (const auto& child : parent->Children()) { 2285 for (const auto& child : parent->Children()) {
2283 if (child->GetBoundsInFrameCoordinates().Contains(point)) 2286 if (child->GetBoundsInFrameCoordinates().Contains(point))
2284 return child.Get(); 2287 return child.Get();
2285 } 2288 }
2286 2289
2287 return 0; 2290 return 0;
2288 } 2291 }
(...skipping 57 matching lines...) Expand 10 before | Expand all | Expand 10 after
2346 root->SetParent(0); 2349 root->SetParent(0);
2347 } 2350 }
2348 2351
2349 AXSVGRoot* AXLayoutObject::RemoteSVGRootElement() const { 2352 AXSVGRoot* AXLayoutObject::RemoteSVGRootElement() const {
2350 // FIXME(dmazzoni): none of this code properly handled multiple references to 2353 // FIXME(dmazzoni): none of this code properly handled multiple references to
2351 // the same remote SVG document. I'm disabling this support until it can be 2354 // the same remote SVG document. I'm disabling this support until it can be
2352 // fixed properly. 2355 // fixed properly.
2353 return 0; 2356 return 0;
2354 } 2357 }
2355 2358
2356 AXObject* AXLayoutObject::RemoteSVGElementHitTest(const IntPoint& point) const { 2359 AXObjectImpl* AXLayoutObject::RemoteSVGElementHitTest(
2357 AXObject* remote = RemoteSVGRootElement(); 2360 const IntPoint& point) const {
2361 AXObjectImpl* remote = RemoteSVGRootElement();
2358 if (!remote) 2362 if (!remote)
2359 return 0; 2363 return 0;
2360 2364
2361 IntSize offset = 2365 IntSize offset =
2362 point - RoundedIntPoint(GetBoundsInFrameCoordinates().Location()); 2366 point - RoundedIntPoint(GetBoundsInFrameCoordinates().Location());
2363 return remote->AccessibilityHitTest(IntPoint(offset)); 2367 return remote->AccessibilityHitTest(IntPoint(offset));
2364 } 2368 }
2365 2369
2366 // The boundingBox for elements within the remote SVG element needs to be offset 2370 // The boundingBox for elements within the remote SVG element needs to be offset
2367 // by its position within the parent page, otherwise they are in relative 2371 // by its position within the parent page, otherwise they are in relative
2368 // coordinates only. 2372 // coordinates only.
2369 void AXLayoutObject::OffsetBoundingBoxForRemoteSVGElement( 2373 void AXLayoutObject::OffsetBoundingBoxForRemoteSVGElement(
2370 LayoutRect& rect) const { 2374 LayoutRect& rect) const {
2371 for (AXObject* parent = ParentObject(); parent; 2375 for (AXObjectImpl* parent = ParentObject(); parent;
2372 parent = parent->ParentObject()) { 2376 parent = parent->ParentObject()) {
2373 if (parent->IsAXSVGRoot()) { 2377 if (parent->IsAXSVGRoot()) {
2374 rect.MoveBy( 2378 rect.MoveBy(
2375 parent->ParentObject()->GetBoundsInFrameCoordinates().Location()); 2379 parent->ParentObject()->GetBoundsInFrameCoordinates().Location());
2376 break; 2380 break;
2377 } 2381 }
2378 } 2382 }
2379 } 2383 }
2380 2384
2381 // Hidden children are those that are not laid out or visible, but are 2385 // Hidden children are those that are not laid out or visible, but are
(...skipping 18 matching lines...) Expand all
2400 if (!should_insert_hidden_nodes) 2404 if (!should_insert_hidden_nodes)
2401 return; 2405 return;
2402 2406
2403 // Iterate through all of the children, including those that may have already 2407 // Iterate through all of the children, including those that may have already
2404 // been added, and try to insert hidden nodes in the correct place in the DOM 2408 // been added, and try to insert hidden nodes in the correct place in the DOM
2405 // order. 2409 // order.
2406 unsigned insertion_index = 0; 2410 unsigned insertion_index = 0;
2407 for (Node& child : NodeTraversal::ChildrenOf(*node)) { 2411 for (Node& child : NodeTraversal::ChildrenOf(*node)) {
2408 if (child.GetLayoutObject()) { 2412 if (child.GetLayoutObject()) {
2409 // Find out where the last layout sibling is located within m_children. 2413 // Find out where the last layout sibling is located within m_children.
2410 if (AXObject* child_object = 2414 if (AXObjectImpl* child_object =
2411 AxObjectCache().Get(child.GetLayoutObject())) { 2415 AxObjectCache().Get(child.GetLayoutObject())) {
2412 if (child_object->AccessibilityIsIgnored()) { 2416 if (child_object->AccessibilityIsIgnored()) {
2413 const auto& children = child_object->Children(); 2417 const auto& children = child_object->Children();
2414 child_object = children.size() ? children.back().Get() : 0; 2418 child_object = children.size() ? children.back().Get() : 0;
2415 } 2419 }
2416 if (child_object) 2420 if (child_object)
2417 insertion_index = children_.Find(child_object) + 1; 2421 insertion_index = children_.Find(child_object) + 1;
2418 continue; 2422 continue;
2419 } 2423 }
2420 } 2424 }
(...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after
2455 if (!css_box || !css_box->IsLayoutImage()) 2459 if (!css_box || !css_box->IsLayoutImage())
2456 return; 2460 return;
2457 2461
2458 HTMLMapElement* map = ToLayoutImage(css_box)->ImageMap(); 2462 HTMLMapElement* map = ToLayoutImage(css_box)->ImageMap();
2459 if (!map) 2463 if (!map)
2460 return; 2464 return;
2461 2465
2462 for (HTMLAreaElement& area : 2466 for (HTMLAreaElement& area :
2463 Traversal<HTMLAreaElement>::DescendantsOf(*map)) { 2467 Traversal<HTMLAreaElement>::DescendantsOf(*map)) {
2464 // add an <area> element for this child if it has a link 2468 // add an <area> element for this child if it has a link
2465 AXObject* obj = AxObjectCache().GetOrCreate(&area); 2469 AXObjectImpl* obj = AxObjectCache().GetOrCreate(&area);
2466 if (obj) { 2470 if (obj) {
2467 AXImageMapLink* area_object = ToAXImageMapLink(obj); 2471 AXImageMapLink* area_object = ToAXImageMapLink(obj);
2468 area_object->SetParent(this); 2472 area_object->SetParent(this);
2469 DCHECK(area_object->AxObjectID() != 0); 2473 DCHECK(area_object->AxObjectID() != 0);
2470 if (!area_object->AccessibilityIsIgnored()) 2474 if (!area_object->AccessibilityIsIgnored())
2471 children_.push_back(area_object); 2475 children_.push_back(area_object);
2472 else 2476 else
2473 AxObjectCache().Remove(area_object->AxObjectID()); 2477 AxObjectCache().Remove(area_object->AxObjectID());
2474 } 2478 }
2475 } 2479 }
2476 } 2480 }
2477 2481
2478 void AXLayoutObject::AddCanvasChildren() { 2482 void AXLayoutObject::AddCanvasChildren() {
2479 if (!isHTMLCanvasElement(GetNode())) 2483 if (!isHTMLCanvasElement(GetNode()))
2480 return; 2484 return;
2481 2485
2482 // If it's a canvas, it won't have laid out children, but it might have 2486 // If it's a canvas, it won't have laid out children, but it might have
2483 // accessible fallback content. Clear m_haveChildren because 2487 // accessible fallback content. Clear m_haveChildren because
2484 // AXNodeObject::addChildren will expect it to be false. 2488 // AXNodeObject::addChildren will expect it to be false.
2485 DCHECK(!children_.size()); 2489 DCHECK(!children_.size());
2486 have_children_ = false; 2490 have_children_ = false;
2487 AXNodeObject::AddChildren(); 2491 AXNodeObject::AddChildren();
2488 } 2492 }
2489 2493
2490 void AXLayoutObject::AddPopupChildren() { 2494 void AXLayoutObject::AddPopupChildren() {
2491 if (!isHTMLInputElement(GetNode())) 2495 if (!isHTMLInputElement(GetNode()))
2492 return; 2496 return;
2493 if (AXObject* ax_popup = toHTMLInputElement(GetNode())->PopupRootAXObject()) 2497 if (AXObjectImpl* ax_popup =
2498 toHTMLInputElement(GetNode())->PopupRootAXObject())
2494 children_.push_back(ax_popup); 2499 children_.push_back(ax_popup);
2495 } 2500 }
2496 2501
2497 void AXLayoutObject::AddRemoteSVGChildren() { 2502 void AXLayoutObject::AddRemoteSVGChildren() {
2498 AXSVGRoot* root = RemoteSVGRootElement(); 2503 AXSVGRoot* root = RemoteSVGRootElement();
2499 if (!root) 2504 if (!root)
2500 return; 2505 return;
2501 2506
2502 root->SetParent(this); 2507 root->SetParent(this);
2503 2508
2504 if (root->AccessibilityIsIgnored()) { 2509 if (root->AccessibilityIsIgnored()) {
2505 for (const auto& child : root->Children()) 2510 for (const auto& child : root->Children())
2506 children_.push_back(child); 2511 children_.push_back(child);
2507 } else { 2512 } else {
2508 children_.push_back(root); 2513 children_.push_back(root);
2509 } 2514 }
2510 } 2515 }
2511 2516
2512 bool AXLayoutObject::ElementAttributeValue( 2517 bool AXLayoutObject::ElementAttributeValue(
2513 const QualifiedName& attribute_name) const { 2518 const QualifiedName& attribute_name) const {
2514 if (!layout_object_) 2519 if (!layout_object_)
2515 return false; 2520 return false;
2516 2521
2517 return EqualIgnoringASCIICase(GetAttribute(attribute_name), "true"); 2522 return EqualIgnoringASCIICase(GetAttribute(attribute_name), "true");
2518 } 2523 }
2519 2524
2520 } // namespace blink 2525 } // namespace blink
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698