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

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

Issue 2524993003: DevTools Accessibility pane: fix crash when inspecting shadow roots (Closed)
Patch Set: Rationalise getting shadowRoot Created 4 years 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
« no previous file with comments | « no previous file | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright 2014 The Chromium Authors. All rights reserved. 1 // Copyright 2014 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "modules/accessibility/InspectorAccessibilityAgent.h" 5 #include "modules/accessibility/InspectorAccessibilityAgent.h"
6 6
7 #include "core/HTMLNames.h" 7 #include "core/HTMLNames.h"
8 #include "core/dom/AXObjectCache.h" 8 #include "core/dom/AXObjectCache.h"
9 #include "core/dom/DOMNodeIds.h" 9 #include "core/dom/DOMNodeIds.h"
10 #include "core/dom/Element.h" 10 #include "core/dom/Element.h"
11 #include "core/dom/Node.h" 11 #include "core/dom/Node.h"
12 #include "core/dom/NodeList.h" 12 #include "core/dom/NodeList.h"
13 #include "core/dom/shadow/ElementShadow.h"
13 #include "core/inspector/IdentifiersFactory.h" 14 #include "core/inspector/IdentifiersFactory.h"
14 #include "core/inspector/InspectorDOMAgent.h" 15 #include "core/inspector/InspectorDOMAgent.h"
15 #include "core/inspector/InspectorStyleSheet.h" 16 #include "core/inspector/InspectorStyleSheet.h"
16 #include "core/page/Page.h" 17 #include "core/page/Page.h"
17 #include "modules/accessibility/AXObject.h" 18 #include "modules/accessibility/AXObject.h"
18 #include "modules/accessibility/AXObjectCacheImpl.h" 19 #include "modules/accessibility/AXObjectCacheImpl.h"
19 #include "modules/accessibility/InspectorTypeBuilderHelper.h" 20 #include "modules/accessibility/InspectorTypeBuilderHelper.h"
20 #include <memory> 21 #include <memory>
21 22
22 namespace blink { 23 namespace blink {
(...skipping 480 matching lines...) Expand 10 before | Expand all | Expand 10 after
503 std::unique_ptr<protocol::Array<AXNode>>& nodes, 504 std::unique_ptr<protocol::Array<AXNode>>& nodes,
504 AXObjectCacheImpl& cache) const { 505 AXObjectCacheImpl& cache) const {
505 // Populate children. 506 // Populate children.
506 std::unique_ptr<protocol::Array<AXNodeId>> childIds = 507 std::unique_ptr<protocol::Array<AXNodeId>> childIds =
507 protocol::Array<AXNodeId>::create(); 508 protocol::Array<AXNodeId>::create();
508 findDOMNodeChildren(childIds, inspectedDOMNode, inspectedDOMNode, nodes, 509 findDOMNodeChildren(childIds, inspectedDOMNode, inspectedDOMNode, nodes,
509 cache); 510 cache);
510 nodeObject.setChildIds(std::move(childIds)); 511 nodeObject.setChildIds(std::move(childIds));
511 512
512 // Walk up parents until an AXObject can be found. 513 // Walk up parents until an AXObject can be found.
513 Node* parentNode = FlatTreeTraversal::parent(inspectedDOMNode); 514 Node* parentNode = inspectedDOMNode.isShadowRoot()
aboxhall 2016/12/02 00:30:14 The crash was here: FlatTreeTraversal explicitly d
515 ? &toShadowRoot(inspectedDOMNode).host()
516 : FlatTreeTraversal::parent(inspectedDOMNode);
514 AXObject* parentAXObject = cache.getOrCreate(parentNode); 517 AXObject* parentAXObject = cache.getOrCreate(parentNode);
515 while (parentNode && !parentAXObject) { 518 while (parentNode && !parentAXObject) {
516 parentNode = FlatTreeTraversal::parent(inspectedDOMNode); 519 parentNode = parentNode->isShadowRoot()
517 parentAXObject = cache.getOrCreate(parentNode); 520 ? &toShadowRoot(parentNode)->host()
dgozman 2016/12/02 18:04:16 Where did this line go?
aboxhall 2016/12/02 22:25:11 Yikes. Replaced.
521 : FlatTreeTraversal::parent(*parentNode);
518 }; 522 };
519 523
520 if (!parentAXObject) 524 if (!parentAXObject)
521 return; 525 return;
522 526
523 if (parentAXObject->accessibilityIsIgnored()) 527 if (parentAXObject->accessibilityIsIgnored())
524 parentAXObject = parentAXObject->parentObjectUnignored(); 528 parentAXObject = parentAXObject->parentObjectUnignored();
525 if (!parentAXObject) 529 if (!parentAXObject)
526 return; 530 return;
527 531
(...skipping 10 matching lines...) Expand all
538 if (grandparentAXObject) 542 if (grandparentAXObject)
539 addAncestors(*grandparentAXObject, nullptr, nodes, cache); 543 addAncestors(*grandparentAXObject, nullptr, nodes, cache);
540 } 544 }
541 545
542 void InspectorAccessibilityAgent::findDOMNodeChildren( 546 void InspectorAccessibilityAgent::findDOMNodeChildren(
543 std::unique_ptr<protocol::Array<AXNodeId>>& childIds, 547 std::unique_ptr<protocol::Array<AXNodeId>>& childIds,
544 Node& parentNode, 548 Node& parentNode,
545 Node& inspectedDOMNode, 549 Node& inspectedDOMNode,
546 std::unique_ptr<protocol::Array<AXNode>>& nodes, 550 std::unique_ptr<protocol::Array<AXNode>>& nodes,
547 AXObjectCacheImpl& cache) const { 551 AXObjectCacheImpl& cache) const {
552 if (inspectedDOMNode.isShadowRoot() &&
553 &parentNode == toShadowRoot(inspectedDOMNode).host()) {
554 childIds->addItem(String::number(kIDForInspectedNodeWithNoAXNode));
555 return;
556 }
548 NodeList* childNodes = parentNode.childNodes(); 557 NodeList* childNodes = parentNode.childNodes();
558 if (!childNodes->length() && parentNode.isElementNode()) {
559 Element& parentElement = toElement(parentNode);
560 ElementShadow* elementShadow = parentElement.shadow();
561 if (elementShadow) {
562 ShadowRoot& shadowRoot = elementShadow->youngestShadowRoot();
563 childNodes = shadowRoot.childNodes();
564 }
565 }
549 for (size_t i = 0; i < childNodes->length(); ++i) { 566 for (size_t i = 0; i < childNodes->length(); ++i) {
550 Node* childNode = childNodes->item(i); 567 Node* childNode = childNodes->item(i);
551 if (childNode == &inspectedDOMNode) { 568 if (childNode == &inspectedDOMNode) {
552 childIds->addItem(String::number(kIDForInspectedNodeWithNoAXNode)); 569 childIds->addItem(String::number(kIDForInspectedNodeWithNoAXNode));
553 continue; 570 continue;
554 } 571 }
555 572
556 AXObject* childAXObject = cache.getOrCreate(childNode); 573 AXObject* childAXObject = cache.getOrCreate(childNode);
557 if (childAXObject) { 574 if (childAXObject) {
558 if (childAXObject->accessibilityIsIgnored()) { 575 if (childAXObject->accessibilityIsIgnored()) {
(...skipping 207 matching lines...) Expand 10 before | Expand all | Expand 10 after
766 } 783 }
767 } 784 }
768 785
769 DEFINE_TRACE(InspectorAccessibilityAgent) { 786 DEFINE_TRACE(InspectorAccessibilityAgent) {
770 visitor->trace(m_page); 787 visitor->trace(m_page);
771 visitor->trace(m_domAgent); 788 visitor->trace(m_domAgent);
772 InspectorBaseAgent::trace(visitor); 789 InspectorBaseAgent::trace(visitor);
773 } 790 }
774 791
775 } // namespace blink 792 } // namespace blink
OLDNEW
« no previous file with comments | « no previous file | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698