forked from mirrors/gecko-dev
		
	
		
			
				
	
	
		
			197 lines
		
	
	
	
		
			6.3 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
			
		
		
	
	
			197 lines
		
	
	
	
		
			6.3 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
| /* Any copyright is dedicated to the Public Domain.
 | |
|    http://creativecommons.org/publicdomain/zero/1.0/ */
 | |
| 
 | |
| "use strict";
 | |
| 
 | |
| const chrome_base = getRootDirectory(gTestPath);
 | |
| 
 | |
| /* import-globals-from contextmenu_common.js */
 | |
| Services.scriptloader.loadSubScript(
 | |
|   chrome_base + "contextmenu_common.js",
 | |
|   this
 | |
| );
 | |
| const http_base = chrome_base.replace(
 | |
|   "chrome://mochitests/content",
 | |
|   "https://example.com"
 | |
| );
 | |
| 
 | |
| async function test_view_image_works({ page, selector, urlChecker }) {
 | |
|   let mainURL = http_base + page;
 | |
|   let accel = AppConstants.platform == "macosx" ? "metaKey" : "ctrlKey";
 | |
|   let tests = {
 | |
|     tab: {
 | |
|       modifiers: { [accel]: true },
 | |
|       async loadedPromise() {
 | |
|         return BrowserTestUtils.waitForNewTab(gBrowser, urlChecker, true).then(
 | |
|           t => t.linkedBrowser
 | |
|         );
 | |
|       },
 | |
|       cleanup(browser) {
 | |
|         BrowserTestUtils.removeTab(gBrowser.getTabForBrowser(browser));
 | |
|       },
 | |
|     },
 | |
|     window: {
 | |
|       modifiers: { shiftKey: true },
 | |
|       async loadedPromise() {
 | |
|         // Unfortunately we can't predict the URL so can't just pass that to waitForNewWindow
 | |
|         let w = await BrowserTestUtils.waitForNewWindow();
 | |
|         let browser = w.gBrowser.selectedBrowser;
 | |
|         let getCx = () => browser.browsingContext;
 | |
|         await TestUtils.waitForCondition(
 | |
|           () =>
 | |
|             getCx() && urlChecker(getCx().currentWindowGlobal.documentURI.spec)
 | |
|         );
 | |
|         await SpecialPowers.spawn(browser, [], () => {
 | |
|           return ContentTaskUtils.waitForCondition(
 | |
|             () => content.document.readyState == "complete"
 | |
|           );
 | |
|         });
 | |
|         return browser;
 | |
|       },
 | |
|       async cleanup(browser) {
 | |
|         return BrowserTestUtils.closeWindow(browser.ownerGlobal);
 | |
|       },
 | |
|     },
 | |
|     tab_default: {
 | |
|       modifiers: {},
 | |
|       async loadedPromise() {
 | |
|         return BrowserTestUtils.waitForNewTab(gBrowser, urlChecker, true).then(
 | |
|           t => {
 | |
|             is(t.selected, false, "Tab should not be selected.");
 | |
|             return t.linkedBrowser;
 | |
|           }
 | |
|         );
 | |
|       },
 | |
|       cleanup(browser) {
 | |
|         is(gBrowser.tabs.length, 3, "number of tabs");
 | |
|         BrowserTestUtils.removeTab(gBrowser.getTabForBrowser(browser));
 | |
|       },
 | |
|     },
 | |
|     tab_default_flip_bg_pref: {
 | |
|       prefs: [["browser.tabs.loadInBackground", false]],
 | |
|       modifiers: {},
 | |
|       async loadedPromise() {
 | |
|         return BrowserTestUtils.waitForNewTab(gBrowser, urlChecker, true).then(
 | |
|           t => {
 | |
|             is(t.selected, true, "Tab should be selected with pref flipped.");
 | |
|             return t.linkedBrowser;
 | |
|           }
 | |
|         );
 | |
|       },
 | |
|       cleanup(browser) {
 | |
|         is(gBrowser.tabs.length, 3, "number of tabs");
 | |
|         BrowserTestUtils.removeTab(gBrowser.getTabForBrowser(browser));
 | |
|       },
 | |
|     },
 | |
|   };
 | |
|   await BrowserTestUtils.withNewTab(mainURL, async browser => {
 | |
|     await SpecialPowers.spawn(browser, [], () => {
 | |
|       return ContentTaskUtils.waitForCondition(
 | |
|         () => !content.document.documentElement.classList.contains("wait")
 | |
|       );
 | |
|     });
 | |
|     for (let [testLabel, test] of Object.entries(tests)) {
 | |
|       if (test.prefs) {
 | |
|         await SpecialPowers.pushPrefEnv({ set: test.prefs });
 | |
|       }
 | |
|       let contextMenu = document.getElementById("contentAreaContextMenu");
 | |
|       is(
 | |
|         contextMenu.state,
 | |
|         "closed",
 | |
|         `${testLabel} - checking if popup is closed`
 | |
|       );
 | |
|       let promisePopupShown = BrowserTestUtils.waitForEvent(
 | |
|         contextMenu,
 | |
|         "popupshown"
 | |
|       );
 | |
|       await BrowserTestUtils.synthesizeMouse(
 | |
|         selector,
 | |
|         2,
 | |
|         2,
 | |
|         { type: "contextmenu", button: 2 },
 | |
|         browser
 | |
|       );
 | |
|       await promisePopupShown;
 | |
|       info(`${testLabel} - Popup Shown`);
 | |
|       let promisePopupHidden = BrowserTestUtils.waitForEvent(
 | |
|         contextMenu,
 | |
|         "popuphidden"
 | |
|       );
 | |
|       let browserPromise = test.loadedPromise();
 | |
|       contextMenu.activateItem(
 | |
|         document.getElementById("context-viewimage"),
 | |
|         test.modifiers
 | |
|       );
 | |
|       await promisePopupHidden;
 | |
| 
 | |
|       let newBrowser = await browserPromise;
 | |
|       let { documentURI } = newBrowser.browsingContext.currentWindowGlobal;
 | |
|       if (documentURI.spec.startsWith("data:image/svg")) {
 | |
|         await SpecialPowers.spawn(newBrowser, [testLabel], msgPrefix => {
 | |
|           let svgEl = content.document.querySelector("svg");
 | |
|           ok(svgEl, `${msgPrefix} - should have loaded SVG.`);
 | |
|           is(svgEl.height.baseVal.value, 500, `${msgPrefix} - SVG has height`);
 | |
|           is(svgEl.width.baseVal.value, 500, `${msgPrefix} - SVG has height`);
 | |
|         });
 | |
|       } else {
 | |
|         await SpecialPowers.spawn(newBrowser, [testLabel], msgPrefix => {
 | |
|           let img = content.document.querySelector("img");
 | |
|           ok(
 | |
|             img instanceof Ci.nsIImageLoadingContent,
 | |
|             `${msgPrefix} - Image should have loaded content.`
 | |
|           );
 | |
|           const request = img.getRequest(
 | |
|             Ci.nsIImageLoadingContent.CURRENT_REQUEST
 | |
|           );
 | |
|           ok(
 | |
|             request.imageStatus & request.STATUS_LOAD_COMPLETE,
 | |
|             `${msgPrefix} - Should have loaded image.`
 | |
|           );
 | |
|         });
 | |
|       }
 | |
|       await test.cleanup(newBrowser);
 | |
|       if (test.prefs) {
 | |
|         await SpecialPowers.popPrefEnv();
 | |
|       }
 | |
|     }
 | |
|   });
 | |
| }
 | |
| 
 | |
| /**
 | |
|  * Verify that the 'view image' context menu in a new tab for a canvas works,
 | |
|  * when opened in a new tab, a new window, or in the same tab.
 | |
|  */
 | |
| add_task(async function test_view_image_canvas_works() {
 | |
|   await test_view_image_works({
 | |
|     page: "subtst_contextmenu.html",
 | |
|     selector: "#test-canvas",
 | |
|     urlChecker: url => url.startsWith("blob:"),
 | |
|   });
 | |
| });
 | |
| 
 | |
| /**
 | |
|  * Test for https://bugzilla.mozilla.org/show_bug.cgi?id=1625786
 | |
|  */
 | |
| add_task(async function test_view_image_revoked_cached_blob() {
 | |
|   await test_view_image_works({
 | |
|     page: "test_view_image_revoked_cached_blob.html",
 | |
|     selector: "#second",
 | |
|     urlChecker: url => url.startsWith("blob:"),
 | |
|   });
 | |
| });
 | |
| 
 | |
| /**
 | |
|  * Test for https://bugzilla.mozilla.org/show_bug.cgi?id=1738190
 | |
|  * Inline SVG data URIs as a background image should also open.
 | |
|  */
 | |
| add_task(async function test_view_image_inline_svg_bgimage() {
 | |
|   await SpecialPowers.pushPrefEnv({
 | |
|     // This is the default but we turn it off for unit tests.
 | |
|     set: [["security.data_uri.block_toplevel_data_uri_navigations", true]],
 | |
|   });
 | |
|   await test_view_image_works({
 | |
|     page: "test_view_image_inline_svg.html",
 | |
|     selector: "body",
 | |
|     urlChecker: url => url.startsWith("data:"),
 | |
|   });
 | |
| });
 | 
