| 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( | 
|  |