[SCM] WebKit Debian packaging branch, webkit-1.2, updated. upstream/1.1.90-6072-g9a69373

knorton at google.com knorton at google.com
Thu Apr 8 00:59:55 UTC 2010


The following commit has been merged in the webkit-1.2 branch:
commit 0e46061520c4e9bb9fb6a90506d1900bf9251e9c
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