123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132 |
- /* 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;
|