forked from mirrors/gecko-dev
134 lines
3.9 KiB
JavaScript
134 lines
3.9 KiB
JavaScript
/* This Source Code Form is subject to the terms of the Mozilla Public
|
|
* License, v. 2.0. If a copy of the MPL was not distributed with this
|
|
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
|
|
|
|
/* eslint-env mozilla/remote-page */
|
|
|
|
"use strict";
|
|
|
|
const searchParams = new URLSearchParams(document.documentURI.split("?")[1]);
|
|
|
|
function initPage() {
|
|
if (!searchParams.get("e")) {
|
|
document.getElementById("error").remove();
|
|
}
|
|
|
|
const explanation1 = document.getElementById(
|
|
"insecure-explanation-unavailable"
|
|
);
|
|
|
|
const pageUrl = new URL(window.location.href.replace(/^view-source:/, ""));
|
|
|
|
document.l10n.setAttributes(
|
|
explanation1,
|
|
"about-httpsonly-explanation-unavailable2",
|
|
{ websiteUrl: pageUrl.host }
|
|
);
|
|
|
|
const baseSupportURL = RPMGetFormatURLPref("app.support.baseURL");
|
|
document
|
|
.getElementById("learnMoreLink")
|
|
.setAttribute("href", baseSupportURL + "https-only-prefs");
|
|
|
|
document
|
|
.getElementById("openInsecure")
|
|
.addEventListener("click", onOpenInsecureButtonClick);
|
|
|
|
const delay = RPMGetIntPref("security.dialog_enable_delay", 1000);
|
|
setTimeout(() => {
|
|
document.getElementById("openInsecure").removeAttribute("inert");
|
|
}, delay);
|
|
|
|
if (window.top == window) {
|
|
document
|
|
.getElementById("goBack")
|
|
.addEventListener("click", onReturnButtonClick);
|
|
addAutofocus("#goBack", "beforeend");
|
|
} else {
|
|
document.getElementById("goBack").remove();
|
|
}
|
|
|
|
const isTopLevel = window.top == window;
|
|
const hasWWWPrefix = pageUrl.href.startsWith("https://www.");
|
|
if (isTopLevel && !hasWWWPrefix) {
|
|
// HTTPS-Only generally simply replaces http: with https:;
|
|
// here we additionally try to add www and see if that allows to upgrade the connection if it is top level
|
|
|
|
window.addEventListener("pingSecureWWWLinkSuccess", () => {
|
|
activateSuggestionBox();
|
|
displayWWWSuggestion(pageUrl.host);
|
|
});
|
|
|
|
// try to ping secure www link in the AboutHttpsOnlyErrorChild
|
|
RPMTryPingSecureWWWLink();
|
|
}
|
|
}
|
|
|
|
/* Suggestion Box */
|
|
|
|
function activateSuggestionBox() {
|
|
const suggestionBox = document.querySelector(".suggestion-box");
|
|
suggestionBox.hidden = false;
|
|
}
|
|
|
|
function displayWWWSuggestion(aURL) {
|
|
const suggestionBox = document.querySelector(".suggestion-box");
|
|
const suggestionWWWText = document.createElement("p");
|
|
const suggestionWWWButton = document.createElement("button");
|
|
const suggestionButtonContainer = document.createElement("div");
|
|
|
|
document.l10n.setAttributes(
|
|
suggestionWWWText,
|
|
"about-httpsonly-suggestion-box-www-text",
|
|
{ websiteUrl: aURL }
|
|
);
|
|
|
|
suggestionWWWButton.setAttribute("id", "openWWW");
|
|
document.l10n.setAttributes(
|
|
suggestionWWWButton,
|
|
"about-httpsonly-suggestion-box-www-button",
|
|
{ websiteUrl: aURL }
|
|
);
|
|
suggestionWWWButton.addEventListener("click", openSecureWWWButtonClick);
|
|
|
|
suggestionButtonContainer.classList.add("button-container");
|
|
|
|
suggestionBox.appendChild(suggestionWWWText);
|
|
suggestionButtonContainer.appendChild(suggestionWWWButton);
|
|
suggestionBox.appendChild(suggestionButtonContainer);
|
|
}
|
|
|
|
/* Button Events */
|
|
|
|
function openSecureWWWButtonClick() {
|
|
RPMOpenSecureWWWLink();
|
|
}
|
|
|
|
function onOpenInsecureButtonClick() {
|
|
document.reloadWithHttpsOnlyException();
|
|
}
|
|
|
|
function onReturnButtonClick() {
|
|
RPMSendAsyncMessage("goBack");
|
|
}
|
|
|
|
/* Utils */
|
|
|
|
function addAutofocus(selector, position = "afterbegin") {
|
|
if (window.top != window) {
|
|
return;
|
|
}
|
|
var button = document.querySelector(selector);
|
|
var parent = button.parentNode;
|
|
button.remove();
|
|
button.setAttribute("autofocus", "true");
|
|
parent.insertAdjacentElement(position, button);
|
|
}
|
|
|
|
/* Initialize Page */
|
|
|
|
initPage();
|
|
// Dispatch this event so tests can detect that we finished loading the error page.
|
|
// We're using the same event name as neterror because BrowserTestUtils.sys.mjs relies on that.
|
|
let event = new CustomEvent("AboutNetErrorLoad", { bubbles: true });
|
|
document.dispatchEvent(event);
|