summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--chrome/browser/automation/automation_resource_message_filter.cc29
-rw-r--r--chrome/browser/automation/automation_resource_message_filter.h5
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;
};