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

Revert: ngAnimate changes for listening on visibilitychange #14574

Merged
merged 1 commit into from
May 9, 2016
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 0 additions & 2 deletions src/AngularPublic.js
Original file line number Diff line number Diff line change
Expand Up @@ -64,7 +64,6 @@
$CacheFactoryProvider,
$ControllerProvider,
$DocumentProvider,
$$IsDocumentHiddenProvider,
$ExceptionHandlerProvider,
$FilterProvider,
$$ForceReflowProvider,
Expand Down Expand Up @@ -227,7 +226,6 @@ function publishExternalAPI(angular) {
$cacheFactory: $CacheFactoryProvider,
$controller: $ControllerProvider,
$document: $DocumentProvider,
$$isDocumentHidden: $$IsDocumentHiddenProvider,
$exceptionHandler: $ExceptionHandlerProvider,
$filter: $FilterProvider,
$$forceReflow: $$ForceReflowProvider,
Expand Down
10 changes: 7 additions & 3 deletions src/ng/animateRunner.js
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down Expand Up @@ -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);
Expand Down
26 changes: 0 additions & 26 deletions src/ng/document.js
Original file line number Diff line number Diff line change
Expand Up @@ -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;
};
}];
}
6 changes: 2 additions & 4 deletions src/ngAnimate/animateQueue.js
Original file line number Diff line number Diff line change
Expand Up @@ -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();
Expand Down Expand Up @@ -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
Expand Down
11 changes: 6 additions & 5 deletions test/ng/animateRunnerSpec.js
Original file line number Diff line number Diff line change
Expand Up @@ -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) {
Expand All @@ -183,7 +184,7 @@ describe("$$AnimateRunner", function() {
$timeout.flush();
expect(spy).toHaveBeenCalled();

hidden = false;
doc[0].hidden = false;

spy = jasmine.createSpy();
runner = new $$AnimateRunner();
Expand Down
43 changes: 22 additions & 21 deletions test/ng/compileSpec.js
Original file line number Diff line number Diff line change
Expand Up @@ -6087,22 +6087,22 @@ describe('$compile', function() {
});

inject(function($compile, $rootScope) {
var cacheSize = jqLiteCacheSize();
expect(jqLiteCacheSize()).toEqual(0);

element = $compile('<div><div ng-repeat="x in xs" ng-if="x==1">{{x}}</div></div>')($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);
});
});

Expand All @@ -6119,22 +6119,22 @@ describe('$compile', function() {
});

inject(function($compile, $rootScope) {
var cacheSize = jqLiteCacheSize();
expect(jqLiteCacheSize()).toEqual(0);

element = $compile('<div><div ng-repeat="x in xs" ng-if="x==1">{{x}}</div></div>')($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);
});
});

Expand All @@ -6150,26 +6150,26 @@ describe('$compile', function() {
});

inject(function($compile, $rootScope) {
var cacheSize = jqLiteCacheSize();
expect(jqLiteCacheSize()).toEqual(0);
element = $compile('<div><div ng-repeat="x in xs" ng-if="val">{{x}}</div></div>')($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);
});
});

Expand Down Expand Up @@ -6206,7 +6206,6 @@ describe('$compile', function() {
});

inject(function($compile, $rootScope, $httpBackend, $timeout, $templateCache) {
var cacheSize = jqLiteCacheSize();
$httpBackend.whenGET('red.html').respond('<p>red.html</p>');
var template = $compile(
'<div ng-controller="Leak">' +
Expand All @@ -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();
Expand Down Expand Up @@ -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('<div><ul><li ng-repeat="n in nums">{{n}} => <i ng-if="0 === n%2">Even</i><i ng-if="1 === n%2">Odd</i></li></ul></div>');
$compile(element)($rootScope.$new());
Expand All @@ -6998,7 +6999,7 @@ describe('$compile', function() {
expect(jqLiteCacheSize()).toEqual(size);

element.remove();
expect(jqLiteCacheSize()).toEqual(initialSize);
expect(jqLiteCacheSize()).toEqual(0);
});
});
});
Expand Down
28 changes: 0 additions & 28 deletions test/ng/documentSpec.js
Original file line number Diff line number Diff line change
Expand Up @@ -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));
});
});
});
25 changes: 13 additions & 12 deletions test/ngAnimate/animateSpec.js
Original file line number Diff line number Diff line change
Expand Up @@ -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) {
Expand All @@ -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();
Expand Down Expand Up @@ -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);

Expand Down