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..2038431b0c6fc01f02eaf21fb65de0a699b77a89 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->helper_ = NULL; |
groby-ooo-7-16
2014/07/18 18:22:47
task->InvalidateHelper() instead?
ccameron
2014/07/18 18:40:27
Yup (no goma on the bus => trybots faster to compi
|
} |
void RenderWidgetResizeHelper::PostRendererProcessMsg( |