| 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 <stddef.h> | 7 #include <stddef.h> |
| 8 | 8 |
| 9 #include <memory> | 9 #include <memory> |
| 10 #include <set> | 10 #include <set> |
| 11 | 11 |
| 12 #include "base/memory/ptr_util.h" | 12 #include "base/memory/ptr_util.h" |
| 13 #include "base/message_loop/message_loop.h" | |
| 14 #include "base/run_loop.h" | 13 #include "base/run_loop.h" |
| 15 #include "base/strings/utf_string_conversions.h" | 14 #include "base/strings/utf_string_conversions.h" |
| 16 #include "base/synchronization/waitable_event.h" | 15 #include "base/threading/thread_task_runner_handle.h" |
| 17 #include "build/build_config.h" | 16 #include "build/build_config.h" |
| 18 #include "chrome/browser/chrome_notification_types.h" | 17 #include "chrome/browser/chrome_notification_types.h" |
| 19 #include "chrome/common/custom_handlers/protocol_handler.h" | 18 #include "chrome/common/custom_handlers/protocol_handler.h" |
| 20 #include "chrome/common/pref_names.h" | 19 #include "chrome/common/pref_names.h" |
| 21 #include "chrome/test/base/testing_browser_process.h" | 20 #include "chrome/test/base/testing_browser_process.h" |
| 22 #include "chrome/test/base/testing_profile.h" | 21 #include "chrome/test/base/testing_profile.h" |
| 23 #include "components/pref_registry/pref_registry_syncable.h" | 22 #include "components/pref_registry/pref_registry_syncable.h" |
| 24 #include "components/sync_preferences/pref_service_syncable.h" | 23 #include "components/sync_preferences/pref_service_syncable.h" |
| 25 #include "content/public/browser/notification_observer.h" | 24 #include "content/public/browser/notification_observer.h" |
| 26 #include "content/public/browser/notification_registrar.h" | 25 #include "content/public/browser/notification_registrar.h" |
| 27 #include "content/public/browser/notification_source.h" | 26 #include "content/public/browser/notification_source.h" |
| 28 #include "content/public/test/test_browser_thread.h" | 27 #include "content/public/test/test_browser_thread_bundle.h" |
| 29 #include "content/public/test/test_renderer_host.h" | 28 #include "content/public/test/test_renderer_host.h" |
| 30 #include "net/base/request_priority.h" | 29 #include "net/base/request_priority.h" |
| 31 #include "net/traffic_annotation/network_traffic_annotation_test_helper.h" | 30 #include "net/traffic_annotation/network_traffic_annotation_test_helper.h" |
| 32 #include "net/url_request/url_request.h" | 31 #include "net/url_request/url_request.h" |
| 33 #include "net/url_request/url_request_context.h" | 32 #include "net/url_request/url_request_context.h" |
| 34 #include "testing/gtest/include/gtest/gtest.h" | 33 #include "testing/gtest/include/gtest/gtest.h" |
| 35 | 34 |
| 36 using content::BrowserThread; | 35 using content::BrowserThread; |
| 37 | 36 |
| 38 namespace { | 37 namespace { |
| (...skipping 90 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 129 std::unique_ptr<base::DictionaryValue> GetProtocolHandlerValueWithDefault( | 128 std::unique_ptr<base::DictionaryValue> GetProtocolHandlerValueWithDefault( |
| 130 const std::string& protocol, | 129 const std::string& protocol, |
| 131 const std::string& url, | 130 const std::string& url, |
| 132 bool is_default) { | 131 bool is_default) { |
| 133 std::unique_ptr<base::DictionaryValue> value = | 132 std::unique_ptr<base::DictionaryValue> value = |
| 134 GetProtocolHandlerValue(protocol, url); | 133 GetProtocolHandlerValue(protocol, url); |
| 135 value->SetBoolean("default", is_default); | 134 value->SetBoolean("default", is_default); |
| 136 return value; | 135 return value; |
| 137 } | 136 } |
| 138 | 137 |
| 139 class FakeProtocolClientWorker | |
| 140 : public shell_integration::DefaultProtocolClientWorker { | |
| 141 public: | |
| 142 FakeProtocolClientWorker( | |
| 143 const shell_integration::DefaultWebClientWorkerCallback& callback, | |
| 144 const std::string& protocol, | |
| 145 bool force_failure) | |
| 146 : shell_integration::DefaultProtocolClientWorker(callback, protocol), | |
| 147 force_failure_(force_failure) {} | |
| 148 | |
| 149 private: | |
| 150 ~FakeProtocolClientWorker() override = default; | |
| 151 | |
| 152 shell_integration::DefaultWebClientState CheckIsDefaultImpl() override { | |
| 153 return force_failure_ ? shell_integration::NOT_DEFAULT | |
| 154 : shell_integration::IS_DEFAULT; | |
| 155 } | |
| 156 | |
| 157 void SetAsDefaultImpl(const base::Closure& on_finished_callback) override { | |
| 158 on_finished_callback.Run(); | |
| 159 } | |
| 160 | |
| 161 private: | |
| 162 bool force_failure_; | |
| 163 }; | |
| 164 | |
| 165 class FakeDelegate : public ProtocolHandlerRegistry::Delegate { | 138 class FakeDelegate : public ProtocolHandlerRegistry::Delegate { |
| 166 public: | 139 public: |
| 167 FakeDelegate() : force_os_failure_(false) {} | 140 FakeDelegate() : force_os_failure_(false) {} |
| 168 ~FakeDelegate() override {} | 141 ~FakeDelegate() override {} |
| 169 void RegisterExternalHandler(const std::string& protocol) override { | 142 void RegisterExternalHandler(const std::string& protocol) override { |
| 170 ASSERT_TRUE( | 143 ASSERT_TRUE( |
| 171 registered_protocols_.find(protocol) == registered_protocols_.end()); | 144 registered_protocols_.find(protocol) == registered_protocols_.end()); |
| 172 registered_protocols_.insert(protocol); | 145 registered_protocols_.insert(protocol); |
| 173 } | 146 } |
| 174 | 147 |
| 175 void DeregisterExternalHandler(const std::string& protocol) override { | 148 void DeregisterExternalHandler(const std::string& protocol) override { |
| 176 registered_protocols_.erase(protocol); | 149 registered_protocols_.erase(protocol); |
| 177 } | 150 } |
| 178 | 151 |
| 179 scoped_refptr<shell_integration::DefaultProtocolClientWorker> | |
| 180 CreateShellWorker( | |
| 181 const shell_integration::DefaultWebClientWorkerCallback& callback, | |
| 182 const std::string& protocol) override { | |
| 183 return new FakeProtocolClientWorker(callback, protocol, force_os_failure_); | |
| 184 } | |
| 185 | |
| 186 void RegisterWithOSAsDefaultClient( | 152 void RegisterWithOSAsDefaultClient( |
| 187 const std::string& protocol, | 153 const std::string& protocol, |
| 188 ProtocolHandlerRegistry* registry) override; | 154 ProtocolHandlerRegistry* registry) override { |
| 155 // Do as-if the registration has to run on another sequence and post back |
| 156 // the result with a task to the current thread. |
| 157 base::ThreadTaskRunnerHandle::Get()->PostTask( |
| 158 FROM_HERE, |
| 159 base::Bind(registry->GetDefaultWebClientCallback(protocol), |
| 160 force_os_failure_ ? shell_integration::NOT_DEFAULT |
| 161 : shell_integration::IS_DEFAULT)); |
| 162 |
| 163 if (!force_os_failure_) |
| 164 os_registered_protocols_.insert(protocol); |
| 165 } |
| 189 | 166 |
| 190 bool IsExternalHandlerRegistered(const std::string& protocol) override { | 167 bool IsExternalHandlerRegistered(const std::string& protocol) override { |
| 191 return registered_protocols_.find(protocol) != registered_protocols_.end(); | 168 return registered_protocols_.find(protocol) != registered_protocols_.end(); |
| 192 } | 169 } |
| 193 | 170 |
| 194 bool IsFakeRegisteredWithOS(const std::string& protocol) { | 171 bool IsFakeRegisteredWithOS(const std::string& protocol) { |
| 195 return os_registered_protocols_.find(protocol) != | 172 return os_registered_protocols_.find(protocol) != |
| 196 os_registered_protocols_.end(); | 173 os_registered_protocols_.end(); |
| 197 } | 174 } |
| 198 | 175 |
| 199 void FakeRegisterWithOS(const std::string& protocol) { | |
| 200 os_registered_protocols_.insert(protocol); | |
| 201 } | |
| 202 | |
| 203 void Reset() { | 176 void Reset() { |
| 204 registered_protocols_.clear(); | 177 registered_protocols_.clear(); |
| 205 os_registered_protocols_.clear(); | 178 os_registered_protocols_.clear(); |
| 206 force_os_failure_ = false; | 179 force_os_failure_ = false; |
| 207 } | 180 } |
| 208 | 181 |
| 209 void set_force_os_failure(bool force) { force_os_failure_ = force; } | 182 void set_force_os_failure(bool force) { force_os_failure_ = force; } |
| 210 | 183 |
| 211 bool force_os_failure() { return force_os_failure_; } | 184 bool force_os_failure() { return force_os_failure_; } |
| 212 | 185 |
| 213 private: | 186 private: |
| 214 std::set<std::string> registered_protocols_; | 187 std::set<std::string> registered_protocols_; |
| 215 std::set<std::string> os_registered_protocols_; | 188 std::set<std::string> os_registered_protocols_; |
| 216 bool force_os_failure_; | 189 bool force_os_failure_; |
| 217 }; | 190 }; |
| 218 | 191 |
| 219 void OnShellWorkerFinished(ProtocolHandlerRegistry* registry, | |
| 220 FakeDelegate* delegate, | |
| 221 const std::string& protocol, | |
| 222 shell_integration::DefaultWebClientState state) { | |
| 223 registry->GetDefaultWebClientCallback(protocol).Run(state); | |
| 224 if (state == shell_integration::IS_DEFAULT) { | |
| 225 delegate->FakeRegisterWithOS(protocol); | |
| 226 } | |
| 227 | |
| 228 base::MessageLoop::current()->QuitWhenIdle(); | |
| 229 } | |
| 230 | |
| 231 void FakeDelegate::RegisterWithOSAsDefaultClient( | |
| 232 const std::string& protocol, | |
| 233 ProtocolHandlerRegistry* registry) { | |
| 234 // The worker pointer is reference counted. While it is running, the | |
| 235 // message loops of the FILE and UI thread will hold references to it | |
| 236 // and it will be automatically freed once all its tasks have finished. | |
| 237 CreateShellWorker(base::Bind(OnShellWorkerFinished, registry, this, protocol), | |
| 238 protocol) | |
| 239 ->StartSetAsDefault(); | |
| 240 ASSERT_FALSE(IsFakeRegisteredWithOS(protocol)); | |
| 241 } | |
| 242 | |
| 243 class NotificationCounter : public content::NotificationObserver { | 192 class NotificationCounter : public content::NotificationObserver { |
| 244 public: | 193 public: |
| 245 explicit NotificationCounter(content::BrowserContext* context) | 194 explicit NotificationCounter(content::BrowserContext* context) |
| 246 : events_(0), | 195 : events_(0), |
| 247 notification_registrar_() { | 196 notification_registrar_() { |
| 248 notification_registrar_.Add(this, | 197 notification_registrar_.Add(this, |
| 249 chrome::NOTIFICATION_PROTOCOL_HANDLER_REGISTRY_CHANGED, | 198 chrome::NOTIFICATION_PROTOCOL_HANDLER_REGISTRY_CHANGED, |
| 250 content::Source<content::BrowserContext>(context)); | 199 content::Source<content::BrowserContext>(context)); |
| 251 } | 200 } |
| 252 | 201 |
| (...skipping 29 matching lines...) Expand all Loading... |
| 282 std::vector<std::string> output; | 231 std::vector<std::string> output; |
| 283 local_registry_->GetRegisteredProtocols(&output); | 232 local_registry_->GetRegisteredProtocols(&output); |
| 284 called_ = true; | 233 called_ = true; |
| 285 } | 234 } |
| 286 | 235 |
| 287 ProtocolHandlerRegistry* local_registry_; | 236 ProtocolHandlerRegistry* local_registry_; |
| 288 bool called_; | 237 bool called_; |
| 289 content::NotificationRegistrar notification_registrar_; | 238 content::NotificationRegistrar notification_registrar_; |
| 290 }; | 239 }; |
| 291 | 240 |
| 292 // URLRequest DCHECKS that the current MessageLoop is IO. It does this because | |
| 293 // it can't check the thread id (since net can't depend on content.) We want | |
| 294 // to harness our tests so all threads use the same loop allowing us to | |
| 295 // guarantee all messages are processed.) By overriding the IsType method | |
| 296 // we basically ignore the supplied message loop type, and instead infer | |
| 297 // our type based on the current thread. GO DEPENDENCY INJECTION! | |
| 298 class TestMessageLoop : public base::MessageLoop { | |
| 299 public: | |
| 300 TestMessageLoop() {} | |
| 301 ~TestMessageLoop() override {} | |
| 302 bool IsType(base::MessageLoop::Type type) const override { | |
| 303 switch (type) { | |
| 304 case base::MessageLoop::TYPE_UI: | |
| 305 return BrowserThread::CurrentlyOn(BrowserThread::UI); | |
| 306 case base::MessageLoop::TYPE_IO: | |
| 307 return BrowserThread::CurrentlyOn(BrowserThread::IO); | |
| 308 #if defined(OS_ANDROID) | |
| 309 case base::MessageLoop::TYPE_JAVA: // fall-through | |
| 310 #endif // defined(OS_ANDROID) | |
| 311 case base::MessageLoop::TYPE_CUSTOM: | |
| 312 case base::MessageLoop::TYPE_DEFAULT: | |
| 313 return !BrowserThread::CurrentlyOn(BrowserThread::UI) && | |
| 314 !BrowserThread::CurrentlyOn(BrowserThread::IO); | |
| 315 } | |
| 316 return false; | |
| 317 } | |
| 318 }; | |
| 319 | |
| 320 } // namespace | 241 } // namespace |
| 321 | 242 |
| 322 class ProtocolHandlerRegistryTest : public testing::Test { | 243 class ProtocolHandlerRegistryTest : public testing::Test { |
| 323 protected: | 244 protected: |
| 324 ProtocolHandlerRegistryTest() | 245 ProtocolHandlerRegistryTest() |
| 325 : ui_thread_(BrowserThread::UI, &loop_), | 246 : test_protocol_handler_(CreateProtocolHandler("test", "test")) {} |
| 326 file_thread_(BrowserThread::FILE, &loop_), | |
| 327 io_thread_(BrowserThread::IO, &loop_), | |
| 328 test_protocol_handler_(CreateProtocolHandler("test", "test")) {} | |
| 329 | 247 |
| 330 FakeDelegate* delegate() const { return delegate_; } | 248 FakeDelegate* delegate() const { return delegate_; } |
| 331 ProtocolHandlerRegistry* registry() { return registry_.get(); } | 249 ProtocolHandlerRegistry* registry() { return registry_.get(); } |
| 332 TestingProfile* profile() const { return profile_.get(); } | 250 TestingProfile* profile() const { return profile_.get(); } |
| 333 const ProtocolHandler& test_protocol_handler() const { | 251 const ProtocolHandler& test_protocol_handler() const { |
| 334 return test_protocol_handler_; | 252 return test_protocol_handler_; |
| 335 } | 253 } |
| 336 | 254 |
| 337 ProtocolHandler CreateProtocolHandler(const std::string& protocol, | 255 ProtocolHandler CreateProtocolHandler(const std::string& protocol, |
| 338 const GURL& url) { | 256 const GURL& url) { |
| (...skipping 57 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 396 void SetUp() override { | 314 void SetUp() override { |
| 397 profile_.reset(new TestingProfile()); | 315 profile_.reset(new TestingProfile()); |
| 398 CHECK(profile_->GetPrefs()); | 316 CHECK(profile_->GetPrefs()); |
| 399 SetUpRegistry(true); | 317 SetUpRegistry(true); |
| 400 test_protocol_handler_ = | 318 test_protocol_handler_ = |
| 401 CreateProtocolHandler("test", GURL("http://test.com/%s")); | 319 CreateProtocolHandler("test", GURL("http://test.com/%s")); |
| 402 } | 320 } |
| 403 | 321 |
| 404 void TearDown() override { TeadDownRegistry(); } | 322 void TearDown() override { TeadDownRegistry(); } |
| 405 | 323 |
| 406 TestMessageLoop loop_; | |
| 407 | |
| 408 private: | 324 private: |
| 409 content::TestBrowserThread ui_thread_; | 325 content::TestBrowserThreadBundle test_browser_thread_bundle_; |
| 410 content::TestBrowserThread file_thread_; | |
| 411 content::TestBrowserThread io_thread_; | |
| 412 | 326 |
| 413 std::unique_ptr<TestingProfile> profile_; | 327 std::unique_ptr<TestingProfile> profile_; |
| 414 FakeDelegate* delegate_; // Registry assumes ownership of delegate_. | 328 FakeDelegate* delegate_; // Registry assumes ownership of delegate_. |
| 415 std::unique_ptr<ProtocolHandlerRegistry> registry_; | 329 std::unique_ptr<ProtocolHandlerRegistry> registry_; |
| 416 ProtocolHandler test_protocol_handler_; | 330 ProtocolHandler test_protocol_handler_; |
| 417 }; | 331 }; |
| 418 | 332 |
| 419 TEST_F(ProtocolHandlerRegistryTest, AcceptProtocolHandlerHandlesProtocol) { | 333 TEST_F(ProtocolHandlerRegistryTest, AcceptProtocolHandlerHandlesProtocol) { |
| 420 ASSERT_FALSE(registry()->IsHandledProtocol("test")); | 334 ASSERT_FALSE(registry()->IsHandledProtocol("test")); |
| 421 registry()->OnAcceptRegisterProtocolHandler(test_protocol_handler()); | 335 registry()->OnAcceptRegisterProtocolHandler(test_protocol_handler()); |
| (...skipping 309 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 731 TEST_F(ProtocolHandlerRegistryTest, TestOSRegistration) { | 645 TEST_F(ProtocolHandlerRegistryTest, TestOSRegistration) { |
| 732 ProtocolHandler ph_do1 = CreateProtocolHandler("do", "test1"); | 646 ProtocolHandler ph_do1 = CreateProtocolHandler("do", "test1"); |
| 733 ProtocolHandler ph_do2 = CreateProtocolHandler("do", "test2"); | 647 ProtocolHandler ph_do2 = CreateProtocolHandler("do", "test2"); |
| 734 ProtocolHandler ph_dont = CreateProtocolHandler("dont", "test"); | 648 ProtocolHandler ph_dont = CreateProtocolHandler("dont", "test"); |
| 735 | 649 |
| 736 ASSERT_FALSE(delegate()->IsFakeRegisteredWithOS("do")); | 650 ASSERT_FALSE(delegate()->IsFakeRegisteredWithOS("do")); |
| 737 ASSERT_FALSE(delegate()->IsFakeRegisteredWithOS("dont")); | 651 ASSERT_FALSE(delegate()->IsFakeRegisteredWithOS("dont")); |
| 738 | 652 |
| 739 registry()->OnAcceptRegisterProtocolHandler(ph_do1); | 653 registry()->OnAcceptRegisterProtocolHandler(ph_do1); |
| 740 registry()->OnDenyRegisterProtocolHandler(ph_dont); | 654 registry()->OnDenyRegisterProtocolHandler(ph_dont); |
| 741 base::RunLoop().Run(); // FILE thread needs to run. | 655 base::RunLoop().RunUntilIdle(); |
| 656 |
| 742 ASSERT_TRUE(delegate()->IsFakeRegisteredWithOS("do")); | 657 ASSERT_TRUE(delegate()->IsFakeRegisteredWithOS("do")); |
| 743 ASSERT_FALSE(delegate()->IsFakeRegisteredWithOS("dont")); | 658 ASSERT_FALSE(delegate()->IsFakeRegisteredWithOS("dont")); |
| 744 | 659 |
| 745 // This should not register with the OS, if it does the delegate | 660 // This should not register with the OS, if it does the delegate |
| 746 // will assert for us. We don't need to wait for the message loop | 661 // will assert for us. We don't need to wait for the message loop |
| 747 // as it should not go through to the shell worker. | 662 // as it should not go through to the shell worker. |
| 748 registry()->OnAcceptRegisterProtocolHandler(ph_do2); | 663 registry()->OnAcceptRegisterProtocolHandler(ph_do2); |
| 749 } | 664 } |
| 750 | 665 |
| 751 #if defined(OS_LINUX) | 666 #if defined(OS_LINUX) |
| 752 // TODO(benwells): When Linux support is more reliable and | 667 // TODO(benwells): When Linux support is more reliable and |
| 753 // http://crbug.com/88255 is fixed this test will pass. | 668 // http://crbug.com/88255 is fixed this test will pass. |
| 754 #define MAYBE_TestOSRegistrationFailure DISABLED_TestOSRegistrationFailure | 669 #define MAYBE_TestOSRegistrationFailure DISABLED_TestOSRegistrationFailure |
| 755 #else | 670 #else |
| 756 #define MAYBE_TestOSRegistrationFailure TestOSRegistrationFailure | 671 #define MAYBE_TestOSRegistrationFailure TestOSRegistrationFailure |
| 757 #endif | 672 #endif |
| 758 | 673 |
| 759 // TODO(smckay): This is much more appropriately an integration | 674 // TODO(smckay): This is much more appropriately an integration |
| 760 // test. Make that so, then update the | 675 // test. Make that so, then update the |
| 761 // ShellIntegretion{Delegate,Callback,Worker} test classes we use to fully | 676 // ShellIntegretion{Delegate,Callback,Worker} test classes we use to fully |
| 762 // isolate this test from the FILE thread. | 677 // isolate this test from the FILE thread. |
| 763 TEST_F(ProtocolHandlerRegistryTest, MAYBE_TestOSRegistrationFailure) { | 678 TEST_F(ProtocolHandlerRegistryTest, MAYBE_TestOSRegistrationFailure) { |
| 764 ProtocolHandler ph_do = CreateProtocolHandler("do", "test1"); | 679 ProtocolHandler ph_do = CreateProtocolHandler("do", "test1"); |
| 765 ProtocolHandler ph_dont = CreateProtocolHandler("dont", "test"); | 680 ProtocolHandler ph_dont = CreateProtocolHandler("dont", "test"); |
| 766 | 681 |
| 767 ASSERT_FALSE(registry()->IsHandledProtocol("do")); | 682 ASSERT_FALSE(registry()->IsHandledProtocol("do")); |
| 768 ASSERT_FALSE(registry()->IsHandledProtocol("dont")); | 683 ASSERT_FALSE(registry()->IsHandledProtocol("dont")); |
| 769 | 684 |
| 770 registry()->OnAcceptRegisterProtocolHandler(ph_do); | 685 registry()->OnAcceptRegisterProtocolHandler(ph_do); |
| 771 base::RunLoop().Run(); // FILE thread needs to run. | 686 base::RunLoop().RunUntilIdle(); |
| 687 |
| 772 delegate()->set_force_os_failure(true); | 688 delegate()->set_force_os_failure(true); |
| 773 registry()->OnAcceptRegisterProtocolHandler(ph_dont); | 689 registry()->OnAcceptRegisterProtocolHandler(ph_dont); |
| 774 base::RunLoop().Run(); // FILE thread needs to run. | 690 base::RunLoop().RunUntilIdle(); |
| 691 |
| 775 ASSERT_TRUE(registry()->IsHandledProtocol("do")); | 692 ASSERT_TRUE(registry()->IsHandledProtocol("do")); |
| 776 ASSERT_EQ(static_cast<size_t>(1), registry()->GetHandlersFor("do").size()); | 693 ASSERT_EQ(static_cast<size_t>(1), registry()->GetHandlersFor("do").size()); |
| 777 ASSERT_FALSE(registry()->IsHandledProtocol("dont")); | 694 ASSERT_FALSE(registry()->IsHandledProtocol("dont")); |
| 778 ASSERT_EQ(static_cast<size_t>(1), registry()->GetHandlersFor("dont").size()); | 695 ASSERT_EQ(static_cast<size_t>(1), registry()->GetHandlersFor("dont").size()); |
| 779 } | 696 } |
| 780 | 697 |
| 781 TEST_F(ProtocolHandlerRegistryTest, TestMaybeCreateTaskWorksFromIOThread) { | 698 TEST_F(ProtocolHandlerRegistryTest, TestMaybeCreateTaskWorksFromIOThread) { |
| 782 ProtocolHandler ph1 = CreateProtocolHandler("mailto", "test1"); | 699 ProtocolHandler ph1 = CreateProtocolHandler("mailto", "test1"); |
| 783 registry()->OnAcceptRegisterProtocolHandler(ph1); | 700 registry()->OnAcceptRegisterProtocolHandler(ph1); |
| 784 GURL url("mailto:someone@something.com"); | 701 GURL url("mailto:someone@something.com"); |
| (...skipping 294 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1079 // added to pref. | 996 // added to pref. |
| 1080 ASSERT_EQ(InPrefIgnoredHandlerCount(), 2); | 997 ASSERT_EQ(InPrefIgnoredHandlerCount(), 2); |
| 1081 ASSERT_EQ(InMemoryIgnoredHandlerCount(), 4); | 998 ASSERT_EQ(InMemoryIgnoredHandlerCount(), 4); |
| 1082 | 999 |
| 1083 registry()->RemoveIgnoredHandler(p2u1); | 1000 registry()->RemoveIgnoredHandler(p2u1); |
| 1084 | 1001 |
| 1085 // p2u1 installed by user and policy, so it is removed from pref alone. | 1002 // p2u1 installed by user and policy, so it is removed from pref alone. |
| 1086 ASSERT_EQ(InPrefIgnoredHandlerCount(), 1); | 1003 ASSERT_EQ(InPrefIgnoredHandlerCount(), 1); |
| 1087 ASSERT_EQ(InMemoryIgnoredHandlerCount(), 4); | 1004 ASSERT_EQ(InMemoryIgnoredHandlerCount(), 4); |
| 1088 } | 1005 } |
| OLD | NEW |