From 156df1ef09308e5bdf1278c0edfbc58769c9ee23 Mon Sep 17 00:00:00 2001 From: "hayato@chromium.org" Date: Fri, 24 Feb 2012 12:02:11 +0000 Subject: [PATCH] Make Node::showTreeForThis (and Node::showTreeForThisAcrossFrame) dump multiple shadow roots. https://bugs.webkit.org/show_bug.cgi?id=79351 Reviewed by Dimitri Glazkov. No new tests since these utility functions are only available in debug build. I manually tested in GDB session. * dom/Node.cpp: (WebCore::oldestShadowRootFor): (WebCore::traverseTreeAndMark): (WebCore::parentOrHostOrFrameOwner): (WebCore::showSubTreeAcrossFrame): * dom/ShadowRoot.h: (WebCore::ShadowRoot::youngerShadowRoot): (WebCore::ShadowRoot::olderShadowRoot): (WebCore::toShadowRoot): (WebCore): git-svn-id: http://svn.webkit.org/repository/webkit/trunk@108770 268f45cc-cd09-0410-ab3c-d52691b4dbfc --- Source/WebCore/ChangeLog | 21 +++++++++++++++++++++ Source/WebCore/dom/Node.cpp | 29 +++++++++++++++-------------- Source/WebCore/dom/ShadowRoot.h | 13 +++++++++---- 3 files changed, 45 insertions(+), 18 deletions(-) diff --git a/Source/WebCore/ChangeLog b/Source/WebCore/ChangeLog index 3f61fa13..0b3a36da 100644 --- a/Source/WebCore/ChangeLog +++ b/Source/WebCore/ChangeLog @@ -1,3 +1,24 @@ +2012-02-24 Hayato Ito + + Make Node::showTreeForThis (and Node::showTreeForThisAcrossFrame) dump multiple shadow roots. + https://bugs.webkit.org/show_bug.cgi?id=79351 + + Reviewed by Dimitri Glazkov. + + No new tests since these utility functions are only available in debug build. + I manually tested in GDB session. + + * dom/Node.cpp: + (WebCore::oldestShadowRootFor): + (WebCore::traverseTreeAndMark): + (WebCore::parentOrHostOrFrameOwner): + (WebCore::showSubTreeAcrossFrame): + * dom/ShadowRoot.h: + (WebCore::ShadowRoot::youngerShadowRoot): + (WebCore::ShadowRoot::olderShadowRoot): + (WebCore::toShadowRoot): + (WebCore): + 2012-02-24 Pavel Feldman Not reviewed: follow up to inspector's r108331, using more general condition. diff --git a/Source/WebCore/dom/Node.cpp b/Source/WebCore/dom/Node.cpp index d931deb..2e9c61a 100644 --- a/Source/WebCore/dom/Node.cpp +++ b/Source/WebCore/dom/Node.cpp @@ -809,7 +809,7 @@ bool Node::hasNonEmptyBoundingBox() const return false; } -inline static ShadowRoot* oldestShadowRoot(Node* node) +inline static ShadowRoot* oldestShadowRootFor(const Node* node) { return node->isElementNode() && toElement(node)->hasShadowRoot() ? toElement(node)->shadowRootList()->oldestShadowRoot() : 0; } @@ -2269,12 +2269,11 @@ static void traverseTreeAndMark(const String& baseIndent, const Node* rootNode, indent += "\t"; fprintf(stderr, "%s", indent.utf8().data()); node->showNode(); - if (node->isShadowRoot()) { - if (ShadowRoot* youngerShadowRoot = toShadowRoot(const_cast(node))->youngerShadowRoot()) + if (ShadowRoot* youngerShadowRoot = toShadowRoot(node)->youngerShadowRoot()) traverseTreeAndMark(indent + "\t", youngerShadowRoot, markedNode1, markedLabel1, markedNode2, markedLabel2); - } else if (ShadowRoot* rootNode = oldestShadowRoot(const_cast(node))) - traverseTreeAndMark(indent + "\t", rootNode, markedNode1, markedLabel1, markedNode2, markedLabel2); + } else if (ShadowRoot* oldestShadowRoot = oldestShadowRootFor(node)) + traverseTreeAndMark(indent + "\t", oldestShadowRoot, markedNode1, markedLabel1, markedNode2, markedLabel2); } } @@ -2304,7 +2303,7 @@ void Node::formatForDebugger(char* buffer, unsigned length) const strncpy(buffer, result.utf8().data(), length - 1); } -static ContainerNode* parentOrHostOrFrameOwner(Node* node) +static ContainerNode* parentOrHostOrFrameOwner(const Node* node) { ContainerNode* parent = node->parentOrHostNode(); if (!parent && node->document() && node->document()->frame()) @@ -2312,19 +2311,21 @@ static ContainerNode* parentOrHostOrFrameOwner(Node* node) return parent; } -static void showSubTreeAcrossFrame(Node* node, const Node* markedNode, const String& indent) +static void showSubTreeAcrossFrame(const Node* node, const Node* markedNode, const String& indent) { if (node == markedNode) fputs("*", stderr); fputs(indent.utf8().data(), stderr); node->showNode(); - if (node->isFrameOwnerElement()) - showSubTreeAcrossFrame(static_cast(node)->contentDocument(), markedNode, indent + "\t"); - if (node->isShadowRoot()) { - if (ShadowRoot* youngerShadowRoot = toShadowRoot(node)->youngerShadowRoot()) - showSubTreeAcrossFrame(youngerShadowRoot, markedNode, indent + "\t"); - } else if (ShadowRoot* shadowRoot = oldestShadowRoot(node)) - showSubTreeAcrossFrame(shadowRoot, markedNode, indent + "\t"); + if (node->isShadowRoot()) { + if (ShadowRoot* youngerShadowRoot = toShadowRoot(node)->youngerShadowRoot()) + showSubTreeAcrossFrame(youngerShadowRoot, markedNode, indent + "\t"); + } else { + if (node->isFrameOwnerElement()) + showSubTreeAcrossFrame(static_cast(node)->contentDocument(), markedNode, indent + "\t"); + if (ShadowRoot* oldestShadowRoot = oldestShadowRootFor(node)) + showSubTreeAcrossFrame(oldestShadowRoot, markedNode, indent + "\t"); + } for (Node* child = node->firstChild(); child; child = child->nextSibling()) showSubTreeAcrossFrame(child, markedNode, indent + "\t"); } diff --git a/Source/WebCore/dom/ShadowRoot.h b/Source/WebCore/dom/ShadowRoot.h index 9b9db14..3121167 100644 --- a/Source/WebCore/dom/ShadowRoot.h +++ b/Source/WebCore/dom/ShadowRoot.h @@ -72,8 +72,8 @@ public: Element* host() const { return shadowHost(); } ShadowRootList* list() const; - ShadowRoot* youngerShadowRoot() { return prev(); } - ShadowRoot* olderShadowRoot() { return next(); } + ShadowRoot* youngerShadowRoot() const { return prev(); } + ShadowRoot* olderShadowRoot() const { return next(); } bool hasContentElement() const; @@ -90,10 +90,15 @@ private: bool m_applyAuthorSheets : 1; }; -inline ShadowRoot* toShadowRoot(Node* node) +inline const ShadowRoot* toShadowRoot(const Node* node) { ASSERT(!node || node->isShadowRoot()); - return static_cast(node); + return static_cast(node); +} + +inline ShadowRoot* toShadowRoot(Node* node) +{ + return const_cast(toShadowRoot(static_cast(node))); } } // namespace -- 2.7.4