1
0
Fork 0
firefox/widget/tests/file_test_clipboard_pngPreservesTransparency.js
Daniel Baumann 5e9a113729
Adding upstream version 140.0.
Signed-off-by: Daniel Baumann <daniel.baumann@progress-linux.org>
2025-06-25 09:37:52 +02:00

100 lines
3 KiB
JavaScript

/* Any copyright is dedicated to the Public Domain.
http://creativecommons.org/publicdomain/zero/1.0/ */
/* globals ImageDecoder */
/* import-globals-from clipboard_helper.js */
"use strict";
function getLoadContext() {
return SpecialPowers.wrap(window).docShell.QueryInterface(Ci.nsILoadContext);
}
// Get clipboard data to paste.
async function getPNGFromClipboard(clipboard) {
let trans = Cc["@mozilla.org/widget/transferable;1"].createInstance(
Ci.nsITransferable
);
trans.init(getLoadContext());
trans.addDataFlavor("image/png");
clipboard.getData(
trans,
Ci.nsIClipboard.kGlobalClipboard,
SpecialPowers.wrap(window).browsingContext.currentWindowContext
);
let obj = SpecialPowers.createBlankObject();
trans.getTransferData("image/png", obj);
let rawStream = obj.value.QueryInterface(Ci.nsIInputStream);
let stream = Cc["@mozilla.org/binaryinputstream;1"].createInstance();
stream.QueryInterface(Ci.nsIBinaryInputStream);
stream.setInputStream(rawStream);
let size = stream.available();
let data = new ArrayBuffer(size);
stream.readArrayBuffer(size, data);
let decoder = new ImageDecoder({ type: "image/png", data });
let { image } = await decoder.decode();
return image;
}
async function putOnClipboard(expected, operationFn, desc, type) {
try {
await SimpleTest.promiseClipboardChange(expected, operationFn, type, 1000);
} catch (e) {
throw new Error(`Failed "${desc}" due to "${e.toString()}"`);
}
}
add_setup(function init() {
cleanupAllClipboard();
});
add_task(async function test_copy() {
// Copy the image's data to the clipboard
await SpecialPowers.pushPrefEnv({
set: [["clipboard.copy_image.as_png", true]],
});
await putOnClipboard(
"",
() => {
SpecialPowers.setCommandNode(
window,
document.getElementById("pngWithTransparency")
);
SpecialPowers.doCommand(window, "cmd_copyImageContents");
},
"copy changed clipboard when preference is disabled"
);
// Get the data from the clipboard
let imagePng = await getPNGFromClipboard(clipboard);
// Make sure the resulting PNG has transparency
// by drawing on a canvas
let canvas = document.getElementById("targetCanvas");
let ctx = canvas.getContext("2d");
// The image is transparent in the top left corner.
// Fill the canvas with a color that is not in the image
ctx.fillStyle = "rgb(10, 30, 230)";
ctx.fillRect(0, 0, 200, 200);
ctx.drawImage(imagePng, 0, 0);
let imageData = ctx.getImageData(0, 0, 1, 1);
// getImageData() returns in RGBA order
is(imageData.data[0], 10, "R value should not have changed");
is(imageData.data[1], 30, "G value should not have changed");
is(imageData.data[2], 230, "B value should not have changed");
imageData = ctx.getImageData(100, 100, 1, 1);
is(imageData.data[0], 255, "R in circle is red");
// is(imageData.data[1], 0, "G in circle is red");
is(imageData.data[2], 0, "B in circle is red");
cleanupAllClipboard();
await SpecialPowers.popPrefEnv();
});