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