// Copyright (c) 2012 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

#include "chrome/browser/custom_handlers/protocol_handler_registry_factory.h"

#include "base/memory/singleton.h"
#include "chrome/browser/custom_handlers/protocol_handler_registry.h"
#include "chrome/browser/extensions/extension_system_factory.h"
#include "chrome/browser/profiles/incognito_helpers.h"
#include "chrome/browser/profiles/profile.h"
#include "components/browser_context_keyed_service/browser_context_dependency_manager.h"

// static
ProtocolHandlerRegistryFactory* ProtocolHandlerRegistryFactory::GetInstance() {
  return Singleton<ProtocolHandlerRegistryFactory>::get();
}

// static
ProtocolHandlerRegistry* ProtocolHandlerRegistryFactory::GetForProfile(
    Profile* profile) {
  return static_cast<ProtocolHandlerRegistry*>(
      GetInstance()->GetServiceForBrowserContext(profile, true));
}

ProtocolHandlerRegistryFactory::ProtocolHandlerRegistryFactory()
    : BrowserContextKeyedServiceFactory(
        "ProtocolHandlerRegistry",
        BrowserContextDependencyManager::GetInstance()) {
}

ProtocolHandlerRegistryFactory::~ProtocolHandlerRegistryFactory() {
}

// Will be created when initializing profile_io_data, so we might
// as well have the framework create this along with other
// PKSs to preserve orderly civic conduct :)
bool
ProtocolHandlerRegistryFactory::ServiceIsCreatedWithBrowserContext() const {
  return true;
}

// Allows the produced registry to be used in incognito mode.
content::BrowserContext* ProtocolHandlerRegistryFactory::GetBrowserContextToUse(
    content::BrowserContext* context) const {
  return chrome::GetBrowserContextRedirectedInIncognito(context);
}

// Do not create this service for tests. MANY tests will fail
// due to the threading requirements of this service. ALSO,
// not creating this increases test isolation (which is GOOD!)
bool ProtocolHandlerRegistryFactory::ServiceIsNULLWhileTesting() const {
  return true;
}

BrowserContextKeyedService*
ProtocolHandlerRegistryFactory::BuildServiceInstanceFor(
    content::BrowserContext* profile) const {
  ProtocolHandlerRegistry* registry = new ProtocolHandlerRegistry(
      static_cast<Profile*>(profile), new ProtocolHandlerRegistry::Delegate());

#if defined(OS_CHROMEOS)
  // If installing defaults, they must be installed prior calling
  // InitProtocolSettings
  registry->InstallDefaultsForChromeOS();
#endif

  // Must be called as a part of the creation process.
  registry->InitProtocolSettings();

  return registry;
}
