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

Side by Side Diff: third_party/WebKit/Source/core/inspector/InspectorDOMAgent.cpp

Issue 2346853002: Add a DOM.getLayoutTreeNodes devtools command (Closed)
Patch Set: Pretty print Created 4 years, 3 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) 2009 Apple Inc. All rights reserved. 2 * Copyright (C) 2009 Apple Inc. All rights reserved.
3 * Copyright (C) 2011 Google Inc. All rights reserved. 3 * Copyright (C) 2011 Google Inc. All rights reserved.
4 * Copyright (C) 2009 Joseph Pecoraro 4 * Copyright (C) 2009 Joseph Pecoraro
5 * 5 *
6 * Redistribution and use in source and binary forms, with or without 6 * Redistribution and use in source and binary forms, with or without
7 * modification, are permitted provided that the following conditions 7 * modification, are permitted provided that the following conditions
8 * are met: 8 * are met:
9 * 9 *
10 * 1. Redistributions of source code must retain the above copyright 10 * 1. Redistributions of source code must retain the above copyright
(...skipping 48 matching lines...) Expand 10 before | Expand all | Expand 10 after
59 #include "core/html/imports/HTMLImportChild.h" 59 #include "core/html/imports/HTMLImportChild.h"
60 #include "core/html/imports/HTMLImportLoader.h" 60 #include "core/html/imports/HTMLImportLoader.h"
61 #include "core/inspector/DOMEditor.h" 61 #include "core/inspector/DOMEditor.h"
62 #include "core/inspector/DOMPatchSupport.h" 62 #include "core/inspector/DOMPatchSupport.h"
63 #include "core/inspector/IdentifiersFactory.h" 63 #include "core/inspector/IdentifiersFactory.h"
64 #include "core/inspector/InspectedFrames.h" 64 #include "core/inspector/InspectedFrames.h"
65 #include "core/inspector/InspectorHighlight.h" 65 #include "core/inspector/InspectorHighlight.h"
66 #include "core/inspector/InspectorHistory.h" 66 #include "core/inspector/InspectorHistory.h"
67 #include "core/inspector/V8InspectorString.h" 67 #include "core/inspector/V8InspectorString.h"
68 #include "core/layout/HitTestResult.h" 68 #include "core/layout/HitTestResult.h"
69 #include "core/layout/LayoutInline.h"
69 #include "core/layout/api/LayoutViewItem.h" 70 #include "core/layout/api/LayoutViewItem.h"
71 #include "core/layout/line/InlineTextBox.h"
70 #include "core/loader/DocumentLoader.h" 72 #include "core/loader/DocumentLoader.h"
71 #include "core/page/FrameTree.h" 73 #include "core/page/FrameTree.h"
72 #include "core/page/Page.h" 74 #include "core/page/Page.h"
73 #include "core/xml/DocumentXPathEvaluator.h" 75 #include "core/xml/DocumentXPathEvaluator.h"
74 #include "core/xml/XPathResult.h" 76 #include "core/xml/XPathResult.h"
75 #include "platform/PlatformGestureEvent.h" 77 #include "platform/PlatformGestureEvent.h"
76 #include "platform/PlatformMouseEvent.h" 78 #include "platform/PlatformMouseEvent.h"
77 #include "platform/PlatformTouchEvent.h" 79 #include "platform/PlatformTouchEvent.h"
78 #include "wtf/ListHashSet.h" 80 #include "wtf/ListHashSet.h"
79 #include "wtf/PtrUtil.h" 81 #include "wtf/PtrUtil.h"
(...skipping 441 matching lines...) Expand 10 before | Expand all | Expand 10 after
521 if (!m_document) { 523 if (!m_document) {
522 *errorString = "Document is not available"; 524 *errorString = "Document is not available";
523 return; 525 return;
524 } 526 }
525 527
526 discardFrontendBindings(); 528 discardFrontendBindings();
527 529
528 *root = buildObjectForNode(m_document.get(), 2, m_documentNodeToIdMap.get()) ; 530 *root = buildObjectForNode(m_document.get(), 2, m_documentNodeToIdMap.get()) ;
529 } 531 }
530 532
533 namespace {
534 std::unique_ptr<protocol::DOM::Rect> getRectForFloatRect(const FloatRect& rect)
pfeldman 2016/09/16 00:59:35 We call these build*. Also, either move those to t
alex clarke (OOO till 29th) 2016/09/16 10:23:36 Done.
535 {
536 return protocol::DOM::Rect::create()
537 .setX(rect.x())
538 .setY(rect.y())
539 .setWidth(rect.width())
540 .setHeight(rect.height())
541 .build();
542 }
543
544 FloatRect getAbsoluteBoundingBox(LayoutObject* layoutObject)
pfeldman 2016/09/16 00:59:35 Blink does not (yet) use get prefixes.
alex clarke (OOO till 29th) 2016/09/16 10:23:36 Done.
545 {
546 if (layoutObject->isText()) {
547 FloatRect localRect(toLayoutText(layoutObject)->linesBoundingBox());
548 return layoutObject->localToAbsoluteQuad(localRect).boundingBox();
pfeldman 2016/09/16 00:59:35 I am not sure this matches your expectations wrt c
alex clarke (OOO till 29th) 2016/09/16 10:23:36 Acknowledged.
549 }
550 if (layoutObject->isLayoutInline()) {
551 FloatRect localRect(toLayoutInline(layoutObject)->linesBoundingBox());
552 return layoutObject->localToAbsoluteQuad(localRect).boundingBox();
553 }
554 if (layoutObject->isBox()) {
555 FloatRect localRect(toLayoutBox(layoutObject)->borderBoxRect());
556 return layoutObject->localToAbsoluteQuad(localRect).boundingBox();
557 }
558 return layoutObject->absoluteBoundingBoxRect();
559 }
560
561 } // namespace
562
563 void InspectorDOMAgent::getRenderTreeNodes(ErrorString* errorString, std::unique _ptr<protocol::Array<protocol::DOM::RenderTreeNode>>* renderTreeNodes)
564 {
565 renderTreeNodes->reset(new protocol::Array<protocol::DOM::RenderTreeNode>);
566
567 std::vector<Node*> unvisited; // Neither WTF::Vector or HeapVector allow Nod e* :(
568 unvisited.push_back(m_document.get());
569
570 while (!unvisited.empty()) {
571 Node* node = unvisited.back();
572 unvisited.pop_back();
573 LayoutObject* layoutObject = node->layoutObject();
574 if (!layoutObject)
pfeldman 2016/09/16 00:59:35 You still might want to go over the dom hierarchy.
alex clarke (OOO till 29th) 2016/09/16 10:23:36 Good point!
575 continue;
576
577 int backendNodeId = DOMNodeIds::idForNode(node);
578 DCHECK(backendNodeId);
pfeldman 2016/09/16 00:59:35 It is always there
alex clarke (OOO till 29th) 2016/09/16 10:23:36 Done.
579 std::unique_ptr<protocol::DOM::RenderTreeNode> renderTreeNode =
580 protocol::DOM::RenderTreeNode::create()
581 .setBackendNodeId(backendNodeId)
582 .setBoundingBox(getRectForFloatRect(getAbsoluteBoundingBox(layou tObject)))
583 .build();
584
585 if (layoutObject->isText()) {
586 LayoutText* layoutText = toLayoutText(layoutObject);
587 renderTreeNode->setLayoutText(layoutText->text());
588 if (layoutText->hasTextBoxes()) {
589 std::unique_ptr<protocol::Array<protocol::DOM::InlineTextBox>> i nlineTextNodes(new protocol::Array<protocol::DOM::InlineTextBox>());
590 for (const InlineTextBox* itb = layoutText->firstTextBox(); itb; itb = itb->nextTextBox()) {
591 FloatRect localItbRect(itb->calculateBoundaries());
592 FloatRect absoluteItbRect = layoutObject->localToAbsoluteQua d(localItbRect).boundingBox();
593 inlineTextNodes->addItem(
594 protocol::DOM::InlineTextBox::create()
595 .setText(layoutText->text().substring(itb->start(), itb->len()).utf8().data())
596 .setBoundingBox(getRectForFloatRect(absoluteItbRect) )
597 .build());
598 }
599 renderTreeNode->setInlineTextNodes(std::move(inlineTextNodes));
600 }
601 }
602
603 (*renderTreeNodes)->addItem(std::move(renderTreeNode));
604
605 for (node = innerFirstChild(node); node; node = innerNextSibling(node))
pfeldman 2016/09/16 00:59:35 I don't see where you account for the shadow dom.
alex clarke (OOO till 29th) 2016/09/16 10:23:36 Hopefully I've done that now.
606 unvisited.push_back(node);
607 }
608 }
609
531 void InspectorDOMAgent::pushChildNodesToFrontend(int nodeId, int depth) 610 void InspectorDOMAgent::pushChildNodesToFrontend(int nodeId, int depth)
532 { 611 {
533 Node* node = nodeForId(nodeId); 612 Node* node = nodeForId(nodeId);
534 if (!node || (!node->isElementNode() && !node->isDocumentNode() && !node->is DocumentFragment())) 613 if (!node || (!node->isElementNode() && !node->isDocumentNode() && !node->is DocumentFragment()))
535 return; 614 return;
536 615
537 NodeToIdMap* nodeMap = m_idToNodesMap.get(nodeId); 616 NodeToIdMap* nodeMap = m_idToNodesMap.get(nodeId);
538 617
539 if (m_childrenRequested.contains(nodeId)) { 618 if (m_childrenRequested.contains(nodeId)) {
540 if (depth <= 1) 619 if (depth <= 1)
(...skipping 1560 matching lines...) Expand 10 before | Expand all | Expand 10 after
2101 visitor->trace(m_idToNodesMap); 2180 visitor->trace(m_idToNodesMap);
2102 visitor->trace(m_document); 2181 visitor->trace(m_document);
2103 visitor->trace(m_revalidateTask); 2182 visitor->trace(m_revalidateTask);
2104 visitor->trace(m_searchResults); 2183 visitor->trace(m_searchResults);
2105 visitor->trace(m_history); 2184 visitor->trace(m_history);
2106 visitor->trace(m_domEditor); 2185 visitor->trace(m_domEditor);
2107 InspectorBaseAgent::trace(visitor); 2186 InspectorBaseAgent::trace(visitor);
2108 } 2187 }
2109 2188
2110 } // namespace blink 2189 } // namespace blink
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698