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 18 using content::BrowserThread; 19 using disk_cache::Backend; 20 using net::CompletionCallback; 21 using net::URLRequestContextGetter; 22 23 namespace { 24 // Everything is called and accessed on the IO thread. 25 26 void Noop(int rv) { 27 DCHECK(rv == net::OK); 28 } 29 30 void CallDoomAllEntries(Backend** backend, int rv) { 31 DCHECK(rv == net::OK); 32 (*backend)->DoomAllEntries(base::Bind(&Noop)); 33 } 34 35 void 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 50 void 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 59 namespace android_webview { 60 61 void 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