| 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 b833a0ffc3bfabc7d0bc86fccc2d36f5a9e2ddaa..5a88701c797ea668c6967469e8d9713e7d151bce 100644
|
| --- a/content/browser/service_worker/service_worker_browsertest.cc
|
| +++ b/content/browser/service_worker/service_worker_browsertest.cc
|
| @@ -14,7 +14,6 @@
|
| #include "content/browser/service_worker/service_worker_test_utils.h"
|
| #include "content/browser/service_worker/service_worker_version.h"
|
| #include "content/common/service_worker/service_worker_messages.h"
|
| -#include "content/common/service_worker/service_worker_status_code.h"
|
| #include "content/common/service_worker/service_worker_types.h"
|
| #include "content/public/browser/browser_context.h"
|
| #include "content/public/browser/browser_thread.h"
|
| @@ -22,6 +21,7 @@
|
| #include "content/public/browser/storage_partition.h"
|
| #include "content/public/browser/web_contents.h"
|
| #include "content/public/common/content_switches.h"
|
| +#include "content/public/common/service_worker_status_code.h"
|
| #include "content/shell/browser/shell.h"
|
| #include "content/test/content_browser_test.h"
|
| #include "content/test/content_browser_test_utils.h"
|
| @@ -53,6 +53,20 @@ void RunOnIOThread(const base::Closure& closure) {
|
| run_loop.Run();
|
| }
|
|
|
| +void RunOnIOThread(
|
| + const base::Callback<void(const base::Closure& continuation)>& closure) {
|
| + base::RunLoop run_loop;
|
| + base::Closure quit_on_original_thread =
|
| + base::Bind(base::IgnoreResult(&base::MessageLoopProxy::PostTask),
|
| + base::MessageLoopProxy::current().get(),
|
| + FROM_HERE,
|
| + run_loop.QuitClosure());
|
| + BrowserThread::PostTask(BrowserThread::IO,
|
| + FROM_HERE,
|
| + base::Bind(closure, quit_on_original_thread));
|
| + run_loop.Run();
|
| +}
|
| +
|
| // Contrary to the style guide, the output parameter of this function comes
|
| // before input parameters so Bind can be used on it to create a FetchCallback
|
| // to pass to DispatchFetchEvent.
|
| @@ -90,7 +104,8 @@ class ServiceWorkerBrowserTest : public ContentBrowserTest {
|
| ASSERT_TRUE(embedded_test_server()->InitializeAndWaitUntilReady());
|
| StoragePartition* partition = BrowserContext::GetDefaultStoragePartition(
|
| shell()->web_contents()->GetBrowserContext());
|
| - wrapper_ = partition->GetServiceWorkerContext();
|
| + wrapper_ = static_cast<ServiceWorkerContextWrapper*>(
|
| + partition->GetServiceWorkerContext());
|
|
|
| // Navigate to the page to set up a renderer page (where we can embed
|
| // a worker).
|
| @@ -110,6 +125,7 @@ class ServiceWorkerBrowserTest : public ContentBrowserTest {
|
| virtual void TearDownOnIOThread() {}
|
|
|
| ServiceWorkerContextWrapper* wrapper() { return wrapper_.get(); }
|
| + ServiceWorkerContext* public_context() { return wrapper(); }
|
|
|
| void AssociateRendererProcessToWorker(EmbeddedWorkerInstance* worker) {
|
| worker->AddProcessReference(
|
| @@ -416,4 +432,96 @@ IN_PROC_BROWSER_TEST_F(ServiceWorkerVersionBrowserTest, FetchEvent_Rejected) {
|
| ASSERT_EQ(SERVICE_WORKER_FETCH_EVENT_RESULT_FALLBACK, result);
|
| }
|
|
|
| +class ServiceWorkerBlackBoxBrowserTest : public ServiceWorkerBrowserTest {
|
| + public:
|
| + typedef ServiceWorkerBlackBoxBrowserTest self;
|
| +
|
| + static void ExpectStatusAndRun(ServiceWorkerStatusCode expected,
|
| + const base::Closure& continuation,
|
| + ServiceWorkerStatusCode actual) {
|
| + EXPECT_EQ(expected, actual);
|
| + continuation.Run();
|
| + }
|
| +
|
| + int RenderProcessID() {
|
| + return shell()->web_contents()->GetRenderProcessHost()->GetID();
|
| + }
|
| +
|
| + void FindRegistrationOnIO(const GURL& document_url,
|
| + ServiceWorkerStatusCode* status,
|
| + GURL* script_url,
|
| + const base::Closure& continuation) {
|
| + wrapper()->context()->storage()->FindRegistrationForDocument(
|
| + document_url,
|
| + base::Bind(&ServiceWorkerBlackBoxBrowserTest::FindRegistrationOnIO2,
|
| + this,
|
| + status,
|
| + script_url,
|
| + continuation));
|
| + }
|
| +
|
| + void FindRegistrationOnIO2(
|
| + ServiceWorkerStatusCode* out_status,
|
| + GURL* script_url,
|
| + const base::Closure& continuation,
|
| + ServiceWorkerStatusCode status,
|
| + const scoped_refptr<ServiceWorkerRegistration>& registration) {
|
| + *out_status = status;
|
| + if (registration) {
|
| + *script_url = registration->script_url();
|
| + } else {
|
| + EXPECT_NE(SERVICE_WORKER_OK, status);
|
| + }
|
| + continuation.Run();
|
| + }
|
| +};
|
| +
|
| +IN_PROC_BROWSER_TEST_F(ServiceWorkerBlackBoxBrowserTest, Registration) {
|
| + const std::string kWorkerUrl = "/service_worker/fetch_event.js";
|
| + {
|
| + base::RunLoop run_loop;
|
| + public_context()->RegisterServiceWorker(
|
| + embedded_test_server()->GetURL("/*"),
|
| + embedded_test_server()->GetURL(kWorkerUrl),
|
| + RenderProcessID(),
|
| + base::Bind(&ServiceWorkerBlackBoxBrowserTest::ExpectStatusAndRun,
|
| + SERVICE_WORKER_OK,
|
| + run_loop.QuitClosure()));
|
| + run_loop.Run();
|
| + }
|
| + {
|
| + ServiceWorkerStatusCode status = SERVICE_WORKER_ERROR_FAILED;
|
| + GURL script_url;
|
| + RunOnIOThread(
|
| + base::Bind(&ServiceWorkerBlackBoxBrowserTest::FindRegistrationOnIO,
|
| + this,
|
| + embedded_test_server()->GetURL("/service_worker/empty.html"),
|
| + &status,
|
| + &script_url));
|
| + EXPECT_EQ(SERVICE_WORKER_OK, status);
|
| + EXPECT_EQ(embedded_test_server()->GetURL(kWorkerUrl), script_url);
|
| + }
|
| + {
|
| + base::RunLoop run_loop;
|
| + public_context()->UnregisterServiceWorker(
|
| + embedded_test_server()->GetURL("/*"),
|
| + RenderProcessID(),
|
| + base::Bind(&ServiceWorkerBlackBoxBrowserTest::ExpectStatusAndRun,
|
| + SERVICE_WORKER_OK,
|
| + run_loop.QuitClosure()));
|
| + run_loop.Run();
|
| + }
|
| + {
|
| + ServiceWorkerStatusCode status = SERVICE_WORKER_ERROR_FAILED;
|
| + GURL script_url;
|
| + RunOnIOThread(
|
| + base::Bind(&ServiceWorkerBlackBoxBrowserTest::FindRegistrationOnIO,
|
| + this,
|
| + embedded_test_server()->GetURL("/service_worker/empty.html"),
|
| + &status,
|
| + &script_url));
|
| + EXPECT_EQ(SERVICE_WORKER_ERROR_NOT_FOUND, status);
|
| + }
|
| +}
|
| +
|
| } // namespace content
|
|
|