diff options
9 files changed, 79 insertions, 53 deletions
diff --git a/chrome/browser/extensions/api/webrtc_desktop_capture_private/webrtc_desktop_capture_private_api.cc b/chrome/browser/extensions/api/webrtc_desktop_capture_private/webrtc_desktop_capture_private_api.cc index 02439b2..81164f7 100644 --- a/chrome/browser/extensions/api/webrtc_desktop_capture_private/webrtc_desktop_capture_private_api.cc +++ b/chrome/browser/extensions/api/webrtc_desktop_capture_private/webrtc_desktop_capture_private_api.cc @@ -14,7 +14,6 @@ #include "chrome/common/extensions/api/webrtc_desktop_capture_private.h" #include "content/public/browser/render_frame_host.h" #include "content/public/browser/render_process_host.h" -#include "content/public/browser/render_view_host.h" #include "content/public/browser/web_contents.h" #include "content/public/common/origin_util.h" #include "net/base/net_util.h" @@ -23,7 +22,6 @@ namespace extensions { namespace { -const char kInvalidRequestInfoError[] = "Invalid RequestInfo specified."; const char kTargetNotFoundError[] = "The specified target is not found."; const char kUrlNotSecure[] = "URL scheme for the specified target is not secure."; @@ -53,21 +51,10 @@ bool WebrtcDesktopCapturePrivateChooseDesktopMediaFunction::RunAsync() { scoped_ptr<Params> params = Params::Create(*args_); EXTENSION_FUNCTION_VALIDATE(params.get()); - if (!params->request.guest_process_id || !params->request.render_view_id) { - error_ = kInvalidRequestInfoError; - return false; - } - - content::RenderViewHost* rvh = content::RenderViewHost::FromID( - *params->request.guest_process_id.get(), - *params->request.render_view_id.get()); - - if (!rvh) { - error_ = kTargetNotFoundError; - return false; - } + content::RenderFrameHost* rfh = content::RenderFrameHost::FromID( + params->request.guest_process_id, + params->request.guest_render_frame_id); - content::RenderFrameHost* rfh = rvh->GetMainFrame(); if (!rfh) { error_ = kTargetNotFoundError; return false; @@ -85,7 +72,7 @@ bool WebrtcDesktopCapturePrivateChooseDesktopMediaFunction::RunAsync() { : origin.spec()); content::WebContents* web_contents = - content::WebContents::FromRenderViewHost(rvh); + content::WebContents::FromRenderFrameHost(rfh); if (!web_contents) { error_ = kTargetNotFoundError; return false; diff --git a/chrome/browser/resources/hangout_services/background.html b/chrome/browser/resources/hangout_services/background.html index 26a2d27..08424b1 100644 --- a/chrome/browser/resources/hangout_services/background.html +++ b/chrome/browser/resources/hangout_services/background.html @@ -10,7 +10,6 @@ faster. --> <html> <head> -<link rel="stylesheet" href="chrome://resources/css/text_defaults.css"> <script src="thunk.js"></script> </head> <body> diff --git a/chrome/browser/resources/hangout_services/manifest.json b/chrome/browser/resources/hangout_services/manifest.json index 57e827d..ec8e001 100644 --- a/chrome/browser/resources/hangout_services/manifest.json +++ b/chrome/browser/resources/hangout_services/manifest.json @@ -25,6 +25,7 @@ "processes", "system.cpu", "webrtcAudioPrivate", + "webrtcDesktopCapturePrivate", "webrtcLoggingPrivate" ] } diff --git a/chrome/browser/resources/hangout_services/thunk.js b/chrome/browser/resources/hangout_services/thunk.js index 821d120..e70dbb2 100644 --- a/chrome/browser/resources/hangout_services/thunk.js +++ b/chrome/browser/resources/hangout_services/thunk.js @@ -41,26 +41,13 @@ chrome.runtime.onMessageExternal.addListener( requestInfo['guestProcessId'] = sender.guestProcessId; } + if (sender.guestRenderFrameRoutingId) { + requestInfo['guestRenderFrameId'] = sender.guestRenderFrameRoutingId; + } + 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') { + if (method == 'cpu.getInfo') { chrome.system.cpu.getInfo(doSendResponse); return true; } else if (method == 'logging.setMetadata') { @@ -193,12 +180,26 @@ function onChooseDesktopMediaPort(port) { var method = message['method']; if (method == 'chooseDesktopMedia') { var sources = message['sources']; - var cancelId = chrome.desktopCapture.chooseDesktopMedia( - sources, port.sender.tab, sendResponse); + var cancelId = null; + if (port.sender.tab) { + cancelId = chrome.desktopCapture.chooseDesktopMedia( + sources, port.sender.tab, sendResponse); + } else { + var requestInfo = {}; + requestInfo['guestProcessId'] = port.sender.guestProcessId || 0; + requestInfo['guestRenderFrameId'] = + port.sender.guestRenderFrameRoutingId || 0; + cancelId = chrome.webrtcDesktopCapturePrivate.chooseDesktopMedia( + sources, requestInfo, 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); + if (port.sender.tab) { + chrome.desktopCapture.cancelChooseDesktopMedia(cancelId); + } else { + chrome.webrtcDesktopCapturePrivate.cancelChooseDesktopMedia(cancelId); + } }); } }); diff --git a/chrome/browser/ui/views/desktop_media_picker_views.cc b/chrome/browser/ui/views/desktop_media_picker_views.cc index 7f60bbd..cb2cfb0 100644 --- a/chrome/browser/ui/views/desktop_media_picker_views.cc +++ b/chrome/browser/ui/views/desktop_media_picker_views.cc @@ -415,10 +415,11 @@ DesktopMediaPickerDialogView::DesktopMediaPickerDialogView( parent_web_contents && !parent_web_contents->GetDelegate()->IsNeverVisible(parent_web_contents); if (modal_dialog) { - widget = constrained_window::CreateWebModalDialogViews(this, - parent_web_contents); + widget = constrained_window::ShowWebModalDialogViews(this, + parent_web_contents); } else { widget = DialogDelegate::CreateDialogWidget(this, context, NULL); + widget->Show(); } // If the picker is not modal to the calling web contents then it is displayed @@ -442,15 +443,6 @@ DesktopMediaPickerDialogView::DesktopMediaPickerDialogView( } list_view_->StartUpdating(dialog_window_id); - - if (modal_dialog) { - web_modal::PopupManager* popup_manager = - web_modal::PopupManager::FromWebContents(parent_web_contents); - popup_manager->ShowModalDialog(GetWidget()->GetNativeView(), - parent_web_contents); - } else { - widget->Show(); - } } DesktopMediaPickerDialogView::~DesktopMediaPickerDialogView() {} diff --git a/chrome/common/extensions/api/webrtc_desktop_capture_private.idl b/chrome/common/extensions/api/webrtc_desktop_capture_private.idl index a1be032..d71f518 100644 --- a/chrome/common/extensions/api/webrtc_desktop_capture_private.idl +++ b/chrome/common/extensions/api/webrtc_desktop_capture_private.idl @@ -7,10 +7,10 @@ namespace webrtcDesktopCapturePrivate { dictionary RequestInfo { // The guest process id for the requester. - long? guestProcessId; + long guestProcessId; - // The webview render view id for the requester. - long? renderViewId; + // The webview render frame id for the requester. + long guestRenderFrameId; }; enum DesktopCaptureSourceType { diff --git a/chrome/renderer/extensions/chrome_extensions_dispatcher_delegate.cc b/chrome/renderer/extensions/chrome_extensions_dispatcher_delegate.cc index 8121346..9f52611 100644 --- a/chrome/renderer/extensions/chrome_extensions_dispatcher_delegate.cc +++ b/chrome/renderer/extensions/chrome_extensions_dispatcher_delegate.cc @@ -200,6 +200,9 @@ void ChromeExtensionsDispatcherDelegate::PopulateSourceMap( "cast.streaming.receiverSession", IDR_CAST_STREAMING_RECEIVER_SESSION_CUSTOM_BINDINGS_JS); #endif + source_map->RegisterSource( + "webrtcDesktopCapturePrivate", + IDR_WEBRTC_DESKTOP_CAPTURE_PRIVATE_CUSTOM_BINDINGS_JS); source_map->RegisterSource("webstore", IDR_WEBSTORE_CUSTOM_BINDINGS_JS); // Custom types sources. diff --git a/chrome/renderer/resources/extensions/webrtc_desktop_capture_private_custom_bindings.js b/chrome/renderer/resources/extensions/webrtc_desktop_capture_private_custom_bindings.js new file mode 100644 index 0000000..ce2fbf8 --- /dev/null +++ b/chrome/renderer/resources/extensions/webrtc_desktop_capture_private_custom_bindings.js @@ -0,0 +1,42 @@ +// Copyright 2015 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Custom binding for the webrtcDesktopCapturePrivate API. + +var binding = require('binding').Binding.create('webrtcDesktopCapturePrivate'); +var sendRequest = require('sendRequest').sendRequest; +var idGenerator = requireNative('id_generator'); + +binding.registerCustomHook(function(bindingsAPI) { + var apiFunctions = bindingsAPI.apiFunctions; + + var pendingRequests = {}; + + function onRequestResult(id, result) { + if (id in pendingRequests) { + var callback = pendingRequests[id]; + delete pendingRequests[id]; + callback(result); + } + } + + apiFunctions.setHandleRequest('chooseDesktopMedia', + function(sources, request, callback) { + var id = idGenerator.GetNextId(); + pendingRequests[id] = callback; + sendRequest(this.name, + [id, sources, request, onRequestResult.bind(null, id)], + this.definition.parameters, {}); + return id; + }); + + apiFunctions.setHandleRequest('cancelChooseDesktopMedia', function(id) { + if (id in pendingRequests) { + delete pendingRequests[id]; + sendRequest(this.name, [id], this.definition.parameters, {}); + } + }); +}); + +exports.binding = binding.generate(); diff --git a/chrome/renderer/resources/renderer_resources.grd b/chrome/renderer/resources/renderer_resources.grd index 6c72e4bf..828e760 100644 --- a/chrome/renderer/resources/renderer_resources.grd +++ b/chrome/renderer/resources/renderer_resources.grd @@ -83,6 +83,7 @@ <include name="IDR_TAG_WATCHER_JS" file="extensions\tag_watcher.js" type="BINDATA" /> <include name="IDR_TTS_CUSTOM_BINDINGS_JS" file="extensions\tts_custom_bindings.js" type="BINDATA" /> <include name="IDR_TTS_ENGINE_CUSTOM_BINDINGS_JS" file="extensions\tts_engine_custom_bindings.js" type="BINDATA" /> + <include name="IDR_WEBRTC_DESKTOP_CAPTURE_PRIVATE_CUSTOM_BINDINGS_JS" file="extensions\webrtc_desktop_capture_private_custom_bindings.js" type="BINDATA" /> <include name="IDR_WEBSTORE_CUSTOM_BINDINGS_JS" file="extensions\webstore_custom_bindings.js" type="BINDATA" /> <!-- Platform app support. --> |
