summaryrefslogtreecommitdiffstats
path: root/toolkit/components/extensions/test/mochitest/test_chrome_ext_svg_context_fill.html
diff options
context:
space:
mode:
Diffstat (limited to 'toolkit/components/extensions/test/mochitest/test_chrome_ext_svg_context_fill.html')
-rw-r--r--toolkit/components/extensions/test/mochitest/test_chrome_ext_svg_context_fill.html204
1 files changed, 204 insertions, 0 deletions
diff --git a/toolkit/components/extensions/test/mochitest/test_chrome_ext_svg_context_fill.html b/toolkit/components/extensions/test/mochitest/test_chrome_ext_svg_context_fill.html
new file mode 100644
index 0000000000..c15ae9adf7
--- /dev/null
+++ b/toolkit/components/extensions/test/mochitest/test_chrome_ext_svg_context_fill.html
@@ -0,0 +1,204 @@
+<!DOCTYPE HTML>
+<html>
+<head>
+ <title>Test for permissions</title>
+ <script src="chrome://mochikit/content/tests/SimpleTest/SimpleTest.js"></script>
+ <script src="chrome://mochikit/content/tests/SimpleTest/EventUtils.js"></script>
+ <script src="chrome://mochikit/content/tests/SimpleTest/ExtensionTestUtils.js"></script>
+ <link rel="stylesheet" href="chrome://mochikit/content/tests/SimpleTest/test.css"/>
+</head>
+<body>
+ <style>
+ img {
+ -moz-context-properties: fill;
+ fill: green;
+ }
+
+ img, div.ref {
+ width: 100px;
+ height: 100px;
+ }
+
+ div#green {
+ background: green;
+ }
+
+ div#red {
+ background: red;
+ }
+ </style>
+ <h3>Testing on: <span id="test-params"></span></h3>
+ <table>
+ <thead>
+ <tr>
+ <th>webext image</th>
+ <th>allowed ref</th>
+ <th>disallowed ref</th>
+ </tr>
+ </thead>
+ <tbody>
+ <tr>
+ <td>
+ <img id="actual">
+ </td>
+ <td>
+ <div id="green" class="ref"></div>
+ </td>
+ <td>
+ <div id="red" class="ref"></div>
+ </td>
+ </tr>
+ </tbody>
+ </table>
+
+<script type="text/javascript">
+"use strict";
+
+const { TestUtils } = SpecialPowers.ChromeUtils.importESModule(
+ "resource://testing-common/TestUtils.sys.mjs"
+);
+
+function screenshotPage(win, elementSelector) {
+ const el = win.document.querySelector(elementSelector);
+ return TestUtils.screenshotArea(el, win);
+}
+
+async function test_moz_extension_svg_context_fill({
+ addonId,
+ isPrivileged,
+ expectAllowed,
+}) {
+ // Include current test params in the rendered html page (to be included in failure
+ // screenshots).
+ document.querySelector("#test-params").textContent = JSON.stringify({
+ addonId,
+ isPrivileged,
+ expectAllowed,
+ });
+
+ let extDefinition = {
+ manifest: {
+ browser_specific_settings: { gecko: { id: addonId } },
+ },
+ background() {
+ browser.test.sendMessage("svg-url", browser.runtime.getURL("context-fill-fallback-red.svg"));
+ },
+ files: {
+ "context-fill-fallback-red.svg": `
+ <svg xmlns="http://www.w3.org/2000/svg" version="1.1"
+ xmlns:xlink="http://www.w3.org/1999/xlink">
+ <rect height="100%" width="100%" fill="context-fill red" />
+ </svg>
+ `,
+ },
+ }
+
+ if (isPrivileged) {
+ // isPrivileged is unused when useAddonManager is set (see ExtensionTestCommon.generate),
+ // the internal permission being tested is only added when the extension has a startupReason
+ // related to new installations and upgrades/downgrades and so the `startupReason` is set here
+ // to be able to mock the startupReason expected when useAddonManager can't be used.
+ extDefinition = {
+ ...extDefinition,
+ isPrivileged,
+ startupReason: "ADDON_INSTALL",
+ };
+ } else {
+ // useAddonManager temporary is instead used to explicitly test the other cases when the extension
+ // is not expected to be privileged.
+ extDefinition = {
+ ...extDefinition,
+ useAddonManager: "temporary",
+ };
+ }
+
+ const extension = ExtensionTestUtils.loadExtension(extDefinition);
+
+ await extension.startup();
+
+ // Set the extension url on the img element part of the
+ // comparison table defined in the html part of this test file.
+ const svgURL = await extension.awaitMessage("svg-url");
+ document.querySelector("#actual").src = svgURL;
+
+ let screenshots;
+
+ // Wait until the svg context fill has been applied
+ // (unfortunately waiting for a document reflow does
+ // not seem to be enough).
+ const expectedColor = expectAllowed ? "green" : "red";
+ await TestUtils.waitForCondition(
+ async () => {
+ const result = await screenshotPage(window, "#actual");
+ const reference = await screenshotPage(window, `#${expectedColor}`);
+ screenshots = {result, reference};
+ return result == reference;
+ },
+ `Context-fill should be ${
+ expectAllowed ? "allowed" : "disallowed"
+ } (resulting in ${expectedColor}) on "${addonId}" extension`
+ );
+
+ // At least an assertion is required to prevent the test from
+ // failing.
+ is(
+ screenshots.result,
+ screenshots.reference,
+ "svg context-fill test completed, result does match reference"
+ );
+
+ await extension.unload();
+}
+
+// This test file verify that the non-standard svg context-fill feature is allowed
+// on extensions svg files coming from Mozilla-owned extensions.
+//
+// NOTE: line extension permission to use context fill is tested in test_recommendations.js
+
+add_task(async function test_allowed_on_privileged_ext() {
+ await test_moz_extension_svg_context_fill({
+ addonId: "privileged-addon@mochi.test",
+ isPrivileged: true,
+ expectAllowed: true,
+ });
+});
+
+add_task(async function test_disallowed_on_non_privileged_ext() {
+ await test_moz_extension_svg_context_fill({
+ addonId: "non-privileged-arbitrary-addon-id@mochi.test",
+ isPrivileged: false,
+ expectAllowed: false,
+ });
+});
+
+add_task(async function test_allowed_on_privileged_ext_with_mozilla_id() {
+ await test_moz_extension_svg_context_fill({
+ addonId: "privileged-addon@mozilla.org",
+ isPrivileged: true,
+ expectAllowed: true,
+ });
+
+ await test_moz_extension_svg_context_fill({
+ addonId: "privileged-addon@mozilla.com",
+ isPrivileged: true,
+ expectAllowed: true,
+ });
+});
+
+add_task(async function test_allowed_on_non_privileged_ext_with_mozilla_id() {
+ await test_moz_extension_svg_context_fill({
+ addonId: "non-privileged-addon@mozilla.org",
+ isPrivileged: false,
+ expectAllowed: true,
+ });
+
+ await test_moz_extension_svg_context_fill({
+ addonId: "non-privileged-addon@mozilla.com",
+ isPrivileged: false,
+ expectAllowed: true,
+ });
+});
+</script>
+
+</body>
+</html>