summaryrefslogtreecommitdiffstats
path: root/chromium/chrome/browser/extensions/api/desktop_capture
diff options
context:
space:
mode:
Diffstat (limited to 'chromium/chrome/browser/extensions/api/desktop_capture')
-rw-r--r--chromium/chrome/browser/extensions/api/desktop_capture/desktop_capture_base.cc78
-rw-r--r--chromium/chrome/browser/extensions/api/desktop_capture/desktop_capture_base.h32
2 files changed, 52 insertions, 58 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;
diff --git a/chromium/chrome/browser/extensions/api/desktop_capture/desktop_capture_base.h b/chromium/chrome/browser/extensions/api/desktop_capture/desktop_capture_base.h
index 798348f9e7a..80232e13338 100644
--- a/chromium/chrome/browser/extensions/api/desktop_capture/desktop_capture_base.h
+++ b/chromium/chrome/browser/extensions/api/desktop_capture/desktop_capture_base.h
@@ -7,23 +7,22 @@
#include <array>
#include <map>
+#include <memory>
#include <string>
#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.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 "content/public/browser/web_contents_observer.h"
#include "url/gurl.h"
namespace extensions {
class DesktopCaptureChooseDesktopMediaFunctionBase
- : public ChromeAsyncExtensionFunction,
- public content::WebContentsObserver {
+ : public ChromeAsyncExtensionFunction {
public:
// Used to set PickerFactory used to create mock DesktopMediaPicker instances
// for tests. Calling tests keep ownership of the factory. Can be called with
@@ -41,12 +40,11 @@ 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);
+ bool 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;
@@ -54,16 +52,12 @@ class DesktopCaptureChooseDesktopMediaFunctionBase
int request_id_;
private:
- // content::WebContentsObserver overrides.
- void WebContentsDestroyed() override;
+ void OnPickerDialogResults(const GURL& origin,
+ content::WebContents* web_contents,
+ const std::string& err,
+ content::DesktopMediaID source);
- void OnPickerDialogResults(content::DesktopMediaID source);
-
- // URL of page that desktop capture was requested for.
- GURL origin_;
-
- std::unique_ptr<DesktopMediaPickerFactory> picker_factory_;
- std::unique_ptr<DesktopMediaPicker> picker_;
+ std::unique_ptr<DesktopMediaPickerController> picker_controller_;
};
class DesktopCaptureCancelChooseDesktopMediaFunctionBase