summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--chrome/browser/extensions/api/webrtc_desktop_capture_private/webrtc_desktop_capture_private_api.cc21
-rw-r--r--chrome/browser/resources/hangout_services/background.html1
-rw-r--r--chrome/browser/resources/hangout_services/manifest.json1
-rw-r--r--chrome/browser/resources/hangout_services/thunk.js43
-rw-r--r--chrome/browser/ui/views/desktop_media_picker_views.cc14
-rw-r--r--chrome/common/extensions/api/webrtc_desktop_capture_private.idl6
-rw-r--r--chrome/renderer/extensions/chrome_extensions_dispatcher_delegate.cc3
-rw-r--r--chrome/renderer/resources/extensions/webrtc_desktop_capture_private_custom_bindings.js42
-rw-r--r--chrome/renderer/resources/renderer_resources.grd1
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. -->