| Index: background.js | 
| =================================================================== | 
| --- a/background.js | 
| +++ b/background.js | 
| @@ -17,6 +17,35 @@ | 
|  | 
| (function(global) | 
| { | 
| +  function Notifier() | 
| +  { | 
| +    this._listeners = []; | 
| +  } | 
| +  Notifier.prototype = { | 
| +    _listeners: null, | 
| + | 
| +    addListener: function(listener) | 
| +    { | 
| +      if (this._listeners.indexOf(listener) < 0) | 
| +        this._listeners.push(listener); | 
| +    }, | 
| + | 
| +    removeListener: function(listener) | 
| +    { | 
| +      var index = this._listeners.indexOf(listener); | 
| +      if (index >= 0) | 
| +        this._listeners.splice(index, 1); | 
| +    }, | 
| + | 
| +    triggerListeners: function() | 
| +    { | 
| +      var args = Array.prototype.slice.apply(arguments); | 
| +      var listeners = this._listeners.slice(); | 
| +      for (var i = 0; i < listeners.length; i++) | 
| +        listeners[i].apply(null, args); | 
| +    } | 
| +  }; | 
| + | 
| function updateFromURL(data) | 
| { | 
| if (window.location.search) | 
| @@ -37,7 +66,9 @@ | 
| filterlistsReinitialized: false, | 
| addSubscription: false, | 
| filterError: false, | 
| -    downloadStatus: "synchronize_ok" | 
| +    downloadStatus: "synchronize_ok", | 
| +    showNotificationUI: false, | 
| +    safariContentBlocker: false | 
| }; | 
| updateFromURL(params); | 
|  | 
| @@ -62,7 +93,44 @@ | 
|  | 
| modules.prefs = { | 
| Prefs: { | 
| -      "subscriptions_exceptionsurl": "https://easylist-downloads.adblockplus.org/exceptionrules.txt" | 
| +      onChanged: new Notifier() | 
| +    } | 
| +  }; | 
| +  var prefs = { | 
| +    notifications_ignoredcategories: (params.showNotificationUI) ? ["*"] : [], | 
| +    notifications_showui: params.showNotificationUI, | 
| +    safari_contentblocker: false, | 
| +    shouldShowBlockElementMenu: true, | 
| +    subscriptions_exceptionsurl: "https://easylist-downloads.adblockplus.org/exceptionrules.txt" | 
| +  }; | 
| +  Object.keys(prefs).forEach(function(key) | 
| +  { | 
| +    Object.defineProperty(modules.prefs.Prefs, key, { | 
| +      get: function() | 
| +      { | 
| +        return prefs[key]; | 
| +      }, | 
| +      set: function(value) | 
| +      { | 
| +        prefs[key] = value; | 
| +        modules.prefs.Prefs.onChanged.triggerListeners(key); | 
| +        return prefs[key]; | 
| +      } | 
| +    }); | 
| +  }); | 
| + | 
| +  modules.notification = { | 
| +    Notification: { | 
| +      toggleIgnoreCategory: function(category) | 
| +      { | 
| +        var categories = prefs.notifications_ignoredcategories; | 
| +        var index = categories.indexOf(category); | 
| +        if (index == -1) | 
| +          categories.push(category); | 
| +        else | 
| +          categories.splice(index, 1); | 
| +        modules.prefs.Prefs.notifications_ignoredcategories = categories; | 
| +      } | 
| } | 
| }; | 
|  | 
| @@ -241,30 +309,8 @@ | 
| } | 
| }; | 
|  | 
| -  var notifierListeners = []; | 
| modules.filterNotifier = { | 
| -    FilterNotifier: { | 
| -      addListener: function(listener) | 
| -      { | 
| -        if (notifierListeners.indexOf(listener) < 0) | 
| -          notifierListeners.push(listener); | 
| -      }, | 
| - | 
| -      removeListener: function(listener) | 
| -      { | 
| -        var index = notifierListeners.indexOf(listener); | 
| -        if (index >= 0) | 
| -          notifierListeners.splice(index, 1); | 
| -      }, | 
| - | 
| -      triggerListeners: function() | 
| -      { | 
| -        var args = Array.prototype.slice.apply(arguments); | 
| -        var listeners = notifierListeners.slice(); | 
| -        for (var i = 0; i < listeners.length; i++) | 
| -          listeners[i].apply(null, args); | 
| -      } | 
| -    } | 
| +    FilterNotifier: new Notifier() | 
| }; | 
|  | 
| modules.info = { | 
| @@ -417,4 +463,13 @@ | 
| } | 
| }); | 
| }); | 
| + | 
| +  if (params.safariContentBlocker) | 
| +  { | 
| +    global.safari = { | 
| +      extension: { | 
| +        setContentBlocker: function() {} | 
| +      } | 
| +    }; | 
| +  } | 
| })(this); | 
|  |