summaryrefslogtreecommitdiffstats
path: root/toolkit/actors/AboutHttpsOnlyErrorChild.sys.mjs
diff options
context:
space:
mode:
Diffstat (limited to '')
-rw-r--r--toolkit/actors/AboutHttpsOnlyErrorChild.sys.mjs83
1 files changed, 83 insertions, 0 deletions
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,
+ });
+ }
+}