// Copyright 2017 The Cobalt Authors. All Rights Reserved.
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
//     http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.

interface H5vccTraceEvent {
  // If an output filename is provided, the tracing output will be sent to
  // that file (relative to a platform-specific directory).  If no output
  // filename is provided, a default filename of "h5vcc_trace_event.json"
  // will be used.
  void start(optional DOMString output_filename = "");
  void stop();

  void traceBegin(DOMString category, DOMString name);
  void traceEnd(DOMString category, DOMString name);

  void traceIntBegin(DOMString category, DOMString name,
                     DOMString arg1_name, long arg1_value);
  void traceIntEnd(DOMString category, DOMString name,
                   DOMString arg1_name, long arg1_value);

  void traceFloatBegin(DOMString category, DOMString name,
                       DOMString arg1_name, float arg1_value);
  void traceFloatEnd(DOMString category, DOMString name,
                     DOMString arg1_name, float arg1_value);

  void traceStringBegin(DOMString category, DOMString name,
                        DOMString arg1_name, DOMString arg1_value);
  void traceStringEnd(DOMString category, DOMString name,
                      DOMString arg1_name, DOMString arg1_value);
};
