From 5f8de423f190bbb79a62f804151bc24824fa32d8 Mon Sep 17 00:00:00 2001 From: "Matt A. Tobin" Date: Fri, 2 Feb 2018 04:16:08 -0500 Subject: Add m-esr52 at 52.6.0 --- devtools/shared/specs/canvas.js | 131 ++++++++++++++++++++++++++++++++++++++++ 1 file changed, 131 insertions(+) create mode 100644 devtools/shared/specs/canvas.js (limited to 'devtools/shared/specs/canvas.js') diff --git a/devtools/shared/specs/canvas.js b/devtools/shared/specs/canvas.js new file mode 100644 index 000000000..dcb26f9a9 --- /dev/null +++ b/devtools/shared/specs/canvas.js @@ -0,0 +1,131 @@ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ +"use strict"; + +const protocol = require("devtools/shared/protocol"); +const {Arg, Option, RetVal, generateActorSpec} = protocol; + +/** + * Type representing an ArrayBufferView, serialized fast(er). + * + * Don't create a new array buffer view from the parsed array on the frontend. + * Consumers may copy the data into an existing buffer, or create a new one if + * necesasry. For example, this avoids the need for a redundant copy when + * populating ImageData objects, at the expense of transferring char views + * of a pixel buffer over the protocol instead of a packed int view. + * + * XXX: It would be nice if on local connections (only), we could just *give* + * the buffer directly to the front, instead of going through all this + * serialization redundancy. + */ +protocol.types.addType("array-buffer-view", { + write: (v) => "[" + Array.join(v, ",") + "]", + read: (v) => JSON.parse(v) +}); + +/** + * Type describing a thumbnail or screenshot in a recorded animation frame. + */ +protocol.types.addDictType("snapshot-image", { + index: "number", + width: "number", + height: "number", + scaling: "number", + flipped: "boolean", + pixels: "array-buffer-view" +}); + +/** + * Type describing an overview of a recorded animation frame. + */ +protocol.types.addDictType("snapshot-overview", { + calls: "array:function-call", + thumbnails: "array:snapshot-image", + screenshot: "snapshot-image" +}); + +exports.CANVAS_CONTEXTS = [ + "CanvasRenderingContext2D", + "WebGLRenderingContext" +]; + +exports.ANIMATION_GENERATORS = [ + "requestAnimationFrame" +]; + +exports.LOOP_GENERATORS = [ + "setTimeout" +]; + +exports.DRAW_CALLS = [ + // 2D canvas + "fill", + "stroke", + "clearRect", + "fillRect", + "strokeRect", + "fillText", + "strokeText", + "drawImage", + + // WebGL + "clear", + "drawArrays", + "drawElements", + "finish", + "flush" +]; + +exports.INTERESTING_CALLS = [ + // 2D canvas + "save", + "restore", + + // WebGL + "useProgram" +]; + +const frameSnapshotSpec = generateActorSpec({ + typeName: "frame-snapshot", + + methods: { + getOverview: { + response: { overview: RetVal("snapshot-overview") } + }, + generateScreenshotFor: { + request: { call: Arg(0, "function-call") }, + response: { screenshot: RetVal("snapshot-image") } + }, + }, +}); + +exports.frameSnapshotSpec = frameSnapshotSpec; + +const canvasSpec = generateActorSpec({ + typeName: "canvas", + + methods: { + setup: { + request: { reload: Option(0, "boolean") }, + oneway: true + }, + finalize: { + oneway: true + }, + isInitialized: { + response: { initialized: RetVal("boolean") } + }, + isRecording: { + response: { recording: RetVal("boolean") } + }, + recordAnimationFrame: { + response: { snapshot: RetVal("nullable:frame-snapshot") } + }, + stopRecordingAnimationFrame: { + oneway: true + }, + } +}); + +exports.canvasSpec = canvasSpec; -- cgit v1.2.3