WebKit Bugzilla
New
Browse
Search+
Log In
×
Sign in with GitHub
or
Remember my login
Create Account
·
Forgot Password
Forgotten password account recovery
[patch]
WIP
bug-137078-20140924161410.patch (text/plain), 9.09 KB, created by
Brian Burg
on 2014-09-24 16:14:17 PDT
(
hide
)
Description:
WIP
Filename:
MIME Type:
Creator:
Brian Burg
Created:
2014-09-24 16:14:17 PDT
Size:
9.09 KB
patch
obsolete
>Subversion Revision: 173802 >diff --git a/Source/WebInspectorUI/UserInterface/Base/EventListener.js b/Source/WebInspectorUI/UserInterface/Base/EventListener.js >index 10f1754f9b97d0feaf59ee84f81ba58e158cfa31..17e1206496521b558dcb9f0d2b7fa9e13e55bb5f 100644 >--- a/Source/WebInspectorUI/UserInterface/Base/EventListener.js >+++ b/Source/WebInspectorUI/UserInterface/Base/EventListener.js >@@ -33,6 +33,11 @@ WebInspector.EventListener = function(thisObject, fireOnce) > }; > > WebInspector.EventListener.prototype = { >+ isActive: function() >+ { >+ return this._emitter && this._callback; >+ }, >+ > connect: function(emitter, type, callback, usesCapture) > { > console.assert(!this._emitter && !this._callback, "EventListener already bound to a callback.", this); >diff --git a/Source/WebInspectorUI/UserInterface/Controllers/ReplayManager.js b/Source/WebInspectorUI/UserInterface/Controllers/ReplayManager.js >index 5fb56eea27403fd2647741b96e3fa5c0beb0289d..2c724c74f1cc0b94950546c4ca9b4ff3925fd978 100644 >--- a/Source/WebInspectorUI/UserInterface/Controllers/ReplayManager.js >+++ b/Source/WebInspectorUI/UserInterface/Controllers/ReplayManager.js >@@ -434,6 +434,133 @@ WebInspector.ReplayManager.prototype = { > return result; > }, > >+ replayToIndexedStatement: function(replayPosition, url, filePosition, counterValue) >+ { >+ // Don't use a SourceCodeLocation because the referenced statement may not yet be parsed. >+ console.assert(replayPosition instanceof WebInspector.ReplayPosition, replayPosition); >+ console.assert(filePosition instanceof WebInspector.SourceCodePosition, filePosition); >+ >+ // We expect playback to pause just once, but the debugger should pause counterValue-1 times. >+ var playbackPauseListener = new WebInspector.EventListener(this, true); >+ var breakpointResolvedListener = new WebInspector.EventListener(this, true); >+ var debuggerPauseListener = new WebInspector.EventListener(this, false); >+ >+ var manager = this; >+ var result = this.waitUntilInitialized(); >+ >+ var temporaryBreakpoint = null; >+ var breakpointStateMap = new Map; >+ >+ console.log("Starting replayToIndexedStatement:", replayPosition, url, filePosition, counterValue); >+ >+ result = result.then(function() { >+ manager.playbackSpeed = WebInspector.ReplayManager.PlaybackSpeed.FastForward; >+ var shouldSuppressBreakpoints = true; >+ >+ console.log("replayToIndexedStatement: replaying to position ", replayPosition); >+ >+ return manager.replayToPosition(replayPosition, shouldSuppressBreakpoints); >+ }); >+ result = result.then(function waitForPlaybackPause() { >+ console.log("replayToIndexedStatement: waiting for pause at ", replayPosition); >+ >+ return new WebInspector.Promise(function (resolve, reject) { >+ playbackPauseListener.connect(manager, WebInspector.ReplayManager.Event.PlaybackPaused, resolve); >+ }); >+ }); >+ result = result.then(function setBreakpointForStatement() { >+ >+ console.log("paused at ", manager.playbackPosition, "expected: ", replayPosition); >+ if (WebInspector.ReplayPosition.comparator(manager.playbackPosition, replayPosition) !== 0) >+ throw new Error("Playback paused at the wrong replay position!"); >+ >+ WebInspector.debuggerManager.breakpointsEnabled = true; >+ // Disable the breakpoints that are unrelated to this command. >+ for (var breakpoint of WebInspector.debuggerManager.breakpoints) { >+ breakpointStateMap.set(breakpoint, breakpoint.disabled); >+ breakpoint.disabled = true; >+ } >+ >+ // Make a breakpoint for the specified url and position. >+ var sourceCode = WebInspector.frameResourceManager.resourceForURL(url); >+ if (!sourceCode) { >+ sourceCode = WebInspector.debuggerManager.scriptsForURL(url)[0]; >+ if (sourceCode) >+ sourceCode = sourceCode.resource || sourceCode; >+ } >+ if (!sourceCode) >+ throw new Error("Couldn't resolve indexed statement with URL: " + url); >+ >+ var sourceCodeLocation = sourceCode.createSourceCodeLocation(filePosition.lineNumber, filePosition.columnNumber); >+ temporaryBreakpoint = new WebInspector.Breakpoint(sourceCodeLocation); >+ >+ var shouldSkipEventDispatch = false; >+ var shouldSpeculativelyResolve = false; >+ WebInspector.debuggerManager.addBreakpoint(temporaryBreakpoint, shouldSkipEventDispatch, shouldSpeculativelyResolve); >+ >+ console.log("replayToIndexedStatement: waiting to resolve breakpoint ", breakpoint); >+ >+ return new WebInspector.Promise(function(resolve, reject) { >+ breakpointResolvedListener.connect(temporaryBreakpoint, WebInspector.Breakpoint.Event.ResolvedStateDidChange, resolve); >+ }); >+ }); >+ >+ result = result.then(function() { >+ console.log("replayToIndexedStatement: waiting for pause #", counterValue); >+ var shouldSuppressBreakpoints = false; >+ manager.replayToCompletion(shouldSuppressBreakpoints); >+ >+ return new WebInspector.Promise(function(resolve, reject) { >+ var pauseCounter = NaN; >+ function handleDebuggerPause(finishedCallback) { >+ pauseCounter = isNaN(pauseCounter) ? 0 : pauseCounter + 1; >+ console.log("replayToIndexedStatement: saw pause #", pauseCounter, "of", counterValue); >+ >+ if (pauseCounter === counterValue) { >+ console.log("replayToIndexedStatement: resolving"); >+ finishedCallback(); >+ } else { >+ console.log("replayToIndexedStatement: resuming"); >+ WebInspector.debuggerManager.resume(); >+ } >+ } >+ debuggerPauseListener.connect(WebInspector.debuggerManager, WebInspector.DebuggerManager.Event.Paused, handleDebuggerPause.bind(null, resolve)); >+ }); >+ }); >+ >+ result = result.then(function restoreOriginalState() { >+ console.log("replayToIndexedStatement: restoring original state"); >+ >+ WebInspector.debuggerManager.removeBreakpoint(temporaryBreakpoint); >+ >+ manager.playbackSpeed = WebInspector.ReplayManager.PlaybackSpeed.RealTime; >+ for (var [breakpoint, wasDisabled] of breakpointStateMap) >+ breakpoint.disabled = wasDisabled; >+ >+ // FIXME: we didn't properly save and restore the replay speed or debugger enabled state. >+ >+ debuggerPauseListener.disconnect(); >+ }); >+ >+ result = result.catch(function(error) { >+ console.log("replayToIndexedStatement: hit the catch clause"); >+ >+ if (playbackPauseListener.isActive()) >+ playbackPauseListener.disconnect(); >+ >+ if (breakpointResolvedListener.isActive()) >+ breakpointResolvedListener.disconnect(); >+ >+ if (debuggerPauseListener.isActive()) >+ debuggerPauseListener.disconnect(); >+ >+ console.error("Failed to replay to indexed statement: ", error); >+ throw error; >+ }); >+ >+ return result; >+ }, >+ > // Protected (called by ReplayObserver) > > // Since these methods update session and segment state, they depend on the manager >diff --git a/Source/WebInspectorUI/UserInterface/Views/ProbeSetDataGrid.js b/Source/WebInspectorUI/UserInterface/Views/ProbeSetDataGrid.js >index 35054785bf6ef478661ff9d85806e31c54ca7a8d..6dc08990114dfbfcc926328ec3217dd71aadc74f 100644 >--- a/Source/WebInspectorUI/UserInterface/Views/ProbeSetDataGrid.js >+++ b/Source/WebInspectorUI/UserInterface/Views/ProbeSetDataGrid.js >@@ -48,6 +48,7 @@ WebInspector.ProbeSetDataGrid = function(probeSet) > this._listeners.register(probeSet, WebInspector.ProbeSet.Event.SamplesCleared, this._setupData); > this._listeners.register(WebInspector.Probe, WebInspector.Probe.Event.ExpressionChanged, this._probeExpressionChanged); > this._listeners.register(WebInspector.replayManager, WebInspector.ReplayManager.Event.ActiveSegmentChanged, this._activeSegmentChanged); >+ this._listeners.register(this.element, "dblclick", this._gridDoubleClicked); > this._listeners.install(); > > this._setupData(); >@@ -170,6 +171,20 @@ WebInspector.ProbeSetDataGrid.prototype = { > this._nodesSinceLastNavigation = []; > }, > >+ _gridDoubleClicked: function(event) >+ { >+ var gridNode = this.dataGridNodeFromNode(event.target); >+ if (!gridNode || !gridNode.selectable) >+ return; >+ >+ var frame = gridNode.frame; >+ if (!(frame instanceof WebInspector.ProbeSetReplayDataFrame)) >+ return; >+ >+ var breakpoint = this.probeSet.breakpoint; >+ WebInspector.replayManager.replayToIndexedStatement(frame.position, breakpoint.url, breakpoint.sourceCodeLocation.position(), frame.counterValue); >+ }, >+ > _dataFrameInserted: function(event) > { > var frame = event.data;
You cannot view the attachment while viewing its details because your browser does not support IFRAMEs.
View the attachment on a separate page
.
View Attachment As Diff
View Attachment As Raw
Actions:
View
|
Formatted Diff
|
Diff
Attachments on
bug 137078
: 238620