diff --git a/src/AngularPublic.js b/src/AngularPublic.js index 29338aee4731..b81257b9fff7 100644 --- a/src/AngularPublic.js +++ b/src/AngularPublic.js @@ -83,7 +83,8 @@ $TimeoutProvider, $$RAFProvider, $$AsyncCallbackProvider, - $WindowProvider + $WindowProvider, + $$jqLiteProvider */ @@ -236,7 +237,8 @@ function publishExternalAPI(angular) { $timeout: $TimeoutProvider, $window: $WindowProvider, $$rAF: $$RAFProvider, - $$asyncCallback: $$AsyncCallbackProvider + $$asyncCallback: $$AsyncCallbackProvider, + $$jqLite: $$jqLiteProvider }); } ]); diff --git a/src/jqLite.js b/src/jqLite.js index 9670341bcba0..1b7f638c2bb6 100644 --- a/src/jqLite.js +++ b/src/jqLite.js @@ -1003,3 +1003,24 @@ forEach({ JQLite.prototype.bind = JQLite.prototype.on; JQLite.prototype.unbind = JQLite.prototype.off; }); + + +// Provider for private $$jqLite service +function $$jqLiteProvider() { + this.$get = function $$jqLite() { + return extend(JQLite, { + hasClass: function(node, classes) { + if (node.attr) node = node[0]; + return jqLiteHasClass(node, classes); + }, + addClass: function(node, classes) { + if (node.attr) node = node[0]; + return jqLiteAddClass(node, classes); + }, + removeClass: function(node, classes) { + if (node.attr) node = node[0]; + return jqLiteRemoveClass(node, classes); + } + }); + }; +} diff --git a/src/ngAnimate/animate.js b/src/ngAnimate/animate.js index 7de87f334f2b..f1cf3bcaedf0 100644 --- a/src/ngAnimate/animate.js +++ b/src/ngAnimate/animate.js @@ -473,11 +473,12 @@ angular.module('ngAnimate', ['ng']) function isMatchingElement(elm1, elm2) { return extractElementNode(elm1) == extractElementNode(elm2); } - + var $$jqLite; $provide.decorator('$animate', - ['$delegate', '$$q', '$injector', '$sniffer', '$rootElement', '$$asyncCallback', '$rootScope', '$document', '$templateRequest', - function($delegate, $$q, $injector, $sniffer, $rootElement, $$asyncCallback, $rootScope, $document, $templateRequest) { + ['$delegate', '$$q', '$injector', '$sniffer', '$rootElement', '$$asyncCallback', '$rootScope', '$document', '$templateRequest', '$$jqLite', + function($delegate, $$q, $injector, $sniffer, $rootElement, $$asyncCallback, $rootScope, $document, $templateRequest, $$$jqLite) { + $$jqLite = $$$jqLite; $rootElement.data(NG_ANIMATE_STATE, rootAnimateState); // Wait until all directive and route-related templates are downloaded and @@ -1380,10 +1381,10 @@ angular.module('ngAnimate', ['ng']) //the ng-animate class does nothing, but it's here to allow for //parent animations to find and cancel child animations when needed - element.addClass(NG_ANIMATE_CLASS_NAME); + $$jqLite.addClass(element, NG_ANIMATE_CLASS_NAME); if (options && options.tempClasses) { forEach(options.tempClasses, function(className) { - element.addClass(className); + $$jqLite.addClass(element, className); }); } @@ -1461,7 +1462,7 @@ angular.module('ngAnimate', ['ng']) closeAnimation.hasBeenRun = true; if (options && options.tempClasses) { forEach(options.tempClasses, function(className) { - element.removeClass(className); + $$jqLite.removeClass(element, className); }); } @@ -1523,7 +1524,7 @@ angular.module('ngAnimate', ['ng']) } if (removeAnimations || !data.totalActive) { - element.removeClass(NG_ANIMATE_CLASS_NAME); + $$jqLite.removeClass(element, NG_ANIMATE_CLASS_NAME); element.removeData(NG_ANIMATE_STATE); } } @@ -1764,14 +1765,14 @@ angular.module('ngAnimate', ['ng']) var staggerCacheKey = cacheKey + ' ' + staggerClassName; var applyClasses = !lookupCache[staggerCacheKey]; - applyClasses && element.addClass(staggerClassName); + applyClasses && $$jqLite.addClass(element, staggerClassName); stagger = getElementAnimationDetails(element, staggerCacheKey); - applyClasses && element.removeClass(staggerClassName); + applyClasses && $$jqLite.removeClass(element, staggerClassName); } - element.addClass(className); + $$jqLite.addClass(element, className); var formerData = element.data(NG_ANIMATE_CSS_DATA_KEY) || {}; var timings = getElementAnimationDetails(element, eventCacheKey); @@ -1779,7 +1780,7 @@ angular.module('ngAnimate', ['ng']) var animationDuration = timings.animationDuration; if (structural && transitionDuration === 0 && animationDuration === 0) { - element.removeClass(className); + $$jqLite.removeClass(element, className); return false; } @@ -1851,7 +1852,7 @@ angular.module('ngAnimate', ['ng']) } if (!staggerTime) { - element.addClass(activeClassName); + $$jqLite.addClass(element, activeClassName); if (elementData.blockTransition) { blockTransitions(node, false); } @@ -1861,7 +1862,7 @@ angular.module('ngAnimate', ['ng']) var timings = getElementAnimationDetails(element, eventCacheKey); var maxDuration = Math.max(timings.transitionDuration, timings.animationDuration); if (maxDuration === 0) { - element.removeClass(activeClassName); + $$jqLite.removeClass(element, activeClassName); animateClose(element, className); activeAnimationComplete(); return; @@ -1896,7 +1897,7 @@ angular.module('ngAnimate', ['ng']) var staggerTimeout; if (staggerTime > 0) { - element.addClass(pendingClassName); + $$jqLite.addClass(element, pendingClassName); staggerTimeout = $timeout(function() { staggerTimeout = null; @@ -1907,8 +1908,8 @@ angular.module('ngAnimate', ['ng']) blockAnimations(node, false); } - element.addClass(activeClassName); - element.removeClass(pendingClassName); + $$jqLite.addClass(element, activeClassName); + $$jqLite.removeClass(element, pendingClassName); if (styles) { if (timings.transitionDuration === 0) { @@ -1935,8 +1936,8 @@ angular.module('ngAnimate', ['ng']) // timeout done method. function onEnd() { element.off(css3AnimationEvents, onAnimationProgress); - element.removeClass(activeClassName); - element.removeClass(pendingClassName); + $$jqLite.removeClass(element, activeClassName); + $$jqLite.removeClass(element, pendingClassName); if (staggerTimeout) { $timeout.cancel(staggerTimeout); } @@ -2024,7 +2025,7 @@ angular.module('ngAnimate', ['ng']) } function animateClose(element, className) { - element.removeClass(className); + $$jqLite.removeClass(element, className); var data = element.data(NG_ANIMATE_CSS_DATA_KEY); if (data) { if (data.running) { diff --git a/test/ngAnimate/animateSpec.js b/test/ngAnimate/animateSpec.js index 9d38ce1110dc..9103d7bef7f4 100644 --- a/test/ngAnimate/animateSpec.js +++ b/test/ngAnimate/animateSpec.js @@ -5316,7 +5316,7 @@ describe("ngAnimate", function() { //jQuery doesn't handle SVG elements natively. Instead, an add-on library //is required which is called jquery.svg.js. Therefore, when jQuery is //active here there is no point to test this since it won't work by default. - if (!$sniffer.transitions || !_jqLiteMode) return; + if (!$sniffer.transitions) return; ss.addRule('circle.ng-enter', '-webkit-transition:1s linear all;' + 'transition:1s linear all;'); @@ -5336,13 +5336,13 @@ describe("ngAnimate", function() { var child = element.find('circle'); - expect(child.hasClass('ng-enter')).toBe(true); - expect(child.hasClass('ng-enter-active')).toBe(true); + expect(jqLiteHasClass(child[0], 'ng-enter')).toBe(true); + expect(jqLiteHasClass(child[0], 'ng-enter-active')).toBe(true); browserTrigger(child, 'transitionend', { timeStamp: Date.now() + 1000, elapsedTime: 1 }); - expect(child.hasClass('ng-enter')).toBe(false); - expect(child.hasClass('ng-enter-active')).toBe(false); + expect(jqLiteHasClass(child[0], 'ng-enter')).toBe(false); + expect(jqLiteHasClass(child[0], 'ng-enter-active')).toBe(false); }));