Source code
Revision control
Copy as Markdown
Other Tools
Test Info:
/* Any copyright is dedicated to the Public Domain.
"use strict";
const PAGE =
"empty.html";
add_setup(async function () {
let uri = NetUtil.newURI(ORIGIN);
PermissionTestUtils.remove(uri, "geo");
registerCleanupFunction(() => {
PermissionTestUtils.remove(uri, "geo");
});
});
// Two back-to-back getCurrentPosition calls: the second replaces the first's
// prompt. The first request must be cancelled with PERMISSION_DENIED rather
// than leaving its error callback dangling.
add_task(async function testReplacedGeoPromptCancelsFirstRequest() {
await BrowserTestUtils.withNewTab(PAGE, async browser => {
let firstPopup = BrowserTestUtils.waitForEvent(
PopupNotifications.panel,
"popupshown"
);
let firstResultPromise = SpecialPowers.spawn(browser, [], async () => {
return new Promise(resolve => {
content.wrappedJSObject.firstResult = resolve;
content.wrappedJSObject.secondResult = () => {};
content.eval(`
navigator.geolocation.getCurrentPosition(
() => window.firstResult({ ok: true }),
err => window.firstResult({ ok: false, code: err.code })
);
navigator.geolocation.getCurrentPosition(
() => window.secondResult({ ok: true }),
err => window.secondResult({ ok: false, code: err.code })
);
`);
});
});
await firstPopup;
let firstResult = await firstResultPromise;
is(firstResult.ok, false, "first getCurrentPosition got an error");
is(
firstResult.code,
1 /* PERMISSION_DENIED */,
"first request was cancelled as PERMISSION_DENIED"
);
ok(
PopupNotifications.getNotification("geolocation", browser),
"second geolocation prompt is still showing"
);
let popuphidden = BrowserTestUtils.waitForEvent(
PopupNotifications.panel,
"popuphidden"
);
EventUtils.synthesizeMouseAtCenter(
PopupNotifications.panel.firstElementChild.secondaryButton,
{}
);
await popuphidden;
});
});