diff options
-rw-r--r-- | chrome/browser/automation/automation_resource_message_filter.cc | 29 | ||||
-rw-r--r-- | chrome/browser/automation/automation_resource_message_filter.h | 5 |
2 files changed, 25 insertions, 9 deletions
diff --git a/chrome/browser/automation/automation_resource_message_filter.cc b/chrome/browser/automation/automation_resource_message_filter.cc index 46ee1e8..8404403 100644 --- a/chrome/browser/automation/automation_resource_message_filter.cc +++ b/chrome/browser/automation/automation_resource_message_filter.cc @@ -133,17 +133,32 @@ void AutomationResourceMessageFilter::UnRegisterRenderView( void AutomationResourceMessageFilter::RegisterRenderViewInIOThread( int renderer_pid, int renderer_id, int tab_handle, AutomationResourceMessageFilter* filter) { - DCHECK(filtered_render_views_.find(RendererId(renderer_pid, renderer_id)) == - filtered_render_views_.end()); - filtered_render_views_[RendererId(renderer_pid, renderer_id)] = - AutomationDetails(tab_handle, filter); + RenderViewMap::iterator automation_details_iter( + filtered_render_views_.find(RendererId(renderer_pid, renderer_id))); + if (automation_details_iter != filtered_render_views_.end()) { + DCHECK(automation_details_iter->second.ref_count > 0); + automation_details_iter->second.ref_count++; + } else { + filtered_render_views_[RendererId(renderer_pid, renderer_id)] = + AutomationDetails(tab_handle, filter); + } } void AutomationResourceMessageFilter::UnRegisterRenderViewInIOThread( int renderer_pid, int renderer_id) { - DCHECK(filtered_render_views_.find(RendererId(renderer_pid, renderer_id)) != - filtered_render_views_.end()); - filtered_render_views_.erase(RendererId(renderer_pid, renderer_id)); + RenderViewMap::iterator automation_details_iter( + filtered_render_views_.find(RendererId(renderer_pid, renderer_id))); + + if (automation_details_iter == filtered_render_views_.end()) { + NOTREACHED(); + return; + } + + automation_details_iter->second.ref_count--; + + if (automation_details_iter->second.ref_count <= 0) { + filtered_render_views_.erase(RendererId(renderer_pid, renderer_id)); + } } bool AutomationResourceMessageFilter::LookupRegisteredRenderView( diff --git a/chrome/browser/automation/automation_resource_message_filter.h b/chrome/browser/automation/automation_resource_message_filter.h index ebd6464..dd802e6 100644 --- a/chrome/browser/automation/automation_resource_message_filter.h +++ b/chrome/browser/automation/automation_resource_message_filter.h @@ -25,12 +25,13 @@ class AutomationResourceMessageFilter public: // Information needed to send IPCs through automation. struct AutomationDetails { - AutomationDetails() : tab_handle(0) {} + AutomationDetails() : tab_handle(0), ref_count(1) {} AutomationDetails(int tab, AutomationResourceMessageFilter* flt) - : tab_handle(tab), filter(flt) { + : tab_handle(tab), ref_count(1), filter(flt) { } int tab_handle; + int ref_count; scoped_refptr<AutomationResourceMessageFilter> filter; }; |