blob: fde97a7d2ca3bbfe853fe40176251ee8ea5fb1f5 [file] [log] [blame]
Blink Reformat4c46d092018-04-07 15:32:371// Copyright 2014 The Chromium Authors. All rights reserved.
2// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
Tim van der Lippe3cd66dc2020-01-10 15:26:224
Jan Schefflerb4eb22d2021-04-05 20:38:365/* eslint-disable rulesdir/no_underscored_properties */
6
Tim van der Lippec02a97c2020-02-14 14:39:277import * as Common from '../common/common.js'; // eslint-disable-line no-unused-vars
Tim van der Lippee00b92f2021-03-31 16:52:178import * as SDK from '../core/sdk/sdk.js';
Tim van der Lippe10021352020-02-13 15:59:219import * as UI from '../ui/ui.js'; // eslint-disable-line no-unused-vars
10
Jan Schefflerb4eb22d2021-04-05 20:38:3611export class ExecutionContextSelector implements SDK.SDKModel.SDKModelObserver<SDK.RuntimeModel.RuntimeModel> {
12 _targetManager: SDK.SDKModel.TargetManager;
13 _context: UI.Context.Context;
14 _lastSelectedContextId?: string;
15 _ignoreContextChanged?: boolean;
16
17 constructor(targetManager: SDK.SDKModel.TargetManager, context: UI.Context.Context) {
Tim van der Lippe10021352020-02-13 15:59:2118 context.addFlavorChangeListener(SDK.RuntimeModel.ExecutionContext, this._executionContextChanged, this);
19 context.addFlavorChangeListener(SDK.SDKModel.Target, this._targetChanged, this);
Blink Reformat4c46d092018-04-07 15:32:3720
21 targetManager.addModelListener(
Tim van der Lippe10021352020-02-13 15:59:2122 SDK.RuntimeModel.RuntimeModel, SDK.RuntimeModel.Events.ExecutionContextCreated, this._onExecutionContextCreated,
Blink Reformat4c46d092018-04-07 15:32:3723 this);
Tim van der Lippe10021352020-02-13 15:59:2124 targetManager.addModelListener(
25 SDK.RuntimeModel.RuntimeModel, SDK.RuntimeModel.Events.ExecutionContextDestroyed,
26 this._onExecutionContextDestroyed, this);
27 targetManager.addModelListener(
28 SDK.RuntimeModel.RuntimeModel, SDK.RuntimeModel.Events.ExecutionContextOrderChanged,
29 this._onExecutionContextOrderChanged, this);
Blink Reformat4c46d092018-04-07 15:32:3730 this._targetManager = targetManager;
31 this._context = context;
Tim van der Lippe10021352020-02-13 15:59:2132 targetManager.observeModels(SDK.RuntimeModel.RuntimeModel, this);
Blink Reformat4c46d092018-04-07 15:32:3733 }
34
Jan Schefflerb4eb22d2021-04-05 20:38:3635 modelAdded(runtimeModel: SDK.RuntimeModel.RuntimeModel): void {
Blink Reformat4c46d092018-04-07 15:32:3736 // Defer selecting default target since we need all clients to get their
37 // targetAdded notifications first.
Mathias Bynensa0d60452020-11-30 11:45:3338 queueMicrotask(deferred.bind(this));
Blink Reformat4c46d092018-04-07 15:32:3739
Jan Schefflerb4eb22d2021-04-05 20:38:3640 function deferred(this: ExecutionContextSelector): void {
Blink Reformat4c46d092018-04-07 15:32:3741 // We always want the second context for the service worker targets.
Tim van der Lippe10021352020-02-13 15:59:2142 if (!this._context.flavor(SDK.SDKModel.Target)) {
43 this._context.setFlavor(SDK.SDKModel.Target, runtimeModel.target());
Tim van der Lippe1d6e57a2019-09-30 11:55:3444 }
Blink Reformat4c46d092018-04-07 15:32:3745 }
46 }
47
Jan Schefflerb4eb22d2021-04-05 20:38:3648 modelRemoved(runtimeModel: SDK.RuntimeModel.RuntimeModel): void {
Tim van der Lippe10021352020-02-13 15:59:2149 const currentExecutionContext = this._context.flavor(SDK.RuntimeModel.ExecutionContext);
Tim van der Lippe1d6e57a2019-09-30 11:55:3450 if (currentExecutionContext && currentExecutionContext.runtimeModel === runtimeModel) {
Blink Reformat4c46d092018-04-07 15:32:3751 this._currentExecutionContextGone();
Tim van der Lippe1d6e57a2019-09-30 11:55:3452 }
Blink Reformat4c46d092018-04-07 15:32:3753
Tim van der Lippe10021352020-02-13 15:59:2154 const models = this._targetManager.models(SDK.RuntimeModel.RuntimeModel);
55 if (this._context.flavor(SDK.SDKModel.Target) === runtimeModel.target() && models.length) {
56 this._context.setFlavor(SDK.SDKModel.Target, models[0].target());
Tim van der Lippe1d6e57a2019-09-30 11:55:3457 }
Blink Reformat4c46d092018-04-07 15:32:3758 }
59
Jan Schefflerb4eb22d2021-04-05 20:38:3660 _executionContextChanged(event: Common.EventTarget.EventTargetEvent): void {
61 const newContext = (event.data as SDK.RuntimeModel.ExecutionContext | null);
Blink Reformat4c46d092018-04-07 15:32:3762 if (newContext) {
Tim van der Lippe10021352020-02-13 15:59:2163 this._context.setFlavor(SDK.SDKModel.Target, newContext.target());
Tim van der Lippe1d6e57a2019-09-30 11:55:3464 if (!this._ignoreContextChanged) {
Blink Reformat4c46d092018-04-07 15:32:3765 this._lastSelectedContextId = this._contextPersistentId(newContext);
Tim van der Lippe1d6e57a2019-09-30 11:55:3466 }
Blink Reformat4c46d092018-04-07 15:32:3767 }
68 }
69
Jan Schefflerb4eb22d2021-04-05 20:38:3670 _contextPersistentId(executionContext: SDK.RuntimeModel.ExecutionContext): string {
Blink Reformat4c46d092018-04-07 15:32:3771 return executionContext.isDefault ? executionContext.target().name() + ':' + executionContext.frameId : '';
72 }
73
Jan Schefflerb4eb22d2021-04-05 20:38:3674 _targetChanged(event: Common.EventTarget.EventTargetEvent): void {
75 const newTarget = (event.data as SDK.SDKModel.Target | null);
Tim van der Lippe10021352020-02-13 15:59:2176 const currentContext = this._context.flavor(SDK.RuntimeModel.ExecutionContext);
Blink Reformat4c46d092018-04-07 15:32:3777
Tim van der Lippe1d6e57a2019-09-30 11:55:3478 if (!newTarget || (currentContext && currentContext.target() === newTarget)) {
Blink Reformat4c46d092018-04-07 15:32:3779 return;
Tim van der Lippe1d6e57a2019-09-30 11:55:3480 }
Blink Reformat4c46d092018-04-07 15:32:3781
Tim van der Lippe10021352020-02-13 15:59:2182 const runtimeModel = newTarget.model(SDK.RuntimeModel.RuntimeModel);
Blink Reformat4c46d092018-04-07 15:32:3783 const executionContexts = runtimeModel ? runtimeModel.executionContexts() : [];
Tim van der Lippe1d6e57a2019-09-30 11:55:3484 if (!executionContexts.length) {
Blink Reformat4c46d092018-04-07 15:32:3785 return;
Tim van der Lippe1d6e57a2019-09-30 11:55:3486 }
Blink Reformat4c46d092018-04-07 15:32:3787
Jan Schefflerb4eb22d2021-04-05 20:38:3688 let newContext: SDK.RuntimeModel.ExecutionContext|null = null;
Blink Reformat4c46d092018-04-07 15:32:3789 for (let i = 0; i < executionContexts.length && !newContext; ++i) {
Tim van der Lippe1d6e57a2019-09-30 11:55:3490 if (this._shouldSwitchToContext(executionContexts[i])) {
Blink Reformat4c46d092018-04-07 15:32:3791 newContext = executionContexts[i];
Tim van der Lippe1d6e57a2019-09-30 11:55:3492 }
Blink Reformat4c46d092018-04-07 15:32:3793 }
94 for (let i = 0; i < executionContexts.length && !newContext; ++i) {
Tim van der Lippe1d6e57a2019-09-30 11:55:3495 if (this._isDefaultContext(executionContexts[i])) {
Blink Reformat4c46d092018-04-07 15:32:3796 newContext = executionContexts[i];
Tim van der Lippe1d6e57a2019-09-30 11:55:3497 }
Blink Reformat4c46d092018-04-07 15:32:3798 }
99 this._ignoreContextChanged = true;
Tim van der Lippe10021352020-02-13 15:59:21100 this._context.setFlavor(SDK.RuntimeModel.ExecutionContext, newContext || executionContexts[0]);
Blink Reformat4c46d092018-04-07 15:32:37101 this._ignoreContextChanged = false;
102 }
103
Jan Schefflerb4eb22d2021-04-05 20:38:36104 _shouldSwitchToContext(executionContext: SDK.RuntimeModel.ExecutionContext): boolean {
Tim van der Lippe1d6e57a2019-09-30 11:55:34105 if (this._lastSelectedContextId && this._lastSelectedContextId === this._contextPersistentId(executionContext)) {
Blink Reformat4c46d092018-04-07 15:32:37106 return true;
Tim van der Lippe1d6e57a2019-09-30 11:55:34107 }
108 if (!this._lastSelectedContextId && this._isDefaultContext(executionContext)) {
Blink Reformat4c46d092018-04-07 15:32:37109 return true;
Tim van der Lippe1d6e57a2019-09-30 11:55:34110 }
Blink Reformat4c46d092018-04-07 15:32:37111 return false;
112 }
113
Jan Schefflerb4eb22d2021-04-05 20:38:36114 _isDefaultContext(executionContext: SDK.RuntimeModel.ExecutionContext): boolean {
Tim van der Lippe1d6e57a2019-09-30 11:55:34115 if (!executionContext.isDefault || !executionContext.frameId) {
Blink Reformat4c46d092018-04-07 15:32:37116 return false;
Tim van der Lippe1d6e57a2019-09-30 11:55:34117 }
118 if (executionContext.target().parentTarget()) {
Blink Reformat4c46d092018-04-07 15:32:37119 return false;
Tim van der Lippe1d6e57a2019-09-30 11:55:34120 }
Tim van der Lippe10021352020-02-13 15:59:21121 const resourceTreeModel = executionContext.target().model(SDK.ResourceTreeModel.ResourceTreeModel);
Blink Reformat4c46d092018-04-07 15:32:37122 const frame = resourceTreeModel && resourceTreeModel.frameForId(executionContext.frameId);
Tim van der Lippe1d6e57a2019-09-30 11:55:34123 if (frame && frame.isTopFrame()) {
Blink Reformat4c46d092018-04-07 15:32:37124 return true;
Tim van der Lippe1d6e57a2019-09-30 11:55:34125 }
Blink Reformat4c46d092018-04-07 15:32:37126 return false;
127 }
128
Jan Schefflerb4eb22d2021-04-05 20:38:36129 _onExecutionContextCreated(event: Common.EventTarget.EventTargetEvent): void {
130 this._switchContextIfNecessary((event.data as SDK.RuntimeModel.ExecutionContext));
Blink Reformat4c46d092018-04-07 15:32:37131 }
132
Jan Schefflerb4eb22d2021-04-05 20:38:36133 _onExecutionContextDestroyed(event: Common.EventTarget.EventTargetEvent): void {
134 const executionContext = (event.data as SDK.RuntimeModel.ExecutionContext);
Tim van der Lippe10021352020-02-13 15:59:21135 if (this._context.flavor(SDK.RuntimeModel.ExecutionContext) === executionContext) {
Blink Reformat4c46d092018-04-07 15:32:37136 this._currentExecutionContextGone();
Tim van der Lippe1d6e57a2019-09-30 11:55:34137 }
Blink Reformat4c46d092018-04-07 15:32:37138 }
139
Jan Schefflerb4eb22d2021-04-05 20:38:36140 _onExecutionContextOrderChanged(event: Common.EventTarget.EventTargetEvent): void {
141 const runtimeModel = (event.data as SDK.RuntimeModel.RuntimeModel);
Blink Reformat4c46d092018-04-07 15:32:37142 const executionContexts = runtimeModel.executionContexts();
143 for (let i = 0; i < executionContexts.length; i++) {
Tim van der Lippe1d6e57a2019-09-30 11:55:34144 if (this._switchContextIfNecessary(executionContexts[i])) {
Blink Reformat4c46d092018-04-07 15:32:37145 break;
Tim van der Lippe1d6e57a2019-09-30 11:55:34146 }
Blink Reformat4c46d092018-04-07 15:32:37147 }
148 }
149
Jan Schefflerb4eb22d2021-04-05 20:38:36150 _switchContextIfNecessary(executionContext: SDK.RuntimeModel.ExecutionContext): boolean {
Tim van der Lippe10021352020-02-13 15:59:21151 if (!this._context.flavor(SDK.RuntimeModel.ExecutionContext) || this._shouldSwitchToContext(executionContext)) {
Blink Reformat4c46d092018-04-07 15:32:37152 this._ignoreContextChanged = true;
Tim van der Lippe10021352020-02-13 15:59:21153 this._context.setFlavor(SDK.RuntimeModel.ExecutionContext, executionContext);
Blink Reformat4c46d092018-04-07 15:32:37154 this._ignoreContextChanged = false;
155 return true;
156 }
157 return false;
158 }
159
Jan Schefflerb4eb22d2021-04-05 20:38:36160 _currentExecutionContextGone(): void {
Tim van der Lippe10021352020-02-13 15:59:21161 const runtimeModels = this._targetManager.models(SDK.RuntimeModel.RuntimeModel);
Jan Schefflerb4eb22d2021-04-05 20:38:36162 let newContext: SDK.RuntimeModel.ExecutionContext|null = null;
Blink Reformat4c46d092018-04-07 15:32:37163 for (let i = 0; i < runtimeModels.length && !newContext; ++i) {
164 const executionContexts = runtimeModels[i].executionContexts();
165 for (const executionContext of executionContexts) {
166 if (this._isDefaultContext(executionContext)) {
167 newContext = executionContext;
168 break;
169 }
170 }
171 }
172 if (!newContext) {
173 for (let i = 0; i < runtimeModels.length && !newContext; ++i) {
174 const executionContexts = runtimeModels[i].executionContexts();
175 if (executionContexts.length) {
176 newContext = executionContexts[0];
177 break;
178 }
179 }
180 }
181 this._ignoreContextChanged = true;
Tim van der Lippe10021352020-02-13 15:59:21182 this._context.setFlavor(SDK.RuntimeModel.ExecutionContext, newContext);
Blink Reformat4c46d092018-04-07 15:32:37183 this._ignoreContextChanged = false;
184 }
Paul Lewisc1d99fa2019-12-10 16:26:28185}