aboutsummaryrefslogtreecommitdiffstats
path: root/src/electron/webview-ime-focus.js
blob: e187ee0b4a107cb9c2baf1a45014f683838eeaa9 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
import { webContents } from '@electron/remote';
import { releaseDocumentFocus } from './webview-ime-focus-helpers';

function giveWebviewDocumentFocus(element) {
  releaseDocumentFocus();

  window.requestAnimationFrame(() => {
    element.send('claim-document-focus');
  });
}

function elementIsUnfocusedWebview(element) {
  return element.tagName === 'WEBVIEW' && !webContents.fromId(element.getWebContentsId()).isFocused();
}

function webviewDidAutofocus(element) {
  function didKeyDown() {
    element.removeEventListener('keydown', didKeyDown, true);
    giveWebviewDocumentFocus(element);
  }

  element.addEventListener('keydown', didKeyDown, true);
}

function handleAutofocus(element) {
  element.addEventListener('ipc-message', (event) => {
    if (event.channel === 'autofocus') {
      element.focus();
      webviewDidAutofocus(element);
    }
  });
}

function didMouseDown(event) {
  if (elementIsUnfocusedWebview(event.target)) {
    giveWebviewDocumentFocus(event.target);
  }
}

document.addEventListener('mousedown', didMouseDown, true);
document.querySelectorAll('webview').forEach(handleAutofocus);