diff --git a/src/ng/directive/input.js b/src/ng/directive/input.js index fdbefe2fcade..6a974d9dae02 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 c568e807d112..48319cfaf2ff 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(''); - 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(''); + 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(''); + 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) {