// Copyright 2016 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 "core/loader/WorkletScriptLoader.h"

#include "bindings/core/v8/ScriptSourceCode.h"
#include "core/loader/FrameFetchContext.h"
#include "platform/loader/fetch/FetchInitiatorTypeNames.h"
#include "platform/loader/fetch/ResourceLoaderOptions.h"
#include "platform/wtf/WTF.h"

namespace blink {

WorkletScriptLoader::WorkletScriptLoader(ResourceFetcher* fetcher,
                                         Client* client)
    : fetcher_(fetcher), client_(client) {}

void WorkletScriptLoader::FetchScript(const KURL& module_url_record) {
  DCHECK(IsMainThread());
  DCHECK(!GetResource());
  DCHECK(!was_script_load_complete_);

  ResourceRequest resource_request(module_url_record);
  resource_request.SetRequestContext(WebURLRequest::kRequestContextScript);
  ResourceLoaderOptions options;
  options.initiator_info.name = FetchInitiatorTypeNames::internal;
  FetchParameters params(resource_request, options);
  ScriptResource* resource = ScriptResource::Fetch(params, fetcher_);
  if (!resource) {
    NotifyFinished(nullptr);
    return;
  }
  SetResource(resource);
  // notifyFinished() will be called later.
}

void WorkletScriptLoader::Cancel() {
  DCHECK(IsMainThread());
  if (!GetResource() || was_script_load_complete_)
    return;
  NotifyFinished(nullptr);
}

void WorkletScriptLoader::NotifyFinished(Resource* resource) {
  DCHECK(IsMainThread());
  DCHECK(!was_script_load_complete_);
  ClearResource();
  was_script_load_complete_ = true;
  if (!resource || resource->ErrorOccurred()) {
    client_->NotifyWorkletScriptLoadingFinished(this, ScriptSourceCode());
  } else {
    was_script_load_successful_ = true;
    client_->NotifyWorkletScriptLoadingFinished(
        this, ScriptSourceCode(static_cast<ScriptResource*>(resource)));
  }
  fetcher_ = nullptr;
  client_ = nullptr;
}

bool WorkletScriptLoader::WasScriptLoadSuccessful() const {
  DCHECK(was_script_load_complete_);
  return was_script_load_successful_;
}

DEFINE_TRACE(WorkletScriptLoader) {
  visitor->Trace(fetcher_);
  visitor->Trace(client_);
  ResourceOwner<ScriptResource, ScriptResourceClient>::Trace(visitor);
}

}  // namespace blink
