Chromium Code Reviews| 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( |