[SCM] WebKit Debian packaging branch, debian/unstable, updated. debian/1.1.18-1-697-g2f78b87
knorton at google.com
knorton at google.com
Wed Jan 20 22:19:25 UTC 2010
The following commit has been merged in the debian/unstable branch:
commit b413e0355bb818cbccbe8c37cf6e78482fc6564b
Author: knorton at google.com <knorton at google.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Date: Mon Jan 11 17:02:42 2010 +0000
2010-01-11 Kelly Norton <knorton at google.com>
Reviewed by Pavel Feldman.
Fixes the fact that timeline panel results are skewed by the use of DOM mutation events.
https://bugs.webkit.org/show_bug.cgi?id=32846
Instead of using DOM mutation events in InspectorDOMAgent, InspectorController is now called
directly when the DOM is mutated.
* dom/ContainerNode.cpp: Calls InspectorController directly when child nodes are added/removed.
(WebCore::dispatchChildInsertionEvents):
(WebCore::dispatchChildRemovalEvents):
* dom/Element.cpp: Calls InspectorController directly when attributes are added/removed.
(WebCore::Element::dispatchAttrRemovalEvent):
(WebCore::Element::dispatchAttrAdditionEvent):
* inspector/InspectorController.cpp:
(WebCore::InspectorController::didInsertDOMNode):
(WebCore::InspectorController::didRemoveDOMNode):
(WebCore::InspectorController::didModifyDOMAttr):
* inspector/InspectorController.h:
* inspector/InspectorDOMAgent.cpp:
(WebCore::InspectorDOMAgent::startListening):
(WebCore::InspectorDOMAgent::stopListening):
(WebCore::InspectorDOMAgent::handleEvent):
(WebCore::InspectorDOMAgent::didInsertDOMNode):
(WebCore::InspectorDOMAgent::didRemoveDOMNode):
(WebCore::InspectorDOMAgent::didModifyDOMAttr):
* inspector/InspectorDOMAgent.h:
git-svn-id: http://svn.webkit.org/repository/webkit/trunk@53080 268f45cc-cd09-0410-ab3c-d52691b4dbfc
diff --git a/WebCore/ChangeLog b/WebCore/ChangeLog
index c537527..39cc9bc 100644
--- a/WebCore/ChangeLog
+++ b/WebCore/ChangeLog
@@ -1,3 +1,33 @@
+2010-01-06 Kelly Norton <knorton at google.com>
+
+ Reviewed by Pavel Feldman.
+
+ Fixes the fact that timeline panel results are skewed by the use of DOM mutation events.
+ https://bugs.webkit.org/show_bug.cgi?id=32846
+
+ Instead of using DOM mutation events in InspectorDOMAgent, InspectorController is now called
+ directly when the DOM is mutated.
+
+ * dom/ContainerNode.cpp: Calls InspectorController directly when child nodes are added/removed.
+ (WebCore::dispatchChildInsertionEvents):
+ (WebCore::dispatchChildRemovalEvents):
+ * dom/Element.cpp: Calls InspectorController directly when attributes are added/removed.
+ (WebCore::Element::dispatchAttrRemovalEvent):
+ (WebCore::Element::dispatchAttrAdditionEvent):
+ * inspector/InspectorController.cpp:
+ (WebCore::InspectorController::didInsertDOMNode):
+ (WebCore::InspectorController::didRemoveDOMNode):
+ (WebCore::InspectorController::didModifyDOMAttr):
+ * inspector/InspectorController.h:
+ * inspector/InspectorDOMAgent.cpp:
+ (WebCore::InspectorDOMAgent::startListening):
+ (WebCore::InspectorDOMAgent::stopListening):
+ (WebCore::InspectorDOMAgent::handleEvent):
+ (WebCore::InspectorDOMAgent::didInsertDOMNode):
+ (WebCore::InspectorDOMAgent::didRemoveDOMNode):
+ (WebCore::InspectorDOMAgent::didModifyDOMAttr):
+ * inspector/InspectorDOMAgent.h:
+
2010-01-10 Darin Adler <darin at apple.com>
Reviewed by Alexey Proskuryakov.
diff --git a/WebCore/dom/ContainerNode.cpp b/WebCore/dom/ContainerNode.cpp
index 5cd0781..39cd3b4 100644
--- a/WebCore/dom/ContainerNode.cpp
+++ b/WebCore/dom/ContainerNode.cpp
@@ -33,6 +33,7 @@
#include "Frame.h"
#include "FrameView.h"
#include "InlineTextBox.h"
+#include "InspectorController.h"
#include "MutationEvent.h"
#include "Page.h"
#include "RenderTheme.h"
@@ -869,6 +870,13 @@ static void dispatchChildInsertionEvents(Node* child)
{
ASSERT(!eventDispatchForbidden());
+#if ENABLE(INSPECTOR)
+ if (Page* page = child->document()->page()) {
+ if (InspectorController* inspectorController = page->inspectorController())
+ inspectorController->didInsertDOMNode(child);
+ }
+#endif
+
RefPtr<Node> c = child;
RefPtr<Document> document = child->document();
@@ -891,6 +899,13 @@ static void dispatchChildInsertionEvents(Node* child)
static void dispatchChildRemovalEvents(Node* child)
{
+#if ENABLE(INSPECTOR)
+ if (Page* page = child->document()->page()) {
+ if (InspectorController* inspectorController = page->inspectorController())
+ inspectorController->didRemoveDOMNode(child);
+ }
+#endif
+
RefPtr<Node> c = child;
RefPtr<Document> document = child->document();
diff --git a/WebCore/dom/Element.cpp b/WebCore/dom/Element.cpp
index 9ebd328..48ebf6c 100644
--- a/WebCore/dom/Element.cpp
+++ b/WebCore/dom/Element.cpp
@@ -42,6 +42,7 @@
#include "FrameView.h"
#include "HTMLElement.h"
#include "HTMLNames.h"
+#include "InspectorController.h"
#include "NamedNodeMap.h"
#include "NodeList.h"
#include "NodeRenderStyle.h"
@@ -1005,6 +1006,14 @@ void Element::finishParsingChildren()
void Element::dispatchAttrRemovalEvent(Attribute*)
{
ASSERT(!eventDispatchForbidden());
+
+#if ENABLE(INSPECTOR)
+ if (Page* page = document()->page()) {
+ if (InspectorController* inspectorController = page->inspectorController())
+ inspectorController->didModifyDOMAttr(this);
+ }
+#endif
+
#if 0
if (!document()->hasListenerType(Document::DOMATTRMODIFIED_LISTENER))
return;
@@ -1017,6 +1026,14 @@ void Element::dispatchAttrRemovalEvent(Attribute*)
void Element::dispatchAttrAdditionEvent(Attribute*)
{
ASSERT(!eventDispatchForbidden());
+
+#if ENABLE(INSPECTOR)
+ if (Page* page = document()->page()) {
+ if (InspectorController* inspectorController = page->inspectorController())
+ inspectorController->didModifyDOMAttr(this);
+ }
+#endif
+
#if 0
if (!document()->hasListenerType(Document::DOMATTRMODIFIED_LISTENER))
return;
diff --git a/WebCore/inspector/InspectorController.cpp b/WebCore/inspector/InspectorController.cpp
index c84a415..ccd9be1 100644
--- a/WebCore/inspector/InspectorController.cpp
+++ b/WebCore/inspector/InspectorController.cpp
@@ -1874,6 +1874,24 @@ void InspectorController::deleteCookie(const String& cookieName, const String& d
}
}
+void InspectorController::didInsertDOMNode(Node* node)
+{
+ if (m_domAgent)
+ m_domAgent->didInsertDOMNode(node);
+}
+
+void InspectorController::didRemoveDOMNode(Node* node)
+{
+ if (m_domAgent)
+ m_domAgent->didRemoveDOMNode(node);
+}
+
+void InspectorController::didModifyDOMAttr(Element* element)
+{
+ if (m_domAgent)
+ m_domAgent->didModifyDOMAttr(element);
+}
+
} // namespace WebCore
#endif // ENABLE(INSPECTOR)
diff --git a/WebCore/inspector/InspectorController.h b/WebCore/inspector/InspectorController.h
index 18a191d..3eeeafb 100644
--- a/WebCore/inspector/InspectorController.h
+++ b/WebCore/inspector/InspectorController.h
@@ -60,6 +60,7 @@ class CachedResource;
class Database;
class Document;
class DocumentLoader;
+class Element;
class GraphicsContext;
class HitTestResult;
class InjectedScriptHost;
@@ -187,6 +188,10 @@ public:
void mainResourceFiredLoadEvent(DocumentLoader*, const KURL&);
void mainResourceFiredDOMContentEvent(DocumentLoader*, const KURL&);
+
+ void didInsertDOMNode(Node*);
+ void didRemoveDOMNode(Node*);
+ void didModifyDOMAttr(Element*);
void getCookies(long callId);
diff --git a/WebCore/inspector/InspectorDOMAgent.cpp b/WebCore/inspector/InspectorDOMAgent.cpp
index 9632806..8b0b6f8 100644
--- a/WebCore/inspector/InspectorDOMAgent.cpp
+++ b/WebCore/inspector/InspectorDOMAgent.cpp
@@ -110,9 +110,6 @@ void InspectorDOMAgent::startListening(Document* doc)
return;
doc->addEventListener(eventNames().DOMContentLoadedEvent, this, false);
- doc->addEventListener(eventNames().DOMNodeInsertedEvent, this, false);
- doc->addEventListener(eventNames().DOMNodeRemovedEvent, this, false);
- doc->addEventListener(eventNames().DOMAttrModifiedEvent, this, false);
doc->addEventListener(eventNames().loadEvent, this, true);
m_documents.add(doc);
}
@@ -123,9 +120,6 @@ void InspectorDOMAgent::stopListening(Document* doc)
return;
doc->removeEventListener(eventNames().DOMContentLoadedEvent, this, false);
- doc->removeEventListener(eventNames().DOMNodeInsertedEvent, this, false);
- doc->removeEventListener(eventNames().DOMNodeRemovedEvent, this, false);
- doc->removeEventListener(eventNames().DOMAttrModifiedEvent, this, false);
doc->removeEventListener(eventNames().loadEvent, this, true);
m_documents.remove(doc);
}
@@ -135,56 +129,7 @@ void InspectorDOMAgent::handleEvent(ScriptExecutionContext*, Event* event)
AtomicString type = event->type();
Node* node = event->target()->toNode();
- if (type == eventNames().DOMAttrModifiedEvent) {
- long id = m_documentNodeToIdMap.get(node);
- // If node is not mapped yet -> ignore the event.
- if (!id)
- return;
-
- Element* element = static_cast<Element*>(node);
- m_frontend->attributesUpdated(id, buildArrayForElementAttributes(element));
- } else if (type == eventNames().DOMNodeInsertedEvent) {
- if (isWhitespace(node))
- return;
-
- // We could be attaching existing subtree. Forget the bindings.
- unbind(node, &m_documentNodeToIdMap);
-
- Node* parent = static_cast<MutationEvent*>(event)->relatedNode();
- long parentId = m_documentNodeToIdMap.get(parent);
- // Return if parent is not mapped yet.
- if (!parentId)
- return;
-
- if (!m_childrenRequested.contains(parentId)) {
- // No children are mapped yet -> only notify on changes of hasChildren.
- m_frontend->childNodeCountUpdated(parentId, innerChildNodeCount(parent));
- } else {
- // Children have been requested -> return value of a new child.
- Node* prevSibling = innerPreviousSibling(node);
- long prevId = prevSibling ? m_documentNodeToIdMap.get(prevSibling) : 0;
- ScriptObject value = buildObjectForNode(node, 0, &m_documentNodeToIdMap);
- m_frontend->childNodeInserted(parentId, prevId, value);
- }
- } else if (type == eventNames().DOMNodeRemovedEvent) {
- if (isWhitespace(node))
- return;
-
- Node* parent = static_cast<MutationEvent*>(event)->relatedNode();
- long parentId = m_documentNodeToIdMap.get(parent);
- // If parent is not mapped yet -> ignore the event.
- if (!parentId)
- return;
-
- if (!m_childrenRequested.contains(parentId)) {
- // No children are mapped yet -> only notify on changes of hasChildren.
- if (innerChildNodeCount(parent) == 1)
- m_frontend->childNodeCountUpdated(parentId, 0);
- } else {
- m_frontend->childNodeRemoved(parentId, m_documentNodeToIdMap.get(node));
- }
- unbind(node, &m_documentNodeToIdMap);
- } else if (type == eventNames().DOMContentLoadedEvent) {
+ if (type == eventNames().DOMContentLoadedEvent) {
// Re-push document once it is loaded.
discardBindings();
pushDocumentToFrontend();
@@ -670,6 +615,62 @@ bool InspectorDOMAgent::operator==(const EventListener& listener)
return false;
}
+void InspectorDOMAgent::didInsertDOMNode(Node* node)
+{
+ if (isWhitespace(node))
+ return;
+
+ // We could be attaching existing subtree. Forget the bindings.
+ unbind(node, &m_documentNodeToIdMap);
+
+ Node* parent = node->parentNode();
+ long parentId = m_documentNodeToIdMap.get(parent);
+ // Return if parent is not mapped yet.
+ if (!parentId)
+ return;
+
+ if (!m_childrenRequested.contains(parentId)) {
+ // No children are mapped yet -> only notify on changes of hasChildren.
+ m_frontend->childNodeCountUpdated(parentId, innerChildNodeCount(parent));
+ } else {
+ // Children have been requested -> return value of a new child.
+ Node* prevSibling = innerPreviousSibling(node);
+ long prevId = prevSibling ? m_documentNodeToIdMap.get(prevSibling) : 0;
+ ScriptObject value = buildObjectForNode(node, 0, &m_documentNodeToIdMap);
+ m_frontend->childNodeInserted(parentId, prevId, value);
+ }
+}
+
+void InspectorDOMAgent::didRemoveDOMNode(Node* node)
+{
+ if (isWhitespace(node))
+ return;
+
+ Node* parent = node->parentNode();
+ long parentId = m_documentNodeToIdMap.get(parent);
+ // If parent is not mapped yet -> ignore the event.
+ if (!parentId)
+ return;
+
+ if (!m_childrenRequested.contains(parentId)) {
+ // No children are mapped yet -> only notify on changes of hasChildren.
+ if (innerChildNodeCount(parent) == 1)
+ m_frontend->childNodeCountUpdated(parentId, 0);
+ } else
+ m_frontend->childNodeRemoved(parentId, m_documentNodeToIdMap.get(node));
+ unbind(node, &m_documentNodeToIdMap);
+}
+
+void InspectorDOMAgent::didModifyDOMAttr(Element* element)
+{
+ long id = m_documentNodeToIdMap.get(element);
+ // If node is not mapped yet -> ignore the event.
+ if (!id)
+ return;
+
+ m_frontend->attributesUpdated(id, buildArrayForElementAttributes(element));
+}
+
} // namespace WebCore
#endif // ENABLE(INSPECTOR)
diff --git a/WebCore/inspector/InspectorDOMAgent.h b/WebCore/inspector/InspectorDOMAgent.h
index ae302a8..d7334b7 100644
--- a/WebCore/inspector/InspectorDOMAgent.h
+++ b/WebCore/inspector/InspectorDOMAgent.h
@@ -98,6 +98,10 @@ namespace WebCore {
void setDocument(Document* document);
void releaseDanglingNodes();
+ void didInsertDOMNode(Node*);
+ void didRemoveDOMNode(Node*);
+ void didModifyDOMAttr(Element*);
+
Node* nodeForId(long nodeId);
Node* nodeForPath(const String& path);
long pushNodePathToFrontend(Node* node);
--
WebKit Debian packaging
More information about the Pkg-webkit-commits
mailing list