aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorChia-liang Kao2013-12-18 00:28:35 -0800
committerTobias Bosch2013-12-18 12:28:07 -0800
commit3dc18037e8db8766641a4d39f0fee96077db1fcb (patch)
tree4a9ba7c7c2666eff6e9f7eb2e6957bda8f8a271c
parent57d50582aa7213acf77b2936f70f4c2122d206d6 (diff)
downloadangular.js-3dc18037e8db8766641a4d39f0fee96077db1fcb.tar.bz2
fix(input): do not hold input for composition on android
Workaround for chrome for android until #2129 is ready. Closes #5308, #5323
-rw-r--r--src/ng/directive/input.js16
-rw-r--r--test/ng/directive/inputSpec.js44
2 files changed, 40 insertions, 20 deletions
diff --git a/src/ng/directive/input.js b/src/ng/directive/input.js
index fdbefe2f..6a974d9d 100644
--- a/src/ng/directive/input.js
+++ b/src/ng/directive/input.js
@@ -395,15 +395,17 @@ function textInputType(scope, element, attr, ctrl, $sniffer, $browser) {
// In composition mode, users are still inputing intermediate text buffer,
// hold the listener until composition is done.
// More about composition events: https://developer.mozilla.org/en-US/docs/Web/API/CompositionEvent
- var composing = false;
+ if (!$sniffer.android) {
+ var composing = false;
- element.on('compositionstart', function() {
- composing = true;
- });
+ element.on('compositionstart', function(data) {
+ composing = true;
+ });
- element.on('compositionend', function() {
- composing = false;
- });
+ element.on('compositionend', function() {
+ composing = false;
+ });
+ }
var listener = function() {
if (composing) return;
diff --git a/test/ng/directive/inputSpec.js b/test/ng/directive/inputSpec.js
index c568e807..48319cfa 100644
--- a/test/ng/directive/inputSpec.js
+++ b/test/ng/directive/inputSpec.js
@@ -477,19 +477,37 @@ describe('input', function() {
expect(scope.name).toEqual('adam');
});
- it('should not update the model between "compositionstart" and "compositionend"', function() {
- compileInput('<input type="text" ng-model="name" name="alias"" />');
- changeInputValueTo('a');
- expect(scope.name).toEqual('a');
- if (!(msie < 9)) {
- browserTrigger(inputElm, 'compositionstart');
- changeInputValueTo('adam');
- expect(scope.name).toEqual('a');
- browserTrigger(inputElm, 'compositionend');
- }
- changeInputValueTo('adam');
- expect(scope.name).toEqual('adam');
- });
+ if (!(msie < 9)) {
+ describe('compositionevents', function() {
+ it('should not update the model between "compositionstart" and "compositionend" on non android', inject(function($sniffer) {
+ $sniffer.android = false;
+
+ compileInput('<input type="text" ng-model="name" name="alias"" />');
+ changeInputValueTo('a');
+ expect(scope.name).toEqual('a');
+ browserTrigger(inputElm, 'compositionstart');
+ changeInputValueTo('adam');
+ expect(scope.name).toEqual('a');
+ browserTrigger(inputElm, 'compositionend');
+ changeInputValueTo('adam');
+ expect(scope.name).toEqual('adam');
+ }));
+
+ it('should update the model between "compositionstart" and "compositionend" on android', inject(function($sniffer) {
+ $sniffer.android = true;
+
+ compileInput('<input type="text" ng-model="name" name="alias"" />');
+ changeInputValueTo('a');
+ expect(scope.name).toEqual('a');
+ browserTrigger(inputElm, 'compositionstart');
+ changeInputValueTo('adam');
+ expect(scope.name).toEqual('adam');
+ browserTrigger(inputElm, 'compositionend');
+ changeInputValueTo('adam2');
+ expect(scope.name).toEqual('adam2');
+ }));
+ });
+ }
describe('"change" event', function() {
function assertBrowserSupportsChangeEvent(inputEventSupported) {