blockedSite.js (7319B)
1 /* This Source Code Form is subject to the terms of the Mozilla Public 2 * License, v. 2.0. If a copy of the MPL was not distributed with this file, 3 * You can obtain one at http://mozilla.org/MPL/2.0/. */ 4 5 // Error url MUST be formatted like this: 6 // about:blocked?e=error_code&u=url(&o=1)? 7 // (o=1 when user overrides are allowed) 8 9 // Note that this file uses document.documentURI to get 10 // the URL (with the format from above). This is because 11 // document.location.href gets the current URI off the docshell, 12 // which is the URL displayed in the location bar, i.e. 13 // the URI that the user attempted to load. 14 15 function getErrorCode() { 16 var url = document.documentURI; 17 var error = url.search(/e\=/); 18 var duffUrl = url.search(/\&u\=/); 19 return decodeURIComponent(url.slice(error + 2, duffUrl)); 20 } 21 22 function getURL() { 23 var url = document.documentURI; 24 var match = url.match(/&u=([^&]+)&/); 25 26 // match == null if not found; if so, return an empty string 27 // instead of what would turn out to be portions of the URI 28 if (!match) { 29 return ""; 30 } 31 32 url = decodeURIComponent(match[1]); 33 34 // If this is a view-source page, then get then real URI of the page 35 if (url.startsWith("view-source:")) { 36 url = url.slice(12); 37 } 38 return url; 39 } 40 41 function getAddonName() { 42 var url = document.documentURI; 43 var match = url.match(/&a=([^&]+)/); 44 45 // match == null if not found; if so, return an empty string 46 // instead of what would turn out to be portions of the URI 47 if (!match) { 48 return ""; 49 } 50 51 return decodeURIComponent(match[1]); 52 } 53 54 /** 55 * Check whether this warning page is overridable or not, in which case 56 * the "ignore the risk" suggestion in the error description 57 * should not be shown. 58 */ 59 function getOverride() { 60 var url = document.documentURI; 61 var match = url.match(/&o=1&/); 62 return !!match; 63 } 64 65 /** 66 * Attempt to get the hostname via document.location. Fail back 67 * to getURL so that we always return something meaningful. 68 */ 69 function getHostString() { 70 try { 71 return document.location.hostname; 72 } catch (e) { 73 return getURL(); 74 } 75 } 76 77 function onClickSeeDetails() { 78 let details = document.getElementById("errorDescriptionContainer"); 79 details.hidden = !details.hidden; 80 } 81 82 function initPage() { 83 const errorMap = { 84 malwareBlocked: "malware", 85 deceptiveBlocked: "phishing", 86 unwantedBlocked: "unwanted", 87 harmfulBlocked: "harmful", 88 addonBlocked: "addon", 89 }; 90 const error = errorMap[getErrorCode()]; 91 if (error === undefined) { 92 return; 93 } 94 95 const messageIDs = { 96 malware: { 97 title: "safeb-blocked-malware-page-title", 98 shortDesc: "safeb-blocked-malware-page-short-desc", 99 innerDescOverride: "safeb-blocked-malware-page-error-desc-override-sumo", 100 innerDescNoOverride: 101 "safeb-blocked-malware-page-error-desc-no-override-sumo", 102 learnMore: "safeb-blocked-malware-page-learn-more-sumo", 103 }, 104 phishing: { 105 title: "safeb-blocked-phishing-page-title", 106 shortDesc: "safeb-blocked-phishing-page-short-desc", 107 innerDescOverride: "safeb-blocked-phishing-page-error-desc-override", 108 innerDescNoOverride: "safeb-blocked-phishing-page-error-desc-no-override", 109 learnMore: "safeb-blocked-phishing-page-learn-more", 110 }, 111 unwanted: { 112 title: "safeb-blocked-unwanted-page-title", 113 shortDesc: "safeb-blocked-unwanted-page-short-desc", 114 innerDescOverride: "safeb-blocked-unwanted-page-error-desc-override", 115 innerDescNoOverride: "safeb-blocked-unwanted-page-error-desc-no-override", 116 learnMore: "safeb-blocked-unwanted-page-learn-more", 117 }, 118 harmful: { 119 title: "safeb-blocked-harmful-page-title", 120 shortDesc: "safeb-blocked-harmful-page-short-desc", 121 innerDescOverride: "safeb-blocked-harmful-page-error-desc-override", 122 innerDescNoOverride: "safeb-blocked-harmful-page-error-desc-no-override", 123 learnMore: "safeb-blocked-harmful-page-learn-more", 124 }, 125 addon: { 126 title: "safeb-blocked-addon-page-title", 127 shortDesc: "safeb-blocked-addon-page-short-desc", 128 innerDescOverride: [ 129 "safeb-blocked-addon-page-error-desc-override", 130 "safeb-blocked-addon-page-error-desc2-override", 131 "", 132 "safeb-blocked-addon-page-error-desc3-override", 133 "safeb-blocked-addon-page-error-desc4-override", 134 ], 135 innerDescNoOverride: [ 136 "safeb-blocked-addon-page-error-desc-override", 137 "safeb-blocked-addon-page-error-desc2-override", 138 "", 139 "safeb-blocked-addon-page-error-desc3-override", 140 "safeb-blocked-addon-page-error-desc4-override", 141 ], 142 learnMore: "safeb-blocked-addon-page-learn-more", 143 }, 144 }; 145 146 // Set page contents depending on type of blocked page 147 // Prepare the title and short description text 148 let titleText = document.getElementById("errorTitleText"); 149 document.l10n.setAttributes(titleText, messageIDs[error].title); 150 let shortDesc = document.getElementById("errorShortDescText"); 151 document.l10n.setAttributes(shortDesc, messageIDs[error].shortDesc); 152 153 // Prepare the inner description, ensuring any redundant inner elements are removed. 154 let innerDesc = document.getElementById("errorInnerDescription"); 155 let innerDescL10nID; 156 if (!getOverride()) { 157 innerDescL10nID = messageIDs[error].innerDescNoOverride; 158 document.getElementById("ignore_warning_link").remove(); 159 } else { 160 innerDescL10nID = messageIDs[error].innerDescOverride; 161 } 162 if (error == "unwanted" || error == "harmful" || error == "addon") { 163 document.getElementById("report_detection").remove(); 164 } 165 166 const descArgs = { 167 sitename: getHostString(), 168 addonName: getAddonName(), 169 }; 170 171 // Add the inner description: 172 if (Array.isArray(innerDescL10nID)) { 173 const template = innerDesc.cloneNode(true); 174 175 while (innerDesc.firstChild) { 176 innerDesc.firstChild.remove(); 177 } 178 179 for (const id of innerDescL10nID) { 180 if (id === "") { 181 innerDesc.appendChild(document.createElement("br")); 182 } 183 184 const node = template.cloneNode(true); 185 document.l10n.setAttributes(node, id, descArgs); 186 innerDesc.appendChild(node); 187 } 188 } else { 189 document.l10n.setAttributes(innerDesc, innerDescL10nID, descArgs); 190 } 191 192 // Add the learn more content: 193 let learnMore = document.getElementById("learn_more"); 194 document.l10n.setAttributes(learnMore, messageIDs[error].learnMore); 195 196 // Set sitename to bold by adding class 197 let errorSitename = document.getElementById("error_desc_sitename"); 198 errorSitename.setAttribute("class", "sitename"); 199 200 let titleEl = document.createElement("title"); 201 document.l10n.setAttributes(titleEl, messageIDs[error].title); 202 document.head.appendChild(titleEl); 203 204 // Inform the test harness that we're done loading the page. 205 var event = new CustomEvent("AboutBlockedLoaded", { 206 bubbles: true, 207 detail: { 208 url: this.getURL(), 209 err: error, 210 }, 211 }); 212 document.dispatchEvent(event); 213 } 214 215 let seeDetailsButton = document.getElementById("seeDetailsButton"); 216 seeDetailsButton.addEventListener("click", onClickSeeDetails); 217 // Note: It is important to run the script this way, instead of using 218 // an onload handler. This is because error pages are loaded as 219 // LOAD_BACKGROUND, which means that onload handlers will not be executed. 220 initPage();