aboutsummaryrefslogtreecommitdiff
path: root/contexts/data/lib/closure-library/closure/goog/net/xpc/iframerelaytransport.js
diff options
context:
space:
mode:
Diffstat (limited to 'contexts/data/lib/closure-library/closure/goog/net/xpc/iframerelaytransport.js')
-rw-r--r--contexts/data/lib/closure-library/closure/goog/net/xpc/iframerelaytransport.js393
1 files changed, 0 insertions, 393 deletions
diff --git a/contexts/data/lib/closure-library/closure/goog/net/xpc/iframerelaytransport.js b/contexts/data/lib/closure-library/closure/goog/net/xpc/iframerelaytransport.js
deleted file mode 100644
index 1281c49..0000000
--- a/contexts/data/lib/closure-library/closure/goog/net/xpc/iframerelaytransport.js
+++ /dev/null
@@ -1,393 +0,0 @@
-// Copyright 2007 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 Contains the iframe relay tranport.
- */
-
-
-goog.provide('goog.net.xpc.IframeRelayTransport');
-
-goog.require('goog.dom');
-goog.require('goog.events');
-goog.require('goog.net.xpc');
-goog.require('goog.net.xpc.Transport');
-goog.require('goog.userAgent');
-
-
-
-/**
- * Iframe relay transport. Creates hidden iframes containing a document
- * from the peer's origin. Data is transferred in the fragment identifier.
- * Therefore the document loaded in the iframes can be served from the
- * browser's cache.
- *
- * @param {goog.net.xpc.CrossPageChannel} channel The channel this
- * transport belongs to.
- * @param {goog.dom.DomHelper=} opt_domHelper The dom helper to use for finding
- * the correct window.
- * @constructor
- * @extends {goog.net.xpc.Transport}
- */
-goog.net.xpc.IframeRelayTransport = function(channel, opt_domHelper) {
- goog.base(this, opt_domHelper);
-
- /**
- * The channel this transport belongs to.
- * @type {goog.net.xpc.CrossPageChannel}
- * @private
- */
- this.channel_ = channel;
-
- /**
- * The URI used to relay data to the peer.
- * @type {string}
- * @private
- */
- this.peerRelayUri_ =
- this.channel_.getConfig()[goog.net.xpc.CfgFields.PEER_RELAY_URI];
-
- /**
- * The id of the iframe the peer page lives in.
- * @type {string}
- * @private
- */
- this.peerIframeId_ =
- this.channel_.getConfig()[goog.net.xpc.CfgFields.IFRAME_ID];
-
- if (goog.userAgent.WEBKIT) {
- goog.net.xpc.IframeRelayTransport.startCleanupTimer_();
- }
-};
-goog.inherits(goog.net.xpc.IframeRelayTransport, goog.net.xpc.Transport);
-
-
-if (goog.userAgent.WEBKIT) {
- /**
- * Array to keep references to the relay-iframes. Used only if
- * there is no way to detect when the iframes are loaded. In that
- * case the relay-iframes are removed after a timeout.
- * @type {Array.<Object>}
- * @private
- */
- goog.net.xpc.IframeRelayTransport.iframeRefs_ = [];
-
-
- /**
- * Interval at which iframes are destroyed.
- * @type {number}
- * @private
- */
- goog.net.xpc.IframeRelayTransport.CLEANUP_INTERVAL_ = 1000;
-
-
- /**
- * Time after which a relay-iframe is destroyed.
- * @type {number}
- * @private
- */
- goog.net.xpc.IframeRelayTransport.IFRAME_MAX_AGE_ = 3000;
-
-
- /**
- * The cleanup timer id.
- * @type {number}
- * @private
- */
- goog.net.xpc.IframeRelayTransport.cleanupTimer_ = 0;
-
-
- /**
- * Starts the cleanup timer.
- * @private
- */
- goog.net.xpc.IframeRelayTransport.startCleanupTimer_ = function() {
- if (!goog.net.xpc.IframeRelayTransport.cleanupTimer_) {
- goog.net.xpc.IframeRelayTransport.cleanupTimer_ = window.setTimeout(
- function() { goog.net.xpc.IframeRelayTransport.cleanup_(); },
- goog.net.xpc.IframeRelayTransport.CLEANUP_INTERVAL_);
- }
- };
-
-
- /**
- * Remove all relay-iframes which are older than the maximal age.
- * @param {number=} opt_maxAge The maximal age in milliseconds.
- * @private
- */
- goog.net.xpc.IframeRelayTransport.cleanup_ = function(opt_maxAge) {
- var now = goog.now();
- var maxAge =
- opt_maxAge || goog.net.xpc.IframeRelayTransport.IFRAME_MAX_AGE_;
-
- while (goog.net.xpc.IframeRelayTransport.iframeRefs_.length &&
- now - goog.net.xpc.IframeRelayTransport.iframeRefs_[0].timestamp >=
- maxAge) {
- var ifr = goog.net.xpc.IframeRelayTransport.iframeRefs_.
- shift().iframeElement;
- goog.dom.removeNode(ifr);
- goog.net.xpc.logger.finest('iframe removed');
- }
-
- goog.net.xpc.IframeRelayTransport.cleanupTimer_ = window.setTimeout(
- goog.net.xpc.IframeRelayTransport.cleanupCb_,
- goog.net.xpc.IframeRelayTransport.CLEANUP_INTERVAL_);
- };
-
-
- /**
- * Function which wraps cleanup_().
- * @private
- */
- goog.net.xpc.IframeRelayTransport.cleanupCb_ = function() {
- goog.net.xpc.IframeRelayTransport.cleanup_();
- };
-}
-
-
-/**
- * Maximum sendable size of a payload via a single iframe in IE.
- * @type {number}
- * @private
- */
-goog.net.xpc.IframeRelayTransport.IE_PAYLOAD_MAX_SIZE_ = 1800;
-
-
-/**
- * @typedef {{fragments: !Array.<string>, received: number, expected: number}}
- */
-goog.net.xpc.IframeRelayTransport.FragmentInfo;
-
-
-/**
- * Used to track incoming payload fragments. The implementation can process
- * incoming fragments from several channels at a time, even if data is
- * out-of-order or interleaved.
- *
- * @type {!Object.<string, !goog.net.xpc.IframeRelayTransport.FragmentInfo>}
- * @private
- */
-goog.net.xpc.IframeRelayTransport.fragmentMap_ = {};
-
-
-/**
- * The transport type.
- * @type {number}
- * @override
- */
-goog.net.xpc.IframeRelayTransport.prototype.transportType =
- goog.net.xpc.TransportTypes.IFRAME_RELAY;
-
-
-/**
- * Connects this transport.
- * @override
- */
-goog.net.xpc.IframeRelayTransport.prototype.connect = function() {
- if (!this.getWindow()['xpcRelay']) {
- this.getWindow()['xpcRelay'] =
- goog.net.xpc.IframeRelayTransport.receiveMessage_;
- }
-
- this.send(goog.net.xpc.TRANSPORT_SERVICE_, goog.net.xpc.SETUP);
-};
-
-
-/**
- * Processes an incoming message.
- *
- * @param {string} channelName The name of the channel.
- * @param {string} frame The raw frame content.
- * @private
- */
-goog.net.xpc.IframeRelayTransport.receiveMessage_ =
- function(channelName, frame) {
- var pos = frame.indexOf(':');
- var header = frame.substr(0, pos);
- var payload = frame.substr(pos + 1);
-
- if (!goog.userAgent.IE || (pos = header.indexOf('|')) == -1) {
- // First, the easy case.
- var service = header;
- } else {
- // There was a fragment id in the header, so this is a message
- // fragment, not a whole message.
- var service = header.substr(0, pos);
- var fragmentIdStr = header.substr(pos + 1);
-
- // Separate the message id string and the fragment number. Note that
- // there may be a single leading + in the argument to parseInt, but
- // this is harmless.
- pos = fragmentIdStr.indexOf('+');
- var messageIdStr = fragmentIdStr.substr(0, pos);
- var fragmentNum = parseInt(fragmentIdStr.substr(pos + 1), 10);
- var fragmentInfo =
- goog.net.xpc.IframeRelayTransport.fragmentMap_[messageIdStr];
- if (!fragmentInfo) {
- fragmentInfo =
- goog.net.xpc.IframeRelayTransport.fragmentMap_[messageIdStr] =
- {fragments: [], received: 0, expected: 0};
- }
-
- if (goog.string.contains(fragmentIdStr, '++')) {
- fragmentInfo.expected = fragmentNum + 1;
- }
- fragmentInfo.fragments[fragmentNum] = payload;
- fragmentInfo.received++;
-
- if (fragmentInfo.received != fragmentInfo.expected) {
- return;
- }
-
- // We've received all outstanding fragments; combine what we've received
- // into payload and fall out to the call to xpcDeliver.
- payload = fragmentInfo.fragments.join('');
- delete goog.net.xpc.IframeRelayTransport.fragmentMap_[messageIdStr];
- }
-
- goog.net.xpc.channels[channelName].
- xpcDeliver(service, decodeURIComponent(payload));
-};
-
-
-/**
- * Handles transport service messages (internal signalling).
- * @param {string} payload The message content.
- * @override
- */
-goog.net.xpc.IframeRelayTransport.prototype.transportServiceHandler =
- function(payload) {
- if (payload == goog.net.xpc.SETUP) {
- // TODO(user) Safari swallows the SETUP_ACK from the iframe to the
- // container after hitting reload.
- this.send(goog.net.xpc.TRANSPORT_SERVICE_, goog.net.xpc.SETUP_ACK_);
- this.channel_.notifyConnected();
- }
- else if (payload == goog.net.xpc.SETUP_ACK_) {
- this.channel_.notifyConnected();
- }
-};
-
-
-/**
- * Sends a message.
- *
- * @param {string} service Name of service this the message has to be delivered.
- * @param {string} payload The message content.
- * @override
- */
-goog.net.xpc.IframeRelayTransport.prototype.send = function(service, payload) {
- // If we're on IE and the post-encoding payload is large, split it
- // into multiple payloads and send each one separately. Otherwise,
- // just send the whole thing.
- var encodedPayload = encodeURIComponent(payload);
- var encodedLen = encodedPayload.length;
- var maxSize = goog.net.xpc.IframeRelayTransport.IE_PAYLOAD_MAX_SIZE_;
-
- if (goog.userAgent.IE && encodedLen > maxSize) {
- // A probabilistically-unique string used to link together all fragments
- // in this message.
- var messageIdStr = goog.string.getRandomString();
-
- for (var startIndex = 0, fragmentNum = 0; startIndex < encodedLen;
- fragmentNum++) {
- var payloadFragment = encodedPayload.substr(startIndex, maxSize);
- startIndex += maxSize;
- var fragmentIdStr =
- messageIdStr + (startIndex >= encodedLen ? '++' : '+') + fragmentNum;
- this.send_(service, payloadFragment, fragmentIdStr);
- }
- } else {
- this.send_(service, encodedPayload);
- }
-};
-
-
-/**
- * Sends an encoded message or message fragment.
- * @param {string} service Name of service this the message has to be delivered.
- * @param {string} encodedPayload The message content, URI encoded.
- * @param {string=} opt_fragmentIdStr If sending a fragment, a string that
- * identifies the fragment.
- * @private
- */
-goog.net.xpc.IframeRelayTransport.prototype.send_ =
- function(service, encodedPayload, opt_fragmentIdStr) {
- // IE requires that we create the onload attribute inline, otherwise the
- // handler is not triggered
- if (goog.userAgent.IE) {
- var div = this.getWindow().document.createElement('div');
- div.innerHTML = '<iframe onload="this.xpcOnload()"></iframe>';
- var ifr = div.childNodes[0];
- div = null;
- ifr['xpcOnload'] = goog.net.xpc.IframeRelayTransport.iframeLoadHandler_;
- } else {
- var ifr = this.getWindow().document.createElement('iframe');
-
- if (goog.userAgent.WEBKIT) {
- // safari doesn't fire load-events on iframes.
- // keep a reference and remove after a timeout.
- goog.net.xpc.IframeRelayTransport.iframeRefs_.push({
- timestamp: goog.now(),
- iframeElement: ifr
- });
- } else {
- goog.events.listen(ifr, 'load',
- goog.net.xpc.IframeRelayTransport.iframeLoadHandler_);
- }
- }
-
- var style = ifr.style;
- style.visibility = 'hidden';
- style.width = ifr.style.height = '0px';
- style.position = 'absolute';
-
- var url = this.peerRelayUri_;
- url += '#' + this.channel_.name;
- if (this.peerIframeId_) {
- url += ',' + this.peerIframeId_;
- }
- url += '|' + service;
- if (opt_fragmentIdStr) {
- url += '|' + opt_fragmentIdStr;
- }
- url += ':' + encodedPayload;
-
- ifr.src = url;
-
- this.getWindow().document.body.appendChild(ifr);
-
- goog.net.xpc.logger.finest('msg sent: ' + url);
-};
-
-
-/**
- * The iframe load handler. Gets called as method on the iframe element.
- * @private
- * @this Element
- */
-goog.net.xpc.IframeRelayTransport.iframeLoadHandler_ = function() {
- goog.net.xpc.logger.finest('iframe-load');
- goog.dom.removeNode(this);
- this.xpcOnload = null;
-};
-
-
-/** @override */
-goog.net.xpc.IframeRelayTransport.prototype.disposeInternal = function() {
- goog.base(this, 'disposeInternal');
- if (goog.userAgent.WEBKIT) {
- goog.net.xpc.IframeRelayTransport.cleanup_(0);
- }
-};