/* 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";
add_setup(async function () {
await SpecialPowers.pushPrefEnv({
set: [["test.wait300msAfterTabSwitch", true]],
});
});
// Adapted from widget/tests/file_test_clipboard_pngPreservesTransparency.js
async function getPNGFromClipboard(clipboard) {
let trans = Cc["@mozilla.org/widget/transferable;1"].createInstance(
Ci.nsITransferable
);
trans.init(null);
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);
// eslint-disable-next-line no-undef
let decoder = new ImageDecoder({ type: "image/png", data });
let { image } = await decoder.decode();
return image;
}
add_task(async function test_copy_canvas_image() {
const PAGE = `data:text/html;charset=utf-8,
`;
await BrowserTestUtils.withNewTab(PAGE, async browser => {
let menu = document.getElementById("contentAreaContextMenu");
let popupShown = BrowserTestUtils.waitForEvent(menu, "popupshown");
BrowserTestUtils.synthesizeMouseAtCenter(
"canvas",
{ type: "contextmenu", button: 2 },
browser
);
await popupShown;
let copyItem = menu.querySelector("#context-copyimage-contents");
ok(!copyItem.hidden, "Copy Image should be visible for canvas");
ok(!copyItem.disabled, "Copy Image should be enabled for canvas");
SpecialPowers.clipboardCopyString("clear");
menu.activateItem(copyItem);
await TestUtils.waitForCondition(() => {
try {
return Services.clipboard.hasDataMatchingFlavors(
["application/x-moz-nativeimage", "image/png"],
Services.clipboard.kGlobalClipboard
);
} catch {
return false;
}
}, "Waiting for image data on clipboard");
let pngData = await getPNGFromClipboard(Services.clipboard);
ok(pngData, "Should have image data on clipboard");
is(pngData.displayWidth, 100, "Image width should be 100");
is(pngData.displayHeight, 100, "Image height should be 100");
});
});