diff options
author | pfeldman@chromium.org <pfeldman@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2009-04-27 13:41:57 +0000 |
---|---|---|
committer | pfeldman@chromium.org <pfeldman@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2009-04-27 13:41:57 +0000 |
commit | 7ce675e934626d730f7a5c488d771ac91a61732f (patch) | |
tree | 94e6b8aeac84c1dfb5474795c7e521aacd21b24d /webkit | |
parent | 3bbb6756823e795c9dd523e90b8c113e741dad71 (diff) | |
download | chromium_src-7ce675e934626d730f7a5c488d771ac91a61732f.zip chromium_src-7ce675e934626d730f7a5c488d771ac91a61732f.tar.gz chromium_src-7ce675e934626d730f7a5c488d771ac91a61732f.tar.bz2 |
Ignore whitespace while mirroring Dom to the client.
Review URL: http://codereview.chromium.org/92125
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@14603 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'webkit')
-rw-r--r-- | webkit/glue/devtools/dom_agent_impl.cc | 55 | ||||
-rw-r--r-- | webkit/glue/devtools/dom_agent_impl.h | 9 | ||||
-rw-r--r-- | webkit/glue/devtools/dom_agent_unittest.cc | 8 |
3 files changed, 55 insertions, 17 deletions
diff --git a/webkit/glue/devtools/dom_agent_impl.cc b/webkit/glue/devtools/dom_agent_impl.cc index d7955d6..88c42dd 100644 --- a/webkit/glue/devtools/dom_agent_impl.cc +++ b/webkit/glue/devtools/dom_agent_impl.cc @@ -213,6 +213,9 @@ void DomAgentImpl::handleEvent(Event* event, bool isWindowEvent) { OwnPtr<Value> attributesValue(BuildValueForElementAttributes(element)); delegate_->AttributesUpdated(id, *attributesValue.get()); } else if (type == eventNames().DOMNodeInsertedEvent) { + if (IsWhitespace(node)) { + return; + } Node* parent = static_cast<MutationEvent*>(event)->relatedNode(); int parent_id = GetIdForNode(parent); if (!parent_id) { @@ -224,11 +227,14 @@ void DomAgentImpl::handleEvent(Event* event, bool isWindowEvent) { delegate_->HasChildrenUpdated(parent_id, true); } else { // Children have been requested -> return value of a new child. - int prev_id = GetIdForNode(node->previousSibling()); + int prev_id = GetIdForNode(InnerPreviousSibling(node)); OwnPtr<Value> value(BuildValueForNode(node, 0)); delegate_->ChildNodeInserted(parent_id, prev_id, *value.get()); } } else if (type == eventNames().DOMNodeRemovedEvent) { + if (IsWhitespace(node)) { + return; + } Node* parent = static_cast<MutationEvent*>(event)->relatedNode(); int parent_id = GetIdForNode(parent); if (!parent_id) { @@ -237,7 +243,7 @@ void DomAgentImpl::handleEvent(Event* event, bool isWindowEvent) { } if (!children_requested_.contains(parent_id)) { // No children are mapped yet -> only notify on changes of hasChildren. - if (parent->childNodeCount() == 1) + if (InnerChildNodeCount(parent) == 1) delegate_->HasChildrenUpdated(parent_id, false); } else { int id = GetIdForNode(node); @@ -508,8 +514,8 @@ ListValue* DomAgentImpl::BuildValueForElementChildren( OwnPtr<ListValue> children(new ListValue()); if (depth == 0) { // Special case the_only text child. - if (element->childNodeCount() == 1) { - Node *child = element->firstChild(); + if (InnerChildNodeCount(element) == 1) { + Node *child = InnerFirstChild(element); if (child->nodeType() == Node::TEXT_NODE) { children->Append(BuildValueForNode(child, 0)); } @@ -520,7 +526,7 @@ ListValue* DomAgentImpl::BuildValueForElementChildren( } for (Node *child = InnerFirstChild(element); child != NULL; - child = child->nextSibling()) { + child = InnerNextSibling(child)) { children->Append(BuildValueForNode(child, depth)); } return children.release(); @@ -536,19 +542,35 @@ Node* DomAgentImpl::InnerFirstChild(Node* node) { return doc->firstChild(); } } - return node->firstChild(); + node = node->firstChild(); + while (IsWhitespace(node)) { + node = node->nextSibling(); + } + return node; +} + +Node* DomAgentImpl::InnerNextSibling(Node* node) { + do { + node = node->nextSibling(); + } while (IsWhitespace(node)); + return node; +} + +Node* DomAgentImpl::InnerPreviousSibling(Node* node) { + do { + node = node->previousSibling(); + } while (IsWhitespace(node)); + return node; } int DomAgentImpl::InnerChildNodeCount(Node* node) { - if (node->isFrameOwnerElement()) { - HTMLFrameOwnerElement* frame_owner = - static_cast<HTMLFrameOwnerElement*>(node); - Document* doc = frame_owner->contentDocument(); - if (doc) { - return 1; - } + int count = 0; + Node* child = InnerFirstChild(node); + while (child) { + count++; + child = InnerNextSibling(child); } - return node->childNodeCount(); + return count; } Element* DomAgentImpl::InnerParentElement(Node* node) { @@ -559,6 +581,11 @@ Element* DomAgentImpl::InnerParentElement(Node* node) { return element; } +bool DomAgentImpl::IsWhitespace(Node* node) { + return node != NULL && node->nodeType() == Node::TEXT_NODE && + node->nodeValue().stripWhiteSpace().length() == 0; +} + Document* DomAgentImpl::GetMainFrameDocument() { ListHashSet<RefPtr<WebCore::Document> >::iterator it = documents_.begin(); if (it != documents_.end()) { diff --git a/webkit/glue/devtools/dom_agent_impl.h b/webkit/glue/devtools/dom_agent_impl.h index 3d88e3e..5ee584b 100644 --- a/webkit/glue/devtools/dom_agent_impl.h +++ b/webkit/glue/devtools/dom_agent_impl.h @@ -126,11 +126,16 @@ class DomAgentImpl : public DomAgent { const WebCore::CSSStyleDeclaration& style); // We represent embedded doms as a part of the same hierarchy. Hence we - // treat children of frame owners differently. Following two methods - // encapsulate frame owner specifics. + // treat children of frame owners differently. We also skip whitespace + // text nodes conditionally. Following four methods encapsulate these + // specifics. WebCore::Node* InnerFirstChild(WebCore::Node* node); + WebCore::Node* InnerNextSibling(WebCore::Node* node); + WebCore::Node* InnerPreviousSibling(WebCore::Node* node); int InnerChildNodeCount(WebCore::Node* node); WebCore::Element* InnerParentElement(WebCore::Node* node); + bool IsWhitespace(WebCore::Node* node); + WebCore::Document* GetMainFrameDocument(); DomAgentDelegate* delegate_; diff --git a/webkit/glue/devtools/dom_agent_unittest.cc b/webkit/glue/devtools/dom_agent_unittest.cc index b88a183..c95111e 100644 --- a/webkit/glue/devtools/dom_agent_unittest.cc +++ b/webkit/glue/devtools/dom_agent_unittest.cc @@ -8,7 +8,9 @@ #include "Document.h" #include "EventListener.h" #include "HTMLFrameOwnerElement.h" +#include "Node.h" #include "PlatformString.h" +#include "Text.h" #include <wtf/OwnPtr.h> #undef LOG @@ -33,6 +35,7 @@ using WebCore::ExceptionCode; using WebCore::HTMLFrameOwnerElement; using WebCore::Node; using WebCore::String; +using WebCore::Text; namespace { @@ -56,7 +59,7 @@ class DomAgentTests : public TestShellTest { test_shell_->ResetTestController(); GURL file_url = net::FilePathToFileURL(data_dir_); WebFrame* main_frame = test_shell_->webView()->GetMainFrame(); - main_frame->LoadHTMLString("<html><body/></html>", + main_frame->LoadHTMLString("<html> <body> </body> </html>", file_url); WebFrameImpl* main_frame_impl = static_cast<WebFrameImpl*>(main_frame); @@ -161,6 +164,9 @@ TEST_F(DomAgentTests, ChildNodeInsertedKnownChildren) { mock_delegate_->ChildNodeInserted(kBodyElemId, 0, *v.get()); mock_delegate_->Replay(); + RefPtr<Text> text = document_->createTextNode(" "); + body_->appendChild(text, ec_); + RefPtr<Element> div = document_->createElement("DIV", ec_); body_->appendChild(div, ec_); mock_delegate_->Verify(); |