// 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.
  //     Inclusive.
  //   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. Reapplies after client resumes from idle
  //     state due to application state changes.
  //   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 since the last
  // call. Clears internal cache of Watchdog violations to prevent duplicates.
  DOMString getWatchdogViolations();

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

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