/*
 * Copyright (c) 2015 Canon Inc. All rights reserved.
 * Copyright (c) 2015 Igalia
 * Copyright (c) 2015 Igalia S.L.
 * Copyright (c) 2015 Igalia.
 * Copyright (c) 2015, 2016 Canon Inc.
 * Copyright (c) 2015, 2016 Ericsson AB. All rights reserved.
 * Copyright (c) 2016 Apple Inc.
 * Copyright (c) 2016 Apple 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:
 * 1. Redistributions of source code must retain the above copyright
 *    notice, this list of conditions and the following disclaimer.
 * 2. 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.
 * 
 * THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS 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 APPLE INC. OR ITS 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.
 * 
 */

// DO NOT EDIT THIS FILE. It is automatically generated from JavaScript files for
// builtins by the script: Source/JavaScriptCore/Scripts/generate-js-builtins.py

#pragma once

#include "FetchInternalsBuiltins.h"
#include "RTCPeerConnectionInternalsBuiltins.h"
#include "ReadableStreamInternalsBuiltins.h"
#include "StreamInternalsBuiltins.h"
#include "WritableStreamInternalsBuiltins.h"
#include <heap/WeakInlines.h>
#include <runtime/VM.h>

namespace WebCore {

class JSDOMGlobalObject;

class JSBuiltinInternalFunctions {
public:
    explicit JSBuiltinInternalFunctions(JSC::VM&);

    void visit(JSC::SlotVisitor&);
    void initialize(JSDOMGlobalObject&);

#if ENABLE(FETCH_API)
    FetchInternalsBuiltinFunctions& fetchInternals() { return m_fetchInternals; }
#endif // ENABLE(FETCH_API)
#if ENABLE(WEB_RTC)
    RTCPeerConnectionInternalsBuiltinFunctions& rtcPeerConnectionInternals() { return m_rtcPeerConnectionInternals; }
#endif // ENABLE(WEB_RTC)
#if ENABLE(READABLE_STREAM_API)
    ReadableStreamInternalsBuiltinFunctions& readableStreamInternals() { return m_readableStreamInternals; }
#endif // ENABLE(READABLE_STREAM_API)
#if ENABLE(READABLE_STREAM_API) || ENABLE(WRITABLE_STREAM_API)
    StreamInternalsBuiltinFunctions& streamInternals() { return m_streamInternals; }
#endif // ENABLE(READABLE_STREAM_API) || ENABLE(WRITABLE_STREAM_API)
#if ENABLE(WRITABLE_STREAM_API)
    WritableStreamInternalsBuiltinFunctions& writableStreamInternals() { return m_writableStreamInternals; }
#endif // ENABLE(WRITABLE_STREAM_API)

private:
#if ENABLE(WEB_RTC) || ENABLE(FETCH_API) || ENABLE(READABLE_STREAM_API) || ENABLE(WRITABLE_STREAM_API) || ENABLE(READABLE_STREAM_API) || ENABLE(WRITABLE_STREAM_API)
    JSC::VM& m_vm;
#endif // ENABLE(WEB_RTC) || ENABLE(FETCH_API) || ENABLE(READABLE_STREAM_API) || ENABLE(WRITABLE_STREAM_API) || ENABLE(READABLE_STREAM_API) || ENABLE(WRITABLE_STREAM_API)
#if ENABLE(FETCH_API)
    FetchInternalsBuiltinFunctions m_fetchInternals;
#endif // ENABLE(FETCH_API)
#if ENABLE(WEB_RTC)
    RTCPeerConnectionInternalsBuiltinFunctions m_rtcPeerConnectionInternals;
#endif // ENABLE(WEB_RTC)
#if ENABLE(READABLE_STREAM_API)
    ReadableStreamInternalsBuiltinFunctions m_readableStreamInternals;
#endif // ENABLE(READABLE_STREAM_API)
#if ENABLE(READABLE_STREAM_API) || ENABLE(WRITABLE_STREAM_API)
    StreamInternalsBuiltinFunctions m_streamInternals;
#endif // ENABLE(READABLE_STREAM_API) || ENABLE(WRITABLE_STREAM_API)
#if ENABLE(WRITABLE_STREAM_API)
    WritableStreamInternalsBuiltinFunctions m_writableStreamInternals;
#endif // ENABLE(WRITABLE_STREAM_API)
};

} // namespace WebCore
