// Copyright (c) 2014 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 "ModulesInitializer.h"

#include "bindings/modules/v8/ModuleBindingsInitializer.h"
#include "core/EventTypeNames.h"
#include "core/css/CSSPaintImageGenerator.h"
#include "core/dom/Document.h"
#include "core/html/HTMLCanvasElement.h"
#include "core/offscreencanvas/OffscreenCanvas.h"
#include "modules/EventModulesFactory.h"
#include "modules/EventModulesNames.h"
#include "modules/EventTargetModulesNames.h"
#include "modules/IndexedDBNames.h"
#include "modules/accessibility/AXObjectCacheImpl.h"
#include "modules/canvas2d/CanvasRenderingContext2D.h"
#include "modules/compositorworker/CompositorWorkerThread.h"
#include "modules/csspaint/CSSPaintImageGeneratorImpl.h"
#include "modules/filesystem/DraggedIsolatedFileSystemImpl.h"
#include "modules/imagebitmap/ImageBitmapRenderingContext.h"
#include "modules/offscreencanvas2d/OffscreenCanvasRenderingContext2D.h"
#include "modules/time_zone_monitor/TimeZoneMonitorClient.h"
#include "modules/webdatabase/DatabaseManager.h"
#include "modules/webgl/WebGL2RenderingContext.h"
#include "modules/webgl/WebGLRenderingContext.h"
#include "platform/mojo/MojoHelper.h"
#include "wtf/PtrUtil.h"

namespace blink {

void ModulesInitializer::initialize() {
  ASSERT(!isInitialized());

  // Strings must be initialized before calling CoreInitializer::init().
  const unsigned modulesStaticStringsCount =
      EventNames::EventModulesNamesCount +
      EventTargetNames::EventTargetModulesNamesCount +
      IndexedDBNames::IndexedDBNamesCount;
  StringImpl::reserveStaticStringsCapacityForSize(modulesStaticStringsCount);

  EventNames::initModules();
  EventTargetNames::initModules();
  Document::registerEventFactory(EventModulesFactory::create());
  ModuleBindingsInitializer::init();
  IndexedDBNames::init();
  AXObjectCache::init(AXObjectCacheImpl::create);
  DraggedIsolatedFileSystem::init(
      DraggedIsolatedFileSystemImpl::prepareForDataObject);
  CSSPaintImageGenerator::init(CSSPaintImageGeneratorImpl::create);
  // Some unit tests may have no message loop ready, so we can't initialize the
  // mojo stuff here. They can initialize those mojo stuff they're interested in
  // later after they got a message loop ready.
  if (canInitializeMojo())
    TimeZoneMonitorClient::Init();

  CoreInitializer::initialize();

  // Canvas context types must be registered with the HTMLCanvasElement.
  HTMLCanvasElement::registerRenderingContextFactory(
      makeUnique<CanvasRenderingContext2D::Factory>());
  HTMLCanvasElement::registerRenderingContextFactory(
      makeUnique<WebGLRenderingContext::Factory>());
  HTMLCanvasElement::registerRenderingContextFactory(
      makeUnique<WebGL2RenderingContext::Factory>());
  HTMLCanvasElement::registerRenderingContextFactory(
      makeUnique<ImageBitmapRenderingContext::Factory>());

  // OffscreenCanvas context types must be registered with the OffscreenCanvas.
  OffscreenCanvas::registerRenderingContextFactory(
      makeUnique<OffscreenCanvasRenderingContext2D::Factory>());
  OffscreenCanvas::registerRenderingContextFactory(
      makeUnique<WebGLRenderingContext::Factory>());
  OffscreenCanvas::registerRenderingContextFactory(
      makeUnique<WebGL2RenderingContext::Factory>());

  ASSERT(isInitialized());
}

void ModulesInitializer::shutdown() {
  ASSERT(isInitialized());
  DatabaseManager::terminateDatabaseThread();
  CoreInitializer::shutdown();
  CompositorWorkerThread::clearSharedBackingThread();
}

}  // namespace blink
