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 positionAttribute: "abp-iconposition", |
| 417 defaultArea: defaultToolbarPosition.parent, |
| 418 defaultBefore: defaultToolbarPosition.before, |
| 419 defaultAfter: defaultToolbarPosition.after, |
| 420 removable: true, |
| 421 onCreated: function(node) |
| 422 { |
| 423 for (let attribute of this.overlay["abp-toolbarbutton"].attributes) |
| 424 node.setAttribute(attribute.name, attribute.value); |
| 425 if (!node.firstChild) |
| 426 for (let child of this.overlay["abp-toolbarbutton"].children) |
| 427 node.appendChild(child.cloneNode(true)); |
| 428 if ("addClass" in defaultToolbarPosition) |
| 429 icon.classList.add(defaultToolbarPosition.addClass); |
| 430 |
| 431 this.updateIconState(node.ownerDocument.defaultView, node); |
| 432 }.bind(this), |
| 433 onClick: this.onIconClick, |
| 434 onCommand: this.onIconCommand |
| 435 }); |
| 436 onShutdown.add(CustomizableUI.destroyWidget.bind(CustomizableUI, "abp-tool
barbutton")); |
| 437 } |
| 438 |
414 // Listen for pref and filters changes | 439 // Listen for pref and filters changes |
415 Prefs.addListener(function(name) | 440 Prefs.addListener(function(name) |
416 { | 441 { |
417 if (name == "enabled" || name == "defaulttoolbaraction" || name == "defaul
tstatusbaraction") | 442 if (name == "enabled" || name == "defaulttoolbaraction" || name == "defaul
tstatusbaraction") |
418 this.updateState(); | 443 this.updateState(); |
419 else if (name == "showinstatusbar") | 444 else if (name == "showinstatusbar") |
420 { | 445 { |
421 for (let window in this.applicationWindows) | 446 for (let window in this.applicationWindows) |
422 this.updateStatusbarIcon(window); | 447 this.updateStatusbarIcon(window); |
423 } | 448 } |
(...skipping 38 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
462 if (!noDelay && delayInitialization) | 487 if (!noDelay && delayInitialization) |
463 { | 488 { |
464 Utils.runAsync(this.applyToWindow.bind(this, window, true)); | 489 Utils.runAsync(this.applyToWindow.bind(this, window, true)); |
465 return; | 490 return; |
466 } | 491 } |
467 | 492 |
468 // Add general items to the document | 493 // Add general items to the document |
469 for (let i = 0; i < this.overlay.all.length; i++) | 494 for (let i = 0; i < this.overlay.all.length; i++) |
470 window.document.documentElement.appendChild(this.overlay.all[i].cloneNode(
true)); | 495 window.document.documentElement.appendChild(this.overlay.all[i].cloneNode(
true)); |
471 | 496 |
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 | 497 // Add status bar icon |
494 this.updateStatusbarIcon(window); | 498 this.updateStatusbarIcon(window); |
495 | 499 |
496 // Add tools menu item | 500 // Add tools menu item |
497 if ("abp-menuitem" in this.overlay) | 501 if ("abp-menuitem" in this.overlay) |
498 { | 502 { |
499 let {toolsMenu} = require("appSupport"); | 503 let {toolsMenu} = require("appSupport"); |
500 let [parent, before] = this.resolveInsertionPoint(window, toolsMenu); | 504 let [parent, before] = this.resolveInsertionPoint(window, toolsMenu); |
501 if (parent) | 505 if (parent) |
502 parent.insertBefore(this.overlay["abp-menuitem"].cloneNode(true), before
); | 506 parent.insertBefore(this.overlay["abp-menuitem"].cloneNode(true), before
); |
(...skipping 69 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
572 } | 576 } |
573 } | 577 } |
574 else | 578 else |
575 { | 579 { |
576 let clone = window.document.getElementById(id); | 580 let clone = window.document.getElementById(id); |
577 if (clone) | 581 if (clone) |
578 clone.parentNode.removeChild(clone); | 582 clone.parentNode.removeChild(clone); |
579 } | 583 } |
580 } | 584 } |
581 | 585 |
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); | 586 window.removeEventListener("popupshowing", this.onPopupShowing, false); |
596 window.removeEventListener("keypress", this.onKeyPress, false); | 587 window.removeEventListener("keypress", this.onKeyPress, false); |
597 removeBrowserLocationListeners(window); | 588 removeBrowserLocationListeners(window); |
598 removeBrowserClickListeners(window); | 589 removeBrowserClickListeners(window); |
599 }, | 590 }, |
600 | 591 |
601 /** | 592 /** |
602 * The overlay information to be used when adding elements to the UI. | 593 * The overlay information to be used when adding elements to the UI. |
603 * @type Object | 594 * @type Object |
604 */ | 595 */ |
(...skipping 15 matching lines...) Expand all Loading... |
620 } | 611 } |
621 while (enumerator.hasMoreElements()) | 612 while (enumerator.hasMoreElements()) |
622 { | 613 { |
623 let window = enumerator.getNext().QueryInterface(Ci.nsIDOMWindow); | 614 let window = enumerator.getNext().QueryInterface(Ci.nsIDOMWindow); |
624 if (isKnownWindow(window)) | 615 if (isKnownWindow(window)) |
625 yield window; | 616 yield window; |
626 } | 617 } |
627 }, | 618 }, |
628 | 619 |
629 /** | 620 /** |
| 621 * Returns the top-most application window or null if none exists. |
| 622 * @type Window |
| 623 */ |
| 624 get currentWindow() |
| 625 { |
| 626 for (let window of this.applicationWindows) |
| 627 return window; |
| 628 return null; |
| 629 }, |
| 630 |
| 631 /** |
630 * Opens a URL in the browser window. If browser window isn't passed as parame
ter, | 632 * 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 | 633 * 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 | 634 * it should be passed in to the browser if possible (will e.g. open a tab in |
633 * background depending on modifiers keys). | 635 * background depending on modifiers keys). |
634 */ | 636 */ |
635 loadInBrowser: function(/**String*/ url, /**Window*/ currentWindow, /**Event*/
event) | 637 loadInBrowser: function(/**String*/ url, /**Window*/ currentWindow, /**Event*/
event) |
636 { | 638 { |
637 if (!currentWindow) | 639 if (!currentWindow) |
638 for (currentWindow in this.applicationWindows) | 640 currentWindow = this.currentWindow; |
639 break; | |
640 | 641 |
641 let {addTab} = require("appSupport"); | 642 let {addTab} = require("appSupport"); |
642 if (currentWindow && addTab) | 643 if (currentWindow && addTab) |
643 addTab(currentWindow, url, event); | 644 addTab(currentWindow, url, event); |
644 else | 645 else |
645 { | 646 { |
646 let protocolService = Cc["@mozilla.org/uriloader/external-protocol-service
;1"].getService(Ci.nsIExternalProtocolService); | 647 let protocolService = Cc["@mozilla.org/uriloader/external-protocol-service
;1"].getService(Ci.nsIExternalProtocolService); |
647 protocolService.loadURI(Services.io.newURI(url, null, null), null); | 648 protocolService.loadURI(Services.io.newURI(url, null, null), null); |
648 } | 649 } |
649 }, | 650 }, |
(...skipping 294 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
944 }, | 945 }, |
945 | 946 |
946 /** | 947 /** |
947 * Looks up an element with given ID in the window. If a list of IDs is given | 948 * 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. | 949 * will try all of them until an element exists. |
949 */ | 950 */ |
950 findElement: function(/**Window*/ window, /**String|String[]*/ id) /**Element*
/ | 951 findElement: function(/**Window*/ window, /**String|String[]*/ id) /**Element*
/ |
951 { | 952 { |
952 if (id instanceof Array) | 953 if (id instanceof Array) |
953 { | 954 { |
954 for (let i = 0; i < id.length; i++) | 955 for (let candidate of id) |
955 { | 956 { |
956 let result = window.document.getElementById(id[i]); | 957 let result = window.document.getElementById(candidate); |
957 if (result) | 958 if (result) |
958 return result; | 959 return result; |
959 } | 960 } |
960 return null; | 961 return null; |
961 } | 962 } |
962 else | 963 else |
963 return window.document.getElementById(id); | 964 return window.document.getElementById(id); |
964 }, | 965 }, |
965 | 966 |
966 /** | 967 /** |
(...skipping 20 matching lines...) Expand all Loading... |
987 } | 988 } |
988 | 989 |
989 if (before && before.parentNode != parent) | 990 if (before && before.parentNode != parent) |
990 before = null; | 991 before = null; |
991 } | 992 } |
992 | 993 |
993 return [parent, before]; | 994 return [parent, before]; |
994 }, | 995 }, |
995 | 996 |
996 /** | 997 /** |
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. | 998 * Toggles visibility state of the toolbar icon. |
1152 */ | 999 */ |
1153 toggleToolbarIcon: function() | 1000 toggleToolbarIcon: function() |
1154 { | 1001 { |
1155 for (let window in this.applicationWindows) | 1002 if (this.isToolbarIconVisible()) |
| 1003 CustomizableUI.removeWidgetFromArea("abp-toolbarbutton"); |
| 1004 else |
1156 { | 1005 { |
1157 let toolbox = this.getToolbox(window); | 1006 let {defaultToolbarPosition} = require("appSupport"); |
1158 if (!toolbox) | 1007 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 } | 1008 } |
1170 }, | 1009 }, |
1171 | 1010 |
1172 /** | 1011 /** |
1173 * Updates Adblock Plus icon state for all windows. | 1012 * Updates Adblock Plus icon state for all windows. |
1174 */ | 1013 */ |
1175 updateState: function() | 1014 updateState: function() |
1176 { | 1015 { |
1177 for (let window in this.applicationWindows) | 1016 for (let window in this.applicationWindows) |
1178 { | 1017 { |
(...skipping 184 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1363 | 1202 |
1364 /** | 1203 /** |
1365 * Called when some pop-up in the application window shows up, initializes | 1204 * Called when some pop-up in the application window shows up, initializes |
1366 * pop-ups related to Adblock Plus. | 1205 * pop-ups related to Adblock Plus. |
1367 */ | 1206 */ |
1368 onPopupShowing: function(/**Event*/ event) | 1207 onPopupShowing: function(/**Event*/ event) |
1369 { | 1208 { |
1370 if (event.defaultPrevented) | 1209 if (event.defaultPrevented) |
1371 return; | 1210 return; |
1372 | 1211 |
1373 let popup = event.target; | 1212 let popup = event.originalTarget; |
1374 | 1213 |
1375 let {contentContextMenu} = require("appSupport"); | 1214 let {contentContextMenu} = require("appSupport"); |
1376 if ((typeof contentContextMenu == "string" && popup.id == contentContextMenu
) || | 1215 if ((typeof contentContextMenu == "string" && popup.id == contentContextMenu
) || |
1377 (contentContextMenu instanceof Array && contentContextMenu.indexOf(popup
.id) >= 0)) | 1216 (contentContextMenu instanceof Array && contentContextMenu.indexOf(popup
.id) >= 0)) |
1378 { | 1217 { |
1379 this.fillContentContextMenu(popup); | 1218 this.fillContentContextMenu(popup); |
1380 } | 1219 } |
1381 else if (popup.id == "abp-tooltip") | 1220 else if (popup.id == "abp-tooltip") |
1382 this.fillIconTooltip(event, popup.ownerDocument.defaultView); | 1221 this.fillIconTooltip(event, popup.ownerDocument.defaultView); |
1383 else | 1222 else |
(...skipping 237 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1621 } | 1460 } |
1622 | 1461 |
1623 setDisabled("abp-command-sendReport", !location || !Policy.isBlockableScheme
(location) || location.scheme == "mailto"); | 1462 setDisabled("abp-command-sendReport", !location || !Policy.isBlockableScheme
(location) || location.scheme == "mailto"); |
1624 | 1463 |
1625 setChecked(prefix + "disabled", !Prefs.enabled); | 1464 setChecked(prefix + "disabled", !Prefs.enabled); |
1626 setChecked(prefix + "frameobjects", Prefs.frameobjects); | 1465 setChecked(prefix + "frameobjects", Prefs.frameobjects); |
1627 setChecked(prefix + "slowcollapse", !Prefs.fastcollapse); | 1466 setChecked(prefix + "slowcollapse", !Prefs.fastcollapse); |
1628 setChecked(prefix + "savestats", Prefs.savestats); | 1467 setChecked(prefix + "savestats", Prefs.savestats); |
1629 | 1468 |
1630 let {defaultToolbarPosition, statusbarPosition} = require("appSupport"); | 1469 let {defaultToolbarPosition, statusbarPosition} = require("appSupport"); |
1631 let hasToolbar = defaultToolbarPosition && !defaultToolbarPosition.isAddonBa
r; | 1470 let hasToolbar = defaultToolbarPosition; |
1632 let hasAddonBar = defaultToolbarPosition && defaultToolbarPosition.isAddonBa
r; | |
1633 let hasStatusBar = statusbarPosition; | 1471 let hasStatusBar = statusbarPosition; |
1634 hideElement(prefix + "showinaddonbar", !hasAddonBar || prefix == "abp-toolba
r-"); | |
1635 hideElement(prefix + "showintoolbar", !hasToolbar || prefix == "abp-toolbar-
"); | 1472 hideElement(prefix + "showintoolbar", !hasToolbar || prefix == "abp-toolbar-
"); |
1636 hideElement(prefix + "showinstatusbar", !hasStatusBar); | 1473 hideElement(prefix + "showinstatusbar", !hasStatusBar); |
1637 hideElement(prefix + "iconSettingsSeparator", (prefix == "abp-toolbar-" || (
!hasAddonBar && !hasToolbar)) && !hasStatusBar); | 1474 hideElement(prefix + "iconSettingsSeparator", (prefix == "abp-toolbar-" || !
hasToolbar) && !hasStatusBar); |
1638 | 1475 |
1639 setChecked(prefix + "showinaddonbar", this.isToolbarIconVisible(window)); | 1476 setChecked(prefix + "showintoolbar", this.isToolbarIconVisible()); |
1640 setChecked(prefix + "showintoolbar", this.isToolbarIconVisible(window)); | |
1641 setChecked(prefix + "showinstatusbar", Prefs.showinstatusbar); | 1477 setChecked(prefix + "showinstatusbar", Prefs.showinstatusbar); |
1642 | 1478 |
1643 let {Sync} = require("sync"); | 1479 let {Sync} = require("sync"); |
1644 let syncEngine = Sync.getEngine(); | 1480 let syncEngine = Sync.getEngine(); |
1645 hideElement(prefix + "sync", !syncEngine); | 1481 hideElement(prefix + "sync", !syncEngine); |
1646 setChecked(prefix + "sync", syncEngine && syncEngine.enabled); | 1482 setChecked(prefix + "sync", syncEngine && syncEngine.enabled); |
1647 | 1483 |
1648 let defAction = (!window.document.popupNode || window.document.popupNode.id
== "abp-toolbarbutton" ? | 1484 let defAction = (!window.document.popupNode || window.document.popupNode.id
== "abp-toolbarbutton" ? |
1649 Prefs.defaulttoolbaraction : | 1485 Prefs.defaulttoolbaraction : |
1650 Prefs.defaultstatusbaraction); | 1486 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); | 1664 let command = event.currentTarget.document.getElementById("abp-command-"
+ key); |
1829 if (command) | 1665 if (command) |
1830 command.doCommand(); | 1666 command.doCommand(); |
1831 } | 1667 } |
1832 } | 1668 } |
1833 }, | 1669 }, |
1834 | 1670 |
1835 /** | 1671 /** |
1836 * Checks whether the toolbar icon is currently displayed. | 1672 * Checks whether the toolbar icon is currently displayed. |
1837 */ | 1673 */ |
1838 isToolbarIconVisible: function(/**Window*/ window) | 1674 isToolbarIconVisible: function() /**Boolean*/ |
1839 { | 1675 { |
1840 let button = window.document.getElementById("abp-toolbarbutton"); | 1676 let placement = CustomizableUI.getPlacementOfWidget("abp-toolbarbutton"); |
1841 return (button && button.parentNode && button.parentNode.localName == "toolb
ar" && !button.parentNode.collapsed); | 1677 return !!placement; |
1842 }, | 1678 }, |
1843 | 1679 |
1844 /** | 1680 /** |
1845 * Stores the selected hotkeys, initialized when the user presses a key. | 1681 * Stores the selected hotkeys, initialized when the user presses a key. |
1846 */ | 1682 */ |
1847 hotkeys: null, | 1683 hotkeys: null, |
1848 | 1684 |
1849 /** | 1685 /** |
1850 * Chooses shortcut keys that are available in the window according to | 1686 * Chooses shortcut keys that are available in the window according to |
1851 * preferences. | 1687 * preferences. |
(...skipping 69 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1921 Prefs.hideContributeButton = true; | 1757 Prefs.hideContributeButton = true; |
1922 | 1758 |
1923 for each (let id in ["abp-status-contributebutton", "abp-toolbar-contributeb
utton", "abp-menuitem-contributebutton"]) | 1759 for each (let id in ["abp-status-contributebutton", "abp-toolbar-contributeb
utton", "abp-menuitem-contributebutton"]) |
1924 { | 1760 { |
1925 let button = window.document.getElementById(id); | 1761 let button = window.document.getElementById(id); |
1926 if (button) | 1762 if (button) |
1927 button.hidden = true; | 1763 button.hidden = true; |
1928 } | 1764 } |
1929 }, | 1765 }, |
1930 | 1766 |
1931 _showNextNotification: function(notification) | 1767 _showNextNotification: function() |
1932 { | 1768 { |
1933 let window = null; | 1769 let window = this.currentWindow; |
1934 for (window in this.applicationWindows) | |
1935 break; | |
1936 | |
1937 if (!window) | 1770 if (!window) |
1938 return; | 1771 return; |
1939 | 1772 |
1940 let button = window.document.getElementById("abp-toolbarbutton") | 1773 let button = window.document.getElementById("abp-toolbarbutton") |
1941 || window.document.getElementById("abp-status"); | 1774 || window.document.getElementById("abp-status"); |
1942 if (!button) | 1775 if (!button) |
1943 return; | 1776 return; |
1944 | 1777 |
1945 let notification = Notification.getNextToShow(); | 1778 let notification = Notification.getNextToShow(); |
1946 if (!notification) | 1779 if (!notification) |
(...skipping 47 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1994 this.loadInBrowser(link.href, window); | 1827 this.loadInBrowser(link.href, window); |
1995 }.bind(this)); | 1828 }.bind(this)); |
1996 | 1829 |
1997 let panel = window.document.getElementById("abp-notification"); | 1830 let panel = window.document.getElementById("abp-notification"); |
1998 panel.openPopup(button, "bottomcenter topcenter", 0, 0, false, false, null); | 1831 panel.openPopup(button, "bottomcenter topcenter", 0, 0, false, false, null); |
1999 } | 1832 } |
2000 }; | 1833 }; |
2001 UI.onPopupShowing = UI.onPopupShowing.bind(UI); | 1834 UI.onPopupShowing = UI.onPopupShowing.bind(UI); |
2002 UI.onKeyPress = UI.onKeyPress.bind(UI); | 1835 UI.onKeyPress = UI.onKeyPress.bind(UI); |
2003 UI.onIconClick = UI.onIconClick.bind(UI); | 1836 UI.onIconClick = UI.onIconClick.bind(UI); |
2004 UI.onToolbarCustomization = UI.onToolbarCustomization.bind(UI); | |
2005 UI.init(); | 1837 UI.init(); |
2006 | 1838 |
2007 /** | 1839 /** |
2008 * List of event handers to be registered for each window. For each event | 1840 * 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. | 1841 * handler the element ID, event and the actual event handler are listed. |
2010 * @type Array | 1842 * @type Array |
2011 */ | 1843 */ |
2012 let eventHandlers = [ | 1844 let eventHandlers = [ |
2013 ["abp-command-sendReport", "command", UI.openReportDialog.bind(UI)], | 1845 ["abp-command-sendReport", "command", UI.openReportDialog.bind(UI)], |
2014 ["abp-command-filters", "command", UI.openFiltersDialog.bind(UI)], | 1846 ["abp-command-filters", "command", UI.openFiltersDialog.bind(UI)], |
(...skipping 10 matching lines...) Expand all Loading... |
2025 ["abp-command-contribute", "command", UI.openContributePage.bind(UI)], | 1857 ["abp-command-contribute", "command", UI.openContributePage.bind(UI)], |
2026 ["abp-command-contribute-hide", "command", UI.hideContributeButton.bind(UI)] | 1858 ["abp-command-contribute-hide", "command", UI.hideContributeButton.bind(UI)] |
2027 ]; | 1859 ]; |
2028 | 1860 |
2029 onShutdown.add(function() | 1861 onShutdown.add(function() |
2030 { | 1862 { |
2031 for (let window in UI.applicationWindows) | 1863 for (let window in UI.applicationWindows) |
2032 if (UI.isBottombarOpen(window)) | 1864 if (UI.isBottombarOpen(window)) |
2033 UI.toggleBottombar(window); | 1865 UI.toggleBottombar(window); |
2034 }); | 1866 }); |
OLD | NEW |