diff --git a/angular-widget.js b/angular-widget.js index 4e4a8e75..115d4c56 100644 --- a/angular-widget.js +++ b/angular-widget.js @@ -117,14 +117,21 @@ angular.module("angularWidgetInternal").directive("ngWidget", [ "$http", "$templ if (!emit && !event.stopPropagation || emit && event.stopPropagation) { var args = Array.prototype.slice.call(arguments); args[0] = name; - dst.$apply(function() { - if (fn.apply(dst, args).defaultPrevented) { - event.preventDefault(); - } - }); + if (dst.$root.$$phase) { + applyHandler(fn, dst, args, event); + } else { + dst.$apply(function() { + applyHandler(fn, dst, args, event); + }); + } } }); } + function applyHandler(fn, dst, args, event) { + if (fn.apply(dst, args).defaultPrevented) { + event.preventDefault(); + } + } function handleNewInjector() { var widgetConfig = injector.get("widgetConfig"); var widgetScope = injector.get("$rootScope"); @@ -253,7 +260,12 @@ angular.module("angularWidgetInternal").value("headElement", document.getElement return deferred.promise; } if (url in requireCache) { - return requireCache[url]; + requireCache[url].then(function(res) { + deferred.resolve(res); + }, function(res) { + deferred.reject(res); + }); + return deferred.promise; } requireCache[url] = deferred.promise; var fileref; diff --git a/app/scripts/directives/ng-widget.js b/app/scripts/directives/ng-widget.js index b4fc407b..bbf0f398 100644 --- a/app/scripts/directives/ng-widget.js +++ b/app/scripts/directives/ng-widget.js @@ -67,15 +67,23 @@ angular.module('angularWidgetInternal') if ((!emit && !event.stopPropagation) || (emit && event.stopPropagation)) { var args = Array.prototype.slice.call(arguments); args[0] = name; - dst.$apply(function () { - if (fn.apply(dst, args).defaultPrevented) { - event.preventDefault(); - } - }); + if (dst.$root.$$phase) { + applyHandler(fn, dst, args, event); + } else { + dst.$apply(function () { + applyHandler(fn, dst, args, event); + }); + } } }); } + function applyHandler(fn, dst, args, event) { + if (fn.apply(dst, args).defaultPrevented) { + event.preventDefault(); + } + } + function handleNewInjector() { var widgetConfig = injector.get('widgetConfig'); var widgetScope = injector.get('$rootScope'); diff --git a/app/scripts/services/tag-appender.js b/app/scripts/services/tag-appender.js index 050f3a57..156802c1 100644 --- a/app/scripts/services/tag-appender.js +++ b/app/scripts/services/tag-appender.js @@ -32,7 +32,12 @@ angular.module('angularWidgetInternal') return deferred.promise; } if (url in requireCache) { - return requireCache[url]; + requireCache[url].then(function (res) { + deferred.resolve(res); + }, function (res) { + deferred.reject(res); + }); + return deferred.promise; } requireCache[url] = deferred.promise; diff --git a/test/spec/directives/ng-widget.spec.js b/test/spec/directives/ng-widget.spec.js index fd558ac7..5af3978c 100644 --- a/test/spec/directives/ng-widget.spec.js +++ b/test/spec/directives/ng-widget.spec.js @@ -38,6 +38,7 @@ describe('Unit testing ngWidget directive', function () { widgetsProvider.addServiceToShare('$location'); widgetsProvider.addEventToForward('$locationChangeStart'); + widgetsProvider.addEventToForward('someEventToForward'); }); }); @@ -151,6 +152,26 @@ describe('Unit testing ngWidget directive', function () { expect(watchSpy).toHaveBeenCalled(); })); + it('should call forward events handler while running main scope\'s $digest cycle', inject(function ($rootScope) { + downloadWidgetSuccess(); + compileWidget(); + flushDownload(); + + var widgetScope = widgetInjector.get('$rootScope'); + var event1Handler = jasmine.createSpy('$locationChangeStart'); + var event2Handler = jasmine.createSpy('someEventToForward'); + + $rootScope.$on('someEventToForward', event2Handler); + $rootScope.$on('$locationChangeStart', event1Handler.andCallFake(function () { + widgetScope.$emit('someEventToForward'); + })); + + widgetScope.$emit('$locationChangeStart'); + + expect(event1Handler).toHaveBeenCalledWith(jasmine.any(Object)); + expect(event2Handler).toHaveBeenCalled(); + })); + it('should emit events that were declared as forwarded', inject(function ($rootScope) { downloadWidgetSuccess(); compileWidget(); diff --git a/test/spec/services/tag-appender.spec.js b/test/spec/services/tag-appender.spec.js index 31e15a66..8a514f20 100644 --- a/test/spec/services/tag-appender.spec.js +++ b/test/spec/services/tag-appender.spec.js @@ -73,10 +73,10 @@ describe('Unit testing tagAppender service', function () { .toBe(''); })); - it('should return the same promise when same file loads twice simultaneously ', inject (function (tagAppender) { - var firstLoadPromise = tagAppender('dummy.js', 'js'); - var secondLoadPromise = tagAppender('dummy.js', 'js'); - expect(firstLoadPromise).toEqual(secondLoadPromise); + it('should load the file only once in case the same file is loaded multiple times simultaneously ', inject (function (tagAppender) { + tagAppender('dummy.js', 'js'); + tagAppender('dummy.js', 'js'); + expect(headElement.appendChild.calls.length).toBe(1); })); it('should re try to download the file in case first attempt failed', inject (function (tagAppender) {