[Pkg-mozext-commits] [adblock-plus] 33/74: Issue 1528 - Implemented backend for general tab of new options page

David Prévot taffit at moszumanska.debian.org
Tue Aug 11 12:07:08 UTC 2015


This is an automated email from the git hooks/post-receive script.

taffit pushed a commit to branch master
in repository adblock-plus.

commit 6522633759ece9cbb2525880e6f4f775a66cf972
Author: Thomas Greiner <thomas at adblockplus.org>
Date:   Tue Jun 9 16:50:16 2015 +0200

    Issue 1528 - Implemented backend for general tab of new options page
---
 README.md           |  13 +++++
 background.js       | 121 ++++++++++++++++++++++++++++++++++--------
 ext/background.js   |   8 ++-
 messageResponder.js | 150 ++++++++++++++++++++++++++++++++++++++++++----------
 4 files changed, 242 insertions(+), 50 deletions(-)

diff --git a/README.md b/README.md
index f957207..995d679 100644
--- a/README.md
+++ b/README.md
@@ -59,3 +59,16 @@ The behavior of this page is affected by a number of URL parameters:
   `true` should trigger warnings referring to issues detected by Adblock Plus.
 * `blockedURLs`: a comma-separated list of URLs that should be considered
   blocked (necessary to test the check for blocked scripts in sharing buttons).
+
+options.html
+------------
+
+This is the implementation of the Adblock Plus options page which is the primary
+UI for changing settings and for managing filter lists.
+
+The behavior of this page is affected by a number of URL parameters:
+
+* `addonVersion`: sets addon version application parameter that is used for
+  creating the link to the version-specific release notes
+* `addSubscription=true`: this parameter should trigger a dialog for adding
+  subscriptions as initiated by clicking on an "abp:subscribe" link
diff --git a/background.js b/background.js
index 41b55f2..fecc5fc 100644
--- a/background.js
+++ b/background.js
@@ -31,12 +31,6 @@
     }
   }
 
-  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 modules = {};
   global.require = function(module)
   {
@@ -56,6 +50,12 @@
     }
   };
 
+  modules.prefs = {
+    Prefs: {
+      "subscriptions_exceptionsurl": "https://easylist-downloads.adblockplus.org/exceptionrules.txt"
+    }
+  }
+
   modules.subscriptionClasses = {
     Subscription: function(url)
     {
@@ -65,11 +65,19 @@
       this.lastDownload = 1234;
     },
 
-    SpecialSubscription: function() {}
+    SpecialSubscription: function(url)
+    {
+      this.url = url;
+      this.disabled = false;
+      this.filters = knownFilters.slice();
+    }
   };
   modules.subscriptionClasses.Subscription.fromURL = function(url)
   {
-    return new modules.subscriptionClasses.Subscription(url);
+    if (/^https?:\/\//.test(url))
+      return new modules.subscriptionClasses.Subscription(url);
+    else
+      return new modules.subscriptionClasses.SpecialSubscription(url);
   };
   modules.subscriptionClasses.DownloadableSubscription = modules.subscriptionClasses.Subscription;
 
@@ -77,41 +85,72 @@
     FilterStorage: {
       get subscriptions()
       {
-        return subscriptions.map(modules.subscriptionClasses.Subscription.fromURL);
+        var subscriptions = [];
+        for (var url in modules.filterStorage.FilterStorage.knownSubscriptions)
+          subscriptions.push(modules.filterStorage.FilterStorage.knownSubscriptions[url]);
+        return subscriptions;
       },
 
       get knownSubscriptions()
       {
-        var result = {};
-        for (var i = 0; i < subscriptions.length; i++)
-          result[subscriptions[i]] = modules.subscriptionClasses.Subscription.fromURL(subscriptions[i]);
-        return result;
+        return knownSubscriptions;
       },
 
       addSubscription: function(subscription)
       {
-        var index = subscriptions.indexOf(subscription.url);
-        if (index < 0)
+        if (!(subscription.url in modules.filterStorage.FilterStorage.knownSubscriptions))
         {
-          subscriptions.push(subscription.url);
+          knownSubscriptions[subscription.url] = modules.subscriptionClasses.Subscription.fromURL(subscription.url);
           modules.filterNotifier.FilterNotifier.triggerListeners("subscription.added", subscription);
         }
       },
 
       removeSubscription: function(subscription)
       {
-        var index = subscriptions.indexOf(subscription.url);
-        if (index >= 0)
+        if (subscription.url in modules.filterStorage.FilterStorage.knownSubscriptions)
         {
-          subscriptions.splice(index, 1);
+          delete knownSubscriptions[subscription.url];
           modules.filterNotifier.FilterNotifier.triggerListeners("subscription.removed", subscription);
         }
+      },
+
+      addFilter: function(filter)
+      {
+        for (var i = 0; i < customSubscription.filters.length; i++)
+        {
+          if (customSubscription.filters[i].text == filter.text)
+            return;
+        }
+        customSubscription.filters.push(filter);
+        modules.filterNotifier.FilterNotifier.triggerListeners("filter.added", filter);
+      },
+
+      removeFilter: function(filter)
+      {
+        for (var i = 0; i < customSubscription.filters.length; i++)
+        {
+          if (customSubscription.filters[i].text == filter.text)
+          {
+            customSubscription.filters.splice(i, 1);
+            modules.filterNotifier.FilterNotifier.triggerListeners("filter.removed", filter);
+            return;
+          }
+        }
       }
     }
   };
 
   modules.filterClasses = {
-    BlockingFilter: function() {}
+    BlockingFilter: function() {},
+    Filter: function(text)
+    {
+      this.text = text;
+      this.disabled = false;
+    }
+  };
+  modules.filterClasses.Filter.fromText = function(text)
+  {
+    return new modules.filterClasses.Filter(text);
   };
 
   modules.synchronizer = {
@@ -163,7 +202,9 @@
     platform: "gecko",
     platformVersion: "34.0",
     application: "firefox",
-    applicationVersion: "34.0"
+    applicationVersion: "34.0",
+    addonName: "adblockplus",
+    addonVersion: "2.6.7"
   };
   updateFromURL(modules.info);
 
@@ -176,8 +217,46 @@
     }
   };
 
+  var filters = [
+    "@@||alternate.de^$document",
+    "@@||der.postillion.com^$document", 
+    "@@||taz.de^$document",
+    "@@||amazon.de^$document"
+  ];
+  var knownFilters = filters.map(modules.filterClasses.Filter.fromText);
+
+  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",
+    "~user~786254"
+  ];
+  var knownSubscriptions = Object.create(null);
+  for (var subscriptionUrl of subscriptions)
+    knownSubscriptions[subscriptionUrl] = modules.subscriptionClasses.Subscription.fromURL(subscriptionUrl);
+  var customSubscription = knownSubscriptions["~user~786254"];
+
   var issues = {seenDataCorruption: false, filterlistsReinitialized: false};
   updateFromURL(issues);
   global.seenDataCorruption = issues.seenDataCorruption;
   global.filterlistsReinitialized = issues.filterlistsReinitialized;
+  
+  var events = {addSubscription: false};
+  updateFromURL(events);
+  if (events.addSubscription)
+  {
+    // We don't know how long it will take for the page to fully load
+    // so we'll post the message after one second
+    setTimeout(function()
+    {
+      window.postMessage({
+        type: "message",
+        payload: {
+          title: "Custom subscription",
+          url: "http://example.com/custom.txt",
+          type: "add-subscription"
+        }
+      }, "*");
+    }, 1000);
+  }
 })(this);
diff --git a/ext/background.js b/ext/background.js
index 02cbcc5..4fce887 100644
--- a/ext/background.js
+++ b/ext/background.js
@@ -76,8 +76,12 @@
 
   global.ext.PageMap = PageMap;
 
-  global.ext.showOptions = function()
+  global.ext.showOptions = function(callback)
   {
-    window.open("http://example.com/options.html", "_blank");
+    if (top.location.href.indexOf("options.html") == -1)
+      window.open("options.html", "_blank");
+
+    if (callback)
+      callback();
   };
 })(this);
diff --git a/messageResponder.js b/messageResponder.js
index 0f5ff0e..5322f17 100644
--- a/messageResponder.js
+++ b/messageResponder.js
@@ -20,11 +20,15 @@
   if (!global.ext)
     global.ext = require("ext_background");
 
+  var Prefs = require("prefs").Prefs;
   var Utils = require("utils").Utils;
   var FilterStorage = require("filterStorage").FilterStorage;
   var FilterNotifier = require("filterNotifier").FilterNotifier;
   var defaultMatcher = require("matcher").defaultMatcher;
-  var BlockingFilter = require("filterClasses").BlockingFilter;
+  
+  var filterClasses = require("filterClasses");
+  var Filter = filterClasses.Filter;
+  var BlockingFilter = filterClasses.BlockingFilter;
   var Synchronizer = require("synchronizer").Synchronizer;
 
   var subscriptionClasses = require("subscriptionClasses");
@@ -32,15 +36,18 @@
   var DownloadableSubscription = subscriptionClasses.DownloadableSubscription;
   var SpecialSubscription = subscriptionClasses.SpecialSubscription;
 
-  var subscriptionKeys = ["disabled", "homepage", "lastSuccess", "title", "url", "downloadStatus"];
-  function convertSubscription(subscription)
+  function convertObject(keys, obj)
   {
     var result = {};
-    for (var i = 0; i < subscriptionKeys.length; i++)
-      result[subscriptionKeys[i]] = subscription[subscriptionKeys[i]]
+    for (var i = 0; i < keys.length; i++)
+      result[keys[i]] = obj[keys[i]];
     return result;
   }
 
+  var convertSubscription = convertObject.bind(null, ["disabled",
+    "downloadStatus", "homepage", "lastSuccess", "title", "url"]);
+  var convertFilter = convertObject.bind(null, ["text"]);
+
   var changeListeners = null;
   var messageTypes = {
     "app": "app.listen",
@@ -50,6 +57,9 @@
 
   function onFilterChange(action)
   {
+    if (action == "load")
+      action = "filter.loaded";
+
     var parts = action.split(".", 2);
     var type;
     if (parts.length == 1)
@@ -70,6 +80,8 @@
     {
       if (arg instanceof Subscription)
         return convertSubscription(arg);
+      else if (arg instanceof Filter)
+        return convertFilter(arg);
       else
         return arg;
     });
@@ -91,8 +103,37 @@
 
   global.ext.onMessage.addListener(function(message, sender, callback)
   {
+    var listenerFilters = null;
     switch (message.type)
     {
+      case "app.listen":
+      case "filters.listen":
+      case "subscriptions.listen":
+        if (!changeListeners)
+        {
+          changeListeners = new global.ext.PageMap();
+          FilterNotifier.addListener(onFilterChange);
+        }
+
+        listenerFilters = changeListeners.get(sender.page);
+        if (!listenerFilters)
+        {
+          listenerFilters = Object.create(null);
+          changeListeners.set(sender.page, listenerFilters);
+        }
+        break;
+    }
+
+    switch (message.type)
+    {
+      case "add-subscription":
+        ext.showOptions(function()
+        {
+          var subscription = Subscription.fromURL(message.url);
+          subscription.title = message.title;
+          onFilterChange("addSubscription", subscription);
+        });
+        break;
       case "app.get":
         if (message.what == "issues")
         {
@@ -118,13 +159,80 @@
 
           callback({locale: Utils.appLocale, bidiDir: bidiDir});
         }
+        else if (message.what == "addonVersion")
+        {
+          callback(require("info").addonVersion);
+        }
         else
           callback(null);
         break;
+      case "app.listen":
+        if (message.filter)
+          listenerFilters.app = message.filter;
+        else
+          delete listenerFilters.app;
+        break;
       case "app.open":
         if (message.what == "options")
           ext.showOptions();
         break;
+      case "filters.add":
+        var filter = Filter.fromText(message.text);
+        FilterStorage.addFilter(filter);
+        break;
+      case "filters.blocked":
+        var filter = defaultMatcher.matchesAny(message.url, message.requestType,
+          message.docDomain, message.thirdParty);
+        callback(filter instanceof BlockingFilter);
+        break;
+      case "filters.get":
+        var subscription = Subscription.fromURL(message.subscriptionUrl);
+        if (!subscription)
+        {
+          callback([]);
+          break;
+        }
+        
+        callback(subscription.filters.map(convertFilter));
+        break;
+      case "filters.listen":
+        if (message.filter)
+          listenerFilters.filter = message.filter;
+        else
+          delete listenerFilters.filter;
+        break;
+      case "filters.remove":
+        var filter = Filter.fromText(message.text);
+        var subscription = null;
+        if (message.subscriptionUrl)
+          subscription = Subscription.fromURL(message.subscriptionUrl);
+
+        if (!subscription)
+          FilterStorage.removeFilter(filter);
+        else
+          FilterStorage.removeFilter(filter, subscription, message.index);
+        break;
+      case "prefs.get":
+        callback(Prefs[message.key]);
+        break;
+      case "subscriptions.add":
+        if (message.url in FilterStorage.knownSubscriptions)
+          return;
+
+        var subscription = Subscription.fromURL(message.url);
+        if (!subscription)
+          return;
+
+        subscription.disabled = false;
+        if ("title" in message)
+          subscription.title = message.title;
+        if ("homepage" in message)
+          subscription.homepage = message.homepage;
+        FilterStorage.addSubscription(subscription);
+
+        if (subscription instanceof DownloadableSubscription && !subscription.lastDownload)
+          Synchronizer.execute(subscription);
+        break;
       case "subscriptions.get":
         var subscriptions = FilterStorage.subscriptions.filter(function(s)
         {
@@ -138,9 +246,16 @@
         });
         callback(subscriptions.map(convertSubscription));
         break;
-      case "filters.blocked":
-        var filter = defaultMatcher.matchesAny(message.url, message.requestType, message.docDomain, message.thirdParty);
-        callback(filter instanceof BlockingFilter);
+      case "subscriptions.listen":
+        if (message.filter)
+          listenerFilters.subscription = message.filter;
+        else
+          delete listenerFilters.subscription;
+        break;
+      case "subscriptions.remove":
+        var subscription = Subscription.fromURL(message.url);
+        if (subscription.url in FilterStorage.knownSubscriptions)
+          FilterStorage.removeSubscription(subscription);
         break;
       case "subscriptions.toggle":
         var subscription = Subscription.fromURL(message.url);
@@ -156,25 +271,6 @@
             Synchronizer.execute(subscription);
         }
         break;
-      case "subscriptions.listen":
-        if (!changeListeners)
-        {
-          changeListeners = new global.ext.PageMap();
-          FilterNotifier.addListener(onFilterChange);
-        }
-
-        var filters = changeListeners.get(sender.page);
-        if (!filters)
-        {
-          filters = Object.create(null);
-          changeListeners.set(sender.page, filters);
-        }
-
-        if (message.filter)
-          filters.subscription = message.filter;
-        else
-          delete filters.subscription;
-        break;
     }
   });
 })(this);

-- 
Alioth's /usr/local/bin/git-commit-notice on /srv/git.debian.org/git/pkg-mozext/adblock-plus.git



More information about the Pkg-mozext-commits mailing list