Title: [237010] trunk
Revision
237010
Author
[email protected]
Date
2018-10-10 11:34:49 -0700 (Wed, 10 Oct 2018)

Log Message

Web Inspector: notify the frontend when a canvas has started recording via console.record
https://bugs.webkit.org/show_bug.cgi?id=190306

Reviewed by Brian Burg.

Source/_javascript_Core:

* inspector/protocol/Canvas.json:
Add `recordingStarted` event.

* inspector/protocol/Recording.json:
Add `Initiator` enum for determining who started the recording.

Source/WebCore:

Updated existing tests: LayoutTests/inspector/canvas/recording-2d.html
                        LayoutTests/inspector/canvas/recording-bitmaprenderer.html
                        LayoutTests/inspector/canvas/recording-webgl-snapshots.html
                        LayoutTests/inspector/canvas/recording-webgl.html

* inspector/agents/InspectorCanvasAgent.cpp:
(WebCore::InspectorCanvasAgent::startRecording):
(WebCore::InspectorCanvasAgent::consoleStartRecordingCanvas):

* inspector/InspectorCanvas.h:
Default `singleFrame` to false to better match the default behaviour of other `console`
functions (`profile` doesn't stop until `profileEnd` is called, so the same should be true
of `record` and `recordEnd`).

Source/WebInspectorUI:

* UserInterface/Protocol/CanvasObserver.js:
(WI.CanvasObserver.prototype.recordingStarted): Added.

* UserInterface/Protocol/CanvasManager.js:
(WI.CanvasManager.prototype.recordingStarted): Added.

* UserInterface/Models/Canvas.js:
(WI.Canvas.prototype.startRecording):
(WI.Canvas.prototype.recordingStarted): Added.
(WI.Canvas.prototype.recordingFinished):

LayoutTests:

* inspector/canvas/recording-2d.html:
* inspector/canvas/recording-bitmaprenderer.html:
* inspector/canvas/recording-webgl-snapshots.html:
* inspector/canvas/recording-webgl.html:
* inspector/canvas/resources/recording-utilities.js:
(TestPage.registerInitializer.window.startRecording):
Wait to complete the test until the "LastFrame" event is fired, ensuring that any running
commands don't affect the next test case.

Modified Paths

Diff

Modified: trunk/LayoutTests/ChangeLog (237009 => 237010)


--- trunk/LayoutTests/ChangeLog	2018-10-10 18:29:44 UTC (rev 237009)
+++ trunk/LayoutTests/ChangeLog	2018-10-10 18:34:49 UTC (rev 237010)
@@ -1,3 +1,19 @@
+2018-10-10  Devin Rousso  <[email protected]>
+
+        Web Inspector: notify the frontend when a canvas has started recording via console.record
+        https://bugs.webkit.org/show_bug.cgi?id=190306
+
+        Reviewed by Brian Burg.
+
+        * inspector/canvas/recording-2d.html:
+        * inspector/canvas/recording-bitmaprenderer.html:
+        * inspector/canvas/recording-webgl-snapshots.html:
+        * inspector/canvas/recording-webgl.html:
+        * inspector/canvas/resources/recording-utilities.js:
+        (TestPage.registerInitializer.window.startRecording):
+        Wait to complete the test until the "LastFrame" event is fired, ensuring that any running
+        commands don't affect the next test case.
+
 2018-10-09  Antoine Quint  <[email protected]>
 
         Remove the frames() timing function

Modified: trunk/LayoutTests/inspector/canvas/recording-2d.html (237009 => 237010)


--- trunk/LayoutTests/inspector/canvas/recording-2d.html	2018-10-10 18:29:44 UTC (rev 237009)
+++ trunk/LayoutTests/inspector/canvas/recording-2d.html	2018-10-10 18:34:49 UTC (rev 237010)
@@ -427,16 +427,7 @@
         name: "Canvas.recording2D.multipleFrames",
         description: "Check that recording data is serialized correctly for multiple frames.",
         test(resolve, reject) {
-            let canvas = startRecording(WI.Canvas.ContextType.Canvas2D, resolve, reject, {singleFrame: false});
-
-            InspectorTest.singleFireEventListener("LastFrame", () => {
-                CanvasAgent.stopRecording(canvas.identifier, (error) => {
-                    if (error) {
-                        reject(error);
-                        return;
-                    }
-                });
-            });
+            startRecording(WI.Canvas.ContextType.Canvas2D, resolve, reject, {singleFrame: false});
         },
     });
 
@@ -480,15 +471,14 @@
             })
             .then(resolve, reject);
 
-            const singleFrame = true;
-            CanvasAgent.startRecording(canvas.identifier, singleFrame, (error) => {
-                if (error) {
-                    reject(error);
-                    return;
-                }
-
+            canvas.awaitEvent(WI.Canvas.Event.RecordingStarted)
+            .then((event) => {
                 InspectorTest.evaluateInPage(`performNaNActions()`);
             });
+
+            const singleFrame = true;
+            CanvasAgent.startRecording(canvas.identifier, singleFrame)
+            .catch(reject);
         },
     });
 

Modified: trunk/LayoutTests/inspector/canvas/recording-bitmaprenderer.html (237009 => 237010)


--- trunk/LayoutTests/inspector/canvas/recording-bitmaprenderer.html	2018-10-10 18:29:44 UTC (rev 237009)
+++ trunk/LayoutTests/inspector/canvas/recording-bitmaprenderer.html	2018-10-10 18:34:49 UTC (rev 237010)
@@ -95,16 +95,7 @@
         name: "Canvas.recordingBitmapRenderer.multipleFrames",
         description: "Check that recording data is serialized correctly for multiple frames.",
         test(resolve, reject) {
-            let canvas = startRecording(WI.Canvas.ContextType.BitmapRenderer, resolve, reject, {singleFrame: false});
-
-            InspectorTest.singleFireEventListener("LastFrame", () => {
-                CanvasAgent.stopRecording(canvas.identifier, (error) => {
-                    if (error) {
-                        reject(error);
-                        return;
-                    }
-                });
-            });
+            startRecording(WI.Canvas.ContextType.BitmapRenderer, resolve, reject, {singleFrame: false});
         },
     });
 

Modified: trunk/LayoutTests/inspector/canvas/recording-webgl-snapshots.html (237009 => 237010)


--- trunk/LayoutTests/inspector/canvas/recording-webgl-snapshots.html	2018-10-10 18:29:44 UTC (rev 237009)
+++ trunk/LayoutTests/inspector/canvas/recording-webgl-snapshots.html	2018-10-10 18:34:49 UTC (rev 237010)
@@ -45,6 +45,10 @@
     runTest();
 }
 
+function cancelActions() {
+    // This function is expected by "resources/recording-utilities.js".
+}
+
 function performActions() {
     context.useProgram(program);
 
@@ -83,6 +87,10 @@
     clearContext();
     drawElements();
     clearContext();
+
+    setTimeout(() => {
+        TestPage.dispatchEventToFrontend("LastFrame");
+    }, 0);
 }
 
 function test() {

Modified: trunk/LayoutTests/inspector/canvas/recording-webgl.html (237009 => 237010)


--- trunk/LayoutTests/inspector/canvas/recording-webgl.html	2018-10-10 18:29:44 UTC (rev 237009)
+++ trunk/LayoutTests/inspector/canvas/recording-webgl.html	2018-10-10 18:34:49 UTC (rev 237010)
@@ -521,16 +521,7 @@
         name: "Canvas.recordingWebGL.multipleFrames",
         description: "Check that recording data is serialized correctly for multiple frames.",
         test(resolve, reject) {
-            let canvas = startRecording(WI.Canvas.ContextType.WebGL, resolve, reject, {singleFrame: false});
-
-            InspectorTest.singleFireEventListener("LastFrame", () => {
-                CanvasAgent.stopRecording(canvas.identifier, (error) => {
-                    if (error) {
-                        reject(error);
-                        return;
-                    }
-                });
-            });
+            startRecording(WI.Canvas.ContextType.WebGL, resolve, reject, {singleFrame: false});
         },
     });
 

Modified: trunk/LayoutTests/inspector/canvas/resources/recording-utilities.js (237009 => 237010)


--- trunk/LayoutTests/inspector/canvas/resources/recording-utilities.js	2018-10-10 18:29:44 UTC (rev 237009)
+++ trunk/LayoutTests/inspector/canvas/resources/recording-utilities.js	2018-10-10 18:34:49 UTC (rev 237010)
@@ -81,6 +81,24 @@
             return;
         }
 
+        let stopped = false;
+        let swizzled = false;
+        let lastFrame = false;
+
+        InspectorTest.awaitEvent("LastFrame")
+        .then((event) => {
+            lastFrame = true;
+
+            if (!stopped)
+                CanvasAgent.stopRecording(canvas.identifier).catch(reject);
+            else {
+                InspectorTest.evaluateInPage(`cancelActions()`).catch(reject);
+
+                if (swizzled)
+                    resolve();
+            }
+        });
+
         let bufferUsed = 0;
         let frameCount = 0;
         function handleRecordingProgress(event) {
@@ -93,10 +111,10 @@
         canvas.addEventListener(WI.Canvas.Event.RecordingProgress, handleRecordingProgress);
 
         canvas.awaitEvent(WI.Canvas.Event.RecordingStopped).then((event) => {
+            stopped = true;
+
             canvas.removeEventListener(WI.Canvas.Event.RecordingProgress, handleRecordingProgress);
 
-            InspectorTest.evaluateInPage(`cancelActions()`);
-
             let recording = event.data.recording;
             InspectorTest.assert(recording.source === canvas, "Recording should be of the given canvas.");
             InspectorTest.assert(recording.source.contextType === type, `Recording should be of a canvas with type "${type}".`);
@@ -103,21 +121,23 @@
             InspectorTest.assert(recording.source.recordingCollection.has(recording), "Recording should be in the canvas' list of recordings.");
             InspectorTest.assert(recording.frames.length === frameCount, `Recording should have ${frameCount} frames.`)
 
-            return Promise.all(recording.actions.map((action) => action.swizzle(recording))).then(() => {
+            Promise.all(recording.actions.map((action) => action.swizzle(recording))).then(() => {
+                swizzled = true;
+
                 logRecording(recording, type);
+
+                if (lastFrame) {
+                    InspectorTest.evaluateInPage(`cancelActions()`)
+                    .then(resolve, reject);
+                }
             });
-        }).then(resolve, reject);
+        });
 
-        CanvasAgent.startRecording(canvas.identifier, singleFrame, memoryLimit, (error) => {
-            if (error) {
-                reject(error);
-                return;
-            }
-
-            InspectorTest.evaluateInPage(`performActions()`);
+        canvas.awaitEvent(WI.Canvas.Event.RecordingStarted).then((event) => {
+            InspectorTest.evaluateInPage(`performActions()`).catch(reject);
         });
 
-        return canvas;
+        CanvasAgent.startRecording(canvas.identifier, singleFrame, memoryLimit).catch(reject);
     };
 
     window.consoleRecord = function(type, resolve, reject) {

Modified: trunk/Source/_javascript_Core/ChangeLog (237009 => 237010)


--- trunk/Source/_javascript_Core/ChangeLog	2018-10-10 18:29:44 UTC (rev 237009)
+++ trunk/Source/_javascript_Core/ChangeLog	2018-10-10 18:34:49 UTC (rev 237010)
@@ -1,3 +1,16 @@
+2018-10-10  Devin Rousso  <[email protected]>
+
+        Web Inspector: notify the frontend when a canvas has started recording via console.record
+        https://bugs.webkit.org/show_bug.cgi?id=190306
+
+        Reviewed by Brian Burg.
+
+        * inspector/protocol/Canvas.json:
+        Add `recordingStarted` event.
+
+        * inspector/protocol/Recording.json:
+        Add `Initiator` enum for determining who started the recording.
+
 2018-10-10  Yusuke Suzuki  <[email protected]>
 
         [JSC] Rename createXXX to tryCreateXXX if it can return RefPtr

Modified: trunk/Source/_javascript_Core/inspector/protocol/Canvas.json (237009 => 237010)


--- trunk/Source/_javascript_Core/inspector/protocol/Canvas.json	2018-10-10 18:29:44 UTC (rev 237009)
+++ trunk/Source/_javascript_Core/inspector/protocol/Canvas.json	2018-10-10 18:34:49 UTC (rev 237010)
@@ -191,6 +191,13 @@
             ]
         },
         {
+            "name": "recordingStarted",
+            "parameters": [
+                { "name": "canvasId", "$ref": "CanvasId" },
+                { "name": "initiator", "$ref": "Recording.Initiator" }
+            ]
+        },
+        {
             "name": "recordingProgress",
             "parameters": [
                 { "name": "canvasId", "$ref": "CanvasId" },

Modified: trunk/Source/_javascript_Core/inspector/protocol/Recording.json (237009 => 237010)


--- trunk/Source/_javascript_Core/inspector/protocol/Recording.json	2018-10-10 18:29:44 UTC (rev 237009)
+++ trunk/Source/_javascript_Core/inspector/protocol/Recording.json	2018-10-10 18:34:49 UTC (rev 237010)
@@ -9,6 +9,11 @@
             "description": "The type of the recording."
         },
         {
+            "id": "Initiator",
+            "type": "string",
+            "enum": ["frontend", "console"]
+        },
+        {
             "id": "InitialState",
             "type": "object",
             "description": "Information about the initial state of the recorded object.",

Modified: trunk/Source/WebCore/ChangeLog (237009 => 237010)


--- trunk/Source/WebCore/ChangeLog	2018-10-10 18:29:44 UTC (rev 237009)
+++ trunk/Source/WebCore/ChangeLog	2018-10-10 18:34:49 UTC (rev 237010)
@@ -1,3 +1,24 @@
+2018-10-10  Devin Rousso  <[email protected]>
+
+        Web Inspector: notify the frontend when a canvas has started recording via console.record
+        https://bugs.webkit.org/show_bug.cgi?id=190306
+
+        Reviewed by Brian Burg.
+
+        Updated existing tests: LayoutTests/inspector/canvas/recording-2d.html
+                                LayoutTests/inspector/canvas/recording-bitmaprenderer.html
+                                LayoutTests/inspector/canvas/recording-webgl-snapshots.html
+                                LayoutTests/inspector/canvas/recording-webgl.html
+
+        * inspector/agents/InspectorCanvasAgent.cpp:
+        (WebCore::InspectorCanvasAgent::startRecording):
+        (WebCore::InspectorCanvasAgent::consoleStartRecordingCanvas):
+
+        * inspector/InspectorCanvas.h:
+        Default `singleFrame` to false to better match the default behaviour of other `console`
+        functions (`profile` doesn't stop until `profileEnd` is called, so the same should be true
+        of `record` and `recordEnd`).
+
 2018-10-10  Yusuke Suzuki  <[email protected]>
 
         [JSC] Rename createXXX to tryCreateXXX if it can return RefPtr

Modified: trunk/Source/WebCore/inspector/InspectorCanvas.h (237009 => 237010)


--- trunk/Source/WebCore/inspector/InspectorCanvas.h	2018-10-10 18:29:44 UTC (rev 237009)
+++ trunk/Source/WebCore/inspector/InspectorCanvas.h	2018-10-10 18:34:49 UTC (rev 237010)
@@ -116,7 +116,7 @@
     MonotonicTime m_currentFrameStartTime { MonotonicTime::nan() };
     size_t m_bufferLimit { 100 * 1024 * 1024 };
     size_t m_bufferUsed { 0 };
-    bool m_singleFrame { true };
+    bool m_singleFrame { false };
 };
 
 } // namespace WebCore

Modified: trunk/Source/WebCore/inspector/agents/InspectorCanvasAgent.cpp (237009 => 237010)


--- trunk/Source/WebCore/inspector/agents/InspectorCanvasAgent.cpp	2018-10-10 18:29:44 UTC (rev 237009)
+++ trunk/Source/WebCore/inspector/agents/InspectorCanvasAgent.cpp	2018-10-10 18:34:49 UTC (rev 237010)
@@ -279,6 +279,8 @@
         inspectorCanvas->setBufferLimit(*memoryLimit);
 
     inspectorCanvas->context().setCallTracingActive(true);
+
+    m_frontendDispatcher->recordingStarted(inspectorCanvas->identifier(), Inspector::Protocol::Recording::Initiator::Frontend);
 }
 
 void InspectorCanvasAgent::stopRecording(ErrorString& errorString, const String& canvasId)
@@ -577,6 +579,8 @@
     }
 
     inspectorCanvas->context().setCallTracingActive(true);
+
+    m_frontendDispatcher->recordingStarted(inspectorCanvas->identifier(), Inspector::Protocol::Recording::Initiator::Console);
 }
 
 #if ENABLE(WEBGL)

Modified: trunk/Source/WebInspectorUI/ChangeLog (237009 => 237010)


--- trunk/Source/WebInspectorUI/ChangeLog	2018-10-10 18:29:44 UTC (rev 237009)
+++ trunk/Source/WebInspectorUI/ChangeLog	2018-10-10 18:34:49 UTC (rev 237010)
@@ -1,5 +1,23 @@
 2018-10-10  Devin Rousso  <[email protected]>
 
+        Web Inspector: notify the frontend when a canvas has started recording via console.record
+        https://bugs.webkit.org/show_bug.cgi?id=190306
+
+        Reviewed by Brian Burg.
+
+        * UserInterface/Protocol/CanvasObserver.js:
+        (WI.CanvasObserver.prototype.recordingStarted): Added.
+
+        * UserInterface/Protocol/CanvasManager.js:
+        (WI.CanvasManager.prototype.recordingStarted): Added.
+
+        * UserInterface/Models/Canvas.js:
+        (WI.Canvas.prototype.startRecording):
+        (WI.Canvas.prototype.recordingStarted): Added.
+        (WI.Canvas.prototype.recordingFinished):
+
+2018-10-10  Devin Rousso  <[email protected]>
+
         Web Inspector: indent all network entries when "Group by Node" is checked
         https://bugs.webkit.org/show_bug.cgi?id=190388
 

Modified: trunk/Source/WebInspectorUI/UserInterface/Controllers/CanvasManager.js (237009 => 237010)


--- trunk/Source/WebInspectorUI/UserInterface/Controllers/CanvasManager.js	2018-10-10 18:29:44 UTC (rev 237009)
+++ trunk/Source/WebInspectorUI/UserInterface/Controllers/CanvasManager.js	2018-10-10 18:34:49 UTC (rev 237010)
@@ -127,6 +127,18 @@
         canvas.cssCanvasClientNodesChanged();
     }
 
+    recordingStarted(canvasIdentifier, initiator)
+    {
+        // Called from WI.CanvasObserver.
+
+        let canvas = this._canvasIdentifierMap.get(canvasIdentifier);
+        console.assert(canvas);
+        if (!canvas)
+            return;
+
+        canvas.recordingStarted(initiator);
+    }
+
     recordingProgress(canvasIdentifier, framesPayload, bufferUsed)
     {
         // Called from WI.CanvasObserver.

Modified: trunk/Source/WebInspectorUI/UserInterface/Models/Canvas.js (237009 => 237010)


--- trunk/Source/WebInspectorUI/UserInterface/Models/Canvas.js	2018-10-10 18:29:44 UTC (rev 237009)
+++ trunk/Source/WebInspectorUI/UserInterface/Models/Canvas.js	2018-10-10 18:34:49 UTC (rev 237010)
@@ -275,7 +275,12 @@
                 return;
             }
 
-            this._recordingState = WI.Canvas.RecordingState.Active;
+            this._recordingState = WI.Canvas.RecordingState.ActiveFrontend;
+
+            // COMPATIBILITY (iOS 12.1): Canvas.event.recordingStarted did not exist yet
+            if (CanvasAgent.hasEvent("recordingStarted"))
+                return;
+
             this._recordingFrames = [];
             this._recordingBufferUsed = 0;
 
@@ -321,6 +326,23 @@
         this.dispatchEventToListeners(WI.Canvas.Event.CSSCanvasClientNodesChanged);
     }
 
+    recordingStarted(initiator)
+    {
+        // Called from WI.CanvasManager.
+
+        if (initiator === WI.Recording.Initiator.Console)
+            this._recordingState = WI.Canvas.RecordingState.ActiveConsole;
+        else {
+            console.assert(initiator === WI.Recording.Initiator.Frontend);
+            this._recordingState = WI.Canvas.RecordingState.ActiveFrontend;
+        }
+
+        this._recordingFrames = [];
+        this._recordingBufferUsed = 0;
+
+        this.dispatchEventToListeners(WI.Canvas.Event.RecordingStarted);
+    }
+
     recordingProgress(framesPayload, bufferUsed)
     {
         // Called from WI.CanvasManager.
@@ -336,8 +358,12 @@
     {
         // Called from WI.CanvasManager.
 
-        let fromConsole = !this.recordingActive;
+        let fromConsole = this._recordingState === WI.Canvas.RecordingState.ActiveConsole;
 
+        // COMPATIBILITY (iOS 12.1): Canvas.event.recordingStarted did not exist yet
+        if (!fromConsole && !CanvasAgent.hasEvent("recordingStarted"))
+            fromConsole = !this.recordingActive;
+
         let recording = recordingPayload ? WI.Recording.fromPayload(recordingPayload, this._recordingFrames) : null;
         if (recording) {
             recording.source = this;
@@ -377,7 +403,8 @@
 
 WI.Canvas.RecordingState = {
     Inactive: "canvas-recording-state-inactive",
-    Active: "canvas-recording-state-active",
+    ActiveFrontend: "canvas-recording-state-active-frontend",
+    ActiveConsole: "canvas-recording-state-active-console",
 };
 
 WI.Canvas.Event = {

Modified: trunk/Source/WebInspectorUI/UserInterface/Models/Recording.js (237009 => 237010)


--- trunk/Source/WebInspectorUI/UserInterface/Models/Recording.js	2018-10-10 18:29:44 UTC (rev 237009)
+++ trunk/Source/WebInspectorUI/UserInterface/Models/Recording.js	2018-10-10 18:34:49 UTC (rev 237010)
@@ -486,6 +486,11 @@
     CanvasWebGL: "canvas-webgl",
 };
 
+WI.Recording.Initiator = {
+    Frontend: "frontend",
+    Console: "console",
+};
+
 // Keep this in sync with WebCore::RecordingSwizzleTypes.
 WI.Recording.Swizzle = {
     None: 0,

Modified: trunk/Source/WebInspectorUI/UserInterface/Protocol/CanvasObserver.js (237009 => 237010)


--- trunk/Source/WebInspectorUI/UserInterface/Protocol/CanvasObserver.js	2018-10-10 18:29:44 UTC (rev 237009)
+++ trunk/Source/WebInspectorUI/UserInterface/Protocol/CanvasObserver.js	2018-10-10 18:34:49 UTC (rev 237010)
@@ -47,6 +47,11 @@
         WI.canvasManager.cssCanvasClientNodesChanged(canvasId);
     }
 
+    recordingStarted(canvasId, initiator)
+    {
+        WI.canvasManager.recordingStarted(canvasId, initiator);
+    }
+
     recordingProgress(canvasId, frames, bufferUsed)
     {
         WI.canvasManager.recordingProgress(canvasId, frames, bufferUsed);
_______________________________________________
webkit-changes mailing list
[email protected]
https://lists.webkit.org/mailman/listinfo/webkit-changes

Reply via email to