| // Copyright 2020 The Chromium Authors. All rights reserved. |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| |
| import * as Common from '../../core/common/common.js'; |
| import * as i18n from '../../core/i18n/i18n.js'; |
| import type * as Platform from '../../core/platform/platform.js'; |
| import * as Root from '../../core/root/root.js'; |
| import * as SDK from '../../core/sdk/sdk.js'; |
| import * as Extensions from '../../models/extensions/extensions.js'; |
| import * as Workspace from '../../models/workspace/workspace.js'; |
| import * as UI from '../../ui/legacy/legacy.js'; |
| |
| import * as NetworkForward from './forward/forward.js'; |
| import type * as Network from './network.js'; |
| |
| const UIStrings = { |
| /** |
| *@description Command for showing the 'Network' tool |
| */ |
| showNetwork: 'Show Network', |
| /** |
| *@description Title of the Network tool |
| */ |
| network: 'Network', |
| /** |
| *@description Command for showing the 'Network request blocking' tool |
| */ |
| showNetworkRequestBlocking: 'Show Network request blocking', |
| /** |
| *@description Title of the 'Network request blocking' tool in the bottom drawer |
| */ |
| networkRequestBlocking: 'Network request blocking', |
| /** |
| *@description Command for showing the 'Network conditions' tool |
| */ |
| showNetworkConditions: 'Show Network conditions', |
| /** |
| *@description Title of the 'Network conditions' tool in the bottom drawer |
| */ |
| networkConditions: 'Network conditions', |
| /** |
| *@description A tag of Network Conditions tool that can be searched in the command menu |
| */ |
| diskCache: 'disk cache', |
| /** |
| *@description A tag of Network Conditions tool that can be searched in the command menu |
| */ |
| networkThrottling: 'network throttling', |
| /** |
| *@description Command for showing the 'Search' tool |
| */ |
| showSearch: 'Show Search', |
| /** |
| *@description Title of a search bar or tool |
| */ |
| search: 'Search', |
| /** |
| *@description Title of an action in the network tool to toggle recording |
| */ |
| recordNetworkLog: 'Record network log', |
| /** |
| *@description Title of an action in the network tool to toggle recording |
| */ |
| stopRecordingNetworkLog: 'Stop recording network log', |
| /** |
| *@description Title of an action that hides network request details |
| */ |
| hideRequestDetails: 'Hide request details', |
| /** |
| *@description Title of a setting under the Network category in Settings |
| */ |
| colorcodeResourceTypes: 'Color-code resource types', |
| /** |
| *@description A tag of Network color-code resource types that can be searched in the command menu |
| */ |
| colorCode: 'color code', |
| /** |
| *@description A tag of Network color-code resource types that can be searched in the command menu |
| */ |
| resourceType: 'resource type', |
| /** |
| *@description Title of a setting under the Network category that can be invoked through the Command Menu |
| */ |
| colorCodeByResourceType: 'Color code by resource type', |
| /** |
| *@description Title of a setting under the Network category that can be invoked through the Command Menu |
| */ |
| useDefaultColors: 'Use default colors', |
| /** |
| *@description Title of a setting under the Network category in Settings |
| */ |
| groupNetworkLogByFrame: 'Group network log by frame', |
| /** |
| *@description A tag of Group Network by frame setting that can be searched in the command menu |
| */ |
| netWork: 'network', |
| /** |
| *@description A tag of Group Network by frame setting that can be searched in the command menu |
| */ |
| frame: 'frame', |
| /** |
| *@description A tag of Group Network by frame setting that can be searched in the command menu |
| */ |
| group: 'group', |
| /** |
| *@description Title of a setting under the Network category that can be invoked through the Command Menu |
| */ |
| groupNetworkLogItemsByFrame: 'Group network log items by frame', |
| /** |
| *@description Title of a setting under the Network category that can be invoked through the Command Menu |
| */ |
| dontGroupNetworkLogItemsByFrame: 'Don\'t group network log items by frame', |
| /** |
| *@description Title of a button for clearing the network log |
| */ |
| clear: 'Clear network log', |
| /** |
| *@description Title of an action in the Network request blocking panel to add a new URL pattern to the blocklist. |
| */ |
| addNetworkRequestBlockingPattern: 'Add network request blocking pattern', |
| /** |
| *@description Title of an action in the Network request blocking panel to clear all URL patterns. |
| */ |
| removeAllNetworkRequestBlockingPatterns: 'Remove all network request blocking patterns', |
| /** |
| * @description Title of an action in the Network panel (and title of a setting in the Network category) |
| * that enables options in the UI to copy or export HAR (not translatable) with sensitive data. |
| */ |
| allowToGenerateHarWithSensitiveData: 'Allow to generate `HAR` with sensitive data', |
| /** |
| * @description Title of an action in the Network panel that disables options in the UI to copy or export |
| * HAR (not translatable) with sensitive data. |
| */ |
| dontAllowToGenerateHarWithSensitiveData: 'Don\'t allow to generate `HAR` with sensitive data', |
| /** |
| * @description Tooltip shown as documentation when hovering the (?) icon next to the "Allow to generate |
| * HAR with sensitive data" option in the Settings panel. |
| */ |
| allowToGenerateHarWithSensitiveDataDocumentation: |
| 'By default generated HAR logs are sanitized and don\'t include `Cookie`, `Set-Cookie`, or `Authorization` HTTP headers. When this setting is enabled, options to export/copy HAR with sensitive data are provided.', |
| } as const; |
| const str_ = i18n.i18n.registerUIStrings('panels/network/network-meta.ts', UIStrings); |
| const i18nLazyString = i18n.i18n.getLazilyComputedLocalizedString.bind(undefined, str_); |
| let loadedNetworkModule: (typeof Network|undefined); |
| |
| const isNode = Root.Runtime.Runtime.isNode(); |
| |
| async function loadNetworkModule(): Promise<typeof Network> { |
| if (!loadedNetworkModule) { |
| loadedNetworkModule = await import('./network.js'); |
| } |
| return loadedNetworkModule; |
| } |
| |
| function maybeRetrieveContextTypes<T = unknown>(getClassCallBack: (loadedNetworkModule: typeof Network) => T[]): T[] { |
| if (loadedNetworkModule === undefined) { |
| return []; |
| } |
| return getClassCallBack(loadedNetworkModule); |
| } |
| |
| UI.ViewManager.registerViewExtension({ |
| location: UI.ViewManager.ViewLocationValues.PANEL, |
| id: 'network', |
| commandPrompt: i18nLazyString(UIStrings.showNetwork), |
| title: i18nLazyString(UIStrings.network), |
| order: 40, |
| isPreviewFeature: isNode, |
| async loadView() { |
| const Network = await loadNetworkModule(); |
| return Network.NetworkPanel.NetworkPanel.instance(); |
| }, |
| }); |
| |
| UI.ViewManager.registerViewExtension({ |
| location: UI.ViewManager.ViewLocationValues.DRAWER_VIEW, |
| id: 'network.blocked-urls', |
| commandPrompt: i18nLazyString(UIStrings.showNetworkRequestBlocking), |
| title: i18nLazyString(UIStrings.networkRequestBlocking), |
| persistence: UI.ViewManager.ViewPersistence.CLOSEABLE, |
| order: 60, |
| async loadView() { |
| const Network = await loadNetworkModule(); |
| return new Network.BlockedURLsPane.BlockedURLsPane(); |
| }, |
| }); |
| |
| UI.ViewManager.registerViewExtension({ |
| location: UI.ViewManager.ViewLocationValues.DRAWER_VIEW, |
| id: 'network.config', |
| commandPrompt: i18nLazyString(UIStrings.showNetworkConditions), |
| title: i18nLazyString(UIStrings.networkConditions), |
| persistence: UI.ViewManager.ViewPersistence.CLOSEABLE, |
| order: 40, |
| tags: [ |
| i18nLazyString(UIStrings.diskCache), |
| i18nLazyString(UIStrings.networkThrottling), |
| i18n.i18n.lockedLazyString('useragent'), |
| i18n.i18n.lockedLazyString('user agent'), |
| i18n.i18n.lockedLazyString('user-agent'), |
| ], |
| async loadView() { |
| const Network = await loadNetworkModule(); |
| return Network.NetworkConfigView.NetworkConfigView.instance(); |
| }, |
| }); |
| |
| UI.ViewManager.registerViewExtension({ |
| location: UI.ViewManager.ViewLocationValues.NETWORK_SIDEBAR, |
| id: 'network.search-network-tab', |
| commandPrompt: i18nLazyString(UIStrings.showSearch), |
| title: i18nLazyString(UIStrings.search), |
| persistence: UI.ViewManager.ViewPersistence.PERMANENT, |
| async loadView() { |
| const Network = await loadNetworkModule(); |
| return Network.NetworkPanel.SearchNetworkView.instance(); |
| }, |
| }); |
| |
| UI.ActionRegistration.registerActionExtension({ |
| actionId: 'network.toggle-recording', |
| category: UI.ActionRegistration.ActionCategory.NETWORK, |
| iconClass: UI.ActionRegistration.IconClass.START_RECORDING, |
| toggleable: true, |
| toggledIconClass: UI.ActionRegistration.IconClass.STOP_RECORDING, |
| toggleWithRedColor: true, |
| contextTypes() { |
| return maybeRetrieveContextTypes(Network => [Network.NetworkPanel.NetworkPanel]); |
| }, |
| async loadActionDelegate() { |
| const Network = await loadNetworkModule(); |
| return new Network.NetworkPanel.ActionDelegate(); |
| }, |
| options: [ |
| { |
| value: true, |
| title: i18nLazyString(UIStrings.recordNetworkLog), |
| }, |
| { |
| value: false, |
| title: i18nLazyString(UIStrings.stopRecordingNetworkLog), |
| }, |
| ], |
| bindings: [ |
| { |
| shortcut: 'Ctrl+E', |
| platform: UI.ActionRegistration.Platforms.WINDOWS_LINUX, |
| }, |
| { |
| shortcut: 'Meta+E', |
| platform: UI.ActionRegistration.Platforms.MAC, |
| }, |
| ], |
| }); |
| |
| UI.ActionRegistration.registerActionExtension({ |
| actionId: 'network.clear', |
| category: UI.ActionRegistration.ActionCategory.NETWORK, |
| title: i18nLazyString(UIStrings.clear), |
| iconClass: UI.ActionRegistration.IconClass.CLEAR, |
| async loadActionDelegate() { |
| const Network = await loadNetworkModule(); |
| return new Network.NetworkPanel.ActionDelegate(); |
| }, |
| contextTypes() { |
| return maybeRetrieveContextTypes(Network => [Network.NetworkPanel.NetworkPanel]); |
| }, |
| bindings: [ |
| { |
| shortcut: 'Ctrl+L', |
| }, |
| { |
| shortcut: 'Meta+K', |
| platform: UI.ActionRegistration.Platforms.MAC, |
| }, |
| ], |
| }); |
| |
| UI.ActionRegistration.registerActionExtension({ |
| actionId: 'network.hide-request-details', |
| category: UI.ActionRegistration.ActionCategory.NETWORK, |
| title: i18nLazyString(UIStrings.hideRequestDetails), |
| contextTypes() { |
| return maybeRetrieveContextTypes(Network => [Network.NetworkPanel.NetworkPanel]); |
| }, |
| async loadActionDelegate() { |
| const Network = await loadNetworkModule(); |
| return new Network.NetworkPanel.ActionDelegate(); |
| }, |
| bindings: [ |
| { |
| shortcut: 'Esc', |
| }, |
| ], |
| }); |
| |
| UI.ActionRegistration.registerActionExtension({ |
| actionId: 'network.search', |
| category: UI.ActionRegistration.ActionCategory.NETWORK, |
| title: i18nLazyString(UIStrings.search), |
| contextTypes() { |
| return maybeRetrieveContextTypes(Network => [Network.NetworkPanel.NetworkPanel]); |
| }, |
| async loadActionDelegate() { |
| const Network = await loadNetworkModule(); |
| return new Network.NetworkPanel.ActionDelegate(); |
| }, |
| bindings: [ |
| { |
| platform: UI.ActionRegistration.Platforms.MAC, |
| shortcut: 'Meta+F', |
| keybindSets: [ |
| UI.ActionRegistration.KeybindSet.DEVTOOLS_DEFAULT, |
| UI.ActionRegistration.KeybindSet.VS_CODE, |
| ], |
| }, |
| { |
| platform: UI.ActionRegistration.Platforms.WINDOWS_LINUX, |
| shortcut: 'Ctrl+F', |
| keybindSets: [ |
| UI.ActionRegistration.KeybindSet.DEVTOOLS_DEFAULT, |
| UI.ActionRegistration.KeybindSet.VS_CODE, |
| ], |
| }, |
| ], |
| }); |
| |
| UI.ActionRegistration.registerActionExtension({ |
| actionId: 'network.add-network-request-blocking-pattern', |
| category: UI.ActionRegistration.ActionCategory.NETWORK, |
| title: i18nLazyString(UIStrings.addNetworkRequestBlockingPattern), |
| iconClass: UI.ActionRegistration.IconClass.PLUS, |
| contextTypes() { |
| return maybeRetrieveContextTypes(Network => [Network.BlockedURLsPane.BlockedURLsPane]); |
| }, |
| async loadActionDelegate() { |
| const Network = await loadNetworkModule(); |
| return new Network.BlockedURLsPane.ActionDelegate(); |
| }, |
| }); |
| |
| UI.ActionRegistration.registerActionExtension({ |
| actionId: 'network.remove-all-network-request-blocking-patterns', |
| category: UI.ActionRegistration.ActionCategory.NETWORK, |
| title: i18nLazyString(UIStrings.removeAllNetworkRequestBlockingPatterns), |
| iconClass: UI.ActionRegistration.IconClass.CLEAR, |
| contextTypes() { |
| return maybeRetrieveContextTypes(Network => [Network.BlockedURLsPane.BlockedURLsPane]); |
| }, |
| async loadActionDelegate() { |
| const Network = await loadNetworkModule(); |
| return new Network.BlockedURLsPane.ActionDelegate(); |
| }, |
| }); |
| |
| Common.Settings.registerSettingExtension({ |
| category: Common.Settings.SettingCategory.NETWORK, |
| storageType: Common.Settings.SettingStorageType.SYNCED, |
| title: i18nLazyString(UIStrings.allowToGenerateHarWithSensitiveData), |
| settingName: 'network.show-options-to-generate-har-with-sensitive-data', |
| settingType: Common.Settings.SettingType.BOOLEAN, |
| defaultValue: false, |
| tags: [ |
| i18n.i18n.lockedLazyString('HAR'), |
| ], |
| options: [ |
| { |
| value: true, |
| title: i18nLazyString(UIStrings.allowToGenerateHarWithSensitiveData), |
| }, |
| { |
| value: false, |
| title: i18nLazyString(UIStrings.dontAllowToGenerateHarWithSensitiveData), |
| }, |
| ], |
| learnMore: { |
| url: 'https://goo.gle/devtools-export-hars' as Platform.DevToolsPath.UrlString, |
| tooltip: i18nLazyString(UIStrings.allowToGenerateHarWithSensitiveDataDocumentation), |
| }, |
| }); |
| |
| Common.Settings.registerSettingExtension({ |
| category: Common.Settings.SettingCategory.NETWORK, |
| storageType: Common.Settings.SettingStorageType.SYNCED, |
| title: i18nLazyString(UIStrings.colorcodeResourceTypes), |
| settingName: 'network-color-code-resource-types', |
| settingType: Common.Settings.SettingType.BOOLEAN, |
| defaultValue: false, |
| tags: [ |
| i18nLazyString(UIStrings.colorCode), |
| i18nLazyString(UIStrings.resourceType), |
| ], |
| options: [ |
| { |
| value: true, |
| title: i18nLazyString(UIStrings.colorCodeByResourceType), |
| }, |
| { |
| value: false, |
| title: i18nLazyString(UIStrings.useDefaultColors), |
| }, |
| ], |
| }); |
| |
| Common.Settings.registerSettingExtension({ |
| category: Common.Settings.SettingCategory.NETWORK, |
| storageType: Common.Settings.SettingStorageType.SYNCED, |
| title: i18nLazyString(UIStrings.groupNetworkLogByFrame), |
| settingName: 'network.group-by-frame', |
| settingType: Common.Settings.SettingType.BOOLEAN, |
| defaultValue: false, |
| tags: [ |
| i18nLazyString(UIStrings.netWork), |
| i18nLazyString(UIStrings.frame), |
| i18nLazyString(UIStrings.group), |
| ], |
| options: [ |
| { |
| value: true, |
| title: i18nLazyString(UIStrings.groupNetworkLogItemsByFrame), |
| }, |
| { |
| value: false, |
| title: i18nLazyString(UIStrings.dontGroupNetworkLogItemsByFrame), |
| }, |
| ], |
| }); |
| |
| UI.ViewManager.registerLocationResolver({ |
| name: UI.ViewManager.ViewLocationValues.NETWORK_SIDEBAR, |
| category: UI.ViewManager.ViewLocationCategory.NETWORK, |
| async loadResolver() { |
| const Network = await loadNetworkModule(); |
| return Network.NetworkPanel.NetworkPanel.instance(); |
| }, |
| }); |
| |
| UI.ContextMenu.registerProvider({ |
| contextTypes() { |
| return [ |
| SDK.NetworkRequest.NetworkRequest, |
| SDK.Resource.Resource, |
| Workspace.UISourceCode.UISourceCode, |
| SDK.TraceObject.RevealableNetworkRequest, |
| ]; |
| }, |
| async loadProvider() { |
| const Network = await loadNetworkModule(); |
| return Network.NetworkPanel.NetworkPanel.instance(); |
| }, |
| experiment: undefined, |
| }); |
| |
| Common.Revealer.registerRevealer({ |
| contextTypes() { |
| return [ |
| SDK.NetworkRequest.NetworkRequest, |
| ]; |
| }, |
| destination: Common.Revealer.RevealerDestination.NETWORK_PANEL, |
| async loadRevealer() { |
| const Network = await loadNetworkModule(); |
| return new Network.NetworkPanel.RequestRevealer(); |
| }, |
| }); |
| |
| Common.Revealer.registerRevealer({ |
| contextTypes() { |
| return [NetworkForward.UIRequestLocation.UIRequestLocation]; |
| }, |
| destination: undefined, |
| async loadRevealer() { |
| const Network = await loadNetworkModule(); |
| return new Network.NetworkPanel.RequestLocationRevealer(); |
| }, |
| }); |
| |
| Common.Revealer.registerRevealer({ |
| contextTypes() { |
| return [NetworkForward.NetworkRequestId.NetworkRequestId]; |
| }, |
| destination: Common.Revealer.RevealerDestination.NETWORK_PANEL, |
| async loadRevealer() { |
| const Network = await loadNetworkModule(); |
| return new Network.NetworkPanel.RequestIdRevealer(); |
| }, |
| }); |
| |
| Common.Revealer.registerRevealer({ |
| contextTypes() { |
| return [NetworkForward.UIFilter.UIRequestFilter, Extensions.ExtensionServer.RevealableNetworkRequestFilter]; |
| }, |
| destination: Common.Revealer.RevealerDestination.NETWORK_PANEL, |
| async loadRevealer() { |
| const Network = await loadNetworkModule(); |
| return new Network.NetworkPanel.NetworkLogWithFilterRevealer(); |
| }, |
| }); |