Roll src/third_party/WebKit 3529d49:06e8485 (svn 202554:202555)
[chromium-blink-merge.git] / remoting / webapp / base / js / protocol_extension_manager.js
blobabad8c35b8abf62695c6bdf826ee2ab46558fe9d
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  * @param {function(string, string)} sendExtensionMessage Callback used to
14  *     send an extension message to the plugin.
15  * @constructor
16  * @implements {base.Disposable}
17  */
18 remoting.ProtocolExtensionManager = function(sendExtensionMessage) {
19   /** @private */
20   this.sendExtensionMessage_ = sendExtensionMessage;
21   /** @private {Object<remoting.ProtocolExtension>} */
22   this.protocolExtensions_ = {};
24   /**
25    * True once a session has been created and we've started the extensions.
26    * This is used to immediately start any extensions that are registered
27    * after the CONNECTED state change.
28    * @private
29    */
30   this.protocolExtensionsStarted_ = false;
33 remoting.ProtocolExtensionManager.prototype.dispose = function() {
34   this.sendExtensionMessage_ = base.doNothing;
35   this.protocolExtensions_ = {};
38 /** Called by the plugin when the session is connected */
39 remoting.ProtocolExtensionManager.prototype.start = function() {
40   console.assert(!this.protocolExtensionsStarted_,
41                  'Duplicate start() invocation.');
42   /** @type {Object<remoting.ProtocolExtension, boolean>} */
43   var started = {};
44   for (var type in this.protocolExtensions_) {
45     var extension = this.protocolExtensions_[type];
46     if (!(extension in started)) {
47       extension.startExtension(this.sendExtensionMessage_);
48       started[extension] = true;
49     }
50   }
51   this.protocolExtensionsStarted_ = true;
54 /**
55  * @param {remoting.ProtocolExtension} extension
56  * @return {boolean} true if the extension is successfully registered.
57  */
58 remoting.ProtocolExtensionManager.prototype.register =
59     function(extension) {
60   var types = extension.getExtensionTypes();
62   // Make sure we don't have an extension of that type already registered.
63   for (var i=0, len=types.length; i < len; i++) {
64     if (types[i] in this.protocolExtensions_) {
65       console.error(
66           'Attempt to register multiple extensions of the same type: ', type);
67       return false;
68     }
69   }
71   // Register the extension for each type.
72   for (var i=0, len=types.length; i < len; i++) {
73     var type = types[i];
74     this.protocolExtensions_[type] = extension;
75   }
77   // Start the extension.
78   if (this.protocolExtensionsStarted_) {
79     extension.startExtension(this.sendExtensionMessage_);
80   }
82   return true;
85 /**
86  * Called when an extension message needs to be handled.
87  *
88  * @param {string} type The type of the extension message.
89  * @param {string} data The payload of the extension message.
90  * @return {boolean} Return true if the extension message was recognized.
91  */
92 remoting.ProtocolExtensionManager.prototype.onProtocolExtensionMessage =
93     function(type, data) {
94   if (type == 'test-echo-reply') {
95     console.log('Got echo reply: ' + data);
96     return true;
97   }
99   var message = base.jsonParseSafe(data);
100   if (typeof message != 'object') {
101     console.error('Error parsing extension json data: ' + data);
102     return false;
103   }
105   if (type in this.protocolExtensions_) {
106     /** @type {remoting.ProtocolExtension} */
107     var extension = this.protocolExtensions_[type];
108     var handled = false;
109     try {
110       handled = extension.onExtensionMessage(type, message);
111     } catch (/** @type {*} */ err) {
112       console.error('Failed to process protocol extension ' + type +
113                     ' message: ' + err);
114     }
115     if (handled) {
116       return true;
117     }
118   }
120   return false;
123 })();