// Copyright 2019 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 <utility>

#include "third_party/blink/renderer/modules/worklet/worklet_thread_test_common.h"

#include "third_party/blink/public/mojom/script/script_type.mojom-blink.h"
#include "third_party/blink/renderer/core/dom/document.h"
#include "third_party/blink/renderer/core/inspector/worker_devtools_params.h"
#include "third_party/blink/renderer/core/origin_trials/origin_trial_context.h"
#include "third_party/blink/renderer/core/testing/page_test_base.h"
#include "third_party/blink/renderer/core/workers/global_scope_creation_params.h"
#include "third_party/blink/renderer/core/workers/worker_reporting_proxy.h"
#include "third_party/blink/renderer/modules/animationworklet/animation_worklet_proxy_client.h"
#include "third_party/blink/renderer/modules/csspaint/paint_worklet_proxy_client.h"

namespace blink {

namespace {

std::unique_ptr<AnimationAndPaintWorkletThread>
CreateAnimationAndPaintWorkletThread(
    Document* document,
    WorkerReportingProxy* reporting_proxy,
    WorkerClients* clients,
    std::unique_ptr<AnimationAndPaintWorkletThread> thread) {
  thread->Start(
      std::make_unique<GlobalScopeCreationParams>(
          document->Url(), mojom::ScriptType::kModule,
          OffMainThreadWorkerScriptFetchOption::kEnabled, "Worklet",
          document->UserAgent(), nullptr /* web_worker_fetch_context */,
          Vector<CSPHeaderAndType>(), document->GetReferrerPolicy(),
          document->GetSecurityOrigin(), document->IsSecureContext(),
          document->GetHttpsState(), clients, document->AddressSpace(),
          OriginTrialContext::GetTokens(document).get(),
          base::UnguessableToken::Create(), nullptr /* worker_settings */,
          kV8CacheOptionsDefault,
          MakeGarbageCollected<WorkletModuleResponsesMap>()),
      base::nullopt, std::make_unique<WorkerDevToolsParams>(),
      ParentExecutionContextTaskRunners::Create());
  return thread;
}

}  // namespace

std::unique_ptr<AnimationAndPaintWorkletThread>
CreateThreadAndProvidePaintWorkletProxyClient(
    Document* document,
    WorkerReportingProxy* reporting_proxy,
    PaintWorkletProxyClient* proxy_client) {
  if (!proxy_client)
    proxy_client = MakeGarbageCollected<PaintWorkletProxyClient>();
  WorkerClients* clients = WorkerClients::Create();
  ProvidePaintWorkletProxyClientTo(clients, proxy_client);

  std::unique_ptr<AnimationAndPaintWorkletThread> thread =
      AnimationAndPaintWorkletThread::CreateForPaintWorklet(*reporting_proxy);
  return CreateAnimationAndPaintWorkletThread(document, reporting_proxy,
                                              clients, std::move(thread));
}

std::unique_ptr<AnimationAndPaintWorkletThread>
CreateThreadAndProvideAnimationWorkletProxyClient(
    Document* document,
    WorkerReportingProxy* reporting_proxy,
    AnimationWorkletProxyClient* proxy_client) {
  if (!proxy_client) {
    proxy_client = MakeGarbageCollected<AnimationWorkletProxyClient>(
        1, nullptr, /* mutator_dispatcher */
        nullptr,    /* mutator_runner */
        nullptr,    /* mutator_dispatcher */
        nullptr     /* mutator_runner */
    );
  }
  WorkerClients* clients = WorkerClients::Create();
  ProvideAnimationWorkletProxyClientTo(clients, proxy_client);

  std::unique_ptr<AnimationAndPaintWorkletThread> thread =
      AnimationAndPaintWorkletThread::CreateForAnimationWorklet(
          *reporting_proxy);
  return CreateAnimationAndPaintWorkletThread(document, reporting_proxy,
                                              clients, std::move(thread));
}

}  // namespace blink
