Upstream version 5.34.104.0
[platform/framework/web/crosswalk.git] / src / chrome / browser / resources / hangout_services / thunk.js
1 // Copyright 2013 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
5 chrome.runtime.onMessageExternal.addListener(
6     function(message, sender, sendResponse) {
7       function doSendResponse(value, error) {
8         var errorMessage = error || chrome.extension.lastError;
9         sendResponse({'value': value, 'error': errorMessage});
10       }
11
12       function getHost(url) {
13         if (!url)
14           return '';
15         // Use the DOM to parse the URL. Since we don't add the anchor to
16         // the page, this is the only reference to it and it will be
17         // deleted once it's gone out of scope.
18         var a = document.createElement('a');
19         a.href = url;
20         var origin = a.protocol + '//' + a.hostname;
21         if (a.port != '')
22           origin = origin + ':' + a.port;
23         origin = origin + '/';
24         return origin;
25       }
26
27       try {
28         var method = message['method'];
29         var origin = getHost(sender.url);
30         if (method == 'chooseDesktopMedia') {
31           // TODO(bemasc): Remove this method once the caller has transitioned
32           // to using the port.
33           var cancelId;
34           function sendResponseWithCancelId(streamId) {
35             var value = {'cancelId': cancelId, 'streamId': streamId};
36             doSendResponse(value);
37           }
38           cancelId = chrome.desktopCapture.chooseDesktopMedia(
39               ['screen', 'window'], sender.tab, sendResponseWithCancelId);
40           return true;
41         } else if (method == 'cancelChooseDesktopMedia') {
42           // TODO(bemasc): Remove this method (see above).
43           var cancelId = message['cancelId'];
44           chrome.desktopCapture.cancelChooseDesktopMedia(cancelId);
45           doSendResponse();
46           return false;
47         } else if (method == 'cpu.getInfo') {
48           chrome.system.cpu.getInfo(doSendResponse);
49           return true;
50         } else if (method == 'logging.setMetadata') {
51           var metaData = message['metaData'];
52           chrome.webrtcLoggingPrivate.setMetaData(
53               sender.tab.id, origin, metaData, doSendResponse);
54           return true;
55         } else if (method == 'logging.start') {
56           chrome.webrtcLoggingPrivate.start(
57               sender.tab.id, origin, doSendResponse);
58           return true;
59         } else if (method == 'logging.uploadOnRenderClose') {
60           chrome.webrtcLoggingPrivate.setUploadOnRenderClose(
61               sender.tab.id, origin, true);
62           doSendResponse();
63           return false;
64         } else if (method == 'logging.noUploadOnRenderClose') {
65           chrome.webrtcLoggingPrivate.setUploadOnRenderClose(
66               sender.tab.id, origin, false);
67           doSendResponse();
68           return false;
69         } else if (method == 'logging.stop') {
70           chrome.webrtcLoggingPrivate.stop(
71               sender.tab.id, origin, doSendResponse);
72           return true;
73         } else if (method == 'logging.upload') {
74           chrome.webrtcLoggingPrivate.upload(
75               sender.tab.id, origin, doSendResponse);
76           return true;
77         } else if (method == 'logging.stopAndUpload') {
78           chrome.webrtcLoggingPrivate.stop(sender.tab.id, origin, function() {
79             chrome.webrtcLoggingPrivate.upload(
80                 sender.tab.id, origin, doSendResponse);
81           });
82           return true;
83         } else if (method == 'logging.discard') {
84           chrome.webrtcLoggingPrivate.discard(
85               sender.tab.id, origin, doSendResponse);
86           return true;
87         } else if (method == 'getSinks') {
88           chrome.webrtcAudioPrivate.getSinks(doSendResponse);
89           return true;
90         } else if (method == 'getActiveSink') {
91           chrome.webrtcAudioPrivate.getActiveSink(
92               sender.tab.id, doSendResponse);
93           return true;
94         } else if (method == 'setActiveSink') {
95           var sinkId = message['sinkId'];
96           chrome.webrtcAudioPrivate.setActiveSink(
97               sender.tab.id, sinkId, doSendResponse);
98           return true;
99         } else if (method == 'getAssociatedSink') {
100           var sourceId = message['sourceId'];
101           chrome.webrtcAudioPrivate.getAssociatedSink(
102               origin, sourceId, doSendResponse);
103           return true;
104         } else if (method == 'isExtensionEnabled') {
105           // This method is necessary because there may be more than one
106           // version of this extension, under different extension IDs. By
107           // first calling this method on the extension ID, the client can
108           // check if it's loaded; if it's not, the extension system will
109           // call the callback with no arguments and set
110           // chrome.runtime.lastError.
111           doSendResponse();
112           return false;
113         } else if (method == 'getNaclArchitecture') {
114           chrome.runtime.getPlatformInfo(function(obj) {
115             doSendResponse(obj.nacl_arch);
116           });
117           return true;
118         }
119         throw new Error('Unknown method: ' + method);
120       } catch (e) {
121         doSendResponse(null, e.name + ': ' + e.message);
122       }
123     }
124 );
125
126 // If Hangouts connects with a port named 'onSinksChangedListener', we
127 // will register a listener and send it a message {'eventName':
128 // 'onSinksChanged'} whenever the event fires.
129 function onSinksChangedPort(port) {
130   function clientListener() {
131     port.postMessage({'eventName': 'onSinksChanged'});
132   }
133   chrome.webrtcAudioPrivate.onSinksChanged.addListener(clientListener);
134
135   port.onDisconnect.addListener(function() {
136     chrome.webrtcAudioPrivate.onSinksChanged.removeListener(
137         clientListener);
138   });
139 }
140
141 // This is a one-time-use port for calling chooseDesktopMedia.  The page
142 // sends one message, identifying the requested source types, and the
143 // extension sends a single reply, with the user's selected streamId.  A port
144 // is used so that if the page is closed before that message is sent, the
145 // window picker dialog will be closed.
146 function onChooseDesktopMediaPort(port) {
147   function sendResponse(streamId) {
148     port.postMessage({'value': {'streamId': streamId}});
149     port.disconnect();
150   }
151
152   port.onMessage.addListener(function(message) {
153     var method = message['method'];
154     if (method == 'chooseDesktopMedia') {
155       var sources = message['sources'];
156       var cancelId = chrome.desktopCapture.chooseDesktopMedia(
157           sources, port.sender.tab, sendResponse);
158       port.onDisconnect.addListener(function() {
159         // This method has no effect if called after the user has selected a
160         // desktop media source, so it does not need to be conditional.
161         chrome.desktopCapture.cancelChooseDesktopMedia(cancelId);
162       });
163     } else if (method == 'getNaclArchitecture') {
164       chrome.runtime.getPlatformInfo(function(obj) {
165         doSendResponse(obj.nacl_arch);
166       });
167       return true;
168     }
169   });
170 }
171
172 chrome.runtime.onConnectExternal.addListener(function(port) {
173   if (port.name == 'onSinksChangedListener') {
174     onSinksChangedPort(port);
175   } else if (port.name == 'chooseDesktopMedia') {
176     onChooseDesktopMediaPort(port);
177   } else {
178     // Unknown port type.
179     port.disconnect();
180   }
181 });