Roll src/third_party/WebKit 3529d49:06e8485 (svn 202554:202555)
[chromium-blink-merge.git] / remoting / webapp / base / js / message_window.js
blobf0eb428c526bbccb4db6b1d6d631f973ca692253
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.
5 'use strict';
7 /**
8  * @constructor
9  */
10 function MessageWindowImpl() {
11   /**
12    * Used to prevent multiple responses due to the closeWindow handler.
13    *
14    * @private {boolean}
15    */
16   this.sentReply_ = false;
18   window.addEventListener('message', this.onMessage_.bind(this), false);
21 /**
22  * @param {Window} parentWindow The id of the window that showed the message.
23  * @param {number} messageId The identifier of the message, as supplied by the
24  *     parent.
25  * @param {number} result 0 if window was closed without pressing a button;
26  *     otherwise the index of the button pressed (e.g., 1 = primary).
27  * @private
28  */
29 MessageWindowImpl.prototype.sendReply_ = function(
30     parentWindow, messageId, result) {
31   // Only forward the first reply that we receive.
32   if (!this.sentReply_) {
33     var message = {
34       source: 'message-window',
35       command: 'messageWindowResult',
36       id: messageId,
37       result: result
38     };
39     parentWindow.postMessage(message, '*');
40     this.sentReply_ = true;
41   } else {
42     // Make sure that the reply we're ignoring is from the window close.
43     console.assert(result == 0, 'Received unexpected result ' + result + '.');
44   }
47 /**
48  * Initializes the button with the label and the click handler.
49  * Hides the button if the label is null or undefined.
50  *
51  * @param{HTMLElement} button
52  * @param{?string} label
53  * @param{Function} clickHandler
54  * @private
55  */
56 MessageWindowImpl.prototype.initButton_ =
57     function(button, label, clickHandler) {
58   if (label) {
59     button.innerText = label;
60     button.addEventListener('click', clickHandler, false);
61   }
62   button.hidden = !Boolean(label);
65 /**
66  * Event-handler callback, invoked when the parent window supplies the
67  * message content.
68  *
69  * @param{Event} event
70  * @private
71  */
72 MessageWindowImpl.prototype.onMessage_ = function(event) {
73   switch (event.data['command']) {
74     case 'show':
75       // Validate the message.
76       var messageId = /** @type {number} */ (event.data['id']);
77       var title = /** @type {string} */ (event.data['title']);
78       var message = /** @type {string} */ (event.data['message']);
79       var infobox = /** @type {string} */ (event.data['infobox']);
80       var buttonLabel = /** @type {string} */ (event.data['buttonLabel']);
81       /** @type {string} */
82       var cancelButtonLabel = (event.data['cancelButtonLabel']);
83       var showSpinner = /** @type {boolean} */ (event.data['showSpinner']);
84       if (typeof(messageId) != 'number' ||
85           typeof(title) != 'string' ||
86           typeof(message) != 'string' ||
87           typeof(infobox) != 'string' ||
88           typeof(buttonLabel) != 'string' ||
89           typeof(showSpinner) != 'boolean') {
90         console.log('Bad show message:', event.data);
91         break;
92       }
94       // Set the dialog text.
95       var button = document.getElementById('button-primary');
96       var cancelButton = document.getElementById('button-secondary');
97       var messageDiv = document.getElementById('message');
98       var infoboxDiv = document.getElementById('infobox');
100       document.getElementById('title').innerText = title;
101       document.querySelector('title').innerText = title;
102       messageDiv.innerHTML = message;
104       if (showSpinner) {
105         messageDiv.classList.add('waiting');
106         messageDiv.classList.add('prominent');
107       }
108       if (infobox != '') {
109         infoboxDiv.innerText = infobox;
110       } else {
111         infoboxDiv.hidden = true;
112       }
114       this.initButton_(
115           button,
116           buttonLabel,
117           this.sendReply_.bind(this, event.source, messageId, 1));
119       this.initButton_(
120           cancelButton,
121           cancelButtonLabel,
122           this.sendReply_.bind(this, event.source, messageId, 0));
124       var buttonToFocus = (cancelButtonLabel) ? cancelButton : button;
125       buttonToFocus.focus();
127       // Add a close handler in case the window is closed without clicking one
128       // of the buttons. This will send a 0 as the result.
129       // Note that when a button is pressed, this will result in sendReply_
130       // being called multiple times (once for the button, once for close).
131       chrome.app.window.current().onClosed.addListener(
132           this.sendReply_.bind(this, event.source, messageId, 0));
134       base.resizeWindowToContent(true);
135       chrome.app.window.current().show();
136       break;
138     case 'update_message':
139       var message = /** @type {string} */ (event.data['message']);
140       if (typeof(message) != 'string') {
141         console.log('Bad update_message message:', event.data);
142         break;
143       }
145       var messageDiv = document.getElementById('message');
146       messageDiv.innerText = message;
148       base.resizeWindowToContent(true);
149       break;
151     default:
152       console.error('Unexpected message:', event.data);
153   }
156 var messageWindow = new MessageWindowImpl();