| // Copyright 2019 The Chromium Authors |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| |
| import type {Tab, TabGroupVisualData} from './tab_strip.mojom-webui.js'; |
| import {PageCallbackRouter, PageHandlerFactory, PageHandlerRemote} from './tab_strip.mojom-webui.js'; |
| |
| /** |
| * These values are persisted to logs and should not be renumbered or re-used. |
| * See tools/metrics/histograms/enums.xml. |
| */ |
| export enum CloseTabAction { |
| CLOSE_BUTTON = 0, |
| SWIPED_TO_CLOSE = 1, |
| } |
| |
| export interface TabsApiProxy { |
| activateTab(tabId: number): void; |
| |
| /** |
| * @return Object of group IDs as strings mapped to their visual data. |
| */ |
| getGroupVisualData(): Promise<{data: {[id: string]: TabGroupVisualData}}>; |
| |
| getTabs(): Promise<{tabs: Tab[]}>; |
| |
| closeTab(tabId: number, closeTabAction: CloseTabAction): void; |
| |
| groupTab(tabId: number, groupId: string): void; |
| |
| moveGroup(groupId: string, newIndex: number): void; |
| |
| moveTab(tabId: number, newIndex: number): void; |
| |
| setThumbnailTracked(tabId: number, thumbnailTracked: boolean): void; |
| |
| ungroupTab(tabId: number): void; |
| |
| isVisible(): boolean; |
| |
| /** |
| * @return Object with CSS variables as keys and pixel lengths as values |
| */ |
| getLayout(): Promise<{layout: {[key: string]: string}}>; |
| |
| showEditDialogForGroup( |
| groupId: string, locationX: number, locationY: number, width: number, |
| height: number): void; |
| |
| showTabContextMenu(tabId: number, locationX: number, locationY: number): void; |
| |
| showBackgroundContextMenu(locationX: number, locationY: number): void; |
| |
| closeContainer(): void; |
| |
| /** @param durationMs Activation duration time in ms. */ |
| reportTabActivationDuration(durationMs: number): void; |
| |
| /** |
| * @param tabCount Number of tabs. |
| * @param durationMs Activation duration time in ms. |
| */ |
| reportTabDataReceivedDuration(tabCount: number, durationMs: number): void; |
| |
| /** |
| * @param tabCount Number of tabs. |
| * @param durationMs Creation duration time in ms. |
| */ |
| reportTabCreationDuration(tabCount: number, durationMs: number): void; |
| |
| getCallbackRouter(): PageCallbackRouter; |
| } |
| |
| export class TabsApiProxyImpl implements TabsApiProxy { |
| callbackRouter: PageCallbackRouter = new PageCallbackRouter(); |
| handler: PageHandlerRemote = new PageHandlerRemote(); |
| |
| constructor() { |
| const factory = PageHandlerFactory.getRemote(); |
| factory.createPageHandler( |
| this.callbackRouter.$.bindNewPipeAndPassRemote(), |
| this.handler.$.bindNewPipeAndPassReceiver()); |
| } |
| |
| activateTab(tabId: number) { |
| this.handler.activateTab(tabId); |
| } |
| |
| getGroupVisualData() { |
| return this.handler.getGroupVisualData(); |
| } |
| |
| getTabs() { |
| return this.handler.getTabs(); |
| } |
| |
| closeTab(tabId: number, closeTabAction: CloseTabAction) { |
| this.handler.closeTab( |
| tabId, closeTabAction === CloseTabAction.SWIPED_TO_CLOSE); |
| chrome.metricsPrivate.recordEnumerationValue( |
| 'WebUITabStrip.CloseTabAction', closeTabAction, |
| Object.keys(CloseTabAction).length); |
| } |
| |
| groupTab(tabId: number, groupId: string) { |
| this.handler.groupTab(tabId, groupId); |
| } |
| |
| moveGroup(groupId: string, newIndex: number) { |
| this.handler.moveGroup(groupId, newIndex); |
| } |
| |
| moveTab(tabId: number, newIndex: number) { |
| this.handler.moveTab(tabId, newIndex); |
| } |
| |
| setThumbnailTracked(tabId: number, thumbnailTracked: boolean) { |
| this.handler.setThumbnailTracked(tabId, thumbnailTracked); |
| } |
| |
| ungroupTab(tabId: number) { |
| this.handler.ungroupTab(tabId); |
| } |
| |
| isVisible() { |
| // TODO(crbug.com/40781526): Move this call out of tabs_api_proxy |
| // since it's not related to tabs API. |
| return document.visibilityState === 'visible'; |
| } |
| |
| getLayout() { |
| return this.handler.getLayout(); |
| } |
| |
| showEditDialogForGroup( |
| groupId: string, locationX: number, locationY: number, width: number, |
| height: number) { |
| this.handler.showEditDialogForGroup( |
| groupId, locationX, locationY, width, height); |
| } |
| |
| showTabContextMenu(tabId: number, locationX: number, locationY: number) { |
| this.handler.showTabContextMenu(tabId, locationX, locationY); |
| } |
| |
| showBackgroundContextMenu(locationX: number, locationY: number) { |
| this.handler.showBackgroundContextMenu(locationX, locationY); |
| } |
| |
| closeContainer() { |
| this.handler.closeContainer(); |
| } |
| |
| reportTabActivationDuration(durationMs: number) { |
| this.handler.reportTabActivationDuration(durationMs); |
| } |
| |
| reportTabDataReceivedDuration(tabCount: number, durationMs: number) { |
| this.handler.reportTabDataReceivedDuration(tabCount, durationMs); |
| } |
| |
| reportTabCreationDuration(tabCount: number, durationMs: number) { |
| this.handler.reportTabCreationDuration(tabCount, durationMs); |
| } |
| |
| getCallbackRouter() { |
| return this.callbackRouter; |
| } |
| |
| static getInstance(): TabsApiProxy { |
| return instance || (instance = new TabsApiProxyImpl()); |
| } |
| |
| static setInstance(obj: TabsApiProxy) { |
| instance = obj; |
| } |
| } |
| |
| let instance: TabsApiProxy|null = null; |