Bug 1368245 - Move browser_page_action_menu's copyURL test into its own clipboard subsuite specific test to try and avoid intermittents. r?mak
MozReview-Commit-ID: 5tipFLkpvbh
--- a/browser/base/content/test/urlbar/browser.ini
+++ b/browser/base/content/test/urlbar/browser.ini
@@ -118,8 +118,11 @@ support-files =
run-if = e10s
[browser_urlHighlight.js]
[browser_wyciwyg_urlbarCopying.js]
subsuite = clipboard
support-files =
test_wyciwyg_copying.html
[browser_page_action_menu.js]
run-if = nightly_build # Photon only
+[browser_page_action_menu_clipboard.js]
+run-if = nightly_build # Photon only
+subsuite = clipboard
--- a/browser/base/content/test/urlbar/browser_page_action_menu.js
+++ b/browser/base/content/test/urlbar/browser_page_action_menu.js
@@ -1,140 +1,114 @@
"use strict";
-let gPanel = document.getElementById("page-action-panel");
-
const mockRemoteClients = [
{ id: "0", name: "foo", type: "mobile" },
{ id: "1", name: "bar", type: "desktop" },
{ id: "2", name: "baz", type: "mobile" },
];
add_task(async function bookmark() {
// Open a unique page.
let url = "http://example.com/browser_page_action_menu";
await BrowserTestUtils.withNewTab(url, async () => {
// Open the panel.
- await promisePanelOpen();
+ await promisePageActionPanelOpen();
// The bookmark button should read "Bookmark This Page" and not be starred.
let bookmarkButton = document.getElementById("page-action-bookmark-button");
Assert.equal(bookmarkButton.label, "Bookmark This Page");
Assert.ok(!bookmarkButton.hasAttribute("starred"));
// Click the button.
- let hiddenPromise = promisePanelHidden();
+ let hiddenPromise = promisePageActionPanelHidden();
EventUtils.synthesizeMouseAtCenter(bookmarkButton, {});
await hiddenPromise;
// Make sure the edit-bookmark panel opens, then hide it.
await new Promise(resolve => {
if (StarUI.panel.state == "open") {
resolve();
return;
}
StarUI.panel.addEventListener("popupshown", resolve, { once: true });
});
StarUI.panel.hidePopup();
// Open the panel again.
- await promisePanelOpen();
+ await promisePageActionPanelOpen();
// The bookmark button should now read "Edit This Bookmark" and be starred.
Assert.equal(bookmarkButton.label, "Edit This Bookmark");
Assert.ok(bookmarkButton.hasAttribute("starred"));
Assert.equal(bookmarkButton.getAttribute("starred"), "true");
// Click it again.
- hiddenPromise = promisePanelHidden();
+ hiddenPromise = promisePageActionPanelHidden();
EventUtils.synthesizeMouseAtCenter(bookmarkButton, {});
await hiddenPromise;
// The edit-bookmark panel should open again.
await new Promise(resolve => {
if (StarUI.panel.state == "open") {
resolve();
return;
}
StarUI.panel.addEventListener("popupshown", resolve, { once: true });
});
// Click the remove-bookmark button in the panel.
StarUI._element("editBookmarkPanelRemoveButton").click();
// Open the panel again.
- await promisePanelOpen();
+ await promisePageActionPanelOpen();
// The bookmark button should read "Bookmark This Page" and not be starred.
Assert.equal(bookmarkButton.label, "Bookmark This Page");
Assert.ok(!bookmarkButton.hasAttribute("starred"));
// Done.
- hiddenPromise = promisePanelHidden();
- gPanel.hidePopup();
+ hiddenPromise = promisePageActionPanelHidden();
+ gPageActionPanel.hidePopup();
await hiddenPromise;
});
});
-add_task(async function copyURL() {
- // Open the panel.
- await promisePanelOpen();
-
- // Click Copy URL.
- let copyURLButton = document.getElementById("page-action-copy-url-button");
- let hiddenPromise = promisePanelHidden();
- EventUtils.synthesizeMouseAtCenter(copyURLButton, {});
- await hiddenPromise;
-
- // Check the clipboard.
- let transferable = Cc["@mozilla.org/widget/transferable;1"]
- .createInstance(Ci.nsITransferable);
- transferable.init(null);
- let flavor = "text/unicode";
- transferable.addDataFlavor(flavor);
- Services.clipboard.getData(transferable, Services.clipboard.kGlobalClipboard);
- let strObj = {};
- transferable.getTransferData(flavor, strObj, {});
- Assert.ok(!!strObj.value);
- strObj.value.QueryInterface(Ci.nsISupportsString);
- Assert.equal(strObj.value.data, gBrowser.selectedBrowser.currentURI.spec);
-});
-
add_task(async function emailLink() {
// Replace the email-link entry point to check whether it's called.
let originalFn = MailIntegration.sendLinkForBrowser;
let fnCalled = false;
MailIntegration.sendLinkForBrowser = () => {
fnCalled = true;
};
registerCleanupFunction(() => {
MailIntegration.sendLinkForBrowser = originalFn;
});
// Open the panel and click Email Link.
- await promisePanelOpen();
+ await promisePageActionPanelOpen();
let emailLinkButton =
document.getElementById("page-action-email-link-button");
- let hiddenPromise = promisePanelHidden();
+ let hiddenPromise = promisePageActionPanelHidden();
EventUtils.synthesizeMouseAtCenter(emailLinkButton, {});
await hiddenPromise;
Assert.ok(fnCalled);
});
add_task(async function sendToDevice_nonSendable() {
// Open a tab that's not sendable.
await BrowserTestUtils.withNewTab("about:blank", async () => {
// Open the panel. Send to Device should be disabled.
- await promisePanelOpen();
+ await promisePageActionPanelOpen();
let sendToDeviceButton =
document.getElementById("page-action-send-to-device-button");
Assert.ok(sendToDeviceButton.disabled);
- let hiddenPromise = promisePanelHidden();
- gPanel.hidePopup();
+ let hiddenPromise = promisePageActionPanelHidden();
+ gPageActionPanel.hidePopup();
await hiddenPromise;
});
});
add_task(async function sendToDevice_syncNotReady() {
// Open a tab that's sendable.
await BrowserTestUtils.withNewTab("http://example.com/", async () => {
let syncReadyMock = mockReturn(gSync, "syncReady", false);
@@ -159,23 +133,23 @@ add_task(async function sendToDevice_syn
gPageActionButton.setupSendToDeviceView = origSetupSendToDeviceView;
signedInMock.restore();
syncReadyMock.restore();
remoteClientsMock.restore();
};
registerCleanupFunction(cleanUp);
// Open the panel.
- await promisePanelOpen();
+ await promisePageActionPanelOpen();
let sendToDeviceButton =
document.getElementById("page-action-send-to-device-button");
Assert.ok(!sendToDeviceButton.disabled);
// Click Send to Device.
- let viewPromise = promiseViewShown();
+ let viewPromise = promisePageActionViewShown();
EventUtils.synthesizeMouseAtCenter(sendToDeviceButton, {});
let view = await viewPromise;
Assert.equal(view.id, "page-action-sendToDeviceView");
function testSendTabToDeviceMenu(numCall) {
if (numCall == 1) {
// The Fxa button should be shown.
checkSendToDeviceItems([
@@ -228,36 +202,36 @@ add_task(async function sendToDevice_syn
);
checkSendToDeviceItems(expectedItems);
} else {
ok(false, "This should never happen");
}
}
// Done, hide the panel.
- let hiddenPromise = promisePanelHidden();
- gPanel.hidePopup();
+ let hiddenPromise = promisePageActionPanelHidden();
+ gPageActionPanel.hidePopup();
await hiddenPromise;
cleanUp();
});
});
add_task(async function sendToDevice_notSignedIn() {
// Open a tab that's sendable.
await BrowserTestUtils.withNewTab("http://example.com/", async () => {
await promiseSyncReady();
// Open the panel.
- await promisePanelOpen();
+ await promisePageActionPanelOpen();
let sendToDeviceButton =
document.getElementById("page-action-send-to-device-button");
Assert.ok(!sendToDeviceButton.disabled);
// Click Send to Device.
- let viewPromise = promiseViewShown();
+ let viewPromise = promisePageActionViewShown();
EventUtils.synthesizeMouseAtCenter(sendToDeviceButton, {});
let view = await viewPromise;
Assert.equal(view.id, "page-action-sendToDeviceView");
// The Fxa button should be shown.
checkSendToDeviceItems([
{
id: "page-action-sendToDevice-fxa-button",
@@ -274,17 +248,17 @@ add_task(async function sendToDevice_not
},
]);
// Click the Fxa button.
let body = view.firstChild;
let fxaButton = body.childNodes[0];
Assert.equal(fxaButton.id, "page-action-sendToDevice-fxa-button");
let prefsTabPromise = BrowserTestUtils.waitForNewTab(gBrowser);
- let hiddenPromise = promisePanelHidden();
+ let hiddenPromise = promisePageActionPanelHidden();
EventUtils.synthesizeMouseAtCenter(fxaButton, {});
let values = await Promise.all([prefsTabPromise, hiddenPromise]);
let tab = values[0];
// The Fxa prefs pane should open. The full URL is something like:
// about:preferences?entrypoint=syncbutton#sync
// Just make sure it's about:preferences#sync.
let urlObj = new URL(gBrowser.selectedBrowser.currentURI.spec);
@@ -297,23 +271,23 @@ add_task(async function sendToDevice_not
add_task(async function sendToDevice_noDevices() {
// Open a tab that's sendable.
await BrowserTestUtils.withNewTab("http://example.com/", async () => {
await promiseSyncReady();
UIState._internal._state = { status: UIState.STATUS_SIGNED_IN };
// Open the panel.
- await promisePanelOpen();
+ await promisePageActionPanelOpen();
let sendToDeviceButton =
document.getElementById("page-action-send-to-device-button");
Assert.ok(!sendToDeviceButton.disabled);
// Click Send to Device.
- let viewPromise = promiseViewShown();
+ let viewPromise = promisePageActionViewShown();
EventUtils.synthesizeMouseAtCenter(sendToDeviceButton, {});
let view = await viewPromise;
Assert.equal(view.id, "page-action-sendToDeviceView");
// The no-devices item should be shown.
checkSendToDeviceItems([
{
id: "page-action-sendToDevice-fxa-button",
@@ -326,18 +300,18 @@ add_task(async function sendToDevice_noD
{
id: "page-action-sync-not-ready-button",
display: "none",
disabled: true,
},
]);
// Done, hide the panel.
- let hiddenPromise = promisePanelHidden();
- gPanel.hidePopup();
+ let hiddenPromise = promisePageActionPanelHidden();
+ gPageActionPanel.hidePopup();
await hiddenPromise;
await UIState.reset();
});
});
add_task(async function sendToDevice_devices() {
// Open a tab that's sendable.
@@ -348,23 +322,23 @@ add_task(async function sendToDevice_dev
// Set up mock remote clients.
let remoteClientsMock = mockReturn(gSync, "remoteClients", mockRemoteClients);
let cleanUp = () => {
remoteClientsMock.restore();
};
registerCleanupFunction(cleanUp);
// Open the panel.
- await promisePanelOpen();
+ await promisePageActionPanelOpen();
let sendToDeviceButton =
document.getElementById("page-action-send-to-device-button");
Assert.ok(!sendToDeviceButton.disabled);
// Click Send to Device.
- let viewPromise = promiseViewShown();
+ let viewPromise = promisePageActionViewShown();
EventUtils.synthesizeMouseAtCenter(sendToDeviceButton, {});
let view = await viewPromise;
Assert.equal(view.id, "page-action-sendToDeviceView");
// The devices should be shown in the subview.
let expectedItems = [
{
id: "page-action-sendToDevice-fxa-button",
@@ -394,61 +368,25 @@ add_task(async function sendToDevice_dev
null,
{
label: "Send to All Devices",
}
);
checkSendToDeviceItems(expectedItems);
// Done, hide the panel.
- let hiddenPromise = promisePanelHidden();
- gPanel.hidePopup();
+ let hiddenPromise = promisePageActionPanelHidden();
+ gPageActionPanel.hidePopup();
await hiddenPromise;
cleanUp();
await UIState.reset();
});
});
-function promisePanelOpen() {
- let button = document.getElementById("urlbar-page-action-button");
- let shownPromise = promisePanelShown();
- EventUtils.synthesizeMouseAtCenter(button, {});
- return shownPromise;
-}
-
-function promisePanelShown() {
- return promisePanelEvent("popupshown");
-}
-
-function promisePanelHidden() {
- return promisePanelEvent("popuphidden");
-}
-
-function promisePanelEvent(name) {
- return new Promise(resolve => {
- gPanel.addEventListener(name, () => {
- setTimeout(() => {
- resolve();
- });
- }, { once: true });
- });
-}
-
-function promiseViewShown() {
- return new Promise(resolve => {
- gPanel.addEventListener("ViewShown", (event) => {
- let target = event.originalTarget;
- window.setTimeout(() => {
- resolve(target);
- }, 5000);
- }, { once: true });
- });
-}
-
function promiseSyncReady() {
let service = Cc["@mozilla.org/weave/service;1"]
.getService(Components.interfaces.nsISupports)
.wrappedJSObject;
return service.whenLoaded().then(() => {
UIState.isReady();
return UIState.refresh();
});
new file mode 100644
--- /dev/null
+++ b/browser/base/content/test/urlbar/browser_page_action_menu_clipboard.js
@@ -0,0 +1,31 @@
+"use strict";
+
+const mockRemoteClients = [
+ { id: "0", name: "foo", type: "mobile" },
+ { id: "1", name: "bar", type: "desktop" },
+ { id: "2", name: "baz", type: "mobile" },
+];
+
+add_task(async function copyURL() {
+ // Open the panel.
+ await promisePageActionPanelOpen();
+
+ // Click Copy URL.
+ let copyURLButton = document.getElementById("page-action-copy-url-button");
+ let hiddenPromise = promisePageActionPanelHidden();
+ EventUtils.synthesizeMouseAtCenter(copyURLButton, {});
+ await hiddenPromise;
+
+ // Check the clipboard.
+ let transferable = Cc["@mozilla.org/widget/transferable;1"]
+ .createInstance(Ci.nsITransferable);
+ transferable.init(null);
+ let flavor = "text/unicode";
+ transferable.addDataFlavor(flavor);
+ Services.clipboard.getData(transferable, Services.clipboard.kGlobalClipboard);
+ let strObj = {};
+ transferable.getTransferData(flavor, strObj, {});
+ Assert.ok(!!strObj.value);
+ strObj.value.QueryInterface(Ci.nsISupportsString);
+ Assert.equal(strObj.value.data, gBrowser.selectedBrowser.currentURI.spec);
+});
--- a/browser/base/content/test/urlbar/head.js
+++ b/browser/base/content/test/urlbar/head.js
@@ -194,8 +194,44 @@ function promiseNewSearchEngine(basename
},
onError(errCode) {
Assert.ok(false, "addEngine failed with error code " + errCode);
reject();
},
});
});
}
+
+let gPageActionPanel = document.getElementById("page-action-panel");
+
+function promisePageActionPanelOpen() {
+ let button = document.getElementById("urlbar-page-action-button");
+ let shownPromise = promisePageActionPanelShown();
+ EventUtils.synthesizeMouseAtCenter(button, {});
+ return shownPromise;
+}
+
+function promisePageActionPanelShown() {
+ return promisePageActionPanelEvent("popupshown");
+}
+
+function promisePageActionPanelHidden() {
+ return promisePageActionPanelEvent("popuphidden");
+}
+
+function promisePageActionPanelEvent(name) {
+ return new Promise(resolve => {
+ gPageActionPanel.addEventListener(name, () => {
+ executeSoon(resolve);
+ }, { once: true });
+ });
+}
+
+function promisePageActionViewShown() {
+ return new Promise(resolve => {
+ gPageActionPanel.addEventListener("ViewShown", (event) => {
+ let target = event.originalTarget;
+ window.setTimeout(() => {
+ resolve(target);
+ }, 5000);
+ }, { once: true });
+ });
+}