[SCM] WebKit Debian packaging branch, debian/experimental, updated. upstream/1.3.3-9427-gc2be6fc

commit-queue at webkit.org commit-queue at webkit.org
Wed Dec 22 12:58:48 UTC 2010


The following commit has been merged in the debian/experimental branch:
commit c990326cb011fe6a4aad1755f7fdcb4f4b17f2c7
Author: commit-queue at webkit.org <commit-queue at webkit.org@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Date:   Fri Sep 3 14:01:33 2010 +0000

    2010-09-03  Pavel Podivilov  <podivilov at chromium.org>
    
            Reviewed by Yury Semikhatsky.
    
            Web Inspector: provide more information to front-end when breaking on DOM event
            https://bugs.webkit.org/show_bug.cgi?id=44679
    
            * http/tests/inspector/debugger-test2.js:
            (initialize_DebuggerTest.InspectorTest._pausedScript):
    2010-09-03  Pavel Podivilov  <podivilov at chromium.org>
    
            Reviewed by Yury Semikhatsky.
    
            Web Inspector: provide more information to front-end when breaking on DOM event
            https://bugs.webkit.org/show_bug.cgi?id=44679
    
            * dom/ContainerNode.cpp:
            (WebCore::ContainerNode::insertBefore):
            (WebCore::ContainerNode::parserInsertBefore):
            (WebCore::ContainerNode::replaceChild):
            (WebCore::ContainerNode::appendChild):
            (WebCore::ContainerNode::parserAddChild):
            (WebCore::notifyChildInserted):
            (WebCore::dispatchChildRemovalEvents):
            * dom/Element.cpp:
            (WebCore::Element::setAttribute):
            (WebCore::Element::removeAttribute):
            * inspector/Inspector.idl:
            * inspector/InspectorController.cpp:
            (WebCore::InspectorController::willInsertDOMNodeImpl):
            (WebCore::InspectorController::didInsertDOMNodeImpl):
            (WebCore::InspectorController::willRemoveDOMNodeImpl):
            (WebCore::InspectorController::didRemoveDOMNodeImpl):
            (WebCore::InspectorController::willModifyDOMAttrImpl):
            (WebCore::InspectorController::didModifyDOMAttrImpl):
            * inspector/InspectorController.h:
            (WebCore::InspectorController::willInsertDOMNode):
            (WebCore::InspectorController::didInsertDOMNode):
            (WebCore::InspectorController::willRemoveDOMNode):
            (WebCore::InspectorController::willModifyDOMAttr):
            (WebCore::InspectorController::didModifyDOMAttr):
            (WebCore::InspectorController::inspectorControllerForNode):
            * inspector/InspectorDOMAgent.cpp:
            (WebCore::InspectorDOMAgent::~InspectorDOMAgent):
            (WebCore::InspectorDOMAgent::shouldBreakOnNodeInsertion):
            (WebCore::InspectorDOMAgent::shouldBreakOnNodeRemoval):
            (WebCore::InspectorDOMAgent::shouldBreakOnAttributeModification):
            (WebCore::InspectorDOMAgent::didInsertDOMNode):
            (WebCore::InspectorDOMAgent::didRemoveDOMNode):
            (WebCore::InspectorDOMAgent::didModifyDOMAttr):
            (WebCore::InspectorDOMAgent::createBreakpoint):
            * inspector/InspectorDOMAgent.h:
            * inspector/InspectorDebuggerAgent.cpp:
            (WebCore::InspectorDebuggerAgent::InspectorDebuggerAgent):
            (WebCore::InspectorDebuggerAgent::~InspectorDebuggerAgent):
            (WebCore::InspectorDebuggerAgent::didPause):
            (WebCore::InspectorDebuggerAgent::breakProgram):
            * inspector/InspectorDebuggerAgent.h:
            * inspector/InspectorValues.h:
            (WebCore::InspectorValue::isNull):
            * inspector/front-end/BreakpointsSidebarPane.js:
            (WebInspector.BreakpointItem):
            (WebInspector.BreakpointItem.prototype._enableChanged):
            * inspector/front-end/Script.js:
            (WebInspector.Script.prototype.get linesCount):
            * inspector/front-end/inspector.js:
            (WebInspector.pausedScript):
    
    git-svn-id: http://svn.webkit.org/repository/webkit/trunk@66730 268f45cc-cd09-0410-ab3c-d52691b4dbfc

diff --git a/LayoutTests/ChangeLog b/LayoutTests/ChangeLog
index 47a7f77..886cf7c 100644
--- a/LayoutTests/ChangeLog
+++ b/LayoutTests/ChangeLog
@@ -1,3 +1,13 @@
+2010-09-03  Pavel Podivilov  <podivilov at chromium.org>
+
+        Reviewed by Yury Semikhatsky.
+
+        Web Inspector: provide more information to front-end when breaking on DOM event
+        https://bugs.webkit.org/show_bug.cgi?id=44679
+
+        * http/tests/inspector/debugger-test2.js:
+        (initialize_DebuggerTest.InspectorTest._pausedScript):
+
 2010-09-03  Jeremy Orlow  <jorlow at chromium.org>
 
         Reviewed by Steve Block.
diff --git a/LayoutTests/http/tests/inspector/debugger-test2.js b/LayoutTests/http/tests/inspector/debugger-test2.js
index 80b98a6..6c19ff9 100644
--- a/LayoutTests/http/tests/inspector/debugger-test2.js
+++ b/LayoutTests/http/tests/inspector/debugger-test2.js
@@ -89,10 +89,10 @@ InspectorTest.captureStackTrace = function(callFrames)
     }
 };
 
-InspectorTest._pausedScript = function(callFrames)
+InspectorTest._pausedScript = function(details)
 {
     InspectorTest.addResult("Script execution paused.");
-    InspectorTest._callFrames = callFrames;
+    InspectorTest._callFrames = details.callFrames;
     if (InspectorTest._waitUntilPausedCallback) {
         var callback = InspectorTest._waitUntilPausedCallback;
         delete InspectorTest._waitUntilPausedCallback;
diff --git a/WebCore/ChangeLog b/WebCore/ChangeLog
index 7bf67b9..9e6ea89 100644
--- a/WebCore/ChangeLog
+++ b/WebCore/ChangeLog
@@ -1,3 +1,62 @@
+2010-09-03  Pavel Podivilov  <podivilov at chromium.org>
+
+        Reviewed by Yury Semikhatsky.
+
+        Web Inspector: provide more information to front-end when breaking on DOM event
+        https://bugs.webkit.org/show_bug.cgi?id=44679
+
+        * dom/ContainerNode.cpp:
+        (WebCore::ContainerNode::insertBefore):
+        (WebCore::ContainerNode::parserInsertBefore):
+        (WebCore::ContainerNode::replaceChild):
+        (WebCore::ContainerNode::appendChild):
+        (WebCore::ContainerNode::parserAddChild):
+        (WebCore::notifyChildInserted):
+        (WebCore::dispatchChildRemovalEvents):
+        * dom/Element.cpp:
+        (WebCore::Element::setAttribute):
+        (WebCore::Element::removeAttribute):
+        * inspector/Inspector.idl:
+        * inspector/InspectorController.cpp:
+        (WebCore::InspectorController::willInsertDOMNodeImpl):
+        (WebCore::InspectorController::didInsertDOMNodeImpl):
+        (WebCore::InspectorController::willRemoveDOMNodeImpl):
+        (WebCore::InspectorController::didRemoveDOMNodeImpl):
+        (WebCore::InspectorController::willModifyDOMAttrImpl):
+        (WebCore::InspectorController::didModifyDOMAttrImpl):
+        * inspector/InspectorController.h:
+        (WebCore::InspectorController::willInsertDOMNode):
+        (WebCore::InspectorController::didInsertDOMNode):
+        (WebCore::InspectorController::willRemoveDOMNode):
+        (WebCore::InspectorController::willModifyDOMAttr):
+        (WebCore::InspectorController::didModifyDOMAttr):
+        (WebCore::InspectorController::inspectorControllerForNode):
+        * inspector/InspectorDOMAgent.cpp:
+        (WebCore::InspectorDOMAgent::~InspectorDOMAgent):
+        (WebCore::InspectorDOMAgent::shouldBreakOnNodeInsertion):
+        (WebCore::InspectorDOMAgent::shouldBreakOnNodeRemoval):
+        (WebCore::InspectorDOMAgent::shouldBreakOnAttributeModification):
+        (WebCore::InspectorDOMAgent::didInsertDOMNode):
+        (WebCore::InspectorDOMAgent::didRemoveDOMNode):
+        (WebCore::InspectorDOMAgent::didModifyDOMAttr):
+        (WebCore::InspectorDOMAgent::createBreakpoint):
+        * inspector/InspectorDOMAgent.h:
+        * inspector/InspectorDebuggerAgent.cpp:
+        (WebCore::InspectorDebuggerAgent::InspectorDebuggerAgent):
+        (WebCore::InspectorDebuggerAgent::~InspectorDebuggerAgent):
+        (WebCore::InspectorDebuggerAgent::didPause):
+        (WebCore::InspectorDebuggerAgent::breakProgram):
+        * inspector/InspectorDebuggerAgent.h:
+        * inspector/InspectorValues.h:
+        (WebCore::InspectorValue::isNull):
+        * inspector/front-end/BreakpointsSidebarPane.js:
+        (WebInspector.BreakpointItem):
+        (WebInspector.BreakpointItem.prototype._enableChanged):
+        * inspector/front-end/Script.js:
+        (WebInspector.Script.prototype.get linesCount):
+        * inspector/front-end/inspector.js:
+        (WebInspector.pausedScript):
+
 2010-08-31  Jeremy Orlow  <jorlow at chromium.org>
 
         Reviewed by Steve Block.
diff --git a/WebCore/dom/ContainerNode.cpp b/WebCore/dom/ContainerNode.cpp
index 064d4e5..46de749 100644
--- a/WebCore/dom/ContainerNode.cpp
+++ b/WebCore/dom/ContainerNode.cpp
@@ -151,6 +151,8 @@ bool ContainerNode::insertBefore(PassRefPtr<Node> newChild, Node* refChild, Exce
         if (child->parentNode())
             break;
 
+        InspectorController::willInsertDOMNode(child, this);
+
         insertBeforeCommon(next.get(), child);
 
         // Send notification about the children change.
@@ -218,6 +220,8 @@ void ContainerNode::parserInsertBefore(PassRefPtr<Node> newChild, Node* nextChil
     for (NodeVector::const_iterator it = targets.begin(); it != targets.end(); ++it) {
         Node* child = it->get();
 
+        InspectorController::willInsertDOMNode(child, this);
+
         insertBeforeCommon(next.get(), child);
 
         childrenChanged(true, nextChildPreviousSibling.get(), nextChild, 1);
@@ -291,6 +295,8 @@ bool ContainerNode::replaceChild(PassRefPtr<Node> newChild, Node* oldChild, Exce
         ASSERT(!child->nextSibling());
         ASSERT(!child->previousSibling());
 
+        InspectorController::willInsertDOMNode(child.get(), this);
+
         // Add child after "prev".
         forbidEventDispatch();
         Node* next;
@@ -572,6 +578,8 @@ bool ContainerNode::appendChild(PassRefPtr<Node> newChild, ExceptionCode& ec, bo
                 break;
         }
 
+        InspectorController::willInsertDOMNode(child, this);
+
         // Append child to the end of the list
         forbidEventDispatch();
         child->setParent(this);
@@ -610,6 +618,8 @@ void ContainerNode::parserAddChild(PassRefPtr<Node> newChild)
     ASSERT(newChild);
     ASSERT(!newChild->parent()); // Use appendChild if you need to handle reparenting (and want DOM mutation events).
 
+    InspectorController::willInsertDOMNode(newChild.get(), this);
+
     forbidEventDispatch();
     Node* last = m_lastChild;
     // FIXME: This method should take a PassRefPtr.
@@ -981,12 +991,7 @@ static void notifyChildInserted(Node* child)
 {
     ASSERT(!eventDispatchForbidden());
 
-#if ENABLE(INSPECTOR)
-    if (Page* page = child->document()->page()) {
-        if (InspectorController* inspectorController = page->inspectorController())
-            inspectorController->didInsertDOMNode(child);
-    }
-#endif
+    InspectorController::didInsertDOMNode(child);
 
     RefPtr<Node> c = child;
     RefPtr<Document> document = child->document();
@@ -1020,12 +1025,7 @@ static void dispatchChildRemovalEvents(Node* child)
 {
     ASSERT(!eventDispatchForbidden());
 
-#if ENABLE(INSPECTOR)    
-    if (Page* page = child->document()->page()) {
-        if (InspectorController* inspectorController = page->inspectorController())
-            inspectorController->didRemoveDOMNode(child);
-    }
-#endif
+    InspectorController::willRemoveDOMNode(child);
 
     RefPtr<Node> c = child;
     RefPtr<Document> document = child->document();
diff --git a/WebCore/dom/Element.cpp b/WebCore/dom/Element.cpp
index 1855101..7c888bc 100644
--- a/WebCore/dom/Element.cpp
+++ b/WebCore/dom/Element.cpp
@@ -540,6 +540,11 @@ void Element::setAttribute(const AtomicString& name, const AtomicString& value,
         return;
     }
 
+#if ENABLE(INSPECTOR)
+    if (!isSynchronizingStyleAttribute())
+        InspectorController::willModifyDOMAttr(this);
+#endif
+
     const AtomicString& localName = shouldIgnoreAttributeCase(this) ? name.lower() : name;
 
     // Allocate attribute map if necessary.
@@ -563,17 +568,18 @@ void Element::setAttribute(const AtomicString& name, const AtomicString& value,
     }
 
 #if ENABLE(INSPECTOR)
-    if (Page* page = document()->page()) {
-        if (InspectorController* inspectorController = page->inspectorController()) {
-            if (!isSynchronizingStyleAttribute())
-                inspectorController->didModifyDOMAttr(this);
-        }
-    }
+    if (!isSynchronizingStyleAttribute())
+        InspectorController::didModifyDOMAttr(this);
 #endif
 }
 
 void Element::setAttribute(const QualifiedName& name, const AtomicString& value, ExceptionCode&)
 {
+#if ENABLE(INSPECTOR)
+    if (!isSynchronizingStyleAttribute())
+        InspectorController::willModifyDOMAttr(this);
+#endif
+
     document()->incDOMTreeVersion();
 
     // Allocate attribute map if necessary.
@@ -592,12 +598,8 @@ void Element::setAttribute(const QualifiedName& name, const AtomicString& value,
     }
 
 #if ENABLE(INSPECTOR)
-    if (Page* page = document()->page()) {
-        if (InspectorController* inspectorController = page->inspectorController()) {
-            if (!isSynchronizingStyleAttribute())
-                inspectorController->didModifyDOMAttr(this);
-        }
-    }
+    if (!isSynchronizingStyleAttribute())
+        InspectorController::didModifyDOMAttr(this);
 #endif
 }
 
@@ -1228,6 +1230,8 @@ void Element::setAttributeNS(const AtomicString& namespaceURI, const AtomicStrin
 
 void Element::removeAttribute(const String& name, ExceptionCode& ec)
 {
+    InspectorController::willModifyDOMAttr(this);
+
     String localName = shouldIgnoreAttributeCase(this) ? name.lower() : name;
 
     if (m_attributeMap) {
@@ -1236,13 +1240,7 @@ void Element::removeAttribute(const String& name, ExceptionCode& ec)
             ec = 0;
     }
     
-#if ENABLE(INSPECTOR)
-    if (Page* page = document()->page()) {
-        if (InspectorController* inspectorController = page->inspectorController())
-            inspectorController->didModifyDOMAttr(this);
-    }
-#endif
-    
+    InspectorController::didModifyDOMAttr(this);
 }
 
 void Element::removeAttributeNS(const String& namespaceURI, const String& localName, ExceptionCode& ec)
diff --git a/WebCore/inspector/Inspector.idl b/WebCore/inspector/Inspector.idl
index 1f034b2..169b188 100644
--- a/WebCore/inspector/Inspector.idl
+++ b/WebCore/inspector/Inspector.idl
@@ -72,7 +72,7 @@ module core {
         [notify] void debuggerWasDisabled();
         [notify] void failedToParseScriptSource(out String url, out String data, out int firstLine, out int errorLine, out String errorMessage);
         [notify] void parsedScriptSource(out String sourceID, out String url, out String data, out int firstLine, out int scriptWorldType);
-        [notify] void pausedScript(out Value callFrames);
+        [notify] void pausedScript(out Object details);
         [notify] void profilerWasEnabled();
         [notify] void profilerWasDisabled();
         [notify] void restoredBreakpoint(out String sourceID, out String url, out int line, out boolean enabled, out String condition);
diff --git a/WebCore/inspector/InspectorController.cpp b/WebCore/inspector/InspectorController.cpp
index b9c11c7..1e131f7 100644
--- a/WebCore/inspector/InspectorController.cpp
+++ b/WebCore/inspector/InspectorController.cpp
@@ -59,11 +59,12 @@
 #include "InspectorBackendDispatcher.h"
 #include "InspectorCSSStore.h"
 #include "InspectorClient.h"
-#include "InspectorFrontend.h"
-#include "InspectorFrontendClient.h"
+#include "InspectorDOMAgent.h"
 #include "InspectorDOMStorageResource.h"
 #include "InspectorDatabaseResource.h"
 #include "InspectorDebuggerAgent.h"
+#include "InspectorFrontend.h"
+#include "InspectorFrontendClient.h"
 #include "InspectorProfilerAgent.h"
 #include "InspectorResource.h"
 #include "InspectorStorageAgent.h"
@@ -1844,6 +1845,58 @@ void InspectorController::reloadPage()
     m_inspectedPage->mainFrame()->redirectScheduler()->scheduleRefresh(true);
 }
 
+void InspectorController::willInsertDOMNodeImpl(Node* node, Node* parent)
+{
+#if ENABLE(JAVASCRIPT_DEBUGGER)
+    if (!m_debuggerAgent || !m_domAgent)
+        return;
+    PassRefPtr<InspectorValue> details;
+    if (m_domAgent->shouldBreakOnNodeInsertion(node, parent, &details))
+        m_debuggerAgent->breakProgram(details);
+#endif
+}
+
+void InspectorController::didInsertDOMNodeImpl(Node* node)
+{
+    if (m_domAgent)
+        m_domAgent->didInsertDOMNode(node);
+}
+
+void InspectorController::willRemoveDOMNodeImpl(Node* node)
+{
+#if ENABLE(JAVASCRIPT_DEBUGGER)
+    if (!m_debuggerAgent || !m_domAgent)
+        return;
+    PassRefPtr<InspectorValue> details;
+    if (m_domAgent->shouldBreakOnNodeRemoval(node, &details))
+        m_debuggerAgent->breakProgram(details);
+#endif
+}
+
+void InspectorController::didRemoveDOMNodeImpl(Node* node)
+{
+    if (m_domAgent)
+        m_domAgent->didRemoveDOMNode(node);
+}
+
+void InspectorController::willModifyDOMAttrImpl(Element* element)
+{
+#if ENABLE(JAVASCRIPT_DEBUGGER)
+    if (!m_debuggerAgent || !m_domAgent)
+        return;
+    PassRefPtr<InspectorValue> details;
+    if (m_domAgent->shouldBreakOnAttributeModification(element, &details))
+        m_debuggerAgent->breakProgram(details);
+#endif
+}
+
+void InspectorController::didModifyDOMAttrImpl(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 7ed2549..2368a1e 100644
--- a/WebCore/inspector/InspectorController.h
+++ b/WebCore/inspector/InspectorController.h
@@ -31,7 +31,8 @@
 
 #include "Console.h"
 #include "Cookie.h"
-#include "InspectorDOMAgent.h"
+#include "Element.h"
+#include "Page.h"
 #include "PlatformString.h"
 #include "ScriptState.h"
 #include <wtf/HashMap.h>
@@ -58,6 +59,7 @@ class InspectorBackend;
 class InspectorBackendDispatcher;
 class InspectorClient;
 class InspectorCSSStore;
+class InspectorDOMAgent;
 class InspectorDOMStorageResource;
 class InspectorDatabaseResource;
 class InspectorDebuggerAgent;
@@ -183,9 +185,12 @@ public:
     void mainResourceFiredLoadEvent(DocumentLoader*, const KURL&);
     void mainResourceFiredDOMContentEvent(DocumentLoader*, const KURL&);
 
-    void didInsertDOMNode(Node*);
-    void didRemoveDOMNode(Node*);
-    void didModifyDOMAttr(Element*);
+    static void willInsertDOMNode(Node* node, Node* parent);
+    static void didInsertDOMNode(Node*);
+    static void willRemoveDOMNode(Node*);
+    static void willModifyDOMAttr(Element*);
+    static void didModifyDOMAttr(Element*);
+
 #if ENABLE(WORKERS)
     enum WorkerAction { WorkerCreated, WorkerDestroyed };
 
@@ -306,6 +311,14 @@ private:
 
     void didEvaluateForTestInFrontend(long callId, const String& jsonResult);
 
+    static InspectorController* inspectorControllerForNode(Node*);
+    void willInsertDOMNodeImpl(Node* node, Node* parent);
+    void didInsertDOMNodeImpl(Node*);
+    void willRemoveDOMNodeImpl(Node*);
+    void didRemoveDOMNodeImpl(Node*);
+    void willModifyDOMAttrImpl(Element*);
+    void didModifyDOMAttrImpl(Element*);
+
 #if ENABLE(JAVASCRIPT_DEBUGGER)
     friend class InspectorDebuggerAgent;
     String breakpointsSettingKey();
@@ -376,30 +389,59 @@ private:
 #endif
 };
 
+inline void InspectorController::willInsertDOMNode(Node* node, Node* parent)
+{
+#if ENABLE(INSPECTOR)
+    if (InspectorController* inspectorController = inspectorControllerForNode(parent))
+        inspectorController->willInsertDOMNodeImpl(node, parent);
+#endif
+}
+
 inline void InspectorController::didInsertDOMNode(Node* node)
 {
 #if ENABLE(INSPECTOR)
-    if (m_domAgent)
-        m_domAgent->didInsertDOMNode(node);
+    if (InspectorController* inspectorController = inspectorControllerForNode(node))
+        inspectorController->didInsertDOMNodeImpl(node);
 #endif
 }
 
-inline void InspectorController::didRemoveDOMNode(Node* node)
+inline void InspectorController::willRemoveDOMNode(Node* node)
 {
 #if ENABLE(INSPECTOR)
-    if (m_domAgent)
-        m_domAgent->didRemoveDOMNode(node);
+    if (InspectorController* inspectorController = inspectorControllerForNode(node)) {
+        inspectorController->willRemoveDOMNodeImpl(node);
+        inspectorController->didRemoveDOMNodeImpl(node);
+    }
+#endif
+}
+
+inline void InspectorController::willModifyDOMAttr(Element* element)
+{
+#if ENABLE(INSPECTOR)
+    if (InspectorController* inspectorController = inspectorControllerForNode(element))
+        inspectorController->willModifyDOMAttrImpl(element);
 #endif
 }
 
 inline void InspectorController::didModifyDOMAttr(Element* element)
 {
 #if ENABLE(INSPECTOR)
-    if (m_domAgent)
-        m_domAgent->didModifyDOMAttr(element);
+    if (InspectorController* inspectorController = inspectorControllerForNode(element))
+        inspectorController->didModifyDOMAttrImpl(element);
 #endif
 }
 
+inline InspectorController* InspectorController::inspectorControllerForNode(Node* node)
+{
+    if (Page* page = node->document()->page()) {
+        if (InspectorController* inspectorController = page->inspectorController()) {
+            if (inspectorController->hasFrontend())
+                return inspectorController;
+        }
+    }
+    return 0;
+}
+
 } // namespace WebCore
 
 #endif // !defined(InspectorController_h)
diff --git a/WebCore/inspector/InspectorDOMAgent.cpp b/WebCore/inspector/InspectorDOMAgent.cpp
index d2760e4..23c22aa 100644
--- a/WebCore/inspector/InspectorDOMAgent.cpp
+++ b/WebCore/inspector/InspectorDOMAgent.cpp
@@ -64,7 +64,6 @@
 #include "PlatformString.h"
 #include "RenderStyle.h"
 #include "RenderStyleConstants.h"
-#include "ScriptDebugServer.h"
 #include "ScriptEventListener.h"
 #include "StyleSheetList.h"
 #include "Text.h"
@@ -210,8 +209,6 @@ const int domBreakpointDerivedTypeShift = 16;
 
 }
 
-InspectorDOMAgent* InspectorDOMAgent::s_domAgentOnBreakpoint = 0;
-
 InspectorDOMAgent::InspectorDOMAgent(InspectorCSSStore* cssStore, InspectorFrontend* frontend)
     : EventListener(InspectorDOMAgentType)
     , m_cssStore(cssStore)
@@ -224,9 +221,6 @@ InspectorDOMAgent::InspectorDOMAgent(InspectorCSSStore* cssStore, InspectorFront
 InspectorDOMAgent::~InspectorDOMAgent()
 {
     reset();
-
-    if (this == s_domAgentOnBreakpoint)
-        s_domAgentOnBreakpoint = 0;
 }
 
 void InspectorDOMAgent::reset()
@@ -780,6 +774,42 @@ void InspectorDOMAgent::removeDOMBreakpoint(long nodeId, long type)
     }
 }
 
+bool InspectorDOMAgent::shouldBreakOnNodeInsertion(Node*, Node* parent, PassRefPtr<InspectorValue>* details)
+{
+    if (!hasBreakpoint(parent, SubtreeModified))
+        return false;
+    RefPtr<InspectorObject> detailsObject = InspectorObject::create();
+    detailsObject->setObject("breakpoint", createBreakpoint(parent, SubtreeModified));
+    *details = detailsObject;
+    return true;
+}
+
+bool InspectorDOMAgent::shouldBreakOnNodeRemoval(Node* node, PassRefPtr<InspectorValue>* details)
+{
+    bool hasNodeRemovedBreakpoint = hasBreakpoint(node, NodeRemoved);
+    bool hasAnyBreakpoint = hasNodeRemovedBreakpoint || hasBreakpoint(innerParentNode(node), SubtreeModified);
+    if (!hasAnyBreakpoint)
+        return false;
+
+    RefPtr<InspectorObject> detailsObject = InspectorObject::create();
+    if (hasNodeRemovedBreakpoint)
+        detailsObject->setObject("breakpoint", createBreakpoint(node, NodeRemoved));
+    else
+        detailsObject->setObject("breakpoint", createBreakpoint(innerParentNode(node), SubtreeModified));
+    *details = detailsObject;
+    return true;
+}
+
+bool InspectorDOMAgent::shouldBreakOnAttributeModification(Element* element, PassRefPtr<InspectorValue>* details)
+{
+    if (!hasBreakpoint(element, AttributeModified))
+        return false;
+    RefPtr<InspectorObject> detailsObject = InspectorObject::create();
+    detailsObject->setObject("breakpoint", createBreakpoint(element, AttributeModified));
+    *details = detailsObject;
+    return true;
+}
+
 String InspectorDOMAgent::documentURLString(Document* document) const
 {
     if (!document || document->url().isNull())
@@ -985,12 +1015,7 @@ void InspectorDOMAgent::didInsertDOMNode(Node* node)
         return;
 
     if (m_breakpoints.size()) {
-        Node* parent = innerParentNode(node);
-        if (hasBreakpoint(parent, SubtreeModified)) {
-            if (!pauseOnBreakpoint())
-                return;
-        }
-        uint32_t mask = m_breakpoints.get(parent);
+        uint32_t mask = m_breakpoints.get(innerParentNode(node));
         uint32_t inheritableTypesMask = (mask | (mask >> domBreakpointDerivedTypeShift)) & inheritableDOMBreakpointTypesMask;
         if (inheritableTypesMask)
             updateSubtreeBreakpoints(node, inheritableTypesMask, true);
@@ -1023,10 +1048,6 @@ void InspectorDOMAgent::didRemoveDOMNode(Node* node)
         return;
 
     if (m_breakpoints.size()) {
-        if (hasBreakpoint(node, NodeRemoved) || hasBreakpoint(innerParentNode(node), SubtreeModified)) {
-            if (!pauseOnBreakpoint())
-                return;
-        }
         // Remove subtree breakpoints.
         m_breakpoints.remove(node);
         Vector<Node*> stack(1, innerFirstChild(node));
@@ -1063,12 +1084,24 @@ void InspectorDOMAgent::didModifyDOMAttr(Element* element)
     if (!id)
         return;
 
-    if (hasBreakpoint(element, AttributeModified)) {
-        if (!pauseOnBreakpoint())
-            return;
+    m_frontend->attributesUpdated(id, buildArrayForElementAttributes(element));
+}
+
+PassRefPtr<InspectorObject> InspectorDOMAgent::createBreakpoint(Node* node, long type)
+{
+    RefPtr<InspectorObject> breakpoint = InspectorObject::create();
+
+    // Find breakpoint owner.
+    while (!(m_breakpoints.get(node) & (1 << type))) {
+        node = innerParentNode(node);
+        ASSERT(node);
     }
+    long nodeId = m_documentNodeToIdMap.get(node);
+    ASSERT(nodeId);
 
-    m_frontend->attributesUpdated(id, buildArrayForElementAttributes(element));
+    breakpoint->setNumber("nodeId", nodeId);
+    breakpoint->setNumber("type", type);
+    return breakpoint.release();
 }
 
 bool InspectorDOMAgent::hasBreakpoint(Node* node, long type)
@@ -1078,19 +1111,6 @@ bool InspectorDOMAgent::hasBreakpoint(Node* node, long type)
     return m_breakpoints.get(node) & (rootBit | derivedBit);
 }
 
-bool InspectorDOMAgent::pauseOnBreakpoint()
-{
-#if ENABLE(JAVASCRIPT_DEBUGGER)
-    s_domAgentOnBreakpoint = this;
-    ScriptDebugServer::shared().breakProgram();
-    bool deleted = !s_domAgentOnBreakpoint;
-    s_domAgentOnBreakpoint = 0;
-    return !deleted;
-#else
-    return true;
-#endif
-}
-
 void InspectorDOMAgent::updateSubtreeBreakpoints(Node* node, uint32_t rootMask, bool set)
 {
     uint32_t oldMask = m_breakpoints.get(node);
diff --git a/WebCore/inspector/InspectorDOMAgent.h b/WebCore/inspector/InspectorDOMAgent.h
index fd3c5b5..9751e8e 100644
--- a/WebCore/inspector/InspectorDOMAgent.h
+++ b/WebCore/inspector/InspectorDOMAgent.h
@@ -36,7 +36,6 @@
 #include "InspectorCSSStore.h"
 #include "InspectorValues.h"
 #include "NodeList.h"
-#include "ScriptState.h"
 #include "Timer.h"
 
 #include <wtf/Deque.h>
@@ -114,6 +113,9 @@ namespace WebCore {
         void searchCanceled();
         void setDOMBreakpoint(long nodeId, long type);
         void removeDOMBreakpoint(long nodeId, long type);
+        bool shouldBreakOnNodeInsertion(Node* node, Node* parent, PassRefPtr<InspectorValue>* details);
+        bool shouldBreakOnNodeRemoval(Node* node, PassRefPtr<InspectorValue>* details);
+        bool shouldBreakOnAttributeModification(Element* element, PassRefPtr<InspectorValue>* details);
 
         // Methods called from the frontend for CSS styles inspection.
         void getStyles(long nodeId, bool authorOnly, RefPtr<InspectorValue>* styles);
@@ -160,7 +162,7 @@ namespace WebCore {
         bool pushDocumentToFrontend();
 
         bool hasBreakpoint(Node* node, long type);
-        bool pauseOnBreakpoint();
+        PassRefPtr<InspectorObject> createBreakpoint(Node* node, long type);
         void updateSubtreeBreakpoints(Node* root, uint32_t rootMask, bool value);
 
         PassRefPtr<InspectorObject> buildObjectForAttributeStyles(Element* element);
@@ -217,8 +219,6 @@ namespace WebCore {
         HashSet<RefPtr<Node> > m_searchResults;
         Vector<long> m_inspectedNodes;
         HashMap<Node*, uint32_t> m_breakpoints;
-
-        static InspectorDOMAgent* s_domAgentOnBreakpoint;
     };
 
 #endif
diff --git a/WebCore/inspector/InspectorDebuggerAgent.cpp b/WebCore/inspector/InspectorDebuggerAgent.cpp
index 357a043..fd9fdf3 100644
--- a/WebCore/inspector/InspectorDebuggerAgent.cpp
+++ b/WebCore/inspector/InspectorDebuggerAgent.cpp
@@ -56,11 +56,14 @@ PassOwnPtr<InspectorDebuggerAgent> InspectorDebuggerAgent::create(InspectorContr
     return agent.release();
 }
 
+InspectorDebuggerAgent* InspectorDebuggerAgent::s_debuggerAgentOnBreakpoint = 0;
+
 InspectorDebuggerAgent::InspectorDebuggerAgent(InspectorController* inspectorController, InspectorFrontend* frontend)
     : m_inspectorController(inspectorController)
     , m_frontend(frontend)
     , m_pausedScriptState(0)
     , m_breakpointsLoaded(false)
+    , m_breakProgramReason(InspectorValue::null())
 {
 }
 
@@ -68,6 +71,9 @@ InspectorDebuggerAgent::~InspectorDebuggerAgent()
 {
     ScriptDebugServer::shared().removeListener(this, m_inspectorController->inspectedPage());
     m_pausedScriptState = 0;
+
+    if (this == s_debuggerAgentOnBreakpoint)
+        s_debuggerAgentOnBreakpoint = 0;
 }
 
 bool InspectorDebuggerAgent::isDebuggerAlwaysEnabled()
@@ -282,9 +288,12 @@ void InspectorDebuggerAgent::failedToParseSource(const String& url, const String
 void InspectorDebuggerAgent::didPause(ScriptState* scriptState)
 {
     ASSERT(scriptState && !m_pausedScriptState);
+    ASSERT(m_breakProgramReason);
     m_pausedScriptState = scriptState;
-    RefPtr<InspectorValue> callFrames = currentCallFrames();
-    m_frontend->pausedScript(callFrames.get());
+    RefPtr<InspectorObject> details = InspectorObject::create();
+    details->setValue("callFrames", currentCallFrames());
+    details->setValue("reason", m_breakProgramReason);
+    m_frontend->pausedScript(details);
 }
 
 void InspectorDebuggerAgent::didContinue()
@@ -293,6 +302,19 @@ void InspectorDebuggerAgent::didContinue()
     m_frontend->resumedScript();
 }
 
+void InspectorDebuggerAgent::breakProgram(PassRefPtr<InspectorValue> reason)
+{
+    s_debuggerAgentOnBreakpoint = this;
+    m_breakProgramReason = reason;
+
+    ScriptDebugServer::shared().breakProgram();
+    if (!s_debuggerAgentOnBreakpoint)
+        return;
+
+    s_debuggerAgentOnBreakpoint = 0;
+    m_breakProgramReason = InspectorValue::null();
+}
+
 } // namespace WebCore
 
 #endif // ENABLE(JAVASCRIPT_DEBUGGER)
diff --git a/WebCore/inspector/InspectorDebuggerAgent.h b/WebCore/inspector/InspectorDebuggerAgent.h
index 91bcd49..79b0a0e 100644
--- a/WebCore/inspector/InspectorDebuggerAgent.h
+++ b/WebCore/inspector/InspectorDebuggerAgent.h
@@ -61,6 +61,7 @@ public:
     void getScriptSource(const String& sourceID, String* scriptSource);
 
     void pause();
+    void breakProgram(PassRefPtr<InspectorValue> reason);
     void resume();
     void stepOverStatement();
     void stepIntoStatement();
@@ -93,6 +94,8 @@ private:
     HashMap<String, SourceBreakpoints> m_stickyBreakpoints;
     HashMap<String, unsigned> m_breakpointsMapping;
     bool m_breakpointsLoaded;
+    static InspectorDebuggerAgent* s_debuggerAgentOnBreakpoint;
+    RefPtr<InspectorValue> m_breakProgramReason;
 };
 
 } // namespace WebCore
diff --git a/WebCore/inspector/InspectorValues.h b/WebCore/inspector/InspectorValues.h
index 3dd9594..4036f55 100644
--- a/WebCore/inspector/InspectorValues.h
+++ b/WebCore/inspector/InspectorValues.h
@@ -67,6 +67,8 @@ public:
 
     Type type() const { return m_type; }
 
+    bool isNull() const { return m_type == TypeNull; }
+
     virtual bool asBoolean(bool* output) const;
     virtual bool asNumber(double* output) const;
     virtual bool asNumber(long* output) const;
diff --git a/WebCore/inspector/front-end/BreakpointsSidebarPane.js b/WebCore/inspector/front-end/BreakpointsSidebarPane.js
index 408829d..cda72fb 100644
--- a/WebCore/inspector/front-end/BreakpointsSidebarPane.js
+++ b/WebCore/inspector/front-end/BreakpointsSidebarPane.js
@@ -106,7 +106,7 @@ WebInspector.BreakpointItem = function(breakpoint)
     this._element.appendChild(checkboxElement);
 
     this._breakpoint.addEventListener("enable-changed", this._enableChanged, this);
-    this._breakpoint.addEventListener("removed", this._removed, this);
+    this._breakpoint.addEventListener("removed", this.dispatchEventToListeners.bind(this, "removed"));
 }
 
 WebInspector.BreakpointItem.prototype = {
@@ -128,15 +128,10 @@ WebInspector.BreakpointItem.prototype = {
         event.stopPropagation();
     },
 
-    _enableChanged: function()
+    _enableChanged: function(event)
     {
         var checkbox = this._element.firstChild;
         checkbox.checked = this._breakpoint.enabled;
-    },
-
-    _removed: function()
-    {
-        this.dispatchEventToListeners("removed");
     }
 }
 
diff --git a/WebCore/inspector/front-end/Script.js b/WebCore/inspector/front-end/Script.js
index 42d6850..be3f020 100644
--- a/WebCore/inspector/front-end/Script.js
+++ b/WebCore/inspector/front-end/Script.js
@@ -62,11 +62,14 @@ WebInspector.Script.prototype = {
     {
         if (!this.source)
             return 0;
+        if (this._linesCount)
+            return this._linesCount;
         this._linesCount = 0;
         var lastIndex = this.source.indexOf("\n");
         while (lastIndex !== -1) {
             lastIndex = this.source.indexOf("\n", lastIndex + 1)
             this._linesCount++;
         }
+        return this._linesCount;
     }
 }
diff --git a/WebCore/inspector/front-end/inspector.js b/WebCore/inspector/front-end/inspector.js
index 8292f7f..840745f 100644
--- a/WebCore/inspector/front-end/inspector.js
+++ b/WebCore/inspector/front-end/inspector.js
@@ -1445,9 +1445,9 @@ WebInspector.failedToParseScriptSource = function(sourceURL, source, startingLin
     this.panels.scripts.addScript(null, sourceURL, source, startingLine, errorLine, errorMessage);
 }
 
-WebInspector.pausedScript = function(callFrames)
+WebInspector.pausedScript = function(details)
 {
-    this.panels.scripts.debuggerPaused(callFrames);
+    this.panels.scripts.debuggerPaused(details.callFrames);
     InspectorFrontendHost.bringToFront();
 }
 

-- 
WebKit Debian packaging



More information about the Pkg-webkit-commits mailing list