1 // Copyright 2014 The Chromium Authors. All rights reserved. 2 // Use of this source code is governed by a BSD-style license that can be 3 // found in the LICENSE file. 4 5 #include "content/browser/service_worker/service_worker_script_cache_map.h" 6 7 #include "base/logging.h" 8 #include "content/browser/service_worker/service_worker_context_core.h" 9 #include "content/browser/service_worker/service_worker_storage.h" 10 #include "content/browser/service_worker/service_worker_version.h" 11 #include "content/common/service_worker/service_worker_types.h" 12 13 namespace content { 14 15 ServiceWorkerScriptCacheMap::ServiceWorkerScriptCacheMap( 16 ServiceWorkerVersion* owner, 17 base::WeakPtr<ServiceWorkerContextCore> context) 18 : owner_(owner), 19 context_(context) { 20 } 21 22 ServiceWorkerScriptCacheMap::~ServiceWorkerScriptCacheMap() { 23 } 24 25 int64 ServiceWorkerScriptCacheMap::Lookup(const GURL& url) { 26 ResourceIDMap::const_iterator found = resource_ids_.find(url); 27 if (found == resource_ids_.end()) 28 return kInvalidServiceWorkerResponseId; 29 return found->second; 30 } 31 32 void ServiceWorkerScriptCacheMap::NotifyStartedCaching( 33 const GURL& url, int64 resource_id) { 34 DCHECK_EQ(kInvalidServiceWorkerResponseId, Lookup(url)); 35 DCHECK(owner_->status() == ServiceWorkerVersion::NEW || 36 owner_->status() == ServiceWorkerVersion::INSTALLING); 37 resource_ids_[url] = resource_id; 38 context_->storage()->StoreUncommittedResponseId(resource_id); 39 } 40 41 void ServiceWorkerScriptCacheMap::NotifyFinishedCaching( 42 const GURL& url, const net::URLRequestStatus& status) { 43 DCHECK_NE(kInvalidServiceWorkerResponseId, Lookup(url)); 44 DCHECK(owner_->status() == ServiceWorkerVersion::NEW || 45 owner_->status() == ServiceWorkerVersion::INSTALLING); 46 if (!status.is_success()) { 47 context_->storage()->DoomUncommittedResponse(Lookup(url)); 48 resource_ids_.erase(url); 49 if (owner_->script_url() == url) 50 main_script_status_ = status; 51 } 52 } 53 54 void ServiceWorkerScriptCacheMap::GetResources( 55 std::vector<ServiceWorkerDatabase::ResourceRecord>* resources) { 56 DCHECK(resources->empty()); 57 for (ResourceIDMap::const_iterator it = resource_ids_.begin(); 58 it != resource_ids_.end(); ++it) { 59 resources->push_back( 60 ServiceWorkerDatabase::ResourceRecord(it->second, it->first)); 61 } 62 } 63 64 void ServiceWorkerScriptCacheMap::SetResources( 65 const std::vector<ServiceWorkerDatabase::ResourceRecord>& resources) { 66 DCHECK(resource_ids_.empty()); 67 typedef std::vector<ServiceWorkerDatabase::ResourceRecord> RecordVector; 68 for (RecordVector::const_iterator it = resources.begin(); 69 it != resources.end(); ++it) { 70 resource_ids_[it->url] = it->resource_id; 71 } 72 } 73 74 } // namespace content 75