Upstream version 7.35.144.0
[platform/framework/web/crosswalk.git] / src / chrome / browser / resources / file_manager / foreground / js / cws_container_client.js
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} ext File extension.
10  * @param {?string} mime File mime type.
11  * @param {?string} searchQuery Search query.
12  * @param {number} width Width of the CWS widget.
13  * @param {number} height Height of the CWS widget.
14  * @param {string} url Share Url for an entry.
15  * @param {string} target Target (scheme + host + port) of the widget.
16  * @constructor
17  */
18 function CWSContainerClient(
19     webView, ext, mime, searchQuery, width, height, url, target) {
20   this.webView_ = webView;
21   this.ext_ = (ext && ext[0] == '.') ? ext.substr(1) : ext;
22   this.mime_ = mime;
23   this.searchQuery_ = searchQuery;
24   this.width_ = width;
25   this.height_ = height;
26   this.url_ = url;
27   this.target_ = target;
28
29   this.loaded_ = false;
30   this.loading_ = false;
31
32   this.onMessageBound_ = this.onMessage_.bind(this);
33   this.onLoadStopBound_ = this.onLoadStop_.bind(this);
34   this.onLoadAbortBound_ = this.onLoadAbort_.bind(this);
35 }
36
37 CWSContainerClient.prototype = {
38   __proto__: cr.EventTarget.prototype
39 };
40
41 /**
42  * Events CWSContainerClient fires
43  *
44  * @enum {string}
45  * @const
46  */
47 CWSContainerClient.Events = {
48   LOADED: 'CWSContainerClient.Events.LOADED',
49   LOAD_FAILED: 'CWSContainerClient.Events.LOAD_FAILED',
50   REQUEST_INSTALL: 'CWSContainerClient.Events.REQUEST_INSTALL'
51 };
52 Object.freeze(CWSContainerClient.Events);
53
54 /**
55  * Handles messages from the widget
56  * @param {Event} event Message event.
57  * @private
58  */
59 CWSContainerClient.prototype.onMessage_ = function(event) {
60   if (event.origin != this.target_)
61     return;
62
63   var data = event.data;
64   switch (data['message']) {
65     case 'widget_loaded':
66       this.onWidgetLoaded_();
67       break;
68     case 'widget_load_failed':
69       this.onWidgetLoadFailed_();
70       break;
71     case 'before_install':
72       this.sendInstallRequest_(data['item_id']);
73       break;
74     default:
75       console.error('Unexpected message: ' + data['message'], data);
76   }
77 };
78
79 /**
80  * Called when receiving 'loadstop' event from the <wevview>.
81  * @param {Event} event Message event.
82  * @private
83  */
84 CWSContainerClient.prototype.onLoadStop_ = function(event) {
85   if (this.url_ == this.webView_.src && !this.loaded_) {
86     this.loaded_ = true;
87     this.postInitializeMessage_();
88   }
89 };
90
91 /**
92  * Called when the widget is loaded successfully.
93  * @private
94  */
95 CWSContainerClient.prototype.onWidgetLoaded_ = function() {
96   cr.dispatchSimpleEvent(this, CWSContainerClient.Events.LOADED);
97 };
98
99 /**
100  * Called when the widget is failed to load.
101  * @private
102  */
103 CWSContainerClient.prototype.onWidgetLoadFailed_ = function() {
104   this.sendWidgetLoadFailed_();
105 };
106
107 /**
108  * Called when receiving the 'loadabort' event from <webview>.
109  * @param {Event} event Message event.
110  * @private
111  */
112 CWSContainerClient.prototype.onLoadAbort_ = function(event) {
113   this.sendWidgetLoadFailed_();
114 };
115
116 /**
117  * Called when the installation is completed from the suggest-app dialog.
118  *
119  * @param {boolean} result True if the installation is success, false if failed.
120  * @param {string} itemId Item id to be installed.
121  */
122 CWSContainerClient.prototype.onInstallCompleted = function(result, itemId) {
123   if (result)
124     this.postInstallSuccessMessage_(itemId);
125   else
126     this.postInstallFailureMessage_(itemId);
127 };
128
129 /**
130  * Send the fail message to the suggest-app dialog.
131  * @private
132  */
133 CWSContainerClient.prototype.sendWidgetLoadFailed_ = function() {
134   cr.dispatchSimpleEvent(this, CWSContainerClient.Events.LOAD_FAILED);
135 };
136
137 /**
138  * Send the install request to the suggest-app dialog.
139  *
140  * @param {string} itemId Item id to be installed.
141  * @private
142  */
143 CWSContainerClient.prototype.sendInstallRequest_ = function(itemId) {
144   var event = new Event(CWSContainerClient.Events.REQUEST_INSTALL);
145   event.itemId = itemId;
146   this.dispatchEvent(event);
147 };
148
149 /**
150  * Send the 'install_failure' message to the widget.
151  *
152  * @param {string} itemId Item id to be installed.
153  * @private
154  */
155 CWSContainerClient.prototype.postInstallFailureMessage_ = function(itemId) {
156   var message = {
157     message: 'install_failure',
158     item_id: itemId,
159     v: 1
160   };
161
162   this.postMessage_(message);
163 };
164
165 /**
166  * Send the 'install_success' message to the widget.
167  *
168  * @param {string} itemId Item id to be installed.
169  * @private
170  */
171 CWSContainerClient.prototype.postInstallSuccessMessage_ = function(itemId) {
172   var message = {
173     message: 'install_success',
174     item_id: itemId,
175     v: 1
176   };
177
178   this.postMessage_(message);
179 };
180
181 /**
182  * Send the 'initialize' message to the widget.
183  * @private
184  */
185 CWSContainerClient.prototype.postInitializeMessage_ = function() {
186   var message = {
187     message: 'initialize',
188     hl: util.getCurrentLocaleOrDefault(),
189     widgth: this.width_,
190     height: this.height_,
191     v: 1
192   };
193
194   if (this.searchQuery_) {
195     message['search_query'] = this.searchQuery_;
196   } else {
197     message['file_extension'] = this.ext_;
198     message['mime_type'] = this.mime_;
199   }
200
201   this.postMessage_(message);
202 };
203
204 /**
205  * Send a message to the widget. This method shouldn't be called directly,
206  * should from more specified posting function (eg. postXyzMessage_()).
207  *
208  * @param {object} message Message object to be posted.
209  * @private
210  */
211 CWSContainerClient.prototype.postMessage_ = function(message) {
212   if (!this.webView_.contentWindow)
213     return;
214
215   this.webView_.contentWindow.postMessage(message, this.target_);
216 };
217
218 /**
219  * Loads the page to <webview>. Can be called only once.
220  */
221 CWSContainerClient.prototype.load = function() {
222   if (this.loading_ || this.loaded_)
223     throw new Error('Already loaded.');
224   this.loading_ = true;
225   this.loaded_ = false;
226
227   window.addEventListener('message', this.onMessageBound_);
228   this.webView_.addEventListener('loadstop', this.onLoadStopBound_);
229   this.webView_.addEventListener('loadabort', this.onLoadAbortBound_);
230   this.webView_.setAttribute('src', this.url_);
231 };
232
233 /**
234  * Aborts loading of the embedded dialog and performs cleanup.
235  */
236 CWSContainerClient.prototype.abort = function() {
237   window.removeEventListener('message', this.onMessageBound_);
238   this.webView_.removeEventListener('loadstop', this.onLoadStopBound_);
239   this.webView_.removeEventListener(
240       'loadabort', this.onLoadAbortBound_);
241   this.webView_.stop();
242 };
243
244 /**
245  * Cleans the dialog by removing all handlers.
246  */
247 CWSContainerClient.prototype.dispose = function() {
248   this.abort();
249 };