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