service_worker_provider_host.cc revision 46d4c2bc3267f3f028f39e7e311b0f89aba2e4fd
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" 8010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)#include "content/browser/message_port_message_filter.h" 9c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch#include "content/browser/service_worker/service_worker_context_core.h" 105c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu#include "content/browser/service_worker/service_worker_context_request_handler.h" 115c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu#include "content/browser/service_worker/service_worker_controllee_request_handler.h" 12c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch#include "content/browser/service_worker/service_worker_dispatcher_host.h" 13c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch#include "content/browser/service_worker/service_worker_handle.h" 14a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "content/browser/service_worker/service_worker_utils.h" 15f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "content/browser/service_worker/service_worker_version.h" 160529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch#include "content/common/service_worker/service_worker_messages.h" 17f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 18f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)namespace content { 19f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 20010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)static const int kDocumentMainThreadId = 0; 21010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 22f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)ServiceWorkerProviderHost::ServiceWorkerProviderHost( 23c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch int process_id, int provider_id, 24c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch base::WeakPtr<ServiceWorkerContextCore> context, 25c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch ServiceWorkerDispatcherHost* dispatcher_host) 26a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) : process_id_(process_id), 27c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch provider_id_(provider_id), 28c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch context_(context), 29c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch dispatcher_host_(dispatcher_host) { 30f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)} 31f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 32f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)ServiceWorkerProviderHost::~ServiceWorkerProviderHost() { 33c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch if (active_version_) 34c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch active_version_->RemoveControllee(this); 35cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) if (waiting_version_) 36cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) waiting_version_->RemoveWaitingControllee(this); 37a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)} 38a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 3946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)void ServiceWorkerProviderHost::SetDocumentUrl(const GURL& url) { 4046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) DCHECK(!url.has_ref()); 4146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) document_url_ = url; 4246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)} 4346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) 44c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdochvoid ServiceWorkerProviderHost::SetActiveVersion( 45c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch ServiceWorkerVersion* version) { 46a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch if (version == active_version_) 47a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch return; 48c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch scoped_refptr<ServiceWorkerVersion> previous_version = active_version_; 49c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch active_version_ = version; 50c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch if (version) 51c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch version->AddControllee(this); 52c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch if (previous_version) 53c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch previous_version->RemoveControllee(this); 54c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch 55c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch if (!dispatcher_host_) 56c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch return; // Could be NULL in some tests. 57c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch 58010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) ServiceWorkerObjectInfo info; 59010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) if (context_ && version) { 60010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) scoped_ptr<ServiceWorkerHandle> handle = 61010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) ServiceWorkerHandle::Create(context_, dispatcher_host_, 62010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) kDocumentMainThreadId, version); 63010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) info = handle->GetObjectInfo(); 64010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) dispatcher_host_->RegisterServiceWorkerHandle(handle.Pass()); 65c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch } 66010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) dispatcher_host_->Send( 67010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) new ServiceWorkerMsg_SetCurrentServiceWorker( 68010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) kDocumentMainThreadId, provider_id(), info)); 69c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch} 70c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch 71cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)void ServiceWorkerProviderHost::SetWaitingVersion( 72c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch ServiceWorkerVersion* version) { 73cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) if (version == waiting_version_) 74a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch return; 75cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) scoped_refptr<ServiceWorkerVersion> previous_version = waiting_version_; 76cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) waiting_version_ = version; 77a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch if (version) 78cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) version->AddWaitingControllee(this); 79a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch if (previous_version) 80cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) previous_version->RemoveWaitingControllee(this); 81a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch 82a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch if (!dispatcher_host_) 83a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch return; // Could be NULL in some tests. 84a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch 85010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) // TODO(kinuko): dispatch pendingchange event to the document. 86c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch} 87c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch 88c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdochbool ServiceWorkerProviderHost::SetHostedVersionId(int64 version_id) { 89c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch if (!context_) 90c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch return true; // System is shutting down. 91c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch if (active_version_) 92c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch return false; // Unexpected bad message. 93c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch 94c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch ServiceWorkerVersion* live_version = context_->GetLiveVersion(version_id); 95c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch if (!live_version) 96c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch return true; // Was deleted before it got started. 97c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch 98c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch ServiceWorkerVersionInfo info = live_version->GetInfo(); 99c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch if (info.running_status != ServiceWorkerVersion::STARTING || 100c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch info.process_id != process_id_) { 101c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch // If we aren't trying to start this version in our process 102c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch // something is amiss. 103c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch return false; 104c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch } 105c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch 1065c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu running_hosted_version_ = live_version; 107c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch return true; 108c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch} 109c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch 1105c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liuscoped_ptr<ServiceWorkerRequestHandler> 1115c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo LiuServiceWorkerProviderHost::CreateRequestHandler( 112cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) ResourceType::Type resource_type, 113cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) base::WeakPtr<webkit_blob::BlobStorageContext> blob_storage_context) { 1145c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu if (IsHostToRunningServiceWorker()) { 1155c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu return scoped_ptr<ServiceWorkerRequestHandler>( 1165c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu new ServiceWorkerContextRequestHandler( 117cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) context_, AsWeakPtr(), blob_storage_context, resource_type)); 1185c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu } 1195c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu if (ServiceWorkerUtils::IsMainResourceType(resource_type) || 1205c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu active_version()) { 1215c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu return scoped_ptr<ServiceWorkerRequestHandler>( 1225c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu new ServiceWorkerControlleeRequestHandler( 123cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) context_, AsWeakPtr(), blob_storage_context, resource_type)); 1245c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu } 1255c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu return scoped_ptr<ServiceWorkerRequestHandler>(); 126f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)} 127f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 128010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)void ServiceWorkerProviderHost::PostMessage( 129010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) const base::string16& message, 130010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) const std::vector<int>& sent_message_port_ids) { 131010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) if (!dispatcher_host_) 132010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) return; // Could be NULL in some tests. 133010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 134010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) std::vector<int> new_routing_ids; 135010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) dispatcher_host_->message_port_message_filter()-> 136010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) UpdateMessagePortsWithNewRoutes(sent_message_port_ids, 137010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) &new_routing_ids); 138010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 139010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) dispatcher_host_->Send( 140010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) new ServiceWorkerMsg_MessageToDocument( 141010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) kDocumentMainThreadId, provider_id(), 142010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) message, 143010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) sent_message_port_ids, 144010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) new_routing_ids)); 145010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)} 146010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 147f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)} // namespace content 148