| Index: issue-reporter.js |
| =================================================================== |
| deleted file mode 100644 |
| --- a/issue-reporter.js |
| +++ /dev/null |
| @@ -1,442 +0,0 @@ |
| -/* |
| - * This file is part of Adblock Plus <https://adblockplus.org/>, |
| - * Copyright (C) 2006-present eyeo GmbH |
| - * |
| - * Adblock Plus is free software: you can redistribute it and/or modify |
| - * it under the terms of the GNU General Public License version 3 as |
| - * published by the Free Software Foundation. |
| - * |
| - * Adblock Plus is distributed in the hope that it will be useful, |
| - * but WITHOUT ANY WARRANTY; without even the implied warranty of |
| - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
| - * GNU General Public License for more details. |
| - * |
| - * You should have received a copy of the GNU General Public License |
| - * along with Adblock Plus. If not, see <http://www.gnu.org/licenses/>. |
| - */ |
| - |
| -"use strict"; |
| - |
| -window.ext = {}; |
| - |
| -let reportData = new DOMParser().parseFromString("<report></report>", "text/xml"); |
| - |
| -let pages = { |
| - "typeSelectorPage": [initTypeSelector, leaveTypeSelector], |
| - "commentPage": [initCommentPage, leaveCommentPage], |
| - "sendPage": [initSendPage, leaveSendPage] |
| -}; |
| - |
| -document.addEventListener("DOMContentLoaded", () => |
| -{ |
| - document.getElementById("cancel").addEventListener("click", () => |
| - { |
| - window.close(); |
| - }); |
| - |
| - document.getElementById("continue").addEventListener("click", () => |
| - { |
| - if (!document.getElementById("continue").disabled) |
| - pages[getCurrentPage()][1](); |
| - }); |
| - |
| - document.addEventListener("keydown", event => |
| - { |
| - let blacklistedElements = new Set(["textarea", "button", "a"]) |
| - |
| - if (event.key == "Enter" && !blacklistedElements.has(event.target.localName)) |
| - document.getElementById("continue").click(); |
| - else if (event.key == "Escape") |
| - document.getElementById("cancel").click(); |
| - }); |
| - |
| - browser.runtime.sendMessage({ |
| - type: "app.get", |
| - what: "doclink", |
| - link: "reporter_privacy" |
| - }).then(url => |
| - { |
| - document.getElementById("privacyPolicy").href = url; |
| - }); |
| - |
| - initDataCollector(); |
| -}); |
| - |
| -function getCurrentPage() |
| -{ |
| - return document.querySelector(".page:not([hidden])").id; |
| -} |
| - |
| -function setCurrentPage(pageId) |
| -{ |
| - if (!pages.hasOwnProperty(pageId)) |
| - return; |
| - |
| - let previousPage = document.querySelector(".page:not([hidden])"); |
| - if (previousPage) |
| - previousPage.hidden = true; |
| - |
| - document.getElementById(pageId).hidden = false; |
| - pages[pageId][0](); |
| -} |
| - |
| -function censorURL(url) |
| -{ |
| - return url.replace(/([?;&\/#][^?;&\/#]+?=)[^?;&\/#]+/g, "$1*"); |
| -} |
| - |
| -function encodeHTML(str) |
| -{ |
| - return str.replace(/&/g, "&").replace(/</g, "<").replace(/>/g, ">").replace(/"/g, """); |
| -} |
| - |
| -function serializeReportData() |
| -{ |
| - let result = new XMLSerializer().serializeToString(reportData); |
| - |
| - // Insert line breaks before each new tag |
| - result = result.replace(/(<[^\/]([^"<>]*|"[^"]*")*>)/g, "\n$1"); |
| - result = result.replace(/^\n+/, ""); |
| - return result; |
| -} |
| - |
| -function retrieveAddonInfo() |
| -{ |
| - let element = reportData.createElement("adblock-plus"); |
| - return browser.runtime.sendMessage({ |
| - type: "app.get", |
| - what: "addonVersion" |
| - }).then(addonVersion => |
| - { |
| - element.setAttribute("version", addonVersion); |
| - return browser.runtime.sendMessage({ |
| - type: "app.get", |
| - what: "localeInfo" |
| - }); |
| - }).then(({locale}) => |
| - { |
| - element.setAttribute("locale", locale); |
| - reportData.documentElement.appendChild(element); |
| - }); |
| -} |
| - |
| -function retrieveApplicationInfo() |
| -{ |
| - let element = reportData.createElement("application"); |
| - return browser.runtime.sendMessage({ |
| - type: "app.get", |
| - what: "application" |
| - }).then(application => |
| - { |
| - element.setAttribute("name", application); |
| - return browser.runtime.sendMessage({ |
| - type: "app.get", |
| - what: "applicationVersion" |
| - }); |
| - }).then(applicationVersion => |
| - { |
| - element.setAttribute("version", applicationVersion); |
| - element.setAttribute("userAgent", navigator.userAgent); |
| - reportData.documentElement.appendChild(element); |
| - }); |
| -} |
| - |
| -function retrievePlatformInfo() |
| -{ |
| - let element = reportData.createElement("platform"); |
| - return browser.runtime.sendMessage({ |
| - type: "app.get", |
| - what: "platform" |
| - }).then(platform => |
| - { |
| - element.setAttribute("name", platform); |
| - return browser.runtime.sendMessage({ |
| - type: "app.get", |
| - what: "platformVersion" |
| - }); |
| - }).then(platformVersion => |
| - { |
| - element.setAttribute("version", platformVersion); |
| - reportData.documentElement.appendChild(element); |
| - }); |
| -} |
| - |
| -function retrieveTabURL(tabId) |
| -{ |
| - return browser.tabs.get(tabId).then(tab => |
| - { |
| - let element = reportData.createElement("window"); |
| - if (tab.url) |
| - element.setAttribute("url", censorURL(tab.url)); |
| - reportData.documentElement.appendChild(element); |
| - }); |
| -} |
| - |
| -function retrieveSubscriptions() |
| -{ |
| - return browser.runtime.sendMessage({ |
| - type: "subscriptions.get", |
| - ignoreDisabled: true, |
| - downloadable: true |
| - }).then(subscriptions => |
| - { |
| - let element = reportData.createElement("subscriptions"); |
| - for (let subscription of subscriptions) |
| - { |
| - if (!/^(http|https|ftp):/.test(subscription.url)) |
| - continue; |
| - |
| - let now = Math.round(Date.now() / 1000); |
| - let subscriptionElement = reportData.createElement("subscription"); |
| - subscriptionElement.setAttribute("id", subscription.url); |
| - if (subscription.lastDownload) |
| - subscriptionElement.setAttribute("lastDownloadAttempt", subscription.lastDownload - now); |
| - subscriptionElement.setAttribute("downloadStatus", subscription.downloadStatus); |
| - element.appendChild(subscriptionElement); |
| - } |
| - reportData.documentElement.appendChild(element); |
| - }); |
| -} |
| - |
| -function initDataCollector() |
| -{ |
| - Promise.resolve().then(() => |
| - { |
| - let tabId = parseInt(location.search.replace(/^\?/, ""), 10) || 0; |
| - let handlers = [ |
| - retrieveAddonInfo(), |
| - retrieveApplicationInfo(), |
| - retrievePlatformInfo(), |
| - retrieveTabURL(tabId), |
| - retrieveSubscriptions() |
| - ]; |
| - return Promise.all(handlers); |
| - }).then(() => |
| - { |
| - setCurrentPage("typeSelectorPage"); |
| - }).catch(e => |
| - { |
| - if (!e.name && e.message) |
| - e = e.message; |
| - alert(e); |
| - window.close(); |
| - }); |
| -} |
| - |
| -function initTypeSelector() |
| -{ |
| - document.getElementById("typeFalsePositive").focus(); |
| - |
| - |
| - for (let checkbox of document.querySelectorAll("input[name='type']")) |
| - { |
| - checkbox.addEventListener("click", () => |
| - { |
| - if (document.querySelector("input[name='type']:checked")) |
| - document.getElementById("continue").disabled = false; |
| - }); |
| - } |
| -} |
| - |
| -function leaveTypeSelector() |
| -{ |
| - let checkbox = document.querySelector("input[name='type']:checked"); |
| - reportData.documentElement.setAttribute("type", checkbox.value); |
| - setCurrentPage("commentPage"); |
| -} |
| - |
| -function initCommentPage() |
| -{ |
| - let continueButton = document.getElementById("continue"); |
| - continueButton.disabled = true; |
| - continueButton.textContent = browser.i18n.getMessage("issueReporter_sendButton_label"); |
| - |
| - let emailElement = reportData.createElement("email"); |
| - let emailField = document.getElementById("email"); |
| - let anonymousSubmissionField = document.getElementById("anonymousSubmission"); |
| - let validateEmail = () => |
| - { |
| - document.getElementById("anonymousSubmissionWarning").setAttribute("data-invisible", !anonymousSubmissionField.checked); |
| - if (anonymousSubmissionField.checked) |
| - { |
| - emailField.value = ""; |
| - emailField.disabled = true; |
| - continueButton.disabled = false; |
| - if (emailElement.parentNode) |
| - emailElement.parentNode.removeChild(emailElement); |
| - } |
| - else |
| - { |
| - emailField.disabled = false; |
| - |
| - let value = emailField.value.trim(); |
| - emailElement.textContent = value; |
| - reportData.documentElement.appendChild(emailElement); |
| - continueButton.disabled = value == "" || !emailField.validity.valid; |
| - } |
| - }; |
| - emailField.addEventListener("input", validateEmail); |
| - anonymousSubmissionField.addEventListener("click", validateEmail); |
| - |
| - let commentElement = reportData.createElement("comment"); |
| - document.getElementById("comment").addEventListener("input", event => |
| - { |
| - if (commentElement.parentNode) |
| - commentElement.parentNode.removeChild(commentElement); |
| - |
| - let value = event.target.value.trim(); |
| - commentElement.textContent = value.substr(0, 1000); |
| - if (value) |
| - reportData.documentElement.appendChild(commentElement); |
| - document.getElementById("commentLengthWarning").setAttribute("data-invisible", value.length <= 1000); |
| - }); |
| - |
| - document.getElementById("showData").addEventListener("click", event => |
| - { |
| - event.preventDefault(); |
| - |
| - // window.open() won't open data: URIs in Chrome |
| - browser.tabs.getCurrent().then(tab => |
| - { |
| - browser.tabs.create({ |
| - url: "data:text/xml;charset=utf-8," + encodeURIComponent(serializeReportData()), |
| - openerTabId: tab.id |
| - }); |
| - }) |
| - }); |
| - |
| - emailField.focus(); |
| -} |
| - |
| -function leaveCommentPage() |
| -{ |
| - setCurrentPage("sendPage"); |
| -} |
| - |
| -function initSendPage() |
| -{ |
| - document.getElementById("cancel").hidden = true; |
| - |
| - let continueButton = document.getElementById("continue"); |
| - continueButton.textContent = browser.i18n.getMessage("issueReporter_doneButton_label"); |
| - continueButton.disabled = true; |
| - |
| - let uuid = new Uint16Array(8); |
| - window.crypto.getRandomValues(uuid); |
| - uuid[3] = uuid[3] & 0x0FFF | 0x4000; // version 4 |
| - uuid[4] = uuid[4] & 0x3FFF | 0x8000; // variant 1 |
| - |
| - let uuidString = ""; |
| - for (let i = 0; i < uuid.length; i++) |
| - { |
| - let component = uuid[i].toString(16); |
| - while (component.length < 4) |
| - component = "0" + component; |
| - uuidString += component; |
| - if (i >= 1 && i<= 4) |
| - uuidString += "-"; |
| - } |
| - |
| - let params = new URLSearchParams({ |
| - version: 1, |
| - guid: uuidString, |
| - lang: reportData.getElementsByTagName("adblock-plus")[0].getAttribute("locale") |
| - }); |
| - let url = "https://reports.adblockplus.org/submitReport?" + params; |
| - |
| - let reportSent = event => |
| - { |
| - let success = false; |
| - let errorMessage = browser.i18n.getMessage("filters_subscription_lastDownload_connectionError"); |
| - try |
| - { |
| - success = request.status == 200; |
| - if (request.status != 0) |
| - errorMessage = request.status + " " + request.statusText; |
| - } |
| - catch (e) |
| - { |
| - // Getting request status might throw if no connection was established |
| - } |
| - |
| - let result; |
| - try |
| - { |
| - result = request.responseText; |
| - } |
| - catch (e) |
| - { |
| - result = ""; |
| - } |
| - |
| - if (!success) |
| - { |
| - let errorElement = document.getElementById("error"); |
| - let template = browser.i18n.getMessage("issueReporter_errorMessage").replace(/[\r\n\s]+/g, " "); |
| - |
| - let [, beforeLink, linkText, afterLink] = /(.*)\[link\](.*)\[\/link\](.*)/.exec(template) || [null, "", template, ""]; |
| - beforeLink = beforeLink.replace(/\?1\?/g, errorMessage); |
| - afterLink = afterLink.replace(/\?1\?/g, errorMessage); |
| - |
| - while (errorElement.firstChild) |
| - errorElement.removeChild(errorElement.firstChild); |
| - |
| - let link = document.createElement("a"); |
| - link.textContent = linkText; |
| - browser.runtime.sendMessage({ |
| - type: "app.get", |
| - what: "doclink", |
| - link: "reporter_connect_issue" |
| - }).then(url => |
| - { |
| - link.href = url; |
| - }); |
| - |
| - |
| - errorElement.appendChild(document.createTextNode(beforeLink)); |
| - errorElement.appendChild(link); |
| - errorElement.appendChild(document.createTextNode(afterLink)); |
| - |
| - errorElement.hidden = false; |
| - } |
| - |
| - result = result.replace(/%CONFIRMATION%/g, encodeHTML(browser.i18n.getMessage("issueReporter_confirmationMessage"))); |
| - result = result.replace(/%KNOWNISSUE%/g, encodeHTML(browser.i18n.getMessage("issueReporter_knownIssueMessage"))); |
| - result = result.replace(/(<html)\b/, '$1 dir="' + encodeHTML(window.getComputedStyle(document.documentElement, "").direction + '"')); |
| - |
| - document.getElementById("sendReportMessage").hidden = true; |
| - document.getElementById("sendingProgressContainer").hidden = true; |
| - |
| - let resultFrame = document.getElementById("result"); |
| - resultFrame.setAttribute("src", "data:text/html;charset=utf-8," + encodeURIComponent(result)); |
| - resultFrame.hidden = false; |
| - |
| - document.getElementById("continue").disabled = false; |
| - }; |
| - |
| - let request = new XMLHttpRequest(); |
| - request.open("POST", url); |
| - request.setRequestHeader("Content-Type", "text/xml"); |
| - request.setRequestHeader("X-Adblock-Plus", "1"); |
| - request.addEventListener("load", reportSent); |
| - request.addEventListener("error", reportSent); |
| - request.upload.addEventListener("progress", event => |
| - { |
| - if (!event.lengthComputable) |
| - return; |
| - |
| - let progress = Math.round(event.loaded / event.total * 100); |
| - if (event.loaded > 0) |
| - { |
| - let progress = document.getElementById("sendingProgress"); |
| - progress.max = event.total; |
| - progress.value = event.loaded; |
| - } |
| - }); |
| - request.send(serializeReportData()); |
| -} |
| - |
| -function leaveSendPage() |
| -{ |
| - window.close(); |
| -} |