Title: [172204] trunk/Source/WebInspectorUI
Revision
172204
Author
[email protected]
Date
2014-08-06 23:23:14 -0700 (Wed, 06 Aug 2014)

Log Message

Web Inspector: breakpoint resolved state should not depend on all breakpoints being enabled
https://bugs.webkit.org/show_bug.cgi?id=135517

Reviewed by Joseph Pecoraro.

Previously, Breakpoint.resolved returned false if all breakpoints were disabled, even if
the breakpoint had an associated SourceCode. This was a weird hack to make it easier to
style breakpoint widgets. This made it hard for other code to deal with resolved
breakpoints that were also disabled, or SourceCodeLocations that resolve and unresolve.
This patch removes that consideration and fixes style update code to manually check if all
breakpoints are being suppressed.

The code now enforces that a Breakpoint must have a SourceCode before it can be resolved.
(As a performance optimization when loading the initial frame tree, we sometimes we give
Breakpoints a SourceCode before the debugger officially says that the breakpoint has been
resolved. Thus, it's possible to be unresolved with a SourceCode, but not vice-versa.)

This patch also adds a few guards where we assumed a SourceCodeLocation had a SourceCode.

* UserInterface/Controllers/DebuggerManager.js:
(WebInspector.DebuggerManager.prototype.set breakpointsEnabled): Remove spurious
ResolvedStateDidChange events.

(WebInspector.DebuggerManager.prototype.breakpointResolved): Set the breakpoint's SourceCode
if it has not been set already by DebuggerManager.associateBreakpointsWithSourceCode.

* UserInterface/Models/Breakpoint.js:
(WebInspector.Breakpoint.prototype.get resolved):
(WebInspector.Breakpoint.prototype.set resolved.isSpecialBreakpoint):
(WebInspector.Breakpoint.prototype.set resolved): Add an assertion.
* UserInterface/Models/SourceCodeLocation.js: Add guards for !SourceCode.
(WebInspector.SourceCodeLocation.prototype.populateLiveDisplayLocationTooltip):
* UserInterface/Views/BreakpointTreeElement.js: Account for DebuggerManager.breakpointsEnabled.
(WebInspector.BreakpointTreeElement):
(WebInspector.BreakpointTreeElement.prototype._updateStatus):
* UserInterface/Views/ProbeSetDetailsSection.js:
(WebInspector.ProbeSetDetailsSection.prototype._updateLinkElement): Loosen the assertion.
* UserInterface/Views/SourceCodeTextEditor.js: Account for DebuggerManager.breakpointsEnabled.
(WebInspector.SourceCodeTextEditor):
(WebInspector.SourceCodeTextEditor.prototype.close):
(WebInspector.SourceCodeTextEditor.prototype._breakpointStatusDidChange):
(WebInspector.SourceCodeTextEditor.prototype._breakpointsEnabledDidChange):
(WebInspector.SourceCodeTextEditor.prototype._updateBreakpointStatus):
* UserInterface/Views/TextEditor.js: Account for DebuggerManager.breakpointsEnabled.

Modified Paths

Diff

Modified: trunk/Source/WebInspectorUI/ChangeLog (172203 => 172204)


--- trunk/Source/WebInspectorUI/ChangeLog	2014-08-07 06:14:54 UTC (rev 172203)
+++ trunk/Source/WebInspectorUI/ChangeLog	2014-08-07 06:23:14 UTC (rev 172204)
@@ -1,5 +1,52 @@
 2014-08-06  Brian J. Burg  <[email protected]>
 
+        Web Inspector: breakpoint resolved state should not depend on all breakpoints being enabled
+        https://bugs.webkit.org/show_bug.cgi?id=135517
+
+        Reviewed by Joseph Pecoraro.
+
+        Previously, Breakpoint.resolved returned false if all breakpoints were disabled, even if
+        the breakpoint had an associated SourceCode. This was a weird hack to make it easier to
+        style breakpoint widgets. This made it hard for other code to deal with resolved
+        breakpoints that were also disabled, or SourceCodeLocations that resolve and unresolve.
+        This patch removes that consideration and fixes style update code to manually check if all
+        breakpoints are being suppressed.
+
+        The code now enforces that a Breakpoint must have a SourceCode before it can be resolved.
+        (As a performance optimization when loading the initial frame tree, we sometimes we give
+        Breakpoints a SourceCode before the debugger officially says that the breakpoint has been
+        resolved. Thus, it's possible to be unresolved with a SourceCode, but not vice-versa.)
+
+        This patch also adds a few guards where we assumed a SourceCodeLocation had a SourceCode.
+
+        * UserInterface/Controllers/DebuggerManager.js:
+        (WebInspector.DebuggerManager.prototype.set breakpointsEnabled): Remove spurious
+        ResolvedStateDidChange events.
+
+        (WebInspector.DebuggerManager.prototype.breakpointResolved): Set the breakpoint's SourceCode
+        if it has not been set already by DebuggerManager.associateBreakpointsWithSourceCode.
+
+        * UserInterface/Models/Breakpoint.js:
+        (WebInspector.Breakpoint.prototype.get resolved):
+        (WebInspector.Breakpoint.prototype.set resolved.isSpecialBreakpoint):
+        (WebInspector.Breakpoint.prototype.set resolved): Add an assertion.
+        * UserInterface/Models/SourceCodeLocation.js: Add guards for !SourceCode.
+        (WebInspector.SourceCodeLocation.prototype.populateLiveDisplayLocationTooltip):
+        * UserInterface/Views/BreakpointTreeElement.js: Account for DebuggerManager.breakpointsEnabled.
+        (WebInspector.BreakpointTreeElement):
+        (WebInspector.BreakpointTreeElement.prototype._updateStatus):
+        * UserInterface/Views/ProbeSetDetailsSection.js:
+        (WebInspector.ProbeSetDetailsSection.prototype._updateLinkElement): Loosen the assertion.
+        * UserInterface/Views/SourceCodeTextEditor.js: Account for DebuggerManager.breakpointsEnabled.
+        (WebInspector.SourceCodeTextEditor):
+        (WebInspector.SourceCodeTextEditor.prototype.close):
+        (WebInspector.SourceCodeTextEditor.prototype._breakpointStatusDidChange):
+        (WebInspector.SourceCodeTextEditor.prototype._breakpointsEnabledDidChange):
+        (WebInspector.SourceCodeTextEditor.prototype._updateBreakpointStatus):
+        * UserInterface/Views/TextEditor.js: Account for DebuggerManager.breakpointsEnabled.
+
+2014-08-06  Brian J. Burg  <[email protected]>
+
         Web Inspector: ReplayManager should unpause and suppress breakpoints before capturing/replaying
         https://bugs.webkit.org/show_bug.cgi?id=135608
 

Modified: trunk/Source/WebInspectorUI/UserInterface/Controllers/DebuggerManager.js (172203 => 172204)


--- trunk/Source/WebInspectorUI/UserInterface/Controllers/DebuggerManager.js	2014-08-07 06:14:54 UTC (rev 172203)
+++ trunk/Source/WebInspectorUI/UserInterface/Controllers/DebuggerManager.js	2014-08-07 06:23:14 UTC (rev 172204)
@@ -108,12 +108,6 @@
 
         this.dispatchEventToListeners(WebInspector.DebuggerManager.Event.BreakpointsEnabledDidChange);
 
-        this._allExceptionsBreakpoint.dispatchEventToListeners(WebInspector.Breakpoint.Event.ResolvedStateDidChange);
-        this._allUncaughtExceptionsBreakpoint.dispatchEventToListeners(WebInspector.Breakpoint.Event.ResolvedStateDidChange);
-
-        for (var i = 0; i < this._breakpoints.length; ++i)
-            this._breakpoints[i].dispatchEventToListeners(WebInspector.Breakpoint.Event.ResolvedStateDidChange);
-
         DebuggerAgent.setBreakpointsActive(enabled);
 
         this._updateBreakOnExceptionsState();
@@ -311,6 +305,11 @@
 
         console.assert(breakpoint.identifier === breakpointIdentifier);
 
+        if (!breakpoint.sourceCodeLocation.sourceCode) {
+            var sourceCodeLocation = this._sourceCodeLocationFromPayload(location);
+            breakpoint.sourceCodeLocation.sourceCode = sourceCodeLocation.sourceCode;
+        }
+
         breakpoint.resolved = true;
     },
 

Modified: trunk/Source/WebInspectorUI/UserInterface/Models/Breakpoint.js (172203 => 172204)


--- trunk/Source/WebInspectorUI/UserInterface/Models/Breakpoint.js	2014-08-07 06:14:54 UTC (rev 172203)
+++ trunk/Source/WebInspectorUI/UserInterface/Models/Breakpoint.js	2014-08-07 06:23:14 UTC (rev 172204)
@@ -117,7 +117,7 @@
 
     get resolved()
     {
-        return this._resolved && WebInspector.debuggerManager.breakpointsEnabled;
+        return this._resolved;
     },
 
     set resolved(resolved)
@@ -125,6 +125,13 @@
         if (this._resolved === resolved)
             return;
 
+        function isSpecialBreakpoint()
+        {
+            return this._sourceCodeLocation.isEqual(new WebInspector.SourceCodeLocation(null, Infinity, Infinity));
+        }
+
+        console.assert(!resolved || this._sourceCodeLocation.sourceCode || isSpecialBreakpoint.call(this), "Breakpoints must have a SourceCode to be resolved.", this);
+
         this._resolved = resolved || false;
 
         this.dispatchEventToListeners(WebInspector.Breakpoint.Event.ResolvedStateDidChange);

Modified: trunk/Source/WebInspectorUI/UserInterface/Models/SourceCodeLocation.js (172203 => 172204)


--- trunk/Source/WebInspectorUI/UserInterface/Models/SourceCodeLocation.js	2014-08-07 06:14:54 UTC (rev 172203)
+++ trunk/Source/WebInspectorUI/UserInterface/Models/SourceCodeLocation.js	2014-08-07 06:23:14 UTC (rev 172204)
@@ -226,7 +226,8 @@
         element.title = prefix + this.tooltipString();
 
         this.addEventListener(WebInspector.SourceCodeLocation.Event.DisplayLocationChanged, function(event) {
-            element.title = prefix + this.tooltipString();
+            if (this.sourceCode)
+                element.title = prefix + this.tooltipString();
         }, this);
     },
 
@@ -258,7 +259,8 @@
         updateDisplayString.call(this, false);
 
         this.addEventListener(WebInspector.SourceCodeLocation.Event.DisplayLocationChanged, function(event) {
-            updateDisplayString.call(this, currentDisplay, true);
+            if (this.sourceCode)
+                updateDisplayString.call(this, currentDisplay, true);
         }, this);
 
         var boundMouseOverOrMove = mouseOverOrMove.bind(this);

Modified: trunk/Source/WebInspectorUI/UserInterface/Views/BreakpointTreeElement.js (172203 => 172204)


--- trunk/Source/WebInspectorUI/UserInterface/Views/BreakpointTreeElement.js	2014-08-07 06:14:54 UTC (rev 172203)
+++ trunk/Source/WebInspectorUI/UserInterface/Views/BreakpointTreeElement.js	2014-08-07 06:23:14 UTC (rev 172204)
@@ -40,6 +40,7 @@
     this._listeners.register(breakpoint, WebInspector.Breakpoint.Event.DisabledStateDidChange, this._updateStatus);
     this._listeners.register(breakpoint, WebInspector.Breakpoint.Event.AutoContinueDidChange, this._updateStatus);
     this._listeners.register(breakpoint, WebInspector.Breakpoint.Event.ResolvedStateDidChange, this._updateStatus);
+    this._listeners.register(WebInspector.debuggerManager, WebInspector.DebuggerManager.Event.BreakpointsEnabledDidChange, this._updateStatus);
 
     this._listeners.register(WebInspector.probeManager, WebInspector.ProbeManager.Event.ProbeSetAdded, this._probeSetAdded);
     this._listeners.register(WebInspector.probeManager, WebInspector.ProbeManager.Event.ProbeSetRemoved, this._probeSetRemoved);
@@ -168,7 +169,7 @@
         else
             this._statusImageElement.classList.remove(WebInspector.BreakpointTreeElement.StatusImageAutoContinueStyleClassName);
 
-        if (this._breakpoint.resolved)
+        if (this._breakpoint.resolved && WebInspector.debuggerManager.breakpointsEnabled)
             this._statusImageElement.classList.add(WebInspector.BreakpointTreeElement.StatusImageResolvedStyleClassName);
         else
             this._statusImageElement.classList.remove(WebInspector.BreakpointTreeElement.StatusImageResolvedStyleClassName);

Modified: trunk/Source/WebInspectorUI/UserInterface/Views/ProbeSetDetailsSection.js (172203 => 172204)


--- trunk/Source/WebInspectorUI/UserInterface/Views/ProbeSetDetailsSection.js	2014-08-07 06:14:54 UTC (rev 172203)
+++ trunk/Source/WebInspectorUI/UserInterface/Views/ProbeSetDetailsSection.js	2014-08-07 06:23:14 UTC (rev 172204)
@@ -91,11 +91,11 @@
     {
         var breakpoint = this._probeSet.breakpoint;
         var titleElement = null;
-        if (breakpoint.resolved)
+        if (breakpoint.sourceCodeLocation.sourceCode)
             titleElement = WebInspector.createSourceCodeLocationLink(breakpoint.sourceCodeLocation);
         else {
             // Fallback for when we can't create a live source link.
-            console.assert(!breakpoint.sourceCodeLocation.sourceCode);
+            console.assert(!breakpoint.resolved);
 
             var location = breakpoint.sourceCodeLocation;
             titleElement = WebInspector.linkifyLocation(breakpoint.url, location.displayLineNumber, location.displayColumnNumber);

Modified: trunk/Source/WebInspectorUI/UserInterface/Views/SourceCodeTextEditor.js (172203 => 172204)


--- trunk/Source/WebInspectorUI/UserInterface/Views/SourceCodeTextEditor.js	2014-08-07 06:14:54 UTC (rev 172203)
+++ trunk/Source/WebInspectorUI/UserInterface/Views/SourceCodeTextEditor.js	2014-08-07 06:23:14 UTC (rev 172204)
@@ -42,11 +42,12 @@
     this.element.classList.add(WebInspector.SourceCodeTextEditor.StyleClassName);
 
     if (this._supportsDebugging) {
-        WebInspector.Breakpoint.addEventListener(WebInspector.Breakpoint.Event.DisabledStateDidChange, this._updateBreakpointStatus, this);
-        WebInspector.Breakpoint.addEventListener(WebInspector.Breakpoint.Event.AutoContinueDidChange, this._updateBreakpointStatus, this);
-        WebInspector.Breakpoint.addEventListener(WebInspector.Breakpoint.Event.ResolvedStateDidChange, this._updateBreakpointStatus, this);
+        WebInspector.Breakpoint.addEventListener(WebInspector.Breakpoint.Event.DisabledStateDidChange, this._breakpointStatusDidChange, this);
+        WebInspector.Breakpoint.addEventListener(WebInspector.Breakpoint.Event.AutoContinueDidChange, this._breakpointStatusDidChange, this);
+        WebInspector.Breakpoint.addEventListener(WebInspector.Breakpoint.Event.ResolvedStateDidChange, this._breakpointStatusDidChange, this);
         WebInspector.Breakpoint.addEventListener(WebInspector.Breakpoint.Event.LocationDidChange, this._updateBreakpointLocation, this);
 
+        WebInspector.debuggerManager.addEventListener(WebInspector.DebuggerManager.Event.BreakpointsEnabledDidChange, this._breakpointsEnabledDidChange, this);
         WebInspector.debuggerManager.addEventListener(WebInspector.DebuggerManager.Event.BreakpointAdded, this._breakpointAdded, this);
         WebInspector.debuggerManager.addEventListener(WebInspector.DebuggerManager.Event.BreakpointRemoved, this._breakpointRemoved, this);
         WebInspector.debuggerManager.addEventListener(WebInspector.DebuggerManager.Event.ActiveCallFrameDidChange, this._activeCallFrameDidChange, this);
@@ -114,11 +115,12 @@
     close: function()
     {
         if (this._supportsDebugging) {
-            WebInspector.Breakpoint.removeEventListener(WebInspector.Breakpoint.Event.DisabledStateDidChange, this._updateBreakpointStatus, this);
-            WebInspector.Breakpoint.removeEventListener(WebInspector.Breakpoint.Event.AutoContinueDidChange, this._updateBreakpointStatus, this);
-            WebInspector.Breakpoint.removeEventListener(WebInspector.Breakpoint.Event.ResolvedStateDidChange, this._updateBreakpointStatus, this);
+            WebInspector.Breakpoint.removeEventListener(WebInspector.Breakpoint.Event.DisabledStateDidChange, this._breakpointStatusDidChange, this);
+            WebInspector.Breakpoint.removeEventListener(WebInspector.Breakpoint.Event.AutoContinueDidChange, this._breakpointStatusDidChange, this);
+            WebInspector.Breakpoint.removeEventListener(WebInspector.Breakpoint.Event.ResolvedStateDidChange, this._breakpointStatusDidChange, this);
             WebInspector.Breakpoint.removeEventListener(WebInspector.Breakpoint.Event.LocationDidChange, this._updateBreakpointLocation, this);
 
+            WebInspector.debuggerManager.removeEventListener(WebInspector.DebuggerManager.Event.BreakpointsEnabledDidChange, this._breakpointsEnabledDidChange, this);
             WebInspector.debuggerManager.removeEventListener(WebInspector.DebuggerManager.Event.BreakpointAdded, this._breakpointAdded, this);
             WebInspector.debuggerManager.removeEventListener(WebInspector.DebuggerManager.Event.BreakpointRemoved, this._breakpointRemoved, this);
             WebInspector.debuggerManager.removeEventListener(WebInspector.DebuggerManager.Event.ActiveCallFrameDidChange, this._activeCallFrameDidChange, this);
@@ -374,14 +376,27 @@
         this._populateWithContent(content);
     },
 
-    _updateBreakpointStatus: function(event)
+    _breakpointStatusDidChange: function(event)
     {
+        this._updateBreakpointStatus(event.target);
+    },
+
+    _breakpointsEnabledDidChange: function()
+    {
         console.assert(this._supportsDebugging);
 
+        var breakpoints = WebInspector.debuggerManager.breakpointsForSourceCode(this._sourceCode);
+        for (var breakpoint of breakpoints)
+            this._updateBreakpointStatus(breakpoint);
+    },
+
+    _updateBreakpointStatus: function(breakpoint)
+    {
+        console.assert(this._supportsDebugging);
+
         if (!this._contentPopulated)
             return;
 
-        var breakpoint = event.target;
         if (!this._matchesBreakpoint(breakpoint))
             return;
 

Modified: trunk/Source/WebInspectorUI/UserInterface/Views/TextEditor.js (172203 => 172204)


--- trunk/Source/WebInspectorUI/UserInterface/Views/TextEditor.js	2014-08-07 06:14:54 UTC (rev 172203)
+++ trunk/Source/WebInspectorUI/UserInterface/Views/TextEditor.js	2014-08-07 06:23:14 UTC (rev 172204)
@@ -932,6 +932,8 @@
                 allAutoContinue = false;
         }
 
+        allResolved = allResolved && WebInspector.debuggerManager.breakpointsEnabled;
+
         function updateStyles()
         {
             // We might not have a line if the content isn't fully populated yet.
_______________________________________________
webkit-changes mailing list
[email protected]
https://lists.webkit.org/mailman/listinfo/webkit-changes

Reply via email to