diff options
| author | Chia-liang Kao | 2013-12-18 00:28:35 -0800 | 
|---|---|---|
| committer | Tobias Bosch | 2013-12-18 12:28:07 -0800 | 
| commit | 3dc18037e8db8766641a4d39f0fee96077db1fcb (patch) | |
| tree | 4a9ba7c7c2666eff6e9f7eb2e6957bda8f8a271c | |
| parent | 57d50582aa7213acf77b2936f70f4c2122d206d6 (diff) | |
| download | angular.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.js | 16 | ||||
| -rw-r--r-- | test/ng/directive/inputSpec.js | 44 | 
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) {  | 
