aboutsummaryrefslogtreecommitdiff
path: root/atom/packages/ex-mode/spec/spec-helper.coffee
blob: 9ec4d58bd8c2ca43605a733ea599ff0707402b29 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
ExState = require '../lib/ex-state'
GlobalExState = require '../lib/global-ex-state'

beforeEach ->
  atom.workspace ||= {}

activateExMode = ->
  atom.workspace.open().then ->
    atom.commands.dispatch(atom.views.getView(atom.workspace), 'ex-mode:open')
    keydown('escape')
    atom.workspace.getActivePane().destroyActiveItem()


getEditorElement = (callback) ->
  textEditor = null

  waitsForPromise ->
    atom.workspace.open().then (e) ->
      textEditor = e

  runs ->
    # element = document.createElement("atom-text-editor")
    # element.setModel(textEditor)
    # element.classList.add('vim-mode')
    # element.exState = new ExState(element, new GlobalExState)
    #
    # element.addEventListener "keydown", (e) ->
    #   atom.keymaps.handleKeyboardEvent(e)

    element = atom.views.getView(textEditor)

    callback(element)

dispatchKeyboardEvent = (target, eventArgs...) ->
  e = document.createEvent('KeyboardEvent')
  e.initKeyboardEvent(eventArgs...)
  # 0 is the default, and it's valid ASCII, but it's wrong.
  Object.defineProperty(e, 'keyCode', get: -> undefined) if e.keyCode is 0
  target.dispatchEvent e

dispatchTextEvent = (target, eventArgs...) ->
  e = document.createEvent('TextEvent')
  e.initTextEvent(eventArgs...)
  target.dispatchEvent e

keydown = (key, {element, ctrl, shift, alt, meta, raw}={}) ->
  key = "U+#{key.charCodeAt(0).toString(16)}" unless key is 'escape' or raw?
  element ||= document.activeElement
  eventArgs = [
    true, # bubbles
    true, # cancelable
    null, # view
    key,  # key
    0,    # location
    ctrl, alt, shift, meta
  ]

  canceled = not dispatchKeyboardEvent(element, 'keydown', eventArgs...)
  dispatchKeyboardEvent(element, 'keypress', eventArgs...)
  if not canceled
    if dispatchTextEvent(element, 'textInput', eventArgs...)
      element.value += key
  dispatchKeyboardEvent(element, 'keyup', eventArgs...)

module.exports = {keydown, getEditorElement, activateExMode}