13345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick// Copyright (c) 2010 The Chromium Authors. All rights reserved. 2c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Use of this source code is governed by a BSD-style license that can be 3c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// found in the LICENSE file. 4c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 5c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "chrome/browser/automation/automation_resource_message_filter.h" 6c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 7c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "base/path_service.h" 8731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick#include "base/metrics/histogram.h" 9c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "base/stl_util-inl.h" 10c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "chrome/browser/automation/url_request_automation_job.h" 11c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "chrome/browser/net/url_request_failed_dns_job.h" 12c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "chrome/browser/net/url_request_mock_http_job.h" 13c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "chrome/browser/net/url_request_mock_util.h" 14c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "chrome/browser/net/url_request_slow_download_job.h" 15c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "chrome/browser/net/url_request_slow_http_job.h" 164a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch#include "chrome/common/automation_messages.h" 17c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "chrome/common/chrome_paths.h" 18dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen#include "content/browser/browser_thread.h" 19dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen#include "content/browser/renderer_host/render_message_filter.h" 20c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "googleurl/src/gurl.h" 21c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "net/base/net_errors.h" 22c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "net/url_request/url_request_filter.h" 23c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 243345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrickbase::LazyInstance<AutomationResourceMessageFilter::RenderViewMap> 253345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick AutomationResourceMessageFilter::filtered_render_views_( 263345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick base::LINKER_INITIALIZED); 273345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick 283345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrickbase::LazyInstance<AutomationResourceMessageFilter::CompletionCallbackMap> 293345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick AutomationResourceMessageFilter::completion_callback_map_( 303345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick base::LINKER_INITIALIZED); 31c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 32c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochint AutomationResourceMessageFilter::unique_request_id_ = 1; 333345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrickint AutomationResourceMessageFilter::next_completion_callback_id_ = 0; 343345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick 353345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick// CookieStore specialization to enable fetching and setting cookies over the 363345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick// automation channel. This cookie store is transient i.e. it maintains cookies 373345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick// for the duration of the current request to set or get cookies from the 383345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick// renderer. 393345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrickclass AutomationCookieStore : public net::CookieStore { 403345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick public: 413345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick AutomationCookieStore(AutomationResourceMessageFilter* automation_client, 423345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick int tab_handle) 433345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick : automation_client_(automation_client), 443345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick tab_handle_(tab_handle) { 453345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick } 463345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick 473345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick virtual ~AutomationCookieStore() { 48513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch DVLOG(1) << "In " << __FUNCTION__; 493345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick } 503345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick 513345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick // CookieStore implementation. 523345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick virtual bool SetCookieWithOptions(const GURL& url, 533345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick const std::string& cookie_line, 543345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick const net::CookieOptions& options) { 553345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick // The cookie_string_ is available only once, i.e. once it is read by 563345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick // it is invalidated. 573345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick cookie_string_ = cookie_line; 583345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick return true; 593345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick } 603345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick 613345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick virtual std::string GetCookiesWithOptions(const GURL& url, 623345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick const net::CookieOptions& options) { 633345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick return cookie_string_; 643345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick } 653345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick 663345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick virtual void DeleteCookie(const GURL& url, 673345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick const std::string& cookie_name) { 683345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick NOTREACHED() << "Should not get called for an automation profile"; 693345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick } 703345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick 713345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick virtual net::CookieMonster* GetCookieMonster() { 723345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick NOTREACHED() << "Should not get called for an automation profile"; 733345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick return NULL; 743345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick } 753345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick 763345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick protected: 773345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick scoped_refptr<AutomationResourceMessageFilter> automation_client_; 783345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick int tab_handle_; 793345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick std::string cookie_string_; 803345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick 813345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick private: 823345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick DISALLOW_COPY_AND_ASSIGN(AutomationCookieStore); 833345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick}; 843345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick 85731df977c0511bca2206b5f333555b1205ff1f43Iain MerrickAutomationResourceMessageFilter::AutomationDetails::AutomationDetails() 86731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick : tab_handle(0), 87731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick ref_count(1), 88731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick is_pending_render_view(false) { 89731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick} 90731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick 91731df977c0511bca2206b5f333555b1205ff1f43Iain MerrickAutomationResourceMessageFilter::AutomationDetails::AutomationDetails( 92731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick int tab, 93731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick AutomationResourceMessageFilter* flt, 94731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick bool pending_view) 95731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick : tab_handle(tab), ref_count(1), filter(flt), 96731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick is_pending_render_view(pending_view) { 97731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick} 98731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick 99731df977c0511bca2206b5f333555b1205ff1f43Iain MerrickAutomationResourceMessageFilter::AutomationDetails::~AutomationDetails() {} 100731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick 101731df977c0511bca2206b5f333555b1205ff1f43Iain Merrickstruct AutomationResourceMessageFilter::CookieCompletionInfo { 102731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick net::CompletionCallback* completion_callback; 103731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick scoped_refptr<net::CookieStore> cookie_store; 104731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick}; 105c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 106c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochAutomationResourceMessageFilter::AutomationResourceMessageFilter() 107c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch : channel_(NULL) { 1083345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick // Ensure that an instance of the callback map is created. 1093345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick completion_callback_map_.Get(); 1103345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick // Ensure that an instance of the render view map is created. 1113345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick filtered_render_views_.Get(); 1123345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick 113731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick BrowserThread::PostTask( 114731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick BrowserThread::IO, FROM_HERE, 115c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch NewRunnableFunction( 116c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch URLRequestAutomationJob::EnsureProtocolFactoryRegistered)); 117c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 118c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 119c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochAutomationResourceMessageFilter::~AutomationResourceMessageFilter() { 120c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 121c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 122c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Called on the IPC thread: 123c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochvoid AutomationResourceMessageFilter::OnFilterAdded(IPC::Channel* channel) { 124dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen DCHECK(!channel_); 125c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch channel_ = channel; 126c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 127c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 128c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochvoid AutomationResourceMessageFilter::OnFilterRemoved() { 129c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch channel_ = NULL; 130c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 131c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 132c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Called on the IPC thread: 133c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochvoid AutomationResourceMessageFilter::OnChannelConnected(int32 peer_pid) { 134c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 135c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 136c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Called on the IPC thread: 137c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochvoid AutomationResourceMessageFilter::OnChannelClosing() { 138c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch channel_ = NULL; 139c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch request_map_.clear(); 140c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 141c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Only erase RenderViews which are associated with this 142c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // AutomationResourceMessageFilter instance. 1433345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick RenderViewMap::iterator index = filtered_render_views_.Get().begin(); 1443345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick while (index != filtered_render_views_.Get().end()) { 145c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch const AutomationDetails& details = (*index).second; 146c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch if (details.filter.get() == this) { 1473345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick filtered_render_views_.Get().erase(index++); 148c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch } else { 149c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch index++; 150c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch } 151c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch } 152c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 153c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 154c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Called on the IPC thread: 155c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochbool AutomationResourceMessageFilter::OnMessageReceived( 156c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch const IPC::Message& message) { 157c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch int request_id; 158c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch if (URLRequestAutomationJob::MayFilterMessage(message, &request_id)) { 159c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch RequestMap::iterator it = request_map_.find(request_id); 160c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch if (it != request_map_.end()) { 161c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch URLRequestAutomationJob* job = it->second; 162c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch DCHECK(job); 163c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch if (job) { 164c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch job->OnMessage(message); 165c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch return true; 166c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch } 167731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick } else { 168731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick // This could occur if the request was stopped from Chrome which would 169731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick // delete it from the request map. If we receive data for this request 170731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick // from the host we should ignore it. 171731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick LOG(ERROR) << "Failed to find request id:" << request_id; 172731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick return true; 173c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch } 174c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch } 175c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 176c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch bool handled = true; 177c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch IPC_BEGIN_MESSAGE_MAP(AutomationResourceMessageFilter, message) 178c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch IPC_MESSAGE_HANDLER(AutomationMsg_SetFilteredInet, 179c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch OnSetFilteredInet) 180c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch IPC_MESSAGE_HANDLER(AutomationMsg_GetFilteredInetHitCount, 181c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch OnGetFilteredInetHitCount) 182c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch IPC_MESSAGE_HANDLER(AutomationMsg_RecordHistograms, 183c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch OnRecordHistograms) 184c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch IPC_MESSAGE_HANDLER(AutomationMsg_GetCookiesHostResponse, 185c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch OnGetCookiesHostResponse) 186c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch IPC_MESSAGE_UNHANDLED(handled = false) 187c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch IPC_END_MESSAGE_MAP() 188c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 189c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch return handled; 190c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 191c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 192c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Called on the IPC thread: 193c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochbool AutomationResourceMessageFilter::Send(IPC::Message* message) { 194c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // This has to be called on the IO thread. 195731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); 196c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch if (!channel_) { 197c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch delete message; 198c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch return false; 199c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch } 200c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 201c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch return channel_->Send(message); 202c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 203c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 204c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochbool AutomationResourceMessageFilter::RegisterRequest( 205c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch URLRequestAutomationJob* job) { 206c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch if (!job) { 207c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch NOTREACHED(); 208c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch return false; 209c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch } 210731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); 211c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 212c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Register pending jobs in the pending request map for servicing later. 213c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch if (job->is_pending()) { 214c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch DCHECK(!ContainsKey(pending_request_map_, job->id())); 215c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch DCHECK(!ContainsKey(request_map_, job->id())); 216c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch pending_request_map_[job->id()] = job; 217c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch } else { 218c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch DCHECK(!ContainsKey(request_map_, job->id())); 219c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch DCHECK(!ContainsKey(pending_request_map_, job->id())); 220c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch request_map_[job->id()] = job; 221c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch } 222c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 223c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch return true; 224c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 225c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 226c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochvoid AutomationResourceMessageFilter::UnRegisterRequest( 227c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch URLRequestAutomationJob* job) { 228c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch if (!job) { 229c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch NOTREACHED(); 230c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch return; 231c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch } 232731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); 233c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 234c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch if (job->is_pending()) { 235c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch DCHECK(ContainsKey(pending_request_map_, job->id())); 236c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch pending_request_map_.erase(job->id()); 237c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch } else { 238c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch request_map_.erase(job->id()); 239c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch } 240c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 241c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 242c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochbool AutomationResourceMessageFilter::RegisterRenderView( 243c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch int renderer_pid, int renderer_id, int tab_handle, 244c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch AutomationResourceMessageFilter* filter, 245c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch bool pending_view) { 246c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch if (!renderer_pid || !renderer_id || !tab_handle) { 247c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch NOTREACHED(); 248c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch return false; 249c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch } 250c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 251731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick BrowserThread::PostTask( 252731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick BrowserThread::IO, FROM_HERE, 253c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch NewRunnableFunction( 254c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch AutomationResourceMessageFilter::RegisterRenderViewInIOThread, 255731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick renderer_pid, 256731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick renderer_id, 257731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick tab_handle, 258731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick make_scoped_refptr(filter), 259731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick pending_view)); 260c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch return true; 261c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 262c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 263c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochvoid AutomationResourceMessageFilter::UnRegisterRenderView( 264c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch int renderer_pid, int renderer_id) { 265731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick BrowserThread::PostTask( 266731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick BrowserThread::IO, FROM_HERE, 267c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch NewRunnableFunction( 268c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch AutomationResourceMessageFilter::UnRegisterRenderViewInIOThread, 269c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch renderer_pid, renderer_id)); 270c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 271c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 272c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochbool AutomationResourceMessageFilter::ResumePendingRenderView( 273c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch int renderer_pid, int renderer_id, int tab_handle, 274c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch AutomationResourceMessageFilter* filter) { 275c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch if (!renderer_pid || !renderer_id || !tab_handle) { 276c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch NOTREACHED(); 277c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch return false; 278c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch } 279c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 280731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick BrowserThread::PostTask( 281731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick BrowserThread::IO, FROM_HERE, 282c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch NewRunnableFunction( 283c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch AutomationResourceMessageFilter::ResumePendingRenderViewInIOThread, 284731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick renderer_pid, 285731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick renderer_id, 286731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick tab_handle, 287731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick make_scoped_refptr(filter))); 288c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch return true; 289c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 290c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 291c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochvoid AutomationResourceMessageFilter::RegisterRenderViewInIOThread( 292c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch int renderer_pid, int renderer_id, 293c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch int tab_handle, AutomationResourceMessageFilter* filter, 294c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch bool pending_view) { 2953345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick RendererId renderer_key(renderer_pid, renderer_id); 2963345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick 297513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch scoped_refptr<net::CookieStore> cookie_store( 298513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch new AutomationCookieStore(filter, tab_handle)); 2993345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick 300c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch RenderViewMap::iterator automation_details_iter( 3013345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick filtered_render_views_.Get().find(renderer_key)); 3023345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick if (automation_details_iter != filtered_render_views_.Get().end()) { 303c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch DCHECK(automation_details_iter->second.ref_count > 0); 304c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch automation_details_iter->second.ref_count++; 305c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch } else { 3063345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick filtered_render_views_.Get()[renderer_key] = 307c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch AutomationDetails(tab_handle, filter, pending_view); 308c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch } 3093345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick 3103345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick filtered_render_views_.Get()[renderer_key].set_cookie_store(cookie_store); 311c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 312c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 313c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// static 314c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochvoid AutomationResourceMessageFilter::UnRegisterRenderViewInIOThread( 315c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch int renderer_pid, int renderer_id) { 316c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch RenderViewMap::iterator automation_details_iter( 3173345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick filtered_render_views_.Get().find(RendererId(renderer_pid, 3183345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick renderer_id))); 319c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 3203345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick if (automation_details_iter == filtered_render_views_.Get().end()) { 321ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen // This is called for all RenderViewHosts, so it's fine if we don't find a 322ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen // match. 323c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch return; 324c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch } 325c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 326c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch automation_details_iter->second.ref_count--; 327c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 328c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch if (automation_details_iter->second.ref_count <= 0) { 3293345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick filtered_render_views_.Get().erase(RendererId(renderer_pid, renderer_id)); 330c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch } 331c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 332c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 333c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// static 334c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochbool AutomationResourceMessageFilter::ResumePendingRenderViewInIOThread( 335c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch int renderer_pid, int renderer_id, int tab_handle, 336c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch AutomationResourceMessageFilter* filter) { 337731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); 338c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 3393345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick RendererId renderer_key(renderer_pid, renderer_id); 3403345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick 341c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch RenderViewMap::iterator automation_details_iter( 3423345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick filtered_render_views_.Get().find(renderer_key)); 343c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 3443345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick if (automation_details_iter == filtered_render_views_.Get().end()) { 345c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch NOTREACHED() << "Failed to find pending view for renderer pid:" 346c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch << renderer_pid 347c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch << ", render view id:" 348c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch << renderer_id; 349c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch return false; 350c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch } 351c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 352c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch DCHECK(automation_details_iter->second.is_pending_render_view); 353c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 354513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch scoped_refptr<net::CookieStore> cookie_store( 355513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch new AutomationCookieStore(filter, tab_handle)); 3563345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick 357c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch AutomationResourceMessageFilter* old_filter = 358c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch automation_details_iter->second.filter; 359c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch DCHECK(old_filter != NULL); 360c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 3613345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick filtered_render_views_.Get()[renderer_key] = 362c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch AutomationDetails(tab_handle, filter, false); 363c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 3643345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick filtered_render_views_.Get()[renderer_key].set_cookie_store(cookie_store); 3653345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick 366c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch ResumeJobsForPendingView(tab_handle, old_filter, filter); 367c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch return true; 368c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 369c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 370c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochbool AutomationResourceMessageFilter::LookupRegisteredRenderView( 371c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch int renderer_pid, int renderer_id, AutomationDetails* details) { 372c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch bool found = false; 3733345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick RenderViewMap::iterator it = filtered_render_views_.Get().find(RendererId( 374c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch renderer_pid, renderer_id)); 3753345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick if (it != filtered_render_views_.Get().end()) { 376c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch found = true; 377c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch if (details) 378c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch *details = it->second; 379c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch } 380c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 381c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch return found; 382c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 383c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 384c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochbool AutomationResourceMessageFilter::GetAutomationRequestId( 385c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch int request_id, int* automation_request_id) { 386731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); 387c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 388c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch RequestMap::iterator it = request_map_.begin(); 389c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch while (it != request_map_.end()) { 390c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch URLRequestAutomationJob* job = it->second; 391c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch DCHECK(job); 392c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch if (job && job->request_id() == request_id) { 393c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch *automation_request_id = job->id(); 394c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch return true; 395c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch } 396c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch it++; 397c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch } 398c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 399c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch return false; 400c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 401c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 402c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochbool AutomationResourceMessageFilter::SendDownloadRequestToHost( 403c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch int routing_id, int tab_handle, int request_id) { 404c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch int automation_request_id = 0; 405c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch bool valid_id = GetAutomationRequestId(request_id, &automation_request_id); 406c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch if (!valid_id) { 40772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen LOG(ERROR) << "Invalid request id: " << request_id; 408c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch return false; 409c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch } 410c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 41121d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen return Send(new AutomationMsg_DownloadRequestInHost(tab_handle, 412c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch automation_request_id)); 413c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 414c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 415c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochvoid AutomationResourceMessageFilter::OnSetFilteredInet(bool enable) { 416c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch chrome_browser_net::SetUrlRequestMocksEnabled(enable); 417c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 418c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 419c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochvoid AutomationResourceMessageFilter::OnGetFilteredInetHitCount( 420c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch int* hit_count) { 4213f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen *hit_count = net::URLRequestFilter::GetInstance()->hit_count(); 422c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 423c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 424c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochvoid AutomationResourceMessageFilter::OnRecordHistograms( 425c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch const std::vector<std::string>& histogram_list) { 426c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch for (size_t index = 0; index < histogram_list.size(); ++index) { 427731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick base::Histogram::DeserializeHistogramInfo(histogram_list[index]); 428c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch } 429c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 430c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 4313345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrickbool AutomationResourceMessageFilter::GetCookiesForUrl( 4323345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick const GURL& url, net::CompletionCallback* callback) { 4333345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick GetCookiesCompletion* get_cookies_callback = 4343345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick static_cast<GetCookiesCompletion*>(callback); 4353345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick 4363345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick RendererId renderer_key(get_cookies_callback->render_process_id(), 4373345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick get_cookies_callback->render_view_id()); 4383345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick 4393345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick RenderViewMap::iterator automation_details_iter( 4403345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick filtered_render_views_.Get().find(renderer_key)); 4413345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick 4423345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick if (automation_details_iter == filtered_render_views_.Get().end()) { 4433345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick return false; 4443345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick } 4453345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick 4463345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick DCHECK(automation_details_iter->second.filter != NULL); 4473345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick DCHECK(automation_details_iter->second.cookie_store_.get() != NULL); 448c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 449c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch int completion_callback_id = GetNextCompletionCallbackId(); 4503345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick DCHECK(!ContainsKey(completion_callback_map_.Get(), completion_callback_id)); 451c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 452c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch CookieCompletionInfo cookie_info; 453c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch cookie_info.completion_callback = callback; 4543345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick cookie_info.cookie_store = automation_details_iter->second.cookie_store_; 4553345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick 4563345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick completion_callback_map_.Get()[completion_callback_id] = cookie_info; 457c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 4583345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick DCHECK(automation_details_iter->second.filter != NULL); 459c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 4603345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick if (automation_details_iter->second.filter) { 4613345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick automation_details_iter->second.filter->Send( 4623345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick new AutomationMsg_GetCookiesFromHost( 46321d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen automation_details_iter->second.tab_handle, url, 4643345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick completion_callback_id)); 4653345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick } 4663345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick return true; 467c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 468c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 469c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochvoid AutomationResourceMessageFilter::OnGetCookiesHostResponse( 470c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch int tab_handle, bool success, const GURL& url, const std::string& cookies, 471c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch int cookie_id) { 472c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch CompletionCallbackMap::iterator index = 4733345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick completion_callback_map_.Get().find(cookie_id); 4743345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick if (index != completion_callback_map_.Get().end()) { 475c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch net::CompletionCallback* callback = index->second.completion_callback; 4763345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick 477c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch scoped_refptr<net::CookieStore> cookie_store = index->second.cookie_store; 478c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 479c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch DCHECK(callback != NULL); 480c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch DCHECK(cookie_store.get() != NULL); 481c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 4823345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick completion_callback_map_.Get().erase(index); 483c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 4843345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick OnGetCookiesHostResponseInternal(tab_handle, success, url, cookies, 4853345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick callback, cookie_store.get()); 486c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch } else { 487c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch NOTREACHED() << "Received invalid completion callback id:" 488c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch << cookie_id; 489c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch } 490c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 491c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 4923345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrickvoid AutomationResourceMessageFilter::OnGetCookiesHostResponseInternal( 4933345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick int tab_handle, bool success, const GURL& url, const std::string& cookies, 4943345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick net::CompletionCallback* callback, net::CookieStore* cookie_store) { 4953345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick DCHECK(callback); 4963345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick DCHECK(cookie_store); 4973345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick 4983345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick GetCookiesCompletion* get_cookies_callback = 4993345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick static_cast<GetCookiesCompletion*>(callback); 5003345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick 5013345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick get_cookies_callback->set_cookie_store(cookie_store); 5023345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick 5033345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick // Set the cookie in the cookie store so that the callback can read it. 5043345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick cookie_store->SetCookieWithOptions(url, cookies, net::CookieOptions()); 5053345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick 5063345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick Tuple1<int> params; 5073345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick params.a = success ? net::OK : net::ERR_ACCESS_DENIED; 5083345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick callback->RunWithParams(params); 5093345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick 5103345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick // The cookie for this URL is only valid until it is read by the callback. 5113345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick cookie_store->SetCookieWithOptions(url, "", net::CookieOptions()); 5123345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick} 5133345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick 5143345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrickbool AutomationResourceMessageFilter::SetCookiesForUrl( 5153345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick const GURL& url, const std::string& cookie_line, 5163345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick net::CompletionCallback* callback) { 5173345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick SetCookieCompletion* set_cookies_callback = 5183345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick static_cast<SetCookieCompletion*>(callback); 5193345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick 5203345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick RenderViewMap::iterator automation_details_iter( 5213345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick filtered_render_views_.Get().find(RendererId( 5223345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick set_cookies_callback->render_process_id(), 5233345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick set_cookies_callback->render_view_id()))); 5243345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick 5253345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick if (automation_details_iter == filtered_render_views_.Get().end()) { 5263345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick return false; 5273345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick } 5283345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick 529ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen delete callback; 5303345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick DCHECK(automation_details_iter->second.filter != NULL); 5313345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick 5323345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick if (automation_details_iter->second.filter) { 5333345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick automation_details_iter->second.filter->Send( 5343345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick new AutomationMsg_SetCookieAsync( 53521d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen automation_details_iter->second.tab_handle, url, cookie_line)); 5363345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick } 5373345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick 5383345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick return true; 5393345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick} 5403345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick 541c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// static 542c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochvoid AutomationResourceMessageFilter::ResumeJobsForPendingView( 543c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch int tab_handle, 544c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch AutomationResourceMessageFilter* old_filter, 545c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch AutomationResourceMessageFilter* new_filter) { 546c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch DCHECK(old_filter != NULL); 547c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch DCHECK(new_filter != NULL); 548c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 549c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch RequestMap pending_requests = old_filter->pending_request_map_; 550c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 551c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch for (RequestMap::iterator index = old_filter->pending_request_map_.begin(); 552c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch index != old_filter->pending_request_map_.end(); index++) { 553c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch scoped_refptr<URLRequestAutomationJob> job = (*index).second; 554c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch DCHECK_EQ(job->message_filter(), old_filter); 555c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch DCHECK(job->is_pending()); 556c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // StartPendingJob will register the job with the new filter. 557c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch job->StartPendingJob(tab_handle, new_filter); 558c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch } 559c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 560c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch old_filter->pending_request_map_.clear(); 561c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 562