1424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)// Copyright 2013 The Chromium Authors. All rights reserved.
2424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
3424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)// found in the LICENSE file.
4424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)
5424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)'use strict';
6424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)
7424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)/**
8424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) * @param {WebView} webView Web View tag.
90f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) * @param {?string} ext File extension.
100f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) * @param {?string} mime File mime type.
110f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) * @param {?string} searchQuery Search query.
12424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) * @param {number} width Width of the CWS widget.
13424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) * @param {number} height Height of the CWS widget.
14424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) * @param {string} url Share Url for an entry.
15424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) * @param {string} target Target (scheme + host + port) of the widget.
16424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) * @constructor
17424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) */
180f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)function CWSContainerClient(
190f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)    webView, ext, mime, searchQuery, width, height, url, target) {
20424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  this.webView_ = webView;
210f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)  this.ext_ = (ext && ext[0] == '.') ? ext.substr(1) : ext;
22424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  this.mime_ = mime;
230f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)  this.searchQuery_ = searchQuery;
24424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  this.width_ = width;
25424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  this.height_ = height;
26424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  this.url_ = url;
27424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  this.target_ = target;
28424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)
29424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  this.loaded_ = false;
30424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  this.loading_ = false;
31424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)
32424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  this.onMessageBound_ = this.onMessage_.bind(this);
33424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  this.onLoadStopBound_ = this.onLoadStop_.bind(this);
34424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  this.onLoadAbortBound_ = this.onLoadAbort_.bind(this);
35424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)}
36424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)
37424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)CWSContainerClient.prototype = {
38424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  __proto__: cr.EventTarget.prototype
39424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)};
40424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)
41424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)/**
4258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) * Events CWSContainerClient fires
4358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) *
4458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) * @enum {string}
4558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) * @const
4658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) */
4758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)CWSContainerClient.Events = {
4858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  LOADED: 'CWSContainerClient.Events.LOADED',
4958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  LOAD_FAILED: 'CWSContainerClient.Events.LOAD_FAILED',
5058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  REQUEST_INSTALL: 'CWSContainerClient.Events.REQUEST_INSTALL'
5158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)};
5258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)Object.freeze(CWSContainerClient.Events);
5358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
5458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)/**
55424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) * Handles messages from the widget
56424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) * @param {Event} event Message event.
57424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) * @private
58424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) */
59424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)CWSContainerClient.prototype.onMessage_ = function(event) {
60424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  if (event.origin != this.target_)
61424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)    return;
62424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)
63424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  var data = event.data;
64424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  switch (data['message']) {
65424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)    case 'widget_loaded':
6658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      this.onWidgetLoaded_();
6758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      break;
6858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    case 'widget_load_failed':
6958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      this.onWidgetLoadFailed_();
70424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)      break;
71424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)    case 'before_install':
72424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)      this.sendInstallRequest_(data['item_id']);
73424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)      break;
74424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)    default:
75424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)      console.error('Unexpected message: ' + data['message'], data);
76424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  }
77424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)};
78424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)
79424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)/**
80c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch * Called when receiving 'loadstop' event from the <webview>.
81424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) * @param {Event} event Message event.
82424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) * @private
83424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) */
84424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)CWSContainerClient.prototype.onLoadStop_ = function(event) {
85424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  if (this.url_ == this.webView_.src && !this.loaded_) {
86424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)    this.loaded_ = true;
87424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)    this.postInitializeMessage_();
88424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  }
89424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)};
90424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)
91424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)/**
9258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) * Called when the widget is loaded successfully.
9358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) * @private
9458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) */
9558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)CWSContainerClient.prototype.onWidgetLoaded_ = function() {
9658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  cr.dispatchSimpleEvent(this, CWSContainerClient.Events.LOADED);
9758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)};
9858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
9958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)/**
10058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) * Called when the widget is failed to load.
10158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) * @private
10258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) */
10358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)CWSContainerClient.prototype.onWidgetLoadFailed_ = function() {
10458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  this.sendWidgetLoadFailed_();
10558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)};
10658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
10758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)/**
108424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) * Called when receiving the 'loadabort' event from <webview>.
109424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) * @param {Event} event Message event.
110424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) * @private
111424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) */
112424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)CWSContainerClient.prototype.onLoadAbort_ = function(event) {
11358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  this.sendWidgetLoadFailed_();
114424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)};
115424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)
116424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)/**
117424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) * Called when the installation is completed from the suggest-app dialog.
118424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) *
119424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) * @param {boolean} result True if the installation is success, false if failed.
120424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) * @param {string} itemId Item id to be installed.
121424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) */
122424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)CWSContainerClient.prototype.onInstallCompleted = function(result, itemId) {
123424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  if (result)
124424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)    this.postInstallSuccessMessage_(itemId);
125424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  else
126424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)    this.postInstallFailureMessage_(itemId);
127424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)};
128424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)
129424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)/**
13058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) * Send the fail message to the suggest-app dialog.
131424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) * @private
132424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) */
13358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)CWSContainerClient.prototype.sendWidgetLoadFailed_ = function() {
13458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  cr.dispatchSimpleEvent(this, CWSContainerClient.Events.LOAD_FAILED);
135424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)};
136424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)
137424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)/**
138424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) * Send the install request to the suggest-app dialog.
139424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) *
140424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) * @param {string} itemId Item id to be installed.
141424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) * @private
142424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) */
143424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)CWSContainerClient.prototype.sendInstallRequest_ = function(itemId) {
1444e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  var event = new Event(CWSContainerClient.Events.REQUEST_INSTALL);
145424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  event.itemId = itemId;
146424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  this.dispatchEvent(event);
147424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)};
148424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)
149424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)/**
150424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) * Send the 'install_failure' message to the widget.
151424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) *
152424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) * @param {string} itemId Item id to be installed.
153424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) * @private
154424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) */
155424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)CWSContainerClient.prototype.postInstallFailureMessage_ = function(itemId) {
156424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  var message = {
157424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)    message: 'install_failure',
158424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)    item_id: itemId,
159424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)    v: 1
160424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  };
161424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)
162424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  this.postMessage_(message);
163424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)};
164424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)
165424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)/**
166424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) * Send the 'install_success' message to the widget.
167424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) *
168424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) * @param {string} itemId Item id to be installed.
169424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) * @private
170424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) */
171424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)CWSContainerClient.prototype.postInstallSuccessMessage_ = function(itemId) {
172424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  var message = {
173424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)    message: 'install_success',
174424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)    item_id: itemId,
175424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)    v: 1
176424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  };
177424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)
178424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  this.postMessage_(message);
179424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)};
180424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)
181424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)/**
182424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) * Send the 'initialize' message to the widget.
183424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) * @private
184424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) */
185424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)CWSContainerClient.prototype.postInitializeMessage_ = function() {
186424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  var message = {
187424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)    message: 'initialize',
18858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    hl: util.getCurrentLocaleOrDefault(),
189c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    width: this.width_,
190424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)    height: this.height_,
191424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)    v: 1
192424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  };
193424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)
1940f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)  if (this.searchQuery_) {
1950f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)    message['search_query'] = this.searchQuery_;
1960f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)  } else {
1970f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)    message['file_extension'] = this.ext_;
1980f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)    message['mime_type'] = this.mime_;
1990f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)  }
2000f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)
201424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  this.postMessage_(message);
202424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)};
203424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)
204424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)/**
205424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) * Send a message to the widget. This method shouldn't be called directly,
206424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) * should from more specified posting function (eg. postXyzMessage_()).
207424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) *
208424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) * @param {object} message Message object to be posted.
209424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) * @private
210424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) */
211424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)CWSContainerClient.prototype.postMessage_ = function(message) {
212424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  if (!this.webView_.contentWindow)
213424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)    return;
214424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)
215424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  this.webView_.contentWindow.postMessage(message, this.target_);
216424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)};
217424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)
218424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)/**
219424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) * Loads the page to <webview>. Can be called only once.
220424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) */
221424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)CWSContainerClient.prototype.load = function() {
222424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  if (this.loading_ || this.loaded_)
223424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)    throw new Error('Already loaded.');
224424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  this.loading_ = true;
225424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  this.loaded_ = false;
226424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)
227424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  window.addEventListener('message', this.onMessageBound_);
228424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  this.webView_.addEventListener('loadstop', this.onLoadStopBound_);
229424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  this.webView_.addEventListener('loadabort', this.onLoadAbortBound_);
230424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  this.webView_.setAttribute('src', this.url_);
231424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)};
232424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)
233424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)/**
234424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) * Aborts loading of the embedded dialog and performs cleanup.
235424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) */
236424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)CWSContainerClient.prototype.abort = function() {
237424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  window.removeEventListener('message', this.onMessageBound_);
238424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  this.webView_.removeEventListener('loadstop', this.onLoadStopBound_);
239424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  this.webView_.removeEventListener(
240424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)      'loadabort', this.onLoadAbortBound_);
241424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  this.webView_.stop();
242424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)};
243424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)
244424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)/**
245424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) * Cleans the dialog by removing all handlers.
246424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) */
247424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)CWSContainerClient.prototype.dispose = function() {
248424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  this.abort();
249424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)};
250