protocol_handler_registry_unittest.cc revision 5821806d5e7f356e8fa4b058a389a808ea183019
15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved. 25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file. 45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/custom_handlers/protocol_handler_registry.h" 65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <set> 85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/memory/scoped_ptr.h" 105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/message_loop.h" 115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/synchronization/waitable_event.h" 125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/utf_string_conversions.h" 135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/common/chrome_notification_types.h" 145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/common/custom_handlers/protocol_handler.h" 155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/test/base/testing_browser_process.h" 165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/test/base/testing_pref_service.h" 175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/test/base/testing_profile.h" 185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/notification_observer.h" 195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/notification_registrar.h" 205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/notification_source.h" 215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/test/test_browser_thread.h" 225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/test/test_renderer_host.h" 235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/url_request/url_request.h" 245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/url_request/url_request_context.h" 255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "testing/gtest/include/gtest/gtest.h" 265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using content::BrowserThread; 285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace { 305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void AssertInterceptedIO( 325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const GURL& url, 335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) net::URLRequestJobFactory::Interceptor* interceptor) { 345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); 355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) net::URLRequestContext context; 365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) net::URLRequest request(url, NULL, &context); 375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_refptr<net::URLRequestJob> job = interceptor->MaybeIntercept( 385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &request, context.network_delegate()); 395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(job.get() != NULL); 405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void AssertIntercepted( 435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const GURL& url, 445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) net::URLRequestJobFactory::Interceptor* interceptor) { 455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); 465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BrowserThread::PostTask(BrowserThread::IO, 475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FROM_HERE, 485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::Bind(AssertInterceptedIO, 495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) url, 505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::Unretained(interceptor))); 515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) MessageLoop::current()->RunAllPending(); 525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void AssertWillHandleIO( 555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::string& scheme, 565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool expected, 575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) net::URLRequestJobFactory::Interceptor* interceptor) { 585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); 595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(expected, interceptor->WillHandleProtocol(scheme)); 605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void AssertWillHandle( 635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::string& scheme, 645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool expected, 655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) net::URLRequestJobFactory::Interceptor* interceptor) { 665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); 675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BrowserThread::PostTask(BrowserThread::IO, 685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FROM_HERE, 695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::Bind(AssertWillHandleIO, 705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scheme, 715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) expected, 725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::Unretained(interceptor))); 735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) MessageLoop::current()->RunAllPending(); 745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class FakeDelegate : public ProtocolHandlerRegistry::Delegate { 775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FakeDelegate() : force_os_failure_(false) {} 795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual ~FakeDelegate() { } 805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void RegisterExternalHandler(const std::string& protocol) { 815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE( 825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) registered_protocols_.find(protocol) == registered_protocols_.end()); 835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) registered_protocols_.insert(protocol); 845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void DeregisterExternalHandler(const std::string& protocol) { 875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) registered_protocols_.erase(protocol); 885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual ShellIntegration::DefaultProtocolClientWorker* CreateShellWorker( 915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ShellIntegration::DefaultWebClientObserver* observer, 925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::string& protocol); 935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual ProtocolHandlerRegistry::DefaultClientObserver* CreateShellObserver( 955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ProtocolHandlerRegistry* registry); 965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void RegisterWithOSAsDefaultClient(const std::string& protocol, 985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ProtocolHandlerRegistry* reg) { 995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ProtocolHandlerRegistry::Delegate::RegisterWithOSAsDefaultClient(protocol, 1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) reg); 1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_FALSE(IsFakeRegisteredWithOS(protocol)); 1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual bool IsExternalHandlerRegistered(const std::string& protocol) { 1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return registered_protocols_.find(protocol) != registered_protocols_.end(); 1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool IsFakeRegisteredWithOS(const std::string& protocol) { 1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return os_registered_protocols_.find(protocol) != 1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) os_registered_protocols_.end(); 1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void FakeRegisterWithOS(const std::string& protocol) { 1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) os_registered_protocols_.insert(protocol); 1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void Reset() { 1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) registered_protocols_.clear(); 1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) os_registered_protocols_.clear(); 1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) force_os_failure_ = false; 1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void set_force_os_failure(bool force) { force_os_failure_ = force; } 1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool force_os_failure() { return force_os_failure_; } 1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private: 1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::set<std::string> registered_protocols_; 1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::set<std::string> os_registered_protocols_; 1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool force_os_failure_; 1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class FakeClientObserver 1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : public ProtocolHandlerRegistry::DefaultClientObserver { 1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FakeClientObserver(ProtocolHandlerRegistry* registry, 1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FakeDelegate* registry_delegate) 1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : ProtocolHandlerRegistry::DefaultClientObserver(registry), 1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) delegate_(registry_delegate) {} 1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void SetDefaultWebClientUIState( 1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ShellIntegration::DefaultWebClientUIState state) { 1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ProtocolHandlerRegistry::DefaultClientObserver::SetDefaultWebClientUIState( 1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) state); 1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (state == ShellIntegration::STATE_IS_DEFAULT) { 1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) delegate_->FakeRegisterWithOS(worker_->protocol()); 1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (state != ShellIntegration::STATE_PROCESSING) { 1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) MessageLoop::current()->Quit(); 1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private: 1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FakeDelegate* delegate_; 1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class FakeProtocolClientWorker 1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : public ShellIntegration::DefaultProtocolClientWorker { 1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FakeProtocolClientWorker(ShellIntegration::DefaultWebClientObserver* observer, 1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::string& protocol, 1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool force_failure) 1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : ShellIntegration::DefaultProtocolClientWorker(observer, protocol), 1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) force_failure_(force_failure) {} 1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private: 1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual ~FakeProtocolClientWorker() {} 1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual ShellIntegration::DefaultWebClientState CheckIsDefault() OVERRIDE { 1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (force_failure_) { 1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return ShellIntegration::NOT_DEFAULT_WEB_CLIENT; 1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return ShellIntegration::IS_DEFAULT_WEB_CLIENT; 1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual bool SetAsDefault(bool interactive_permitted) OVERRIDE { 1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private: 1825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool force_failure_; 1835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)ProtocolHandlerRegistry::DefaultClientObserver* 1865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FakeDelegate::CreateShellObserver(ProtocolHandlerRegistry* registry) { 1875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return new FakeClientObserver(registry, this); 1885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)ShellIntegration::DefaultProtocolClientWorker* FakeDelegate::CreateShellWorker( 1915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ShellIntegration::DefaultWebClientObserver* observer, 1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::string& protocol) { 1935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return new FakeProtocolClientWorker(observer, protocol, force_os_failure_); 1945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class NotificationCounter : public content::NotificationObserver { 1975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 1985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) explicit NotificationCounter(Profile* profile) 1995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : events_(0), 2005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) notification_registrar_() { 2015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) notification_registrar_.Add(this, 2025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) chrome::NOTIFICATION_PROTOCOL_HANDLER_REGISTRY_CHANGED, 2035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::Source<Profile>(profile)); 2045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int events() { return events_; } 2075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool notified() { return events_ > 0; } 2085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void Clear() { events_ = 0; } 2095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void Observe(int type, 2105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const content::NotificationSource& source, 2115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const content::NotificationDetails& details) { 2125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ++events_; 2135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int events_; 2165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::NotificationRegistrar notification_registrar_; 2175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 2185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class QueryProtocolHandlerOnChange 2205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : public content::NotificationObserver { 2215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 2225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) QueryProtocolHandlerOnChange(Profile* profile, 2235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ProtocolHandlerRegistry* registry) 2245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : local_registry_(registry), 2255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) called_(false), 2265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) notification_registrar_() { 2275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) notification_registrar_.Add(this, 2285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) chrome::NOTIFICATION_PROTOCOL_HANDLER_REGISTRY_CHANGED, 2295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::Source<Profile>(profile)); 2305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void Observe(int type, 2335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const content::NotificationSource& source, 2345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const content::NotificationDetails& details) { 2355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::vector<std::string> output; 2365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) local_registry_->GetRegisteredProtocols(&output); 2375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) called_ = true; 2385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ProtocolHandlerRegistry* local_registry_; 2415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool called_; 2425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::NotificationRegistrar notification_registrar_; 2435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 2445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// URLRequest DCHECKS that the current MessageLoop is IO. It does this because 2465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// it can't check the thread id (since net can't depend on content.) We want 2475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// to harness our tests so all threads use the same loop allowing us to 2485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// guarantee all messages are processed.) By overriding the IsType method 2495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// we basically ignore the supplied message loop type, and instead infer 2505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// our type based on the current thread. GO DEPENDENCY INJECTION! 2515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class TestMessageLoop : public MessageLoop { 2525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 2535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestMessageLoop() : MessageLoop(MessageLoop::TYPE_DEFAULT) {} 2545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ~TestMessageLoop() {} 2555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual bool IsType(MessageLoop::Type type) const OVERRIDE { 2565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) switch (type) { 2575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case MessageLoop::TYPE_UI: 2585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return BrowserThread::CurrentlyOn(BrowserThread::UI); 2595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case MessageLoop::TYPE_IO: 2605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return BrowserThread::CurrentlyOn(BrowserThread::IO); 2615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case MessageLoop::TYPE_DEFAULT: 2625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return !BrowserThread::CurrentlyOn(BrowserThread::UI) && 2635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) !BrowserThread::CurrentlyOn(BrowserThread::IO); 2645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 2665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 2685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace 2705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class ProtocolHandlerRegistryTest : public testing::Test { 2725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) protected: 2735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ProtocolHandlerRegistryTest() 2745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : ui_thread_(BrowserThread::UI, &loop_), 2755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) file_thread_(BrowserThread::FILE, &loop_), 2765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) io_thread_(BrowserThread::IO, &loop_), 2775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) test_protocol_handler_(CreateProtocolHandler("test", "test")) {} 2785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FakeDelegate* delegate() const { return delegate_; } 2805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ProtocolHandlerRegistry* registry() { return registry_.get(); } 2815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestingProfile* profile() const { return profile_.get(); } 2825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PrefService* pref_service() const { return profile_->GetPrefs(); } 2835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const ProtocolHandler& test_protocol_handler() const { 2845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return test_protocol_handler_; 2855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ProtocolHandler CreateProtocolHandler(const std::string& protocol, 2885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const GURL& url, 2895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::string& title) { 2905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return ProtocolHandler::CreateProtocolHandler(protocol, url, 2915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) UTF8ToUTF16(title)); 2925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ProtocolHandler CreateProtocolHandler(const std::string& protocol, 2955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::string& name) { 2965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return CreateProtocolHandler(protocol, GURL("http://" + name + "/%s"), 2975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) name); 2985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void RecreateRegistry(bool initialize) { 3015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TeadDownRegistry(); 3025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SetUpRegistry(initialize); 3035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Returns a new registry, initializing it if |initialize| is true. 3065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Caller assumes ownership for the object 3075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void SetUpRegistry(bool initialize) { 3085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) delegate_ = new FakeDelegate(); 3095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) registry_.reset(new ProtocolHandlerRegistry(profile(), delegate())); 3105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (initialize) registry_->InitProtocolSettings(); 3115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void TeadDownRegistry() { 3145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) registry_->Shutdown(); 3155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) registry_.reset(); 3165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Registry owns the delegate_ it handles deletion of that object. 3175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void SetUp() { 3205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) profile_.reset(new TestingProfile()); 3215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) profile_->SetPrefService(new TestingPrefService()); 3225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SetUpRegistry(true); 3235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) test_protocol_handler_ = 3245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CreateProtocolHandler("test", GURL("http://test.com/%s"), "Test"); 3255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ProtocolHandlerRegistry::RegisterPrefs(pref_service()); 3265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void TearDown() { 3295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TeadDownRegistry(); 3305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestMessageLoop loop_; 3335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private: 3355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::TestBrowserThread ui_thread_; 3365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::TestBrowserThread file_thread_; 3375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::TestBrowserThread io_thread_; 3385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<TestingProfile> profile_; 3405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FakeDelegate* delegate_; // Registry assumes ownership of delegate_. 3415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<ProtocolHandlerRegistry> registry_; 3425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ProtocolHandler test_protocol_handler_; 3435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 3445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// ProtocolHandlerRegistryTest tests are flaky on Linux & ChromeOS. 3465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// http://crbug.com/133023 3475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_LINUX) || defined(OS_CHROMEOS) 3485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define MAYBE_AcceptProtocolHandlerHandlesProtocol \ 3495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DISABLED_AcceptProtocolHandlerHandlesProtocol 3505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define MAYBE_DeniedProtocolIsntHandledUntilAccepted \ 3515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DISABLED_DeniedProtocolIsntHandledUntilAccepted 3525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define MAYBE_TestStartsAsDefault DISABLED_TestStartsAsDefault 3535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define MAYBE_TestRemoveHandlerRemovesDefault \ 3545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DISABLED_TestRemoveHandlerRemovesDefault 3555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define MAYBE_TestClearDefaultGetsPropagatedToIO \ 3565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DISABLED_TestClearDefaultGetsPropagatedToIO 3575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define MAYBE_TestIsHandledProtocolWorksOnIOThread \ 3585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DISABLED_TestIsHandledProtocolWorksOnIOThread 3595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define MAYBE_TestInstallDefaultHandler \ 3605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DISABLED_TestInstallDefaultHandler 3615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#else 3625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define MAYBE_AcceptProtocolHandlerHandlesProtocol \ 3635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) AcceptProtocolHandlerHandlesProtocol 3645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define MAYBE_DeniedProtocolIsntHandledUntilAccepted \ 3655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DeniedProtocolIsntHandledUntilAccepted 3665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define MAYBE_TestStartsAsDefault TestStartsAsDefault 3675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define MAYBE_TestRemoveHandlerRemovesDefault TestRemoveHandlerRemovesDefault 3685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define MAYBE_TestClearDefaultGetsPropagatedToIO \ 3695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestClearDefaultGetsPropagatedToIO 3705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define MAYBE_TestIsHandledProtocolWorksOnIOThread \ 3715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestIsHandledProtocolWorksOnIOThread 3725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define MAYBE_TestInstallDefaultHandler TestInstallDefaultHandler 3735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif // defined(OS_CHROMEOS) 3745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(ProtocolHandlerRegistryTest, 3765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) MAYBE_AcceptProtocolHandlerHandlesProtocol) { 3775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_FALSE(registry()->IsHandledProtocol("test")); 3785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) registry()->OnAcceptRegisterProtocolHandler(test_protocol_handler()); 3795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(registry()->IsHandledProtocol("test")); 3805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(ProtocolHandlerRegistryTest, 3835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) MAYBE_DeniedProtocolIsntHandledUntilAccepted) { 3845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) registry()->OnDenyRegisterProtocolHandler(test_protocol_handler()); 3855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_FALSE(registry()->IsHandledProtocol("test")); 3865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) registry()->OnAcceptRegisterProtocolHandler(test_protocol_handler()); 3875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(registry()->IsHandledProtocol("test")); 3885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(ProtocolHandlerRegistryTest, ClearDefaultMakesProtocolNotHandled) { 3915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) registry()->OnAcceptRegisterProtocolHandler(test_protocol_handler()); 3925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) registry()->ClearDefault("test"); 3935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_FALSE(registry()->IsHandledProtocol("test")); 3945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(registry()->GetHandlerFor("test").IsEmpty()); 3955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(ProtocolHandlerRegistryTest, DisableDeregistersProtocolHandlers) { 3985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_FALSE(delegate()->IsExternalHandlerRegistered("test")); 3995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) registry()->OnAcceptRegisterProtocolHandler(test_protocol_handler()); 4005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(delegate()->IsExternalHandlerRegistered("test")); 4015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) registry()->Disable(); 4035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_FALSE(delegate()->IsExternalHandlerRegistered("test")); 4045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) registry()->Enable(); 4055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(delegate()->IsExternalHandlerRegistered("test")); 4065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(ProtocolHandlerRegistryTest, IgnoreProtocolHandler) { 4095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) registry()->OnIgnoreRegisterProtocolHandler(test_protocol_handler()); 4105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(registry()->IsIgnored(test_protocol_handler())); 4115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) registry()->RemoveIgnoredHandler(test_protocol_handler()); 4135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_FALSE(registry()->IsIgnored(test_protocol_handler())); 4145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(ProtocolHandlerRegistryTest, IgnoreEquivalentProtocolHandler) { 4175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ProtocolHandler ph1 = CreateProtocolHandler("test", GURL("http://test/%s"), 4185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "test1"); 4195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ProtocolHandler ph2 = CreateProtocolHandler("test", GURL("http://test/%s"), 4205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "test2"); 4215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) registry()->OnIgnoreRegisterProtocolHandler(ph1); 4235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(registry()->IsIgnored(ph1)); 4245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(registry()->HasIgnoredEquivalent(ph2)); 4255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) registry()->RemoveIgnoredHandler(ph1); 4275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_FALSE(registry()->IsIgnored(ph1)); 4285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_FALSE(registry()->HasIgnoredEquivalent(ph2)); 4295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(ProtocolHandlerRegistryTest, SaveAndLoad) { 4325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ProtocolHandler stuff_protocol_handler( 4335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CreateProtocolHandler("stuff", "stuff")); 4345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) registry()->OnAcceptRegisterProtocolHandler(test_protocol_handler()); 4355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) registry()->OnIgnoreRegisterProtocolHandler(stuff_protocol_handler); 4365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(registry()->IsHandledProtocol("test")); 4385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(registry()->IsIgnored(stuff_protocol_handler)); 4395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) delegate()->Reset(); 4405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RecreateRegistry(true); 4415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(registry()->IsHandledProtocol("test")); 4425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(registry()->IsIgnored(stuff_protocol_handler)); 4435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(ProtocolHandlerRegistryTest, TestEnabledDisabled) { 4465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) registry()->Disable(); 4475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_FALSE(registry()->enabled()); 4485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) registry()->Enable(); 4495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(registry()->enabled()); 4505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(ProtocolHandlerRegistryTest, 4535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DisallowRegisteringExternallyHandledProtocols) { 4545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) delegate()->RegisterExternalHandler("test"); 4555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_FALSE(registry()->CanSchemeBeOverridden("test")); 4565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(ProtocolHandlerRegistryTest, RemovingHandlerMeansItCanBeAddedAgain) { 4595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) registry()->OnAcceptRegisterProtocolHandler(test_protocol_handler()); 4605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(registry()->CanSchemeBeOverridden("test")); 4615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) registry()->RemoveHandler(test_protocol_handler()); 4625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(registry()->CanSchemeBeOverridden("test")); 4635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(ProtocolHandlerRegistryTest, MAYBE_TestStartsAsDefault) { 4665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) registry()->OnAcceptRegisterProtocolHandler(test_protocol_handler()); 4675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(registry()->IsDefault(test_protocol_handler())); 4685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(ProtocolHandlerRegistryTest, TestClearDefault) { 4715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ProtocolHandler ph1 = CreateProtocolHandler("test", "test1"); 4725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ProtocolHandler ph2 = CreateProtocolHandler("test", "test2"); 4735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) registry()->OnAcceptRegisterProtocolHandler(ph1); 4745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) registry()->OnAcceptRegisterProtocolHandler(ph2); 4755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) registry()->OnAcceptRegisterProtocolHandler(ph1); 4775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) registry()->ClearDefault("test"); 4785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_FALSE(registry()->IsDefault(ph1)); 4795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_FALSE(registry()->IsDefault(ph2)); 4805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(ProtocolHandlerRegistryTest, TestGetHandlerFor) { 4835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ProtocolHandler ph1 = CreateProtocolHandler("test", "test1"); 4845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ProtocolHandler ph2 = CreateProtocolHandler("test", "test2"); 4855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) registry()->OnAcceptRegisterProtocolHandler(ph1); 4865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) registry()->OnAcceptRegisterProtocolHandler(ph2); 4875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) registry()->OnAcceptRegisterProtocolHandler(ph2); 4895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(ph2, registry()->GetHandlerFor("test")); 4905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(registry()->IsHandledProtocol("test")); 4915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(ProtocolHandlerRegistryTest, TestMostRecentHandlerIsDefault) { 4945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ProtocolHandler ph1 = CreateProtocolHandler("test", "test1"); 4955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ProtocolHandler ph2 = CreateProtocolHandler("test", "test2"); 4965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) registry()->OnAcceptRegisterProtocolHandler(ph1); 4975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) registry()->OnAcceptRegisterProtocolHandler(ph2); 4985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_FALSE(registry()->IsDefault(ph1)); 4995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(registry()->IsDefault(ph2)); 5005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 5015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(ProtocolHandlerRegistryTest, TestOnAcceptRegisterProtocolHandler) { 5035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ProtocolHandler ph1 = CreateProtocolHandler("test", "test1"); 5045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ProtocolHandler ph2 = CreateProtocolHandler("test", "test2"); 5055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) registry()->OnAcceptRegisterProtocolHandler(ph1); 5065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) registry()->OnAcceptRegisterProtocolHandler(ph2); 5075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) registry()->OnAcceptRegisterProtocolHandler(ph1); 5095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(registry()->IsDefault(ph1)); 5105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_FALSE(registry()->IsDefault(ph2)); 5115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) registry()->OnAcceptRegisterProtocolHandler(ph2); 5135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_FALSE(registry()->IsDefault(ph1)); 5145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(registry()->IsDefault(ph2)); 5155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 5165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(ProtocolHandlerRegistryTest, TestDefaultSaveLoad) { 5185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ProtocolHandler ph1 = CreateProtocolHandler("test", "test1"); 5195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ProtocolHandler ph2 = CreateProtocolHandler("test", "test2"); 5205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) registry()->OnDenyRegisterProtocolHandler(ph1); 5215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) registry()->OnDenyRegisterProtocolHandler(ph2); 5225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) registry()->OnAcceptRegisterProtocolHandler(ph2); 5245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) registry()->Disable(); 5255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RecreateRegistry(true); 5275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_FALSE(registry()->enabled()); 5295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) registry()->Enable(); 5305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_FALSE(registry()->IsDefault(ph1)); 5315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(registry()->IsDefault(ph2)); 5325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RecreateRegistry(true); 5345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(registry()->enabled()); 5355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 5365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(ProtocolHandlerRegistryTest, TestRemoveHandler) { 5385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ProtocolHandler ph1 = CreateProtocolHandler("test", "test1"); 5395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) registry()->OnAcceptRegisterProtocolHandler(ph1); 5405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) registry()->OnAcceptRegisterProtocolHandler(ph1); 5415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) registry()->RemoveHandler(ph1); 5435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_FALSE(registry()->IsRegistered(ph1)); 5445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_FALSE(registry()->IsHandledProtocol("test")); 5455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 5465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(ProtocolHandlerRegistryTest, TestIsRegistered) { 5485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ProtocolHandler ph1 = CreateProtocolHandler("test", "test1"); 5495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ProtocolHandler ph2 = CreateProtocolHandler("test", "test2"); 5505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) registry()->OnAcceptRegisterProtocolHandler(ph1); 5515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) registry()->OnAcceptRegisterProtocolHandler(ph2); 5525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(registry()->IsRegistered(ph1)); 5545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 5555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(ProtocolHandlerRegistryTest, TestIsEquivalentRegistered) { 5575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ProtocolHandler ph1 = CreateProtocolHandler("test", GURL("http://test/%s"), 5585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "test1"); 5595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ProtocolHandler ph2 = CreateProtocolHandler("test", GURL("http://test/%s"), 5605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "test2"); 5615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) registry()->OnAcceptRegisterProtocolHandler(ph1); 5625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(registry()->IsRegistered(ph1)); 5645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(registry()->HasRegisteredEquivalent(ph2)); 5655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 5665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(ProtocolHandlerRegistryTest, TestSilentlyRegisterHandler) { 5685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ProtocolHandler ph1 = CreateProtocolHandler("test", GURL("http://test/%s"), 5695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "test1"); 5705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ProtocolHandler ph2 = CreateProtocolHandler("test", GURL("http://test/%s"), 5715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "test2"); 5725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ProtocolHandler ph3 = CreateProtocolHandler("ignore", GURL("http://test/%s"), 5735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "ignore1"); 5745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ProtocolHandler ph4 = CreateProtocolHandler("ignore", GURL("http://test/%s"), 5755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "ignore2"); 5765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_FALSE(registry()->SilentlyHandleRegisterHandlerRequest(ph1)); 5785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_FALSE(registry()->IsRegistered(ph1)); 5795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) registry()->OnAcceptRegisterProtocolHandler(ph1); 5815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(registry()->IsRegistered(ph1)); 5825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(registry()->SilentlyHandleRegisterHandlerRequest(ph2)); 5845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_FALSE(registry()->IsRegistered(ph1)); 5855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(registry()->IsRegistered(ph2)); 5865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_FALSE(registry()->SilentlyHandleRegisterHandlerRequest(ph3)); 5885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_FALSE(registry()->IsRegistered(ph3)); 5895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) registry()->OnIgnoreRegisterProtocolHandler(ph3); 5915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_FALSE(registry()->IsRegistered(ph3)); 5925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(registry()->IsIgnored(ph3)); 5935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(registry()->SilentlyHandleRegisterHandlerRequest(ph4)); 5955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_FALSE(registry()->IsRegistered(ph4)); 5965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(registry()->HasIgnoredEquivalent(ph4)); 5975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 5985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(ProtocolHandlerRegistryTest, MAYBE_TestRemoveHandlerRemovesDefault) { 6005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ProtocolHandler ph1 = CreateProtocolHandler("test", "test1"); 6015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ProtocolHandler ph2 = CreateProtocolHandler("test", "test2"); 6025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ProtocolHandler ph3 = CreateProtocolHandler("test", "test3"); 6035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) registry()->OnAcceptRegisterProtocolHandler(ph1); 6055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) registry()->OnAcceptRegisterProtocolHandler(ph2); 6065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) registry()->OnAcceptRegisterProtocolHandler(ph3); 6075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) registry()->OnAcceptRegisterProtocolHandler(ph1); 6095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) registry()->RemoveHandler(ph1); 6105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_FALSE(registry()->IsDefault(ph1)); 6115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 6125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(ProtocolHandlerRegistryTest, TestGetHandlersFor) { 6145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ProtocolHandler ph1 = CreateProtocolHandler("test", "test1"); 6155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ProtocolHandler ph2 = CreateProtocolHandler("test", "test2"); 6165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ProtocolHandler ph3 = CreateProtocolHandler("test", "test3"); 6175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) registry()->OnAcceptRegisterProtocolHandler(ph1); 6185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) registry()->OnAcceptRegisterProtocolHandler(ph2); 6195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) registry()->OnAcceptRegisterProtocolHandler(ph3); 6205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ProtocolHandlerRegistry::ProtocolHandlerList handlers = 6225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) registry()->GetHandlersFor("test"); 6235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(static_cast<size_t>(3), handlers.size()); 6245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(ph3, handlers[0]); 6265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(ph2, handlers[1]); 6275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(ph1, handlers[2]); 6285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 6295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(ProtocolHandlerRegistryTest, TestGetRegisteredProtocols) { 6315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::vector<std::string> protocols; 6325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) registry()->GetRegisteredProtocols(&protocols); 6335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(static_cast<size_t>(0), protocols.size()); 6345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) registry()->GetHandlersFor("test"); 6365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) protocols.clear(); 6385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) registry()->GetRegisteredProtocols(&protocols); 6395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(static_cast<size_t>(0), protocols.size()); 6405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 6415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(ProtocolHandlerRegistryTest, TestIsHandledProtocol) { 6435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) registry()->GetHandlersFor("test"); 6445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_FALSE(registry()->IsHandledProtocol("test")); 6455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 6465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(ProtocolHandlerRegistryTest, TestNotifications) { 6485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ProtocolHandler ph1 = CreateProtocolHandler("test", "test1"); 6495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NotificationCounter counter(profile()); 6505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) registry()->OnAcceptRegisterProtocolHandler(ph1); 6525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(counter.notified()); 6535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) counter.Clear(); 6545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) registry()->Disable(); 6565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(counter.notified()); 6575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) counter.Clear(); 6585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) registry()->Enable(); 6605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(counter.notified()); 6615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) counter.Clear(); 6625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) registry()->RemoveHandler(ph1); 6645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(counter.notified()); 6655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) counter.Clear(); 6665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 6675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(ProtocolHandlerRegistryTest, TestReentrantNotifications) { 6695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) QueryProtocolHandlerOnChange queryer(profile(), registry()); 6705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ProtocolHandler ph1 = CreateProtocolHandler("test", "test1"); 6715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) registry()->OnAcceptRegisterProtocolHandler(ph1); 6725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(queryer.called_); 6735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 6745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(ProtocolHandlerRegistryTest, TestProtocolsWithNoDefaultAreHandled) { 6765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ProtocolHandler ph1 = CreateProtocolHandler("test", "test1"); 6775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) registry()->OnAcceptRegisterProtocolHandler(ph1); 6785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) registry()->ClearDefault("test"); 6795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::vector<std::string> handled_protocols; 6805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) registry()->GetRegisteredProtocols(&handled_protocols); 6815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(static_cast<size_t>(1), handled_protocols.size()); 6825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ("test", handled_protocols[0]); 6835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 6845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(ProtocolHandlerRegistryTest, TestDisablePreventsHandling) { 6865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ProtocolHandler ph1 = CreateProtocolHandler("test", "test1"); 6875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) registry()->OnAcceptRegisterProtocolHandler(ph1); 6885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(registry()->IsHandledProtocol("test")); 6895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) registry()->Disable(); 6905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_FALSE(registry()->IsHandledProtocol("test")); 6915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 6925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// TODO(smckay): This is much more appropriately an integration 6945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// test. Make that so, then update the 6955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// ShellIntegretion{Delegate,Observer,Worker} test classes we use to fully 6965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// isolate this test from the FILE thread. 6975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(ProtocolHandlerRegistryTest, TestOSRegistration) { 6985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ProtocolHandler ph_do1 = CreateProtocolHandler("do", "test1"); 6995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ProtocolHandler ph_do2 = CreateProtocolHandler("do", "test2"); 7005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ProtocolHandler ph_dont = CreateProtocolHandler("dont", "test"); 7015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_FALSE(delegate()->IsFakeRegisteredWithOS("do")); 7035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_FALSE(delegate()->IsFakeRegisteredWithOS("dont")); 7045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) registry()->OnAcceptRegisterProtocolHandler(ph_do1); 7065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) registry()->OnDenyRegisterProtocolHandler(ph_dont); 7075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) MessageLoop::current()->Run(); // FILE thread needs to run. 7085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(delegate()->IsFakeRegisteredWithOS("do")); 7095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_FALSE(delegate()->IsFakeRegisteredWithOS("dont")); 7105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // This should not register with the OS, if it does the delegate 7125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // will assert for us. We don't need to wait for the message loop 7135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // as it should not go through to the shell worker. 7145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) registry()->OnAcceptRegisterProtocolHandler(ph_do2); 7155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 7165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_LINUX) 7185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// TODO(benwells): When Linux support is more reliable and 7195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// http://crbut.com/88255 is fixed this test will pass. 7205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define MAYBE_TestOSRegistrationFailure DISABLED_TestOSRegistrationFailure 7215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#else 7225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define MAYBE_TestOSRegistrationFailure TestOSRegistrationFailure 7235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 7245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// TODO(smckay): This is much more appropriately an integration 7265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// test. Make that so, then update the 7275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// ShellIntegretion{Delegate,Observer,Worker} test classes we use to fully 7285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// isolate this test from the FILE thread. 7295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(ProtocolHandlerRegistryTest, MAYBE_TestOSRegistrationFailure) { 7305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ProtocolHandler ph_do = CreateProtocolHandler("do", "test1"); 7315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ProtocolHandler ph_dont = CreateProtocolHandler("dont", "test"); 7325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_FALSE(registry()->IsHandledProtocol("do")); 7345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_FALSE(registry()->IsHandledProtocol("dont")); 7355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) registry()->OnAcceptRegisterProtocolHandler(ph_do); 7375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) MessageLoop::current()->Run(); // FILE thread needs to run. 7385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) delegate()->set_force_os_failure(true); 7395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) registry()->OnAcceptRegisterProtocolHandler(ph_dont); 7405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) MessageLoop::current()->Run(); // FILE thread needs to run. 7415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(registry()->IsHandledProtocol("do")); 7425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(static_cast<size_t>(1), registry()->GetHandlersFor("do").size()); 7435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_FALSE(registry()->IsHandledProtocol("dont")); 7445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(static_cast<size_t>(1), registry()->GetHandlersFor("dont").size()); 7455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 7465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(ProtocolHandlerRegistryTest, TestMaybeCreateTaskWorksFromIOThread) { 7485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ProtocolHandler ph1 = CreateProtocolHandler("mailto", "test1"); 7495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) registry()->OnAcceptRegisterProtocolHandler(ph1); 7505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GURL url("mailto:someone@something.com"); 7515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<net::URLRequestJobFactory::Interceptor> interceptor( 7535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) registry()->CreateURLInterceptor()); 7545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) AssertIntercepted(url, interceptor.get()); 7555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 7565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(ProtocolHandlerRegistryTest, 7585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) MAYBE_TestIsHandledProtocolWorksOnIOThread) { 7595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string scheme("mailto"); 7605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ProtocolHandler ph1 = CreateProtocolHandler(scheme, "test1"); 7615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) registry()->OnAcceptRegisterProtocolHandler(ph1); 7625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<net::URLRequestJobFactory::Interceptor> interceptor( 7645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) registry()->CreateURLInterceptor()); 7655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) AssertWillHandle(scheme, true, interceptor.get()); 7665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 7675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(ProtocolHandlerRegistryTest, TestRemovingDefaultFallsBackToOldDefault) { 7695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ProtocolHandler ph1 = CreateProtocolHandler("mailto", "test1"); 7705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ProtocolHandler ph2 = CreateProtocolHandler("mailto", "test2"); 7715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ProtocolHandler ph3 = CreateProtocolHandler("mailto", "test3"); 7725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) registry()->OnAcceptRegisterProtocolHandler(ph1); 7735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) registry()->OnAcceptRegisterProtocolHandler(ph2); 7745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) registry()->OnAcceptRegisterProtocolHandler(ph3); 7755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(registry()->IsDefault(ph3)); 7775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) registry()->RemoveHandler(ph3); 7785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(registry()->IsDefault(ph2)); 7795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) registry()->OnAcceptRegisterProtocolHandler(ph3); 7805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(registry()->IsDefault(ph3)); 7815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) registry()->RemoveHandler(ph2); 7825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(registry()->IsDefault(ph3)); 7835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) registry()->RemoveHandler(ph3); 7845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(registry()->IsDefault(ph1)); 7855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 7865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(ProtocolHandlerRegistryTest, TestRemovingDefaultDoesntChangeHandlers) { 7885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ProtocolHandler ph1 = CreateProtocolHandler("mailto", "test1"); 7895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ProtocolHandler ph2 = CreateProtocolHandler("mailto", "test2"); 7905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ProtocolHandler ph3 = CreateProtocolHandler("mailto", "test3"); 7915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) registry()->OnAcceptRegisterProtocolHandler(ph1); 7925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) registry()->OnAcceptRegisterProtocolHandler(ph2); 7935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) registry()->OnAcceptRegisterProtocolHandler(ph3); 7945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) registry()->RemoveHandler(ph3); 7955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ProtocolHandlerRegistry::ProtocolHandlerList handlers = 7975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) registry()->GetHandlersFor("mailto"); 7985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(static_cast<size_t>(2), handlers.size()); 7995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(ph2, handlers[0]); 8015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(ph1, handlers[1]); 8025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 8035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(ProtocolHandlerRegistryTest, MAYBE_TestClearDefaultGetsPropagatedToIO) { 8055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string scheme("mailto"); 8065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ProtocolHandler ph1 = CreateProtocolHandler(scheme, "test1"); 8075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) registry()->OnAcceptRegisterProtocolHandler(ph1); 8085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) registry()->ClearDefault(scheme); 8095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<net::URLRequestJobFactory::Interceptor> interceptor( 8115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) registry()->CreateURLInterceptor()); 8125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) AssertWillHandle(scheme, false, interceptor.get()); 8135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 8145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(ProtocolHandlerRegistryTest, TestLoadEnabledGetsPropogatedToIO) { 8165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string mailto("mailto"); 8175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ProtocolHandler ph1 = CreateProtocolHandler(mailto, "MailtoHandler"); 8185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) registry()->OnAcceptRegisterProtocolHandler(ph1); 8195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<net::URLRequestJobFactory::Interceptor> interceptor( 8215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) registry()->CreateURLInterceptor()); 8225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) AssertWillHandle(mailto, true, interceptor.get()); 8235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) registry()->Disable(); 8245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) AssertWillHandle(mailto, false, interceptor.get()); 8255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 8265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(ProtocolHandlerRegistryTest, TestReplaceHandler) { 8285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ProtocolHandler ph1 = CreateProtocolHandler("mailto", 8295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GURL("http://test.com/%s"), "test1"); 8305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ProtocolHandler ph2 = CreateProtocolHandler("mailto", 8315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GURL("http://test.com/updated-url/%s"), "test2"); 8325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) registry()->OnAcceptRegisterProtocolHandler(ph1); 8335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(registry()->AttemptReplace(ph2)); 8345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const ProtocolHandler& handler(registry()->GetHandlerFor("mailto")); 8355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(handler.url(), ph2.url()); 8365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 8375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(ProtocolHandlerRegistryTest, TestReplaceNonDefaultHandler) { 8395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ProtocolHandler ph1 = CreateProtocolHandler("mailto", 8405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GURL("http://test.com/%s"), "test1"); 8415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ProtocolHandler ph2 = CreateProtocolHandler("mailto", 8425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GURL("http://test.com/updated-url/%s"), "test2"); 8435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ProtocolHandler ph3 = CreateProtocolHandler("mailto", 8445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GURL("http://else.com/%s"), "test3"); 8455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) registry()->OnAcceptRegisterProtocolHandler(ph1); 8465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) registry()->OnAcceptRegisterProtocolHandler(ph3); 8475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(registry()->AttemptReplace(ph2)); 8485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const ProtocolHandler& handler(registry()->GetHandlerFor("mailto")); 8495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(handler.url(), ph3.url()); 8505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 8515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(ProtocolHandlerRegistryTest, TestReplaceRemovesStaleHandlers) { 8535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ProtocolHandler ph1 = CreateProtocolHandler("mailto", 8545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GURL("http://test.com/%s"), "test1"); 8555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ProtocolHandler ph2 = CreateProtocolHandler("mailto", 8565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GURL("http://test.com/updated-url/%s"), "test2"); 8575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ProtocolHandler ph3 = CreateProtocolHandler("mailto", 8585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GURL("http://test.com/third/%s"), "test"); 8595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) registry()->OnAcceptRegisterProtocolHandler(ph1); 8605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) registry()->OnAcceptRegisterProtocolHandler(ph2); 8615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // This should replace the previous two handlers. 8635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(registry()->AttemptReplace(ph3)); 8645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const ProtocolHandler& handler(registry()->GetHandlerFor("mailto")); 8655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(handler.url(), ph3.url()); 8665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) registry()->RemoveHandler(ph3); 8675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(registry()->GetHandlerFor("mailto").IsEmpty()); 8685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 8695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(ProtocolHandlerRegistryTest, TestIsSameOrigin) { 8715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ProtocolHandler ph1 = CreateProtocolHandler("mailto", 8725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GURL("http://test.com/%s"), "test1"); 8735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ProtocolHandler ph2 = CreateProtocolHandler("mailto", 8745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GURL("http://test.com/updated-url/%s"), "test2"); 8755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ProtocolHandler ph3 = CreateProtocolHandler("mailto", 8765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GURL("http://other.com/%s"), "test"); 8775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(ph1.url().GetOrigin() == ph2.url().GetOrigin(), 8785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ph1.IsSameOrigin(ph2)); 8795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(ph1.url().GetOrigin() == ph2.url().GetOrigin(), 8805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ph2.IsSameOrigin(ph1)); 8815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(ph2.url().GetOrigin() == ph3.url().GetOrigin(), 8825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ph2.IsSameOrigin(ph3)); 8835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(ph3.url().GetOrigin() == ph2.url().GetOrigin(), 8845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ph3.IsSameOrigin(ph2)); 8855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 8865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(ProtocolHandlerRegistryTest, MAYBE_TestInstallDefaultHandler) { 8885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RecreateRegistry(false); 8895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) registry()->AddPredefinedHandler(CreateProtocolHandler( 8905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "test", GURL("http://test.com/%s"), "Test")); 8915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) registry()->InitProtocolSettings(); 8925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::vector<std::string> protocols; 8935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) registry()->GetRegisteredProtocols(&protocols); 8945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(static_cast<size_t>(1), protocols.size()); 8955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 896