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) 52a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/browser/chrome_net_benchmarking_message_filter.h" 65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/bind.h" 85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/bind_helpers.h" 95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/command_line.h" 105d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "base/macros.h" 115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/memory/scoped_ptr.h" 125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/net/predictor.h" 135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/profiles/profile.h" 145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/common/benchmarking_messages.h" 155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/common/chrome_switches.h" 165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/base/net_errors.h" 175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/disk_cache/disk_cache.h" 18c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "net/dns/host_cache.h" 192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "net/dns/host_resolver.h" 205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/http/http_cache.h" 215f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#include "net/url_request/url_request_context.h" 225f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#include "net/url_request/url_request_context_getter.h" 235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace { 255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void ClearCacheCallback(ChromeNetBenchmarkingMessageFilter* filter, 275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IPC::Message* reply_msg, 285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int result) { 295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ChromeViewHostMsg_ClearCache::WriteReplyParams(reply_msg, result); 305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) filter->Send(reply_msg); 315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace 345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)ChromeNetBenchmarkingMessageFilter::ChromeNetBenchmarkingMessageFilter( 365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Profile* profile, 375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) net::URLRequestContextGetter* request_context) 385d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) : BrowserMessageFilter(ChromeBenchmarkingMsgStart), 395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) profile_(profile), 405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) request_context_(request_context) { 415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)ChromeNetBenchmarkingMessageFilter::~ChromeNetBenchmarkingMessageFilter() { 445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)bool ChromeNetBenchmarkingMessageFilter::OnMessageReceived( 47cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) const IPC::Message& message) { 485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool handled = true; 49cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) IPC_BEGIN_MESSAGE_MAP(ChromeNetBenchmarkingMessageFilter, message) 505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IPC_MESSAGE_HANDLER(ChromeViewHostMsg_CloseCurrentConnections, 515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) OnCloseCurrentConnections) 525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IPC_MESSAGE_HANDLER_DELAY_REPLY(ChromeViewHostMsg_ClearCache, OnClearCache) 535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IPC_MESSAGE_HANDLER(ChromeViewHostMsg_ClearHostResolverCache, 545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) OnClearHostResolverCache) 555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IPC_MESSAGE_HANDLER(ChromeViewHostMsg_ClearPredictorCache, 565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) OnClearPredictorCache) 575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IPC_MESSAGE_UNHANDLED(handled = false) 58cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) IPC_END_MESSAGE_MAP() 595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return handled; 605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void ChromeNetBenchmarkingMessageFilter::OnClearCache(IPC::Message* reply_msg) { 635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // This function is disabled unless the user has enabled 645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // benchmarking extensions. 655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!CheckBenchmarkingEnabled()) { 665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NOTREACHED() << "Received unexpected benchmarking IPC"; 675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int rv = -1; 705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) disk_cache::Backend* backend = request_context_->GetURLRequestContext()-> 725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) http_transaction_factory()->GetCache()->GetCurrentBackend(); 735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (backend) { 745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) net::CompletionCallback callback = 755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::Bind(&ClearCacheCallback, make_scoped_refptr(this), reply_msg); 765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) rv = backend->DoomAllEntries(callback); 775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (rv == net::ERR_IO_PENDING) { 785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // The callback will send the reply. 795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ChromeViewHostMsg_ClearCache::WriteReplyParams(reply_msg, rv); 835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Send(reply_msg); 845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void ChromeNetBenchmarkingMessageFilter::OnClearHostResolverCache(int* result) { 875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // This function is disabled unless the user has enabled 885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // benchmarking extensions. 895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!CheckBenchmarkingEnabled()) { 905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NOTREACHED() << "Received unexpected benchmarking IPC"; 915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *result = -1; 945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) net::HostCache* cache = 955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) request_context_->GetURLRequestContext()->host_resolver()->GetHostCache(); 965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (cache) { 975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) cache->clear(); 985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *result = 0; 995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void ChromeNetBenchmarkingMessageFilter::OnCloseCurrentConnections() { 1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // This function is disabled unless the user has enabled 1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // benchmarking extensions. 1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!CheckBenchmarkingEnabled()) { 1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NOTREACHED() << "Received unexpected benchmarking IPC"; 1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) request_context_->GetURLRequestContext()-> 1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) http_transaction_factory()->GetCache()->CloseAllConnections(); 1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void ChromeNetBenchmarkingMessageFilter::OnSetCacheMode(bool enabled) { 1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // This function is disabled unless the user has enabled 1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // benchmarking extensions. 1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!CheckBenchmarkingEnabled()) { 1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NOTREACHED() << "Received unexpected benchmarking IPC"; 1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) net::HttpCache::Mode mode = enabled ? 1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) net::HttpCache::NORMAL : net::HttpCache::DISABLE; 1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) net::HttpCache* http_cache = request_context_->GetURLRequestContext()-> 1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) http_transaction_factory()->GetCache(); 1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) http_cache->set_mode(mode); 1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void ChromeNetBenchmarkingMessageFilter::OnClearPredictorCache(int* result) { 1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // This function is disabled unless the user has enabled 1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // benchmarking extensions. 1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!CheckBenchmarkingEnabled()) { 1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NOTREACHED() << "Received unexpected benchmarking IPC"; 1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) chrome_browser_net::Predictor* predictor = profile_->GetNetworkPredictor(); 1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (predictor) 1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) predictor->DiscardAllResults(); 1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *result = 0; 1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)bool ChromeNetBenchmarkingMessageFilter::CheckBenchmarkingEnabled() const { 1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static bool checked = false; 1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static bool result = false; 1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!checked) { 1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const CommandLine& command_line = *CommandLine::ForCurrentProcess(); 1452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) result = command_line.HasSwitch(switches::kEnableNetBenchmarking); 1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) checked = true; 1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return result; 1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 151