Skip to content

Add experimental support for using iframes for webviews #100991

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 4 commits into from
Jun 25, 2020

Conversation

mjbvz
Copy link
Collaborator

@mjbvz mjbvz commented Jun 24, 2020

This changes enables using normal iframes to power webviews in desktop VS Code. Previously this required an internet connection so we could load the iframe content from an external webview. With this PR, we now use a new vscode-webview protocol so that we can load the webview content locally.

A new undocumented setting webview.experimental.useIframes that enables these using iframes for webviews.

@mjbvz mjbvz added this to the June 2020 milestone Jun 24, 2020
@mjbvz mjbvz requested review from rebornix and deepak1556 June 24, 2020 23:32
@mjbvz mjbvz self-assigned this Jun 24, 2020
@mjbvz
Copy link
Collaborator Author

mjbvz commented Jun 24, 2020

@rebornix You should be able to the new ElectronIframeWebview in notebooks

@@ -13,7 +13,7 @@ export const IWebviewManagerService = createDecorator<IWebviewManagerService>('w
export interface IWebviewManagerService {
_serviceBrand: unknown;

registerWebview(id: string, webContentsId: number, metadata: RegisterWebviewMetadata): Promise<void>;
registerWebview(id: string, webContentsId: number | undefined, metadata: RegisterWebviewMetadata): Promise<void>;
Copy link
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I need to figure out what the equivalent of webContentsId for iframe based webviews. We need this for intercepting the localhost request for remote

Copy link
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@deepak1556 Here is the problem I am trying to solve:

  1. For port forwarding in remote cases, we use a onBeforeRequest that looks at requests to localhost and potentially rewrites them

  2. There is a single onBeforeRequest handler for all webviews

  3. When using the <webview> tag, we were able to identify which webview was making the request to localhost using the web contents id. We would then use this id to lookup the port mapping information for that webview

  4. However iframes do not have a unique web contents id (at least, not by default) I cannot find any way to map a request that comes in to onBeforeRequest back to the webview that triggered the request.

Here are the fields I see on the details object in onBeforeRequest

Screen Shot 2020-06-24 at 5 01 02 PM

Any thoughts on how we could handle this mapping?

Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@mjbvz I can extend the webrequest api to provide some addtional event details that would include the frame origin and frame name, do you think its good enough to manage the port map ?

vscode-webview://787e559f-185c-4d86-aebc-400191530e52/...

<iframe name="test" >

then details will have

{
  isSubFrame: true, // if the request originated from a subframe
  origin: '787e559f-185c-4d86-aebc-400191530e52', // last committed origin of the frame
  name: 'test', // value of the name attribute for a subframe
  ....
}

Copy link
Collaborator Author

@mjbvz mjbvz Jun 25, 2020

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Yes that would work great for us here. Should I open a feature request against electron?

Copy link
Collaborator

@deepak1556 deepak1556 Jun 25, 2020

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Yes please do, I will put up a PR targeting it. Thanks!

Copy link
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Great! Opened electron/electron#24303 for this

@mjbvz mjbvz force-pushed the mjbvz/offline-iframe-webviews branch from 5ff3b28 to 63e22da Compare June 25, 2020 21:34
@mjbvz mjbvz merged commit 48c6e39 into master Jun 25, 2020
@mjbvz mjbvz deleted the mjbvz/offline-iframe-webviews branch June 25, 2020 21:52
@mjbvz
Copy link
Collaborator Author

mjbvz commented Jun 25, 2020

Merging the initial support so we can test it more. Desktop vscode will continue using webview unless you set webview.experimental.useIframes

@github-actions github-actions bot locked and limited conversation to collaborators Aug 9, 2020
Sign up for free to subscribe to this conversation on GitHub. Already have an account? Sign in.
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

2 participants