inspector.ts 1.8 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344
  1. import { internalContextBridge } from '@electron/internal/renderer/api/context-bridge';
  2. import { ipcRendererInternal } from '@electron/internal/renderer/ipc-renderer-internal';
  3. import * as ipcRendererUtils from '@electron/internal/renderer/ipc-renderer-internal-utils';
  4. import { webFrame } from 'electron/renderer';
  5. import { IPC_MESSAGES } from '@electron/internal/common/ipc-messages';
  6. const { contextIsolationEnabled } = internalContextBridge;
  7. /* Corrects for some Inspector adaptations needed in Electron.
  8. * 1) Use menu API to show context menu.
  9. */
  10. window.onload = function () {
  11. if (contextIsolationEnabled) {
  12. internalContextBridge.overrideGlobalValueFromIsolatedWorld([
  13. 'InspectorFrontendHost', 'showContextMenuAtPoint'
  14. ], createMenu);
  15. } else {
  16. window.InspectorFrontendHost!.showContextMenuAtPoint = createMenu;
  17. }
  18. };
  19. // The DOM implementation expects (message?: string) => boolean
  20. window.confirm = function (message?: string, title?: string) {
  21. return ipcRendererUtils.invokeSync(IPC_MESSAGES.INSPECTOR_CONFIRM, message, title) as boolean;
  22. };
  23. const useEditMenuItems = function (x: number, y: number, items: ContextMenuItem[]) {
  24. return items.length === 0 && document.elementsFromPoint(x, y).some(element => {
  25. return element.nodeName === 'INPUT' ||
  26. element.nodeName === 'TEXTAREA' ||
  27. (element as HTMLElement).isContentEditable;
  28. });
  29. };
  30. const createMenu = function (x: number, y: number, items: ContextMenuItem[]) {
  31. const isEditMenu = useEditMenuItems(x, y, items);
  32. ipcRendererInternal.invoke<number>(IPC_MESSAGES.INSPECTOR_CONTEXT_MENU, items, isEditMenu).then(id => {
  33. if (typeof id === 'number') {
  34. webFrame.executeJavaScript(`window.DevToolsAPI.contextMenuItemSelected(${JSON.stringify(id)})`);
  35. }
  36. webFrame.executeJavaScript('window.DevToolsAPI.contextMenuCleared()');
  37. });
  38. };