From 8126a7275494f23be11c15b8c3627a3831055779 Mon Sep 17 00:00:00 2001 From: Simon Lydell Date: Sat, 10 Sep 2016 00:38:35 +0200 Subject: [PATCH] Add `ec` for opening the context menu of elements Fixes #804. --- documentation/api.md | 5 +++ documentation/commands.md | 6 ++- .../handy-standard-firefox-features.md | 25 ++++++----- extension/lib/commands-frame.coffee | 43 ++++++++++++------ extension/lib/commands.coffee | 22 ++++++++-- extension/lib/defaults.coffee | 1 + extension/lib/events-frame.coffee | 2 +- extension/lib/utils.coffee | 44 +++++++++++++++---- extension/lib/vim-frame.coffee | 29 +++++++----- extension/lib/vim.coffee | 10 ++++- extension/locale/de/vimfx.properties | 1 + extension/locale/en-US/vimfx.properties | 1 + extension/locale/es/vimfx.properties | 1 + extension/locale/fr/vimfx.properties | 1 + extension/locale/id/vimfx.properties | 1 + extension/locale/it/vimfx.properties | 1 + extension/locale/ja/vimfx.properties | 1 + extension/locale/nl/vimfx.properties | 1 + extension/locale/pt-BR/vimfx.properties | 1 + extension/locale/ru/vimfx.properties | 1 + extension/locale/sv-SE/vimfx.properties | 1 + extension/locale/zh-CN/vimfx.properties | 1 + extension/locale/zh-TW/vimfx.properties | 1 + 23 files changed, 149 insertions(+), 51 deletions(-) diff --git a/documentation/api.md b/documentation/api.md index 2bd83e8..cc57a13 100644 --- a/documentation/api.md +++ b/documentation/api.md @@ -833,6 +833,7 @@ The arguments passed to the `hintMatcher` function are: - `'tab'`: `F`, `et`, `ew` or `ep`. - `'copy'`: `yf`. - `'focus'`: `ef`. + - `'context'`: `ec`. - `'select'`: `v`, `av` or `yv`. - element: `Element`. One out of all elements currently inside the viewport. @@ -872,6 +873,10 @@ The available type strings depend on `id`: - focusable: Any focusable element not falling into another category. - scrollable: Like “scrollable” when `id` is “normal” (see above). +- context: + + - context: An element that can have a context menu opened. + - select: - selectable: An element with selectable text (but not text inputs). diff --git a/documentation/commands.md b/documentation/commands.md index fc84ad7..d71326b 100644 --- a/documentation/commands.md +++ b/documentation/commands.md @@ -212,6 +212,8 @@ Which elements get hints depends on the command as well: inputs (their text). - `ef`: Anything focusable—links, buttons, form controls, scrollable elements, frames. +- `ec`: Most things that have a context menu—images, links, videos and text + inputs, but also many textual elements. - `eb`: Browser elements, such as toolbar buttons. It might seem simpler to match the same set of elements for _all_ of the @@ -301,8 +303,8 @@ many keyboard layouts (and is pretty easy to type). The second key after `e` was chosen based on mnemonics: There’s `et` as in tab, `ew` as in window, `ep` as in -private window, `ef` as in focus and `eb` as -in browser. +private window, `ef` as in focus, `ec` as in +context menu and `eb` as in browser. [`v` commands]: #the-v-commands--caret-mode [hint-matcher]: api.md#vimfxsethintmatcherhintmatcher diff --git a/documentation/handy-standard-firefox-features.md b/documentation/handy-standard-firefox-features.md index b2bb59f..d2cbbea 100644 --- a/documentation/handy-standard-firefox-features.md +++ b/documentation/handy-standard-firefox-features.md @@ -35,20 +35,23 @@ and adding a [custom command as a shortcut][location-bar-custom-command]. ## Menus -Remember that you can press the `` key to open the context menu (instead -of right-clicking). Instead of clicking on menus, you can press `` -where “accesskey” is the underlined letter of the menu name. Sometimes the -underlines aren’t visible until you hold the `` key. In already open menus, -you can type the access key _without_ holding ``. If there is no access key -for the menu item you want to activate, you can usually start typing the name of -the menu item to go to it. This is a nice alternative to using the arrow keys. -This is true for most programs, not just Firefox. +Use the `ec` command to open the context menu of elements. (If that fails, try +and see if the element can be focused using the `ef` command—if so, you should +be able to open the context menu using the `` key.) + +Instead of clicking on menus, you can press `` where “accesskey” is +the underlined letter of the menu name. Sometimes the underlines aren’t visible +until you hold the `` key. In already open menus, you can type the access +key _without_ holding ``. If there is no access key for the menu item you +want to activate, you can usually start typing the name of the menu item to go +to it. This is a nice alternative to using the arrow keys. This is true for most +programs, not just Firefox. Here are two examples where the above comes especially in handy for VimFx: -- You can use the `ef` command to focus a link or video (or anything) and then - press the `` key to open the context menu, providing you a plethora of - things to do with the focused target. For videos, the access key for the +- You can use the `ec` command to open the context menu of an image, a link or a + video, providing you a plethora of things to do with the focused target, such + as saving an image or the target of a link. For videos, the access key for the “Play/Pause” menu item is often `p`. This allows you, for example, to control some video players using the keyboard. diff --git a/extension/lib/commands-frame.coffee b/extension/lib/commands-frame.coffee index 7a52db4..220983a 100644 --- a/extension/lib/commands-frame.coffee +++ b/extension/lib/commands-frame.coffee @@ -52,6 +52,13 @@ FOLLOW_DEFAULT_SELECTORS = createComplementarySelectors([ '[role]', '[contenteditable]' ]) +FOLLOW_CONTEXT_TAGS = [ + 'a', 'button', 'input', 'textarea', 'select' + 'img', 'audio', 'video', 'canvas', 'embed', 'object' +] + +FOLLOW_CONTEXT_SELECTORS = createComplementarySelectors(FOLLOW_CONTEXT_TAGS) + FOLLOW_SELECTABLE_SELECTORS = createComplementarySelectors(['div', 'span']).reverse() @@ -327,31 +334,39 @@ commands.follow_focus = helper_follow.bind( return type ) +commands.follow_context = helper_follow.bind( + null, {id: 'context', selectors: FOLLOW_CONTEXT_SELECTORS}, + ({element}) -> + type = + if element.localName in FOLLOW_CONTEXT_TAGS or + utils.hasMarkableTextNode(element) + 'context' + else + null + return type +) + commands.follow_selectable = helper_follow.bind( null, {id: 'selectable', selectors: FOLLOW_SELECTABLE_SELECTORS}, ({element}) -> - isRelevantTextNode = (node) -> - # Ignore whitespace-only text nodes, and single-letter ones (which are - # common in many syntax highlighters). - return node.nodeType == 3 and node.data.trim().length > 1 type = - if Array.some(element.childNodes, isRelevantTextNode) + if utils.hasMarkableTextNode(element) 'selectable' else null return type ) -commands.focus_marker_element = ({vim, elementIndex, options}) -> +commands.focus_marker_element = ({vim, elementIndex, browserOffset, options}) -> {element} = vim.state.markerElements[elementIndex] # To be able to focus scrollable elements, `FLAG_BYKEY` _has_ to be used. options.flag = 'FLAG_BYKEY' if vim.state.scrollableElements.has(element) utils.focusElement(element, options) vim.clearHover() - vim.setHover(element) + vim.setHover(element, browserOffset) commands.click_marker_element = ( - {vim, elementIndex, type, preventTargetBlank} + {vim, elementIndex, type, browserOffset, preventTargetBlank} ) -> {element} = vim.state.markerElements[elementIndex] if element.target == '_blank' and preventTargetBlank @@ -361,12 +376,14 @@ commands.click_marker_element = ( element.click() else isXUL = (element.ownerDocument instanceof XULDocument) - sequence = - if isXUL + sequence = switch + when isXUL if element.localName == 'tab' then ['mousedown'] else 'click-xul' + when type == 'context' + 'context' else 'click' - utils.simulateMouseEvents(element, sequence) + utils.simulateMouseEvents(element, sequence, browserOffset) utils.openDropdown(element) element.target = targetReset if targetReset @@ -417,7 +434,7 @@ commands.element_text_select = ({vim, elementIndex, full, scroll = false}) -> window.focus() selection.addRange(range) -commands.follow_pattern = ({vim, type, options}) -> +commands.follow_pattern = ({vim, type, browserOffset, options}) -> {document} = vim.content # If there’s a `` element we use that. @@ -458,7 +475,7 @@ commands.follow_pattern = ({vim, type, options}) -> return null if matchingLink - utils.simulateMouseEvents(matchingLink, 'click') + utils.simulateMouseEvents(matchingLink, 'click', browserOffset) # When you go to the next page of GitHub’s code search results, the page is # loaded with AJAX. GitHub then annoyingly focuses its search input. This # autofocus cannot be prevented in a reliable way, because the case is diff --git a/extension/lib/commands.coffee b/extension/lib/commands.coffee index 90768aa..78a4dd1 100644 --- a/extension/lib/commands.coffee +++ b/extension/lib/commands.coffee @@ -534,6 +534,7 @@ helper_follow_clickable = (options, args) -> else vim._run('click_marker_element', { elementIndex, type + browserOffset: vim._getBrowserOffset() preventTargetBlank: vim.options.prevent_target_blank }) @@ -597,6 +598,19 @@ commands.follow_focus = (args) -> helper_follow({name: 'follow_focus', callback}, args) +commands.open_context_menu = (args) -> + {vim} = args + + callback = (marker) -> + {type, elementIndex} = marker.wrapper + vim._run('click_marker_element', { + elementIndex, type + browserOffset: vim._getBrowserOffset() + }) + return false + + helper_follow({name: 'follow_context', callback}, args) + commands.click_browser_element = ({vim}) -> {window} = vim markerElements = [] @@ -650,14 +664,15 @@ commands.click_browser_element = ({vim}) -> # next tick. This might be true for other buttons as well. utils.nextTick(window, -> utils.focusElement(element) + browserOffset = {x: window.screenX, y: window.screenY} switch when element.localName == 'tab' # Only 'mousedown' seems to be able to activate tabs. - utils.simulateMouseEvents(element, ['mousedown']) + utils.simulateMouseEvents(element, ['mousedown'], browserOffset) when element.closest('tab') # If `.click()` is used on a tab close button, its tab will be # selected first, which might cause the selected tab to change. - utils.simulateMouseEvents(element, 'click-xul') + utils.simulateMouseEvents(element, 'click-xul', browserOffset) else # `.click()` seems to trigger more buttons (such as NoScript’s # button and Firefox’s “hamburger” menu button) than simulating @@ -702,7 +717,8 @@ helper_follow_pattern = (type, {vim}) -> pattern_attrs: vim.options.pattern_attrs patterns: vim.options["#{type}_patterns"] } - vim._run('follow_pattern', {type, options}) + browserOffset = vim._getBrowserOffset() + vim._run('follow_pattern', {type, browserOffset, options}) commands.follow_previous = helper_follow_pattern.bind(null, 'prev') diff --git a/extension/lib/defaults.coffee b/extension/lib/defaults.coffee index 5674ece..c9004fa 100644 --- a/extension/lib/defaults.coffee +++ b/extension/lib/defaults.coffee @@ -89,6 +89,7 @@ shortcuts = 'af': 'follow_multiple' 'yf': 'follow_copy' 'ef': 'follow_focus' + 'ec': 'open_context_menu' 'eb': 'click_browser_element' '[': 'follow_previous' ']': 'follow_next' diff --git a/extension/lib/events-frame.coffee b/extension/lib/events-frame.coffee index fe02c83..807f682 100644 --- a/extension/lib/events-frame.coffee +++ b/extension/lib/events-frame.coffee @@ -258,7 +258,7 @@ class FrameEventManager @listen('blur', (event) => target = event.originalTarget - @vim.clearHover() if target == @vim.state.lastHoveredElement + @vim.clearHover() if target == @vim.state.lastHover.element @vim.content.setTimeout((=> @sendFocusType() diff --git a/extension/lib/utils.coffee b/extension/lib/utils.coffee index 1e4b652..4b90c97 100644 --- a/extension/lib/utils.coffee +++ b/extension/lib/utils.coffee @@ -50,6 +50,7 @@ XULTextBoxElement = Ci.nsIDOMXULTextBoxElement # 'command' is fired automatically after 'click' on xul pages. EVENTS_CLICK = ['mousedown', 'mouseup'] EVENTS_CLICK_XUL = ['click'] +EVENTS_CONTEXT = ['contextmenu'] EVENTS_HOVER_START = ['mouseover', 'mouseenter', 'mousemove'] EVENTS_HOVER_END = ['mouseout', 'mouseleave'] @@ -57,6 +58,13 @@ EVENTS_HOVER_END = ['mouseout', 'mouseleave'] # Element classification helpers +hasMarkableTextNode = (element) -> + return Array.some(element.childNodes, (node) -> + # Ignore whitespace-only text nodes, and single-letter ones (which are + # common in many syntax highlighters). + return node.nodeType == 3 and node.data.trim().length > 1 + ) + isActivatable = (element) -> return element.localName in ['a', 'button'] or (element.localName == 'input' and element.type in [ @@ -278,15 +286,18 @@ onRemoved = (element, fn) -> return disconnect -simulateMouseEvents = (element, sequence) -> +simulateMouseEvents = (element, sequence, browserOffset) -> window = element.ownerGlobal rect = element.getBoundingClientRect() + topOffset = getTopOffset(element) eventSequence = switch sequence when 'click' EVENTS_CLICK when 'click-xul' EVENTS_CLICK_XUL + when 'context' + EVENTS_CONTEXT when 'hover-start' EVENTS_HOVER_START when 'hover-end' @@ -295,7 +306,14 @@ simulateMouseEvents = (element, sequence) -> sequence for type in eventSequence - buttonNum = if type in EVENTS_CLICK then 1 else 0 + buttonNum = switch + when type in EVENTS_CONTEXT + 2 + when type in EVENTS_CLICK + 1 + else + 0 + mouseEvent = new window.MouseEvent(type, { # Let the event bubble in order to trigger delegated event listeners. bubbles: type not in ['mouseenter', 'mouseleave'] @@ -311,13 +329,11 @@ simulateMouseEvents = (element, sequence) -> # `client{X,Y}`. `{offset,layer,movement}{X,Y}` are not worth the trouble # to set. clientX: rect.left - clientY: rect.top - # To exactly calculate `screen{X,Y}` one has to to check where the web - # page content area is inside the browser chrome and go through all parent - # frames as well. This is good enough. YAGNI for now. - screenX: window.screenX + rect.left - screenY: window.screenY + rect.top + clientY: rect.top + rect.height / 2 + screenX: browserOffset.x + topOffset.x + screenY: browserOffset.y + topOffset.y + rect.height / 2 }) + if type == 'mousemove' # If the below technique is used for this event, the “URL popup” (shown # when hovering or focusing links) does not appear. @@ -388,6 +404,16 @@ getRootElement = (document) -> else return document.documentElement +getTopOffset = (element) -> + window = element.ownerGlobal + {left: x, top: y} = element.getBoundingClientRect() + while window.frameElement + frameRect = window.frameElement.getBoundingClientRect() + x += frameRect.left + y += frameRect.top + window = window.parent + return {x, y} + injectTemporaryPopup = (document, contents) -> popup = document.createElement('menupopup') popup.appendChild(contents) @@ -588,6 +614,7 @@ writeToClipboard = (text) -> nsIClipboardHelper.copyString(text) module.exports = { + hasMarkableTextNode isActivatable isAdjustable isContentEditable @@ -618,6 +645,7 @@ module.exports = { containsDeep createBox getRootElement + getTopOffset injectTemporaryPopup insertText isDetached diff --git a/extension/lib/vim-frame.coffee b/extension/lib/vim-frame.coffee index 73e0c26..3791dec 100644 --- a/extension/lib/vim-frame.coffee +++ b/extension/lib/vim-frame.coffee @@ -57,7 +57,10 @@ class VimFrame explicitBodyFocus: false hasFocusedTextInput: false lastFocusedTextInput: null - lastHoveredElement: null + lastHover: { + element: null + browserOffset: {x: 0, y: 0} + } scrollableElements: new ScrollableElements(@content) markerElements: [] inputs: null @@ -66,11 +69,11 @@ class VimFrame else isDead = (element) -> return Cu.isDeadWrapper(element) or element.ownerDocument == target - check = (prop) => - @state[prop] = null if @state[prop] and isDead(@state[prop]) + check = (obj, prop) -> + obj[prop] = null if obj[prop] and isDead(obj[prop]) - check('lastFocusedTextInput') - check('lastHoveredElement') + check(@state, 'lastFocusedTextInput') + check(@state.lastHover, 'element') @state.scrollableElements.reject(isDead) # `markerElements` and `inputs` could theoretically need to be filtered # too at this point. YAGNI until an issue arises from it. @@ -91,15 +94,17 @@ class VimFrame markPageInteraction: (value = true) -> @state.hasInteraction = value - setHover: (element) -> + setHover: (element, browserOffset) -> utils.setHover(element, true) - utils.simulateMouseEvents(element, 'hover-start') - @state.lastHoveredElement = element + utils.simulateMouseEvents(element, 'hover-start', browserOffset) + @state.lastHover.element = element + @state.lastHover.browserOffset = browserOffset clearHover: -> - if @state.lastHoveredElement - utils.setHover(@state.lastHoveredElement, false) - utils.simulateMouseEvents(@state.lastHoveredElement, 'hover-end') - @state.lastHoveredElement = null + if @state.lastHover.element + {element, browserOffset} = @state.lastHover + utils.setHover(element, false) + utils.simulateMouseEvents(element, 'hover-end', browserOffset) + @state.lastHover.element = null module.exports = VimFrame diff --git a/extension/lib/vim.coffee b/extension/lib/vim.coffee index 87d9002..65e86ea 100644 --- a/extension/lib/vim.coffee +++ b/extension/lib/vim.coffee @@ -188,7 +188,8 @@ class Vim # `` and then try to focus a link or text input in a web page the focus # won’t work unless `@browser` is focused first. @browser.focus() - @_run('focus_marker_element', {elementIndex, options}) + browserOffset = @_getBrowserOffset() + @_run('focus_marker_element', {elementIndex, browserOffset, options}) _setFocusType: (focusType) -> return if focusType == @focusType @@ -204,4 +205,11 @@ class Vim @_enterMode('normal') @_parent.emit('focusTypeChange', {vim: this}) + _getBrowserOffset: -> + browserRect = @browser.getBoundingClientRect() + return { + x: @window.screenX + browserRect.left + y: @window.screenY + browserRect.top + } + module.exports = Vim diff --git a/extension/locale/de/vimfx.properties b/extension/locale/de/vimfx.properties index 9bc31d5..202026b 100644 --- a/extension/locale/de/vimfx.properties +++ b/extension/locale/de/vimfx.properties @@ -72,6 +72,7 @@ mode.normal.follow_in_private_window=Follow link in a new private window mode.normal.follow_multiple=Mehreren Links in neuen Tabs folgen, Texteingabe fokussieren oder mehrere Schaltflächen betätigen mode.normal.follow_copy=Links oder Text-Eingabewerte in Zwischenablage kopieren mode.normal.follow_focus=Element fokussieren oder auswählen +mode.normal.open_context_menu=Open context menu for element mode.normal.click_browser_element=Browserelement anklicken mode.normal.follow_previous="Vorherigen" Link anklicken mode.normal.follow_next="Nächsten" Link ankliken diff --git a/extension/locale/en-US/vimfx.properties b/extension/locale/en-US/vimfx.properties index e9e1384..af5d660 100644 --- a/extension/locale/en-US/vimfx.properties +++ b/extension/locale/en-US/vimfx.properties @@ -72,6 +72,7 @@ mode.normal.follow_in_private_window=Follow link in a new private window mode.normal.follow_multiple=Follow multiple links in new background tabs, focus text input or click multiple buttons mode.normal.follow_copy=Copy link or text input value mode.normal.follow_focus=Focus/select element +mode.normal.open_context_menu=Open context menu for element mode.normal.click_browser_element=Click browser element mode.normal.follow_previous=Click “Previous” link mode.normal.follow_next=Click “Next” link diff --git a/extension/locale/es/vimfx.properties b/extension/locale/es/vimfx.properties index b5d995d..afa2e43 100644 --- a/extension/locale/es/vimfx.properties +++ b/extension/locale/es/vimfx.properties @@ -72,6 +72,7 @@ mode.normal.follow_in_private_window=Follow link in a new private window mode.normal.follow_multiple=Seguir múltiples enlaces en nuevas pestañas en 2º plano, poner foco en entrada de texto o pulsar varios botones mode.normal.follow_copy=Copiar enlace o valor de la entrada de texto mode.normal.follow_focus=Poner foco en / Seleccionar elemento +mode.normal.open_context_menu=Open context menu for element mode.normal.click_browser_element=Pulsar elemento del navegador mode.normal.follow_previous=Pulsar enlace tipo "Anterior" mode.normal.follow_next=Pulsar enlace tipo "Siguiente" diff --git a/extension/locale/fr/vimfx.properties b/extension/locale/fr/vimfx.properties index 9648fa2..624b63b 100644 --- a/extension/locale/fr/vimfx.properties +++ b/extension/locale/fr/vimfx.properties @@ -72,6 +72,7 @@ mode.normal.follow_in_private_window=Follow link in a new private window mode.normal.follow_multiple=Ouvrir plusieurs liens dans des onglets en arrière-plan mode.normal.follow_copy=Copier l'adresse du lien ou le texte dans le presse-papier mode.normal.follow_focus=Focaliser l'élément +mode.normal.open_context_menu=Open context menu for element mode.normal.click_browser_element=Activer l'élément du navigateur mode.normal.follow_previous=Activer le lien « Précédent » mode.normal.follow_next=Activer le lien « Suivant » diff --git a/extension/locale/id/vimfx.properties b/extension/locale/id/vimfx.properties index b01b0b3..3314c7d 100644 --- a/extension/locale/id/vimfx.properties +++ b/extension/locale/id/vimfx.properties @@ -72,6 +72,7 @@ mode.normal.follow_in_private_window=Follow link in a new private window mode.normal.follow_multiple=Ikuti banyak link pada tab latar belakang baru, fokus masukan teks atau klik banyak tombol mode.normal.follow_copy=Salin link atau isi masukan teks mode.normal.follow_focus=Fokus/pilih element +mode.normal.open_context_menu=Open context menu for element mode.normal.click_browser_element=Klik elemen browser mode.normal.follow_previous=Klik link "Previous” mode.normal.follow_next=Klik link “Next” diff --git a/extension/locale/it/vimfx.properties b/extension/locale/it/vimfx.properties index 50b46e9..6216fab 100644 --- a/extension/locale/it/vimfx.properties +++ b/extension/locale/it/vimfx.properties @@ -72,6 +72,7 @@ mode.normal.follow_in_private_window=Follow link in a new private window mode.normal.follow_multiple=Apri diversi link in nuove schede non in primo piano, seleziona una casella di input di testo o clicca diversi bottoni. mode.normal.follow_copy=Copia il link o il testo nella casella negli appunti mode.normal.follow_focus=Attiva/seleziona elemento +mode.normal.open_context_menu=Open context menu for element mode.normal.click_browser_element=Clicca un elemento del browser mode.normal.follow_previous=Clicca il link “Precedente” mode.normal.follow_next=Clicca il link “Prossimo” diff --git a/extension/locale/ja/vimfx.properties b/extension/locale/ja/vimfx.properties index 79e02ce..b2aae34 100644 --- a/extension/locale/ja/vimfx.properties +++ b/extension/locale/ja/vimfx.properties @@ -72,6 +72,7 @@ mode.normal.follow_in_private_window=Follow link in a new private window mode.normal.follow_multiple=複数のリンクを新規バックグラウンドタブで開き、テキスト入力やボタンにフォーカス mode.normal.follow_copy=URLまたは入力値をクリップボードにコピー mode.normal.follow_focus=要素にフォーカス/選択 +mode.normal.open_context_menu=Open context menu for element mode.normal.click_browser_element=ブラウザ要素をクリック mode.normal.follow_previous=「前へ」リンクをクリック mode.normal.follow_next=「次へ」リンクをクリック diff --git a/extension/locale/nl/vimfx.properties b/extension/locale/nl/vimfx.properties index 6b9ff43..1339c2f 100644 --- a/extension/locale/nl/vimfx.properties +++ b/extension/locale/nl/vimfx.properties @@ -72,6 +72,7 @@ mode.normal.follow_in_private_window=Follow link in a new private window mode.normal.follow_multiple=Volg meerdere links naar achtergrondtabbladen, focus het volgende invoerveld or klik op meerdere knoppen mode.normal.follow_copy=Kopieer link-URL of tekstinvoer naar klembord mode.normal.follow_focus=Focus/selecteer element +mode.normal.open_context_menu=Open context menu for element mode.normal.click_browser_element=Klik op browserelement mode.normal.follow_previous=Klik op "vorige"-link mode.normal.follow_next=Klik op "volgende"-link diff --git a/extension/locale/pt-BR/vimfx.properties b/extension/locale/pt-BR/vimfx.properties index cb38160..3337269 100644 --- a/extension/locale/pt-BR/vimfx.properties +++ b/extension/locale/pt-BR/vimfx.properties @@ -72,6 +72,7 @@ mode.normal.follow_in_private_window=Follow link in a new private window mode.normal.follow_multiple=Seguir múltiplos links em abas em segundo plano, foco no campo texto ou clique em múltiplos botões mode.normal.follow_copy=Copiar link ou valor do campo texto mode.normal.follow_focus=Focar/selecionar elemento +mode.normal.open_context_menu=Open context menu for element mode.normal.click_browser_element=Clicar em elemento de navegação mode.normal.follow_previous=Clicar no link “Anterior” mode.normal.follow_next=Clicar no “Próximo” link diff --git a/extension/locale/ru/vimfx.properties b/extension/locale/ru/vimfx.properties index 4f2ecae..8761582 100644 --- a/extension/locale/ru/vimfx.properties +++ b/extension/locale/ru/vimfx.properties @@ -72,6 +72,7 @@ mode.normal.follow_in_private_window=Follow link in a new private window mode.normal.follow_multiple=Перейти по нескольким ссылкам в новых вкладках, сфокусироваться на поле ввода или щелкнуть по нескольким кнопкам mode.normal.follow_copy=Скопировать в буфер обмена адрес ссылки или текст в поле ввода mode.normal.follow_focus=Фокус на/выбрать элемент +mode.normal.open_context_menu=Open context menu for element mode.normal.click_browser_element=Щёлкнуть по элементу в браузере mode.normal.follow_previous=Щёлкнуть по «предыдущей» ссылке mode.normal.follow_next=Щёлкнуть по «следующей» сслыке diff --git a/extension/locale/sv-SE/vimfx.properties b/extension/locale/sv-SE/vimfx.properties index 27ea819..6b53966 100644 --- a/extension/locale/sv-SE/vimfx.properties +++ b/extension/locale/sv-SE/vimfx.properties @@ -72,6 +72,7 @@ mode.normal.follow_in_private_window=Följ länk i nytt privat fönster mode.normal.follow_multiple=Följ flera länkar i nya bakgrundsflikar, fokusera textruta eller klicka på flera knappar mode.normal.follow_copy=Kopiera länkadress eller inmatad text mode.normal.follow_focus=Fokusera/markera element +mode.normal.open_context_menu=Öppna högerklicksmeny för element mode.normal.click_browser_element=Klicka på webbläsarelement mode.normal.follow_previous=Klicka på ”Föregående”-länk mode.normal.follow_next=Klicka på ”Nästa”-länk diff --git a/extension/locale/zh-CN/vimfx.properties b/extension/locale/zh-CN/vimfx.properties index 7157747..edab8cb 100644 --- a/extension/locale/zh-CN/vimfx.properties +++ b/extension/locale/zh-CN/vimfx.properties @@ -72,6 +72,7 @@ mode.normal.follow_in_private_window=Follow link in a new private window mode.normal.follow_multiple=在新的后台标签页中打开多个链接,聚焦输入框或点击多个按钮 mode.normal.follow_copy=复制链接地址或输入框文本 mode.normal.follow_focus=聚焦/选中元素 +mode.normal.open_context_menu=Open context menu for element mode.normal.click_browser_element=点击浏览器元素 mode.normal.follow_previous=点击“上一页”链接 mode.normal.follow_next=点击“下一页”链接 diff --git a/extension/locale/zh-TW/vimfx.properties b/extension/locale/zh-TW/vimfx.properties index 0d1db6b..a6e79b9 100644 --- a/extension/locale/zh-TW/vimfx.properties +++ b/extension/locale/zh-TW/vimfx.properties @@ -72,6 +72,7 @@ mode.normal.follow_in_private_window=Follow link in a new private window mode.normal.follow_multiple=用新背景分頁開啟多個連結,焦點放在文字輸入框或按鈕 mode.normal.follow_copy=複製連結或輸入框中的文字 mode.normal.follow_focus=移動焦點/選取元素 +mode.normal.open_context_menu=Open context menu for element mode.normal.click_browser_element=點選瀏覽器元素 mode.normal.follow_previous=點擊“上一頁”連結 mode.normal.follow_next=點擊“下一頁”連結 -- 2.39.3