OLD | NEW |
1 /* | 1 /* |
2 * This file is part of Adblock Plus <http://adblockplus.org/>, | 2 * This file is part of Adblock Plus <http://adblockplus.org/>, |
3 * Copyright (C) 2006-2013 Eyeo GmbH | 3 * Copyright (C) 2006-2013 Eyeo GmbH |
4 * | 4 * |
5 * Adblock Plus is free software: you can redistribute it and/or modify | 5 * Adblock Plus is free software: you can redistribute it and/or modify |
6 * it under the terms of the GNU General Public License version 3 as | 6 * it under the terms of the GNU General Public License version 3 as |
7 * published by the Free Software Foundation. | 7 * published by the Free Software Foundation. |
8 * | 8 * |
9 * Adblock Plus is distributed in the hope that it will be useful, | 9 * Adblock Plus is distributed in the hope that it will be useful, |
10 * but WITHOUT ANY WARRANTY; without even the implied warranty of | 10 * but WITHOUT ANY WARRANTY; without even the implied warranty of |
(...skipping 13 matching lines...) Expand all Loading... |
24 let {FilterListener} = require("filterListener"); | 24 let {FilterListener} = require("filterListener"); |
25 let {FilterStorage} = require("filterStorage"); | 25 let {FilterStorage} = require("filterStorage"); |
26 let {FilterNotifier} = require("filterNotifier"); | 26 let {FilterNotifier} = require("filterNotifier"); |
27 let {RequestNotifier} = require("requestNotifier"); | 27 let {RequestNotifier} = require("requestNotifier"); |
28 let {Filter} = require("filterClasses"); | 28 let {Filter} = require("filterClasses"); |
29 let {Subscription, SpecialSubscription, DownloadableSubscription} = require("sub
scriptionClasses"); | 29 let {Subscription, SpecialSubscription, DownloadableSubscription} = require("sub
scriptionClasses"); |
30 let {Synchronizer} = require("synchronizer"); | 30 let {Synchronizer} = require("synchronizer"); |
31 let {KeySelector} = require("keySelector"); | 31 let {KeySelector} = require("keySelector"); |
32 let {Notification} = require("notification"); | 32 let {Notification} = require("notification"); |
33 | 33 |
| 34 let CustomizableUI; |
| 35 try |
| 36 { |
| 37 ({CustomizableUI}) = Cu.import("resource:///modules/CustomizableUI.jsm", null)
; |
| 38 } |
| 39 catch (e) |
| 40 { |
| 41 // No built-in CustomizableUI API, use our own implementation. |
| 42 ({CustomizableUI}) = require("customizableUI"); |
| 43 } |
| 44 |
34 /** | 45 /** |
35 * Filter corresponding with "disable on site" menu item (set in fillIconMent())
. | 46 * Filter corresponding with "disable on site" menu item (set in fillIconMent())
. |
36 * @type Filter | 47 * @type Filter |
37 */ | 48 */ |
38 let siteWhitelist = null; | 49 let siteWhitelist = null; |
39 /** | 50 /** |
40 * Filter corresponding with "disable on site" menu item (set in fillIconMenu())
. | 51 * Filter corresponding with "disable on site" menu item (set in fillIconMenu())
. |
41 * @type Filter | 52 * @type Filter |
42 */ | 53 */ |
43 let pageWhitelist = null; | 54 let pageWhitelist = null; |
(...skipping 46 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
90 | 101 |
91 Utils.splitAllLabels(doc); | 102 Utils.splitAllLabels(doc); |
92 | 103 |
93 addCommandHandler("adblockplus-filters", UI.openFiltersDialog.bind(UI)); | 104 addCommandHandler("adblockplus-filters", UI.openFiltersDialog.bind(UI)); |
94 | 105 |
95 let {Sync} = require("sync"); | 106 let {Sync} = require("sync"); |
96 let syncEngine = Sync.getEngine(); | 107 let syncEngine = Sync.getEngine(); |
97 hideElement("adblockplus-sync", !syncEngine); | 108 hideElement("adblockplus-sync", !syncEngine); |
98 | 109 |
99 let {defaultToolbarPosition, statusbarPosition} = require("appSupport"); | 110 let {defaultToolbarPosition, statusbarPosition} = require("appSupport"); |
100 let hasToolbar = defaultToolbarPosition && !defaultToolbarPosition.isAddonBa
r; | 111 let hasToolbar = defaultToolbarPosition; |
101 let hasAddonBar = defaultToolbarPosition && defaultToolbarPosition.isAddonBa
r; | |
102 let hasStatusBar = statusbarPosition; | 112 let hasStatusBar = statusbarPosition; |
103 | 113 |
104 hideElement("adblockplus-showinaddonbar", !hasAddonBar); | |
105 hideElement("adblockplus-showintoolbar", !hasToolbar); | 114 hideElement("adblockplus-showintoolbar", !hasToolbar); |
106 hideElement("adblockplus-showinstatusbar", !hasStatusBar); | 115 hideElement("adblockplus-showinstatusbar", !hasStatusBar); |
107 | 116 |
108 let checkbox = doc.querySelector("setting[type=bool]"); | 117 let checkbox = doc.querySelector("setting[type=bool]"); |
109 if (checkbox) | 118 if (checkbox) |
110 initCheckboxes(); | 119 initCheckboxes(); |
111 | 120 |
112 function initCheckboxes() | 121 function initCheckboxes() |
113 { | 122 { |
114 if (!("value" in checkbox)) | 123 if (!("value" in checkbox)) |
(...skipping 16 matching lines...) Expand all Loading... |
131 { | 140 { |
132 this.value = UI.toggleAcceptableAds(); | 141 this.value = UI.toggleAcceptableAds(); |
133 }); | 142 }); |
134 | 143 |
135 setChecked("adblockplus-sync", syncEngine && syncEngine.enabled); | 144 setChecked("adblockplus-sync", syncEngine && syncEngine.enabled); |
136 addCommandHandler("adblockplus-sync", function() | 145 addCommandHandler("adblockplus-sync", function() |
137 { | 146 { |
138 this.value = UI.toggleSync(); | 147 this.value = UI.toggleSync(); |
139 }); | 148 }); |
140 | 149 |
141 let window = null; | 150 setChecked("adblockplus-showintoolbar", UI.isToolbarIconVisible()); |
142 for (window in UI.applicationWindows) | 151 addCommandHandler("adblockplus-showintoolbar", function() |
143 break; | |
144 | |
145 if (window) | |
146 { | 152 { |
147 setChecked("adblockplus-showinaddonbar", UI.isToolbarIconVisible(window)
); | 153 UI.toggleToolbarIcon(); |
148 setChecked("adblockplus-showintoolbar", UI.isToolbarIconVisible(window))
; | 154 this.value = UI.isToolbarIconVisible(); |
149 | 155 }); |
150 let handler = function() | |
151 { | |
152 UI.toggleToolbarIcon(); | |
153 this.value = UI.isToolbarIconVisible(window); | |
154 }; | |
155 addCommandHandler("adblockplus-showinaddonbar", handler); | |
156 addCommandHandler("adblockplus-showintoolbar", handler); | |
157 } | |
158 | 156 |
159 let list = doc.getElementById("adblockplus-subscription-list"); | 157 let list = doc.getElementById("adblockplus-subscription-list"); |
160 if (list) | 158 if (list) |
161 { | 159 { |
162 // Load subscriptions data | 160 // Load subscriptions data |
163 let request = new XMLHttpRequest(); | 161 let request = new XMLHttpRequest(); |
164 request.mozBackgroundRequest = true; | 162 request.mozBackgroundRequest = true; |
165 request.open("GET", "chrome://adblockplus/content/ui/subscriptions.xml")
; | 163 request.open("GET", "chrome://adblockplus/content/ui/subscriptions.xml")
; |
166 request.addEventListener("load", function() | 164 request.addEventListener("load", function() |
167 { | 165 { |
(...skipping 144 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
312 filtersLoaded = true; | 310 filtersLoaded = true; |
313 if (overlayLoaded && filtersLoaded && sessionRestored) | 311 if (overlayLoaded && filtersLoaded && sessionRestored) |
314 this.initDone(); | 312 this.initDone(); |
315 }.bind(this); | 313 }.bind(this); |
316 FilterNotifier.addListener(listener); | 314 FilterNotifier.addListener(listener); |
317 } | 315 } |
318 else | 316 else |
319 filtersLoaded = true; | 317 filtersLoaded = true; |
320 | 318 |
321 // Initialize UI after the session is restored | 319 // Initialize UI after the session is restored |
322 let window = null; | 320 let window = this.currentWindow; |
323 for (window in this.applicationWindows) | |
324 break; | |
325 if (!window && "nsISessionStore" in Ci) | 321 if (!window && "nsISessionStore" in Ci) |
326 { | 322 { |
327 // No application windows yet, the application must be starting up. Wait | 323 // No application windows yet, the application must be starting up. Wait |
328 // for session to be restored before initializing our UI. | 324 // for session to be restored before initializing our UI. |
329 new SessionRestoreObserver(function() | 325 new SessionRestoreObserver(function() |
330 { | 326 { |
331 sessionRestored = true; | 327 sessionRestored = true; |
332 if (overlayLoaded && filtersLoaded && sessionRestored) | 328 if (overlayLoaded && filtersLoaded && sessionRestored) |
333 this.initDone(); | 329 this.initDone(); |
334 }.bind(this)); | 330 }.bind(this)); |
(...skipping 69 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
404 | 400 |
405 /** | 401 /** |
406 * Gets called once the initialization is finished and Adblock Plus elements | 402 * Gets called once the initialization is finished and Adblock Plus elements |
407 * can be added to the UI. | 403 * can be added to the UI. |
408 */ | 404 */ |
409 initDone: function() | 405 initDone: function() |
410 { | 406 { |
411 let {WindowObserver} = require("windowObserver"); | 407 let {WindowObserver} = require("windowObserver"); |
412 new WindowObserver(this); | 408 new WindowObserver(this); |
413 | 409 |
| 410 // Add toolbar icon |
| 411 let {defaultToolbarPosition} = require("appSupport"); |
| 412 if ("abp-toolbarbutton" in this.overlay && defaultToolbarPosition) |
| 413 { |
| 414 CustomizableUI.createWidget({ |
| 415 id: "abp-toolbarbutton", |
| 416 type: "custom", |
| 417 positionAttribute: "abp-iconposition", // For emulation only |
| 418 defaultArea: defaultToolbarPosition.parent, |
| 419 defaultBefore: defaultToolbarPosition.before, // For emulation only |
| 420 defaultAfter: defaultToolbarPosition.after, // For emulation only |
| 421 removable: true, |
| 422 onBuild: function(document) |
| 423 { |
| 424 let node = document.importNode(this.overlay["abp-toolbarbutton"], true
); |
| 425 this.updateIconState(document.defaultView, node); |
| 426 return node; |
| 427 }.bind(this), |
| 428 onAdded: function(node) |
| 429 { |
| 430 // For emulation only, this callback isn't part of the official |
| 431 // CustomizableUI API. |
| 432 this.updateIconState(node.ownerDocument.defaultView, node); |
| 433 }.bind(this), |
| 434 onClick: this.onIconClick, |
| 435 onCommand: this.onIconCommand |
| 436 }); |
| 437 onShutdown.add(CustomizableUI.destroyWidget.bind(CustomizableUI, "abp-tool
barbutton")); |
| 438 } |
| 439 |
414 // Listen for pref and filters changes | 440 // Listen for pref and filters changes |
415 Prefs.addListener(function(name) | 441 Prefs.addListener(function(name) |
416 { | 442 { |
417 if (name == "enabled" || name == "defaulttoolbaraction" || name == "defaul
tstatusbaraction") | 443 if (name == "enabled" || name == "defaulttoolbaraction" || name == "defaul
tstatusbaraction") |
418 this.updateState(); | 444 this.updateState(); |
419 else if (name == "showinstatusbar") | 445 else if (name == "showinstatusbar") |
420 { | 446 { |
421 for (let window in this.applicationWindows) | 447 for (let window in this.applicationWindows) |
422 this.updateStatusbarIcon(window); | 448 this.updateStatusbarIcon(window); |
423 } | 449 } |
(...skipping 38 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
462 if (!noDelay && delayInitialization) | 488 if (!noDelay && delayInitialization) |
463 { | 489 { |
464 Utils.runAsync(this.applyToWindow.bind(this, window, true)); | 490 Utils.runAsync(this.applyToWindow.bind(this, window, true)); |
465 return; | 491 return; |
466 } | 492 } |
467 | 493 |
468 // Add general items to the document | 494 // Add general items to the document |
469 for (let i = 0; i < this.overlay.all.length; i++) | 495 for (let i = 0; i < this.overlay.all.length; i++) |
470 window.document.documentElement.appendChild(this.overlay.all[i].cloneNode(
true)); | 496 window.document.documentElement.appendChild(this.overlay.all[i].cloneNode(
true)); |
471 | 497 |
472 // Add toolbar icon | |
473 if ("abp-toolbarbutton" in this.overlay) | |
474 { | |
475 let toolbox = this.getToolbox(window); | |
476 if (toolbox) | |
477 { | |
478 // Insert toolbar button asynchronously, otherwise it will show up | |
479 // before our stylesheet loads | |
480 Utils.runAsync(function() | |
481 { | |
482 toolbox.addEventListener("aftercustomization", this.onToolbarCustomiza
tion, false); | |
483 | |
484 let {defaultToolbarPosition} = require("appSupport"); | |
485 let icon = this.overlay["abp-toolbarbutton"].cloneNode(true); | |
486 if ("addClass" in defaultToolbarPosition) | |
487 icon.classList.add(defaultToolbarPosition.addClass); | |
488 this.restoreToolbarIcon(toolbox, icon); | |
489 }.bind(this)); | |
490 } | |
491 } | |
492 | |
493 // Add status bar icon | 498 // Add status bar icon |
494 this.updateStatusbarIcon(window); | 499 this.updateStatusbarIcon(window); |
495 | 500 |
496 // Add tools menu item | 501 // Add tools menu item |
497 if ("abp-menuitem" in this.overlay) | 502 if ("abp-menuitem" in this.overlay) |
498 { | 503 { |
499 let {toolsMenu} = require("appSupport"); | 504 let {toolsMenu} = require("appSupport"); |
500 let [parent, before] = this.resolveInsertionPoint(window, toolsMenu); | 505 let [parent, before] = this.resolveInsertionPoint(window, toolsMenu); |
501 if (parent) | 506 if (parent) |
502 parent.insertBefore(this.overlay["abp-menuitem"].cloneNode(true), before
); | 507 parent.insertBefore(this.overlay["abp-menuitem"].cloneNode(true), before
); |
(...skipping 69 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
572 } | 577 } |
573 } | 578 } |
574 else | 579 else |
575 { | 580 { |
576 let clone = window.document.getElementById(id); | 581 let clone = window.document.getElementById(id); |
577 if (clone) | 582 if (clone) |
578 clone.parentNode.removeChild(clone); | 583 clone.parentNode.removeChild(clone); |
579 } | 584 } |
580 } | 585 } |
581 | 586 |
582 if ("abp-toolbarbutton" in this.overlay) | |
583 { | |
584 let toolbox = this.getToolbox(window); | |
585 if (toolbox) | |
586 { | |
587 toolbox.removeEventListener("aftercustomization", this.onToolbarCustomiz
ation, false); | |
588 | |
589 let paletteItem = this.getPaletteItem(toolbox); | |
590 if (paletteItem) | |
591 paletteItem.parentNode.removeChild(paletteItem); | |
592 } | |
593 } | |
594 | |
595 window.removeEventListener("popupshowing", this.onPopupShowing, false); | 587 window.removeEventListener("popupshowing", this.onPopupShowing, false); |
596 window.removeEventListener("keypress", this.onKeyPress, false); | 588 window.removeEventListener("keypress", this.onKeyPress, false); |
597 removeBrowserLocationListeners(window); | 589 removeBrowserLocationListeners(window); |
598 removeBrowserClickListeners(window); | 590 removeBrowserClickListeners(window); |
599 }, | 591 }, |
600 | 592 |
601 /** | 593 /** |
602 * The overlay information to be used when adding elements to the UI. | 594 * The overlay information to be used when adding elements to the UI. |
603 * @type Object | 595 * @type Object |
604 */ | 596 */ |
(...skipping 15 matching lines...) Expand all Loading... |
620 } | 612 } |
621 while (enumerator.hasMoreElements()) | 613 while (enumerator.hasMoreElements()) |
622 { | 614 { |
623 let window = enumerator.getNext().QueryInterface(Ci.nsIDOMWindow); | 615 let window = enumerator.getNext().QueryInterface(Ci.nsIDOMWindow); |
624 if (isKnownWindow(window)) | 616 if (isKnownWindow(window)) |
625 yield window; | 617 yield window; |
626 } | 618 } |
627 }, | 619 }, |
628 | 620 |
629 /** | 621 /** |
| 622 * Returns the top-most application window or null if none exists. |
| 623 * @type Window |
| 624 */ |
| 625 get currentWindow() |
| 626 { |
| 627 for (let window of this.applicationWindows) |
| 628 return window; |
| 629 return null; |
| 630 }, |
| 631 |
| 632 /** |
630 * Opens a URL in the browser window. If browser window isn't passed as parame
ter, | 633 * Opens a URL in the browser window. If browser window isn't passed as parame
ter, |
631 * this function attempts to find a browser window. If an event is passed in | 634 * this function attempts to find a browser window. If an event is passed in |
632 * it should be passed in to the browser if possible (will e.g. open a tab in | 635 * it should be passed in to the browser if possible (will e.g. open a tab in |
633 * background depending on modifiers keys). | 636 * background depending on modifiers keys). |
634 */ | 637 */ |
635 loadInBrowser: function(/**String*/ url, /**Window*/ currentWindow, /**Event*/
event) | 638 loadInBrowser: function(/**String*/ url, /**Window*/ currentWindow, /**Event*/
event) |
636 { | 639 { |
637 if (!currentWindow) | 640 if (!currentWindow) |
638 for (currentWindow in this.applicationWindows) | 641 currentWindow = this.currentWindow; |
639 break; | |
640 | 642 |
641 let {addTab} = require("appSupport"); | 643 let {addTab} = require("appSupport"); |
642 if (currentWindow && addTab) | 644 if (currentWindow && addTab) |
643 addTab(currentWindow, url, event); | 645 addTab(currentWindow, url, event); |
644 else | 646 else |
645 { | 647 { |
646 let protocolService = Cc["@mozilla.org/uriloader/external-protocol-service
;1"].getService(Ci.nsIExternalProtocolService); | 648 let protocolService = Cc["@mozilla.org/uriloader/external-protocol-service
;1"].getService(Ci.nsIExternalProtocolService); |
647 protocolService.loadURI(Services.io.newURI(url, null, null), null); | 649 protocolService.loadURI(Services.io.newURI(url, null, null), null); |
648 } | 650 } |
649 }, | 651 }, |
(...skipping 294 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
944 }, | 946 }, |
945 | 947 |
946 /** | 948 /** |
947 * Looks up an element with given ID in the window. If a list of IDs is given | 949 * Looks up an element with given ID in the window. If a list of IDs is given |
948 * will try all of them until an element exists. | 950 * will try all of them until an element exists. |
949 */ | 951 */ |
950 findElement: function(/**Window*/ window, /**String|String[]*/ id) /**Element*
/ | 952 findElement: function(/**Window*/ window, /**String|String[]*/ id) /**Element*
/ |
951 { | 953 { |
952 if (id instanceof Array) | 954 if (id instanceof Array) |
953 { | 955 { |
954 for (let i = 0; i < id.length; i++) | 956 for (let candidate of id) |
955 { | 957 { |
956 let result = window.document.getElementById(id[i]); | 958 let result = window.document.getElementById(candidate); |
957 if (result) | 959 if (result) |
958 return result; | 960 return result; |
959 } | 961 } |
960 return null; | 962 return null; |
961 } | 963 } |
962 else | 964 else |
963 return window.document.getElementById(id); | 965 return window.document.getElementById(id); |
964 }, | 966 }, |
965 | 967 |
966 /** | 968 /** |
(...skipping 20 matching lines...) Expand all Loading... |
987 } | 989 } |
988 | 990 |
989 if (before && before.parentNode != parent) | 991 if (before && before.parentNode != parent) |
990 before = null; | 992 before = null; |
991 } | 993 } |
992 | 994 |
993 return [parent, before]; | 995 return [parent, before]; |
994 }, | 996 }, |
995 | 997 |
996 /** | 998 /** |
997 * Finds the toolbox element responsible for the toolbar where Adblock Plus | |
998 * icon should be placed. | |
999 */ | |
1000 getToolbox: function(/**Window*/ window) /**Element*/ | |
1001 { | |
1002 let {defaultToolbarPosition} = require("appSupport"); | |
1003 if (!defaultToolbarPosition || !defaultToolbarPosition.parent) | |
1004 return null; | |
1005 | |
1006 let toolbar = this.findElement(window, defaultToolbarPosition.parent); | |
1007 if (!toolbar) | |
1008 return null; | |
1009 | |
1010 let toolbox = toolbar.toolbox; | |
1011 if (toolbox && ("palette" in toolbox) && toolbox.palette) | |
1012 return toolbox; | |
1013 else | |
1014 return null; | |
1015 }, | |
1016 | |
1017 /** | |
1018 * Restores the Adblock Plus icon at its original position. | |
1019 */ | |
1020 restoreToolbarIcon: function(/**Element*/ toolbox, /**Element*/ icon) | |
1021 { | |
1022 // Insert into the palette first | |
1023 toolbox.palette.insertBefore(icon, toolbox.palette.firstChild); | |
1024 | |
1025 // Now find where we should put the icon | |
1026 let position = toolbox.getAttribute("abp-iconposition"); | |
1027 if (!/^\S*,\S*,\S*$/.test(position)) | |
1028 position = null; | |
1029 | |
1030 if (position == null) | |
1031 { | |
1032 // No explicitly saved position but maybe we can find it in a currentset | |
1033 // attribute somewhere. | |
1034 let toolbars = toolbox.externalToolbars.slice(); | |
1035 for (let child = toolbox.firstElementChild; child; child = child.nextEleme
ntSibling) | |
1036 if (child.localName == "toolbar") | |
1037 toolbars.push(child); | |
1038 for (let i = 0; i < toolbars.length; i++) | |
1039 { | |
1040 let toolbar = toolbars[i]; | |
1041 let currentSet = toolbar.getAttribute("currentset"); | |
1042 if (currentSet) | |
1043 { | |
1044 let items = currentSet.split(","); | |
1045 let index = items.indexOf("abp-toolbarbutton"); | |
1046 if (index >= 0) | |
1047 { | |
1048 position = "visible," + toolbar.id + "," + (index + 1 < items.length
? items[index + 1] : ""); | |
1049 toolbox.setAttribute("abp-iconposition", position); | |
1050 toolbox.ownerDocument.persist(toolbox.id, "abp-iconposition"); | |
1051 break; | |
1052 } | |
1053 } | |
1054 } | |
1055 } | |
1056 | |
1057 this.showToolbarIcon(toolbox, position); | |
1058 }, | |
1059 | |
1060 /** | |
1061 * Finds the toolbar button in the toolbar palette. | |
1062 */ | |
1063 getPaletteItem: function(/**Element*/ toolbox) /**Element*/ | |
1064 { | |
1065 for (var child = toolbox.palette.firstElementChild; child; child = child.nex
tElementSibling) | |
1066 if (child.id == "abp-toolbarbutton") | |
1067 return child; | |
1068 | |
1069 return null; | |
1070 }, | |
1071 | |
1072 /** | |
1073 * Called after toolbar customization, sets up our icon and remembers its | |
1074 * position. | |
1075 */ | |
1076 onToolbarCustomization: function(/**Event*/ event) | |
1077 { | |
1078 let toolbox = event.currentTarget; | |
1079 let icon = toolbox.ownerDocument.getElementById("abp-toolbarbutton"); | |
1080 | |
1081 let position = toolbox.getAttribute("abp-iconposition") || "hidden,,"; | |
1082 if (icon && icon.parentNode.localName == "toolbar") | |
1083 { | |
1084 this.updateIconState(icon.ownerDocument.defaultView, icon); | |
1085 icon.addEventListener("click", this.onIconClick, false); | |
1086 icon.addEventListener("command", this.onIconClick, false); | |
1087 position = "visible," + icon.parentNode.id + "," + (icon.nextSibling ? ico
n.nextSibling.id : ""); | |
1088 } | |
1089 else | |
1090 position = position.replace(/^visible,/, "hidden,") | |
1091 | |
1092 toolbox.setAttribute("abp-iconposition", position); | |
1093 toolbox.ownerDocument.persist(toolbox.id, "abp-iconposition"); | |
1094 }, | |
1095 | |
1096 /** | |
1097 * Shows or hides toolbar icon based on a remembered position. | |
1098 */ | |
1099 showToolbarIcon: function(/**Element*/ toolbox, /**String*/ position) | |
1100 { | |
1101 let visible, parent, before; | |
1102 if (position) | |
1103 { | |
1104 [visible, parent, before] = position.split(",", 3); | |
1105 parent = toolbox.ownerDocument.getElementById(parent); | |
1106 if (before == "") | |
1107 before = null; | |
1108 else | |
1109 before = toolbox.ownerDocument.getElementById(before); | |
1110 if (before && before.parentNode != parent) | |
1111 before = null; | |
1112 } | |
1113 else | |
1114 { | |
1115 let {defaultToolbarPosition} = require("appSupport"); | |
1116 visible = "visible"; | |
1117 [parent, before] = this.resolveInsertionPoint(toolbox.ownerDocument.defaul
tView, defaultToolbarPosition); | |
1118 | |
1119 if (parent && parent.collapsed) | |
1120 { | |
1121 // First time we insert the toolbar icon, make sure it is actually visib
le | |
1122 parent.setAttribute("collapsed", "false"); | |
1123 toolbox.ownerDocument.persist(parent.id, "collapsed"); | |
1124 } | |
1125 } | |
1126 | |
1127 if (parent && parent.localName != "toolbar") | |
1128 parent = null; | |
1129 | |
1130 if (visible != "visible") | |
1131 { | |
1132 // Hide icon if it is currently visible | |
1133 let icon = toolbox.ownerDocument.getElementById("abp-toolbarbutton"); | |
1134 if (icon && icon.parentNode.localName == "toolbar") | |
1135 toolbox.palette.appendChild(icon); | |
1136 } | |
1137 else if (parent) | |
1138 { | |
1139 // Add the icon to the toolbar | |
1140 let items = parent.currentSet.split(","); | |
1141 let index = (before ? items.indexOf(before.id) : -1); | |
1142 if (index < 0) | |
1143 before = null; | |
1144 parent.insertItem("abp-toolbarbutton", before, null, false); | |
1145 } | |
1146 | |
1147 this.onToolbarCustomization({currentTarget: toolbox}); | |
1148 }, | |
1149 | |
1150 /** | |
1151 * Toggles visibility state of the toolbar icon. | 999 * Toggles visibility state of the toolbar icon. |
1152 */ | 1000 */ |
1153 toggleToolbarIcon: function() | 1001 toggleToolbarIcon: function() |
1154 { | 1002 { |
1155 for (let window in this.applicationWindows) | 1003 if (this.isToolbarIconVisible()) |
| 1004 CustomizableUI.removeWidgetFromArea("abp-toolbarbutton"); |
| 1005 else |
1156 { | 1006 { |
1157 let toolbox = this.getToolbox(window); | 1007 let {defaultToolbarPosition} = require("appSupport"); |
1158 if (!toolbox) | 1008 CustomizableUI.addWidgetToArea("abp-toolbarbutton", defaultToolbarPosition
.parent); |
1159 continue; | |
1160 | |
1161 let position = toolbox.getAttribute("abp-iconposition"); | |
1162 if (position) | |
1163 { | |
1164 let parts = position.split(","); | |
1165 parts[0] = (parts[0] == "visible" ? "hidden" : "visible"); | |
1166 position = parts.join(","); | |
1167 } | |
1168 this.showToolbarIcon(toolbox, position); | |
1169 } | 1009 } |
1170 }, | 1010 }, |
1171 | 1011 |
1172 /** | 1012 /** |
1173 * Updates Adblock Plus icon state for all windows. | 1013 * Updates Adblock Plus icon state for all windows. |
1174 */ | 1014 */ |
1175 updateState: function() | 1015 updateState: function() |
1176 { | 1016 { |
1177 for (let window in this.applicationWindows) | 1017 for (let window in this.applicationWindows) |
1178 { | 1018 { |
(...skipping 184 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1363 | 1203 |
1364 /** | 1204 /** |
1365 * Called when some pop-up in the application window shows up, initializes | 1205 * Called when some pop-up in the application window shows up, initializes |
1366 * pop-ups related to Adblock Plus. | 1206 * pop-ups related to Adblock Plus. |
1367 */ | 1207 */ |
1368 onPopupShowing: function(/**Event*/ event) | 1208 onPopupShowing: function(/**Event*/ event) |
1369 { | 1209 { |
1370 if (event.defaultPrevented) | 1210 if (event.defaultPrevented) |
1371 return; | 1211 return; |
1372 | 1212 |
1373 let popup = event.target; | 1213 let popup = event.originalTarget; |
1374 | 1214 |
1375 let {contentContextMenu} = require("appSupport"); | 1215 let {contentContextMenu} = require("appSupport"); |
1376 if ((typeof contentContextMenu == "string" && popup.id == contentContextMenu
) || | 1216 if ((typeof contentContextMenu == "string" && popup.id == contentContextMenu
) || |
1377 (contentContextMenu instanceof Array && contentContextMenu.indexOf(popup
.id) >= 0)) | 1217 (contentContextMenu instanceof Array && contentContextMenu.indexOf(popup
.id) >= 0)) |
1378 { | 1218 { |
1379 this.fillContentContextMenu(popup); | 1219 this.fillContentContextMenu(popup); |
1380 } | 1220 } |
1381 else if (popup.id == "abp-tooltip") | 1221 else if (popup.id == "abp-tooltip") |
1382 this.fillIconTooltip(event, popup.ownerDocument.defaultView); | 1222 this.fillIconTooltip(event, popup.ownerDocument.defaultView); |
1383 else | 1223 else |
(...skipping 237 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1621 } | 1461 } |
1622 | 1462 |
1623 setDisabled("abp-command-sendReport", !location || !Policy.isBlockableScheme
(location) || location.scheme == "mailto"); | 1463 setDisabled("abp-command-sendReport", !location || !Policy.isBlockableScheme
(location) || location.scheme == "mailto"); |
1624 | 1464 |
1625 setChecked(prefix + "disabled", !Prefs.enabled); | 1465 setChecked(prefix + "disabled", !Prefs.enabled); |
1626 setChecked(prefix + "frameobjects", Prefs.frameobjects); | 1466 setChecked(prefix + "frameobjects", Prefs.frameobjects); |
1627 setChecked(prefix + "slowcollapse", !Prefs.fastcollapse); | 1467 setChecked(prefix + "slowcollapse", !Prefs.fastcollapse); |
1628 setChecked(prefix + "savestats", Prefs.savestats); | 1468 setChecked(prefix + "savestats", Prefs.savestats); |
1629 | 1469 |
1630 let {defaultToolbarPosition, statusbarPosition} = require("appSupport"); | 1470 let {defaultToolbarPosition, statusbarPosition} = require("appSupport"); |
1631 let hasToolbar = defaultToolbarPosition && !defaultToolbarPosition.isAddonBa
r; | 1471 let hasToolbar = defaultToolbarPosition; |
1632 let hasAddonBar = defaultToolbarPosition && defaultToolbarPosition.isAddonBa
r; | |
1633 let hasStatusBar = statusbarPosition; | 1472 let hasStatusBar = statusbarPosition; |
1634 hideElement(prefix + "showinaddonbar", !hasAddonBar || prefix == "abp-toolba
r-"); | |
1635 hideElement(prefix + "showintoolbar", !hasToolbar || prefix == "abp-toolbar-
"); | 1473 hideElement(prefix + "showintoolbar", !hasToolbar || prefix == "abp-toolbar-
"); |
1636 hideElement(prefix + "showinstatusbar", !hasStatusBar); | 1474 hideElement(prefix + "showinstatusbar", !hasStatusBar); |
1637 hideElement(prefix + "iconSettingsSeparator", (prefix == "abp-toolbar-" || (
!hasAddonBar && !hasToolbar)) && !hasStatusBar); | 1475 hideElement(prefix + "iconSettingsSeparator", (prefix == "abp-toolbar-" || !
hasToolbar) && !hasStatusBar); |
1638 | 1476 |
1639 setChecked(prefix + "showinaddonbar", this.isToolbarIconVisible(window)); | 1477 setChecked(prefix + "showintoolbar", this.isToolbarIconVisible()); |
1640 setChecked(prefix + "showintoolbar", this.isToolbarIconVisible(window)); | |
1641 setChecked(prefix + "showinstatusbar", Prefs.showinstatusbar); | 1478 setChecked(prefix + "showinstatusbar", Prefs.showinstatusbar); |
1642 | 1479 |
1643 let {Sync} = require("sync"); | 1480 let {Sync} = require("sync"); |
1644 let syncEngine = Sync.getEngine(); | 1481 let syncEngine = Sync.getEngine(); |
1645 hideElement(prefix + "sync", !syncEngine); | 1482 hideElement(prefix + "sync", !syncEngine); |
1646 setChecked(prefix + "sync", syncEngine && syncEngine.enabled); | 1483 setChecked(prefix + "sync", syncEngine && syncEngine.enabled); |
1647 | 1484 |
1648 let defAction = (!window.document.popupNode || window.document.popupNode.id
== "abp-toolbarbutton" ? | 1485 let defAction = (!window.document.popupNode || window.document.popupNode.id
== "abp-toolbarbutton" ? |
1649 Prefs.defaulttoolbaraction : | 1486 Prefs.defaulttoolbaraction : |
1650 Prefs.defaultstatusbaraction); | 1487 Prefs.defaultstatusbaraction); |
(...skipping 177 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1828 let command = event.currentTarget.document.getElementById("abp-command-"
+ key); | 1665 let command = event.currentTarget.document.getElementById("abp-command-"
+ key); |
1829 if (command) | 1666 if (command) |
1830 command.doCommand(); | 1667 command.doCommand(); |
1831 } | 1668 } |
1832 } | 1669 } |
1833 }, | 1670 }, |
1834 | 1671 |
1835 /** | 1672 /** |
1836 * Checks whether the toolbar icon is currently displayed. | 1673 * Checks whether the toolbar icon is currently displayed. |
1837 */ | 1674 */ |
1838 isToolbarIconVisible: function(/**Window*/ window) | 1675 isToolbarIconVisible: function() /**Boolean*/ |
1839 { | 1676 { |
1840 let button = window.document.getElementById("abp-toolbarbutton"); | 1677 let placement = CustomizableUI.getPlacementOfWidget("abp-toolbarbutton"); |
1841 return (button && button.parentNode && button.parentNode.localName == "toolb
ar" && !button.parentNode.collapsed); | 1678 return !!placement; |
1842 }, | 1679 }, |
1843 | 1680 |
1844 /** | 1681 /** |
1845 * Stores the selected hotkeys, initialized when the user presses a key. | 1682 * Stores the selected hotkeys, initialized when the user presses a key. |
1846 */ | 1683 */ |
1847 hotkeys: null, | 1684 hotkeys: null, |
1848 | 1685 |
1849 /** | 1686 /** |
1850 * Chooses shortcut keys that are available in the window according to | 1687 * Chooses shortcut keys that are available in the window according to |
1851 * preferences. | 1688 * preferences. |
(...skipping 69 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1921 Prefs.hideContributeButton = true; | 1758 Prefs.hideContributeButton = true; |
1922 | 1759 |
1923 for each (let id in ["abp-status-contributebutton", "abp-toolbar-contributeb
utton", "abp-menuitem-contributebutton"]) | 1760 for each (let id in ["abp-status-contributebutton", "abp-toolbar-contributeb
utton", "abp-menuitem-contributebutton"]) |
1924 { | 1761 { |
1925 let button = window.document.getElementById(id); | 1762 let button = window.document.getElementById(id); |
1926 if (button) | 1763 if (button) |
1927 button.hidden = true; | 1764 button.hidden = true; |
1928 } | 1765 } |
1929 }, | 1766 }, |
1930 | 1767 |
1931 _showNextNotification: function(notification) | 1768 _showNextNotification: function() |
1932 { | 1769 { |
1933 let window = null; | 1770 let window = this.currentWindow; |
1934 for (window in this.applicationWindows) | |
1935 break; | |
1936 | |
1937 if (!window) | 1771 if (!window) |
1938 return; | 1772 return; |
1939 | 1773 |
1940 let button = window.document.getElementById("abp-toolbarbutton") | 1774 let button = window.document.getElementById("abp-toolbarbutton") |
1941 || window.document.getElementById("abp-status"); | 1775 || window.document.getElementById("abp-status"); |
1942 if (!button) | 1776 if (!button) |
1943 return; | 1777 return; |
1944 | 1778 |
1945 let notification = Notification.getNextToShow(); | 1779 let notification = Notification.getNextToShow(); |
1946 if (!notification) | 1780 if (!notification) |
(...skipping 47 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1994 this.loadInBrowser(link.href, window); | 1828 this.loadInBrowser(link.href, window); |
1995 }.bind(this)); | 1829 }.bind(this)); |
1996 | 1830 |
1997 let panel = window.document.getElementById("abp-notification"); | 1831 let panel = window.document.getElementById("abp-notification"); |
1998 panel.openPopup(button, "bottomcenter topcenter", 0, 0, false, false, null); | 1832 panel.openPopup(button, "bottomcenter topcenter", 0, 0, false, false, null); |
1999 } | 1833 } |
2000 }; | 1834 }; |
2001 UI.onPopupShowing = UI.onPopupShowing.bind(UI); | 1835 UI.onPopupShowing = UI.onPopupShowing.bind(UI); |
2002 UI.onKeyPress = UI.onKeyPress.bind(UI); | 1836 UI.onKeyPress = UI.onKeyPress.bind(UI); |
2003 UI.onIconClick = UI.onIconClick.bind(UI); | 1837 UI.onIconClick = UI.onIconClick.bind(UI); |
2004 UI.onToolbarCustomization = UI.onToolbarCustomization.bind(UI); | |
2005 UI.init(); | 1838 UI.init(); |
2006 | 1839 |
2007 /** | 1840 /** |
2008 * List of event handers to be registered for each window. For each event | 1841 * List of event handers to be registered for each window. For each event |
2009 * handler the element ID, event and the actual event handler are listed. | 1842 * handler the element ID, event and the actual event handler are listed. |
2010 * @type Array | 1843 * @type Array |
2011 */ | 1844 */ |
2012 let eventHandlers = [ | 1845 let eventHandlers = [ |
2013 ["abp-command-sendReport", "command", UI.openReportDialog.bind(UI)], | 1846 ["abp-command-sendReport", "command", UI.openReportDialog.bind(UI)], |
2014 ["abp-command-filters", "command", UI.openFiltersDialog.bind(UI)], | 1847 ["abp-command-filters", "command", UI.openFiltersDialog.bind(UI)], |
(...skipping 10 matching lines...) Expand all Loading... |
2025 ["abp-command-contribute", "command", UI.openContributePage.bind(UI)], | 1858 ["abp-command-contribute", "command", UI.openContributePage.bind(UI)], |
2026 ["abp-command-contribute-hide", "command", UI.hideContributeButton.bind(UI)] | 1859 ["abp-command-contribute-hide", "command", UI.hideContributeButton.bind(UI)] |
2027 ]; | 1860 ]; |
2028 | 1861 |
2029 onShutdown.add(function() | 1862 onShutdown.add(function() |
2030 { | 1863 { |
2031 for (let window in UI.applicationWindows) | 1864 for (let window in UI.applicationWindows) |
2032 if (UI.isBottombarOpen(window)) | 1865 if (UI.isBottombarOpen(window)) |
2033 UI.toggleBottombar(window); | 1866 UI.toggleBottombar(window); |
2034 }); | 1867 }); |
OLD | NEW |