service_worker_provider_host.cc revision c5cede9ae108bb15f6b7a8aea21c7e1fefa2834c
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_provider_host.h"
6f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
7a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "base/stl_util.h"
8c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch#include "content/browser/service_worker/service_worker_context_core.h"
9c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch#include "content/browser/service_worker/service_worker_dispatcher_host.h"
10c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch#include "content/browser/service_worker/service_worker_handle.h"
11a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "content/browser/service_worker/service_worker_utils.h"
12f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "content/browser/service_worker/service_worker_version.h"
13f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
14f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)namespace content {
15f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
16f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)ServiceWorkerProviderHost::ServiceWorkerProviderHost(
17c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    int process_id, int provider_id,
18c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    base::WeakPtr<ServiceWorkerContextCore> context,
19c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    ServiceWorkerDispatcherHost* dispatcher_host)
20a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    : process_id_(process_id),
21c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      provider_id_(provider_id),
22c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      context_(context),
23c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      dispatcher_host_(dispatcher_host) {
24f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)}
25f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
26f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)ServiceWorkerProviderHost::~ServiceWorkerProviderHost() {
27c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  if (active_version_)
28c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    active_version_->RemoveControllee(this);
29a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)}
30a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
31a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)void ServiceWorkerProviderHost::AddScriptClient(int thread_id) {
32a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  DCHECK(!ContainsKey(script_client_thread_ids_, thread_id));
33a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  script_client_thread_ids_.insert(thread_id);
34a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)}
35a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
36a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)void ServiceWorkerProviderHost::RemoveScriptClient(int thread_id) {
37a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  DCHECK(ContainsKey(script_client_thread_ids_, thread_id));
38a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  script_client_thread_ids_.erase(thread_id);
39a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)}
40a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
41c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdochvoid ServiceWorkerProviderHost::SetActiveVersion(
42c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    ServiceWorkerVersion* version) {
43c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  scoped_refptr<ServiceWorkerVersion> previous_version = active_version_;
44c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  active_version_ = version;
45c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  if (version)
46c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    version->AddControllee(this);
47c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  if (previous_version)
48c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    previous_version->RemoveControllee(this);
49c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch
50c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  if (!dispatcher_host_)
51c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    return;  // Could be NULL in some tests.
52c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch
53c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  for (std::set<int>::iterator it = script_client_thread_ids_.begin();
54c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch       it != script_client_thread_ids_.end();
55c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch       ++it) {
56c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    dispatcher_host_->RegisterServiceWorkerHandle(
57c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch        ServiceWorkerHandle::Create(context_, dispatcher_host_,
58c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch                                    *it, version));
59c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    // TODO(kinuko): dispatch activechange event to the script clients.
60c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  }
61c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch}
62c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch
63c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdochvoid ServiceWorkerProviderHost::SetPendingVersion(
64c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    ServiceWorkerVersion* version) {
65c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  pending_version_ = version;
66c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  for (std::set<int>::iterator it = script_client_thread_ids_.begin();
67c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch       it != script_client_thread_ids_.end();
68c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch       ++it) {
69c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    dispatcher_host_->RegisterServiceWorkerHandle(
70c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch        ServiceWorkerHandle::Create(context_, dispatcher_host_,
71c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch                                    *it, version));
72c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    // TODO(kinuko): dispatch pendingchange event to the script clients.
73c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  }
74c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch}
75c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch
76c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdochbool ServiceWorkerProviderHost::SetHostedVersionId(int64 version_id) {
77c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  if (!context_)
78c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    return true;  // System is shutting down.
79c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  if (active_version_)
80c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    return false;  // Unexpected bad message.
81c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch
82c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  ServiceWorkerVersion* live_version = context_->GetLiveVersion(version_id);
83c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  if (!live_version)
84c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    return true;  // Was deleted before it got started.
85c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch
86c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  ServiceWorkerVersionInfo info = live_version->GetInfo();
87c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  if (info.running_status != ServiceWorkerVersion::STARTING ||
88c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      info.process_id != process_id_) {
89c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    // If we aren't trying to start this version in our process
90c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    // something is amiss.
91c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    return false;
92c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  }
93c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch
94c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  hosted_version_ = live_version;
95c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  return true;
96c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch}
97c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch
98a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)bool ServiceWorkerProviderHost::ShouldHandleRequest(
99a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    ResourceType::Type resource_type) const {
100a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  if (ServiceWorkerUtils::IsMainResourceType(resource_type))
101a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    return true;
102a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
103c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  if (active_version())
104a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    return true;
105a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
106a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  // TODO(kinuko): Handle ServiceWorker cases.
107a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  // For now we always return false here, so that we don't handle
108a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  // requests for ServiceWorker (either for the main or sub resources).
109a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
110a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  return false;
111f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)}
112f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
113f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)}  // namespace content
114