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"
1646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)#include "chrome/common/pref_names.h"
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/test/base/testing_browser_process.h"
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/test/base/testing_profile.h"
19cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "components/pref_registry/pref_registry_syncable.h"
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/notification_observer.h"
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/notification_registrar.h"
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/notification_source.h"
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/test/test_browser_thread.h"
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/test/test_renderer_host.h"
250f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)#include "net/base/request_priority.h"
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/url_request/url_request.h"
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/url_request/url_request_context.h"
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "testing/gtest/include/gtest/gtest.h"
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using content::BrowserThread;
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace {
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void AssertInterceptedIO(
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const GURL& url,
362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    net::URLRequestJobFactory* interceptor) {
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO));
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  net::URLRequestContext context;
3903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  scoped_ptr<net::URLRequest> request(context.CreateRequest(
4003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)      url, net::DEFAULT_PRIORITY, NULL, NULL));
412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  scoped_refptr<net::URLRequestJob> job =
422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      interceptor->MaybeCreateJobWithProtocolHandler(
4303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)          url.scheme(), request.get(), context.network_delegate());
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(job.get() != NULL);
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void AssertIntercepted(
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const GURL& url,
492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    net::URLRequestJobFactory* interceptor) {
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  BrowserThread::PostTask(BrowserThread::IO,
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                          FROM_HERE,
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                          base::Bind(AssertInterceptedIO,
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                     url,
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                     base::Unretained(interceptor)));
5690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  base::MessageLoop::current()->RunUntilIdle();
572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// FakeURLRequestJobFactory returns NULL for all job creation requests and false
602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// for all IsHandled*() requests. FakeURLRequestJobFactory can be chained to
612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// ProtocolHandlerRegistry::JobInterceptorFactory so the result of
622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// MaybeCreateJobWithProtocolHandler() indicates whether the
632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// ProtocolHandlerRegistry properly handled a job creation request.
642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class FakeURLRequestJobFactory : public net::URLRequestJobFactory {
652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // net::URLRequestJobFactory implementation:
662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual net::URLRequestJob* MaybeCreateJobWithProtocolHandler(
672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      const std::string& scheme,
682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      net::URLRequest* request,
692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      net::NetworkDelegate* network_delegate) const OVERRIDE {
702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return NULL;
712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual bool IsHandledProtocol(const std::string& scheme) const OVERRIDE {
732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return false;
742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual bool IsHandledURL(const GURL& url) const OVERRIDE {
762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return false;
772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
78b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  virtual bool IsSafeRedirectTarget(const GURL& location) const OVERRIDE {
79b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)    return true;
80b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  }
812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)};
825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void AssertWillHandleIO(
845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const std::string& scheme,
855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    bool expected,
862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    ProtocolHandlerRegistry::JobInterceptorFactory* interceptor) {
875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO));
882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  interceptor->Chain(scoped_ptr<net::URLRequestJobFactory>(
892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      new FakeURLRequestJobFactory()));
902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ASSERT_EQ(expected, interceptor->IsHandledProtocol(scheme));
917d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  interceptor->Chain(scoped_ptr<net::URLRequestJobFactory>());
925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void AssertWillHandle(
955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const std::string& scheme,
965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    bool expected,
972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    ProtocolHandlerRegistry::JobInterceptorFactory* interceptor) {
985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  BrowserThread::PostTask(BrowserThread::IO,
1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                          FROM_HERE,
1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                          base::Bind(AssertWillHandleIO,
1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                     scheme,
1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                     expected,
1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                     base::Unretained(interceptor)));
10590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  base::MessageLoop::current()->RunUntilIdle();
1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)base::DictionaryValue* GetProtocolHandlerValue(std::string protocol,
10946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)                                               std::string url) {
11046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  base::DictionaryValue* value = new base::DictionaryValue();
11146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  value->SetString("protocol", protocol);
11246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  value->SetString("url", url);
11346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  return value;
11446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)}
11546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
11646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)base::DictionaryValue* GetProtocolHandlerValueWithDefault(std::string protocol,
11746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)                                                          std::string url,
11846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)                                                          bool is_default) {
11946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  base::DictionaryValue* value = GetProtocolHandlerValue(protocol, url);
12046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  value->SetBoolean("default", is_default);
12146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  return value;
12246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)}
12346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class FakeDelegate : public ProtocolHandlerRegistry::Delegate {
1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  FakeDelegate() : force_os_failure_(false) {}
1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual ~FakeDelegate() { }
1282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual void RegisterExternalHandler(const std::string& protocol) OVERRIDE {
1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_TRUE(
1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        registered_protocols_.find(protocol) == registered_protocols_.end());
1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    registered_protocols_.insert(protocol);
1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual void DeregisterExternalHandler(const std::string& protocol) OVERRIDE {
1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    registered_protocols_.erase(protocol);
1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual ShellIntegration::DefaultProtocolClientWorker* CreateShellWorker(
1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ShellIntegration::DefaultWebClientObserver* observer,
1402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    const std::string& protocol) OVERRIDE;
1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual ProtocolHandlerRegistry::DefaultClientObserver* CreateShellObserver(
1432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      ProtocolHandlerRegistry* registry) OVERRIDE;
1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual void RegisterWithOSAsDefaultClient(
1462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      const std::string& protocol,
1472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      ProtocolHandlerRegistry* reg) OVERRIDE {
1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ProtocolHandlerRegistry::Delegate::RegisterWithOSAsDefaultClient(protocol,
1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                                                     reg);
1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_FALSE(IsFakeRegisteredWithOS(protocol));
1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual bool IsExternalHandlerRegistered(
1542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      const std::string& protocol) OVERRIDE {
1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return registered_protocols_.find(protocol) != registered_protocols_.end();
1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool IsFakeRegisteredWithOS(const std::string& protocol) {
1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return os_registered_protocols_.find(protocol) !=
1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        os_registered_protocols_.end();
1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void FakeRegisterWithOS(const std::string& protocol) {
1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    os_registered_protocols_.insert(protocol);
1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void Reset() {
1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    registered_protocols_.clear();
1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    os_registered_protocols_.clear();
1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    force_os_failure_ = false;
1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void set_force_os_failure(bool force) { force_os_failure_ = force; }
1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool force_os_failure() { return force_os_failure_; }
1765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private:
1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::set<std::string> registered_protocols_;
1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::set<std::string> os_registered_protocols_;
1805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool force_os_failure_;
1815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
1825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class FakeClientObserver
1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    : public ProtocolHandlerRegistry::DefaultClientObserver {
1855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
1865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  FakeClientObserver(ProtocolHandlerRegistry* registry,
1875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                     FakeDelegate* registry_delegate)
1885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      : ProtocolHandlerRegistry::DefaultClientObserver(registry),
1895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        delegate_(registry_delegate) {}
1905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void SetDefaultWebClientUIState(
1922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      ShellIntegration::DefaultWebClientUIState state) OVERRIDE {
1935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ProtocolHandlerRegistry::DefaultClientObserver::SetDefaultWebClientUIState(
1945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        state);
1955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (state == ShellIntegration::STATE_IS_DEFAULT) {
1965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      delegate_->FakeRegisterWithOS(worker_->protocol());
1975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
1985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (state != ShellIntegration::STATE_PROCESSING) {
19990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      base::MessageLoop::current()->Quit();
2005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
2015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private:
2045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  FakeDelegate* delegate_;
2055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
2065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class FakeProtocolClientWorker
2085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    : public ShellIntegration::DefaultProtocolClientWorker {
2095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
2105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  FakeProtocolClientWorker(ShellIntegration::DefaultWebClientObserver* observer,
2115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                           const std::string& protocol,
2125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                           bool force_failure)
2135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      : ShellIntegration::DefaultProtocolClientWorker(observer, protocol),
2145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        force_failure_(force_failure) {}
2155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private:
2175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual ~FakeProtocolClientWorker() {}
2185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual ShellIntegration::DefaultWebClientState CheckIsDefault() OVERRIDE {
2205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (force_failure_) {
2212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      return ShellIntegration::NOT_DEFAULT;
2225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    } else {
2232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      return ShellIntegration::IS_DEFAULT;
2245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
2255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual bool SetAsDefault(bool interactive_permitted) OVERRIDE {
2285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return true;
2295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private:
2325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool force_failure_;
2335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
2345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)ProtocolHandlerRegistry::DefaultClientObserver*
2365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    FakeDelegate::CreateShellObserver(ProtocolHandlerRegistry* registry) {
2375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return new FakeClientObserver(registry, this);
2385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)ShellIntegration::DefaultProtocolClientWorker* FakeDelegate::CreateShellWorker(
2415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ShellIntegration::DefaultWebClientObserver* observer,
2425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const std::string& protocol) {
2435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return new FakeProtocolClientWorker(observer, protocol, force_os_failure_);
2445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class NotificationCounter : public content::NotificationObserver {
2475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
2485f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  explicit NotificationCounter(content::BrowserContext* context)
2495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      : events_(0),
2505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        notification_registrar_() {
2515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    notification_registrar_.Add(this,
2525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        chrome::NOTIFICATION_PROTOCOL_HANDLER_REGISTRY_CHANGED,
2535f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)            content::Source<content::BrowserContext>(context));
2545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int events() { return events_; }
2575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool notified() { return events_ > 0; }
2585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void Clear() { events_ = 0; }
2595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void Observe(int type,
2605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                       const content::NotificationSource& source,
2612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                       const content::NotificationDetails& details) OVERRIDE {
2625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ++events_;
2635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int events_;
2665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  content::NotificationRegistrar notification_registrar_;
2675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
2685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class QueryProtocolHandlerOnChange
2705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    : public content::NotificationObserver {
2715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
2725f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  QueryProtocolHandlerOnChange(content::BrowserContext* context,
2735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                               ProtocolHandlerRegistry* registry)
2745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    : local_registry_(registry),
2755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      called_(false),
2765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      notification_registrar_() {
2775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    notification_registrar_.Add(this,
2785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        chrome::NOTIFICATION_PROTOCOL_HANDLER_REGISTRY_CHANGED,
2795f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)            content::Source<content::BrowserContext>(context));
2805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void Observe(int type,
2835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                       const content::NotificationSource& source,
2842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                       const content::NotificationDetails& details) OVERRIDE {
2855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    std::vector<std::string> output;
2865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    local_registry_->GetRegisteredProtocols(&output);
2875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    called_ = true;
2885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ProtocolHandlerRegistry* local_registry_;
2915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool called_;
2925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  content::NotificationRegistrar notification_registrar_;
2935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
2945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// URLRequest DCHECKS that the current MessageLoop is IO. It does this because
2965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// it can't check the thread id (since net can't depend on content.) We want
2975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// to harness our tests so all threads use the same loop allowing us to
2985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// guarantee all messages are processed.) By overriding the IsType method
2995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// we basically ignore the supplied message loop type, and instead infer
3005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// our type based on the current thread. GO DEPENDENCY INJECTION!
30190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)class TestMessageLoop : public base::MessageLoop {
3025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
3035d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  TestMessageLoop() {}
3042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual ~TestMessageLoop() {}
30590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  virtual bool IsType(base::MessageLoop::Type type) const OVERRIDE {
3065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    switch (type) {
30790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      case base::MessageLoop::TYPE_UI:
30890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)        return BrowserThread::CurrentlyOn(BrowserThread::UI);
30990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      case base::MessageLoop::TYPE_IO:
31090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)        return BrowserThread::CurrentlyOn(BrowserThread::IO);
311bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch#if defined(OS_ANDROID)
312bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch      case base::MessageLoop::TYPE_JAVA: // fall-through
313bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch#endif // defined(OS_ANDROID)
314f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      case base::MessageLoop::TYPE_CUSTOM:
31590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      case base::MessageLoop::TYPE_DEFAULT:
31690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)        return !BrowserThread::CurrentlyOn(BrowserThread::UI) &&
31790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)               !BrowserThread::CurrentlyOn(BrowserThread::IO);
3185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
3195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return false;
3205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
3215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
3225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace
3245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class ProtocolHandlerRegistryTest : public testing::Test {
3265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) protected:
3275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ProtocolHandlerRegistryTest()
3285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  : ui_thread_(BrowserThread::UI, &loop_),
3295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    file_thread_(BrowserThread::FILE, &loop_),
3305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    io_thread_(BrowserThread::IO, &loop_),
3315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    test_protocol_handler_(CreateProtocolHandler("test", "test")) {}
3325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  FakeDelegate* delegate() const { return delegate_; }
3345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ProtocolHandlerRegistry* registry() { return registry_.get(); }
3355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TestingProfile* profile() const { return profile_.get(); }
3365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const ProtocolHandler& test_protocol_handler() const {
3375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return test_protocol_handler_;
3385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
3395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ProtocolHandler CreateProtocolHandler(const std::string& protocol,
341cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)                                        const GURL& url) {
342cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    return ProtocolHandler::CreateProtocolHandler(protocol, url);
3435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
3445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ProtocolHandler CreateProtocolHandler(const std::string& protocol,
346cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)                                        const std::string& name) {
347cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    return CreateProtocolHandler(protocol, GURL("http://" + name + "/%s"));
3485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
3495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void RecreateRegistry(bool initialize) {
3515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    TeadDownRegistry();
3525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    SetUpRegistry(initialize);
3535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
3545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
35546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  int InPrefHandlerCount() {
35646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    const base::ListValue* in_pref_handlers =
35746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)        profile()->GetPrefs()->GetList(prefs::kRegisteredProtocolHandlers);
35846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    return static_cast<int>(in_pref_handlers->GetSize());
35946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  }
36046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
36146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  int InMemoryHandlerCount() {
36246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    int in_memory_handler_count = 0;
36346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    ProtocolHandlerRegistry::ProtocolHandlerMultiMap::iterator it =
36446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)        registry()->protocol_handlers_.begin();
36546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    for (; it != registry()->protocol_handlers_.end(); ++it)
36646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)      in_memory_handler_count += it->second.size();
36746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    return in_memory_handler_count;
36846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  }
36946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
37046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  int InPrefIgnoredHandlerCount() {
37146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    const base::ListValue* in_pref_ignored_handlers =
37246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)        profile()->GetPrefs()->GetList(prefs::kIgnoredProtocolHandlers);
37346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    return static_cast<int>(in_pref_ignored_handlers->GetSize());
37446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  }
37546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
37646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  int InMemoryIgnoredHandlerCount() {
37746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    int in_memory_ignored_handler_count = 0;
37846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    ProtocolHandlerRegistry::ProtocolHandlerList::iterator it =
37946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)        registry()->ignored_protocol_handlers_.begin();
38046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    for (; it != registry()->ignored_protocol_handlers_.end(); ++it)
38146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)      in_memory_ignored_handler_count++;
38246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    return in_memory_ignored_handler_count;
38346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  }
38446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
3855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Returns a new registry, initializing it if |initialize| is true.
3865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Caller assumes ownership for the object
3875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void SetUpRegistry(bool initialize) {
3885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    delegate_ = new FakeDelegate();
3895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    registry_.reset(new ProtocolHandlerRegistry(profile(), delegate()));
3905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (initialize) registry_->InitProtocolSettings();
3915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
3925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void TeadDownRegistry() {
3945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    registry_->Shutdown();
3955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    registry_.reset();
3965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Registry owns the delegate_ it handles deletion of that object.
3975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
3985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void SetUp() {
4005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    profile_.reset(new TestingProfile());
4012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    CHECK(profile_->GetPrefs());
4025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    SetUpRegistry(true);
4035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    test_protocol_handler_ =
404cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)        CreateProtocolHandler("test", GURL("http://test.com/%s"));
4055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
4065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void TearDown() {
4085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    TeadDownRegistry();
4095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
4105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TestMessageLoop loop_;
4125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private:
4145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  content::TestBrowserThread ui_thread_;
4155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  content::TestBrowserThread file_thread_;
4165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  content::TestBrowserThread io_thread_;
4175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<TestingProfile> profile_;
4195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  FakeDelegate* delegate_;  // Registry assumes ownership of delegate_.
4205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<ProtocolHandlerRegistry> registry_;
4215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ProtocolHandler test_protocol_handler_;
4225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
4235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// ProtocolHandlerRegistryTest tests are flaky on Linux & ChromeOS.
4255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// http://crbug.com/133023
4260529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch#if defined(OS_LINUX)
4275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define MAYBE_AcceptProtocolHandlerHandlesProtocol \
4285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    DISABLED_AcceptProtocolHandlerHandlesProtocol
4295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define MAYBE_DeniedProtocolIsntHandledUntilAccepted \
4305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    DISABLED_DeniedProtocolIsntHandledUntilAccepted
4315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define MAYBE_TestStartsAsDefault DISABLED_TestStartsAsDefault
4325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define MAYBE_TestRemoveHandlerRemovesDefault \
4335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    DISABLED_TestRemoveHandlerRemovesDefault
4345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define MAYBE_TestClearDefaultGetsPropagatedToIO \
4355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    DISABLED_TestClearDefaultGetsPropagatedToIO
4365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define MAYBE_TestIsHandledProtocolWorksOnIOThread \
4375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    DISABLED_TestIsHandledProtocolWorksOnIOThread
4385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define MAYBE_TestInstallDefaultHandler \
4395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    DISABLED_TestInstallDefaultHandler
4405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#else
4415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define MAYBE_AcceptProtocolHandlerHandlesProtocol \
4425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    AcceptProtocolHandlerHandlesProtocol
4435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define MAYBE_DeniedProtocolIsntHandledUntilAccepted \
4445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    DeniedProtocolIsntHandledUntilAccepted
4455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define MAYBE_TestStartsAsDefault TestStartsAsDefault
4465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define MAYBE_TestRemoveHandlerRemovesDefault TestRemoveHandlerRemovesDefault
4475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define MAYBE_TestClearDefaultGetsPropagatedToIO \
4485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    TestClearDefaultGetsPropagatedToIO
4495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define MAYBE_TestIsHandledProtocolWorksOnIOThread \
4505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    TestIsHandledProtocolWorksOnIOThread
4515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define MAYBE_TestInstallDefaultHandler TestInstallDefaultHandler
4520529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch#endif  // defined(OS_LINUX)
4535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(ProtocolHandlerRegistryTest,
4555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)       MAYBE_AcceptProtocolHandlerHandlesProtocol) {
4565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_FALSE(registry()->IsHandledProtocol("test"));
4575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  registry()->OnAcceptRegisterProtocolHandler(test_protocol_handler());
4585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(registry()->IsHandledProtocol("test"));
4595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(ProtocolHandlerRegistryTest,
4625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)       MAYBE_DeniedProtocolIsntHandledUntilAccepted) {
4635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  registry()->OnDenyRegisterProtocolHandler(test_protocol_handler());
4645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_FALSE(registry()->IsHandledProtocol("test"));
4655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  registry()->OnAcceptRegisterProtocolHandler(test_protocol_handler());
4665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(registry()->IsHandledProtocol("test"));
4675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(ProtocolHandlerRegistryTest, ClearDefaultMakesProtocolNotHandled) {
4705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  registry()->OnAcceptRegisterProtocolHandler(test_protocol_handler());
4715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  registry()->ClearDefault("test");
4725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_FALSE(registry()->IsHandledProtocol("test"));
4735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(registry()->GetHandlerFor("test").IsEmpty());
4745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(ProtocolHandlerRegistryTest, DisableDeregistersProtocolHandlers) {
4775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_FALSE(delegate()->IsExternalHandlerRegistered("test"));
4785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  registry()->OnAcceptRegisterProtocolHandler(test_protocol_handler());
4795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(delegate()->IsExternalHandlerRegistered("test"));
4805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  registry()->Disable();
4825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_FALSE(delegate()->IsExternalHandlerRegistered("test"));
4835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  registry()->Enable();
4845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(delegate()->IsExternalHandlerRegistered("test"));
4855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(ProtocolHandlerRegistryTest, IgnoreProtocolHandler) {
4885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  registry()->OnIgnoreRegisterProtocolHandler(test_protocol_handler());
4895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(registry()->IsIgnored(test_protocol_handler()));
4905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  registry()->RemoveIgnoredHandler(test_protocol_handler());
4925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_FALSE(registry()->IsIgnored(test_protocol_handler()));
4935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(ProtocolHandlerRegistryTest, IgnoreEquivalentProtocolHandler) {
496cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  ProtocolHandler ph1 = CreateProtocolHandler("test", GURL("http://test/%s"));
497cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  ProtocolHandler ph2 = CreateProtocolHandler("test", GURL("http://test/%s"));
4985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  registry()->OnIgnoreRegisterProtocolHandler(ph1);
5005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(registry()->IsIgnored(ph1));
5015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(registry()->HasIgnoredEquivalent(ph2));
5025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  registry()->RemoveIgnoredHandler(ph1);
5045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_FALSE(registry()->IsIgnored(ph1));
5055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_FALSE(registry()->HasIgnoredEquivalent(ph2));
5065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
5075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(ProtocolHandlerRegistryTest, SaveAndLoad) {
5095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ProtocolHandler stuff_protocol_handler(
5105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      CreateProtocolHandler("stuff", "stuff"));
5115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  registry()->OnAcceptRegisterProtocolHandler(test_protocol_handler());
5125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  registry()->OnIgnoreRegisterProtocolHandler(stuff_protocol_handler);
5135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(registry()->IsHandledProtocol("test"));
5155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(registry()->IsIgnored(stuff_protocol_handler));
5165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  delegate()->Reset();
5175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  RecreateRegistry(true);
5185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(registry()->IsHandledProtocol("test"));
5195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(registry()->IsIgnored(stuff_protocol_handler));
5205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
5215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(ProtocolHandlerRegistryTest, TestEnabledDisabled) {
5235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  registry()->Disable();
5245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_FALSE(registry()->enabled());
5255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  registry()->Enable();
5265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(registry()->enabled());
5275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
5285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(ProtocolHandlerRegistryTest,
5305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    DisallowRegisteringExternallyHandledProtocols) {
5315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  delegate()->RegisterExternalHandler("test");
5325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_FALSE(registry()->CanSchemeBeOverridden("test"));
5335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
5345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(ProtocolHandlerRegistryTest, RemovingHandlerMeansItCanBeAddedAgain) {
5365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  registry()->OnAcceptRegisterProtocolHandler(test_protocol_handler());
5375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(registry()->CanSchemeBeOverridden("test"));
5385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  registry()->RemoveHandler(test_protocol_handler());
5395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(registry()->CanSchemeBeOverridden("test"));
5405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
5415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(ProtocolHandlerRegistryTest, MAYBE_TestStartsAsDefault) {
5435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  registry()->OnAcceptRegisterProtocolHandler(test_protocol_handler());
5445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(registry()->IsDefault(test_protocol_handler()));
5455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
5465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(ProtocolHandlerRegistryTest, TestClearDefault) {
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)  registry()->OnAcceptRegisterProtocolHandler(ph1);
5545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  registry()->ClearDefault("test");
5555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_FALSE(registry()->IsDefault(ph1));
5565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_FALSE(registry()->IsDefault(ph2));
5575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
5585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(ProtocolHandlerRegistryTest, TestGetHandlerFor) {
5605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ProtocolHandler ph1 = CreateProtocolHandler("test", "test1");
5615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ProtocolHandler ph2 = CreateProtocolHandler("test", "test2");
5625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  registry()->OnAcceptRegisterProtocolHandler(ph1);
5635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  registry()->OnAcceptRegisterProtocolHandler(ph2);
5645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  registry()->OnAcceptRegisterProtocolHandler(ph2);
5665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(ph2, registry()->GetHandlerFor("test"));
5675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(registry()->IsHandledProtocol("test"));
5685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
5695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(ProtocolHandlerRegistryTest, TestMostRecentHandlerIsDefault) {
5715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ProtocolHandler ph1 = CreateProtocolHandler("test", "test1");
5725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ProtocolHandler ph2 = CreateProtocolHandler("test", "test2");
5735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  registry()->OnAcceptRegisterProtocolHandler(ph1);
5745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  registry()->OnAcceptRegisterProtocolHandler(ph2);
5755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_FALSE(registry()->IsDefault(ph1));
5765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(registry()->IsDefault(ph2));
5775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
5785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(ProtocolHandlerRegistryTest, TestOnAcceptRegisterProtocolHandler) {
5805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ProtocolHandler ph1 = CreateProtocolHandler("test", "test1");
5815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ProtocolHandler ph2 = CreateProtocolHandler("test", "test2");
5825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  registry()->OnAcceptRegisterProtocolHandler(ph1);
5835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  registry()->OnAcceptRegisterProtocolHandler(ph2);
5845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  registry()->OnAcceptRegisterProtocolHandler(ph1);
5865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(registry()->IsDefault(ph1));
5875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_FALSE(registry()->IsDefault(ph2));
5885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  registry()->OnAcceptRegisterProtocolHandler(ph2);
5905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_FALSE(registry()->IsDefault(ph1));
5915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(registry()->IsDefault(ph2));
5925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
5935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(ProtocolHandlerRegistryTest, TestDefaultSaveLoad) {
5955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ProtocolHandler ph1 = CreateProtocolHandler("test", "test1");
5965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ProtocolHandler ph2 = CreateProtocolHandler("test", "test2");
5975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  registry()->OnDenyRegisterProtocolHandler(ph1);
5985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  registry()->OnDenyRegisterProtocolHandler(ph2);
5995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  registry()->OnAcceptRegisterProtocolHandler(ph2);
6015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  registry()->Disable();
6025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  RecreateRegistry(true);
6045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_FALSE(registry()->enabled());
6065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  registry()->Enable();
6075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_FALSE(registry()->IsDefault(ph1));
6085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(registry()->IsDefault(ph2));
6095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  RecreateRegistry(true);
6115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(registry()->enabled());
6125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
6135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(ProtocolHandlerRegistryTest, TestRemoveHandler) {
6155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ProtocolHandler ph1 = CreateProtocolHandler("test", "test1");
6165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  registry()->OnAcceptRegisterProtocolHandler(ph1);
6175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  registry()->OnAcceptRegisterProtocolHandler(ph1);
6185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  registry()->RemoveHandler(ph1);
6205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_FALSE(registry()->IsRegistered(ph1));
6215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_FALSE(registry()->IsHandledProtocol("test"));
6225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
6235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(ProtocolHandlerRegistryTest, TestIsRegistered) {
6255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ProtocolHandler ph1 = CreateProtocolHandler("test", "test1");
6265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ProtocolHandler ph2 = CreateProtocolHandler("test", "test2");
6275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  registry()->OnAcceptRegisterProtocolHandler(ph1);
6285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  registry()->OnAcceptRegisterProtocolHandler(ph2);
6295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(registry()->IsRegistered(ph1));
6315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
6325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(ProtocolHandlerRegistryTest, TestIsEquivalentRegistered) {
634cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  ProtocolHandler ph1 = CreateProtocolHandler("test", GURL("http://test/%s"));
635cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  ProtocolHandler ph2 = CreateProtocolHandler("test", GURL("http://test/%s"));
6365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  registry()->OnAcceptRegisterProtocolHandler(ph1);
6375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(registry()->IsRegistered(ph1));
6395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(registry()->HasRegisteredEquivalent(ph2));
6405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
6415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(ProtocolHandlerRegistryTest, TestSilentlyRegisterHandler) {
643cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  ProtocolHandler ph1 = CreateProtocolHandler("test", GURL("http://test/1/%s"));
644cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  ProtocolHandler ph2 = CreateProtocolHandler("test", GURL("http://test/2/%s"));
645cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  ProtocolHandler ph3 = CreateProtocolHandler("ignore", GURL("http://test/%s"));
646cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  ProtocolHandler ph4 = CreateProtocolHandler("ignore", GURL("http://test/%s"));
6475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_FALSE(registry()->SilentlyHandleRegisterHandlerRequest(ph1));
6495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_FALSE(registry()->IsRegistered(ph1));
6505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  registry()->OnAcceptRegisterProtocolHandler(ph1);
6525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(registry()->IsRegistered(ph1));
6535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(registry()->SilentlyHandleRegisterHandlerRequest(ph2));
6555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_FALSE(registry()->IsRegistered(ph1));
6565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(registry()->IsRegistered(ph2));
6575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_FALSE(registry()->SilentlyHandleRegisterHandlerRequest(ph3));
6595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_FALSE(registry()->IsRegistered(ph3));
6605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  registry()->OnIgnoreRegisterProtocolHandler(ph3);
6625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_FALSE(registry()->IsRegistered(ph3));
6635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(registry()->IsIgnored(ph3));
6645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(registry()->SilentlyHandleRegisterHandlerRequest(ph4));
6665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_FALSE(registry()->IsRegistered(ph4));
6675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(registry()->HasIgnoredEquivalent(ph4));
6685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
6695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(ProtocolHandlerRegistryTest, MAYBE_TestRemoveHandlerRemovesDefault) {
6715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ProtocolHandler ph1 = CreateProtocolHandler("test", "test1");
6725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ProtocolHandler ph2 = CreateProtocolHandler("test", "test2");
6735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ProtocolHandler ph3 = CreateProtocolHandler("test", "test3");
6745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  registry()->OnAcceptRegisterProtocolHandler(ph1);
6765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  registry()->OnAcceptRegisterProtocolHandler(ph2);
6775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  registry()->OnAcceptRegisterProtocolHandler(ph3);
6785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  registry()->OnAcceptRegisterProtocolHandler(ph1);
6805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  registry()->RemoveHandler(ph1);
6815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_FALSE(registry()->IsDefault(ph1));
6825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
6835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(ProtocolHandlerRegistryTest, TestGetHandlersFor) {
6855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ProtocolHandler ph1 = CreateProtocolHandler("test", "test1");
6865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ProtocolHandler ph2 = CreateProtocolHandler("test", "test2");
6875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ProtocolHandler ph3 = CreateProtocolHandler("test", "test3");
6885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  registry()->OnAcceptRegisterProtocolHandler(ph1);
6895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  registry()->OnAcceptRegisterProtocolHandler(ph2);
6905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  registry()->OnAcceptRegisterProtocolHandler(ph3);
6915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ProtocolHandlerRegistry::ProtocolHandlerList handlers =
6935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      registry()->GetHandlersFor("test");
6945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(static_cast<size_t>(3), handlers.size());
6955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(ph3, handlers[0]);
6975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(ph2, handlers[1]);
6985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(ph1, handlers[2]);
6995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
7005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(ProtocolHandlerRegistryTest, TestGetRegisteredProtocols) {
7025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::vector<std::string> protocols;
7035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  registry()->GetRegisteredProtocols(&protocols);
7045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(static_cast<size_t>(0), protocols.size());
7055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  registry()->GetHandlersFor("test");
7075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  protocols.clear();
7095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  registry()->GetRegisteredProtocols(&protocols);
7105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(static_cast<size_t>(0), protocols.size());
7115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
7125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(ProtocolHandlerRegistryTest, TestIsHandledProtocol) {
7145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  registry()->GetHandlersFor("test");
7155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_FALSE(registry()->IsHandledProtocol("test"));
7165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
7175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(ProtocolHandlerRegistryTest, TestNotifications) {
7195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ProtocolHandler ph1 = CreateProtocolHandler("test", "test1");
7205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  NotificationCounter counter(profile());
7215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  registry()->OnAcceptRegisterProtocolHandler(ph1);
7235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(counter.notified());
7245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  counter.Clear();
7255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  registry()->Disable();
7275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(counter.notified());
7285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  counter.Clear();
7295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  registry()->Enable();
7315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(counter.notified());
7325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  counter.Clear();
7335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  registry()->RemoveHandler(ph1);
7355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(counter.notified());
7365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  counter.Clear();
7375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
7385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(ProtocolHandlerRegistryTest, TestReentrantNotifications) {
7405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  QueryProtocolHandlerOnChange queryer(profile(), registry());
7415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ProtocolHandler ph1 = CreateProtocolHandler("test", "test1");
7425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  registry()->OnAcceptRegisterProtocolHandler(ph1);
7435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(queryer.called_);
7445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
7455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(ProtocolHandlerRegistryTest, TestProtocolsWithNoDefaultAreHandled) {
7475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ProtocolHandler ph1 = CreateProtocolHandler("test", "test1");
7485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  registry()->OnAcceptRegisterProtocolHandler(ph1);
7495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  registry()->ClearDefault("test");
7505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::vector<std::string> handled_protocols;
7515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  registry()->GetRegisteredProtocols(&handled_protocols);
7525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(static_cast<size_t>(1), handled_protocols.size());
7535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ("test", handled_protocols[0]);
7545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
7555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(ProtocolHandlerRegistryTest, TestDisablePreventsHandling) {
7575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ProtocolHandler ph1 = CreateProtocolHandler("test", "test1");
7585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  registry()->OnAcceptRegisterProtocolHandler(ph1);
7595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(registry()->IsHandledProtocol("test"));
7605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  registry()->Disable();
7615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_FALSE(registry()->IsHandledProtocol("test"));
7625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
7635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// TODO(smckay): This is much more appropriately an integration
7655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// test. Make that so, then update the
7665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// ShellIntegretion{Delegate,Observer,Worker} test classes we use to fully
7675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// isolate this test from the FILE thread.
7685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(ProtocolHandlerRegistryTest, TestOSRegistration) {
7695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ProtocolHandler ph_do1 = CreateProtocolHandler("do", "test1");
7705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ProtocolHandler ph_do2 = CreateProtocolHandler("do", "test2");
7715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ProtocolHandler ph_dont = CreateProtocolHandler("dont", "test");
7725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_FALSE(delegate()->IsFakeRegisteredWithOS("do"));
7745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_FALSE(delegate()->IsFakeRegisteredWithOS("dont"));
7755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  registry()->OnAcceptRegisterProtocolHandler(ph_do1);
7775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  registry()->OnDenyRegisterProtocolHandler(ph_dont);
77890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  base::MessageLoop::current()->Run();  // FILE thread needs to run.
7795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(delegate()->IsFakeRegisteredWithOS("do"));
7805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_FALSE(delegate()->IsFakeRegisteredWithOS("dont"));
7815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // This should not register with the OS, if it does the delegate
7835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // will assert for us. We don't need to wait for the message loop
7845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // as it should not go through to the shell worker.
7855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  registry()->OnAcceptRegisterProtocolHandler(ph_do2);
7865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
7875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_LINUX)
7895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// TODO(benwells): When Linux support is more reliable and
7905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// http://crbut.com/88255 is fixed this test will pass.
7915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define MAYBE_TestOSRegistrationFailure DISABLED_TestOSRegistrationFailure
7925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#else
7935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define MAYBE_TestOSRegistrationFailure TestOSRegistrationFailure
7945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
7955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// TODO(smckay): This is much more appropriately an integration
7975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// test. Make that so, then update the
7985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// ShellIntegretion{Delegate,Observer,Worker} test classes we use to fully
7995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// isolate this test from the FILE thread.
8005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(ProtocolHandlerRegistryTest, MAYBE_TestOSRegistrationFailure) {
8015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ProtocolHandler ph_do = CreateProtocolHandler("do", "test1");
8025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ProtocolHandler ph_dont = CreateProtocolHandler("dont", "test");
8035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_FALSE(registry()->IsHandledProtocol("do"));
8055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_FALSE(registry()->IsHandledProtocol("dont"));
8065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  registry()->OnAcceptRegisterProtocolHandler(ph_do);
80890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  base::MessageLoop::current()->Run();  // FILE thread needs to run.
8095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  delegate()->set_force_os_failure(true);
8105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  registry()->OnAcceptRegisterProtocolHandler(ph_dont);
81190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  base::MessageLoop::current()->Run();  // FILE thread needs to run.
8125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(registry()->IsHandledProtocol("do"));
8135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(static_cast<size_t>(1), registry()->GetHandlersFor("do").size());
8145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_FALSE(registry()->IsHandledProtocol("dont"));
8155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(static_cast<size_t>(1), registry()->GetHandlersFor("dont").size());
8165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
8175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(ProtocolHandlerRegistryTest, TestMaybeCreateTaskWorksFromIOThread) {
8195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ProtocolHandler ph1 = CreateProtocolHandler("mailto", "test1");
8205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  registry()->OnAcceptRegisterProtocolHandler(ph1);
8215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GURL url("mailto:someone@something.com");
8225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  scoped_ptr<net::URLRequestJobFactory> interceptor(
8242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      registry()->CreateJobInterceptorFactory());
8255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  AssertIntercepted(url, interceptor.get());
8265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
8275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(ProtocolHandlerRegistryTest,
8295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)       MAYBE_TestIsHandledProtocolWorksOnIOThread) {
8305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string scheme("mailto");
8315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ProtocolHandler ph1 = CreateProtocolHandler(scheme, "test1");
8325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  registry()->OnAcceptRegisterProtocolHandler(ph1);
8335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  scoped_ptr<ProtocolHandlerRegistry::JobInterceptorFactory> interceptor(
8352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      registry()->CreateJobInterceptorFactory());
8365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  AssertWillHandle(scheme, true, interceptor.get());
8375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
8385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(ProtocolHandlerRegistryTest, TestRemovingDefaultFallsBackToOldDefault) {
8405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ProtocolHandler ph1 = CreateProtocolHandler("mailto", "test1");
8415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ProtocolHandler ph2 = CreateProtocolHandler("mailto", "test2");
8425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ProtocolHandler ph3 = CreateProtocolHandler("mailto", "test3");
8435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  registry()->OnAcceptRegisterProtocolHandler(ph1);
8445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  registry()->OnAcceptRegisterProtocolHandler(ph2);
8455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  registry()->OnAcceptRegisterProtocolHandler(ph3);
8465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(registry()->IsDefault(ph3));
8485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  registry()->RemoveHandler(ph3);
8495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(registry()->IsDefault(ph2));
8505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  registry()->OnAcceptRegisterProtocolHandler(ph3);
8515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(registry()->IsDefault(ph3));
8525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  registry()->RemoveHandler(ph2);
8535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(registry()->IsDefault(ph3));
8545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  registry()->RemoveHandler(ph3);
8555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(registry()->IsDefault(ph1));
8565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
8575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(ProtocolHandlerRegistryTest, TestRemovingDefaultDoesntChangeHandlers) {
8595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ProtocolHandler ph1 = CreateProtocolHandler("mailto", "test1");
8605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ProtocolHandler ph2 = CreateProtocolHandler("mailto", "test2");
8615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ProtocolHandler ph3 = CreateProtocolHandler("mailto", "test3");
8625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  registry()->OnAcceptRegisterProtocolHandler(ph1);
8635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  registry()->OnAcceptRegisterProtocolHandler(ph2);
8645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  registry()->OnAcceptRegisterProtocolHandler(ph3);
8655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  registry()->RemoveHandler(ph3);
8665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ProtocolHandlerRegistry::ProtocolHandlerList handlers =
8685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      registry()->GetHandlersFor("mailto");
8695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(static_cast<size_t>(2), handlers.size());
8705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(ph2, handlers[0]);
8725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(ph1, handlers[1]);
8735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
8745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(ProtocolHandlerRegistryTest, MAYBE_TestClearDefaultGetsPropagatedToIO) {
8765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string scheme("mailto");
8775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ProtocolHandler ph1 = CreateProtocolHandler(scheme, "test1");
8785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  registry()->OnAcceptRegisterProtocolHandler(ph1);
8795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  registry()->ClearDefault(scheme);
8805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  scoped_ptr<ProtocolHandlerRegistry::JobInterceptorFactory> interceptor(
8822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      registry()->CreateJobInterceptorFactory());
8835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  AssertWillHandle(scheme, false, interceptor.get());
8845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
8855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(ProtocolHandlerRegistryTest, TestLoadEnabledGetsPropogatedToIO) {
8875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string mailto("mailto");
8885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ProtocolHandler ph1 = CreateProtocolHandler(mailto, "MailtoHandler");
8895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  registry()->OnAcceptRegisterProtocolHandler(ph1);
8905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  scoped_ptr<ProtocolHandlerRegistry::JobInterceptorFactory> interceptor(
8922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      registry()->CreateJobInterceptorFactory());
8935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  AssertWillHandle(mailto, true, interceptor.get());
8945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  registry()->Disable();
8955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  AssertWillHandle(mailto, false, interceptor.get());
8965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
8975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(ProtocolHandlerRegistryTest, TestReplaceHandler) {
899cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  ProtocolHandler ph1 =
900cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      CreateProtocolHandler("mailto", GURL("http://test.com/%s"));
901cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  ProtocolHandler ph2 =
902cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      CreateProtocolHandler("mailto", GURL("http://test.com/updated-url/%s"));
9035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  registry()->OnAcceptRegisterProtocolHandler(ph1);
9045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(registry()->AttemptReplace(ph2));
9055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const ProtocolHandler& handler(registry()->GetHandlerFor("mailto"));
9065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(handler.url(), ph2.url());
9075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
9085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(ProtocolHandlerRegistryTest, TestReplaceNonDefaultHandler) {
910cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  ProtocolHandler ph1 =
911cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      CreateProtocolHandler("mailto", GURL("http://test.com/%s"));
912cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  ProtocolHandler ph2 =
913cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      CreateProtocolHandler("mailto", GURL("http://test.com/updated-url/%s"));
914cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  ProtocolHandler ph3 =
915cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      CreateProtocolHandler("mailto", GURL("http://else.com/%s"));
9165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  registry()->OnAcceptRegisterProtocolHandler(ph1);
9175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  registry()->OnAcceptRegisterProtocolHandler(ph3);
9185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(registry()->AttemptReplace(ph2));
9195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const ProtocolHandler& handler(registry()->GetHandlerFor("mailto"));
9205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(handler.url(), ph3.url());
9215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
9225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(ProtocolHandlerRegistryTest, TestReplaceRemovesStaleHandlers) {
924cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  ProtocolHandler ph1 =
925cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      CreateProtocolHandler("mailto", GURL("http://test.com/%s"));
926cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  ProtocolHandler ph2 =
927cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      CreateProtocolHandler("mailto", GURL("http://test.com/updated-url/%s"));
928cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  ProtocolHandler ph3 =
929cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      CreateProtocolHandler("mailto", GURL("http://test.com/third/%s"));
9305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  registry()->OnAcceptRegisterProtocolHandler(ph1);
9315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  registry()->OnAcceptRegisterProtocolHandler(ph2);
9325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // This should replace the previous two handlers.
9345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(registry()->AttemptReplace(ph3));
9355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const ProtocolHandler& handler(registry()->GetHandlerFor("mailto"));
9365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(handler.url(), ph3.url());
9375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  registry()->RemoveHandler(ph3);
9385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(registry()->GetHandlerFor("mailto").IsEmpty());
9395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
9405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(ProtocolHandlerRegistryTest, TestIsSameOrigin) {
942cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  ProtocolHandler ph1 =
943cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      CreateProtocolHandler("mailto", GURL("http://test.com/%s"));
944cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  ProtocolHandler ph2 =
945cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      CreateProtocolHandler("mailto", GURL("http://test.com/updated-url/%s"));
946cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  ProtocolHandler ph3 =
947cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      CreateProtocolHandler("mailto", GURL("http://other.com/%s"));
9485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(ph1.url().GetOrigin() == ph2.url().GetOrigin(),
9495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      ph1.IsSameOrigin(ph2));
9505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(ph1.url().GetOrigin() == ph2.url().GetOrigin(),
9515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      ph2.IsSameOrigin(ph1));
9525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(ph2.url().GetOrigin() == ph3.url().GetOrigin(),
9535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      ph2.IsSameOrigin(ph3));
9545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(ph3.url().GetOrigin() == ph2.url().GetOrigin(),
9555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      ph3.IsSameOrigin(ph2));
9565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
9575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(ProtocolHandlerRegistryTest, MAYBE_TestInstallDefaultHandler) {
9595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  RecreateRegistry(false);
960cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  registry()->AddPredefinedHandler(
961cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      CreateProtocolHandler("test", GURL("http://test.com/%s")));
9625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  registry()->InitProtocolSettings();
9635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::vector<std::string> protocols;
9645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  registry()->GetRegisteredProtocols(&protocols);
9655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(static_cast<size_t>(1), protocols.size());
9665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
96746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
96846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)#define URL_p1u1 "http://p1u1.com/%s"
96946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)#define URL_p1u2 "http://p1u2.com/%s"
97046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)#define URL_p1u3 "http://p1u3.com/%s"
97146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)#define URL_p2u1 "http://p2u1.com/%s"
97246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)#define URL_p2u2 "http://p2u2.com/%s"
97346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)#define URL_p3u1 "http://p3u1.com/%s"
97446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
97546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)TEST_F(ProtocolHandlerRegistryTest, TestPrefPolicyOverlapRegister) {
97646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  base::ListValue handlers_registered_by_pref;
97746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  base::ListValue handlers_registered_by_policy;
97846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
97946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  handlers_registered_by_pref.Append(
98046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)      GetProtocolHandlerValueWithDefault("p1", URL_p1u2, true));
98146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  handlers_registered_by_pref.Append(
98246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)      GetProtocolHandlerValueWithDefault("p1", URL_p1u1, true));
98346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  handlers_registered_by_pref.Append(
98446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)      GetProtocolHandlerValueWithDefault("p1", URL_p1u2, false));
98546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
98646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  handlers_registered_by_policy.Append(
98746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)      GetProtocolHandlerValueWithDefault("p1", URL_p1u1, false));
98846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  handlers_registered_by_policy.Append(
98946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)      GetProtocolHandlerValueWithDefault("p3", URL_p3u1, true));
99046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
99146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  profile()->GetPrefs()->Set(prefs::kRegisteredProtocolHandlers,
99246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)                             handlers_registered_by_pref);
99346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  profile()->GetPrefs()->Set(prefs::kPolicyRegisteredProtocolHandlers,
99446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)                             handlers_registered_by_policy);
99546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  registry()->InitProtocolSettings();
99646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
99746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  // Duplicate p1u2 eliminated in memory but not yet saved in pref
99846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  ProtocolHandler p1u1 = CreateProtocolHandler("p1", GURL(URL_p1u1));
99946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  ProtocolHandler p1u2 = CreateProtocolHandler("p1", GURL(URL_p1u2));
100046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  ASSERT_EQ(InPrefHandlerCount(), 3);
100146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  ASSERT_EQ(InMemoryHandlerCount(), 3);
100246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  ASSERT_TRUE(registry()->IsDefault(p1u1));
100346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  ASSERT_FALSE(registry()->IsDefault(p1u2));
100446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
100546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  ProtocolHandler p2u1 = CreateProtocolHandler("p2", GURL(URL_p2u1));
100646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  registry()->OnDenyRegisterProtocolHandler(p2u1);
100746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
100846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  // Duplicate p1u2 saved in pref and a new handler added to pref and memory
100946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  ASSERT_EQ(InPrefHandlerCount(), 3);
101046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  ASSERT_EQ(InMemoryHandlerCount(), 4);
101146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  ASSERT_FALSE(registry()->IsDefault(p2u1));
101246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
101346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  registry()->RemoveHandler(p1u1);
101446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
101546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  // p1u1 removed from user pref but not from memory due to policy.
101646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  ASSERT_EQ(InPrefHandlerCount(), 2);
101746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  ASSERT_EQ(InMemoryHandlerCount(), 4);
101846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  ASSERT_TRUE(registry()->IsDefault(p1u1));
101946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
102046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  ProtocolHandler p3u1 = CreateProtocolHandler("p3", GURL(URL_p3u1));
102146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  registry()->RemoveHandler(p3u1);
102246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
102346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  // p3u1 not removed from memory due to policy and it was never in pref.
102446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  ASSERT_EQ(InPrefHandlerCount(), 2);
102546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  ASSERT_EQ(InMemoryHandlerCount(), 4);
102646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  ASSERT_TRUE(registry()->IsDefault(p3u1));
102746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
102846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  registry()->RemoveHandler(p1u2);
102946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
103046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  // p1u2 removed from user pref and memory.
103146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  ASSERT_EQ(InPrefHandlerCount(), 1);
103246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  ASSERT_EQ(InMemoryHandlerCount(), 3);
103346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  ASSERT_TRUE(registry()->IsDefault(p1u1));
103446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
103546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  ProtocolHandler p1u3 = CreateProtocolHandler("p1", GURL(URL_p1u3));
103646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  registry()->OnAcceptRegisterProtocolHandler(p1u3);
103746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
103846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  // p1u3 added to pref and memory.
103946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  ASSERT_EQ(InPrefHandlerCount(), 2);
104046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  ASSERT_EQ(InMemoryHandlerCount(), 4);
104146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  ASSERT_FALSE(registry()->IsDefault(p1u1));
104246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  ASSERT_TRUE(registry()->IsDefault(p1u3));
104346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
104446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  registry()->RemoveHandler(p1u3);
104546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
104646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  // p1u3 the default handler for p1 removed from user pref and memory.
104746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  ASSERT_EQ(InPrefHandlerCount(), 1);
104846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  ASSERT_EQ(InMemoryHandlerCount(), 3);
104946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  ASSERT_FALSE(registry()->IsDefault(p1u3));
105046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  ASSERT_TRUE(registry()->IsDefault(p1u1));
105146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  ASSERT_TRUE(registry()->IsDefault(p3u1));
105246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  ASSERT_FALSE(registry()->IsDefault(p2u1));
105346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)}
105446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
105546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)TEST_F(ProtocolHandlerRegistryTest, TestPrefPolicyOverlapIgnore) {
105646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  base::ListValue handlers_ignored_by_pref;
105746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  base::ListValue handlers_ignored_by_policy;
105846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
105946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  handlers_ignored_by_pref.Append(GetProtocolHandlerValue("p1", URL_p1u1));
106046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  handlers_ignored_by_pref.Append(GetProtocolHandlerValue("p1", URL_p1u2));
106146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  handlers_ignored_by_pref.Append(GetProtocolHandlerValue("p1", URL_p1u2));
106246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  handlers_ignored_by_pref.Append(GetProtocolHandlerValue("p3", URL_p3u1));
106346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
106446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  handlers_ignored_by_policy.Append(GetProtocolHandlerValue("p1", URL_p1u2));
106546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  handlers_ignored_by_policy.Append(GetProtocolHandlerValue("p1", URL_p1u3));
106646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  handlers_ignored_by_policy.Append(GetProtocolHandlerValue("p2", URL_p2u1));
106746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
106846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  profile()->GetPrefs()->Set(prefs::kIgnoredProtocolHandlers,
106946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)                             handlers_ignored_by_pref);
107046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  profile()->GetPrefs()->Set(prefs::kPolicyIgnoredProtocolHandlers,
107146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)                             handlers_ignored_by_policy);
107246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  registry()->InitProtocolSettings();
107346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
107446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  // Duplicate p1u2 eliminated in memory but not yet saved in pref
107546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  ASSERT_EQ(InPrefIgnoredHandlerCount(), 4);
107646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  ASSERT_EQ(InMemoryIgnoredHandlerCount(), 5);
107746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
107846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  ProtocolHandler p2u2 = CreateProtocolHandler("p2", GURL(URL_p2u2));
107946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  registry()->OnIgnoreRegisterProtocolHandler(p2u2);
108046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
108146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  // Duplicate p1u2 eliminated in pref, p2u2 added to pref and memory.
108246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  ASSERT_EQ(InPrefIgnoredHandlerCount(), 4);
108346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  ASSERT_EQ(InMemoryIgnoredHandlerCount(), 6);
108446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
108546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  ProtocolHandler p2u1 = CreateProtocolHandler("p2", GURL(URL_p2u1));
108646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  registry()->RemoveIgnoredHandler(p2u1);
108746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
108846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  // p2u1 installed by policy so cant be removed.
108946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  ASSERT_EQ(InPrefIgnoredHandlerCount(), 4);
109046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  ASSERT_EQ(InMemoryIgnoredHandlerCount(), 6);
109146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
109246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  ProtocolHandler p1u2 = CreateProtocolHandler("p1", GURL(URL_p1u2));
109346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  registry()->RemoveIgnoredHandler(p1u2);
109446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
109546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  // p1u2 installed by policy and pref so it is removed from pref and not from
109646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  // memory.
109746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  ASSERT_EQ(InPrefIgnoredHandlerCount(), 3);
109846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  ASSERT_EQ(InMemoryIgnoredHandlerCount(), 6);
109946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
110046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  ProtocolHandler p1u1 = CreateProtocolHandler("p1", GURL(URL_p1u1));
110146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  registry()->RemoveIgnoredHandler(p1u1);
110246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
110346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  // p1u1 installed by pref so it is removed from pref and memory.
110446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  ASSERT_EQ(InPrefIgnoredHandlerCount(), 2);
110546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  ASSERT_EQ(InMemoryIgnoredHandlerCount(), 5);
110646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
110746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  registry()->RemoveIgnoredHandler(p2u2);
110846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
110946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  // p2u2 installed by user so it is removed from pref and memory.
111046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  ASSERT_EQ(InPrefIgnoredHandlerCount(), 1);
111146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  ASSERT_EQ(InMemoryIgnoredHandlerCount(), 4);
111246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
111346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  registry()->OnIgnoreRegisterProtocolHandler(p2u1);
111446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
111546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  // p2u1 installed by user but it is already installed by policy, so it is
111646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  // added to pref.
111746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  ASSERT_EQ(InPrefIgnoredHandlerCount(), 2);
111846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  ASSERT_EQ(InMemoryIgnoredHandlerCount(), 4);
111946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
112046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  registry()->RemoveIgnoredHandler(p2u1);
112146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
112246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  // p2u1 installed by user and policy, so it is removed from pref alone.
112346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  ASSERT_EQ(InPrefIgnoredHandlerCount(), 1);
112446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  ASSERT_EQ(InMemoryIgnoredHandlerCount(), 4);
112546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)}
1126