// 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.

// Defines an interface for setting arbitrary values to be logged (in a
// platform-specific way) whenever a crash occurs.  For example, a platform
// may implement this by uploading the data to a central crash report
// repository that can be examined later.
// Platforms typically have maximum crash log data sizes on the order of 16KB,
// but it varies per platform.
interface H5vccCrashLog {
  // Returns true if the string was successfully set in the crash log, and false
  // if for some reason the string could not be set in the crash log.
  // Sets a (key, value) string pair that should be logged if a crash occurs.
  boolean setString(DOMString key, DOMString value);

  // Induce a crash. This attempts, but does not guarantee, to cause a specified
  // type of crash. The result may vary by platform. This API is intended for
  // reliability testing only.
  void triggerCrash(H5vccCrashType intent);

  // Returns true if Watchdog client was registered.
  //   name, Watchdog client to register.
  //   description, information on the Watchdog client.
  //   monitor_state, application state up to which the client is monitored.
  //   time_interval, maximum number of microseconds allowed between pings
  //     before triggering a Watchdog violation.
  //   time_wait, number of microseconds to initially wait before Watchdog
  //     violations can be triggered.
  //   replace, behavior with previously registered Watchdog clients of the
  //     same name.
  boolean register(DOMString name, DOMString description,
                   WatchdogState watchdog_state, long long time_interval,
                   long long time_wait, WatchdogReplace watchdog_replace);

  // Returns true if Watchdog client was unregistered. Name determines the
  // Watchdog client to unregister.
  boolean unregister(DOMString name);

  // Returns true if Watchdog client was pinged. Name determines the Watchdog
  // client to ping with ping_info which can either be empty or contain relevant
  // metadata.
  boolean ping(DOMString name, DOMString ping_info);

  // Returns a json string containing the Watchdog violations. Current boolean
  // determines whether the current file representing ongoing violations or the
  // previous file containing violations from previous app starts and since the
  // last call (up to a limit) is returned.
  DOMString getWatchdogViolations(boolean current);

  // Gets a persistent Watchdog setting that determines whether or not a
  // Watchdog violation will trigger a crash.
  boolean getCanTriggerCrash();

  // Sets a persistent Watchdog setting that determines whether or not a
  // Watchdog violation will trigger a crash.
  void setCanTriggerCrash(boolean can_trigger_crash);
};
