12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273 |
- // 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 Standalone script to be included in the relay-document
- * used by goog.net.xpc.IframeRelayTransport. This script will decode the
- * fragment identifier, determine the target window object and deliver
- * the data to it.
- *
- */
- /** @suppress {extraProvide} */
- goog.provide('goog.net.xpc.relay');
- (function() {
- // Decode the fragement identifier.
- // location.href is expected to be structured as follows:
- // <url>#<channel_name>[,<iframe_id>]|<data>
- // Get the fragment identifier.
- var raw = window.location.hash;
- if (!raw) {
- return;
- }
- if (raw.charAt(0) == '#') {
- raw = raw.substring(1);
- }
- var pos = raw.indexOf('|');
- var head = raw.substring(0, pos).split(',');
- var channelName = head[0];
- var iframeId = head.length == 2 ? head[1] : null;
- var frame = raw.substring(pos + 1);
- // Find the window object of the peer.
- //
- // The general structure of the frames looks like this:
- // - peer1
- // - relay2
- // - peer2
- // - relay1
- //
- // We are either relay1 or relay2.
- var win;
- if (iframeId) {
- // We are relay2 and need to deliver the data to peer2.
- win = window.parent.frames[iframeId];
- } else {
- // We are relay1 and need to deliver the data to peer1.
- win = window.parent.parent;
- }
- // Deliver the data.
- try {
- win['xpcRelay'](channelName, frame);
- } catch (e) {
- // Nothing useful can be done here.
- // It would be great to inform the sender the delivery of this message
- // failed, but this is not possible because we are already in the receiver's
- // domain at this point.
- }
- })();
|