diff --git a/IPython/html/static/notebook/js/completer.js b/IPython/html/static/notebook/js/completer.js
index 30a824a..f7dbd1e 100644
--- a/IPython/html/static/notebook/js/completer.js
+++ b/IPython/html/static/notebook/js/completer.js
@@ -233,12 +233,10 @@ var IPython = (function (IPython) {
this.sel.dblclick(function () {
that.pick();
});
- this.editor.on('keydown', function (event) {
+ this._handle_keydown = function (cm, event) {
that.keydown(event);
- });
- this.editor.on('keypress', function (event) {
- that.keypress(event);
- });
+ };
+ this.editor.on('keydown', this._handle_keydown);
}
this.sel.attr('size', Math.min(10, this.raw_result.length));
@@ -280,30 +278,33 @@ var IPython = (function (IPython) {
Completer.prototype.close = function () {
this.done = true;
$('#complete').remove();
+ if (this._handle_keydown) {
+ this.editor.off('keydown', this._handle_keydown);
+ this._handle_keydown = undefined;
+ }
this.visible = false;
};
Completer.prototype.pick = function () {
this.insert(this.raw_result[this.sel[0].selectedIndex]);
this.close();
- var that = this;
};
Completer.prototype.keydown = function (event) {
+ console.log(event);
var code = event.keyCode;
var that = this;
+ if (!this.visible) return;
// Enter
if (code == keycodes.enter) {
- CodeMirror.e_stop(event);
+ event.stopPropagation();
+ event.codemirrorIgnore = true;
this.pick();
- }
// Escape or backspace
- else if (code == keycodes.esc) {
- CodeMirror.e_stop(event);
- this.close();
-
- } else if (code == keycodes.backspace) {
+ } else if (code == keycodes.esc || code == keycodes.backspace) {
+ event.stopPropagation();
+ event.codemirrorIgnore = true;
this.close();
} else if (code == keycodes.tab) {
//all the fastforwarding operation,
@@ -315,7 +316,8 @@ var IPython = (function (IPython) {
this.insert(sh);
}
this.close();
- CodeMirror.e_stop(event);
+ event.codemirrorIgnore = true;
+ event.stopPropagation();
//reinvoke self
setTimeout(function () {
that.carry_on_completion();
@@ -324,31 +326,20 @@ var IPython = (function (IPython) {
// need to do that to be able to move the arrow
// when on the first or last line ofo a code cell
event.stopPropagation();
- }
- };
-
- Completer.prototype.keypress = function (event) {
- // FIXME: This is a band-aid.
- // on keypress, trigger insertion of a single character.
- // This simulates the old behavior of completion as you type,
- // before events were disconnected and CodeMirror stopped
- // receiving events while the completer is focused.
- if (!this.visible) return;
+ event.codemirrorIgnore = true;
- var that = this;
- var code = event.keyCode;
-
- // don't handle keypress if it's not a character (arrows on FF)
- // or ENTER/TAB
- if (event.charCode === 0 ||
- code == keycodes.enter ||
- code == keycodes.tab
- ) return;
-
- this.close();
- setTimeout(function () {
- that.carry_on_completion();
- }, 50);
+ var options = this.sel.find('option');
+ var index = this.sel[0].selectedIndex;
+ if (code == keycodes.up) {
+ index--;
+ }
+ if (code == keycodes.down) {
+ index++;
+ }
+ index = Math.min(Math.max(index, 0), options.length-1);
+ console.log('compl set index', index);
+ this.sel[0].selectedIndex = index;
+ }
};
IPython.Completer = Completer;
diff --git a/IPython/html/tests/notebook/arrow_keys.js b/IPython/html/tests/notebook/arrow_keys.js
index 6f089ba..b658562 100644
--- a/IPython/html/tests/notebook/arrow_keys.js
+++ b/IPython/html/tests/notebook/arrow_keys.js
@@ -2,23 +2,22 @@
// Check for errors with up and down arrow presses in a non-empty notebook.
//
casper.notebook_test(function () {
- var result = this.evaluate(function() {
- IPython.notebook.command_mode();
- pos0 = IPython.notebook.get_selected_index();
- IPython.keyboard.trigger_keydown('b');
- pos1 = IPython.notebook.get_selected_index();
- IPython.keyboard.trigger_keydown('b');
- pos2 = IPython.notebook.get_selected_index();
- // Simulate the "up arrow" and "down arrow" keys.
- IPython.keyboard.trigger_keydown('up');
- pos3 = IPython.notebook.get_selected_index();
- IPython.keyboard.trigger_keydown('down');
- pos4 = IPython.notebook.get_selected_index();
- return pos0 == 0 &&
- pos1 == 1 &&
- pos2 == 2 &&
- pos3 == 1 &&
- pos4 == 2;
+ this.then(function(){
+ var result = this.evaluate(function() {
+ IPython.notebook.command_mode();
+ pos0 = IPython.notebook.get_selected_index();
+ IPython.keyboard.trigger_keydown('b');
+ pos1 = IPython.notebook.get_selected_index();
+ IPython.keyboard.trigger_keydown('b');
+ pos2 = IPython.notebook.get_selected_index();
+ // Simulate the "up arrow" and "down arrow" keys.
+ IPython.keyboard.trigger_keydown('up');
+ pos3 = IPython.notebook.get_selected_index();
+ IPython.keyboard.trigger_keydown('down');
+ pos4 = IPython.notebook.get_selected_index();
+ return [pos0, pos1, pos2, pos3, pos4];
+ });
+ this.test.assertEquals(result, [0, 1, 2, 1, 2], 'Up/down arrow okay in non-empty notebook.');
});
- this.test.assertTrue(result, 'Up/down arrow okay in non-empty notebook.');
+
});
diff --git a/IPython/html/tests/notebook/safe_append_output.js b/IPython/html/tests/notebook/safe_append_output.js
index 1217740..6126048 100644
--- a/IPython/html/tests/notebook/safe_append_output.js
+++ b/IPython/html/tests/notebook/safe_append_output.js
@@ -25,7 +25,7 @@ casper.notebook_test(function () {
this.then(function () {
var output = this.get_output_cell(0);
this.test.assert(messages.length > 0, "Captured log message");
- this.test.assertEquals(messages[messages.length-1], "Invalid type for image/png 5", "Logged Invalid type message");
+ this.test.assertEquals(messages[messages.length-1].splice(0, 26), "Invalid type for image/png", "Logged Invalid type message");
this.test.assertEquals(output['image/png'], undefined, "Non-string png data was stripped");
this.test.assertEquals(output['text/plain'], '5', "text data is fine");
});