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

Unified Diff: remoting/webapp/base/js/modal_dialogs.js

Issue 1146833002: [AppRemoting] Implement ConnectionDroppedDialog. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: WindowShape fixes + reviewer's feedback Created 5 years, 7 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
« no previous file with comments | « remoting/webapp/base/html/connection_dropped_dialog.html ('k') | remoting/webapp/base/js/window_shape.js » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: remoting/webapp/base/js/modal_dialogs.js
diff --git a/remoting/webapp/base/js/modal_dialogs.js b/remoting/webapp/base/js/modal_dialogs.js
index 9c489b3154178259fa55558be95ec3c5525a1b30..f6fa0cd1252bdc83abcb7d71ef16870eae508fc2 100644
--- a/remoting/webapp/base/js/modal_dialogs.js
+++ b/remoting/webapp/base/js/modal_dialogs.js
@@ -158,6 +158,99 @@ remoting.MessageDialog.prototype.onClicked_ = function(result) {
this.dispose();
};
+
+
+/**
+ * A promise-based dialog implementation using the <dialog> element.
+ *
+ * @param {remoting.Html5ModalDialog.Params} params
+ * @constructor
+ *
+ * @implements {remoting.WindowShape.ClientUI}
+ * @implements {base.Disposable}
+ */
+remoting.Html5ModalDialog = function(params) {
+ /** @private */
+ this.dialog_ = params.dialog;
+
+ /** @private {base.Disposables} */
+ this.eventHooks_ = new base.Disposables(
+ new base.DomEventHook(
+ this.dialog_, 'cancel', this.onCancel_.bind(this), false),
+ new base.DomEventHook(
+ params.primaryButton, 'click',
+ this.close.bind(this, remoting.MessageDialog.Result.PRIMARY), false)
+ );
+
+ if (params.secondaryButton) {
+ this.eventHooks_.add(new base.DomEventHook(
+ params.secondaryButton, 'click',
+ this.close.bind(this, remoting.MessageDialog.Result.SECONDARY), false));
+ }
+
+ /** @private */
+ this.closeOnEscape_ = Boolean(params.closeOnEscape);
+
+ /** @private {base.Deferred} */
+ this.deferred_ = null;
+};
+
+remoting.Html5ModalDialog.prototype.dispose = function() {
+ base.dispose(this.eventHooks_);
+ this.eventHookes_ = null;
+};
+
+/**
+ * @return {Promise<remoting.MessageDialog.Result>} Promise that resolves with
+ * the button clicked.
+ */
+remoting.Html5ModalDialog.prototype.show = function() {
+ base.debug.assert(this.deferred_ === null);
+ this.deferred_ = new base.Deferred();
+ this.dialog_.showModal();
+ remoting.windowShape.registerClientUI(this);
+ remoting.windowShape.centerToDesktop(this.dialog_);
+ return this.deferred_.promise();
+};
+
+/** @param {Event} e */
+remoting.Html5ModalDialog.prototype.onCancel_ = function(e) {
+ e.preventDefault();
+ if (this.closeOnEscape_) {
+ this.close(remoting.MessageDialog.Result.CANCEL);
+ }
+};
+
+/**
+ * @param {remoting.MessageDialog.Result} result
+ */
+remoting.Html5ModalDialog.prototype.close = function(result) {
+ if (!this.dialog_.open) {
+ return;
+ }
+ this.dialog_.close();
+ this.deferred_.resolve(result);
+ this.deferred_ = null;
+ remoting.windowShape.unregisterClientUI(this);
+};
+
+remoting.Html5ModalDialog.prototype.addToRegion = function(rects) {
+ var rect = /** @type {ClientRect} */(this.dialog_.getBoundingClientRect());
+
+ // If the dialog is repositioned by setting the left and top, it takes a while
+ // for getBoundingClientRect() to update the rectangle.
+ var left = this.dialog_.style.left;
+ var top = this.dialog_.style.top;
+
+ rects.push({
+ left: (left === '') ? rect.left : parseInt(left, 10),
+ top: (top === '') ? rect.top : parseInt(top, 10),
+ width: rect.width,
+ height: rect.height
+ });
+};
+
+
/**
* @param {Function} cancelCallback The callback to invoke when the user clicks
* on the cancel button.
@@ -194,5 +287,28 @@ remoting.ConnectingDialog.prototype.hide = function() {
*/
remoting.MessageDialog.Result = {
PRIMARY: 0,
- SECONDARY: 1
-};
+ SECONDARY: 1,
+ CANCEL: 2 // User presses the escape button.
+};
+
+/**
+ * Parameters for the remoting.Html5ModalDialog constructor. Unless otherwise
+ * noted, all parameters are optional.
+ *
+ * dialog: (required) The HTML dialog element.
+ *
+ * primaryButton: (required) The HTML element of the primary button.
+ *
+ * secondaryButton: The HTML element of the secondary button.
+ *
+ * closeOnEscape: Whether the user can dismiss the dialog by pressing the escape
+ * key. Default to false.
+ *
+ * @typedef {{
+ * dialog: HTMLDialogElement,
+ * primaryButton:HTMLElement,
+ * secondaryButton:(HTMLElement|undefined),
+ * closeOnEscape:(boolean|undefined)
+ * }}
+ */
+remoting.Html5ModalDialog.Params;
« no previous file with comments | « remoting/webapp/base/html/connection_dropped_dialog.html ('k') | remoting/webapp/base/js/window_shape.js » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698