Skip to content
This repository was archived by the owner on Apr 12, 2024. It is now read-only.

Commit 3dc1803

Browse files
clkaotbosch
authored andcommitted
fix(input): do not hold input for composition on android
Workaround for chrome for android until #2129 is ready. Closes #5308, #5323
1 parent 57d5058 commit 3dc1803

File tree

2 files changed

+40
-20
lines changed

2 files changed

+40
-20
lines changed

src/ng/directive/input.js

+9-7
Original file line numberDiff line numberDiff line change
@@ -395,15 +395,17 @@ function textInputType(scope, element, attr, ctrl, $sniffer, $browser) {
395395
// In composition mode, users are still inputing intermediate text buffer,
396396
// hold the listener until composition is done.
397397
// More about composition events: https://developer.mozilla.org/en-US/docs/Web/API/CompositionEvent
398-
var composing = false;
398+
if (!$sniffer.android) {
399+
var composing = false;
399400

400-
element.on('compositionstart', function() {
401-
composing = true;
402-
});
401+
element.on('compositionstart', function(data) {
402+
composing = true;
403+
});
403404

404-
element.on('compositionend', function() {
405-
composing = false;
406-
});
405+
element.on('compositionend', function() {
406+
composing = false;
407+
});
408+
}
407409

408410
var listener = function() {
409411
if (composing) return;

test/ng/directive/inputSpec.js

+31-13
Original file line numberDiff line numberDiff line change
@@ -477,19 +477,37 @@ describe('input', function() {
477477
expect(scope.name).toEqual('adam');
478478
});
479479

480-
it('should not update the model between "compositionstart" and "compositionend"', function() {
481-
compileInput('<input type="text" ng-model="name" name="alias"" />');
482-
changeInputValueTo('a');
483-
expect(scope.name).toEqual('a');
484-
if (!(msie < 9)) {
485-
browserTrigger(inputElm, 'compositionstart');
486-
changeInputValueTo('adam');
487-
expect(scope.name).toEqual('a');
488-
browserTrigger(inputElm, 'compositionend');
489-
}
490-
changeInputValueTo('adam');
491-
expect(scope.name).toEqual('adam');
492-
});
480+
if (!(msie < 9)) {
481+
describe('compositionevents', function() {
482+
it('should not update the model between "compositionstart" and "compositionend" on non android', inject(function($sniffer) {
483+
$sniffer.android = false;
484+
485+
compileInput('<input type="text" ng-model="name" name="alias"" />');
486+
changeInputValueTo('a');
487+
expect(scope.name).toEqual('a');
488+
browserTrigger(inputElm, 'compositionstart');
489+
changeInputValueTo('adam');
490+
expect(scope.name).toEqual('a');
491+
browserTrigger(inputElm, 'compositionend');
492+
changeInputValueTo('adam');
493+
expect(scope.name).toEqual('adam');
494+
}));
495+
496+
it('should update the model between "compositionstart" and "compositionend" on android', inject(function($sniffer) {
497+
$sniffer.android = true;
498+
499+
compileInput('<input type="text" ng-model="name" name="alias"" />');
500+
changeInputValueTo('a');
501+
expect(scope.name).toEqual('a');
502+
browserTrigger(inputElm, 'compositionstart');
503+
changeInputValueTo('adam');
504+
expect(scope.name).toEqual('adam');
505+
browserTrigger(inputElm, 'compositionend');
506+
changeInputValueTo('adam2');
507+
expect(scope.name).toEqual('adam2');
508+
}));
509+
});
510+
}
493511

494512
describe('"change" event', function() {
495513
function assertBrowserSupportsChangeEvent(inputEventSupported) {

0 commit comments

Comments
 (0)