file_bug990812-5.xhtml (2642B)
1 <?xml version="1.0"?> 2 <?xml-stylesheet href="chrome://global/skin" type="text/css"?> 3 <?xml-stylesheet href="chrome://mochikit/content/tests/SimpleTest/test.css" 4 type="text/css"?> 5 <!-- 6 https://bugzilla.mozilla.org/show_bug.cgi?id=990812 7 --> 8 <window title="Mozilla Bug 990812" 9 xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul" 10 onload="start();"> 11 <label value="Mozilla Bug 990812"/> 12 <!-- test code goes here --> 13 <script type="application/javascript"><![CDATA[ 14 /* global messageManager, sendAsyncMessage, getGroupMessageManager */ 15 var FRAME_SCRIPT1 = "data:,addMessageListener('test', function () {" + 16 "sendSyncMessage('test', 'group1')})"; 17 var FRAME_SCRIPT2 = "data:,addMessageListener('test', function () {" + 18 "sendSyncMessage('test', 'group2')})"; 19 20 var globalMM = Cc["@mozilla.org/globalmessagemanager;1"].getService(); 21 22 function is(val, exp, msg) { 23 window.arguments[0].is(val, exp, msg); 24 } 25 26 function promiseTwoMessages(type, mm) { 27 var numLeft = 2; 28 29 return new Promise(function (resolve) { 30 mm.addMessageListener("test", function onMessage(msg) { 31 is(msg.data, type, "correct message " + type); 32 33 if (--numLeft == 0) { 34 mm.removeMessageListener("test", onMessage); 35 resolve(); 36 } 37 }); 38 }); 39 } 40 41 /** 42 * This test ensures that having multiple message manager groups with 43 * multiple frame loaders in those works as expected. For a specific 44 * group message manager, frame scripts should only be loaded by its 45 * descendants and messages should only be received by and from those 46 * child message managers. 47 */ 48 function start() { 49 var gmm1 = getGroupMessageManager("test1"); 50 gmm1.loadFrameScript(FRAME_SCRIPT1, true); 51 52 var gmm2 = getGroupMessageManager("test2"); 53 gmm2.loadFrameScript(FRAME_SCRIPT2, true); 54 55 var promise1 = promiseTwoMessages("group1", gmm1); 56 var promise2 = promiseTwoMessages("group2", gmm2); 57 58 messageManager.broadcastAsyncMessage("test"); 59 60 Promise.all([promise1, promise2]).then(function () { 61 window.arguments[0].setTimeout(function() { this.next(); }); 62 window.close(); 63 }); 64 } 65 66 ]]></script> 67 68 <browser messagemanagergroup="test1" type="content" src="about:mozilla" /> 69 <browser messagemanagergroup="test1" type="content" src="about:mozilla" /> 70 71 <browser messagemanagergroup="test2" type="content" src="about:mozilla" /> 72 <browser messagemanagergroup="test2" type="content" src="about:mozilla" /> 73 74 </window>