219 lines
6.5 KiB
JavaScript
219 lines
6.5 KiB
JavaScript
/* Any copyright is dedicated to the Public Domain.
|
|
* https://creativecommons.org/publicdomain/zero/1.0/ */
|
|
|
|
"use strict";
|
|
|
|
// We explicitly need HTTP URLs in this test
|
|
/* eslint-disable @microsoft/sdl/no-insecure-url */
|
|
|
|
ChromeUtils.defineLazyGetter(this, "UrlbarTestUtils", () => {
|
|
const { UrlbarTestUtils: module } = ChromeUtils.importESModule(
|
|
"resource://testing-common/UrlbarTestUtils.sys.mjs"
|
|
);
|
|
module.init(this);
|
|
return module;
|
|
});
|
|
|
|
XPCOMUtils.defineLazyServiceGetter(
|
|
this,
|
|
"clipboardHelper",
|
|
"@mozilla.org/widget/clipboardhelper;1",
|
|
"nsIClipboardHelper"
|
|
);
|
|
|
|
/** Type aInput into the address bar and press enter */
|
|
async function runMainTest(aInput, aDesc, aExpectedScheme) {
|
|
await BrowserTestUtils.withNewTab("about:blank", async function (browser) {
|
|
const loaded = BrowserTestUtils.browserLoaded(browser, false, null, true);
|
|
await UrlbarTestUtils.promiseAutocompleteResultPopup({
|
|
window,
|
|
value: aInput,
|
|
});
|
|
EventUtils.synthesizeKey("KEY_Enter");
|
|
await loaded;
|
|
|
|
is(browser.currentURI.scheme, aExpectedScheme, "Main test: " + aDesc);
|
|
});
|
|
}
|
|
|
|
/**
|
|
* Type aInput into the address bar and press ctrl+enter,
|
|
* resulting in the input being canonized first.
|
|
* This should not change schemeless HTTPS behaviour. */
|
|
async function runCanonizedTest(aInput, aDesc, aExpectedScheme) {
|
|
await BrowserTestUtils.withNewTab("about:blank", async function (browser) {
|
|
const loaded = BrowserTestUtils.browserLoaded(browser, false, null, true);
|
|
await UrlbarTestUtils.promiseAutocompleteResultPopup({
|
|
window,
|
|
value: aInput,
|
|
});
|
|
EventUtils.synthesizeKey("KEY_Enter", { ctrlKey: true });
|
|
await loaded;
|
|
|
|
is(browser.currentURI.scheme, aExpectedScheme, "Canonized test: " + aDesc);
|
|
});
|
|
}
|
|
|
|
/**
|
|
* Type aInput into the address bar and press alt+enter,
|
|
* resulting in the input being loaded in a new tab.
|
|
* This should not change schemeless HTTPS behaviour. */
|
|
async function runNewTabTest(aInput, aDesc, aExpectedScheme) {
|
|
await BrowserTestUtils.withNewTab(
|
|
"about:about", // For alt+enter to do anything, we need to be on a page other than about:blank.
|
|
async function () {
|
|
const newTabPromise = BrowserTestUtils.waitForNewTab(
|
|
gBrowser,
|
|
null,
|
|
true
|
|
);
|
|
await UrlbarTestUtils.promiseAutocompleteResultPopup({
|
|
window,
|
|
value: aInput,
|
|
});
|
|
EventUtils.synthesizeKey("KEY_Enter", { altKey: true });
|
|
const newTab = await newTabPromise;
|
|
|
|
is(
|
|
newTab.linkedBrowser.currentURI.scheme,
|
|
aExpectedScheme,
|
|
"New tab test: " + aDesc
|
|
);
|
|
|
|
BrowserTestUtils.removeTab(newTab);
|
|
}
|
|
);
|
|
}
|
|
|
|
/**
|
|
* Type aInput into the address bar and press shift+enter,
|
|
* resulting in the input being loaded in a new window.
|
|
* This should not change schemeless HTTPS behaviour. */
|
|
async function runNewWindowTest(aInput, aDesc, aExpectedScheme) {
|
|
await BrowserTestUtils.withNewTab("about:about", async function () {
|
|
const newWindowPromise = BrowserTestUtils.waitForNewWindow({
|
|
waitForAnyURLLoaded: true,
|
|
});
|
|
await UrlbarTestUtils.promiseAutocompleteResultPopup({
|
|
window,
|
|
value: aInput,
|
|
});
|
|
EventUtils.synthesizeKey("KEY_Enter", { shiftKey: true });
|
|
const newWindow = await newWindowPromise;
|
|
|
|
is(
|
|
newWindow.gBrowser.selectedBrowser.currentURI.scheme,
|
|
aExpectedScheme,
|
|
"New window test: " + aDesc
|
|
);
|
|
|
|
await BrowserTestUtils.closeWindow(newWindow);
|
|
});
|
|
}
|
|
|
|
/**
|
|
* Instead of typing aInput into the address bar, copy it
|
|
* to the clipboard and use the "Paste and Go" menu entry.
|
|
* This should not change schemeless HTTPS behaviour. */
|
|
async function runPasteAndGoTest(aInput, aDesc, aExpectedScheme) {
|
|
await BrowserTestUtils.withNewTab("about:blank", async function (browser) {
|
|
gURLBar.focus();
|
|
await SimpleTest.promiseClipboardChange(aInput, () => {
|
|
clipboardHelper.copyString(aInput);
|
|
});
|
|
|
|
const loaded = BrowserTestUtils.browserLoaded(browser, false, null, true);
|
|
const textBox = gURLBar.querySelector("moz-input-box");
|
|
const cxmenu = textBox.menupopup;
|
|
const cxmenuPromise = BrowserTestUtils.waitForEvent(cxmenu, "popupshown");
|
|
EventUtils.synthesizeMouseAtCenter(gURLBar.inputField, {
|
|
type: "contextmenu",
|
|
button: 2,
|
|
});
|
|
await cxmenuPromise;
|
|
const menuitem = textBox.getMenuItem("paste-and-go");
|
|
menuitem.closest("menupopup").activateItem(menuitem);
|
|
await loaded;
|
|
|
|
is(
|
|
browser.currentURI.scheme,
|
|
aExpectedScheme,
|
|
"Paste and go test: " + aDesc
|
|
);
|
|
});
|
|
}
|
|
|
|
async function runTest(aInput, aDesc, aExpectedScheme) {
|
|
await runMainTest(aInput, aDesc, aExpectedScheme);
|
|
await runCanonizedTest(aInput, aDesc, aExpectedScheme);
|
|
await runNewTabTest(aInput, aDesc, aExpectedScheme);
|
|
await runNewWindowTest(aInput, aDesc, aExpectedScheme);
|
|
await runPasteAndGoTest(aInput, aDesc, aExpectedScheme);
|
|
}
|
|
|
|
add_task(async function () {
|
|
requestLongerTimeout(10);
|
|
Services.fog.testResetFOG();
|
|
|
|
await SpecialPowers.pushPrefEnv({
|
|
set: [
|
|
["dom.security.https_first", false],
|
|
["dom.security.https_first_schemeless", false],
|
|
],
|
|
});
|
|
|
|
await runTest(
|
|
"http://example.com",
|
|
"Should not upgrade upgradeable website with explicit scheme",
|
|
"http"
|
|
);
|
|
|
|
await runTest(
|
|
"example.com",
|
|
"Should not upgrade upgradeable website without explicit scheme",
|
|
"http"
|
|
);
|
|
|
|
await SpecialPowers.pushPrefEnv({
|
|
set: [["dom.security.https_first_schemeless", true]],
|
|
});
|
|
|
|
await runTest(
|
|
"http://example.com",
|
|
"Should not upgrade upgradeable website with explicit scheme",
|
|
"http"
|
|
);
|
|
|
|
for (const key of [
|
|
"upgraded",
|
|
"upgradedSchemeless",
|
|
"downgraded",
|
|
"downgradedSchemeless",
|
|
"downgradedOnTimer",
|
|
"downgradedOnTimerSchemeless",
|
|
"downgradeTime",
|
|
"downgradeTimeSchemeless",
|
|
]) {
|
|
is(
|
|
Glean.httpsfirst[key].testGetValue(),
|
|
null,
|
|
`No telemetry should have been recorded yet for ${key}`
|
|
);
|
|
}
|
|
|
|
await runTest(
|
|
"example.com",
|
|
"Should upgrade upgradeable website without explicit scheme",
|
|
"https"
|
|
);
|
|
|
|
info("Checking expected telemetry");
|
|
is(Glean.httpsfirst.upgraded.testGetValue(), null);
|
|
is(Glean.httpsfirst.upgradedSchemeless.testGetValue(), 5);
|
|
is(Glean.httpsfirst.downgraded.testGetValue(), null);
|
|
is(Glean.httpsfirst.downgradedSchemeless.testGetValue(), null);
|
|
is(Glean.httpsfirst.downgradedOnTimer.testGetValue(), null);
|
|
is(Glean.httpsfirst.downgradedOnTimerSchemeless.testGetValue(), null);
|
|
is(Glean.httpsfirst.downgradeTime.testGetValue(), null);
|
|
is(Glean.httpsfirst.downgradeTimeSchemeless.testGetValue(), null);
|
|
});
|