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.
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});
12 function getHost(url) {
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');
20 var origin = a.protocol + '//' + a.hostname;
22 origin = origin + ':' + a.port;
23 origin = origin + '/';
28 var method = message['method'];
29 var origin = getHost(sender.url);
30 if (method == 'chooseDesktopMedia') {
32 function sendResponseWithCancelId(streamId) {
33 var value = {'cancelId': cancelId,
34 'streamId': streamId};
35 doSendResponse(value);
37 cancelId = chrome.desktopCapture.chooseDesktopMedia(
38 ['screen', 'window'], sender.tab, sendResponseWithCancelId);
40 } else if (method == 'cancelChooseDesktopMedia') {
41 var cancelId = message['cancelId'];
42 chrome.desktopCapture.cancelChooseDesktopMedia(cancelId);
45 } else if (method == 'cpu.getInfo') {
46 chrome.system.cpu.getInfo(doSendResponse);
48 } else if (method == 'logging.setMetadata') {
49 var metaData = message['metaData'];
50 chrome.webrtcLoggingPrivate.setMetaData(
51 sender.tab.id, origin, metaData, doSendResponse);
53 } else if (method == 'logging.start') {
54 chrome.webrtcLoggingPrivate.start(sender.tab.id, origin, doSendResponse);
56 } else if (method == 'logging.uploadOnRenderClose') {
57 chrome.webrtcLoggingPrivate.setUploadOnRenderClose(
58 sender.tab.id, origin, true);
61 } else if (method == 'logging.noUploadOnRenderClose') {
62 chrome.webrtcLoggingPrivate.setUploadOnRenderClose(
63 sender.tab.id, origin, false);
66 } else if (method == 'logging.stop') {
67 chrome.webrtcLoggingPrivate.stop(sender.tab.id, origin, doSendResponse);
69 } else if (method == 'logging.upload') {
70 chrome.webrtcLoggingPrivate.upload(sender.tab.id, origin, doSendResponse);
72 } else if (method == 'logging.discard') {
73 chrome.webrtcLoggingPrivate.discard(
74 sender.tab.id, origin, doSendResponse);
76 } else if (method == 'getSinks') {
77 chrome.webrtcAudioPrivate.getSinks(doSendResponse);
79 } else if (method == 'getActiveSink') {
80 chrome.webrtcAudioPrivate.getActiveSink(sender.tab.id, doSendResponse);
82 } else if (method == 'setActiveSink') {
83 var sinkId = message['sinkId'];
84 chrome.webrtcAudioPrivate.setActiveSink(
85 sender.tab.id, sinkId, doSendResponse);
87 } else if (method == 'getAssociatedSink') {
88 var sourceId = message['sourceId'];
89 chrome.webrtcAudioPrivate.getAssociatedSink(
90 origin, sourceId, doSendResponse);
92 } else if (method == 'isExtensionEnabled') {
93 // This method is necessary because there may be more than one
94 // version of this extension, under different extension IDs. By
95 // first calling this method on the extension ID, the client can
96 // check if it's loaded; if it's not, the extension system will
97 // call the callback with no arguments and set
98 // chrome.runtime.lastError.
102 throw new Error('Unknown method: ' + method);
104 doSendResponse(null, e.name + ': ' + e.message);
108 // If Hangouts connects with a port named 'onSinksChangedListener', we
109 // will register a listener and send it a message {'eventName':
110 // 'onSinksChanged'} whenever the event fires.
111 chrome.runtime.onConnectExternal.addListener(
113 if (port.name == 'onSinksChangedListener') {
114 function clientListener() {
115 port.postMessage({'eventName': 'onSinksChanged'});
117 chrome.webrtcAudioPrivate.onSinksChanged.addListener(clientListener);
119 port.onDisconnect(function() {
120 chrome.webrtcAudioPrivate.onSinksChanged.removeListener(