OLD | NEW |
| (Empty) |
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 the in-line Google Chrome Frame installation flow. | |
7 * Displays a dialog containing the download page. Upon completion, registers | |
8 * the Google Chrome Frame components in the current browser process. | |
9 * | |
10 **/ | |
11 goog.provide('google.cf.installer.CrossDomainInstall'); | |
12 | |
13 goog.require('goog.net.xpc.CrossPageChannel'); | |
14 goog.require('goog.style'); | |
15 goog.require('goog.Uri'); | |
16 | |
17 goog.require('google.cf.installer.InteractionDelegate'); | |
18 goog.require('google.cf.installer.DialogInteractionDelegate'); | |
19 | |
20 /** | |
21 * @type {Object} | |
22 **/ | |
23 google.cf.installer.CrossDomainInstall = {}; | |
24 | |
25 /** | |
26 * @define {string} Defines the default download page URL. | |
27 **/ | |
28 google.cf.installer.CrossDomainInstall.DEFAULT_DOWNLOAD_PAGE_URL = | |
29 '//www.google.com/chromeframe/eula.html'; | |
30 | |
31 /** | |
32 * Executes the in-line installation flow. | |
33 * @param {function()} successHandler Invoked upon installation success. When | |
34 * invoked, Google Chrome Frame will be active in the current and all | |
35 * future-launched browser processes. | |
36 * @param {function()=} opt_failureHandler Invoked upon installation failure or | |
37 * cancellation. | |
38 * @param {string=} opt_url An alternative URL for the download page. | |
39 * @param {google.cf.installer.InteractionDelegate=} opt_interactionDelegate An | |
40 * alternative UI implementation for the modal dialog. | |
41 * @param {string=} opt_dummyResourceUri A manually-specified dummy resource URI | |
42 * that will be used to carry cross-domain responses. | |
43 */ | |
44 google.cf.installer.CrossDomainInstall.execute = function( | |
45 successHandler, opt_failureHandler, opt_url, opt_interactionDelegate, | |
46 opt_dummyResourceUri) { | |
47 var url = new goog.Uri( | |
48 opt_url || | |
49 google.cf.installer.CrossDomainInstall.DEFAULT_DOWNLOAD_PAGE_URL); | |
50 | |
51 if (!url.hasScheme()) | |
52 url = new goog.Uri(window.location.href).resolve(url); | |
53 | |
54 var interactionDelegate = opt_interactionDelegate || | |
55 new google.cf.installer.DialogInteractionDelegate(); | |
56 | |
57 var cfg = {}; | |
58 | |
59 // TODO(user): Probably need to import some of the link/image url | |
60 // detection stuff from XDRPC. | |
61 if (opt_dummyResourceUri) { | |
62 var dummyUrl = new goog.Uri(opt_dummyResourceUri); | |
63 if (!dummyUrl.hasScheme()) | |
64 dummyUrl = new goog.Uri(window.location.href).resolve(dummyUrl); | |
65 | |
66 cfg[goog.net.xpc.CfgFields.LOCAL_POLL_URI] = dummyUrl.toString(); | |
67 } | |
68 | |
69 cfg[goog.net.xpc.CfgFields.PEER_URI] = url.toString(); | |
70 | |
71 var channel = new goog.net.xpc.CrossPageChannel(cfg); | |
72 var iframe = channel.createPeerIframe( | |
73 interactionDelegate.getIFrameContainer(), | |
74 function(newIFrame) { | |
75 newIFrame.setAttribute('frameBorder', '0'); | |
76 newIFrame.setAttribute('border', '0'); | |
77 interactionDelegate.customizeIFrame(newIFrame); | |
78 }); | |
79 channel.registerService('dimensions', function(size) { | |
80 goog.style.setContentBoxSize(iframe, new goog.math.Size(size['width'], | |
81 size['height'])); | |
82 interactionDelegate.show(); | |
83 }, true); // true => deserialize messages into objects | |
84 channel.registerService('result', function(obj) { | |
85 channel.close(); | |
86 interactionDelegate.reset(); | |
87 var result = obj['result']; | |
88 if (result) | |
89 successHandler(); | |
90 else if (opt_failureHandler) | |
91 opt_failureHandler(); | |
92 }, true); // true => deserialize messages into objects | |
93 // TODO(user): Perhaps listen to onload and set a timeout for connect. | |
94 channel.connect(); | |
95 }; | |
96 | |
97 // In compiled mode, this binary is wrapped in an anonymous function which | |
98 // receives the outer scope as its only parameter. In non-compiled mode, the | |
99 // outer scope is window. | |
100 // Look in the outer scope for the stub, and pass it the implementation. | |
101 try { | |
102 if (arguments[0]['CF_google_cf_xd_install_stub']) { | |
103 arguments[0]['CF_google_cf_xd_install_stub']( | |
104 google.cf.installer.CrossDomainInstall.execute); | |
105 } | |
106 } catch (e) { | |
107 if (window['CF_google_cf_xd_install_stub']) { | |
108 window['CF_google_cf_xd_install_stub']( | |
109 google.cf.installer.CrossDomainInstall.execute); | |
110 } | |
111 } | |
OLD | NEW |