// Copyright (c) 2011 The Chromium Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. /** * @fileoverview Implements the in-line Google Chrome Frame installation flow. * Displays a dialog containing the download page. Upon completion, registers * the Google Chrome Frame components in the current browser process. * **/ goog.provide('google.cf.installer.CrossDomainInstall'); goog.require('goog.net.xpc.CrossPageChannel'); goog.require('goog.style'); goog.require('goog.Uri'); goog.require('google.cf.installer.InteractionDelegate'); goog.require('google.cf.installer.DialogInteractionDelegate'); /** * @type {Object} **/ google.cf.installer.CrossDomainInstall = {}; /** * @define {string} Defines the default download page URL. **/ google.cf.installer.CrossDomainInstall.DEFAULT_DOWNLOAD_PAGE_URL = '//www.google.com/chromeframe/eula.html'; /** * Executes the in-line installation flow. * @param {function()} successHandler Invoked upon installation success. When * invoked, Google Chrome Frame will be active in the current and all * future-launched browser processes. * @param {function()=} opt_failureHandler Invoked upon installation failure or * cancellation. * @param {string=} opt_url An alternative URL for the download page. * @param {google.cf.installer.InteractionDelegate=} opt_interactionDelegate An * alternative UI implementation for the modal dialog. * @param {string=} opt_dummyResourceUri A manually-specified dummy resource URI * that will be used to carry cross-domain responses. */ google.cf.installer.CrossDomainInstall.execute = function( successHandler, opt_failureHandler, opt_url, opt_interactionDelegate, opt_dummyResourceUri) { var url = new goog.Uri( opt_url || google.cf.installer.CrossDomainInstall.DEFAULT_DOWNLOAD_PAGE_URL); if (!url.hasScheme()) url = new goog.Uri(window.location.href).resolve(url); var interactionDelegate = opt_interactionDelegate || new google.cf.installer.DialogInteractionDelegate(); var cfg = {}; // TODO(user): Probably need to import some of the link/image url // detection stuff from XDRPC. if (opt_dummyResourceUri) { var dummyUrl = new goog.Uri(opt_dummyResourceUri); if (!dummyUrl.hasScheme()) dummyUrl = new goog.Uri(window.location.href).resolve(dummyUrl); cfg[goog.net.xpc.CfgFields.LOCAL_POLL_URI] = dummyUrl.toString(); } cfg[goog.net.xpc.CfgFields.PEER_URI] = url.toString(); var channel = new goog.net.xpc.CrossPageChannel(cfg); var iframe = channel.createPeerIframe( interactionDelegate.getIFrameContainer(), function(newIFrame) { newIFrame.setAttribute('frameBorder', '0'); newIFrame.setAttribute('border', '0'); interactionDelegate.customizeIFrame(newIFrame); }); channel.registerService('dimensions', function(size) { goog.style.setContentBoxSize(iframe, new goog.math.Size(size['width'], size['height'])); interactionDelegate.show(); }, true); // true => deserialize messages into objects channel.registerService('result', function(obj) { channel.close(); interactionDelegate.reset(); var result = obj['result']; if (result) successHandler(); else if (opt_failureHandler) opt_failureHandler(); }, true); // true => deserialize messages into objects // TODO(user): Perhaps listen to onload and set a timeout for connect. channel.connect(); }; // In compiled mode, this binary is wrapped in an anonymous function which // receives the outer scope as its only parameter. In non-compiled mode, the // outer scope is window. // Look in the outer scope for the stub, and pass it the implementation. try { if (arguments[0]['CF_google_cf_xd_install_stub']) { arguments[0]['CF_google_cf_xd_install_stub']( google.cf.installer.CrossDomainInstall.execute); } } catch (e) { if (window['CF_google_cf_xd_install_stub']) { window['CF_google_cf_xd_install_stub']( google.cf.installer.CrossDomainInstall.execute); } }