diff --git a/dist/angular-post-message.js b/dist/angular-post-message.js index 0547785..b3a9a85 100644 --- a/dist/angular-post-message.js +++ b/dist/angular-post-message.js @@ -1,8 +1,8 @@ -/*! -* angular-post-message v1.4.0 -* Copyright 2016 Kyle Welsby -* Licensed under The MIT License -*/ +/*! +* angular-post-message v1.4.1 +* Copyright 2019 Kyle Welsby +* Licensed under The MIT License +*/ (function() { 'use strict'; var app; @@ -13,12 +13,13 @@ '$window', '$postMessage', '$rootScope', function($window, $postMessage, $rootScope) { - $rootScope.$on('$messageOutgoing', function(event, message, domain) { - var sender; - if (domain == null) { + $rootScope.$on('$messageOutgoing', function(event, message, domain, sender) { + if (!domain) { domain = "*"; } - sender = $rootScope.sender || $window.parent; + if (!sender){ + sender = $rootScope.sender || $window.opener || $window.parent; + } return sender.postMessage(message, domain); }); @@ -58,11 +59,8 @@ lastMessage: function() { return $messages[$messages.length - 1]; }, - post: function(message, domain) { - if (!domain) { - domain = "*"; - } - return $rootScope.$broadcast('$messageOutgoing', message, domain); + post: function(message, domain, sender) { + return $rootScope.$broadcast('$messageOutgoing', message, domain, sender); } }; return api; diff --git a/dist/angular-post-message.min.js b/dist/angular-post-message.min.js index b861e85..c5d410f 100644 --- a/dist/angular-post-message.min.js +++ b/dist/angular-post-message.min.js @@ -1,6 +1,6 @@ -/*! -* angular-post-message v1.4.0 -* Copyright 2016 Kyle Welsby -* Licensed under The MIT License -*/ -(function(){"use strict";var a;a=angular.module("ngPostMessage",["ng"]),a.run(["$window","$postMessage","$rootScope",function(a,b,c){c.$on("$messageOutgoing",function(b,d,e){var f;return null==e&&(e="*"),f=c.sender||a.parent,f.postMessage(d,e)}),angular.element(a).bind("message",function(a){var d;if(a=a.originalEvent||a,a&&a.data){d=null,c.sender=a.source;try{d=angular.fromJson(a.data)}catch(e){d={},d.text=a.data}return d.origin=a.origin,c.$root.$broadcast("$messageIncoming",d),b.messages(d)}})}]),a.factory("$postMessage",["$rootScope",function(a){var b,c;return b=[],c={messages:function(c){return c&&(b.push(c),a.$digest()),b},lastMessage:function(){return b[b.length-1]},post:function(b,c){return c||(c="*"),a.$broadcast("$messageOutgoing",b,c)}}}])}).call(this); \ No newline at end of file +/*! +* angular-post-message v1.4.1 +* Copyright 2019 Kyle Welsby +* Licensed under The MIT License +*/ +(function(){"use strict";var a;a=angular.module("ngPostMessage",["ng"]),a.run(["$window","$postMessage","$rootScope",function(a,b,c){c.$on("$messageOutgoing",function(b,d,e,f){return e||(e="*"),f||(f=c.sender||a.opener||a.parent),f.postMessage(d,e)}),angular.element(a).bind("message",function(a){var d;if(a=a.originalEvent||a,a&&a.data){d=null,c.sender=a.source;try{d=angular.fromJson(a.data)}catch(e){d={},d.text=a.data}return d.origin=a.origin,c.$root.$broadcast("$messageIncoming",d),b.messages(d)}})}]),a.factory("$postMessage",["$rootScope",function(a){var b,c;return b=[],c={messages:function(c){return c&&(b.push(c),a.$digest()),b},lastMessage:function(){return b[b.length-1]},post:function(b,c,d){return a.$broadcast("$messageOutgoing",b,c,d)}}}])}).call(this); \ No newline at end of file diff --git a/karma.angular-1.2.conf.js b/karma.angular-1.2.conf.js index d34176e..cab4418 100644 --- a/karma.angular-1.2.conf.js +++ b/karma.angular-1.2.conf.js @@ -6,6 +6,7 @@ module.exports = function(config) { 'src/*.js', 'bower_components/angular-mocks-1.2/angular-mocks.js', 'tests/_helper.js', - 'tests/*.js' + 'tests/*.js', + 'tests/opener-1.2.html' ]; }; diff --git a/karma.angular-1.3.conf.js b/karma.angular-1.3.conf.js index fb2c9fb..f0d8a9b 100644 --- a/karma.angular-1.3.conf.js +++ b/karma.angular-1.3.conf.js @@ -6,6 +6,7 @@ module.exports = function(config) { 'src/*.js', 'bower_components/angular-mocks-1.3/angular-mocks.js', 'tests/_helper.js', - 'tests/*.js' + 'tests/*.js', + 'tests/opener-1.3.html' ]; }; diff --git a/karma.angular-1.4.conf.js b/karma.angular-1.4.conf.js index 995edc5..e9175e3 100644 --- a/karma.angular-1.4.conf.js +++ b/karma.angular-1.4.conf.js @@ -6,6 +6,7 @@ module.exports = function(config) { 'src/*.js', 'bower_components/angular-mocks-1.4/angular-mocks.js', 'tests/_helper.js', - 'tests/*.js' + 'tests/*.js', + 'tests/opener-1.4.html' ]; }; diff --git a/karma.conf.js b/karma.conf.js index b95b038..c0725f3 100644 --- a/karma.conf.js +++ b/karma.conf.js @@ -63,7 +63,8 @@ module.exports = function(config) { // preprocess matching files before serving them to the browser // available preprocessors: https://npmjs.org/browse/keyword/karma-preprocessor preprocessors: { - 'src/*.js': ['coverage'] + 'src/*.js': ['coverage'], + '**/*.html': ['ng-html2js'] }, @@ -110,6 +111,19 @@ module.exports = function(config) { { type: 'html', subdir: 'report-html' }, { type: 'lcovonly', subdir: '.', file: 'lcov.info' }, ] + }, + + ngHtml2JsPreprocessor: { + cacheIdFromPath: function(filepath) { + // remove version name + if(filepath.includes('opener')){ + return 'tests/opener.html' + } + return filepath; + }, + + //must load module + moduleName: 'opener_html' } }); diff --git a/package.json b/package.json index abbadeb..626e22e 100644 --- a/package.json +++ b/package.json @@ -14,10 +14,11 @@ "grunt-contrib-concat": "~0.5.1", "grunt-contrib-uglify": "~0.2.5", "jasmine-core": "^2.2.0", - "karma": "^0.12.31", + "karma": "^4.0.0", "karma-chrome-launcher": "^0.1.7", "karma-coverage": "^0.2.7", "karma-jasmine": "^0.3.5", + "karma-ng-html2js-preprocessor": "^1.0.0", "karma-sauce-launcher": "^0.2.10" } } diff --git a/scripts/ci.cmd b/scripts/ci.cmd new file mode 100644 index 0000000..7b5035b --- /dev/null +++ b/scripts/ci.cmd @@ -0,0 +1,5 @@ + + +call karma start karma.angular-1.4.conf.js +call karma start karma.angular-1.3.conf.js +call karma start karma.angular-1.2.conf.js diff --git a/src/angular-post-message.js b/src/angular-post-message.js index e8a750e..5ff4686 100644 --- a/src/angular-post-message.js +++ b/src/angular-post-message.js @@ -8,12 +8,13 @@ '$window', '$postMessage', '$rootScope', function($window, $postMessage, $rootScope) { - $rootScope.$on('$messageOutgoing', function(event, message, domain) { - var sender; - if (domain == null) { + $rootScope.$on('$messageOutgoing', function(event, message, domain, sender) { + if (!domain) { domain = "*"; } - sender = $rootScope.sender || $window.parent; + if (!sender){ + sender = $rootScope.sender || $window.opener || $window.parent; + } return sender.postMessage(message, domain); }); @@ -53,11 +54,8 @@ lastMessage: function() { return $messages[$messages.length - 1]; }, - post: function(message, domain) { - if (!domain) { - domain = "*"; - } - return $rootScope.$broadcast('$messageOutgoing', message, domain); + post: function(message, domain, sender) { + return $rootScope.$broadcast('$messageOutgoing', message, domain, sender); } }; return api; diff --git a/tests/angular-post-message-opener.js b/tests/angular-post-message-opener.js new file mode 100644 index 0000000..fc2d144 --- /dev/null +++ b/tests/angular-post-message-opener.js @@ -0,0 +1,45 @@ +(function() { + 'use strict'; + describe("ngPostMessage opener", function() { + var _popup, _incomingMessageListener; + _popup = null; + _incomingMessageListener = null; + beforeEach(function () { + module("ngPostMessage"); + jasmine.DEFAULT_TIMEOUT_INTERVAL = 10000; + }); + beforeEach(module('opener_html')); + + beforeEach(function(done) { + inject(function($rootScope,$templateCache,$window) { + var incomingMessageListener; + incomingMessageListener = jasmine.createSpy("listener"); + $rootScope.$on("$messageIncoming", incomingMessageListener); + _incomingMessageListener = incomingMessageListener; + + $window.name = $rootScope.$id; + $window.document.title = 'RootScope:' + $rootScope.$id; + + var html = $templateCache.get('tests/opener.html') + var popup = window.open("about:blank", "", "_blank"); + var doc = popup.document; + doc.write(html); + doc.title = 'Sub window:' + $rootScope.$id; + _popup = popup; + setTimeout(function() { + done(); + }, 500); + }); + }); + + it('posts the message form open window', function(done) { + inject(function() { + expect(_incomingMessageListener.calls.first().args[1].to).toEqual("opener"); + expect(_incomingMessageListener.calls.first().args[1].msg).toEqual("hi"); + _popup.close(); + done(); + }); + }); + }); + +}).call(this); diff --git a/tests/angular-post-message.js b/tests/angular-post-message.js index 6f231ae..9ac77e7 100644 --- a/tests/angular-post-message.js +++ b/tests/angular-post-message.js @@ -1,29 +1,44 @@ (function() { 'use strict'; describe("ngPostMessage", function() { - var $rootScope, messages, postMessage; + var $rootScope, messages, postMessage, $window; postMessage = null; $rootScope = null; + $window = null; messages = null; - beforeEach(module('ngPostMessage')); - beforeEach(inject(function(_$rootScope_, _$postMessage_) { + beforeEach(function () { + module("ngPostMessage",function ($provide) { + $provide.factory('$window', function () { + var wnd = window.open("about:blank", "", "_blank"); + wnd.document.write('
') + return wnd; + }); + }); + }); + beforeEach(inject(function(_$rootScope_, _$postMessage_, _$window_) { $rootScope = _$rootScope_; + $window = _$window_; + $window.name = $rootScope.$id; + $window.document.title = 'RootScope:' + $rootScope.$id; postMessage = _$postMessage_; messages = ["foo", "bar", '{ "foo": "bar" }', { foo: "bar" }]; })); it("has no messages", function() { expect(postMessage.messages[0]).toBeUndefined(); + $window.close(); }); it("stores message into array", function() { var m, msg; msg = "hello world"; m = postMessage.messages(msg); expect(m[0]).toEqual(msg); + $window.close(); }); describe("lastMessage()", function() { it("returns the last posted message", function() { postMessage.messages('hello world'); expect(postMessage.lastMessage()).toEqual("hello world"); + $window.close(); }); }); it("should broadcast an outgoing message", function() { @@ -32,6 +47,7 @@ $rootScope.$on("$messageOutgoing", outgoingMessageListener); postMessage.post(messages[0]); expect(outgoingMessageListener).toHaveBeenCalled(); + $window.close(); }); it("should broadcast the correct outgoing message", function() { @@ -40,6 +56,17 @@ $rootScope.$on("$messageOutgoing", outgoingMessageListener); postMessage.post(messages[0]); expect(outgoingMessageListener.calls.first().args[1]).toEqual(messages[0]); + $window.close(); + }); + + it("should broadcast the correct outgoing message with sender", function() { + var outgoingMessageListener; + outgoingMessageListener = jasmine.createSpy("listener"); + $rootScope.$on("$messageOutgoing", outgoingMessageListener); + postMessage.post(messages[0],null,$window); + expect(outgoingMessageListener.calls.first().args[2]).toEqual(null); + expect(outgoingMessageListener.calls.first().args[3]).toEqual($window); + $window.close(); }); it("should add data to object for valid JSON data", function(done) { @@ -47,8 +74,9 @@ expect(message.foo).toEqual(messages[3].foo); off(); done(); + $window.close(); }); - window.postMessage(messages[2], "*"); + $window.postMessage(messages[2], "*"); }); it("should set origin for valid JSON data", function(done) { @@ -56,8 +84,9 @@ expect(message.origin).not.toBeUndefined(); off(); done(); + $window.close(); }); - window.postMessage(messages[2], "*"); + $window.postMessage(messages[2], "*"); }); it("should return valid object for non JSON formatted message", function(done) { @@ -65,8 +94,9 @@ expect(message.text).toEqual(messages[0]); off(); done(); + $window.close(); }); - window.postMessage(messages[0], "*"); + $window.postMessage(messages[0], "*"); }); it("should set origin for non JSON formatted message", function(done) { @@ -74,8 +104,9 @@ expect(message.origin).not.toBeUndefined(); off(); done(); + $window.close(); }); - window.postMessage(messages[0], "*"); + $window.postMessage(messages[0], "*"); }); }); diff --git a/tests/opener-1.2.html b/tests/opener-1.2.html new file mode 100644 index 0000000..6242660 --- /dev/null +++ b/tests/opener-1.2.html @@ -0,0 +1,22 @@ + + + + + + + + + Will send massage to opener + + + + \ No newline at end of file diff --git a/tests/opener-1.3.html b/tests/opener-1.3.html new file mode 100644 index 0000000..86d2e8b --- /dev/null +++ b/tests/opener-1.3.html @@ -0,0 +1,22 @@ + + + + + + + + + Will send massage to opener + + + + \ No newline at end of file diff --git a/tests/opener-1.4.html b/tests/opener-1.4.html new file mode 100644 index 0000000..8361e99 --- /dev/null +++ b/tests/opener-1.4.html @@ -0,0 +1,22 @@ + + + + + + + + + Will send massage to opener + + + + \ No newline at end of file