forked from mirrors/gecko-dev
		
	
		
			
				
	
	
		
			144 lines
		
	
	
	
		
			4.5 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
			
		
		
	
	
			144 lines
		
	
	
	
		
			4.5 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
/* Any copyright is dedicated to the Public Domain.
 | 
						|
  http://creativecommons.org/publicdomain/zero/1.0/ */
 | 
						|
 | 
						|
"use strict";
 | 
						|
 | 
						|
const { sinon } = ChromeUtils.importESModule(
 | 
						|
  "resource://testing-common/Sinon.sys.mjs"
 | 
						|
);
 | 
						|
const BASE = getRootDirectory(gTestPath).replace(
 | 
						|
  "chrome://mochitests/content",
 | 
						|
  // eslint-disable-next-line @microsoft/sdl/no-insecure-url
 | 
						|
  "http://example.com"
 | 
						|
);
 | 
						|
const TEST_URL = BASE + "browser_contextmenu_shareurl.html";
 | 
						|
 | 
						|
let mockShareData = [
 | 
						|
  {
 | 
						|
    name: "Test",
 | 
						|
    menuItemTitle: "Sharing Service Test",
 | 
						|
    image:
 | 
						|
      "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAIAAAD8GO2jAAAAKE" +
 | 
						|
      "lEQVR42u3NQQ0AAAgEoNP+nTWFDzcoQE1udQQCgUAgEAgEAsGTYAGjxAE/G/Q2tQAAAABJRU5ErkJggg==",
 | 
						|
  },
 | 
						|
];
 | 
						|
 | 
						|
// Setup spies for observing function calls from MacSharingService
 | 
						|
let shareUrlSpy = sinon.spy();
 | 
						|
let openSharingPreferencesSpy = sinon.spy();
 | 
						|
let getSharingProvidersSpy = sinon.spy();
 | 
						|
 | 
						|
let stub = sinon.stub(gBrowser, "MacSharingService").get(() => {
 | 
						|
  return {
 | 
						|
    getSharingProviders(url) {
 | 
						|
      getSharingProvidersSpy(url);
 | 
						|
      return mockShareData;
 | 
						|
    },
 | 
						|
    shareUrl(name, url, title) {
 | 
						|
      shareUrlSpy(name, url, title);
 | 
						|
    },
 | 
						|
    openSharingPreferences() {
 | 
						|
      openSharingPreferencesSpy();
 | 
						|
    },
 | 
						|
  };
 | 
						|
});
 | 
						|
 | 
						|
registerCleanupFunction(async function () {
 | 
						|
  stub.restore();
 | 
						|
});
 | 
						|
 | 
						|
/**
 | 
						|
 * Test the "Share" item menus in the tab contextmenu on MacOSX.
 | 
						|
 */
 | 
						|
add_task(async function test_contextmenu_share_macosx() {
 | 
						|
  await BrowserTestUtils.withNewTab(TEST_URL, async () => {
 | 
						|
    let contextMenu = await openTabContextMenu(gBrowser.selectedTab);
 | 
						|
    await BrowserTestUtils.waitForMutationCondition(
 | 
						|
      contextMenu,
 | 
						|
      { childList: true },
 | 
						|
      () => contextMenu.querySelector(".share-tab-url-item")
 | 
						|
    );
 | 
						|
    ok(true, "Got Share item");
 | 
						|
 | 
						|
    await openMenuPopup(contextMenu);
 | 
						|
    ok(getSharingProvidersSpy.calledOnce, "getSharingProviders called");
 | 
						|
 | 
						|
    info(
 | 
						|
      "Check we have a service and one extra menu item for the More... button"
 | 
						|
    );
 | 
						|
    let popup = contextMenu.querySelector(".share-tab-url-item").menupopup;
 | 
						|
    let items = popup.querySelectorAll("menuitem");
 | 
						|
    is(items.length, 2, "There should be 2 sharing services.");
 | 
						|
 | 
						|
    info("Click on the sharing service");
 | 
						|
    let menuPopupClosedPromised = BrowserTestUtils.waitForPopupEvent(
 | 
						|
      contextMenu,
 | 
						|
      "hidden"
 | 
						|
    );
 | 
						|
    let shareButton = items[0];
 | 
						|
    is(
 | 
						|
      shareButton.label,
 | 
						|
      mockShareData[0].menuItemTitle,
 | 
						|
      "Share button's label should match the service's menu item title. "
 | 
						|
    );
 | 
						|
    is(
 | 
						|
      shareButton.getAttribute("share-name"),
 | 
						|
      mockShareData[0].name,
 | 
						|
      "Share button's share-name value should match the service's name. "
 | 
						|
    );
 | 
						|
 | 
						|
    popup.activateItem(shareButton);
 | 
						|
    await menuPopupClosedPromised;
 | 
						|
 | 
						|
    ok(shareUrlSpy.calledOnce, "shareUrl called");
 | 
						|
 | 
						|
    info("Check the correct data was shared.");
 | 
						|
    let [name, url, title] = shareUrlSpy.getCall(0).args;
 | 
						|
    is(name, mockShareData[0].name, "Shared correct service name");
 | 
						|
    is(url, TEST_URL, "Shared correct URL");
 | 
						|
    is(title, "Sharing URL", "Shared the correct title.");
 | 
						|
 | 
						|
    info("Test the More... button");
 | 
						|
    contextMenu = await openTabContextMenu(gBrowser.selectedTab);
 | 
						|
    await openMenuPopup(contextMenu);
 | 
						|
    // Since the tab context menu was collapsed previously, the popup needs to get the
 | 
						|
    // providers again.
 | 
						|
    ok(getSharingProvidersSpy.calledTwice, "getSharingProviders called again");
 | 
						|
    popup = contextMenu.querySelector(".share-tab-url-item").menupopup;
 | 
						|
    items = popup.querySelectorAll("menuitem");
 | 
						|
    is(items.length, 2, "There should be 2 sharing services.");
 | 
						|
 | 
						|
    info("Click on the More Button");
 | 
						|
    let moreButton = items[1];
 | 
						|
    menuPopupClosedPromised = BrowserTestUtils.waitForPopupEvent(
 | 
						|
      contextMenu,
 | 
						|
      "hidden"
 | 
						|
    );
 | 
						|
    popup.activateItem(moreButton);
 | 
						|
    await menuPopupClosedPromised;
 | 
						|
    ok(openSharingPreferencesSpy.calledOnce, "openSharingPreferences called");
 | 
						|
  });
 | 
						|
});
 | 
						|
 | 
						|
/**
 | 
						|
 * Helper for opening the toolbar context menu.
 | 
						|
 */
 | 
						|
async function openTabContextMenu(tab) {
 | 
						|
  info("Opening tab context menu");
 | 
						|
  let contextMenu = document.getElementById("tabContextMenu");
 | 
						|
  let openTabContextMenuPromise = BrowserTestUtils.waitForPopupEvent(
 | 
						|
    contextMenu,
 | 
						|
    "shown"
 | 
						|
  );
 | 
						|
 | 
						|
  EventUtils.synthesizeMouseAtCenter(tab, { type: "contextmenu" });
 | 
						|
  await openTabContextMenuPromise;
 | 
						|
  return contextMenu;
 | 
						|
}
 | 
						|
 | 
						|
async function openMenuPopup(contextMenu) {
 | 
						|
  info("Opening Share menu popup.");
 | 
						|
  let shareItem = contextMenu.querySelector(".share-tab-url-item");
 | 
						|
  shareItem.openMenu(true);
 | 
						|
  await BrowserTestUtils.waitForPopupEvent(shareItem.menupopup, "shown");
 | 
						|
}
 |