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

// 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.
[
  Conditional=COBALT_ENABLE_CRASH_LOG
]
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);
};
