summaryrefslogtreecommitdiffstats
path: root/image/test/browser/head.js
diff options
context:
space:
mode:
Diffstat (limited to '')
-rw-r--r--image/test/browser/head.js136
1 files changed, 136 insertions, 0 deletions
diff --git a/image/test/browser/head.js b/image/test/browser/head.js
new file mode 100644
index 0000000000..29fc67a1a7
--- /dev/null
+++ b/image/test/browser/head.js
@@ -0,0 +1,136 @@
+const RELATIVE_DIR = "image/test/browser/";
+const TESTROOT = "http://example.com/browser/" + RELATIVE_DIR;
+const TESTROOT2 = "http://example.org/browser/" + RELATIVE_DIR;
+
+var chrome_root = getRootDirectory(gTestPath);
+const CHROMEROOT = chrome_root;
+
+function getImageLoading(doc, id) {
+ return doc.getElementById(id);
+}
+
+// Tries to get the Moz debug image, imgIContainerDebug. Only works
+// in a debug build. If we succeed, we call func().
+function actOnMozImage(doc, id, func) {
+ var imgContainer = getImageLoading(doc, id).getRequest(
+ Ci.nsIImageLoadingContent.CURRENT_REQUEST
+ ).image;
+ var mozImage;
+ try {
+ mozImage = imgContainer.QueryInterface(Ci.imgIContainerDebug);
+ } catch (e) {
+ return false;
+ }
+ func(mozImage);
+ return true;
+}
+
+function assertPrefVal(name, val) {
+ let boolValue = Services.prefs.getBoolPref(name);
+ ok(boolValue === val, `pref ${name} is set to ${val}`);
+ if (boolValue !== val) {
+ throw Error(`pref ${name} is not set to ${val}`);
+ }
+}
+
+function assertFileProcess() {
+ // Ensure that the file content process is enabled.
+ assertPrefVal("browser.tabs.remote.separateFileUriProcess", true);
+}
+
+function assertSandboxHeadless() {
+ assertPrefVal("security.sandbox.content.headless", true);
+}
+
+function getPage() {
+ let filePage = undefined;
+ switch (Services.appinfo.OS) {
+ case "WINNT":
+ filePage = "file:///C:/";
+ break;
+ case "Darwin":
+ filePage = "file:///tmp/";
+ break;
+ case "Linux":
+ filePage = "file:///tmp/";
+ break;
+ default:
+ throw new Error("Unsupported operating system");
+ }
+ return filePage;
+}
+
+function getSize() {
+ let iconSize = undefined;
+ switch (Services.appinfo.OS) {
+ case "WINNT":
+ iconSize = 32;
+ break;
+ case "Darwin":
+ iconSize = 128;
+ break;
+ case "Linux":
+ iconSize = 128;
+ break;
+ default:
+ throw new Error("Unsupported operating system");
+ }
+ return iconSize;
+}
+
+async function createMozIconInFile(ext, expectSuccess = true) {
+ const kPAGE = getPage();
+ const kSize = expectSuccess ? getSize() : 24; // we get 24x24 when failing,
+ // e.g. when remoting is
+ // disabled and the sandbox
+ // headless is enabled
+
+ // open a tab in a file content process
+ let fileTab = await BrowserTestUtils.addTab(gBrowser, kPAGE, {
+ preferredRemoteType: "file",
+ });
+
+ // get the browser for the file content process tab
+ let fileBrowser = gBrowser.getBrowserForTab(fileTab);
+
+ let checkIcon = async (_ext, _kSize, _expectSuccess) => {
+ const img = content.document.createElement("img");
+ let waitLoad = new Promise(resolve => {
+ // only listen to successfull load event if we expect the image to
+ // actually load, e.g. with remoting disabled and sandbox headless
+ // enabled we dont expect it to work, and we will wait for onerror below
+ // to trigger.
+ if (_expectSuccess) {
+ img.addEventListener("load", resolve, { once: true });
+ }
+ img.onerror = () => {
+ // With remoting enabled,
+ // Verified to work by forcing early `return NS_ERROR_NOT_AVAILABLE;`
+ // within `nsIconChannel::GetIcon(nsIURI* aURI, ByteBuf* aDataOut)`
+ //
+ // With remoting disabled and sandbox headless enabled, this should be
+ // the default path, since we don't add the "load" event listener.
+ ok(!_expectSuccess, "Error while loading moz-icon");
+ resolve();
+ };
+ });
+ img.setAttribute("src", `moz-icon://.${_ext}?size=${_kSize}`);
+ img.setAttribute("id", `moz-icon-${_ext}-${_kSize}`);
+ content.document.body.appendChild(img);
+
+ await waitLoad;
+
+ const icon = content.document.getElementById(`moz-icon-${_ext}-${_kSize}`);
+ ok(icon !== null, `got a valid ${_ext} moz-icon`);
+ is(icon.width, _kSize, `${_kSize} px width ${_ext} moz-icon`);
+ is(icon.height, _kSize, `${_kSize} px height ${_ext} moz-icon`);
+ };
+
+ await BrowserTestUtils.browserLoaded(fileBrowser);
+ await SpecialPowers.spawn(
+ fileBrowser,
+ [ext, kSize, expectSuccess],
+ checkIcon
+ );
+ await BrowserTestUtils.removeTab(fileTab);
+}