| // 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. |
| } |
| })(); |