|  | // Copyright 2015 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 <memory> | 
|  |  | 
|  | #include "base/bind.h" | 
|  | #include "base/run_loop.h" | 
|  | #include "chrome/browser/extensions/extension_browsertest.h" | 
|  | #include "chrome/browser/profiles/profile.h" | 
|  | #include "chrome/browser/profiles/profile_io_data.h" | 
|  | #include "chrome/browser/ui/browser.h" | 
|  | #include "chrome/test/base/ui_test_utils.h" | 
|  | #include "content/public/browser/browser_thread.h" | 
|  | #include "extensions/common/extension.h" | 
|  | #include "extensions/test/result_catcher.h" | 
|  | #include "net/base/escape.h" | 
|  | #include "net/base/url_util.h" | 
|  | #include "net/ssl/client_cert_store.h" | 
|  | #include "net/ssl/ssl_server_config.h" | 
|  | #include "net/test/embedded_test_server/embedded_test_server.h" | 
|  | #include "url/gurl.h" | 
|  |  | 
|  | namespace { | 
|  |  | 
|  | std::unique_ptr<net::ClientCertStore> CreateNullCertStore() { | 
|  | return nullptr; | 
|  | } | 
|  |  | 
|  | void InstallNullCertStoreFactoryOnIOThread( | 
|  | content::ResourceContext* resource_context) { | 
|  | ProfileIOData::FromResourceContext(resource_context) | 
|  | ->set_client_cert_store_factory_for_testing( | 
|  | base::Bind(&CreateNullCertStore)); | 
|  | } | 
|  |  | 
|  | }  // namespace | 
|  |  | 
|  | class BackgroundXhrTest : public ExtensionBrowserTest { | 
|  | protected: | 
|  | void RunTest(const std::string& path, const GURL& url) { | 
|  | const extensions::Extension* extension = | 
|  | LoadExtension(test_data_dir_.AppendASCII("background_xhr")); | 
|  | ASSERT_TRUE(extension); | 
|  |  | 
|  | extensions::ResultCatcher catcher; | 
|  | GURL test_url = net::AppendQueryParameter(extension->GetResourceURL(path), | 
|  | "url", url.spec()); | 
|  | ui_test_utils::NavigateToURL(browser(), test_url); | 
|  | ASSERT_TRUE(catcher.GetNextResult()); | 
|  | } | 
|  | }; | 
|  |  | 
|  | // Test that fetching a URL using TLS client auth doesn't crash, hang, or | 
|  | // prompt. | 
|  | IN_PROC_BROWSER_TEST_F(BackgroundXhrTest, TlsClientAuth) { | 
|  | // Install a null ClientCertStore so the client auth prompt isn't bypassed due | 
|  | // to the system certificate store returning no certificates. | 
|  | base::RunLoop loop; | 
|  | content::BrowserThread::PostTaskAndReply( | 
|  | content::BrowserThread::IO, FROM_HERE, | 
|  | base::BindOnce(&InstallNullCertStoreFactoryOnIOThread, | 
|  | browser()->profile()->GetResourceContext()), | 
|  | loop.QuitClosure()); | 
|  | loop.Run(); | 
|  |  | 
|  | // Launch HTTPS server. | 
|  | net::EmbeddedTestServer https_server(net::EmbeddedTestServer::TYPE_HTTPS); | 
|  | net::SSLServerConfig ssl_config; | 
|  | ssl_config.client_cert_type = | 
|  | net::SSLServerConfig::ClientCertType::REQUIRE_CLIENT_CERT; | 
|  | https_server.SetSSLConfig(net::EmbeddedTestServer::CERT_OK, ssl_config); | 
|  | https_server.ServeFilesFromSourceDirectory("content/test/data"); | 
|  | ASSERT_TRUE(https_server.Start()); | 
|  |  | 
|  | ASSERT_NO_FATAL_FAILURE( | 
|  | RunTest("test_tls_client_auth.html", https_server.GetURL("/"))); | 
|  | } | 
|  |  | 
|  | // Test that fetching a URL using HTTP auth doesn't crash, hang, or prompt. | 
|  | IN_PROC_BROWSER_TEST_F(BackgroundXhrTest, HttpAuth) { | 
|  | ASSERT_TRUE(embedded_test_server()->Start()); | 
|  | ASSERT_NO_FATAL_FAILURE(RunTest( | 
|  | "test_http_auth.html", embedded_test_server()->GetURL("/auth-basic"))); | 
|  | } |