OLD | NEW |
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 Loading... |
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 Loading... |
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 |
OLD | NEW |