tor-browser

The Tor Browser
git clone https://git.dasho.dev/tor-browser.git
Log | Files | Refs | README | LICENSE

browser-context.js (12182B)


      1 /* This Source Code Form is subject to the terms of the Mozilla Public
      2 * License, v. 2.0. If a copy of the MPL was not distributed with this
      3 * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
      4 
      5 document.addEventListener(
      6  "DOMContentLoaded",
      7  () => {
      8    const IS_WEBEXT_PANELS =
      9      document.documentElement.id === "webextpanels-window";
     10 
     11    const contextMenuPopup = document.getElementById("contentAreaContextMenu");
     12 
     13    // eslint-disable-next-line complexity
     14    contextMenuPopup.addEventListener("command", event => {
     15      switch (event.target.id) {
     16        case "context-viewsource-goToLine":
     17          gViewSourceUtils
     18            .getPageActor(gContextMenu.browser)
     19            .promptAndGoToLine();
     20          break;
     21        case "context-viewsource-wrapLongLines":
     22          Services.prefs.setBoolPref(
     23            "view_source.wrap_long_lines",
     24            !Services.prefs.getBoolPref("view_source.wrap_long_lines", false)
     25          );
     26          break;
     27        case "context-viewsource-highlightSyntax":
     28          Services.prefs.setBoolPref(
     29            "view_source.syntax_highlight",
     30            !Services.prefs.getBoolPref("view_source.syntax_highlight", false)
     31          );
     32          break;
     33        case "spell-add-to-dictionary":
     34          InlineSpellCheckerUI.addToDictionary();
     35          break;
     36        case "spell-undo-add-to-dictionary":
     37          InlineSpellCheckerUI.undoAddToDictionary();
     38          break;
     39        case "context-openlinkincurrent":
     40          gContextMenu.openLinkInCurrent();
     41          break;
     42        case "context-openlinkincontainertab":
     43        case "context-openlinkintab":
     44          gContextMenu.openLinkInTab(event);
     45          break;
     46        case "context-openlink":
     47          gContextMenu.openLink();
     48          break;
     49        case "context-openlinkprivate":
     50          gContextMenu.openLinkInPrivateWindow();
     51          break;
     52        case "context-bookmarklink":
     53          gContextMenu.bookmarkLink();
     54          break;
     55        case "context-savelink":
     56          gContextMenu.saveLink();
     57          break;
     58        case "context-copyemail":
     59          gContextMenu.copyEmail();
     60          break;
     61        case "context-copyphone":
     62          gContextMenu.copyPhone();
     63          break;
     64        case "context-copylink":
     65          gContextMenu.copyLink();
     66          break;
     67        case "context-previewlink":
     68          gContextMenu.previewLink();
     69          break;
     70        case "context-stripOnShareLink":
     71          gContextMenu.copyStrippedLink();
     72          break;
     73        case "context-media-play":
     74          gContextMenu.mediaCommand("play");
     75          break;
     76        case "context-media-pause":
     77          gContextMenu.mediaCommand("pause");
     78          break;
     79        case "context-media-mute":
     80          gContextMenu.mediaCommand("mute");
     81          break;
     82        case "context-media-unmute":
     83          gContextMenu.mediaCommand("unmute");
     84          break;
     85        case "context-media-playbackrate-050x":
     86          gContextMenu.mediaCommand("playbackRate", 0.5);
     87          break;
     88        case "context-media-playbackrate-100x":
     89          gContextMenu.mediaCommand("playbackRate", 1.0);
     90          break;
     91        case "context-media-playbackrate-125x":
     92          gContextMenu.mediaCommand("playbackRate", 1.25);
     93          break;
     94        case "context-media-playbackrate-150x":
     95          gContextMenu.mediaCommand("playbackRate", 1.5);
     96          break;
     97        case "context-media-playbackrate-200x":
     98          gContextMenu.mediaCommand("playbackRate", 2.0);
     99          break;
    100        case "context-media-loop":
    101          gContextMenu.mediaCommand("loop");
    102          break;
    103        case "context-leave-dom-fullscreen":
    104          gContextMenu.leaveDOMFullScreen();
    105          break;
    106        case "context-video-fullscreen":
    107          gContextMenu.mediaCommand("fullscreen");
    108          break;
    109        case "context-media-hidecontrols":
    110          gContextMenu.mediaCommand("hidecontrols");
    111          break;
    112        case "context-media-showcontrols":
    113          gContextMenu.mediaCommand("showcontrols");
    114          break;
    115        case "context-viewimage":
    116        case "context-viewvideo":
    117          gContextMenu.viewMedia(event);
    118          break;
    119        case "context-video-pictureinpicture":
    120          gContextMenu.mediaCommand("pictureinpicture");
    121          break;
    122        case "context-reloadimage":
    123          gContextMenu.reloadImage();
    124          break;
    125        case "context-video-saveimage":
    126          gContextMenu.saveVideoFrameAsImage();
    127          break;
    128        case "context-saveaudio":
    129        case "context-saveimage":
    130        case "context-savevideo":
    131          gContextMenu.saveMedia();
    132          break;
    133        case "context-copyimage-contents":
    134          goDoCommand("cmd_copyImageContents");
    135          break;
    136        case "context-copyaudiourl":
    137        case "context-copyimage":
    138        case "context-copyvideourl":
    139          gContextMenu.copyMediaLocation();
    140          break;
    141        case "context-sendaudio":
    142        case "context-sendimage":
    143        case "context-sendvideo":
    144          gContextMenu.sendMedia();
    145          break;
    146        case "context-imagetext":
    147          gContextMenu.getImageText();
    148          break;
    149        case "context-viewimageinfo":
    150          gContextMenu.viewImageInfo();
    151          break;
    152        case "context-viewimagedesc":
    153          gContextMenu.viewImageDesc(event);
    154          break;
    155        case "context-setDesktopBackground":
    156          gContextMenu.setDesktopBackground();
    157          break;
    158        case "context-bookmarkpage":
    159          gContextMenu.bookmarkThisPage();
    160          break;
    161        case "context-savepage":
    162          gContextMenu.savePageAs();
    163          break;
    164        case "fill-login-generated-password":
    165          gContextMenu.useGeneratedPassword();
    166          break;
    167        case "use-relay-mask":
    168          gContextMenu.useRelayMask();
    169          break;
    170        case "manage-saved-logins":
    171          gContextMenu.openPasswordManager();
    172          break;
    173        case "context-pdfjs-highlight-selection":
    174          gContextMenu.pdfJSCmd("highlightSelection");
    175          break;
    176        case "context-pdfjs-comment-selection":
    177          gContextMenu.pdfJSCmd("commentSelection");
    178          break;
    179        case "context-reveal-password":
    180          gContextMenu.toggleRevealPassword();
    181          break;
    182        case "context-print-selection":
    183          gContextMenu.printSelection();
    184          break;
    185        case "context-pdfjs-undo":
    186          gContextMenu.pdfJSCmd("undo");
    187          break;
    188        case "context-pdfjs-redo":
    189          gContextMenu.pdfJSCmd("redo");
    190          break;
    191        case "context-pdfjs-cut":
    192          gContextMenu.pdfJSCmd("cut");
    193          break;
    194        case "context-pdfjs-copy":
    195          gContextMenu.pdfJSCmd("copy");
    196          break;
    197        case "context-pdfjs-paste":
    198          gContextMenu.pdfJSCmd("paste");
    199          break;
    200        case "context-pdfjs-delete":
    201          gContextMenu.pdfJSCmd("delete");
    202          break;
    203        case "context-pdfjs-selectall":
    204          gContextMenu.pdfJSCmd("selectAll");
    205          break;
    206        case "context-take-screenshot":
    207          gContextMenu.takeScreenshot();
    208          break;
    209        case "context-add-engine":
    210          if (!gContextMenu) {
    211            throw new Error("Context menu doesn't seem to be open.");
    212          }
    213          gContextMenu.addSearchFieldAsEngine().catch(console.error);
    214          break;
    215        case "context-searchselect":
    216        case "context-searchselect-private":
    217          gContextMenu.loadSearch({ event });
    218          break;
    219        case "context-visual-search": {
    220          let { SearchUtils } = ChromeUtils.importESModule(
    221            "moz-src:///toolkit/components/search/SearchUtils.sys.mjs"
    222          );
    223          gContextMenu.loadSearch({
    224            event,
    225            searchUrlType: SearchUtils.URL_TYPE.VISUAL_SEARCH,
    226          });
    227          break;
    228        }
    229        case "context-translate-selection":
    230          gContextMenu.openSelectTranslationsPanel(event);
    231          break;
    232        case "context-showonlythisframe":
    233          gContextMenu.showOnlyThisFrame();
    234          break;
    235        case "context-openframeintab":
    236          gContextMenu.openFrameInTab();
    237          break;
    238        case "context-openframe":
    239          gContextMenu.openFrame();
    240          break;
    241        case "context-reloadframe":
    242          gContextMenu.reloadFrame(event);
    243          break;
    244        case "context-bookmarkframe":
    245          gContextMenu.addBookmarkForFrame();
    246          break;
    247        case "context-saveframe":
    248          gContextMenu.saveFrame();
    249          break;
    250        case "context-printframe":
    251          gContextMenu.printFrame();
    252          break;
    253        case "context-viewframesource":
    254          gContextMenu.viewFrameSource();
    255          break;
    256        case "context-viewframeinfo":
    257          gContextMenu.viewFrameInfo();
    258          break;
    259        case "spell-check-enabled":
    260          InlineSpellCheckerUI.toggleEnabled(window);
    261          break;
    262        case "spell-add-dictionaries":
    263        case "spell-add-dictionaries-main":
    264          gContextMenu.addDictionaries();
    265          break;
    266        case "context-bidi-page-direction-toggle":
    267          gContextMenu.switchPageDirection();
    268          break;
    269        case "context-viewpartialsource-selection":
    270          gContextMenu.viewPartialSource();
    271          break;
    272        case "context-viewsource":
    273          BrowserCommands.viewSource(gContextMenu.browser);
    274          break;
    275        case "context-inspect-a11y":
    276          gContextMenu.inspectA11Y();
    277          break;
    278        case "context-inspect":
    279          gContextMenu.inspectNode();
    280          break;
    281        case "context-media-eme-learnmore":
    282          gContextMenu.drmLearnMore(event);
    283          break;
    284        case "context-copy-link-to-highlight":
    285          gContextMenu.copyLinkToHighlight();
    286          break;
    287        case "context-copy-clean-link-to-highlight":
    288          gContextMenu.copyLinkToHighlight(/* stripSiteTracking */ true);
    289          break;
    290        case "context-remove-highlight":
    291          gContextMenu.removeAllTextFragments();
    292          break;
    293      }
    294    });
    295    contextMenuPopup.addEventListener("popupshowing", event => {
    296      switch (event.target.id) {
    297        case "contentAreaContextMenu": {
    298          // eslint-disable-next-line no-global-assign
    299          gContextMenu = new nsContextMenu(contextMenuPopup, event.shiftKey);
    300          if (!gContextMenu.shouldDisplay) {
    301            event.preventDefault();
    302            return;
    303          }
    304 
    305          if (!IS_WEBEXT_PANELS) {
    306            updateEditUIVisibility();
    307          }
    308 
    309          // attempts to generate the text fragment directive of selected text
    310          // Note: This is kicking off an async operation that might update
    311          // the context menu while it's open (enables an entry).
    312          if (gContextMenu.isContentSelected || gContextMenu.hasTextFragments) {
    313            gContextMenu.getTextDirective();
    314          }
    315          break;
    316        }
    317        case "context-openlinkinusercontext-popup":
    318          gContextMenu.createContainerMenu(event);
    319          break;
    320        case "context-sendlinktodevice-popup":
    321          gSync.populateSendTabToDevicesMenu(
    322            event.target,
    323            gContextMenu.linkURI,
    324            gContextMenu.linkTextStr
    325          );
    326          break;
    327        case "context-sendpagetodevice-popup":
    328          gSync.populateSendTabToDevicesMenu(
    329            event.target,
    330            gBrowser.currentURI,
    331            gBrowser.contentTitle
    332          );
    333          break;
    334      }
    335    });
    336    contextMenuPopup.addEventListener("popuphiding", event => {
    337      if (event.target != contextMenuPopup) {
    338        return;
    339      }
    340 
    341      gContextMenu.hiding(contextMenuPopup);
    342      // eslint-disable-next-line no-global-assign
    343      gContextMenu = null;
    344      if (!IS_WEBEXT_PANELS) {
    345        updateEditUIVisibility();
    346      }
    347    });
    348 
    349    // The command events bubble up to the popup element.
    350    let userContextPopup = document.getElementById(
    351      "context-openlinkinusercontext-popup"
    352    );
    353    userContextPopup.addEventListener("command", event =>
    354      gContextMenu.openLinkInTab(event)
    355    );
    356  },
    357  { once: true }
    358 );