| Index: content/browser/service_worker/service_worker_provider_host_unittest.cc
|
| diff --git a/content/browser/service_worker/service_worker_provider_host_unittest.cc b/content/browser/service_worker/service_worker_provider_host_unittest.cc
|
| index cd478f0af690ac1c068216af3d84c5752f8cf5ad..a9bec57a6651e1768ce17bf6f3fcf8d2c866e2d1 100644
|
| --- a/content/browser/service_worker/service_worker_provider_host_unittest.cc
|
| +++ b/content/browser/service_worker/service_worker_provider_host_unittest.cc
|
| @@ -13,39 +13,58 @@
|
| #include "content/browser/service_worker/service_worker_register_job.h"
|
| #include "content/browser/service_worker/service_worker_registration.h"
|
| #include "content/browser/service_worker/service_worker_version.h"
|
| +#include "content/public/common/origin_util.h"
|
| #include "content/public/test/test_browser_thread_bundle.h"
|
| +#include "content/test/test_content_browser_client.h"
|
| +#include "content/test/test_content_client.h"
|
| #include "testing/gtest/include/gtest/gtest.h"
|
|
|
| namespace content {
|
|
|
| +const char kServiceWorkerScheme[] = "i-can-use-service-worker";
|
| +
|
| +class ServiceWorkerTestContentClient : public TestContentClient {
|
| + public:
|
| + void AddServiceWorkerSchemes(std::set<std::string>* schemes) override {
|
| + schemes->insert(kServiceWorkerScheme);
|
| + }
|
| +};
|
| +
|
| class ServiceWorkerProviderHostTest : public testing::Test {
|
| protected:
|
| ServiceWorkerProviderHostTest()
|
| - : thread_bundle_(TestBrowserThreadBundle::IO_MAINLOOP) {}
|
| + : thread_bundle_(TestBrowserThreadBundle::IO_MAINLOOP) {
|
| + SetContentClient(&test_content_client_);
|
| + }
|
| ~ServiceWorkerProviderHostTest() override {}
|
|
|
| void SetUp() override {
|
| + old_content_browser_client_ =
|
| + SetBrowserClientForTesting(&test_content_browser_client_);
|
| +
|
| helper_.reset(new EmbeddedWorkerTestHelper(base::FilePath()));
|
| context_ = helper_->context();
|
| - script_url_ = GURL("http://www.example.com/service_worker.js");
|
| + script_url_ = GURL("https://www.example.com/service_worker.js");
|
| registration1_ = new ServiceWorkerRegistration(
|
| - GURL("http://www.example.com/"), 1L, context_->AsWeakPtr());
|
| + GURL("https://www.example.com/"), 1L, context_->AsWeakPtr());
|
| registration2_ = new ServiceWorkerRegistration(
|
| - GURL("http://www.example.com/example"), 2L, context_->AsWeakPtr());
|
| + GURL("https://www.example.com/example"), 2L, context_->AsWeakPtr());
|
|
|
| // Prepare provider hosts (for the same process).
|
| std::unique_ptr<ServiceWorkerProviderHost> host1(
|
| - new ServiceWorkerProviderHost(helper_->mock_render_process_id(),
|
| - MSG_ROUTING_NONE, 1 /* provider_id */,
|
| - SERVICE_WORKER_PROVIDER_FOR_WINDOW,
|
| - context_->AsWeakPtr(), NULL));
|
| - host1->SetDocumentUrl(GURL("http://www.example.com/example1.html"));
|
| + new ServiceWorkerProviderHost(
|
| + helper_->mock_render_process_id(), MSG_ROUTING_NONE,
|
| + 1 /* provider_id */, SERVICE_WORKER_PROVIDER_FOR_WINDOW,
|
| + ServiceWorkerProviderHost::FrameSecurityLevel::SECURE,
|
| + context_->AsWeakPtr(), NULL));
|
| + host1->SetDocumentUrl(GURL("https://www.example.com/example1.html"));
|
| std::unique_ptr<ServiceWorkerProviderHost> host2(
|
| - new ServiceWorkerProviderHost(helper_->mock_render_process_id(),
|
| - MSG_ROUTING_NONE, 2 /* provider_id */,
|
| - SERVICE_WORKER_PROVIDER_FOR_WINDOW,
|
| - context_->AsWeakPtr(), NULL));
|
| - host2->SetDocumentUrl(GURL("http://www.example.com/example2.html"));
|
| + new ServiceWorkerProviderHost(
|
| + helper_->mock_render_process_id(), MSG_ROUTING_NONE,
|
| + 2 /* provider_id */, SERVICE_WORKER_PROVIDER_FOR_WINDOW,
|
| + ServiceWorkerProviderHost::FrameSecurityLevel::SECURE,
|
| + context_->AsWeakPtr(), NULL));
|
| + host2->SetDocumentUrl(GURL("https://www.example.com/example2.html"));
|
| provider_host1_ = host1->AsWeakPtr();
|
| provider_host2_ = host2->AsWeakPtr();
|
| context_->AddProviderHost(base::WrapUnique(host1.release()));
|
| @@ -56,6 +75,7 @@ class ServiceWorkerProviderHostTest : public testing::Test {
|
| registration1_ = 0;
|
| registration2_ = 0;
|
| helper_.reset();
|
| + SetBrowserClientForTesting(old_content_browser_client_);
|
| }
|
|
|
| bool PatternHasProcessToRun(const GURL& pattern) const {
|
| @@ -70,6 +90,9 @@ class ServiceWorkerProviderHostTest : public testing::Test {
|
| base::WeakPtr<ServiceWorkerProviderHost> provider_host1_;
|
| base::WeakPtr<ServiceWorkerProviderHost> provider_host2_;
|
| GURL script_url_;
|
| + ServiceWorkerTestContentClient test_content_client_;
|
| + TestContentBrowserClient test_content_browser_client_;
|
| + ContentBrowserClient* old_content_browser_client_;
|
|
|
| private:
|
| DISALLOW_COPY_AND_ASSIGN(ServiceWorkerProviderHostTest);
|
| @@ -128,4 +151,37 @@ TEST_F(ServiceWorkerProviderHostTest, MatchRegistration) {
|
| ASSERT_EQ(provider_host1_->MatchRegistration(), nullptr);
|
| }
|
|
|
| +TEST_F(ServiceWorkerProviderHostTest, ContextSecurity) {
|
| + using FrameSecurityLevel = ServiceWorkerProviderHost::FrameSecurityLevel;
|
| + content::ResetSchemesAndOriginsWhitelistForTesting();
|
| +
|
| + // Insecure document URL.
|
| + provider_host1_->SetDocumentUrl(GURL("http://host"));
|
| + provider_host1_->parent_frame_security_level_ = FrameSecurityLevel::SECURE;
|
| + EXPECT_FALSE(provider_host1_->IsContextSecureForServiceWorker());
|
| +
|
| + // Insecure parent frame.
|
| + provider_host1_->SetDocumentUrl(GURL("https://host"));
|
| + provider_host1_->parent_frame_security_level_ = FrameSecurityLevel::INSECURE;
|
| + EXPECT_FALSE(provider_host1_->IsContextSecureForServiceWorker());
|
| +
|
| + // Secure URL and parent frame.
|
| + provider_host1_->SetDocumentUrl(GURL("https://host"));
|
| + provider_host1_->parent_frame_security_level_ = FrameSecurityLevel::SECURE;
|
| + EXPECT_TRUE(provider_host1_->IsContextSecureForServiceWorker());
|
| +
|
| + // Exceptional service worker scheme.
|
| + GURL url(std::string(kServiceWorkerScheme) + "://host");
|
| + EXPECT_TRUE(url.is_valid());
|
| + provider_host1_->SetDocumentUrl(url);
|
| + provider_host1_->parent_frame_security_level_ = FrameSecurityLevel::SECURE;
|
| + EXPECT_FALSE(IsOriginSecure(url));
|
| + EXPECT_TRUE(OriginCanAccessServiceWorkers(url));
|
| + EXPECT_TRUE(provider_host1_->IsContextSecureForServiceWorker());
|
| +
|
| + // Exceptional service worker scheme with insecure parent frame.
|
| + provider_host1_->parent_frame_security_level_ = FrameSecurityLevel::INSECURE;
|
| + EXPECT_FALSE(provider_host1_->IsContextSecureForServiceWorker());
|
| +}
|
| +
|
| } // namespace content
|
|
|