forked from mirrors/gecko-dev
		
	
		
			
				
	
	
		
			189 lines
		
	
	
	
		
			5.3 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
			
		
		
	
	
			189 lines
		
	
	
	
		
			5.3 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
| /* This Source Code Form is subject to the terms of the Mozilla Public
 | |
|  * License, v. 2.0. If a copy of the MPL was not distributed with this
 | |
|  * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
 | |
| 
 | |
| // This file is loaded into the browser window scope.
 | |
| /* eslint-env mozilla/browser-window */
 | |
| 
 | |
| ChromeUtils.defineModuleGetter(
 | |
|   this,
 | |
|   "TabsPanel",
 | |
|   "resource:///modules/TabsList.jsm"
 | |
| );
 | |
| 
 | |
| var gTabsPanel = {
 | |
|   kElements: {
 | |
|     allTabsButton: "alltabs-button",
 | |
|     allTabsView: "allTabsMenu-allTabsView",
 | |
|     allTabsViewTabs: "allTabsMenu-allTabsView-tabs",
 | |
|     dropIndicator: "allTabsMenu-dropIndicator",
 | |
|     containerTabsView: "allTabsMenu-containerTabsView",
 | |
|     hiddenTabsButton: "allTabsMenu-hiddenTabsButton",
 | |
|     hiddenTabsView: "allTabsMenu-hiddenTabsView",
 | |
|   },
 | |
|   _initialized: false,
 | |
|   _initializedElements: false,
 | |
| 
 | |
|   initElements() {
 | |
|     if (this._initializedElements) {
 | |
|       return;
 | |
|     }
 | |
|     let template = document.getElementById("allTabsMenu-container");
 | |
|     template.replaceWith(template.content);
 | |
| 
 | |
|     for (let [name, id] of Object.entries(this.kElements)) {
 | |
|       this[name] = document.getElementById(id);
 | |
|     }
 | |
|     this._initializedElements = true;
 | |
|   },
 | |
| 
 | |
|   init() {
 | |
|     if (this._initialized) {
 | |
|       return;
 | |
|     }
 | |
| 
 | |
|     this.initElements();
 | |
| 
 | |
|     this.hiddenAudioTabsPopup = new TabsPanel({
 | |
|       view: this.allTabsView,
 | |
|       insertBefore: document.getElementById("allTabsMenu-tabsSeparator"),
 | |
|       filterFn: tab => tab.hidden && tab.soundPlaying,
 | |
|     });
 | |
|     let showPinnedTabs = Services.prefs.getBoolPref(
 | |
|       "browser.tabs.tabmanager.enabled"
 | |
|     );
 | |
|     this.allTabsPanel = new TabsPanel({
 | |
|       view: this.allTabsView,
 | |
|       containerNode: this.allTabsViewTabs,
 | |
|       filterFn: tab =>
 | |
|         !tab.hidden && (!tab.pinned || (showPinnedTabs && tab.pinned)),
 | |
|       dropIndicator: this.dropIndicator,
 | |
|     });
 | |
| 
 | |
|     this.allTabsView.addEventListener("ViewShowing", e => {
 | |
|       PanelUI._ensureShortcutsShown(this.allTabsView);
 | |
| 
 | |
|       let containersEnabled =
 | |
|         Services.prefs.getBoolPref("privacy.userContext.enabled") &&
 | |
|         !PrivateBrowsingUtils.isWindowPrivate(window);
 | |
|       document.getElementById(
 | |
|         "allTabsMenu-containerTabsButton"
 | |
|       ).hidden = !containersEnabled;
 | |
| 
 | |
|       let hasHiddenTabs = gBrowser.visibleTabs.length < gBrowser.tabs.length;
 | |
|       document.getElementById(
 | |
|         "allTabsMenu-hiddenTabsButton"
 | |
|       ).hidden = !hasHiddenTabs;
 | |
|       document.getElementById(
 | |
|         "allTabsMenu-hiddenTabsSeparator"
 | |
|       ).hidden = !hasHiddenTabs;
 | |
|     });
 | |
| 
 | |
|     this.allTabsView.addEventListener("ViewShown", e =>
 | |
|       this.allTabsView
 | |
|         .querySelector(".all-tabs-item[selected]")
 | |
|         ?.scrollIntoView({ block: "center" })
 | |
|     );
 | |
| 
 | |
|     let containerTabsMenuSeparator = this.containerTabsView.querySelector(
 | |
|       "toolbarseparator"
 | |
|     );
 | |
|     this.containerTabsView.addEventListener("ViewShowing", e => {
 | |
|       let elements = [];
 | |
|       let frag = document.createDocumentFragment();
 | |
| 
 | |
|       ContextualIdentityService.getPublicIdentities().forEach(identity => {
 | |
|         let menuitem = document.createXULElement("toolbarbutton");
 | |
|         menuitem.setAttribute("class", "subviewbutton subviewbutton-iconic");
 | |
|         menuitem.setAttribute(
 | |
|           "label",
 | |
|           ContextualIdentityService.getUserContextLabel(identity.userContextId)
 | |
|         );
 | |
|         // The styles depend on this.
 | |
|         menuitem.setAttribute("usercontextid", identity.userContextId);
 | |
|         // The command handler depends on this.
 | |
|         menuitem.setAttribute("data-usercontextid", identity.userContextId);
 | |
|         menuitem.classList.add("identity-icon-" + identity.icon);
 | |
|         menuitem.classList.add("identity-color-" + identity.color);
 | |
| 
 | |
|         menuitem.setAttribute("command", "Browser:NewUserContextTab");
 | |
| 
 | |
|         frag.appendChild(menuitem);
 | |
|         elements.push(menuitem);
 | |
|       });
 | |
| 
 | |
|       e.target.addEventListener(
 | |
|         "ViewHiding",
 | |
|         () => {
 | |
|           for (let element of elements) {
 | |
|             element.remove();
 | |
|           }
 | |
|         },
 | |
|         { once: true }
 | |
|       );
 | |
|       containerTabsMenuSeparator.parentNode.insertBefore(
 | |
|         frag,
 | |
|         containerTabsMenuSeparator
 | |
|       );
 | |
|     });
 | |
| 
 | |
|     this.hiddenTabsPopup = new TabsPanel({
 | |
|       view: this.hiddenTabsView,
 | |
|       filterFn: tab => tab.hidden,
 | |
|     });
 | |
| 
 | |
|     this._initialized = true;
 | |
|   },
 | |
| 
 | |
|   get canOpen() {
 | |
|     this.initElements();
 | |
|     return isElementVisible(this.allTabsButton);
 | |
|   },
 | |
| 
 | |
|   showAllTabsPanel(event) {
 | |
|     // Note that event may be null.
 | |
| 
 | |
|     // Only space and enter should open the popup, ignore other keypresses:
 | |
|     if (event?.type == "keypress" && event.key != "Enter" && event.key != " ") {
 | |
|       return;
 | |
|     }
 | |
|     this.init();
 | |
|     if (this.canOpen) {
 | |
|       PanelUI.showSubView(
 | |
|         this.kElements.allTabsView,
 | |
|         this.allTabsButton,
 | |
|         event
 | |
|       );
 | |
|     }
 | |
|   },
 | |
| 
 | |
|   hideAllTabsPanel() {
 | |
|     if (this.allTabsView) {
 | |
|       PanelMultiView.hidePopup(this.allTabsView.closest("panel"));
 | |
|     }
 | |
|   },
 | |
| 
 | |
|   showHiddenTabsPanel(event) {
 | |
|     this.init();
 | |
|     if (!this.canOpen) {
 | |
|       return;
 | |
|     }
 | |
|     this.allTabsView.addEventListener(
 | |
|       "ViewShown",
 | |
|       e => {
 | |
|         PanelUI.showSubView(
 | |
|           this.kElements.hiddenTabsView,
 | |
|           this.hiddenTabsButton
 | |
|         );
 | |
|       },
 | |
|       { once: true }
 | |
|     );
 | |
|     this.showAllTabsPanel(event);
 | |
|   },
 | |
| 
 | |
|   searchTabs() {
 | |
|     gURLBar.search(UrlbarTokenizer.RESTRICT.OPENPAGE, {
 | |
|       searchModeEntry: "tabmenu",
 | |
|     });
 | |
|   },
 | |
| };
 | 
