Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(222)

Unified Diff: remoting/webapp/background/message_window_helper.js

Issue 493813002: Show MessageWindow from the background page (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Add support for confirm dialogs Created 6 years, 4 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: remoting/webapp/background/message_window_helper.js
diff --git a/remoting/webapp/background/message_window_helper.js b/remoting/webapp/background/message_window_helper.js
new file mode 100644
index 0000000000000000000000000000000000000000..53c7155bc6db8cbcd3107f913e23af088835d1b6
--- /dev/null
+++ b/remoting/webapp/background/message_window_helper.js
@@ -0,0 +1,269 @@
+// Copyright (c) 2013 Google. All rights reserved.
+
+'use strict';
+
+/** @suppress {duplicate} */
+var remoting = remoting || {};
+
+/**
+ * Create a new message window.
+ *
+ * @param {Object} options Message window create options
+ * @constructor
+ */
+remoting.MessageWindow = function(options) {
+ var title = /** @type {string} */ (options.title);
+ var message = /** @type {string} */ (options.message);
+ var okButtonLabel = /** @type {string} */ (options.buttonLabel);
+ var cancelButtonLabel = /** @type {string} */ (options.cancelButtonLabel);
+ var onResult = /** @type {function(number):void} */(options.onResult);
+ /** @type {number} */
+ var duration = 0;
+ if (/** @type {number?} */(options.duration)) {
+ duration = /** @type {number} */(options.duration);
+ }
+ /** @type {string} */
+ var infobox = '';
+ if (/** @type {string?} */(options.infobox)) {
+ infobox = /** @type {string} */(options.infobox);
+ }
+ var onTimeout = /** @type {?function():void} */ (options.onTimeout);
+
+ /** @type {number} */
+ this.id_ = remoting.MessageWindowManager.addMessageWindow(this);
+
+ /** @type {?function(number):void} */
+ this.onResult_ = onResult;
+
+ /** @type {Window} */
+ this.window_ = null;
+
+ /** @type {number} */
+ this.timer_ = 0;
+
+ /** @type {Array.<function():void>} */
+ this.pendingWindowOperations_ = [];
+
+ /**
+ * Callback to call when the timeout expires.
+ * @type {?function():void}
+ */
+ this.onTimeout_ = onTimeout;
+
+ var message_struct = {
+ command: 'show',
+ id: this.id_,
+ title: title,
+ message: message,
+ infobox: infobox,
+ buttonLabel: okButtonLabel,
+ cancelButtonLabel: cancelButtonLabel,
+ showSpinner: (duration != 0)
+ };
+
+ var windowAttributes = {
+ bounds: {
+ width: 400,
+ height: 100
+ },
+ resizable: false
+ };
+
+ /** @type {remoting.MessageWindow} */
+ var that = this;
+
+ /** @param {AppWindow} appWindow */
+ var onCreate = function(appWindow) {
+ that.setWindow_(/** @type {Window} */(appWindow.contentWindow));
+ var onLoad = function() {
+ appWindow.contentWindow.postMessage(message_struct, '*');
+ };
+ appWindow.contentWindow.addEventListener('load', onLoad, false);
+ };
+
+ chrome.app.window.create('message_window.html', windowAttributes, onCreate);
+
+ if (duration != 0) {
+ this.timer_ = window.setTimeout(this.onTimeoutHandler_.bind(this),
+ duration);
+ }
+};
+
+/**
+ * Called when the timer runs out. This in turn calls the window's
+ * timeout handler (if any).
+ */
+remoting.MessageWindow.prototype.onTimeoutHandler_ = function() {
+ this.close();
+ if (this.onTimeout_) {
+ this.onTimeout_();
+ }
+};
+
+/**
+ * Update the message being shown in the window. This should only be called
+ * after the window has been shown.
+ *
+ * @param {string} message The message.
+ */
+remoting.MessageWindow.prototype.updateMessage = function(message) {
+ if (!this.window_) {
+ this.pendingWindowOperations_.push(this.updateMessage.bind(this, message));
+ return;
+ }
+
+ var message_struct = {
+ command: 'update_message',
+ message: message
+ };
+ this.window_.postMessage(message_struct, '*');
+};
+
+/**
+ * Close the message box and unregister it with the window manager.
+ */
+remoting.MessageWindow.prototype.close = function() {
+ if (!this.window_) {
+ this.pendingWindowOperations_.push(this.close.bind(this));
+ return;
+ }
+
+ if (this.timer_) {
+ window.clearTimeout(this.timer_);
+ }
+ this.timer_ = 0;
+
+ // Unregister the window with the window manager.
+ // After this call, events sent to this window will no longer trigger the
+ // onResult callback.
+ remoting.MessageWindowManager.deleteMessageWindow(this.id_);
+ this.window_.close();
+ this.window_ = null;
+};
+
+/**
+ * Dispatch a message box result to the registered callback.
+ *
+ * @param {number} result The dialog result.
+ */
+remoting.MessageWindow.prototype.handleResult = function(result) {
+ if (this.onResult_) {
+ this.onResult_(result);
+ }
+}
+
+/**
+ * Set the window handle and run any pending operations that require it.
+ *
+ * @param {Window} window
+ * @private
+ */
+remoting.MessageWindow.prototype.setWindow_ = function(window) {
+ base.debug.assert(this.window_ == null);
+ this.window_ = window;
+ for (var i = 0; i < this.pendingWindowOperations_.length; ++i) {
+ var pendingOperation = this.pendingWindowOperations_[i];
+ pendingOperation();
+ }
+ this.pendingWindowOperations_ = [];
+};
+
+/**
+ * Static method to create and show a confirm message box.
+ *
+ * @param {string} title The title of the message box.
+ * @param {string} message The message.
+ * @param {string} okButtonLabel The text for the primary button.
+ * @param {string} cancelButtonLabel The text for the secondary button.
+ * @param {function(number):void} onResult The callback to invoke when the
+ * user closes the message window.
+ * @return {remoting.MessageWindow}
+ */
+remoting.MessageWindow.showConfirmWindow = function(
+ title, message, okButtonLabel, cancelButtonLabel, onResult) {
+ var options = {
+ title: title,
+ message: message,
+ buttonLabel: okButtonLabel,
+ cancelButtonLabel: cancelButtonLabel,
+ onResult: onResult
+ };
+ return new remoting.MessageWindow(options);
+};
+
+/**
+ * Static method to create and show a simple message box.
+ *
+ * @param {string} title The title of the message box.
+ * @param {string} message The message.
+ * @param {string} buttonLabel The text for the primary button.
+ * @param {function(number):void} onResult The callback to invoke when the
+ * user closes the message window.
+ * @return {remoting.MessageWindow}
+ */
+remoting.MessageWindow.showMessageWindow = function(
+ title, message, buttonLabel, onResult) {
+ var options = {
+ title: title,
+ message: message,
+ buttonLabel: buttonLabel,
+ onResult: onResult
+ };
+ return new remoting.MessageWindow(options);
+};
+
+/**
+ * Static method to create and show an error message box with an "OK" button.
+ * The app will close when the user dismisses the message window.
+ *
+ * @param {string} title The title of the message box.
+ * @param {string} message The message.
+ * @return {remoting.MessageWindow}
+ */
+remoting.MessageWindow.showErrorMessage = function(title, message) {
+ var options = {
+ title: title,
+ message: message,
+ buttonLabel: chrome.i18n.getMessage(/**i18n-content*/'OK'),
+ onResult: remoting.MessageWindow.quitApp
+ };
+ return new remoting.MessageWindow(options);
+};
+
+/**
+ * Static method to create and show a timed message box.
+ *
+ * @param {string} title The title of the message box.
+ * @param {string} message The message.
+ * @param {string} infobox Additional information to be displayed in an infobox,
+ * or the empty string if there is no additional information.
+ * @param {string} buttonLabel The text for the primary button.
+ * @param {function(number):void} onResult The callback to invoke when the
+ * user closes the message window.
+ * @param {number} duration Time for wait before calling onTime
+ * @param {?function():void} onTimeout Callback function.
+ * @return {remoting.MessageWindow}
+ */
+remoting.MessageWindow.showTimedMessageWindow = function(
+ title, message, infobox, buttonLabel, onResult, duration, onTimeout) {
+ var options = {
+ title: title,
+ message: message,
+ infobox: infobox,
+ buttonLabel: buttonLabel,
+ onResult: onResult,
+ duration: duration,
+ onTimeout: onTimeout
+ };
+ return new remoting.MessageWindow(options);
+};
+
+/**
+ * Cancel the current connection and close all app windows.
+ *
+ * @param {number} result The dialog result.
+ */
+remoting.MessageWindow.quitApp = function(result) {
+ remoting.MessageWindowManager.closeAllMessageWindows();
+ window.close();
+};

Powered by Google App Engine
This is Rietveld 408576698