Index: lib/ui.js |
=================================================================== |
--- a/lib/ui.js |
+++ b/lib/ui.js |
@@ -279,16 +279,19 @@ let UI = exports.UI = |
request.open("GET", "chrome://adblockplus/content/ui/overlay.xul"); |
request.addEventListener("load", function(event) |
{ |
if (onShutdown.done) |
return; |
this.processOverlay(request.responseXML.documentElement); |
+ // Don't wait for the rest of the startup sequence, add icon already |
+ this.addToolbarButton(); |
+ |
overlayLoaded = true; |
if (overlayLoaded && filtersLoaded && sessionRestored) |
this.initDone(); |
}.bind(this), false); |
request.send(null); |
// Wait for filters to load |
if (FilterStorage._loading) |
@@ -391,58 +394,18 @@ let UI = exports.UI = |
}, |
/** |
* Gets called once the initialization is finished and Adblock Plus elements |
* can be added to the UI. |
*/ |
initDone: function() |
{ |
- let {WindowObserver} = require("windowObserver"); |
- new WindowObserver(this); |
- |
- // Add toolbar icon |
- let {defaultToolbarPosition} = require("appSupport"); |
- if ("abp-toolbarbutton" in this.overlay && defaultToolbarPosition) |
- { |
- try |
- { |
- ({CustomizableUI}) = Cu.import("resource:///modules/CustomizableUI.jsm", null); |
- } |
- catch (e) |
- { |
- // No built-in CustomizableUI API, use our own implementation. |
- ({CustomizableUI}) = require("customizableUI"); |
- } |
- |
- CustomizableUI.createWidget({ |
- id: "abp-toolbarbutton", |
- type: "custom", |
- positionAttribute: "abp-iconposition", // For emulation only |
- defaultArea: defaultToolbarPosition.parent, |
- defaultBefore: defaultToolbarPosition.before, // For emulation only |
- defaultAfter: defaultToolbarPosition.after, // For emulation only |
- removable: true, |
- onBuild: function(document) |
- { |
- let node = document.importNode(this.overlay["abp-toolbarbutton"], true); |
- node.addEventListener("click", this.onIconClick, false); |
- node.addEventListener("command", this.onIconClick, false); |
- this.updateIconState(document.defaultView, node); |
- return node; |
- }.bind(this), |
- onAdded: function(node) |
- { |
- // For emulation only, this callback isn't part of the official |
- // CustomizableUI API. |
- this.updateIconState(node.ownerDocument.defaultView, node); |
- }.bind(this), |
- }); |
- onShutdown.add(CustomizableUI.destroyWidget.bind(CustomizableUI, "abp-toolbarbutton")); |
- } |
+ // The icon might be added already, make sure its state is correct |
+ this.updateState(); |
// Listen for pref and filters changes |
Prefs.addListener(function(name) |
{ |
if (name == "enabled" || name == "defaulttoolbaraction" || name == "defaultstatusbaraction") |
this.updateState(); |
else if (name == "showinstatusbar") |
{ |
@@ -473,16 +436,81 @@ let UI = exports.UI = |
this.showNextNotification(subject.location.href); |
}.bind(UI) |
}; |
Services.obs.addObserver(documentCreationObserver, "content-document-global-created", false); |
onShutdown.add(function() |
{ |
Services.obs.removeObserver(documentCreationObserver, "content-document-global-created", false); |
}); |
+ |
+ // Execute first-run actions if a window is open already, otherwise it |
+ // will happen in applyToWindow() when a window is opened. |
+ this.firstRunActions(this.currentWindow); |
+ }, |
+ |
+ addToolbarButton: function() |
+ { |
+ let {WindowObserver} = require("windowObserver"); |
+ new WindowObserver(this); |
+ |
+ let {defaultToolbarPosition} = require("appSupport"); |
+ if ("abp-toolbarbutton" in this.overlay && defaultToolbarPosition) |
+ { |
+ try |
+ { |
+ ({CustomizableUI}) = Cu.import("resource:///modules/CustomizableUI.jsm", null); |
+ } |
+ catch (e) |
+ { |
+ // No built-in CustomizableUI API, use our own implementation. |
+ ({CustomizableUI}) = require("customizableUI"); |
+ } |
+ |
+ CustomizableUI.createWidget({ |
+ id: "abp-toolbarbutton", |
+ type: "custom", |
+ positionAttribute: "abp-iconposition", // For emulation only |
+ defaultArea: defaultToolbarPosition.parent, |
+ defaultBefore: defaultToolbarPosition.before, // For emulation only |
+ defaultAfter: defaultToolbarPosition.after, // For emulation only |
+ removable: true, |
+ onBuild: function(document) |
+ { |
+ let node = document.importNode(this.overlay["abp-toolbarbutton"], true); |
+ node.addEventListener("click", this.onIconClick, false); |
+ node.addEventListener("command", this.onIconClick, false); |
+ this.updateIconState(document.defaultView, node); |
+ return node; |
+ }.bind(this), |
+ onAdded: function(node) |
+ { |
+ // For emulation only, this callback isn't part of the official |
+ // CustomizableUI API. |
+ this.updateIconState(node.ownerDocument.defaultView, node); |
+ }.bind(this), |
+ }); |
+ onShutdown.add(CustomizableUI.destroyWidget.bind(CustomizableUI, "abp-toolbarbutton")); |
+ } |
+ }, |
+ |
+ firstRunActions: function(window) |
+ { |
+ if (this.firstRunDone || !window || FilterStorage._loading) |
+ return; |
+ |
+ this.firstRunDone = true; |
+ |
+ let {addonVersion} = require("info"); |
+ let prevVersion = Prefs.currentVersion; |
+ if (prevVersion != addonVersion) |
+ { |
+ Prefs.currentVersion = addonVersion; |
+ this.addSubscription(window, prevVersion); |
+ } |
}, |
/** |
* Will be set to true after the check whether first-run actions should run |
* has been performed. |
* @type Boolean |
*/ |
firstRunDone: false, |
@@ -546,28 +574,17 @@ let UI = exports.UI = |
addBrowserClickListener(window, this.onBrowserClick.bind(this, window)); |
window.document.getElementById("abp-notification-close").addEventListener("command", function(event) |
{ |
window.document.getElementById("abp-notification").hidePopup(); |
}, false); |
// First-run actions? |
- if (!this.firstRunDone) |
- { |
- this.firstRunDone = true; |
- |
- let {addonVersion} = require("info"); |
- let prevVersion = Prefs.currentVersion; |
- if (prevVersion != addonVersion) |
- { |
- Prefs.currentVersion = addonVersion; |
- this.addSubscription(window, prevVersion); |
- } |
- } |
+ this.firstRunActions(window); |
// Some people actually switch off browser.frames.enabled and are surprised |
// that things stop working... |
window.QueryInterface(Ci.nsIInterfaceRequestor) |
.getInterface(Ci.nsIWebNavigation) |
.QueryInterface(Ci.nsIDocShell) |
.allowSubframes = true; |
}, |
@@ -1071,17 +1088,17 @@ let UI = exports.UI = |
let state = (Prefs.enabled ? "active" : "disabled"); |
if (state == "active") |
{ |
let location = this.getCurrentLocation(window); |
if (location && Policy.isWhitelisted(location.spec)) |
state = "whitelisted"; |
} |
- |
+ |
let popupId = "abp-status-popup"; |
if (icon.localName == "statusbarpanel") |
{ |
if (Prefs.defaultstatusbaraction == 0) |
{ |
icon.setAttribute("popup", popupId); |
icon.removeAttribute("context"); |
} |