diff options
author | bemasc@chromium.org <bemasc@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2014-02-08 02:53:03 +0000 |
---|---|---|
committer | bemasc@chromium.org <bemasc@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2014-02-08 02:53:03 +0000 |
commit | d76e38856e2aecca725d36120f7879e7b9f8b10c (patch) | |
tree | 9f3b3187e748c423e38dcc72aa6149cddc47ffaf /chrome/browser/resources | |
parent | 886fb41253f821a069b944dff6e8aa31a3187d1a (diff) | |
download | chromium_src-d76e38856e2aecca725d36120f7879e7b9f8b10c.zip chromium_src-d76e38856e2aecca725d36120f7879e7b9f8b10c.tar.gz chromium_src-d76e38856e2aecca725d36120f7879e7b9f8b10c.tar.bz2 |
Add port mechanism for chooseDesktopMedia.
This is necessary in order to allow the page to
cancel the window picker before it returns a
source ID.
Review URL: https://codereview.chromium.org/157123003
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@249912 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'chrome/browser/resources')
-rw-r--r-- | chrome/browser/resources/hangout_services/thunk.js | 61 |
1 files changed, 52 insertions, 9 deletions
diff --git a/chrome/browser/resources/hangout_services/thunk.js b/chrome/browser/resources/hangout_services/thunk.js index eb9de46..fc97a937 100644 --- a/chrome/browser/resources/hangout_services/thunk.js +++ b/chrome/browser/resources/hangout_services/thunk.js @@ -28,6 +28,8 @@ chrome.runtime.onMessageExternal.addListener( 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}; @@ -37,6 +39,7 @@ chrome.runtime.onMessageExternal.addListener( ['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(); @@ -123,16 +126,56 @@ chrome.runtime.onMessageExternal.addListener( // 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) { - if (port.name == 'onSinksChangedListener') { - function clientListener() { - port.postMessage({'eventName': 'onSinksChanged'}); +function onSinksChangedPort(port) { + function clientListener() { + port.postMessage({'eventName': 'onSinksChanged'}); + } + chrome.webrtcAudioPrivate.onSinksChanged.addListener(clientListener); + + 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(); + } + + port.onMessage.addListener(function(message) { + var method = message['method']; + if (method == 'chooseDesktopMedia') { + 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; } - chrome.webrtcAudioPrivate.onSinksChanged.addListener(clientListener); + }); +} - port.onDisconnect(function() { - chrome.webrtcAudioPrivate.onSinksChanged.removeListener( - clientListener); - }); +chrome.runtime.onConnectExternal.addListener(function(port) { + if (port.name == 'onSinksChangedListener') { + onSinksChangedPort(port); + } else if (port.name == 'chooseDesktopMedia') { + onChooseDesktopMediaPort(port); + } else { + // Unknown port type. + port.disconnect(); } }); |