web-view-init.ts 1.3 KB

123456789101112131415161718192021222324252627282930313233343536
  1. import { ipcRendererInternal } from '@electron/internal/renderer/ipc-renderer-internal'
  2. const v8Util = process.electronBinding('v8_util')
  3. function handleFocusBlur (guestInstanceId: number) {
  4. // Note that while Chromium content APIs have observer for focus/blur, they
  5. // unfortunately do not work for webview.
  6. window.addEventListener('focus', () => {
  7. ipcRendererInternal.send('ELECTRON_GUEST_VIEW_MANAGER_FOCUS_CHANGE', true, guestInstanceId)
  8. })
  9. window.addEventListener('blur', () => {
  10. ipcRendererInternal.send('ELECTRON_GUEST_VIEW_MANAGER_FOCUS_CHANGE', false, guestInstanceId)
  11. })
  12. }
  13. export function webViewInit (
  14. contextIsolation: boolean, webviewTag: ElectronInternal.WebViewElement, guestInstanceId: number
  15. ) {
  16. // Don't allow recursive `<webview>`.
  17. if (webviewTag && guestInstanceId == null) {
  18. const { webViewImplModule } = require('@electron/internal/renderer/web-view/web-view-impl')
  19. if (contextIsolation) {
  20. v8Util.setHiddenValue(window, 'web-view-impl', webViewImplModule)
  21. } else {
  22. const { setupWebView } = require('@electron/internal/renderer/web-view/web-view-element')
  23. setupWebView(v8Util, webViewImplModule)
  24. }
  25. }
  26. if (guestInstanceId) {
  27. // Report focus/blur events of webview to browser.
  28. handleFocusBlur(guestInstanceId)
  29. }
  30. }