-
Notifications
You must be signed in to change notification settings - Fork 29.5k
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
Better UI extensibility: retain webviews, provide communication channel #28263
Comments
The design of VS Code is to not allow for UI extensions on that level but our API defined data contracts where extensions fill in data and the editor renderers it. In fact, extensions run in a separate, headless process to guarantee isolation. See https://code.visualstudio.com/docs/extensionAPI/patterns-and-principles#_our-approach-to-extensibility for all the details. |
Yes, I'm familiar with the existing policy and I am suggesting to extend it. I was thinking of making parts of Chrome DevTools work in VSCode environment as well (I'm TL of the Chrome DevTools team). And present UI extensibility model feels rather limiting. More than that, I can get pretty far with the existing policy:
But the experiences I create end up sub-optimal, at the expense of the user. If you think your longer term goal is to allow richer UI extensibility, I can look into the browser limitations that prevent you from getting there. Oopifs should allow security and performance isolation sufficient to run extensions in the UI without compromising your core experience. I know reparenting is not there, but it is more important if you are willing to get there. Alternatively, if at this point you are strong on not letting features such as Chrome's performance tooling into your framework as extensions, I'll drop the idea altogether. |
@pavelfeldman we are definitely interested in experiments in this area. I'll look into this in our side and I will get back to you. |
@pavelfeldman having the Chrome DevTools performance tooling available inside VS Code is very interesting to us. What do you think of the approach of pushing the integration as far as we can get with the current support and then we collaborate on improving the experience and the extension API. I suggest to start with an integration of the perf tools in an editor using the existing htmlPreview support. This is similar to what we did for the SQL extension. The SQL extension provides rich UI to present query results. The SQL externalizes the state into an express server. I'm adding some team members that can chime in if you are game to start on this and you have more questions: |
Ok, lets brainstorm more on this. As you have said, the document provider and preview command is a way of making custom UI but was definitely not designed for that. It is what its name implies, previewing a resource. We acknowledge that it's used for building UI and time to make this more official and supported will come. We had similar ideas, in short along those lines
An API could look like this interface Webview {
readonly name: string;
location: ViewColumn;
markup: string;
onDidReceiveMessage: Event<any>;
sendMessage(message: any): Thenable<any>;
dispose(): void;
}
export function createWebview(name: string): Webview; Reasons why we haven't pursued that idea yet are
In short, many questions and tradeoffs. @pavelfeldman - I'd like to hear your thoughts on this. |
Is this thing on the roadmap or it's not a priority right now? @egamma |
This issue totally blocks @platformio |
@petrbrzek this is our current roadmap. There are some UI API improvements on there, but opening up VS Code for general UI extensibility is not on our 6-12 month roadmap. With regard to WebView, given our focus on performance and stability, we will investigate intoBrowserViews. |
@ivankravets what is the @platformio scenario that is blocked? |
@egamma. @platformio has "PIO Home" web-based application written in React+Redux which developers use to manage embedded libraries, development platforms, and other things. PIO Home depends on backend server through WebSocket. We have different extensions for different IDEs including for VSCode. Each IDE's extension launches own instance of PIO Home Server in the background and waits for a connection from WebView/IFrame components. It takes 2-5secs for the first loading (establish WebSocket connection Currently, we recommend using PlatformIO IDE for Atom because it can keep an opened tab with PIO Home. VSCode destroys PIO Home (with Finally, we plan to move a lot of features to PIO Home which makes it portable between different IDEs including desktop browsers. Indeed, we need just the one option which will allow explaining VSCode to don't destroy our IFRAME. Thanks! |
Yeah, that unfortunate... Things run inside a |
@jrieken up to the editor to decide, when the tab gets hidden |
Hm, this actually happens when calling |
@jrieken isn't that against our principles in some way. We never sold the If we wanted to have a more stable |
I agree but this somehow became reality and I don't see a point in making it harder when there is already enough pain |
@jrieken maybe this becomes opt-in so that an extension can set a flag if a webview should survive editor changes? |
Actually one challenge will be that there could be multiple |
This could help us a lot while you are looking for a better solution! Thanks! |
Well, there is no better solution tbh. Yes, we can tweak the behaviour when a tab changes but as soon as webviews are re-arranged (and thereby reparented) a restart will happen. We cannot change that unfortunately and I'd recommend to keep more state inside your server such that a reconnect is fast |
There is not the only problem with reconnecting. We need to re-paint whole React application according to the last state each time. It requires the seconds, not the milliseconds. It depends on user's machine too, need to load "index.html", init it and only after that try to connect to the end server... |
@pavelfeldman I just checked in a new proposed webview API that addresses many of your points: https://github.com/Microsoft/vscode/blob/70b41f0b2dffe69f848abc0434bea9d2d11350a7/src/vs/vscode.proposed.d.ts#L528 The proposal introduces an option to |
We can't wait to see this feature in the final release. We have over 100K downloads of our extennsion for the last months and each time users ask us about platformio/platformio-vscode-ide#32 |
Looks great! The |
Would the visibility events be modeled after https://developer.mozilla.org/en-US/docs/Web/API/Page_Visibility_API @mattbierner? I assume the postMessage is modeled after https://developer.mozilla.org/en-US/docs/Web/API/Window/postMessage |
* Promote webview Api to stable Fixes #43713 Fixes #28263 * Rename position back to viewColumn and mark viewColumn as deprecated This allows us to more easily re-introduce a `position` property once we have gridlayout * Move dispose methods onto webview itself Also better hide a few 'internal' methods / properties on the panel / webview * Revert "Move dispose methods onto webview itself" This reverts commit 8fab6cc. * Move title onto webview panel * Use _ names for private setters * Remove unused emitter and dispose onMessageEmitter * Preview internal emitters with _
I was looking at porting some of the Chrome DevTools features over to VSCode: timeline / profiler to start with, maybe elements / sidebar.
All my controls have rich UI that I would like to surface either as editors or as views in the console drawer. I was using
TextDocumentContentProvider
to render my content. Some of the limitations of the extensibility system I hit were:Webviews are re-created on switching editor tabs (removed from DOM?). That does not work for my rich stateful controls, would be nice to retain those. I know that reparenting is impossible with the regular iframes, not sure whether webview / oopif can make it work at this point. I can look into it on the browser side if you are interested in retaining them on your side. In Chrome DevTools we use the "hideOnDetach" trick for extensions where we remove elements from render tree, while retaining them in DOM to keep them alive.
Bi-directional communication channel between webview content and extension. I need to be able to post messages back and forth and existing uni-directional
href=command:
trick does not satisfy my use cases. A richer API that allows evaluating arbitrary strings (appending scripts) into webview would also be handy. I don't think these changes affect your security model, but they would enable us to do nice things.Contribute UI views next to Terminal and Console. For some of my controls it makes sense to surface them beside editor as an auxiliary or shell view.
The text was updated successfully, but these errors were encountered: