diff --git a/Source/WebCore/inspector/InspectorReplayAgent.cpp b/Source/WebCore/inspector/InspectorReplayAgent.cpp index 50a86fe3e3436..f18da1ca9c02a 100644 --- a/Source/WebCore/inspector/InspectorReplayAgent.cpp +++ b/Source/WebCore/inspector/InspectorReplayAgent.cpp @@ -548,9 +548,6 @@ void InspectorReplayAgent::loadRecording(ErrorString* errorString, int uid, bool return; } *wasAllowed = m_inspectedPage->replayController()->loadRecording(it->value); - - if (wasAllowed && m_frontend) - m_frontend->recordingLoaded(uid); } void InspectorReplayAgent::unloadRecording(ErrorString* errorString, bool* wasAllowed) diff --git a/Source/WebCore/inspector/front-end/RecordingsPanel.js b/Source/WebCore/inspector/front-end/RecordingsPanel.js index b0fd3746e6ea9..6be67c9505625 100644 --- a/Source/WebCore/inspector/front-end/RecordingsPanel.js +++ b/Source/WebCore/inspector/front-end/RecordingsPanel.js @@ -325,6 +325,17 @@ WebInspector.RecordingSidebarTreeElement.prototype = { return true; }, + ondblclick: function() + { + var model = WebInspector.replayModel; + if (!model.canReplay) + return; + if (model.loadedRecording === this.recording) + return; + + model.scheduler.executeImmediately(model.switchRecordingTask(this.recording)); + }, + /** * @param {!Event} event */ diff --git a/Source/WebCore/inspector/front-end/ReplayModel.js b/Source/WebCore/inspector/front-end/ReplayModel.js index 3838e6dde0c2b..08dda7462fdd6 100644 --- a/Source/WebCore/inspector/front-end/ReplayModel.js +++ b/Source/WebCore/inspector/front-end/ReplayModel.js @@ -476,6 +476,52 @@ WebInspector.ReplayModel.prototype = { return task; }, + unloadRecordingTask: function() + { + var model = this; + return new WebInspector.ReplayTask("UnloadRecording") + .chain("stopPlaybackIfNeeded", function(cb) { + if (model.isReplaying) + model.stopPlaybackTask(true).run(cb); + else + cb(); + }) + .chain("unloadRecordingIfNeeded", function(cb) { + if (!model.canReplay) + return cb(); + + model.onceEventListener(WebInspector.ReplayModel.Events.RecordingUnloaded, cb); + model._unloadRecording(); + }); + }, + + loadRecordingTask: function(recording) + { + var model = this; + return new WebInspector.ReplayTask("LoadRecording") + .chain("requestRecordingLoad", function(cb) { + if (model.canReplay) + return cb(); + + model.onceEventListener(WebInspector.ReplayModel.Events.RecordingLoaded, cb); + model._loadRecording(recording); + }); + }, + + switchRecordingTask: function(recording) + { + var model = this; + return new WebInspector.ReplayTask("SwitchRecording") + .chain("unloadRecording", function(cb) { + var subtask = model.unloadRecordingTask(); + subtask.run(cb); + }) + .chain("loadRecording", function(cb) { + var subtask = model.loadRecordingTask(recording); + subtask.run(cb); + }); + }, + // Public query API get createdRecording() { @@ -563,17 +609,15 @@ WebInspector.ReplayModel.prototype = { _unloadRecording: function() { console.assert(this.loadedRecording, "Can't unload recording because none is loaded"); - ReplayAgent.unloadRecording(function(error, wasAllowed) { - this._canReplay = !wasAllowed; - }); + // TODO: receiving !wasAllowed should trigger task error. + ReplayAgent.unloadRecording(); }, _loadRecording: function(recording) { console.assert(!this._activeRecording, "Can't load recording because one is already loaded"); - ReplayAgent.loadRecording(recording.uid, function(error, wasAllowed) { - this._canReplay = !!wasAllowed; - }); + // TODO: receiving !wasAllowed should trigger task error. + ReplayAgent.loadRecording(recording.uid); }, // Callbacks from the backend message dispatcher (ReplayDispatcher below) diff --git a/Source/WebCore/replay/ReplayAgentStateMachine.cpp b/Source/WebCore/replay/ReplayAgentStateMachine.cpp index 5d5c5be57c1c4..01b3c8a85aa1e 100644 --- a/Source/WebCore/replay/ReplayAgentStateMachine.cpp +++ b/Source/WebCore/replay/ReplayAgentStateMachine.cpp @@ -130,7 +130,7 @@ void ReplayAgentStateMachine::advanceTo(State newState) break; case RecordingUnloaded: // can always get to this state; not idempotent - if (!inState(RecordingLoaded)) + if (!inState(RecordingUnloaded)) goto commit_transition; break;