/*
 * Copyright (C) 2010 Google Inc. All rights reserved.
 * Copyright (C) 2012 Intel Inc. All rights reserved.
 *
 * Redistribution and use in source and binary forms, with or without
 * modification, are permitted provided that the following conditions are
 * met:
 *
 *     * Redistributions of source code must retain the above copyright
 * notice, this list of conditions and the following disclaimer.
 *     * Redistributions in binary form must reproduce the above
 * copyright notice, this list of conditions and the following disclaimer
 * in the documentation and/or other materials provided with the
 * distribution.
 *     * Neither the name of Google Inc. nor the names of its
 * contributors may be used to endorse or promote products derived from
 * this software without specific prior written permission.
 *
 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
 * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
 * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
 * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 */

// https://w3c.github.io/hr-time/#the-performance-interface

// TODO(foolip): None of the optional DOMString arguments in this interface
// should have a default value.
[Exposed=(Window,Worker)]
interface Performance : EventTarget {
    [Affects=Nothing] DOMHighResTimeStamp now();
    readonly attribute DOMHighResTimeStamp timeOrigin;

    // Performance Timeline
    // https://w3c.github.io/performance-timeline/#the-performance-interface
    // TODO(foolip): getEntries() should take an optional FilterOptions argument.
    [MeasureAs=PerformanceTimeline] PerformanceEntryList getEntries();
    [MeasureAs=PerformanceTimeline] PerformanceEntryList getEntriesByType(DOMString entryType);
    [MeasureAs=PerformanceTimeline] PerformanceEntryList getEntriesByName(DOMString name, optional DOMString entryType = null);

    // Resource Timing
    // https://w3c.github.io/resource-timing/#extensions-performance-interface
    void clearResourceTimings();
    void setResourceTimingBufferSize(unsigned long maxSize);
    attribute EventHandler onresourcetimingbufferfull;

    // Event Timing
    // https://github.com/wicg/event-timing
    [MeasureAs=PerformanceEventTimingBuffer, OriginTrialEnabled=EventTiming] void clearEventTimings();
    [MeasureAs=PerformanceEventTimingBuffer, OriginTrialEnabled=EventTiming] void setEventTimingBufferMaxSize(unsigned long maxSize);
    [MeasureAs=PerformanceEventTimingBuffer, OriginTrialEnabled=EventTiming] attribute EventHandler oneventtimingbufferfull;

    // Navigation Timing
    // https://w3c.github.io/navigation-timing/#extensions-to-the-performance-interface
    [Exposed=Window, SameObject, Measure] readonly attribute PerformanceTiming timing;
    [Exposed=Window, SameObject, Measure] readonly attribute PerformanceNavigation navigation;

    // User Timing
    // https://w3c.github.io/user-timing/#extensions-performance-interface
    // We use the returned value for feature detection:
    // * L2 API returns null but this is a bug: crbug.com/914441.
    // * L3 API returns the created entry.
    [MeasureAs=UserTiming, CallWith=ScriptState, RaisesException] PerformanceMark? mark(DOMString markName);
    [MeasureAs=UserTiming, CallWith=ScriptState, RuntimeEnabled=CustomUserTiming, RaisesException] PerformanceMark? mark(DOMString markName, (DOMHighResTimeStamp or PerformanceMarkOptions) startTimeOrPerformanceMarkOptions);
    [MeasureAs=UserTiming] void clearMarks(optional DOMString markName = null);

    // Doing either of the following requires enabling CustomUserTiming:
    // * passing PerformanceMeasureOptions to |startOrOptions|
    // * passing timestamps to |startOrOptions| or |end|
    // We use the returned value for feature detection:
    // * L2 API returns null but this is a bug: crbug.com/914441.
    // * L3 API returns the created entry.
    // Custom User Timing (or User Timing L3) explainer:
    // https://docs.google.com/document/d/1hltt8z9C4PaI5Qu1YMIp1wOGdbJPJPoJwBarEeCY6xQ/edit#heading=h.ejti6qhmjv0b
    [MeasureAs=UserTiming, CallWith=ScriptState, RaisesException] PerformanceMeasure? measure(DOMString measureName, optional (DOMString or DOMHighResTimeStamp or PerformanceMeasureOptions)? startOrOptions, optional (DOMString or DOMHighResTimeStamp)? end);
    [MeasureAs=UserTiming] void clearMeasures(optional DOMString measureName = null);

    // TODO(foolip): There is no spec for the Memory Info API, see blink-dev:
    // https://groups.google.com/a/chromium.org/d/msg/blink-dev/g5YRCGpC9vs/b4OJz71NmPwJ
    [Exposed=Window, Measure] readonly attribute MemoryInfo memory;

    // TODO(npm): This is an experimental attribute with no current plan to standardize. Remove once experiment has concluded. Only exposed to Window because we do not consider worker threads to contain high priority work.
    [Exposed=Window, RuntimeEnabled=ExperimentalShouldYield] readonly attribute boolean shouldYield;

    serializer = {attribute};
};
