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