// 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/workers/ThreadedWorkletGlobalScope.h"

#include "core/inspector/ConsoleMessage.h"
#include "core/inspector/ConsoleMessageStorage.h"
#include "core/inspector/WorkerThreadDebugger.h"
#include "core/workers/WorkerReportingProxy.h"
#include "core/workers/WorkerThread.h"
#include "platform/weborigin/KURL.h"
#include "platform/weborigin/SecurityOrigin.h"
#include "public/platform/Platform.h"
#include "wtf/Assertions.h"
#include "wtf/RefPtr.h"

namespace blink {

ThreadedWorkletGlobalScope::ThreadedWorkletGlobalScope(
    const KURL& url,
    const String& userAgent,
    PassRefPtr<SecurityOrigin> securityOrigin,
    v8::Isolate* isolate,
    WorkerThread* thread)
    : WorkletGlobalScope(url, userAgent, std::move(securityOrigin), isolate),
      m_thread(thread) {}

ThreadedWorkletGlobalScope::~ThreadedWorkletGlobalScope() {
  DCHECK(!m_thread);
}

void ThreadedWorkletGlobalScope::countFeature(UseCounter::Feature feature) {
  DCHECK(isContextThread());
  DCHECK(m_thread);
  m_thread->workerReportingProxy().countFeature(feature);
}

void ThreadedWorkletGlobalScope::countDeprecation(UseCounter::Feature feature) {
  DCHECK(isContextThread());
  DCHECK(m_thread);
  addDeprecationMessage(feature);
  m_thread->workerReportingProxy().countDeprecation(feature);
}

void ThreadedWorkletGlobalScope::dispose() {
  DCHECK(isContextThread());
  WorkletGlobalScope::dispose();
  m_thread = nullptr;
}

bool ThreadedWorkletGlobalScope::isContextThread() const {
  return thread()->isCurrentThread();
}

void ThreadedWorkletGlobalScope::addConsoleMessage(
    ConsoleMessage* consoleMessage) {
  DCHECK(isContextThread());
  thread()->workerReportingProxy().reportConsoleMessage(
      consoleMessage->source(), consoleMessage->level(),
      consoleMessage->message(), consoleMessage->location());
  thread()->consoleMessageStorage()->addConsoleMessage(this, consoleMessage);
}

void ThreadedWorkletGlobalScope::exceptionThrown(ErrorEvent* errorEvent) {
  DCHECK(isContextThread());
  if (WorkerThreadDebugger* debugger =
          WorkerThreadDebugger::from(thread()->isolate()))
    debugger->exceptionThrown(m_thread, errorEvent);
}

}  // namespace blink
