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