- 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.