browsing_data_appcache_helper.cc revision dc0f95d653279beabeb9817299e2902918ba123e
1c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Copyright (c) 2010 The Chromium Authors. All rights reserved. 2c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Use of this source code is governed by a BSD-style license that can be 3c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// found in the LICENSE file. 4c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 5c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "chrome/browser/browsing_data_appcache_helper.h" 6c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 7c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "chrome/browser/net/chrome_url_request_context.h" 821d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen#include "chrome/browser/profiles/profile.h" 9c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "chrome/common/url_constants.h" 10dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen#include "content/browser/browser_thread.h" 11c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "webkit/appcache/appcache_database.h" 12c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "webkit/appcache/appcache_storage.h" 13c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 14c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochusing appcache::AppCacheDatabase; 15c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 16c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochBrowsingDataAppCacheHelper::BrowsingDataAppCacheHelper(Profile* profile) 17c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch : request_context_getter_(profile->GetRequestContext()), 18c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch is_fetching_(false) { 19c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 20c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 21c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochvoid BrowsingDataAppCacheHelper::StartFetching(Callback0::Type* callback) { 22731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick if (BrowserThread::CurrentlyOn(BrowserThread::UI)) { 23c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch DCHECK(!is_fetching_); 24c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch DCHECK(callback); 25c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch is_fetching_ = true; 26c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch info_collection_ = new appcache::AppCacheInfoCollection; 27c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch completion_callback_.reset(callback); 28731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick BrowserThread::PostTask(BrowserThread::IO, FROM_HERE, NewRunnableMethod( 29c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch this, &BrowsingDataAppCacheHelper::StartFetching, callback)); 30c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch return; 31c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch } 32c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 33731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); 34c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch appcache_info_callback_ = 35c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch new net::CancelableCompletionCallback<BrowsingDataAppCacheHelper>( 36c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch this, &BrowsingDataAppCacheHelper::OnFetchComplete); 37c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch GetAppCacheService()->GetAllAppCacheInfo(info_collection_, 38c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch appcache_info_callback_); 39c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 40c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 41c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochvoid BrowsingDataAppCacheHelper::CancelNotification() { 42731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick if (BrowserThread::CurrentlyOn(BrowserThread::UI)) { 43c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch completion_callback_.reset(); 44731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick BrowserThread::PostTask(BrowserThread::IO, FROM_HERE, NewRunnableMethod( 45c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch this, &BrowsingDataAppCacheHelper::CancelNotification)); 46c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch return; 47c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch } 48c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 49c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch if (appcache_info_callback_) 50c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch appcache_info_callback_.release()->Cancel(); 51c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 52c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 53c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochvoid BrowsingDataAppCacheHelper::DeleteAppCacheGroup( 54c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch const GURL& manifest_url) { 55731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick if (BrowserThread::CurrentlyOn(BrowserThread::UI)) { 56731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick BrowserThread::PostTask(BrowserThread::IO, FROM_HERE, NewRunnableMethod( 57c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch this, &BrowsingDataAppCacheHelper::DeleteAppCacheGroup, 58c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch manifest_url)); 59c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch return; 60c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch } 61c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch GetAppCacheService()->DeleteAppCacheGroup(manifest_url, NULL); 62c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 63c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 64731df977c0511bca2206b5f333555b1205ff1f43Iain MerrickBrowsingDataAppCacheHelper::~BrowsingDataAppCacheHelper() {} 65731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick 66c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochvoid BrowsingDataAppCacheHelper::OnFetchComplete(int rv) { 67731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick if (BrowserThread::CurrentlyOn(BrowserThread::IO)) { 68c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Filter out appache info entries for extensions. Extension state is not 69c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // considered browsing data. 70c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch typedef std::map<GURL, appcache::AppCacheInfoVector> InfoByOrigin; 71c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch InfoByOrigin& origin_map = info_collection_->infos_by_origin; 72c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch for (InfoByOrigin::iterator origin = origin_map.begin(); 73c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch origin != origin_map.end();) { 74c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch InfoByOrigin::iterator current = origin; 75c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch ++origin; 76c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch if (current->first.SchemeIs(chrome::kExtensionScheme)) 77c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch origin_map.erase(current); 78c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch } 79c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 80c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch appcache_info_callback_ = NULL; 81731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick BrowserThread::PostTask(BrowserThread::UI, FROM_HERE, NewRunnableMethod( 82c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch this, &BrowsingDataAppCacheHelper::OnFetchComplete, rv)); 83c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch return; 84c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch } 85c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 86731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); 87c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch DCHECK(is_fetching_); 88c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch is_fetching_ = false; 89c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch if (completion_callback_ != NULL) { 90c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch completion_callback_->Run(); 91c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch completion_callback_.reset(); 92c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch } 93c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 94c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 95c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochChromeAppCacheService* BrowsingDataAppCacheHelper::GetAppCacheService() { 96731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); 97c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch ChromeURLRequestContext* request_context = 98c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch reinterpret_cast<ChromeURLRequestContext*>( 99c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch request_context_getter_->GetURLRequestContext()); 100c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch return request_context ? request_context->appcache_service() 101c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch : NULL; 102c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 103c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 104c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochCannedBrowsingDataAppCacheHelper::CannedBrowsingDataAppCacheHelper( 105c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch Profile* profile) 106c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch : BrowsingDataAppCacheHelper(profile) { 107c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch info_collection_ = new appcache::AppCacheInfoCollection; 108c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 109c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 110c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochvoid CannedBrowsingDataAppCacheHelper::AddAppCache(const GURL& manifest_url) { 111c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch typedef std::map<GURL, appcache::AppCacheInfoVector> InfoByOrigin; 112c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch InfoByOrigin& origin_map = info_collection_->infos_by_origin; 113c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch appcache::AppCacheInfoVector& appcache_infos_ = 114c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch origin_map[manifest_url.GetOrigin()]; 115c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 116c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch for (appcache::AppCacheInfoVector::iterator 117c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch appcache = appcache_infos_.begin(); appcache != appcache_infos_.end(); 118c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch ++appcache) { 119c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch if (appcache->manifest_url == manifest_url) 120c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch return; 121c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch } 122c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 1233345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick appcache::AppCacheInfo info; 1243345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick info.manifest_url = manifest_url; 1253345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick appcache_infos_.push_back(info); 126c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 127c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 128c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochvoid CannedBrowsingDataAppCacheHelper::Reset() { 129c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch info_collection_->infos_by_origin.clear(); 130c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 131c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 1323345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrickbool CannedBrowsingDataAppCacheHelper::empty() const { 1333345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick return info_collection_->infos_by_origin.empty(); 1343345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick} 1353345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick 136c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochvoid CannedBrowsingDataAppCacheHelper::StartFetching( 137c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch Callback0::Type* completion_callback) { 138c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch completion_callback->Run(); 1393345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick delete completion_callback; 140c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 141731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick 142731df977c0511bca2206b5f333555b1205ff1f43Iain MerrickCannedBrowsingDataAppCacheHelper::~CannedBrowsingDataAppCacheHelper() {} 143