/* 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); }