summaryrefslogtreecommitdiffstats
path: root/chrome
diff options
context:
space:
mode:
authorlzheng@chromium.org <lzheng@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2010-05-21 06:56:53 +0000
committerlzheng@chromium.org <lzheng@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2010-05-21 06:56:53 +0000
commit65041fa2a7d79cbd289d6bfa05a55bfb32ec4fa3 (patch)
tree5ba89200e8bdc109b64b9327fad2bc563bc03406 /chrome
parent5ea89fbf0d7647669fc91dda7fe944d8f2ef1f1c (diff)
downloadchromium_src-65041fa2a7d79cbd289d6bfa05a55bfb32ec4fa3.zip
chromium_src-65041fa2a7d79cbd289d6bfa05a55bfb32ec4fa3.tar.gz
chromium_src-65041fa2a7d79cbd289d6bfa05a55bfb32ec4fa3.tar.bz2
This change enables FieldTrial for SPDY. When --use-spdy=npn is used, field test won't be enabled.
However, when that flag is missing, A/B test is added to browser_main.cc. Trial A: use npn and spdy. B: use npn but no spdy. C: do nothing. A and B are set to zero for now The histograms we collect are: 1. Page begin to finish time when spdy is enabled/disabled across all sites; 2. Page begin to finish time when spdy is used on sites that support spdy and when spdy is intentionally ignored. BUG=43997 TEST=Don't use --use-spdy=npn, manually change _npn_nospdy and _npn_withspdy percentile and go to spdy supported sites. Review URL: http://codereview.chromium.org/2036012 git-svn-id: svn://svn.chromium.org/chrome/trunk/src@47896 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'chrome')
-rw-r--r--chrome/browser/browser_init.cc7
-rw-r--r--chrome/browser/browser_main.cc49
-rw-r--r--chrome/browser/renderer_host/resource_dispatcher_host.cc1
-rw-r--r--chrome/common/render_messages.h6
-rw-r--r--chrome/renderer/loadtimes_extension_bindings.cc3
-rw-r--r--chrome/renderer/navigation_state.h6
-rw-r--r--chrome/renderer/render_view.cc34
7 files changed, 90 insertions, 16 deletions
diff --git a/chrome/browser/browser_init.cc b/chrome/browser/browser_init.cc
index e20dfa2..7e5b2fd 100644
--- a/chrome/browser/browser_init.cc
+++ b/chrome/browser/browser_init.cc
@@ -50,7 +50,6 @@
#include "grit/locale_settings.h"
#include "grit/theme_resources.h"
#include "net/base/net_util.h"
-#include "net/http/http_network_layer.h"
#include "net/url_request/url_request.h"
#include "webkit/glue/webkit_glue.h"
@@ -1008,12 +1007,6 @@ bool BrowserInit::ProcessCmdLineImpl(const CommandLine& command_line,
}
}
- if (command_line.HasSwitch(switches::kUseSpdy)) {
- std::string spdy_mode =
- command_line.GetSwitchValueASCII(switches::kUseSpdy);
- net::HttpNetworkLayer::EnableSpdy(spdy_mode);
- }
-
if (command_line.HasSwitch(switches::kExplicitlyAllowedPorts)) {
std::wstring allowed_ports =
command_line.GetSwitchValue(switches::kExplicitlyAllowedPorts);
diff --git a/chrome/browser/browser_main.cc b/chrome/browser/browser_main.cc
index 1ccb00f..4f69109 100644
--- a/chrome/browser/browser_main.cc
+++ b/chrome/browser/browser_main.cc
@@ -73,6 +73,7 @@
#include "grit/generated_resources.h"
#include "net/base/cookie_monster.h"
#include "net/base/net_module.h"
+#include "net/http/http_network_layer.h"
#include "net/http/http_network_session.h"
#include "net/http/http_network_transaction.h"
#include "net/socket/client_socket_pool_base.h"
@@ -707,9 +708,52 @@ int BrowserMain(const MainFunctionParams& parameters) {
net::EnsureWinsockInit();
#endif // defined(OS_WIN)
+ // Initialize statistical testing infrastructure for entire browser.
+ FieldTrialList field_trial;
+
+ // When --use-spdy not set, users will be in A/B test for spdy.
+ // group A (_npn_with_spdy): this means npn and spdy are enabled. In
+ // case server supports spdy, browser will use spdy.
+ // group B (_npn_with_http): this means npn is enabled but spdy
+ // won't be used. Http is still used for all requests.
+ // default group: no npn or spdy is involved. The "old" non-spdy chrome
+ // behavior.
+ bool is_spdy_trial = false;
+ if (parsed_command_line.HasSwitch(switches::kUseSpdy)) {
+ std::string spdy_mode =
+ parsed_command_line.GetSwitchValueASCII(switches::kUseSpdy);
+ net::HttpNetworkLayer::EnableSpdy(spdy_mode);
+ } else {
+ const FieldTrial::Probability kSpdyDivisor = 1000;
+ // TODO(lzheng): Increase these values to enable more spdy tests.
+ // To enable 100% npn_with_spdy, set kNpnHttpProbability = 0 and set
+ // kNpnSpdyProbability = FieldTrial::kAllRemainingProbability.
+ const FieldTrial::Probability kNpnHttpProbability = 0; // 0.0%
+ const FieldTrial::Probability kNpnSpdyProbability = 0; // 0.0%
+ scoped_refptr<FieldTrial> trial =
+ new FieldTrial("SpdyImpact", kSpdyDivisor);
+ // npn with only http support, no spdy.
+ int npn_http_grp =
+ trial->AppendGroup("_npn_with_http", kNpnHttpProbability);
+ // npn with spdy support.
+ int npn_spdy_grp =
+ trial->AppendGroup("_npn_with_spdy", kNpnSpdyProbability);
+ int trial_grp = trial->group();
+ if (trial_grp == npn_http_grp) {
+ is_spdy_trial = true;
+ net::HttpNetworkLayer::EnableSpdy("npn-http");
+ } else if (trial_grp == npn_spdy_grp) {
+ is_spdy_trial = true;
+ net::HttpNetworkLayer::EnableSpdy("npn");
+ } else {
+ CHECK(!is_spdy_trial);
+ }
+ }
+
#if defined(OS_WIN)
if (!parsed_command_line.HasSwitch(switches::kUseSChannel) ||
- parsed_command_line.HasSwitch(switches::kUseSpdy)) {
+ parsed_command_line.HasSwitch(switches::kUseSpdy) ||
+ is_spdy_trial) {
net::ClientSocketFactory::SetSSLClientSocketFactory(
net::SSLClientSocketNSSFactory);
// We want to be sure to init NSPR on the main thread.
@@ -727,9 +771,6 @@ int BrowserMain(const MainFunctionParams& parameters) {
SystemMonitor system_monitor;
HighResolutionTimerManager hi_res_timer_manager;
- // Initialize statistical testing infrastructure for entire browser.
- FieldTrialList field_trial;
-
std::wstring app_name = chrome::kBrowserAppName;
std::string thread_name_string = WideToASCII(app_name + L"_BrowserMain");
diff --git a/chrome/browser/renderer_host/resource_dispatcher_host.cc b/chrome/browser/renderer_host/resource_dispatcher_host.cc
index 17bdf4e..580c2c2 100644
--- a/chrome/browser/renderer_host/resource_dispatcher_host.cc
+++ b/chrome/browser/renderer_host/resource_dispatcher_host.cc
@@ -163,6 +163,7 @@ void PopulateResourceResponse(URLRequest* request,
request->GetMimeType(&response->response_head.mime_type);
response->response_head.was_fetched_via_spdy =
request->was_fetched_via_spdy();
+ response->response_head.was_npn_negotiated = request->was_npn_negotiated();
appcache::AppCacheInterceptor::GetExtraResponseInfo(
request,
&response->response_head.appcache_id,
diff --git a/chrome/common/render_messages.h b/chrome/common/render_messages.h
index e1f8791..ab0dcc1 100644
--- a/chrome/common/render_messages.h
+++ b/chrome/common/render_messages.h
@@ -1327,6 +1327,7 @@ struct ParamTraits<webkit_glue::ResourceLoaderBridge::ResponseInfo> {
WriteParam(m, p.appcache_id);
WriteParam(m, p.appcache_manifest_url);
WriteParam(m, p.was_fetched_via_spdy);
+ WriteParam(m, p.was_npn_negotiated);
}
static bool Read(const Message* m, void** iter, param_type* r) {
return
@@ -1339,7 +1340,8 @@ struct ParamTraits<webkit_glue::ResourceLoaderBridge::ResponseInfo> {
ReadParam(m, iter, &r->content_length) &&
ReadParam(m, iter, &r->appcache_id) &&
ReadParam(m, iter, &r->appcache_manifest_url) &&
- ReadParam(m, iter, &r->was_fetched_via_spdy);
+ ReadParam(m, iter, &r->was_fetched_via_spdy) &&
+ ReadParam(m, iter, &r->was_npn_negotiated);
}
static void Log(const param_type& p, std::wstring* l) {
l->append(L"(");
@@ -1362,6 +1364,8 @@ struct ParamTraits<webkit_glue::ResourceLoaderBridge::ResponseInfo> {
LogParam(p.appcache_manifest_url, l);
l->append(L", ");
LogParam(p.was_fetched_via_spdy, l);
+ l->append(L",");
+ LogParam(p.was_npn_negotiated, l);
l->append(L")");
}
};
diff --git a/chrome/renderer/loadtimes_extension_bindings.cc b/chrome/renderer/loadtimes_extension_bindings.cc
index c43cd95..151e78d 100644
--- a/chrome/renderer/loadtimes_extension_bindings.cc
+++ b/chrome/renderer/loadtimes_extension_bindings.cc
@@ -131,6 +131,9 @@ class LoadTimesExtensionWrapper : public v8::Extension {
load_times->Set(
v8::String::New("wasFetchedViaSpdy"),
v8::Boolean::New(navigation_state->was_fetched_via_spdy()));
+ load_times->Set(
+ v8::String::New("wasNpnNegotiated"),
+ v8::Boolean::New(navigation_state->was_npn_negotiated()));
return load_times;
}
}
diff --git a/chrome/renderer/navigation_state.h b/chrome/renderer/navigation_state.h
index 36a8441..8d762aa 100644
--- a/chrome/renderer/navigation_state.h
+++ b/chrome/renderer/navigation_state.h
@@ -220,6 +220,9 @@ class NavigationState : public WebKit::WebDataSource::ExtraData {
void set_was_fetched_via_spdy(bool value) { was_fetched_via_spdy_ = value; }
bool was_fetched_via_spdy() const { return was_fetched_via_spdy_; }
+ void set_was_npn_negotiated(bool value) { was_npn_negotiated_ = value; }
+ bool was_npn_negotiated() const { return was_npn_negotiated_; }
+
// Whether the frame text contents was translated to a different language.
void set_was_translated(bool value) { was_translated_ = value; }
bool was_translated() const { return was_translated_; }
@@ -243,6 +246,7 @@ class NavigationState : public WebKit::WebDataSource::ExtraData {
cache_policy_override_(WebKit::WebURLRequest::UseProtocolCachePolicy),
user_script_idle_scheduler_(NULL),
was_fetched_via_spdy_(false),
+ was_npn_negotiated_(false),
was_translated_(false) {
}
@@ -275,6 +279,8 @@ class NavigationState : public WebKit::WebDataSource::ExtraData {
bool was_fetched_via_spdy_;
+ bool was_npn_negotiated_;
+
bool was_translated_;
DISALLOW_COPY_AND_ASSIGN(NavigationState);
diff --git a/chrome/renderer/render_view.cc b/chrome/renderer/render_view.cc
index 09c3436..45e2c37 100644
--- a/chrome/renderer/render_view.cc
+++ b/chrome/renderer/render_view.cc
@@ -2875,13 +2875,20 @@ void RenderView::didReceiveResponse(
if (frame->isViewSourceModeEnabled())
return;
+ NavigationState* navigation_state =
+ NavigationState::FromDataSource(frame->provisionalDataSource());
+ CHECK(navigation_state);
+
// Record that this was a page loaded over SPDY.
if (response.wasFetchedViaSPDY()) {
- NavigationState* navigation_state =
- NavigationState::FromDataSource(frame->provisionalDataSource());
navigation_state->set_was_fetched_via_spdy(true);
}
+ // Record that npn protocol was negotiated when fetching this page.
+ if (response.wasNpnNegotiated()) {
+ navigation_state->set_was_npn_negotiated(true);
+ }
+
// Consider loading an alternate error page for 404 responses.
if (response.httpStatusCode() != 404)
return;
@@ -2890,8 +2897,6 @@ void RenderView::didReceiveResponse(
if (!GetAlternateErrorPageURL(response.url(), HTTP_404).is_valid())
return;
- NavigationState* navigation_state =
- NavigationState::FromDataSource(frame->provisionalDataSource());
navigation_state->set_postpone_loading_data(true);
navigation_state->clear_postponed_data();
}
@@ -4556,6 +4561,27 @@ void RenderView::DumpLoadHistograms() const {
begin_to_finish_doc, kBeginToFinishDocMin, kBeginToFinishDocMax,
kBeginToFinishDocBucketCount);
+ static bool use_spdy_histogram(FieldTrialList::Find("SpdyImpact") &&
+ !FieldTrialList::Find("SpdyImpact")->group_name().empty());
+ if (use_spdy_histogram) {
+ switch (load_type) {
+ case NavigationState::LINK_LOAD_NORMAL:
+ if (navigation_state->was_npn_negotiated()) {
+ DCHECK(FieldTrialList::Find("SpdyImpact")->group_name() ==
+ "_npn_with_http" ||
+ FieldTrialList::Find("SpdyImpact")->group_name() ==
+ "_npn_with_spdy");
+ UMA_HISTOGRAM_CUSTOM_TIMES(FieldTrial::MakeName(
+ "Renderer4.BeginToFinish_LinkLoadNormal_SpdyTrial", "SpdyImpact"),
+ begin_to_finish, kBeginToFinishMin, kBeginToFinishMax,
+ kBeginToFinishBucketCount);
+ }
+ break;
+ default:
+ break;
+ }
+ }
+
UMA_HISTOGRAM_CUSTOM_TIMES("Renderer4.StartToFinish",
finish - start, kBeginToFinishMin,
kBeginToFinishMax, kBeginToFinishBucketCount);