Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 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 "chrome/browser/custom_handlers/protocol_handler_registry.h" | 5 #include "chrome/browser/custom_handlers/protocol_handler_registry.h" |
| 6 | 6 |
| 7 #include <set> | 7 #include <set> |
| 8 | 8 |
| 9 #include "base/memory/scoped_ptr.h" | 9 #include "base/memory/scoped_ptr.h" |
| 10 #include "base/message_loop/message_loop.h" | 10 #include "base/message_loop/message_loop.h" |
| 11 #include "base/strings/utf_string_conversions.h" | 11 #include "base/strings/utf_string_conversions.h" |
| 12 #include "base/synchronization/waitable_event.h" | 12 #include "base/synchronization/waitable_event.h" |
| 13 #include "chrome/browser/chrome_notification_types.h" | 13 #include "chrome/browser/chrome_notification_types.h" |
| 14 #include "chrome/browser/prefs/pref_service_syncable.h" | 14 #include "chrome/browser/prefs/pref_service_syncable.h" |
| 15 #include "chrome/common/custom_handlers/protocol_handler.h" | 15 #include "chrome/common/custom_handlers/protocol_handler.h" |
| 16 #include "chrome/common/pref_names.h" | |
| 16 #include "chrome/test/base/testing_browser_process.h" | 17 #include "chrome/test/base/testing_browser_process.h" |
| 17 #include "chrome/test/base/testing_profile.h" | 18 #include "chrome/test/base/testing_profile.h" |
| 18 #include "components/pref_registry/pref_registry_syncable.h" | 19 #include "components/pref_registry/pref_registry_syncable.h" |
| 19 #include "content/public/browser/notification_observer.h" | 20 #include "content/public/browser/notification_observer.h" |
| 20 #include "content/public/browser/notification_registrar.h" | 21 #include "content/public/browser/notification_registrar.h" |
| 21 #include "content/public/browser/notification_source.h" | 22 #include "content/public/browser/notification_source.h" |
| 22 #include "content/public/test/test_browser_thread.h" | 23 #include "content/public/test/test_browser_thread.h" |
| 23 #include "content/public/test/test_renderer_host.h" | 24 #include "content/public/test/test_renderer_host.h" |
| 24 #include "net/base/request_priority.h" | 25 #include "net/base/request_priority.h" |
| 25 #include "net/url_request/url_request.h" | 26 #include "net/url_request/url_request.h" |
| (...skipping 70 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 96 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); | 97 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); |
| 97 BrowserThread::PostTask(BrowserThread::IO, | 98 BrowserThread::PostTask(BrowserThread::IO, |
| 98 FROM_HERE, | 99 FROM_HERE, |
| 99 base::Bind(AssertWillHandleIO, | 100 base::Bind(AssertWillHandleIO, |
| 100 scheme, | 101 scheme, |
| 101 expected, | 102 expected, |
| 102 base::Unretained(interceptor))); | 103 base::Unretained(interceptor))); |
| 103 base::MessageLoop::current()->RunUntilIdle(); | 104 base::MessageLoop::current()->RunUntilIdle(); |
| 104 } | 105 } |
| 105 | 106 |
| 107 base::DictionaryValue* GetProtocolHandlerValue(std::string protocol, | |
| 108 std::string url) { | |
| 109 base::DictionaryValue* value = new base::DictionaryValue(); | |
| 110 value->SetString("protocol", protocol); | |
| 111 value->SetString("url", url); | |
| 112 return value; | |
| 113 } | |
| 114 | |
| 115 base::DictionaryValue* GetProtocolHandlerValueWithDefault(std::string protocol, | |
| 116 std::string url, | |
| 117 bool is_default) { | |
| 118 base::DictionaryValue* value = GetProtocolHandlerValue(protocol, url); | |
| 119 value->SetBoolean("default", is_default); | |
| 120 return value; | |
| 121 } | |
| 122 | |
| 106 class FakeDelegate : public ProtocolHandlerRegistry::Delegate { | 123 class FakeDelegate : public ProtocolHandlerRegistry::Delegate { |
| 107 public: | 124 public: |
| 108 FakeDelegate() : force_os_failure_(false) {} | 125 FakeDelegate() : force_os_failure_(false) {} |
| 109 virtual ~FakeDelegate() { } | 126 virtual ~FakeDelegate() { } |
| 110 virtual void RegisterExternalHandler(const std::string& protocol) OVERRIDE { | 127 virtual void RegisterExternalHandler(const std::string& protocol) OVERRIDE { |
| 111 ASSERT_TRUE( | 128 ASSERT_TRUE( |
| 112 registered_protocols_.find(protocol) == registered_protocols_.end()); | 129 registered_protocols_.find(protocol) == registered_protocols_.end()); |
| 113 registered_protocols_.insert(protocol); | 130 registered_protocols_.insert(protocol); |
| 114 } | 131 } |
| 115 | 132 |
| (...skipping 211 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 327 ProtocolHandler CreateProtocolHandler(const std::string& protocol, | 344 ProtocolHandler CreateProtocolHandler(const std::string& protocol, |
| 328 const std::string& name) { | 345 const std::string& name) { |
| 329 return CreateProtocolHandler(protocol, GURL("http://" + name + "/%s")); | 346 return CreateProtocolHandler(protocol, GURL("http://" + name + "/%s")); |
| 330 } | 347 } |
| 331 | 348 |
| 332 void RecreateRegistry(bool initialize) { | 349 void RecreateRegistry(bool initialize) { |
| 333 TeadDownRegistry(); | 350 TeadDownRegistry(); |
| 334 SetUpRegistry(initialize); | 351 SetUpRegistry(initialize); |
| 335 } | 352 } |
| 336 | 353 |
| 354 int InPrefHandlerCount() { | |
| 355 const base::ListValue* in_pref_handlers = | |
| 356 profile()->GetPrefs()->GetList(prefs::kRegisteredProtocolHandlers); | |
| 357 return static_cast<int>(in_pref_handlers->GetSize()); | |
| 358 } | |
| 359 | |
| 360 int InMemoryHandlerCount() { | |
| 361 int in_memory_handler_count = 0; | |
| 362 ProtocolHandlerRegistry::ProtocolHandlerMultiMap::iterator it = | |
| 363 registry()->protocol_handlers_.begin(); | |
| 364 for (; it != registry()->protocol_handlers_.end(); ++it) | |
| 365 in_memory_handler_count += it->second.size(); | |
| 366 return in_memory_handler_count; | |
| 367 } | |
| 368 | |
| 369 int InPrefIgnoredHandlerCount() { | |
| 370 const base::ListValue* in_pref_ignored_handlers = | |
| 371 profile()->GetPrefs()->GetList(prefs::kIgnoredProtocolHandlers); | |
| 372 return static_cast<int>(in_pref_ignored_handlers->GetSize()); | |
| 373 } | |
| 374 | |
| 375 int InMemoryIgnoredHandlerCount() { | |
| 376 int in_memory_ignored_handler_count = 0; | |
| 377 ProtocolHandlerRegistry::ProtocolHandlerList::iterator it = | |
| 378 registry()->ignored_protocol_handlers_.begin(); | |
| 379 for (; it != registry()->ignored_protocol_handlers_.end(); ++it) | |
| 380 in_memory_ignored_handler_count++; | |
| 381 return in_memory_ignored_handler_count; | |
| 382 } | |
| 383 | |
| 337 // Returns a new registry, initializing it if |initialize| is true. | 384 // Returns a new registry, initializing it if |initialize| is true. |
| 338 // Caller assumes ownership for the object | 385 // Caller assumes ownership for the object |
| 339 void SetUpRegistry(bool initialize) { | 386 void SetUpRegistry(bool initialize) { |
| 340 delegate_ = new FakeDelegate(); | 387 delegate_ = new FakeDelegate(); |
| 341 registry_.reset(new ProtocolHandlerRegistry(profile(), delegate())); | 388 registry_.reset(new ProtocolHandlerRegistry(profile(), delegate())); |
| 342 if (initialize) registry_->InitProtocolSettings(); | 389 if (initialize) registry_->InitProtocolSettings(); |
| 343 } | 390 } |
| 344 | 391 |
| 345 void TeadDownRegistry() { | 392 void TeadDownRegistry() { |
| 346 registry_->Shutdown(); | 393 registry_->Shutdown(); |
| (...skipping 562 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 909 | 956 |
| 910 TEST_F(ProtocolHandlerRegistryTest, MAYBE_TestInstallDefaultHandler) { | 957 TEST_F(ProtocolHandlerRegistryTest, MAYBE_TestInstallDefaultHandler) { |
| 911 RecreateRegistry(false); | 958 RecreateRegistry(false); |
| 912 registry()->AddPredefinedHandler( | 959 registry()->AddPredefinedHandler( |
| 913 CreateProtocolHandler("test", GURL("http://test.com/%s"))); | 960 CreateProtocolHandler("test", GURL("http://test.com/%s"))); |
| 914 registry()->InitProtocolSettings(); | 961 registry()->InitProtocolSettings(); |
| 915 std::vector<std::string> protocols; | 962 std::vector<std::string> protocols; |
| 916 registry()->GetRegisteredProtocols(&protocols); | 963 registry()->GetRegisteredProtocols(&protocols); |
| 917 ASSERT_EQ(static_cast<size_t>(1), protocols.size()); | 964 ASSERT_EQ(static_cast<size_t>(1), protocols.size()); |
| 918 } | 965 } |
| 966 | |
| 967 TEST_F(ProtocolHandlerRegistryTest, TestPrefPolicyOverlapRegister) { | |
| 968 base::ListValue* handlers_registered_by_pref = new base::ListValue(); | |
| 969 base::ListValue* handlers_registered_by_policy = new base::ListValue(); | |
| 970 | |
| 971 handlers_registered_by_pref->Append( | |
| 972 GetProtocolHandlerValueWithDefault("p1", "http://p1u2.com/%s", true)); | |
|
koz (OOO until 15th September)
2014/06/01 23:44:29
Cool tests! One nit: Would this be easier to read
kaliamoorthi
2014/06/02 09:47:31
Done.
| |
| 973 handlers_registered_by_pref->Append( | |
| 974 GetProtocolHandlerValueWithDefault("p1", "http://p1u1.com/%s", true)); | |
| 975 handlers_registered_by_pref->Append( | |
| 976 GetProtocolHandlerValueWithDefault("p1", "http://p1u2.com/%s", false)); | |
| 977 | |
| 978 handlers_registered_by_policy->Append( | |
| 979 GetProtocolHandlerValueWithDefault("p1", "http://p1u1.com/%s", false)); | |
| 980 handlers_registered_by_policy->Append( | |
| 981 GetProtocolHandlerValueWithDefault("p3", "http://p3u1.com/%s", true)); | |
| 982 | |
| 983 profile()->GetPrefs()->Set( | |
| 984 prefs::kRegisteredProtocolHandlers, | |
| 985 *static_cast<base::Value*>(handlers_registered_by_pref)); | |
| 986 profile()->GetPrefs()->Set( | |
| 987 prefs::kPolicyRegisteredProtocolHandlers, | |
| 988 *static_cast<base::Value*>(handlers_registered_by_policy)); | |
| 989 registry()->InitProtocolSettings(); | |
| 990 | |
| 991 // Duplicate p1u2 eliminated in memory but not yet saved in pref | |
| 992 ASSERT_EQ(InPrefHandlerCount(), 3); | |
| 993 ASSERT_EQ(InMemoryHandlerCount(), 3); | |
| 994 ASSERT_TRUE(registry()->IsDefault( | |
| 995 CreateProtocolHandler("p1", GURL("http://p1u1.com/%s")))); | |
| 996 ASSERT_FALSE(registry()->IsDefault( | |
| 997 CreateProtocolHandler("p1", GURL("http://p1u2.com/%s")))); | |
| 998 | |
| 999 registry()->OnDenyRegisterProtocolHandler( | |
| 1000 CreateProtocolHandler("p2", GURL("http://p2u1.com/%s"))); | |
| 1001 | |
| 1002 // Duplicate p1u2 saved in pref and a new handler added to pref and memory | |
| 1003 ASSERT_EQ(InPrefHandlerCount(), 3); | |
| 1004 ASSERT_EQ(InMemoryHandlerCount(), 4); | |
| 1005 ASSERT_FALSE(registry()->IsDefault( | |
| 1006 CreateProtocolHandler("p2", GURL("http://p2u1.com/%s")))); | |
| 1007 | |
| 1008 registry()->RemoveHandler( | |
| 1009 CreateProtocolHandler("p1", GURL("http://p1u1.com/%s"))); | |
| 1010 | |
| 1011 // p1u1 removed from user pref but not from memory due to policy. | |
| 1012 ASSERT_EQ(InPrefHandlerCount(), 2); | |
| 1013 ASSERT_EQ(InMemoryHandlerCount(), 4); | |
| 1014 ASSERT_TRUE(registry()->IsDefault( | |
| 1015 CreateProtocolHandler("p1", GURL("http://p1u1.com/%s")))); | |
| 1016 | |
| 1017 registry()->RemoveHandler( | |
| 1018 CreateProtocolHandler("p3", GURL("http://p3u1.com/%s"))); | |
| 1019 | |
| 1020 // p3u1 not removed from memory due to policy and it was never in pref. | |
| 1021 ASSERT_EQ(InPrefHandlerCount(), 2); | |
| 1022 ASSERT_EQ(InMemoryHandlerCount(), 4); | |
| 1023 ASSERT_TRUE(registry()->IsDefault( | |
| 1024 CreateProtocolHandler("p3", GURL("http://p3u1.com/%s")))); | |
| 1025 | |
| 1026 registry()->RemoveHandler( | |
| 1027 CreateProtocolHandler("p1", GURL("http://p1u2.com/%s"))); | |
| 1028 | |
| 1029 // p1u2 removed from user pref and memory. | |
| 1030 ASSERT_EQ(InPrefHandlerCount(), 1); | |
| 1031 ASSERT_EQ(InMemoryHandlerCount(), 3); | |
| 1032 ASSERT_TRUE(registry()->IsDefault( | |
| 1033 CreateProtocolHandler("p1", GURL("http://p1u1.com/%s")))); | |
| 1034 | |
| 1035 registry()->OnAcceptRegisterProtocolHandler( | |
| 1036 CreateProtocolHandler("p1", GURL("http://p1u3.com/%s"))); | |
| 1037 | |
| 1038 // p1u3 added to pref and memory. | |
| 1039 ASSERT_EQ(InPrefHandlerCount(), 2); | |
| 1040 ASSERT_EQ(InMemoryHandlerCount(), 4); | |
| 1041 ASSERT_FALSE(registry()->IsDefault( | |
| 1042 CreateProtocolHandler("p1", GURL("http://p1u1.com/%s")))); | |
| 1043 ASSERT_TRUE(registry()->IsDefault( | |
| 1044 CreateProtocolHandler("p1", GURL("http://p1u3.com/%s")))); | |
| 1045 | |
| 1046 registry()->RemoveHandler( | |
| 1047 CreateProtocolHandler("p1", GURL("http://p1u3.com/%s"))); | |
| 1048 | |
| 1049 // p1u3 the default handler for p1 removed from user pref and memory. | |
| 1050 ASSERT_EQ(InPrefHandlerCount(), 1); | |
| 1051 ASSERT_EQ(InMemoryHandlerCount(), 3); | |
| 1052 ASSERT_FALSE(registry()->IsDefault( | |
| 1053 CreateProtocolHandler("p1", GURL("http://p1u3.com/%s")))); | |
| 1054 ASSERT_TRUE(registry()->IsDefault( | |
| 1055 CreateProtocolHandler("p1", GURL("http://p1u1.com/%s")))); | |
| 1056 ASSERT_TRUE(registry()->IsDefault( | |
| 1057 CreateProtocolHandler("p3", GURL("http://p3u1.com/%s")))); | |
| 1058 ASSERT_FALSE(registry()->IsDefault( | |
| 1059 CreateProtocolHandler("p2", GURL("http://p2u1.com/%s")))); | |
| 1060 } | |
| 1061 | |
| 1062 TEST_F(ProtocolHandlerRegistryTest, TestPrefPolicyOverlapIgnore) { | |
| 1063 base::ListValue* handlers_ignored_by_pref = new base::ListValue(); | |
| 1064 base::ListValue* handlers_ignored_by_policy = new base::ListValue(); | |
| 1065 | |
| 1066 handlers_ignored_by_pref->Append( | |
| 1067 GetProtocolHandlerValue("p1", "http://p1u1.com/%s")); | |
| 1068 handlers_ignored_by_pref->Append( | |
| 1069 GetProtocolHandlerValue("p1", "http://p1u2.com/%s")); | |
| 1070 handlers_ignored_by_pref->Append( | |
| 1071 GetProtocolHandlerValue("p1", "http://p1u2.com/%s")); | |
| 1072 handlers_ignored_by_pref->Append( | |
| 1073 GetProtocolHandlerValue("p3", "http://p3u1.com/%s")); | |
| 1074 | |
| 1075 handlers_ignored_by_policy->Append( | |
| 1076 GetProtocolHandlerValue("p1", "http://p1u2.com/%s")); | |
| 1077 handlers_ignored_by_policy->Append( | |
| 1078 GetProtocolHandlerValue("p1", "http://p1u3.com/%s")); | |
| 1079 handlers_ignored_by_policy->Append( | |
| 1080 GetProtocolHandlerValue("p2", "http://p2u1.com/%s")); | |
| 1081 | |
| 1082 profile()->GetPrefs()->Set( | |
| 1083 prefs::kIgnoredProtocolHandlers, | |
| 1084 *static_cast<base::Value*>(handlers_ignored_by_pref)); | |
| 1085 profile()->GetPrefs()->Set( | |
| 1086 prefs::kPolicyIgnoredProtocolHandlers, | |
| 1087 *static_cast<base::Value*>(handlers_ignored_by_policy)); | |
| 1088 registry()->InitProtocolSettings(); | |
| 1089 | |
| 1090 // Duplicate p1u2 eliminated in memory but not yet saved in pref | |
| 1091 ASSERT_EQ(InPrefIgnoredHandlerCount(), 4); | |
| 1092 ASSERT_EQ(InMemoryIgnoredHandlerCount(), 5); | |
| 1093 | |
| 1094 registry()->OnIgnoreRegisterProtocolHandler( | |
| 1095 CreateProtocolHandler("p2", GURL("http://p2u2.com/%s"))); | |
| 1096 | |
| 1097 // Duplicate p1u2 eliminated in pref, p2u2 added to pref and memory. | |
| 1098 ASSERT_EQ(InPrefIgnoredHandlerCount(), 4); | |
| 1099 ASSERT_EQ(InMemoryIgnoredHandlerCount(), 6); | |
| 1100 | |
| 1101 registry()->RemoveIgnoredHandler( | |
| 1102 CreateProtocolHandler("p2", GURL("http://p2u1.com/%s"))); | |
| 1103 | |
| 1104 // p2u1 installed by policy so cant be removed. | |
| 1105 ASSERT_EQ(InPrefIgnoredHandlerCount(), 4); | |
| 1106 ASSERT_EQ(InMemoryIgnoredHandlerCount(), 6); | |
| 1107 | |
| 1108 registry()->RemoveIgnoredHandler( | |
| 1109 CreateProtocolHandler("p1", GURL("http://p1u2.com/%s"))); | |
| 1110 | |
| 1111 // p1u2 installed by policy and pref so it is removed from pref and not from | |
| 1112 // memory. | |
| 1113 ASSERT_EQ(InPrefIgnoredHandlerCount(), 3); | |
| 1114 ASSERT_EQ(InMemoryIgnoredHandlerCount(), 6); | |
| 1115 | |
| 1116 registry()->RemoveIgnoredHandler( | |
| 1117 CreateProtocolHandler("p1", GURL("http://p1u1.com/%s"))); | |
| 1118 | |
| 1119 // p1u1 installed by pref so it is removed from pref and memory. | |
| 1120 ASSERT_EQ(InPrefIgnoredHandlerCount(), 2); | |
| 1121 ASSERT_EQ(InMemoryIgnoredHandlerCount(), 5); | |
| 1122 | |
| 1123 registry()->RemoveIgnoredHandler( | |
| 1124 CreateProtocolHandler("p2", GURL("http://p2u2.com/%s"))); | |
| 1125 | |
| 1126 // p2u2 installed by user so it is removed from pref and memory. | |
| 1127 ASSERT_EQ(InPrefIgnoredHandlerCount(), 1); | |
| 1128 ASSERT_EQ(InMemoryIgnoredHandlerCount(), 4); | |
| 1129 | |
| 1130 registry()->OnIgnoreRegisterProtocolHandler( | |
| 1131 CreateProtocolHandler("p2", GURL("http://p2u1.com/%s"))); | |
| 1132 | |
| 1133 // p2u1 installed by user but it is already installed by policy, so it is | |
| 1134 // added to pref. | |
| 1135 ASSERT_EQ(InPrefIgnoredHandlerCount(), 2); | |
| 1136 ASSERT_EQ(InMemoryIgnoredHandlerCount(), 4); | |
| 1137 | |
| 1138 registry()->RemoveIgnoredHandler( | |
| 1139 CreateProtocolHandler("p2", GURL("http://p2u1.com/%s"))); | |
| 1140 | |
| 1141 // p2u1 installed by user and policy, so it is removed from pref alone. | |
| 1142 ASSERT_EQ(InPrefIgnoredHandlerCount(), 1); | |
| 1143 ASSERT_EQ(InMemoryIgnoredHandlerCount(), 4); | |
| 1144 } | |
| OLD | NEW |