| 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 8cfe3a1afa7d2b25f89565abc7a1116612877e69..9703b2a006b1a51109c5bc507c502a82339026a5 100644
|
| --- a/third_party/WebKit/Source/core/inspector/InspectorDOMAgent.cpp
|
| +++ b/third_party/WebKit/Source/core/inspector/InspectorDOMAgent.cpp
|
| @@ -494,6 +494,29 @@ Response InspectorDOMAgent::getDocument(
|
| return Response::OK();
|
| }
|
|
|
| +Response InspectorDOMAgent::getFlattenedDocument(
|
| + Maybe<int> depth,
|
| + Maybe<bool> pierce,
|
| + std::unique_ptr<protocol::Array<protocol::DOM::Node>>* nodes) {
|
| + if (!enabled())
|
| + return Response::Error("Document not enabled");
|
| +
|
| + if (!m_document)
|
| + return Response::Error("Document is not available");
|
| +
|
| + discardFrontendBindings();
|
| +
|
| + int sanitizedDepth = depth.fromMaybe(-1);
|
| + if (sanitizedDepth == -1)
|
| + sanitizedDepth = INT_MAX;
|
| +
|
| + nodes->reset(new protocol::Array<protocol::DOM::Node>());
|
| + (*nodes)->addItem(buildObjectForNode(
|
| + m_document.get(), sanitizedDepth, pierce.fromMaybe(false),
|
| + m_documentNodeToIdMap.get(), nodes->get()));
|
| + return Response::OK();
|
| +}
|
| +
|
| void InspectorDOMAgent::pushChildNodesToFrontend(int nodeId,
|
| int depth,
|
| bool pierce) {
|
| @@ -520,7 +543,7 @@ void InspectorDOMAgent::pushChildNodesToFrontend(int nodeId,
|
| }
|
|
|
| std::unique_ptr<protocol::Array<protocol::DOM::Node>> children =
|
| - buildArrayForContainerChildren(node, depth, pierce, nodeMap);
|
| + buildArrayForContainerChildren(node, depth, pierce, nodeMap, nullptr);
|
| frontend()->setChildNodes(nodeId, std::move(children));
|
| }
|
|
|
| @@ -1540,7 +1563,8 @@ std::unique_ptr<protocol::DOM::Node> InspectorDOMAgent::buildObjectForNode(
|
| Node* node,
|
| int depth,
|
| bool pierce,
|
| - NodeToIdMap* nodesMap) {
|
| + NodeToIdMap* nodesMap,
|
| + protocol::Array<protocol::DOM::Node>* flattenResult) {
|
| int id = bind(node, nodesMap);
|
| String localName;
|
| String nodeValue;
|
| @@ -1589,8 +1613,8 @@ std::unique_ptr<protocol::DOM::Node> InspectorDOMAgent::buildObjectForNode(
|
| : nullptr)
|
| value->setFrameId(IdentifiersFactory::frameId(frame));
|
| if (Document* doc = frameOwner->contentDocument()) {
|
| - value->setContentDocument(
|
| - buildObjectForNode(doc, pierce ? depth : 0, pierce, nodesMap));
|
| + value->setContentDocument(buildObjectForNode(
|
| + doc, pierce ? depth : 0, pierce, nodesMap, flattenResult));
|
| }
|
| }
|
|
|
| @@ -1606,8 +1630,8 @@ std::unique_ptr<protocol::DOM::Node> InspectorDOMAgent::buildObjectForNode(
|
| protocol::Array<protocol::DOM::Node>::create();
|
| for (ShadowRoot* root = &shadow->youngestShadowRoot(); root;
|
| root = root->olderShadowRoot()) {
|
| - shadowRoots->addItem(
|
| - buildObjectForNode(root, pierce ? depth : 0, pierce, nodesMap));
|
| + shadowRoots->addItem(buildObjectForNode(
|
| + root, pierce ? depth : 0, pierce, nodesMap, flattenResult));
|
| }
|
| value->setShadowRoots(std::move(shadowRoots));
|
| forcePushChildren = true;
|
| @@ -1617,15 +1641,16 @@ std::unique_ptr<protocol::DOM::Node> InspectorDOMAgent::buildObjectForNode(
|
| HTMLLinkElement& linkElement = toHTMLLinkElement(*element);
|
| if (linkElement.isImport() && linkElement.import() &&
|
| innerParentNode(linkElement.import()) == linkElement) {
|
| - value->setImportedDocument(
|
| - buildObjectForNode(linkElement.import(), 0, pierce, nodesMap));
|
| + value->setImportedDocument(buildObjectForNode(
|
| + linkElement.import(), 0, pierce, nodesMap, flattenResult));
|
| }
|
| forcePushChildren = true;
|
| }
|
|
|
| if (isHTMLTemplateElement(*element)) {
|
| - value->setTemplateContent(buildObjectForNode(
|
| - toHTMLTemplateElement(*element).content(), 0, pierce, nodesMap));
|
| + value->setTemplateContent(
|
| + buildObjectForNode(toHTMLTemplateElement(*element).content(), 0,
|
| + pierce, nodesMap, flattenResult));
|
| forcePushChildren = true;
|
| }
|
|
|
| @@ -1680,7 +1705,8 @@ std::unique_ptr<protocol::DOM::Node> InspectorDOMAgent::buildObjectForNode(
|
| if (forcePushChildren && !depth)
|
| depth = 1;
|
| std::unique_ptr<protocol::Array<protocol::DOM::Node>> children =
|
| - buildArrayForContainerChildren(node, depth, pierce, nodesMap);
|
| + buildArrayForContainerChildren(node, depth, pierce, nodesMap,
|
| + flattenResult);
|
| if (children->length() > 0 ||
|
| depth) // Push children along with shadow in any case.
|
| value->setChildren(std::move(children));
|
| @@ -1704,10 +1730,12 @@ InspectorDOMAgent::buildArrayForElementAttributes(Element* element) {
|
| }
|
|
|
| std::unique_ptr<protocol::Array<protocol::DOM::Node>>
|
| -InspectorDOMAgent::buildArrayForContainerChildren(Node* container,
|
| - int depth,
|
| - bool pierce,
|
| - NodeToIdMap* nodesMap) {
|
| +InspectorDOMAgent::buildArrayForContainerChildren(
|
| + Node* container,
|
| + int depth,
|
| + bool pierce,
|
| + NodeToIdMap* nodesMap,
|
| + protocol::Array<protocol::DOM::Node>* flattenResult) {
|
| std::unique_ptr<protocol::Array<protocol::DOM::Node>> children =
|
| protocol::Array<protocol::DOM::Node>::create();
|
| if (depth == 0) {
|
| @@ -1716,7 +1744,14 @@ InspectorDOMAgent::buildArrayForContainerChildren(Node* container,
|
| Node* firstChild = container->firstChild();
|
| if (firstChild && firstChild->getNodeType() == Node::kTextNode &&
|
| !firstChild->nextSibling()) {
|
| - children->addItem(buildObjectForNode(firstChild, 0, pierce, nodesMap));
|
| + std::unique_ptr<protocol::DOM::Node> childNode =
|
| + buildObjectForNode(firstChild, 0, pierce, nodesMap, flattenResult);
|
| + childNode->setParentId(bind(container, nodesMap));
|
| + if (flattenResult) {
|
| + flattenResult->addItem(std::move(childNode));
|
| + } else {
|
| + children->addItem(std::move(childNode));
|
| + }
|
| m_childrenRequested.insert(bind(container, nodesMap));
|
| }
|
| return children;
|
| @@ -1727,7 +1762,15 @@ InspectorDOMAgent::buildArrayForContainerChildren(Node* container,
|
| m_childrenRequested.insert(bind(container, nodesMap));
|
|
|
| while (child) {
|
| - children->addItem(buildObjectForNode(child, depth, pierce, nodesMap));
|
| + std::unique_ptr<protocol::DOM::Node> childNode =
|
| + buildObjectForNode(child, depth, pierce, nodesMap, flattenResult);
|
| + childNode->setParentId(bind(container, nodesMap));
|
| + if (flattenResult) {
|
| + flattenResult->addItem(std::move(childNode));
|
| + } else {
|
| + children->addItem(std::move(childNode));
|
| + }
|
| + m_childrenRequested.insert(bind(container, nodesMap));
|
| child = innerNextSibling(child);
|
| }
|
| return children;
|
|
|