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') {
31 // TODO(bemasc): Remove this method once the caller has transitioned
34 function sendResponseWithCancelId(streamId) {
35 var value = {'cancelId': cancelId, 'streamId': streamId};
36 doSendResponse(value);
38 cancelId = chrome.desktopCapture.chooseDesktopMedia(
39 ['screen', 'window'], sender.tab, sendResponseWithCancelId);
41 } else if (method == 'cancelChooseDesktopMedia') {
42 // TODO(bemasc): Remove this method (see above).
43 var cancelId = message['cancelId'];
44 chrome.desktopCapture.cancelChooseDesktopMedia(cancelId);
47 } else if (method == 'cpu.getInfo') {
48 chrome.system.cpu.getInfo(doSendResponse);
50 } else if (method == 'logging.setMetadata') {
51 var metaData = message['metaData'];
52 chrome.webrtcLoggingPrivate.setMetaData(
53 sender.tab.id, origin, metaData, doSendResponse);
55 } else if (method == 'logging.start') {
56 chrome.webrtcLoggingPrivate.start(
57 sender.tab.id, origin, doSendResponse);
59 } else if (method == 'logging.uploadOnRenderClose') {
60 chrome.webrtcLoggingPrivate.setUploadOnRenderClose(
61 sender.tab.id, origin, true);
64 } else if (method == 'logging.noUploadOnRenderClose') {
65 chrome.webrtcLoggingPrivate.setUploadOnRenderClose(
66 sender.tab.id, origin, false);
69 } else if (method == 'logging.stop') {
70 chrome.webrtcLoggingPrivate.stop(
71 sender.tab.id, origin, doSendResponse);
73 } else if (method == 'logging.upload') {
74 chrome.webrtcLoggingPrivate.upload(
75 sender.tab.id, origin, doSendResponse);
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);
83 } else if (method == 'logging.discard') {
84 chrome.webrtcLoggingPrivate.discard(
85 sender.tab.id, origin, doSendResponse);
87 } else if (method == 'getSinks') {
88 chrome.webrtcAudioPrivate.getSinks(doSendResponse);
90 } else if (method == 'getActiveSink') {
91 chrome.webrtcAudioPrivate.getActiveSink(
92 sender.tab.id, doSendResponse);
94 } else if (method == 'setActiveSink') {
95 var sinkId = message['sinkId'];
96 chrome.webrtcAudioPrivate.setActiveSink(
97 sender.tab.id, sinkId, doSendResponse);
99 } else if (method == 'getAssociatedSink') {
100 var sourceId = message['sourceId'];
101 chrome.webrtcAudioPrivate.getAssociatedSink(
102 origin, sourceId, doSendResponse);
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.
113 } else if (method == 'getNaclArchitecture') {
114 chrome.runtime.getPlatformInfo(function(obj) {
115 doSendResponse(obj.nacl_arch);
119 throw new Error('Unknown method: ' + method);
121 doSendResponse(null, e.name + ': ' + e.message);
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'});
133 chrome.webrtcAudioPrivate.onSinksChanged.addListener(clientListener);
135 port.onDisconnect.addListener(function() {
136 chrome.webrtcAudioPrivate.onSinksChanged.removeListener(
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}});
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);
163 } else if (method == 'getNaclArchitecture') {
164 chrome.runtime.getPlatformInfo(function(obj) {
165 doSendResponse(obj.nacl_arch);
172 chrome.runtime.onConnectExternal.addListener(function(port) {
173 if (port.name == 'onSinksChangedListener') {
174 onSinksChangedPort(port);
175 } else if (port.name == 'chooseDesktopMedia') {
176 onChooseDesktopMediaPort(port);
178 // Unknown port type.