Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(832)

Side by Side Diff: chrome/browser/custom_handlers/protocol_handler_registry_unittest.cc

Issue 10546083: Convert ProtocolHandlerRegistry to be a ProfileKeyedService. (Closed) Base URL: http://git.chromium.org/chromium/src.git@master
Patch Set: Minor docu-changes. Created 8 years, 5 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
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.h" 10 #include "base/message_loop.h"
11 #include "base/synchronization/waitable_event.h"
11 #include "base/utf_string_conversions.h" 12 #include "base/utf_string_conversions.h"
12 #include "chrome/common/chrome_notification_types.h" 13 #include "chrome/common/chrome_notification_types.h"
13 #include "chrome/common/custom_handlers/protocol_handler.h" 14 #include "chrome/common/custom_handlers/protocol_handler.h"
14 #include "chrome/test/base/testing_browser_process.h" 15 #include "chrome/test/base/testing_browser_process.h"
15 #include "chrome/test/base/testing_pref_service.h" 16 #include "chrome/test/base/testing_pref_service.h"
16 #include "chrome/test/base/testing_profile.h" 17 #include "chrome/test/base/testing_profile.h"
17 #include "content/public/browser/notification_observer.h" 18 #include "content/public/browser/notification_observer.h"
18 #include "content/public/browser/notification_registrar.h" 19 #include "content/public/browser/notification_registrar.h"
19 #include "content/public/browser/notification_source.h" 20 #include "content/public/browser/notification_source.h"
20 #include "content/public/test/test_browser_thread.h" 21 #include "content/public/test/test_browser_thread.h"
21 #include "content/public/test/test_renderer_host.h" 22 #include "content/public/test/test_renderer_host.h"
22 #include "net/url_request/url_request.h" 23 #include "net/url_request/url_request.h"
23 #include "net/url_request/url_request_context.h" 24 #include "net/url_request/url_request_context.h"
25 #include "testing/gtest/include/gtest/gtest.h"
24 26
25 using content::BrowserThread; 27 using content::BrowserThread;
26 28
27 namespace { 29 namespace {
28 30
31 void AssertInterceptedIO(
32 const GURL& url,
33 net::URLRequestJobFactory::Interceptor* interceptor) {
34 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO));
35 net::URLRequestContext context;
36 net::URLRequest request(url, NULL, &context);
37 scoped_refptr<net::URLRequestJob> job = interceptor->MaybeIntercept(&request);
38 ASSERT_TRUE(job.get() != NULL);
39 }
40
41 void AssertIntercepted(
42 const GURL& url,
43 net::URLRequestJobFactory::Interceptor* interceptor) {
44 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
45 BrowserThread::PostTask(BrowserThread::IO,
46 FROM_HERE,
47 base::Bind(AssertInterceptedIO,
48 url,
49 base::Unretained(interceptor)));
50 MessageLoop::current()->RunAllPending();
51 }
52
53 void AssertWillHandleIO(
54 const std::string& scheme,
55 bool expected,
56 net::URLRequestJobFactory::Interceptor* interceptor) {
57 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO));
58 ASSERT_EQ(expected, interceptor->WillHandleProtocol(scheme));
59 }
60
61 void AssertWillHandle(
62 const std::string& scheme,
63 bool expected,
64 net::URLRequestJobFactory::Interceptor* interceptor) {
65 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
66 BrowserThread::PostTask(BrowserThread::IO,
67 FROM_HERE,
68 base::Bind(AssertWillHandleIO,
69 scheme,
70 expected,
71 base::Unretained(interceptor)));
72 MessageLoop::current()->RunAllPending();
73 }
74
29 class FakeDelegate : public ProtocolHandlerRegistry::Delegate { 75 class FakeDelegate : public ProtocolHandlerRegistry::Delegate {
30 public: 76 public:
31 FakeDelegate() : force_os_failure_(false) {} 77 FakeDelegate() : force_os_failure_(false) {}
32 virtual ~FakeDelegate() { } 78 virtual ~FakeDelegate() { }
33 virtual void RegisterExternalHandler(const std::string& protocol) { 79 virtual void RegisterExternalHandler(const std::string& protocol) {
34 ASSERT_TRUE( 80 ASSERT_TRUE(
35 registered_protocols_.find(protocol) == registered_protocols_.end()); 81 registered_protocols_.find(protocol) == registered_protocols_.end());
36 registered_protocols_.insert(protocol); 82 registered_protocols_.insert(protocol);
37 } 83 }
38 84
(...skipping 128 matching lines...) Expand 10 before | Expand all | Expand 10 after
167 213
168 int events_; 214 int events_;
169 content::NotificationRegistrar notification_registrar_; 215 content::NotificationRegistrar notification_registrar_;
170 }; 216 };
171 217
172 class QueryProtocolHandlerOnChange 218 class QueryProtocolHandlerOnChange
173 : public content::NotificationObserver { 219 : public content::NotificationObserver {
174 public: 220 public:
175 QueryProtocolHandlerOnChange(Profile* profile, 221 QueryProtocolHandlerOnChange(Profile* profile,
176 ProtocolHandlerRegistry* registry) 222 ProtocolHandlerRegistry* registry)
177 : registry_(registry), 223 : local_registry_(registry),
178 called_(false), 224 called_(false),
179 notification_registrar_() { 225 notification_registrar_() {
180 notification_registrar_.Add(this, 226 notification_registrar_.Add(this,
181 chrome::NOTIFICATION_PROTOCOL_HANDLER_REGISTRY_CHANGED, 227 chrome::NOTIFICATION_PROTOCOL_HANDLER_REGISTRY_CHANGED,
182 content::Source<Profile>(profile)); 228 content::Source<Profile>(profile));
183 } 229 }
184 230
185 virtual void Observe(int type, 231 virtual void Observe(int type,
186 const content::NotificationSource& source, 232 const content::NotificationSource& source,
187 const content::NotificationDetails& details) { 233 const content::NotificationDetails& details) {
188 std::vector<std::string> output; 234 std::vector<std::string> output;
189 registry_->GetRegisteredProtocols(&output); 235 local_registry_->GetRegisteredProtocols(&output);
190 called_ = true; 236 called_ = true;
191 } 237 }
192 238
193 ProtocolHandlerRegistry* registry_; 239 ProtocolHandlerRegistry* local_registry_;
194 bool called_; 240 bool called_;
195 content::NotificationRegistrar notification_registrar_; 241 content::NotificationRegistrar notification_registrar_;
196 }; 242 };
197 243
244 // URLRequest DCHECKS that the current MessageLoop is IO. It does this because
245 // it can't check the thread id (since net can't depend on content.) We want
246 // to harness our tests so all threads use the same loop allowing us to
247 // guarantee all messages are processed.) By overriding the IsType method
248 // we basically ignore the supplied message loop type, and instead infer
249 // our type based on the current thread. GO DEPENDENCY INJECTION!
250 class TestMessageLoop : public MessageLoop {
251 public:
252 TestMessageLoop() : MessageLoop(MessageLoop::TYPE_DEFAULT) {}
253 ~TestMessageLoop() {}
254 virtual bool IsType(MessageLoop::Type type) const OVERRIDE {
255 switch (type) {
256 case MessageLoop::TYPE_UI:
257 return BrowserThread::CurrentlyOn(BrowserThread::UI);
258 case MessageLoop::TYPE_IO:
259 return BrowserThread::CurrentlyOn(BrowserThread::IO);
260 case MessageLoop::TYPE_DEFAULT:
261 return !BrowserThread::CurrentlyOn(BrowserThread::UI) &&
262 !BrowserThread::CurrentlyOn(BrowserThread::IO);
263 }
264 return false;
265 }
266 };
267
198 } // namespace 268 } // namespace
199 269
200 class ProtocolHandlerRegistryTest : public testing::Test { 270 class ProtocolHandlerRegistryTest : public testing::Test {
201 protected: 271 protected:
202 ProtocolHandlerRegistryTest() 272 ProtocolHandlerRegistryTest()
203 : test_protocol_handler_(CreateProtocolHandler("test", "test")) {} 273 : ui_thread_(BrowserThread::UI, &loop_),
274 file_thread_(BrowserThread::FILE, &loop_),
275 io_thread_(BrowserThread::IO, &loop_),
276 test_protocol_handler_(CreateProtocolHandler("test", "test")) {}
204 277
205 FakeDelegate* delegate() const { return delegate_; } 278 FakeDelegate* delegate() const { return delegate_; }
279 ProtocolHandlerRegistry* registry() { return registry_.get(); }
206 TestingProfile* profile() const { return profile_.get(); } 280 TestingProfile* profile() const { return profile_.get(); }
207 PrefService* pref_service() const { return profile_->GetPrefs(); } 281 PrefService* pref_service() const { return profile_->GetPrefs(); }
208 ProtocolHandlerRegistry* registry() const { return registry_.get(); }
209 const ProtocolHandler& test_protocol_handler() const { 282 const ProtocolHandler& test_protocol_handler() const {
210 return test_protocol_handler_; 283 return test_protocol_handler_;
211 } 284 }
212 285
213 ProtocolHandler CreateProtocolHandler(const std::string& protocol, 286 ProtocolHandler CreateProtocolHandler(const std::string& protocol,
214 const GURL& url, 287 const GURL& url,
215 const std::string& title) { 288 const std::string& title) {
216 return ProtocolHandler::CreateProtocolHandler(protocol, url, 289 return ProtocolHandler::CreateProtocolHandler(protocol, url,
217 UTF8ToUTF16(title)); 290 UTF8ToUTF16(title));
218 } 291 }
219 292
220 ProtocolHandler CreateProtocolHandler(const std::string& protocol, 293 ProtocolHandler CreateProtocolHandler(const std::string& protocol,
221 const std::string& name) { 294 const std::string& name) {
222 return CreateProtocolHandler(protocol, GURL("http://" + name + "/%s"), 295 return CreateProtocolHandler(protocol, GURL("http://" + name + "/%s"),
223 name); 296 name);
224 } 297 }
225 298
226 void ReloadProtocolHandlerRegistry() { 299 void RecreateRegistry(bool initialize) {
227 delegate_ = new FakeDelegate(); 300 TeadDownRegistry();
228 registry_->Finalize(); 301 SetUpRegistry(initialize);
229 registry_ = NULL;
230 registry_ = new ProtocolHandlerRegistry(profile(), delegate());
231 registry_->Load();
232 } 302 }
233 303
234 void ReloadProtocolHandlerRegistryAndInstallDefaultHandler() { 304 // Returns a new registry, initializing it if |initialize| is true.
305 // Caller assumes ownership for the object
306 void SetUpRegistry(bool initialize) {
235 delegate_ = new FakeDelegate(); 307 delegate_ = new FakeDelegate();
236 registry_->Finalize(); 308 registry_.reset(new ProtocolHandlerRegistry(profile(), delegate()));
237 registry_ = NULL; 309 if (initialize) registry_->InitProtocolSettings();
238 registry_ = new ProtocolHandlerRegistry(profile(), delegate()); 310 }
239 registry_->AddPredefinedHandler(CreateProtocolHandler( 311
240 "test", GURL("http://test.com/%s"), "Test")); 312 void TeadDownRegistry() {
241 registry_->Load(); 313 registry_->Shutdown();
314 registry_.reset();
315 // Registry owns the delegate_ it handles deletion of that object.
242 } 316 }
243 317
244 virtual void SetUp() { 318 virtual void SetUp() {
245 ui_message_loop_.reset(new MessageLoopForUI());
246 ui_thread_.reset(new content::TestBrowserThread(BrowserThread::UI,
247 MessageLoop::current()));
248 io_thread_.reset(new content::TestBrowserThread(BrowserThread::IO));
249 io_thread_->StartIOThread();
250
251 file_thread_.reset(new content::TestBrowserThread(BrowserThread::FILE));
252 file_thread_->Start();
253
254 profile_.reset(new TestingProfile()); 319 profile_.reset(new TestingProfile());
255 profile_->SetPrefService(new TestingPrefService()); 320 profile_->SetPrefService(new TestingPrefService());
256 delegate_ = new FakeDelegate(); 321 SetUpRegistry(true);
257 registry_ = new ProtocolHandlerRegistry(profile(), delegate());
258 registry_->Load();
259 test_protocol_handler_ = 322 test_protocol_handler_ =
260 CreateProtocolHandler("test", GURL("http://test.com/%s"), "Test"); 323 CreateProtocolHandler("test", GURL("http://test.com/%s"), "Test");
261
262 ProtocolHandlerRegistry::RegisterPrefs(pref_service()); 324 ProtocolHandlerRegistry::RegisterPrefs(pref_service());
263 } 325 }
264 326
265 virtual void TearDown() { 327 virtual void TearDown() {
266 registry_->Finalize(); 328 TeadDownRegistry();
267 registry_ = NULL;
268 io_thread_->Stop();
269 io_thread_.reset(NULL);
270 file_thread_->Stop();
271 file_thread_.reset(NULL);
272 ui_thread_.reset(NULL);
273 ui_message_loop_.reset(NULL);
274 } 329 }
275 330
276 bool enabled_io() { 331 TestMessageLoop loop_;
277 return registry()->enabled_io_;
278 }
279 332
280 scoped_ptr<MessageLoopForUI> ui_message_loop_; 333 private:
281 scoped_ptr<content::TestBrowserThread> ui_thread_; 334 content::TestBrowserThread ui_thread_;
282 scoped_ptr<content::TestBrowserThread> io_thread_; 335 content::TestBrowserThread file_thread_;
283 scoped_ptr<content::TestBrowserThread> file_thread_; 336 content::TestBrowserThread io_thread_;
284 337
285 FakeDelegate* delegate_;
286 scoped_ptr<TestingProfile> profile_; 338 scoped_ptr<TestingProfile> profile_;
287 scoped_refptr<ProtocolHandlerRegistry> registry_; 339 FakeDelegate* delegate_; // Registry assumes ownership of delegate_.
340 scoped_ptr<ProtocolHandlerRegistry> registry_;
288 ProtocolHandler test_protocol_handler_; 341 ProtocolHandler test_protocol_handler_;
289 }; 342 };
290 343
291 // ProtocolHandlerRegistryTest tests are flaky on Linux & ChromeOS. 344 // ProtocolHandlerRegistryTest tests are flaky on Linux & ChromeOS.
292 // http://crbug.com/133023 345 // http://crbug.com/133023
293 #if defined(OS_LINUX) || defined(OS_CHROMEOS) 346 #if defined(OS_LINUX) || defined(OS_CHROMEOS)
294 #define MAYBE_AcceptProtocolHandlerHandlesProtocol \ 347 #define MAYBE_AcceptProtocolHandlerHandlesProtocol \
295 DISABLED_AcceptProtocolHandlerHandlesProtocol 348 DISABLED_AcceptProtocolHandlerHandlesProtocol
296 #define MAYBE_DeniedProtocolIsntHandledUntilAccepted \ 349 #define MAYBE_DeniedProtocolIsntHandledUntilAccepted \
297 DISABLED_DeniedProtocolIsntHandledUntilAccepted 350 DISABLED_DeniedProtocolIsntHandledUntilAccepted
(...skipping 78 matching lines...) Expand 10 before | Expand all | Expand 10 after
376 429
377 TEST_F(ProtocolHandlerRegistryTest, SaveAndLoad) { 430 TEST_F(ProtocolHandlerRegistryTest, SaveAndLoad) {
378 ProtocolHandler stuff_protocol_handler( 431 ProtocolHandler stuff_protocol_handler(
379 CreateProtocolHandler("stuff", "stuff")); 432 CreateProtocolHandler("stuff", "stuff"));
380 registry()->OnAcceptRegisterProtocolHandler(test_protocol_handler()); 433 registry()->OnAcceptRegisterProtocolHandler(test_protocol_handler());
381 registry()->OnIgnoreRegisterProtocolHandler(stuff_protocol_handler); 434 registry()->OnIgnoreRegisterProtocolHandler(stuff_protocol_handler);
382 435
383 ASSERT_TRUE(registry()->IsHandledProtocol("test")); 436 ASSERT_TRUE(registry()->IsHandledProtocol("test"));
384 ASSERT_TRUE(registry()->IsIgnored(stuff_protocol_handler)); 437 ASSERT_TRUE(registry()->IsIgnored(stuff_protocol_handler));
385 delegate()->Reset(); 438 delegate()->Reset();
386 ReloadProtocolHandlerRegistry(); 439 RecreateRegistry(true);
387 ASSERT_TRUE(registry()->IsHandledProtocol("test")); 440 ASSERT_TRUE(registry()->IsHandledProtocol("test"));
388 ASSERT_TRUE(registry()->IsIgnored(stuff_protocol_handler)); 441 ASSERT_TRUE(registry()->IsIgnored(stuff_protocol_handler));
389 } 442 }
390 443
391 TEST_F(ProtocolHandlerRegistryTest, TestEnabledDisabled) { 444 TEST_F(ProtocolHandlerRegistryTest, TestEnabledDisabled) {
392 registry()->Disable(); 445 registry()->Disable();
393 ASSERT_FALSE(registry()->enabled()); 446 ASSERT_FALSE(registry()->enabled());
394 registry()->Enable(); 447 registry()->Enable();
395 ASSERT_TRUE(registry()->enabled()); 448 ASSERT_TRUE(registry()->enabled());
396 } 449 }
(...skipping 65 matching lines...) Expand 10 before | Expand all | Expand 10 after
462 515
463 TEST_F(ProtocolHandlerRegistryTest, TestDefaultSaveLoad) { 516 TEST_F(ProtocolHandlerRegistryTest, TestDefaultSaveLoad) {
464 ProtocolHandler ph1 = CreateProtocolHandler("test", "test1"); 517 ProtocolHandler ph1 = CreateProtocolHandler("test", "test1");
465 ProtocolHandler ph2 = CreateProtocolHandler("test", "test2"); 518 ProtocolHandler ph2 = CreateProtocolHandler("test", "test2");
466 registry()->OnDenyRegisterProtocolHandler(ph1); 519 registry()->OnDenyRegisterProtocolHandler(ph1);
467 registry()->OnDenyRegisterProtocolHandler(ph2); 520 registry()->OnDenyRegisterProtocolHandler(ph2);
468 521
469 registry()->OnAcceptRegisterProtocolHandler(ph2); 522 registry()->OnAcceptRegisterProtocolHandler(ph2);
470 registry()->Disable(); 523 registry()->Disable();
471 524
472 ReloadProtocolHandlerRegistry(); 525 RecreateRegistry(true);
473 526
474 ASSERT_FALSE(registry()->enabled()); 527 ASSERT_FALSE(registry()->enabled());
475 registry()->Enable(); 528 registry()->Enable();
476 ASSERT_FALSE(registry()->IsDefault(ph1)); 529 ASSERT_FALSE(registry()->IsDefault(ph1));
477 ASSERT_TRUE(registry()->IsDefault(ph2)); 530 ASSERT_TRUE(registry()->IsDefault(ph2));
478 531
479 ReloadProtocolHandlerRegistry(); 532 RecreateRegistry(true);
480 ASSERT_TRUE(registry()->enabled()); 533 ASSERT_TRUE(registry()->enabled());
481 } 534 }
482 535
483 TEST_F(ProtocolHandlerRegistryTest, TestRemoveHandler) { 536 TEST_F(ProtocolHandlerRegistryTest, TestRemoveHandler) {
484 ProtocolHandler ph1 = CreateProtocolHandler("test", "test1"); 537 ProtocolHandler ph1 = CreateProtocolHandler("test", "test1");
485 registry()->OnAcceptRegisterProtocolHandler(ph1); 538 registry()->OnAcceptRegisterProtocolHandler(ph1);
486 registry()->OnAcceptRegisterProtocolHandler(ph1); 539 registry()->OnAcceptRegisterProtocolHandler(ph1);
487 540
488 registry()->RemoveHandler(ph1); 541 registry()->RemoveHandler(ph1);
489 ASSERT_FALSE(registry()->IsRegistered(ph1)); 542 ASSERT_FALSE(registry()->IsRegistered(ph1));
(...skipping 139 matching lines...) Expand 10 before | Expand all | Expand 10 after
629 } 682 }
630 683
631 TEST_F(ProtocolHandlerRegistryTest, TestDisablePreventsHandling) { 684 TEST_F(ProtocolHandlerRegistryTest, TestDisablePreventsHandling) {
632 ProtocolHandler ph1 = CreateProtocolHandler("test", "test1"); 685 ProtocolHandler ph1 = CreateProtocolHandler("test", "test1");
633 registry()->OnAcceptRegisterProtocolHandler(ph1); 686 registry()->OnAcceptRegisterProtocolHandler(ph1);
634 ASSERT_TRUE(registry()->IsHandledProtocol("test")); 687 ASSERT_TRUE(registry()->IsHandledProtocol("test"));
635 registry()->Disable(); 688 registry()->Disable();
636 ASSERT_FALSE(registry()->IsHandledProtocol("test")); 689 ASSERT_FALSE(registry()->IsHandledProtocol("test"));
637 } 690 }
638 691
692 // TODO(smckay): This is much more appropriately an integration
693 // test. Make that so, then update the
694 // ShellIntegretion{Delegate,Observer,Worker} test classes we use to fully
695 // isolate this test from the FILE thread.
639 TEST_F(ProtocolHandlerRegistryTest, TestOSRegistration) { 696 TEST_F(ProtocolHandlerRegistryTest, TestOSRegistration) {
640 ProtocolHandler ph_do1 = CreateProtocolHandler("do", "test1"); 697 ProtocolHandler ph_do1 = CreateProtocolHandler("do", "test1");
641 ProtocolHandler ph_do2 = CreateProtocolHandler("do", "test2"); 698 ProtocolHandler ph_do2 = CreateProtocolHandler("do", "test2");
642 ProtocolHandler ph_dont = CreateProtocolHandler("dont", "test"); 699 ProtocolHandler ph_dont = CreateProtocolHandler("dont", "test");
643 700
644 ASSERT_FALSE(delegate()->IsFakeRegisteredWithOS("do")); 701 ASSERT_FALSE(delegate()->IsFakeRegisteredWithOS("do"));
645 ASSERT_FALSE(delegate()->IsFakeRegisteredWithOS("dont")); 702 ASSERT_FALSE(delegate()->IsFakeRegisteredWithOS("dont"));
646 703
647 registry()->OnAcceptRegisterProtocolHandler(ph_do1); 704 registry()->OnAcceptRegisterProtocolHandler(ph_do1);
648 registry()->OnDenyRegisterProtocolHandler(ph_dont); 705 registry()->OnDenyRegisterProtocolHandler(ph_dont);
649 MessageLoop::current()->Run(); 706 MessageLoop::current()->Run(); // FILE thread needs to run.
650 ASSERT_TRUE(delegate()->IsFakeRegisteredWithOS("do")); 707 ASSERT_TRUE(delegate()->IsFakeRegisteredWithOS("do"));
651 ASSERT_FALSE(delegate()->IsFakeRegisteredWithOS("dont")); 708 ASSERT_FALSE(delegate()->IsFakeRegisteredWithOS("dont"));
652 709
653 // This should not register with the OS, if it does the delegate 710 // This should not register with the OS, if it does the delegate
654 // will assert for us. We don't need to wait for the message loop 711 // will assert for us. We don't need to wait for the message loop
655 // as it should not go through to the shell worker. 712 // as it should not go through to the shell worker.
656 registry()->OnAcceptRegisterProtocolHandler(ph_do2); 713 registry()->OnAcceptRegisterProtocolHandler(ph_do2);
657 } 714 }
658 715
659 #if defined(OS_LINUX) 716 #if defined(OS_LINUX)
660 // TODO(benwells): When Linux support is more reliable and 717 // TODO(benwells): When Linux support is more reliable and
661 // http://crbut.com/88255 is fixed this test will pass. 718 // http://crbut.com/88255 is fixed this test will pass.
662 #define MAYBE_TestOSRegistrationFailure FAILS_TestOSRegistrationFailure 719 #define MAYBE_TestOSRegistrationFailure FAILS_TestOSRegistrationFailure
663 #else 720 #else
664 #define MAYBE_TestOSRegistrationFailure TestOSRegistrationFailure 721 #define MAYBE_TestOSRegistrationFailure TestOSRegistrationFailure
665 #endif 722 #endif
666 723
724 // TODO(smckay): This is much more appropriately an integration
725 // test. Make that so, then update the
726 // ShellIntegretion{Delegate,Observer,Worker} test classes we use to fully
727 // isolate this test from the FILE thread.
667 TEST_F(ProtocolHandlerRegistryTest, MAYBE_TestOSRegistrationFailure) { 728 TEST_F(ProtocolHandlerRegistryTest, MAYBE_TestOSRegistrationFailure) {
668 ProtocolHandler ph_do = CreateProtocolHandler("do", "test1"); 729 ProtocolHandler ph_do = CreateProtocolHandler("do", "test1");
669 ProtocolHandler ph_dont = CreateProtocolHandler("dont", "test"); 730 ProtocolHandler ph_dont = CreateProtocolHandler("dont", "test");
670 731
671 ASSERT_FALSE(registry()->IsHandledProtocol("do")); 732 ASSERT_FALSE(registry()->IsHandledProtocol("do"));
672 ASSERT_FALSE(registry()->IsHandledProtocol("dont")); 733 ASSERT_FALSE(registry()->IsHandledProtocol("dont"));
673 734
674 registry()->OnAcceptRegisterProtocolHandler(ph_do); 735 registry()->OnAcceptRegisterProtocolHandler(ph_do);
675 MessageLoop::current()->Run(); 736 MessageLoop::current()->Run(); // FILE thread needs to run.
676 delegate()->set_force_os_failure(true); 737 delegate()->set_force_os_failure(true);
677 registry()->OnAcceptRegisterProtocolHandler(ph_dont); 738 registry()->OnAcceptRegisterProtocolHandler(ph_dont);
678 MessageLoop::current()->Run(); 739 MessageLoop::current()->Run(); // FILE thread needs to run.
679 ASSERT_TRUE(registry()->IsHandledProtocol("do")); 740 ASSERT_TRUE(registry()->IsHandledProtocol("do"));
680 ASSERT_EQ(static_cast<size_t>(1), registry()->GetHandlersFor("do").size()); 741 ASSERT_EQ(static_cast<size_t>(1), registry()->GetHandlersFor("do").size());
681 ASSERT_FALSE(registry()->IsHandledProtocol("dont")); 742 ASSERT_FALSE(registry()->IsHandledProtocol("dont"));
682 ASSERT_EQ(static_cast<size_t>(1), registry()->GetHandlersFor("dont").size()); 743 ASSERT_EQ(static_cast<size_t>(1), registry()->GetHandlersFor("dont").size());
683 } 744 }
684 745
685 static void MakeRequest(const GURL& url, ProtocolHandlerRegistry* registry) {
686 net::URLRequestContext context;
687 net::URLRequest request(url, NULL, &context);
688 BrowserThread::PostTask(BrowserThread::UI, FROM_HERE,
689 MessageLoop::QuitClosure());
690 scoped_refptr<net::URLRequestJob> job(registry->MaybeCreateJob(&request));
691 ASSERT_TRUE(job.get() != NULL);
692 }
693
694 TEST_F(ProtocolHandlerRegistryTest, TestMaybeCreateTaskWorksFromIOThread) { 746 TEST_F(ProtocolHandlerRegistryTest, TestMaybeCreateTaskWorksFromIOThread) {
695 ProtocolHandler ph1 = CreateProtocolHandler("mailto", "test1"); 747 ProtocolHandler ph1 = CreateProtocolHandler("mailto", "test1");
696 registry()->OnAcceptRegisterProtocolHandler(ph1); 748 registry()->OnAcceptRegisterProtocolHandler(ph1);
697 GURL url("mailto:someone@something.com"); 749 GURL url("mailto:someone@something.com");
698 scoped_refptr<ProtocolHandlerRegistry> r(registry()); 750 net::URLRequestJobFactory::Interceptor* interceptor =
699 BrowserThread::PostTask(BrowserThread::IO, FROM_HERE, 751 registry()->CreateURLInterceptor();
700 base::Bind(MakeRequest, url, r));
701 MessageLoop::current()->Run();
702 }
703 752
704 static void CheckIsHandled(const std::string& scheme, bool expected, 753 AssertIntercepted(url, interceptor);
705 ProtocolHandlerRegistry* registry) {
706 BrowserThread::PostTask(BrowserThread::UI, FROM_HERE,
707 MessageLoop::QuitClosure());
708 ASSERT_EQ(expected, registry->IsHandledProtocolIO(scheme));
709 } 754 }
710 755
711 TEST_F(ProtocolHandlerRegistryTest, 756 TEST_F(ProtocolHandlerRegistryTest,
712 MAYBE_TestIsHandledProtocolWorksOnIOThread) { 757 MAYBE_TestIsHandledProtocolWorksOnIOThread) {
713 std::string scheme("mailto"); 758 std::string scheme("mailto");
714 ProtocolHandler ph1 = CreateProtocolHandler(scheme, "test1"); 759 ProtocolHandler ph1 = CreateProtocolHandler(scheme, "test1");
715 registry()->OnAcceptRegisterProtocolHandler(ph1); 760 registry()->OnAcceptRegisterProtocolHandler(ph1);
716 scoped_refptr<ProtocolHandlerRegistry> r(registry()); 761 net::URLRequestJobFactory::Interceptor* interceptor =
717 BrowserThread::PostTask( 762 registry()->CreateURLInterceptor();
718 BrowserThread::IO, 763
719 FROM_HERE, 764 AssertWillHandle(scheme, true, interceptor);
720 base::Bind(CheckIsHandled, scheme, true, r));
721 } 765 }
722 766
723 TEST_F(ProtocolHandlerRegistryTest, TestRemovingDefaultFallsBackToOldDefault) { 767 TEST_F(ProtocolHandlerRegistryTest, TestRemovingDefaultFallsBackToOldDefault) {
724 ProtocolHandler ph1 = CreateProtocolHandler("mailto", "test1"); 768 ProtocolHandler ph1 = CreateProtocolHandler("mailto", "test1");
725 ProtocolHandler ph2 = CreateProtocolHandler("mailto", "test2"); 769 ProtocolHandler ph2 = CreateProtocolHandler("mailto", "test2");
726 ProtocolHandler ph3 = CreateProtocolHandler("mailto", "test3"); 770 ProtocolHandler ph3 = CreateProtocolHandler("mailto", "test3");
727 registry()->OnAcceptRegisterProtocolHandler(ph1); 771 registry()->OnAcceptRegisterProtocolHandler(ph1);
728 registry()->OnAcceptRegisterProtocolHandler(ph2); 772 registry()->OnAcceptRegisterProtocolHandler(ph2);
729 registry()->OnAcceptRegisterProtocolHandler(ph3); 773 registry()->OnAcceptRegisterProtocolHandler(ph3);
730 774
(...skipping 23 matching lines...) Expand all
754 798
755 ASSERT_EQ(ph2, handlers[0]); 799 ASSERT_EQ(ph2, handlers[0]);
756 ASSERT_EQ(ph1, handlers[1]); 800 ASSERT_EQ(ph1, handlers[1]);
757 } 801 }
758 802
759 TEST_F(ProtocolHandlerRegistryTest, MAYBE_TestClearDefaultGetsPropagatedToIO) { 803 TEST_F(ProtocolHandlerRegistryTest, MAYBE_TestClearDefaultGetsPropagatedToIO) {
760 std::string scheme("mailto"); 804 std::string scheme("mailto");
761 ProtocolHandler ph1 = CreateProtocolHandler(scheme, "test1"); 805 ProtocolHandler ph1 = CreateProtocolHandler(scheme, "test1");
762 registry()->OnAcceptRegisterProtocolHandler(ph1); 806 registry()->OnAcceptRegisterProtocolHandler(ph1);
763 registry()->ClearDefault(scheme); 807 registry()->ClearDefault(scheme);
764 scoped_refptr<ProtocolHandlerRegistry> r(registry()); 808 net::URLRequestJobFactory::Interceptor* interceptor =
809 registry()->CreateURLInterceptor();
765 810
766 BrowserThread::PostTask( 811 AssertWillHandle(scheme, false, interceptor);
767 BrowserThread::IO,
768 FROM_HERE,
769 base::Bind(CheckIsHandled, scheme, false, r));
770 }
771
772 static void QuitUILoop() {
773 BrowserThread::PostTask(BrowserThread::UI, FROM_HERE,
774 MessageLoop::QuitClosure());
775 } 812 }
776 813
777 TEST_F(ProtocolHandlerRegistryTest, TestLoadEnabledGetsPropogatedToIO) { 814 TEST_F(ProtocolHandlerRegistryTest, TestLoadEnabledGetsPropogatedToIO) {
815 std::string mailto("mailto");
816 ProtocolHandler ph1 = CreateProtocolHandler(mailto, "MailtoHandler");
817 registry()->OnAcceptRegisterProtocolHandler(ph1);
818
819 net::URLRequestJobFactory::Interceptor* interceptor =
820 registry()->CreateURLInterceptor();
821 AssertWillHandle(mailto, true, interceptor);
778 registry()->Disable(); 822 registry()->Disable();
779 ReloadProtocolHandlerRegistry(); 823 AssertWillHandle(mailto, false, interceptor);
780 BrowserThread::PostTask(BrowserThread::IO, FROM_HERE, 824 delete interceptor;
781 base::Bind(QuitUILoop));
782 MessageLoop::current()->Run();
783 ASSERT_FALSE(enabled_io());
784 } 825 }
785 826
786 TEST_F(ProtocolHandlerRegistryTest, TestReplaceHandler) { 827 TEST_F(ProtocolHandlerRegistryTest, TestReplaceHandler) {
787 ProtocolHandler ph1 = CreateProtocolHandler("mailto", 828 ProtocolHandler ph1 = CreateProtocolHandler("mailto",
788 GURL("http://test.com/%s"), "test1"); 829 GURL("http://test.com/%s"), "test1");
789 ProtocolHandler ph2 = CreateProtocolHandler("mailto", 830 ProtocolHandler ph2 = CreateProtocolHandler("mailto",
790 GURL("http://test.com/updated-url/%s"), "test2"); 831 GURL("http://test.com/updated-url/%s"), "test2");
791 registry()->OnAcceptRegisterProtocolHandler(ph1); 832 registry()->OnAcceptRegisterProtocolHandler(ph1);
792 ASSERT_TRUE(registry()->AttemptReplace(ph2)); 833 ASSERT_TRUE(registry()->AttemptReplace(ph2));
793 const ProtocolHandler& handler(registry()->GetHandlerFor("mailto")); 834 const ProtocolHandler& handler(registry()->GetHandlerFor("mailto"));
(...skipping 43 matching lines...) Expand 10 before | Expand all | Expand 10 after
837 ph1.IsSameOrigin(ph2)); 878 ph1.IsSameOrigin(ph2));
838 ASSERT_EQ(ph1.url().GetOrigin() == ph2.url().GetOrigin(), 879 ASSERT_EQ(ph1.url().GetOrigin() == ph2.url().GetOrigin(),
839 ph2.IsSameOrigin(ph1)); 880 ph2.IsSameOrigin(ph1));
840 ASSERT_EQ(ph2.url().GetOrigin() == ph3.url().GetOrigin(), 881 ASSERT_EQ(ph2.url().GetOrigin() == ph3.url().GetOrigin(),
841 ph2.IsSameOrigin(ph3)); 882 ph2.IsSameOrigin(ph3));
842 ASSERT_EQ(ph3.url().GetOrigin() == ph2.url().GetOrigin(), 883 ASSERT_EQ(ph3.url().GetOrigin() == ph2.url().GetOrigin(),
843 ph3.IsSameOrigin(ph2)); 884 ph3.IsSameOrigin(ph2));
844 } 885 }
845 886
846 TEST_F(ProtocolHandlerRegistryTest, MAYBE_TestInstallDefaultHandler) { 887 TEST_F(ProtocolHandlerRegistryTest, MAYBE_TestInstallDefaultHandler) {
847 ReloadProtocolHandlerRegistryAndInstallDefaultHandler(); 888 RecreateRegistry(false);
889 registry()->AddPredefinedHandler(CreateProtocolHandler(
890 "test", GURL("http://test.com/%s"), "Test"));
891 registry()->InitProtocolSettings();
848 std::vector<std::string> protocols; 892 std::vector<std::string> protocols;
849 registry()->GetRegisteredProtocols(&protocols); 893 registry()->GetRegisteredProtocols(&protocols);
850 ASSERT_EQ(static_cast<size_t>(1), protocols.size()); 894 ASSERT_EQ(static_cast<size_t>(1), protocols.size());
851 } 895 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698