| Left: | ||
| Right: |
| OLD | NEW |
|---|---|
| 1 /* | 1 /* |
| 2 * This file is part of Adblock Plus <https://adblockplus.org/>, | 2 * This file is part of Adblock Plus <https://adblockplus.org/>, |
| 3 * Copyright (C) 2006-present eyeo GmbH | 3 * Copyright (C) 2006-present eyeo GmbH |
| 4 * | 4 * |
| 5 * Adblock Plus is free software: you can redistribute it and/or modify | 5 * Adblock Plus is free software: you can redistribute it and/or modify |
| 6 * it under the terms of the GNU General Public License version 3 as | 6 * it under the terms of the GNU General Public License version 3 as |
| 7 * published by the Free Software Foundation. | 7 * published by the Free Software Foundation. |
| 8 * | 8 * |
| 9 * Adblock Plus is distributed in the hope that it will be useful, | 9 * Adblock Plus is distributed in the hope that it will be useful, |
| 10 * but WITHOUT ANY WARRANTY; without even the implied warranty of | 10 * but WITHOUT ANY WARRANTY; without even the implied warranty of |
| 11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | 11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
| 12 * GNU General Public License for more details. | 12 * GNU General Public License for more details. |
| 13 * | 13 * |
| 14 * You should have received a copy of the GNU General Public License | 14 * You should have received a copy of the GNU General Public License |
| 15 * along with Adblock Plus. If not, see <http://www.gnu.org/licenses/>. | 15 * along with Adblock Plus. If not, see <http://www.gnu.org/licenses/>. |
| 16 */ | 16 */ |
| 17 | 17 |
| 18 "use strict"; | 18 "use strict"; |
| 19 | 19 |
| 20 window.ext = {}; | 20 window.ext = {}; |
| 21 | 21 |
| 22 let reportData = new DOMParser().parseFromString("<report></report>", "text/xml" ); | 22 let reportData = new DOMParser().parseFromString("<report></report>", |
| 23 "text/xml"); | |
| 23 | 24 |
| 24 let pages = { | 25 let pages = { |
| 25 "typeSelectorPage": [initTypeSelector, leaveTypeSelector], | 26 typeSelectorPage: [initTypeSelector, leaveTypeSelector], |
| 26 "commentPage": [initCommentPage, leaveCommentPage], | 27 commentPage: [initCommentPage, leaveCommentPage], |
| 27 "sendPage": [initSendPage, leaveSendPage] | 28 sendPage: [initSendPage, leaveSendPage] |
| 28 }; | 29 }; |
| 29 | 30 |
| 30 document.addEventListener("DOMContentLoaded", () => | 31 document.addEventListener("DOMContentLoaded", () => |
| 31 { | 32 { |
| 32 document.getElementById("cancel").addEventListener("click", () => | 33 document.getElementById("cancel").addEventListener("click", () => |
| 33 { | 34 { |
| 34 window.close(); | 35 window.close(); |
| 35 }); | 36 }); |
| 36 | 37 |
| 37 document.getElementById("continue").addEventListener("click", () => | 38 document.getElementById("continue").addEventListener("click", () => |
| 38 { | 39 { |
| 39 if (!document.getElementById("continue").disabled) | 40 if (!document.getElementById("continue").disabled) |
| 40 pages[getCurrentPage()][1](); | 41 pages[getCurrentPage()][1](); |
| 41 }); | 42 }); |
| 42 | 43 |
| 43 document.addEventListener("keydown", event => | 44 document.addEventListener("keydown", event => |
| 44 { | 45 { |
| 45 let blacklistedElements = new Set(["textarea", "button", "a"]) | 46 let blacklisted = new Set(["textarea", "button", "a"]); |
| 46 | 47 |
| 47 if (event.key == "Enter" && !blacklistedElements.has(event.target.localName) ) | 48 if (event.key == "Enter" && !blacklisted.has(event.target.localName)) |
| 48 document.getElementById("continue").click(); | 49 document.getElementById("continue").click(); |
| 49 else if (event.key == "Escape") | 50 else if (event.key == "Escape") |
| 50 document.getElementById("cancel").click(); | 51 document.getElementById("cancel").click(); |
| 51 }); | 52 }); |
| 52 | 53 |
| 53 browser.runtime.sendMessage({ | 54 browser.runtime.sendMessage({ |
| 54 type: "app.get", | 55 type: "app.get", |
| 55 what: "doclink", | 56 what: "doclink", |
| 56 link: "reporter_privacy" | 57 link: "reporter_privacy" |
| 57 }).then(url => | 58 }).then(url => |
| (...skipping 17 matching lines...) Expand all Loading... | |
| 75 let previousPage = document.querySelector(".page:not([hidden])"); | 76 let previousPage = document.querySelector(".page:not([hidden])"); |
| 76 if (previousPage) | 77 if (previousPage) |
| 77 previousPage.hidden = true; | 78 previousPage.hidden = true; |
| 78 | 79 |
| 79 document.getElementById(pageId).hidden = false; | 80 document.getElementById(pageId).hidden = false; |
| 80 pages[pageId][0](); | 81 pages[pageId][0](); |
| 81 } | 82 } |
| 82 | 83 |
| 83 function censorURL(url) | 84 function censorURL(url) |
| 84 { | 85 { |
| 85 return url.replace(/([?;&\/#][^?;&\/#]+?=)[^?;&\/#]+/g, "$1*"); | 86 return url.replace(/([?;&/#][^?;&/#]+?=)[^?;&/#]+/g, "$1*"); |
| 86 } | 87 } |
| 87 | 88 |
| 88 function encodeHTML(str) | 89 function encodeHTML(str) |
| 89 { | 90 { |
| 90 return str.replace(/&/g, "&").replace(/</g, "<").replace(/>/g, ">"). replace(/"/g, """); | 91 return str.replace(/&/g, "&").replace(/</g, "<").replace(/>/g, ">"). replace(/"/g, """); |
| 91 } | 92 } |
| 92 | 93 |
| 93 function serializeReportData() | 94 function serializeReportData() |
| 94 { | 95 { |
| 95 let result = new XMLSerializer().serializeToString(reportData); | 96 let result = new XMLSerializer().serializeToString(reportData); |
| 96 | 97 |
| 97 // Insert line breaks before each new tag | 98 // Insert line breaks before each new tag |
| 98 result = result.replace(/(<[^\/]([^"<>]*|"[^"]*")*>)/g, "\n$1"); | 99 result = result.replace(/(<[^/]([^"<>]*|"[^"]*")*>)/g, "\n$1"); |
| 99 result = result.replace(/^\n+/, ""); | 100 result = result.replace(/^\n+/, ""); |
| 100 return result; | 101 return result; |
| 101 } | 102 } |
| 102 | 103 |
| 103 function retrieveAddonInfo() | 104 function retrieveAddonInfo() |
| 104 { | 105 { |
| 105 let element = reportData.createElement("adblock-plus"); | 106 let element = reportData.createElement("adblock-plus"); |
| 106 return browser.runtime.sendMessage({ | 107 return browser.runtime.sendMessage({ |
| 107 type: "app.get", | 108 type: "app.get", |
| 108 what: "addonVersion" | 109 what: "addonVersion" |
| (...skipping 74 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 183 let element = reportData.createElement("subscriptions"); | 184 let element = reportData.createElement("subscriptions"); |
| 184 for (let subscription of subscriptions) | 185 for (let subscription of subscriptions) |
| 185 { | 186 { |
| 186 if (!/^(http|https|ftp):/.test(subscription.url)) | 187 if (!/^(http|https|ftp):/.test(subscription.url)) |
| 187 continue; | 188 continue; |
| 188 | 189 |
| 189 let now = Math.round(Date.now() / 1000); | 190 let now = Math.round(Date.now() / 1000); |
| 190 let subscriptionElement = reportData.createElement("subscription"); | 191 let subscriptionElement = reportData.createElement("subscription"); |
| 191 subscriptionElement.setAttribute("id", subscription.url); | 192 subscriptionElement.setAttribute("id", subscription.url); |
| 192 if (subscription.lastDownload) | 193 if (subscription.lastDownload) |
| 193 subscriptionElement.setAttribute("lastDownloadAttempt", subscription.las tDownload - now); | 194 { |
| 194 subscriptionElement.setAttribute("downloadStatus", subscription.downloadSt atus); | 195 subscriptionElement.setAttribute("lastDownloadAttempt", |
| 196 subscription.lastDownload - now); | |
| 197 } | |
| 198 subscriptionElement.setAttribute("downloadStatus", | |
| 199 subscription.downloadStatus); | |
| 195 element.appendChild(subscriptionElement); | 200 element.appendChild(subscriptionElement); |
| 196 } | 201 } |
| 197 reportData.documentElement.appendChild(element); | 202 reportData.documentElement.appendChild(element); |
| 198 }); | 203 }); |
| 199 } | 204 } |
| 200 | 205 |
| 201 function initDataCollector() | 206 function initDataCollector() |
| 202 { | 207 { |
| 203 Promise.resolve().then(() => | 208 Promise.resolve().then(() => |
| 204 { | 209 { |
| (...skipping 36 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 241 function leaveTypeSelector() | 246 function leaveTypeSelector() |
| 242 { | 247 { |
| 243 let checkbox = document.querySelector("input[name='type']:checked"); | 248 let checkbox = document.querySelector("input[name='type']:checked"); |
| 244 reportData.documentElement.setAttribute("type", checkbox.value); | 249 reportData.documentElement.setAttribute("type", checkbox.value); |
| 245 setCurrentPage("commentPage"); | 250 setCurrentPage("commentPage"); |
| 246 } | 251 } |
| 247 | 252 |
| 248 function initCommentPage() | 253 function initCommentPage() |
| 249 { | 254 { |
| 250 let continueButton = document.getElementById("continue"); | 255 let continueButton = document.getElementById("continue"); |
| 256 let label = browser.i18n.getMessage("issueReporter_sendButton_label"); | |
| 257 continueButton.textContent = label; | |
| 251 continueButton.disabled = true; | 258 continueButton.disabled = true; |
| 252 continueButton.textContent = browser.i18n.getMessage("issueReporter_sendButton _label"); | |
| 253 | 259 |
| 254 let emailElement = reportData.createElement("email"); | 260 let emailElement = reportData.createElement("email"); |
| 255 let emailField = document.getElementById("email"); | 261 let emailField = document.getElementById("email"); |
| 256 let anonymousSubmissionField = document.getElementById("anonymousSubmission"); | 262 let anonymousSubmissionField = document.getElementById("anonymousSubmission"); |
| 257 let validateEmail = () => | 263 let validateEmail = () => |
| 258 { | 264 { |
| 259 document.getElementById("anonymousSubmissionWarning").setAttribute("data-inv isible", !anonymousSubmissionField.checked); | 265 document.getElementById("anonymousSubmissionWarning") |
| 266 .setAttribute("data-invisible", !anonymousSubmissionField.checked); | |
| 260 if (anonymousSubmissionField.checked) | 267 if (anonymousSubmissionField.checked) |
| 261 { | 268 { |
| 262 emailField.value = ""; | 269 emailField.value = ""; |
| 263 emailField.disabled = true; | 270 emailField.disabled = true; |
| 264 continueButton.disabled = false; | 271 continueButton.disabled = false; |
| 265 if (emailElement.parentNode) | 272 if (emailElement.parentNode) |
| 266 emailElement.parentNode.removeChild(emailElement); | 273 emailElement.parentNode.removeChild(emailElement); |
| 267 } | 274 } |
| 268 else | 275 else |
| 269 { | 276 { |
| (...skipping 11 matching lines...) Expand all Loading... | |
| 281 let commentElement = reportData.createElement("comment"); | 288 let commentElement = reportData.createElement("comment"); |
| 282 document.getElementById("comment").addEventListener("input", event => | 289 document.getElementById("comment").addEventListener("input", event => |
| 283 { | 290 { |
| 284 if (commentElement.parentNode) | 291 if (commentElement.parentNode) |
| 285 commentElement.parentNode.removeChild(commentElement); | 292 commentElement.parentNode.removeChild(commentElement); |
| 286 | 293 |
| 287 let value = event.target.value.trim(); | 294 let value = event.target.value.trim(); |
| 288 commentElement.textContent = value.substr(0, 1000); | 295 commentElement.textContent = value.substr(0, 1000); |
| 289 if (value) | 296 if (value) |
| 290 reportData.documentElement.appendChild(commentElement); | 297 reportData.documentElement.appendChild(commentElement); |
| 291 document.getElementById("commentLengthWarning").setAttribute("data-invisible ", value.length <= 1000); | 298 document.getElementById("commentLengthWarning") |
| 299 .setAttribute("data-invisible", value.length <= 1000); | |
| 292 }); | 300 }); |
| 293 | 301 |
| 294 document.getElementById("showData").addEventListener("click", event => | 302 document.getElementById("showData").addEventListener("click", event => |
| 295 { | 303 { |
| 296 event.preventDefault(); | 304 event.preventDefault(); |
| 297 | 305 |
| 298 // window.open() won't open data: URIs in Chrome | 306 // window.open() won't open data: URIs in Chrome |
| 299 browser.tabs.getCurrent().then(tab => | 307 browser.tabs.getCurrent().then(tab => |
| 300 { | 308 { |
| 301 browser.tabs.create({ | 309 browser.tabs.create({ |
| 302 url: "data:text/xml;charset=utf-8," + encodeURIComponent(serializeReport Data()), | 310 url: "data:text/xml;charset=utf-8," + |
| 311 encodeURIComponent(serializeReportData()), | |
| 303 openerTabId: tab.id | 312 openerTabId: tab.id |
| 304 }); | 313 }); |
| 305 }) | 314 }); |
| 306 }); | 315 }); |
| 307 | 316 |
| 308 emailField.focus(); | 317 emailField.focus(); |
| 309 } | 318 } |
| 310 | 319 |
| 311 function leaveCommentPage() | 320 function leaveCommentPage() |
| 312 { | 321 { |
| 313 setCurrentPage("sendPage"); | 322 setCurrentPage("sendPage"); |
| 314 } | 323 } |
| 315 | 324 |
| 316 function initSendPage() | 325 function initSendPage() |
| 317 { | 326 { |
| 318 document.getElementById("cancel").hidden = true; | 327 document.getElementById("cancel").hidden = true; |
| 319 | 328 |
| 320 let continueButton = document.getElementById("continue"); | 329 let continueButton = document.getElementById("continue"); |
| 321 continueButton.textContent = browser.i18n.getMessage("issueReporter_doneButton _label"); | 330 let label = browser.i18n.getMessage("issueReporter_doneButton_label"); |
| 331 continueButton.textContent = label; | |
| 322 continueButton.disabled = true; | 332 continueButton.disabled = true; |
| 323 | 333 |
| 324 let uuid = new Uint16Array(8); | 334 let uuid = new Uint16Array(8); |
| 325 window.crypto.getRandomValues(uuid); | 335 window.crypto.getRandomValues(uuid); |
| 326 uuid[3] = uuid[3] & 0x0FFF | 0x4000; // version 4 | 336 uuid[3] = uuid[3] & 0x0FFF | 0x4000; // version 4 |
| 327 uuid[4] = uuid[4] & 0x3FFF | 0x8000; // variant 1 | 337 uuid[4] = uuid[4] & 0x3FFF | 0x8000; // variant 1 |
| 328 | 338 |
| 329 let uuidString = ""; | 339 let uuidString = ""; |
| 330 for (let i = 0; i < uuid.length; i++) | 340 for (let i = 0; i < uuid.length; i++) |
| 331 { | 341 { |
| 332 let component = uuid[i].toString(16); | 342 let component = uuid[i].toString(16); |
| 333 while (component.length < 4) | 343 while (component.length < 4) |
| 334 component = "0" + component; | 344 component = "0" + component; |
| 335 uuidString += component; | 345 uuidString += component; |
| 336 if (i >= 1 && i<= 4) | 346 if (i >= 1 && i <= 4) |
| 337 uuidString += "-"; | 347 uuidString += "-"; |
| 338 } | 348 } |
| 339 | 349 |
| 340 let params = new URLSearchParams({ | 350 let params = new URLSearchParams({ |
| 341 version: 1, | 351 version: 1, |
| 342 guid: uuidString, | 352 guid: uuidString, |
| 343 lang: reportData.getElementsByTagName("adblock-plus")[0].getAttribute("local e") | 353 lang: reportData.getElementsByTagName("adblock-plus")[0] |
| 354 .getAttribute("locale") | |
| 344 }); | 355 }); |
| 345 let url = "https://reports.adblockplus.org/submitReport?" + params; | 356 let url = "https://reports.adblockplus.org/submitReport?" + params; |
| 346 | 357 |
| 347 let reportSent = event => | 358 let reportSent = event => |
| 348 { | 359 { |
| 349 let success = false; | 360 let success = false; |
| 350 let errorMessage = browser.i18n.getMessage("filters_subscription_lastDownloa d_connectionError"); | 361 let errorMessage = browser.i18n.getMessage( |
| 362 "filters_subscription_lastDownload_connectionError" | |
|
Manish Jethani
2017/10/24 12:04:14
Even though ESLint complain I think this is suppos
Wladimir Palant
2017/10/24 12:17:27
Done.
| |
| 363 ); | |
| 351 try | 364 try |
| 352 { | 365 { |
| 353 success = request.status == 200; | 366 success = request.status == 200; |
| 354 if (request.status != 0) | 367 if (request.status != 0) |
| 355 errorMessage = request.status + " " + request.statusText; | 368 errorMessage = request.status + " " + request.statusText; |
| 356 } | 369 } |
| 357 catch (e) | 370 catch (e) |
| 358 { | 371 { |
| 359 // Getting request status might throw if no connection was established | 372 // Getting request status might throw if no connection was established |
| 360 } | 373 } |
| (...skipping 19 matching lines...) Expand all Loading... | |
| 380 | 393 |
| 381 while (errorElement.firstChild) | 394 while (errorElement.firstChild) |
| 382 errorElement.removeChild(errorElement.firstChild); | 395 errorElement.removeChild(errorElement.firstChild); |
| 383 | 396 |
| 384 let link = document.createElement("a"); | 397 let link = document.createElement("a"); |
| 385 link.textContent = linkText; | 398 link.textContent = linkText; |
| 386 browser.runtime.sendMessage({ | 399 browser.runtime.sendMessage({ |
| 387 type: "app.get", | 400 type: "app.get", |
| 388 what: "doclink", | 401 what: "doclink", |
| 389 link: "reporter_connect_issue" | 402 link: "reporter_connect_issue" |
| 390 }).then(url => | 403 }).then(supportUrl => |
| 391 { | 404 { |
| 392 link.href = url; | 405 link.href = supportUrl; |
| 393 }); | 406 }); |
| 394 | 407 |
| 395 | 408 |
| 396 errorElement.appendChild(document.createTextNode(beforeLink)); | 409 errorElement.appendChild(document.createTextNode(beforeLink)); |
| 397 errorElement.appendChild(link); | 410 errorElement.appendChild(link); |
| 398 errorElement.appendChild(document.createTextNode(afterLink)); | 411 errorElement.appendChild(document.createTextNode(afterLink)); |
| 399 | 412 |
| 400 errorElement.hidden = false; | 413 errorElement.hidden = false; |
| 401 } | 414 } |
| 402 | 415 |
| 403 result = result.replace(/%CONFIRMATION%/g, encodeHTML(browser.i18n.getMessag e("issueReporter_confirmationMessage"))); | 416 result = result.replace(/%CONFIRMATION%/g, encodeHTML(browser.i18n.getMessag e("issueReporter_confirmationMessage"))); |
| 404 result = result.replace(/%KNOWNISSUE%/g, encodeHTML(browser.i18n.getMessage( "issueReporter_knownIssueMessage"))); | 417 result = result.replace(/%KNOWNISSUE%/g, encodeHTML(browser.i18n.getMessage( "issueReporter_knownIssueMessage"))); |
| 405 result = result.replace(/(<html)\b/, '$1 dir="' + encodeHTML(window.getCompu tedStyle(document.documentElement, "").direction + '"')); | 418 result = result.replace(/(<html)\b/, '$1 dir="' + encodeHTML(window.getCompu tedStyle(document.documentElement, "").direction + '"')); |
| 406 | 419 |
| 407 document.getElementById("sendReportMessage").hidden = true; | 420 document.getElementById("sendReportMessage").hidden = true; |
| 408 document.getElementById("sendingProgressContainer").hidden = true; | 421 document.getElementById("sendingProgressContainer").hidden = true; |
| 409 | 422 |
| 410 let resultFrame = document.getElementById("result"); | 423 let resultFrame = document.getElementById("result"); |
| 411 resultFrame.setAttribute("src", "data:text/html;charset=utf-8," + encodeURIC omponent(result)); | 424 resultFrame.setAttribute("src", "data:text/html;charset=utf-8," + |
| 425 encodeURIComponent(result)); | |
| 412 resultFrame.hidden = false; | 426 resultFrame.hidden = false; |
| 413 | 427 |
| 414 document.getElementById("continue").disabled = false; | 428 document.getElementById("continue").disabled = false; |
| 415 }; | 429 }; |
| 416 | 430 |
| 417 let request = new XMLHttpRequest(); | 431 let request = new XMLHttpRequest(); |
| 418 request.open("POST", url); | 432 request.open("POST", url); |
| 419 request.setRequestHeader("Content-Type", "text/xml"); | 433 request.setRequestHeader("Content-Type", "text/xml"); |
| 420 request.setRequestHeader("X-Adblock-Plus", "1"); | 434 request.setRequestHeader("X-Adblock-Plus", "1"); |
| 421 request.addEventListener("load", reportSent); | 435 request.addEventListener("load", reportSent); |
| 422 request.addEventListener("error", reportSent); | 436 request.addEventListener("error", reportSent); |
| 423 request.upload.addEventListener("progress", event => | 437 request.upload.addEventListener("progress", event => |
| 424 { | 438 { |
| 425 if (!event.lengthComputable) | 439 if (!event.lengthComputable) |
| 426 return; | 440 return; |
| 427 | 441 |
| 428 let progress = Math.round(event.loaded / event.total * 100); | |
| 429 if (event.loaded > 0) | 442 if (event.loaded > 0) |
| 430 { | 443 { |
| 431 let progress = document.getElementById("sendingProgress"); | 444 let progress = document.getElementById("sendingProgress"); |
| 432 progress.max = event.total; | 445 progress.max = event.total; |
| 433 progress.value = event.loaded; | 446 progress.value = event.loaded; |
| 434 } | 447 } |
| 435 }); | 448 }); |
| 436 request.send(serializeReportData()); | 449 request.send(serializeReportData()); |
| 437 } | 450 } |
| 438 | 451 |
| 439 function leaveSendPage() | 452 function leaveSendPage() |
| 440 { | 453 { |
| 441 window.close(); | 454 window.close(); |
| 442 } | 455 } |
| OLD | NEW |