summaryrefslogtreecommitdiffstats
path: root/chrome
diff options
context:
space:
mode:
authorrtenneti@chromium.org <rtenneti@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2012-03-24 14:12:48 +0000
committerrtenneti@chromium.org <rtenneti@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2012-03-24 14:12:48 +0000
commite0935cc22a6c10461b004b9f3c0b0f7f4d52c137 (patch)
treefb6e67b1a526192a0794d199ba9aa2846f38be05 /chrome
parent5970f146cda0eefc2726a2eeb9bd8e16234e0df1 (diff)
downloadchromium_src-e0935cc22a6c10461b004b9f3c0b0f7f4d52c137.zip
chromium_src-e0935cc22a6c10461b004b9f3c0b0f7f4d52c137.tar.gz
chromium_src-e0935cc22a6c10461b004b9f3c0b0f7f4d52c137.tar.bz2
SPDY - persist SPDY settings.
HttpServerProperties stores SPDY settings in SettingsMap whose key is settings ID and value is a (flags, value) pair (SettingsFlagsAndValue). The format of the persisted data is same as before (restored the old code that persisted the data). Verified it with an older version of the Preferences file that is very large. Verified that we have sent the right data (sorted and unique settings) to the server and that duplicates were removed from the file. Changed all the code above SpdyFramer to use the above spdy::SettingsMap and spdy::SettingsFlagsAndValue data structures. When chrome sends Spdy Settings to the server, it uses the current SpdyFramer's API calls to create Settings frame. TODO: 1) Delete spdy::SpdySettings and spdy::SpdySetting and replace them with SettingsMap, SpdySettingsIds, SpdySettingsFlags and value. 2) Add version to the persisted data. BUG=117760 R=rch, willchan TEST=network unit tests and browser unit tests. Review URL: http://codereview.chromium.org/9802003 git-svn-id: svn://svn.chromium.org/chrome/trunk/src@128737 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'chrome')
-rw-r--r--chrome/browser/net/http_server_properties_manager.cc88
-rw-r--r--chrome/browser/net/http_server_properties_manager.h26
-rw-r--r--chrome/browser/net/http_server_properties_manager_unittest.cc73
3 files changed, 103 insertions, 84 deletions
diff --git a/chrome/browser/net/http_server_properties_manager.cc b/chrome/browser/net/http_server_properties_manager.cc
index f884937..285082f 100644
--- a/chrome/browser/net/http_server_properties_manager.cc
+++ b/chrome/browser/net/http_server_properties_manager.cc
@@ -140,31 +140,21 @@ HttpServerPropertiesManager::alternate_protocol_map() const {
return http_server_properties_impl_->alternate_protocol_map();
}
-const net::SpdySettings&
+const net::SettingsMap&
HttpServerPropertiesManager::GetSpdySettings(
const net::HostPortPair& host_port_pair) const {
DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO));
return http_server_properties_impl_->GetSpdySettings(host_port_pair);
}
-// Saves settings for a host.
-bool HttpServerPropertiesManager::SetSpdySettings(
- const net::HostPortPair& host_port_pair,
- const net::SpdySettings& settings) {
- DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO));
- bool persist = http_server_properties_impl_->SetSpdySettings(
- host_port_pair, settings);
- if (persist)
- ScheduleUpdatePrefsOnIO();
- return persist;
-}
-
bool HttpServerPropertiesManager::SetSpdySetting(
const net::HostPortPair& host_port_pair,
- const net::SpdySetting& setting) {
+ net::SpdySettingsIds id,
+ net::SpdySettingsFlags flags,
+ uint32 value) {
DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO));
bool persist = http_server_properties_impl_->SetSpdySetting(
- host_port_pair, setting);
+ host_port_pair, id, flags, value);
if (persist)
ScheduleUpdatePrefsOnIO();
return persist;
@@ -278,8 +268,48 @@ void HttpServerPropertiesManager::UpdateCacheFromPrefsOnUI() {
spdy_servers->push_back(server_str);
}
- // TODO(rtenneti): Implement reading of SpdySettings.
+ // Get SpdySettings.
DCHECK(!ContainsKey(*spdy_settings_map, server));
+ base::ListValue* spdy_settings_list = NULL;
+ if (server_pref_dict->GetListWithoutPathExpansion(
+ "settings", &spdy_settings_list)) {
+ net::SettingsMap settings_map;
+
+ for (base::ListValue::const_iterator list_it =
+ spdy_settings_list->begin();
+ list_it != spdy_settings_list->end(); ++list_it) {
+ if ((*list_it)->GetType() != Value::TYPE_DICTIONARY) {
+ DVLOG(1) << "Malformed SpdySettingsList for server: " << server_str;
+ NOTREACHED();
+ continue;
+ }
+
+ const base::DictionaryValue* spdy_setting_dict =
+ static_cast<const base::DictionaryValue*>(*list_it);
+
+ int id = 0;
+ if (!spdy_setting_dict->GetIntegerWithoutPathExpansion("id", &id)) {
+ DVLOG(1) << "Malformed id in SpdySettings for server: " << server_str;
+ NOTREACHED();
+ continue;
+ }
+
+ int value = 0;
+ if (!spdy_setting_dict->GetIntegerWithoutPathExpansion("value",
+ &value)) {
+ DVLOG(1) << "Malformed value in SpdySettings for server: " <<
+ server_str;
+ NOTREACHED();
+ continue;
+ }
+
+ net::SettingsFlagsAndValue flags_and_value(
+ net::SETTINGS_FLAG_PERSISTED, value);
+ settings_map[static_cast<net::SpdySettingsIds>(id)] = flags_and_value;
+ }
+
+ (*spdy_settings_map)[server] = settings_map;
+ }
int pipeline_capability = net::PIPELINE_UNKNOWN;
if ((server_pref_dict->GetInteger(
@@ -423,20 +453,20 @@ void HttpServerPropertiesManager::UpdatePrefsFromCacheOnIO() {
struct ServerPref {
ServerPref()
: supports_spdy(false),
- settings(NULL),
+ settings_map(NULL),
alternate_protocol(NULL),
pipeline_capability(net::PIPELINE_UNKNOWN) {
}
ServerPref(bool supports_spdy,
- const net::SpdySettings* settings,
+ const net::SettingsMap* settings_map,
const net::PortAlternateProtocolPair* alternate_protocol)
: supports_spdy(supports_spdy),
- settings(settings),
+ settings_map(settings_map),
alternate_protocol(alternate_protocol),
pipeline_capability(net::PIPELINE_UNKNOWN) {
}
bool supports_spdy;
- const net::SpdySettings* settings;
+ const net::SettingsMap* settings_map;
const net::PortAlternateProtocolPair* alternate_protocol;
net::HttpPipelinedHostCapability pipeline_capability;
};
@@ -480,7 +510,7 @@ void HttpServerPropertiesManager::UpdatePrefsOnUI(
ServerPref server_pref(false, &map_it->second, NULL);
server_pref_map[server] = server_pref;
} else {
- it->second.settings = &map_it->second;
+ it->second.settings_map = &map_it->second;
}
}
@@ -535,7 +565,21 @@ void HttpServerPropertiesManager::UpdatePrefsOnUI(
// Save supports_spdy.
server_pref_dict->SetBoolean("supports_spdy", server_pref.supports_spdy);
- // TODO(rtenneti): Implement save SpdySettings.
+ // Save SPDY settings.
+ if (server_pref.settings_map) {
+ base::ListValue* spdy_settings_list = new ListValue();
+ for (net::SettingsMap::const_iterator it =
+ server_pref.settings_map->begin();
+ it != server_pref.settings_map->end(); ++it) {
+ net::SpdySettingsIds id = it->first;
+ uint32 value = it->second.second;
+ base::DictionaryValue* spdy_setting_dict = new base::DictionaryValue;
+ spdy_setting_dict->SetInteger("id", id);
+ spdy_setting_dict->SetInteger("value", value);
+ spdy_settings_list->Append(spdy_setting_dict);
+ }
+ server_pref_dict->Set("settings", spdy_settings_list);
+ }
// Save alternate_protocol.
if (server_pref.alternate_protocol) {
diff --git a/chrome/browser/net/http_server_properties_manager.h b/chrome/browser/net/http_server_properties_manager.h
index 47fc23f..2dbab04 100644
--- a/chrome/browser/net/http_server_properties_manager.h
+++ b/chrome/browser/net/http_server_properties_manager.h
@@ -107,26 +107,22 @@ class HttpServerPropertiesManager
virtual const net::AlternateProtocolMap&
alternate_protocol_map() const OVERRIDE;
- // Gets a reference to the SpdySettings stored for a host.
- // If no settings are stored, returns an empty set of settings.
- virtual const net::SpdySettings& GetSpdySettings(
+ // Gets a reference to the SettingsMap stored for a host.
+ // If no settings are stored, returns an empty SettingsMap.
+ virtual const net::SettingsMap& GetSpdySettings(
const net::HostPortPair& host_port_pair) const OVERRIDE;
- // Saves settings for a host. Returns true if SpdySettings are persisted.
- virtual bool SetSpdySettings(
- const net::HostPortPair& host_port_pair,
- const net::SpdySettings& settings) OVERRIDE;
+ // Saves an individual SPDY setting for a host. Returns true if SPDY setting
+ // is to be persisted.
+ virtual bool SetSpdySetting(const net::HostPortPair& host_port_pair,
+ net::SpdySettingsIds id,
+ net::SpdySettingsFlags flags,
+ uint32 value) OVERRIDE;
- // Saves an individual setting for a host. Returns true if SpdySetting is
- // persisted.
- virtual bool SetSpdySetting(
- const net::HostPortPair& host_port_pair,
- const net::SpdySetting& setting) OVERRIDE;
-
- // Clears all spdy_settings.
+ // Clears all SPDY settings.
virtual void ClearSpdySettings() OVERRIDE;
- // Returns all SpdySettings mappings.
+ // Returns all SPDY persistent settings.
virtual const net::SpdySettingsMap& spdy_settings_map() const OVERRIDE;
virtual net::HttpPipelinedHostCapability GetPipelineCapability(
diff --git a/chrome/browser/net/http_server_properties_manager_unittest.cc b/chrome/browser/net/http_server_properties_manager_unittest.cc
index 4daa14d..6602b3b 100644
--- a/chrome/browser/net/http_server_properties_manager_unittest.cc
+++ b/chrome/browser/net/http_server_properties_manager_unittest.cc
@@ -238,51 +238,28 @@ TEST_F(HttpServerPropertiesManagerTest, SupportsSpdy) {
Mock::VerifyAndClearExpectations(http_server_props_manager_.get());
}
-TEST_F(HttpServerPropertiesManagerTest, SetSpdySettings) {
- ExpectPrefsUpdate();
-
- // Add SpdySettings for mail.google.com:443.
- net::HostPortPair spdy_server_mail("mail.google.com", 443);
- net::SpdySettings spdy_settings;
- net::SettingsFlagsAndId id1(net::SETTINGS_FLAG_PLEASE_PERSIST, 1234);
- spdy_settings.push_back(std::make_pair(id1, 31337));
- http_server_props_manager_->SetSpdySettings(spdy_server_mail, spdy_settings);
-
- // Run the task.
- loop_.RunAllPending();
-
- net::SpdySettings spdy_settings_ret =
- http_server_props_manager_->GetSpdySettings(spdy_server_mail);
- ASSERT_EQ(1U, spdy_settings_ret.size());
- net::SpdySetting spdy_setting1_ret = spdy_settings_ret.front();
- net::SettingsFlagsAndId id1_ret(spdy_setting1_ret.first);
- EXPECT_EQ(1234U, id1_ret.id());
- EXPECT_EQ(net::SETTINGS_FLAG_PERSISTED, id1_ret.flags());
- EXPECT_EQ(31337U, spdy_setting1_ret.second);
-
- Mock::VerifyAndClearExpectations(http_server_props_manager_.get());
-}
-
TEST_F(HttpServerPropertiesManagerTest, SetSpdySetting) {
ExpectPrefsUpdate();
// Add SpdySetting for mail.google.com:443.
net::HostPortPair spdy_server_mail("mail.google.com", 443);
- net::SettingsFlagsAndId id1(net::SETTINGS_FLAG_PLEASE_PERSIST, 1234);
+ const net::SpdySettingsIds id1 = net::SETTINGS_UPLOAD_BANDWIDTH;
+ const net::SpdySettingsFlags flags1 = net::SETTINGS_FLAG_PLEASE_PERSIST;
+ const uint32 value1 = 31337;
http_server_props_manager_->SetSpdySetting(
- spdy_server_mail, std::make_pair(id1, 31337));
+ spdy_server_mail, id1, flags1, value1);
// Run the task.
loop_.RunAllPending();
- net::SpdySettings spdy_settings_ret =
+ const net::SettingsMap& settings_map1_ret =
http_server_props_manager_->GetSpdySettings(spdy_server_mail);
- ASSERT_EQ(1U, spdy_settings_ret.size());
- net::SpdySetting spdy_setting1_ret = spdy_settings_ret.front();
- net::SettingsFlagsAndId id1_ret(spdy_setting1_ret.first);
- EXPECT_EQ(1234U, id1_ret.id());
- EXPECT_EQ(net::SETTINGS_FLAG_PERSISTED, id1_ret.flags());
- EXPECT_EQ(31337U, spdy_setting1_ret.second);
+ ASSERT_EQ(1U, settings_map1_ret.size());
+ net::SettingsMap::const_iterator it1_ret = settings_map1_ret.find(id1);
+ EXPECT_TRUE(it1_ret != settings_map1_ret.end());
+ net::SettingsFlagsAndValue flags_and_value1_ret = it1_ret->second;
+ EXPECT_EQ(net::SETTINGS_FLAG_PERSISTED, flags_and_value1_ret.first);
+ EXPECT_EQ(value1, flags_and_value1_ret.second);
Mock::VerifyAndClearExpectations(http_server_props_manager_.get());
}
@@ -343,10 +320,11 @@ TEST_F(HttpServerPropertiesManagerTest, Clear) {
http_server_props_manager_->SetAlternateProtocol(
spdy_server_mail, 443, net::NPN_SPDY_2);
- net::SpdySettings spdy_settings;
- net::SettingsFlagsAndId id1(net::SETTINGS_FLAG_PLEASE_PERSIST, 1234);
- spdy_settings.push_back(std::make_pair(id1, 31337));
- http_server_props_manager_->SetSpdySettings(spdy_server_mail, spdy_settings);
+ const net::SpdySettingsIds id1 = net::SETTINGS_UPLOAD_BANDWIDTH;
+ const net::SpdySettingsFlags flags1 = net::SETTINGS_FLAG_PLEASE_PERSIST;
+ const uint32 value1 = 31337;
+ http_server_props_manager_->SetSpdySetting(
+ spdy_server_mail, id1, flags1, value1);
net::HostPortPair known_pipeliner("pipeline.com", 8080);
http_server_props_manager_->SetPipelineCapability(known_pipeliner,
@@ -359,14 +337,15 @@ TEST_F(HttpServerPropertiesManagerTest, Clear) {
EXPECT_TRUE(
http_server_props_manager_->HasAlternateProtocol(spdy_server_mail));
- net::SpdySettings spdy_settings_ret =
+ // Check SPDY settings values.
+ const net::SettingsMap& settings_map1_ret =
http_server_props_manager_->GetSpdySettings(spdy_server_mail);
- ASSERT_EQ(1U, spdy_settings_ret.size());
- net::SpdySetting spdy_setting1_ret = spdy_settings_ret.front();
- net::SettingsFlagsAndId id1_ret(spdy_setting1_ret.first);
- EXPECT_EQ(1234U, id1_ret.id());
- EXPECT_EQ(net::SETTINGS_FLAG_PERSISTED, id1_ret.flags());
- EXPECT_EQ(31337U, spdy_setting1_ret.second);
+ ASSERT_EQ(1U, settings_map1_ret.size());
+ net::SettingsMap::const_iterator it1_ret = settings_map1_ret.find(id1);
+ EXPECT_TRUE(it1_ret != settings_map1_ret.end());
+ net::SettingsFlagsAndValue flags_and_value1_ret = it1_ret->second;
+ EXPECT_EQ(net::SETTINGS_FLAG_PERSISTED, flags_and_value1_ret.first);
+ EXPECT_EQ(value1, flags_and_value1_ret.second);
EXPECT_EQ(net::PIPELINE_CAPABLE,
http_server_props_manager_->GetPipelineCapability(known_pipeliner));
@@ -384,9 +363,9 @@ TEST_F(HttpServerPropertiesManagerTest, Clear) {
EXPECT_FALSE(
http_server_props_manager_->HasAlternateProtocol(spdy_server_mail));
- net::SpdySettings spdy_settings1_ret =
+ const net::SettingsMap& settings_map2_ret =
http_server_props_manager_->GetSpdySettings(spdy_server_mail);
- EXPECT_EQ(0U, spdy_settings1_ret.size());
+ EXPECT_EQ(0U, settings_map2_ret.size());
EXPECT_EQ(net::PIPELINE_UNKNOWN,
http_server_props_manager_->GetPipelineCapability(known_pipeliner));