| Index: content/browser/service_worker/service_worker_browsertest.cc
|
| diff --git a/content/browser/service_worker/service_worker_browsertest.cc b/content/browser/service_worker/service_worker_browsertest.cc
|
| index b2f2a26afd71bcd67c7ea7d7b83b1968813fa40f..a4ec6389e45a7396e7507ae2e53ce71addacb25d 100644
|
| --- a/content/browser/service_worker/service_worker_browsertest.cc
|
| +++ b/content/browser/service_worker/service_worker_browsertest.cc
|
| @@ -11,6 +11,9 @@
|
| #include "content/browser/service_worker/embedded_worker_registry.h"
|
| #include "content/browser/service_worker/service_worker_context_core.h"
|
| #include "content/browser/service_worker/service_worker_context_wrapper.h"
|
| +#include "content/browser/service_worker/service_worker_registration.h"
|
| +#include "content/browser/service_worker/service_worker_version.h"
|
| +#include "content/common/service_worker/service_worker_messages.h"
|
| #include "content/public/browser/browser_context.h"
|
| #include "content/public/browser/browser_thread.h"
|
| #include "content/public/browser/storage_partition.h"
|
| @@ -23,14 +26,44 @@
|
|
|
| namespace content {
|
|
|
| -class ServiceWorkerBrowserTest : public ContentBrowserTest,
|
| - public EmbeddedWorkerInstance::Observer {
|
| - public:
|
| - typedef ServiceWorkerBrowserTest self;
|
| +namespace {
|
|
|
| - ServiceWorkerBrowserTest()
|
| - : last_worker_status_(EmbeddedWorkerInstance::STOPPED) {}
|
| - virtual ~ServiceWorkerBrowserTest() {}
|
| +void RunAndQuit(const base::Closure& closure,
|
| + const base::Closure& quit,
|
| + base::MessageLoopProxy* original_message_loop) {
|
| + closure.Run();
|
| + original_message_loop->PostTask(FROM_HERE, quit);
|
| +}
|
| +
|
| +void RunOnIOThread(const base::Closure& closure) {
|
| + base::RunLoop run_loop;
|
| + BrowserThread::PostTask(
|
| + BrowserThread::IO, FROM_HERE,
|
| + base::Bind(&RunAndQuit, closure, run_loop.QuitClosure(),
|
| + base::MessageLoopProxy::current()));
|
| + run_loop.Run();
|
| +}
|
| +
|
| +// TODO(kinuko): Factor out these common test helpers to a separate file.
|
| +template <typename Arg>
|
| +void VerifyResult(const tracked_objects::Location& where,
|
| + const base::Closure& quit,
|
| + Arg expected, Arg actual) {
|
| + EXPECT_EQ(expected, actual) << where.ToString();
|
| + BrowserThread::PostTask(BrowserThread::UI, FROM_HERE, quit);
|
| +}
|
| +
|
| +template <typename Arg> base::Callback<void(Arg)>
|
| +CreateVerifier(const tracked_objects::Location& where,
|
| + const base::Closure& quit, Arg expected) {
|
| + return base::Bind(&VerifyResult<Arg>, where, quit, expected);
|
| +}
|
| +
|
| +} // namespace
|
| +
|
| +class ServiceWorkerBrowserTest : public ContentBrowserTest {
|
| + protected:
|
| + typedef ServiceWorkerBrowserTest self;
|
|
|
| virtual void SetUpCommandLine(CommandLine* command_line) OVERRIDE {
|
| command_line->AppendSwitch(switches::kEnableServiceWorker);
|
| @@ -44,37 +77,62 @@ class ServiceWorkerBrowserTest : public ContentBrowserTest,
|
| }
|
|
|
| virtual void TearDownOnMainThread() OVERRIDE {
|
| - base::RunLoop run_loop;
|
| - BrowserThread::PostTask(
|
| - BrowserThread::IO, FROM_HERE,
|
| - base::Bind(&self::TearDownOnIOThread, this, run_loop.QuitClosure()));
|
| - run_loop.Run();
|
| + RunOnIOThread(base::Bind(&self::TearDownOnIOThread, this));
|
| wrapper_ = NULL;
|
| }
|
|
|
| - void TearDownOnIOThread(const base::Closure& done_closure) {
|
| + virtual void TearDownOnIOThread() {}
|
| +
|
| + ServiceWorkerContextWrapper* wrapper() { return wrapper_.get(); }
|
| +
|
| + void AssociateProcessToWorker(EmbeddedWorkerInstance* worker) {
|
| + // TODO(kinuko): this manual wiring should go away when this gets wired
|
| + // in the actual code path.
|
| + ServiceWorkerProviderHost* provider_host = GetRegisteredProviderHost();
|
| + worker->AddProcessReference(provider_host->process_id());
|
| + }
|
| +
|
| + private:
|
| + ServiceWorkerProviderHost* GetRegisteredProviderHost() {
|
| + // Assumes only one provider host is registered at this point.
|
| + std::vector<ServiceWorkerProviderHost*> providers;
|
| + wrapper_->context()->GetAllProviderHosts(&providers);
|
| + DCHECK_EQ(1U, providers.size());
|
| + return providers[0];
|
| + }
|
| +
|
| + scoped_refptr<ServiceWorkerContextWrapper> wrapper_;
|
| +};
|
| +
|
| +class EmbeddedWorkerBrowserTest : public ServiceWorkerBrowserTest,
|
| + public EmbeddedWorkerInstance::Observer {
|
| + public:
|
| + typedef EmbeddedWorkerBrowserTest self;
|
| +
|
| + EmbeddedWorkerBrowserTest()
|
| + : last_worker_status_(EmbeddedWorkerInstance::STOPPED) {}
|
| + virtual ~EmbeddedWorkerBrowserTest() {}
|
| +
|
| + virtual void TearDownOnIOThread() OVERRIDE {
|
| if (worker_) {
|
| worker_->RemoveObserver(this);
|
| worker_.reset();
|
| }
|
| - BrowserThread::PostTask(BrowserThread::UI, FROM_HERE, done_closure);
|
| }
|
|
|
| - void StartEmbeddedWorkerOnIOThread() {
|
| + void StartOnIOThread() {
|
| ASSERT_TRUE(BrowserThread::CurrentlyOn(BrowserThread::IO));
|
| - worker_ = wrapper_->context()->embedded_worker_registry()->CreateWorker();
|
| + worker_ = wrapper()->context()->embedded_worker_registry()->CreateWorker();
|
| EXPECT_EQ(EmbeddedWorkerInstance::STOPPED, worker_->status());
|
| worker_->AddObserver(this);
|
|
|
| - // TODO(kinuko): this manual wiring should go away when this gets wired
|
| - // in the actual code path.
|
| - ServiceWorkerProviderHost* provider_host = GetRegisteredProviderHost();
|
| - worker_->AddProcessReference(provider_host->process_id());
|
| + AssociateProcessToWorker(worker_.get());
|
|
|
| const int64 service_worker_version_id = 33L;
|
| const GURL script_url = embedded_test_server()->GetURL(
|
| "/service_worker/worker.js");
|
| - const bool started = worker_->Start(service_worker_version_id, script_url);
|
| + const bool started = worker_->Start(
|
| + service_worker_version_id, script_url);
|
|
|
| last_worker_status_ = worker_->status();
|
| EXPECT_TRUE(started);
|
| @@ -84,7 +142,7 @@ class ServiceWorkerBrowserTest : public ContentBrowserTest,
|
| done_closure_.Run();
|
| }
|
|
|
| - void StopEmbeddedWorkerOnIOThread() {
|
| + void StopOnIOThread() {
|
| ASSERT_TRUE(BrowserThread::CurrentlyOn(BrowserThread::IO));
|
| EXPECT_EQ(EmbeddedWorkerInstance::RUNNING, worker_->status());
|
|
|
| @@ -99,7 +157,7 @@ class ServiceWorkerBrowserTest : public ContentBrowserTest,
|
| }
|
|
|
| protected:
|
| - // Embe3ddedWorkerInstance::Observer overrides:
|
| + // EmbeddedWorkerInstance::Observer overrides:
|
| virtual void OnStarted() OVERRIDE {
|
| ASSERT_TRUE(worker_ != NULL);
|
| ASSERT_FALSE(done_closure_.is_null());
|
| @@ -116,15 +174,6 @@ class ServiceWorkerBrowserTest : public ContentBrowserTest,
|
| NOTREACHED();
|
| }
|
|
|
| - ServiceWorkerProviderHost* GetRegisteredProviderHost() {
|
| - // Assumes only one provider host is registered at this point.
|
| - std::vector<ServiceWorkerProviderHost*> providers;
|
| - wrapper_->context()->GetAllProviderHosts(&providers);
|
| - DCHECK_EQ(1U, providers.size());
|
| - return providers[0];
|
| - }
|
| -
|
| - scoped_refptr<ServiceWorkerContextWrapper> wrapper_;
|
| scoped_ptr<EmbeddedWorkerInstance> worker_;
|
| EmbeddedWorkerInstance::Status last_worker_status_;
|
|
|
| @@ -133,7 +182,55 @@ class ServiceWorkerBrowserTest : public ContentBrowserTest,
|
| base::Closure done_closure_;
|
| };
|
|
|
| -IN_PROC_BROWSER_TEST_F(ServiceWorkerBrowserTest, EmbeddedWorkerBasic) {
|
| +class ServiceWorkerVersionBrowserTest : public ServiceWorkerBrowserTest {
|
| + public:
|
| + typedef ServiceWorkerVersionBrowserTest self;
|
| +
|
| + ServiceWorkerVersionBrowserTest() {}
|
| + virtual ~ServiceWorkerVersionBrowserTest() {}
|
| +
|
| + virtual void TearDownOnIOThread() OVERRIDE {
|
| + if (registration_) {
|
| + registration_->Shutdown();
|
| + registration_ = NULL;
|
| + }
|
| + if (version_) {
|
| + version_->Shutdown();
|
| + version_ = NULL;
|
| + }
|
| + }
|
| +
|
| + void StartOnIOThread(const std::string& worker_url,
|
| + ServiceWorkerStatusCode expected,
|
| + const base::Closure& done) {
|
| + ASSERT_TRUE(BrowserThread::CurrentlyOn(BrowserThread::IO));
|
| +
|
| + const int64 registration_id = 1L;
|
| + const int64 version_id = 1L;
|
| + registration_ = new ServiceWorkerRegistration(
|
| + embedded_test_server()->GetURL("/*"),
|
| + embedded_test_server()->GetURL(worker_url),
|
| + registration_id);
|
| + version_ = new ServiceWorkerVersion(
|
| + registration_,
|
| + wrapper()->context()->embedded_worker_registry(),
|
| + version_id);
|
| + AssociateProcessToWorker(version_->embedded_worker());
|
| + version_->StartWorker(CreateVerifier(FROM_HERE, done, expected));
|
| + }
|
| +
|
| + void StopOnIOThread(const base::Closure& done) {
|
| + ASSERT_TRUE(version_);
|
| + version_->StopWorker(
|
| + CreateVerifier(FROM_HERE, done, SERVICE_WORKER_OK));
|
| + }
|
| +
|
| + protected:
|
| + scoped_refptr<ServiceWorkerRegistration> registration_;
|
| + scoped_refptr<ServiceWorkerVersion> version_;
|
| +};
|
| +
|
| +IN_PROC_BROWSER_TEST_F(EmbeddedWorkerBrowserTest, StartAndStop) {
|
| // Navigate to the page to set up a provider.
|
| NavigateToURLBlockUntilNavigationsComplete(
|
| shell(), embedded_test_server()->GetURL("/service_worker/index.html"), 1);
|
| @@ -141,9 +238,8 @@ IN_PROC_BROWSER_TEST_F(ServiceWorkerBrowserTest, EmbeddedWorkerBasic) {
|
| // Start a worker and wait until OnStarted() is called.
|
| base::RunLoop start_run_loop;
|
| done_closure_ = start_run_loop.QuitClosure();
|
| - BrowserThread::PostTask(
|
| - BrowserThread::IO, FROM_HERE,
|
| - base::Bind(&self::StartEmbeddedWorkerOnIOThread, this));
|
| + BrowserThread::PostTask(BrowserThread::IO, FROM_HERE,
|
| + base::Bind(&self::StartOnIOThread, this));
|
| start_run_loop.Run();
|
|
|
| ASSERT_EQ(EmbeddedWorkerInstance::RUNNING, last_worker_status_);
|
| @@ -151,12 +247,48 @@ IN_PROC_BROWSER_TEST_F(ServiceWorkerBrowserTest, EmbeddedWorkerBasic) {
|
| // Stop a worker and wait until OnStopped() is called.
|
| base::RunLoop stop_run_loop;
|
| done_closure_ = stop_run_loop.QuitClosure();
|
| - BrowserThread::PostTask(
|
| - BrowserThread::IO, FROM_HERE,
|
| - base::Bind(&self::StopEmbeddedWorkerOnIOThread, this));
|
| + BrowserThread::PostTask(BrowserThread::IO, FROM_HERE,
|
| + base::Bind(&self::StopOnIOThread, this));
|
| stop_run_loop.Run();
|
|
|
| ASSERT_EQ(EmbeddedWorkerInstance::STOPPED, last_worker_status_);
|
| }
|
|
|
| +IN_PROC_BROWSER_TEST_F(ServiceWorkerVersionBrowserTest, StartAndStop) {
|
| + // Navigate to the page to set up a provider.
|
| + NavigateToURLBlockUntilNavigationsComplete(
|
| + shell(), embedded_test_server()->GetURL("/service_worker/index.html"), 1);
|
| +
|
| + // Start a worker.
|
| + base::RunLoop start_run_loop;
|
| + BrowserThread::PostTask(BrowserThread::IO, FROM_HERE,
|
| + base::Bind(&self::StartOnIOThread, this,
|
| + "/service_worker/worker.js",
|
| + SERVICE_WORKER_OK,
|
| + start_run_loop.QuitClosure()));
|
| + start_run_loop.Run();
|
| +
|
| + // Stop the worker.
|
| + base::RunLoop stop_run_loop;
|
| + BrowserThread::PostTask(BrowserThread::IO, FROM_HERE,
|
| + base::Bind(&self::StopOnIOThread, this,
|
| + stop_run_loop.QuitClosure()));
|
| + stop_run_loop.Run();
|
| +}
|
| +
|
| +IN_PROC_BROWSER_TEST_F(ServiceWorkerVersionBrowserTest, StartNotFound) {
|
| + // Navigate to the page to set up a provider.
|
| + NavigateToURLBlockUntilNavigationsComplete(
|
| + shell(), embedded_test_server()->GetURL("/service_worker/index.html"), 1);
|
| +
|
| + // Start a worker for nonexistent URL.
|
| + base::RunLoop start_run_loop;
|
| + BrowserThread::PostTask(BrowserThread::IO, FROM_HERE,
|
| + base::Bind(&self::StartOnIOThread, this,
|
| + "/service_worker/nonexistent.js",
|
| + SERVICE_WORKER_ERROR_START_WORKER_FAILED,
|
| + start_run_loop.QuitClosure()));
|
| + start_run_loop.Run();
|
| +}
|
| +
|
| } // namespace content
|
|
|