service_worker_context_wrapper.cc revision 010d83a9304c5a91596085d917d248abff47903a
1f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)// Copyright 2013 The Chromium Authors. All rights reserved.
2f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
3f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)// found in the LICENSE file.
4f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
5f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "content/browser/service_worker/service_worker_context_wrapper.h"
6f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
7f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "base/files/file_path.h"
8010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)#include "base/threading/sequenced_worker_pool.h"
9f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "content/browser/service_worker/service_worker_context_core.h"
100529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch#include "content/browser/service_worker/service_worker_context_observer.h"
115c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu#include "content/browser/service_worker/service_worker_process_manager.h"
12f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "content/public/browser/browser_thread.h"
135d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "webkit/browser/quota/quota_manager_proxy.h"
14f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
15f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)namespace content {
16f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
175c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo LiuServiceWorkerContextWrapper::ServiceWorkerContextWrapper(
185c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu    BrowserContext* browser_context)
190529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch    : observer_list_(
205c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu          new ObserverListThreadSafe<ServiceWorkerContextObserver>()),
215c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu      browser_context_(browser_context) {
225c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu}
23f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
24f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)ServiceWorkerContextWrapper::~ServiceWorkerContextWrapper() {
25f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)}
26f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
27f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)void ServiceWorkerContextWrapper::Init(
28f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    const base::FilePath& user_data_directory,
29f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    quota::QuotaManagerProxy* quota_manager_proxy) {
30010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  scoped_refptr<base::SequencedTaskRunner> database_task_runner =
31010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      BrowserThread::GetBlockingPool()->
32010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)          GetSequencedTaskRunnerWithShutdownBehavior(
33010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)              BrowserThread::GetBlockingPool()->GetSequenceToken(),
34010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)              base::SequencedWorkerPool::SKIP_ON_SHUTDOWN);
35010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  InitInternal(user_data_directory, database_task_runner, quota_manager_proxy);
36f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)}
37f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
38f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)void ServiceWorkerContextWrapper::Shutdown() {
39f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  if (!BrowserThread::CurrentlyOn(BrowserThread::IO)) {
405c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu    DCHECK_CURRENTLY_ON(BrowserThread::UI);
415c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu    browser_context_ = NULL;
42f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    BrowserThread::PostTask(
43f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)        BrowserThread::IO, FROM_HERE,
44f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)        base::Bind(&ServiceWorkerContextWrapper::Shutdown, this));
45f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    return;
46f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  }
475c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  // Breaks the reference cycle through ServiceWorkerProcessManager.
48f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  context_core_.reset();
49f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)}
50f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
51f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)ServiceWorkerContextCore* ServiceWorkerContextWrapper::context() {
52effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  DCHECK_CURRENTLY_ON(BrowserThread::IO);
53f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  return context_core_.get();
54f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)}
55f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
56effb81e5f8246d0db0270817048dc992db66e9fbBen Murdochstatic void FinishRegistrationOnIO(
57effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch    const ServiceWorkerContext::ResultCallback& continuation,
58effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch    ServiceWorkerStatusCode status,
59c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    int64 registration_id,
60c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    int64 version_id) {
61effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  DCHECK_CURRENTLY_ON(BrowserThread::IO);
62effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  BrowserThread::PostTask(
63effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch      BrowserThread::UI,
64effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch      FROM_HERE,
65effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch      base::Bind(continuation, status == SERVICE_WORKER_OK));
66effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch}
67effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
68effb81e5f8246d0db0270817048dc992db66e9fbBen Murdochvoid ServiceWorkerContextWrapper::RegisterServiceWorker(
69effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch    const GURL& pattern,
70effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch    const GURL& script_url,
71effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch    const ResultCallback& continuation) {
72effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  if (!BrowserThread::CurrentlyOn(BrowserThread::IO)) {
73effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch    BrowserThread::PostTask(
74effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch        BrowserThread::IO,
75effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch        FROM_HERE,
76effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch        base::Bind(&ServiceWorkerContextWrapper::RegisterServiceWorker,
77effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch                   this,
78effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch                   pattern,
79effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch                   script_url,
80effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch                   continuation));
81effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch    return;
82effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  }
83effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
84effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  context()->RegisterServiceWorker(
85effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch      pattern,
86effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch      script_url,
875c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu      -1,
88a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch      NULL /* provider_host */,
89effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch      base::Bind(&FinishRegistrationOnIO, continuation));
90effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch}
91effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
92effb81e5f8246d0db0270817048dc992db66e9fbBen Murdochstatic void FinishUnregistrationOnIO(
93effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch    const ServiceWorkerContext::ResultCallback& continuation,
94effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch    ServiceWorkerStatusCode status) {
95effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  DCHECK_CURRENTLY_ON(BrowserThread::IO);
96effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  BrowserThread::PostTask(
97effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch      BrowserThread::UI,
98effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch      FROM_HERE,
99effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch      base::Bind(continuation, status == SERVICE_WORKER_OK));
100effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch}
101effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
102effb81e5f8246d0db0270817048dc992db66e9fbBen Murdochvoid ServiceWorkerContextWrapper::UnregisterServiceWorker(
103effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch    const GURL& pattern,
104effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch    const ResultCallback& continuation) {
105effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  if (!BrowserThread::CurrentlyOn(BrowserThread::IO)) {
106effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch    BrowserThread::PostTask(
107effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch        BrowserThread::IO,
108effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch        FROM_HERE,
109effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch        base::Bind(&ServiceWorkerContextWrapper::UnregisterServiceWorker,
110effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch                   this,
111effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch                   pattern,
112effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch                   continuation));
113effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch    return;
114effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  }
115effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
116effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  context()->UnregisterServiceWorker(
117effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch      pattern,
118effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch      base::Bind(&FinishUnregistrationOnIO, continuation));
119effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch}
120effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
1210529e5d033099cbfc42635f6f6183833b09dff6eBen Murdochvoid ServiceWorkerContextWrapper::AddObserver(
1220529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch    ServiceWorkerContextObserver* observer) {
1230529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  observer_list_->AddObserver(observer);
1240529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch}
1250529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch
1260529e5d033099cbfc42635f6f6183833b09dff6eBen Murdochvoid ServiceWorkerContextWrapper::RemoveObserver(
1270529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch    ServiceWorkerContextObserver* observer) {
1280529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  observer_list_->RemoveObserver(observer);
1290529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch}
1300529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch
131010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)void ServiceWorkerContextWrapper::InitForTesting(
132010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    const base::FilePath& user_data_directory,
133010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    base::SequencedTaskRunner* database_task_runner,
134010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    quota::QuotaManagerProxy* quota_manager_proxy) {
135010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  InitInternal(user_data_directory, database_task_runner, quota_manager_proxy);
136010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)}
137010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
138010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)void ServiceWorkerContextWrapper::InitInternal(
139010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    const base::FilePath& user_data_directory,
140010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    base::SequencedTaskRunner* database_task_runner,
141010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    quota::QuotaManagerProxy* quota_manager_proxy) {
142010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  if (!BrowserThread::CurrentlyOn(BrowserThread::IO)) {
143010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    BrowserThread::PostTask(
144010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)        BrowserThread::IO,
145010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)        FROM_HERE,
146010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)        base::Bind(&ServiceWorkerContextWrapper::InitInternal,
147010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                   this,
148010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                   user_data_directory,
149010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                   make_scoped_refptr(database_task_runner),
150010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                   make_scoped_refptr(quota_manager_proxy)));
151010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    return;
152010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  }
153010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  DCHECK(!context_core_);
154010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  context_core_.reset(new ServiceWorkerContextCore(
155010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      user_data_directory,
156010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      database_task_runner,
157010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      quota_manager_proxy,
158010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      observer_list_,
159010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      make_scoped_ptr(new ServiceWorkerProcessManager(this))));
160010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)}
161010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
162f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)}  // namespace content
163