Index: chrome_frame/test/net/test_automation_provider.cc |
=================================================================== |
--- chrome_frame/test/net/test_automation_provider.cc (revision 0) |
+++ chrome_frame/test/net/test_automation_provider.cc (revision 0) |
@@ -0,0 +1,89 @@ |
+// Copyright (c) 2009 The Chromium Authors. All rights reserved. |
+// Use of this source code is governed by a BSD-style license that can be |
+// found in the LICENSE file. |
+ |
+#include "chrome_frame/test/net/test_automation_provider.h" |
+ |
+#include "base/command_line.h" |
+#include "chrome/test/automation/automation_messages.h" |
+ |
+#include "chrome_frame/test/net/test_automation_resource_message_filter.h" |
+ |
+namespace { |
+ |
+// A special command line switch to just run the unit tests without CF in |
+// the picture. Can be useful when the harness itself needs to be debugged. |
+const wchar_t kNoCfTestRun[] = L"no-cf-test-run"; |
+ |
+bool CFTestsDisabled() { |
+ static bool switch_present = CommandLine::ForCurrentProcess()-> |
+ HasSwitch(kNoCfTestRun); |
+ return switch_present; |
+} |
+ |
+} // end namespace |
+ |
+TestAutomationProvider::TestAutomationProvider( |
+ Profile* profile, |
+ TestAutomationProviderDelegate* delegate) |
+ : AutomationProvider(profile), tab_handle_(-1), delegate_(delegate) { |
+ filter_ = new TestAutomationResourceMessageFilter(this); |
+ URLRequest::RegisterRequestInterceptor(this); |
+} |
+ |
+TestAutomationProvider::~TestAutomationProvider() { |
+ URLRequest::UnregisterRequestInterceptor(this); |
+} |
+ |
+void TestAutomationProvider::OnMessageReceived(const IPC::Message& msg) { |
+ if (filter_->OnMessageReceived(msg)) |
+ return; // Message handled by the filter. |
+ |
+ __super::OnMessageReceived(msg); |
+} |
+ |
+// IPC override to grab the tab handle. |
+bool TestAutomationProvider::Send(IPC::Message* msg) { |
+ if (msg->type() == AutomationMsg_TabLoaded::ID) { |
+ DCHECK(tab_handle_ == -1) << "Currently only support one tab"; |
+ void* iter = NULL; |
+ CHECK(msg->ReadInt(&iter, &tab_handle_)); |
+ DLOG(INFO) << "Got tab handle: " << tab_handle_; |
+ DCHECK(tab_handle_ != -1 && tab_handle_ != 0); |
+ delegate_->OnInitialTabLoaded(); |
+ } |
+ |
+ return AutomationProvider::Send(msg); |
+} |
+ |
+URLRequestJob* TestAutomationProvider::MaybeIntercept(URLRequest* request) { |
+ if (CFTestsDisabled()) |
+ return NULL; |
+ |
+ if (request->url().SchemeIs("http") || request->url().SchemeIs("https")) { |
+ // Only look at requests that don't have any user data. |
+ // ResourceDispatcherHost uses the user data for requests that it manages. |
+ // We don't want to mess with those. |
+ |
+ // We could also check if the current thread is our TestUrlRequest thread |
+ // and only intercept requests that belong to that thread. |
+ if (request->GetUserData(NULL) == NULL) { |
+ DCHECK(tab_handle_ != -1); |
+ URLRequestAutomationJob* job = new URLRequestAutomationJob(request, |
+ tab_handle_, filter_); |
+ return job; |
+ } |
+ } |
+ |
+ return NULL; |
+} |
+ |
+// static |
+TestAutomationProvider* TestAutomationProvider::NewAutomationProvider( |
+ Profile* p, const std::string& channel, |
+ TestAutomationProviderDelegate* delegate) { |
+ TestAutomationProvider* automation = new TestAutomationProvider(p, delegate); |
+ automation->ConnectToChannel(channel); |
+ automation->SetExpectedTabCount(1); |
+ return automation; |
+} |