Chromium Code Reviews| OLD | NEW |
|---|---|
| (Empty) | |
| 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | |
|
jam
2013/10/15 16:50:52
i dont think you meant to delete this?
Avi (use Gerrit)
2013/10/15 16:57:24
Yes I did. In discussions with Scott Byer, that se
| |
| 2 // Use of this source code is governed by a BSD-style license that can be | |
| 3 // found in the LICENSE file. | |
| 4 | |
| 5 #include "chrome/browser/printing/print_dialog_cloud.h" | |
| 6 #include "chrome/browser/printing/print_dialog_cloud_internal.h" | |
| 7 | |
| 8 #include <functional> | |
| 9 | |
| 10 #include "base/bind.h" | |
| 11 #include "base/file_util.h" | |
| 12 #include "base/files/file_path.h" | |
| 13 #include "base/memory/singleton.h" | |
| 14 #include "base/path_service.h" | |
| 15 #include "base/strings/utf_string_conversions.h" | |
| 16 #include "base/threading/thread_restrictions.h" | |
| 17 #include "base/values.h" | |
| 18 #include "chrome/browser/printing/cloud_print/cloud_print_url.h" | |
| 19 #include "chrome/browser/profiles/profile.h" | |
| 20 #include "chrome/browser/ui/browser.h" | |
| 21 #include "chrome/browser/ui/browser_window.h" | |
| 22 #include "chrome/common/chrome_paths.h" | |
| 23 #include "chrome/common/url_constants.h" | |
| 24 #include "chrome/test/base/in_process_browser_test.h" | |
| 25 #include "chrome/test/base/ui_test_utils.h" | |
| 26 #include "content/public/browser/notification_service.h" | |
| 27 #include "content/public/browser/notification_types.h" | |
| 28 #include "content/public/browser/render_view_host.h" | |
| 29 #include "content/public/browser/web_contents.h" | |
| 30 #include "content/public/test/test_browser_thread.h" | |
| 31 #include "net/url_request/url_request.h" | |
| 32 #include "net/url_request/url_request_filter.h" | |
| 33 #include "net/url_request/url_request_test_job.h" | |
| 34 #include "net/url_request/url_request_test_util.h" | |
| 35 #include "ui/base/test/ui_controls.h" | |
| 36 | |
| 37 using content::BrowserThread; | |
| 38 | |
| 39 namespace { | |
| 40 | |
| 41 class TestData { | |
| 42 public: | |
| 43 static TestData* GetInstance() { | |
| 44 return Singleton<TestData>::get(); | |
| 45 } | |
| 46 | |
| 47 const char* GetTestData() { | |
| 48 // Fetching this data blocks the IO thread, but we don't really care because | |
| 49 // this is a test. | |
| 50 base::ThreadRestrictions::ScopedAllowIO allow_io; | |
| 51 | |
| 52 if (test_data_.empty()) { | |
| 53 base::FilePath test_data_directory; | |
| 54 PathService::Get(chrome::DIR_TEST_DATA, &test_data_directory); | |
| 55 base::FilePath test_file = | |
| 56 test_data_directory.AppendASCII("printing/cloud_print_uitest.html"); | |
| 57 base::ReadFileToString(test_file, &test_data_); | |
| 58 } | |
| 59 return test_data_.c_str(); | |
| 60 } | |
| 61 private: | |
| 62 TestData() {} | |
| 63 | |
| 64 std::string test_data_; | |
| 65 | |
| 66 friend struct DefaultSingletonTraits<TestData>; | |
| 67 }; | |
| 68 | |
| 69 // A simple test net::URLRequestJob. We don't care what it does, only that | |
| 70 // whether it starts and finishes. | |
| 71 class SimpleTestJob : public net::URLRequestTestJob { | |
| 72 public: | |
| 73 SimpleTestJob(net::URLRequest* request, | |
| 74 net::NetworkDelegate* network_delegate) | |
| 75 : net::URLRequestTestJob(request, | |
| 76 network_delegate, | |
| 77 test_headers(), | |
| 78 TestData::GetInstance()->GetTestData(), | |
| 79 true) {} | |
| 80 | |
| 81 virtual void GetResponseInfo(net::HttpResponseInfo* info) OVERRIDE { | |
| 82 net::URLRequestTestJob::GetResponseInfo(info); | |
| 83 if (request_->url().SchemeIsSecure()) { | |
| 84 // Make up a fake certificate for this response since we don't have | |
| 85 // access to the real SSL info. | |
| 86 const char* kCertIssuer = "Chrome Internal"; | |
| 87 const int kLifetimeDays = 100; | |
| 88 | |
| 89 info->ssl_info.cert = | |
| 90 new net::X509Certificate(request_->url().GetWithEmptyPath().spec(), | |
| 91 kCertIssuer, | |
| 92 base::Time::Now(), | |
| 93 base::Time::Now() + | |
| 94 base::TimeDelta::FromDays(kLifetimeDays)); | |
| 95 info->ssl_info.cert_status = 0; | |
| 96 info->ssl_info.security_bits = -1; | |
| 97 } | |
| 98 } | |
| 99 | |
| 100 private: | |
| 101 virtual ~SimpleTestJob() {} | |
| 102 }; | |
| 103 | |
| 104 class TestController { | |
| 105 public: | |
| 106 static TestController* GetInstance() { | |
| 107 return Singleton<TestController>::get(); | |
| 108 } | |
| 109 void set_result(bool value) { | |
| 110 result_ = value; | |
| 111 } | |
| 112 bool result() { | |
| 113 return result_; | |
| 114 } | |
| 115 void set_expected_url(const GURL& url) { | |
| 116 expected_url_ = url; | |
| 117 } | |
| 118 const GURL expected_url() { | |
| 119 return expected_url_; | |
| 120 } | |
| 121 void set_delegate(net::TestDelegate* delegate) { | |
| 122 delegate_ = delegate; | |
| 123 } | |
| 124 net::TestDelegate* delegate() { | |
| 125 return delegate_; | |
| 126 } | |
| 127 void set_use_delegate(bool value) { | |
| 128 use_delegate_ = value; | |
| 129 } | |
| 130 bool use_delegate() { | |
| 131 return use_delegate_; | |
| 132 } | |
| 133 private: | |
| 134 TestController() | |
| 135 : result_(false), | |
| 136 use_delegate_(false), | |
| 137 delegate_(NULL) {} | |
| 138 | |
| 139 bool result_; | |
| 140 bool use_delegate_; | |
| 141 GURL expected_url_; | |
| 142 net::TestDelegate* delegate_; | |
| 143 | |
| 144 friend struct DefaultSingletonTraits<TestController>; | |
| 145 }; | |
| 146 | |
| 147 } // namespace | |
| 148 | |
| 149 class PrintDialogCloudTest : public InProcessBrowserTest { | |
| 150 public: | |
| 151 PrintDialogCloudTest() : handler_added_(false) { | |
| 152 PathService::Get(chrome::DIR_TEST_DATA, &test_data_directory_); | |
| 153 } | |
| 154 | |
| 155 // Must be static for handing into AddHostnameHandler. | |
| 156 static net::URLRequest::ProtocolFactory Factory; | |
| 157 | |
| 158 class AutoQuitDelegate : public net::TestDelegate { | |
| 159 public: | |
| 160 AutoQuitDelegate() {} | |
| 161 | |
| 162 virtual void OnResponseCompleted(net::URLRequest* request) OVERRIDE { | |
| 163 BrowserThread::PostTask(BrowserThread::UI, FROM_HERE, | |
| 164 base::MessageLoop::QuitClosure()); | |
| 165 } | |
| 166 }; | |
| 167 | |
| 168 virtual void SetUp() OVERRIDE { | |
| 169 TestController::GetInstance()->set_result(false); | |
| 170 InProcessBrowserTest::SetUp(); | |
| 171 } | |
| 172 | |
| 173 virtual void TearDown() OVERRIDE { | |
| 174 if (handler_added_) { | |
| 175 BrowserThread::PostTask( | |
| 176 BrowserThread::IO, FROM_HERE, | |
| 177 base::Bind(UnregisterTestHandlers, scheme_, host_name_)); | |
| 178 handler_added_ = false; | |
| 179 TestController::GetInstance()->set_delegate(NULL); | |
| 180 } | |
| 181 InProcessBrowserTest::TearDown(); | |
| 182 } | |
| 183 | |
| 184 // Normally this is something I would expect could go into SetUp(), | |
| 185 // but there seems to be some timing or ordering related issue with | |
| 186 // the test harness that made that flaky. Calling this from the | |
| 187 // individual test functions seems to fix that. | |
| 188 void AddTestHandlers() { | |
| 189 if (!handler_added_) { | |
| 190 GURL cloud_print_service_url = | |
| 191 CloudPrintURL(browser()->profile()). | |
| 192 GetCloudPrintServiceURL(); | |
| 193 scheme_ = cloud_print_service_url.scheme(); | |
| 194 host_name_ = cloud_print_service_url.host(); | |
| 195 BrowserThread::PostTask( | |
| 196 BrowserThread::IO, FROM_HERE, | |
| 197 base::Bind(RegisterTestHandlers, scheme_, host_name_)); | |
| 198 handler_added_ = true; | |
| 199 | |
| 200 GURL cloud_print_dialog_url = | |
| 201 CloudPrintURL(browser()->profile()). | |
| 202 GetCloudPrintServiceDialogURL(); | |
| 203 TestController::GetInstance()->set_expected_url(cloud_print_dialog_url); | |
| 204 TestController::GetInstance()->set_delegate(&delegate_); | |
| 205 } | |
| 206 | |
| 207 CreateDialogForTest(); | |
| 208 } | |
| 209 | |
| 210 void CreateDialogForTest() { | |
| 211 base::FilePath path_to_pdf = | |
| 212 test_data_directory_.AppendASCII("printing/cloud_print_uitest.pdf"); | |
| 213 BrowserThread::PostTask( | |
| 214 BrowserThread::UI, FROM_HERE, | |
| 215 base::Bind(&print_dialog_cloud::CreatePrintDialogForFile, | |
| 216 browser()->profile(), browser()->window()->GetNativeWindow(), | |
| 217 path_to_pdf, string16(), string16(), | |
| 218 std::string("application/pdf"), false)); | |
| 219 } | |
| 220 | |
| 221 private: | |
| 222 static void RegisterTestHandlers(const std::string& scheme, | |
| 223 const std::string& host_name) { | |
| 224 net::URLRequestFilter::GetInstance()->AddHostnameHandler( | |
| 225 scheme, host_name, &PrintDialogCloudTest::Factory); | |
| 226 } | |
| 227 static void UnregisterTestHandlers(const std::string& scheme, | |
| 228 const std::string& host_name) { | |
| 229 net::URLRequestFilter::GetInstance()->RemoveHostnameHandler(scheme, | |
| 230 host_name); | |
| 231 } | |
| 232 | |
| 233 bool handler_added_; | |
| 234 std::string scheme_; | |
| 235 std::string host_name_; | |
| 236 base::FilePath test_data_directory_; | |
| 237 AutoQuitDelegate delegate_; | |
| 238 }; | |
| 239 | |
| 240 net::URLRequestJob* PrintDialogCloudTest::Factory( | |
| 241 net::URLRequest* request, | |
| 242 net::NetworkDelegate* network_delegate, | |
| 243 const std::string& scheme) { | |
| 244 if (request && | |
| 245 (request->url() == TestController::GetInstance()->expected_url())) { | |
| 246 if (TestController::GetInstance()->use_delegate()) | |
| 247 request->set_delegate(TestController::GetInstance()->delegate()); | |
| 248 TestController::GetInstance()->set_result(true); | |
| 249 return new SimpleTestJob(request, network_delegate); | |
| 250 } | |
| 251 return new net::URLRequestTestJob(request, | |
| 252 network_delegate, | |
| 253 net::URLRequestTestJob::test_headers(), | |
| 254 std::string(), | |
| 255 true); | |
| 256 } | |
| 257 | |
| 258 IN_PROC_BROWSER_TEST_F(PrintDialogCloudTest, HandlersRegistered) { | |
| 259 AddTestHandlers(); | |
| 260 | |
| 261 TestController::GetInstance()->set_use_delegate(true); | |
| 262 | |
| 263 content::RunMessageLoop(); | |
| 264 | |
| 265 ASSERT_TRUE(TestController::GetInstance()->result()); | |
| 266 | |
| 267 // Close the dialog before finishing the test. | |
| 268 content::WindowedNotificationObserver tab_closed_observer( | |
| 269 content::NOTIFICATION_WEB_CONTENTS_DESTROYED, | |
| 270 content::NotificationService::AllSources()); | |
| 271 | |
| 272 // Can't use ui_test_utils::SendKeyPressSync or | |
| 273 // ui_test_utils::SendKeyPressAndWait due to a race condition with closing | |
| 274 // the window. See http://crbug.com/111269 | |
| 275 BrowserWindow* window = browser()->window(); | |
| 276 ASSERT_TRUE(window); | |
| 277 gfx::NativeWindow native_window = window->GetNativeWindow(); | |
| 278 ASSERT_TRUE(native_window); | |
| 279 bool key_sent = ui_controls::SendKeyPress(native_window, ui::VKEY_ESCAPE, | |
| 280 false, false, false, false); | |
| 281 EXPECT_TRUE(key_sent); | |
| 282 if (key_sent) | |
| 283 tab_closed_observer.Wait(); | |
| 284 } | |
| OLD | NEW |