| 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 0ceb294c59525ae7a89873664d29373976394f87..2cb8bdd9ac7cca042a6dd44f426b68c43679e8f8 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"
|
| @@ -136,8 +138,19 @@ 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 : public GarbageCollectedFinalized<InspectorRevalidateDOMTask> {
|
| public:
|
| explicit InspectorRevalidateDOMTask(InspectorDOMAgent*);
|
| @@ -529,6 +542,61 @@ void InspectorDOMAgent::getDocument(ErrorString* errorString, std::unique_ptr<pr
|
| *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);
|
|
|