summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorrtenneti@chromium.org <rtenneti@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2012-03-23 05:57:54 +0000
committerrtenneti@chromium.org <rtenneti@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2012-03-23 05:57:54 +0000
commit3231b619a191e753e8b64c2061a1d5e2c99aa8b7 (patch)
tree988e5117e505d24f0c97b02b52c2c64f5def101b
parent04797250b8e2c836b5701390e1443ac45aa4208a (diff)
downloadchromium_src-3231b619a191e753e8b64c2061a1d5e2c99aa8b7.zip
chromium_src-3231b619a191e753e8b64c2061a1d5e2c99aa8b7.tar.gz
chromium_src-3231b619a191e753e8b64c2061a1d5e2c99aa8b7.tar.bz2
SPDY - Added enabling of SPDY/3 and SPDY flow control to
about:flags. Added command line switches --enable-spdy3 to enable SPDY/3 and --enable-spdy-flow-control to enable flow control (SPDY/2.1). Added Field Trials for SPDY/2.1 and SPDY/3. The FieldTrials are enabled when SPDY/3 and flow control command line options are not chosen. Removed --use-spdy=v3 and --use-spdy=flow-control options. BUG=118440,119205 R=willchan TEST=Netowrk unit tests and browser tests. Enable SPDY/3 in about:flags and see in chrome://net-internals that SPDY/2, SPDY/2.1 and SPDY/3 are displayed as the protocols supported. Enable SPDY FLow Control in about:flags and see in chrome://net-internals that SPDY/2 and SPDY/2.1 are displayed as the protocols supported. Review URL: http://codereview.chromium.org/9766021 git-svn-id: svn://svn.chromium.org/chrome/trunk/src@128420 0039d316-1c4b-4281-b951-d872f2087c98
-rw-r--r--chrome/app/generated_resources.grd12
-rw-r--r--chrome/browser/about_flags.cc14
-rw-r--r--chrome/browser/chrome_browser_main.cc29
-rw-r--r--chrome/common/chrome_switches.cc6
-rw-r--r--chrome/common/chrome_switches.h2
-rw-r--r--net/http/http_network_layer.cc20
-rw-r--r--net/http/http_stream_factory.cc19
-rw-r--r--net/http/http_stream_factory.h10
8 files changed, 92 insertions, 20 deletions
diff --git a/chrome/app/generated_resources.grd b/chrome/app/generated_resources.grd
index 147ae68..57488c0 100644
--- a/chrome/app/generated_resources.grd
+++ b/chrome/app/generated_resources.grd
@@ -5125,6 +5125,18 @@ Keep your key file in a safe place. You will need it to create new versions of y
<message name="IDS_FLAGS_ENABLE_HTTP_PIPELINING_DESCRIPTION" desc="Description for the flag to enable HTTP pipelining.">
Enable experimental pipelining of HTTP requests.
</message>
+ <message name="IDS_FLAGS_ENABLE_SPDY_FLOW_CONTROL_NAME" desc="Title for the flag to enable SPDY Flow Control">
+ Enable Flow Control and SPDY/2.1
+ </message>
+ <message name="IDS_FLAGS_ENABLE_SPDY_FLOW_CONTROL_DESCRIPTION" desc="Description for the flag to enable SPDY/2.1 and SPDY's flow control.">
+ Enable experimental SPDY/2.1 for flow control.
+ </message>
+ <message name="IDS_FLAGS_ENABLE_SPDY3_NAME" desc="Title for the flag to enable SPDY/3">
+ Enable SPDY/3
+ </message>
+ <message name="IDS_FLAGS_ENABLE_SPDY3_DESCRIPTION" desc="Description for the flag to enable SPDY/3.">
+ Enable experimental SPDY/3.
+ </message>
<message name="IDS_FLAGS_ENABLE_ASYNC_DNS_NAME" desc="Title for the flag to enable asynchronous DNS client.">
Built-in Asynchronous DNS
</message>
diff --git a/chrome/browser/about_flags.cc b/chrome/browser/about_flags.cc
index d82ddd8..38f7727 100644
--- a/chrome/browser/about_flags.cc
+++ b/chrome/browser/about_flags.cc
@@ -441,6 +441,20 @@ const Experiment kExperiments[] = {
SINGLE_VALUE_TYPE(switches::kEnableHttpPipelining)
},
{
+ "enable-spdy3",
+ IDS_FLAGS_ENABLE_SPDY3_NAME,
+ IDS_FLAGS_ENABLE_SPDY3_DESCRIPTION,
+ kOsAll,
+ SINGLE_VALUE_TYPE(switches::kEnableSpdy3)
+ },
+ {
+ "enable-spdy-flow-control",
+ IDS_FLAGS_ENABLE_SPDY_FLOW_CONTROL_NAME,
+ IDS_FLAGS_ENABLE_SPDY_FLOW_CONTROL_DESCRIPTION,
+ kOsAll,
+ SINGLE_VALUE_TYPE(switches::kEnableSpdyFlowControl)
+ },
+ {
"enable-async-dns",
IDS_FLAGS_ENABLE_ASYNC_DNS_NAME,
IDS_FLAGS_ENABLE_ASYNC_DNS_DESCRIPTION,
diff --git a/chrome/browser/chrome_browser_main.cc b/chrome/browser/chrome_browser_main.cc
index a7c3cac..70b629a 100644
--- a/chrome/browser/chrome_browser_main.cc
+++ b/chrome/browser/chrome_browser_main.cc
@@ -806,6 +806,35 @@ void ChromeBrowserMainParts::SpdyFieldTrial() {
if (value > 0)
net::SpdySession::set_max_concurrent_streams(value);
}
+
+ if (parsed_command_line().HasSwitch(switches::kEnableSpdy3)) {
+ net::HttpStreamFactory::EnableSPDY3();
+ } else if (parsed_command_line().HasSwitch(
+ switches::kEnableSpdyFlowControl)) {
+ net::HttpStreamFactory::EnableFlowControl();
+ } else {
+ const base::FieldTrial::Probability kSpdyDivisor = 100;
+ base::FieldTrial::Probability flow_control_probability = 5;
+ base::FieldTrial::Probability spdy3_probability = 0;
+
+ // After October 30, 2012 builds, it will always be in default group
+ // (disable_spdy_protocol_test).
+ scoped_refptr<base::FieldTrial> trial(
+ new base::FieldTrial(
+ "SpdyProtocolTest", kSpdyDivisor, "disable_spdy_protocol_test",
+ 2012, 10, 30));
+
+ int spdy3_grp = trial->AppendGroup("spdy3", spdy3_probability);
+ int flow_control_grp = trial->AppendGroup(
+ "flow_control", flow_control_probability);
+
+ int trial_grp = trial->group();
+ if (trial_grp == spdy3_grp) {
+ net::HttpStreamFactory::EnableSPDY3();
+ } else if (trial_grp == flow_control_grp) {
+ net::HttpStreamFactory::EnableFlowControl();
+ }
+ }
}
// If --socket-reuse-policy is not specified, run an A/B test for choosing the
diff --git a/chrome/common/chrome_switches.cc b/chrome/common/chrome_switches.cc
index 239da7d..d493a98 100644
--- a/chrome/common/chrome_switches.cc
+++ b/chrome/common/chrome_switches.cc
@@ -581,6 +581,12 @@ const char kEnableProfiling[] = "enable-profiling";
// supported server-side for searches on google.com.
const char kEnableSdch[] = "enable-sdch";
+// Enable SPDY/3. This is a temporary testing flag.
+const char kEnableSpdy3[] = "enable-spdy3";
+
+// Enable SPDY's FlowControl (SPDY/2.1). This is a temporary testing flag.
+const char kEnableSpdyFlowControl[] = "enable-spdy-flow-control";
+
// Enables experimental suggestions pane in New Tab page.
const char kEnableSuggestionsTabPage[] = "enable-suggestions-ntp";
diff --git a/chrome/common/chrome_switches.h b/chrome/common/chrome_switches.h
index f54ec8d..051efe6 100644
--- a/chrome/common/chrome_switches.h
+++ b/chrome/common/chrome_switches.h
@@ -163,6 +163,8 @@ extern const char kEnablePnacl[];
extern const char kEnableProfiling[];
extern const char kEnableResourceContentSettings[];
extern const char kEnableSdch[];
+extern const char kEnableSpdy3[];
+extern const char kEnableSpdyFlowControl[];
extern const char kEnableSuggestionsTabPage[];
extern const char kEnableSyncTabs[];
extern const char kDisableSyncTabs[];
diff --git a/net/http/http_network_layer.cc b/net/http/http_network_layer.cc
index f8da78d..0ae03d2 100644
--- a/net/http/http_network_layer.cc
+++ b/net/http/http_network_layer.cc
@@ -46,16 +46,9 @@ void HttpNetworkLayer::EnableSpdy(const std::string& mode) {
static const char kExclude[] = "exclude"; // Hosts to exclude
static const char kDisableCompression[] = "no-compress";
static const char kDisableAltProtocols[] = "no-alt-protocols";
- static const char kEnableVersionThree[] = "v3";
static const char kForceAltProtocols[] = "force-alt-protocols";
static const char kSingleDomain[] = "single-domain";
- // If flow-control is enabled, received WINDOW_UPDATE and SETTINGS
- // messages are processed and outstanding window size is actually obeyed
- // when sending data frames, and WINDOW_UPDATE messages are generated
- // when data is consumed.
- static const char kEnableFlowControl[] = "flow-control";
-
// We want an A/B experiment between SPDY enabled and SPDY disabled,
// but only for pages where SPDY *could have been* negotiated. To do
// this, we use NPN, but prevent it from negotiating SPDY. If the
@@ -103,13 +96,6 @@ void HttpNetworkLayer::EnableSpdy(const std::string& mode) {
next_protos.push_back("http/1.1");
next_protos.push_back("spdy/2");
HttpStreamFactory::SetNextProtos(next_protos);
- } else if (option == kEnableVersionThree) {
- std::vector<std::string> next_protos;
- next_protos.push_back("http/1.1");
- next_protos.push_back("spdy/2");
- next_protos.push_back("spdy/2.1");
- next_protos.push_back("spdy/3");
- HttpStreamFactory::SetNextProtos(next_protos);
} else if (option == kEnableNpnHttpOnly) {
// Avoid alternate protocol in this case. Otherwise, browser will try SSL
// and then fallback to http. This introduces extra load.
@@ -121,12 +107,6 @@ void HttpNetworkLayer::EnableSpdy(const std::string& mode) {
} else if (option == kDisableAltProtocols) {
use_alt_protocols = false;
HttpStreamFactory::set_use_alternate_protocols(false);
- } else if (option == kEnableFlowControl) {
- std::vector<std::string> next_protos;
- next_protos.push_back("http/1.1");
- next_protos.push_back("spdy/2");
- next_protos.push_back("spdy/2.1");
- HttpStreamFactory::SetNextProtos(next_protos);
} else if (option == kForceAltProtocols) {
PortAlternateProtocolPair pair;
pair.port = 443;
diff --git a/net/http/http_stream_factory.cc b/net/http/http_stream_factory.cc
index dda9951..dee1874 100644
--- a/net/http/http_stream_factory.cc
+++ b/net/http/http_stream_factory.cc
@@ -149,6 +149,25 @@ bool HttpStreamFactory::HasSpdyExclusion(const HostPortPair& endpoint) {
}
// static
+void HttpStreamFactory::EnableFlowControl() {
+ std::vector<std::string> next_protos;
+ next_protos.push_back("http/1.1");
+ next_protos.push_back("spdy/2");
+ next_protos.push_back("spdy/2.1");
+ SetNextProtos(next_protos);
+}
+
+// static
+void HttpStreamFactory::EnableSPDY3() {
+ std::vector<std::string> next_protos;
+ next_protos.push_back("http/1.1");
+ next_protos.push_back("spdy/2");
+ next_protos.push_back("spdy/2.1");
+ next_protos.push_back("spdy/3");
+ SetNextProtos(next_protos);
+}
+
+// static
void HttpStreamFactory::SetNextProtos(const std::vector<std::string>& value) {
if (!next_protos_)
next_protos_ = new std::vector<std::string>;
diff --git a/net/http/http_stream_factory.h b/net/http/http_stream_factory.h
index 8c726bb..ff32589 100644
--- a/net/http/http_stream_factory.h
+++ b/net/http/http_stream_factory.h
@@ -230,6 +230,16 @@ class NET_EXPORT HttpStreamFactory {
// Check if a HostPortPair is excluded from using spdy.
static bool HasSpdyExclusion(const HostPortPair& endpoint);
+ // Sets http/1.1, spdy/2, spdy/2.1 and spdy/3 as the protocols supported.
+ static void EnableSPDY3();
+
+ // Sets http/1.1, spdy/2 and spdy/2.1 as the protocols supported.
+ // If flow-control is enabled, received WINDOW_UPDATE and SETTINGS messages
+ // are processed and outstanding window size is actually obeyed when sending
+ // data frames, and WINDOW_UPDATE messages are generated when data is
+ // consumed.
+ static void EnableFlowControl();
+
// Sets the protocols supported by NPN (next protocol negotiation) during the
// SSL handshake as well as by HTTP Alternate-Protocol.
static void SetNextProtos(const std::vector<std::string>& value);