Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(908)

Side by Side Diff: content/browser/service_worker/service_worker_provider_host.cc

Issue 360123002: ServiceWorker: some more groundwork in support of the update process (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Created 6 years, 5 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
OLDNEW
1 // Copyright 2013 The Chromium Authors. All rights reserved. 1 // Copyright 2013 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "content/browser/service_worker/service_worker_provider_host.h" 5 #include "content/browser/service_worker/service_worker_provider_host.h"
6 6
7 #include "base/stl_util.h" 7 #include "base/stl_util.h"
8 #include "content/browser/message_port_message_filter.h" 8 #include "content/browser/message_port_message_filter.h"
9 #include "content/browser/service_worker/service_worker_context_core.h" 9 #include "content/browser/service_worker/service_worker_context_core.h"
10 #include "content/browser/service_worker/service_worker_context_request_handler. h" 10 #include "content/browser/service_worker/service_worker_context_request_handler. h"
(...skipping 15 matching lines...) Expand all
26 : process_id_(process_id), 26 : process_id_(process_id),
27 provider_id_(provider_id), 27 provider_id_(provider_id),
28 context_(context), 28 context_(context),
29 dispatcher_host_(dispatcher_host) { 29 dispatcher_host_(dispatcher_host) {
30 } 30 }
31 31
32 ServiceWorkerProviderHost::~ServiceWorkerProviderHost() { 32 ServiceWorkerProviderHost::~ServiceWorkerProviderHost() {
33 if (active_version_) 33 if (active_version_)
34 active_version_->RemoveControllee(this); 34 active_version_->RemoveControllee(this);
35 if (waiting_version_) 35 if (waiting_version_)
36 waiting_version_->RemoveWaitingControllee(this); 36 waiting_version_->RemovePotentialControllee(this);
37 if (installing_version_)
38 installing_version_->RemovePotentialControllee(this);
37 } 39 }
38 40
39 void ServiceWorkerProviderHost::SetDocumentUrl(const GURL& url) { 41 void ServiceWorkerProviderHost::SetDocumentUrl(const GURL& url) {
40 DCHECK(!url.has_ref()); 42 DCHECK(!url.has_ref());
41 document_url_ = url; 43 document_url_ = url;
42 } 44 }
43 45
44 void ServiceWorkerProviderHost::SetActiveVersion( 46 void ServiceWorkerProviderHost::SetActiveVersion(
45 ServiceWorkerVersion* version) { 47 ServiceWorkerVersion* version) {
48 DCHECK(CanAssociateVersion(version));
46 if (version == active_version_) 49 if (version == active_version_)
47 return; 50 return;
48 scoped_refptr<ServiceWorkerVersion> previous_version = active_version_; 51 scoped_refptr<ServiceWorkerVersion> previous_version = active_version_;
49 active_version_ = version; 52 active_version_ = version;
50 if (version) 53 if (version)
51 version->AddControllee(this); 54 version->AddControllee(this);
52 if (previous_version) 55 if (previous_version)
53 previous_version->RemoveControllee(this); 56 previous_version->RemoveControllee(this);
54 57
55 if (!dispatcher_host_) 58 if (!dispatcher_host_)
56 return; // Could be NULL in some tests. 59 return; // Could be NULL in some tests.
57 60
58 dispatcher_host_->Send(new ServiceWorkerMsg_SetCurrentServiceWorker( 61 dispatcher_host_->Send(new ServiceWorkerMsg_SetCurrentServiceWorker(
59 kDocumentMainThreadId, provider_id(), CreateHandleAndPass(version))); 62 kDocumentMainThreadId, provider_id(), CreateHandleAndPass(version)));
60 } 63 }
61 64
62 void ServiceWorkerProviderHost::SetWaitingVersion( 65 void ServiceWorkerProviderHost::SetWaitingVersion(
63 ServiceWorkerVersion* version) { 66 ServiceWorkerVersion* version) {
64 DCHECK(ValidateVersionForAssociation(version)); 67 DCHECK(CanAssociateVersion(version));
65 if (version == waiting_version_) 68 if (version == waiting_version_)
66 return; 69 return;
67 scoped_refptr<ServiceWorkerVersion> previous_version = waiting_version_; 70 scoped_refptr<ServiceWorkerVersion> previous_version = waiting_version_;
68 waiting_version_ = version; 71 waiting_version_ = version;
69 if (version) 72 if (version)
70 version->AddWaitingControllee(this); 73 version->AddPotentialControllee(this);
71 if (previous_version) 74 if (previous_version)
72 previous_version->RemoveWaitingControllee(this); 75 previous_version->RemovePotentialControllee(this);
73 76
74 if (!dispatcher_host_) 77 if (!dispatcher_host_)
75 return; // Could be NULL in some tests. 78 return; // Could be NULL in some tests.
76 79
77 dispatcher_host_->Send(new ServiceWorkerMsg_SetWaitingServiceWorker( 80 dispatcher_host_->Send(new ServiceWorkerMsg_SetWaitingServiceWorker(
78 kDocumentMainThreadId, provider_id(), CreateHandleAndPass(version))); 81 kDocumentMainThreadId, provider_id(), CreateHandleAndPass(version)));
79 } 82 }
80 83
84 void ServiceWorkerProviderHost::SetInstallingVersion(
85 ServiceWorkerVersion* version) {
86 DCHECK(CanAssociateVersion(version));
87 if (version == installing_version_)
88 return;
89 scoped_refptr<ServiceWorkerVersion> previous_version = installing_version_;
90 installing_version_ = version;
91 if (version)
92 version->AddPotentialControllee(this);
93 if (previous_version)
94 previous_version->RemovePotentialControllee(this);
95
96 if (!dispatcher_host_)
97 return; // Could be NULL in some tests.
98
99 // TODO(michaeln): Update once the renderer side understands the .installing
100 // attribute value.
101 dispatcher_host_->Send(new ServiceWorkerMsg_SetWaitingServiceWorker(
102 kDocumentMainThreadId, provider_id(), CreateHandleAndPass(version)));
103 }
104
105 void ServiceWorkerProviderHost::UnsetVersion(ServiceWorkerVersion* version) {
106 if (!version)
107 return;
108 if (installing_version_ == version)
109 SetInstallingVersion(NULL);
110 else if (waiting_version_ == version)
111 SetWaitingVersion(NULL);
112 else if (active_version_ == version)
113 SetActiveVersion(NULL);
114 }
115
81 bool ServiceWorkerProviderHost::SetHostedVersionId(int64 version_id) { 116 bool ServiceWorkerProviderHost::SetHostedVersionId(int64 version_id) {
82 if (!context_) 117 if (!context_)
83 return true; // System is shutting down. 118 return true; // System is shutting down.
84 if (active_version_) 119 if (active_version_)
85 return false; // Unexpected bad message. 120 return false; // Unexpected bad message.
86 121
87 ServiceWorkerVersion* live_version = context_->GetLiveVersion(version_id); 122 ServiceWorkerVersion* live_version = context_->GetLiveVersion(version_id);
88 if (!live_version) 123 if (!live_version)
89 return true; // Was deleted before it got started. 124 return true; // Was deleted before it got started.
90 125
(...skipping 20 matching lines...) Expand all
111 } 146 }
112 if (ServiceWorkerUtils::IsMainResourceType(resource_type) || 147 if (ServiceWorkerUtils::IsMainResourceType(resource_type) ||
113 active_version()) { 148 active_version()) {
114 return scoped_ptr<ServiceWorkerRequestHandler>( 149 return scoped_ptr<ServiceWorkerRequestHandler>(
115 new ServiceWorkerControlleeRequestHandler( 150 new ServiceWorkerControlleeRequestHandler(
116 context_, AsWeakPtr(), blob_storage_context, resource_type)); 151 context_, AsWeakPtr(), blob_storage_context, resource_type));
117 } 152 }
118 return scoped_ptr<ServiceWorkerRequestHandler>(); 153 return scoped_ptr<ServiceWorkerRequestHandler>();
119 } 154 }
120 155
121 bool ServiceWorkerProviderHost::ValidateVersionForAssociation( 156 bool ServiceWorkerProviderHost::CanAssociateVersion(
122 ServiceWorkerVersion* version) { 157 ServiceWorkerVersion* version) {
158 if (!context_)
159 return false;
123 if (running_hosted_version_) 160 if (running_hosted_version_)
124 return false; 161 return false;
125 if (!version) 162 if (!version)
126 return true; 163 return true;
127 164
128 // A version to be associated with this provider should have the same 165 ServiceWorkerVersion* already_associated_version = NULL;
129 // registration (scope) as current active/waiting versions. 166 if (active_version_)
130 if (active_version_) { 167 already_associated_version = active_version_;
131 if (active_version_->registration_id() != version->registration_id()) 168 else if (waiting_version_)
132 return false; 169 already_associated_version = waiting_version_;
133 DCHECK_EQ(active_version_->scope(), version->scope()); 170 else if (installing_version_)
134 } 171 already_associated_version = installing_version_;
135 if (waiting_version_) { 172
136 if (waiting_version_->registration_id() != version->registration_id()) 173 return !already_associated_version ||
137 return false; 174 already_associated_version->registration_id() ==
138 DCHECK_EQ(waiting_version_->scope(), version->scope()); 175 version->registration_id();
139 }
140 return true;
141 } 176 }
142 177
143 void ServiceWorkerProviderHost::PostMessage( 178 void ServiceWorkerProviderHost::PostMessage(
144 const base::string16& message, 179 const base::string16& message,
145 const std::vector<int>& sent_message_port_ids) { 180 const std::vector<int>& sent_message_port_ids) {
146 if (!dispatcher_host_) 181 if (!dispatcher_host_)
147 return; // Could be NULL in some tests. 182 return; // Could be NULL in some tests.
148 183
149 std::vector<int> new_routing_ids; 184 std::vector<int> new_routing_ids;
150 dispatcher_host_->message_port_message_filter()-> 185 dispatcher_host_->message_port_message_filter()->
151 UpdateMessagePortsWithNewRoutes(sent_message_port_ids, 186 UpdateMessagePortsWithNewRoutes(sent_message_port_ids,
152 &new_routing_ids); 187 &new_routing_ids);
153 188
154 dispatcher_host_->Send( 189 dispatcher_host_->Send(
155 new ServiceWorkerMsg_MessageToDocument( 190 new ServiceWorkerMsg_MessageToDocument(
156 kDocumentMainThreadId, provider_id(), 191 kDocumentMainThreadId, provider_id(),
157 message, 192 message,
158 sent_message_port_ids, 193 sent_message_port_ids,
159 new_routing_ids)); 194 new_routing_ids));
160 } 195 }
161 196
162 ServiceWorkerObjectInfo ServiceWorkerProviderHost::CreateHandleAndPass( 197 ServiceWorkerObjectInfo ServiceWorkerProviderHost::CreateHandleAndPass(
163 ServiceWorkerVersion* version) { 198 ServiceWorkerVersion* version) {
164 DCHECK(ValidateVersionForAssociation(version));
165 ServiceWorkerObjectInfo info; 199 ServiceWorkerObjectInfo info;
166 if (context_ && version) { 200 if (context_ && version) {
167 scoped_ptr<ServiceWorkerHandle> handle = 201 scoped_ptr<ServiceWorkerHandle> handle =
168 ServiceWorkerHandle::Create(context_, dispatcher_host_, 202 ServiceWorkerHandle::Create(context_, dispatcher_host_,
169 kDocumentMainThreadId, version); 203 kDocumentMainThreadId, version);
170 info = handle->GetObjectInfo(); 204 info = handle->GetObjectInfo();
171 dispatcher_host_->RegisterServiceWorkerHandle(handle.Pass()); 205 dispatcher_host_->RegisterServiceWorkerHandle(handle.Pass());
172 } 206 }
173 return info; 207 return info;
174 } 208 }
175 209
176 bool ServiceWorkerProviderHost::IsContextAlive() { 210 bool ServiceWorkerProviderHost::IsContextAlive() {
177 return context_ != NULL; 211 return context_ != NULL;
178 } 212 }
179 213
180 } // namespace content 214 } // namespace content
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698