// Copyright (c) 2012 The Chromium Embedded Framework 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 "include/cef_trace.h"
#include "libcef/browser/context.h"
#include "libcef/browser/thread_util.h"
#include "libcef/browser/trace_subscriber.h"

#include "base/time/time.h"

bool CefBeginTracing(const CefString& categories,
                     CefRefPtr<CefCompletionCallback> callback) {
  if (!CONTEXT_STATE_VALID()) {
    NOTREACHED() << "context not valid";
    return false;
  }

  if (!CEF_CURRENTLY_ON_UIT()) {
    NOTREACHED() << "called on invalid thread";
    return false;
  }

  CefTraceSubscriber* subscriber = CefContext::Get()->GetTraceSubscriber();
  if (!subscriber)
    return false;

  return subscriber->BeginTracing(categories, callback);
}

bool CefEndTracing(const CefString& tracing_file,
                   CefRefPtr<CefEndTracingCallback> callback) {
  if (!CONTEXT_STATE_VALID()) {
    NOTREACHED() << "context not valid";
    return false;
  }

  if (!CEF_CURRENTLY_ON_UIT()) {
    NOTREACHED() << "called on invalid thread";
    return false;
  }

  CefTraceSubscriber* subscriber = CefContext::Get()->GetTraceSubscriber();
  if (!subscriber)
    return false;

  return subscriber->EndTracing(base::FilePath(tracing_file), callback);
}

int64 CefNowFromSystemTraceTime() {
  return base::TimeTicks::Now().ToInternalValue();
}
