From 36d22d82aa202bb199967e9512281e9a53db42c9 Mon Sep 17 00:00:00 2001 From: Daniel Baumann Date: Sun, 7 Apr 2024 21:33:14 +0200 Subject: Adding upstream version 115.7.0esr. Signed-off-by: Daniel Baumann --- toolkit/actors/AboutHttpsOnlyErrorChild.sys.mjs | 83 +++++++++++++++++++++++++ 1 file changed, 83 insertions(+) create mode 100644 toolkit/actors/AboutHttpsOnlyErrorChild.sys.mjs (limited to 'toolkit/actors/AboutHttpsOnlyErrorChild.sys.mjs') diff --git a/toolkit/actors/AboutHttpsOnlyErrorChild.sys.mjs b/toolkit/actors/AboutHttpsOnlyErrorChild.sys.mjs new file mode 100644 index 0000000000..20313d30c0 --- /dev/null +++ b/toolkit/actors/AboutHttpsOnlyErrorChild.sys.mjs @@ -0,0 +1,83 @@ +/* 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/. */ + +import { XPCOMUtils } from "resource://gre/modules/XPCOMUtils.sys.mjs"; + +import { RemotePageChild } from "resource://gre/actors/RemotePageChild.sys.mjs"; + +const lazy = {}; + +XPCOMUtils.defineLazyServiceGetter( + lazy, + "@mozilla.org/network/serialization-helper;1", + "nsISerializationHelper" +); + +export class AboutHttpsOnlyErrorChild extends RemotePageChild { + actorCreated() { + super.actorCreated(); + + // If you add a new function, remember to add it to RemotePageAccessManager.sys.mjs + // to allow content-privileged about:httpsonlyerror to use it. + const exportableFunctions = [ + "RPMTryPingSecureWWWLink", + "RPMOpenSecureWWWLink", + ]; + this.exportFunctions(exportableFunctions); + } + + RPMTryPingSecureWWWLink() { + // try if the page can be reached with www prefix + // if so send message to the parent to send message to the error page to display + // suggestion button for www + + const httpsOnlySuggestionPref = Services.prefs.getBoolPref( + "dom.security.https_only_mode_error_page_user_suggestions" + ); + + // only check if pref is true otherwise return + if (!httpsOnlySuggestionPref) { + return; + } + + // get the host url without the path with www in front + const wwwURL = "https://www." + this.contentWindow.location.host; + fetch(wwwURL, { + credentials: "omit", + cache: "no-store", + }) + .then(data => { + if (data.status === 200) { + this.contentWindow.dispatchEvent( + new this.contentWindow.CustomEvent("pingSecureWWWLinkSuccess") + ); + } + }) + .catch(() => { + dump("No secure www suggestion possible for " + wwwURL); + }); + } + + RPMOpenSecureWWWLink() { + // if user wants to visit suggested secure www page: visit page with www prefix and delete errorpage from history + const context = this.manager.browsingContext; + const docShell = context.docShell; + const httpChannel = docShell.failedChannel.QueryInterface( + Ci.nsIHttpChannel + ); + const webNav = docShell.QueryInterface(Ci.nsIWebNavigation); + const triggeringPrincipal = + docShell.failedChannel.loadInfo.triggeringPrincipal; + const oldURI = httpChannel.URI; + const newWWWURI = oldURI + .mutate() + .setHost("www." + oldURI.host) + .finalize(); + + webNav.loadURI(newWWWURI, { + triggeringPrincipal, + loadFlags: Ci.nsIWebNavigation.LOAD_FLAGS_REPLACE_HISTORY, + }); + } +} -- cgit v1.2.3