Skip to content

Commit 0b0fbc4

Browse files
authored
Make browser ownership mutable (#332038)
1 parent 22652e6 commit 0b0fbc4

4 files changed

Lines changed: 52 additions & 7 deletions

File tree

src/vs/platform/browserView/common/browserView.ts

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -511,6 +511,7 @@ export interface IBrowserViewService {
511511
onDynamicDidKeyCommand(id: string): Event<IBrowserViewKeyDownEvent>;
512512
onDynamicDidChangeTitle(id: string): Event<IBrowserViewTitleChangeEvent>;
513513
onDynamicDidChangeFavicon(id: string): Event<IBrowserViewFaviconChangeEvent>;
514+
onDynamicDidChangeOwner(id: string): Event<IBrowserViewOwner>;
514515
onDynamicDidFindInPage(id: string): Event<IBrowserViewFindInPageResult>;
515516
onDynamicDidClose(id: string): Event<void>;
516517
onDynamicDidSelectElement(id: string): Event<IElementData>;
@@ -543,6 +544,11 @@ export interface IBrowserViewService {
543544
*/
544545
destroyBrowserView(id: string): Promise<void>;
545546

547+
/**
548+
* Update the owner of an existing browser view.
549+
*/
550+
setOwner(id: string, owner: IBrowserViewOwner): Promise<void>;
551+
546552
/**
547553
* Get the state of an existing browser view by ID, or throw if it doesn't exist
548554
* @param id The browser view identifier

src/vs/platform/browserView/electron-main/browserView.ts

Lines changed: 18 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -57,6 +57,7 @@ export class BrowserView extends Disposable {
5757
readonly inspector: BrowserViewInspector;
5858

5959
private _ownerWindow: ICodeWindow;
60+
private _owner: IBrowserViewOwner;
6061
private _currentWindow: ICodeWindow | IAuxiliaryWindow | undefined;
6162
private _isDisposed = false;
6263
private _audiences: readonly IBrowserViewAudience[] = [];
@@ -99,6 +100,9 @@ export class BrowserView extends Disposable {
99100
private readonly _onDidChangeFavicon = this._register(new Emitter<IBrowserViewFaviconChangeEvent>());
100101
readonly onDidChangeFavicon: Event<IBrowserViewFaviconChangeEvent> = this._onDidChangeFavicon.event;
101102

103+
private readonly _onDidChangeOwner = this._register(new Emitter<IBrowserViewOwner>());
104+
readonly onDidChangeOwner: Event<IBrowserViewOwner> = this._onDidChangeOwner.event;
105+
102106
private readonly _onDidFindInPage = this._register(new Emitter<IBrowserViewFindInPageResult>());
103107
readonly onDidFindInPage: Event<IBrowserViewFindInPageResult> = this._onDidFindInPage.event;
104108

@@ -120,10 +124,10 @@ export class BrowserView extends Disposable {
120124
constructor(
121125
public readonly id: string,
122126
public readonly hostWindowId: number,
123-
public readonly owner: IBrowserViewOwner,
127+
owner: IBrowserViewOwner,
124128
public readonly associatedResource: URI | undefined,
125129
public readonly session: BrowserSession,
126-
private readonly _createChildView: (url: string, electronOptions: Electron.WebContentsViewConstructorOptions | undefined, editorOptions: IBrowserViewEditorOpenOptions) => BrowserView,
130+
private readonly _createChildView: (owner: IBrowserViewOwner, url: string, electronOptions: Electron.WebContentsViewConstructorOptions | undefined, editorOptions: IBrowserViewEditorOpenOptions) => BrowserView,
127131
openContextMenu: (view: BrowserView, params: Electron.ContextMenuParams) => void,
128132
options: Electron.WebContentsViewConstructorOptions | undefined,
129133
@IWindowsMainService private readonly windowsMainService: IWindowsMainService,
@@ -132,6 +136,7 @@ export class BrowserView extends Disposable {
132136
@ITelemetryService private readonly telemetryService: ITelemetryService,
133137
) {
134138
super();
139+
this._owner = owner;
135140

136141
const webPreferences: Electron.WebPreferences = {
137142
...options?.webPreferences,
@@ -204,7 +209,7 @@ export class BrowserView extends Disposable {
204209
}
205210
})());
206211

207-
const childView = this._createChildView(details.url, options, {
212+
const childView = this._createChildView(this.owner, details.url, options, {
208213
pinned: true,
209214
background: location === NewPageLocation.Background,
210215
parentViewId: id,
@@ -591,6 +596,15 @@ export class BrowserView extends Disposable {
591596
);
592597
}
593598

599+
get owner(): IBrowserViewOwner {
600+
return this._owner;
601+
}
602+
603+
setOwner(owner: IBrowserViewOwner): void {
604+
this._owner = owner;
605+
this._onDidChangeOwner.fire(owner);
606+
}
607+
594608
get webContents(): Electron.WebContents {
595609
return this._view.webContents;
596610
}
@@ -748,7 +762,7 @@ export class BrowserView extends Disposable {
748762
}
749763

750764
logBrowserOpen(this.telemetryService, 'browserLinkForeground');
751-
this._createChildView(url, undefined, {
765+
this._createChildView(this.owner, url, undefined, {
752766
pinned: true,
753767
parentViewId: this.id
754768
});

src/vs/platform/browserView/electron-main/browserViewMainService.ts

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -178,6 +178,10 @@ export class BrowserViewMainService extends Disposable implements IBrowserViewMa
178178
return this._getBrowserView(id).onDidChangeFavicon;
179179
}
180180

181+
onDynamicDidChangeOwner(id: string) {
182+
return this._getBrowserView(id).onDidChangeOwner;
183+
}
184+
181185
onDynamicDidFindInPage(id: string) {
182186
return this._getBrowserView(id).onDidFindInPage;
183187
}
@@ -238,6 +242,10 @@ export class BrowserViewMainService extends Disposable implements IBrowserViewMa
238242
return this.browserViews.deleteAndDispose(id);
239243
}
240244

245+
async setOwner(id: string, owner: IBrowserViewOwner): Promise<void> {
246+
this._getBrowserView(id).setOwner(owner);
247+
}
248+
241249
async layout(id: string, bounds: IBrowserViewBounds): Promise<void> {
242250
return this._getBrowserView(id).layout(bounds);
243251
}
@@ -441,10 +449,10 @@ export class BrowserViewMainService extends Disposable implements IBrowserViewMa
441449
associatedResource,
442450
browserSession,
443451
// Child views share their host, owner, and storage, but do not implicitly inherit agent access.
444-
(url, electronOptions, editorOptions) => {
452+
(childOwner, url, electronOptions, editorOptions) => {
445453
return this._createBrowserView(generateUuid(), {
446454
hostWindowId,
447-
owner,
455+
owner: childOwner,
448456
session: browserSession.id,
449457
initialUrl: url || undefined
450458
}, editorOptions, electronOptions);

src/vs/workbench/contrib/browserView/common/browserView.ts

Lines changed: 18 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -398,6 +398,7 @@ export interface IBrowserViewModel extends IDisposable {
398398
readonly onDidKeyCommand: Event<IBrowserViewKeyDownEvent>;
399399
readonly onDidChangeTitle: Event<IBrowserViewTitleChangeEvent>;
400400
readonly onDidChangeFavicon: Event<IBrowserViewFaviconChangeEvent>;
401+
readonly onDidChangeOwner: Event<IBrowserViewOwner>;
401402
readonly onDidFindInPage: Event<IBrowserViewFindInPageResult>;
402403
readonly onDidChangeVisibility: Event<IBrowserViewVisibilityEvent>;
403404
readonly onDidClose: Event<void>;
@@ -424,6 +425,7 @@ export interface IBrowserViewModel extends IDisposable {
424425
stopFindInPage(keepSelection?: boolean): Promise<void>;
425426
getSelectedText(): Promise<string>;
426427
clearStorage(): Promise<void>;
428+
setOwner(owner: IBrowserViewOwner): Promise<void>;
427429
setSharedWithAgent(shared: boolean): Promise<boolean>;
428430
trustCertificate(host: string, fingerprint: string): Promise<void>;
429431
untrustCertificate(host: string, fingerprint: string): Promise<void>;
@@ -442,6 +444,7 @@ export interface IBrowserViewModel extends IDisposable {
442444

443445
export class BrowserViewModel extends Disposable implements IBrowserViewModel {
444446
private _url: string = '';
447+
private _owner: IBrowserViewOwner;
445448
private _title: string = '';
446449
private _favicon: string | undefined = undefined;
447450
private _screenshot: VSBuffer | undefined = undefined;
@@ -483,7 +486,7 @@ export class BrowserViewModel extends Disposable implements IBrowserViewModel {
483486

484487
constructor(
485488
readonly id: string,
486-
readonly owner: IBrowserViewOwner,
489+
owner: IBrowserViewOwner,
487490
readonly associatedResource: URI | undefined,
488491
initialState: IBrowserViewState,
489492
private readonly browserViewService: IBrowserViewService,
@@ -496,6 +499,7 @@ export class BrowserViewModel extends Disposable implements IBrowserViewModel {
496499
@ILogService private readonly logService: ILogService,
497500
) {
498501
super();
502+
this._owner = owner;
499503

500504
// Initialize state
501505
this._url = initialState.url;
@@ -598,6 +602,10 @@ export class BrowserViewModel extends Disposable implements IBrowserViewModel {
598602
this._favicon = e.favicon;
599603
}));
600604

605+
this._register(this.onDidChangeOwner(owner => {
606+
this._owner = owner;
607+
}));
608+
601609
this._register(this.onDidChangeFocus(({ focused }) => {
602610
this._focused = focused;
603611
}));
@@ -638,6 +646,7 @@ export class BrowserViewModel extends Disposable implements IBrowserViewModel {
638646
}
639647

640648
get url(): string { return this._url; }
649+
get owner(): IBrowserViewOwner { return this._owner; }
641650
get title(): string { return this._title; }
642651
get favicon(): string | undefined { return this._favicon; }
643652
get loading(): boolean { return this._loading; }
@@ -692,6 +701,10 @@ export class BrowserViewModel extends Disposable implements IBrowserViewModel {
692701
return this.browserViewService.onDynamicDidChangeFavicon(this.id);
693702
}
694703

704+
get onDidChangeOwner(): Event<IBrowserViewOwner> {
705+
return this.browserViewService.onDynamicDidChangeOwner(this.id);
706+
}
707+
695708
get onDidFindInPage(): Event<IBrowserViewFindInPageResult> {
696709
return this.browserViewService.onDynamicDidFindInPage(this.id);
697710
}
@@ -784,6 +797,10 @@ export class BrowserViewModel extends Disposable implements IBrowserViewModel {
784797
return this.browserViewService.clearStorage(this.id);
785798
}
786799

800+
async setOwner(owner: IBrowserViewOwner): Promise<void> {
801+
return this.browserViewService.setOwner(this.id, owner);
802+
}
803+
787804
async trustCertificate(host: string, fingerprint: string): Promise<void> {
788805
return this.browserViewService.trustCertificate(this.id, host, fingerprint);
789806
}

0 commit comments

Comments
 (0)