aboutsummaryrefslogtreecommitdiffstats
path: root/src/electron/webview-ime-focus.js
diff options
context:
space:
mode:
Diffstat (limited to 'src/electron/webview-ime-focus.js')
-rw-r--r--src/electron/webview-ime-focus.js40
1 files changed, 40 insertions, 0 deletions
diff --git a/src/electron/webview-ime-focus.js b/src/electron/webview-ime-focus.js
new file mode 100644
index 000000000..1213b518e
--- /dev/null
+++ b/src/electron/webview-ime-focus.js
@@ -0,0 +1,40 @@
1const { releaseDocumentFocus } = require('./webview-ime-focus-helpers');
2
3function giveWebviewDocumentFocus(element) {
4 releaseDocumentFocus();
5
6 window.requestAnimationFrame(() => {
7 element.send('claim-document-focus');
8 });
9}
10
11function elementIsUnfocusedWebview(element) {
12 return element.tagName === 'WEBVIEW' && !element.getWebContents().isFocused();
13}
14
15function webviewDidAutofocus(element) {
16 function didKeyDown() {
17 element.removeEventListener('keydown', didKeyDown, true);
18 giveWebviewDocumentFocus(element);
19 }
20
21 element.addEventListener('keydown', didKeyDown, true);
22}
23
24function handleAutofocus(element) {
25 element.addEventListener('ipc-message', (event) => {
26 if (event.channel === 'autofocus') {
27 element.focus();
28 webviewDidAutofocus(element);
29 }
30 });
31}
32
33function didMouseDown(event) {
34 if (elementIsUnfocusedWebview(event.target)) {
35 giveWebviewDocumentFocus(event.target);
36 }
37}
38
39document.addEventListener('mousedown', didMouseDown, true);
40document.querySelectorAll('webview').forEach(handleAutofocus);