Index: content/browser/service_worker/service_worker_context_request_handler_unittest.cc |
diff --git a/content/browser/service_worker/service_worker_context_request_handler_unittest.cc b/content/browser/service_worker/service_worker_context_request_handler_unittest.cc |
index 5c6a1d7a1e1d1f0d8310b5d2b6607336a285b06b..c805344c9bbd1084b62eb9a9ebb00e7f1c2feef6 100644 |
--- a/content/browser/service_worker/service_worker_context_request_handler_unittest.cc |
+++ b/content/browser/service_worker/service_worker_context_request_handler_unittest.cc |
@@ -14,6 +14,7 @@ |
#include "content/browser/service_worker/embedded_worker_test_helper.h" |
#include "content/browser/service_worker/service_worker_context_core.h" |
#include "content/browser/service_worker/service_worker_provider_host.h" |
+#include "content/browser/service_worker/service_worker_read_from_cache_job.h" |
#include "content/browser/service_worker/service_worker_registration.h" |
#include "content/browser/service_worker/service_worker_test_utils.h" |
#include "content/browser/service_worker/service_worker_write_to_cache_job.h" |
@@ -22,6 +23,7 @@ |
#include "content/public/test/test_browser_thread_bundle.h" |
#include "net/base/load_flags.h" |
#include "net/url_request/url_request_context.h" |
+#include "net/url_request/url_request_job_factory_impl.h" |
#include "storage/browser/blob/blob_storage_context.h" |
#include "testing/gtest/include/gtest/gtest.h" |
@@ -31,7 +33,23 @@ namespace { |
void EmptyCallback() {} |
-} |
+} // namespace |
+ |
+class ServiceWorkerContextRequestHandlerTest; |
+ |
+class MockHttpProtocolHandler |
horo
2017/01/10 07:09:27
class MockHttpProtocolHandler
: public net::UR
falken
2017/01/10 08:17:46
Done.
|
+ : public net::URLRequestJobFactory::ProtocolHandler { |
+ public: |
+ MockHttpProtocolHandler(ServiceWorkerContextRequestHandlerTest* test); |
+ |
+ net::URLRequestJob* MaybeCreateJob( |
+ net::URLRequest* request, |
+ net::NetworkDelegate* network_delegate) const override; |
+ |
+ private: |
+ // Owns |this|. |
+ ServiceWorkerContextRequestHandlerTest* test_; |
+}; |
class ServiceWorkerContextRequestHandlerTest : public testing::Test { |
public: |
@@ -42,14 +60,14 @@ class ServiceWorkerContextRequestHandlerTest : public testing::Test { |
helper_.reset(new EmbeddedWorkerTestHelper(base::FilePath())); |
// A new unstored registration/version. |
- scope_ = GURL("http://host/scope/"); |
- script_url_ = GURL("http://host/script.js"); |
+ scope_ = GURL("https://host/scope/"); |
+ script_url_ = GURL("https://host/script.js"); |
registration_ = new ServiceWorkerRegistration( |
scope_, 1L, context()->AsWeakPtr()); |
version_ = new ServiceWorkerVersion( |
registration_.get(), script_url_, 1L, context()->AsWeakPtr()); |
- // An empty host. |
+ // A provider host for the version. |
std::unique_ptr<ServiceWorkerProviderHost> host( |
new ServiceWorkerProviderHost( |
helper_->mock_render_process_id(), |
@@ -59,9 +77,15 @@ class ServiceWorkerContextRequestHandlerTest : public testing::Test { |
context()->AsWeakPtr(), nullptr)); |
provider_host_ = host->AsWeakPtr(); |
context()->AddProviderHost(std::move(host)); |
+ provider_host_->running_hosted_version_ = version_; |
context()->storage()->LazyInitialize(base::Bind(&EmptyCallback)); |
base::RunLoop().RunUntilIdle(); |
+ |
+ std::unique_ptr<MockHttpProtocolHandler> handler( |
+ new MockHttpProtocolHandler(this)); |
+ url_request_job_factory_.SetProtocolHandler("https", std::move(handler)); |
+ url_request_context_.set_job_factory(&url_request_job_factory_); |
} |
void TearDown() override { |
@@ -72,6 +96,13 @@ class ServiceWorkerContextRequestHandlerTest : public testing::Test { |
ServiceWorkerContextCore* context() const { return helper_->context(); } |
+ EmbeddedWorkerTestHelper* helper() { return helper_.get(); } |
+ ServiceWorkerVersion* version() { return version_.get(); } |
+ ServiceWorkerProviderHost* provider_host() { return provider_host_.get(); } |
+ storage::BlobStorageContext* blob_storage_context() { |
+ return &blob_storage_context_; |
+ } |
+ |
protected: |
TestBrowserThreadBundle browser_thread_bundle_; |
std::unique_ptr<EmbeddedWorkerTestHelper> helper_; |
@@ -80,11 +111,35 @@ class ServiceWorkerContextRequestHandlerTest : public testing::Test { |
base::WeakPtr<ServiceWorkerProviderHost> provider_host_; |
net::URLRequestContext url_request_context_; |
MockURLRequestDelegate url_request_delegate_; |
+ net::URLRequestJobFactoryImpl url_request_job_factory_; |
GURL scope_; |
GURL script_url_; |
storage::BlobStorageContext blob_storage_context_; |
}; |
+MockHttpProtocolHandler::MockHttpProtocolHandler( |
+ ServiceWorkerContextRequestHandlerTest* test) |
+ : test_(test) {} |
+ |
+net::URLRequestJob* MockHttpProtocolHandler::MaybeCreateJob( |
+ net::URLRequest* request, |
+ net::NetworkDelegate* network_delegate) const { |
+ bool is_main_script = request->url() == test_->version()->script_url(); |
+ ResourceType resource_type = |
+ is_main_script ? RESOURCE_TYPE_SERVICE_WORKER : RESOURCE_TYPE_SCRIPT; |
+ ServiceWorkerRequestHandler::InitializeHandler( |
horo
2017/01/10 07:09:27
Calling ServiceWorkerRequestHandler::InitializeHan
falken
2017/01/10 08:17:46
Good idea, done.
|
+ request, test_->helper()->context_wrapper(), |
+ test_->blob_storage_context(), test_->helper()->mock_render_process_id(), |
+ test_->provider_host()->provider_id(), true /* skip_service_worker */, |
+ FETCH_REQUEST_MODE_NO_CORS, FETCH_CREDENTIALS_MODE_OMIT, |
+ FetchRedirectMode::FOLLOW_MODE, resource_type, |
+ REQUEST_CONTEXT_TYPE_SERVICE_WORKER, REQUEST_CONTEXT_FRAME_TYPE_NONE, |
+ nullptr); |
+ ServiceWorkerRequestHandler* handler = |
+ ServiceWorkerRequestHandler::GetHandler(request); |
+ return handler->MaybeCreateJob(request, network_delegate, nullptr); |
+} |
+ |
class ServiceWorkerContextRequestHandlerTestP |
: public MojoServiceWorkerTestP<ServiceWorkerContextRequestHandlerTest> {}; |
@@ -93,10 +148,9 @@ TEST_P(ServiceWorkerContextRequestHandlerTestP, UpdateBefore24Hours) { |
// we're installing a new version. |
registration_->set_last_update_check(base::Time::Now()); |
version_->SetStatus(ServiceWorkerVersion::NEW); |
- provider_host_->running_hosted_version_ = version_; |
// Conduct a resource fetch for the main script. |
- const GURL kScriptUrl("http://host/script.js"); |
+ const GURL kScriptUrl("https://host/script.js"); |
std::unique_ptr<net::URLRequest> request = url_request_context_.CreateRequest( |
kScriptUrl, net::DEFAULT_PRIORITY, &url_request_delegate_); |
std::unique_ptr<ServiceWorkerContextRequestHandler> handler( |
@@ -120,10 +174,9 @@ TEST_P(ServiceWorkerContextRequestHandlerTestP, UpdateAfter24Hours) { |
registration_->set_last_update_check( |
base::Time::Now() - base::TimeDelta::FromDays(7)); |
version_->SetStatus(ServiceWorkerVersion::NEW); |
- provider_host_->running_hosted_version_ = version_; |
// Conduct a resource fetch for the main script. |
- const GURL kScriptUrl("http://host/script.js"); |
+ const GURL kScriptUrl("https://host/script.js"); |
std::unique_ptr<net::URLRequest> request = url_request_context_.CreateRequest( |
kScriptUrl, net::DEFAULT_PRIORITY, &url_request_delegate_); |
std::unique_ptr<ServiceWorkerContextRequestHandler> handler( |
@@ -147,10 +200,9 @@ TEST_P(ServiceWorkerContextRequestHandlerTestP, UpdateForceBypassCache) { |
registration_->set_last_update_check(base::Time::Now()); |
version_->SetStatus(ServiceWorkerVersion::NEW); |
version_->set_force_bypass_cache_for_scripts(true); |
- provider_host_->running_hosted_version_ = version_; |
// Conduct a resource fetch for the main script. |
- const GURL kScriptUrl("http://host/script.js"); |
+ const GURL kScriptUrl("https://host/script.js"); |
std::unique_ptr<net::URLRequest> request = url_request_context_.CreateRequest( |
kScriptUrl, net::DEFAULT_PRIORITY, &url_request_delegate_); |
std::unique_ptr<ServiceWorkerContextRequestHandler> handler( |
@@ -171,10 +223,9 @@ TEST_P(ServiceWorkerContextRequestHandlerTestP, UpdateForceBypassCache) { |
TEST_P(ServiceWorkerContextRequestHandlerTestP, |
ServiceWorkerDataRequestAnnotation) { |
version_->SetStatus(ServiceWorkerVersion::NEW); |
- provider_host_->running_hosted_version_ = version_; |
// Conduct a resource fetch for the main script. |
- const GURL kScriptUrl("http://host/script.js"); |
+ const GURL kScriptUrl("https://host/script.js"); |
std::unique_ptr<net::URLRequest> request = url_request_context_.CreateRequest( |
kScriptUrl, net::DEFAULT_PRIORITY, &url_request_delegate_); |
std::unique_ptr<ServiceWorkerContextRequestHandler> handler( |
@@ -200,8 +251,7 @@ TEST_P(ServiceWorkerContextRequestHandlerTestP, |
SkipServiceWorkerForServiceWorkerRequest) { |
// Conduct a resource fetch for the main script. |
version_->SetStatus(ServiceWorkerVersion::NEW); |
- provider_host_->running_hosted_version_ = version_; |
- const GURL kScriptUrl("http://host/script.js"); |
+ const GURL kScriptUrl("https://host/script.js"); |
std::unique_ptr<net::URLRequest> request = url_request_context_.CreateRequest( |
kScriptUrl, net::DEFAULT_PRIORITY, &url_request_delegate_); |
ServiceWorkerRequestHandler::InitializeHandler( |
@@ -217,6 +267,20 @@ TEST_P(ServiceWorkerContextRequestHandlerTestP, |
EXPECT_TRUE(handler); |
} |
+TEST_P(ServiceWorkerContextRequestHandlerTestP, RedundantVersion) { |
+ // Create a redundant version. |
+ version_->SetStatus(ServiceWorkerVersion::REDUNDANT); |
+ |
+ // Conduct a resource fetch for the main script. |
+ std::unique_ptr<net::URLRequest> request = url_request_context_.CreateRequest( |
+ version_->script_url(), net::DEFAULT_PRIORITY, &url_request_delegate_); |
+ |
horo
2017/01/10 07:09:27
You can call ServiceWorkerRequestHandler::Initiali
falken
2017/01/10 08:17:46
Done.
|
+ // Verify that the request fails. |
+ request->Start(); |
+ base::RunLoop().Run(); |
+ EXPECT_EQ(net::ERR_FAILED, url_request_delegate_.request_status()); |
+} |
+ |
INSTANTIATE_TEST_CASE_P(ServiceWorkerContextRequestHandlerTest, |
ServiceWorkerContextRequestHandlerTestP, |
testing::Bool()); |