Commit cc9f23b6 authored by Evan Stade's avatar Evan Stade Committed by Commit Bot

WebLayer: fix crash in MediaStreamUi

If the MediaStreamManager were destroyed after a MediaStreamUi was
created but before it started recording, it wouldn't call OnManagerGone
on the MediaStreamUi.

Switch to using a WeakPtr.

Bug: 1147646
Change-Id: I72010ed73daa26c4f682e2779efe046d1ddb2020
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/2532966Reviewed-by: default avatarClark DuVall <cduvall@chromium.org>
Commit-Queue: Evan Stade <estade@chromium.org>
Cr-Commit-Position: refs/heads/master@{#826454}
parent 2ac42c3d
...@@ -41,7 +41,7 @@ void FindStreamTypes(const blink::MediaStreamDevices& devices, ...@@ -41,7 +41,7 @@ void FindStreamTypes(const blink::MediaStreamDevices& devices,
// is passed off to MediaResponseCallback. // is passed off to MediaResponseCallback.
class MediaStreamManager::StreamUi : public content::MediaStreamUI { class MediaStreamManager::StreamUi : public content::MediaStreamUI {
public: public:
StreamUi(MediaStreamManager* manager, StreamUi(base::WeakPtr<MediaStreamManager> manager,
const blink::MediaStreamDevices& devices) const blink::MediaStreamDevices& devices)
: manager_(manager) { : manager_(manager) {
DCHECK(manager_); DCHECK(manager_);
...@@ -70,8 +70,6 @@ class MediaStreamManager::StreamUi : public content::MediaStreamUI { ...@@ -70,8 +70,6 @@ class MediaStreamManager::StreamUi : public content::MediaStreamUI {
void OnDeviceStopped(const std::string& label, void OnDeviceStopped(const std::string& label,
const content::DesktopMediaID& media_id) override {} const content::DesktopMediaID& media_id) override {}
void OnManagerGone() { manager_ = nullptr; }
bool streaming_audio() const { return streaming_audio_; } bool streaming_audio() const { return streaming_audio_; }
bool streaming_video() const { return streaming_video_; } bool streaming_video() const { return streaming_video_; }
...@@ -79,7 +77,7 @@ class MediaStreamManager::StreamUi : public content::MediaStreamUI { ...@@ -79,7 +77,7 @@ class MediaStreamManager::StreamUi : public content::MediaStreamUI {
void Stop() { std::move(stop_).Run(); } void Stop() { std::move(stop_).Run(); }
private: private:
MediaStreamManager* manager_; base::WeakPtr<MediaStreamManager> manager_;
bool streaming_audio_ = false; bool streaming_audio_ = false;
bool streaming_video_ = false; bool streaming_video_ = false;
base::OnceClosure stop_; base::OnceClosure stop_;
...@@ -95,10 +93,7 @@ MediaStreamManager::MediaStreamManager( ...@@ -95,10 +93,7 @@ MediaStreamManager::MediaStreamManager(
->SetUserData(&kWebContentsUserDataKey, std::move(user_data)); ->SetUserData(&kWebContentsUserDataKey, std::move(user_data));
} }
MediaStreamManager::~MediaStreamManager() { MediaStreamManager::~MediaStreamManager() = default;
for (auto* stream : active_streams_)
stream->OnManagerGone();
}
// static // static
MediaStreamManager* MediaStreamManager::FromWebContents( MediaStreamManager* MediaStreamManager::FromWebContents(
...@@ -127,7 +122,8 @@ void MediaStreamManager::OnClientReadyToStream(JNIEnv* env, ...@@ -127,7 +122,8 @@ void MediaStreamManager::OnClientReadyToStream(JNIEnv* env,
if (allowed) { if (allowed) {
std::move(request->second.callback) std::move(request->second.callback)
.Run(request->second.devices, request->second.result, .Run(request->second.devices, request->second.result,
std::make_unique<StreamUi>(this, request->second.devices)); std::make_unique<StreamUi>(weak_factory_.GetWeakPtr(),
request->second.devices));
} else { } else {
std::move(request->second.callback) std::move(request->second.callback)
.Run({}, blink::mojom::MediaStreamRequestResult::NO_HARDWARE, {}); .Run({}, blink::mojom::MediaStreamRequestResult::NO_HARDWARE, {});
......
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