service_worker_context_wrapper.cc revision effb81e5f8246d0db0270817048dc992db66e9fb
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"
8f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "content/browser/service_worker/service_worker_context_core.h"
9f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "content/public/browser/browser_thread.h"
105d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "webkit/browser/quota/quota_manager_proxy.h"
11f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
12f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)namespace content {
13f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
14f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)ServiceWorkerContextWrapper::ServiceWorkerContextWrapper() {
15f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)}
16f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
17f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)ServiceWorkerContextWrapper::~ServiceWorkerContextWrapper() {
18f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)}
19f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
20f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)void ServiceWorkerContextWrapper::Init(
21f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    const base::FilePath& user_data_directory,
22f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    quota::QuotaManagerProxy* quota_manager_proxy) {
23f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  if (!BrowserThread::CurrentlyOn(BrowserThread::IO)) {
24f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    BrowserThread::PostTask(
25f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)        BrowserThread::IO, FROM_HERE,
26f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)        base::Bind(&ServiceWorkerContextWrapper::Init, this,
27f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)                   user_data_directory,
28f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)                   make_scoped_refptr(quota_manager_proxy)));
29f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    return;
30f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  }
31f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  DCHECK(!context_core_);
32f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  context_core_.reset(
33f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      new ServiceWorkerContextCore(
34f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)          user_data_directory, quota_manager_proxy));
35f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)}
36f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
37f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)void ServiceWorkerContextWrapper::Shutdown() {
38f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  if (!BrowserThread::CurrentlyOn(BrowserThread::IO)) {
39f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    BrowserThread::PostTask(
40f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)        BrowserThread::IO, FROM_HERE,
41f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)        base::Bind(&ServiceWorkerContextWrapper::Shutdown, this));
42f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    return;
43f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  }
44f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  context_core_.reset();
45f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)}
46f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
47f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)ServiceWorkerContextCore* ServiceWorkerContextWrapper::context() {
48effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  DCHECK_CURRENTLY_ON(BrowserThread::IO);
49f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  return context_core_.get();
50f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)}
51f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
52effb81e5f8246d0db0270817048dc992db66e9fbBen Murdochstatic void FinishRegistrationOnIO(
53effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch    const ServiceWorkerContext::ResultCallback& continuation,
54effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch    ServiceWorkerStatusCode status,
55effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch    int64 registration_id) {
56effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  DCHECK_CURRENTLY_ON(BrowserThread::IO);
57effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  BrowserThread::PostTask(
58effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch      BrowserThread::UI,
59effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch      FROM_HERE,
60effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch      base::Bind(continuation, status == SERVICE_WORKER_OK));
61effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch}
62effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
63effb81e5f8246d0db0270817048dc992db66e9fbBen Murdochvoid ServiceWorkerContextWrapper::RegisterServiceWorker(
64effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch    const GURL& pattern,
65effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch    const GURL& script_url,
66effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch    int source_process_id,
67effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch    const ResultCallback& continuation) {
68effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  if (!BrowserThread::CurrentlyOn(BrowserThread::IO)) {
69effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch    BrowserThread::PostTask(
70effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch        BrowserThread::IO,
71effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch        FROM_HERE,
72effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch        base::Bind(&ServiceWorkerContextWrapper::RegisterServiceWorker,
73effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch                   this,
74effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch                   pattern,
75effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch                   script_url,
76effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch                   source_process_id,
77effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch                   continuation));
78effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch    return;
79effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  }
80effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
81effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  context()->RegisterServiceWorker(
82effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch      pattern,
83effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch      script_url,
84effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch      source_process_id,
85effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch      base::Bind(&FinishRegistrationOnIO, continuation));
86effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch}
87effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
88effb81e5f8246d0db0270817048dc992db66e9fbBen Murdochstatic void FinishUnregistrationOnIO(
89effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch    const ServiceWorkerContext::ResultCallback& continuation,
90effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch    ServiceWorkerStatusCode status) {
91effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  DCHECK_CURRENTLY_ON(BrowserThread::IO);
92effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  BrowserThread::PostTask(
93effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch      BrowserThread::UI,
94effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch      FROM_HERE,
95effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch      base::Bind(continuation, status == SERVICE_WORKER_OK));
96effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch}
97effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
98effb81e5f8246d0db0270817048dc992db66e9fbBen Murdochvoid ServiceWorkerContextWrapper::UnregisterServiceWorker(
99effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch    const GURL& pattern,
100effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch    int source_process_id,
101effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch    const ResultCallback& continuation) {
102effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  if (!BrowserThread::CurrentlyOn(BrowserThread::IO)) {
103effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch    BrowserThread::PostTask(
104effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch        BrowserThread::IO,
105effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch        FROM_HERE,
106effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch        base::Bind(&ServiceWorkerContextWrapper::UnregisterServiceWorker,
107effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch                   this,
108effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch                   pattern,
109effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch                   source_process_id,
110effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch                   continuation));
111effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch    return;
112effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  }
113effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
114effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  context()->UnregisterServiceWorker(
115effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch      pattern,
116effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch      source_process_id,
117effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch      base::Bind(&FinishUnregistrationOnIO, continuation));
118effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch}
119effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
120f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)}  // namespace content
121