diff options
Diffstat (limited to '')
-rw-r--r-- | comm/suite/base/content/certError.js | 181 |
1 files changed, 181 insertions, 0 deletions
diff --git a/comm/suite/base/content/certError.js b/comm/suite/base/content/certError.js new file mode 100644 index 0000000000..96a89b0685 --- /dev/null +++ b/comm/suite/base/content/certError.js @@ -0,0 +1,181 @@ +/* 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/. */ + +// The following parameters are parsed from the error URL: +// e - the error code +// s - custom CSS class to allow alternate styling/favicons +// d - error description + +// Note that this file uses document.documentURI to get +// the URL (with the format from above). This is because +// document.location.href gets the current URI off the docshell, +// which is the URL displayed in the location bar, i.e. +// the URI that the user attempted to load. + +// setting up the event listeners and initializing the page +// in this way given that window.onload won't work here + +document.getElementById("technicalContentHeading") + .addEventListener("click", function() { toggle("technicalContent"); }); + +document.getElementById("expertContentHeading") + .addEventListener("click", function() { toggle("expertContent"); }); + +let gSearchParams; + +// Set to true on init if the error code is nssBadCert. +let gIsCertError; + +// Set to true on init if a neterror. +let gIsNetError; + +initPage(); + +function retryThis(buttonEl) { + // Note: The application may wish to handle switching off "offline mode" + // before this event handler runs, but using a capturing event handler. + + // Session history has the URL of the page that failed + // to load, not the one of the error page. So, just call + // reload(), which will also repost POST data correctly. + try { + location.reload(); + } catch (e) { + // We probably tried to reload a URI that caused an exception to + // occur; e.g. a nonexistent file. + } + + buttonEl.disabled = true; +} + +function initPage() { + gSearchParams = new URLSearchParams(document.documentURI.split("?")[1]); + + let err = gSearchParams.get("e"); + // List of neterror pages which have no error code and + // could have an illustration instead. + let illustratedErrors = [ + "malformedURI", "dnsNotFound", "connectionFailure", "netInterrupt", + "netTimeout", "netReset", "netOffline", + ]; + if (illustratedErrors.includes(err)) { + document.body.classList.add("illustrated", err); + } + + gIsCertError = (err == "nssBadCert"); + gIsNetError = (document.documentURI.startsWith("about:neterror")); + + let pageTitle = document.getElementById("ept_" + err); + if (pageTitle) { + document.title = pageTitle.textContent; + } + + // If it's an unknown error or there's no title or description defined, + // get the generic message. + let errTitle = document.getElementById("et_" + err); + let errDesc = document.getElementById("ed_" + err); + if (!errTitle || !errDesc) { + errTitle = document.getElementById("et_generic"); + errDesc = document.getElementById("ed_generic"); + } + + let title = document.getElementById("errorTitleText"); + if (title) { + title.innerHTML = errTitle.innerHTML; + } + + let sd = document.getElementById("errorShortDescText"); + if (sd) { + if (gIsCertError) { + sd.innerHTML = errDesc.innerHTML; + } else if (!err || err == "unknownProtocolFound") { + sd.remove(); + } + } + + let xd = document.getElementById("errorShortDescExtra"); + if (xd) { + let errExtra = document.getElementById("ex_" + err); + if (gIsCertError && errExtra) { + xd.innerHTML = errExtra.innerHTML; + } else { + xd.remove(); + } + } + + let ld = document.getElementById("errorLongDesc"); + if (ld && !gIsCertError) { + ld.innerHTML = errDesc.innerHTML; + } + + // Remove undisplayed errors to avoid bug 39098. + let errContainer = document.getElementById("errorContainer"); + errContainer.remove(); + + if (gIsCertError || err == "inadequateSecurityError") { + for (let host of document.querySelectorAll(".hostname")) { + host.textContent = location.host; + } + } + + if (gIsCertError || err == "sslv3Used") { + document.body.classList.add("certerror"); + } + + if (gIsCertError || err == "remoteXUL" || err == "cspBlocked" || + err == "inadequateSecurityError") { + // Remove the "Try again" button for certificate errors, remote XUL errors, + // CSP violations (Bug 553180) and HTTP/2 inadequate security, + // given that it is useless. + document.getElementById("netErrorButtonContainer").style.display = "none"; + } + + let className = gSearchParams.get("s"); + if (className && className != "expertBadCert") { + // Associate a CSS class with the root of the page, if one was passed in, + // to allow custom styling. + // Not "expertBadCert" though, don't want to deal with the favicon + document.documentElement.classList.add(className); + } + + if (className == "expertBadCert") { + toggle("technicalContent"); + toggle("expertContent"); + } + + // Disallow overrides if this is a Strict-Transport-Security + // host and the cert is bad (STS Spec section 7.3); + // or if the cert error is in a frame (bug 633691). + if (className == "badStsCert" || window != top || !gIsCertError) { + let expertContent = document.getElementById("expertContent"); + expertContent.remove(); + } + if (className == "badStsCert") { + document.getElementById("badStsCertExplanation").removeAttribute("hidden"); + } + + // For neterrors set a suitable class. + if (gIsNetError) { + document.body.classList.add("neterror"); + } + + // For neterrors and null error codes do not show the What Should I Do and + // Technical Details sections. + if (gIsNetError || !err) { + let whatShould = document.getElementById("whatShouldIDoContent"); + whatShould.remove(); + let technicalContent = document.getElementById("technicalContent"); + technicalContent.remove(); + } + var event = new CustomEvent("AboutNetAndCertErrorLoad", {bubbles: true}); + document.dispatchEvent(event); +} + +function toggle(id) { + var el = document.getElementById(id); + if (el.hasAttribute("collapsed")) + el.removeAttribute("collapsed"); + else + el.setAttribute("collapsed", true); +} |