aboutsummaryrefslogtreecommitdiff
path: root/contexts/data/lib/closure-library/closure/goog/net/xpc/crosspagechannel_test.html
diff options
context:
space:
mode:
Diffstat (limited to 'contexts/data/lib/closure-library/closure/goog/net/xpc/crosspagechannel_test.html')
-rw-r--r--contexts/data/lib/closure-library/closure/goog/net/xpc/crosspagechannel_test.html1024
1 files changed, 0 insertions, 1024 deletions
diff --git a/contexts/data/lib/closure-library/closure/goog/net/xpc/crosspagechannel_test.html b/contexts/data/lib/closure-library/closure/goog/net/xpc/crosspagechannel_test.html
deleted file mode 100644
index 0c77626..0000000
--- a/contexts/data/lib/closure-library/closure/goog/net/xpc/crosspagechannel_test.html
+++ /dev/null
@@ -1,1024 +0,0 @@
-<!DOCTYPE html>
-<!--
--->
-<html>
-<!--
-Copyright 2009 The Closure Library Authors. All Rights Reserved.
-
-Use of this source code is governed by the Apache License, Version 2.0.
-See the COPYING file for details.
--->
-<head>
-<meta http-equiv="X-UA-Compatible" content="IE=edge">
-<title>CrossPageChannel: End-to-End Test</title>
-<script type="text/javascript" src="../../base.js"></script>
-<script type="text/javascript">
- goog.require('goog.Disposable');
- goog.require('goog.Uri');
- goog.require('goog.async.Deferred');
- goog.require('goog.debug.Logger');
- goog.require('goog.dom');
- goog.require('goog.net.xpc.CrossPageChannel');
- goog.require('goog.object');
- goog.require('goog.testing.AsyncTestCase');
- goog.require('goog.testing.PropertyReplacer');
- goog.require('goog.testing.jsunit');
-</script>
-</head>
-<body>
-<script type="text/javascript">
-
-// Set this to false when working on this test. It needs to be true for
-// automated testing, as some browsers (eg IE8) choke on the large numbers of
-// iframes this test would otherwise leave active.
-var CLEAN_UP_IFRAMES = true;
-
-var IFRAME_LOAD_WAIT_MS = 1000;
-var stubs = new goog.testing.PropertyReplacer();
-var asyncTestCase = goog.testing.AsyncTestCase.createAndInstall(
- document.title);
-var uniqueId = 0;
-var driver;
-var canAccessSameDomainIframe = true;
-var accessCheckIframes = [];
-
-function setUpPage() {
- // This test is insanely slow on IE8 for some reason.
- asyncTestCase.stepTimeout = 20 * 1000;
-
- // Show debug log
- var debugDiv = goog.dom.getElement('debugDiv');
- var logger = goog.debug.Logger.getLogger('goog.net.xpc');
- logger.setLevel(goog.debug.Logger.Level.ALL);
- logger.addHandler(function(logRecord) {
- var msgElm = goog.dom.createDom('div');
- msgElm.innerHTML = logRecord.getMessage();
- goog.dom.appendChild(debugDiv, msgElm);
- });
- asyncTestCase.waitForAsync('Checking if we can access same domain iframes');
- checkSameDomainIframeAccess();
-}
-
-
-function setUp() {
- driver = new Driver();
-}
-
-
-function tearDown() {
- stubs.reset();
- driver.dispose();
-}
-
-
-function checkSameDomainIframeAccess() {
- accessCheckIframes.push(
- create1x1Iframe('nonexistant', 'testdata/i_am_non_existant.html'));
- window.setTimeout(function () {
- accessCheckIframes.push(
- create1x1Iframe('existant', 'testdata/access_checker.html'));
- }, 10);
-}
-
-
-function create1x1Iframe(iframeId, src) {
- var iframeAccessChecker = goog.dom.createElement('IFRAME');
- iframeAccessChecker.id = iframeAccessChecker.name = iframeId;
- iframeAccessChecker.style.width = iframeAccessChecker.style.height = '1px';
- iframeAccessChecker.src = src;
- document.body.insertBefore(iframeAccessChecker, document.body.firstChild);
- return iframeAccessChecker;
-}
-
-
-function sameDomainIframeAccessComplete(canAccess) {
- canAccessSameDomainIframe = canAccess;
- for (var i = 0; i < accessCheckIframes.length; i++) {
- document.body.removeChild(accessCheckIframes[i]);
- }
- asyncTestCase.continueTesting();
-}
-
-
-function testCreateIframeSpecifyId() {
- driver.createPeerIframe('new_iframe');
-
- asyncTestCase.waitForAsync('iframe load');
- window.setTimeout(function() {
- driver.checkPeerIframe();
- asyncTestCase.continueTesting();
- }, IFRAME_LOAD_WAIT_MS);
-}
-
-
-function testCreateIframeRandomId() {
- driver.createPeerIframe();
-
- asyncTestCase.waitForAsync('iframe load');
- window.setTimeout(function() {
- driver.checkPeerIframe();
- asyncTestCase.continueTesting();
- }, IFRAME_LOAD_WAIT_MS);
-}
-
-
-// The following batch of tests:
-// * Establishes a peer iframe
-// * Connects an XPC channel between the frames
-// * From the connection callback in each frame, sends an 'echo' request, and
-// expects a 'response' response.
-// * Reconnects the inner frame, sends an 'echo', expects a 'response'.
-// * Optionally, reconnects the outer frame, sends an 'echo', expects a
-// 'response'.
-// * Optionally, reconnects the inner frame, but first reconfigures it to the
-// alternate protocol version, simulating an inner frame navigation that
-// picks up a new/old version.
-//
-// Every valid combination of protocol versions is tested, with both single and
-// double ended handshakes. Two timing scenarios are tested per combination,
-// which is what the 'reverse' parameter distinguishes.
-//
-// Where single sided handshake is in use, reconnection by the outer frame is
-// not supported, and therefore is not tested.
-//
-// The only known issue migrating to V2 is that once two V2 peers have
-// connected, replacing either peer with a V1 peer will not work. Upgrading V1
-// peers to v2 is supported, as is replacing the only v2 peer in a connection
-// with a v1.
-
-
-function testLifeCycle_v1_v1() {
- checkLifeCycle(
- false /* oneSidedHandshake */,
- 1 /* innerProtocolVersion */,
- 1 /* outerProtocolVersion */,
- true /* outerFrameReconnectSupported */,
- true /* innerFrameMigrationSupported */,
- false /* reverse */);
-}
-
-
-function testLifeCycle_v1_v1_rev() {
- checkLifeCycle(
- false /* oneSidedHandshake */,
- 1 /* innerProtocolVersion */,
- 1 /* outerProtocolVersion */,
- true /* outerFrameReconnectSupported */,
- true /* innerFrameMigrationSupported */,
- true /* reverse */);
-}
-
-
-function testLifeCycle_v1_v1_onesided() {
- checkLifeCycle(
- true /* oneSidedHandshake */,
- 1 /* innerProtocolVersion */,
- 1 /* outerProtocolVersion */,
- false /* outerFrameReconnectSupported */,
- true /* innerFrameMigrationSupported */,
- false /* reverse */);
-}
-
-
-function testLifeCycle_v1_v1_onesided_rev() {
- checkLifeCycle(
- true /* oneSidedHandshake */,
- 1 /* innerProtocolVersion */,
- 1 /* outerProtocolVersion */,
- false /* outerFrameReconnectSupported */,
- true /* innerFrameMigrationSupported */,
- true /* reverse */);
-}
-
-
-function testLifeCycle_v1_v2() {
- checkLifeCycle(
- false /* oneSidedHandshake */,
- 1 /* innerProtocolVersion */,
- 2 /* outerProtocolVersion */,
- true /* outerFrameReconnectSupported */,
- true /* innerFrameMigrationSupported */,
- false /* reverse */);
-}
-
-
-function testLifeCycle_v1_v2_rev() {
- checkLifeCycle(
- false /* oneSidedHandshake */,
- 1 /* innerProtocolVersion */,
- 2 /* outerProtocolVersion */,
- true /* outerFrameReconnectSupported */,
- true /* innerFrameMigrationSupported */,
- true /* reverse */);
-}
-
-
-function testLifeCycle_v1_v2_onesided() {
- checkLifeCycle(
- true /* oneSidedHandshake */,
- 1 /* innerProtocolVersion */,
- 2 /* outerProtocolVersion */,
- false /* outerFrameReconnectSupported */,
- true /* innerFrameMigrationSupported */,
- false /* reverse */);
-}
-
-
-function testLifeCycle_v1_v2_onesided_rev() {
- checkLifeCycle(
- true /* oneSidedHandshake */,
- 1 /* innerProtocolVersion */,
- 2 /* outerProtocolVersion */,
- false /* outerFrameReconnectSupported */,
- true /* innerFrameMigrationSupported */,
- true /* reverse */);
-}
-
-
-function testLifeCycle_v2_v1() {
- checkLifeCycle(
- false /* oneSidedHandshake */,
- 2 /* innerProtocolVersion */,
- 1 /* outerProtocolVersion */,
- true /* outerFrameReconnectSupported */,
- true /* innerFrameMigrationSupported */,
- false /* reverse */);
-}
-
-
-function testLifeCycle_v2_v1_rev() {
- checkLifeCycle(
- false /* oneSidedHandshake */,
- 2 /* innerProtocolVersion */,
- 1 /* outerProtocolVersion */,
- true /* outerFrameReconnectSupported */,
- true /* innerFrameMigrationSupported */,
- true /* reverse */);
-}
-
-
-function testLifeCycle_v2_v1_onesided() {
- checkLifeCycle(
- true /* oneSidedHandshake */,
- 2 /* innerProtocolVersion */,
- 1 /* outerProtocolVersion */,
- false /* outerFrameReconnectSupported */,
- true /* innerFrameMigrationSupported */,
- false /* reverse */);
-}
-
-
-function testLifeCycle_v2_v1_onesided_rev() {
- checkLifeCycle(
- true /* oneSidedHandshake */,
- 2 /* innerProtocolVersion */,
- 1 /* outerProtocolVersion */,
- false /* outerFrameReconnectSupported */,
- true /* innerFrameMigrationSupported */,
- true /* reverse */);
-}
-
-
-function testLifeCycle_v2_v2() {
- checkLifeCycle(
- false /* oneSidedHandshake */,
- 2 /* innerProtocolVersion */,
- 2 /* outerProtocolVersion */,
- true /* outerFrameReconnectSupported */,
- false /* innerFrameMigrationSupported */,
- false /* reverse */);
-}
-
-
-function testLifeCycle_v2_v2_rev() {
- checkLifeCycle(
- false /* oneSidedHandshake */,
- 2 /* innerProtocolVersion */,
- 2 /* outerProtocolVersion */,
- true /* outerFrameReconnectSupported */,
- false /* innerFrameMigrationSupported */,
- true /* reverse */);
-}
-
-
-function testLifeCycle_v2_v2_onesided() {
- checkLifeCycle(
- true /* oneSidedHandshake */,
- 2 /* innerProtocolVersion */,
- 2 /* outerProtocolVersion */,
- false /* outerFrameReconnectSupported */,
- false /* innerFrameMigrationSupported */,
- false /* reverse */);
-}
-
-
-function testLifeCycle_v2_v2_onesided_rev() {
- checkLifeCycle(
- true /* oneSidedHandshake */,
- 2 /* innerProtocolVersion */,
- 2 /* outerProtocolVersion */,
- false /* outerFrameReconnectSupported */,
- false /* innerFrameMigrationSupported */,
- true /* reverse */);
-}
-
-
-function checkLifeCycle(oneSidedHandshake, innerProtocolVersion,
- outerProtocolVersion, outerFrameReconnectSupported,
- innerFrameMigrationSupported, reverse) {
- driver.createPeerIframe('new_iframe', oneSidedHandshake,
- innerProtocolVersion, outerProtocolVersion);
- driver.connect(true /* fullLifeCycleTest */, outerFrameReconnectSupported,
- innerFrameMigrationSupported, reverse);
-}
-
-
-function testConnectMismatchedNames_v1_v1() {
- checkConnectMismatchedNames(
- 1 /* innerProtocolVersion */,
- 1 /* outerProtocolVersion */,
- false /* reverse */);
-}
-
-
-function testConnectMismatchedNames_v1_v1_rev() {
- checkConnectMismatchedNames(
- 1 /* innerProtocolVersion */,
- 1 /* outerProtocolVersion */,
- true /* reverse */);
-}
-
-
-function testConnectMismatchedNames_v1_v2() {
- checkConnectMismatchedNames(
- 1 /* innerProtocolVersion */,
- 2 /* outerProtocolVersion */,
- false /* reverse */);
-}
-
-
-function testConnectMismatchedNames_v1_v2_rev() {
- checkConnectMismatchedNames(
- 1 /* innerProtocolVersion */,
- 2 /* outerProtocolVersion */,
- true /* reverse */);
-}
-
-
-function testConnectMismatchedNames_v2_v1() {
- checkConnectMismatchedNames(
- 2 /* innerProtocolVersion */,
- 1 /* outerProtocolVersion */,
- false /* reverse */);
-}
-
-
-function testConnectMismatchedNames_v2_v1_rev() {
- checkConnectMismatchedNames(
- 2 /* innerProtocolVersion */,
- 1 /* outerProtocolVersion */,
- true /* reverse */);
-}
-
-
-function testConnectMismatchedNames_v2_v2() {
- checkConnectMismatchedNames(
- 2 /* innerProtocolVersion */,
- 2 /* outerProtocolVersion */,
- false /* reverse */);
-}
-
-
-function testConnectMismatchedNames_v2_v2_rev() {
- checkConnectMismatchedNames(
- 2 /* innerProtocolVersion */,
- 2 /* outerProtocolVersion */,
- true /* reverse */);
-}
-
-
-function checkConnectMismatchedNames(innerProtocolVersion,
- outerProtocolVersion, reverse) {
- driver.createPeerIframe('new_iframe', false /* oneSidedHandshake */, innerProtocolVersion,
- outerProtocolVersion, true /* opt_randomChannelNames */);
- driver.connect(false /* fullLifeCycleTest */,
- false /* outerFrameReconnectSupported */,
- false /* innerFrameMigrationSupported */,
- false /* reverse */);
-}
-
-
-function testEscapeServiceName() {
- var escape = goog.net.xpc.CrossPageChannel.prototype.escapeServiceName_;
- assertEquals('Shouldn\'t escape alphanumeric name',
- 'fooBar123', escape('fooBar123'));
- assertEquals('Shouldn\'t escape most non-alphanumeric characters',
- '`~!@#$^&*()_-=+ []{}\'";,<.>/?\\',
- escape('`~!@#$^&*()_-=+ []{}\'";,<.>/?\\'));
- assertEquals('Should escape %, |, and :',
- 'foo%3ABar%7C123%25', escape('foo:Bar|123%'));
- assertEquals('Should escape tp', '%25tp', escape('tp'));
- assertEquals('Should escape %tp', '%25%25tp', escape('%tp'));
- assertEquals('Should not escape stp', 'stp', escape('stp'));
- assertEquals('Should not escape s%tp', 's%25tp', escape('s%tp'));
-}
-
-
-function testSameDomainCheck_noMessageOrigin() {
- var channel = new goog.net.xpc.CrossPageChannel(goog.object.create(
- goog.net.xpc.CfgFields.PEER_HOSTNAME, 'http://foo.com'));
- assertTrue(channel.isMessageOriginAcceptable_(undefined));
-}
-
-
-function testSameDomainCheck_noPeerHostname() {
- var channel = new goog.net.xpc.CrossPageChannel({});
- assertTrue(channel.isMessageOriginAcceptable_('http://foo.com'));
-}
-
-
-function testSameDomainCheck_unconfigured() {
- var channel = new goog.net.xpc.CrossPageChannel({});
- assertTrue(channel.isMessageOriginAcceptable_(undefined));
-}
-
-
-function testSameDomainCheck_originsMatch() {
- var channel = new goog.net.xpc.CrossPageChannel(goog.object.create(
- goog.net.xpc.CfgFields.PEER_HOSTNAME, 'http://foo.com'));
- assertTrue(channel.isMessageOriginAcceptable_('http://foo.com'));
-}
-
-
-function testSameDomainCheck_originsMismatch() {
- var channel = new goog.net.xpc.CrossPageChannel(goog.object.create(
- goog.net.xpc.CfgFields.PEER_HOSTNAME, 'http://foo.com'));
- assertFalse(channel.isMessageOriginAcceptable_('http://nasty.com'));
-}
-
-
-function testUnescapeServiceName() {
- var unescape = goog.net.xpc.CrossPageChannel.prototype.unescapeServiceName_;
- assertEquals('Shouldn\'t modify alphanumeric name',
- 'fooBar123', unescape('fooBar123'));
- assertEquals('Shouldn\'t modify most non-alphanumeric characters',
- '`~!@#$^&*()_-=+ []{}\'";,<.>/?\\',
- unescape('`~!@#$^&*()_-=+ []{}\'";,<.>/?\\'));
- assertEquals('Should unescape URL-escapes',
- 'foo:Bar|123%', unescape('foo%3ABar%7C123%25'));
- assertEquals('Should unescape tp', 'tp', unescape('%25tp'));
- assertEquals('Should unescape %tp', '%tp', unescape('%25%25tp'));
- assertEquals('Should not escape stp', 'stp', unescape('stp'));
- assertEquals('Should not escape s%tp', 's%tp', unescape('s%25tp'));
-}
-
-
-/**
- * Tests the case where the channel is disposed before it is fully connected.
- */
-function testDisposeBeforeConnect() {
- asyncTestCase.waitForAsync('Checking disposal before connection.')
- driver.createPeerIframe('new_iframe', false /* oneSidedHandshake */,
- 2 /* innerProtocolVersion */, 2 /* outerProtocolVersion */,
- true /* opt_randomChannelNames */);
- driver.connectOuterAndDispose();
-}
-
-
-/**
- * Driver for the tests for CrossPageChannel.
- *
- * @constructor
- * @extends {goog.Disposable}
- */
-Driver = function() {
- goog.Disposable.call(this);
-
- /**
- * The peer iframe.
- * @type {!Element}
- * @private
- */
- this.iframe_ = null;
-
- /**
- * The channel to use.
- * @type {goog.net.xpc.CrossPageChannel}
- * @private
- */
- this.channel_ = null;
-
- /**
- * Outer frame configuration object.
- * @type {Object}
- * @private
- */
- this.outerFrameCfg_ = null;
-
- /**
- * The initial name of the outer channel.
- * @type {?string}
- * @private
- */
- this.initialOuterChannelName_ = null;
-
- /**
- * Inner frame configuration object.
- * @type {Object}
- * @private
- */
- this.innerFrameCfg_ = null;
-
- /**
- * The contents of the payload of the 'echo' request sent by the inner frame.
- * @type {?string}
- * @private
- */
- this.innerFrameEchoPayload_ = null;
-
- /**
- * The contents of the payload of the 'echo' request sent by the outer frame.
- * @type {?string}
- * @private
- */
- this.outerFrameEchoPayload_ = null;
-
- /**
- * A deferred which fires when the inner frame receives its echo response.
- * @type {goog.async.Deferred}
- * @private
- */
- this.innerFrameResponseReceived_ = new goog.async.Deferred();
-
- /**
- * A deferred which fires when the outer frame receives its echo response.
- * @type {goog.async.Deferred}
- * @private
- */
- this.outerFrameResponseReceived_ = new goog.async.Deferred();
-
-};
-goog.inherits(Driver, goog.Disposable);
-
-
-/** @override */
-Driver.prototype.disposeInternal = function() {
- // Required to make this test perform acceptably (and pass) on slow browsers,
- // esp IE8.
- if (CLEAN_UP_IFRAMES) {
- goog.dom.removeNode(this.iframe_);
- delete this.iframe_;
- }
- goog.dispose(this.channel_);
- this.innerFrameResponseReceived_.cancel();
- this.innerFrameResponseReceived_ = null;
- this.outerFrameResponseReceived_.cancel();
- this.outerFrameResponseReceived_ = null;
- goog.base(this, 'disposeInternal');
-};
-
-
-/**
- * Returns the child peer's window object.
- * @return {Window} Child peer's window.
- * @private
- */
-Driver.prototype.getInnerPeer_ = function() {
- return this.iframe_.contentWindow;
-};
-
-
-/**
- * Sets up the configuration objects for the inner and outer frames.
- * @param {string=} opt_iframeId If present, the ID of the iframe to use,
- * otherwise, tells the channel to generate an iframe ID.
- * @param {boolean=} opt_oneSidedHandshake Whether the one sided handshake
- * config option should be set.
- * @param {string=} opt_channelName The name of the channel to use, or null
- * to generate one.
- * @param {number=} opt_innerProtocolVersion The native transport protocol
- * version used in the inner iframe.
- * @param {number=} opt_outerProtocolVersion The native transport protocol
- * version used in the outer iframe.
- * @param {boolean=} randomChannelNames Whether the different ends of the
- * channel should be allowed to pick differing, random names.
- * @return {string} The name of the created channel.
- * @private
- */
-Driver.prototype.setConfiguration_ = function(opt_iframeId,
- opt_oneSidedHandshake, opt_channelName, opt_innerProtocolVersion,
- opt_outerProtocolVersion, opt_randomChannelNames) {
- var cfg = {};
- if (opt_iframeId) {
- cfg[goog.net.xpc.CfgFields.IFRAME_ID] = opt_iframeId;
- }
- cfg[goog.net.xpc.CfgFields.PEER_URI] = 'testdata/inner_peer.html';
- if (!opt_randomChannelNames) {
- var channelName = opt_channelName || 'test_channel' + uniqueId++;
- cfg[goog.net.xpc.CfgFields.CHANNEL_NAME] = channelName;
- }
- cfg[goog.net.xpc.CfgFields.LOCAL_POLL_URI] = 'does-not-exist.html';
- cfg[goog.net.xpc.CfgFields.PEER_POLL_URI] = 'does-not-exist.html';
- cfg[goog.net.xpc.CfgFields.ONE_SIDED_HANDSHAKE] = !!opt_oneSidedHandshake;
- cfg[goog.net.xpc.CfgFields.NATIVE_TRANSPORT_PROTOCOL_VERSION] =
- opt_outerProtocolVersion;
- function resolveUri(fieldName) {
- cfg[fieldName] =
- goog.Uri.resolve(window.location.href, cfg[fieldName]).toString();
- }
- resolveUri(goog.net.xpc.CfgFields.PEER_URI);
- resolveUri(goog.net.xpc.CfgFields.LOCAL_POLL_URI);
- resolveUri(goog.net.xpc.CfgFields.PEER_POLL_URI);
- this.outerFrameCfg_ = cfg;
- this.innerFrameCfg_ = goog.object.clone(cfg);
- this.innerFrameCfg_[
- goog.net.xpc.CfgFields.NATIVE_TRANSPORT_PROTOCOL_VERSION] =
- opt_innerProtocolVersion;
-};
-
-
-/**
- * Creates an outer frame channel object.
- * @private
- */
-Driver.prototype.createChannel_ = function() {
- if (this.channel_) {
- this.channel_.dispose();
- }
- this.channel_ = new goog.net.xpc.CrossPageChannel(this.outerFrameCfg_);
- this.channel_.registerService('echo',
- goog.bind(this.echoHandler_, this));
- this.channel_.registerService('response',
- goog.bind(this.responseHandler_, this));
-
- return this.channel_.name;
-};
-
-
-/**
- * Checks the names of the inner and outer frames meet expectations.
- * @private
- */
-Driver.prototype.checkChannelNames_ = function() {
- var outerName = this.channel_.name;
- var innerName = this.getInnerPeer_().channel.name;
- var configName = this.innerFrameCfg_[goog.net.xpc.CfgFields.CHANNEL_NAME]
- || null;
-
- // The outer channel never changes its name.
- assertEquals(this.initialOuterChannelName_, outerName);
- // The name should be as configured, if it was configured.
- if (configName) {
- assertEquals(configName, innerName);
- }
- // The names of both ends of the channel should match.
- assertEquals(innerName, outerName);
- G_testRunner.log('Channel name: ' + innerName);
-};
-
-
-/**
- * Returns the configuration of the xpc.
- * @return {?Object} The configuration of the xpc.
- */
-Driver.prototype.getInnerFrameConfiguration = function() {
- return this.innerFrameCfg_;
-};
-
-
-/**
- * Creates the peer iframe.
- * @param {string=} opt_iframeId If present, the ID of the iframe to create,
- * otherwise, generates an iframe ID.
- * @param {boolean=} opt_oneSidedHandshake Whether a one sided handshake is
- * specified.
- * @param {number=} opt_innerProtocolVersion The native transport protocol
- * version used in the inner iframe.
- * @param {number=} opt_outerProtocolVersion The native transport protocol
- * version used in the outer iframe.
- * @param {boolean=} opt_randomChannelNames Whether the ends of the channel
- * should be allowed to pick differing, random names.
- * @return {!Array.<string>} The id of the created iframe and the name of the
- * created channel.
- */
-Driver.prototype.createPeerIframe = function(opt_iframeId,
- opt_oneSidedHandshake, opt_innerProtocolVersion, opt_outerProtocolVersion,
- opt_randomChannelNames) {
- var expectedIframeId;
-
- if (opt_iframeId) {
- expectedIframeId = opt_iframeId = opt_iframeId + uniqueId++;
- } else {
- // Have createPeerIframe() generate an ID
- stubs.set(goog.net.xpc, 'getRandomString', function(length) {
- return '' + length;
- });
- expectedIframeId = 'xpcpeer4';
- }
- assertNull('element[id=' + expectedIframeId + '] exists',
- goog.dom.getElement(expectedIframeId));
-
- this.setConfiguration_(opt_iframeId, opt_oneSidedHandshake,
- undefined /* opt_channelName */, opt_innerProtocolVersion,
- opt_outerProtocolVersion, opt_randomChannelNames);
- var channelName = this.createChannel_();
- this.initialOuterChannelName_ = channelName;
- this.iframe_ = this.channel_.createPeerIframe(document.body);
-
- assertEquals(expectedIframeId, this.iframe_.id);
-};
-
-
-/**
- * Checks if the peer iframe has been created.
- */
-Driver.prototype.checkPeerIframe = function() {
- assertNotNull(this.iframe_);
- var peer = this.getInnerPeer_();
- assertNotNull(peer);
- assertNotNull(peer.document);
-};
-
-
-/**
- * Starts the connection. The connection happens asynchronously.
- */
-Driver.prototype.connect = function(fullLifeCycleTest,
- outerFrameReconnectSupported, innerFrameMigrationSupported, reverse) {
- if (!this.isTransportTestable_()) {
- asyncTestCase.continueTesting();
- return;
- }
-
- asyncTestCase.waitForAsync('parent and child connect');
-
- // Set the criteria for the initial handshake portion of the test.
- this.reinitializeDeferreds_();
- this.innerFrameResponseReceived_.awaitDeferred(
- this.outerFrameResponseReceived_);
- this.innerFrameResponseReceived_.addCallback(
- goog.bind(this.checkChannelNames_, this));
-
- if (fullLifeCycleTest) {
- this.innerFrameResponseReceived_.addCallback(
- goog.bind(this.testReconnects_, this,
- outerFrameReconnectSupported, innerFrameMigrationSupported));
- } else {
- this.innerFrameResponseReceived_.addCallback(
- goog.bind(asyncTestCase.continueTesting, asyncTestCase));
- }
-
- this.continueConnect_(reverse);
-};
-
-
-Driver.prototype.continueConnect_ = function(reverse) {
- // Wait until the peer is fully established. Establishment is sometimes very
- // slow indeed, especially on virtual machines, so a fixed timeout is not
- // suitable. This wait is required because we want to take precise control
- // of the channel startup timing, and shouldn't be needed in production use,
- // where the inner frame's channel is typically not started by a DOM call as
- // it is here.
- if (!this.getInnerPeer_() || !this.getInnerPeer_().instantiateChannel) {
- window.setTimeout(goog.bind(this.continueConnect_, this, reverse), 100);
- return;
- }
-
- var connectFromOuterFrame = goog.bind(this.channel_.connect, this.channel_,
- goog.bind(this.outerFrameConnected_, this));
- var innerConfig = this.innerFrameCfg_;
- var connectFromInnerFrame = goog.bind(this.getInnerPeer_().instantiateChannel,
- this.getInnerPeer_(), innerConfig);
-
- // Take control of the timing and reverse of each frame's first SETUP call. If
- // these happen to fire right on top of each other, that tends to mask
- // problems that reliably occur when there is a short delay.
- window.setTimeout(connectFromOuterFrame, reverse ? 1 : 10);
- window.setTimeout(connectFromInnerFrame, reverse ? 10 : 1);
-};
-
-
-/**
- * Called by the outer frame connection callback.
- * @private
- */
-Driver.prototype.outerFrameConnected_ = function() {
- var payload = this.outerFrameEchoPayload_ =
- goog.net.xpc.getRandomString(10);
- this.channel_.send('echo', payload);
-};
-
-
-/**
- * Called by the inner frame connection callback.
- */
-Driver.prototype.innerFrameConnected = function() {
- var payload = this.innerFrameEchoPayload_ =
- goog.net.xpc.getRandomString(10);
- this.getInnerPeer_().sendEcho(payload);
-};
-
-
-/**
- * The handler function for incoming echo requests.
- * @param {string} payload The message payload.
- * @private
- */
-Driver.prototype.echoHandler_ = function(payload) {
- assertTrue('outer frame should be connected', this.channel_.isConnected());
- var peer = this.getInnerPeer_();
- assertTrue('child should be connected', peer.isConnected());
- this.channel_.send('response', payload);
-};
-
-
-/**
- * The handler function for incoming echo responses.
- * @param {string} payload The message payload.
- * @private
- */
-Driver.prototype.responseHandler_ = function(payload) {
- assertTrue('outer frame should be connected', this.channel_.isConnected());
- var peer = this.getInnerPeer_();
- assertTrue('child should be connected', peer.isConnected());
- assertEquals(this.outerFrameEchoPayload_, payload);
- this.outerFrameResponseReceived_.callback(true);
-};
-
-
-/**
- * The handler function for incoming echo replies.
- * @param {string} payload The message payload.
- * @private
- */
-Driver.prototype.innerFrameGotResponse = function(payload) {
- assertTrue('outer frame should be connected', this.channel_.isConnected());
- var peer = this.getInnerPeer_();
- assertTrue('child should be connected', peer.isConnected());
- assertEquals(this.innerFrameEchoPayload_, payload);
- this.innerFrameResponseReceived_.callback(true);
-};
-
-
-/**
- * The second phase of the standard test, where reconnections of both the inner
- * and outer frames are performed.
- * @param {boolean} outerFrameReconnectSupported Whether outer frame reconnects
- * are supported, and should be tested.
- * @private
- */
-Driver.prototype.testReconnects_ = function(outerFrameReconnectSupported,
- innerFrameMigrationSupported) {
- G_testRunner.log('Performing inner frame reconnect');
- this.reinitializeDeferreds_();
- this.innerFrameResponseReceived_.addCallback(
- goog.bind(this.checkChannelNames_, this));
-
- if (outerFrameReconnectSupported) {
- this.innerFrameResponseReceived_.addCallback(
- goog.bind(this.performOuterFrameReconnect_, this,
- innerFrameMigrationSupported));
- } else if (innerFrameMigrationSupported) {
- this.innerFrameResponseReceived_.addCallback(
- goog.bind(this.migrateInnerFrame_, this));
- } else {
- this.innerFrameResponseReceived_.addCallback(
- goog.bind(asyncTestCase.continueTesting, asyncTestCase));
- }
-
- this.performInnerFrameReconnect_();
-};
-
-
-/**
- * Initializes the deferreds and clears the echo payloads, ready for another
- * sub-test.
- * @private
- */
-Driver.prototype.reinitializeDeferreds_ = function() {
- this.innerFrameEchoPayload_ = null;
- this.outerFrameEchoPayload_ = null;
- this.innerFrameResponseReceived_.cancel();
- this.innerFrameResponseReceived_ = new goog.async.Deferred();
- this.outerFrameResponseReceived_.cancel();
- this.outerFrameResponseReceived_ = new goog.async.Deferred();
-};
-
-
-/**
- * Get the inner frame to reconnect, and repeat the echo test.
- * @private
- */
-Driver.prototype.performInnerFrameReconnect_ = function() {
- var peer = this.getInnerPeer_();
- peer.instantiateChannel(this.innerFrameCfg_);
-};
-
-
-/**
- * Get the outer frame to reconnect, and repeat the echo test.
- * @private
- */
-Driver.prototype.performOuterFrameReconnect_ = function(
- innerFrameMigrationSupported) {
- G_testRunner.log('Reconnecting outer frame');
- this.reinitializeDeferreds_();
- this.innerFrameResponseReceived_.addCallback(
- goog.bind(this.checkChannelNames_, this));
- if (innerFrameMigrationSupported) {
- this.outerFrameResponseReceived_.addCallback(
- goog.bind(this.migrateInnerFrame_, this));
- } else {
- this.outerFrameResponseReceived_.addCallback(
- goog.bind(asyncTestCase.continueTesting, asyncTestCase));
- }
- this.createChannel_();
- this.channel_.connect(goog.bind(this.outerFrameConnected_, this));
-};
-
-
-/**
- * Migrate the inner frame to the alternate protocol version and reconnect it.
- * @private
- */
-Driver.prototype.migrateInnerFrame_ = function() {
- G_testRunner.log('Migrating inner frame');
- this.reinitializeDeferreds_();
- var innerFrameProtoVersion = this.innerFrameCfg_[
- goog.net.xpc.CfgFields.NATIVE_TRANSPORT_PROTOCOL_VERSION];
- this.innerFrameResponseReceived_.addCallback(
- goog.bind(this.checkChannelNames_, this));
- this.innerFrameResponseReceived_.addCallback(
- goog.bind(asyncTestCase.continueTesting, asyncTestCase));
- this.innerFrameCfg_[
- goog.net.xpc.CfgFields.NATIVE_TRANSPORT_PROTOCOL_VERSION] =
- innerFrameProtoVersion == 1 ? 2 : 1;
- this.performInnerFrameReconnect_();
-};
-
-
-/**
- * Determines if the transport type for the channel is testable.
- * Some transports are misusing global state or making other
- * assumptions that cause connections to fail.
- * @return {boolean} Whether the transport is testable.
- * @private
- */
-Driver.prototype.isTransportTestable_ = function() {
- var testable = false;
-
- var transportType = this.channel_.determineTransportType_();
- switch (transportType) {
- case goog.net.xpc.TransportTypes.IFRAME_RELAY:
- case goog.net.xpc.TransportTypes.IFRAME_POLLING:
- testable = canAccessSameDomainIframe;
- break;
- case goog.net.xpc.TransportTypes.NATIVE_MESSAGING:
- case goog.net.xpc.TransportTypes.FLASH:
- case goog.net.xpc.TransportTypes.NIX:
- testable = true;
- break;
- }
-
- return testable;
-};
-
-
-/**
- * Connect the outer channel but not the inner one. Wait a short time, then
- * dispose the outer channel and make sure it was torn down properly.
- */
-Driver.prototype.connectOuterAndDispose = function() {
- this.channel_.connect();
- window.setTimeout(goog.bind(this.disposeAndCheck_, this), 2000);
-};
-
-
-/**
- * Dispose the cross-page channel. Check that the transport was also
- * disposed, and allow to run briefly to make sure no timers which will cause
- * failures are still running.
- */
-Driver.prototype.disposeAndCheck_ = function() {
- assertFalse(this.channel_.isConnected());
- var transport = this.channel_.transport_;
- this.channel_.dispose();
- assertNull(this.channel_.transport_);
- assertTrue(this.channel_.isDisposed());
- assertTrue(transport.isDisposed());
-
- // Let any errors caused by erroneous retries happen.
- window.setTimeout(goog.bind(asyncTestCase.continueTesting, asyncTestCase),
- 2000);
-};
-
-</script>
-
-<!-- Debug box. -->
-<div style="position:absolute; float: right; top: 10px; right: 10px; width: 500px">
-Debug [<a href="#" onclick="document.getElementById('debugDiv').innerHTML = '';">clear</a>]: <br/>
-<div id="debugDiv" style="border: 1px #000000 solid; font-size:xx-small; background: #fff;"></div>
-</div>
-
-</body>
-</html>