Chromium Code Reviews| Index: chrome/browser/automation/automation_resource_message_filter.cc |
| =================================================================== |
| --- chrome/browser/automation/automation_resource_message_filter.cc (revision 53631) |
| +++ chrome/browser/automation/automation_resource_message_filter.cc (working copy) |
| @@ -13,6 +13,7 @@ |
| #include "chrome/browser/net/url_request_mock_util.h" |
| #include "chrome/browser/net/url_request_slow_download_job.h" |
| #include "chrome/browser/net/url_request_slow_http_job.h" |
| +#include "chrome/browser/renderer_host/resource_message_filter.h" |
| #include "chrome/common/chrome_paths.h" |
| #include "chrome/browser/chrome_thread.h" |
| #include "chrome/test/automation/automation_messages.h" |
| @@ -21,14 +22,24 @@ |
| #include "net/base/net_errors.h" |
| #include "net/url_request/url_request_filter.h" |
| -AutomationResourceMessageFilter::RenderViewMap |
| - AutomationResourceMessageFilter::filtered_render_views_; |
| +base::LazyInstance<AutomationResourceMessageFilter::RenderViewMap> |
| + AutomationResourceMessageFilter::filtered_render_views_( |
| + base::LINKER_INITIALIZED); |
| +base::LazyInstance<AutomationResourceMessageFilter::CompletionCallbackMap> |
| + AutomationResourceMessageFilter::completion_callback_map_( |
| + base::LINKER_INITIALIZED); |
| + |
| int AutomationResourceMessageFilter::unique_request_id_ = 1; |
| +int AutomationResourceMessageFilter::next_completion_callback_id_ = 0; |
| AutomationResourceMessageFilter::AutomationResourceMessageFilter() |
| - : channel_(NULL), |
| - next_completion_callback_id_(0) { |
| + : channel_(NULL) { |
| + // Ensure that an instance of the callback map is created. |
| + completion_callback_map_.Get(); |
| + // Ensure that an instance of the render view map is created. |
| + filtered_render_views_.Get(); |
| + |
| ChromeThread::PostTask( |
| ChromeThread::IO, FROM_HERE, |
| NewRunnableFunction( |
| @@ -59,11 +70,11 @@ |
| // Only erase RenderViews which are associated with this |
| // AutomationResourceMessageFilter instance. |
| - RenderViewMap::iterator index = filtered_render_views_.begin(); |
| - while (index != filtered_render_views_.end()) { |
| + RenderViewMap::iterator index = filtered_render_views_.Get().begin(); |
| + while (index != filtered_render_views_.Get().end()) { |
| const AutomationDetails& details = (*index).second; |
| if (details.filter.get() == this) { |
| - filtered_render_views_.erase(index++); |
| + filtered_render_views_.Get().erase(index++); |
| } else { |
| index++; |
| } |
| @@ -200,12 +211,13 @@ |
| int tab_handle, AutomationResourceMessageFilter* filter, |
| bool pending_view) { |
| RenderViewMap::iterator automation_details_iter( |
| - filtered_render_views_.find(RendererId(renderer_pid, renderer_id))); |
| - if (automation_details_iter != filtered_render_views_.end()) { |
| + filtered_render_views_.Get().find(RendererId(renderer_pid, |
| + renderer_id))); |
| + if (automation_details_iter != filtered_render_views_.Get().end()) { |
| DCHECK(automation_details_iter->second.ref_count > 0); |
| automation_details_iter->second.ref_count++; |
| } else { |
| - filtered_render_views_[RendererId(renderer_pid, renderer_id)] = |
| + filtered_render_views_.Get()[RendererId(renderer_pid, renderer_id)] = |
| AutomationDetails(tab_handle, filter, pending_view); |
| } |
| } |
| @@ -214,9 +226,10 @@ |
| void AutomationResourceMessageFilter::UnRegisterRenderViewInIOThread( |
| int renderer_pid, int renderer_id) { |
| RenderViewMap::iterator automation_details_iter( |
| - filtered_render_views_.find(RendererId(renderer_pid, renderer_id))); |
| + filtered_render_views_.Get().find(RendererId(renderer_pid, |
| + renderer_id))); |
| - if (automation_details_iter == filtered_render_views_.end()) { |
| + if (automation_details_iter == filtered_render_views_.Get().end()) { |
| LOG(INFO) << "UnRegisterRenderViewInIOThread: already unregistered"; |
| return; |
| } |
| @@ -224,7 +237,7 @@ |
| automation_details_iter->second.ref_count--; |
| if (automation_details_iter->second.ref_count <= 0) { |
| - filtered_render_views_.erase(RendererId(renderer_pid, renderer_id)); |
| + filtered_render_views_.Get().erase(RendererId(renderer_pid, renderer_id)); |
| } |
| } |
| @@ -235,9 +248,10 @@ |
| DCHECK(ChromeThread::CurrentlyOn(ChromeThread::IO)); |
| RenderViewMap::iterator automation_details_iter( |
| - filtered_render_views_.find(RendererId(renderer_pid, renderer_id))); |
| + filtered_render_views_.Get().find(RendererId(renderer_pid, |
| + renderer_id))); |
| - if (automation_details_iter == filtered_render_views_.end()) { |
| + if (automation_details_iter == filtered_render_views_.Get().end()) { |
| NOTREACHED() << "Failed to find pending view for renderer pid:" |
| << renderer_pid |
| << ", render view id:" |
| @@ -251,7 +265,7 @@ |
| automation_details_iter->second.filter; |
| DCHECK(old_filter != NULL); |
| - filtered_render_views_[RendererId(renderer_pid, renderer_id)] = |
| + filtered_render_views_.Get()[RendererId(renderer_pid, renderer_id)] = |
| AutomationDetails(tab_handle, filter, false); |
| ResumeJobsForPendingView(tab_handle, old_filter, filter); |
| @@ -261,9 +275,9 @@ |
| bool AutomationResourceMessageFilter::LookupRegisteredRenderView( |
| int renderer_pid, int renderer_id, AutomationDetails* details) { |
| bool found = false; |
| - RenderViewMap::iterator it = filtered_render_views_.find(RendererId( |
| + RenderViewMap::iterator it = filtered_render_views_.Get().find(RendererId( |
| renderer_pid, renderer_id)); |
| - if (it != filtered_render_views_.end()) { |
| + if (it != filtered_render_views_.Get().end()) { |
| found = true; |
| if (details) |
| *details = it->second; |
| @@ -325,32 +339,46 @@ |
| DCHECK(callback != NULL); |
| DCHECK(cookie_store != NULL); |
| + GetCookiesCompletion* get_cookies_callback = |
| + static_cast<GetCookiesCompletion*>(callback); |
| + |
| + RenderViewMap::iterator automation_details_iter( |
| + filtered_render_views_.Get().find(RendererId( |
| + get_cookies_callback->render_process_id(), |
| + get_cookies_callback->render_view_id()))); |
|
Jeff Timanus
2010/07/27 18:14:12
Nit: 4 space indents.
|
| + |
| + DCHECK(automation_details_iter->second.filter != NULL); |
| + |
| int completion_callback_id = GetNextCompletionCallbackId(); |
| - DCHECK(!ContainsKey(completion_callback_map_, completion_callback_id)); |
| + DCHECK(!ContainsKey(completion_callback_map_.Get(), completion_callback_id)); |
| CookieCompletionInfo cookie_info; |
| cookie_info.completion_callback = callback; |
| cookie_info.cookie_store = cookie_store; |
| - completion_callback_map_[completion_callback_id] = cookie_info; |
| + completion_callback_map_.Get()[completion_callback_id] = cookie_info; |
| - Send(new AutomationMsg_GetCookiesFromHost(0, tab_handle, url, |
| - completion_callback_id)); |
| + if (automation_details_iter->second.filter) { |
| + automation_details_iter->second.filter->Send( |
| + new AutomationMsg_GetCookiesFromHost( |
| + 0, automation_details_iter->second.tab_handle, url, |
| + completion_callback_id)); |
| + } |
| } |
| void AutomationResourceMessageFilter::OnGetCookiesHostResponse( |
| int tab_handle, bool success, const GURL& url, const std::string& cookies, |
| int cookie_id) { |
| CompletionCallbackMap::iterator index = |
| - completion_callback_map_.find(cookie_id); |
| - if (index != completion_callback_map_.end()) { |
| + completion_callback_map_.Get().find(cookie_id); |
| + if (index != completion_callback_map_.Get().end()) { |
| net::CompletionCallback* callback = index->second.completion_callback; |
| scoped_refptr<net::CookieStore> cookie_store = index->second.cookie_store; |
| DCHECK(callback != NULL); |
| DCHECK(cookie_store.get() != NULL); |
| - completion_callback_map_.erase(index); |
| + completion_callback_map_.Get().erase(index); |
| // Set the cookie in the cookie store so that the callback can read it. |
| cookie_store->SetCookieWithOptions(url, cookies, net::CookieOptions()); |
| @@ -367,6 +395,25 @@ |
| } |
| } |
| +void AutomationResourceMessageFilter::SetCookiesForUrl( |
| + int tab_handle, const GURL&url, const std::string& cookie_line, |
| + net::CompletionCallback* callback) { |
| + SetCookieCompletion* set_cookies_callback = |
| + static_cast<SetCookieCompletion*>(callback); |
| + |
| + RenderViewMap::iterator automation_details_iter( |
| + filtered_render_views_.Get().find(RendererId( |
| + set_cookies_callback->render_process_id(), |
| + set_cookies_callback->render_view_id()))); |
| + |
| + DCHECK(automation_details_iter->second.filter != NULL); |
| + |
| + if (automation_details_iter->second.filter) { |
| + automation_details_iter->second.filter->Send( |
| + new AutomationMsg_SetCookieAsync(0, tab_handle, url, cookie_line)); |
| + } |
| +} |
| + |
| // static |
| void AutomationResourceMessageFilter::ResumeJobsForPendingView( |
| int tab_handle, |