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 );