diff --git a/src/loader.js b/src/loader.js index 336517783889..7266a066f3ce 100644 --- a/src/loader.js +++ b/src/loader.js @@ -203,7 +203,7 @@ function setupModuleLoader(window) { * @description * See {@link auto.$provide#decorator $provide.decorator()}. */ - decorator: invokeLaterAndSetModuleName('$provide', 'decorator'), + decorator: invokeLaterAndSetModuleName('$provide', 'decorator', configBlocks), /** * @ngdoc method @@ -349,10 +349,11 @@ function setupModuleLoader(window) { * @param {string} method * @returns {angular.Module} */ - function invokeLaterAndSetModuleName(provider, method) { + function invokeLaterAndSetModuleName(provider, method, queue) { + if (!queue) queue = invokeQueue; return function(recipeName, factoryFunction) { if (factoryFunction && isFunction(factoryFunction)) factoryFunction.$$moduleName = name; - invokeQueue.push([provider, method, arguments]); + queue.push([provider, method, arguments]); return moduleInstance; }; } diff --git a/test/loaderSpec.js b/test/loaderSpec.js index 317717f65e17..b63654c0d8d1 100644 --- a/test/loaderSpec.js +++ b/test/loaderSpec.js @@ -48,7 +48,6 @@ describe('module loader', function() { expect(myModule.requires).toEqual(['other']); expect(myModule._invokeQueue).toEqual([ ['$provide', 'constant', jasmine.objectContaining(['abc', 123])], - ['$provide', 'decorator', jasmine.objectContaining(['dk', 'dv'])], ['$provide', 'provider', jasmine.objectContaining(['sk', 'sv'])], ['$provide', 'factory', jasmine.objectContaining(['fk', 'fv'])], ['$provide', 'service', jasmine.objectContaining(['a', 'aa'])], @@ -60,12 +59,24 @@ describe('module loader', function() { ]); expect(myModule._configBlocks).toEqual([ ['$injector', 'invoke', jasmine.objectContaining(['config'])], + ['$provide', 'decorator', jasmine.objectContaining(['dk', 'dv'])], ['$injector', 'invoke', jasmine.objectContaining(['init2'])] ]); expect(myModule._runBlocks).toEqual(['runBlock']); }); + it("should not throw error when `module.decorator` is declared before provider that it decorates", function() { + angular.module('theModule', []). + decorator('theProvider', function($delegate) { return $delegate; }). + factory('theProvider', function() { return {}; }); + + expect(function() { + createInjector(['myModule']); + }).not.toThrow(); + }); + + it('should allow module redefinition', function() { expect(window.angular.module('a', [])).not.toBe(window.angular.module('a', [])); });