| Index: ext/content.js |
| =================================================================== |
| --- a/ext/content.js |
| +++ b/ext/content.js |
| @@ -15,132 +15,65 @@ |
| * along with Adblock Plus. If not, see <http://www.gnu.org/licenses/>. |
| */ |
| (function(global) |
| { |
| if (!global.ext) |
| global.ext = {}; |
| - function getURLParameters(data) |
| + var backgroundFrame = document.createElement("iframe"); |
| + backgroundFrame.setAttribute("src", "background.html" + window.location.search); |
| + backgroundFrame.style.visibility = "hidden"; |
|
Thomas Greiner
2014/12/18 17:32:06
Rather use `backgroundFrame.style.display = "none"
Wladimir Palant
2014/12/18 22:04:44
Right, I forgot that frames will still load despit
|
| + window.addEventListener("DOMContentLoaded", function() |
| { |
| - if (window.location.search) |
| + document.body.appendChild(backgroundFrame); |
| + }, false); |
| + |
| + var messageQueue = []; |
| + var maxMessageId = -1; |
| + var loadHandler = function(event) |
| + { |
| + if (event.data.type == "backgroundPageLoaded") |
| { |
| - var params = window.location.search.substr(1).split("&"); |
| - for (var i = 0; i < params.length; i++) |
| - { |
| - var parts = params[i].split("=", 2); |
| - if (parts.length == 2 && parts[0] in data) |
| - data[parts[0]] = decodeURIComponent(parts[1]); |
| - } |
| + var queue = messageQueue; |
| + messageQueue = null; |
| + if (queue) |
| + for (var i = 0; i < queue.length; i++) |
| + backgroundFrame.contentWindow.postMessage(queue[i], "*"); |
| + window.removeEventListener("message", loadHandler, false); |
| } |
| } |
| - |
| - var subscriptions =[ |
| - "https://easylist-downloads.adblockplus.org/easylistgermany+easylist.txt", |
| - "https://easylist-downloads.adblockplus.org/exceptionrules.txt", |
| - "https://easylist-downloads.adblockplus.org/fanboy-social.txt" |
| - ]; |
| - |
| - var listenerFilter = null; |
| + window.addEventListener("message", loadHandler, false); |
| global.ext.backgroundPage = { |
| sendMessage: function(message, responseCallback) |
| { |
| - var respond = function(response) |
| + var rawMessage = { |
| + type: "message", |
| + messageId: ++maxMessageId, |
| + payload: message |
| + }; |
| + if (messageQueue) |
| + messageQueue.push(rawMessage); |
| + else |
| + backgroundFrame.contentWindow.postMessage(rawMessage, "*"); |
| + |
| + if (responseCallback) |
| { |
| - setTimeout(responseCallback.bind(responseCallback, response), 0); |
| - }; |
| - |
| - var dispatchListenerNotification = function(action) |
| - { |
| - var match = /^subscription\.(.*)/.exec(action); |
| - if (match && listenerFilter && listenerFilter.indexOf(match[1]) >= 0) |
| + var callbackWrapper = function(event) |
| { |
| - global.ext.onMessage._dispatch({ |
| - type: "subscriptions.listen", |
| - action: match[1], |
| - args: Array.prototype.slice.call(arguments, 1) |
| - }); |
| - } |
| - }; |
| - |
| - switch (message.type) |
| - { |
| - case "app.doclink": |
| - respond("https://adblockplus.org/redirect?link=" + encodeURIComponent(message.args[0])); |
| - break; |
| - case "app.info": |
| - var response = {platform: "gecko", platformVersion: "34.0", application: "firefox", applicationVersion: "34.0"}; |
| - getURLParameters(response); |
| - respond(response); |
| - break; |
| - case "app.issues": |
| - var response = {seenDataCorruption: false, filterlistsReinitialized: false}; |
| - getURLParameters(response); |
| - respond(response); |
| - break; |
| - case "app.options": |
| - window.open("http://example.com/options.html", "_blank"); |
| - break; |
| - case "subscriptions.get": |
| - respond(subscriptions); |
| - break; |
| - case "filters.blocked": |
| - var params = {blockedURLs: ""}; |
| - getURLParameters(params); |
| - var blocked = params.blockedURLs.split(","); |
| - respond(blocked.indexOf(message.url) >= 0); |
| - break; |
| - case "subscriptions.toggle": |
| - var index = subscriptions.indexOf(message.url); |
| - if (index >= 0) |
| + if (event.data.type == "response" && event.data.messageId == rawMessage.messageId) |
| { |
| - subscriptions.splice(index, 1); |
| - dispatchListenerNotification("subscription.removed", message.url); |
| + window.removeEventListener("message", callbackWrapper, false); |
| + responseCallback(event.data.payload); |
| } |
| - else |
| - { |
| - subscriptions.push(message.url); |
| - dispatchListenerNotification("subscription.added", message.url); |
| - } |
| - break; |
| - case "subscriptions.listen": |
| - listenerFilter = message.filter; |
| - break; |
| + }; |
| + window.addEventListener("message", callbackWrapper, false); |
| } |
| } |
| }; |
| - var EventTarget = function(cancelable) |
| + window.addEventListener("unload", function() |
|
Thomas Greiner
2014/12/18 17:32:06
I don't see why an "unload" handler make sense in
Wladimir Palant
2014/12/18 22:04:44
Happens to be good enough for testing, the message
|
| { |
| - this._listeners = []; |
| - this._cancelable = cancelable; |
| - }; |
| - EventTarget.prototype = { |
| - addListener: function(listener) |
| - { |
| - if (this._listeners.indexOf(listener) == -1) |
| - this._listeners.push(listener); |
| - }, |
| - removeListener: function(listener) |
| - { |
| - var idx = this._listeners.indexOf(listener); |
| - if (idx != -1) |
| - this._listeners.splice(idx, 1); |
| - }, |
| - _dispatch: function() |
| - { |
| - var result = null; |
| - |
| - for (var i = 0; i < this._listeners.length; i++) |
| - { |
| - result = this._listeners[i].apply(null, arguments); |
| - |
| - if (this._cancelable && result === false) |
| - break; |
| - } |
| - |
| - return result; |
| - } |
| - }; |
| - global.ext.onMessage = new EventTarget(); |
| + global.ext.backgroundPage.sendMessage({type: "removePage"}); |
| + }, false); |
| })(this); |