Merge Chromium + Blink git repositories
[chromium-blink-merge.git] / remoting / webapp / base / js / window_message_dispatcher.js
blob7458d9da5172a2b33a49d515846778a8b331f8a1
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.
4  */
6 /**
7  * @fileoverview
8  * This class dispatches window messages (those sent using window.postMessage)
9  * from different sources to the registered handlers.
10  * This should be the only 'message' event listener in this app. Anyone who
11  * wants to listen to window messages should register with this class.
12  */
14 'use strict';
16 /** @suppress {duplicate} */
17 var base = base || {};
19 (function() {
20 /**
21  * @constructor
22  * @implements {base.Disposable}
23  */
24 base.WindowMessageDispatcher = function() {
25   /** @private {Object<string, function(Event):void>} */
26   this.handlers_ = {};
28   /** @private */
29   this.eventHook_ = new base.DomEventHook(
30       window, 'message', this.onMessage_.bind(this), false);
33 base.WindowMessageDispatcher.prototype.dispose = function() {
34   this.unregisterAllHandlers();
36   base.dispose(this.eventHook_);
37   this.eventHook_ = null;
40 /**
41  * @param {string} source Message source to register handler for.
42  * @param {function(Event):void} handler Handler for the messages from |source|.
43  * @return {void}
44  */
45 base.WindowMessageDispatcher.prototype.registerMessageHandler =
46     function(source, handler) {
47   console.assert(Boolean(source), 'No source specified.');
48   console.assert(Boolean(handler), 'No handler specified.');
50   if (source in this.handlers_) {
51     console.error('Cannot register more than one handler for source: ', source);
52   } else {
53     this.handlers_[source] = handler;
54   }
57 /**
58  * @param {string} source Message source to unregister handler for.
59  * @return {void}
60  */
61 base.WindowMessageDispatcher.prototype.unregisterMessageHandler =
62     function(source) {
63   console.assert(Boolean(source), 'No source specified.');
65   if (source in this.handlers_) {
66     delete this.handlers_[source];
67   } else {
68     console.error('Message handler doesn\'t exist for source: ', source);
69   }
72 /**
73  * @return {void}
74  */
75 base.WindowMessageDispatcher.prototype.unregisterAllHandlers = function() {
76   this.handlers_ = {};
79 /**
80  * Event handler to process window messages.
81  *
82  * @param {Event} event
83  */
84 base.WindowMessageDispatcher.prototype.onMessage_ = function(event) {
85   var data = event.data;
86   if (typeof data === 'object') {
87     /** @type {string} */
88     var source = data['source'];
89     if (source === undefined) {
90       console.error('Missing source field in incoming message: ', data);
91       return;
92     }
94     console.log('object message received from: ', source);
95     var handler = this.handlers_[source];
96     if (handler) {
97       handler(event);
98     } else {
99       console.error('No handler registered for messages from: ', source);
100     }
101   } else {
102     console.error('Unknown window message data type: ', data);
103   }
106 })();