1 utils = require 'utils'
2 keyUtils = require 'key-utils'
3 { getCommand } = require 'commands'
4 { Vim } = require 'vim'
5 { getPref } = require 'prefs'
6 { setWindowBlacklisted } = require 'button'
8 { interfaces: Ci } = Components
10 vimBucket = new utils.Bucket utils.getWindowId, (obj) -> new Vim obj
12 suppressEvent = (event) ->
13 event.preventDefault()
14 event.stopPropagation()
16 # The following listeners are installed on every top level Chrome window
24 isEditable = utils.isElementEditable event.originalTarget
26 { ctrlKey: ctrl, metaKey: meta, altKey: alt, shiftKey: shift } = event
28 # any keys modified with meta or alt should be ignored
32 # Extract keyChar from keyCode and apply modifiers
33 if keyChar = keyUtils.keyCharFromCode(event.keyCode, shift)
34 keyStr = keyUtils.applyModifiers(keyChar, ctrl, alt, meta)
38 # We only handle the key if it's recognized by `keyCharFromCode`
39 # and if there is no focused editable element # or if it's the *Esc* key,
40 # which will remove the focus from the currently focused element
41 if keyStr and (not isEditable or keyStr == 'Esc')
42 if window = utils.getCurrentTabWindow event
43 if vim = vimBucket.get(window)
44 # No action if blacklisted
48 # Push new keyStr on the stack and we don't really want to
49 # suppress the Esc key, but we want to handle it
50 if vim.pushKey(keyStr) and keyStr != 'Esc'
53 console.log err, 'keydown'
55 'keypress': (event) ->
60 # Try to execute keys that were accumulated so far.
61 # Suppress event if there is a matching command.
62 if window = utils.getCurrentTabWindow event
63 if vim = vimBucket.get(window)
64 # No action on blacklisted locations
67 else if vim.execKeys()
70 console.log err, 'keypress'
72 # When the top level window closes we should release all Vims that were
73 # associated with tabs in this window
74 'DOMWindowClose': (event) ->
75 if gBrowser = event.originalTarget.gBrowser
76 for tab in gBrowser.tabs
77 if browser = gBrowser.getBrowserForTab tab
78 vimBucket.forget browser.contentWindow
80 'TabClose': (event) ->
81 if gBrowser = utils.getEventTabBrowser event
82 if browser = gBrowser.getBrowserForTab event.originalTarget
83 vimBucket.forget browser.contentWindow
85 # Update the toolbar button icon to reflect the blacklisted state
86 'TabSelect': (event) ->
87 if vim = vimBucket.get event.originalTarget?.linkedBrowser?.contentDocument?.defaultView
88 if rootWindow = utils.getRootWindow vim.window
89 setWindowBlacklisted rootWindow, vim.blacklisted
91 # This listener works on individual tabs within Chrome Window
92 # User for: listening for location changes and disabling the extension
93 # on black listed urls
95 onLocationChange: (browser, webProgress, request, location) ->
96 blacklisted = utils.isBlacklisted location.spec, getPref 'black_list'
97 if vim = vimBucket.get(browser.contentWindow)
98 vim.blacklisted = blacklisted
99 if rootWindow = utils.getRootWindow vim.window
100 setWindowBlacklisted rootWindow, vim.blacklisted
102 addEventListeners = (window) ->
103 for name, listener of windowsListener
104 window.addEventListener name, listener, true
106 # Install onLocationChange listener
107 window.gBrowser.addTabsProgressListener tabsListener
109 removeEventListeners = ->
110 for name, listener of windowsListener
111 window.removeEventListener name, listener, true
114 removeEventListeners window
115 window.gBrowser.removeTabsProgressListener tabsListener
117 exports.addEventListeners = addEventListeners