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.
5 #include "chrome/browser/chrome_net_benchmarking_message_filter.h"
8 #include "base/bind_helpers.h"
9 #include "base/command_line.h"
10 #include "base/memory/scoped_ptr.h"
11 #include "chrome/browser/net/chrome_url_request_context.h"
12 #include "chrome/browser/net/predictor.h"
13 #include "chrome/browser/profiles/profile.h"
14 #include "chrome/common/benchmarking_messages.h"
15 #include "chrome/common/chrome_switches.h"
16 #include "net/base/net_errors.h"
17 #include "net/disk_cache/disk_cache.h"
18 #include "net/dns/host_cache.h"
19 #include "net/dns/host_resolver.h"
20 #include "net/http/http_cache.h"
21 #include "net/http/http_network_layer.h"
22 #include "net/http/http_stream_factory.h"
26 void ClearCacheCallback(ChromeNetBenchmarkingMessageFilter* filter,
27 IPC::Message* reply_msg,
29 ChromeViewHostMsg_ClearCache::WriteReplyParams(reply_msg, result);
30 filter->Send(reply_msg);
35 ChromeNetBenchmarkingMessageFilter::ChromeNetBenchmarkingMessageFilter(
36 int render_process_id,
38 net::URLRequestContextGetter* request_context)
39 : render_process_id_(render_process_id),
41 request_context_(request_context) {
44 ChromeNetBenchmarkingMessageFilter::~ChromeNetBenchmarkingMessageFilter() {
47 bool ChromeNetBenchmarkingMessageFilter::OnMessageReceived(
48 const IPC::Message& message, bool* message_was_ok) {
50 IPC_BEGIN_MESSAGE_MAP_EX(ChromeNetBenchmarkingMessageFilter, message,
52 IPC_MESSAGE_HANDLER(ChromeViewHostMsg_CloseCurrentConnections,
53 OnCloseCurrentConnections)
54 IPC_MESSAGE_HANDLER_DELAY_REPLY(ChromeViewHostMsg_ClearCache, OnClearCache)
55 IPC_MESSAGE_HANDLER(ChromeViewHostMsg_ClearHostResolverCache,
56 OnClearHostResolverCache)
57 IPC_MESSAGE_HANDLER(ChromeViewHostMsg_EnableSpdy, OnEnableSpdy)
58 IPC_MESSAGE_HANDLER(ChromeViewHostMsg_ClearPredictorCache,
59 OnClearPredictorCache)
60 IPC_MESSAGE_UNHANDLED(handled = false)
61 IPC_END_MESSAGE_MAP_EX()
65 void ChromeNetBenchmarkingMessageFilter::OnClearCache(IPC::Message* reply_msg) {
66 // This function is disabled unless the user has enabled
67 // benchmarking extensions.
68 if (!CheckBenchmarkingEnabled()) {
69 NOTREACHED() << "Received unexpected benchmarking IPC";
74 disk_cache::Backend* backend = request_context_->GetURLRequestContext()->
75 http_transaction_factory()->GetCache()->GetCurrentBackend();
77 net::CompletionCallback callback =
78 base::Bind(&ClearCacheCallback, make_scoped_refptr(this), reply_msg);
79 rv = backend->DoomAllEntries(callback);
80 if (rv == net::ERR_IO_PENDING) {
81 // The callback will send the reply.
85 ChromeViewHostMsg_ClearCache::WriteReplyParams(reply_msg, rv);
89 void ChromeNetBenchmarkingMessageFilter::OnClearHostResolverCache(int* result) {
90 // This function is disabled unless the user has enabled
91 // benchmarking extensions.
92 if (!CheckBenchmarkingEnabled()) {
93 NOTREACHED() << "Received unexpected benchmarking IPC";
97 net::HostCache* cache =
98 request_context_->GetURLRequestContext()->host_resolver()->GetHostCache();
105 // TODO(lzheng): This only enables spdy over ssl. Enable spdy for http
107 void ChromeNetBenchmarkingMessageFilter::OnEnableSpdy(bool enable) {
108 // This function is disabled unless the user has enabled
109 // benchmarking extensions.
110 if (!CheckBenchmarkingEnabled()) {
111 NOTREACHED() << "Received unexpected benchmarking IPC";
115 net::HttpStreamFactory::EnableNpnSpdy3();
116 net::HttpNetworkLayer::ForceAlternateProtocol();
118 net::HttpStreamFactory::EnableNpnHttpOnly();
122 void ChromeNetBenchmarkingMessageFilter::OnCloseCurrentConnections() {
123 // This function is disabled unless the user has enabled
124 // benchmarking extensions.
125 if (!CheckBenchmarkingEnabled()) {
126 NOTREACHED() << "Received unexpected benchmarking IPC";
129 request_context_->GetURLRequestContext()->
130 http_transaction_factory()->GetCache()->CloseAllConnections();
133 void ChromeNetBenchmarkingMessageFilter::OnSetCacheMode(bool enabled) {
134 // This function is disabled unless the user has enabled
135 // benchmarking extensions.
136 if (!CheckBenchmarkingEnabled()) {
137 NOTREACHED() << "Received unexpected benchmarking IPC";
140 net::HttpCache::Mode mode = enabled ?
141 net::HttpCache::NORMAL : net::HttpCache::DISABLE;
142 net::HttpCache* http_cache = request_context_->GetURLRequestContext()->
143 http_transaction_factory()->GetCache();
144 http_cache->set_mode(mode);
147 void ChromeNetBenchmarkingMessageFilter::OnClearPredictorCache(int* result) {
148 // This function is disabled unless the user has enabled
149 // benchmarking extensions.
150 if (!CheckBenchmarkingEnabled()) {
151 NOTREACHED() << "Received unexpected benchmarking IPC";
154 chrome_browser_net::Predictor* predictor = profile_->GetNetworkPredictor();
156 predictor->DiscardAllResults();
160 bool ChromeNetBenchmarkingMessageFilter::CheckBenchmarkingEnabled() const {
161 static bool checked = false;
162 static bool result = false;
164 const CommandLine& command_line = *CommandLine::ForCurrentProcess();
165 result = command_line.HasSwitch(switches::kEnableNetBenchmarking);