1 // Copyright (c) 2011 The Chromium Authors. All rights reserved. 2 // Use of this source code is governed by a BSD-style license that can be 3 // found in the LICENSE file. 4 5 /** 6 * @fileoverview Implements CFInstall.check and isAvailable in a way that is 7 * compatible with previous versions. Also supports a more streamlined 8 * method, 'require'. 9 * 10 **/ 11 12 goog.provide('google.cf.installer.CFInstall'); 13 14 goog.require('google.cf.ChromeFrame'); 15 goog.require('google.cf.installer.InlineDelegate'); 16 goog.require('google.cf.installer.Installer'); 17 goog.require('google.cf.installer.OverlayDelegate'); 18 goog.require('google.cf.installer.Prompt'); 19 20 /** 21 * Instantiates the CFInstall object. Normally there will be only one, at 22 * Window.CFInstall . 23 * @constructor 24 */ 25 google.cf.installer.CFInstall = function() { 26 this.prompt_ = new google.cf.installer.Prompt(); 27 this.chromeFrame_ = new google.cf.ChromeFrame(); 28 this.installer_ = new google.cf.installer.Installer( 29 this.prompt_, this.chromeFrame_); 30 this['setDownloadPageUrl'] = 31 goog.bind(this.prompt_.setDownloadPageUrl, this.prompt_); 32 this['setImplementationUrl'] = 33 goog.bind(this.prompt_.setImplementationUrl, this.prompt_); 34 this['setSameDomainResourceUri'] = 35 goog.bind(this.prompt_.setSameDomainResourceUri, this.prompt_); 36 this['setInteractionDelegate'] = 37 goog.bind(this.prompt_.setInteractionDelegate, this.prompt_); 38 this['require'] = goog.bind(this.installer_.require, this.installer_); 39 this['isAvailable'] = 40 goog.bind(this.chromeFrame_.activate, this.chromeFrame_); 41 }; 42 43 /** 44 * TODO(user): This cookie is not currently set anywhere. 45 * @return {boolean} Whether the user has previously declined Chrome Frame. 46 * @private 47 */ 48 google.cf.installer.CFInstall.isDeclined_ = function() { 49 return document.cookie.indexOf("disableGCFCheck=1") >=0; 50 }; 51 52 /** 53 * Checks to see if Chrome Frame is available, if not, prompts the user to 54 * install. Once installation is begun, a background timer starts, 55 * checkinging for a successful install every 2 seconds. Upon detection of 56 * successful installation, the current page is reloaded, or if a 57 * 'destination' parameter is passed, the page navigates there instead. 58 * @param {Object} args A bag of configuration properties. Respected 59 * properties are: 'mode', 'url', 'destination', 'node', 'onmissing', 60 * 'preventPrompt', 'oninstall', 'preventInstallDetection', 'cssText', and 61 * 'className'. 62 */ 63 google.cf.installer.CFInstall.prototype['check'] = function(args) { 64 args = args || {}; 65 66 if (!this.chromeFrame_.isPlatformSupported()) 67 return; 68 69 if (this.chromeFrame_.activate()) 70 return; 71 72 if (args['onmissing']) 73 args['onmissing'](); 74 75 if (google.cf.installer.CFInstall.isDeclined_() || args['preventPrompt']) 76 return; 77 78 // NOTE: @slightlyoff, I'm doing away with the window.open option here. Sites 79 // that were using it will now use the popup. 80 81 // In the case of legacy installation parameters, supply a compatible 82 // InteractionDelegate. 83 if (args['mode'] == 'inline' || args['node'] || args['id'] || 84 args['cssText'] || args['className']) { 85 if (!args['mode'] || args['mode'] == 'inline') { 86 this.prompt_.setInteractionDelegate( 87 new google.cf.installer.InlineDelegate(args)); 88 } else { 89 this.prompt_.setInteractionDelegate( 90 new google.cf.installer.OverlayDelegate(args)); 91 } 92 } 93 94 if (args['src']) 95 this.prompt_.setDownloadPageUrl(args['src']); 96 97 var onSuccess = function() { 98 if (this.chromeFrame_.activate() && !args['preventInstallDetection']) { 99 if (args['oninstall']) 100 args['oninstall'](); 101 window.location.assign(args['destination'] || window.location); 102 } 103 }; 104 105 this.prompt_.open(onSuccess, undefined); 106 }; 107 108 // In compiled mode, this binary is wrapped in an anonymous function which 109 // receives the outer scope as its only parameter. In non-compiled mode, the 110 // outer scope is window. 111 112 // Create a single instance of CFInstall and place it in the outer scope 113 // (presumably the global window object). 114 try { 115 arguments[0]['CFInstall'] = new google.cf.installer.CFInstall(); 116 } catch (e) { 117 window['CFInstall'] = new google.cf.installer.CFInstall(); 118 } 119