/*
 * 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 "ByteLengthQueuingStrategyBuiltins.h"
#include "CountQueuingStrategyBuiltins.h"
#include "DOMWindowFetchBuiltins.h"
#include "FetchHeadersBuiltins.h"
#include "FetchInternalsBuiltins.h"
#include "FetchRequestBuiltins.h"
#include "FetchResponseBuiltins.h"
#include "NavigatorUserMediaBuiltins.h"
#include "RTCPeerConnectionBuiltins.h"
#include "RTCPeerConnectionInternalsBuiltins.h"
#include "ReadableStreamBuiltins.h"
#include "ReadableStreamDefaultControllerBuiltins.h"
#include "ReadableStreamDefaultReaderBuiltins.h"
#include "ReadableStreamInternalsBuiltins.h"
#include "StreamInternalsBuiltins.h"
#include "WorkerGlobalScopeFetchBuiltins.h"
#include "WritableStreamBuiltins.h"
#include "WritableStreamInternalsBuiltins.h"
#include "XMLHttpRequestBuiltins.h"
#include <runtime/VM.h>

namespace WebCore {

class JSBuiltinFunctions {
public:
    explicit JSBuiltinFunctions(JSC::VM& vm)
        : m_vm(vm)
#if ENABLE(FETCH_API)
        , m_domWindowFetchBuiltins(&m_vm)
#endif // ENABLE(FETCH_API)
#if ENABLE(FETCH_API)
        , m_fetchHeadersBuiltins(&m_vm)
#endif // ENABLE(FETCH_API)
#if ENABLE(FETCH_API)
        , m_fetchInternalsBuiltins(&m_vm)
#endif // ENABLE(FETCH_API)
#if ENABLE(FETCH_API)
        , m_fetchRequestBuiltins(&m_vm)
#endif // ENABLE(FETCH_API)
#if ENABLE(FETCH_API)
        , m_fetchResponseBuiltins(&m_vm)
#endif // ENABLE(FETCH_API)
#if ENABLE(FETCH_API)
        , m_workerGlobalScopeFetchBuiltins(&m_vm)
#endif // ENABLE(FETCH_API)
#if ENABLE(MEDIA_STREAM)
        , m_navigatorUserMediaBuiltins(&m_vm)
#endif // ENABLE(MEDIA_STREAM)
#if ENABLE(WEB_RTC)
        , m_rtcPeerConnectionBuiltins(&m_vm)
#endif // ENABLE(WEB_RTC)
#if ENABLE(WEB_RTC)
        , m_rtcPeerConnectionInternalsBuiltins(&m_vm)
#endif // ENABLE(WEB_RTC)
#if ENABLE(READABLE_STREAM_API) || ENABLE(WRITABLE_STREAM_API)
        , m_byteLengthQueuingStrategyBuiltins(&m_vm)
#endif // ENABLE(READABLE_STREAM_API) || ENABLE(WRITABLE_STREAM_API)
#if ENABLE(READABLE_STREAM_API) || ENABLE(WRITABLE_STREAM_API)
        , m_countQueuingStrategyBuiltins(&m_vm)
#endif // ENABLE(READABLE_STREAM_API) || ENABLE(WRITABLE_STREAM_API)
#if ENABLE(READABLE_STREAM_API)
        , m_readableStreamBuiltins(&m_vm)
#endif // ENABLE(READABLE_STREAM_API)
#if ENABLE(READABLE_STREAM_API)
        , m_readableStreamDefaultControllerBuiltins(&m_vm)
#endif // ENABLE(READABLE_STREAM_API)
#if ENABLE(READABLE_STREAM_API)
        , m_readableStreamDefaultReaderBuiltins(&m_vm)
#endif // ENABLE(READABLE_STREAM_API)
#if ENABLE(READABLE_STREAM_API)
        , m_readableStreamInternalsBuiltins(&m_vm)
#endif // ENABLE(READABLE_STREAM_API)
#if ENABLE(READABLE_STREAM_API) || ENABLE(WRITABLE_STREAM_API)
        , m_streamInternalsBuiltins(&m_vm)
#endif // ENABLE(READABLE_STREAM_API) || ENABLE(WRITABLE_STREAM_API)
#if ENABLE(WRITABLE_STREAM_API)
        , m_writableStreamBuiltins(&m_vm)
#endif // ENABLE(WRITABLE_STREAM_API)
#if ENABLE(WRITABLE_STREAM_API)
        , m_writableStreamInternalsBuiltins(&m_vm)
#endif // ENABLE(WRITABLE_STREAM_API)
        , m_xmlHttpRequestBuiltins(&m_vm)
    {
#if ENABLE(FETCH_API)
        m_fetchInternalsBuiltins.exportNames();
#endif // ENABLE(FETCH_API)
#if ENABLE(WEB_RTC)
        m_rtcPeerConnectionInternalsBuiltins.exportNames();
#endif // ENABLE(WEB_RTC)
#if ENABLE(READABLE_STREAM_API)
        m_readableStreamInternalsBuiltins.exportNames();
#endif // ENABLE(READABLE_STREAM_API)
#if ENABLE(READABLE_STREAM_API) || ENABLE(WRITABLE_STREAM_API)
        m_streamInternalsBuiltins.exportNames();
#endif // ENABLE(READABLE_STREAM_API) || ENABLE(WRITABLE_STREAM_API)
#if ENABLE(WRITABLE_STREAM_API)
        m_writableStreamInternalsBuiltins.exportNames();
#endif // ENABLE(WRITABLE_STREAM_API)
    }

#if ENABLE(FETCH_API)
    DOMWindowFetchBuiltinsWrapper& domWindowFetchBuiltins() { return m_domWindowFetchBuiltins; }
#endif // ENABLE(FETCH_API)
#if ENABLE(FETCH_API)
    FetchHeadersBuiltinsWrapper& fetchHeadersBuiltins() { return m_fetchHeadersBuiltins; }
#endif // ENABLE(FETCH_API)
#if ENABLE(FETCH_API)
    FetchInternalsBuiltinsWrapper& fetchInternalsBuiltins() { return m_fetchInternalsBuiltins; }
#endif // ENABLE(FETCH_API)
#if ENABLE(FETCH_API)
    FetchRequestBuiltinsWrapper& fetchRequestBuiltins() { return m_fetchRequestBuiltins; }
#endif // ENABLE(FETCH_API)
#if ENABLE(FETCH_API)
    FetchResponseBuiltinsWrapper& fetchResponseBuiltins() { return m_fetchResponseBuiltins; }
#endif // ENABLE(FETCH_API)
#if ENABLE(FETCH_API)
    WorkerGlobalScopeFetchBuiltinsWrapper& workerGlobalScopeFetchBuiltins() { return m_workerGlobalScopeFetchBuiltins; }
#endif // ENABLE(FETCH_API)
#if ENABLE(MEDIA_STREAM)
    NavigatorUserMediaBuiltinsWrapper& navigatorUserMediaBuiltins() { return m_navigatorUserMediaBuiltins; }
#endif // ENABLE(MEDIA_STREAM)
#if ENABLE(WEB_RTC)
    RTCPeerConnectionBuiltinsWrapper& rtcPeerConnectionBuiltins() { return m_rtcPeerConnectionBuiltins; }
#endif // ENABLE(WEB_RTC)
#if ENABLE(WEB_RTC)
    RTCPeerConnectionInternalsBuiltinsWrapper& rtcPeerConnectionInternalsBuiltins() { return m_rtcPeerConnectionInternalsBuiltins; }
#endif // ENABLE(WEB_RTC)
#if ENABLE(READABLE_STREAM_API) || ENABLE(WRITABLE_STREAM_API)
    ByteLengthQueuingStrategyBuiltinsWrapper& byteLengthQueuingStrategyBuiltins() { return m_byteLengthQueuingStrategyBuiltins; }
#endif // ENABLE(READABLE_STREAM_API) || ENABLE(WRITABLE_STREAM_API)
#if ENABLE(READABLE_STREAM_API) || ENABLE(WRITABLE_STREAM_API)
    CountQueuingStrategyBuiltinsWrapper& countQueuingStrategyBuiltins() { return m_countQueuingStrategyBuiltins; }
#endif // ENABLE(READABLE_STREAM_API) || ENABLE(WRITABLE_STREAM_API)
#if ENABLE(READABLE_STREAM_API)
    ReadableStreamBuiltinsWrapper& readableStreamBuiltins() { return m_readableStreamBuiltins; }
#endif // ENABLE(READABLE_STREAM_API)
#if ENABLE(READABLE_STREAM_API)
    ReadableStreamDefaultControllerBuiltinsWrapper& readableStreamDefaultControllerBuiltins() { return m_readableStreamDefaultControllerBuiltins; }
#endif // ENABLE(READABLE_STREAM_API)
#if ENABLE(READABLE_STREAM_API)
    ReadableStreamDefaultReaderBuiltinsWrapper& readableStreamDefaultReaderBuiltins() { return m_readableStreamDefaultReaderBuiltins; }
#endif // ENABLE(READABLE_STREAM_API)
#if ENABLE(READABLE_STREAM_API)
    ReadableStreamInternalsBuiltinsWrapper& readableStreamInternalsBuiltins() { return m_readableStreamInternalsBuiltins; }
#endif // ENABLE(READABLE_STREAM_API)
#if ENABLE(READABLE_STREAM_API) || ENABLE(WRITABLE_STREAM_API)
    StreamInternalsBuiltinsWrapper& streamInternalsBuiltins() { return m_streamInternalsBuiltins; }
#endif // ENABLE(READABLE_STREAM_API) || ENABLE(WRITABLE_STREAM_API)
#if ENABLE(WRITABLE_STREAM_API)
    WritableStreamBuiltinsWrapper& writableStreamBuiltins() { return m_writableStreamBuiltins; }
#endif // ENABLE(WRITABLE_STREAM_API)
#if ENABLE(WRITABLE_STREAM_API)
    WritableStreamInternalsBuiltinsWrapper& writableStreamInternalsBuiltins() { return m_writableStreamInternalsBuiltins; }
#endif // ENABLE(WRITABLE_STREAM_API)
    XMLHttpRequestBuiltinsWrapper& xmlHttpRequestBuiltins() { return m_xmlHttpRequestBuiltins; }

private:
    JSC::VM& m_vm;
#if ENABLE(FETCH_API)
    DOMWindowFetchBuiltinsWrapper m_domWindowFetchBuiltins;
#endif // ENABLE(FETCH_API)
#if ENABLE(FETCH_API)
    FetchHeadersBuiltinsWrapper m_fetchHeadersBuiltins;
#endif // ENABLE(FETCH_API)
#if ENABLE(FETCH_API)
    FetchInternalsBuiltinsWrapper m_fetchInternalsBuiltins;
#endif // ENABLE(FETCH_API)
#if ENABLE(FETCH_API)
    FetchRequestBuiltinsWrapper m_fetchRequestBuiltins;
#endif // ENABLE(FETCH_API)
#if ENABLE(FETCH_API)
    FetchResponseBuiltinsWrapper m_fetchResponseBuiltins;
#endif // ENABLE(FETCH_API)
#if ENABLE(FETCH_API)
    WorkerGlobalScopeFetchBuiltinsWrapper m_workerGlobalScopeFetchBuiltins;
#endif // ENABLE(FETCH_API)
#if ENABLE(MEDIA_STREAM)
    NavigatorUserMediaBuiltinsWrapper m_navigatorUserMediaBuiltins;
#endif // ENABLE(MEDIA_STREAM)
#if ENABLE(WEB_RTC)
    RTCPeerConnectionBuiltinsWrapper m_rtcPeerConnectionBuiltins;
#endif // ENABLE(WEB_RTC)
#if ENABLE(WEB_RTC)
    RTCPeerConnectionInternalsBuiltinsWrapper m_rtcPeerConnectionInternalsBuiltins;
#endif // ENABLE(WEB_RTC)
#if ENABLE(READABLE_STREAM_API) || ENABLE(WRITABLE_STREAM_API)
    ByteLengthQueuingStrategyBuiltinsWrapper m_byteLengthQueuingStrategyBuiltins;
#endif // ENABLE(READABLE_STREAM_API) || ENABLE(WRITABLE_STREAM_API)
#if ENABLE(READABLE_STREAM_API) || ENABLE(WRITABLE_STREAM_API)
    CountQueuingStrategyBuiltinsWrapper m_countQueuingStrategyBuiltins;
#endif // ENABLE(READABLE_STREAM_API) || ENABLE(WRITABLE_STREAM_API)
#if ENABLE(READABLE_STREAM_API)
    ReadableStreamBuiltinsWrapper m_readableStreamBuiltins;
#endif // ENABLE(READABLE_STREAM_API)
#if ENABLE(READABLE_STREAM_API)
    ReadableStreamDefaultControllerBuiltinsWrapper m_readableStreamDefaultControllerBuiltins;
#endif // ENABLE(READABLE_STREAM_API)
#if ENABLE(READABLE_STREAM_API)
    ReadableStreamDefaultReaderBuiltinsWrapper m_readableStreamDefaultReaderBuiltins;
#endif // ENABLE(READABLE_STREAM_API)
#if ENABLE(READABLE_STREAM_API)
    ReadableStreamInternalsBuiltinsWrapper m_readableStreamInternalsBuiltins;
#endif // ENABLE(READABLE_STREAM_API)
#if ENABLE(READABLE_STREAM_API) || ENABLE(WRITABLE_STREAM_API)
    StreamInternalsBuiltinsWrapper m_streamInternalsBuiltins;
#endif // ENABLE(READABLE_STREAM_API) || ENABLE(WRITABLE_STREAM_API)
#if ENABLE(WRITABLE_STREAM_API)
    WritableStreamBuiltinsWrapper m_writableStreamBuiltins;
#endif // ENABLE(WRITABLE_STREAM_API)
#if ENABLE(WRITABLE_STREAM_API)
    WritableStreamInternalsBuiltinsWrapper m_writableStreamInternalsBuiltins;
#endif // ENABLE(WRITABLE_STREAM_API)
    XMLHttpRequestBuiltinsWrapper m_xmlHttpRequestBuiltins;
};

} // namespace WebCore
