diff options
Diffstat (limited to 'chrome/browser/printing/print_dialog_cloud_uitest.cc')
-rw-r--r-- | chrome/browser/printing/print_dialog_cloud_uitest.cc | 234 |
1 files changed, 234 insertions, 0 deletions
diff --git a/chrome/browser/printing/print_dialog_cloud_uitest.cc b/chrome/browser/printing/print_dialog_cloud_uitest.cc new file mode 100644 index 0000000..4a07d8c --- /dev/null +++ b/chrome/browser/printing/print_dialog_cloud_uitest.cc @@ -0,0 +1,234 @@ +// Copyright (c) 2010 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/browser/printing/print_dialog_cloud.h" +#include "chrome/browser/printing/print_dialog_cloud_internal.h" + +#include <functional> + +#include "base/file_path.h" +#include "base/file_util.h" +#include "base/path_service.h" +#include "base/singleton.h" +#include "chrome/browser/browser_list.h" +#include "chrome/browser/chrome_thread.h" +#include "chrome/browser/dom_ui/chrome_url_data_manager.h" +#include "chrome/browser/renderer_host/render_view_host.h" +#include "chrome/browser/tab_contents/tab_contents.h" +#include "chrome/common/chrome_paths.h" +#include "chrome/common/url_constants.h" +#include "chrome/test/in_process_browser_test.h" +#include "chrome/test/ui_test_utils.h" +#include "net/url_request/url_request_filter.h" +#include "net/url_request/url_request_test_job.h" + +namespace { + +class TestData { + public: + TestData() {} + + char* GetTestData() { + if (test_data_.empty()) { + FilePath test_data_directory; + PathService::Get(chrome::DIR_TEST_DATA, &test_data_directory); + FilePath test_file = + test_data_directory.AppendASCII("printing/cloud_print_uitest.html"); + file_util::ReadFileToString(test_file, &test_data_); + } + return &test_data_[0]; + } + private: + std::string test_data_; +}; + +// A simple test URLRequestJob. We don't care what it does, only that +// whether it starts and finishes. +class SimpleTestJob : public URLRequestTestJob { + public: + explicit SimpleTestJob(URLRequest* request) + : URLRequestTestJob(request, test_headers(), + Singleton<TestData>()->GetTestData(), true) {} + + virtual void GetResponseInfo(net::HttpResponseInfo* info) { + URLRequestTestJob::GetResponseInfo(info); + if (request_->url().SchemeIsSecure()) { + // Make up a fake certificate for this response since we don't have + // access to the real SSL info. + const char* kCertIssuer = "Chrome Internal"; + const int kLifetimeDays = 100; + + info->ssl_info.cert = + new net::X509Certificate(request_->url().GetWithEmptyPath().spec(), + kCertIssuer, + base::Time::Now(), + base::Time::Now() + + base::TimeDelta::FromDays(kLifetimeDays)); + info->ssl_info.cert_status = 0; + info->ssl_info.security_bits = 0; + } + } + + private: + ~SimpleTestJob() {} +}; + +class TestController { + public: + TestController() : result_(false), use_delegate_(false) {} + void set_result(bool value) { + result_ = value; + } + bool result() { + return result_; + } + void set_expected_url(const GURL& url) { + expected_url_ = url; + } + const GURL expected_url() { + return expected_url_; + } + void set_delegate(TestDelegate* delegate) { + delegate_ = delegate; + } + TestDelegate* delegate() { + return delegate_; + } + void set_use_delegate(bool value) { + use_delegate_ = value; + } + bool use_delegate() { + return use_delegate_; + } + private: + bool result_; + bool use_delegate_; + GURL expected_url_; + TestDelegate* delegate_; +}; + +} // namespace + +class PrintDialogCloudTest : public InProcessBrowserTest { + public: + PrintDialogCloudTest() : handler_added_(false) { + PathService::Get(chrome::DIR_TEST_DATA, &test_data_directory_); + } + + // Must be static for handing into AddHostnameHandler. + static URLRequest::ProtocolFactory Factory; + + class AutoQuitDelegate : public TestDelegate { + public: + AutoQuitDelegate() {} + + virtual void OnResponseCompleted(URLRequest* request) { + ChromeThread::PostTask(ChromeThread::UI, FROM_HERE, + new MessageLoop::QuitTask()); + } + }; + + virtual void SetUp() { + Singleton<TestController>()->set_result(false); + InProcessBrowserTest::SetUp(); + } + + virtual void TearDown() { + if (handler_added_) { + URLRequestFilter* filter = URLRequestFilter::GetInstance(); + filter->RemoveHostnameHandler(scheme_, host_name_); + handler_added_ = false; + Singleton<TestController>()->set_delegate(NULL); + } + InProcessBrowserTest::TearDown(); + } + + // Normally this is something I would expect could go into SetUp(), + // but there seems to be some timing or ordering related issue with + // the test harness that made that flaky. Calling this from the + // individual test functions seems to fix that. + void AddTestHandlers() { + if (!handler_added_) { + URLRequestFilter* filter = URLRequestFilter::GetInstance(); + GURL cloud_print_service_url = + internal_cloud_print_helpers::CloudPrintService(browser()->profile()). + GetCloudPrintServiceURL(); + scheme_ = cloud_print_service_url.scheme(); + host_name_ = cloud_print_service_url.host(); + filter->AddHostnameHandler(scheme_, host_name_, + &PrintDialogCloudTest::Factory); + handler_added_ = true; + + GURL cloud_print_dialog_url = + internal_cloud_print_helpers::CloudPrintService(browser()->profile()). + GetCloudPrintServiceDialogURL(); + Singleton<TestController>()->set_expected_url(cloud_print_dialog_url); + Singleton<TestController>()->set_delegate(&delegate_); + } + + CreateDialogForTest(); + } + + void CreateDialogForTest() { + FilePath path_to_pdf = + test_data_directory_.AppendASCII("printing/cloud_print_uitest.pdf"); + ChromeThread::PostTask( + ChromeThread::UI, FROM_HERE, + NewRunnableFunction(&PrintDialogCloud::CreateDialogImpl, path_to_pdf)); + } + + bool handler_added_; + std::string scheme_; + std::string host_name_; + FilePath test_data_directory_; + AutoQuitDelegate delegate_; +}; + +URLRequestJob* PrintDialogCloudTest::Factory(URLRequest* request, + const std::string& scheme) { + if (Singleton<TestController>()->use_delegate()) + request->set_delegate(Singleton<TestController>()->delegate()); + if (request && + (request->url() == Singleton<TestController>()->expected_url())) { + Singleton<TestController>()->set_result(true); + } + return new SimpleTestJob(request); +} + +IN_PROC_BROWSER_TEST_F(PrintDialogCloudTest, HandlersRegistered) { + BrowserList::SetLastActive(browser()); + ASSERT_TRUE(BrowserList::GetLastActive()); + + AddTestHandlers(); + + Singleton<TestController>()->set_use_delegate(true); + + ui_test_utils::RunMessageLoop(); + + ASSERT_TRUE(Singleton<TestController>()->result()); +} + +#if defined(OS_CHROMEOS) +// Disabled until the extern URL is live so that the Print menu item +// can be enabled for Chromium OS. +IN_PROC_BROWSER_TEST_F(PrintDialogCloudTest, DISABLED_DialogGrabbed) { + BrowserList::SetLastActive(browser()); + ASSERT_TRUE(BrowserList::GetLastActive()); + + AddTestHandlers(); + + // This goes back one step further for the Chrome OS case, to making + // sure 'window.print()' gets to the right place. + ASSERT_TRUE(browser()->GetSelectedTabContents()); + ASSERT_TRUE(browser()->GetSelectedTabContents()->render_view_host()); + + std::wstring window_print(L"window.print()"); + browser()->GetSelectedTabContents()->render_view_host()-> + ExecuteJavascriptInWebFrame(std::wstring(), window_print); + + ui_test_utils::RunMessageLoop(); + + ASSERT_TRUE(Singleton<TestController>()->result()); +} +#endif |