summaryrefslogtreecommitdiffstats
path: root/webkit
diff options
context:
space:
mode:
authorpfeldman@chromium.org <pfeldman@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2009-04-27 13:41:57 +0000
committerpfeldman@chromium.org <pfeldman@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2009-04-27 13:41:57 +0000
commit7ce675e934626d730f7a5c488d771ac91a61732f (patch)
tree94e6b8aeac84c1dfb5474795c7e521aacd21b24d /webkit
parent3bbb6756823e795c9dd523e90b8c113e741dad71 (diff)
downloadchromium_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.cc55
-rw-r--r--webkit/glue/devtools/dom_agent_impl.h9
-rw-r--r--webkit/glue/devtools/dom_agent_unittest.cc8
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();