// Copyright 2015 Google Inc. 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.

// Custom interface to access debugging functionalities.
// TODO: provide link to design doc.

[
  Conditional=ENABLE_DEBUG_CONSOLE
] interface DebugHub {
  const long LOG_INFO = 0;
  const long LOG_WARNING = 1;
  const long LOG_ERROR = 2;
  const long LOG_ERROR_REPORT = 3;
  const long LOG_FATAL = 4;

  const long DEBUG_CONSOLE_OFF = 0;
  const long DEBUG_CONSOLE_HUD = 1;
  const long DEBUG_CONSOLE_ON = 2;

  readonly attribute Debugger debugger;

  void setLogMessageCallback(LogMessageCallback cb);

  DOMString getConsoleValueNames();
  DOMString getConsoleValue(DOMString name);

  long getDebugConsoleMode();

  DOMString getCommandChannels();
  DOMString getCommandChannelShortHelp(DOMString command);
  DOMString getCommandChannelLongHelp(DOMString command);
  void sendCommand(DOMString channel, DOMString message);
};

callback LogMessageCallback = void(long severity, DOMString file, long line,
                                   long message_start, DOMString message);
