Index: remoting/webapp/background/message_window_manager.js |
diff --git a/remoting/webapp/background/message_window_manager.js b/remoting/webapp/background/message_window_manager.js |
new file mode 100644 |
index 0000000000000000000000000000000000000000..88b1e53bc327b2e6204a6c4c80d6269919fa66ea |
--- /dev/null |
+++ b/remoting/webapp/background/message_window_manager.js |
@@ -0,0 +1,109 @@ |
+// Copyright (c) 2013 Google. All rights reserved. |
+ |
+'use strict'; |
+ |
+/** @suppress {duplicate} */ |
+var remoting = remoting || {}; |
+ |
+/** |
+ * Namespace for window manager functions. |
+ * @type {Object} |
+ */ |
+remoting.MessageWindowManager = {}; |
+ |
+/** |
+ * Mapping from window id to corresponding MessageWindow. |
+ * |
+ * @type {Object.<number, remoting.MessageWindow>} |
+ * @private |
+ */ |
+remoting.MessageWindowManager.messageWindows_ = {}; |
+ |
+/** |
+ * The next window id to auto-assign. |
+ * @type {number} |
+ * @private |
+ */ |
+remoting.MessageWindowManager.nextId_ = 1; |
+ |
+/** |
+ * @param {remoting.MessageWindow} window The window to associate |
+ * with the window id. |
+ * @return {number} The window id. |
+ */ |
+remoting.MessageWindowManager.addMessageWindow = function(window) { |
+ var id = ++remoting.MessageWindowManager.nextId_; |
+ remoting.MessageWindowManager.messageWindows_[id] = window; |
+ return id; |
+}; |
+ |
+/** |
+ * @param {number} id The window id. |
+ * @return {remoting.MessageWindow} |
+ */ |
+remoting.MessageWindowManager.getMessageWindow = function(id) { |
+ return remoting.MessageWindowManager.messageWindows_[id]; |
+}; |
+ |
+/** |
+ * @param {number} id The window id to delete. |
+ */ |
+remoting.MessageWindowManager.deleteMessageWindow = function(id) { |
+ delete remoting.MessageWindowManager.messageWindows_[id]; |
+}; |
+ |
+/** |
+ * Close all of the registered MessageWindows |
+ */ |
+remoting.MessageWindowManager.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 remoting.MessageWindowManager.messageWindows_) { |
+ /** @type {remoting.MessageWindow} */ |
+ var win = remoting.MessageWindowManager.getMessageWindow( |
+ /** @type {number} */(win_id)); |
+ base.debug.assert(win != null); |
+ 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.onMessage_ = function(event) { |
+ if (typeof(event.data) != 'object') { |
+ return; |
+ } |
+ |
+ 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 = remoting.MessageWindowManager.getMessageWindow(id); |
+ if (!messageWindow) { |
+ console.log('Ignoring unknown message window id:', id); |
+ return; |
+ } |
+ |
+ messageWindow.handleResult(result); |
+ messageWindow.close(); |
+ } |
+}; |
+ |
+ |
+window.addEventListener('message', remoting.MessageWindowManager.onMessage_, |
+ false); |