15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved.
25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file.
45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "android_webview/browser/net_disk_cache_remover.h"
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/bind_helpers.h"
85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/browser_context.h"
95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/browser_thread.h"
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/web_contents.h"
115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/disk_cache/disk_cache.h"
125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/http/http_cache.h"
135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/http/http_transaction_factory.h"
145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/url_request/url_request_context_getter.h"
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/url_request/url_request_context.h"
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/base/completion_callback.h"
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using content::BrowserThread;
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using disk_cache::Backend;
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using net::CompletionCallback;
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using net::URLRequestContextGetter;
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace {
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Everything is called and accessed on the IO thread.
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void Noop(int rv) {
271320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  DCHECK_EQ(net::OK, rv);
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void CallDoomAllEntries(Backend** backend, int rv) {
311320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  DCHECK_EQ(net::OK, rv);
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  (*backend)->DoomAllEntries(base::Bind(&Noop));
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ClearHttpDiskCacheOfContext(URLRequestContextGetter* context_getter) {
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  typedef Backend* BackendPtr;  // Make line below easier to understand.
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  BackendPtr* backend_ptr = new BackendPtr(NULL);
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CompletionCallback callback(base::Bind(&CallDoomAllEntries,
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                         base::Owned(backend_ptr)));
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int rv = context_getter->GetURLRequestContext()->
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    http_transaction_factory()->GetCache()->GetBackend(backend_ptr, callback);
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // If not net::ERR_IO_PENDING, then backend pointer is updated but callback
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // is not called, so call it explicitly.
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (rv != net::ERR_IO_PENDING)
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    callback.Run(net::OK);
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ClearHttpDiskCacheOnIoThread(
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    URLRequestContextGetter* main_context_getter,
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    URLRequestContextGetter* media_context_getter) {
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ClearHttpDiskCacheOfContext(main_context_getter);
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ClearHttpDiskCacheOfContext(media_context_getter);
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace
585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace android_webview {
605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void RemoveHttpDiskCache(content::BrowserContext* browser_context,
625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                        int renderer_child_id) {
635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  URLRequestContextGetter* main_context_getter =
645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      browser_context->GetRequestContextForRenderProcess(renderer_child_id);
655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  URLRequestContextGetter* media_context_getter =
665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      browser_context->GetMediaRequestContextForRenderProcess(
675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          renderer_child_id);
685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  BrowserThread::PostTask(
705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      BrowserThread::IO, FROM_HERE,
715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      base::Bind(&ClearHttpDiskCacheOnIoThread,
725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                 base::Unretained(main_context_getter),
735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                 base::Unretained(media_context_getter)));
745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace android_webview
77