1// Copyright 2014 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/** @suppress {duplicate} */ 8var remoting = remoting || {}; 9 10/** 11 * Namespace for window manager functions. 12 * @type {Object} 13 */ 14remoting.MessageWindowManager = {}; 15 16/** 17 * Mapping from window id to corresponding MessageWindow. 18 * 19 * @type {Object.<number, remoting.MessageWindow>} 20 * @private 21 */ 22remoting.MessageWindowManager.messageWindows_ = {}; 23 24/** 25 * The next window id to auto-assign. 26 * @type {number} 27 * @private 28 */ 29remoting.MessageWindowManager.nextId_ = 1; 30 31/** 32 * @param {remoting.MessageWindow} window The window to associate 33 * with the window id. 34 * @return {number} The window id. 35 */ 36remoting.MessageWindowManager.addMessageWindow = function(window) { 37 var id = ++remoting.MessageWindowManager.nextId_; 38 remoting.MessageWindowManager.messageWindows_[id] = window; 39 return id; 40}; 41 42/** 43 * @param {number} id The window id. 44 * @return {remoting.MessageWindow} 45 */ 46remoting.MessageWindowManager.getMessageWindow = function(id) { 47 return remoting.MessageWindowManager.messageWindows_[id]; 48}; 49 50/** 51 * @param {number} id The window id to delete. 52 */ 53remoting.MessageWindowManager.deleteMessageWindow = function(id) { 54 delete remoting.MessageWindowManager.messageWindows_[id]; 55}; 56 57/** 58 * Close all of the registered MessageWindows 59 */ 60remoting.MessageWindowManager.closeAllMessageWindows = function() { 61 /** @type {Array.<remoting.MessageWindow>} */ 62 var windows = []; 63 // Make a list of the windows to close. 64 // We don't delete the window directly in this loop because close() can 65 // call deleteMessageWindow which will update messageWindows_. 66 for (var win_id in remoting.MessageWindowManager.messageWindows_) { 67 /** @type {remoting.MessageWindow} */ 68 var win = remoting.MessageWindowManager.getMessageWindow( 69 /** @type {number} */(win_id)); 70 base.debug.assert(win != null); 71 windows.push(win); 72 } 73 for (var i = 0; i < windows.length; i++) { 74 /** @type {remoting.MessageWindow} */(windows[i]).close(); 75 } 76}; 77 78/** 79 * Dispatch a message box result to the appropriate callback. 80 * 81 * @param {Event} event 82 * @private 83 */ 84remoting.MessageWindowManager.onMessage_ = function(event) { 85 if (typeof(event.data) != 'object') { 86 return; 87 } 88 89 if (event.data['command'] == 'messageWindowResult') { 90 var id = /** @type {number} */ (event.data['id']); 91 var result = /** @type {number} */ (event.data['result']); 92 93 if (typeof(id) != 'number' || typeof(result) != 'number') { 94 console.log('Poorly formatted id or result'); 95 return; 96 } 97 98 var messageWindow = remoting.MessageWindowManager.getMessageWindow(id); 99 if (!messageWindow) { 100 console.log('Ignoring unknown message window id:', id); 101 return; 102 } 103 104 messageWindow.handleResult(result); 105 messageWindow.close(); 106 } 107}; 108 109 110window.addEventListener('message', remoting.MessageWindowManager.onMessage_, 111 false); 112