Index: content/browser/service_worker/link_header_support_unittest.cc |
diff --git a/content/browser/service_worker/link_header_support_unittest.cc b/content/browser/service_worker/link_header_support_unittest.cc |
index ce7406f30246c01eee1d5d750f8f36063899e32b..1b0598b71606d61cd52bb9ede5f0000312ad0e56 100644 |
--- a/content/browser/service_worker/link_header_support_unittest.cc |
+++ b/content/browser/service_worker/link_header_support_unittest.cc |
@@ -13,6 +13,7 @@ |
#include "content/browser/service_worker/service_worker_registration.h" |
#include "content/browser/service_worker/service_worker_request_handler.h" |
#include "content/browser/service_worker/service_worker_test_utils.h" |
+#include "content/common/service_worker/service_worker_utils.h" |
#include "content/public/common/content_switches.h" |
#include "content/public/test/mock_resource_context.h" |
#include "content/public/test/test_browser_thread_bundle.h" |
@@ -49,6 +50,8 @@ SaveFoundRegistrations( |
registrations); |
} |
+} // namespace |
+ |
class LinkHeaderServiceWorkerTest : public ::testing::Test { |
public: |
LinkHeaderServiceWorkerTest() |
@@ -65,8 +68,8 @@ class LinkHeaderServiceWorkerTest : public ::testing::Test { |
// An empty host. |
std::unique_ptr<ServiceWorkerProviderHost> host( |
new ServiceWorkerProviderHost( |
- helper_->mock_render_process_id(), MSG_ROUTING_NONE, |
- kMockProviderId, SERVICE_WORKER_PROVIDER_FOR_WINDOW, |
+ render_process_id(), MSG_ROUTING_NONE, kMockProviderId, |
+ SERVICE_WORKER_PROVIDER_FOR_WINDOW, |
ServiceWorkerProviderHost::FrameSecurityLevel::UNINITIALIZED, |
context()->AsWeakPtr(), nullptr)); |
provider_host_ = host->AsWeakPtr(); |
@@ -80,6 +83,28 @@ class LinkHeaderServiceWorkerTest : public ::testing::Test { |
return helper_->context_wrapper(); |
} |
ServiceWorkerProviderHost* provider_host() { return provider_host_.get(); } |
+ int render_process_id() const { return helper_->mock_render_process_id(); } |
+ |
+ void CreateServiceWorkerProviderHost() { |
+ std::unique_ptr<ServiceWorkerProviderHost> host( |
+ new ServiceWorkerProviderHost( |
+ render_process_id(), MSG_ROUTING_NONE, kMockProviderId, |
+ SERVICE_WORKER_PROVIDER_FOR_CONTROLLER, |
+ ServiceWorkerProviderHost::FrameSecurityLevel::UNINITIALIZED, |
+ context()->AsWeakPtr(), nullptr)); |
+ provider_host_ = host->AsWeakPtr(); |
+ context()->RemoveProviderHost(host->process_id(), host->provider_id()); |
+ context()->AddProviderHost(std::move(host)); |
+ |
+ scoped_refptr<ServiceWorkerRegistration> registration = |
+ new ServiceWorkerRegistration(GURL("https://host/scope"), 1L, |
+ context()->AsWeakPtr()); |
+ scoped_refptr<ServiceWorkerVersion> version = new ServiceWorkerVersion( |
+ registration.get(), GURL("https://host/script.js"), 1L, |
+ context()->AsWeakPtr()); |
+ |
+ provider_host_->running_hosted_version_ = version; |
+ } |
std::unique_ptr<net::URLRequest> CreateRequest(const GURL& request_url, |
ResourceType resource_type) { |
@@ -96,11 +121,11 @@ class LinkHeaderServiceWorkerTest : public ::testing::Test { |
ServiceWorkerRequestHandler::InitializeHandler( |
request.get(), context_wrapper(), &blob_storage_context_, |
- helper_->mock_render_process_id(), kMockProviderId, |
- false /* skip_service_worker */, FETCH_REQUEST_MODE_NO_CORS, |
- FETCH_CREDENTIALS_MODE_OMIT, FetchRedirectMode::FOLLOW_MODE, |
- resource_type, REQUEST_CONTEXT_TYPE_HYPERLINK, |
- REQUEST_CONTEXT_FRAME_TYPE_TOP_LEVEL, nullptr); |
+ render_process_id(), kMockProviderId, false /* skip_service_worker */, |
+ FETCH_REQUEST_MODE_NO_CORS, FETCH_CREDENTIALS_MODE_OMIT, |
+ FetchRedirectMode::FOLLOW_MODE, resource_type, |
+ REQUEST_CONTEXT_TYPE_HYPERLINK, REQUEST_CONTEXT_FRAME_TYPE_TOP_LEVEL, |
+ nullptr); |
return request; |
} |
@@ -334,10 +359,41 @@ TEST_P(LinkHeaderServiceWorkerTestP, |
ASSERT_EQ(0u, registrations.size()); |
} |
+TEST_P(LinkHeaderServiceWorkerTestP, |
+ InstallServiceWorker_FromWorkerWithoutControllees) { |
+ CreateServiceWorkerProviderHost(); |
+ ProcessLinkHeaderForRequest( |
+ CreateSubresourceRequest(GURL("https://example.com/foo/bar/")).get(), |
+ "<../foo.js>; rel=serviceworker", context_wrapper()); |
+ base::RunLoop().RunUntilIdle(); |
+ |
+ std::vector<ServiceWorkerRegistrationInfo> registrations = GetRegistrations(); |
+ ASSERT_EQ(0u, registrations.size()); |
+} |
+ |
+TEST_P(LinkHeaderServiceWorkerTestP, |
+ InstallServiceWorker_FromWorkerWithControllees) { |
+ CreateServiceWorkerProviderHost(); |
+ |
+ std::unique_ptr<ServiceWorkerProviderHost> controllee( |
+ new ServiceWorkerProviderHost( |
+ render_process_id(), MSG_ROUTING_NONE, kMockProviderId, |
+ SERVICE_WORKER_PROVIDER_FOR_WINDOW, |
+ ServiceWorkerProviderHost::FrameSecurityLevel::UNINITIALIZED, |
+ context()->AsWeakPtr(), nullptr)); |
+ provider_host()->running_hosted_version()->AddControllee(controllee.get()); |
+ |
+ ProcessLinkHeaderForRequest( |
+ CreateSubresourceRequest(GURL("https://example.com/foo/bar/")).get(), |
+ "<../foo.js>; rel=serviceworker", context_wrapper()); |
+ base::RunLoop().RunUntilIdle(); |
+ |
+ std::vector<ServiceWorkerRegistrationInfo> registrations = GetRegistrations(); |
+ ASSERT_EQ(1u, registrations.size()); |
+} |
+ |
INSTANTIATE_TEST_CASE_P(LinkHeaderServiceWorkerTest, |
LinkHeaderServiceWorkerTestP, |
testing::Bool()); |
-} // namespace |
- |
} // namespace content |