Index: lib/typoNetError.js |
=================================================================== |
new file mode 100644 |
--- /dev/null |
+++ b/lib/typoNetError.js |
@@ -0,0 +1,138 @@ |
+/* |
+ * This file is part of the URL Fixer, |
+ * Copyright (C) 2006-2012 Eyeo GmbH |
+ * |
+ * URL Fixer 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. |
+ * |
+ * URL Fixer 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 URL Fixer. If not, see <http://www.gnu.org/licenses/>. |
+ */ |
+ |
+let {Prefs} = require("prefs"); |
+let {WindowObserver} = require("windowObserver"); |
+let appIntegration = require("typoAppIntegration"); |
+let {onWhitelistEntryRemoved} = require("typoRules"); |
+let {processUserCorrection} = require("typoCollector"); |
+ |
+// Load HTML code to add to network error pages |
+let netErrorOverlay = null; |
+let request = Cc["@mozilla.org/xmlextras/xmlhttprequest;1"].createInstance(Ci.nsIXMLHttpRequest); |
+request.open("GET", "chrome://" + require("info").addonName + "/content/netError.xhtml"); |
+request.addEventListener("load", function(event) |
+{ |
+ netErrorOverlay = event.target.responseXML; |
+ |
+ new WindowObserver({ |
+ applyToWindow: function(window) |
+ { |
+ if (!appIntegration.isKnownWindow(window)) |
+ return; |
+ |
+ let browser = appIntegration.getBrowser(window); |
+ if (browser) |
+ browser.addEventListener("DOMContentLoaded", handlePageLoad, false); |
+ }, |
+ |
+ removeFromWindow: function(window) |
+ { |
+ if (!appIntegration.isKnownWindow(window)) |
+ return; |
+ |
+ let browser = appIntegration.getBrowser(window); |
+ if (browser) |
+ { |
+ browser.removeEventListener("DOMContentLoaded", handlePageLoad, false); |
+ if (browser.browsers) |
+ { |
+ for (let i = 0; i < browser.browsers.length; i++) |
+ { |
+ let contentWnd = browser.browsers[i].contentWindow; |
+ if (contentWnd.document.documentURI.indexOf("about:neterror?") == 0) |
+ removeFromNetErrorPage(contentWnd); |
+ } |
+ } |
+ } |
+ } |
+ }); |
+}, false); |
+request.send(null); |
+ |
+function handlePageLoad(event) |
+{ |
+ let document = event.target; |
+ if (document.documentURI.indexOf("about:neterror?") != 0 || |
+ document.documentURI.indexOf("e=netOffline") > 0 || |
+ document.documentURI.indexOf("e=notCached") > 0) |
+ { |
+ return; |
+ } |
+ |
+ if (!netErrorOverlay || document.getElementById("url-fixer-section")) |
+ return; |
+ |
+ let container = document.getElementById("errorPageContainer"); |
+ if (!container) |
+ return; |
+ |
+ container.appendChild(netErrorOverlay.documentElement.cloneNode(true)); |
+ |
+ let textField = document.getElementById("url-fixer-intention"); |
+ textField.value = document.defaultView.location.href; |
+ |
+ let retryButton = document.getElementById("url-fixer-retry"); |
+ retryButton.addEventListener("click", function() |
+ { |
+ let newURL = textField.value.replace(/^\s+/, "").replace(/\s+$/, ""); |
+ if (!newURL.length) |
+ return; |
+ |
+ let [prefix, newHost, suffix] = parseURL(newURL); |
+ let oldHost = document.defaultView.location.hostname.toLowerCase(); |
+ |
+ processUserCorrection(oldHost, newHost); |
+ |
+ if (newHost.indexOf("www.") == 0 && oldHost.indexOf("www.") == 0) |
+ { |
+ // Ignore www. prefix if they both start with it |
+ newHost = newHost.substr(4); |
+ oldHost = oldHost.substr(4); |
+ } |
+ if (oldHost && newHost != oldHost) |
+ { |
+ Prefs.custom_replace[oldHost] = newHost; |
+ Prefs.custom_replace = JSON.parse(JSON.stringify(Prefs.custom_replace)); |
+ } |
+ |
+ // Remove from whitelist |
+ if (oldHost in Prefs.whitelist) |
+ { |
+ delete Prefs.whitelist[oldHost]; |
+ onWhitelistEntryRemoved(oldHost); |
+ Prefs.whitelist = JSON.parse(JSON.stringify(Prefs.whitelist)); |
+ } |
+ |
+ document.defaultView.location.replace(newURL); |
+ }, false); |
+} |
+ |
+function removeFromNetErrorPage(window) |
+{ |
+ let overlay = window.document.getElementById("url-fixer-section"); |
+ if (overlay) |
+ overlay.parentNode.removeChild(overlay); |
+} |
+ |
+function parseURL(url) |
+{ |
+ if (/^\s*((?:\w+:)?\/*(?:[^\/#]*@)?)([^\/:#]*)/.test(url)) |
+ return [RegExp.$1, RegExp.$2.toLowerCase(), RegExp.rightContext]; |
+ else |
+ return [url, null, null]; |
+} |