github.com/secoba/wails/v2@v2.6.4/internal/frontend/runtime/desktop/contextmenu.js (about)

     1  /*
     2  --default-contextmenu: auto; (default) will show the default context menu if contentEditable is true OR text has been selected OR element is input or textarea
     3  --default-contextmenu: show; will always show the default context menu
     4  --default-contextmenu: hide; will always hide the default context menu
     5  
     6  This rule is inherited like normal CSS rules, so nesting works as expected
     7  */
     8  export function processDefaultContextMenu(event) {
     9      // Process default context menu
    10      const element = event.target;
    11      const computedStyle = window.getComputedStyle(element);
    12      const defaultContextMenuAction = computedStyle.getPropertyValue("--default-contextmenu").trim();
    13      switch (defaultContextMenuAction) {
    14          case "show":
    15              return;
    16          case "hide":
    17              event.preventDefault();
    18              return;
    19          default:
    20              // Check if contentEditable is true
    21              if (element.isContentEditable) {
    22                  return;
    23              }
    24  
    25              // Check if text has been selected and action is on the selected elements
    26              const selection = window.getSelection();
    27              const hasSelection = (selection.toString().length > 0)
    28              if (hasSelection) {
    29                  for (let i = 0; i < selection.rangeCount; i++) {
    30                      const range = selection.getRangeAt(i);
    31                      const rects = range.getClientRects();
    32                      for (let j = 0; j < rects.length; j++) {
    33                          const rect = rects[j];
    34                          if (document.elementFromPoint(rect.left, rect.top) === element) {
    35                              return;
    36                          }
    37                      }
    38                  }
    39              }
    40              // Check if tagname is input or textarea
    41              if (element.tagName === "INPUT" || element.tagName === "TEXTAREA") {
    42                  if (hasSelection || (!element.readOnly && !element.disabled)) {
    43                      return;
    44                  }
    45              }
    46  
    47              // hide default context menu
    48              event.preventDefault();
    49      }
    50  }