From 3cd5ea759f56f28da638a81d5132eccb7dbdf86f Mon Sep 17 00:00:00 2001 From: meh-cfl Date: Sat, 7 Apr 2012 10:01:33 +0100 Subject: [PATCH 1/2] Autocomplete: Up/down arrow keys don't toggle menu in textarea/content editable. Fixed #7639 - merge into 1.8 branch --- tests/unit/autocomplete/autocomplete.html | 2 + tests/unit/autocomplete/autocomplete_core.js | 79 ++++++++++++++++++++ ui/jquery.ui.autocomplete.js | 17 +++-- 3 files changed, 92 insertions(+), 6 deletions(-) diff --git a/tests/unit/autocomplete/autocomplete.html b/tests/unit/autocomplete/autocomplete.html index 1e7b58e803d..626c1a6453d 100644 --- a/tests/unit/autocomplete/autocomplete.html +++ b/tests/unit/autocomplete/autocomplete.html @@ -38,6 +38,8 @@

+
+ diff --git a/tests/unit/autocomplete/autocomplete_core.js b/tests/unit/autocomplete/autocomplete_core.js index 84f26980f40..453239019f4 100644 --- a/tests/unit/autocomplete/autocomplete_core.js +++ b/tests/unit/autocomplete/autocomplete_core.js @@ -97,5 +97,84 @@ asyncTest( "handle race condition", function() { start(); } }); +test( "up arrow invokes search - input", function() { + arrowsInvokeSearch( "#autocomplete", true, true ); +}); + +test( "down arrow invokes search - input", function() { + arrowsInvokeSearch( "#autocomplete", false, true ); +}); + +test( "up arrow invokes search - textarea", function() { + arrowsInvokeSearch( "#autocomplete-textarea", true, false ); +}); + +test( "down arrow invokes search - textarea", function() { + arrowsInvokeSearch( "#autocomplete-textarea", false, false ); +}); + +test( "up arrow invokes search - contenteditable", function() { + arrowsInvokeSearch( "#autocomplete-contenteditable", true, false ); +}); + +test( "down arrow invokes search - contenteditable", function() { + arrowsInvokeSearch( "#autocomplete-contenteditable", false, false ); +}); + +test( "up arrow moves focus - input", function() { + arrowsMoveFocus( "#autocomplete", true ); +}); + +test( "down arrow moves focus - input", function() { + arrowsMoveFocus( "#autocomplete", false ); +}); + +test( "up arrow moves focus - textarea", function() { + arrowsMoveFocus( "#autocomplete-textarea", true ); +}); + +test( "down arrow moves focus - textarea", function() { + arrowsMoveFocus( "#autocomplete-textarea", false ); +}); + +test( "up arrow moves focus - contenteditable", function() { + arrowsMoveFocus( "#autocomplete-contenteditable", true ); +}); + +test( "down arrow moves focus - contenteditable", function() { + arrowsMoveFocus( "#autocomplete-contenteditable", false ); +}); + +function arrowsInvokeSearch( id, isKeyUp, shouldMove ) { + expect( 1 ); + + var didMove = false, + element = $( id ).autocomplete({ + source: [ "a" ], + delay: 0, + minLength: 0 + }); + element.data( "autocomplete" )._move = function() { + didMove = true; + }; + element.simulate( "keydown", { keyCode: ( isKeyUp ? $.ui.keyCode.UP : $.ui.keyCode.DOWN ) } ); + equal( didMove, shouldMove, "respond to arrow" ); +} + +function arrowsMoveFocus( id, isKeyUp ) { + expect( 1 ); + + var didMove = false, + element = $( id ).autocomplete({ + source: [ "a" ], + delay: 0, + minLength: 0 + }); + element.data( "autocomplete" )._move = function() { + ok( true, "repsond to arrow" ); + }; + element.autocomplete( "search" ); + element.simulate( "keydown", { keyCode: ( isKeyUp ? $.ui.keyCode.UP : $.ui.keyCode.DOWN ) } ); +} }( jQuery ) ); diff --git a/ui/jquery.ui.autocomplete.js b/ui/jquery.ui.autocomplete.js index 5352c343231..7cf1747c513 100644 --- a/ui/jquery.ui.autocomplete.js +++ b/ui/jquery.ui.autocomplete.js @@ -37,6 +37,7 @@ $.widget( "ui.autocomplete", { var self = this, doc = this.element[ 0 ].ownerDocument, suppressKeyPress; + this.isMultiLine = this.element.is( "textarea,[contenteditable]" ); this.element .addClass( "ui-autocomplete-input" ) @@ -62,14 +63,10 @@ $.widget( "ui.autocomplete", { self._move( "nextPage", event ); break; case keyCode.UP: - self._move( "previous", event ); - // prevent moving cursor to beginning of text field in some browsers - event.preventDefault(); + self._keyEvent( "previous", event ); break; case keyCode.DOWN: - self._move( "next", event ); - // prevent moving cursor to end of text field in some browsers - event.preventDefault(); + self._keyEvent( "next", event ); break; case keyCode.ENTER: case keyCode.NUMPAD_ENTER: @@ -424,6 +421,14 @@ $.widget( "ui.autocomplete", { widget: function() { return this.menu.element; + }, + _keyEvent: function( keyEvent, event ) { + if ( !this.isMultiLine || this.menu.element.is( ":visible" ) ) { + this._move( keyEvent, event ); + + // prevents moving cursor to beginning/end of the text field in some browsers + event.preventDefault(); + } } }); From 647d088015c66e5dfb67eba4afc5ba340e99ade2 Mon Sep 17 00:00:00 2001 From: meh-cfl Date: Sat, 7 Apr 2012 13:58:39 +0100 Subject: [PATCH 2/2] Autocomplete: Removing support for content editable for 1.8 branch as it's not yet supported. Bug #7639. --- tests/unit/autocomplete/autocomplete.html | 1 - tests/unit/autocomplete/autocomplete_core.js | 16 ---------------- ui/jquery.ui.autocomplete.js | 2 +- 3 files changed, 1 insertion(+), 18 deletions(-) diff --git a/tests/unit/autocomplete/autocomplete.html b/tests/unit/autocomplete/autocomplete.html index 626c1a6453d..88b7da4d852 100644 --- a/tests/unit/autocomplete/autocomplete.html +++ b/tests/unit/autocomplete/autocomplete.html @@ -38,7 +38,6 @@

-
diff --git a/tests/unit/autocomplete/autocomplete_core.js b/tests/unit/autocomplete/autocomplete_core.js index 453239019f4..fa7dce610f2 100644 --- a/tests/unit/autocomplete/autocomplete_core.js +++ b/tests/unit/autocomplete/autocomplete_core.js @@ -113,14 +113,6 @@ test( "down arrow invokes search - textarea", function() { arrowsInvokeSearch( "#autocomplete-textarea", false, false ); }); -test( "up arrow invokes search - contenteditable", function() { - arrowsInvokeSearch( "#autocomplete-contenteditable", true, false ); -}); - -test( "down arrow invokes search - contenteditable", function() { - arrowsInvokeSearch( "#autocomplete-contenteditable", false, false ); -}); - test( "up arrow moves focus - input", function() { arrowsMoveFocus( "#autocomplete", true ); }); @@ -137,14 +129,6 @@ test( "down arrow moves focus - textarea", function() { arrowsMoveFocus( "#autocomplete-textarea", false ); }); -test( "up arrow moves focus - contenteditable", function() { - arrowsMoveFocus( "#autocomplete-contenteditable", true ); -}); - -test( "down arrow moves focus - contenteditable", function() { - arrowsMoveFocus( "#autocomplete-contenteditable", false ); -}); - function arrowsInvokeSearch( id, isKeyUp, shouldMove ) { expect( 1 ); diff --git a/ui/jquery.ui.autocomplete.js b/ui/jquery.ui.autocomplete.js index 7cf1747c513..3a6f3468890 100644 --- a/ui/jquery.ui.autocomplete.js +++ b/ui/jquery.ui.autocomplete.js @@ -37,7 +37,7 @@ $.widget( "ui.autocomplete", { var self = this, doc = this.element[ 0 ].ownerDocument, suppressKeyPress; - this.isMultiLine = this.element.is( "textarea,[contenteditable]" ); + this.isMultiLine = this.element.is( "textarea" ); this.element .addClass( "ui-autocomplete-input" )