/*
 * 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 communicate with the debugger, modeled after
// chrome.debugger extension API.
// https://developer.chrome.com/extensions/debugger

[
  Conditional=ENABLE_DEBUG_CONSOLE
] interface Debugger {

  void attach(AttachCallback cb);
  void detach(AttachCallback cb);
  void sendCommand(DOMString method, DOMString jsonParams, CommandCallback cb);

  readonly attribute DOMString? lastError;
  readonly attribute DebuggerEventTarget onEvent;
};

callback AttachCallback = void();
callback CommandCallback = void(DOMString? response);
