chrome-devtools-frontend 1.0.1565595 → 1.0.1567721
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/docs/contributing/performance.md +24 -0
- package/front_end/Images/src/lock-person.svg +1 -0
- package/front_end/core/common/Base64.ts +21 -2
- package/front_end/core/common/ResourceType.ts +7 -0
- package/front_end/core/host/InspectorFrontendHostStub.ts +3 -0
- package/front_end/core/host/UserMetrics.ts +20 -0
- package/front_end/core/root/Runtime.ts +5 -0
- package/front_end/core/sdk/DOMModel.ts +32 -2
- package/front_end/core/sdk/NetworkManager.ts +16 -3
- package/front_end/core/sdk/ResourceTreeModel.ts +11 -6
- package/front_end/entrypoints/main/MainImpl.ts +1 -7
- package/front_end/generated/Deprecation.ts +0 -8
- package/front_end/generated/InspectorBackendCommands.ts +10 -1
- package/front_end/generated/SupportedCSSProperties.js +48 -62
- package/front_end/generated/protocol-mapping.d.ts +4 -0
- package/front_end/generated/protocol-proxy-api.d.ts +5 -0
- package/front_end/generated/protocol.ts +203 -0
- package/front_end/models/ai_assistance/agents/AiAgent.ts +2 -1
- package/front_end/models/ai_assistance/agents/PerformanceAgent.ts +98 -105
- package/front_end/models/emulation/DeviceModeModel.ts +1 -1
- package/front_end/models/formatter/FormatterWorkerPool.ts +8 -6
- package/front_end/models/javascript_metadata/NativeFunctions.js +4 -9
- package/front_end/models/persistence/PersistenceImpl.ts +8 -0
- package/front_end/models/text_utils/TextUtils.snapshot.txt +83 -0
- package/front_end/panels/ai_assistance/ai_assistance-meta.ts +0 -1
- package/front_end/panels/ai_assistance/components/ArtifactsViewer.ts +28 -4
- package/front_end/panels/ai_assistance/components/ChatView.ts +52 -169
- package/front_end/panels/ai_assistance/components/CollapsibleAssistanceContentWidget.ts +27 -8
- package/front_end/panels/ai_assistance/components/PerformanceAgentMarkdownRenderer.ts +19 -4
- package/front_end/panels/application/ApplicationPanelSidebar.ts +29 -0
- package/front_end/panels/application/ApplicationPanelTreeElement.ts +12 -0
- package/front_end/panels/application/DeviceBoundSessionsModel.ts +169 -0
- package/front_end/panels/application/DeviceBoundSessionsTreeElement.ts +219 -0
- package/front_end/panels/application/DeviceBoundSessionsView.ts +1096 -0
- package/front_end/panels/application/ResourcesPanel.ts +19 -0
- package/front_end/panels/application/application.ts +6 -0
- package/front_end/panels/application/deviceBoundSessionsView.css +27 -0
- package/front_end/panels/common/AiCodeGenerationUpgradeDialog.ts +115 -0
- package/front_end/panels/common/aiCodeGenerationUpgradeDialog.css +79 -0
- package/front_end/panels/common/common.ts +1 -0
- package/front_end/panels/console/ConsoleInsightTeaser.ts +41 -8
- package/front_end/panels/console/ConsoleViewMessage.ts +20 -13
- package/front_end/panels/elements/ElementsTreeOutline.ts +13 -0
- package/front_end/panels/elements/MetricsSidebarPane.ts +3 -1
- package/front_end/panels/issues/AffectedSourcesView.ts +0 -1
- package/front_end/panels/issues/IssuesPane.ts +0 -4
- package/front_end/panels/network/RequestTimingView.ts +5 -20
- package/front_end/panels/network/networkTimingTable.css +5 -5
- package/front_end/panels/recorder/components/StepEditor.ts +15 -8
- package/front_end/panels/security/SecurityPanelSidebar.ts +0 -1
- package/front_end/panels/settings/AISettingsTab.ts +31 -2
- package/front_end/panels/sources/InplaceFormatterEditorAction.ts +8 -6
- package/front_end/panels/sources/UISourceCodeFrame.ts +9 -3
- package/front_end/panels/timeline/TimelinePanel.ts +12 -4
- package/front_end/panels/timeline/components/insights/DuplicatedJavaScript.ts +1 -1
- package/front_end/third_party/chromium/README.chromium +1 -1
- package/front_end/third_party/puppeteer/README.chromium +2 -2
- package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/api/Browser.d.ts +9 -2
- package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/api/Browser.d.ts.map +1 -1
- package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/api/Browser.js.map +1 -1
- package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/api/Page.d.ts +8 -0
- package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/api/Page.d.ts.map +1 -1
- package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/api/Page.js +8 -0
- package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/api/Page.js.map +1 -1
- package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/bidi/Browser.d.ts +2 -1
- package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/bidi/Browser.d.ts.map +1 -1
- package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/bidi/Browser.js +2 -2
- package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/bidi/Browser.js.map +1 -1
- package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/bidi/BrowserContext.d.ts.map +1 -1
- package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/bidi/BrowserContext.js +3 -1
- package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/bidi/BrowserContext.js.map +1 -1
- package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/bidi/Frame.d.ts.map +1 -1
- package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/bidi/Frame.js +1 -1
- package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/bidi/Frame.js.map +1 -1
- package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/bidi/core/BrowsingContext.d.ts.map +1 -1
- package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/bidi/core/BrowsingContext.js +3 -3
- package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/bidi/core/BrowsingContext.js.map +1 -1
- package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/bidi/core/UserContext.d.ts +1 -0
- package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/bidi/core/UserContext.d.ts.map +1 -1
- package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/bidi/core/UserContext.js +1 -0
- package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/bidi/core/UserContext.js.map +1 -1
- package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/cdp/Browser.d.ts.map +1 -1
- package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/cdp/Browser.js +1 -0
- package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/cdp/Browser.js.map +1 -1
- package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/cdp/Page.d.ts.map +1 -1
- package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/cdp/Page.js +33 -31
- package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/cdp/Page.js.map +1 -1
- package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/cdp/WebWorker.d.ts +2 -2
- package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/cdp/WebWorker.d.ts.map +1 -1
- package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/cdp/WebWorker.js +1 -4
- package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/cdp/WebWorker.js.map +1 -1
- package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/common/ConsoleMessage.d.ts +7 -1
- package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/common/ConsoleMessage.d.ts.map +1 -1
- package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/common/ConsoleMessage.js +11 -1
- package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/common/ConsoleMessage.js.map +1 -1
- package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/common/Cookie.d.ts +2 -2
- package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/injected/injected.d.ts +1 -1
- package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/revisions.d.ts +2 -2
- package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/revisions.js +2 -2
- package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/util/Mutex.d.ts +2 -2
- package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/util/version.d.ts +1 -1
- package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/util/version.js +1 -1
- package/front_end/third_party/puppeteer/package/lib/es5-iife/puppeteer-core-browser.d.ts +13 -4
- package/front_end/third_party/puppeteer/package/lib/es5-iife/puppeteer-core-browser.js +62 -42
- package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/api/Browser.d.ts +9 -2
- package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/api/Browser.d.ts.map +1 -1
- package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/api/Browser.js.map +1 -1
- package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/api/Page.d.ts +8 -0
- package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/api/Page.d.ts.map +1 -1
- package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/api/Page.js +8 -0
- package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/api/Page.js.map +1 -1
- package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/bidi/Browser.d.ts +2 -1
- package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/bidi/Browser.d.ts.map +1 -1
- package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/bidi/Browser.js +2 -2
- package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/bidi/Browser.js.map +1 -1
- package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/bidi/BrowserContext.d.ts.map +1 -1
- package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/bidi/BrowserContext.js +3 -1
- package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/bidi/BrowserContext.js.map +1 -1
- package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/bidi/Frame.d.ts.map +1 -1
- package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/bidi/Frame.js +1 -1
- package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/bidi/Frame.js.map +1 -1
- package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/bidi/core/BrowsingContext.d.ts.map +1 -1
- package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/bidi/core/BrowsingContext.js +3 -3
- package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/bidi/core/BrowsingContext.js.map +1 -1
- package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/bidi/core/UserContext.d.ts +1 -0
- package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/bidi/core/UserContext.d.ts.map +1 -1
- package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/bidi/core/UserContext.js +1 -0
- package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/bidi/core/UserContext.js.map +1 -1
- package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/cdp/Browser.d.ts.map +1 -1
- package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/cdp/Browser.js +1 -0
- package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/cdp/Browser.js.map +1 -1
- package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/cdp/Page.d.ts.map +1 -1
- package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/cdp/Page.js +33 -31
- package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/cdp/Page.js.map +1 -1
- package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/cdp/WebWorker.d.ts +2 -2
- package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/cdp/WebWorker.d.ts.map +1 -1
- package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/cdp/WebWorker.js +1 -4
- package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/cdp/WebWorker.js.map +1 -1
- package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/common/ConsoleMessage.d.ts +7 -1
- package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/common/ConsoleMessage.d.ts.map +1 -1
- package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/common/ConsoleMessage.js +11 -1
- package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/common/ConsoleMessage.js.map +1 -1
- package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/common/Cookie.d.ts +2 -2
- package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/revisions.d.ts +2 -2
- package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/revisions.js +2 -2
- package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/util/version.d.ts +1 -1
- package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/util/version.js +1 -1
- package/front_end/third_party/puppeteer/package/lib/types.d.ts +13 -4
- package/front_end/third_party/puppeteer/package/package.json +3 -3
- package/front_end/third_party/puppeteer/package/src/api/Browser.ts +11 -3
- package/front_end/third_party/puppeteer/package/src/api/Page.ts +9 -0
- package/front_end/third_party/puppeteer/package/src/bidi/Browser.ts +3 -3
- package/front_end/third_party/puppeteer/package/src/bidi/BrowserContext.ts +3 -1
- package/front_end/third_party/puppeteer/package/src/bidi/Frame.ts +1 -0
- package/front_end/third_party/puppeteer/package/src/bidi/core/BrowsingContext.ts +3 -5
- package/front_end/third_party/puppeteer/package/src/bidi/core/UserContext.ts +2 -0
- package/front_end/third_party/puppeteer/package/src/cdp/Browser.ts +1 -0
- package/front_end/third_party/puppeteer/package/src/cdp/Page.ts +43 -45
- package/front_end/third_party/puppeteer/package/src/cdp/WebWorker.ts +3 -11
- package/front_end/third_party/puppeteer/package/src/common/ConsoleMessage.ts +12 -0
- package/front_end/third_party/puppeteer/package/src/common/Cookie.ts +2 -2
- package/front_end/third_party/puppeteer/package/src/revisions.ts +2 -2
- package/front_end/third_party/puppeteer/package/src/util/version.ts +1 -1
- package/front_end/third_party/source-map-scopes-codec/README.chromium +2 -5
- package/front_end/third_party/source-map-scopes-codec/package/_dist/src/builder/builder.d.ts +1 -1
- package/front_end/third_party/source-map-scopes-codec/package/_dist/src/builder/builder.d.ts.map +1 -1
- package/front_end/third_party/source-map-scopes-codec/package/_dist/src/builder/safe_builder.d.ts +1 -1
- package/front_end/third_party/source-map-scopes-codec/package/_dist/src/builder/safe_builder.d.ts.map +1 -1
- package/front_end/third_party/source-map-scopes-codec/package/_dist/src/decode/decode.d.ts +1 -1
- package/front_end/third_party/source-map-scopes-codec/package/_dist/src/decode/decode.d.ts.map +1 -1
- package/front_end/third_party/source-map-scopes-codec/package/_dist/src/encode/encode.d.ts +1 -1
- package/front_end/third_party/source-map-scopes-codec/package/_dist/src/encode/encode.d.ts.map +1 -1
- package/front_end/third_party/source-map-scopes-codec/package/_dist/src/mod.d.ts +1 -1
- package/front_end/third_party/source-map-scopes-codec/package/_dist/src/mod.d.ts.map +1 -1
- package/front_end/third_party/source-map-scopes-codec/package/_dist/src/scopes.d.ts +130 -0
- package/front_end/third_party/source-map-scopes-codec/package/_dist/src/scopes.d.ts.map +1 -0
- package/front_end/third_party/source-map-scopes-codec/package/deno.json +1 -1
- package/front_end/third_party/source-map-scopes-codec/package/package.json +1 -1
- package/front_end/third_party/source-map-scopes-codec/package/src/builder/builder.ts +1 -1
- package/front_end/third_party/source-map-scopes-codec/package/src/builder/safe_builder.ts +1 -1
- package/front_end/third_party/source-map-scopes-codec/package/src/codec.js +4 -0
- package/front_end/third_party/source-map-scopes-codec/package/src/codec.js.map +1 -1
- package/front_end/third_party/source-map-scopes-codec/package/src/codec.ts +4 -0
- package/front_end/third_party/source-map-scopes-codec/package/src/decode/decode.js +30 -13
- package/front_end/third_party/source-map-scopes-codec/package/src/decode/decode.js.map +1 -1
- package/front_end/third_party/source-map-scopes-codec/package/src/decode/decode.ts +35 -17
- package/front_end/third_party/source-map-scopes-codec/package/src/encode/encode.ts +1 -1
- package/front_end/third_party/source-map-scopes-codec/package/src/encode/encoder.js +1 -1
- package/front_end/third_party/source-map-scopes-codec/package/src/encode/encoder.js.map +1 -1
- package/front_end/third_party/source-map-scopes-codec/package/src/encode/encoder.ts +2 -2
- package/front_end/third_party/source-map-scopes-codec/package/src/mod.ts +1 -1
- package/front_end/third_party/source-map-scopes-codec/package/src/scopes.js +7 -0
- package/front_end/third_party/source-map-scopes-codec/package/src/scopes.js.map +1 -0
- package/front_end/third_party/source-map-scopes-codec/package/src/util.ts +1 -1
- package/front_end/ui/legacy/components/color_picker/FormatPickerContextMenu.ts +8 -1
- package/front_end/ui/legacy/components/data_grid/DataGridElement.ts +4 -0
- package/front_end/ui/visual_logging/KnownContextValues.ts +13 -0
- package/mcp/mcp.ts +1 -0
- package/package.json +1 -2
- package/front_end/third_party/source-map-scopes-codec/package/src/scopes-tsconfig.json +0 -8
- /package/front_end/third_party/source-map-scopes-codec/package/src/{scopes.d.ts → scopes.ts} +0 -0
|
@@ -0,0 +1,219 @@
|
|
|
1
|
+
// Copyright 2026 The Chromium Authors
|
|
2
|
+
// Use of this source code is governed by a BSD-style license that can be
|
|
3
|
+
// found in the LICENSE file.
|
|
4
|
+
|
|
5
|
+
import type * as Common from '../../core/common/common.js';
|
|
6
|
+
import * as i18n from '../../core/i18n/i18n.js';
|
|
7
|
+
import type * as Platform from '../../core/platform/platform.js';
|
|
8
|
+
import {createIcon} from '../../ui/kit/kit.js';
|
|
9
|
+
|
|
10
|
+
import {ApplicationPanelTreeElement} from './ApplicationPanelTreeElement.js';
|
|
11
|
+
import {
|
|
12
|
+
DeviceBoundSessionModelEvents,
|
|
13
|
+
type DeviceBoundSessionModelEventTypes,
|
|
14
|
+
type DeviceBoundSessionsModel
|
|
15
|
+
} from './DeviceBoundSessionsModel.js';
|
|
16
|
+
import type {ResourcesPanel} from './ResourcesPanel.js';
|
|
17
|
+
|
|
18
|
+
const UIStrings = {
|
|
19
|
+
/**
|
|
20
|
+
*@description Text for section title Application panel sidebar. A website
|
|
21
|
+
* may decide to create a session for a user, for example when the user logs
|
|
22
|
+
* in. They can use a protocol to make it a "device bound session". That
|
|
23
|
+
* means that when the session expires, it is only possible for it to be
|
|
24
|
+
* extended on the device it was created on. Thus the session is considered
|
|
25
|
+
* to be bound to that device. For more details on the protocol, see
|
|
26
|
+
* https://github.com/w3c/webappsec-dbsc/blob/main/README.md and
|
|
27
|
+
* https://w3c.github.io/webappsec-dbsc/.
|
|
28
|
+
*/
|
|
29
|
+
deviceBoundSessions: 'Device bound sessions',
|
|
30
|
+
/**
|
|
31
|
+
*@description Empty state description for root tree element and site tree
|
|
32
|
+
* elements. A website may decide to create a session for a user, for example
|
|
33
|
+
* when the user logs in. They can use a protocol to make it a "device bound
|
|
34
|
+
* session". That means that when the session expires, it is only possible
|
|
35
|
+
* for it to be extended on the device it was created on. Thus the session
|
|
36
|
+
* is considered to be bound to that device. A session can have various events,
|
|
37
|
+
* such as when it's first created, when it's extended, or when it's
|
|
38
|
+
* terminated. For more details on the protocol, see
|
|
39
|
+
* https://github.com/w3c/webappsec-dbsc/blob/main/README.md and
|
|
40
|
+
* https://w3c.github.io/webappsec-dbsc/.
|
|
41
|
+
*/
|
|
42
|
+
deviceBoundSessionsCategoryDescription: 'On this page you can view device bound sessions and associated events',
|
|
43
|
+
/**
|
|
44
|
+
*@description Events are sometimes linked to sessions. These are grouped
|
|
45
|
+
* visually either by session name or by 'No session' if any events are not
|
|
46
|
+
* linked to a session.
|
|
47
|
+
*/
|
|
48
|
+
noSession: 'No session',
|
|
49
|
+
} as const;
|
|
50
|
+
|
|
51
|
+
const str_ = i18n.i18n.registerUIStrings('panels/application/DeviceBoundSessionsTreeElement.ts', UIStrings);
|
|
52
|
+
const i18nString = i18n.i18n.getLocalizedString.bind(undefined, str_);
|
|
53
|
+
|
|
54
|
+
export class RootTreeElement extends ApplicationPanelTreeElement {
|
|
55
|
+
#model: DeviceBoundSessionsModel;
|
|
56
|
+
#sites = new Map<string, {
|
|
57
|
+
siteTreeElement: ApplicationPanelTreeElement,
|
|
58
|
+
sessions: Map<string|undefined, ApplicationPanelTreeElement>,
|
|
59
|
+
}>();
|
|
60
|
+
|
|
61
|
+
constructor(storagePanel: ResourcesPanel, model: DeviceBoundSessionsModel) {
|
|
62
|
+
super(storagePanel, i18nString(UIStrings.deviceBoundSessions), /* expandable=*/ true, 'device-bound-sessions-root');
|
|
63
|
+
this.setLeadingIcons([createIcon('lock-person')]);
|
|
64
|
+
this.#model = model;
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
override get itemURL(): Platform.DevToolsPath.UrlString {
|
|
68
|
+
return 'device-bound-sessions://' as Platform.DevToolsPath.UrlString;
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
override onselect(selectedByUser?: boolean): boolean {
|
|
72
|
+
super.onselect(selectedByUser);
|
|
73
|
+
this.resourcesPanel.showDeviceBoundSessionDefault(
|
|
74
|
+
this.#model, i18nString(UIStrings.deviceBoundSessions),
|
|
75
|
+
i18nString(UIStrings.deviceBoundSessionsCategoryDescription));
|
|
76
|
+
return false;
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
override onbind(): void {
|
|
80
|
+
super.onbind();
|
|
81
|
+
this.#model.addEventListener(DeviceBoundSessionModelEvents.INITIALIZE_SESSIONS, this.#onNewSessions, this);
|
|
82
|
+
this.#model.addEventListener(DeviceBoundSessionModelEvents.ADD_VISIBLE_SITE, this.#onVisibleSiteAdded, this);
|
|
83
|
+
this.#model.addEventListener(DeviceBoundSessionModelEvents.CLEAR_VISIBLE_SITES, this.#onVisibleSitesCleared, this);
|
|
84
|
+
this.#model.addEventListener(DeviceBoundSessionModelEvents.EVENT_OCCURRED, this.#onEventOccurred, this);
|
|
85
|
+
this.#model.addEventListener(DeviceBoundSessionModelEvents.CLEAR_EVENTS, this.#onClearEvents, this);
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
override onunbind(): void {
|
|
89
|
+
super.onunbind();
|
|
90
|
+
this.#model.removeEventListener(DeviceBoundSessionModelEvents.INITIALIZE_SESSIONS, this.#onNewSessions, this);
|
|
91
|
+
this.#model.removeEventListener(DeviceBoundSessionModelEvents.ADD_VISIBLE_SITE, this.#onVisibleSiteAdded, this);
|
|
92
|
+
this.#model.removeEventListener(
|
|
93
|
+
DeviceBoundSessionModelEvents.CLEAR_VISIBLE_SITES, this.#onVisibleSitesCleared, this);
|
|
94
|
+
this.#model.removeEventListener(DeviceBoundSessionModelEvents.EVENT_OCCURRED, this.#onEventOccurred, this);
|
|
95
|
+
this.#model.removeEventListener(DeviceBoundSessionModelEvents.CLEAR_EVENTS, this.#onClearEvents, this);
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
#updateSiteTreeElementVisibility(site: string): void {
|
|
99
|
+
const siteMapEntry = this.#sites.get(site);
|
|
100
|
+
if (!siteMapEntry) {
|
|
101
|
+
return;
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
const siteTreeElement = siteMapEntry.siteTreeElement;
|
|
105
|
+
const isElementPresent = this.indexOfChild(siteTreeElement) >= 0;
|
|
106
|
+
const isSiteAllowed = this.#model.isSiteVisible(site);
|
|
107
|
+
|
|
108
|
+
if (isSiteAllowed && !isElementPresent) {
|
|
109
|
+
// Appending a child element that already has children requires a workaround of
|
|
110
|
+
// detaching and repopulating them so that the selection background color UI works.
|
|
111
|
+
// TODO(crbug.com/471021582): Can this fix safely be moved to Treeoutline.ts?
|
|
112
|
+
this.appendChild(siteTreeElement);
|
|
113
|
+
const children = [...siteTreeElement.children()];
|
|
114
|
+
siteTreeElement.removeChildren();
|
|
115
|
+
for (const child of children) {
|
|
116
|
+
siteTreeElement.appendChild(child);
|
|
117
|
+
}
|
|
118
|
+
} else if (!isSiteAllowed && isElementPresent) {
|
|
119
|
+
this.removeChild(siteTreeElement);
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
|
|
123
|
+
#addSiteSessionIfMissing(site: string, sessionId: string|undefined): void {
|
|
124
|
+
let siteMapEntry = this.#sites.get(site);
|
|
125
|
+
if (!siteMapEntry) {
|
|
126
|
+
const siteElement = new ApplicationPanelTreeElement(
|
|
127
|
+
this.resourcesPanel, site, /* expandable=*/ true, 'device-bound-sessions-site');
|
|
128
|
+
siteElement.setLeadingIcons([createIcon('cloud')]);
|
|
129
|
+
siteElement.itemURL = `device-bound-sessions://${site}` as Platform.DevToolsPath.UrlString;
|
|
130
|
+
|
|
131
|
+
const defaultOnSelect = siteElement.onselect.bind(siteElement);
|
|
132
|
+
siteElement.onselect = (selectedByUser?: boolean): boolean => {
|
|
133
|
+
defaultOnSelect(selectedByUser);
|
|
134
|
+
this.resourcesPanel.showDeviceBoundSessionDefault(
|
|
135
|
+
this.#model, i18nString(UIStrings.deviceBoundSessions),
|
|
136
|
+
i18nString(UIStrings.deviceBoundSessionsCategoryDescription));
|
|
137
|
+
return false;
|
|
138
|
+
};
|
|
139
|
+
|
|
140
|
+
siteMapEntry = {siteTreeElement: siteElement, sessions: new Map()};
|
|
141
|
+
this.#sites.set(site, siteMapEntry);
|
|
142
|
+
}
|
|
143
|
+
|
|
144
|
+
if (!siteMapEntry.sessions.has(sessionId)) {
|
|
145
|
+
const sessionElement = new ApplicationPanelTreeElement(
|
|
146
|
+
this.resourcesPanel, sessionId ?? i18nString(UIStrings.noSession), false, 'device-bound-sessions-session');
|
|
147
|
+
sessionElement.setLeadingIcons([createIcon('database')]);
|
|
148
|
+
sessionElement.itemURL = `device-bound-sessions://${site}/${sessionId || ''}` as Platform.DevToolsPath.UrlString;
|
|
149
|
+
const defaultOnSelect = sessionElement.onselect.bind(sessionElement);
|
|
150
|
+
sessionElement.onselect = (selectedByUser?: boolean): boolean => {
|
|
151
|
+
defaultOnSelect(selectedByUser);
|
|
152
|
+
this.resourcesPanel.showDeviceBoundSession(this.#model, site, sessionId);
|
|
153
|
+
return false;
|
|
154
|
+
};
|
|
155
|
+
|
|
156
|
+
if (sessionId === undefined) {
|
|
157
|
+
// The "No session" session is always listed at the top.
|
|
158
|
+
siteMapEntry.siteTreeElement.insertChild(sessionElement, 0);
|
|
159
|
+
} else {
|
|
160
|
+
siteMapEntry.siteTreeElement.appendChild(sessionElement);
|
|
161
|
+
}
|
|
162
|
+
siteMapEntry.sessions.set(sessionId, sessionElement);
|
|
163
|
+
}
|
|
164
|
+
|
|
165
|
+
this.#updateSiteTreeElementVisibility(site);
|
|
166
|
+
}
|
|
167
|
+
|
|
168
|
+
#removeEmptyElements(emptySessions: Map<string, Array<string|undefined>>, emptySites: Set<string>): void {
|
|
169
|
+
for (const emptySite of emptySites) {
|
|
170
|
+
const siteData = this.#sites.get(emptySite);
|
|
171
|
+
if (siteData) {
|
|
172
|
+
this.removeChild(siteData.siteTreeElement);
|
|
173
|
+
this.#sites.delete(emptySite);
|
|
174
|
+
}
|
|
175
|
+
}
|
|
176
|
+
|
|
177
|
+
for (const [site, emptySessionIds] of emptySessions) {
|
|
178
|
+
const siteData = this.#sites.get(site);
|
|
179
|
+
if (siteData) {
|
|
180
|
+
for (const emptySessionId of emptySessionIds) {
|
|
181
|
+
const sessionElement = siteData.sessions.get(emptySessionId);
|
|
182
|
+
if (sessionElement) {
|
|
183
|
+
siteData.siteTreeElement.removeChild(sessionElement);
|
|
184
|
+
siteData.sessions.delete(emptySessionId);
|
|
185
|
+
}
|
|
186
|
+
}
|
|
187
|
+
}
|
|
188
|
+
}
|
|
189
|
+
}
|
|
190
|
+
|
|
191
|
+
#onNewSessions({data: {sessions}}: Common.EventTarget.EventTargetEvent<
|
|
192
|
+
DeviceBoundSessionModelEventTypes[DeviceBoundSessionModelEvents.INITIALIZE_SESSIONS]>): void {
|
|
193
|
+
for (const session of sessions) {
|
|
194
|
+
this.#addSiteSessionIfMissing(session.key.site, session.key.id);
|
|
195
|
+
}
|
|
196
|
+
}
|
|
197
|
+
|
|
198
|
+
#onVisibleSiteAdded(
|
|
199
|
+
{data: {site}}: Common.EventTarget
|
|
200
|
+
.EventTargetEvent<DeviceBoundSessionModelEventTypes[DeviceBoundSessionModelEvents.ADD_VISIBLE_SITE]>): void {
|
|
201
|
+
this.#updateSiteTreeElementVisibility(site);
|
|
202
|
+
}
|
|
203
|
+
|
|
204
|
+
#onVisibleSitesCleared(): void {
|
|
205
|
+
this.removeChildren();
|
|
206
|
+
}
|
|
207
|
+
|
|
208
|
+
#onEventOccurred(
|
|
209
|
+
{data: {site, sessionId}}: Common.EventTarget
|
|
210
|
+
.EventTargetEvent<DeviceBoundSessionModelEventTypes[DeviceBoundSessionModelEvents.EVENT_OCCURRED]>): void {
|
|
211
|
+
this.#addSiteSessionIfMissing(site, sessionId);
|
|
212
|
+
}
|
|
213
|
+
|
|
214
|
+
#onClearEvents({data: {emptySessions, emptySites}}: Common.EventTarget
|
|
215
|
+
.EventTargetEvent<DeviceBoundSessionModelEventTypes[DeviceBoundSessionModelEvents.CLEAR_EVENTS]>):
|
|
216
|
+
void {
|
|
217
|
+
this.#removeEmptyElements(emptySessions, emptySites);
|
|
218
|
+
}
|
|
219
|
+
}
|