Source code
Revision control
Copy as Markdown
Other Tools
Test Info:
/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
/* vim: set ft=javascript ts=2 et sw=2 tw=80: */
const ADDON_INSTALL_ID = "addon-webext-permissions";
let fileurl1 = get_addon_file_url("browser_dragdrop1.xpi");
let fileurl2 = get_addon_file_url("browser_dragdrop2.xpi");
function promiseInstallNotification(aBrowser) {
return new Promise(resolve => {
function popupshown(event) {
let notification = PopupNotifications.getNotification(
ADDON_INSTALL_ID,
aBrowser
);
if (!notification) {
return;
}
if (gBrowser.selectedBrowser !== aBrowser) {
return;
}
PopupNotifications.panel.removeEventListener("popupshown", popupshown);
ok(true, `Got ${ADDON_INSTALL_ID} popup for browser`);
event.target.firstChild.secondaryButton.click();
resolve();
}
PopupNotifications.panel.addEventListener("popupshown", popupshown);
});
}
function CheckBrowserInPid(browser, expectedPid, message) {
return SpecialPowers.spawn(browser, [{ expectedPid, message }], arg => {
is(Services.appinfo.processID, arg.expectedPid, arg.message);
});
}
async function testOpenedAndDraggedXPI(aBrowser) {
// Get the current pid for browser for comparison later.
let browserPid = await SpecialPowers.spawn(aBrowser, [], () => {
return Services.appinfo.processID;
});
// No process switch for XPI file:// URI in the urlbar.
let promiseNotification = promiseInstallNotification(aBrowser);
let urlbar = gURLBar;
urlbar.value = fileurl1.spec;
urlbar.focus();
EventUtils.synthesizeKey("KEY_Enter");
await promiseNotification;
await CheckBrowserInPid(
aBrowser,
browserPid,
"Check that browser has not switched process."
);
// No process switch for XPI file:// URI dragged to tab.
let tab = gBrowser.getTabForBrowser(aBrowser);
promiseNotification = promiseInstallNotification(aBrowser);
let effect = EventUtils.synthesizeDrop(
tab,
tab,
[[{ type: "text/uri-list", data: fileurl1.spec }]],
"move"
);
is(effect, "move", "Drag should be accepted");
await promiseNotification;
await CheckBrowserInPid(
aBrowser,
browserPid,
"Check that browser has not switched process."
);
// No process switch for two XPI file:// URIs dragged to tab.
promiseNotification = promiseInstallNotification(aBrowser);
let promiseNewTab = BrowserTestUtils.waitForEvent(
gBrowser.tabContainer,
"TabOpen"
);
effect = EventUtils.synthesizeDrop(
tab,
tab,
[
[{ type: "text/uri-list", data: fileurl1.spec }],
[{ type: "text/uri-list", data: fileurl2.spec }],
],
"move"
);
is(effect, "move", "Drag should be accepted");
// When drag'n'dropping two XPIs, one is loaded in the current tab while the
// other one is loaded in a new tab.
let { target: newTab } = await promiseNewTab;
// This is the prompt for the first XPI in the current tab.
await promiseNotification;
let promiseSecondNotification = promiseInstallNotification(
newTab.linkedBrowser
);
// We switch to the second tab and wait for the prompt for the second XPI.
BrowserTestUtils.switchTab(gBrowser, newTab);
await promiseSecondNotification;
BrowserTestUtils.removeTab(newTab);
await CheckBrowserInPid(
aBrowser,
browserPid,
"Check that browser has not switched process."
);
}
add_task(async function () {
await BrowserTestUtils.withNewTab(
testOpenedAndDraggedXPI
);
await BrowserTestUtils.withNewTab("about:robots", testOpenedAndDraggedXPI);
});