OLD | NEW |
| (Empty) |
1 // Copyright 2013 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 'use strict'; | |
6 | |
7 /** | |
8 * @param {WebView} webView Web View tag. | |
9 * @param {string} url Share Url for an entry. | |
10 * @param {ShareClient.Observer} observer Observer instance. | |
11 * @constructor | |
12 */ | |
13 function ShareClient(webView, url, observer) { | |
14 this.webView_ = webView; | |
15 this.url_ = url; | |
16 this.observer_ = observer; | |
17 this.loaded_ = false; | |
18 this.loading_ = false; | |
19 this.onMessageBound_ = this.onMessage_.bind(this); | |
20 this.onLoadStopBound_ = this.onLoadStop_.bind(this); | |
21 this.onLoadAbortBound_ = this.onLoadAbort_.bind(this); | |
22 } | |
23 | |
24 /** | |
25 * Source origin of the client. | |
26 * @type {string} | |
27 * @const | |
28 */ | |
29 ShareClient.SHARE_ORIGIN = | |
30 'chrome-extension://hhaomjibdihmijegdhdafkllkbggdgoj'; | |
31 | |
32 /** | |
33 * Target origin of the embedded dialog. | |
34 * @type {string} | |
35 * @const | |
36 */ | |
37 ShareClient.SHARE_TARGET = 'https://drive.google.com'; | |
38 | |
39 /** | |
40 * Observes for state changes of the embedded dialog. | |
41 * @interface | |
42 */ | |
43 ShareClient.Observer = function() { | |
44 }; | |
45 | |
46 /** | |
47 * Notifies about the embedded dialog being loaded. | |
48 */ | |
49 ShareClient.Observer.prototype.onLoaded = function() { | |
50 }; | |
51 | |
52 /** | |
53 * Notifies when the the embedded dialog failed to load. | |
54 */ | |
55 ShareClient.Observer.prototype.onLoadingFailed = function() { | |
56 }; | |
57 | |
58 /** | |
59 * Notifies about changed dimensions of the embedded dialog. | |
60 * @param {number} width Width in pixels. | |
61 * @param {number} height Height in pixels. | |
62 * @param {function()} callback Completion callback. Call when finished | |
63 * handling the resize. | |
64 */ | |
65 ShareClient.Observer.prototype.onResized = function(width, height, callback) { | |
66 }; | |
67 | |
68 /** | |
69 * Notifies about the embedded dialog being closed. | |
70 */ | |
71 ShareClient.Observer.prototype.onClosed = function() { | |
72 }; | |
73 | |
74 /** | |
75 * Handles messages from the embedded dialog. | |
76 * @param {Event} e Message event. | |
77 * @private | |
78 */ | |
79 ShareClient.prototype.onMessage_ = function(e) { | |
80 if (e.origin != ShareClient.SHARE_TARGET && !window.IN_TEST) { | |
81 // Logs added temporarily to track crbug.com/288783. | |
82 console.debug('Received a message from an illegal origin: ' + e.origin); | |
83 return; | |
84 } | |
85 | |
86 var data = JSON.parse(e.data); | |
87 // Logs added temporarily to track crbug.com/288783. | |
88 console.debug('Received message: ' + data.type); | |
89 | |
90 switch (data.type) { | |
91 case 'resize': | |
92 this.observer_.onResized(data.args.width, | |
93 data.args.height, | |
94 this.postMessage_.bind(this, 'resizeComplete')); | |
95 break; | |
96 case 'prepareForVisible': | |
97 this.postMessage_('prepareComplete'); | |
98 if (!this.loaded_) { | |
99 this.loading_ = false; | |
100 this.loaded_ = true; | |
101 this.observer_.onLoaded(); | |
102 } | |
103 break; | |
104 case 'setVisible': | |
105 if (!data.args.visible) | |
106 this.observer_.onClosed(); | |
107 break; | |
108 } | |
109 }; | |
110 | |
111 /** | |
112 * Handles completion of the web view request. | |
113 * @param {Event} e Message event. | |
114 * @private | |
115 */ | |
116 ShareClient.prototype.onLoadStop_ = function(e) { | |
117 // Logs added temporarily to track crbug.com/288783. | |
118 console.debug('Web View loaded.'); | |
119 | |
120 this.postMessage_('makeBodyVisible'); | |
121 }; | |
122 | |
123 /** | |
124 * Handles termination of the web view request. | |
125 * @param {Event} e Message event. | |
126 * @private | |
127 */ | |
128 ShareClient.prototype.onLoadAbort_ = function(e) { | |
129 // Logs added temporarily to track crbug.com/288783. | |
130 console.debug('Web View failed to load with error: ' + e.reason + ', url: ' + | |
131 e.url + ' while requested: ' + this.url_); | |
132 | |
133 this.observer_.onLoadFailed(); | |
134 }; | |
135 | |
136 /** | |
137 * Sends a message to the embedded dialog. | |
138 * @param {string} type Message type. | |
139 * @param {Object=} opt_args Optional arguments. | |
140 * @private | |
141 */ | |
142 ShareClient.prototype.postMessage_ = function(type, opt_args) { | |
143 // Logs added temporarily to track crbug.com/288783. | |
144 console.debug('Sending message: ' + type); | |
145 | |
146 var message = { | |
147 type: type, | |
148 args: opt_args | |
149 }; | |
150 this.webView_.contentWindow.postMessage( | |
151 JSON.stringify(message), | |
152 !window.IN_TEST ? ShareClient.SHARE_TARGET : '*'); | |
153 }; | |
154 | |
155 /** | |
156 * Loads the embedded dialog. Can be called only one. | |
157 */ | |
158 ShareClient.prototype.load = function() { | |
159 if (this.loading_ || this.loaded_) | |
160 throw new Error('Already loaded.'); | |
161 this.loading_ = true; | |
162 | |
163 // Logs added temporarily to track crbug.com/288783. | |
164 console.debug('Loading.'); | |
165 | |
166 window.addEventListener('message', this.onMessageBound_); | |
167 this.webView_.addEventListener('loadstop', this.onLoadStopBound_); | |
168 this.webView_.addEventListener('loadabort', this.onLoadAbortBound_); | |
169 this.webView_.setAttribute('src', this.url_); | |
170 }; | |
171 | |
172 /** | |
173 * Aborts loading of the embedded dialog and performs cleanup. | |
174 */ | |
175 ShareClient.prototype.abort = function() { | |
176 window.removeEventListener('message', this.onMessageBound_); | |
177 this.webView_.removeEventListener('loadstop', this.onLoadStopBound_); | |
178 this.webView_.removeEventListener( | |
179 'loadabort', this.onLoadAbortBound_); | |
180 this.webView_.stop(); | |
181 }; | |
182 | |
183 /** | |
184 * Cleans the dialog by removing all handlers. | |
185 */ | |
186 ShareClient.prototype.dispose = function() { | |
187 this.abort(); | |
188 }; | |
OLD | NEW |