// 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 CFInstall.check and isAvailable in a way that is * compatible with previous versions. Also supports a more streamlined * method, 'require'. * **/ goog.provide('google.cf.installer.CFInstall'); goog.require('google.cf.ChromeFrame'); goog.require('google.cf.installer.InlineDelegate'); goog.require('google.cf.installer.Installer'); goog.require('google.cf.installer.OverlayDelegate'); goog.require('google.cf.installer.Prompt'); /** * Instantiates the CFInstall object. Normally there will be only one, at * Window.CFInstall . * @constructor */ google.cf.installer.CFInstall = function() { this.prompt_ = new google.cf.installer.Prompt(); this.chromeFrame_ = new google.cf.ChromeFrame(); this.installer_ = new google.cf.installer.Installer( this.prompt_, this.chromeFrame_); this['setDownloadPageUrl'] = goog.bind(this.prompt_.setDownloadPageUrl, this.prompt_); this['setImplementationUrl'] = goog.bind(this.prompt_.setImplementationUrl, this.prompt_); this['setSameDomainResourceUri'] = goog.bind(this.prompt_.setSameDomainResourceUri, this.prompt_); this['setInteractionDelegate'] = goog.bind(this.prompt_.setInteractionDelegate, this.prompt_); this['require'] = goog.bind(this.installer_.require, this.installer_); this['isAvailable'] = goog.bind(this.chromeFrame_.activate, this.chromeFrame_); }; /** * TODO(user): This cookie is not currently set anywhere. * @return {boolean} Whether the user has previously declined Chrome Frame. * @private */ google.cf.installer.CFInstall.isDeclined_ = function() { return document.cookie.indexOf("disableGCFCheck=1") >=0; }; /** * Checks to see if Chrome Frame is available, if not, prompts the user to * install. Once installation is begun, a background timer starts, * checkinging for a successful install every 2 seconds. Upon detection of * successful installation, the current page is reloaded, or if a * 'destination' parameter is passed, the page navigates there instead. * @param {Object} args A bag of configuration properties. Respected * properties are: 'mode', 'url', 'destination', 'node', 'onmissing', * 'preventPrompt', 'oninstall', 'preventInstallDetection', 'cssText', and * 'className'. */ google.cf.installer.CFInstall.prototype['check'] = function(args) { args = args || {}; if (!this.chromeFrame_.isPlatformSupported()) return; if (this.chromeFrame_.activate()) return; if (args['onmissing']) args['onmissing'](); if (google.cf.installer.CFInstall.isDeclined_() || args['preventPrompt']) return; // NOTE: @slightlyoff, I'm doing away with the window.open option here. Sites // that were using it will now use the popup. // In the case of legacy installation parameters, supply a compatible // InteractionDelegate. if (args['mode'] == 'inline' || args['node'] || args['id'] || args['cssText'] || args['className']) { if (!args['mode'] || args['mode'] == 'inline') { this.prompt_.setInteractionDelegate( new google.cf.installer.InlineDelegate(args)); } else { this.prompt_.setInteractionDelegate( new google.cf.installer.OverlayDelegate(args)); } } if (args['src']) this.prompt_.setDownloadPageUrl(args['src']); var onSuccess = function() { if (this.chromeFrame_.activate() && !args['preventInstallDetection']) { if (args['oninstall']) args['oninstall'](); window.location.assign(args['destination'] || window.location); } }; this.prompt_.open(onSuccess, undefined); }; // 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. // Create a single instance of CFInstall and place it in the outer scope // (presumably the global window object). try { arguments[0]['CFInstall'] = new google.cf.installer.CFInstall(); } catch (e) { window['CFInstall'] = new google.cf.installer.CFInstall(); }