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

Unified Diff: third_party/WebKit/Source/core/inspector/InspectorDOMAgent.cpp

Issue 2346853002: Add a DOM.getLayoutTreeNodes devtools command (Closed)
Patch Set: Fix iframe font path Created 4 years, 2 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 side-by-side diff with in-line comments
Download patch
Index: third_party/WebKit/Source/core/inspector/InspectorDOMAgent.cpp
diff --git a/third_party/WebKit/Source/core/inspector/InspectorDOMAgent.cpp b/third_party/WebKit/Source/core/inspector/InspectorDOMAgent.cpp
index 57c3c68cf8e576bd11a7bb2bafce430175c4a91e..54d1faaea05b0e39848554cfbc80de5ba69c6d69 100644
--- a/third_party/WebKit/Source/core/inspector/InspectorDOMAgent.cpp
+++ b/third_party/WebKit/Source/core/inspector/InspectorDOMAgent.cpp
@@ -67,7 +67,9 @@
#include "core/inspector/InspectorHistory.h"
#include "core/inspector/V8InspectorString.h"
#include "core/layout/HitTestResult.h"
+#include "core/layout/LayoutInline.h"
#include "core/layout/api/LayoutViewItem.h"
+#include "core/layout/line/InlineTextBox.h"
#include "core/loader/DocumentLoader.h"
#include "core/page/FrameTree.h"
#include "core/page/Page.h"
@@ -137,6 +139,16 @@ v8::Local<v8::Value> nodeV8Value(v8::Local<v8::Context> context, Node* node) {
return toV8(node, context->Global(), isolate);
}
+std::unique_ptr<protocol::DOM::Rect> buildRectForFloatRect(
+ const FloatRect& rect) {
+ return protocol::DOM::Rect::create()
+ .setX(rect.x())
+ .setY(rect.y())
+ .setWidth(rect.width())
+ .setHeight(rect.height())
+ .build();
+}
+
} // namespace
class InspectorRevalidateDOMTask final
@@ -521,6 +533,77 @@ void InspectorDOMAgent::getDocument(
*root = buildObjectForNode(m_document.get(), 2, m_documentNodeToIdMap.get());
}
+void InspectorDOMAgent::getLayoutTreeNodes(
+ ErrorString* errorString,
+ std::unique_ptr<protocol::Array<protocol::DOM::LayoutTreeNode>>*
+ layoutTreeNodes) {
+ layoutTreeNodes->reset(new protocol::Array<protocol::DOM::LayoutTreeNode>);
+ visitLayoutTreeNodes(m_document.get(), *layoutTreeNodes->get());
+}
+
+void InspectorDOMAgent::visitLayoutTreeNodes(
+ Node* node,
+ protocol::Array<protocol::DOM::LayoutTreeNode>& layoutTreeNodes) {
+ for (; node; node = NodeTraversal::next(*node)) {
+ // Visit shadow dom nodes.
+ if (node->isElementNode()) {
+ const Element* element = toElement(node);
+ ElementShadow* elementShadow = element->shadow();
+ if (elementShadow) {
+ visitLayoutTreeNodes(&elementShadow->youngestShadowRoot(),
+ layoutTreeNodes);
+ }
+ }
+
+ // Pierce iframe boundaries.
+ if (node->isFrameOwnerElement()) {
+ visitLayoutTreeNodes(
+ toHTMLFrameOwnerElement(node)->contentDocument()->documentElement(),
+ layoutTreeNodes);
+ }
+
+ LayoutObject* layoutObject = node->layoutObject();
+ if (!layoutObject)
+ continue;
+
+ int backendNodeId = DOMNodeIds::idForNode(node);
+ std::unique_ptr<protocol::DOM::LayoutTreeNode> layoutTreeNode =
+ protocol::DOM::LayoutTreeNode::create()
+ .setBackendNodeId(backendNodeId)
+ .setBoundingBox(buildRectForFloatRect(
+ node->isElementNode()
+ ? FloatRect(toElement(node)->boundsInViewport())
+ : layoutObject->absoluteBoundingBoxRect()))
+ .build();
+
+ if (layoutObject->isText()) {
+ LayoutText* layoutText = toLayoutText(layoutObject);
+ layoutTreeNode->setLayoutText(layoutText->text());
+ if (layoutText->hasTextBoxes()) {
+ std::unique_ptr<protocol::Array<protocol::DOM::InlineTextBox>>
+ inlineTextNodes(
+ new protocol::Array<protocol::DOM::InlineTextBox>());
+ for (const InlineTextBox* textBox = layoutText->firstTextBox(); textBox;
+ textBox = textBox->nextTextBox()) {
+ FloatRect localCoordsTextBoxRect(textBox->calculateBoundaries());
+ FloatRect absoluteCoordsTextBoxRect =
+ layoutObject->localToAbsoluteQuad(localCoordsTextBoxRect)
+ .boundingBox();
+ inlineTextNodes->addItem(protocol::DOM::InlineTextBox::create()
+ .setStartCharacterIndex(textBox->start())
+ .setNumCharacters(textBox->len())
+ .setBoundingBox(buildRectForFloatRect(
+ absoluteCoordsTextBoxRect))
+ .build());
+ }
+ layoutTreeNode->setInlineTextNodes(std::move(inlineTextNodes));
+ }
+ }
+
+ layoutTreeNodes.addItem(std::move(layoutTreeNode));
+ }
+}
+
void InspectorDOMAgent::pushChildNodesToFrontend(int nodeId, int depth) {
Node* node = nodeForId(nodeId);
if (!node || (!node->isElementNode() && !node->isDocumentNode() &&

Powered by Google App Engine
This is Rietveld 408576698