1<!DOCTYPE html>
2<html>
3<head>
4<script src="../../http/tests/inspector/resources/inspector-test.js"></script>
5<script>
6if (window.internals)
7 window.internals.settings.setWebGLErrorsToConsoleEnabled(false);
8
9let timeoutID = NaN;
10
11function cancelActions() {
12 clearTimeout(timeoutID);
13 timeoutID = NaN;
14}
15
16function performActions(frames) {
17 let index = 0;
18 function executeFrameFunction() {
19 frames[index++]();
20
21 if (index < frames.length)
22 timeoutID = setTimeout(executeFrameFunction, 0);
23 else {
24 setTimeout(() => {
25 TestPage.dispatchEventToFrontend("LastFrame");
26 }, 0);
27 }
28 };
29 executeFrameFunction();
30}
31
32function performActions2D() {
33 let context = document.createElement("canvas").getContext("2d");
34 performActions([
35 () => {
36 context.fill();
37 },
38 () => {
39 context.stroke();
40 },
41 ]);
42}
43
44function performActionsWebGL() {
45 let context = document.createElement("canvas").getContext("webgl");
46 performActions([
47 () => {
48 context.drawArrays(1, 2, 3);
49 },
50 () => {
51 context.drawElements(1, 2, 3, 4);
52 },
53 ]);
54}
55
56function test() {
57 let suite = InspectorTest.createAsyncSuite("Canvas.setCreationRecordingFrameCount");
58
59 function addTest({name, description, frameCount, expression, handleRecordingStarted, handleRecordingStopped, handleLastFrame}) {
60 suite.addTestCase({
61 name,
62 description,
63 test(resolve, reject) {
64 CanvasAgent.setCreationRecordingFrameCount(frameCount).catch(reject);
65
66 let canvas = null;
67
68 function handleRecordingStartedWrapper(event)
69 {
70 InspectorTest.assert(event.target === canvas, "Should be recording the canvas.");
71
72 handleRecordingStarted(canvas);
73 }
74
75 function handleRecordingStoppedWrapper(event)
76 {
77 InspectorTest.assert(event.target === canvas, "Should be recording the canvas.");
78
79 handleRecordingStopped(canvas, event.data.recording);
80 }
81
82 WI.canvasManager.awaitEvent(WI.CanvasManager.Event.CanvasAdded)
83 .then((event) => {
84 canvas = event.data.canvas;
85
86 canvas.addEventListener(WI.Canvas.Event.RecordingStarted, handleRecordingStartedWrapper);
87 canvas.addEventListener(WI.Canvas.Event.RecordingStopped, handleRecordingStoppedWrapper);
88 });
89
90 InspectorTest.awaitEvent("LastFrame")
91 .then((event) => {
92 canvas.removeEventListener(WI.Canvas.Event.RecordingStarted, handleRecordingStartedWrapper);
93 canvas.removeEventListener(WI.Canvas.Event.RecordingStopped, handleRecordingStoppedWrapper);
94
95 handleLastFrame(canvas);
96 })
97 .then(resolve, reject);
98
99 InspectorTest.evaluateInPage(expression).catch(reject);
100 },
101 });
102 }
103
104 addTest({
105 name: "Canvas.setCreationRecordingFrameCount.2D.None",
106 description: "Check that newly created 2D contexts are not recorded when setCreationRecordingFrameCount is 0.",
107 frameCount: 0,
108 expression: `performActions2D()`,
109 handleRecordingStarted(canvas) {
110 InspectorTest.fail("Canvas should not be recording.");
111 },
112 handleRecordingStopped(canvas, recording) {
113 InspectorTest.fail("Canvas should not be recording.");
114 },
115 handleLastFrame(canvas) {
116 InspectorTest.expectEqual(canvas.recordingCollection.size, 0, "Canvas should have no finished recordings.");
117 },
118 });
119
120 addTest({
121 name: "Canvas.setCreationRecordingFrameCount.2D.Single",
122 description: "Check that newly created 2D contexts only record one frame when setCreationRecordingFrameCount is 1.",
123 frameCount: 1,
124 expression: `performActions2D()`,
125 handleRecordingStarted(canvas) {
126 InspectorTest.pass("Recording started.");
127 },
128 handleRecordingStopped(canvas, recording) {
129 InspectorTest.pass("Recording stopped.");
130 InspectorTest.expectEqual(recording.frames.length, 1, "Recording should have one frame.");
131 InspectorTest.expectEqual(recording.frames[0].actions.length, 1, "Recording should have one action.");
132 },
133 handleLastFrame(canvas) {
134 InspectorTest.expectEqual(canvas.recordingCollection.size, 1, "Canvas should have one finished recording.");
135 },
136 });
137
138 addTest({
139 name: "Canvas.setCreationRecordingFrameCount.2D.Multiple",
140 description: "Check that newly created 2D contexts don't finish recording when setCreationRecordingFrameCount is 10.",
141 frameCount: 10,
142 expression: `performActions2D()`,
143 handleRecordingStarted(canvas) {
144 InspectorTest.pass("Recording started.");
145 },
146 handleRecordingStopped(canvas, recording) {
147 InspectorTest.fail("Canvas should not be done recording.");
148 },
149 handleLastFrame(canvas) {
150 InspectorTest.expectEqual(canvas.recordingCollection.size, 0, "Canvas should have no finished recordings.");
151 InspectorTest.expectThat(canvas.recordingActive, "Canvas should be actively recording.");
152 InspectorTest.expectEqual(canvas.recordingFrameCount, 2, "Recording should have 2 frames.");
153
154 canvas.stopRecording();
155 },
156 });
157
158 addTest({
159 name: "Canvas.setCreationRecordingFrameCount.WebGL.None",
160 description: "Check that newly created WebGL contexts are not recorded when setCreationRecordingFrameCount is 0.",
161 frameCount: 0,
162 expression: `performActionsWebGL()`,
163 handleRecordingStarted(canvas) {
164 InspectorTest.fail("Canvas should not be recording.");
165 },
166 handleRecordingStopped(canvas, recording) {
167 InspectorTest.fail("Canvas should not be recording.");
168 },
169 handleLastFrame(canvas) {
170 InspectorTest.expectEqual(canvas.recordingCollection.size, 0, "Canvas should have no finished recordings.");
171 },
172 });
173
174 addTest({
175 name: "Canvas.setCreationRecordingFrameCount.WebGL.Single",
176 description: "Check that newly created WebGL contexts only record one frame when setCreationRecordingFrameCount is 1.",
177 frameCount: 1,
178 expression: `performActionsWebGL()`,
179 handleRecordingStarted(canvas) {
180 InspectorTest.pass("Recording started.");
181 },
182 handleRecordingStopped(canvas, recording) {
183 InspectorTest.pass("Recording stopped.");
184 InspectorTest.expectEqual(recording.frames.length, 1, "Recording should have one frame.");
185 InspectorTest.expectEqual(recording.frames[0].actions.length, 1, "Recording should have one action.");
186 },
187 handleLastFrame(canvas) {
188 InspectorTest.expectEqual(canvas.recordingCollection.size, 1, "Canvas should have one finished recording.");
189 },
190 });
191
192 addTest({
193 name: "Canvas.setCreationRecordingFrameCount.WebGL.Multiple",
194 description: "Check that newly created WebGL contexts don't finish recording when setCreationRecordingFrameCount is 10.",
195 frameCount: 10,
196 expression: `performActionsWebGL()`,
197 handleRecordingStarted(canvas) {
198 InspectorTest.pass("Recording started.");
199 },
200 handleRecordingStopped(canvas, recording) {
201 InspectorTest.fail("Canvas should not be done recording.");
202 },
203 handleLastFrame(canvas) {
204 InspectorTest.expectEqual(canvas.recordingCollection.size, 0, "Canvas should have no finished recordings.");
205 InspectorTest.expectThat(canvas.recordingActive, "Canvas should be actively recording.");
206 InspectorTest.expectEqual(canvas.recordingFrameCount, 2, "Recording should have 2 frames.");
207
208 canvas.stopRecording();
209 },
210 });
211
212 suite.runTestCasesAndFinish();
213}
214</script>
215</head>
216<body onload="runTest()">
217 <p>Test that contexts created after calling Canvas.setCreationRecordingFrameCount are properly recorded.</p>
218</body>
219</html>