diff options
author | lzheng@chromium.org <lzheng@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2010-05-21 06:56:53 +0000 |
---|---|---|
committer | lzheng@chromium.org <lzheng@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2010-05-21 06:56:53 +0000 |
commit | 65041fa2a7d79cbd289d6bfa05a55bfb32ec4fa3 (patch) | |
tree | 5ba89200e8bdc109b64b9327fad2bc563bc03406 /chrome | |
parent | 5ea89fbf0d7647669fc91dda7fe944d8f2ef1f1c (diff) | |
download | chromium_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.cc | 7 | ||||
-rw-r--r-- | chrome/browser/browser_main.cc | 49 | ||||
-rw-r--r-- | chrome/browser/renderer_host/resource_dispatcher_host.cc | 1 | ||||
-rw-r--r-- | chrome/common/render_messages.h | 6 | ||||
-rw-r--r-- | chrome/renderer/loadtimes_extension_bindings.cc | 3 | ||||
-rw-r--r-- | chrome/renderer/navigation_state.h | 6 | ||||
-rw-r--r-- | chrome/renderer/render_view.cc | 34 |
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); |