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

typedef double DOMHighResTimeStamp;

[
    Exposed=(Window,Worker),
    GenerateIsReachable=ImplScriptExecutionContext,
] interface Performance : EventTarget {

    DOMHighResTimeStamp now();

    // https://w3c.github.io/navigation-timing/
    readonly attribute PerformanceNavigation navigation;
    readonly attribute PerformanceTiming timing;

    // https://w3c.github.io/performance-timeline/
    [EnabledAtRuntime=PerformanceTimeline] PerformanceEntryList getEntries();
    [EnabledAtRuntime=PerformanceTimeline] PerformanceEntryList getEntriesByType(DOMString entryType);
    [EnabledAtRuntime=PerformanceTimeline] PerformanceEntryList getEntriesByName(DOMString name, optional DOMString entryType);

    // https://w3c.github.io/resource-timing/
    [EnabledAtRuntime=ResourceTiming] void clearResourceTimings();
    [EnabledAtRuntime=ResourceTiming] void setResourceTimingBufferSize(unsigned long maxSize);
    [EnabledAtRuntime=ResourceTiming] attribute EventHandler onresourcetimingbufferfull;

    // https://w3c.github.io/user-timing/
    [EnabledAtRuntime=UserTiming, MayThrowException] void mark(DOMString markName);
    [EnabledAtRuntime=UserTiming] void clearMarks(optional DOMString markName);
    [EnabledAtRuntime=UserTiming, MayThrowException] void measure(DOMString measureName, optional DOMString startMark, optional DOMString endMark);
    [EnabledAtRuntime=UserTiming] void clearMeasures(optional DOMString measureName);
};

typedef sequence<PerformanceEntry> PerformanceEntryList;
