// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
-chrome.runtime.onStartup.addListener(
- function() {
- chrome.alarms.create('hangout_services_fxpre', {'delayInMinutes': 2});
-});
+chrome.runtime.onMessageExternal.addListener(
+ function(message, sender, sendResponse) {
+ function doSendResponse(value, error) {
+ var errorMessage = error || chrome.extension.lastError;
+ sendResponse({'value': value, 'error': errorMessage});
+ }
-chrome.alarms.onAlarm.addListener(function(alarm) {
- if (!alarm || alarm.name != 'hangout_services_fxpre')
- return;
+ function getHost(url) {
+ if (!url)
+ return '';
+ // Use the DOM to parse the URL. Since we don't add the anchor to
+ // the page, this is the only reference to it and it will be
+ // deleted once it's gone out of scope.
+ var a = document.createElement('a');
+ a.href = url;
+ var origin = a.protocol + '//' + a.hostname;
+ if (a.port != '')
+ origin = origin + ':' + a.port;
+ origin = origin + '/';
+ return origin;
+ }
- var e = document.createElement('iframe');
- e.src = 'https://plus.google.com/hangouts/_/fxpre';
- document.body.appendChild(e);
-});
+ try {
+ var method = message['method'];
+ var origin = getHost(sender.url);
+ if (method == 'chooseDesktopMedia') {
+ // TODO(bemasc): Remove this method once the caller has transitioned
+ // to using the port.
+ var cancelId;
+ function sendResponseWithCancelId(streamId) {
+ var value = {'cancelId': cancelId, 'streamId': streamId};
+ doSendResponse(value);
+ }
+ cancelId = chrome.desktopCapture.chooseDesktopMedia(
+ ['screen', 'window'], sender.tab, sendResponseWithCancelId);
+ return true;
+ } else if (method == 'cancelChooseDesktopMedia') {
+ // TODO(bemasc): Remove this method (see above).
+ var cancelId = message['cancelId'];
+ chrome.desktopCapture.cancelChooseDesktopMedia(cancelId);
+ doSendResponse();
+ return false;
+ } else if (method == 'cpu.getInfo') {
+ chrome.system.cpu.getInfo(doSendResponse);
+ return true;
+ } else if (method == 'logging.setMetadata') {
+ var metaData = message['metaData'];
+ chrome.webrtcLoggingPrivate.setMetaData(
+ sender.tab.id, origin, metaData, doSendResponse);
+ return true;
+ } else if (method == 'logging.start') {
+ chrome.webrtcLoggingPrivate.start(
+ sender.tab.id, origin, doSendResponse);
+ return true;
+ } else if (method == 'logging.uploadOnRenderClose') {
+ chrome.webrtcLoggingPrivate.setUploadOnRenderClose(
+ sender.tab.id, origin, true);
+ doSendResponse();
+ return false;
+ } else if (method == 'logging.noUploadOnRenderClose') {
+ chrome.webrtcLoggingPrivate.setUploadOnRenderClose(
+ sender.tab.id, origin, false);
+ doSendResponse();
+ return false;
+ } else if (method == 'logging.stop') {
+ chrome.webrtcLoggingPrivate.stop(
+ sender.tab.id, origin, doSendResponse);
+ return true;
+ } else if (method == 'logging.upload') {
+ chrome.webrtcLoggingPrivate.upload(
+ sender.tab.id, origin, doSendResponse);
+ return true;
+ } else if (method == 'logging.stopAndUpload') {
+ chrome.webrtcLoggingPrivate.stop(sender.tab.id, origin, function() {
+ chrome.webrtcLoggingPrivate.upload(
+ sender.tab.id, origin, doSendResponse);
+ });
+ return true;
+ } else if (method == 'logging.discard') {
+ chrome.webrtcLoggingPrivate.discard(
+ sender.tab.id, origin, doSendResponse);
+ return true;
+ } else if (method == 'getSinks') {
+ chrome.webrtcAudioPrivate.getSinks(doSendResponse);
+ return true;
+ } else if (method == 'getActiveSink') {
+ chrome.webrtcAudioPrivate.getActiveSink(
+ sender.tab.id, doSendResponse);
+ return true;
+ } else if (method == 'setActiveSink') {
+ var sinkId = message['sinkId'];
+ chrome.webrtcAudioPrivate.setActiveSink(
+ sender.tab.id, sinkId, doSendResponse);
+ return true;
+ } else if (method == 'getAssociatedSink') {
+ var sourceId = message['sourceId'];
+ chrome.webrtcAudioPrivate.getAssociatedSink(
+ origin, sourceId, doSendResponse);
+ return true;
+ } else if (method == 'isExtensionEnabled') {
+ // This method is necessary because there may be more than one
+ // version of this extension, under different extension IDs. By
+ // first calling this method on the extension ID, the client can
+ // check if it's loaded; if it's not, the extension system will
+ // call the callback with no arguments and set
+ // chrome.runtime.lastError.
+ doSendResponse();
+ return false;
+ } else if (method == 'getNaclArchitecture') {
+ chrome.runtime.getPlatformInfo(function(obj) {
+ doSendResponse(obj.nacl_arch);
+ });
+ return true;
+ }
+ throw new Error('Unknown method: ' + method);
+ } catch (e) {
+ doSendResponse(null, e.name + ': ' + e.message);
+ }
+ }
+);
-chrome.runtime.onMessageExternal.addListener(
- function(message, sender, sendResponse) {
- function doSendResponse(value, error) {
- var errorMessage = error || chrome.extension.lastError;
- sendResponse({'value': value, 'error': errorMessage});
+// If Hangouts connects with a port named 'onSinksChangedListener', we
+// will register a listener and send it a message {'eventName':
+// 'onSinksChanged'} whenever the event fires.
+function onSinksChangedPort(port) {
+ function clientListener() {
+ port.postMessage({'eventName': 'onSinksChanged'});
}
+ chrome.webrtcAudioPrivate.onSinksChanged.addListener(clientListener);
- function getHost(url) {
- if (!url)
- return '';
- // Use the DOM to parse the URL. Since we don't add the anchor to
- // the page, this is the only reference to it and it will be
- // deleted once it's gone out of scope.
- var a = document.createElement('a');
- a.href = url;
- var origin = a.protocol + '//' + a.hostname;
- if (a.port != '')
- origin = origin + ':' + a.port;
- origin = origin + '/';
- return origin;
+ port.onDisconnect.addListener(function() {
+ chrome.webrtcAudioPrivate.onSinksChanged.removeListener(
+ clientListener);
+ });
+}
+
+// This is a one-time-use port for calling chooseDesktopMedia. The page
+// sends one message, identifying the requested source types, and the
+// extension sends a single reply, with the user's selected streamId. A port
+// is used so that if the page is closed before that message is sent, the
+// window picker dialog will be closed.
+function onChooseDesktopMediaPort(port) {
+ function sendResponse(streamId) {
+ port.postMessage({'value': {'streamId': streamId}});
+ port.disconnect();
}
- try {
+ port.onMessage.addListener(function(message) {
var method = message['method'];
- var origin = getHost(sender.url);
if (method == 'chooseDesktopMedia') {
- var cancelId;
- function sendResponseWithCancelId(streamId) {
- var value = {'cancelId': cancelId,
- 'streamId': streamId};
- doSendResponse(value);
- }
- cancelId = chrome.desktopCapture.chooseDesktopMedia(
- ['screen', 'window'], sender.tab, sendResponseWithCancelId);
- return true;
- } else if (method == 'cancelChooseDesktopMedia') {
- var cancelId = message['cancelId'];
- chrome.desktopCapture.cancelChooseDesktopMedia(cancelId);
- doSendResponse();
- return false;
- } else if (method == 'cpu.getInfo') {
- chrome.system.cpu.getInfo(doSendResponse);
- return true;
- } else if (method == 'logging.setMetadata') {
- var metaData = message['metaData'];
- chrome.webrtcLoggingPrivate.setMetaData(
- sender.tab.id, origin, metaData, doSendResponse);
- return true;
- } else if (method == 'logging.start') {
- chrome.webrtcLoggingPrivate.start(sender.tab.id, origin, doSendResponse);
- return true;
- } else if (method == 'logging.uploadOnRenderClose') {
- chrome.webrtcLoggingPrivate.setUploadOnRenderClose(
- sender.tab.id, origin, true);
- doSendResponse();
- return false;
- } else if (method == 'logging.noUploadOnRenderClose') {
- chrome.webrtcLoggingPrivate.setUploadOnRenderClose(
- sender.tab.id, origin, false);
- doSendResponse();
- return false;
- } else if (method == 'logging.stop') {
- chrome.webrtcLoggingPrivate.stop(sender.tab.id, origin, doSendResponse);
- return true;
- } else if (method == 'logging.upload') {
- chrome.webrtcLoggingPrivate.upload(sender.tab.id, origin, doSendResponse);
- return true;
- } else if (method == 'logging.stopAndUpload') {
- chrome.webrtcLoggingPrivate.stop(
- sender.tab.id, origin, function() {
- chrome.webrtcLoggingPrivate.upload(
- sender.tab.id, origin, doSendResponse);
- });
- return true;
- } else if (method == 'logging.discard') {
- chrome.webrtcLoggingPrivate.discard(
- sender.tab.id, origin, doSendResponse);
- return true;
- } else if (method == 'getSinks') {
- chrome.webrtcAudioPrivate.getSinks(doSendResponse);
- return true;
- } else if (method == 'getActiveSink') {
- chrome.webrtcAudioPrivate.getActiveSink(sender.tab.id, doSendResponse);
- return true;
- } else if (method == 'setActiveSink') {
- var sinkId = message['sinkId'];
- chrome.webrtcAudioPrivate.setActiveSink(
- sender.tab.id, sinkId, doSendResponse);
- return true;
- } else if (method == 'getAssociatedSink') {
- var sourceId = message['sourceId'];
- chrome.webrtcAudioPrivate.getAssociatedSink(
- origin, sourceId, doSendResponse);
+ var sources = message['sources'];
+ var cancelId = chrome.desktopCapture.chooseDesktopMedia(
+ sources, port.sender.tab, sendResponse);
+ port.onDisconnect.addListener(function() {
+ // This method has no effect if called after the user has selected a
+ // desktop media source, so it does not need to be conditional.
+ chrome.desktopCapture.cancelChooseDesktopMedia(cancelId);
+ });
+ } else if (method == 'getNaclArchitecture') {
+ chrome.runtime.getPlatformInfo(function(obj) {
+ doSendResponse(obj.nacl_arch);
+ });
return true;
- } else if (method == 'isExtensionEnabled') {
- // This method is necessary because there may be more than one
- // version of this extension, under different extension IDs. By
- // first calling this method on the extension ID, the client can
- // check if it's loaded; if it's not, the extension system will
- // call the callback with no arguments and set
- // chrome.runtime.lastError.
- doSendResponse();
- return false;
}
- throw new Error('Unknown method: ' + method);
- } catch (e) {
- doSendResponse(null, e.name + ': ' + e.message);
- }
-});
+ });
+}
-// If Hangouts connects with a port named 'onSinksChangedListener', we
-// will register a listener and send it a message {'eventName':
-// 'onSinksChanged'} whenever the event fires.
-chrome.runtime.onConnectExternal.addListener(
- function(port) {
+chrome.runtime.onConnectExternal.addListener(function(port) {
if (port.name == 'onSinksChangedListener') {
- function clientListener() {
- port.postMessage({'eventName': 'onSinksChanged'});
- }
- chrome.webrtcAudioPrivate.onSinksChanged.addListener(clientListener);
-
- port.onDisconnect(function() {
- chrome.webrtcAudioPrivate.onSinksChanged.removeListener(
- clientListener);
- });
+ onSinksChangedPort(port);
+ } else if (port.name == 'chooseDesktopMedia') {
+ onChooseDesktopMediaPort(port);
+ } else {
+ // Unknown port type.
+ port.disconnect();
}
});