| OLD | NEW |
| 1 // Copyright 2014 The Chromium Authors. All rights reserved. | 1 // Copyright 2014 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "content/public/browser/host_zoom_map.h" | 5 #include "content/public/browser/host_zoom_map.h" |
| 6 | 6 |
| 7 #include <algorithm> | 7 #include <algorithm> |
| 8 #include <string> | 8 #include <string> |
| 9 #include <vector> | 9 #include <vector> |
| 10 | 10 |
| (...skipping 57 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 68 }; | 68 }; |
| 69 | 69 |
| 70 } // namespace | 70 } // namespace |
| 71 | 71 |
| 72 class HostZoomMapBrowserTest : public InProcessBrowserTest { | 72 class HostZoomMapBrowserTest : public InProcessBrowserTest { |
| 73 public: | 73 public: |
| 74 HostZoomMapBrowserTest() {} | 74 HostZoomMapBrowserTest() {} |
| 75 | 75 |
| 76 protected: | 76 protected: |
| 77 void SetDefaultZoomLevel(double level) { | 77 void SetDefaultZoomLevel(double level) { |
| 78 browser()->profile()->GetPrefs()->SetDouble( | 78 browser()->profile()->GetZoomLevelPrefs()->SetDouble( |
| 79 prefs::kDefaultZoomLevel, level); | 79 prefs::kDefaultZoomLevel, level); |
| 80 } | 80 } |
| 81 | 81 |
| 82 double GetZoomLevel(const GURL& url) { | 82 double GetZoomLevel(const GURL& url) { |
| 83 content::HostZoomMap* host_zoom_map = static_cast<content::HostZoomMap*>( | 83 content::HostZoomMap* host_zoom_map = static_cast<content::HostZoomMap*>( |
| 84 content::HostZoomMap::GetDefaultForBrowserContext( | 84 content::HostZoomMap::GetDefaultForBrowserContext( |
| 85 browser()->profile())); | 85 browser()->profile())); |
| 86 return host_zoom_map->GetZoomLevelForHostAndScheme(url.scheme(), | 86 return host_zoom_map->GetZoomLevelForHostAndScheme(url.scheme(), |
| 87 url.host()); | 87 url.host()); |
| 88 } | 88 } |
| 89 | 89 |
| 90 std::vector<std::string> GetHostsWithZoomLevels() { | 90 std::vector<std::string> GetHostsWithZoomLevels() { |
| 91 typedef content::HostZoomMap::ZoomLevelVector ZoomLevelVector; | 91 typedef content::HostZoomMap::ZoomLevelVector ZoomLevelVector; |
| 92 content::HostZoomMap* host_zoom_map = static_cast<content::HostZoomMap*>( | 92 content::HostZoomMap* host_zoom_map = static_cast<content::HostZoomMap*>( |
| 93 content::HostZoomMap::GetDefaultForBrowserContext( | 93 content::HostZoomMap::GetDefaultForBrowserContext( |
| 94 browser()->profile())); | 94 browser()->profile())); |
| 95 content::HostZoomMap::ZoomLevelVector zoom_levels = | 95 content::HostZoomMap::ZoomLevelVector zoom_levels = |
| 96 host_zoom_map->GetAllZoomLevels(); | 96 host_zoom_map->GetAllZoomLevels(); |
| 97 std::vector<std::string> results; | 97 std::vector<std::string> results; |
| 98 for (ZoomLevelVector::const_iterator it = zoom_levels.begin(); | 98 for (ZoomLevelVector::const_iterator it = zoom_levels.begin(); |
| 99 it != zoom_levels.end(); ++it) | 99 it != zoom_levels.end(); ++it) |
| 100 results.push_back(it->host); | 100 results.push_back(it->host); |
| 101 return results; | 101 return results; |
| 102 } | 102 } |
| 103 | 103 |
| 104 std::vector<std::string> GetHostsWithZoomLevelsFromPrefs() { | 104 std::vector<std::string> GetHostsWithZoomLevelsFromPrefs() { |
| 105 PrefService* prefs = browser()->profile()->GetPrefs(); | 105 PrefService* prefs = browser()->profile()->GetZoomLevelPrefs(); |
| 106 const base::DictionaryValue* values = | 106 const base::DictionaryValue* values = |
| 107 prefs->GetDictionary(prefs::kPerHostZoomLevels); | 107 prefs->GetDictionary(prefs::kPerHostZoomLevels); |
| 108 std::vector<std::string> results; | 108 std::vector<std::string> results; |
| 109 if (values) { | 109 if (values) { |
| 110 for (base::DictionaryValue::Iterator it(*values); | 110 for (base::DictionaryValue::Iterator it(*values); |
| 111 !it.IsAtEnd(); it.Advance()) | 111 !it.IsAtEnd(); it.Advance()) |
| 112 results.push_back(it.key()); | 112 results.push_back(it.key()); |
| 113 } | 113 } |
| 114 return results; | 114 return results; |
| 115 } | 115 } |
| (...skipping 14 matching lines...) Expand all Loading... |
| 130 virtual void SetUpOnMainThread() OVERRIDE { | 130 virtual void SetUpOnMainThread() OVERRIDE { |
| 131 ASSERT_TRUE(embedded_test_server()->InitializeAndWaitUntilReady()); | 131 ASSERT_TRUE(embedded_test_server()->InitializeAndWaitUntilReady()); |
| 132 embedded_test_server()->RegisterRequestHandler(base::Bind( | 132 embedded_test_server()->RegisterRequestHandler(base::Bind( |
| 133 &HostZoomMapBrowserTest::HandleRequest, base::Unretained(this))); | 133 &HostZoomMapBrowserTest::HandleRequest, base::Unretained(this))); |
| 134 host_resolver()->AddRule("*", "127.0.0.1"); | 134 host_resolver()->AddRule("*", "127.0.0.1"); |
| 135 } | 135 } |
| 136 | 136 |
| 137 DISALLOW_COPY_AND_ASSIGN(HostZoomMapBrowserTest); | 137 DISALLOW_COPY_AND_ASSIGN(HostZoomMapBrowserTest); |
| 138 }; | 138 }; |
| 139 | 139 |
| 140 class HostZoomMapSanitizationBrowserTest : public HostZoomMapBrowserTest { | 140 class HostZoomMapBrowserTestWithPrefs : public HostZoomMapBrowserTest { |
| 141 public: | 141 public: |
| 142 HostZoomMapSanitizationBrowserTest() {} | 142 HostZoomMapBrowserTestWithPrefs() {} |
| 143 |
| 144 protected: |
| 145 std::string prefs_data_; |
| 146 std::string prefs_filename_; |
| 143 | 147 |
| 144 private: | 148 private: |
| 145 // InProcessBrowserTest: | 149 // InProcessBrowserTest: |
| 146 virtual bool SetUpUserDataDirectory() OVERRIDE { | 150 virtual bool SetUpUserDataDirectory() OVERRIDE { |
| 147 // Zoom-related preferences demonstrating the two problems that could be | 151 std::replace(prefs_data_.begin(), prefs_data_.end(), '\'', '\"'); |
| 148 // caused by the bug. They incorrectly contain a per-host zoom level for the | |
| 149 // empty host; and a value for 'host1' that only differs from the default by | |
| 150 // epsilon. Neither should have been persisted. | |
| 151 const char kBrokenPrefs[] = | |
| 152 "{'profile': {" | |
| 153 " 'default_zoom_level': 1.2," | |
| 154 " 'per_host_zoom_levels': {'': 1.1, 'host1': 1.20001, 'host2': 1.3}" | |
| 155 "}}"; | |
| 156 std::string broken_prefs(kBrokenPrefs); | |
| 157 std::replace(broken_prefs.begin(), broken_prefs.end(), '\'', '\"'); | |
| 158 | 152 |
| 159 base::FilePath user_data_directory, path_to_prefs; | 153 base::FilePath user_data_directory, path_to_prefs; |
| 160 PathService::Get(chrome::DIR_USER_DATA, &user_data_directory); | 154 PathService::Get(chrome::DIR_USER_DATA, &user_data_directory); |
| 161 path_to_prefs = user_data_directory | 155 path_to_prefs = user_data_directory |
| 162 .AppendASCII(TestingProfile::kTestUserProfileDir) | 156 .AppendASCII(TestingProfile::kTestUserProfileDir) |
| 163 .Append(chrome::kPreferencesFilename); | 157 .Append(prefs_filename_); |
| 164 base::CreateDirectory(path_to_prefs.DirName()); | 158 base::CreateDirectory(path_to_prefs.DirName()); |
| 165 base::WriteFile(path_to_prefs, broken_prefs.c_str(), broken_prefs.size()); | 159 base::WriteFile( |
| 160 path_to_prefs, prefs_data_.c_str(), prefs_data_.size()); |
| 166 return true; | 161 return true; |
| 167 } | 162 } |
| 168 | 163 |
| 164 DISALLOW_COPY_AND_ASSIGN(HostZoomMapBrowserTestWithPrefs); |
| 165 }; |
| 166 |
| 167 class HostZoomMapSanitizationBrowserTest |
| 168 : public HostZoomMapBrowserTestWithPrefs { |
| 169 public: |
| 170 HostZoomMapSanitizationBrowserTest() { |
| 171 // Zoom-related preferences demonstrating the two problems that could be |
| 172 // caused by the bug. They incorrectly contain a per-host zoom level for the |
| 173 // empty host; and a value for 'host1' that only differs from the default by |
| 174 // epsilon. Neither should have been persisted. |
| 175 prefs_data_ = |
| 176 "{'partition': {" |
| 177 " 'default_zoom_level': 1.2," |
| 178 " 'per_host_zoom_levels': {'': 1.1, 'host1': 1.20001, 'host2': 1.3}" |
| 179 "}}"; |
| 180 prefs_filename_ = chrome::kZoomLevelPreferencesFilename; |
| 181 } |
| 182 |
| 183 private: |
| 169 DISALLOW_COPY_AND_ASSIGN(HostZoomMapSanitizationBrowserTest); | 184 DISALLOW_COPY_AND_ASSIGN(HostZoomMapSanitizationBrowserTest); |
| 170 }; | 185 }; |
| 171 | 186 |
| 172 // Regression test for crbug.com/364399. | 187 // Regression test for crbug.com/364399. |
| 173 IN_PROC_BROWSER_TEST_F(HostZoomMapBrowserTest, ToggleDefaultZoomLevel) { | 188 IN_PROC_BROWSER_TEST_F(HostZoomMapBrowserTest, ToggleDefaultZoomLevel) { |
| 174 const double default_zoom_level = content::ZoomFactorToZoomLevel(1.5); | 189 const double default_zoom_level = content::ZoomFactorToZoomLevel(1.5); |
| 175 | 190 |
| 176 const char kTestURLTemplate1[] = "http://host1:%d/"; | 191 const char kTestURLTemplate1[] = "http://host1:%d/"; |
| 177 const char kTestURLTemplate2[] = "http://host2:%d/"; | 192 const char kTestURLTemplate2[] = "http://host2:%d/"; |
| 178 | 193 |
| (...skipping 30 matching lines...) Expand all Loading... |
| 209 // any per-host values saved either to Pref, or internally in HostZoomMap. | 224 // any per-host values saved either to Pref, or internally in HostZoomMap. |
| 210 EXPECT_TRUE(GetHostsWithZoomLevels().empty()); | 225 EXPECT_TRUE(GetHostsWithZoomLevels().empty()); |
| 211 EXPECT_TRUE(GetHostsWithZoomLevelsFromPrefs().empty()); | 226 EXPECT_TRUE(GetHostsWithZoomLevelsFromPrefs().empty()); |
| 212 } | 227 } |
| 213 | 228 |
| 214 // Test that garbage data from crbug.com/364399 is cleared up on startup. | 229 // Test that garbage data from crbug.com/364399 is cleared up on startup. |
| 215 IN_PROC_BROWSER_TEST_F(HostZoomMapSanitizationBrowserTest, ClearOnStartup) { | 230 IN_PROC_BROWSER_TEST_F(HostZoomMapSanitizationBrowserTest, ClearOnStartup) { |
| 216 EXPECT_THAT(GetHostsWithZoomLevels(), testing::ElementsAre("host2")); | 231 EXPECT_THAT(GetHostsWithZoomLevels(), testing::ElementsAre("host2")); |
| 217 EXPECT_THAT(GetHostsWithZoomLevelsFromPrefs(), testing::ElementsAre("host2")); | 232 EXPECT_THAT(GetHostsWithZoomLevelsFromPrefs(), testing::ElementsAre("host2")); |
| 218 } | 233 } |
| 234 |
| 235 class HostZoomMapMigrationBrowserTest : public HostZoomMapBrowserTestWithPrefs { |
| 236 public: |
| 237 HostZoomMapMigrationBrowserTest(): kOriginalDefaultZoomLevel(1.2) { |
| 238 // In this case we migrate the zoom level data from the profile prefs. |
| 239 prefs_data_ = |
| 240 "{'profile': {" |
| 241 " 'default_zoom_level': 1.2," |
| 242 " 'per_host_zoom_levels': {'': 1.1, 'host1': 1.20001, 'host2': 1.3}" |
| 243 "}}"; |
| 244 prefs_filename_ = chrome::kPreferencesFilename; |
| 245 } |
| 246 |
| 247 const double kOriginalDefaultZoomLevel; |
| 248 |
| 249 private: |
| 250 DISALLOW_COPY_AND_ASSIGN(HostZoomMapMigrationBrowserTest); |
| 251 }; |
| 252 |
| 253 // This test is the same as HostZoomMapSanitizationBrowserTest, except that the |
| 254 // zoom level data is loaded from the profile prefs, transfered to the |
| 255 // zoom-level prefs, and we verify that the profile zoom level prefs are |
| 256 // erased in the process. We also test that changes to the host zoom map and the |
| 257 // default zoom level don't propagate back to the profile prefs. |
| 258 IN_PROC_BROWSER_TEST_F(HostZoomMapMigrationBrowserTest, |
| 259 MigrateProfileZoomPreferences) { |
| 260 EXPECT_THAT(GetHostsWithZoomLevels(), testing::ElementsAre("host2")); |
| 261 EXPECT_THAT(GetHostsWithZoomLevelsFromPrefs(), testing::ElementsAre("host2")); |
| 262 |
| 263 PrefService* profile_prefs = |
| 264 browser()->profile()->GetPrefs(); |
| 265 PrefService* zoom_level_prefs = browser()->profile()->GetZoomLevelPrefs(); |
| 266 // Make sure that the profile pref for default zoom level has been set to |
| 267 // its default value of 0.0. |
| 268 EXPECT_EQ(0.0, profile_prefs->GetDouble(prefs::kProfileDefaultZoomLevel)); |
| 269 EXPECT_EQ(kOriginalDefaultZoomLevel, |
| 270 zoom_level_prefs->GetDouble(prefs::kDefaultZoomLevel)); |
| 271 |
| 272 // Make sure that the profile prefs for per-host zoom levels are erased. |
| 273 { |
| 274 const base::DictionaryValue* profile_host_zoom_dictionary = |
| 275 profile_prefs->GetDictionary(prefs::kProfilePerHostZoomLevels); |
| 276 EXPECT_EQ(0UL, profile_host_zoom_dictionary->size()); |
| 277 } |
| 278 |
| 279 ZoomLevelChangeObserver observer(browser()->profile()); |
| 280 content::HostZoomMap* host_zoom_map = static_cast<content::HostZoomMap*>( |
| 281 content::HostZoomMap::GetDefaultForBrowserContext( |
| 282 browser()->profile())); |
| 283 |
| 284 // Make sure that a change to a host zoom level doesn't propagate to the |
| 285 // profile prefs. |
| 286 std::string host3("host3"); |
| 287 host_zoom_map->SetZoomLevelForHost(host3, 1.3); |
| 288 observer.BlockUntilZoomLevelForHostHasChanged(host3); |
| 289 EXPECT_THAT(GetHostsWithZoomLevelsFromPrefs(), |
| 290 testing::ElementsAre("host2", host3)); |
| 291 { |
| 292 const base::DictionaryValue* profile_host_zoom_dictionary = |
| 293 profile_prefs->GetDictionary(prefs::kProfilePerHostZoomLevels); |
| 294 EXPECT_EQ(0UL, profile_host_zoom_dictionary->size()); |
| 295 } |
| 296 |
| 297 // Make sure a change to the default zoom level doesn't propagate to the |
| 298 // profile prefs. |
| 299 |
| 300 // First, we need a host at the default zoom level to respond when the |
| 301 // default zoom level changes. |
| 302 const double kNewDefaultZoomLevel = 1.5; |
| 303 GURL test_url = ConstructTestServerURL("http://host4:%d/"); |
| 304 ui_test_utils::NavigateToURL(browser(), test_url); |
| 305 EXPECT_TRUE(content::ZoomValuesEqual(kOriginalDefaultZoomLevel, |
| 306 GetZoomLevel(test_url))); |
| 307 |
| 308 // Change the default zoom level and observe. |
| 309 zoom_level_prefs->SetDouble(prefs::kDefaultZoomLevel, kNewDefaultZoomLevel); |
| 310 observer.BlockUntilZoomLevelForHostHasChanged(test_url.host()); |
| 311 EXPECT_TRUE( |
| 312 content::ZoomValuesEqual(kNewDefaultZoomLevel, GetZoomLevel(test_url))); |
| 313 EXPECT_EQ(kNewDefaultZoomLevel, |
| 314 zoom_level_prefs->GetDouble(prefs::kDefaultZoomLevel)); |
| 315 EXPECT_EQ(0.0, profile_prefs->GetDouble(prefs::kProfileDefaultZoomLevel)); |
| 316 } |
| 317 |
| OLD | NEW |