// 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: // #[,]| // 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. } })();