Home | History | Annotate | Download | only in stub
      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