| 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 54d1faaea05b0e39848554cfbc80de5ba69c6d69..becf36a5cce94ae0839e291417efe749fd822f92 100644
|
| --- a/third_party/WebKit/Source/core/inspector/InspectorDOMAgent.cpp
|
| +++ b/third_party/WebKit/Source/core/inspector/InspectorDOMAgent.cpp
|
| @@ -518,6 +518,8 @@ void InspectorDOMAgent::disable(ErrorString* errorString) {
|
|
|
| void InspectorDOMAgent::getDocument(
|
| ErrorString* errorString,
|
| + const Maybe<int>& depth,
|
| + const Maybe<bool>& traverseFrames,
|
| std::unique_ptr<protocol::DOM::Node>* root) {
|
| // Backward compatibility. Mark agent as enabled when it requests document.
|
| if (!enabled())
|
| @@ -530,7 +532,13 @@ void InspectorDOMAgent::getDocument(
|
|
|
| discardFrontendBindings();
|
|
|
| - *root = buildObjectForNode(m_document.get(), 2, m_documentNodeToIdMap.get());
|
| + int sanitizedDepth = depth.fromMaybe(2);
|
| + if (sanitizedDepth == -1)
|
| + sanitizedDepth = INT_MAX;
|
| +
|
| + *root = buildObjectForNode(m_document.get(), sanitizedDepth,
|
| + traverseFrames.fromMaybe(false),
|
| + m_documentNodeToIdMap.get());
|
| }
|
|
|
| void InspectorDOMAgent::getLayoutTreeNodes(
|
| @@ -604,7 +612,9 @@ void InspectorDOMAgent::visitLayoutTreeNodes(
|
| }
|
| }
|
|
|
| -void InspectorDOMAgent::pushChildNodesToFrontend(int nodeId, int depth) {
|
| +void InspectorDOMAgent::pushChildNodesToFrontend(int nodeId,
|
| + int depth,
|
| + bool traverseFrames) {
|
| Node* node = nodeForId(nodeId);
|
| if (!node || (!node->isElementNode() && !node->isDocumentNode() &&
|
| !node->isDocumentFragment()))
|
| @@ -621,14 +631,14 @@ void InspectorDOMAgent::pushChildNodesToFrontend(int nodeId, int depth) {
|
| for (node = innerFirstChild(node); node; node = innerNextSibling(node)) {
|
| int childNodeId = nodeMap->get(node);
|
| ASSERT(childNodeId);
|
| - pushChildNodesToFrontend(childNodeId, depth);
|
| + pushChildNodesToFrontend(childNodeId, depth, traverseFrames);
|
| }
|
|
|
| return;
|
| }
|
|
|
| std::unique_ptr<protocol::Array<protocol::DOM::Node>> children =
|
| - buildArrayForContainerChildren(node, depth, nodeMap);
|
| + buildArrayForContainerChildren(node, depth, traverseFrames, nodeMap);
|
| frontend()->setChildNodes(nodeId, std::move(children));
|
| }
|
|
|
| @@ -685,9 +695,11 @@ void InspectorDOMAgent::collectClassNamesFromSubtree(
|
| (*classNames)->addItem(className);
|
| }
|
|
|
| -void InspectorDOMAgent::requestChildNodes(ErrorString* errorString,
|
| - int nodeId,
|
| - const Maybe<int>& depth) {
|
| +void InspectorDOMAgent::requestChildNodes(
|
| + ErrorString* errorString,
|
| + int nodeId,
|
| + const Maybe<int>& depth,
|
| + const Maybe<bool>& maybeTaverseFrames) {
|
| int sanitizedDepth = depth.fromMaybe(1);
|
| if (sanitizedDepth == 0 || sanitizedDepth < -1) {
|
| *errorString =
|
| @@ -697,7 +709,8 @@ void InspectorDOMAgent::requestChildNodes(ErrorString* errorString,
|
| if (sanitizedDepth == -1)
|
| sanitizedDepth = INT_MAX;
|
|
|
| - pushChildNodesToFrontend(nodeId, sanitizedDepth);
|
| + pushChildNodesToFrontend(nodeId, sanitizedDepth,
|
| + maybeTaverseFrames.fromMaybe(false));
|
| }
|
|
|
| void InspectorDOMAgent::querySelector(ErrorString* errorString,
|
| @@ -797,7 +810,7 @@ int InspectorDOMAgent::pushNodePathToFrontend(Node* nodeToPush) {
|
| m_danglingNodeToIdMaps.append(newMap);
|
| std::unique_ptr<protocol::Array<protocol::DOM::Node>> children =
|
| protocol::Array<protocol::DOM::Node>::create();
|
| - children->addItem(buildObjectForNode(node, 0, danglingMap));
|
| + children->addItem(buildObjectForNode(node, 0, false, danglingMap));
|
| frontend()->setChildNodes(0, std::move(children));
|
|
|
| return pushNodePathToFrontend(nodeToPush, danglingMap);
|
| @@ -1646,6 +1659,7 @@ static protocol::DOM::ShadowRootType shadowRootType(ShadowRoot* shadowRoot) {
|
| std::unique_ptr<protocol::DOM::Node> InspectorDOMAgent::buildObjectForNode(
|
| Node* node,
|
| int depth,
|
| + bool traverseFrames,
|
| NodeToIdMap* nodesMap) {
|
| int id = bind(node, nodesMap);
|
| String localName;
|
| @@ -1690,8 +1704,10 @@ std::unique_ptr<protocol::DOM::Node> InspectorDOMAgent::buildObjectForNode(
|
| ? toLocalFrame(frameOwner->contentFrame())
|
| : nullptr)
|
| value->setFrameId(IdentifiersFactory::frameId(frame));
|
| - if (Document* doc = frameOwner->contentDocument())
|
| - value->setContentDocument(buildObjectForNode(doc, 0, nodesMap));
|
| + if (Document* doc = frameOwner->contentDocument()) {
|
| + value->setContentDocument(buildObjectForNode(
|
| + doc, traverseFrames ? depth : 0, traverseFrames, nodesMap));
|
| + }
|
| }
|
|
|
| if (node->parentNode() && node->parentNode()->isDocumentNode()) {
|
| @@ -1705,8 +1721,10 @@ std::unique_ptr<protocol::DOM::Node> InspectorDOMAgent::buildObjectForNode(
|
| std::unique_ptr<protocol::Array<protocol::DOM::Node>> shadowRoots =
|
| protocol::Array<protocol::DOM::Node>::create();
|
| for (ShadowRoot* root = &shadow->youngestShadowRoot(); root;
|
| - root = root->olderShadowRoot())
|
| - shadowRoots->addItem(buildObjectForNode(root, 0, nodesMap));
|
| + root = root->olderShadowRoot()) {
|
| + shadowRoots->addItem(
|
| + buildObjectForNode(root, 0, traverseFrames, nodesMap));
|
| + }
|
| value->setShadowRoots(std::move(shadowRoots));
|
| forcePushChildren = true;
|
| }
|
| @@ -1714,15 +1732,17 @@ std::unique_ptr<protocol::DOM::Node> InspectorDOMAgent::buildObjectForNode(
|
| if (isHTMLLinkElement(*element)) {
|
| HTMLLinkElement& linkElement = toHTMLLinkElement(*element);
|
| if (linkElement.isImport() && linkElement.import() &&
|
| - innerParentNode(linkElement.import()) == linkElement)
|
| - value->setImportedDocument(
|
| - buildObjectForNode(linkElement.import(), 0, nodesMap));
|
| + innerParentNode(linkElement.import()) == linkElement) {
|
| + value->setImportedDocument(buildObjectForNode(
|
| + linkElement.import(), 0, traverseFrames, nodesMap));
|
| + }
|
| forcePushChildren = true;
|
| }
|
|
|
| if (isHTMLTemplateElement(*element)) {
|
| - value->setTemplateContent(buildObjectForNode(
|
| - toHTMLTemplateElement(*element).content(), 0, nodesMap));
|
| + value->setTemplateContent(
|
| + buildObjectForNode(toHTMLTemplateElement(*element).content(), 0,
|
| + traverseFrames, nodesMap));
|
| forcePushChildren = true;
|
| }
|
|
|
| @@ -1777,7 +1797,7 @@ 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, nodesMap);
|
| + buildArrayForContainerChildren(node, depth, traverseFrames, nodesMap);
|
| if (children->length() > 0 ||
|
| depth) // Push children along with shadow in any case.
|
| value->setChildren(std::move(children));
|
| @@ -1803,6 +1823,7 @@ InspectorDOMAgent::buildArrayForElementAttributes(Element* element) {
|
| std::unique_ptr<protocol::Array<protocol::DOM::Node>>
|
| InspectorDOMAgent::buildArrayForContainerChildren(Node* container,
|
| int depth,
|
| + bool traverseFrames,
|
| NodeToIdMap* nodesMap) {
|
| std::unique_ptr<protocol::Array<protocol::DOM::Node>> children =
|
| protocol::Array<protocol::DOM::Node>::create();
|
| @@ -1812,7 +1833,8 @@ InspectorDOMAgent::buildArrayForContainerChildren(Node* container,
|
| Node* firstChild = container->firstChild();
|
| if (firstChild && firstChild->getNodeType() == Node::kTextNode &&
|
| !firstChild->nextSibling()) {
|
| - children->addItem(buildObjectForNode(firstChild, 0, nodesMap));
|
| + children->addItem(
|
| + buildObjectForNode(firstChild, 0, traverseFrames, nodesMap));
|
| m_childrenRequested.add(bind(container, nodesMap));
|
| }
|
| return children;
|
| @@ -1823,7 +1845,8 @@ InspectorDOMAgent::buildArrayForContainerChildren(Node* container,
|
| m_childrenRequested.add(bind(container, nodesMap));
|
|
|
| while (child) {
|
| - children->addItem(buildObjectForNode(child, depth, nodesMap));
|
| + children->addItem(
|
| + buildObjectForNode(child, depth, traverseFrames, nodesMap));
|
| child = innerNextSibling(child);
|
| }
|
| return children;
|
| @@ -1838,12 +1861,14 @@ InspectorDOMAgent::buildArrayForPseudoElements(Element* element,
|
|
|
| std::unique_ptr<protocol::Array<protocol::DOM::Node>> pseudoElements =
|
| protocol::Array<protocol::DOM::Node>::create();
|
| - if (element->pseudoElement(PseudoIdBefore))
|
| + if (element->pseudoElement(PseudoIdBefore)) {
|
| pseudoElements->addItem(buildObjectForNode(
|
| - element->pseudoElement(PseudoIdBefore), 0, nodesMap));
|
| - if (element->pseudoElement(PseudoIdAfter))
|
| - pseudoElements->addItem(
|
| - buildObjectForNode(element->pseudoElement(PseudoIdAfter), 0, nodesMap));
|
| + element->pseudoElement(PseudoIdBefore), 0, false, nodesMap));
|
| + }
|
| + if (element->pseudoElement(PseudoIdAfter)) {
|
| + pseudoElements->addItem(buildObjectForNode(
|
| + element->pseudoElement(PseudoIdAfter), 0, false, nodesMap));
|
| + }
|
| return pseudoElements;
|
| }
|
|
|
| @@ -1960,7 +1985,7 @@ void InspectorDOMAgent::invalidateFrameOwnerElement(LocalFrame* frame) {
|
| unbind(frameOwner, m_documentNodeToIdMap.get());
|
|
|
| std::unique_ptr<protocol::DOM::Node> value =
|
| - buildObjectForNode(frameOwner, 0, m_documentNodeToIdMap.get());
|
| + buildObjectForNode(frameOwner, 0, false, m_documentNodeToIdMap.get());
|
| Node* previousSibling = innerPreviousSibling(frameOwner);
|
| int prevId =
|
| previousSibling ? m_documentNodeToIdMap->get(previousSibling) : 0;
|
| @@ -2002,7 +2027,7 @@ void InspectorDOMAgent::didInsertDOMNode(Node* node) {
|
| Node* prevSibling = innerPreviousSibling(node);
|
| int prevId = prevSibling ? m_documentNodeToIdMap->get(prevSibling) : 0;
|
| std::unique_ptr<protocol::DOM::Node> value =
|
| - buildObjectForNode(node, 0, m_documentNodeToIdMap.get());
|
| + buildObjectForNode(node, 0, false, m_documentNodeToIdMap.get());
|
| frontend()->childNodeInserted(parentId, prevId, std::move(value));
|
| }
|
| }
|
| @@ -2121,7 +2146,7 @@ void InspectorDOMAgent::didPushShadowRoot(Element* host, ShadowRoot* root) {
|
|
|
| pushChildNodesToFrontend(hostId, 1);
|
| frontend()->shadowRootPushed(
|
| - hostId, buildObjectForNode(root, 0, m_documentNodeToIdMap.get()));
|
| + hostId, buildObjectForNode(root, 0, false, m_documentNodeToIdMap.get()));
|
| }
|
|
|
| void InspectorDOMAgent::willPopShadowRoot(Element* host, ShadowRoot* root) {
|
| @@ -2186,7 +2211,7 @@ void InspectorDOMAgent::pseudoElementCreated(PseudoElement* pseudoElement) {
|
| pushChildNodesToFrontend(parentId, 1);
|
| frontend()->pseudoElementAdded(
|
| parentId,
|
| - buildObjectForNode(pseudoElement, 0, m_documentNodeToIdMap.get()));
|
| + buildObjectForNode(pseudoElement, 0, false, m_documentNodeToIdMap.get()));
|
| }
|
|
|
| void InspectorDOMAgent::pseudoElementDestroyed(PseudoElement* pseudoElement) {
|
| @@ -2351,7 +2376,7 @@ bool InspectorDOMAgent::pushDocumentUponHandlelessOperation(
|
| ErrorString* errorString) {
|
| if (!m_documentNodeToIdMap->contains(m_document)) {
|
| std::unique_ptr<protocol::DOM::Node> root;
|
| - getDocument(errorString, &root);
|
| + getDocument(errorString, Maybe<int>(), Maybe<bool>(), &root);
|
| return errorString->isEmpty();
|
| }
|
| return true;
|
|
|