Commit eb6c56e1 authored by Anand K. Mistry's avatar Anand K. Mistry Committed by Commit Bot

[Extensions Functions] Migrate desktop capture APIs to ExtensionFunction

Bug: 634140
Change-Id: Ic09bdb2d88b59af4778bd6c1eed2afb39375bedb
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/2041716Reviewed-by: default avatarWez <wez@chromium.org>
Reviewed-by: default avatarBen Wells <benwells@chromium.org>
Commit-Queue: Anand Mistry <amistry@chromium.org>
Cr-Commit-Position: refs/heads/master@{#740536}
parent 236ebdb2
......@@ -6,6 +6,7 @@
#include "base/command_line.h"
#include "base/strings/utf_string_conversions.h"
#include "chrome/browser/extensions/chrome_extension_function_details.h"
#include "chrome/browser/extensions/extension_tab_util.h"
#include "chrome/browser/profiles/profile.h"
#include "chrome/common/chrome_switches.h"
......@@ -37,7 +38,8 @@ DesktopCaptureChooseDesktopMediaFunction::
~DesktopCaptureChooseDesktopMediaFunction() {
}
bool DesktopCaptureChooseDesktopMediaFunction::RunAsync() {
ExtensionFunction::ResponseAction
DesktopCaptureChooseDesktopMediaFunction::Run() {
EXTENSION_FUNCTION_VALIDATE(args_->GetSize() > 0);
EXTENSION_FUNCTION_VALIDATE(args_->GetInteger(0, &request_id_));
......@@ -57,35 +59,32 @@ bool DesktopCaptureChooseDesktopMediaFunction::RunAsync() {
GURL origin;
if (params->target_tab) {
if (!params->target_tab->url) {
error_ = kDesktopCaptureApiNoUrlError;
return false;
return RespondNow(Error(kDesktopCaptureApiNoUrlError));
}
origin = GURL(*(params->target_tab->url)).GetOrigin();
if (!origin.is_valid()) {
error_ = kDesktopCaptureApiInvalidOriginError;
return false;
return RespondNow(Error(kDesktopCaptureApiInvalidOriginError));
}
if (!base::CommandLine::ForCurrentProcess()->HasSwitch(
::switches::kAllowHttpScreenCapture) &&
!content::IsOriginSecure(origin)) {
error_ = kDesktopCaptureApiTabUrlNotSecure;
return false;
return RespondNow(Error(kDesktopCaptureApiTabUrlNotSecure));
}
target_name = base::UTF8ToUTF16(content::IsOriginSecure(origin) ?
net::GetHostAndOptionalPort(origin) : origin.spec());
if (!params->target_tab->id ||
*params->target_tab->id == api::tabs::TAB_ID_NONE) {
error_ = kDesktopCaptureApiNoTabIdError;
return false;
return RespondNow(Error(kDesktopCaptureApiNoTabIdError));
}
if (!ExtensionTabUtil::GetTabById(*(params->target_tab->id), GetProfile(),
true, &web_contents)) {
error_ = kDesktopCaptureApiInvalidTabIdError;
return false;
ChromeExtensionFunctionDetails details(this);
if (!ExtensionTabUtil::GetTabById(*(params->target_tab->id),
details.GetProfile(), true,
&web_contents)) {
return RespondNow(Error(kDesktopCaptureApiInvalidTabIdError));
}
DCHECK(web_contents);
} else {
......
......@@ -21,7 +21,7 @@ class DesktopCaptureChooseDesktopMediaFunction
~DesktopCaptureChooseDesktopMediaFunction() override;
// ExtensionFunction overrides.
bool RunAsync() override;
ResponseAction Run() override;
// Returns the target name to show in the picker when capture is requested for
// an extension. Currently this is the same as the application name.
......
......@@ -68,11 +68,11 @@ void DesktopCaptureChooseDesktopMediaFunctionBase::Cancel() {
// If this picker dialog is open, this will close it.
picker_controller_.reset();
SetResultList(Create(std::string(), Options()));
SendResponse(true);
Respond(ArgumentList(Create(std::string(), Options())));
}
bool DesktopCaptureChooseDesktopMediaFunctionBase::Execute(
ExtensionFunction::ResponseAction
DesktopCaptureChooseDesktopMediaFunctionBase::Execute(
const std::vector<api::desktop_capture::DesktopCaptureSourceType>& sources,
content::WebContents* web_contents,
const GURL& origin,
......@@ -96,8 +96,7 @@ bool DesktopCaptureChooseDesktopMediaFunctionBase::Execute(
for (auto source_type : sources) {
switch (source_type) {
case api::desktop_capture::DESKTOP_CAPTURE_SOURCE_TYPE_NONE: {
error_ = kInvalidSourceNameError;
return false;
return RespondNow(Error(kInvalidSourceNameError));
}
case api::desktop_capture::DESKTOP_CAPTURE_SOURCE_TYPE_SCREEN: {
media_types.push_back(content::DesktopMediaID::TYPE_SCREEN);
......@@ -135,7 +134,7 @@ bool DesktopCaptureChooseDesktopMediaFunctionBase::Execute(
std::make_unique<DesktopMediaPickerController>(g_picker_factory);
picker_controller_->Show(picker_params, std::move(media_types),
std::move(callback));
return true;
return RespondLater();
}
std::string DesktopCaptureChooseDesktopMediaFunctionBase::GetCallerDisplayName()
......@@ -156,15 +155,13 @@ void DesktopCaptureChooseDesktopMediaFunctionBase::OnPickerDialogResults(
picker_controller_.reset();
if (!err.empty()) {
SetError(err);
SendResponse(false);
Respond(Error(err));
return;
}
if (source.is_null()) {
DLOG(ERROR) << "Sending empty results.";
SetResultList(Create(std::string(), Options()));
SendResponse(true);
Respond(ArgumentList(Create(std::string(), Options())));
return;
}
......@@ -184,8 +181,7 @@ void DesktopCaptureChooseDesktopMediaFunctionBase::OnPickerDialogResults(
Options options;
options.can_request_audio_track = source.audio_share;
SetResultList(Create(result, options));
SendResponse(true);
Respond(ArgumentList(Create(result, options)));
}
DesktopCaptureRequestsRegistry::RequestId::RequestId(int process_id,
......
......@@ -12,17 +12,16 @@
#include "base/macros.h"
#include "base/memory/singleton.h"
#include "chrome/browser/extensions/chrome_extension_function.h"
#include "chrome/browser/media/webrtc/desktop_media_list.h"
#include "chrome/browser/media/webrtc/desktop_media_picker_controller.h"
#include "chrome/browser/media/webrtc/desktop_media_picker_factory.h"
#include "chrome/common/extensions/api/desktop_capture.h"
#include "extensions/browser/extension_function.h"
#include "url/gurl.h"
namespace extensions {
class DesktopCaptureChooseDesktopMediaFunctionBase
: public ChromeAsyncExtensionFunction {
class DesktopCaptureChooseDesktopMediaFunctionBase : public ExtensionFunction {
public:
// Used to set PickerFactory used to create mock DesktopMediaPicker instances
// for tests. Calling tests keep ownership of the factory. Can be called with
......@@ -40,11 +39,12 @@ class DesktopCaptureChooseDesktopMediaFunctionBase
// also be used to determine where to show the picker's UI.
// |origin| is the origin for which the stream is created.
// |target_name| is the display name of the stream target.
bool Execute(const std::vector<
api::desktop_capture::DesktopCaptureSourceType>& sources,
content::WebContents* web_contents,
const GURL& origin,
const base::string16 target_name);
ResponseAction Execute(
const std::vector<api::desktop_capture::DesktopCaptureSourceType>&
sources,
content::WebContents* web_contents,
const GURL& origin,
const base::string16 target_name);
// Returns the calling application name to show in the picker.
std::string GetCallerDisplayName() const;
......
......@@ -33,7 +33,8 @@ WebrtcDesktopCapturePrivateChooseDesktopMediaFunction::
~WebrtcDesktopCapturePrivateChooseDesktopMediaFunction() {
}
bool WebrtcDesktopCapturePrivateChooseDesktopMediaFunction::RunAsync() {
ExtensionFunction::ResponseAction
WebrtcDesktopCapturePrivateChooseDesktopMediaFunction::Run() {
using Params =
extensions::api::webrtc_desktop_capture_private::ChooseDesktopMedia
::Params;
......@@ -53,16 +54,14 @@ bool WebrtcDesktopCapturePrivateChooseDesktopMediaFunction::RunAsync() {
params->request.guest_render_frame_id);
if (!rfh) {
error_ = kTargetNotFoundError;
return false;
return RespondNow(Error(kTargetNotFoundError));
}
GURL origin = rfh->GetLastCommittedURL().GetOrigin();
if (!base::CommandLine::ForCurrentProcess()->HasSwitch(
::switches::kAllowHttpScreenCapture) &&
!content::IsOriginSecure(origin)) {
error_ = kUrlNotSecure;
return false;
return RespondNow(Error(kUrlNotSecure));
}
base::string16 target_name = base::UTF8ToUTF16(
content::IsOriginSecure(origin) ? net::GetHostAndOptionalPort(origin)
......@@ -71,8 +70,7 @@ bool WebrtcDesktopCapturePrivateChooseDesktopMediaFunction::RunAsync() {
content::WebContents* web_contents =
content::WebContents::FromRenderFrameHost(rfh);
if (!web_contents) {
error_ = kTargetNotFoundError;
return false;
return RespondNow(Error(kTargetNotFoundError));
}
using Sources = std::vector<api::desktop_capture::DesktopCaptureSourceType>;
......
......@@ -20,7 +20,7 @@ class WebrtcDesktopCapturePrivateChooseDesktopMediaFunction
~WebrtcDesktopCapturePrivateChooseDesktopMediaFunction() override;
// ExtensionFunction overrides.
bool RunAsync() override;
ResponseAction Run() override;
};
class WebrtcDesktopCapturePrivateCancelChooseDesktopMediaFunction
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment