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

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

Issue 2633343003: Adds DOM.getFlatDocument which returns an array of nodes (Closed)
Patch Set: Fix headless browser test Created 3 years, 11 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 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;

Powered by Google App Engine
This is Rietveld 408576698