Roll src/third_party/WebKit 3529d49:06e8485 (svn 202554:202555)
[chromium-blink-merge.git] / remoting / webapp / base / js / connection_dropped_dialog.js
blob1e13d6ef354f538048cf4fcfeef79126ef18420e
1 // Copyright 2015 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.
5 /** @suppress {duplicate} */
6 var remoting = remoting || {};
8 (function() {
10 'use strict';
12 /**
13  * A Dialog that is shown to the user when the connection is dropped.
14  *
15  * @constructor
16  * @param {HTMLElement} rootElement
17  * @param {remoting.WindowShape=} opt_windowShape
18  * @implements {base.Disposable}
19  */
20 remoting.ConnectionDroppedDialog = function(rootElement, opt_windowShape) {
21   /** @private */
22   this.dialog_ = new remoting.Html5ModalDialog({
23     dialog: /** @type {HTMLDialogElement} */ (rootElement),
24     primaryButton: rootElement.querySelector('.restart-button'),
25     secondaryButton: rootElement.querySelector('.close-button'),
26     closeOnEscape: false,
27     windowShape: opt_windowShape
28   });
30   /** @private */
31   this.disposables_ = new base.Disposables(this.dialog_);
34 remoting.ConnectionDroppedDialog.prototype.dispose = function() {
35   base.dispose(this.disposables_);
36   this.disposables_ = null;
39 /**
40  * @return {Promise}  Promise that resolves if
41  *     the user chooses to reconnect, or rejects if the user chooses to cancel.
42  *     This class doesn't re-establish the connection.  The caller must
43  *     implement the reconnect logic.
44  */
45 remoting.ConnectionDroppedDialog.prototype.show = function() {
46   var promise = this.dialog_.show();
47   this.waitForOnline_().then(
48     this.dialog_.close.bind(this.dialog_, remoting.MessageDialog.Result.PRIMARY)
49   );
50   return promise.then(function(/** remoting.MessageDialog.Result */ result) {
51     if (result === remoting.MessageDialog.Result.PRIMARY) {
52       return Promise.resolve();
53     } else {
54       return Promise.reject(new remoting.Error(remoting.Error.Tag.CANCELLED));
55     }
56   });
59 /**
60  * @private
61  * @return {Promise}
62  */
63 remoting.ConnectionDroppedDialog.prototype.waitForOnline_ = function() {
64   if (base.isOnline()) {
65     return Promise.resolve();
66   }
68   var deferred = new base.Deferred();
69   this.disposables_.add(new base.DomEventHook(
70       window, 'online', deferred.resolve.bind(deferred), false));
71   return deferred.promise();
74 })();