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