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