123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264 |
- // Copyright 2013 The Closure Library Authors. All Rights Reserved.
- //
- // Licensed under the Apache License, Version 2.0 (the "License");
- // you may not use this file except in compliance with the License.
- // You may obtain a copy of the License at
- //
- // http://www.apache.org/licenses/LICENSE-2.0
- //
- // Unless required by applicable law or agreed to in writing, software
- // distributed under the License is distributed on an "AS-IS" BASIS,
- // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- // See the License for the specific language governing permissions and
- // limitations under the License.
- /**
- * @fileoverview Tests the direct transport.
- */
- goog.provide('goog.net.xpc.DirectTransportTest');
- goog.require('goog.Promise');
- goog.require('goog.dom');
- goog.require('goog.dom.TagName');
- goog.require('goog.labs.userAgent.browser');
- goog.require('goog.log');
- goog.require('goog.log.Level');
- goog.require('goog.net.xpc');
- goog.require('goog.net.xpc.CfgFields');
- goog.require('goog.net.xpc.CrossPageChannel');
- goog.require('goog.net.xpc.CrossPageChannelRole');
- goog.require('goog.net.xpc.TransportTypes');
- goog.require('goog.testing.TestCase');
- goog.require('goog.testing.jsunit');
- goog.setTestOnly('goog.net.xpc.DirectTransportTest');
- /**
- * Echo service name.
- * @type {string}
- * @const
- */
- var ECHO_SERVICE_NAME = 'echo';
- /**
- * Response service name.
- * @type {string}
- * @const
- */
- var RESPONSE_SERVICE_NAME = 'response';
- /**
- * Test Payload.
- * @type {string}
- * @const
- */
- var MESSAGE_PAYLOAD_1 = 'This is message payload 1.';
- /**
- * The name id of the peer iframe.
- * @type {string}
- * @const
- */
- var PEER_IFRAME_ID = 'peer-iframe';
- // Class aliases.
- var CfgFields = goog.net.xpc.CfgFields;
- var CrossPageChannel = goog.net.xpc.CrossPageChannel;
- var CrossPageChannelRole = goog.net.xpc.CrossPageChannelRole;
- var TransportTypes = goog.net.xpc.TransportTypes;
- var outerXpc;
- var innerXpc;
- var peerIframe;
- var channelName;
- var messageIsSync = false;
- var savedHtml;
- var debugDiv;
- function setUpPage() {
- // Show debug log
- debugDiv = goog.dom.createElement(goog.dom.TagName.DIV);
- var logger = goog.log.getLogger('goog.net.xpc');
- logger.setLevel(goog.log.Level.ALL);
- goog.log.addHandler(logger, function(logRecord) {
- var msgElm = goog.dom.createDom(goog.dom.TagName.DIV);
- msgElm.innerHTML = logRecord.getMessage();
- goog.dom.appendChild(debugDiv, msgElm);
- });
- goog.testing.TestCase.getActiveTestCase().promiseTimeout = 10000; // 10s
- }
- function setUp() {
- savedHtml = document.body.innerHTML;
- document.body.appendChild(debugDiv);
- }
- function tearDown() {
- if (peerIframe) {
- document.body.removeChild(peerIframe);
- peerIframe = null;
- }
- if (outerXpc) {
- outerXpc.dispose();
- outerXpc = null;
- }
- if (innerXpc) {
- innerXpc.dispose();
- innerXpc = null;
- }
- window.iframeLoadHandler = null;
- channelName = null;
- messageIsSync = false;
- document.body.innerHTML = savedHtml;
- }
- function createIframe() {
- peerIframe = goog.dom.createElement(goog.dom.TagName.IFRAME);
- peerIframe.id = PEER_IFRAME_ID;
- document.body.insertBefore(peerIframe, document.body.firstChild);
- }
- /**
- * Tests 2 same domain frames using direct transport.
- */
- function testDirectTransport() {
- // This test has been flaky on IE.
- // For now, disable.
- // Flakiness is tracked in http://b/18595666
- if (goog.labs.userAgent.browser.isIE()) {
- return;
- }
- createIframe();
- channelName = goog.net.xpc.getRandomString(10);
- outerXpc = new CrossPageChannel(
- getConfiguration(CrossPageChannelRole.OUTER, PEER_IFRAME_ID));
- // Outgoing service.
- outerXpc.registerService(ECHO_SERVICE_NAME, goog.nullFunction);
- // Incoming service.
- var resolver = goog.Promise.withResolver();
- outerXpc.registerService(RESPONSE_SERVICE_NAME, function(message) {
- assertEquals(
- 'Received payload is equal to sent payload.', message,
- MESSAGE_PAYLOAD_1);
- resolver.resolve();
- });
- outerXpc.connect(function() {
- assertTrue('XPC over direct channel is connected', outerXpc.isConnected());
- outerXpc.send(ECHO_SERVICE_NAME, MESSAGE_PAYLOAD_1);
- });
- // inner_peer.html calls this method at end of html.
- window.iframeLoadHandler = function() {
- peerIframe.contentWindow.instantiateChannel(
- getConfiguration(CrossPageChannelRole.INNER));
- };
- peerIframe.src = 'testdata/inner_peer.html';
- return resolver.promise;
- }
- /**
- * Tests 2 xpc's communicating with each other in the same window.
- */
- function testSameWindowDirectTransport() {
- channelName = goog.net.xpc.getRandomString(10);
- outerXpc = new CrossPageChannel(getConfiguration(CrossPageChannelRole.OUTER));
- outerXpc.setPeerWindowObject(self);
- // Outgoing service.
- outerXpc.registerService(ECHO_SERVICE_NAME, goog.nullFunction);
- var resolver = goog.Promise.withResolver();
- // Incoming service.
- outerXpc.registerService(RESPONSE_SERVICE_NAME, function(message) {
- assertEquals(
- 'Received payload is equal to sent payload.', message,
- MESSAGE_PAYLOAD_1);
- resolver.resolve();
- });
- outerXpc.connect(function() {
- assertTrue(
- 'XPC over direct channel, same window, is connected',
- outerXpc.isConnected());
- outerXpc.send(ECHO_SERVICE_NAME, MESSAGE_PAYLOAD_1);
- });
- innerXpc = new CrossPageChannel(getConfiguration(CrossPageChannelRole.INNER));
- innerXpc.setPeerWindowObject(self);
- // Incoming service.
- innerXpc.registerService(ECHO_SERVICE_NAME, function(message) {
- innerXpc.send(RESPONSE_SERVICE_NAME, message);
- });
- // Outgoing service.
- innerXpc.registerService(RESPONSE_SERVICE_NAME, goog.nullFunction);
- innerXpc.connect();
- return resolver.promise;
- }
- function getConfiguration(role, opt_peerFrameId) {
- var cfg = {};
- cfg[CfgFields.TRANSPORT] = TransportTypes.DIRECT;
- if (goog.isDefAndNotNull(opt_peerFrameId)) {
- cfg[CfgFields.IFRAME_ID] = opt_peerFrameId;
- }
- cfg[CfgFields.CHANNEL_NAME] = channelName;
- cfg[CfgFields.ROLE] = role;
- return cfg;
- }
- /**
- * Tests 2 same domain frames using direct transport using sync mode.
- */
- function testSyncMode() {
- // This test has been flaky on IE.
- // For now, disable.
- // Flakiness is tracked in http://b/18595666
- if (goog.labs.userAgent.browser.isIE()) {
- return;
- }
- createIframe();
- channelName = goog.net.xpc.getRandomString(10);
- var cfg = getConfiguration(CrossPageChannelRole.OUTER, PEER_IFRAME_ID);
- cfg[CfgFields.DIRECT_TRANSPORT_SYNC_MODE] = true;
- outerXpc = new CrossPageChannel(cfg);
- // Outgoing service.
- outerXpc.registerService(ECHO_SERVICE_NAME, goog.nullFunction);
- var resolver = goog.Promise.withResolver();
- // Incoming service.
- outerXpc.registerService(RESPONSE_SERVICE_NAME, function(message) {
- assertTrue('The message response was syncronous', messageIsSync);
- assertEquals(
- 'Received payload is equal to sent payload.', message,
- MESSAGE_PAYLOAD_1);
- resolver.resolve();
- });
- outerXpc.connect(function() {
- assertTrue('XPC over direct channel is connected', outerXpc.isConnected());
- messageIsSync = true;
- outerXpc.send(ECHO_SERVICE_NAME, MESSAGE_PAYLOAD_1);
- messageIsSync = false;
- });
- // inner_peer.html calls this method at end of html.
- window.iframeLoadHandler = function() {
- var cfg = getConfiguration(CrossPageChannelRole.INNER);
- cfg[CfgFields.DIRECT_TRANSPORT_SYNC_MODE] = true;
- peerIframe.contentWindow.instantiateChannel(cfg);
- };
- peerIframe.src = 'testdata/inner_peer.html';
- return resolver.promise;
- }
|