summaryrefslogtreecommitdiffstats
path: root/chromium/chrome/browser/extensions/api/desktop_capture/desktop_capture_base.cc
diff options
context:
space:
mode:
Diffstat (limited to 'chromium/chrome/browser/extensions/api/desktop_capture/desktop_capture_base.cc')
-rw-r--r--chromium/chrome/browser/extensions/api/desktop_capture/desktop_capture_base.cc78
1 files changed, 39 insertions, 39 deletions
diff --git a/chromium/chrome/browser/extensions/api/desktop_capture/desktop_capture_base.cc b/chromium/chrome/browser/extensions/api/desktop_capture/desktop_capture_base.cc
index 07369df425c..c0eed2de936 100644
--- a/chromium/chrome/browser/extensions/api/desktop_capture/desktop_capture_base.cc
+++ b/chromium/chrome/browser/extensions/api/desktop_capture/desktop_capture_base.cc
@@ -30,17 +30,16 @@
#include "extensions/common/manifest.h"
#include "extensions/common/switches.h"
#include "ui/base/l10n/l10n_util.h"
+#include "url/origin.h"
-using extensions::api::desktop_capture::ChooseDesktopMedia::Results::Options;
using content::DesktopMediaID;
+using extensions::api::desktop_capture::ChooseDesktopMedia::Results::Options;
namespace extensions {
namespace {
const char kInvalidSourceNameError[] = "Invalid source type specified.";
-const char kEmptySourcesListError[] =
- "At least one source type must be specified.";
DesktopMediaPickerFactory* g_picker_factory = nullptr;
@@ -65,11 +64,12 @@ void DesktopCaptureChooseDesktopMediaFunctionBase::Cancel() {
// Keep reference to |this| to ensure the object doesn't get destroyed before
// we return.
scoped_refptr<DesktopCaptureChooseDesktopMediaFunctionBase> self(this);
- if (picker_) {
- picker_.reset();
- SetResultList(Create(std::string(), Options()));
- SendResponse(true);
- }
+
+ // If this picker dialog is open, this will close it.
+ picker_controller_.reset();
+
+ SetResultList(Create(std::string(), Options()));
+ SendResponse(true);
}
bool DesktopCaptureChooseDesktopMediaFunctionBase::Execute(
@@ -77,8 +77,7 @@ bool DesktopCaptureChooseDesktopMediaFunctionBase::Execute(
content::WebContents* web_contents,
const GURL& origin,
const base::string16 target_name) {
- // Register to be notified when the tab is closed.
- Observe(web_contents);
+ DCHECK(!picker_controller_);
gfx::NativeWindow parent_window = web_contents->GetTopLevelNativeWindow();
// In case of coming from background extension page, |parent_window| will
@@ -122,34 +121,20 @@ bool DesktopCaptureChooseDesktopMediaFunctionBase::Execute(
}
}
- DesktopMediaPickerFactory* picker_factory =
- g_picker_factory ? g_picker_factory
- : DesktopMediaPickerFactoryImpl::GetInstance();
- // Keep same order as the input |sources| and avoid duplicates.
- std::vector<std::unique_ptr<DesktopMediaList>> source_lists =
- picker_factory->CreateMediaList(media_types);
- if (source_lists.empty()) {
- error_ = kEmptySourcesListError;
- return false;
- }
- picker_ = picker_factory->CreatePicker();
- if (!picker_) {
- error_ = "Desktop Capture API is not yet implemented for this platform.";
- return false;
- }
-
- DesktopMediaPicker::DoneCallback callback = base::Bind(
+ DesktopMediaPickerController::DoneCallback callback = base::BindOnce(
&DesktopCaptureChooseDesktopMediaFunctionBase::OnPickerDialogResults,
- this);
- DesktopMediaPicker::Params picker_params;
+ this, origin, web_contents);
+ DesktopMediaPickerController::Params picker_params;
picker_params.web_contents = web_contents;
picker_params.context = parent_window;
picker_params.parent = parent_window;
picker_params.app_name = base::UTF8ToUTF16(GetCallerDisplayName());
picker_params.target_name = target_name;
picker_params.request_audio = request_audio;
- picker_->Show(picker_params, std::move(source_lists), callback);
- origin_ = origin;
+ picker_controller_ =
+ std::make_unique<DesktopMediaPickerController>(g_picker_factory);
+ picker_controller_->Show(picker_params, std::move(media_types),
+ std::move(callback));
return true;
}
@@ -163,23 +148,38 @@ std::string DesktopCaptureChooseDesktopMediaFunctionBase::GetCallerDisplayName()
}
}
-void DesktopCaptureChooseDesktopMediaFunctionBase::WebContentsDestroyed() {
- Cancel();
-}
-
void DesktopCaptureChooseDesktopMediaFunctionBase::OnPickerDialogResults(
+ const GURL& origin,
+ content::WebContents* web_contents,
+ const std::string& err,
DesktopMediaID source) {
+ picker_controller_.reset();
+
+ if (!err.empty()) {
+ SetError(err);
+ SendResponse(false);
+ return;
+ }
+
+ if (source.is_null()) {
+ DLOG(ERROR) << "Sending empty results.";
+ SetResultList(Create(std::string(), Options()));
+ SendResponse(true);
+ return;
+ }
+
std::string result;
- if (source.type != DesktopMediaID::TYPE_NONE && web_contents()) {
+ if (source.type != DesktopMediaID::TYPE_NONE && web_contents) {
// TODO(miu): Once render_frame_host() is being set, we should register the
// exact RenderFrame requesting the stream, not the main RenderFrame. With
// that change, also update
// MediaCaptureDevicesDispatcher::ProcessDesktopCaptureAccessRequest().
// http://crbug.com/304341
- content::RenderFrameHost* const main_frame = web_contents()->GetMainFrame();
+ content::RenderFrameHost* const main_frame = web_contents->GetMainFrame();
result = content::DesktopStreamsRegistry::GetInstance()->RegisterStream(
- main_frame->GetProcess()->GetID(), main_frame->GetRoutingID(), origin_,
- source, extension()->name(), content::kRegistryStreamTypeDesktop);
+ main_frame->GetProcess()->GetID(), main_frame->GetRoutingID(),
+ url::Origin::Create(origin), source, extension()->name(),
+ content::kRegistryStreamTypeDesktop);
}
Options options;