Steps to Reproduce:
Hello World command.f key of the keyboard.window focused! message shown.f.keyboard F typed! shown.
import * as vscode from 'vscode';
export function activate(context: vscode.ExtensionContext) {
const rootUrl = vscode.Uri.file(context.extensionPath)
const disposable = vscode.commands.registerCommand('extension.helloWorld', async (args, brgs, crgs) => {
if (!vscode.window.activeTextEditor) {
return;
}
const panel = vscode.window.createWebviewPanel(
'catCoding',
'Cat Coding',
{ preserveFocus: true, viewColumn: vscode.ViewColumn.Beside },
{ enableScripts: true }
);
panel.webview.html = getHtml();
});
context.subscriptions.push(disposable);
}
function getHtml() {
return `
<!DOCTYPE html><html><head></head>
<body>
<script>
window.onfocus = function() {
console.log('window focused!');
}
window.addEventListener('keydown', function(evt) {
if(evt.keyCode == 70 && evt.target.nodeName != 'INPUT') {
console.log('keyboard F typed!')
}
})
</script>
`
}
// this method is called when your extension is deactivated
export function deactivate() {}
Does this issue occur when all extensions are disabled?: Yes
I am having the same issue with the Ungit extension.
Any updates on this? If it's any help, I don't experience this bug on my Ubuntu machine, but it does occur on my Mac, so could be something specific to that build.
That makes it an even more interesting bug/gremlin, as I can reproduce it on Manjaro Linux, KUbuntu 18.04, Ubuntu 18.04 and Windows 10. If you running a Ubuntu build and it's not affecting you, that may make it even harder to track down.
Just to be clear, if you open whatever WebViewPanel based extension you're using (you don't say which), click on some onscreen element of VSCode - editor window, menubar, activity sidebar, etc, and then click back on the WebViewPanel and try to enter text, it does get captured in the WebViewPanel for you? The key aspect here is input focus - if you click on some element of VSCode, and back on the WebViewPanel, it doesn't regain input focus - it stays with whatever you clicked on previously.
So I'm getting this bug with LaTeX-Workshop: James-Yu/LaTeX-Workshop#1481. When switching to view the pdf on a Mac via command+2, all shortcuts within VSCode seem to no longer work. What makes this even nastier is that it sometimes only happens after switching TWICE (i.e. I can go from pdf to tex to pdf via command+1 and command+2 but it eventually gets stuck focused on the pdf). I believe this focus issue is the underlying problem with the bug, as referenced earlier. Strangely, I don't experience this on Ubuntu at all.
@mjbvz do you have any updates here? We over million installs of our PlatformIO IDE extension and this issue blocks https://github.com/platformio/platformio-vscode-ide/issues/892
PRs welcome. The webview code lives here: https://github.com/microsoft/vscode/blob/02702327c1fea8b6c6425b84adb004c41cb84769/src/vs/workbench/contrib/webview/electron-browser/webviewElement.ts#L266
I've narrowed it down to changes introduced between the June 2nd and June 5th VS Code Insiders builds. A couple unfortunate details have made this hard to track down further:
It's likely the root cause is either in the proprietary additions or in some build process or environment change between those two dates, but I can't access either to try to fix the issue
6/2 Insiders build (good) commit: a848f18df4efa9eb947bd01cbebcede418e66148
6/5 Insiders build (bad) commit: fc294b683d88fe607d9456bc1bf774ad1d4a7ce6
@txase Thanks for the investigation.
We upgraded from electron 3 to electron 4 between those two commits which seems suspect. When building from master, did you do a full build (including yarn install) at those checkpoints?
Also, if this is electron related, can you try our our electron 6 exploration builds to see if that fixes the problem.
@mjbvz Here's the steps I took:
$ git clone [email protected]:microsoft/vscode.git
$ yarn
$ scripts/code.sh
I also tried running yarn run gulp vscode-darwin and yarn run gulp vscode-darwin-min to see if the app packages they produced exhibit the bug. Unfortunately, they don't.
I also tried the electron 6 exploration build you linked. It also has the bug.
One thing that would be interesting to try: Are you able to re-build the 6/2 commit of the insiders edition? If it had the bug after being rebuilt, then it would point to a change in the build pipeline having caused the issue. If it doesn't have the bug, then it is a problem in the source code somewhere (OSS or proprietary).
@mjbvz If it helps, here's a reproducible set of steps to see the issue using our extension:
template.yaml with the following inside:yaml
AWSTemplateFormatVersion: 2010-09-09
Transform: AWS::Serverless-2016-10-31
Resources:
Table:
Type: AWS::DynamoDB::Table
Properties:
AttributeDefinitions:
- AttributeName: id
AttributeType: S
KeySchema:
- AttributeName: id
KeyType: HASH
It's possible to fix the focus state by double clicking on the canvas editor tab.
Here's a video showing the above:

We include a few extra files before shipping but it's not really that much code. I just tested a oss-style build that includes this proprietary code and it works fine, so I don't believe that is the problem.
However we do also use a custom electron build for security and maintainability reasons. @deepak1556 Are you aware of anything in our electron build related to webviews? Do we enable or disable enable features vs a normal electron build? Is it possible to swap in our custom electron build to check this?
The other possibility is that code optimization for production builds is somehow changing the code, which has been known to happen before (https://github.com/microsoft/vscode/issues/79433). @bpasero I know you faced this issue, how did you track it down? Can @txase easily create a minimized oss build to test this? Is it just:
yarn gulp compile-build
yarn gulp compile-extensions-build
yarn gulp minify-vscode
@mjbvz there are no feature differences wrt webview between the custom build and official build. They can swapped to test.
@mjbvz in my case it was a pretty obvious exception that happened because our minifier was not supporting a statement in a finally block, not sure you have that here.
But yeah, you can easily build from the command line by running the same gulp task our build machine runs, e.g. yarn gulp vscode-darwin-min for macOS or yarn gulp vscode-linux-x64 for linux.
You can easily swap out the Electron version, by doing this:
./Electron ./out/mainThis will start Electron with our main entry point.
@mjbvz @bpasero I've tried yarn gulp vscode-darwin-min, but that didn't reproduce the issue.
Where would I download the version of Electron that you use in the VS Code builds so I can test it out?
@txase you can literally do the same by downloading VSCode and cd into it to find our executable and start the main entry point with it.
@bpasero When I do that, running Electron out/main simply opens up the file out/main in the VS Code editor as though it is an argument (i.e. it's equivalent to running code out/main from the command line). It doesn't execute the code of out/main.js.
@txase ok then try with this download
@bpasero Thanks. I can repo this bug using our electron build. Here's what I ran:
$/Users/matb/Downloads/electron-v4/Electron.app/Contents/MacOS/Electron out/main.js
I can't repo when I run:
./.build/electron/Code\ -\ OSS.app/Contents/MacOS/Electron out/main.js
@mjbvz are you using 4.2.10 running from master? asking because we just merged the update and my link was with that version.
I confirmed I was using electron v4.2.10 in both cases. Using the electron download you linked to, I see the bug. Using the electron version we download for the OSS build, I do not
@bpasero Can you describe how the official electron build differs? Is there any way to view any patches or build flag differences? We're happy to help investigate the root cause if we know how the electron executable is built :).
@deepak1556 can answer that
@deepak1556 @bpasero @mjbvz Any updates? Or any way to provide info on how the electron build is produced so we can help resolve this issue for our users?
Thanks!
@txase the only difference in the officially build is that it has v8_untrusted_code_mitigations=false https://cs.chromium.org/chromium/src/v8/BUILD.gn?l=176, not sure if this will cause the difference in behavior thats being observed here. I am creating a build which enables this back, will have further updates tomorrow. Thanks!
@deepak1556 I wouldn't think that switch would be likely to cause issues, but who knows. What did you find in your testing?
Hi @deepak1556, any way I can help debug this issue? :pray:
Sorry for the delayed response, I tried with https://github.com/microsoft/vscode/pull/81644 that has the v8 flags aligned with OSS version, but the problem was visible in OSS version as well with repro steps https://github.com/microsoft/vscode/issues/76863#issuecomment-525947246, @txase can you confirm this ? Thanks!
The corresponding insider build for this version will be available tomorrow, we can test that as well. But now I highly doubt its due to build difference because the issue is visible in OSS version.
I can confirm the issue does not happen in current master but does happen with that branch. That gives us something to work with. 馃檹
It was still strange to see that the private build of electron 4 was showing the same behavior. Is it possible that the current electron 4 private build process for vscode is using an updated build mechanism from later releases of electron?
Is there any update on this issue? It's currently affecting any extension that uses a webview.
This issue is super-annoying in PlatformIO (VScode extension). And it has been there waaaay too long ;-)
Any updates on this?
I've made some progress on this issue, though it's unclear still exactly why this is occurring only in VSCode vs in Chrome. I sent an email to two Chromium maintainers who work on the relevant bits hoping to get their take. For those curious, here's what I sent them:
This summer, VSCode upgraded from Electron 4 to Electron 6, which enabled OOPIFs. This change has broken focus-on-mouse-click for all VSCode WebView extensions (https://github.com/microsoft/vscode/issues/76863).
I built debug versions of Electron 4 and 6 to figure out why focusing isn't working. I found that in Electron 6, when a mouse clicks in the iframe we hit test and end up calling WebContentsImpl::FocusOwningWebContents on the OOPIF's render widget host. The problem is when that method calls WebContentsImpl::GetFocusedRenderWidgetHost the first check performed is to determine if the render widget host matches the main frame's render widget host. Because this is an OOPIF, it has a different render widget host, and the default return value ends up causing WebContentsImpl::FocusOwningWebContents to skip focusing the page.
I don't understand why this isn't an issue in Chrome (I tested it at http://csreis.github.io/tests/cross-site-iframe-simple.html). That said, I have a hunch that with OOPIFs this main frame check is incorrect. Based on the comment above the check, I wonder if instead of checking whether the receiving widget is the main frame it should check whether the receiving widget is a frame type (vs a select pop-up menu). I can confirm that commenting out this check makes VSCode extensions work.
Am I on the right track here? Any thoughts on why this is only broken in VSCode/Electron and not Chrome?
Chromium issue filed here: https://bugs.chromium.org/p/chromium/issues/detail?id=1026056
The fix for Chromium has been merged to master: https://github.com/chromium/chromium/commit/c4f0a725ff5bc078ccdf43e60b2b455ce4efafa8 馃帀. It will be released in Chromium M80.
@deepak1556 @mjbvz @bpasero Is it possible for you to apply this patch to the Electron sources when you build for the next release? 馃檹
@txase https://github.com/electron/electron/pull/21219 , thanks for following up on this on chromium end.
@txase the fix is now available in latest insiders
I already checked earlier today. Works beautifully! 馃檹
Most helpful comment
The fix for Chromium has been merged to master: https://github.com/chromium/chromium/commit/c4f0a725ff5bc078ccdf43e60b2b455ce4efafa8 馃帀. It will be released in Chromium M80.
@deepak1556 @mjbvz @bpasero Is it possible for you to apply this patch to the Electron sources when you build for the next release? 馃檹