summaryrefslogtreecommitdiffstats
path: root/chrome
diff options
context:
space:
mode:
Diffstat (limited to 'chrome')
-rw-r--r--chrome/browser/automation/automation_resource_message_filter.cc33
-rw-r--r--chrome/browser/automation/automation_resource_message_filter.h18
-rw-r--r--chrome/browser/automation/url_request_automation_job.cc14
-rw-r--r--chrome/browser/automation/url_request_automation_job.h5
-rw-r--r--chrome/browser/external_tab_container.cc8
5 files changed, 70 insertions, 8 deletions
diff --git a/chrome/browser/automation/automation_resource_message_filter.cc b/chrome/browser/automation/automation_resource_message_filter.cc
index e0512ca..6709ba2 100644
--- a/chrome/browser/automation/automation_resource_message_filter.cc
+++ b/chrome/browser/automation/automation_resource_message_filter.cc
@@ -21,6 +21,8 @@
AutomationResourceMessageFilter::RenderViewMap
AutomationResourceMessageFilter::filtered_render_views_;
+int AutomationResourceMessageFilter::unique_request_id_ = 1;
+
AutomationResourceMessageFilter::AutomationResourceMessageFilter()
: channel_(NULL) {
ChromeThread::PostTask(
@@ -193,6 +195,37 @@ bool AutomationResourceMessageFilter::LookupRegisteredRenderView(
return found;
}
+bool AutomationResourceMessageFilter::GetAutomationRequestId(
+ int request_id, int* automation_request_id) {
+ DCHECK(ChromeThread::CurrentlyOn(ChromeThread::IO));
+
+ RequestMap::iterator it = request_map_.begin();
+ while (it != request_map_.end()) {
+ URLRequestAutomationJob* job = it->second;
+ DCHECK(job);
+ if (job && job->request_id() == request_id) {
+ *automation_request_id = job->id();
+ return true;
+ }
+ it++;
+ }
+
+ return false;
+}
+
+bool AutomationResourceMessageFilter::SendDownloadRequestToHost(
+ int routing_id, int tab_handle, int request_id) {
+ int automation_request_id = 0;
+ bool valid_id = GetAutomationRequestId(request_id, &automation_request_id);
+ if (!valid_id) {
+ NOTREACHED() << "Invalid request id: " << request_id;
+ return false;
+ }
+
+ return Send(new AutomationMsg_DownloadRequestInHost(0, tab_handle,
+ automation_request_id));
+}
+
void AutomationResourceMessageFilter::OnSetFilteredInet(bool enable) {
chrome_browser_net::SetUrlRequestMocksEnabled(enable);
}
diff --git a/chrome/browser/automation/automation_resource_message_filter.h b/chrome/browser/automation/automation_resource_message_filter.h
index ceb6115..7bb03d6 100644
--- a/chrome/browser/automation/automation_resource_message_filter.h
+++ b/chrome/browser/automation/automation_resource_message_filter.h
@@ -39,6 +39,12 @@ class AutomationResourceMessageFilter
AutomationResourceMessageFilter();
virtual ~AutomationResourceMessageFilter();
+ // Returns a new automation request id. This is unique across all instances
+ // of AutomationResourceMessageFilter.
+ int NewAutomationRequestId() {
+ return base::subtle::Barrier_AtomicIncrement(&unique_request_id_, 1);
+ }
+
// IPC::ChannelProxy::MessageFilter methods:
virtual void OnFilterAdded(IPC::Channel* channel);
virtual void OnChannelConnected(int32 peer_pid);
@@ -63,7 +69,16 @@ class AutomationResourceMessageFilter
static bool LookupRegisteredRenderView(
int renderer_pid, int renderer_id, AutomationDetails* details);
+ // Sends the download request to the automation host.
+ bool SendDownloadRequestToHost(int routing_id, int tab_handle,
+ int request_id);
+
protected:
+ // Retrieves the automation request id for the passed in chrome request
+ // id and returns it in the automation_request_id parameter.
+ // Returns true on success.
+ bool GetAutomationRequestId(int request_id, int* automation_request_id);
+
static void RegisterRenderViewInIOThread(int renderer_pid, int renderer_id,
int tab_handle, AutomationResourceMessageFilter* filter);
static void UnRegisterRenderViewInIOThread(int renderer_pid, int renderer_id);
@@ -94,6 +109,9 @@ class AutomationResourceMessageFilter
// owned by this class.
IPC::Channel* channel_;
+ // A unique request id per process.
+ static int unique_request_id_;
+
// Map of outstanding requests.
RequestMap request_map_;
diff --git a/chrome/browser/automation/url_request_automation_job.cc b/chrome/browser/automation/url_request_automation_job.cc
index fdd680f..f6d4ecd 100644
--- a/chrome/browser/automation/url_request_automation_job.cc
+++ b/chrome/browser/automation/url_request_automation_job.cc
@@ -52,13 +52,18 @@ URLRequest::ProtocolFactory* URLRequestAutomationJob::old_https_factory_
URLRequestAutomationJob::URLRequestAutomationJob(URLRequest* request, int tab,
int request_id, AutomationResourceMessageFilter* filter)
: URLRequestJob(request),
- id_(request_id),
tab_(tab),
message_filter_(filter),
pending_buf_size_(0),
- redirect_status_(0) {
+ redirect_status_(0),
+ request_id_(request_id) {
DLOG(INFO) << "URLRequestAutomationJob create. Count: " << ++instance_count_;
- DCHECK_NE(id_, -1);
+ DCHECK(message_filter_ != NULL);
+
+ if (message_filter_) {
+ id_ = message_filter_->NewAutomationRequestId();
+ DCHECK_NE(id_, 0);
+ }
}
URLRequestAutomationJob::~URLRequestAutomationJob() {
@@ -217,7 +222,8 @@ bool URLRequestAutomationJob::MayFilterMessage(const IPC::Message& message,
case AutomationMsg_RequestEnd::ID: {
void* iter = NULL;
int tab = 0;
- if (message.ReadInt(&iter, &tab) && message.ReadInt(&iter, request_id)) {
+ if (message.ReadInt(&iter, &tab) &&
+ message.ReadInt(&iter, request_id)) {
return true;
}
break;
diff --git a/chrome/browser/automation/url_request_automation_job.h b/chrome/browser/automation/url_request_automation_job.h
index 0edd876..5865fb3 100644
--- a/chrome/browser/automation/url_request_automation_job.h
+++ b/chrome/browser/automation/url_request_automation_job.h
@@ -47,6 +47,10 @@ class URLRequestAutomationJob : public URLRequestJob {
return id_;
}
+ int request_id() const {
+ return request_id_;
+ }
+
protected:
// Protected URLRequestJob override.
virtual bool ReadRawData(net::IOBuffer* buf, int buf_size, int* bytes_read);
@@ -75,6 +79,7 @@ class URLRequestAutomationJob : public URLRequestJob {
scoped_refptr<net::HttpResponseHeaders> headers_;
std::string redirect_url_;
int redirect_status_;
+ int request_id_;
static int instance_count_;
diff --git a/chrome/browser/external_tab_container.cc b/chrome/browser/external_tab_container.cc
index 4440294..806c4c6 100644
--- a/chrome/browser/external_tab_container.cc
+++ b/chrome/browser/external_tab_container.cc
@@ -404,10 +404,10 @@ bool ExternalTabContainer::TakeFocus(bool reverse) {
bool ExternalTabContainer::CanDownload(int request_id) {
if (load_requests_via_automation_) {
if (automation_) {
- // NOTE: The request_id must be the same id as used by corresponding
- // URLRequestAutomationJob instance to communicate with the host.
- automation_->Send(new AutomationMsg_DownloadRequestInHost(0, tab_handle_,
- request_id));
+ ChromeThread::PostTask(ChromeThread::IO, FROM_HERE,
+ NewRunnableMethod(automation_resource_message_filter_,
+ &AutomationResourceMessageFilter::SendDownloadRequestToHost,
+ 0, tab_handle_, request_id));
}
} else {
DLOG(WARNING) << "Downloads are only supported with host browser network "