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)
106ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    : BrowsingDataAppCacheHelper(profile),
107ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      profile_(profile) {
108c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  info_collection_ = new appcache::AppCacheInfoCollection;
109c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
110c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
111ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian MonsenCannedBrowsingDataAppCacheHelper* CannedBrowsingDataAppCacheHelper::Clone() {
112ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
113ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  CannedBrowsingDataAppCacheHelper* clone =
114ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      new CannedBrowsingDataAppCacheHelper(profile_);
115ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
116ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  clone->info_collection_->infos_by_origin = info_collection_->infos_by_origin;
117ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  return clone;
118ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen}
119ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
120c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochvoid CannedBrowsingDataAppCacheHelper::AddAppCache(const GURL& manifest_url) {
121c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  typedef std::map<GURL, appcache::AppCacheInfoVector> InfoByOrigin;
122c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  InfoByOrigin& origin_map = info_collection_->infos_by_origin;
123c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  appcache::AppCacheInfoVector& appcache_infos_ =
124c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      origin_map[manifest_url.GetOrigin()];
125c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
126c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  for (appcache::AppCacheInfoVector::iterator
127c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch       appcache = appcache_infos_.begin(); appcache != appcache_infos_.end();
128c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch       ++appcache) {
129c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    if (appcache->manifest_url == manifest_url)
130c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      return;
131c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  }
132c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
1333345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  appcache::AppCacheInfo info;
1343345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  info.manifest_url = manifest_url;
1353345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  appcache_infos_.push_back(info);
136c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
137c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
138c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochvoid CannedBrowsingDataAppCacheHelper::Reset() {
139c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  info_collection_->infos_by_origin.clear();
140c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
141c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
1423345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrickbool CannedBrowsingDataAppCacheHelper::empty() const {
1433345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  return info_collection_->infos_by_origin.empty();
1443345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick}
1453345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
146c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochvoid CannedBrowsingDataAppCacheHelper::StartFetching(
147c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    Callback0::Type* completion_callback) {
148c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  completion_callback->Run();
1493345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  delete completion_callback;
150c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
151731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick
152731df977c0511bca2206b5f333555b1205ff1f43Iain MerrickCannedBrowsingDataAppCacheHelper::~CannedBrowsingDataAppCacheHelper() {}
153