1// Copyright (c) 2012 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 "android_webview/browser/net_disk_cache_remover.h"
6
7#include "base/bind_helpers.h"
8#include "content/public/browser/browser_context.h"
9#include "content/public/browser/browser_thread.h"
10#include "content/public/browser/web_contents.h"
11#include "net/disk_cache/disk_cache.h"
12#include "net/http/http_cache.h"
13#include "net/http/http_transaction_factory.h"
14#include "net/url_request/url_request_context_getter.h"
15#include "net/url_request/url_request_context.h"
16#include "net/base/completion_callback.h"
17
18using content::BrowserThread;
19using disk_cache::Backend;
20using net::CompletionCallback;
21using net::URLRequestContextGetter;
22
23namespace {
24// Everything is called and accessed on the IO thread.
25
26void Noop(int rv) {
27  DCHECK_EQ(net::OK, rv);
28}
29
30void CallDoomAllEntries(Backend** backend, int rv) {
31  DCHECK_EQ(net::OK, rv);
32  (*backend)->DoomAllEntries(base::Bind(&Noop));
33}
34
35void ClearHttpDiskCacheOfContext(URLRequestContextGetter* context_getter) {
36  typedef Backend* BackendPtr;  // Make line below easier to understand.
37  BackendPtr* backend_ptr = new BackendPtr(NULL);
38  CompletionCallback callback(base::Bind(&CallDoomAllEntries,
39                                         base::Owned(backend_ptr)));
40
41  int rv = context_getter->GetURLRequestContext()->
42    http_transaction_factory()->GetCache()->GetBackend(backend_ptr, callback);
43
44  // If not net::ERR_IO_PENDING, then backend pointer is updated but callback
45  // is not called, so call it explicitly.
46  if (rv != net::ERR_IO_PENDING)
47    callback.Run(net::OK);
48}
49
50void ClearHttpDiskCacheOnIoThread(
51    URLRequestContextGetter* main_context_getter,
52    URLRequestContextGetter* media_context_getter) {
53  ClearHttpDiskCacheOfContext(main_context_getter);
54  ClearHttpDiskCacheOfContext(media_context_getter);
55}
56
57}  // namespace
58
59namespace android_webview {
60
61void RemoveHttpDiskCache(content::BrowserContext* browser_context,
62                        int renderer_child_id) {
63  URLRequestContextGetter* main_context_getter =
64      browser_context->GetRequestContextForRenderProcess(renderer_child_id);
65  URLRequestContextGetter* media_context_getter =
66      browser_context->GetMediaRequestContextForRenderProcess(
67          renderer_child_id);
68
69  BrowserThread::PostTask(
70      BrowserThread::IO, FROM_HERE,
71      base::Bind(&ClearHttpDiskCacheOnIoThread,
72                 base::Unretained(main_context_getter),
73                 base::Unretained(media_context_getter)));
74}
75
76}  // namespace android_webview
77