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