michael@0: /* Any copyright is dedicated to the Public Domain. michael@0: http://creativecommons.org/publicdomain/zero/1.0/ */ michael@0: michael@0: const {classes: Cc, interfaces: Ci, utils: Cu} = Components; michael@0: michael@0: Cu.import("resource://gre/modules/InterAppCommService.jsm"); michael@0: michael@0: let UUIDGenerator = Cc["@mozilla.org/uuid-generator;1"] michael@0: .getService(Ci.nsIUUIDGenerator); michael@0: michael@0: const MESSAGE_PORT_ID = UUIDGenerator.generateUUID().toString(); michael@0: const FAKE_MESSAGE_PORT_ID = UUIDGenerator.generateUUID().toString(); michael@0: const OUTER_WINDOW_ID = UUIDGenerator.generateUUID().toString(); michael@0: const REQUEST_ID = UUIDGenerator.generateUUID().toString(); michael@0: michael@0: const PUB_APP_MANIFEST_URL = "app://pubApp.gaiamobile.org/manifest.webapp"; michael@0: const SUB_APP_MANIFEST_URL = "app://subApp.gaiamobile.org/manifest.webapp"; michael@0: michael@0: const PUB_APP_PAGE_URL = "app://pubApp.gaiamobile.org/handler.html"; michael@0: const SUB_APP_PAGE_URL = "app://subApp.gaiamobile.org/handler.html"; michael@0: michael@0: const KEYWORD = "test"; michael@0: michael@0: function create_message_port_pair(aMessagePortId, michael@0: aKeyword, michael@0: aPubManifestURL, michael@0: aSubManifestURL) { michael@0: InterAppCommService._messagePortPairs[aMessagePortId] = { michael@0: keyword: aKeyword, michael@0: publisher: { michael@0: manifestURL: aPubManifestURL michael@0: }, michael@0: subscriber: { michael@0: manifestURL: aSubManifestURL michael@0: } michael@0: }; michael@0: } michael@0: michael@0: function clear_message_port_pairs() { michael@0: InterAppCommService._messagePortPairs = {}; michael@0: } michael@0: michael@0: function register_message_port(aMessagePortId, michael@0: aManifestURL, michael@0: aPageURL, michael@0: aTargetSendAsyncMessage) { michael@0: let message = { michael@0: name: "InterAppMessagePort:Register", michael@0: json: { michael@0: messagePortID: aMessagePortId, michael@0: manifestURL: aManifestURL, michael@0: pageURL: aPageURL michael@0: }, michael@0: target: { michael@0: sendAsyncMessage: function(aName, aData) { michael@0: if (aTargetSendAsyncMessage) { michael@0: aTargetSendAsyncMessage(aName, aData); michael@0: } michael@0: }, michael@0: assertContainApp: function(_manifestURL) { michael@0: return (aManifestURL == _manifestURL); michael@0: } michael@0: } michael@0: }; michael@0: michael@0: InterAppCommService.receiveMessage(message); michael@0: michael@0: return message.target; michael@0: } michael@0: michael@0: function register_message_ports(aMessagePortId, michael@0: aPubTargetSendAsyncMessage, michael@0: aSubTargetSendAsyncMessage) { michael@0: let pubTarget = register_message_port(aMessagePortId, michael@0: PUB_APP_MANIFEST_URL, michael@0: PUB_APP_PAGE_URL, michael@0: aPubTargetSendAsyncMessage); michael@0: michael@0: let subTarget = register_message_port(aMessagePortId, michael@0: SUB_APP_MANIFEST_URL, michael@0: SUB_APP_PAGE_URL, michael@0: aSubTargetSendAsyncMessage); michael@0: michael@0: return { pubTarget: pubTarget, subTarget: subTarget }; michael@0: } michael@0: michael@0: function unregister_message_port(aMessagePortId, michael@0: aManifestURL) { michael@0: let message = { michael@0: name: "InterAppMessagePort:Unregister", michael@0: json: { michael@0: messagePortID: aMessagePortId, michael@0: manifestURL: aManifestURL michael@0: }, michael@0: target: { michael@0: assertContainApp: function(_manifestURL) { michael@0: return (aManifestURL == _manifestURL); michael@0: } michael@0: } michael@0: }; michael@0: michael@0: InterAppCommService.receiveMessage(message); michael@0: } michael@0: michael@0: function remove_target(aTarget) { michael@0: let message = { michael@0: name: "child-process-shutdown", michael@0: target: aTarget michael@0: }; michael@0: michael@0: InterAppCommService.receiveMessage(message); michael@0: } michael@0: michael@0: function post_message(aMessagePortId, michael@0: aManifestURL, michael@0: aMessage) { michael@0: let message = { michael@0: name: "InterAppMessagePort:PostMessage", michael@0: json: { michael@0: messagePortID: aMessagePortId, michael@0: manifestURL: aManifestURL, michael@0: message: aMessage michael@0: }, michael@0: target: { michael@0: assertContainApp: function(_manifestURL) { michael@0: return (aManifestURL == _manifestURL); michael@0: } michael@0: } michael@0: }; michael@0: michael@0: InterAppCommService.receiveMessage(message); michael@0: } michael@0: michael@0: function create_allowed_connections(aKeyword, michael@0: aPubManifestURL, michael@0: aSubManifestURL) { michael@0: let allowedPubAppManifestURLs = michael@0: InterAppCommService._allowedConnections[aKeyword] = {}; michael@0: michael@0: allowedPubAppManifestURLs[aPubManifestURL] = [aSubManifestURL]; michael@0: } michael@0: michael@0: function clear_allowed_connections() { michael@0: InterAppCommService._allowedConnections = {}; michael@0: } michael@0: michael@0: function get_connections(aManifestURL, michael@0: aOuterWindowID, michael@0: aRequestID, michael@0: aTargetSendAsyncMessage) { michael@0: let message = { michael@0: name: "Webapps:GetConnections", michael@0: json: { michael@0: manifestURL: aManifestURL, michael@0: outerWindowID: aOuterWindowID, michael@0: requestID: aRequestID michael@0: }, michael@0: target: { michael@0: sendAsyncMessage: function(aName, aData) { michael@0: if (aTargetSendAsyncMessage) { michael@0: aTargetSendAsyncMessage(aName, aData); michael@0: } michael@0: }, michael@0: assertContainApp: function(_manifestURL) { michael@0: return (aManifestURL == _manifestURL); michael@0: } michael@0: } michael@0: }; michael@0: michael@0: InterAppCommService.receiveMessage(message); michael@0: } michael@0: michael@0: function cancel_connections(aManifestURL, michael@0: aKeyword, michael@0: aPubManifestURL, michael@0: aSubManifestURL) { michael@0: let message = { michael@0: name: "InterAppConnection:Cancel", michael@0: json: { michael@0: manifestURL: aManifestURL, michael@0: keyword: aKeyword, michael@0: pubAppManifestURL: aPubManifestURL, michael@0: subAppManifestURL: aSubManifestURL michael@0: }, michael@0: target: { michael@0: assertContainApp: function(_manifestURL) { michael@0: return (aManifestURL == _manifestURL); michael@0: } michael@0: } michael@0: }; michael@0: michael@0: InterAppCommService.receiveMessage(message); michael@0: } michael@0: michael@0: add_test(function test_registerMessagePort() { michael@0: create_message_port_pair(MESSAGE_PORT_ID, michael@0: KEYWORD, michael@0: PUB_APP_MANIFEST_URL, michael@0: SUB_APP_MANIFEST_URL); michael@0: michael@0: let targets = register_message_ports(MESSAGE_PORT_ID); michael@0: michael@0: let messagePortPair = InterAppCommService._messagePortPairs[MESSAGE_PORT_ID]; michael@0: michael@0: do_check_eq(PUB_APP_PAGE_URL, messagePortPair.publisher.pageURL); michael@0: do_check_eq(SUB_APP_PAGE_URL, messagePortPair.subscriber.pageURL); michael@0: michael@0: do_check_true(targets.pubTarget === messagePortPair.publisher.target); michael@0: do_check_true(targets.subTarget === messagePortPair.subscriber.target); michael@0: michael@0: clear_message_port_pairs(); michael@0: run_next_test(); michael@0: }); michael@0: michael@0: add_test(function test_failToRegisterMessagePort() { michael@0: create_message_port_pair(MESSAGE_PORT_ID, michael@0: KEYWORD, michael@0: PUB_APP_MANIFEST_URL, michael@0: SUB_APP_MANIFEST_URL); michael@0: michael@0: let targets = register_message_ports(FAKE_MESSAGE_PORT_ID); michael@0: michael@0: let messagePortPair = InterAppCommService._messagePortPairs[MESSAGE_PORT_ID]; michael@0: michael@0: // Because it failed to register, the page URLs and targets don't exist. michael@0: do_check_true(messagePortPair.publisher.pageURL === undefined); michael@0: do_check_true(messagePortPair.subscriber.pageURL === undefined); michael@0: michael@0: do_check_true(messagePortPair.publisher.target === undefined); michael@0: do_check_true(messagePortPair.subscriber.target === undefined); michael@0: michael@0: clear_message_port_pairs(); michael@0: run_next_test(); michael@0: }); michael@0: michael@0: add_test(function test_unregisterMessagePort() { michael@0: create_message_port_pair(MESSAGE_PORT_ID, michael@0: KEYWORD, michael@0: PUB_APP_MANIFEST_URL, michael@0: SUB_APP_MANIFEST_URL); michael@0: michael@0: register_message_ports(MESSAGE_PORT_ID); michael@0: michael@0: unregister_message_port(MESSAGE_PORT_ID, PUB_APP_MANIFEST_URL); michael@0: michael@0: do_check_true(InterAppCommService._messagePortPairs[MESSAGE_PORT_ID] michael@0: === undefined); michael@0: michael@0: clear_message_port_pairs(); michael@0: run_next_test(); michael@0: }); michael@0: michael@0: add_test(function test_failToUnregisterMessagePort() { michael@0: create_message_port_pair(MESSAGE_PORT_ID, michael@0: KEYWORD, michael@0: PUB_APP_MANIFEST_URL, michael@0: SUB_APP_MANIFEST_URL); michael@0: michael@0: register_message_ports(MESSAGE_PORT_ID); michael@0: michael@0: unregister_message_port(FAKE_MESSAGE_PORT_ID, PUB_APP_MANIFEST_URL); michael@0: michael@0: // Because it failed to unregister, the entry still exists. michael@0: do_check_true(InterAppCommService._messagePortPairs[MESSAGE_PORT_ID] michael@0: !== undefined); michael@0: michael@0: clear_message_port_pairs(); michael@0: run_next_test(); michael@0: }); michael@0: michael@0: add_test(function test_removeTarget() { michael@0: create_message_port_pair(MESSAGE_PORT_ID, michael@0: KEYWORD, michael@0: PUB_APP_MANIFEST_URL, michael@0: SUB_APP_MANIFEST_URL); michael@0: michael@0: let targets = register_message_ports(MESSAGE_PORT_ID); michael@0: michael@0: remove_target(targets.pubTarget); michael@0: michael@0: do_check_true(InterAppCommService._messagePortPairs[MESSAGE_PORT_ID] michael@0: === undefined); michael@0: michael@0: clear_message_port_pairs(); michael@0: run_next_test(); michael@0: }); michael@0: michael@0: add_test(function test_postMessage() { michael@0: create_message_port_pair(MESSAGE_PORT_ID, michael@0: KEYWORD, michael@0: PUB_APP_MANIFEST_URL, michael@0: SUB_APP_MANIFEST_URL); michael@0: michael@0: let countPubAppOnMessage = 0; michael@0: function pubAppOnMessage(aName, aData) { michael@0: countPubAppOnMessage++; michael@0: michael@0: do_check_eq(aName, "InterAppMessagePort:OnMessage"); michael@0: do_check_eq(aData.manifestURL, PUB_APP_MANIFEST_URL); michael@0: do_check_eq(aData.pageURL, PUB_APP_PAGE_URL); michael@0: do_check_eq(aData.messagePortID, MESSAGE_PORT_ID); michael@0: michael@0: if (countPubAppOnMessage == 1) { michael@0: do_check_eq(aData.message.text, "sub app says world"); michael@0: michael@0: post_message(MESSAGE_PORT_ID, michael@0: PUB_APP_MANIFEST_URL, michael@0: { text: "pub app says hello again" }); michael@0: michael@0: } else if (countPubAppOnMessage == 2) { michael@0: do_check_eq(aData.message.text, "sub app says world again"); michael@0: michael@0: clear_message_port_pairs(); michael@0: run_next_test(); michael@0: } else { michael@0: do_throw("pub app receives an unexpected message") michael@0: } michael@0: }; michael@0: michael@0: let countSubAppOnMessage = 0; michael@0: function subAppOnMessage(aName, aData) { michael@0: countSubAppOnMessage++; michael@0: michael@0: do_check_eq(aName, "InterAppMessagePort:OnMessage"); michael@0: do_check_eq(aData.manifestURL, SUB_APP_MANIFEST_URL); michael@0: do_check_eq(aData.pageURL, SUB_APP_PAGE_URL); michael@0: do_check_eq(aData.messagePortID, MESSAGE_PORT_ID); michael@0: michael@0: if (countSubAppOnMessage == 1) { michael@0: do_check_eq(aData.message.text, "pub app says hello"); michael@0: michael@0: post_message(MESSAGE_PORT_ID, michael@0: SUB_APP_MANIFEST_URL, michael@0: { text: "sub app says world" }); michael@0: michael@0: } else if (countSubAppOnMessage == 2) { michael@0: do_check_eq(aData.message.text, "pub app says hello again"); michael@0: michael@0: post_message(MESSAGE_PORT_ID, michael@0: SUB_APP_MANIFEST_URL, michael@0: { text: "sub app says world again" }); michael@0: } else { michael@0: do_throw("sub app receives an unexpected message") michael@0: } michael@0: }; michael@0: michael@0: register_message_ports(MESSAGE_PORT_ID, pubAppOnMessage, subAppOnMessage); michael@0: michael@0: post_message(MESSAGE_PORT_ID, michael@0: PUB_APP_MANIFEST_URL, michael@0: { text: "pub app says hello" }); michael@0: }); michael@0: michael@0: add_test(function test_registerMessagePort_with_queued_messages() { michael@0: create_message_port_pair(MESSAGE_PORT_ID, michael@0: KEYWORD, michael@0: PUB_APP_MANIFEST_URL, michael@0: SUB_APP_MANIFEST_URL); michael@0: michael@0: register_message_port(MESSAGE_PORT_ID, michael@0: PUB_APP_MANIFEST_URL, michael@0: PUB_APP_PAGE_URL); michael@0: michael@0: post_message(MESSAGE_PORT_ID, michael@0: PUB_APP_MANIFEST_URL, michael@0: { text: "pub app says hello" }); michael@0: michael@0: post_message(MESSAGE_PORT_ID, michael@0: PUB_APP_MANIFEST_URL, michael@0: { text: "pub app says hello again" }); michael@0: michael@0: let countSubAppOnMessage = 0; michael@0: function subAppOnMessage(aName, aData) { michael@0: countSubAppOnMessage++; michael@0: michael@0: do_check_eq(aName, "InterAppMessagePort:OnMessage"); michael@0: do_check_eq(aData.manifestURL, SUB_APP_MANIFEST_URL); michael@0: do_check_eq(aData.pageURL, SUB_APP_PAGE_URL); michael@0: do_check_eq(aData.messagePortID, MESSAGE_PORT_ID); michael@0: michael@0: if (countSubAppOnMessage == 1) { michael@0: do_check_eq(aData.message.text, "pub app says hello"); michael@0: } else if (countSubAppOnMessage == 2) { michael@0: do_check_eq(aData.message.text, "pub app says hello again"); michael@0: michael@0: clear_message_port_pairs(); michael@0: run_next_test(); michael@0: } else { michael@0: do_throw("sub app receives an unexpected message") michael@0: } michael@0: }; michael@0: michael@0: register_message_port(MESSAGE_PORT_ID, michael@0: SUB_APP_MANIFEST_URL, michael@0: SUB_APP_PAGE_URL, michael@0: subAppOnMessage); michael@0: }); michael@0: michael@0: add_test(function test_getConnections() { michael@0: create_allowed_connections(KEYWORD, michael@0: PUB_APP_MANIFEST_URL, michael@0: SUB_APP_MANIFEST_URL); michael@0: michael@0: function onGetConnections(aName, aData) { michael@0: do_check_eq(aName, "Webapps:GetConnections:Return:OK"); michael@0: do_check_eq(aData.oid, OUTER_WINDOW_ID); michael@0: do_check_eq(aData.requestID, REQUEST_ID); michael@0: michael@0: let connections = aData.connections; michael@0: do_check_eq(connections.length, 1); michael@0: do_check_eq(connections[0].keyword, KEYWORD); michael@0: do_check_eq(connections[0].pubAppManifestURL, PUB_APP_MANIFEST_URL); michael@0: do_check_eq(connections[0].subAppManifestURL, SUB_APP_MANIFEST_URL); michael@0: michael@0: clear_allowed_connections(); michael@0: run_next_test(); michael@0: }; michael@0: michael@0: get_connections(PUB_APP_MANIFEST_URL, michael@0: OUTER_WINDOW_ID, michael@0: REQUEST_ID, michael@0: onGetConnections); michael@0: }); michael@0: michael@0: add_test(function test_cancelConnection() { michael@0: create_allowed_connections(KEYWORD, michael@0: PUB_APP_MANIFEST_URL, michael@0: SUB_APP_MANIFEST_URL); michael@0: michael@0: create_message_port_pair(MESSAGE_PORT_ID, michael@0: KEYWORD, michael@0: PUB_APP_MANIFEST_URL, michael@0: SUB_APP_MANIFEST_URL); michael@0: michael@0: register_message_ports(MESSAGE_PORT_ID); michael@0: michael@0: cancel_connections(PUB_APP_MANIFEST_URL, michael@0: KEYWORD, michael@0: PUB_APP_MANIFEST_URL, michael@0: SUB_APP_MANIFEST_URL); michael@0: michael@0: do_check_true(InterAppCommService._allowedConnections[KEYWORD] michael@0: === undefined); michael@0: michael@0: do_check_true(InterAppCommService._messagePortPairs[MESSAGE_PORT_ID] michael@0: === undefined); michael@0: michael@0: clear_allowed_connections(); michael@0: clear_message_port_pairs(); michael@0: run_next_test(); michael@0: }); michael@0: michael@0: function run_test() { michael@0: do_get_profile(); michael@0: michael@0: run_next_test(); michael@0: }