Index: content/browser/renderer_host/render_widget_resize_helper.cc |
diff --git a/content/browser/renderer_host/render_widget_resize_helper.cc b/content/browser/renderer_host/render_widget_resize_helper.cc |
index f5e6ff5317f3301c27d90ea16231a87362fdf2d3..421c2fa256f458c185ccd815b8c1fee153f74b77 100644 |
--- a/content/browser/renderer_host/render_widget_resize_helper.cc |
+++ b/content/browser/renderer_host/render_widget_resize_helper.cc |
@@ -34,6 +34,9 @@ class RenderWidgetResizeHelper::EnqueuedTask { |
int process_id_; |
IPC::Message message_; |
bool has_run_; |
+ |
+ // Back-pointer to the ResizeHelper which has this task in its queue. Set |
+ // to NULL when this task is removed from the queue. |
RenderWidgetResizeHelper* helper_; |
DISALLOW_COPY_AND_ASSIGN(EnqueuedTask); |
@@ -51,6 +54,12 @@ RenderWidgetResizeHelper::EnqueuedTask::EnqueuedTask( |
} |
RenderWidgetResizeHelper::EnqueuedTask::~EnqueuedTask() { |
+ // Note that if the MessageLoop into which this task was posted is destroyed |
+ // before the RenderWidgetResizeHelper, then the helper's list of tasks will |
+ // point to freed data. Avoid this by removing tasks when they are freed, if |
+ // they weren't already removed when they were run. |
+ if (helper_) |
+ helper_->RemoveEnqueuedTaskFromQueue(this); |
} |
void RenderWidgetResizeHelper::EnqueuedTask::Run() { |
@@ -58,7 +67,7 @@ void RenderWidgetResizeHelper::EnqueuedTask::Run() { |
return; |
if (helper_) |
- helper_->WillRunEnqueuedTask(this); |
+ helper_->RemoveEnqueuedTaskFromQueue(this); |
has_run_ = true; |
switch (type_) { |
@@ -133,10 +142,11 @@ void RenderWidgetResizeHelper::PostEnqueuedTask(EnqueuedTask* task) { |
base::Bind(&EnqueuedTask::Run, base::Owned(task))); |
} |
-void RenderWidgetResizeHelper::WillRunEnqueuedTask(EnqueuedTask* task) { |
+void RenderWidgetResizeHelper::RemoveEnqueuedTaskFromQueue(EnqueuedTask* task) { |
base::AutoLock lock(task_queue_lock_); |
DCHECK(task_queue_.front() == task); |
task_queue_.pop_front(); |
+ task->InvalidateHelper(); |
} |
void RenderWidgetResizeHelper::PostRendererProcessMsg( |