blob: 582bfa587429e97a13056c87bc76ca6e7bbe57f0 [file] [log] [blame]
// Copyright 2014 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
'use strict';
/** @suppress {duplicate} */
var remoting = remoting || {};
/**
* This class manages all the message windows (remoting.MessageWindow).
* @param {base.WindowMessageDispatcher} windowMessageDispatcher
* @constructor
* @implements {base.Disposable}
*/
remoting.MessageWindowManager = function(windowMessageDispatcher) {
/**
* @type {!Object<number, remoting.MessageWindow>}
* @private
*/
this.messageWindows_ = {};
/**
* The next window id to auto-assign.
* @private {number}
*/
this.nextId_ = 1;
/** @private {base.WindowMessageDispatcher} */
this.windowMessageDispatcher_ = windowMessageDispatcher;
this.windowMessageDispatcher_.registerMessageHandler(
'message-window', this.onMessage_.bind(this));
};
remoting.MessageWindowManager.prototype.dispose = function() {
this.windowMessageDispatcher_.unregisterMessageHandler('message-window');
};
/**
* @param {remoting.MessageWindow} window The window to associate
* with the window id.
* @return {number} The window id.
*/
remoting.MessageWindowManager.prototype.addMessageWindow = function(window) {
var id = ++this.nextId_;
this.messageWindows_[id] = window;
return id;
};
/**
* @param {number} id The window id.
* @return {remoting.MessageWindow}
*/
remoting.MessageWindowManager.prototype.getMessageWindow = function(id) {
return this.messageWindows_[id];
};
/**
* @param {number} id The window id to delete.
*/
remoting.MessageWindowManager.prototype.deleteMessageWindow = function(id) {
delete this.messageWindows_[id];
};
/**
* Close all of the registered MessageWindows
*/
remoting.MessageWindowManager.prototype.closeAllMessageWindows = function() {
/** @type {Array<remoting.MessageWindow>} */
var windows = [];
// Make a list of the windows to close.
// We don't delete the window directly in this loop because close() can
// call deleteMessageWindow which will update messageWindows_.
for (var win_id in this.messageWindows_) {
/** @type {remoting.MessageWindow} */
var win = this.getMessageWindow(parseInt(win_id, 10));
console.assert(win != null, 'Unknown window id ' + win_id + '.');
windows.push(win);
}
for (var i = 0; i < windows.length; i++) {
/** @type {remoting.MessageWindow} */(windows[i]).close();
}
};
/**
* Dispatch a message box result to the appropriate callback.
*
* @param {Event} event
* @private
*/
remoting.MessageWindowManager.prototype.onMessage_ = function(event) {
console.assert(typeof event.data === 'object',
'Unexpected data. Expected object, got ' + event.data + '.');
console.assert(event.data['source'] == 'message-window',
'Bad event source: ' +
/** @type {string} */ (event.data['source']) + '.');
if (event.data['command'] == 'messageWindowResult') {
var id = /** @type {number} */ (event.data['id']);
var result = /** @type {number} */ (event.data['result']);
if (typeof(id) != 'number' || typeof(result) != 'number') {
console.log('Poorly formatted id or result');
return;
}
var messageWindow = this.getMessageWindow(id);
if (!messageWindow) {
console.log('Ignoring unknown message window id:', id);
return;
}
messageWindow.handleResult(result);
messageWindow.close();
}
};
/** @type {remoting.MessageWindowManager} */
remoting.messageWindowManager = null;