From e9c0b9903dbb74d7c808fecf7e988707d31945eb Mon Sep 17 00:00:00 2001 From: Corey Johnson & Nathan Sobo Date: Tue, 10 Jan 2012 15:46:54 -0800 Subject: [PATCH] Test that global key bindings defined on root view work in the editor. --- spec/atom/key-event-handler-spec.coffee | 14 +++++++------- spec/atom/root-view-spec.coffee | 9 +++++++++ src/atom/key-event-handler.coffee | 4 ++-- src/atom/root-view.coffee | 5 +++++ 4 files changed, 23 insertions(+), 9 deletions(-) diff --git a/spec/atom/key-event-handler-spec.coffee b/spec/atom/key-event-handler-spec.coffee index 2744aa22c..bc722ef46 100644 --- a/spec/atom/key-event-handler-spec.coffee +++ b/spec/atom/key-event-handler-spec.coffee @@ -7,7 +7,7 @@ describe "KeyEventHandler", -> beforeEach -> handler = new KeyEventHandler - describe "handleKeypress", -> + describe "handleKeyEvent", -> fragment = null deleteCharHandler = null insertCharHandler = null @@ -31,28 +31,28 @@ describe "KeyEventHandler", -> describe "when the event's target node matches a selector with a matching binding", -> it "triggers the command event associated with that binding on the target node", -> - handler.handleKeypress(keypressEvent('x', target: fragment[0])) + handler.handleKeyEvent(keypressEvent('x', target: fragment[0])) expect(deleteCharHandler).toHaveBeenCalled() expect(insertCharHandler).not.toHaveBeenCalled() deleteCharHandler.reset() fragment.removeClass('command-mode').addClass('insert-mode') - handler.handleKeypress(keypressEvent('x', target: fragment[0])) + handler.handleKeyEvent(keypressEvent('x', target: fragment[0])) expect(deleteCharHandler).not.toHaveBeenCalled() expect(insertCharHandler).toHaveBeenCalled() describe "when the event's target node *descends* from a selector with a matching binding", -> it "triggers the command event associated with that binding on the target node", -> target = fragment.find('.child-node')[0] - handler.handleKeypress(keypressEvent('x', target: target)) + handler.handleKeyEvent(keypressEvent('x', target: target)) expect(deleteCharHandler).toHaveBeenCalled() expect(insertCharHandler).not.toHaveBeenCalled() deleteCharHandler.reset() fragment.removeClass('command-mode').addClass('insert-mode') - handler.handleKeypress(keypressEvent('x', target: target)) + handler.handleKeyEvent(keypressEvent('x', target: target)) expect(deleteCharHandler).not.toHaveBeenCalled() expect(insertCharHandler).toHaveBeenCalled() @@ -63,7 +63,7 @@ describe "KeyEventHandler", -> fragment.on 'foo', fooHandler target = fragment.find('.grandchild-node')[0] - handler.handleKeypress(keypressEvent('x', target: target)) + handler.handleKeyEvent(keypressEvent('x', target: target)) expect(fooHandler).toHaveBeenCalled() expect(deleteCharHandler).not.toHaveBeenCalled() expect(insertCharHandler).not.toHaveBeenCalled() @@ -82,7 +82,7 @@ describe "KeyEventHandler", -> fragment.on 'baz', bazHandler target = fragment.find('.grandchild-node')[0] - handler.handleKeypress(keypressEvent('x', target: target)) + handler.handleKeyEvent(keypressEvent('x', target: target)) expect(fooHandler).not.toHaveBeenCalled() expect(barHandler).not.toHaveBeenCalled() diff --git a/spec/atom/root-view-spec.coffee b/spec/atom/root-view-spec.coffee index a2d3ee5a8..7909c72f7 100644 --- a/spec/atom/root-view-spec.coffee +++ b/spec/atom/root-view-spec.coffee @@ -81,6 +81,15 @@ describe "RootView", -> rootView.fileFinder.select() expect(rootView.editor.buffer.url).toBe(project.url + firstLi.text()) + describe "when a key is typed in the editor that has a binding in the keymap", -> + it "triggers the key binding's command as an event and does not insert a character", -> + rootView.keyEventHandler.bindKeys('.editor', 'x': 'fooCommand') + fooCommandHandler = jasmine.createSpy('fooCommandHandler') + rootView.editor.on('fooCommand', fooCommandHandler) + event = keydownEvent 'x', target: rootView.find('textarea')[0] + rootView.editor.aceEditor.onCommandKey event, 0, event.which + + expect(fooCommandHandler).toHaveBeenCalled() diff --git a/src/atom/key-event-handler.coffee b/src/atom/key-event-handler.coffee index 132c64e8b..3e0c699d7 100644 --- a/src/atom/key-event-handler.coffee +++ b/src/atom/key-event-handler.coffee @@ -12,9 +12,9 @@ class KeyEventHandler bindKeys: (selector, bindings) -> @bindingSets.push(new BindingSet(selector, bindings)) - handleKeypress: (event) -> + handleKeyEvent: (event) -> currentNode = $(event.target) - while currentNode + while currentNode isnt document candidateBindingSets = @bindingSets.filter (set) -> currentNode.is(set.selector) candidateBindingSets.sort (a, b) -> b.specificity - a.specificity for bindingSet in candidateBindingSets diff --git a/src/atom/root-view.coffee b/src/atom/root-view.coffee index eaf4a5bcc..708ac65d3 100644 --- a/src/atom/root-view.coffee +++ b/src/atom/root-view.coffee @@ -6,6 +6,7 @@ Buffer = require 'buffer' Editor = require 'editor' FileFinder = require 'file-finder' Project = require 'project' +KeyEventHandler = require 'key-event-handler' module.exports = class RootView extends Template @@ -17,7 +18,11 @@ class RootView extends Template @subview 'editor', Editor.build() viewProperties: + keyEventHandler: null + initialize: ({url}) -> + @keyEventHandler = new KeyEventHandler + @editor.keyEventHandler = @keyEventHandler @bindKey 'meta+s', => @editor.save() @bindKey 'meta+w', => window.close() @bindKey 'meta+t', => @toggleFileFinder()