diff options
Diffstat (limited to 'chrome_frame/test/net/test_automation_provider.cc')
-rw-r--r-- | chrome_frame/test/net/test_automation_provider.cc | 89 |
1 files changed, 89 insertions, 0 deletions
diff --git a/chrome_frame/test/net/test_automation_provider.cc b/chrome_frame/test/net/test_automation_provider.cc new file mode 100644 index 0000000..3a56aa4 --- /dev/null +++ b/chrome_frame/test/net/test_automation_provider.cc @@ -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; +} |