From 50da56dc2945ec3288634843ba8bbb9591429103 Mon Sep 17 00:00:00 2001 From: Martin Staffa Date: Mon, 9 May 2016 13:43:54 +0200 Subject: [PATCH] Revert: ngAnimate changes for listening on visibilitychange Reverts d3e123b, bf1acf7 and aa28e48. Backporting the changes is complicated because we don't destroy the rootScope after each test in 1.4.x --- src/AngularPublic.js | 2 -- src/ng/animateRunner.js | 10 +++++--- src/ng/document.js | 26 --------------------- src/ngAnimate/animateQueue.js | 6 ++--- test/ng/animateRunnerSpec.js | 11 +++++---- test/ng/compileSpec.js | 43 ++++++++++++++++++----------------- test/ng/documentSpec.js | 28 ----------------------- test/ngAnimate/animateSpec.js | 25 ++++++++++---------- 8 files changed, 50 insertions(+), 101 deletions(-) diff --git a/src/AngularPublic.js b/src/AngularPublic.js index d57586100ce1..70ca29511405 100644 --- a/src/AngularPublic.js +++ b/src/AngularPublic.js @@ -64,7 +64,6 @@ $CacheFactoryProvider, $ControllerProvider, $DocumentProvider, - $$IsDocumentHiddenProvider, $ExceptionHandlerProvider, $FilterProvider, $$ForceReflowProvider, @@ -227,7 +226,6 @@ function publishExternalAPI(angular) { $cacheFactory: $CacheFactoryProvider, $controller: $ControllerProvider, $document: $DocumentProvider, - $$isDocumentHidden: $$IsDocumentHiddenProvider, $exceptionHandler: $ExceptionHandlerProvider, $filter: $FilterProvider, $$forceReflow: $$ForceReflowProvider, diff --git a/src/ng/animateRunner.js b/src/ng/animateRunner.js index adc052775501..c1552faa18a2 100644 --- a/src/ng/animateRunner.js +++ b/src/ng/animateRunner.js @@ -28,8 +28,8 @@ var $$AnimateAsyncRunFactoryProvider = function() { }; var $$AnimateRunnerFactoryProvider = function() { - this.$get = ['$q', '$sniffer', '$$animateAsyncRun', '$$isDocumentHidden', '$timeout', - function($q, $sniffer, $$animateAsyncRun, $$isDocumentHidden, $timeout) { + this.$get = ['$q', '$sniffer', '$$animateAsyncRun', '$document', '$timeout', + function($q, $sniffer, $$animateAsyncRun, $document, $timeout) { var INITIAL_STATE = 0; var DONE_PENDING_STATE = 1; @@ -81,7 +81,11 @@ var $$AnimateRunnerFactoryProvider = function() { this._doneCallbacks = []; this._tick = function(fn) { - if ($$isDocumentHidden()) { + var doc = $document[0]; + + // the document may not be ready or attached + // to the module for some internal tests + if (doc && doc.hidden) { timeoutTick(fn); } else { rafTick(fn); diff --git a/src/ng/document.js b/src/ng/document.js index 27f9a33951e8..fcab252bf9ac 100644 --- a/src/ng/document.js +++ b/src/ng/document.js @@ -30,29 +30,3 @@ function $DocumentProvider() { return jqLite(window.document); }]; } - - -/** - * @private - * Listens for document visibility change and makes the current status accessible. - */ -function $$IsDocumentHiddenProvider() { - this.$get = ['$document', '$rootScope', function($document, $rootScope) { - var doc = $document[0]; - var hidden = doc && doc.hidden; - - $document.on('visibilitychange', changeListener); - - $rootScope.$on('$destroy', function() { - $document.off('visibilitychange', changeListener); - }); - - function changeListener() { - hidden = doc.hidden; - } - - return function() { - return hidden; - }; - }]; -} diff --git a/src/ngAnimate/animateQueue.js b/src/ngAnimate/animateQueue.js index 9a8c4a8e0002..5fbbfa5a190c 100644 --- a/src/ngAnimate/animateQueue.js +++ b/src/ngAnimate/animateQueue.js @@ -97,10 +97,8 @@ var $$AnimateQueueProvider = ['$animateProvider', function($animateProvider) { this.$get = ['$$rAF', '$rootScope', '$rootElement', '$document', '$$HashMap', '$$animation', '$$AnimateRunner', '$templateRequest', '$$jqLite', '$$forceReflow', - '$$isDocumentHidden', function($$rAF, $rootScope, $rootElement, $document, $$HashMap, - $$animation, $$AnimateRunner, $templateRequest, $$jqLite, $$forceReflow, - $$isDocumentHidden) { + $$animation, $$AnimateRunner, $templateRequest, $$jqLite, $$forceReflow) { var activeAnimationsLookup = new $$HashMap(); var disabledElementsLookup = new $$HashMap(); @@ -333,7 +331,7 @@ var $$AnimateQueueProvider = ['$animateProvider', function($animateProvider) { var isStructural = ['enter', 'move', 'leave'].indexOf(event) >= 0; - var documentHidden = $$isDocumentHidden(); + var documentHidden = $document[0].hidden; // this is a hard disable of all animations for the application or on // the element itself, therefore there is no need to continue further diff --git a/test/ng/animateRunnerSpec.js b/test/ng/animateRunnerSpec.js index 38d658cfec35..622da76ff22b 100644 --- a/test/ng/animateRunnerSpec.js +++ b/test/ng/animateRunnerSpec.js @@ -163,13 +163,14 @@ describe("$$AnimateRunner", function() { })); it("should use timeouts to trigger async operations when the document is hidden", function() { - var hidden = true; + var doc; module(function($provide) { - - $provide.value('$$isDocumentHidden', function() { - return hidden; + doc = jqLite({ + body: document.body, + hidden: true }); + $provide.value('$document', doc); }); inject(function($$AnimateRunner, $rootScope, $$rAF, $timeout) { @@ -183,7 +184,7 @@ describe("$$AnimateRunner", function() { $timeout.flush(); expect(spy).toHaveBeenCalled(); - hidden = false; + doc[0].hidden = false; spy = jasmine.createSpy(); runner = new $$AnimateRunner(); diff --git a/test/ng/compileSpec.js b/test/ng/compileSpec.js index 752b2659dd75..92c402335580 100755 --- a/test/ng/compileSpec.js +++ b/test/ng/compileSpec.js @@ -6087,22 +6087,22 @@ describe('$compile', function() { }); inject(function($compile, $rootScope) { - var cacheSize = jqLiteCacheSize(); + expect(jqLiteCacheSize()).toEqual(0); element = $compile('
{{x}}
')($rootScope); - expect(jqLiteCacheSize()).toEqual(cacheSize + 1); + expect(jqLiteCacheSize()).toEqual(1); $rootScope.$apply('xs = [0,1]'); - expect(jqLiteCacheSize()).toEqual(cacheSize + 2); + expect(jqLiteCacheSize()).toEqual(2); $rootScope.$apply('xs = [0]'); - expect(jqLiteCacheSize()).toEqual(cacheSize + 1); + expect(jqLiteCacheSize()).toEqual(1); $rootScope.$apply('xs = []'); - expect(jqLiteCacheSize()).toEqual(cacheSize + 1); + expect(jqLiteCacheSize()).toEqual(1); element.remove(); - expect(jqLiteCacheSize()).toEqual(cacheSize + 0); + expect(jqLiteCacheSize()).toEqual(0); }); }); @@ -6119,22 +6119,22 @@ describe('$compile', function() { }); inject(function($compile, $rootScope) { - var cacheSize = jqLiteCacheSize(); + expect(jqLiteCacheSize()).toEqual(0); element = $compile('
{{x}}
')($rootScope); - expect(jqLiteCacheSize()).toEqual(cacheSize); + expect(jqLiteCacheSize()).toEqual(0); $rootScope.$apply('xs = [0,1]'); - expect(jqLiteCacheSize()).toEqual(cacheSize); + expect(jqLiteCacheSize()).toEqual(0); $rootScope.$apply('xs = [0]'); - expect(jqLiteCacheSize()).toEqual(cacheSize); + expect(jqLiteCacheSize()).toEqual(0); $rootScope.$apply('xs = []'); - expect(jqLiteCacheSize()).toEqual(cacheSize); + expect(jqLiteCacheSize()).toEqual(0); element.remove(); - expect(jqLiteCacheSize()).toEqual(cacheSize); + expect(jqLiteCacheSize()).toEqual(0); }); }); @@ -6150,26 +6150,26 @@ describe('$compile', function() { }); inject(function($compile, $rootScope) { - var cacheSize = jqLiteCacheSize(); + expect(jqLiteCacheSize()).toEqual(0); element = $compile('
{{x}}
')($rootScope); $rootScope.$apply('xs = [0,1]'); // At this point we have a bunch of comment placeholders but no real transcluded elements // So the cache only contains the root element's data - expect(jqLiteCacheSize()).toEqual(cacheSize + 1); + expect(jqLiteCacheSize()).toEqual(1); $rootScope.$apply('val = true'); // Now we have two concrete transcluded elements plus some comments so two more cache items - expect(jqLiteCacheSize()).toEqual(cacheSize + 3); + expect(jqLiteCacheSize()).toEqual(3); $rootScope.$apply('val = false'); // Once again we only have comments so no transcluded elements and the cache is back to just // the root element - expect(jqLiteCacheSize()).toEqual(cacheSize + 1); + expect(jqLiteCacheSize()).toEqual(1); element.remove(); // Now we've even removed the root element along with its cache - expect(jqLiteCacheSize()).toEqual(cacheSize + 0); + expect(jqLiteCacheSize()).toEqual(0); }); }); @@ -6206,7 +6206,6 @@ describe('$compile', function() { }); inject(function($compile, $rootScope, $httpBackend, $timeout, $templateCache) { - var cacheSize = jqLiteCacheSize(); $httpBackend.whenGET('red.html').respond('

red.html

'); var template = $compile( '
' + @@ -6221,7 +6220,7 @@ describe('$compile', function() { $timeout.flush(); $httpBackend.flush(); expect(linkFn).not.toHaveBeenCalled(); - expect(jqLiteCacheSize()).toEqual(cacheSize + 2); + expect(jqLiteCacheSize()).toEqual(2); $templateCache.removeAll(); var destroyedScope = $rootScope.$new(); @@ -6984,7 +6983,9 @@ describe('$compile', function() { it('should not leak memory with nested transclusion', function() { inject(function($compile, $rootScope) { - var size, initialSize = jqLiteCacheSize(); + var size; + + expect(jqLiteCacheSize()).toEqual(0); element = jqLite('
  • {{n}} => EvenOdd
'); $compile(element)($rootScope.$new()); @@ -6998,7 +6999,7 @@ describe('$compile', function() { expect(jqLiteCacheSize()).toEqual(size); element.remove(); - expect(jqLiteCacheSize()).toEqual(initialSize); + expect(jqLiteCacheSize()).toEqual(0); }); }); }); diff --git a/test/ng/documentSpec.js b/test/ng/documentSpec.js index 66116cb4482e..3fbca1d7a048 100644 --- a/test/ng/documentSpec.js +++ b/test/ng/documentSpec.js @@ -27,31 +27,3 @@ describe('$document', function() { }); }); }); - - -describe('$$isDocumentHidden', function() { - it('should return false by default', inject(function($$isDocumentHidden, $document) { - expect($$isDocumentHidden()).toBeFalsy(); // undefined in browsers that don't support visibility - })); - - it('should listen on the visibilitychange event', function() { - var spy = spyOn(document, 'addEventListener').andCallThrough(); - - inject(function($$isDocumentHidden, $document) { - expect(spy.mostRecentCall.args[0]).toBe('visibilitychange'); - expect(spy.mostRecentCall.args[1]).toEqual(jasmine.any(Function)); - expect($$isDocumentHidden()).toBeFalsy(); // undefined in browsers that don't support visibility - }); - - }); - - it('should remove the listener when the $rootScope is destroyed', function() { - var spy = spyOn(document, 'removeEventListener').andCallThrough(); - - inject(function($$isDocumentHidden, $rootScope) { - $rootScope.$destroy(); - expect(spy.mostRecentCall.args[0]).toBe('visibilitychange'); - expect(spy.mostRecentCall.args[1]).toEqual(jasmine.any(Function)); - }); - }); -}); diff --git a/test/ngAnimate/animateSpec.js b/test/ngAnimate/animateSpec.js index 4f5bc888ac42..503a52e42bf2 100644 --- a/test/ngAnimate/animateSpec.js +++ b/test/ngAnimate/animateSpec.js @@ -156,12 +156,14 @@ describe("animations", function() { })); it("should skip animations entirely if the document is hidden", function() { - var hidden = true; + var doc; module(function($provide) { - $provide.value('$$isDocumentHidden', function() { - return hidden; + doc = jqLite({ + body: document.body, + hidden: true }); + $provide.value('$document', doc); }); inject(function($animate, $rootScope) { @@ -170,7 +172,7 @@ describe("animations", function() { expect(capturedAnimation).toBeFalsy(); expect(element[0].parentNode).toEqual(parent[0]); - hidden = false; + doc[0].hidden = false; $animate.leave(element); $rootScope.$digest(); @@ -2282,19 +2284,18 @@ describe("animations", function() { describe('because the document is hidden', function() { - var hidden = true; - - beforeEach(function() { - module(function($provide) { - $provide.value('$$isDocumentHidden', function() { - return hidden; - }); + beforeEach(module(function($provide) { + var doc = jqLite({ + body: document.body, + hidden: true }); - }); + $provide.value('$document', doc); + })); it('should trigger callbacks for an enter animation', inject(function($animate, $rootScope, $rootElement, $document) { + var callbackTriggered = false; var spy = jasmine.createSpy(); $animate.on('enter', jqLite($document[0].body), spy);