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,
// is passed off to MediaResponseCallback.
class MediaStreamManager::StreamUi : public content::MediaStreamUI {
public:
StreamUi(MediaStreamManager* manager,
StreamUi(base::WeakPtr<MediaStreamManager> manager,
const blink::MediaStreamDevices& devices)
: manager_(manager) {
DCHECK(manager_);
......@@ -70,8 +70,6 @@ class MediaStreamManager::StreamUi : public content::MediaStreamUI {
void OnDeviceStopped(const std::string& label,
const content::DesktopMediaID& media_id) override {}
void OnManagerGone() { manager_ = nullptr; }
bool streaming_audio() const { return streaming_audio_; }
bool streaming_video() const { return streaming_video_; }
......@@ -79,7 +77,7 @@ class MediaStreamManager::StreamUi : public content::MediaStreamUI {
void Stop() { std::move(stop_).Run(); }
private:
MediaStreamManager* manager_;
base::WeakPtr<MediaStreamManager> manager_;
bool streaming_audio_ = false;
bool streaming_video_ = false;
base::OnceClosure stop_;
......@@ -95,10 +93,7 @@ MediaStreamManager::MediaStreamManager(
->SetUserData(&kWebContentsUserDataKey, std::move(user_data));
}
MediaStreamManager::~MediaStreamManager() {
for (auto* stream : active_streams_)
stream->OnManagerGone();
}
MediaStreamManager::~MediaStreamManager() = default;
// static
MediaStreamManager* MediaStreamManager::FromWebContents(
......@@ -127,7 +122,8 @@ void MediaStreamManager::OnClientReadyToStream(JNIEnv* env,
if (allowed) {
std::move(request->second.callback)
.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 {
std::move(request->second.callback)
.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