| Index: content/renderer/media/render_media_log.cc
|
| diff --git a/content/renderer/media/render_media_log.cc b/content/renderer/media/render_media_log.cc
|
| index 1169f685b5a81ec6885ef39e92a8cb96195c0301..981e38d823fc342be2ec23ba13c3eecfa1b58f48 100644
|
| --- a/content/renderer/media/render_media_log.cc
|
| +++ b/content/renderer/media/render_media_log.cc
|
| @@ -47,9 +47,23 @@ RenderMediaLog::RenderMediaLog(const GURL& security_origin)
|
| task_runner_(base::ThreadTaskRunnerHandle::Get()),
|
| tick_clock_(new base::DefaultTickClock()),
|
| last_ipc_send_time_(tick_clock_->NowTicks()),
|
| - ipc_send_pending_(false) {
|
| + ipc_send_pending_(false),
|
| + weak_factory_(this) {
|
| DCHECK(RenderThread::Get())
|
| << "RenderMediaLog must be constructed on the render thread";
|
| + // Pre-bind the WeakPtr on the right thread since we'll receive calls from
|
| + // other threads and don't want races.
|
| + weak_this_ = weak_factory_.GetWeakPtr();
|
| +}
|
| +
|
| +RenderMediaLog::~RenderMediaLog() {
|
| + DCHECK(task_runner_->BelongsToCurrentThread());
|
| +
|
| + // There's no further chance to handle this, so send them now. This should not
|
| + // be racy since nothing should have a pointer to the media log on another
|
| + // thread by this point.
|
| + if (ipc_send_pending_)
|
| + SendQueuedMediaEvents();
|
| }
|
|
|
| void RenderMediaLog::AddEvent(std::unique_ptr<media::MediaLogEvent> event) {
|
| @@ -104,7 +118,8 @@ void RenderMediaLog::AddEvent(std::unique_ptr<media::MediaLogEvent> event) {
|
|
|
| if (delay_for_next_ipc_send > base::TimeDelta()) {
|
| task_runner_->PostDelayedTask(
|
| - FROM_HERE, base::Bind(&RenderMediaLog::SendQueuedMediaEvents, this),
|
| + FROM_HERE,
|
| + base::Bind(&RenderMediaLog::SendQueuedMediaEvents, weak_this_),
|
| delay_for_next_ipc_send);
|
| return;
|
| }
|
| @@ -115,7 +130,8 @@ void RenderMediaLog::AddEvent(std::unique_ptr<media::MediaLogEvent> event) {
|
| return;
|
| }
|
| task_runner_->PostTask(
|
| - FROM_HERE, base::Bind(&RenderMediaLog::SendQueuedMediaEvents, this));
|
| + FROM_HERE,
|
| + base::Bind(&RenderMediaLog::SendQueuedMediaEvents, weak_this_));
|
| }
|
|
|
| std::string RenderMediaLog::GetLastErrorMessage() {
|
| @@ -137,7 +153,7 @@ void RenderMediaLog::RecordRapporWithSecurityOrigin(const std::string& metric) {
|
| if (!task_runner_->BelongsToCurrentThread()) {
|
| task_runner_->PostTask(
|
| FROM_HERE, base::Bind(&RenderMediaLog::RecordRapporWithSecurityOrigin,
|
| - this, metric));
|
| + weak_this_, metric));
|
| return;
|
| }
|
|
|
| @@ -168,10 +184,10 @@ void RenderMediaLog::SendQueuedMediaEvents() {
|
| last_ipc_send_time_ = tick_clock_->NowTicks();
|
| }
|
|
|
| - RenderThread::Get()->Send(new ViewHostMsg_MediaLogEvents(events_to_send));
|
| -}
|
| + if (events_to_send.empty())
|
| + return;
|
|
|
| -RenderMediaLog::~RenderMediaLog() {
|
| + RenderThread::Get()->Send(new ViewHostMsg_MediaLogEvents(events_to_send));
|
| }
|
|
|
| void RenderMediaLog::SetTickClockForTesting(
|
|
|