/*
    This file is part of the WebKit open source project.
    This file has been generated by generate-bindings.pl. DO NOT MODIFY!

    This library is free software; you can redistribute it and/or
    modify it under the terms of the GNU Library General Public
    License as published by the Free Software Foundation; either
    version 2 of the License, or (at your option) any later version.

    This library is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
    Library General Public License for more details.

    You should have received a copy of the GNU Library General Public License
    along with this library; see the file COPYING.LIB.  If not, write to
    the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
    Boston, MA 02110-1301, USA.
*/

#include "config.h"
#include "JSInternalSettingsGenerated.h"

#include "ExceptionCode.h"
#include "JSDOMBinding.h"
#include "JSDOMConvert.h"
#include <runtime/Error.h>
#include <wtf/GetPtr.h>

using namespace JSC;

namespace WebCore {

// Functions

JSC::EncodedJSValue JSC_HOST_CALL jsInternalSettingsGeneratedPrototypeFunctionSetDOMPasteAllowed(JSC::ExecState*);
JSC::EncodedJSValue JSC_HOST_CALL jsInternalSettingsGeneratedPrototypeFunctionSetAccelerated2dCanvasEnabled(JSC::ExecState*);
JSC::EncodedJSValue JSC_HOST_CALL jsInternalSettingsGeneratedPrototypeFunctionSetAcceleratedCompositedAnimationsEnabled(JSC::ExecState*);
JSC::EncodedJSValue JSC_HOST_CALL jsInternalSettingsGeneratedPrototypeFunctionSetAcceleratedCompositingEnabled(JSC::ExecState*);
JSC::EncodedJSValue JSC_HOST_CALL jsInternalSettingsGeneratedPrototypeFunctionSetAcceleratedCompositingForFixedPositionEnabled(JSC::ExecState*);
JSC::EncodedJSValue JSC_HOST_CALL jsInternalSettingsGeneratedPrototypeFunctionSetAcceleratedCompositingForOverflowScrollEnabled(JSC::ExecState*);
JSC::EncodedJSValue JSC_HOST_CALL jsInternalSettingsGeneratedPrototypeFunctionSetAcceleratedDrawingEnabled(JSC::ExecState*);
JSC::EncodedJSValue JSC_HOST_CALL jsInternalSettingsGeneratedPrototypeFunctionSetAcceleratedFiltersEnabled(JSC::ExecState*);
JSC::EncodedJSValue JSC_HOST_CALL jsInternalSettingsGeneratedPrototypeFunctionSetAggressiveTileRetentionEnabled(JSC::ExecState*);
JSC::EncodedJSValue JSC_HOST_CALL jsInternalSettingsGeneratedPrototypeFunctionSetAllowContentSecurityPolicySourceStarToMatchAnyProtocol(JSC::ExecState*);
JSC::EncodedJSValue JSC_HOST_CALL jsInternalSettingsGeneratedPrototypeFunctionSetAllowCustomScrollbarInMainFrame(JSC::ExecState*);
JSC::EncodedJSValue JSC_HOST_CALL jsInternalSettingsGeneratedPrototypeFunctionSetAllowDisplayOfInsecureContent(JSC::ExecState*);
JSC::EncodedJSValue JSC_HOST_CALL jsInternalSettingsGeneratedPrototypeFunctionSetAllowFileAccessFromFileURLs(JSC::ExecState*);
JSC::EncodedJSValue JSC_HOST_CALL jsInternalSettingsGeneratedPrototypeFunctionSetAllowMultiElementImplicitSubmission(JSC::ExecState*);
JSC::EncodedJSValue JSC_HOST_CALL jsInternalSettingsGeneratedPrototypeFunctionSetAllowRunningOfInsecureContent(JSC::ExecState*);
JSC::EncodedJSValue JSC_HOST_CALL jsInternalSettingsGeneratedPrototypeFunctionSetAllowScriptsToCloseWindows(JSC::ExecState*);
JSC::EncodedJSValue JSC_HOST_CALL jsInternalSettingsGeneratedPrototypeFunctionSetAllowUniversalAccessFromFileURLs(JSC::ExecState*);
JSC::EncodedJSValue JSC_HOST_CALL jsInternalSettingsGeneratedPrototypeFunctionSetAllowWindowOpenWithoutUserGesture(JSC::ExecState*);
JSC::EncodedJSValue JSC_HOST_CALL jsInternalSettingsGeneratedPrototypeFunctionSetAllowsAirPlayForMediaPlayback(JSC::ExecState*);
JSC::EncodedJSValue JSC_HOST_CALL jsInternalSettingsGeneratedPrototypeFunctionSetAllowsInlineMediaPlayback(JSC::ExecState*);
JSC::EncodedJSValue JSC_HOST_CALL jsInternalSettingsGeneratedPrototypeFunctionSetAllowsInlineMediaPlaybackAfterFullscreen(JSC::ExecState*);
JSC::EncodedJSValue JSC_HOST_CALL jsInternalSettingsGeneratedPrototypeFunctionSetAllowsPictureInPictureMediaPlayback(JSC::ExecState*);
JSC::EncodedJSValue JSC_HOST_CALL jsInternalSettingsGeneratedPrototypeFunctionSetAlwaysUseAcceleratedOverflowScroll(JSC::ExecState*);
JSC::EncodedJSValue JSC_HOST_CALL jsInternalSettingsGeneratedPrototypeFunctionSetAntialiased2dCanvasEnabled(JSC::ExecState*);
JSC::EncodedJSValue JSC_HOST_CALL jsInternalSettingsGeneratedPrototypeFunctionSetAppleMailPaginationQuirkEnabled(JSC::ExecState*);
JSC::EncodedJSValue JSC_HOST_CALL jsInternalSettingsGeneratedPrototypeFunctionSetAsynchronousSpellCheckingEnabled(JSC::ExecState*);
JSC::EncodedJSValue JSC_HOST_CALL jsInternalSettingsGeneratedPrototypeFunctionSetAttachmentElementEnabled(JSC::ExecState*);
JSC::EncodedJSValue JSC_HOST_CALL jsInternalSettingsGeneratedPrototypeFunctionSetAudioPlaybackRequiresUserGesture(JSC::ExecState*);
JSC::EncodedJSValue JSC_HOST_CALL jsInternalSettingsGeneratedPrototypeFunctionSetAuthorAndUserStylesEnabled(JSC::ExecState*);
JSC::EncodedJSValue JSC_HOST_CALL jsInternalSettingsGeneratedPrototypeFunctionSetAutoscrollForDragAndDropEnabled(JSC::ExecState*);
JSC::EncodedJSValue JSC_HOST_CALL jsInternalSettingsGeneratedPrototypeFunctionSetAutostartOriginPlugInSnapshottingEnabled(JSC::ExecState*);
JSC::EncodedJSValue JSC_HOST_CALL jsInternalSettingsGeneratedPrototypeFunctionSetBackForwardCacheExpirationInterval(JSC::ExecState*);
JSC::EncodedJSValue JSC_HOST_CALL jsInternalSettingsGeneratedPrototypeFunctionSetBackspaceKeyNavigationEnabled(JSC::ExecState*);
JSC::EncodedJSValue JSC_HOST_CALL jsInternalSettingsGeneratedPrototypeFunctionSetCanvasUsesAcceleratedDrawing(JSC::ExecState*);
JSC::EncodedJSValue JSC_HOST_CALL jsInternalSettingsGeneratedPrototypeFunctionSetCaretBrowsingEnabled(JSC::ExecState*);
JSC::EncodedJSValue JSC_HOST_CALL jsInternalSettingsGeneratedPrototypeFunctionSetContentDispositionAttachmentSandboxEnabled(JSC::ExecState*);
JSC::EncodedJSValue JSC_HOST_CALL jsInternalSettingsGeneratedPrototypeFunctionSetCookieEnabled(JSC::ExecState*);
JSC::EncodedJSValue JSC_HOST_CALL jsInternalSettingsGeneratedPrototypeFunctionSetCrossOriginCheckInGetMatchedCSSRulesDisabled(JSC::ExecState*);
JSC::EncodedJSValue JSC_HOST_CALL jsInternalSettingsGeneratedPrototypeFunctionSetDefaultFixedFontSize(JSC::ExecState*);
JSC::EncodedJSValue JSC_HOST_CALL jsInternalSettingsGeneratedPrototypeFunctionSetDefaultFontSize(JSC::ExecState*);
JSC::EncodedJSValue JSC_HOST_CALL jsInternalSettingsGeneratedPrototypeFunctionSetDefaultTextEncodingName(JSC::ExecState*);
JSC::EncodedJSValue JSC_HOST_CALL jsInternalSettingsGeneratedPrototypeFunctionSetDefaultVideoPosterURL(JSC::ExecState*);
JSC::EncodedJSValue JSC_HOST_CALL jsInternalSettingsGeneratedPrototypeFunctionSetDelegatesPageScaling(JSC::ExecState*);
JSC::EncodedJSValue JSC_HOST_CALL jsInternalSettingsGeneratedPrototypeFunctionSetDeveloperExtrasEnabled(JSC::ExecState*);
JSC::EncodedJSValue JSC_HOST_CALL jsInternalSettingsGeneratedPrototypeFunctionSetDeviceHeight(JSC::ExecState*);
JSC::EncodedJSValue JSC_HOST_CALL jsInternalSettingsGeneratedPrototypeFunctionSetDeviceWidth(JSC::ExecState*);
JSC::EncodedJSValue JSC_HOST_CALL jsInternalSettingsGeneratedPrototypeFunctionSetDiagnosticLoggingEnabled(JSC::ExecState*);
JSC::EncodedJSValue JSC_HOST_CALL jsInternalSettingsGeneratedPrototypeFunctionSetDisplayListDrawingEnabled(JSC::ExecState*);
JSC::EncodedJSValue JSC_HOST_CALL jsInternalSettingsGeneratedPrototypeFunctionSetDOMTimersThrottlingEnabled(JSC::ExecState*);
JSC::EncodedJSValue JSC_HOST_CALL jsInternalSettingsGeneratedPrototypeFunctionSetDownloadableBinaryFontsEnabled(JSC::ExecState*);
JSC::EncodedJSValue JSC_HOST_CALL jsInternalSettingsGeneratedPrototypeFunctionSetEnableInheritURIQueryComponent(JSC::ExecState*);
JSC::EncodedJSValue JSC_HOST_CALL jsInternalSettingsGeneratedPrototypeFunctionSetEnforceCSSMIMETypeInNoQuirksMode(JSC::ExecState*);
JSC::EncodedJSValue JSC_HOST_CALL jsInternalSettingsGeneratedPrototypeFunctionSetExperimentalNotificationsEnabled(JSC::ExecState*);
JSC::EncodedJSValue JSC_HOST_CALL jsInternalSettingsGeneratedPrototypeFunctionSetFixedBackgroundsPaintRelativeToDocument(JSC::ExecState*);
JSC::EncodedJSValue JSC_HOST_CALL jsInternalSettingsGeneratedPrototypeFunctionSetFixedElementsLayoutRelativeToFrame(JSC::ExecState*);
JSC::EncodedJSValue JSC_HOST_CALL jsInternalSettingsGeneratedPrototypeFunctionSetFixedPositionCreatesStackingContext(JSC::ExecState*);
JSC::EncodedJSValue JSC_HOST_CALL jsInternalSettingsGeneratedPrototypeFunctionSetForceCompositingMode(JSC::ExecState*);
JSC::EncodedJSValue JSC_HOST_CALL jsInternalSettingsGeneratedPrototypeFunctionSetForceFTPDirectoryListings(JSC::ExecState*);
JSC::EncodedJSValue JSC_HOST_CALL jsInternalSettingsGeneratedPrototypeFunctionSetForceSoftwareWebGLRendering(JSC::ExecState*);
JSC::EncodedJSValue JSC_HOST_CALL jsInternalSettingsGeneratedPrototypeFunctionSetForceUpdateScrollbarsOnMainThreadForPerformanceTesting(JSC::ExecState*);
JSC::EncodedJSValue JSC_HOST_CALL jsInternalSettingsGeneratedPrototypeFunctionSetFrameFlatteningEnabled(JSC::ExecState*);
JSC::EncodedJSValue JSC_HOST_CALL jsInternalSettingsGeneratedPrototypeFunctionSetFTPDirectoryTemplatePath(JSC::ExecState*);
JSC::EncodedJSValue JSC_HOST_CALL jsInternalSettingsGeneratedPrototypeFunctionSetFullScreenEnabled(JSC::ExecState*);
JSC::EncodedJSValue JSC_HOST_CALL jsInternalSettingsGeneratedPrototypeFunctionSetHttpEquivEnabled(JSC::ExecState*);
JSC::EncodedJSValue JSC_HOST_CALL jsInternalSettingsGeneratedPrototypeFunctionSetHyperlinkAuditingEnabled(JSC::ExecState*);
JSC::EncodedJSValue JSC_HOST_CALL jsInternalSettingsGeneratedPrototypeFunctionSetImageControlsEnabled(JSC::ExecState*);
JSC::EncodedJSValue JSC_HOST_CALL jsInternalSettingsGeneratedPrototypeFunctionSetImageSubsamplingEnabled(JSC::ExecState*);
JSC::EncodedJSValue JSC_HOST_CALL jsInternalSettingsGeneratedPrototypeFunctionSetIncrementalRenderingSuppressionTimeoutInSeconds(JSC::ExecState*);
JSC::EncodedJSValue JSC_HOST_CALL jsInternalSettingsGeneratedPrototypeFunctionSetInlineMediaPlaybackRequiresPlaysInlineAttribute(JSC::ExecState*);
JSC::EncodedJSValue JSC_HOST_CALL jsInternalSettingsGeneratedPrototypeFunctionSetInteractiveFormValidationEnabled(JSC::ExecState*);
JSC::EncodedJSValue JSC_HOST_CALL jsInternalSettingsGeneratedPrototypeFunctionSetInvisibleAutoplayNotPermitted(JSC::ExecState*);
JSC::EncodedJSValue JSC_HOST_CALL jsInternalSettingsGeneratedPrototypeFunctionSetJavaScriptCanAccessClipboard(JSC::ExecState*);
JSC::EncodedJSValue JSC_HOST_CALL jsInternalSettingsGeneratedPrototypeFunctionSetJavaScriptCanOpenWindowsAutomatically(JSC::ExecState*);
JSC::EncodedJSValue JSC_HOST_CALL jsInternalSettingsGeneratedPrototypeFunctionSetLayoutFallbackWidth(JSC::ExecState*);
JSC::EncodedJSValue JSC_HOST_CALL jsInternalSettingsGeneratedPrototypeFunctionSetLoadDeferringEnabled(JSC::ExecState*);
JSC::EncodedJSValue JSC_HOST_CALL jsInternalSettingsGeneratedPrototypeFunctionSetLoadsSiteIconsIgnoringImageLoadingSetting(JSC::ExecState*);
JSC::EncodedJSValue JSC_HOST_CALL jsInternalSettingsGeneratedPrototypeFunctionSetLocalFileContentSniffingEnabled(JSC::ExecState*);
JSC::EncodedJSValue JSC_HOST_CALL jsInternalSettingsGeneratedPrototypeFunctionSetLocalStorageDatabasePath(JSC::ExecState*);
JSC::EncodedJSValue JSC_HOST_CALL jsInternalSettingsGeneratedPrototypeFunctionSetLocalStorageEnabled(JSC::ExecState*);
JSC::EncodedJSValue JSC_HOST_CALL jsInternalSettingsGeneratedPrototypeFunctionSetLogsPageMessagesToSystemConsoleEnabled(JSC::ExecState*);
JSC::EncodedJSValue JSC_HOST_CALL jsInternalSettingsGeneratedPrototypeFunctionSetMainContentUserGestureOverrideEnabled(JSC::ExecState*);
JSC::EncodedJSValue JSC_HOST_CALL jsInternalSettingsGeneratedPrototypeFunctionSetMaxParseDuration(JSC::ExecState*);
JSC::EncodedJSValue JSC_HOST_CALL jsInternalSettingsGeneratedPrototypeFunctionSetMaximumHTMLParserDOMTreeDepth(JSC::ExecState*);
JSC::EncodedJSValue JSC_HOST_CALL jsInternalSettingsGeneratedPrototypeFunctionSetMaximumPlugInSnapshotAttempts(JSC::ExecState*);
JSC::EncodedJSValue JSC_HOST_CALL jsInternalSettingsGeneratedPrototypeFunctionSetMaximumSourceBufferSize(JSC::ExecState*);
JSC::EncodedJSValue JSC_HOST_CALL jsInternalSettingsGeneratedPrototypeFunctionSetMediaControlsScaleWithPageZoom(JSC::ExecState*);
JSC::EncodedJSValue JSC_HOST_CALL jsInternalSettingsGeneratedPrototypeFunctionSetMediaDataLoadsAutomatically(JSC::ExecState*);
JSC::EncodedJSValue JSC_HOST_CALL jsInternalSettingsGeneratedPrototypeFunctionSetMediaEnabled(JSC::ExecState*);
JSC::EncodedJSValue JSC_HOST_CALL jsInternalSettingsGeneratedPrototypeFunctionSetMediaSourceEnabled(JSC::ExecState*);
JSC::EncodedJSValue JSC_HOST_CALL jsInternalSettingsGeneratedPrototypeFunctionSetMediaStreamEnabled(JSC::ExecState*);
JSC::EncodedJSValue JSC_HOST_CALL jsInternalSettingsGeneratedPrototypeFunctionSetMinimumAccelerated2dCanvasSize(JSC::ExecState*);
JSC::EncodedJSValue JSC_HOST_CALL jsInternalSettingsGeneratedPrototypeFunctionSetMinimumFontSize(JSC::ExecState*);
JSC::EncodedJSValue JSC_HOST_CALL jsInternalSettingsGeneratedPrototypeFunctionSetMinimumLogicalFontSize(JSC::ExecState*);
JSC::EncodedJSValue JSC_HOST_CALL jsInternalSettingsGeneratedPrototypeFunctionSetMinimumZoomFontSize(JSC::ExecState*);
JSC::EncodedJSValue JSC_HOST_CALL jsInternalSettingsGeneratedPrototypeFunctionSetNeedsIsLoadingInAPISenseQuirk(JSC::ExecState*);
JSC::EncodedJSValue JSC_HOST_CALL jsInternalSettingsGeneratedPrototypeFunctionSetNeedsKeyboardEventDisambiguationQuirks(JSC::ExecState*);
JSC::EncodedJSValue JSC_HOST_CALL jsInternalSettingsGeneratedPrototypeFunctionSetNeedsSiteSpecificQuirks(JSC::ExecState*);
JSC::EncodedJSValue JSC_HOST_CALL jsInternalSettingsGeneratedPrototypeFunctionSetNewBlockInsideInlineModelEnabled(JSC::ExecState*);
JSC::EncodedJSValue JSC_HOST_CALL jsInternalSettingsGeneratedPrototypeFunctionSetNewCSSParserEnabled(JSC::ExecState*);
JSC::EncodedJSValue JSC_HOST_CALL jsInternalSettingsGeneratedPrototypeFunctionSetNotificationsEnabled(JSC::ExecState*);
JSC::EncodedJSValue JSC_HOST_CALL jsInternalSettingsGeneratedPrototypeFunctionSetOfflineWebApplicationCacheEnabled(JSC::ExecState*);
JSC::EncodedJSValue JSC_HOST_CALL jsInternalSettingsGeneratedPrototypeFunctionSetOpenGLMultisamplingEnabled(JSC::ExecState*);
JSC::EncodedJSValue JSC_HOST_CALL jsInternalSettingsGeneratedPrototypeFunctionSetPageCacheSupportsPlugins(JSC::ExecState*);
JSC::EncodedJSValue JSC_HOST_CALL jsInternalSettingsGeneratedPrototypeFunctionSetPaginateDuringLayoutEnabled(JSC::ExecState*);
JSC::EncodedJSValue JSC_HOST_CALL jsInternalSettingsGeneratedPrototypeFunctionSetPasswordEchoDurationInSeconds(JSC::ExecState*);
JSC::EncodedJSValue JSC_HOST_CALL jsInternalSettingsGeneratedPrototypeFunctionSetPasswordEchoEnabled(JSC::ExecState*);
JSC::EncodedJSValue JSC_HOST_CALL jsInternalSettingsGeneratedPrototypeFunctionSetPlugInSnapshottingEnabled(JSC::ExecState*);
JSC::EncodedJSValue JSC_HOST_CALL jsInternalSettingsGeneratedPrototypeFunctionSetPreventKeyboardDOMEventDispatch(JSC::ExecState*);
JSC::EncodedJSValue JSC_HOST_CALL jsInternalSettingsGeneratedPrototypeFunctionSetPrimaryPlugInSnapshotDetectionEnabled(JSC::ExecState*);
JSC::EncodedJSValue JSC_HOST_CALL jsInternalSettingsGeneratedPrototypeFunctionSetQuickTimePluginReplacementEnabled(JSC::ExecState*);
JSC::EncodedJSValue JSC_HOST_CALL jsInternalSettingsGeneratedPrototypeFunctionSetRequestAnimationFrameEnabled(JSC::ExecState*);
JSC::EncodedJSValue JSC_HOST_CALL jsInternalSettingsGeneratedPrototypeFunctionSetRubberBandingForSubScrollableRegionsEnabled(JSC::ExecState*);
JSC::EncodedJSValue JSC_HOST_CALL jsInternalSettingsGeneratedPrototypeFunctionSetScriptMarkupEnabled(JSC::ExecState*);
JSC::EncodedJSValue JSC_HOST_CALL jsInternalSettingsGeneratedPrototypeFunctionSetScrollAnimatorEnabled(JSC::ExecState*);
JSC::EncodedJSValue JSC_HOST_CALL jsInternalSettingsGeneratedPrototypeFunctionSetScrollingCoordinatorEnabled(JSC::ExecState*);
JSC::EncodedJSValue JSC_HOST_CALL jsInternalSettingsGeneratedPrototypeFunctionSetScrollingTreeIncludesFrames(JSC::ExecState*);
JSC::EncodedJSValue JSC_HOST_CALL jsInternalSettingsGeneratedPrototypeFunctionSetSelectTrailingWhitespaceEnabled(JSC::ExecState*);
JSC::EncodedJSValue JSC_HOST_CALL jsInternalSettingsGeneratedPrototypeFunctionSetSelectionIncludesAltImageText(JSC::ExecState*);
JSC::EncodedJSValue JSC_HOST_CALL jsInternalSettingsGeneratedPrototypeFunctionSetSelectionPaintingWithoutSelectionGapsEnabled(JSC::ExecState*);
JSC::EncodedJSValue JSC_HOST_CALL jsInternalSettingsGeneratedPrototypeFunctionSetServiceControlsEnabled(JSC::ExecState*);
JSC::EncodedJSValue JSC_HOST_CALL jsInternalSettingsGeneratedPrototypeFunctionSetSessionStorageQuota(JSC::ExecState*);
JSC::EncodedJSValue JSC_HOST_CALL jsInternalSettingsGeneratedPrototypeFunctionSetShouldConvertInvalidURLsToBlank(JSC::ExecState*);
JSC::EncodedJSValue JSC_HOST_CALL jsInternalSettingsGeneratedPrototypeFunctionSetShouldConvertPositionStyleOnCopy(JSC::ExecState*);
JSC::EncodedJSValue JSC_HOST_CALL jsInternalSettingsGeneratedPrototypeFunctionSetShouldDispatchJavaScriptWindowOnErrorEvents(JSC::ExecState*);
JSC::EncodedJSValue JSC_HOST_CALL jsInternalSettingsGeneratedPrototypeFunctionSetShouldDisplayCaptions(JSC::ExecState*);
JSC::EncodedJSValue JSC_HOST_CALL jsInternalSettingsGeneratedPrototypeFunctionSetShouldDisplaySubtitles(JSC::ExecState*);
JSC::EncodedJSValue JSC_HOST_CALL jsInternalSettingsGeneratedPrototypeFunctionSetShouldDisplayTextDescriptions(JSC::ExecState*);
JSC::EncodedJSValue JSC_HOST_CALL jsInternalSettingsGeneratedPrototypeFunctionSetShouldInjectUserScriptsInInitialEmptyDocument(JSC::ExecState*);
JSC::EncodedJSValue JSC_HOST_CALL jsInternalSettingsGeneratedPrototypeFunctionSetShouldPrintBackgrounds(JSC::ExecState*);
JSC::EncodedJSValue JSC_HOST_CALL jsInternalSettingsGeneratedPrototypeFunctionSetShouldRespectImageOrientation(JSC::ExecState*);
JSC::EncodedJSValue JSC_HOST_CALL jsInternalSettingsGeneratedPrototypeFunctionSetShouldTransformsAffectOverflow(JSC::ExecState*);
JSC::EncodedJSValue JSC_HOST_CALL jsInternalSettingsGeneratedPrototypeFunctionSetShowDebugBorders(JSC::ExecState*);
JSC::EncodedJSValue JSC_HOST_CALL jsInternalSettingsGeneratedPrototypeFunctionSetShowRepaintCounter(JSC::ExecState*);
JSC::EncodedJSValue JSC_HOST_CALL jsInternalSettingsGeneratedPrototypeFunctionSetShowsToolTipOverTruncatedText(JSC::ExecState*);
JSC::EncodedJSValue JSC_HOST_CALL jsInternalSettingsGeneratedPrototypeFunctionSetShowsURLsInToolTips(JSC::ExecState*);
JSC::EncodedJSValue JSC_HOST_CALL jsInternalSettingsGeneratedPrototypeFunctionSetShrinksStandaloneImagesToFit(JSC::ExecState*);
JSC::EncodedJSValue JSC_HOST_CALL jsInternalSettingsGeneratedPrototypeFunctionSetSimpleLineLayoutDebugBordersEnabled(JSC::ExecState*);
JSC::EncodedJSValue JSC_HOST_CALL jsInternalSettingsGeneratedPrototypeFunctionSetSimpleLineLayoutEnabled(JSC::ExecState*);
JSC::EncodedJSValue JSC_HOST_CALL jsInternalSettingsGeneratedPrototypeFunctionSetSmartInsertDeleteEnabled(JSC::ExecState*);
JSC::EncodedJSValue JSC_HOST_CALL jsInternalSettingsGeneratedPrototypeFunctionSetSnapshotAllPlugIns(JSC::ExecState*);
JSC::EncodedJSValue JSC_HOST_CALL jsInternalSettingsGeneratedPrototypeFunctionSetSpatialNavigationEnabled(JSC::ExecState*);
JSC::EncodedJSValue JSC_HOST_CALL jsInternalSettingsGeneratedPrototypeFunctionSetSpringTimingFunctionEnabled(JSC::ExecState*);
JSC::EncodedJSValue JSC_HOST_CALL jsInternalSettingsGeneratedPrototypeFunctionSetStandalone(JSC::ExecState*);
JSC::EncodedJSValue JSC_HOST_CALL jsInternalSettingsGeneratedPrototypeFunctionSetSubpixelCSSOMElementMetricsEnabled(JSC::ExecState*);
JSC::EncodedJSValue JSC_HOST_CALL jsInternalSettingsGeneratedPrototypeFunctionSetSuppressesIncrementalRendering(JSC::ExecState*);
JSC::EncodedJSValue JSC_HOST_CALL jsInternalSettingsGeneratedPrototypeFunctionSetSyncXHRInDocumentsEnabled(JSC::ExecState*);
JSC::EncodedJSValue JSC_HOST_CALL jsInternalSettingsGeneratedPrototypeFunctionSetTelephoneNumberParsingEnabled(JSC::ExecState*);
JSC::EncodedJSValue JSC_HOST_CALL jsInternalSettingsGeneratedPrototypeFunctionSetTemporaryTileCohortRetentionEnabled(JSC::ExecState*);
JSC::EncodedJSValue JSC_HOST_CALL jsInternalSettingsGeneratedPrototypeFunctionSetTextAreasAreResizable(JSC::ExecState*);
JSC::EncodedJSValue JSC_HOST_CALL jsInternalSettingsGeneratedPrototypeFunctionSetTextAutosizingEnabled(JSC::ExecState*);
JSC::EncodedJSValue JSC_HOST_CALL jsInternalSettingsGeneratedPrototypeFunctionSetTreatIPAddressAsDomain(JSC::ExecState*);
JSC::EncodedJSValue JSC_HOST_CALL jsInternalSettingsGeneratedPrototypeFunctionSetTreatsAnyTextCSSLinkAsStylesheet(JSC::ExecState*);
JSC::EncodedJSValue JSC_HOST_CALL jsInternalSettingsGeneratedPrototypeFunctionSetUnifiedTextCheckerEnabled(JSC::ExecState*);
JSC::EncodedJSValue JSC_HOST_CALL jsInternalSettingsGeneratedPrototypeFunctionSetUnsafePluginPastingEnabled(JSC::ExecState*);
JSC::EncodedJSValue JSC_HOST_CALL jsInternalSettingsGeneratedPrototypeFunctionSetUseGiantTiles(JSC::ExecState*);
JSC::EncodedJSValue JSC_HOST_CALL jsInternalSettingsGeneratedPrototypeFunctionSetUseImageDocumentForSubframePDF(JSC::ExecState*);
JSC::EncodedJSValue JSC_HOST_CALL jsInternalSettingsGeneratedPrototypeFunctionSetUseLegacyBackgroundSizeShorthandBehavior(JSC::ExecState*);
JSC::EncodedJSValue JSC_HOST_CALL jsInternalSettingsGeneratedPrototypeFunctionSetUseLegacyTextAlignPositionedElementBehavior(JSC::ExecState*);
JSC::EncodedJSValue JSC_HOST_CALL jsInternalSettingsGeneratedPrototypeFunctionSetUsePreHTML5ParserQuirks(JSC::ExecState*);
JSC::EncodedJSValue JSC_HOST_CALL jsInternalSettingsGeneratedPrototypeFunctionSetUsesDashboardBackwardCompatibilityMode(JSC::ExecState*);
JSC::EncodedJSValue JSC_HOST_CALL jsInternalSettingsGeneratedPrototypeFunctionSetUsesEncodingDetector(JSC::ExecState*);
JSC::EncodedJSValue JSC_HOST_CALL jsInternalSettingsGeneratedPrototypeFunctionSetValidationMessageTimerMagnification(JSC::ExecState*);
JSC::EncodedJSValue JSC_HOST_CALL jsInternalSettingsGeneratedPrototypeFunctionSetVideoPlaybackRequiresUserGesture(JSC::ExecState*);
JSC::EncodedJSValue JSC_HOST_CALL jsInternalSettingsGeneratedPrototypeFunctionSetVisualViewportEnabled(JSC::ExecState*);
JSC::EncodedJSValue JSC_HOST_CALL jsInternalSettingsGeneratedPrototypeFunctionSetWantsBalancedSetDefersLoadingBehavior(JSC::ExecState*);
JSC::EncodedJSValue JSC_HOST_CALL jsInternalSettingsGeneratedPrototypeFunctionSetWebArchiveDebugModeEnabled(JSC::ExecState*);
JSC::EncodedJSValue JSC_HOST_CALL jsInternalSettingsGeneratedPrototypeFunctionSetWebAudioEnabled(JSC::ExecState*);
JSC::EncodedJSValue JSC_HOST_CALL jsInternalSettingsGeneratedPrototypeFunctionSetWebGLEnabled(JSC::ExecState*);
JSC::EncodedJSValue JSC_HOST_CALL jsInternalSettingsGeneratedPrototypeFunctionSetWebGLErrorsToConsoleEnabled(JSC::ExecState*);
JSC::EncodedJSValue JSC_HOST_CALL jsInternalSettingsGeneratedPrototypeFunctionSetWebSecurityEnabled(JSC::ExecState*);
JSC::EncodedJSValue JSC_HOST_CALL jsInternalSettingsGeneratedPrototypeFunctionSetWindowFocusRestricted(JSC::ExecState*);
JSC::EncodedJSValue JSC_HOST_CALL jsInternalSettingsGeneratedPrototypeFunctionSetXSSAuditorEnabled(JSC::ExecState*);
JSC::EncodedJSValue JSC_HOST_CALL jsInternalSettingsGeneratedPrototypeFunctionSetYouTubeFlashPluginReplacementEnabled(JSC::ExecState*);

class JSInternalSettingsGeneratedPrototype : public JSC::JSNonFinalObject {
public:
    typedef JSC::JSNonFinalObject Base;
    static JSInternalSettingsGeneratedPrototype* create(JSC::VM& vm, JSC::JSGlobalObject* globalObject, JSC::Structure* structure)
    {
        JSInternalSettingsGeneratedPrototype* ptr = new (NotNull, JSC::allocateCell<JSInternalSettingsGeneratedPrototype>(vm.heap)) JSInternalSettingsGeneratedPrototype(vm, globalObject, structure);
        ptr->finishCreation(vm);
        return ptr;
    }

    DECLARE_INFO;
    static JSC::Structure* createStructure(JSC::VM& vm, JSC::JSGlobalObject* globalObject, JSC::JSValue prototype)
    {
        return JSC::Structure::create(vm, globalObject, prototype, JSC::TypeInfo(JSC::ObjectType, StructureFlags), info());
    }

private:
    JSInternalSettingsGeneratedPrototype(JSC::VM& vm, JSC::JSGlobalObject*, JSC::Structure* structure)
        : JSC::JSNonFinalObject(vm, structure)
    {
    }

    void finishCreation(JSC::VM&);
};

/* Hash table for prototype */

static const HashTableValue JSInternalSettingsGeneratedPrototypeTableValues[] =
{
    { "setDOMPasteAllowed", JSC::Function, NoIntrinsic, { (intptr_t)static_cast<NativeFunction>(jsInternalSettingsGeneratedPrototypeFunctionSetDOMPasteAllowed), (intptr_t) (1) } },
    { "setAccelerated2dCanvasEnabled", JSC::Function, NoIntrinsic, { (intptr_t)static_cast<NativeFunction>(jsInternalSettingsGeneratedPrototypeFunctionSetAccelerated2dCanvasEnabled), (intptr_t) (1) } },
    { "setAcceleratedCompositedAnimationsEnabled", JSC::Function, NoIntrinsic, { (intptr_t)static_cast<NativeFunction>(jsInternalSettingsGeneratedPrototypeFunctionSetAcceleratedCompositedAnimationsEnabled), (intptr_t) (1) } },
    { "setAcceleratedCompositingEnabled", JSC::Function, NoIntrinsic, { (intptr_t)static_cast<NativeFunction>(jsInternalSettingsGeneratedPrototypeFunctionSetAcceleratedCompositingEnabled), (intptr_t) (1) } },
    { "setAcceleratedCompositingForFixedPositionEnabled", JSC::Function, NoIntrinsic, { (intptr_t)static_cast<NativeFunction>(jsInternalSettingsGeneratedPrototypeFunctionSetAcceleratedCompositingForFixedPositionEnabled), (intptr_t) (1) } },
    { "setAcceleratedCompositingForOverflowScrollEnabled", JSC::Function, NoIntrinsic, { (intptr_t)static_cast<NativeFunction>(jsInternalSettingsGeneratedPrototypeFunctionSetAcceleratedCompositingForOverflowScrollEnabled), (intptr_t) (1) } },
    { "setAcceleratedDrawingEnabled", JSC::Function, NoIntrinsic, { (intptr_t)static_cast<NativeFunction>(jsInternalSettingsGeneratedPrototypeFunctionSetAcceleratedDrawingEnabled), (intptr_t) (1) } },
    { "setAcceleratedFiltersEnabled", JSC::Function, NoIntrinsic, { (intptr_t)static_cast<NativeFunction>(jsInternalSettingsGeneratedPrototypeFunctionSetAcceleratedFiltersEnabled), (intptr_t) (1) } },
    { "setAggressiveTileRetentionEnabled", JSC::Function, NoIntrinsic, { (intptr_t)static_cast<NativeFunction>(jsInternalSettingsGeneratedPrototypeFunctionSetAggressiveTileRetentionEnabled), (intptr_t) (1) } },
    { "setAllowContentSecurityPolicySourceStarToMatchAnyProtocol", JSC::Function, NoIntrinsic, { (intptr_t)static_cast<NativeFunction>(jsInternalSettingsGeneratedPrototypeFunctionSetAllowContentSecurityPolicySourceStarToMatchAnyProtocol), (intptr_t) (1) } },
    { "setAllowCustomScrollbarInMainFrame", JSC::Function, NoIntrinsic, { (intptr_t)static_cast<NativeFunction>(jsInternalSettingsGeneratedPrototypeFunctionSetAllowCustomScrollbarInMainFrame), (intptr_t) (1) } },
    { "setAllowDisplayOfInsecureContent", JSC::Function, NoIntrinsic, { (intptr_t)static_cast<NativeFunction>(jsInternalSettingsGeneratedPrototypeFunctionSetAllowDisplayOfInsecureContent), (intptr_t) (1) } },
    { "setAllowFileAccessFromFileURLs", JSC::Function, NoIntrinsic, { (intptr_t)static_cast<NativeFunction>(jsInternalSettingsGeneratedPrototypeFunctionSetAllowFileAccessFromFileURLs), (intptr_t) (1) } },
    { "setAllowMultiElementImplicitSubmission", JSC::Function, NoIntrinsic, { (intptr_t)static_cast<NativeFunction>(jsInternalSettingsGeneratedPrototypeFunctionSetAllowMultiElementImplicitSubmission), (intptr_t) (1) } },
    { "setAllowRunningOfInsecureContent", JSC::Function, NoIntrinsic, { (intptr_t)static_cast<NativeFunction>(jsInternalSettingsGeneratedPrototypeFunctionSetAllowRunningOfInsecureContent), (intptr_t) (1) } },
    { "setAllowScriptsToCloseWindows", JSC::Function, NoIntrinsic, { (intptr_t)static_cast<NativeFunction>(jsInternalSettingsGeneratedPrototypeFunctionSetAllowScriptsToCloseWindows), (intptr_t) (1) } },
    { "setAllowUniversalAccessFromFileURLs", JSC::Function, NoIntrinsic, { (intptr_t)static_cast<NativeFunction>(jsInternalSettingsGeneratedPrototypeFunctionSetAllowUniversalAccessFromFileURLs), (intptr_t) (1) } },
    { "setAllowWindowOpenWithoutUserGesture", JSC::Function, NoIntrinsic, { (intptr_t)static_cast<NativeFunction>(jsInternalSettingsGeneratedPrototypeFunctionSetAllowWindowOpenWithoutUserGesture), (intptr_t) (1) } },
    { "setAllowsAirPlayForMediaPlayback", JSC::Function, NoIntrinsic, { (intptr_t)static_cast<NativeFunction>(jsInternalSettingsGeneratedPrototypeFunctionSetAllowsAirPlayForMediaPlayback), (intptr_t) (1) } },
    { "setAllowsInlineMediaPlayback", JSC::Function, NoIntrinsic, { (intptr_t)static_cast<NativeFunction>(jsInternalSettingsGeneratedPrototypeFunctionSetAllowsInlineMediaPlayback), (intptr_t) (1) } },
    { "setAllowsInlineMediaPlaybackAfterFullscreen", JSC::Function, NoIntrinsic, { (intptr_t)static_cast<NativeFunction>(jsInternalSettingsGeneratedPrototypeFunctionSetAllowsInlineMediaPlaybackAfterFullscreen), (intptr_t) (1) } },
    { "setAllowsPictureInPictureMediaPlayback", JSC::Function, NoIntrinsic, { (intptr_t)static_cast<NativeFunction>(jsInternalSettingsGeneratedPrototypeFunctionSetAllowsPictureInPictureMediaPlayback), (intptr_t) (1) } },
    { "setAlwaysUseAcceleratedOverflowScroll", JSC::Function, NoIntrinsic, { (intptr_t)static_cast<NativeFunction>(jsInternalSettingsGeneratedPrototypeFunctionSetAlwaysUseAcceleratedOverflowScroll), (intptr_t) (1) } },
    { "setAntialiased2dCanvasEnabled", JSC::Function, NoIntrinsic, { (intptr_t)static_cast<NativeFunction>(jsInternalSettingsGeneratedPrototypeFunctionSetAntialiased2dCanvasEnabled), (intptr_t) (1) } },
    { "setAppleMailPaginationQuirkEnabled", JSC::Function, NoIntrinsic, { (intptr_t)static_cast<NativeFunction>(jsInternalSettingsGeneratedPrototypeFunctionSetAppleMailPaginationQuirkEnabled), (intptr_t) (1) } },
    { "setAsynchronousSpellCheckingEnabled", JSC::Function, NoIntrinsic, { (intptr_t)static_cast<NativeFunction>(jsInternalSettingsGeneratedPrototypeFunctionSetAsynchronousSpellCheckingEnabled), (intptr_t) (1) } },
    { "setAttachmentElementEnabled", JSC::Function, NoIntrinsic, { (intptr_t)static_cast<NativeFunction>(jsInternalSettingsGeneratedPrototypeFunctionSetAttachmentElementEnabled), (intptr_t) (1) } },
    { "setAudioPlaybackRequiresUserGesture", JSC::Function, NoIntrinsic, { (intptr_t)static_cast<NativeFunction>(jsInternalSettingsGeneratedPrototypeFunctionSetAudioPlaybackRequiresUserGesture), (intptr_t) (1) } },
    { "setAuthorAndUserStylesEnabled", JSC::Function, NoIntrinsic, { (intptr_t)static_cast<NativeFunction>(jsInternalSettingsGeneratedPrototypeFunctionSetAuthorAndUserStylesEnabled), (intptr_t) (1) } },
    { "setAutoscrollForDragAndDropEnabled", JSC::Function, NoIntrinsic, { (intptr_t)static_cast<NativeFunction>(jsInternalSettingsGeneratedPrototypeFunctionSetAutoscrollForDragAndDropEnabled), (intptr_t) (1) } },
    { "setAutostartOriginPlugInSnapshottingEnabled", JSC::Function, NoIntrinsic, { (intptr_t)static_cast<NativeFunction>(jsInternalSettingsGeneratedPrototypeFunctionSetAutostartOriginPlugInSnapshottingEnabled), (intptr_t) (1) } },
    { "setBackForwardCacheExpirationInterval", JSC::Function, NoIntrinsic, { (intptr_t)static_cast<NativeFunction>(jsInternalSettingsGeneratedPrototypeFunctionSetBackForwardCacheExpirationInterval), (intptr_t) (1) } },
    { "setBackspaceKeyNavigationEnabled", JSC::Function, NoIntrinsic, { (intptr_t)static_cast<NativeFunction>(jsInternalSettingsGeneratedPrototypeFunctionSetBackspaceKeyNavigationEnabled), (intptr_t) (1) } },
    { "setCanvasUsesAcceleratedDrawing", JSC::Function, NoIntrinsic, { (intptr_t)static_cast<NativeFunction>(jsInternalSettingsGeneratedPrototypeFunctionSetCanvasUsesAcceleratedDrawing), (intptr_t) (1) } },
    { "setCaretBrowsingEnabled", JSC::Function, NoIntrinsic, { (intptr_t)static_cast<NativeFunction>(jsInternalSettingsGeneratedPrototypeFunctionSetCaretBrowsingEnabled), (intptr_t) (1) } },
    { "setContentDispositionAttachmentSandboxEnabled", JSC::Function, NoIntrinsic, { (intptr_t)static_cast<NativeFunction>(jsInternalSettingsGeneratedPrototypeFunctionSetContentDispositionAttachmentSandboxEnabled), (intptr_t) (1) } },
    { "setCookieEnabled", JSC::Function, NoIntrinsic, { (intptr_t)static_cast<NativeFunction>(jsInternalSettingsGeneratedPrototypeFunctionSetCookieEnabled), (intptr_t) (1) } },
    { "setCrossOriginCheckInGetMatchedCSSRulesDisabled", JSC::Function, NoIntrinsic, { (intptr_t)static_cast<NativeFunction>(jsInternalSettingsGeneratedPrototypeFunctionSetCrossOriginCheckInGetMatchedCSSRulesDisabled), (intptr_t) (1) } },
    { "setDefaultFixedFontSize", JSC::Function, NoIntrinsic, { (intptr_t)static_cast<NativeFunction>(jsInternalSettingsGeneratedPrototypeFunctionSetDefaultFixedFontSize), (intptr_t) (1) } },
    { "setDefaultFontSize", JSC::Function, NoIntrinsic, { (intptr_t)static_cast<NativeFunction>(jsInternalSettingsGeneratedPrototypeFunctionSetDefaultFontSize), (intptr_t) (1) } },
    { "setDefaultTextEncodingName", JSC::Function, NoIntrinsic, { (intptr_t)static_cast<NativeFunction>(jsInternalSettingsGeneratedPrototypeFunctionSetDefaultTextEncodingName), (intptr_t) (1) } },
    { "setDefaultVideoPosterURL", JSC::Function, NoIntrinsic, { (intptr_t)static_cast<NativeFunction>(jsInternalSettingsGeneratedPrototypeFunctionSetDefaultVideoPosterURL), (intptr_t) (1) } },
    { "setDelegatesPageScaling", JSC::Function, NoIntrinsic, { (intptr_t)static_cast<NativeFunction>(jsInternalSettingsGeneratedPrototypeFunctionSetDelegatesPageScaling), (intptr_t) (1) } },
    { "setDeveloperExtrasEnabled", JSC::Function, NoIntrinsic, { (intptr_t)static_cast<NativeFunction>(jsInternalSettingsGeneratedPrototypeFunctionSetDeveloperExtrasEnabled), (intptr_t) (1) } },
    { "setDeviceHeight", JSC::Function, NoIntrinsic, { (intptr_t)static_cast<NativeFunction>(jsInternalSettingsGeneratedPrototypeFunctionSetDeviceHeight), (intptr_t) (1) } },
    { "setDeviceWidth", JSC::Function, NoIntrinsic, { (intptr_t)static_cast<NativeFunction>(jsInternalSettingsGeneratedPrototypeFunctionSetDeviceWidth), (intptr_t) (1) } },
    { "setDiagnosticLoggingEnabled", JSC::Function, NoIntrinsic, { (intptr_t)static_cast<NativeFunction>(jsInternalSettingsGeneratedPrototypeFunctionSetDiagnosticLoggingEnabled), (intptr_t) (1) } },
    { "setDisplayListDrawingEnabled", JSC::Function, NoIntrinsic, { (intptr_t)static_cast<NativeFunction>(jsInternalSettingsGeneratedPrototypeFunctionSetDisplayListDrawingEnabled), (intptr_t) (1) } },
    { "setDOMTimersThrottlingEnabled", JSC::Function, NoIntrinsic, { (intptr_t)static_cast<NativeFunction>(jsInternalSettingsGeneratedPrototypeFunctionSetDOMTimersThrottlingEnabled), (intptr_t) (1) } },
    { "setDownloadableBinaryFontsEnabled", JSC::Function, NoIntrinsic, { (intptr_t)static_cast<NativeFunction>(jsInternalSettingsGeneratedPrototypeFunctionSetDownloadableBinaryFontsEnabled), (intptr_t) (1) } },
    { "setEnableInheritURIQueryComponent", JSC::Function, NoIntrinsic, { (intptr_t)static_cast<NativeFunction>(jsInternalSettingsGeneratedPrototypeFunctionSetEnableInheritURIQueryComponent), (intptr_t) (1) } },
    { "setEnforceCSSMIMETypeInNoQuirksMode", JSC::Function, NoIntrinsic, { (intptr_t)static_cast<NativeFunction>(jsInternalSettingsGeneratedPrototypeFunctionSetEnforceCSSMIMETypeInNoQuirksMode), (intptr_t) (1) } },
    { "setExperimentalNotificationsEnabled", JSC::Function, NoIntrinsic, { (intptr_t)static_cast<NativeFunction>(jsInternalSettingsGeneratedPrototypeFunctionSetExperimentalNotificationsEnabled), (intptr_t) (1) } },
    { "setFixedBackgroundsPaintRelativeToDocument", JSC::Function, NoIntrinsic, { (intptr_t)static_cast<NativeFunction>(jsInternalSettingsGeneratedPrototypeFunctionSetFixedBackgroundsPaintRelativeToDocument), (intptr_t) (1) } },
    { "setFixedElementsLayoutRelativeToFrame", JSC::Function, NoIntrinsic, { (intptr_t)static_cast<NativeFunction>(jsInternalSettingsGeneratedPrototypeFunctionSetFixedElementsLayoutRelativeToFrame), (intptr_t) (1) } },
    { "setFixedPositionCreatesStackingContext", JSC::Function, NoIntrinsic, { (intptr_t)static_cast<NativeFunction>(jsInternalSettingsGeneratedPrototypeFunctionSetFixedPositionCreatesStackingContext), (intptr_t) (1) } },
    { "setForceCompositingMode", JSC::Function, NoIntrinsic, { (intptr_t)static_cast<NativeFunction>(jsInternalSettingsGeneratedPrototypeFunctionSetForceCompositingMode), (intptr_t) (1) } },
    { "setForceFTPDirectoryListings", JSC::Function, NoIntrinsic, { (intptr_t)static_cast<NativeFunction>(jsInternalSettingsGeneratedPrototypeFunctionSetForceFTPDirectoryListings), (intptr_t) (1) } },
    { "setForceSoftwareWebGLRendering", JSC::Function, NoIntrinsic, { (intptr_t)static_cast<NativeFunction>(jsInternalSettingsGeneratedPrototypeFunctionSetForceSoftwareWebGLRendering), (intptr_t) (1) } },
    { "setForceUpdateScrollbarsOnMainThreadForPerformanceTesting", JSC::Function, NoIntrinsic, { (intptr_t)static_cast<NativeFunction>(jsInternalSettingsGeneratedPrototypeFunctionSetForceUpdateScrollbarsOnMainThreadForPerformanceTesting), (intptr_t) (1) } },
    { "setFrameFlatteningEnabled", JSC::Function, NoIntrinsic, { (intptr_t)static_cast<NativeFunction>(jsInternalSettingsGeneratedPrototypeFunctionSetFrameFlatteningEnabled), (intptr_t) (1) } },
    { "setFTPDirectoryTemplatePath", JSC::Function, NoIntrinsic, { (intptr_t)static_cast<NativeFunction>(jsInternalSettingsGeneratedPrototypeFunctionSetFTPDirectoryTemplatePath), (intptr_t) (1) } },
    { "setFullScreenEnabled", JSC::Function, NoIntrinsic, { (intptr_t)static_cast<NativeFunction>(jsInternalSettingsGeneratedPrototypeFunctionSetFullScreenEnabled), (intptr_t) (1) } },
    { "setHttpEquivEnabled", JSC::Function, NoIntrinsic, { (intptr_t)static_cast<NativeFunction>(jsInternalSettingsGeneratedPrototypeFunctionSetHttpEquivEnabled), (intptr_t) (1) } },
    { "setHyperlinkAuditingEnabled", JSC::Function, NoIntrinsic, { (intptr_t)static_cast<NativeFunction>(jsInternalSettingsGeneratedPrototypeFunctionSetHyperlinkAuditingEnabled), (intptr_t) (1) } },
    { "setImageControlsEnabled", JSC::Function, NoIntrinsic, { (intptr_t)static_cast<NativeFunction>(jsInternalSettingsGeneratedPrototypeFunctionSetImageControlsEnabled), (intptr_t) (1) } },
    { "setImageSubsamplingEnabled", JSC::Function, NoIntrinsic, { (intptr_t)static_cast<NativeFunction>(jsInternalSettingsGeneratedPrototypeFunctionSetImageSubsamplingEnabled), (intptr_t) (1) } },
    { "setIncrementalRenderingSuppressionTimeoutInSeconds", JSC::Function, NoIntrinsic, { (intptr_t)static_cast<NativeFunction>(jsInternalSettingsGeneratedPrototypeFunctionSetIncrementalRenderingSuppressionTimeoutInSeconds), (intptr_t) (1) } },
    { "setInlineMediaPlaybackRequiresPlaysInlineAttribute", JSC::Function, NoIntrinsic, { (intptr_t)static_cast<NativeFunction>(jsInternalSettingsGeneratedPrototypeFunctionSetInlineMediaPlaybackRequiresPlaysInlineAttribute), (intptr_t) (1) } },
    { "setInteractiveFormValidationEnabled", JSC::Function, NoIntrinsic, { (intptr_t)static_cast<NativeFunction>(jsInternalSettingsGeneratedPrototypeFunctionSetInteractiveFormValidationEnabled), (intptr_t) (1) } },
    { "setInvisibleAutoplayNotPermitted", JSC::Function, NoIntrinsic, { (intptr_t)static_cast<NativeFunction>(jsInternalSettingsGeneratedPrototypeFunctionSetInvisibleAutoplayNotPermitted), (intptr_t) (1) } },
    { "setJavaScriptCanAccessClipboard", JSC::Function, NoIntrinsic, { (intptr_t)static_cast<NativeFunction>(jsInternalSettingsGeneratedPrototypeFunctionSetJavaScriptCanAccessClipboard), (intptr_t) (1) } },
    { "setJavaScriptCanOpenWindowsAutomatically", JSC::Function, NoIntrinsic, { (intptr_t)static_cast<NativeFunction>(jsInternalSettingsGeneratedPrototypeFunctionSetJavaScriptCanOpenWindowsAutomatically), (intptr_t) (1) } },
    { "setLayoutFallbackWidth", JSC::Function, NoIntrinsic, { (intptr_t)static_cast<NativeFunction>(jsInternalSettingsGeneratedPrototypeFunctionSetLayoutFallbackWidth), (intptr_t) (1) } },
    { "setLoadDeferringEnabled", JSC::Function, NoIntrinsic, { (intptr_t)static_cast<NativeFunction>(jsInternalSettingsGeneratedPrototypeFunctionSetLoadDeferringEnabled), (intptr_t) (1) } },
    { "setLoadsSiteIconsIgnoringImageLoadingSetting", JSC::Function, NoIntrinsic, { (intptr_t)static_cast<NativeFunction>(jsInternalSettingsGeneratedPrototypeFunctionSetLoadsSiteIconsIgnoringImageLoadingSetting), (intptr_t) (1) } },
    { "setLocalFileContentSniffingEnabled", JSC::Function, NoIntrinsic, { (intptr_t)static_cast<NativeFunction>(jsInternalSettingsGeneratedPrototypeFunctionSetLocalFileContentSniffingEnabled), (intptr_t) (1) } },
    { "setLocalStorageDatabasePath", JSC::Function, NoIntrinsic, { (intptr_t)static_cast<NativeFunction>(jsInternalSettingsGeneratedPrototypeFunctionSetLocalStorageDatabasePath), (intptr_t) (1) } },
    { "setLocalStorageEnabled", JSC::Function, NoIntrinsic, { (intptr_t)static_cast<NativeFunction>(jsInternalSettingsGeneratedPrototypeFunctionSetLocalStorageEnabled), (intptr_t) (1) } },
    { "setLogsPageMessagesToSystemConsoleEnabled", JSC::Function, NoIntrinsic, { (intptr_t)static_cast<NativeFunction>(jsInternalSettingsGeneratedPrototypeFunctionSetLogsPageMessagesToSystemConsoleEnabled), (intptr_t) (1) } },
    { "setMainContentUserGestureOverrideEnabled", JSC::Function, NoIntrinsic, { (intptr_t)static_cast<NativeFunction>(jsInternalSettingsGeneratedPrototypeFunctionSetMainContentUserGestureOverrideEnabled), (intptr_t) (1) } },
    { "setMaxParseDuration", JSC::Function, NoIntrinsic, { (intptr_t)static_cast<NativeFunction>(jsInternalSettingsGeneratedPrototypeFunctionSetMaxParseDuration), (intptr_t) (1) } },
    { "setMaximumHTMLParserDOMTreeDepth", JSC::Function, NoIntrinsic, { (intptr_t)static_cast<NativeFunction>(jsInternalSettingsGeneratedPrototypeFunctionSetMaximumHTMLParserDOMTreeDepth), (intptr_t) (1) } },
    { "setMaximumPlugInSnapshotAttempts", JSC::Function, NoIntrinsic, { (intptr_t)static_cast<NativeFunction>(jsInternalSettingsGeneratedPrototypeFunctionSetMaximumPlugInSnapshotAttempts), (intptr_t) (1) } },
    { "setMaximumSourceBufferSize", JSC::Function, NoIntrinsic, { (intptr_t)static_cast<NativeFunction>(jsInternalSettingsGeneratedPrototypeFunctionSetMaximumSourceBufferSize), (intptr_t) (1) } },
    { "setMediaControlsScaleWithPageZoom", JSC::Function, NoIntrinsic, { (intptr_t)static_cast<NativeFunction>(jsInternalSettingsGeneratedPrototypeFunctionSetMediaControlsScaleWithPageZoom), (intptr_t) (1) } },
    { "setMediaDataLoadsAutomatically", JSC::Function, NoIntrinsic, { (intptr_t)static_cast<NativeFunction>(jsInternalSettingsGeneratedPrototypeFunctionSetMediaDataLoadsAutomatically), (intptr_t) (1) } },
    { "setMediaEnabled", JSC::Function, NoIntrinsic, { (intptr_t)static_cast<NativeFunction>(jsInternalSettingsGeneratedPrototypeFunctionSetMediaEnabled), (intptr_t) (1) } },
    { "setMediaSourceEnabled", JSC::Function, NoIntrinsic, { (intptr_t)static_cast<NativeFunction>(jsInternalSettingsGeneratedPrototypeFunctionSetMediaSourceEnabled), (intptr_t) (1) } },
    { "setMediaStreamEnabled", JSC::Function, NoIntrinsic, { (intptr_t)static_cast<NativeFunction>(jsInternalSettingsGeneratedPrototypeFunctionSetMediaStreamEnabled), (intptr_t) (1) } },
    { "setMinimumAccelerated2dCanvasSize", JSC::Function, NoIntrinsic, { (intptr_t)static_cast<NativeFunction>(jsInternalSettingsGeneratedPrototypeFunctionSetMinimumAccelerated2dCanvasSize), (intptr_t) (1) } },
    { "setMinimumFontSize", JSC::Function, NoIntrinsic, { (intptr_t)static_cast<NativeFunction>(jsInternalSettingsGeneratedPrototypeFunctionSetMinimumFontSize), (intptr_t) (1) } },
    { "setMinimumLogicalFontSize", JSC::Function, NoIntrinsic, { (intptr_t)static_cast<NativeFunction>(jsInternalSettingsGeneratedPrototypeFunctionSetMinimumLogicalFontSize), (intptr_t) (1) } },
    { "setMinimumZoomFontSize", JSC::Function, NoIntrinsic, { (intptr_t)static_cast<NativeFunction>(jsInternalSettingsGeneratedPrototypeFunctionSetMinimumZoomFontSize), (intptr_t) (1) } },
    { "setNeedsIsLoadingInAPISenseQuirk", JSC::Function, NoIntrinsic, { (intptr_t)static_cast<NativeFunction>(jsInternalSettingsGeneratedPrototypeFunctionSetNeedsIsLoadingInAPISenseQuirk), (intptr_t) (1) } },
    { "setNeedsKeyboardEventDisambiguationQuirks", JSC::Function, NoIntrinsic, { (intptr_t)static_cast<NativeFunction>(jsInternalSettingsGeneratedPrototypeFunctionSetNeedsKeyboardEventDisambiguationQuirks), (intptr_t) (1) } },
    { "setNeedsSiteSpecificQuirks", JSC::Function, NoIntrinsic, { (intptr_t)static_cast<NativeFunction>(jsInternalSettingsGeneratedPrototypeFunctionSetNeedsSiteSpecificQuirks), (intptr_t) (1) } },
    { "setNewBlockInsideInlineModelEnabled", JSC::Function, NoIntrinsic, { (intptr_t)static_cast<NativeFunction>(jsInternalSettingsGeneratedPrototypeFunctionSetNewBlockInsideInlineModelEnabled), (intptr_t) (1) } },
    { "setNewCSSParserEnabled", JSC::Function, NoIntrinsic, { (intptr_t)static_cast<NativeFunction>(jsInternalSettingsGeneratedPrototypeFunctionSetNewCSSParserEnabled), (intptr_t) (1) } },
    { "setNotificationsEnabled", JSC::Function, NoIntrinsic, { (intptr_t)static_cast<NativeFunction>(jsInternalSettingsGeneratedPrototypeFunctionSetNotificationsEnabled), (intptr_t) (1) } },
    { "setOfflineWebApplicationCacheEnabled", JSC::Function, NoIntrinsic, { (intptr_t)static_cast<NativeFunction>(jsInternalSettingsGeneratedPrototypeFunctionSetOfflineWebApplicationCacheEnabled), (intptr_t) (1) } },
    { "setOpenGLMultisamplingEnabled", JSC::Function, NoIntrinsic, { (intptr_t)static_cast<NativeFunction>(jsInternalSettingsGeneratedPrototypeFunctionSetOpenGLMultisamplingEnabled), (intptr_t) (1) } },
    { "setPageCacheSupportsPlugins", JSC::Function, NoIntrinsic, { (intptr_t)static_cast<NativeFunction>(jsInternalSettingsGeneratedPrototypeFunctionSetPageCacheSupportsPlugins), (intptr_t) (1) } },
    { "setPaginateDuringLayoutEnabled", JSC::Function, NoIntrinsic, { (intptr_t)static_cast<NativeFunction>(jsInternalSettingsGeneratedPrototypeFunctionSetPaginateDuringLayoutEnabled), (intptr_t) (1) } },
    { "setPasswordEchoDurationInSeconds", JSC::Function, NoIntrinsic, { (intptr_t)static_cast<NativeFunction>(jsInternalSettingsGeneratedPrototypeFunctionSetPasswordEchoDurationInSeconds), (intptr_t) (1) } },
    { "setPasswordEchoEnabled", JSC::Function, NoIntrinsic, { (intptr_t)static_cast<NativeFunction>(jsInternalSettingsGeneratedPrototypeFunctionSetPasswordEchoEnabled), (intptr_t) (1) } },
    { "setPlugInSnapshottingEnabled", JSC::Function, NoIntrinsic, { (intptr_t)static_cast<NativeFunction>(jsInternalSettingsGeneratedPrototypeFunctionSetPlugInSnapshottingEnabled), (intptr_t) (1) } },
    { "setPreventKeyboardDOMEventDispatch", JSC::Function, NoIntrinsic, { (intptr_t)static_cast<NativeFunction>(jsInternalSettingsGeneratedPrototypeFunctionSetPreventKeyboardDOMEventDispatch), (intptr_t) (1) } },
    { "setPrimaryPlugInSnapshotDetectionEnabled", JSC::Function, NoIntrinsic, { (intptr_t)static_cast<NativeFunction>(jsInternalSettingsGeneratedPrototypeFunctionSetPrimaryPlugInSnapshotDetectionEnabled), (intptr_t) (1) } },
    { "setQuickTimePluginReplacementEnabled", JSC::Function, NoIntrinsic, { (intptr_t)static_cast<NativeFunction>(jsInternalSettingsGeneratedPrototypeFunctionSetQuickTimePluginReplacementEnabled), (intptr_t) (1) } },
    { "setRequestAnimationFrameEnabled", JSC::Function, NoIntrinsic, { (intptr_t)static_cast<NativeFunction>(jsInternalSettingsGeneratedPrototypeFunctionSetRequestAnimationFrameEnabled), (intptr_t) (1) } },
    { "setRubberBandingForSubScrollableRegionsEnabled", JSC::Function, NoIntrinsic, { (intptr_t)static_cast<NativeFunction>(jsInternalSettingsGeneratedPrototypeFunctionSetRubberBandingForSubScrollableRegionsEnabled), (intptr_t) (1) } },
    { "setScriptMarkupEnabled", JSC::Function, NoIntrinsic, { (intptr_t)static_cast<NativeFunction>(jsInternalSettingsGeneratedPrototypeFunctionSetScriptMarkupEnabled), (intptr_t) (1) } },
    { "setScrollAnimatorEnabled", JSC::Function, NoIntrinsic, { (intptr_t)static_cast<NativeFunction>(jsInternalSettingsGeneratedPrototypeFunctionSetScrollAnimatorEnabled), (intptr_t) (1) } },
    { "setScrollingCoordinatorEnabled", JSC::Function, NoIntrinsic, { (intptr_t)static_cast<NativeFunction>(jsInternalSettingsGeneratedPrototypeFunctionSetScrollingCoordinatorEnabled), (intptr_t) (1) } },
    { "setScrollingTreeIncludesFrames", JSC::Function, NoIntrinsic, { (intptr_t)static_cast<NativeFunction>(jsInternalSettingsGeneratedPrototypeFunctionSetScrollingTreeIncludesFrames), (intptr_t) (1) } },
    { "setSelectTrailingWhitespaceEnabled", JSC::Function, NoIntrinsic, { (intptr_t)static_cast<NativeFunction>(jsInternalSettingsGeneratedPrototypeFunctionSetSelectTrailingWhitespaceEnabled), (intptr_t) (1) } },
    { "setSelectionIncludesAltImageText", JSC::Function, NoIntrinsic, { (intptr_t)static_cast<NativeFunction>(jsInternalSettingsGeneratedPrototypeFunctionSetSelectionIncludesAltImageText), (intptr_t) (1) } },
    { "setSelectionPaintingWithoutSelectionGapsEnabled", JSC::Function, NoIntrinsic, { (intptr_t)static_cast<NativeFunction>(jsInternalSettingsGeneratedPrototypeFunctionSetSelectionPaintingWithoutSelectionGapsEnabled), (intptr_t) (1) } },
    { "setServiceControlsEnabled", JSC::Function, NoIntrinsic, { (intptr_t)static_cast<NativeFunction>(jsInternalSettingsGeneratedPrototypeFunctionSetServiceControlsEnabled), (intptr_t) (1) } },
    { "setSessionStorageQuota", JSC::Function, NoIntrinsic, { (intptr_t)static_cast<NativeFunction>(jsInternalSettingsGeneratedPrototypeFunctionSetSessionStorageQuota), (intptr_t) (1) } },
    { "setShouldConvertInvalidURLsToBlank", JSC::Function, NoIntrinsic, { (intptr_t)static_cast<NativeFunction>(jsInternalSettingsGeneratedPrototypeFunctionSetShouldConvertInvalidURLsToBlank), (intptr_t) (1) } },
    { "setShouldConvertPositionStyleOnCopy", JSC::Function, NoIntrinsic, { (intptr_t)static_cast<NativeFunction>(jsInternalSettingsGeneratedPrototypeFunctionSetShouldConvertPositionStyleOnCopy), (intptr_t) (1) } },
    { "setShouldDispatchJavaScriptWindowOnErrorEvents", JSC::Function, NoIntrinsic, { (intptr_t)static_cast<NativeFunction>(jsInternalSettingsGeneratedPrototypeFunctionSetShouldDispatchJavaScriptWindowOnErrorEvents), (intptr_t) (1) } },
    { "setShouldDisplayCaptions", JSC::Function, NoIntrinsic, { (intptr_t)static_cast<NativeFunction>(jsInternalSettingsGeneratedPrototypeFunctionSetShouldDisplayCaptions), (intptr_t) (1) } },
    { "setShouldDisplaySubtitles", JSC::Function, NoIntrinsic, { (intptr_t)static_cast<NativeFunction>(jsInternalSettingsGeneratedPrototypeFunctionSetShouldDisplaySubtitles), (intptr_t) (1) } },
    { "setShouldDisplayTextDescriptions", JSC::Function, NoIntrinsic, { (intptr_t)static_cast<NativeFunction>(jsInternalSettingsGeneratedPrototypeFunctionSetShouldDisplayTextDescriptions), (intptr_t) (1) } },
    { "setShouldInjectUserScriptsInInitialEmptyDocument", JSC::Function, NoIntrinsic, { (intptr_t)static_cast<NativeFunction>(jsInternalSettingsGeneratedPrototypeFunctionSetShouldInjectUserScriptsInInitialEmptyDocument), (intptr_t) (1) } },
    { "setShouldPrintBackgrounds", JSC::Function, NoIntrinsic, { (intptr_t)static_cast<NativeFunction>(jsInternalSettingsGeneratedPrototypeFunctionSetShouldPrintBackgrounds), (intptr_t) (1) } },
    { "setShouldRespectImageOrientation", JSC::Function, NoIntrinsic, { (intptr_t)static_cast<NativeFunction>(jsInternalSettingsGeneratedPrototypeFunctionSetShouldRespectImageOrientation), (intptr_t) (1) } },
    { "setShouldTransformsAffectOverflow", JSC::Function, NoIntrinsic, { (intptr_t)static_cast<NativeFunction>(jsInternalSettingsGeneratedPrototypeFunctionSetShouldTransformsAffectOverflow), (intptr_t) (1) } },
    { "setShowDebugBorders", JSC::Function, NoIntrinsic, { (intptr_t)static_cast<NativeFunction>(jsInternalSettingsGeneratedPrototypeFunctionSetShowDebugBorders), (intptr_t) (1) } },
    { "setShowRepaintCounter", JSC::Function, NoIntrinsic, { (intptr_t)static_cast<NativeFunction>(jsInternalSettingsGeneratedPrototypeFunctionSetShowRepaintCounter), (intptr_t) (1) } },
    { "setShowsToolTipOverTruncatedText", JSC::Function, NoIntrinsic, { (intptr_t)static_cast<NativeFunction>(jsInternalSettingsGeneratedPrototypeFunctionSetShowsToolTipOverTruncatedText), (intptr_t) (1) } },
    { "setShowsURLsInToolTips", JSC::Function, NoIntrinsic, { (intptr_t)static_cast<NativeFunction>(jsInternalSettingsGeneratedPrototypeFunctionSetShowsURLsInToolTips), (intptr_t) (1) } },
    { "setShrinksStandaloneImagesToFit", JSC::Function, NoIntrinsic, { (intptr_t)static_cast<NativeFunction>(jsInternalSettingsGeneratedPrototypeFunctionSetShrinksStandaloneImagesToFit), (intptr_t) (1) } },
    { "setSimpleLineLayoutDebugBordersEnabled", JSC::Function, NoIntrinsic, { (intptr_t)static_cast<NativeFunction>(jsInternalSettingsGeneratedPrototypeFunctionSetSimpleLineLayoutDebugBordersEnabled), (intptr_t) (1) } },
    { "setSimpleLineLayoutEnabled", JSC::Function, NoIntrinsic, { (intptr_t)static_cast<NativeFunction>(jsInternalSettingsGeneratedPrototypeFunctionSetSimpleLineLayoutEnabled), (intptr_t) (1) } },
    { "setSmartInsertDeleteEnabled", JSC::Function, NoIntrinsic, { (intptr_t)static_cast<NativeFunction>(jsInternalSettingsGeneratedPrototypeFunctionSetSmartInsertDeleteEnabled), (intptr_t) (1) } },
    { "setSnapshotAllPlugIns", JSC::Function, NoIntrinsic, { (intptr_t)static_cast<NativeFunction>(jsInternalSettingsGeneratedPrototypeFunctionSetSnapshotAllPlugIns), (intptr_t) (1) } },
    { "setSpatialNavigationEnabled", JSC::Function, NoIntrinsic, { (intptr_t)static_cast<NativeFunction>(jsInternalSettingsGeneratedPrototypeFunctionSetSpatialNavigationEnabled), (intptr_t) (1) } },
    { "setSpringTimingFunctionEnabled", JSC::Function, NoIntrinsic, { (intptr_t)static_cast<NativeFunction>(jsInternalSettingsGeneratedPrototypeFunctionSetSpringTimingFunctionEnabled), (intptr_t) (1) } },
    { "setStandalone", JSC::Function, NoIntrinsic, { (intptr_t)static_cast<NativeFunction>(jsInternalSettingsGeneratedPrototypeFunctionSetStandalone), (intptr_t) (1) } },
    { "setSubpixelCSSOMElementMetricsEnabled", JSC::Function, NoIntrinsic, { (intptr_t)static_cast<NativeFunction>(jsInternalSettingsGeneratedPrototypeFunctionSetSubpixelCSSOMElementMetricsEnabled), (intptr_t) (1) } },
    { "setSuppressesIncrementalRendering", JSC::Function, NoIntrinsic, { (intptr_t)static_cast<NativeFunction>(jsInternalSettingsGeneratedPrototypeFunctionSetSuppressesIncrementalRendering), (intptr_t) (1) } },
    { "setSyncXHRInDocumentsEnabled", JSC::Function, NoIntrinsic, { (intptr_t)static_cast<NativeFunction>(jsInternalSettingsGeneratedPrototypeFunctionSetSyncXHRInDocumentsEnabled), (intptr_t) (1) } },
    { "setTelephoneNumberParsingEnabled", JSC::Function, NoIntrinsic, { (intptr_t)static_cast<NativeFunction>(jsInternalSettingsGeneratedPrototypeFunctionSetTelephoneNumberParsingEnabled), (intptr_t) (1) } },
    { "setTemporaryTileCohortRetentionEnabled", JSC::Function, NoIntrinsic, { (intptr_t)static_cast<NativeFunction>(jsInternalSettingsGeneratedPrototypeFunctionSetTemporaryTileCohortRetentionEnabled), (intptr_t) (1) } },
    { "setTextAreasAreResizable", JSC::Function, NoIntrinsic, { (intptr_t)static_cast<NativeFunction>(jsInternalSettingsGeneratedPrototypeFunctionSetTextAreasAreResizable), (intptr_t) (1) } },
    { "setTextAutosizingEnabled", JSC::Function, NoIntrinsic, { (intptr_t)static_cast<NativeFunction>(jsInternalSettingsGeneratedPrototypeFunctionSetTextAutosizingEnabled), (intptr_t) (1) } },
    { "setTreatIPAddressAsDomain", JSC::Function, NoIntrinsic, { (intptr_t)static_cast<NativeFunction>(jsInternalSettingsGeneratedPrototypeFunctionSetTreatIPAddressAsDomain), (intptr_t) (1) } },
    { "setTreatsAnyTextCSSLinkAsStylesheet", JSC::Function, NoIntrinsic, { (intptr_t)static_cast<NativeFunction>(jsInternalSettingsGeneratedPrototypeFunctionSetTreatsAnyTextCSSLinkAsStylesheet), (intptr_t) (1) } },
    { "setUnifiedTextCheckerEnabled", JSC::Function, NoIntrinsic, { (intptr_t)static_cast<NativeFunction>(jsInternalSettingsGeneratedPrototypeFunctionSetUnifiedTextCheckerEnabled), (intptr_t) (1) } },
    { "setUnsafePluginPastingEnabled", JSC::Function, NoIntrinsic, { (intptr_t)static_cast<NativeFunction>(jsInternalSettingsGeneratedPrototypeFunctionSetUnsafePluginPastingEnabled), (intptr_t) (1) } },
    { "setUseGiantTiles", JSC::Function, NoIntrinsic, { (intptr_t)static_cast<NativeFunction>(jsInternalSettingsGeneratedPrototypeFunctionSetUseGiantTiles), (intptr_t) (1) } },
    { "setUseImageDocumentForSubframePDF", JSC::Function, NoIntrinsic, { (intptr_t)static_cast<NativeFunction>(jsInternalSettingsGeneratedPrototypeFunctionSetUseImageDocumentForSubframePDF), (intptr_t) (1) } },
    { "setUseLegacyBackgroundSizeShorthandBehavior", JSC::Function, NoIntrinsic, { (intptr_t)static_cast<NativeFunction>(jsInternalSettingsGeneratedPrototypeFunctionSetUseLegacyBackgroundSizeShorthandBehavior), (intptr_t) (1) } },
    { "setUseLegacyTextAlignPositionedElementBehavior", JSC::Function, NoIntrinsic, { (intptr_t)static_cast<NativeFunction>(jsInternalSettingsGeneratedPrototypeFunctionSetUseLegacyTextAlignPositionedElementBehavior), (intptr_t) (1) } },
    { "setUsePreHTML5ParserQuirks", JSC::Function, NoIntrinsic, { (intptr_t)static_cast<NativeFunction>(jsInternalSettingsGeneratedPrototypeFunctionSetUsePreHTML5ParserQuirks), (intptr_t) (1) } },
    { "setUsesDashboardBackwardCompatibilityMode", JSC::Function, NoIntrinsic, { (intptr_t)static_cast<NativeFunction>(jsInternalSettingsGeneratedPrototypeFunctionSetUsesDashboardBackwardCompatibilityMode), (intptr_t) (1) } },
    { "setUsesEncodingDetector", JSC::Function, NoIntrinsic, { (intptr_t)static_cast<NativeFunction>(jsInternalSettingsGeneratedPrototypeFunctionSetUsesEncodingDetector), (intptr_t) (1) } },
    { "setValidationMessageTimerMagnification", JSC::Function, NoIntrinsic, { (intptr_t)static_cast<NativeFunction>(jsInternalSettingsGeneratedPrototypeFunctionSetValidationMessageTimerMagnification), (intptr_t) (1) } },
    { "setVideoPlaybackRequiresUserGesture", JSC::Function, NoIntrinsic, { (intptr_t)static_cast<NativeFunction>(jsInternalSettingsGeneratedPrototypeFunctionSetVideoPlaybackRequiresUserGesture), (intptr_t) (1) } },
    { "setVisualViewportEnabled", JSC::Function, NoIntrinsic, { (intptr_t)static_cast<NativeFunction>(jsInternalSettingsGeneratedPrototypeFunctionSetVisualViewportEnabled), (intptr_t) (1) } },
    { "setWantsBalancedSetDefersLoadingBehavior", JSC::Function, NoIntrinsic, { (intptr_t)static_cast<NativeFunction>(jsInternalSettingsGeneratedPrototypeFunctionSetWantsBalancedSetDefersLoadingBehavior), (intptr_t) (1) } },
    { "setWebArchiveDebugModeEnabled", JSC::Function, NoIntrinsic, { (intptr_t)static_cast<NativeFunction>(jsInternalSettingsGeneratedPrototypeFunctionSetWebArchiveDebugModeEnabled), (intptr_t) (1) } },
    { "setWebAudioEnabled", JSC::Function, NoIntrinsic, { (intptr_t)static_cast<NativeFunction>(jsInternalSettingsGeneratedPrototypeFunctionSetWebAudioEnabled), (intptr_t) (1) } },
    { "setWebGLEnabled", JSC::Function, NoIntrinsic, { (intptr_t)static_cast<NativeFunction>(jsInternalSettingsGeneratedPrototypeFunctionSetWebGLEnabled), (intptr_t) (1) } },
    { "setWebGLErrorsToConsoleEnabled", JSC::Function, NoIntrinsic, { (intptr_t)static_cast<NativeFunction>(jsInternalSettingsGeneratedPrototypeFunctionSetWebGLErrorsToConsoleEnabled), (intptr_t) (1) } },
    { "setWebSecurityEnabled", JSC::Function, NoIntrinsic, { (intptr_t)static_cast<NativeFunction>(jsInternalSettingsGeneratedPrototypeFunctionSetWebSecurityEnabled), (intptr_t) (1) } },
    { "setWindowFocusRestricted", JSC::Function, NoIntrinsic, { (intptr_t)static_cast<NativeFunction>(jsInternalSettingsGeneratedPrototypeFunctionSetWindowFocusRestricted), (intptr_t) (1) } },
    { "setXSSAuditorEnabled", JSC::Function, NoIntrinsic, { (intptr_t)static_cast<NativeFunction>(jsInternalSettingsGeneratedPrototypeFunctionSetXSSAuditorEnabled), (intptr_t) (1) } },
    { "setYouTubeFlashPluginReplacementEnabled", JSC::Function, NoIntrinsic, { (intptr_t)static_cast<NativeFunction>(jsInternalSettingsGeneratedPrototypeFunctionSetYouTubeFlashPluginReplacementEnabled), (intptr_t) (1) } },
};

const ClassInfo JSInternalSettingsGeneratedPrototype::s_info = { "InternalSettingsGeneratedPrototype", &Base::s_info, 0, CREATE_METHOD_TABLE(JSInternalSettingsGeneratedPrototype) };

void JSInternalSettingsGeneratedPrototype::finishCreation(VM& vm)
{
    Base::finishCreation(vm);
    reifyStaticProperties(vm, JSInternalSettingsGeneratedPrototypeTableValues, *this);
}

const ClassInfo JSInternalSettingsGenerated::s_info = { "InternalSettingsGenerated", &Base::s_info, 0, CREATE_METHOD_TABLE(JSInternalSettingsGenerated) };

JSInternalSettingsGenerated::JSInternalSettingsGenerated(Structure* structure, JSDOMGlobalObject& globalObject, Ref<InternalSettingsGenerated>&& impl)
    : JSDOMWrapper<InternalSettingsGenerated>(structure, globalObject, WTFMove(impl))
{
}

JSObject* JSInternalSettingsGenerated::createPrototype(VM& vm, JSGlobalObject* globalObject)
{
    return JSInternalSettingsGeneratedPrototype::create(vm, globalObject, JSInternalSettingsGeneratedPrototype::createStructure(vm, globalObject, globalObject->objectPrototype()));
}

JSObject* JSInternalSettingsGenerated::prototype(VM& vm, JSGlobalObject* globalObject)
{
    return getDOMPrototype<JSInternalSettingsGenerated>(vm, globalObject);
}

void JSInternalSettingsGenerated::destroy(JSC::JSCell* cell)
{
    JSInternalSettingsGenerated* thisObject = static_cast<JSInternalSettingsGenerated*>(cell);
    thisObject->JSInternalSettingsGenerated::~JSInternalSettingsGenerated();
}

EncodedJSValue JSC_HOST_CALL jsInternalSettingsGeneratedPrototypeFunctionSetDOMPasteAllowed(ExecState* state)
{
    VM& vm = state->vm();
    auto throwScope = DECLARE_THROW_SCOPE(vm);
    UNUSED_PARAM(throwScope);
    JSValue thisValue = state->thisValue();
    auto castedThis = jsDynamicCast<JSInternalSettingsGenerated*>(thisValue);
    if (UNLIKELY(!castedThis))
        return throwThisTypeError(*state, throwScope, "InternalSettingsGenerated", "setDOMPasteAllowed");
    ASSERT_GC_OBJECT_INHERITS(castedThis, JSInternalSettingsGenerated::info());
    auto& impl = castedThis->wrapped();
    if (UNLIKELY(state->argumentCount() < 1))
        return throwVMError(state, throwScope, createNotEnoughArgumentsError(state));
    auto DOMPasteAllowed = state->uncheckedArgument(0).toBoolean(state);
    RETURN_IF_EXCEPTION(throwScope, encodedJSValue());
    impl.setDOMPasteAllowed(WTFMove(DOMPasteAllowed));
    return JSValue::encode(jsUndefined());
}

EncodedJSValue JSC_HOST_CALL jsInternalSettingsGeneratedPrototypeFunctionSetAccelerated2dCanvasEnabled(ExecState* state)
{
    VM& vm = state->vm();
    auto throwScope = DECLARE_THROW_SCOPE(vm);
    UNUSED_PARAM(throwScope);
    JSValue thisValue = state->thisValue();
    auto castedThis = jsDynamicCast<JSInternalSettingsGenerated*>(thisValue);
    if (UNLIKELY(!castedThis))
        return throwThisTypeError(*state, throwScope, "InternalSettingsGenerated", "setAccelerated2dCanvasEnabled");
    ASSERT_GC_OBJECT_INHERITS(castedThis, JSInternalSettingsGenerated::info());
    auto& impl = castedThis->wrapped();
    if (UNLIKELY(state->argumentCount() < 1))
        return throwVMError(state, throwScope, createNotEnoughArgumentsError(state));
    auto accelerated2dCanvasEnabled = state->uncheckedArgument(0).toBoolean(state);
    RETURN_IF_EXCEPTION(throwScope, encodedJSValue());
    impl.setAccelerated2dCanvasEnabled(WTFMove(accelerated2dCanvasEnabled));
    return JSValue::encode(jsUndefined());
}

EncodedJSValue JSC_HOST_CALL jsInternalSettingsGeneratedPrototypeFunctionSetAcceleratedCompositedAnimationsEnabled(ExecState* state)
{
    VM& vm = state->vm();
    auto throwScope = DECLARE_THROW_SCOPE(vm);
    UNUSED_PARAM(throwScope);
    JSValue thisValue = state->thisValue();
    auto castedThis = jsDynamicCast<JSInternalSettingsGenerated*>(thisValue);
    if (UNLIKELY(!castedThis))
        return throwThisTypeError(*state, throwScope, "InternalSettingsGenerated", "setAcceleratedCompositedAnimationsEnabled");
    ASSERT_GC_OBJECT_INHERITS(castedThis, JSInternalSettingsGenerated::info());
    auto& impl = castedThis->wrapped();
    if (UNLIKELY(state->argumentCount() < 1))
        return throwVMError(state, throwScope, createNotEnoughArgumentsError(state));
    auto acceleratedCompositedAnimationsEnabled = state->uncheckedArgument(0).toBoolean(state);
    RETURN_IF_EXCEPTION(throwScope, encodedJSValue());
    impl.setAcceleratedCompositedAnimationsEnabled(WTFMove(acceleratedCompositedAnimationsEnabled));
    return JSValue::encode(jsUndefined());
}

EncodedJSValue JSC_HOST_CALL jsInternalSettingsGeneratedPrototypeFunctionSetAcceleratedCompositingEnabled(ExecState* state)
{
    VM& vm = state->vm();
    auto throwScope = DECLARE_THROW_SCOPE(vm);
    UNUSED_PARAM(throwScope);
    JSValue thisValue = state->thisValue();
    auto castedThis = jsDynamicCast<JSInternalSettingsGenerated*>(thisValue);
    if (UNLIKELY(!castedThis))
        return throwThisTypeError(*state, throwScope, "InternalSettingsGenerated", "setAcceleratedCompositingEnabled");
    ASSERT_GC_OBJECT_INHERITS(castedThis, JSInternalSettingsGenerated::info());
    auto& impl = castedThis->wrapped();
    if (UNLIKELY(state->argumentCount() < 1))
        return throwVMError(state, throwScope, createNotEnoughArgumentsError(state));
    auto acceleratedCompositingEnabled = state->uncheckedArgument(0).toBoolean(state);
    RETURN_IF_EXCEPTION(throwScope, encodedJSValue());
    impl.setAcceleratedCompositingEnabled(WTFMove(acceleratedCompositingEnabled));
    return JSValue::encode(jsUndefined());
}

EncodedJSValue JSC_HOST_CALL jsInternalSettingsGeneratedPrototypeFunctionSetAcceleratedCompositingForFixedPositionEnabled(ExecState* state)
{
    VM& vm = state->vm();
    auto throwScope = DECLARE_THROW_SCOPE(vm);
    UNUSED_PARAM(throwScope);
    JSValue thisValue = state->thisValue();
    auto castedThis = jsDynamicCast<JSInternalSettingsGenerated*>(thisValue);
    if (UNLIKELY(!castedThis))
        return throwThisTypeError(*state, throwScope, "InternalSettingsGenerated", "setAcceleratedCompositingForFixedPositionEnabled");
    ASSERT_GC_OBJECT_INHERITS(castedThis, JSInternalSettingsGenerated::info());
    auto& impl = castedThis->wrapped();
    if (UNLIKELY(state->argumentCount() < 1))
        return throwVMError(state, throwScope, createNotEnoughArgumentsError(state));
    auto acceleratedCompositingForFixedPositionEnabled = state->uncheckedArgument(0).toBoolean(state);
    RETURN_IF_EXCEPTION(throwScope, encodedJSValue());
    impl.setAcceleratedCompositingForFixedPositionEnabled(WTFMove(acceleratedCompositingForFixedPositionEnabled));
    return JSValue::encode(jsUndefined());
}

EncodedJSValue JSC_HOST_CALL jsInternalSettingsGeneratedPrototypeFunctionSetAcceleratedCompositingForOverflowScrollEnabled(ExecState* state)
{
    VM& vm = state->vm();
    auto throwScope = DECLARE_THROW_SCOPE(vm);
    UNUSED_PARAM(throwScope);
    JSValue thisValue = state->thisValue();
    auto castedThis = jsDynamicCast<JSInternalSettingsGenerated*>(thisValue);
    if (UNLIKELY(!castedThis))
        return throwThisTypeError(*state, throwScope, "InternalSettingsGenerated", "setAcceleratedCompositingForOverflowScrollEnabled");
    ASSERT_GC_OBJECT_INHERITS(castedThis, JSInternalSettingsGenerated::info());
    auto& impl = castedThis->wrapped();
    if (UNLIKELY(state->argumentCount() < 1))
        return throwVMError(state, throwScope, createNotEnoughArgumentsError(state));
    auto acceleratedCompositingForOverflowScrollEnabled = state->uncheckedArgument(0).toBoolean(state);
    RETURN_IF_EXCEPTION(throwScope, encodedJSValue());
    impl.setAcceleratedCompositingForOverflowScrollEnabled(WTFMove(acceleratedCompositingForOverflowScrollEnabled));
    return JSValue::encode(jsUndefined());
}

EncodedJSValue JSC_HOST_CALL jsInternalSettingsGeneratedPrototypeFunctionSetAcceleratedDrawingEnabled(ExecState* state)
{
    VM& vm = state->vm();
    auto throwScope = DECLARE_THROW_SCOPE(vm);
    UNUSED_PARAM(throwScope);
    JSValue thisValue = state->thisValue();
    auto castedThis = jsDynamicCast<JSInternalSettingsGenerated*>(thisValue);
    if (UNLIKELY(!castedThis))
        return throwThisTypeError(*state, throwScope, "InternalSettingsGenerated", "setAcceleratedDrawingEnabled");
    ASSERT_GC_OBJECT_INHERITS(castedThis, JSInternalSettingsGenerated::info());
    auto& impl = castedThis->wrapped();
    if (UNLIKELY(state->argumentCount() < 1))
        return throwVMError(state, throwScope, createNotEnoughArgumentsError(state));
    auto acceleratedDrawingEnabled = state->uncheckedArgument(0).toBoolean(state);
    RETURN_IF_EXCEPTION(throwScope, encodedJSValue());
    impl.setAcceleratedDrawingEnabled(WTFMove(acceleratedDrawingEnabled));
    return JSValue::encode(jsUndefined());
}

EncodedJSValue JSC_HOST_CALL jsInternalSettingsGeneratedPrototypeFunctionSetAcceleratedFiltersEnabled(ExecState* state)
{
    VM& vm = state->vm();
    auto throwScope = DECLARE_THROW_SCOPE(vm);
    UNUSED_PARAM(throwScope);
    JSValue thisValue = state->thisValue();
    auto castedThis = jsDynamicCast<JSInternalSettingsGenerated*>(thisValue);
    if (UNLIKELY(!castedThis))
        return throwThisTypeError(*state, throwScope, "InternalSettingsGenerated", "setAcceleratedFiltersEnabled");
    ASSERT_GC_OBJECT_INHERITS(castedThis, JSInternalSettingsGenerated::info());
    auto& impl = castedThis->wrapped();
    if (UNLIKELY(state->argumentCount() < 1))
        return throwVMError(state, throwScope, createNotEnoughArgumentsError(state));
    auto acceleratedFiltersEnabled = state->uncheckedArgument(0).toBoolean(state);
    RETURN_IF_EXCEPTION(throwScope, encodedJSValue());
    impl.setAcceleratedFiltersEnabled(WTFMove(acceleratedFiltersEnabled));
    return JSValue::encode(jsUndefined());
}

EncodedJSValue JSC_HOST_CALL jsInternalSettingsGeneratedPrototypeFunctionSetAggressiveTileRetentionEnabled(ExecState* state)
{
    VM& vm = state->vm();
    auto throwScope = DECLARE_THROW_SCOPE(vm);
    UNUSED_PARAM(throwScope);
    JSValue thisValue = state->thisValue();
    auto castedThis = jsDynamicCast<JSInternalSettingsGenerated*>(thisValue);
    if (UNLIKELY(!castedThis))
        return throwThisTypeError(*state, throwScope, "InternalSettingsGenerated", "setAggressiveTileRetentionEnabled");
    ASSERT_GC_OBJECT_INHERITS(castedThis, JSInternalSettingsGenerated::info());
    auto& impl = castedThis->wrapped();
    if (UNLIKELY(state->argumentCount() < 1))
        return throwVMError(state, throwScope, createNotEnoughArgumentsError(state));
    auto aggressiveTileRetentionEnabled = state->uncheckedArgument(0).toBoolean(state);
    RETURN_IF_EXCEPTION(throwScope, encodedJSValue());
    impl.setAggressiveTileRetentionEnabled(WTFMove(aggressiveTileRetentionEnabled));
    return JSValue::encode(jsUndefined());
}

EncodedJSValue JSC_HOST_CALL jsInternalSettingsGeneratedPrototypeFunctionSetAllowContentSecurityPolicySourceStarToMatchAnyProtocol(ExecState* state)
{
    VM& vm = state->vm();
    auto throwScope = DECLARE_THROW_SCOPE(vm);
    UNUSED_PARAM(throwScope);
    JSValue thisValue = state->thisValue();
    auto castedThis = jsDynamicCast<JSInternalSettingsGenerated*>(thisValue);
    if (UNLIKELY(!castedThis))
        return throwThisTypeError(*state, throwScope, "InternalSettingsGenerated", "setAllowContentSecurityPolicySourceStarToMatchAnyProtocol");
    ASSERT_GC_OBJECT_INHERITS(castedThis, JSInternalSettingsGenerated::info());
    auto& impl = castedThis->wrapped();
    if (UNLIKELY(state->argumentCount() < 1))
        return throwVMError(state, throwScope, createNotEnoughArgumentsError(state));
    auto allowContentSecurityPolicySourceStarToMatchAnyProtocol = state->uncheckedArgument(0).toBoolean(state);
    RETURN_IF_EXCEPTION(throwScope, encodedJSValue());
    impl.setAllowContentSecurityPolicySourceStarToMatchAnyProtocol(WTFMove(allowContentSecurityPolicySourceStarToMatchAnyProtocol));
    return JSValue::encode(jsUndefined());
}

EncodedJSValue JSC_HOST_CALL jsInternalSettingsGeneratedPrototypeFunctionSetAllowCustomScrollbarInMainFrame(ExecState* state)
{
    VM& vm = state->vm();
    auto throwScope = DECLARE_THROW_SCOPE(vm);
    UNUSED_PARAM(throwScope);
    JSValue thisValue = state->thisValue();
    auto castedThis = jsDynamicCast<JSInternalSettingsGenerated*>(thisValue);
    if (UNLIKELY(!castedThis))
        return throwThisTypeError(*state, throwScope, "InternalSettingsGenerated", "setAllowCustomScrollbarInMainFrame");
    ASSERT_GC_OBJECT_INHERITS(castedThis, JSInternalSettingsGenerated::info());
    auto& impl = castedThis->wrapped();
    if (UNLIKELY(state->argumentCount() < 1))
        return throwVMError(state, throwScope, createNotEnoughArgumentsError(state));
    auto allowCustomScrollbarInMainFrame = state->uncheckedArgument(0).toBoolean(state);
    RETURN_IF_EXCEPTION(throwScope, encodedJSValue());
    impl.setAllowCustomScrollbarInMainFrame(WTFMove(allowCustomScrollbarInMainFrame));
    return JSValue::encode(jsUndefined());
}

EncodedJSValue JSC_HOST_CALL jsInternalSettingsGeneratedPrototypeFunctionSetAllowDisplayOfInsecureContent(ExecState* state)
{
    VM& vm = state->vm();
    auto throwScope = DECLARE_THROW_SCOPE(vm);
    UNUSED_PARAM(throwScope);
    JSValue thisValue = state->thisValue();
    auto castedThis = jsDynamicCast<JSInternalSettingsGenerated*>(thisValue);
    if (UNLIKELY(!castedThis))
        return throwThisTypeError(*state, throwScope, "InternalSettingsGenerated", "setAllowDisplayOfInsecureContent");
    ASSERT_GC_OBJECT_INHERITS(castedThis, JSInternalSettingsGenerated::info());
    auto& impl = castedThis->wrapped();
    if (UNLIKELY(state->argumentCount() < 1))
        return throwVMError(state, throwScope, createNotEnoughArgumentsError(state));
    auto allowDisplayOfInsecureContent = state->uncheckedArgument(0).toBoolean(state);
    RETURN_IF_EXCEPTION(throwScope, encodedJSValue());
    impl.setAllowDisplayOfInsecureContent(WTFMove(allowDisplayOfInsecureContent));
    return JSValue::encode(jsUndefined());
}

EncodedJSValue JSC_HOST_CALL jsInternalSettingsGeneratedPrototypeFunctionSetAllowFileAccessFromFileURLs(ExecState* state)
{
    VM& vm = state->vm();
    auto throwScope = DECLARE_THROW_SCOPE(vm);
    UNUSED_PARAM(throwScope);
    JSValue thisValue = state->thisValue();
    auto castedThis = jsDynamicCast<JSInternalSettingsGenerated*>(thisValue);
    if (UNLIKELY(!castedThis))
        return throwThisTypeError(*state, throwScope, "InternalSettingsGenerated", "setAllowFileAccessFromFileURLs");
    ASSERT_GC_OBJECT_INHERITS(castedThis, JSInternalSettingsGenerated::info());
    auto& impl = castedThis->wrapped();
    if (UNLIKELY(state->argumentCount() < 1))
        return throwVMError(state, throwScope, createNotEnoughArgumentsError(state));
    auto allowFileAccessFromFileURLs = state->uncheckedArgument(0).toBoolean(state);
    RETURN_IF_EXCEPTION(throwScope, encodedJSValue());
    impl.setAllowFileAccessFromFileURLs(WTFMove(allowFileAccessFromFileURLs));
    return JSValue::encode(jsUndefined());
}

EncodedJSValue JSC_HOST_CALL jsInternalSettingsGeneratedPrototypeFunctionSetAllowMultiElementImplicitSubmission(ExecState* state)
{
    VM& vm = state->vm();
    auto throwScope = DECLARE_THROW_SCOPE(vm);
    UNUSED_PARAM(throwScope);
    JSValue thisValue = state->thisValue();
    auto castedThis = jsDynamicCast<JSInternalSettingsGenerated*>(thisValue);
    if (UNLIKELY(!castedThis))
        return throwThisTypeError(*state, throwScope, "InternalSettingsGenerated", "setAllowMultiElementImplicitSubmission");
    ASSERT_GC_OBJECT_INHERITS(castedThis, JSInternalSettingsGenerated::info());
    auto& impl = castedThis->wrapped();
    if (UNLIKELY(state->argumentCount() < 1))
        return throwVMError(state, throwScope, createNotEnoughArgumentsError(state));
    auto allowMultiElementImplicitSubmission = state->uncheckedArgument(0).toBoolean(state);
    RETURN_IF_EXCEPTION(throwScope, encodedJSValue());
    impl.setAllowMultiElementImplicitSubmission(WTFMove(allowMultiElementImplicitSubmission));
    return JSValue::encode(jsUndefined());
}

EncodedJSValue JSC_HOST_CALL jsInternalSettingsGeneratedPrototypeFunctionSetAllowRunningOfInsecureContent(ExecState* state)
{
    VM& vm = state->vm();
    auto throwScope = DECLARE_THROW_SCOPE(vm);
    UNUSED_PARAM(throwScope);
    JSValue thisValue = state->thisValue();
    auto castedThis = jsDynamicCast<JSInternalSettingsGenerated*>(thisValue);
    if (UNLIKELY(!castedThis))
        return throwThisTypeError(*state, throwScope, "InternalSettingsGenerated", "setAllowRunningOfInsecureContent");
    ASSERT_GC_OBJECT_INHERITS(castedThis, JSInternalSettingsGenerated::info());
    auto& impl = castedThis->wrapped();
    if (UNLIKELY(state->argumentCount() < 1))
        return throwVMError(state, throwScope, createNotEnoughArgumentsError(state));
    auto allowRunningOfInsecureContent = state->uncheckedArgument(0).toBoolean(state);
    RETURN_IF_EXCEPTION(throwScope, encodedJSValue());
    impl.setAllowRunningOfInsecureContent(WTFMove(allowRunningOfInsecureContent));
    return JSValue::encode(jsUndefined());
}

EncodedJSValue JSC_HOST_CALL jsInternalSettingsGeneratedPrototypeFunctionSetAllowScriptsToCloseWindows(ExecState* state)
{
    VM& vm = state->vm();
    auto throwScope = DECLARE_THROW_SCOPE(vm);
    UNUSED_PARAM(throwScope);
    JSValue thisValue = state->thisValue();
    auto castedThis = jsDynamicCast<JSInternalSettingsGenerated*>(thisValue);
    if (UNLIKELY(!castedThis))
        return throwThisTypeError(*state, throwScope, "InternalSettingsGenerated", "setAllowScriptsToCloseWindows");
    ASSERT_GC_OBJECT_INHERITS(castedThis, JSInternalSettingsGenerated::info());
    auto& impl = castedThis->wrapped();
    if (UNLIKELY(state->argumentCount() < 1))
        return throwVMError(state, throwScope, createNotEnoughArgumentsError(state));
    auto allowScriptsToCloseWindows = state->uncheckedArgument(0).toBoolean(state);
    RETURN_IF_EXCEPTION(throwScope, encodedJSValue());
    impl.setAllowScriptsToCloseWindows(WTFMove(allowScriptsToCloseWindows));
    return JSValue::encode(jsUndefined());
}

EncodedJSValue JSC_HOST_CALL jsInternalSettingsGeneratedPrototypeFunctionSetAllowUniversalAccessFromFileURLs(ExecState* state)
{
    VM& vm = state->vm();
    auto throwScope = DECLARE_THROW_SCOPE(vm);
    UNUSED_PARAM(throwScope);
    JSValue thisValue = state->thisValue();
    auto castedThis = jsDynamicCast<JSInternalSettingsGenerated*>(thisValue);
    if (UNLIKELY(!castedThis))
        return throwThisTypeError(*state, throwScope, "InternalSettingsGenerated", "setAllowUniversalAccessFromFileURLs");
    ASSERT_GC_OBJECT_INHERITS(castedThis, JSInternalSettingsGenerated::info());
    auto& impl = castedThis->wrapped();
    if (UNLIKELY(state->argumentCount() < 1))
        return throwVMError(state, throwScope, createNotEnoughArgumentsError(state));
    auto allowUniversalAccessFromFileURLs = state->uncheckedArgument(0).toBoolean(state);
    RETURN_IF_EXCEPTION(throwScope, encodedJSValue());
    impl.setAllowUniversalAccessFromFileURLs(WTFMove(allowUniversalAccessFromFileURLs));
    return JSValue::encode(jsUndefined());
}

EncodedJSValue JSC_HOST_CALL jsInternalSettingsGeneratedPrototypeFunctionSetAllowWindowOpenWithoutUserGesture(ExecState* state)
{
    VM& vm = state->vm();
    auto throwScope = DECLARE_THROW_SCOPE(vm);
    UNUSED_PARAM(throwScope);
    JSValue thisValue = state->thisValue();
    auto castedThis = jsDynamicCast<JSInternalSettingsGenerated*>(thisValue);
    if (UNLIKELY(!castedThis))
        return throwThisTypeError(*state, throwScope, "InternalSettingsGenerated", "setAllowWindowOpenWithoutUserGesture");
    ASSERT_GC_OBJECT_INHERITS(castedThis, JSInternalSettingsGenerated::info());
    auto& impl = castedThis->wrapped();
    if (UNLIKELY(state->argumentCount() < 1))
        return throwVMError(state, throwScope, createNotEnoughArgumentsError(state));
    auto allowWindowOpenWithoutUserGesture = state->uncheckedArgument(0).toBoolean(state);
    RETURN_IF_EXCEPTION(throwScope, encodedJSValue());
    impl.setAllowWindowOpenWithoutUserGesture(WTFMove(allowWindowOpenWithoutUserGesture));
    return JSValue::encode(jsUndefined());
}

EncodedJSValue JSC_HOST_CALL jsInternalSettingsGeneratedPrototypeFunctionSetAllowsAirPlayForMediaPlayback(ExecState* state)
{
    VM& vm = state->vm();
    auto throwScope = DECLARE_THROW_SCOPE(vm);
    UNUSED_PARAM(throwScope);
    JSValue thisValue = state->thisValue();
    auto castedThis = jsDynamicCast<JSInternalSettingsGenerated*>(thisValue);
    if (UNLIKELY(!castedThis))
        return throwThisTypeError(*state, throwScope, "InternalSettingsGenerated", "setAllowsAirPlayForMediaPlayback");
    ASSERT_GC_OBJECT_INHERITS(castedThis, JSInternalSettingsGenerated::info());
    auto& impl = castedThis->wrapped();
    if (UNLIKELY(state->argumentCount() < 1))
        return throwVMError(state, throwScope, createNotEnoughArgumentsError(state));
    auto allowsAirPlayForMediaPlayback = state->uncheckedArgument(0).toBoolean(state);
    RETURN_IF_EXCEPTION(throwScope, encodedJSValue());
    impl.setAllowsAirPlayForMediaPlayback(WTFMove(allowsAirPlayForMediaPlayback));
    return JSValue::encode(jsUndefined());
}

EncodedJSValue JSC_HOST_CALL jsInternalSettingsGeneratedPrototypeFunctionSetAllowsInlineMediaPlayback(ExecState* state)
{
    VM& vm = state->vm();
    auto throwScope = DECLARE_THROW_SCOPE(vm);
    UNUSED_PARAM(throwScope);
    JSValue thisValue = state->thisValue();
    auto castedThis = jsDynamicCast<JSInternalSettingsGenerated*>(thisValue);
    if (UNLIKELY(!castedThis))
        return throwThisTypeError(*state, throwScope, "InternalSettingsGenerated", "setAllowsInlineMediaPlayback");
    ASSERT_GC_OBJECT_INHERITS(castedThis, JSInternalSettingsGenerated::info());
    auto& impl = castedThis->wrapped();
    if (UNLIKELY(state->argumentCount() < 1))
        return throwVMError(state, throwScope, createNotEnoughArgumentsError(state));
    auto allowsInlineMediaPlayback = state->uncheckedArgument(0).toBoolean(state);
    RETURN_IF_EXCEPTION(throwScope, encodedJSValue());
    impl.setAllowsInlineMediaPlayback(WTFMove(allowsInlineMediaPlayback));
    return JSValue::encode(jsUndefined());
}

EncodedJSValue JSC_HOST_CALL jsInternalSettingsGeneratedPrototypeFunctionSetAllowsInlineMediaPlaybackAfterFullscreen(ExecState* state)
{
    VM& vm = state->vm();
    auto throwScope = DECLARE_THROW_SCOPE(vm);
    UNUSED_PARAM(throwScope);
    JSValue thisValue = state->thisValue();
    auto castedThis = jsDynamicCast<JSInternalSettingsGenerated*>(thisValue);
    if (UNLIKELY(!castedThis))
        return throwThisTypeError(*state, throwScope, "InternalSettingsGenerated", "setAllowsInlineMediaPlaybackAfterFullscreen");
    ASSERT_GC_OBJECT_INHERITS(castedThis, JSInternalSettingsGenerated::info());
    auto& impl = castedThis->wrapped();
    if (UNLIKELY(state->argumentCount() < 1))
        return throwVMError(state, throwScope, createNotEnoughArgumentsError(state));
    auto allowsInlineMediaPlaybackAfterFullscreen = state->uncheckedArgument(0).toBoolean(state);
    RETURN_IF_EXCEPTION(throwScope, encodedJSValue());
    impl.setAllowsInlineMediaPlaybackAfterFullscreen(WTFMove(allowsInlineMediaPlaybackAfterFullscreen));
    return JSValue::encode(jsUndefined());
}

EncodedJSValue JSC_HOST_CALL jsInternalSettingsGeneratedPrototypeFunctionSetAllowsPictureInPictureMediaPlayback(ExecState* state)
{
    VM& vm = state->vm();
    auto throwScope = DECLARE_THROW_SCOPE(vm);
    UNUSED_PARAM(throwScope);
    JSValue thisValue = state->thisValue();
    auto castedThis = jsDynamicCast<JSInternalSettingsGenerated*>(thisValue);
    if (UNLIKELY(!castedThis))
        return throwThisTypeError(*state, throwScope, "InternalSettingsGenerated", "setAllowsPictureInPictureMediaPlayback");
    ASSERT_GC_OBJECT_INHERITS(castedThis, JSInternalSettingsGenerated::info());
    auto& impl = castedThis->wrapped();
    if (UNLIKELY(state->argumentCount() < 1))
        return throwVMError(state, throwScope, createNotEnoughArgumentsError(state));
    auto allowsPictureInPictureMediaPlayback = state->uncheckedArgument(0).toBoolean(state);
    RETURN_IF_EXCEPTION(throwScope, encodedJSValue());
    impl.setAllowsPictureInPictureMediaPlayback(WTFMove(allowsPictureInPictureMediaPlayback));
    return JSValue::encode(jsUndefined());
}

EncodedJSValue JSC_HOST_CALL jsInternalSettingsGeneratedPrototypeFunctionSetAlwaysUseAcceleratedOverflowScroll(ExecState* state)
{
    VM& vm = state->vm();
    auto throwScope = DECLARE_THROW_SCOPE(vm);
    UNUSED_PARAM(throwScope);
    JSValue thisValue = state->thisValue();
    auto castedThis = jsDynamicCast<JSInternalSettingsGenerated*>(thisValue);
    if (UNLIKELY(!castedThis))
        return throwThisTypeError(*state, throwScope, "InternalSettingsGenerated", "setAlwaysUseAcceleratedOverflowScroll");
    ASSERT_GC_OBJECT_INHERITS(castedThis, JSInternalSettingsGenerated::info());
    auto& impl = castedThis->wrapped();
    if (UNLIKELY(state->argumentCount() < 1))
        return throwVMError(state, throwScope, createNotEnoughArgumentsError(state));
    auto alwaysUseAcceleratedOverflowScroll = state->uncheckedArgument(0).toBoolean(state);
    RETURN_IF_EXCEPTION(throwScope, encodedJSValue());
    impl.setAlwaysUseAcceleratedOverflowScroll(WTFMove(alwaysUseAcceleratedOverflowScroll));
    return JSValue::encode(jsUndefined());
}

EncodedJSValue JSC_HOST_CALL jsInternalSettingsGeneratedPrototypeFunctionSetAntialiased2dCanvasEnabled(ExecState* state)
{
    VM& vm = state->vm();
    auto throwScope = DECLARE_THROW_SCOPE(vm);
    UNUSED_PARAM(throwScope);
    JSValue thisValue = state->thisValue();
    auto castedThis = jsDynamicCast<JSInternalSettingsGenerated*>(thisValue);
    if (UNLIKELY(!castedThis))
        return throwThisTypeError(*state, throwScope, "InternalSettingsGenerated", "setAntialiased2dCanvasEnabled");
    ASSERT_GC_OBJECT_INHERITS(castedThis, JSInternalSettingsGenerated::info());
    auto& impl = castedThis->wrapped();
    if (UNLIKELY(state->argumentCount() < 1))
        return throwVMError(state, throwScope, createNotEnoughArgumentsError(state));
    auto antialiased2dCanvasEnabled = state->uncheckedArgument(0).toBoolean(state);
    RETURN_IF_EXCEPTION(throwScope, encodedJSValue());
    impl.setAntialiased2dCanvasEnabled(WTFMove(antialiased2dCanvasEnabled));
    return JSValue::encode(jsUndefined());
}

EncodedJSValue JSC_HOST_CALL jsInternalSettingsGeneratedPrototypeFunctionSetAppleMailPaginationQuirkEnabled(ExecState* state)
{
    VM& vm = state->vm();
    auto throwScope = DECLARE_THROW_SCOPE(vm);
    UNUSED_PARAM(throwScope);
    JSValue thisValue = state->thisValue();
    auto castedThis = jsDynamicCast<JSInternalSettingsGenerated*>(thisValue);
    if (UNLIKELY(!castedThis))
        return throwThisTypeError(*state, throwScope, "InternalSettingsGenerated", "setAppleMailPaginationQuirkEnabled");
    ASSERT_GC_OBJECT_INHERITS(castedThis, JSInternalSettingsGenerated::info());
    auto& impl = castedThis->wrapped();
    if (UNLIKELY(state->argumentCount() < 1))
        return throwVMError(state, throwScope, createNotEnoughArgumentsError(state));
    auto appleMailPaginationQuirkEnabled = state->uncheckedArgument(0).toBoolean(state);
    RETURN_IF_EXCEPTION(throwScope, encodedJSValue());
    impl.setAppleMailPaginationQuirkEnabled(WTFMove(appleMailPaginationQuirkEnabled));
    return JSValue::encode(jsUndefined());
}

EncodedJSValue JSC_HOST_CALL jsInternalSettingsGeneratedPrototypeFunctionSetAsynchronousSpellCheckingEnabled(ExecState* state)
{
    VM& vm = state->vm();
    auto throwScope = DECLARE_THROW_SCOPE(vm);
    UNUSED_PARAM(throwScope);
    JSValue thisValue = state->thisValue();
    auto castedThis = jsDynamicCast<JSInternalSettingsGenerated*>(thisValue);
    if (UNLIKELY(!castedThis))
        return throwThisTypeError(*state, throwScope, "InternalSettingsGenerated", "setAsynchronousSpellCheckingEnabled");
    ASSERT_GC_OBJECT_INHERITS(castedThis, JSInternalSettingsGenerated::info());
    auto& impl = castedThis->wrapped();
    if (UNLIKELY(state->argumentCount() < 1))
        return throwVMError(state, throwScope, createNotEnoughArgumentsError(state));
    auto asynchronousSpellCheckingEnabled = state->uncheckedArgument(0).toBoolean(state);
    RETURN_IF_EXCEPTION(throwScope, encodedJSValue());
    impl.setAsynchronousSpellCheckingEnabled(WTFMove(asynchronousSpellCheckingEnabled));
    return JSValue::encode(jsUndefined());
}

EncodedJSValue JSC_HOST_CALL jsInternalSettingsGeneratedPrototypeFunctionSetAttachmentElementEnabled(ExecState* state)
{
    VM& vm = state->vm();
    auto throwScope = DECLARE_THROW_SCOPE(vm);
    UNUSED_PARAM(throwScope);
    JSValue thisValue = state->thisValue();
    auto castedThis = jsDynamicCast<JSInternalSettingsGenerated*>(thisValue);
    if (UNLIKELY(!castedThis))
        return throwThisTypeError(*state, throwScope, "InternalSettingsGenerated", "setAttachmentElementEnabled");
    ASSERT_GC_OBJECT_INHERITS(castedThis, JSInternalSettingsGenerated::info());
    auto& impl = castedThis->wrapped();
    if (UNLIKELY(state->argumentCount() < 1))
        return throwVMError(state, throwScope, createNotEnoughArgumentsError(state));
    auto attachmentElementEnabled = state->uncheckedArgument(0).toBoolean(state);
    RETURN_IF_EXCEPTION(throwScope, encodedJSValue());
    impl.setAttachmentElementEnabled(WTFMove(attachmentElementEnabled));
    return JSValue::encode(jsUndefined());
}

EncodedJSValue JSC_HOST_CALL jsInternalSettingsGeneratedPrototypeFunctionSetAudioPlaybackRequiresUserGesture(ExecState* state)
{
    VM& vm = state->vm();
    auto throwScope = DECLARE_THROW_SCOPE(vm);
    UNUSED_PARAM(throwScope);
    JSValue thisValue = state->thisValue();
    auto castedThis = jsDynamicCast<JSInternalSettingsGenerated*>(thisValue);
    if (UNLIKELY(!castedThis))
        return throwThisTypeError(*state, throwScope, "InternalSettingsGenerated", "setAudioPlaybackRequiresUserGesture");
    ASSERT_GC_OBJECT_INHERITS(castedThis, JSInternalSettingsGenerated::info());
    auto& impl = castedThis->wrapped();
    if (UNLIKELY(state->argumentCount() < 1))
        return throwVMError(state, throwScope, createNotEnoughArgumentsError(state));
    auto audioPlaybackRequiresUserGesture = state->uncheckedArgument(0).toBoolean(state);
    RETURN_IF_EXCEPTION(throwScope, encodedJSValue());
    impl.setAudioPlaybackRequiresUserGesture(WTFMove(audioPlaybackRequiresUserGesture));
    return JSValue::encode(jsUndefined());
}

EncodedJSValue JSC_HOST_CALL jsInternalSettingsGeneratedPrototypeFunctionSetAuthorAndUserStylesEnabled(ExecState* state)
{
    VM& vm = state->vm();
    auto throwScope = DECLARE_THROW_SCOPE(vm);
    UNUSED_PARAM(throwScope);
    JSValue thisValue = state->thisValue();
    auto castedThis = jsDynamicCast<JSInternalSettingsGenerated*>(thisValue);
    if (UNLIKELY(!castedThis))
        return throwThisTypeError(*state, throwScope, "InternalSettingsGenerated", "setAuthorAndUserStylesEnabled");
    ASSERT_GC_OBJECT_INHERITS(castedThis, JSInternalSettingsGenerated::info());
    auto& impl = castedThis->wrapped();
    if (UNLIKELY(state->argumentCount() < 1))
        return throwVMError(state, throwScope, createNotEnoughArgumentsError(state));
    auto authorAndUserStylesEnabled = state->uncheckedArgument(0).toBoolean(state);
    RETURN_IF_EXCEPTION(throwScope, encodedJSValue());
    impl.setAuthorAndUserStylesEnabled(WTFMove(authorAndUserStylesEnabled));
    return JSValue::encode(jsUndefined());
}

EncodedJSValue JSC_HOST_CALL jsInternalSettingsGeneratedPrototypeFunctionSetAutoscrollForDragAndDropEnabled(ExecState* state)
{
    VM& vm = state->vm();
    auto throwScope = DECLARE_THROW_SCOPE(vm);
    UNUSED_PARAM(throwScope);
    JSValue thisValue = state->thisValue();
    auto castedThis = jsDynamicCast<JSInternalSettingsGenerated*>(thisValue);
    if (UNLIKELY(!castedThis))
        return throwThisTypeError(*state, throwScope, "InternalSettingsGenerated", "setAutoscrollForDragAndDropEnabled");
    ASSERT_GC_OBJECT_INHERITS(castedThis, JSInternalSettingsGenerated::info());
    auto& impl = castedThis->wrapped();
    if (UNLIKELY(state->argumentCount() < 1))
        return throwVMError(state, throwScope, createNotEnoughArgumentsError(state));
    auto autoscrollForDragAndDropEnabled = state->uncheckedArgument(0).toBoolean(state);
    RETURN_IF_EXCEPTION(throwScope, encodedJSValue());
    impl.setAutoscrollForDragAndDropEnabled(WTFMove(autoscrollForDragAndDropEnabled));
    return JSValue::encode(jsUndefined());
}

EncodedJSValue JSC_HOST_CALL jsInternalSettingsGeneratedPrototypeFunctionSetAutostartOriginPlugInSnapshottingEnabled(ExecState* state)
{
    VM& vm = state->vm();
    auto throwScope = DECLARE_THROW_SCOPE(vm);
    UNUSED_PARAM(throwScope);
    JSValue thisValue = state->thisValue();
    auto castedThis = jsDynamicCast<JSInternalSettingsGenerated*>(thisValue);
    if (UNLIKELY(!castedThis))
        return throwThisTypeError(*state, throwScope, "InternalSettingsGenerated", "setAutostartOriginPlugInSnapshottingEnabled");
    ASSERT_GC_OBJECT_INHERITS(castedThis, JSInternalSettingsGenerated::info());
    auto& impl = castedThis->wrapped();
    if (UNLIKELY(state->argumentCount() < 1))
        return throwVMError(state, throwScope, createNotEnoughArgumentsError(state));
    auto autostartOriginPlugInSnapshottingEnabled = state->uncheckedArgument(0).toBoolean(state);
    RETURN_IF_EXCEPTION(throwScope, encodedJSValue());
    impl.setAutostartOriginPlugInSnapshottingEnabled(WTFMove(autostartOriginPlugInSnapshottingEnabled));
    return JSValue::encode(jsUndefined());
}

EncodedJSValue JSC_HOST_CALL jsInternalSettingsGeneratedPrototypeFunctionSetBackForwardCacheExpirationInterval(ExecState* state)
{
    VM& vm = state->vm();
    auto throwScope = DECLARE_THROW_SCOPE(vm);
    UNUSED_PARAM(throwScope);
    JSValue thisValue = state->thisValue();
    auto castedThis = jsDynamicCast<JSInternalSettingsGenerated*>(thisValue);
    if (UNLIKELY(!castedThis))
        return throwThisTypeError(*state, throwScope, "InternalSettingsGenerated", "setBackForwardCacheExpirationInterval");
    ASSERT_GC_OBJECT_INHERITS(castedThis, JSInternalSettingsGenerated::info());
    auto& impl = castedThis->wrapped();
    if (UNLIKELY(state->argumentCount() < 1))
        return throwVMError(state, throwScope, createNotEnoughArgumentsError(state));
    auto backForwardCacheExpirationInterval = convert<double>(*state, state->uncheckedArgument(0), ShouldAllowNonFinite::No);
    RETURN_IF_EXCEPTION(throwScope, encodedJSValue());
    impl.setBackForwardCacheExpirationInterval(WTFMove(backForwardCacheExpirationInterval));
    return JSValue::encode(jsUndefined());
}

EncodedJSValue JSC_HOST_CALL jsInternalSettingsGeneratedPrototypeFunctionSetBackspaceKeyNavigationEnabled(ExecState* state)
{
    VM& vm = state->vm();
    auto throwScope = DECLARE_THROW_SCOPE(vm);
    UNUSED_PARAM(throwScope);
    JSValue thisValue = state->thisValue();
    auto castedThis = jsDynamicCast<JSInternalSettingsGenerated*>(thisValue);
    if (UNLIKELY(!castedThis))
        return throwThisTypeError(*state, throwScope, "InternalSettingsGenerated", "setBackspaceKeyNavigationEnabled");
    ASSERT_GC_OBJECT_INHERITS(castedThis, JSInternalSettingsGenerated::info());
    auto& impl = castedThis->wrapped();
    if (UNLIKELY(state->argumentCount() < 1))
        return throwVMError(state, throwScope, createNotEnoughArgumentsError(state));
    auto backspaceKeyNavigationEnabled = state->uncheckedArgument(0).toBoolean(state);
    RETURN_IF_EXCEPTION(throwScope, encodedJSValue());
    impl.setBackspaceKeyNavigationEnabled(WTFMove(backspaceKeyNavigationEnabled));
    return JSValue::encode(jsUndefined());
}

EncodedJSValue JSC_HOST_CALL jsInternalSettingsGeneratedPrototypeFunctionSetCanvasUsesAcceleratedDrawing(ExecState* state)
{
    VM& vm = state->vm();
    auto throwScope = DECLARE_THROW_SCOPE(vm);
    UNUSED_PARAM(throwScope);
    JSValue thisValue = state->thisValue();
    auto castedThis = jsDynamicCast<JSInternalSettingsGenerated*>(thisValue);
    if (UNLIKELY(!castedThis))
        return throwThisTypeError(*state, throwScope, "InternalSettingsGenerated", "setCanvasUsesAcceleratedDrawing");
    ASSERT_GC_OBJECT_INHERITS(castedThis, JSInternalSettingsGenerated::info());
    auto& impl = castedThis->wrapped();
    if (UNLIKELY(state->argumentCount() < 1))
        return throwVMError(state, throwScope, createNotEnoughArgumentsError(state));
    auto canvasUsesAcceleratedDrawing = state->uncheckedArgument(0).toBoolean(state);
    RETURN_IF_EXCEPTION(throwScope, encodedJSValue());
    impl.setCanvasUsesAcceleratedDrawing(WTFMove(canvasUsesAcceleratedDrawing));
    return JSValue::encode(jsUndefined());
}

EncodedJSValue JSC_HOST_CALL jsInternalSettingsGeneratedPrototypeFunctionSetCaretBrowsingEnabled(ExecState* state)
{
    VM& vm = state->vm();
    auto throwScope = DECLARE_THROW_SCOPE(vm);
    UNUSED_PARAM(throwScope);
    JSValue thisValue = state->thisValue();
    auto castedThis = jsDynamicCast<JSInternalSettingsGenerated*>(thisValue);
    if (UNLIKELY(!castedThis))
        return throwThisTypeError(*state, throwScope, "InternalSettingsGenerated", "setCaretBrowsingEnabled");
    ASSERT_GC_OBJECT_INHERITS(castedThis, JSInternalSettingsGenerated::info());
    auto& impl = castedThis->wrapped();
    if (UNLIKELY(state->argumentCount() < 1))
        return throwVMError(state, throwScope, createNotEnoughArgumentsError(state));
    auto caretBrowsingEnabled = state->uncheckedArgument(0).toBoolean(state);
    RETURN_IF_EXCEPTION(throwScope, encodedJSValue());
    impl.setCaretBrowsingEnabled(WTFMove(caretBrowsingEnabled));
    return JSValue::encode(jsUndefined());
}

EncodedJSValue JSC_HOST_CALL jsInternalSettingsGeneratedPrototypeFunctionSetContentDispositionAttachmentSandboxEnabled(ExecState* state)
{
    VM& vm = state->vm();
    auto throwScope = DECLARE_THROW_SCOPE(vm);
    UNUSED_PARAM(throwScope);
    JSValue thisValue = state->thisValue();
    auto castedThis = jsDynamicCast<JSInternalSettingsGenerated*>(thisValue);
    if (UNLIKELY(!castedThis))
        return throwThisTypeError(*state, throwScope, "InternalSettingsGenerated", "setContentDispositionAttachmentSandboxEnabled");
    ASSERT_GC_OBJECT_INHERITS(castedThis, JSInternalSettingsGenerated::info());
    auto& impl = castedThis->wrapped();
    if (UNLIKELY(state->argumentCount() < 1))
        return throwVMError(state, throwScope, createNotEnoughArgumentsError(state));
    auto contentDispositionAttachmentSandboxEnabled = state->uncheckedArgument(0).toBoolean(state);
    RETURN_IF_EXCEPTION(throwScope, encodedJSValue());
    impl.setContentDispositionAttachmentSandboxEnabled(WTFMove(contentDispositionAttachmentSandboxEnabled));
    return JSValue::encode(jsUndefined());
}

EncodedJSValue JSC_HOST_CALL jsInternalSettingsGeneratedPrototypeFunctionSetCookieEnabled(ExecState* state)
{
    VM& vm = state->vm();
    auto throwScope = DECLARE_THROW_SCOPE(vm);
    UNUSED_PARAM(throwScope);
    JSValue thisValue = state->thisValue();
    auto castedThis = jsDynamicCast<JSInternalSettingsGenerated*>(thisValue);
    if (UNLIKELY(!castedThis))
        return throwThisTypeError(*state, throwScope, "InternalSettingsGenerated", "setCookieEnabled");
    ASSERT_GC_OBJECT_INHERITS(castedThis, JSInternalSettingsGenerated::info());
    auto& impl = castedThis->wrapped();
    if (UNLIKELY(state->argumentCount() < 1))
        return throwVMError(state, throwScope, createNotEnoughArgumentsError(state));
    auto cookieEnabled = state->uncheckedArgument(0).toBoolean(state);
    RETURN_IF_EXCEPTION(throwScope, encodedJSValue());
    impl.setCookieEnabled(WTFMove(cookieEnabled));
    return JSValue::encode(jsUndefined());
}

EncodedJSValue JSC_HOST_CALL jsInternalSettingsGeneratedPrototypeFunctionSetCrossOriginCheckInGetMatchedCSSRulesDisabled(ExecState* state)
{
    VM& vm = state->vm();
    auto throwScope = DECLARE_THROW_SCOPE(vm);
    UNUSED_PARAM(throwScope);
    JSValue thisValue = state->thisValue();
    auto castedThis = jsDynamicCast<JSInternalSettingsGenerated*>(thisValue);
    if (UNLIKELY(!castedThis))
        return throwThisTypeError(*state, throwScope, "InternalSettingsGenerated", "setCrossOriginCheckInGetMatchedCSSRulesDisabled");
    ASSERT_GC_OBJECT_INHERITS(castedThis, JSInternalSettingsGenerated::info());
    auto& impl = castedThis->wrapped();
    if (UNLIKELY(state->argumentCount() < 1))
        return throwVMError(state, throwScope, createNotEnoughArgumentsError(state));
    auto crossOriginCheckInGetMatchedCSSRulesDisabled = state->uncheckedArgument(0).toBoolean(state);
    RETURN_IF_EXCEPTION(throwScope, encodedJSValue());
    impl.setCrossOriginCheckInGetMatchedCSSRulesDisabled(WTFMove(crossOriginCheckInGetMatchedCSSRulesDisabled));
    return JSValue::encode(jsUndefined());
}

EncodedJSValue JSC_HOST_CALL jsInternalSettingsGeneratedPrototypeFunctionSetDefaultFixedFontSize(ExecState* state)
{
    VM& vm = state->vm();
    auto throwScope = DECLARE_THROW_SCOPE(vm);
    UNUSED_PARAM(throwScope);
    JSValue thisValue = state->thisValue();
    auto castedThis = jsDynamicCast<JSInternalSettingsGenerated*>(thisValue);
    if (UNLIKELY(!castedThis))
        return throwThisTypeError(*state, throwScope, "InternalSettingsGenerated", "setDefaultFixedFontSize");
    ASSERT_GC_OBJECT_INHERITS(castedThis, JSInternalSettingsGenerated::info());
    auto& impl = castedThis->wrapped();
    if (UNLIKELY(state->argumentCount() < 1))
        return throwVMError(state, throwScope, createNotEnoughArgumentsError(state));
    auto defaultFixedFontSize = convert<int32_t>(*state, state->uncheckedArgument(0), NormalConversion);
    RETURN_IF_EXCEPTION(throwScope, encodedJSValue());
    impl.setDefaultFixedFontSize(WTFMove(defaultFixedFontSize));
    return JSValue::encode(jsUndefined());
}

EncodedJSValue JSC_HOST_CALL jsInternalSettingsGeneratedPrototypeFunctionSetDefaultFontSize(ExecState* state)
{
    VM& vm = state->vm();
    auto throwScope = DECLARE_THROW_SCOPE(vm);
    UNUSED_PARAM(throwScope);
    JSValue thisValue = state->thisValue();
    auto castedThis = jsDynamicCast<JSInternalSettingsGenerated*>(thisValue);
    if (UNLIKELY(!castedThis))
        return throwThisTypeError(*state, throwScope, "InternalSettingsGenerated", "setDefaultFontSize");
    ASSERT_GC_OBJECT_INHERITS(castedThis, JSInternalSettingsGenerated::info());
    auto& impl = castedThis->wrapped();
    if (UNLIKELY(state->argumentCount() < 1))
        return throwVMError(state, throwScope, createNotEnoughArgumentsError(state));
    auto defaultFontSize = convert<int32_t>(*state, state->uncheckedArgument(0), NormalConversion);
    RETURN_IF_EXCEPTION(throwScope, encodedJSValue());
    impl.setDefaultFontSize(WTFMove(defaultFontSize));
    return JSValue::encode(jsUndefined());
}

EncodedJSValue JSC_HOST_CALL jsInternalSettingsGeneratedPrototypeFunctionSetDefaultTextEncodingName(ExecState* state)
{
    VM& vm = state->vm();
    auto throwScope = DECLARE_THROW_SCOPE(vm);
    UNUSED_PARAM(throwScope);
    JSValue thisValue = state->thisValue();
    auto castedThis = jsDynamicCast<JSInternalSettingsGenerated*>(thisValue);
    if (UNLIKELY(!castedThis))
        return throwThisTypeError(*state, throwScope, "InternalSettingsGenerated", "setDefaultTextEncodingName");
    ASSERT_GC_OBJECT_INHERITS(castedThis, JSInternalSettingsGenerated::info());
    auto& impl = castedThis->wrapped();
    if (UNLIKELY(state->argumentCount() < 1))
        return throwVMError(state, throwScope, createNotEnoughArgumentsError(state));
    auto defaultTextEncodingName = state->uncheckedArgument(0).toWTFString(state);
    RETURN_IF_EXCEPTION(throwScope, encodedJSValue());
    impl.setDefaultTextEncodingName(WTFMove(defaultTextEncodingName));
    return JSValue::encode(jsUndefined());
}

EncodedJSValue JSC_HOST_CALL jsInternalSettingsGeneratedPrototypeFunctionSetDefaultVideoPosterURL(ExecState* state)
{
    VM& vm = state->vm();
    auto throwScope = DECLARE_THROW_SCOPE(vm);
    UNUSED_PARAM(throwScope);
    JSValue thisValue = state->thisValue();
    auto castedThis = jsDynamicCast<JSInternalSettingsGenerated*>(thisValue);
    if (UNLIKELY(!castedThis))
        return throwThisTypeError(*state, throwScope, "InternalSettingsGenerated", "setDefaultVideoPosterURL");
    ASSERT_GC_OBJECT_INHERITS(castedThis, JSInternalSettingsGenerated::info());
    auto& impl = castedThis->wrapped();
    if (UNLIKELY(state->argumentCount() < 1))
        return throwVMError(state, throwScope, createNotEnoughArgumentsError(state));
    auto defaultVideoPosterURL = state->uncheckedArgument(0).toWTFString(state);
    RETURN_IF_EXCEPTION(throwScope, encodedJSValue());
    impl.setDefaultVideoPosterURL(WTFMove(defaultVideoPosterURL));
    return JSValue::encode(jsUndefined());
}

EncodedJSValue JSC_HOST_CALL jsInternalSettingsGeneratedPrototypeFunctionSetDelegatesPageScaling(ExecState* state)
{
    VM& vm = state->vm();
    auto throwScope = DECLARE_THROW_SCOPE(vm);
    UNUSED_PARAM(throwScope);
    JSValue thisValue = state->thisValue();
    auto castedThis = jsDynamicCast<JSInternalSettingsGenerated*>(thisValue);
    if (UNLIKELY(!castedThis))
        return throwThisTypeError(*state, throwScope, "InternalSettingsGenerated", "setDelegatesPageScaling");
    ASSERT_GC_OBJECT_INHERITS(castedThis, JSInternalSettingsGenerated::info());
    auto& impl = castedThis->wrapped();
    if (UNLIKELY(state->argumentCount() < 1))
        return throwVMError(state, throwScope, createNotEnoughArgumentsError(state));
    auto delegatesPageScaling = state->uncheckedArgument(0).toBoolean(state);
    RETURN_IF_EXCEPTION(throwScope, encodedJSValue());
    impl.setDelegatesPageScaling(WTFMove(delegatesPageScaling));
    return JSValue::encode(jsUndefined());
}

EncodedJSValue JSC_HOST_CALL jsInternalSettingsGeneratedPrototypeFunctionSetDeveloperExtrasEnabled(ExecState* state)
{
    VM& vm = state->vm();
    auto throwScope = DECLARE_THROW_SCOPE(vm);
    UNUSED_PARAM(throwScope);
    JSValue thisValue = state->thisValue();
    auto castedThis = jsDynamicCast<JSInternalSettingsGenerated*>(thisValue);
    if (UNLIKELY(!castedThis))
        return throwThisTypeError(*state, throwScope, "InternalSettingsGenerated", "setDeveloperExtrasEnabled");
    ASSERT_GC_OBJECT_INHERITS(castedThis, JSInternalSettingsGenerated::info());
    auto& impl = castedThis->wrapped();
    if (UNLIKELY(state->argumentCount() < 1))
        return throwVMError(state, throwScope, createNotEnoughArgumentsError(state));
    auto developerExtrasEnabled = state->uncheckedArgument(0).toBoolean(state);
    RETURN_IF_EXCEPTION(throwScope, encodedJSValue());
    impl.setDeveloperExtrasEnabled(WTFMove(developerExtrasEnabled));
    return JSValue::encode(jsUndefined());
}

EncodedJSValue JSC_HOST_CALL jsInternalSettingsGeneratedPrototypeFunctionSetDeviceHeight(ExecState* state)
{
    VM& vm = state->vm();
    auto throwScope = DECLARE_THROW_SCOPE(vm);
    UNUSED_PARAM(throwScope);
    JSValue thisValue = state->thisValue();
    auto castedThis = jsDynamicCast<JSInternalSettingsGenerated*>(thisValue);
    if (UNLIKELY(!castedThis))
        return throwThisTypeError(*state, throwScope, "InternalSettingsGenerated", "setDeviceHeight");
    ASSERT_GC_OBJECT_INHERITS(castedThis, JSInternalSettingsGenerated::info());
    auto& impl = castedThis->wrapped();
    if (UNLIKELY(state->argumentCount() < 1))
        return throwVMError(state, throwScope, createNotEnoughArgumentsError(state));
    auto deviceHeight = convert<int32_t>(*state, state->uncheckedArgument(0), NormalConversion);
    RETURN_IF_EXCEPTION(throwScope, encodedJSValue());
    impl.setDeviceHeight(WTFMove(deviceHeight));
    return JSValue::encode(jsUndefined());
}

EncodedJSValue JSC_HOST_CALL jsInternalSettingsGeneratedPrototypeFunctionSetDeviceWidth(ExecState* state)
{
    VM& vm = state->vm();
    auto throwScope = DECLARE_THROW_SCOPE(vm);
    UNUSED_PARAM(throwScope);
    JSValue thisValue = state->thisValue();
    auto castedThis = jsDynamicCast<JSInternalSettingsGenerated*>(thisValue);
    if (UNLIKELY(!castedThis))
        return throwThisTypeError(*state, throwScope, "InternalSettingsGenerated", "setDeviceWidth");
    ASSERT_GC_OBJECT_INHERITS(castedThis, JSInternalSettingsGenerated::info());
    auto& impl = castedThis->wrapped();
    if (UNLIKELY(state->argumentCount() < 1))
        return throwVMError(state, throwScope, createNotEnoughArgumentsError(state));
    auto deviceWidth = convert<int32_t>(*state, state->uncheckedArgument(0), NormalConversion);
    RETURN_IF_EXCEPTION(throwScope, encodedJSValue());
    impl.setDeviceWidth(WTFMove(deviceWidth));
    return JSValue::encode(jsUndefined());
}

EncodedJSValue JSC_HOST_CALL jsInternalSettingsGeneratedPrototypeFunctionSetDiagnosticLoggingEnabled(ExecState* state)
{
    VM& vm = state->vm();
    auto throwScope = DECLARE_THROW_SCOPE(vm);
    UNUSED_PARAM(throwScope);
    JSValue thisValue = state->thisValue();
    auto castedThis = jsDynamicCast<JSInternalSettingsGenerated*>(thisValue);
    if (UNLIKELY(!castedThis))
        return throwThisTypeError(*state, throwScope, "InternalSettingsGenerated", "setDiagnosticLoggingEnabled");
    ASSERT_GC_OBJECT_INHERITS(castedThis, JSInternalSettingsGenerated::info());
    auto& impl = castedThis->wrapped();
    if (UNLIKELY(state->argumentCount() < 1))
        return throwVMError(state, throwScope, createNotEnoughArgumentsError(state));
    auto diagnosticLoggingEnabled = state->uncheckedArgument(0).toBoolean(state);
    RETURN_IF_EXCEPTION(throwScope, encodedJSValue());
    impl.setDiagnosticLoggingEnabled(WTFMove(diagnosticLoggingEnabled));
    return JSValue::encode(jsUndefined());
}

EncodedJSValue JSC_HOST_CALL jsInternalSettingsGeneratedPrototypeFunctionSetDisplayListDrawingEnabled(ExecState* state)
{
    VM& vm = state->vm();
    auto throwScope = DECLARE_THROW_SCOPE(vm);
    UNUSED_PARAM(throwScope);
    JSValue thisValue = state->thisValue();
    auto castedThis = jsDynamicCast<JSInternalSettingsGenerated*>(thisValue);
    if (UNLIKELY(!castedThis))
        return throwThisTypeError(*state, throwScope, "InternalSettingsGenerated", "setDisplayListDrawingEnabled");
    ASSERT_GC_OBJECT_INHERITS(castedThis, JSInternalSettingsGenerated::info());
    auto& impl = castedThis->wrapped();
    if (UNLIKELY(state->argumentCount() < 1))
        return throwVMError(state, throwScope, createNotEnoughArgumentsError(state));
    auto displayListDrawingEnabled = state->uncheckedArgument(0).toBoolean(state);
    RETURN_IF_EXCEPTION(throwScope, encodedJSValue());
    impl.setDisplayListDrawingEnabled(WTFMove(displayListDrawingEnabled));
    return JSValue::encode(jsUndefined());
}

EncodedJSValue JSC_HOST_CALL jsInternalSettingsGeneratedPrototypeFunctionSetDOMTimersThrottlingEnabled(ExecState* state)
{
    VM& vm = state->vm();
    auto throwScope = DECLARE_THROW_SCOPE(vm);
    UNUSED_PARAM(throwScope);
    JSValue thisValue = state->thisValue();
    auto castedThis = jsDynamicCast<JSInternalSettingsGenerated*>(thisValue);
    if (UNLIKELY(!castedThis))
        return throwThisTypeError(*state, throwScope, "InternalSettingsGenerated", "setDOMTimersThrottlingEnabled");
    ASSERT_GC_OBJECT_INHERITS(castedThis, JSInternalSettingsGenerated::info());
    auto& impl = castedThis->wrapped();
    if (UNLIKELY(state->argumentCount() < 1))
        return throwVMError(state, throwScope, createNotEnoughArgumentsError(state));
    auto domTimersThrottlingEnabled = state->uncheckedArgument(0).toBoolean(state);
    RETURN_IF_EXCEPTION(throwScope, encodedJSValue());
    impl.setDOMTimersThrottlingEnabled(WTFMove(domTimersThrottlingEnabled));
    return JSValue::encode(jsUndefined());
}

EncodedJSValue JSC_HOST_CALL jsInternalSettingsGeneratedPrototypeFunctionSetDownloadableBinaryFontsEnabled(ExecState* state)
{
    VM& vm = state->vm();
    auto throwScope = DECLARE_THROW_SCOPE(vm);
    UNUSED_PARAM(throwScope);
    JSValue thisValue = state->thisValue();
    auto castedThis = jsDynamicCast<JSInternalSettingsGenerated*>(thisValue);
    if (UNLIKELY(!castedThis))
        return throwThisTypeError(*state, throwScope, "InternalSettingsGenerated", "setDownloadableBinaryFontsEnabled");
    ASSERT_GC_OBJECT_INHERITS(castedThis, JSInternalSettingsGenerated::info());
    auto& impl = castedThis->wrapped();
    if (UNLIKELY(state->argumentCount() < 1))
        return throwVMError(state, throwScope, createNotEnoughArgumentsError(state));
    auto downloadableBinaryFontsEnabled = state->uncheckedArgument(0).toBoolean(state);
    RETURN_IF_EXCEPTION(throwScope, encodedJSValue());
    impl.setDownloadableBinaryFontsEnabled(WTFMove(downloadableBinaryFontsEnabled));
    return JSValue::encode(jsUndefined());
}

EncodedJSValue JSC_HOST_CALL jsInternalSettingsGeneratedPrototypeFunctionSetEnableInheritURIQueryComponent(ExecState* state)
{
    VM& vm = state->vm();
    auto throwScope = DECLARE_THROW_SCOPE(vm);
    UNUSED_PARAM(throwScope);
    JSValue thisValue = state->thisValue();
    auto castedThis = jsDynamicCast<JSInternalSettingsGenerated*>(thisValue);
    if (UNLIKELY(!castedThis))
        return throwThisTypeError(*state, throwScope, "InternalSettingsGenerated", "setEnableInheritURIQueryComponent");
    ASSERT_GC_OBJECT_INHERITS(castedThis, JSInternalSettingsGenerated::info());
    auto& impl = castedThis->wrapped();
    if (UNLIKELY(state->argumentCount() < 1))
        return throwVMError(state, throwScope, createNotEnoughArgumentsError(state));
    auto enableInheritURIQueryComponent = state->uncheckedArgument(0).toBoolean(state);
    RETURN_IF_EXCEPTION(throwScope, encodedJSValue());
    impl.setEnableInheritURIQueryComponent(WTFMove(enableInheritURIQueryComponent));
    return JSValue::encode(jsUndefined());
}

EncodedJSValue JSC_HOST_CALL jsInternalSettingsGeneratedPrototypeFunctionSetEnforceCSSMIMETypeInNoQuirksMode(ExecState* state)
{
    VM& vm = state->vm();
    auto throwScope = DECLARE_THROW_SCOPE(vm);
    UNUSED_PARAM(throwScope);
    JSValue thisValue = state->thisValue();
    auto castedThis = jsDynamicCast<JSInternalSettingsGenerated*>(thisValue);
    if (UNLIKELY(!castedThis))
        return throwThisTypeError(*state, throwScope, "InternalSettingsGenerated", "setEnforceCSSMIMETypeInNoQuirksMode");
    ASSERT_GC_OBJECT_INHERITS(castedThis, JSInternalSettingsGenerated::info());
    auto& impl = castedThis->wrapped();
    if (UNLIKELY(state->argumentCount() < 1))
        return throwVMError(state, throwScope, createNotEnoughArgumentsError(state));
    auto enforceCSSMIMETypeInNoQuirksMode = state->uncheckedArgument(0).toBoolean(state);
    RETURN_IF_EXCEPTION(throwScope, encodedJSValue());
    impl.setEnforceCSSMIMETypeInNoQuirksMode(WTFMove(enforceCSSMIMETypeInNoQuirksMode));
    return JSValue::encode(jsUndefined());
}

EncodedJSValue JSC_HOST_CALL jsInternalSettingsGeneratedPrototypeFunctionSetExperimentalNotificationsEnabled(ExecState* state)
{
    VM& vm = state->vm();
    auto throwScope = DECLARE_THROW_SCOPE(vm);
    UNUSED_PARAM(throwScope);
    JSValue thisValue = state->thisValue();
    auto castedThis = jsDynamicCast<JSInternalSettingsGenerated*>(thisValue);
    if (UNLIKELY(!castedThis))
        return throwThisTypeError(*state, throwScope, "InternalSettingsGenerated", "setExperimentalNotificationsEnabled");
    ASSERT_GC_OBJECT_INHERITS(castedThis, JSInternalSettingsGenerated::info());
    auto& impl = castedThis->wrapped();
    if (UNLIKELY(state->argumentCount() < 1))
        return throwVMError(state, throwScope, createNotEnoughArgumentsError(state));
    auto experimentalNotificationsEnabled = state->uncheckedArgument(0).toBoolean(state);
    RETURN_IF_EXCEPTION(throwScope, encodedJSValue());
    impl.setExperimentalNotificationsEnabled(WTFMove(experimentalNotificationsEnabled));
    return JSValue::encode(jsUndefined());
}

EncodedJSValue JSC_HOST_CALL jsInternalSettingsGeneratedPrototypeFunctionSetFixedBackgroundsPaintRelativeToDocument(ExecState* state)
{
    VM& vm = state->vm();
    auto throwScope = DECLARE_THROW_SCOPE(vm);
    UNUSED_PARAM(throwScope);
    JSValue thisValue = state->thisValue();
    auto castedThis = jsDynamicCast<JSInternalSettingsGenerated*>(thisValue);
    if (UNLIKELY(!castedThis))
        return throwThisTypeError(*state, throwScope, "InternalSettingsGenerated", "setFixedBackgroundsPaintRelativeToDocument");
    ASSERT_GC_OBJECT_INHERITS(castedThis, JSInternalSettingsGenerated::info());
    auto& impl = castedThis->wrapped();
    if (UNLIKELY(state->argumentCount() < 1))
        return throwVMError(state, throwScope, createNotEnoughArgumentsError(state));
    auto fixedBackgroundsPaintRelativeToDocument = state->uncheckedArgument(0).toBoolean(state);
    RETURN_IF_EXCEPTION(throwScope, encodedJSValue());
    impl.setFixedBackgroundsPaintRelativeToDocument(WTFMove(fixedBackgroundsPaintRelativeToDocument));
    return JSValue::encode(jsUndefined());
}

EncodedJSValue JSC_HOST_CALL jsInternalSettingsGeneratedPrototypeFunctionSetFixedElementsLayoutRelativeToFrame(ExecState* state)
{
    VM& vm = state->vm();
    auto throwScope = DECLARE_THROW_SCOPE(vm);
    UNUSED_PARAM(throwScope);
    JSValue thisValue = state->thisValue();
    auto castedThis = jsDynamicCast<JSInternalSettingsGenerated*>(thisValue);
    if (UNLIKELY(!castedThis))
        return throwThisTypeError(*state, throwScope, "InternalSettingsGenerated", "setFixedElementsLayoutRelativeToFrame");
    ASSERT_GC_OBJECT_INHERITS(castedThis, JSInternalSettingsGenerated::info());
    auto& impl = castedThis->wrapped();
    if (UNLIKELY(state->argumentCount() < 1))
        return throwVMError(state, throwScope, createNotEnoughArgumentsError(state));
    auto fixedElementsLayoutRelativeToFrame = state->uncheckedArgument(0).toBoolean(state);
    RETURN_IF_EXCEPTION(throwScope, encodedJSValue());
    impl.setFixedElementsLayoutRelativeToFrame(WTFMove(fixedElementsLayoutRelativeToFrame));
    return JSValue::encode(jsUndefined());
}

EncodedJSValue JSC_HOST_CALL jsInternalSettingsGeneratedPrototypeFunctionSetFixedPositionCreatesStackingContext(ExecState* state)
{
    VM& vm = state->vm();
    auto throwScope = DECLARE_THROW_SCOPE(vm);
    UNUSED_PARAM(throwScope);
    JSValue thisValue = state->thisValue();
    auto castedThis = jsDynamicCast<JSInternalSettingsGenerated*>(thisValue);
    if (UNLIKELY(!castedThis))
        return throwThisTypeError(*state, throwScope, "InternalSettingsGenerated", "setFixedPositionCreatesStackingContext");
    ASSERT_GC_OBJECT_INHERITS(castedThis, JSInternalSettingsGenerated::info());
    auto& impl = castedThis->wrapped();
    if (UNLIKELY(state->argumentCount() < 1))
        return throwVMError(state, throwScope, createNotEnoughArgumentsError(state));
    auto fixedPositionCreatesStackingContext = state->uncheckedArgument(0).toBoolean(state);
    RETURN_IF_EXCEPTION(throwScope, encodedJSValue());
    impl.setFixedPositionCreatesStackingContext(WTFMove(fixedPositionCreatesStackingContext));
    return JSValue::encode(jsUndefined());
}

EncodedJSValue JSC_HOST_CALL jsInternalSettingsGeneratedPrototypeFunctionSetForceCompositingMode(ExecState* state)
{
    VM& vm = state->vm();
    auto throwScope = DECLARE_THROW_SCOPE(vm);
    UNUSED_PARAM(throwScope);
    JSValue thisValue = state->thisValue();
    auto castedThis = jsDynamicCast<JSInternalSettingsGenerated*>(thisValue);
    if (UNLIKELY(!castedThis))
        return throwThisTypeError(*state, throwScope, "InternalSettingsGenerated", "setForceCompositingMode");
    ASSERT_GC_OBJECT_INHERITS(castedThis, JSInternalSettingsGenerated::info());
    auto& impl = castedThis->wrapped();
    if (UNLIKELY(state->argumentCount() < 1))
        return throwVMError(state, throwScope, createNotEnoughArgumentsError(state));
    auto forceCompositingMode = state->uncheckedArgument(0).toBoolean(state);
    RETURN_IF_EXCEPTION(throwScope, encodedJSValue());
    impl.setForceCompositingMode(WTFMove(forceCompositingMode));
    return JSValue::encode(jsUndefined());
}

EncodedJSValue JSC_HOST_CALL jsInternalSettingsGeneratedPrototypeFunctionSetForceFTPDirectoryListings(ExecState* state)
{
    VM& vm = state->vm();
    auto throwScope = DECLARE_THROW_SCOPE(vm);
    UNUSED_PARAM(throwScope);
    JSValue thisValue = state->thisValue();
    auto castedThis = jsDynamicCast<JSInternalSettingsGenerated*>(thisValue);
    if (UNLIKELY(!castedThis))
        return throwThisTypeError(*state, throwScope, "InternalSettingsGenerated", "setForceFTPDirectoryListings");
    ASSERT_GC_OBJECT_INHERITS(castedThis, JSInternalSettingsGenerated::info());
    auto& impl = castedThis->wrapped();
    if (UNLIKELY(state->argumentCount() < 1))
        return throwVMError(state, throwScope, createNotEnoughArgumentsError(state));
    auto forceFTPDirectoryListings = state->uncheckedArgument(0).toBoolean(state);
    RETURN_IF_EXCEPTION(throwScope, encodedJSValue());
    impl.setForceFTPDirectoryListings(WTFMove(forceFTPDirectoryListings));
    return JSValue::encode(jsUndefined());
}

EncodedJSValue JSC_HOST_CALL jsInternalSettingsGeneratedPrototypeFunctionSetForceSoftwareWebGLRendering(ExecState* state)
{
    VM& vm = state->vm();
    auto throwScope = DECLARE_THROW_SCOPE(vm);
    UNUSED_PARAM(throwScope);
    JSValue thisValue = state->thisValue();
    auto castedThis = jsDynamicCast<JSInternalSettingsGenerated*>(thisValue);
    if (UNLIKELY(!castedThis))
        return throwThisTypeError(*state, throwScope, "InternalSettingsGenerated", "setForceSoftwareWebGLRendering");
    ASSERT_GC_OBJECT_INHERITS(castedThis, JSInternalSettingsGenerated::info());
    auto& impl = castedThis->wrapped();
    if (UNLIKELY(state->argumentCount() < 1))
        return throwVMError(state, throwScope, createNotEnoughArgumentsError(state));
    auto forceSoftwareWebGLRendering = state->uncheckedArgument(0).toBoolean(state);
    RETURN_IF_EXCEPTION(throwScope, encodedJSValue());
    impl.setForceSoftwareWebGLRendering(WTFMove(forceSoftwareWebGLRendering));
    return JSValue::encode(jsUndefined());
}

EncodedJSValue JSC_HOST_CALL jsInternalSettingsGeneratedPrototypeFunctionSetForceUpdateScrollbarsOnMainThreadForPerformanceTesting(ExecState* state)
{
    VM& vm = state->vm();
    auto throwScope = DECLARE_THROW_SCOPE(vm);
    UNUSED_PARAM(throwScope);
    JSValue thisValue = state->thisValue();
    auto castedThis = jsDynamicCast<JSInternalSettingsGenerated*>(thisValue);
    if (UNLIKELY(!castedThis))
        return throwThisTypeError(*state, throwScope, "InternalSettingsGenerated", "setForceUpdateScrollbarsOnMainThreadForPerformanceTesting");
    ASSERT_GC_OBJECT_INHERITS(castedThis, JSInternalSettingsGenerated::info());
    auto& impl = castedThis->wrapped();
    if (UNLIKELY(state->argumentCount() < 1))
        return throwVMError(state, throwScope, createNotEnoughArgumentsError(state));
    auto forceUpdateScrollbarsOnMainThreadForPerformanceTesting = state->uncheckedArgument(0).toBoolean(state);
    RETURN_IF_EXCEPTION(throwScope, encodedJSValue());
    impl.setForceUpdateScrollbarsOnMainThreadForPerformanceTesting(WTFMove(forceUpdateScrollbarsOnMainThreadForPerformanceTesting));
    return JSValue::encode(jsUndefined());
}

EncodedJSValue JSC_HOST_CALL jsInternalSettingsGeneratedPrototypeFunctionSetFrameFlatteningEnabled(ExecState* state)
{
    VM& vm = state->vm();
    auto throwScope = DECLARE_THROW_SCOPE(vm);
    UNUSED_PARAM(throwScope);
    JSValue thisValue = state->thisValue();
    auto castedThis = jsDynamicCast<JSInternalSettingsGenerated*>(thisValue);
    if (UNLIKELY(!castedThis))
        return throwThisTypeError(*state, throwScope, "InternalSettingsGenerated", "setFrameFlatteningEnabled");
    ASSERT_GC_OBJECT_INHERITS(castedThis, JSInternalSettingsGenerated::info());
    auto& impl = castedThis->wrapped();
    if (UNLIKELY(state->argumentCount() < 1))
        return throwVMError(state, throwScope, createNotEnoughArgumentsError(state));
    auto frameFlatteningEnabled = state->uncheckedArgument(0).toBoolean(state);
    RETURN_IF_EXCEPTION(throwScope, encodedJSValue());
    impl.setFrameFlatteningEnabled(WTFMove(frameFlatteningEnabled));
    return JSValue::encode(jsUndefined());
}

EncodedJSValue JSC_HOST_CALL jsInternalSettingsGeneratedPrototypeFunctionSetFTPDirectoryTemplatePath(ExecState* state)
{
    VM& vm = state->vm();
    auto throwScope = DECLARE_THROW_SCOPE(vm);
    UNUSED_PARAM(throwScope);
    JSValue thisValue = state->thisValue();
    auto castedThis = jsDynamicCast<JSInternalSettingsGenerated*>(thisValue);
    if (UNLIKELY(!castedThis))
        return throwThisTypeError(*state, throwScope, "InternalSettingsGenerated", "setFTPDirectoryTemplatePath");
    ASSERT_GC_OBJECT_INHERITS(castedThis, JSInternalSettingsGenerated::info());
    auto& impl = castedThis->wrapped();
    if (UNLIKELY(state->argumentCount() < 1))
        return throwVMError(state, throwScope, createNotEnoughArgumentsError(state));
    auto ftpDirectoryTemplatePath = state->uncheckedArgument(0).toWTFString(state);
    RETURN_IF_EXCEPTION(throwScope, encodedJSValue());
    impl.setFTPDirectoryTemplatePath(WTFMove(ftpDirectoryTemplatePath));
    return JSValue::encode(jsUndefined());
}

EncodedJSValue JSC_HOST_CALL jsInternalSettingsGeneratedPrototypeFunctionSetFullScreenEnabled(ExecState* state)
{
    VM& vm = state->vm();
    auto throwScope = DECLARE_THROW_SCOPE(vm);
    UNUSED_PARAM(throwScope);
    JSValue thisValue = state->thisValue();
    auto castedThis = jsDynamicCast<JSInternalSettingsGenerated*>(thisValue);
    if (UNLIKELY(!castedThis))
        return throwThisTypeError(*state, throwScope, "InternalSettingsGenerated", "setFullScreenEnabled");
    ASSERT_GC_OBJECT_INHERITS(castedThis, JSInternalSettingsGenerated::info());
    auto& impl = castedThis->wrapped();
    if (UNLIKELY(state->argumentCount() < 1))
        return throwVMError(state, throwScope, createNotEnoughArgumentsError(state));
    auto fullScreenEnabled = state->uncheckedArgument(0).toBoolean(state);
    RETURN_IF_EXCEPTION(throwScope, encodedJSValue());
    impl.setFullScreenEnabled(WTFMove(fullScreenEnabled));
    return JSValue::encode(jsUndefined());
}

EncodedJSValue JSC_HOST_CALL jsInternalSettingsGeneratedPrototypeFunctionSetHttpEquivEnabled(ExecState* state)
{
    VM& vm = state->vm();
    auto throwScope = DECLARE_THROW_SCOPE(vm);
    UNUSED_PARAM(throwScope);
    JSValue thisValue = state->thisValue();
    auto castedThis = jsDynamicCast<JSInternalSettingsGenerated*>(thisValue);
    if (UNLIKELY(!castedThis))
        return throwThisTypeError(*state, throwScope, "InternalSettingsGenerated", "setHttpEquivEnabled");
    ASSERT_GC_OBJECT_INHERITS(castedThis, JSInternalSettingsGenerated::info());
    auto& impl = castedThis->wrapped();
    if (UNLIKELY(state->argumentCount() < 1))
        return throwVMError(state, throwScope, createNotEnoughArgumentsError(state));
    auto httpEquivEnabled = state->uncheckedArgument(0).toBoolean(state);
    RETURN_IF_EXCEPTION(throwScope, encodedJSValue());
    impl.setHttpEquivEnabled(WTFMove(httpEquivEnabled));
    return JSValue::encode(jsUndefined());
}

EncodedJSValue JSC_HOST_CALL jsInternalSettingsGeneratedPrototypeFunctionSetHyperlinkAuditingEnabled(ExecState* state)
{
    VM& vm = state->vm();
    auto throwScope = DECLARE_THROW_SCOPE(vm);
    UNUSED_PARAM(throwScope);
    JSValue thisValue = state->thisValue();
    auto castedThis = jsDynamicCast<JSInternalSettingsGenerated*>(thisValue);
    if (UNLIKELY(!castedThis))
        return throwThisTypeError(*state, throwScope, "InternalSettingsGenerated", "setHyperlinkAuditingEnabled");
    ASSERT_GC_OBJECT_INHERITS(castedThis, JSInternalSettingsGenerated::info());
    auto& impl = castedThis->wrapped();
    if (UNLIKELY(state->argumentCount() < 1))
        return throwVMError(state, throwScope, createNotEnoughArgumentsError(state));
    auto hyperlinkAuditingEnabled = state->uncheckedArgument(0).toBoolean(state);
    RETURN_IF_EXCEPTION(throwScope, encodedJSValue());
    impl.setHyperlinkAuditingEnabled(WTFMove(hyperlinkAuditingEnabled));
    return JSValue::encode(jsUndefined());
}

EncodedJSValue JSC_HOST_CALL jsInternalSettingsGeneratedPrototypeFunctionSetImageControlsEnabled(ExecState* state)
{
    VM& vm = state->vm();
    auto throwScope = DECLARE_THROW_SCOPE(vm);
    UNUSED_PARAM(throwScope);
    JSValue thisValue = state->thisValue();
    auto castedThis = jsDynamicCast<JSInternalSettingsGenerated*>(thisValue);
    if (UNLIKELY(!castedThis))
        return throwThisTypeError(*state, throwScope, "InternalSettingsGenerated", "setImageControlsEnabled");
    ASSERT_GC_OBJECT_INHERITS(castedThis, JSInternalSettingsGenerated::info());
    auto& impl = castedThis->wrapped();
    if (UNLIKELY(state->argumentCount() < 1))
        return throwVMError(state, throwScope, createNotEnoughArgumentsError(state));
    auto imageControlsEnabled = state->uncheckedArgument(0).toBoolean(state);
    RETURN_IF_EXCEPTION(throwScope, encodedJSValue());
    impl.setImageControlsEnabled(WTFMove(imageControlsEnabled));
    return JSValue::encode(jsUndefined());
}

EncodedJSValue JSC_HOST_CALL jsInternalSettingsGeneratedPrototypeFunctionSetImageSubsamplingEnabled(ExecState* state)
{
    VM& vm = state->vm();
    auto throwScope = DECLARE_THROW_SCOPE(vm);
    UNUSED_PARAM(throwScope);
    JSValue thisValue = state->thisValue();
    auto castedThis = jsDynamicCast<JSInternalSettingsGenerated*>(thisValue);
    if (UNLIKELY(!castedThis))
        return throwThisTypeError(*state, throwScope, "InternalSettingsGenerated", "setImageSubsamplingEnabled");
    ASSERT_GC_OBJECT_INHERITS(castedThis, JSInternalSettingsGenerated::info());
    auto& impl = castedThis->wrapped();
    if (UNLIKELY(state->argumentCount() < 1))
        return throwVMError(state, throwScope, createNotEnoughArgumentsError(state));
    auto imageSubsamplingEnabled = state->uncheckedArgument(0).toBoolean(state);
    RETURN_IF_EXCEPTION(throwScope, encodedJSValue());
    impl.setImageSubsamplingEnabled(WTFMove(imageSubsamplingEnabled));
    return JSValue::encode(jsUndefined());
}

EncodedJSValue JSC_HOST_CALL jsInternalSettingsGeneratedPrototypeFunctionSetIncrementalRenderingSuppressionTimeoutInSeconds(ExecState* state)
{
    VM& vm = state->vm();
    auto throwScope = DECLARE_THROW_SCOPE(vm);
    UNUSED_PARAM(throwScope);
    JSValue thisValue = state->thisValue();
    auto castedThis = jsDynamicCast<JSInternalSettingsGenerated*>(thisValue);
    if (UNLIKELY(!castedThis))
        return throwThisTypeError(*state, throwScope, "InternalSettingsGenerated", "setIncrementalRenderingSuppressionTimeoutInSeconds");
    ASSERT_GC_OBJECT_INHERITS(castedThis, JSInternalSettingsGenerated::info());
    auto& impl = castedThis->wrapped();
    if (UNLIKELY(state->argumentCount() < 1))
        return throwVMError(state, throwScope, createNotEnoughArgumentsError(state));
    auto incrementalRenderingSuppressionTimeoutInSeconds = convert<double>(*state, state->uncheckedArgument(0), ShouldAllowNonFinite::No);
    RETURN_IF_EXCEPTION(throwScope, encodedJSValue());
    impl.setIncrementalRenderingSuppressionTimeoutInSeconds(WTFMove(incrementalRenderingSuppressionTimeoutInSeconds));
    return JSValue::encode(jsUndefined());
}

EncodedJSValue JSC_HOST_CALL jsInternalSettingsGeneratedPrototypeFunctionSetInlineMediaPlaybackRequiresPlaysInlineAttribute(ExecState* state)
{
    VM& vm = state->vm();
    auto throwScope = DECLARE_THROW_SCOPE(vm);
    UNUSED_PARAM(throwScope);
    JSValue thisValue = state->thisValue();
    auto castedThis = jsDynamicCast<JSInternalSettingsGenerated*>(thisValue);
    if (UNLIKELY(!castedThis))
        return throwThisTypeError(*state, throwScope, "InternalSettingsGenerated", "setInlineMediaPlaybackRequiresPlaysInlineAttribute");
    ASSERT_GC_OBJECT_INHERITS(castedThis, JSInternalSettingsGenerated::info());
    auto& impl = castedThis->wrapped();
    if (UNLIKELY(state->argumentCount() < 1))
        return throwVMError(state, throwScope, createNotEnoughArgumentsError(state));
    auto inlineMediaPlaybackRequiresPlaysInlineAttribute = state->uncheckedArgument(0).toBoolean(state);
    RETURN_IF_EXCEPTION(throwScope, encodedJSValue());
    impl.setInlineMediaPlaybackRequiresPlaysInlineAttribute(WTFMove(inlineMediaPlaybackRequiresPlaysInlineAttribute));
    return JSValue::encode(jsUndefined());
}

EncodedJSValue JSC_HOST_CALL jsInternalSettingsGeneratedPrototypeFunctionSetInteractiveFormValidationEnabled(ExecState* state)
{
    VM& vm = state->vm();
    auto throwScope = DECLARE_THROW_SCOPE(vm);
    UNUSED_PARAM(throwScope);
    JSValue thisValue = state->thisValue();
    auto castedThis = jsDynamicCast<JSInternalSettingsGenerated*>(thisValue);
    if (UNLIKELY(!castedThis))
        return throwThisTypeError(*state, throwScope, "InternalSettingsGenerated", "setInteractiveFormValidationEnabled");
    ASSERT_GC_OBJECT_INHERITS(castedThis, JSInternalSettingsGenerated::info());
    auto& impl = castedThis->wrapped();
    if (UNLIKELY(state->argumentCount() < 1))
        return throwVMError(state, throwScope, createNotEnoughArgumentsError(state));
    auto interactiveFormValidationEnabled = state->uncheckedArgument(0).toBoolean(state);
    RETURN_IF_EXCEPTION(throwScope, encodedJSValue());
    impl.setInteractiveFormValidationEnabled(WTFMove(interactiveFormValidationEnabled));
    return JSValue::encode(jsUndefined());
}

EncodedJSValue JSC_HOST_CALL jsInternalSettingsGeneratedPrototypeFunctionSetInvisibleAutoplayNotPermitted(ExecState* state)
{
    VM& vm = state->vm();
    auto throwScope = DECLARE_THROW_SCOPE(vm);
    UNUSED_PARAM(throwScope);
    JSValue thisValue = state->thisValue();
    auto castedThis = jsDynamicCast<JSInternalSettingsGenerated*>(thisValue);
    if (UNLIKELY(!castedThis))
        return throwThisTypeError(*state, throwScope, "InternalSettingsGenerated", "setInvisibleAutoplayNotPermitted");
    ASSERT_GC_OBJECT_INHERITS(castedThis, JSInternalSettingsGenerated::info());
    auto& impl = castedThis->wrapped();
    if (UNLIKELY(state->argumentCount() < 1))
        return throwVMError(state, throwScope, createNotEnoughArgumentsError(state));
    auto invisibleAutoplayNotPermitted = state->uncheckedArgument(0).toBoolean(state);
    RETURN_IF_EXCEPTION(throwScope, encodedJSValue());
    impl.setInvisibleAutoplayNotPermitted(WTFMove(invisibleAutoplayNotPermitted));
    return JSValue::encode(jsUndefined());
}

EncodedJSValue JSC_HOST_CALL jsInternalSettingsGeneratedPrototypeFunctionSetJavaScriptCanAccessClipboard(ExecState* state)
{
    VM& vm = state->vm();
    auto throwScope = DECLARE_THROW_SCOPE(vm);
    UNUSED_PARAM(throwScope);
    JSValue thisValue = state->thisValue();
    auto castedThis = jsDynamicCast<JSInternalSettingsGenerated*>(thisValue);
    if (UNLIKELY(!castedThis))
        return throwThisTypeError(*state, throwScope, "InternalSettingsGenerated", "setJavaScriptCanAccessClipboard");
    ASSERT_GC_OBJECT_INHERITS(castedThis, JSInternalSettingsGenerated::info());
    auto& impl = castedThis->wrapped();
    if (UNLIKELY(state->argumentCount() < 1))
        return throwVMError(state, throwScope, createNotEnoughArgumentsError(state));
    auto javaScriptCanAccessClipboard = state->uncheckedArgument(0).toBoolean(state);
    RETURN_IF_EXCEPTION(throwScope, encodedJSValue());
    impl.setJavaScriptCanAccessClipboard(WTFMove(javaScriptCanAccessClipboard));
    return JSValue::encode(jsUndefined());
}

EncodedJSValue JSC_HOST_CALL jsInternalSettingsGeneratedPrototypeFunctionSetJavaScriptCanOpenWindowsAutomatically(ExecState* state)
{
    VM& vm = state->vm();
    auto throwScope = DECLARE_THROW_SCOPE(vm);
    UNUSED_PARAM(throwScope);
    JSValue thisValue = state->thisValue();
    auto castedThis = jsDynamicCast<JSInternalSettingsGenerated*>(thisValue);
    if (UNLIKELY(!castedThis))
        return throwThisTypeError(*state, throwScope, "InternalSettingsGenerated", "setJavaScriptCanOpenWindowsAutomatically");
    ASSERT_GC_OBJECT_INHERITS(castedThis, JSInternalSettingsGenerated::info());
    auto& impl = castedThis->wrapped();
    if (UNLIKELY(state->argumentCount() < 1))
        return throwVMError(state, throwScope, createNotEnoughArgumentsError(state));
    auto javaScriptCanOpenWindowsAutomatically = state->uncheckedArgument(0).toBoolean(state);
    RETURN_IF_EXCEPTION(throwScope, encodedJSValue());
    impl.setJavaScriptCanOpenWindowsAutomatically(WTFMove(javaScriptCanOpenWindowsAutomatically));
    return JSValue::encode(jsUndefined());
}

EncodedJSValue JSC_HOST_CALL jsInternalSettingsGeneratedPrototypeFunctionSetLayoutFallbackWidth(ExecState* state)
{
    VM& vm = state->vm();
    auto throwScope = DECLARE_THROW_SCOPE(vm);
    UNUSED_PARAM(throwScope);
    JSValue thisValue = state->thisValue();
    auto castedThis = jsDynamicCast<JSInternalSettingsGenerated*>(thisValue);
    if (UNLIKELY(!castedThis))
        return throwThisTypeError(*state, throwScope, "InternalSettingsGenerated", "setLayoutFallbackWidth");
    ASSERT_GC_OBJECT_INHERITS(castedThis, JSInternalSettingsGenerated::info());
    auto& impl = castedThis->wrapped();
    if (UNLIKELY(state->argumentCount() < 1))
        return throwVMError(state, throwScope, createNotEnoughArgumentsError(state));
    auto layoutFallbackWidth = convert<int32_t>(*state, state->uncheckedArgument(0), NormalConversion);
    RETURN_IF_EXCEPTION(throwScope, encodedJSValue());
    impl.setLayoutFallbackWidth(WTFMove(layoutFallbackWidth));
    return JSValue::encode(jsUndefined());
}

EncodedJSValue JSC_HOST_CALL jsInternalSettingsGeneratedPrototypeFunctionSetLoadDeferringEnabled(ExecState* state)
{
    VM& vm = state->vm();
    auto throwScope = DECLARE_THROW_SCOPE(vm);
    UNUSED_PARAM(throwScope);
    JSValue thisValue = state->thisValue();
    auto castedThis = jsDynamicCast<JSInternalSettingsGenerated*>(thisValue);
    if (UNLIKELY(!castedThis))
        return throwThisTypeError(*state, throwScope, "InternalSettingsGenerated", "setLoadDeferringEnabled");
    ASSERT_GC_OBJECT_INHERITS(castedThis, JSInternalSettingsGenerated::info());
    auto& impl = castedThis->wrapped();
    if (UNLIKELY(state->argumentCount() < 1))
        return throwVMError(state, throwScope, createNotEnoughArgumentsError(state));
    auto loadDeferringEnabled = state->uncheckedArgument(0).toBoolean(state);
    RETURN_IF_EXCEPTION(throwScope, encodedJSValue());
    impl.setLoadDeferringEnabled(WTFMove(loadDeferringEnabled));
    return JSValue::encode(jsUndefined());
}

EncodedJSValue JSC_HOST_CALL jsInternalSettingsGeneratedPrototypeFunctionSetLoadsSiteIconsIgnoringImageLoadingSetting(ExecState* state)
{
    VM& vm = state->vm();
    auto throwScope = DECLARE_THROW_SCOPE(vm);
    UNUSED_PARAM(throwScope);
    JSValue thisValue = state->thisValue();
    auto castedThis = jsDynamicCast<JSInternalSettingsGenerated*>(thisValue);
    if (UNLIKELY(!castedThis))
        return throwThisTypeError(*state, throwScope, "InternalSettingsGenerated", "setLoadsSiteIconsIgnoringImageLoadingSetting");
    ASSERT_GC_OBJECT_INHERITS(castedThis, JSInternalSettingsGenerated::info());
    auto& impl = castedThis->wrapped();
    if (UNLIKELY(state->argumentCount() < 1))
        return throwVMError(state, throwScope, createNotEnoughArgumentsError(state));
    auto loadsSiteIconsIgnoringImageLoadingSetting = state->uncheckedArgument(0).toBoolean(state);
    RETURN_IF_EXCEPTION(throwScope, encodedJSValue());
    impl.setLoadsSiteIconsIgnoringImageLoadingSetting(WTFMove(loadsSiteIconsIgnoringImageLoadingSetting));
    return JSValue::encode(jsUndefined());
}

EncodedJSValue JSC_HOST_CALL jsInternalSettingsGeneratedPrototypeFunctionSetLocalFileContentSniffingEnabled(ExecState* state)
{
    VM& vm = state->vm();
    auto throwScope = DECLARE_THROW_SCOPE(vm);
    UNUSED_PARAM(throwScope);
    JSValue thisValue = state->thisValue();
    auto castedThis = jsDynamicCast<JSInternalSettingsGenerated*>(thisValue);
    if (UNLIKELY(!castedThis))
        return throwThisTypeError(*state, throwScope, "InternalSettingsGenerated", "setLocalFileContentSniffingEnabled");
    ASSERT_GC_OBJECT_INHERITS(castedThis, JSInternalSettingsGenerated::info());
    auto& impl = castedThis->wrapped();
    if (UNLIKELY(state->argumentCount() < 1))
        return throwVMError(state, throwScope, createNotEnoughArgumentsError(state));
    auto localFileContentSniffingEnabled = state->uncheckedArgument(0).toBoolean(state);
    RETURN_IF_EXCEPTION(throwScope, encodedJSValue());
    impl.setLocalFileContentSniffingEnabled(WTFMove(localFileContentSniffingEnabled));
    return JSValue::encode(jsUndefined());
}

EncodedJSValue JSC_HOST_CALL jsInternalSettingsGeneratedPrototypeFunctionSetLocalStorageDatabasePath(ExecState* state)
{
    VM& vm = state->vm();
    auto throwScope = DECLARE_THROW_SCOPE(vm);
    UNUSED_PARAM(throwScope);
    JSValue thisValue = state->thisValue();
    auto castedThis = jsDynamicCast<JSInternalSettingsGenerated*>(thisValue);
    if (UNLIKELY(!castedThis))
        return throwThisTypeError(*state, throwScope, "InternalSettingsGenerated", "setLocalStorageDatabasePath");
    ASSERT_GC_OBJECT_INHERITS(castedThis, JSInternalSettingsGenerated::info());
    auto& impl = castedThis->wrapped();
    if (UNLIKELY(state->argumentCount() < 1))
        return throwVMError(state, throwScope, createNotEnoughArgumentsError(state));
    auto localStorageDatabasePath = state->uncheckedArgument(0).toWTFString(state);
    RETURN_IF_EXCEPTION(throwScope, encodedJSValue());
    impl.setLocalStorageDatabasePath(WTFMove(localStorageDatabasePath));
    return JSValue::encode(jsUndefined());
}

EncodedJSValue JSC_HOST_CALL jsInternalSettingsGeneratedPrototypeFunctionSetLocalStorageEnabled(ExecState* state)
{
    VM& vm = state->vm();
    auto throwScope = DECLARE_THROW_SCOPE(vm);
    UNUSED_PARAM(throwScope);
    JSValue thisValue = state->thisValue();
    auto castedThis = jsDynamicCast<JSInternalSettingsGenerated*>(thisValue);
    if (UNLIKELY(!castedThis))
        return throwThisTypeError(*state, throwScope, "InternalSettingsGenerated", "setLocalStorageEnabled");
    ASSERT_GC_OBJECT_INHERITS(castedThis, JSInternalSettingsGenerated::info());
    auto& impl = castedThis->wrapped();
    if (UNLIKELY(state->argumentCount() < 1))
        return throwVMError(state, throwScope, createNotEnoughArgumentsError(state));
    auto localStorageEnabled = state->uncheckedArgument(0).toBoolean(state);
    RETURN_IF_EXCEPTION(throwScope, encodedJSValue());
    impl.setLocalStorageEnabled(WTFMove(localStorageEnabled));
    return JSValue::encode(jsUndefined());
}

EncodedJSValue JSC_HOST_CALL jsInternalSettingsGeneratedPrototypeFunctionSetLogsPageMessagesToSystemConsoleEnabled(ExecState* state)
{
    VM& vm = state->vm();
    auto throwScope = DECLARE_THROW_SCOPE(vm);
    UNUSED_PARAM(throwScope);
    JSValue thisValue = state->thisValue();
    auto castedThis = jsDynamicCast<JSInternalSettingsGenerated*>(thisValue);
    if (UNLIKELY(!castedThis))
        return throwThisTypeError(*state, throwScope, "InternalSettingsGenerated", "setLogsPageMessagesToSystemConsoleEnabled");
    ASSERT_GC_OBJECT_INHERITS(castedThis, JSInternalSettingsGenerated::info());
    auto& impl = castedThis->wrapped();
    if (UNLIKELY(state->argumentCount() < 1))
        return throwVMError(state, throwScope, createNotEnoughArgumentsError(state));
    auto logsPageMessagesToSystemConsoleEnabled = state->uncheckedArgument(0).toBoolean(state);
    RETURN_IF_EXCEPTION(throwScope, encodedJSValue());
    impl.setLogsPageMessagesToSystemConsoleEnabled(WTFMove(logsPageMessagesToSystemConsoleEnabled));
    return JSValue::encode(jsUndefined());
}

EncodedJSValue JSC_HOST_CALL jsInternalSettingsGeneratedPrototypeFunctionSetMainContentUserGestureOverrideEnabled(ExecState* state)
{
    VM& vm = state->vm();
    auto throwScope = DECLARE_THROW_SCOPE(vm);
    UNUSED_PARAM(throwScope);
    JSValue thisValue = state->thisValue();
    auto castedThis = jsDynamicCast<JSInternalSettingsGenerated*>(thisValue);
    if (UNLIKELY(!castedThis))
        return throwThisTypeError(*state, throwScope, "InternalSettingsGenerated", "setMainContentUserGestureOverrideEnabled");
    ASSERT_GC_OBJECT_INHERITS(castedThis, JSInternalSettingsGenerated::info());
    auto& impl = castedThis->wrapped();
    if (UNLIKELY(state->argumentCount() < 1))
        return throwVMError(state, throwScope, createNotEnoughArgumentsError(state));
    auto mainContentUserGestureOverrideEnabled = state->uncheckedArgument(0).toBoolean(state);
    RETURN_IF_EXCEPTION(throwScope, encodedJSValue());
    impl.setMainContentUserGestureOverrideEnabled(WTFMove(mainContentUserGestureOverrideEnabled));
    return JSValue::encode(jsUndefined());
}

EncodedJSValue JSC_HOST_CALL jsInternalSettingsGeneratedPrototypeFunctionSetMaxParseDuration(ExecState* state)
{
    VM& vm = state->vm();
    auto throwScope = DECLARE_THROW_SCOPE(vm);
    UNUSED_PARAM(throwScope);
    JSValue thisValue = state->thisValue();
    auto castedThis = jsDynamicCast<JSInternalSettingsGenerated*>(thisValue);
    if (UNLIKELY(!castedThis))
        return throwThisTypeError(*state, throwScope, "InternalSettingsGenerated", "setMaxParseDuration");
    ASSERT_GC_OBJECT_INHERITS(castedThis, JSInternalSettingsGenerated::info());
    auto& impl = castedThis->wrapped();
    if (UNLIKELY(state->argumentCount() < 1))
        return throwVMError(state, throwScope, createNotEnoughArgumentsError(state));
    auto maxParseDuration = convert<double>(*state, state->uncheckedArgument(0), ShouldAllowNonFinite::No);
    RETURN_IF_EXCEPTION(throwScope, encodedJSValue());
    impl.setMaxParseDuration(WTFMove(maxParseDuration));
    return JSValue::encode(jsUndefined());
}

EncodedJSValue JSC_HOST_CALL jsInternalSettingsGeneratedPrototypeFunctionSetMaximumHTMLParserDOMTreeDepth(ExecState* state)
{
    VM& vm = state->vm();
    auto throwScope = DECLARE_THROW_SCOPE(vm);
    UNUSED_PARAM(throwScope);
    JSValue thisValue = state->thisValue();
    auto castedThis = jsDynamicCast<JSInternalSettingsGenerated*>(thisValue);
    if (UNLIKELY(!castedThis))
        return throwThisTypeError(*state, throwScope, "InternalSettingsGenerated", "setMaximumHTMLParserDOMTreeDepth");
    ASSERT_GC_OBJECT_INHERITS(castedThis, JSInternalSettingsGenerated::info());
    auto& impl = castedThis->wrapped();
    if (UNLIKELY(state->argumentCount() < 1))
        return throwVMError(state, throwScope, createNotEnoughArgumentsError(state));
    auto maximumHTMLParserDOMTreeDepth = convert<uint32_t>(*state, state->uncheckedArgument(0), NormalConversion);
    RETURN_IF_EXCEPTION(throwScope, encodedJSValue());
    impl.setMaximumHTMLParserDOMTreeDepth(WTFMove(maximumHTMLParserDOMTreeDepth));
    return JSValue::encode(jsUndefined());
}

EncodedJSValue JSC_HOST_CALL jsInternalSettingsGeneratedPrototypeFunctionSetMaximumPlugInSnapshotAttempts(ExecState* state)
{
    VM& vm = state->vm();
    auto throwScope = DECLARE_THROW_SCOPE(vm);
    UNUSED_PARAM(throwScope);
    JSValue thisValue = state->thisValue();
    auto castedThis = jsDynamicCast<JSInternalSettingsGenerated*>(thisValue);
    if (UNLIKELY(!castedThis))
        return throwThisTypeError(*state, throwScope, "InternalSettingsGenerated", "setMaximumPlugInSnapshotAttempts");
    ASSERT_GC_OBJECT_INHERITS(castedThis, JSInternalSettingsGenerated::info());
    auto& impl = castedThis->wrapped();
    if (UNLIKELY(state->argumentCount() < 1))
        return throwVMError(state, throwScope, createNotEnoughArgumentsError(state));
    auto maximumPlugInSnapshotAttempts = convert<uint32_t>(*state, state->uncheckedArgument(0), NormalConversion);
    RETURN_IF_EXCEPTION(throwScope, encodedJSValue());
    impl.setMaximumPlugInSnapshotAttempts(WTFMove(maximumPlugInSnapshotAttempts));
    return JSValue::encode(jsUndefined());
}

EncodedJSValue JSC_HOST_CALL jsInternalSettingsGeneratedPrototypeFunctionSetMaximumSourceBufferSize(ExecState* state)
{
    VM& vm = state->vm();
    auto throwScope = DECLARE_THROW_SCOPE(vm);
    UNUSED_PARAM(throwScope);
    JSValue thisValue = state->thisValue();
    auto castedThis = jsDynamicCast<JSInternalSettingsGenerated*>(thisValue);
    if (UNLIKELY(!castedThis))
        return throwThisTypeError(*state, throwScope, "InternalSettingsGenerated", "setMaximumSourceBufferSize");
    ASSERT_GC_OBJECT_INHERITS(castedThis, JSInternalSettingsGenerated::info());
    auto& impl = castedThis->wrapped();
    if (UNLIKELY(state->argumentCount() < 1))
        return throwVMError(state, throwScope, createNotEnoughArgumentsError(state));
    auto maximumSourceBufferSize = convert<int32_t>(*state, state->uncheckedArgument(0), NormalConversion);
    RETURN_IF_EXCEPTION(throwScope, encodedJSValue());
    impl.setMaximumSourceBufferSize(WTFMove(maximumSourceBufferSize));
    return JSValue::encode(jsUndefined());
}

EncodedJSValue JSC_HOST_CALL jsInternalSettingsGeneratedPrototypeFunctionSetMediaControlsScaleWithPageZoom(ExecState* state)
{
    VM& vm = state->vm();
    auto throwScope = DECLARE_THROW_SCOPE(vm);
    UNUSED_PARAM(throwScope);
    JSValue thisValue = state->thisValue();
    auto castedThis = jsDynamicCast<JSInternalSettingsGenerated*>(thisValue);
    if (UNLIKELY(!castedThis))
        return throwThisTypeError(*state, throwScope, "InternalSettingsGenerated", "setMediaControlsScaleWithPageZoom");
    ASSERT_GC_OBJECT_INHERITS(castedThis, JSInternalSettingsGenerated::info());
    auto& impl = castedThis->wrapped();
    if (UNLIKELY(state->argumentCount() < 1))
        return throwVMError(state, throwScope, createNotEnoughArgumentsError(state));
    auto mediaControlsScaleWithPageZoom = state->uncheckedArgument(0).toBoolean(state);
    RETURN_IF_EXCEPTION(throwScope, encodedJSValue());
    impl.setMediaControlsScaleWithPageZoom(WTFMove(mediaControlsScaleWithPageZoom));
    return JSValue::encode(jsUndefined());
}

EncodedJSValue JSC_HOST_CALL jsInternalSettingsGeneratedPrototypeFunctionSetMediaDataLoadsAutomatically(ExecState* state)
{
    VM& vm = state->vm();
    auto throwScope = DECLARE_THROW_SCOPE(vm);
    UNUSED_PARAM(throwScope);
    JSValue thisValue = state->thisValue();
    auto castedThis = jsDynamicCast<JSInternalSettingsGenerated*>(thisValue);
    if (UNLIKELY(!castedThis))
        return throwThisTypeError(*state, throwScope, "InternalSettingsGenerated", "setMediaDataLoadsAutomatically");
    ASSERT_GC_OBJECT_INHERITS(castedThis, JSInternalSettingsGenerated::info());
    auto& impl = castedThis->wrapped();
    if (UNLIKELY(state->argumentCount() < 1))
        return throwVMError(state, throwScope, createNotEnoughArgumentsError(state));
    auto mediaDataLoadsAutomatically = state->uncheckedArgument(0).toBoolean(state);
    RETURN_IF_EXCEPTION(throwScope, encodedJSValue());
    impl.setMediaDataLoadsAutomatically(WTFMove(mediaDataLoadsAutomatically));
    return JSValue::encode(jsUndefined());
}

EncodedJSValue JSC_HOST_CALL jsInternalSettingsGeneratedPrototypeFunctionSetMediaEnabled(ExecState* state)
{
    VM& vm = state->vm();
    auto throwScope = DECLARE_THROW_SCOPE(vm);
    UNUSED_PARAM(throwScope);
    JSValue thisValue = state->thisValue();
    auto castedThis = jsDynamicCast<JSInternalSettingsGenerated*>(thisValue);
    if (UNLIKELY(!castedThis))
        return throwThisTypeError(*state, throwScope, "InternalSettingsGenerated", "setMediaEnabled");
    ASSERT_GC_OBJECT_INHERITS(castedThis, JSInternalSettingsGenerated::info());
    auto& impl = castedThis->wrapped();
    if (UNLIKELY(state->argumentCount() < 1))
        return throwVMError(state, throwScope, createNotEnoughArgumentsError(state));
    auto mediaEnabled = state->uncheckedArgument(0).toBoolean(state);
    RETURN_IF_EXCEPTION(throwScope, encodedJSValue());
    impl.setMediaEnabled(WTFMove(mediaEnabled));
    return JSValue::encode(jsUndefined());
}

EncodedJSValue JSC_HOST_CALL jsInternalSettingsGeneratedPrototypeFunctionSetMediaSourceEnabled(ExecState* state)
{
    VM& vm = state->vm();
    auto throwScope = DECLARE_THROW_SCOPE(vm);
    UNUSED_PARAM(throwScope);
    JSValue thisValue = state->thisValue();
    auto castedThis = jsDynamicCast<JSInternalSettingsGenerated*>(thisValue);
    if (UNLIKELY(!castedThis))
        return throwThisTypeError(*state, throwScope, "InternalSettingsGenerated", "setMediaSourceEnabled");
    ASSERT_GC_OBJECT_INHERITS(castedThis, JSInternalSettingsGenerated::info());
    auto& impl = castedThis->wrapped();
    if (UNLIKELY(state->argumentCount() < 1))
        return throwVMError(state, throwScope, createNotEnoughArgumentsError(state));
    auto mediaSourceEnabled = state->uncheckedArgument(0).toBoolean(state);
    RETURN_IF_EXCEPTION(throwScope, encodedJSValue());
    impl.setMediaSourceEnabled(WTFMove(mediaSourceEnabled));
    return JSValue::encode(jsUndefined());
}

EncodedJSValue JSC_HOST_CALL jsInternalSettingsGeneratedPrototypeFunctionSetMediaStreamEnabled(ExecState* state)
{
    VM& vm = state->vm();
    auto throwScope = DECLARE_THROW_SCOPE(vm);
    UNUSED_PARAM(throwScope);
    JSValue thisValue = state->thisValue();
    auto castedThis = jsDynamicCast<JSInternalSettingsGenerated*>(thisValue);
    if (UNLIKELY(!castedThis))
        return throwThisTypeError(*state, throwScope, "InternalSettingsGenerated", "setMediaStreamEnabled");
    ASSERT_GC_OBJECT_INHERITS(castedThis, JSInternalSettingsGenerated::info());
    auto& impl = castedThis->wrapped();
    if (UNLIKELY(state->argumentCount() < 1))
        return throwVMError(state, throwScope, createNotEnoughArgumentsError(state));
    auto mediaStreamEnabled = state->uncheckedArgument(0).toBoolean(state);
    RETURN_IF_EXCEPTION(throwScope, encodedJSValue());
    impl.setMediaStreamEnabled(WTFMove(mediaStreamEnabled));
    return JSValue::encode(jsUndefined());
}

EncodedJSValue JSC_HOST_CALL jsInternalSettingsGeneratedPrototypeFunctionSetMinimumAccelerated2dCanvasSize(ExecState* state)
{
    VM& vm = state->vm();
    auto throwScope = DECLARE_THROW_SCOPE(vm);
    UNUSED_PARAM(throwScope);
    JSValue thisValue = state->thisValue();
    auto castedThis = jsDynamicCast<JSInternalSettingsGenerated*>(thisValue);
    if (UNLIKELY(!castedThis))
        return throwThisTypeError(*state, throwScope, "InternalSettingsGenerated", "setMinimumAccelerated2dCanvasSize");
    ASSERT_GC_OBJECT_INHERITS(castedThis, JSInternalSettingsGenerated::info());
    auto& impl = castedThis->wrapped();
    if (UNLIKELY(state->argumentCount() < 1))
        return throwVMError(state, throwScope, createNotEnoughArgumentsError(state));
    auto minimumAccelerated2dCanvasSize = convert<int32_t>(*state, state->uncheckedArgument(0), NormalConversion);
    RETURN_IF_EXCEPTION(throwScope, encodedJSValue());
    impl.setMinimumAccelerated2dCanvasSize(WTFMove(minimumAccelerated2dCanvasSize));
    return JSValue::encode(jsUndefined());
}

EncodedJSValue JSC_HOST_CALL jsInternalSettingsGeneratedPrototypeFunctionSetMinimumFontSize(ExecState* state)
{
    VM& vm = state->vm();
    auto throwScope = DECLARE_THROW_SCOPE(vm);
    UNUSED_PARAM(throwScope);
    JSValue thisValue = state->thisValue();
    auto castedThis = jsDynamicCast<JSInternalSettingsGenerated*>(thisValue);
    if (UNLIKELY(!castedThis))
        return throwThisTypeError(*state, throwScope, "InternalSettingsGenerated", "setMinimumFontSize");
    ASSERT_GC_OBJECT_INHERITS(castedThis, JSInternalSettingsGenerated::info());
    auto& impl = castedThis->wrapped();
    if (UNLIKELY(state->argumentCount() < 1))
        return throwVMError(state, throwScope, createNotEnoughArgumentsError(state));
    auto minimumFontSize = convert<int32_t>(*state, state->uncheckedArgument(0), NormalConversion);
    RETURN_IF_EXCEPTION(throwScope, encodedJSValue());
    impl.setMinimumFontSize(WTFMove(minimumFontSize));
    return JSValue::encode(jsUndefined());
}

EncodedJSValue JSC_HOST_CALL jsInternalSettingsGeneratedPrototypeFunctionSetMinimumLogicalFontSize(ExecState* state)
{
    VM& vm = state->vm();
    auto throwScope = DECLARE_THROW_SCOPE(vm);
    UNUSED_PARAM(throwScope);
    JSValue thisValue = state->thisValue();
    auto castedThis = jsDynamicCast<JSInternalSettingsGenerated*>(thisValue);
    if (UNLIKELY(!castedThis))
        return throwThisTypeError(*state, throwScope, "InternalSettingsGenerated", "setMinimumLogicalFontSize");
    ASSERT_GC_OBJECT_INHERITS(castedThis, JSInternalSettingsGenerated::info());
    auto& impl = castedThis->wrapped();
    if (UNLIKELY(state->argumentCount() < 1))
        return throwVMError(state, throwScope, createNotEnoughArgumentsError(state));
    auto minimumLogicalFontSize = convert<int32_t>(*state, state->uncheckedArgument(0), NormalConversion);
    RETURN_IF_EXCEPTION(throwScope, encodedJSValue());
    impl.setMinimumLogicalFontSize(WTFMove(minimumLogicalFontSize));
    return JSValue::encode(jsUndefined());
}

EncodedJSValue JSC_HOST_CALL jsInternalSettingsGeneratedPrototypeFunctionSetMinimumZoomFontSize(ExecState* state)
{
    VM& vm = state->vm();
    auto throwScope = DECLARE_THROW_SCOPE(vm);
    UNUSED_PARAM(throwScope);
    JSValue thisValue = state->thisValue();
    auto castedThis = jsDynamicCast<JSInternalSettingsGenerated*>(thisValue);
    if (UNLIKELY(!castedThis))
        return throwThisTypeError(*state, throwScope, "InternalSettingsGenerated", "setMinimumZoomFontSize");
    ASSERT_GC_OBJECT_INHERITS(castedThis, JSInternalSettingsGenerated::info());
    auto& impl = castedThis->wrapped();
    if (UNLIKELY(state->argumentCount() < 1))
        return throwVMError(state, throwScope, createNotEnoughArgumentsError(state));
    auto minimumZoomFontSize = convert<float>(*state, state->uncheckedArgument(0), ShouldAllowNonFinite::No);
    RETURN_IF_EXCEPTION(throwScope, encodedJSValue());
    impl.setMinimumZoomFontSize(WTFMove(minimumZoomFontSize));
    return JSValue::encode(jsUndefined());
}

EncodedJSValue JSC_HOST_CALL jsInternalSettingsGeneratedPrototypeFunctionSetNeedsIsLoadingInAPISenseQuirk(ExecState* state)
{
    VM& vm = state->vm();
    auto throwScope = DECLARE_THROW_SCOPE(vm);
    UNUSED_PARAM(throwScope);
    JSValue thisValue = state->thisValue();
    auto castedThis = jsDynamicCast<JSInternalSettingsGenerated*>(thisValue);
    if (UNLIKELY(!castedThis))
        return throwThisTypeError(*state, throwScope, "InternalSettingsGenerated", "setNeedsIsLoadingInAPISenseQuirk");
    ASSERT_GC_OBJECT_INHERITS(castedThis, JSInternalSettingsGenerated::info());
    auto& impl = castedThis->wrapped();
    if (UNLIKELY(state->argumentCount() < 1))
        return throwVMError(state, throwScope, createNotEnoughArgumentsError(state));
    auto needsIsLoadingInAPISenseQuirk = state->uncheckedArgument(0).toBoolean(state);
    RETURN_IF_EXCEPTION(throwScope, encodedJSValue());
    impl.setNeedsIsLoadingInAPISenseQuirk(WTFMove(needsIsLoadingInAPISenseQuirk));
    return JSValue::encode(jsUndefined());
}

EncodedJSValue JSC_HOST_CALL jsInternalSettingsGeneratedPrototypeFunctionSetNeedsKeyboardEventDisambiguationQuirks(ExecState* state)
{
    VM& vm = state->vm();
    auto throwScope = DECLARE_THROW_SCOPE(vm);
    UNUSED_PARAM(throwScope);
    JSValue thisValue = state->thisValue();
    auto castedThis = jsDynamicCast<JSInternalSettingsGenerated*>(thisValue);
    if (UNLIKELY(!castedThis))
        return throwThisTypeError(*state, throwScope, "InternalSettingsGenerated", "setNeedsKeyboardEventDisambiguationQuirks");
    ASSERT_GC_OBJECT_INHERITS(castedThis, JSInternalSettingsGenerated::info());
    auto& impl = castedThis->wrapped();
    if (UNLIKELY(state->argumentCount() < 1))
        return throwVMError(state, throwScope, createNotEnoughArgumentsError(state));
    auto needsKeyboardEventDisambiguationQuirks = state->uncheckedArgument(0).toBoolean(state);
    RETURN_IF_EXCEPTION(throwScope, encodedJSValue());
    impl.setNeedsKeyboardEventDisambiguationQuirks(WTFMove(needsKeyboardEventDisambiguationQuirks));
    return JSValue::encode(jsUndefined());
}

EncodedJSValue JSC_HOST_CALL jsInternalSettingsGeneratedPrototypeFunctionSetNeedsSiteSpecificQuirks(ExecState* state)
{
    VM& vm = state->vm();
    auto throwScope = DECLARE_THROW_SCOPE(vm);
    UNUSED_PARAM(throwScope);
    JSValue thisValue = state->thisValue();
    auto castedThis = jsDynamicCast<JSInternalSettingsGenerated*>(thisValue);
    if (UNLIKELY(!castedThis))
        return throwThisTypeError(*state, throwScope, "InternalSettingsGenerated", "setNeedsSiteSpecificQuirks");
    ASSERT_GC_OBJECT_INHERITS(castedThis, JSInternalSettingsGenerated::info());
    auto& impl = castedThis->wrapped();
    if (UNLIKELY(state->argumentCount() < 1))
        return throwVMError(state, throwScope, createNotEnoughArgumentsError(state));
    auto needsSiteSpecificQuirks = state->uncheckedArgument(0).toBoolean(state);
    RETURN_IF_EXCEPTION(throwScope, encodedJSValue());
    impl.setNeedsSiteSpecificQuirks(WTFMove(needsSiteSpecificQuirks));
    return JSValue::encode(jsUndefined());
}

EncodedJSValue JSC_HOST_CALL jsInternalSettingsGeneratedPrototypeFunctionSetNewBlockInsideInlineModelEnabled(ExecState* state)
{
    VM& vm = state->vm();
    auto throwScope = DECLARE_THROW_SCOPE(vm);
    UNUSED_PARAM(throwScope);
    JSValue thisValue = state->thisValue();
    auto castedThis = jsDynamicCast<JSInternalSettingsGenerated*>(thisValue);
    if (UNLIKELY(!castedThis))
        return throwThisTypeError(*state, throwScope, "InternalSettingsGenerated", "setNewBlockInsideInlineModelEnabled");
    ASSERT_GC_OBJECT_INHERITS(castedThis, JSInternalSettingsGenerated::info());
    auto& impl = castedThis->wrapped();
    if (UNLIKELY(state->argumentCount() < 1))
        return throwVMError(state, throwScope, createNotEnoughArgumentsError(state));
    auto newBlockInsideInlineModelEnabled = state->uncheckedArgument(0).toBoolean(state);
    RETURN_IF_EXCEPTION(throwScope, encodedJSValue());
    impl.setNewBlockInsideInlineModelEnabled(WTFMove(newBlockInsideInlineModelEnabled));
    return JSValue::encode(jsUndefined());
}

EncodedJSValue JSC_HOST_CALL jsInternalSettingsGeneratedPrototypeFunctionSetNewCSSParserEnabled(ExecState* state)
{
    VM& vm = state->vm();
    auto throwScope = DECLARE_THROW_SCOPE(vm);
    UNUSED_PARAM(throwScope);
    JSValue thisValue = state->thisValue();
    auto castedThis = jsDynamicCast<JSInternalSettingsGenerated*>(thisValue);
    if (UNLIKELY(!castedThis))
        return throwThisTypeError(*state, throwScope, "InternalSettingsGenerated", "setNewCSSParserEnabled");
    ASSERT_GC_OBJECT_INHERITS(castedThis, JSInternalSettingsGenerated::info());
    auto& impl = castedThis->wrapped();
    if (UNLIKELY(state->argumentCount() < 1))
        return throwVMError(state, throwScope, createNotEnoughArgumentsError(state));
    auto newCSSParserEnabled = state->uncheckedArgument(0).toBoolean(state);
    RETURN_IF_EXCEPTION(throwScope, encodedJSValue());
    impl.setNewCSSParserEnabled(WTFMove(newCSSParserEnabled));
    return JSValue::encode(jsUndefined());
}

EncodedJSValue JSC_HOST_CALL jsInternalSettingsGeneratedPrototypeFunctionSetNotificationsEnabled(ExecState* state)
{
    VM& vm = state->vm();
    auto throwScope = DECLARE_THROW_SCOPE(vm);
    UNUSED_PARAM(throwScope);
    JSValue thisValue = state->thisValue();
    auto castedThis = jsDynamicCast<JSInternalSettingsGenerated*>(thisValue);
    if (UNLIKELY(!castedThis))
        return throwThisTypeError(*state, throwScope, "InternalSettingsGenerated", "setNotificationsEnabled");
    ASSERT_GC_OBJECT_INHERITS(castedThis, JSInternalSettingsGenerated::info());
    auto& impl = castedThis->wrapped();
    if (UNLIKELY(state->argumentCount() < 1))
        return throwVMError(state, throwScope, createNotEnoughArgumentsError(state));
    auto notificationsEnabled = state->uncheckedArgument(0).toBoolean(state);
    RETURN_IF_EXCEPTION(throwScope, encodedJSValue());
    impl.setNotificationsEnabled(WTFMove(notificationsEnabled));
    return JSValue::encode(jsUndefined());
}

EncodedJSValue JSC_HOST_CALL jsInternalSettingsGeneratedPrototypeFunctionSetOfflineWebApplicationCacheEnabled(ExecState* state)
{
    VM& vm = state->vm();
    auto throwScope = DECLARE_THROW_SCOPE(vm);
    UNUSED_PARAM(throwScope);
    JSValue thisValue = state->thisValue();
    auto castedThis = jsDynamicCast<JSInternalSettingsGenerated*>(thisValue);
    if (UNLIKELY(!castedThis))
        return throwThisTypeError(*state, throwScope, "InternalSettingsGenerated", "setOfflineWebApplicationCacheEnabled");
    ASSERT_GC_OBJECT_INHERITS(castedThis, JSInternalSettingsGenerated::info());
    auto& impl = castedThis->wrapped();
    if (UNLIKELY(state->argumentCount() < 1))
        return throwVMError(state, throwScope, createNotEnoughArgumentsError(state));
    auto offlineWebApplicationCacheEnabled = state->uncheckedArgument(0).toBoolean(state);
    RETURN_IF_EXCEPTION(throwScope, encodedJSValue());
    impl.setOfflineWebApplicationCacheEnabled(WTFMove(offlineWebApplicationCacheEnabled));
    return JSValue::encode(jsUndefined());
}

EncodedJSValue JSC_HOST_CALL jsInternalSettingsGeneratedPrototypeFunctionSetOpenGLMultisamplingEnabled(ExecState* state)
{
    VM& vm = state->vm();
    auto throwScope = DECLARE_THROW_SCOPE(vm);
    UNUSED_PARAM(throwScope);
    JSValue thisValue = state->thisValue();
    auto castedThis = jsDynamicCast<JSInternalSettingsGenerated*>(thisValue);
    if (UNLIKELY(!castedThis))
        return throwThisTypeError(*state, throwScope, "InternalSettingsGenerated", "setOpenGLMultisamplingEnabled");
    ASSERT_GC_OBJECT_INHERITS(castedThis, JSInternalSettingsGenerated::info());
    auto& impl = castedThis->wrapped();
    if (UNLIKELY(state->argumentCount() < 1))
        return throwVMError(state, throwScope, createNotEnoughArgumentsError(state));
    auto openGLMultisamplingEnabled = state->uncheckedArgument(0).toBoolean(state);
    RETURN_IF_EXCEPTION(throwScope, encodedJSValue());
    impl.setOpenGLMultisamplingEnabled(WTFMove(openGLMultisamplingEnabled));
    return JSValue::encode(jsUndefined());
}

EncodedJSValue JSC_HOST_CALL jsInternalSettingsGeneratedPrototypeFunctionSetPageCacheSupportsPlugins(ExecState* state)
{
    VM& vm = state->vm();
    auto throwScope = DECLARE_THROW_SCOPE(vm);
    UNUSED_PARAM(throwScope);
    JSValue thisValue = state->thisValue();
    auto castedThis = jsDynamicCast<JSInternalSettingsGenerated*>(thisValue);
    if (UNLIKELY(!castedThis))
        return throwThisTypeError(*state, throwScope, "InternalSettingsGenerated", "setPageCacheSupportsPlugins");
    ASSERT_GC_OBJECT_INHERITS(castedThis, JSInternalSettingsGenerated::info());
    auto& impl = castedThis->wrapped();
    if (UNLIKELY(state->argumentCount() < 1))
        return throwVMError(state, throwScope, createNotEnoughArgumentsError(state));
    auto pageCacheSupportsPlugins = state->uncheckedArgument(0).toBoolean(state);
    RETURN_IF_EXCEPTION(throwScope, encodedJSValue());
    impl.setPageCacheSupportsPlugins(WTFMove(pageCacheSupportsPlugins));
    return JSValue::encode(jsUndefined());
}

EncodedJSValue JSC_HOST_CALL jsInternalSettingsGeneratedPrototypeFunctionSetPaginateDuringLayoutEnabled(ExecState* state)
{
    VM& vm = state->vm();
    auto throwScope = DECLARE_THROW_SCOPE(vm);
    UNUSED_PARAM(throwScope);
    JSValue thisValue = state->thisValue();
    auto castedThis = jsDynamicCast<JSInternalSettingsGenerated*>(thisValue);
    if (UNLIKELY(!castedThis))
        return throwThisTypeError(*state, throwScope, "InternalSettingsGenerated", "setPaginateDuringLayoutEnabled");
    ASSERT_GC_OBJECT_INHERITS(castedThis, JSInternalSettingsGenerated::info());
    auto& impl = castedThis->wrapped();
    if (UNLIKELY(state->argumentCount() < 1))
        return throwVMError(state, throwScope, createNotEnoughArgumentsError(state));
    auto paginateDuringLayoutEnabled = state->uncheckedArgument(0).toBoolean(state);
    RETURN_IF_EXCEPTION(throwScope, encodedJSValue());
    impl.setPaginateDuringLayoutEnabled(WTFMove(paginateDuringLayoutEnabled));
    return JSValue::encode(jsUndefined());
}

EncodedJSValue JSC_HOST_CALL jsInternalSettingsGeneratedPrototypeFunctionSetPasswordEchoDurationInSeconds(ExecState* state)
{
    VM& vm = state->vm();
    auto throwScope = DECLARE_THROW_SCOPE(vm);
    UNUSED_PARAM(throwScope);
    JSValue thisValue = state->thisValue();
    auto castedThis = jsDynamicCast<JSInternalSettingsGenerated*>(thisValue);
    if (UNLIKELY(!castedThis))
        return throwThisTypeError(*state, throwScope, "InternalSettingsGenerated", "setPasswordEchoDurationInSeconds");
    ASSERT_GC_OBJECT_INHERITS(castedThis, JSInternalSettingsGenerated::info());
    auto& impl = castedThis->wrapped();
    if (UNLIKELY(state->argumentCount() < 1))
        return throwVMError(state, throwScope, createNotEnoughArgumentsError(state));
    auto passwordEchoDurationInSeconds = convert<double>(*state, state->uncheckedArgument(0), ShouldAllowNonFinite::No);
    RETURN_IF_EXCEPTION(throwScope, encodedJSValue());
    impl.setPasswordEchoDurationInSeconds(WTFMove(passwordEchoDurationInSeconds));
    return JSValue::encode(jsUndefined());
}

EncodedJSValue JSC_HOST_CALL jsInternalSettingsGeneratedPrototypeFunctionSetPasswordEchoEnabled(ExecState* state)
{
    VM& vm = state->vm();
    auto throwScope = DECLARE_THROW_SCOPE(vm);
    UNUSED_PARAM(throwScope);
    JSValue thisValue = state->thisValue();
    auto castedThis = jsDynamicCast<JSInternalSettingsGenerated*>(thisValue);
    if (UNLIKELY(!castedThis))
        return throwThisTypeError(*state, throwScope, "InternalSettingsGenerated", "setPasswordEchoEnabled");
    ASSERT_GC_OBJECT_INHERITS(castedThis, JSInternalSettingsGenerated::info());
    auto& impl = castedThis->wrapped();
    if (UNLIKELY(state->argumentCount() < 1))
        return throwVMError(state, throwScope, createNotEnoughArgumentsError(state));
    auto passwordEchoEnabled = state->uncheckedArgument(0).toBoolean(state);
    RETURN_IF_EXCEPTION(throwScope, encodedJSValue());
    impl.setPasswordEchoEnabled(WTFMove(passwordEchoEnabled));
    return JSValue::encode(jsUndefined());
}

EncodedJSValue JSC_HOST_CALL jsInternalSettingsGeneratedPrototypeFunctionSetPlugInSnapshottingEnabled(ExecState* state)
{
    VM& vm = state->vm();
    auto throwScope = DECLARE_THROW_SCOPE(vm);
    UNUSED_PARAM(throwScope);
    JSValue thisValue = state->thisValue();
    auto castedThis = jsDynamicCast<JSInternalSettingsGenerated*>(thisValue);
    if (UNLIKELY(!castedThis))
        return throwThisTypeError(*state, throwScope, "InternalSettingsGenerated", "setPlugInSnapshottingEnabled");
    ASSERT_GC_OBJECT_INHERITS(castedThis, JSInternalSettingsGenerated::info());
    auto& impl = castedThis->wrapped();
    if (UNLIKELY(state->argumentCount() < 1))
        return throwVMError(state, throwScope, createNotEnoughArgumentsError(state));
    auto plugInSnapshottingEnabled = state->uncheckedArgument(0).toBoolean(state);
    RETURN_IF_EXCEPTION(throwScope, encodedJSValue());
    impl.setPlugInSnapshottingEnabled(WTFMove(plugInSnapshottingEnabled));
    return JSValue::encode(jsUndefined());
}

EncodedJSValue JSC_HOST_CALL jsInternalSettingsGeneratedPrototypeFunctionSetPreventKeyboardDOMEventDispatch(ExecState* state)
{
    VM& vm = state->vm();
    auto throwScope = DECLARE_THROW_SCOPE(vm);
    UNUSED_PARAM(throwScope);
    JSValue thisValue = state->thisValue();
    auto castedThis = jsDynamicCast<JSInternalSettingsGenerated*>(thisValue);
    if (UNLIKELY(!castedThis))
        return throwThisTypeError(*state, throwScope, "InternalSettingsGenerated", "setPreventKeyboardDOMEventDispatch");
    ASSERT_GC_OBJECT_INHERITS(castedThis, JSInternalSettingsGenerated::info());
    auto& impl = castedThis->wrapped();
    if (UNLIKELY(state->argumentCount() < 1))
        return throwVMError(state, throwScope, createNotEnoughArgumentsError(state));
    auto preventKeyboardDOMEventDispatch = state->uncheckedArgument(0).toBoolean(state);
    RETURN_IF_EXCEPTION(throwScope, encodedJSValue());
    impl.setPreventKeyboardDOMEventDispatch(WTFMove(preventKeyboardDOMEventDispatch));
    return JSValue::encode(jsUndefined());
}

EncodedJSValue JSC_HOST_CALL jsInternalSettingsGeneratedPrototypeFunctionSetPrimaryPlugInSnapshotDetectionEnabled(ExecState* state)
{
    VM& vm = state->vm();
    auto throwScope = DECLARE_THROW_SCOPE(vm);
    UNUSED_PARAM(throwScope);
    JSValue thisValue = state->thisValue();
    auto castedThis = jsDynamicCast<JSInternalSettingsGenerated*>(thisValue);
    if (UNLIKELY(!castedThis))
        return throwThisTypeError(*state, throwScope, "InternalSettingsGenerated", "setPrimaryPlugInSnapshotDetectionEnabled");
    ASSERT_GC_OBJECT_INHERITS(castedThis, JSInternalSettingsGenerated::info());
    auto& impl = castedThis->wrapped();
    if (UNLIKELY(state->argumentCount() < 1))
        return throwVMError(state, throwScope, createNotEnoughArgumentsError(state));
    auto primaryPlugInSnapshotDetectionEnabled = state->uncheckedArgument(0).toBoolean(state);
    RETURN_IF_EXCEPTION(throwScope, encodedJSValue());
    impl.setPrimaryPlugInSnapshotDetectionEnabled(WTFMove(primaryPlugInSnapshotDetectionEnabled));
    return JSValue::encode(jsUndefined());
}

EncodedJSValue JSC_HOST_CALL jsInternalSettingsGeneratedPrototypeFunctionSetQuickTimePluginReplacementEnabled(ExecState* state)
{
    VM& vm = state->vm();
    auto throwScope = DECLARE_THROW_SCOPE(vm);
    UNUSED_PARAM(throwScope);
    JSValue thisValue = state->thisValue();
    auto castedThis = jsDynamicCast<JSInternalSettingsGenerated*>(thisValue);
    if (UNLIKELY(!castedThis))
        return throwThisTypeError(*state, throwScope, "InternalSettingsGenerated", "setQuickTimePluginReplacementEnabled");
    ASSERT_GC_OBJECT_INHERITS(castedThis, JSInternalSettingsGenerated::info());
    auto& impl = castedThis->wrapped();
    if (UNLIKELY(state->argumentCount() < 1))
        return throwVMError(state, throwScope, createNotEnoughArgumentsError(state));
    auto quickTimePluginReplacementEnabled = state->uncheckedArgument(0).toBoolean(state);
    RETURN_IF_EXCEPTION(throwScope, encodedJSValue());
    impl.setQuickTimePluginReplacementEnabled(WTFMove(quickTimePluginReplacementEnabled));
    return JSValue::encode(jsUndefined());
}

EncodedJSValue JSC_HOST_CALL jsInternalSettingsGeneratedPrototypeFunctionSetRequestAnimationFrameEnabled(ExecState* state)
{
    VM& vm = state->vm();
    auto throwScope = DECLARE_THROW_SCOPE(vm);
    UNUSED_PARAM(throwScope);
    JSValue thisValue = state->thisValue();
    auto castedThis = jsDynamicCast<JSInternalSettingsGenerated*>(thisValue);
    if (UNLIKELY(!castedThis))
        return throwThisTypeError(*state, throwScope, "InternalSettingsGenerated", "setRequestAnimationFrameEnabled");
    ASSERT_GC_OBJECT_INHERITS(castedThis, JSInternalSettingsGenerated::info());
    auto& impl = castedThis->wrapped();
    if (UNLIKELY(state->argumentCount() < 1))
        return throwVMError(state, throwScope, createNotEnoughArgumentsError(state));
    auto requestAnimationFrameEnabled = state->uncheckedArgument(0).toBoolean(state);
    RETURN_IF_EXCEPTION(throwScope, encodedJSValue());
    impl.setRequestAnimationFrameEnabled(WTFMove(requestAnimationFrameEnabled));
    return JSValue::encode(jsUndefined());
}

EncodedJSValue JSC_HOST_CALL jsInternalSettingsGeneratedPrototypeFunctionSetRubberBandingForSubScrollableRegionsEnabled(ExecState* state)
{
    VM& vm = state->vm();
    auto throwScope = DECLARE_THROW_SCOPE(vm);
    UNUSED_PARAM(throwScope);
    JSValue thisValue = state->thisValue();
    auto castedThis = jsDynamicCast<JSInternalSettingsGenerated*>(thisValue);
    if (UNLIKELY(!castedThis))
        return throwThisTypeError(*state, throwScope, "InternalSettingsGenerated", "setRubberBandingForSubScrollableRegionsEnabled");
    ASSERT_GC_OBJECT_INHERITS(castedThis, JSInternalSettingsGenerated::info());
    auto& impl = castedThis->wrapped();
    if (UNLIKELY(state->argumentCount() < 1))
        return throwVMError(state, throwScope, createNotEnoughArgumentsError(state));
    auto rubberBandingForSubScrollableRegionsEnabled = state->uncheckedArgument(0).toBoolean(state);
    RETURN_IF_EXCEPTION(throwScope, encodedJSValue());
    impl.setRubberBandingForSubScrollableRegionsEnabled(WTFMove(rubberBandingForSubScrollableRegionsEnabled));
    return JSValue::encode(jsUndefined());
}

EncodedJSValue JSC_HOST_CALL jsInternalSettingsGeneratedPrototypeFunctionSetScriptMarkupEnabled(ExecState* state)
{
    VM& vm = state->vm();
    auto throwScope = DECLARE_THROW_SCOPE(vm);
    UNUSED_PARAM(throwScope);
    JSValue thisValue = state->thisValue();
    auto castedThis = jsDynamicCast<JSInternalSettingsGenerated*>(thisValue);
    if (UNLIKELY(!castedThis))
        return throwThisTypeError(*state, throwScope, "InternalSettingsGenerated", "setScriptMarkupEnabled");
    ASSERT_GC_OBJECT_INHERITS(castedThis, JSInternalSettingsGenerated::info());
    auto& impl = castedThis->wrapped();
    if (UNLIKELY(state->argumentCount() < 1))
        return throwVMError(state, throwScope, createNotEnoughArgumentsError(state));
    auto scriptMarkupEnabled = state->uncheckedArgument(0).toBoolean(state);
    RETURN_IF_EXCEPTION(throwScope, encodedJSValue());
    impl.setScriptMarkupEnabled(WTFMove(scriptMarkupEnabled));
    return JSValue::encode(jsUndefined());
}

EncodedJSValue JSC_HOST_CALL jsInternalSettingsGeneratedPrototypeFunctionSetScrollAnimatorEnabled(ExecState* state)
{
    VM& vm = state->vm();
    auto throwScope = DECLARE_THROW_SCOPE(vm);
    UNUSED_PARAM(throwScope);
    JSValue thisValue = state->thisValue();
    auto castedThis = jsDynamicCast<JSInternalSettingsGenerated*>(thisValue);
    if (UNLIKELY(!castedThis))
        return throwThisTypeError(*state, throwScope, "InternalSettingsGenerated", "setScrollAnimatorEnabled");
    ASSERT_GC_OBJECT_INHERITS(castedThis, JSInternalSettingsGenerated::info());
    auto& impl = castedThis->wrapped();
    if (UNLIKELY(state->argumentCount() < 1))
        return throwVMError(state, throwScope, createNotEnoughArgumentsError(state));
    auto scrollAnimatorEnabled = state->uncheckedArgument(0).toBoolean(state);
    RETURN_IF_EXCEPTION(throwScope, encodedJSValue());
    impl.setScrollAnimatorEnabled(WTFMove(scrollAnimatorEnabled));
    return JSValue::encode(jsUndefined());
}

EncodedJSValue JSC_HOST_CALL jsInternalSettingsGeneratedPrototypeFunctionSetScrollingCoordinatorEnabled(ExecState* state)
{
    VM& vm = state->vm();
    auto throwScope = DECLARE_THROW_SCOPE(vm);
    UNUSED_PARAM(throwScope);
    JSValue thisValue = state->thisValue();
    auto castedThis = jsDynamicCast<JSInternalSettingsGenerated*>(thisValue);
    if (UNLIKELY(!castedThis))
        return throwThisTypeError(*state, throwScope, "InternalSettingsGenerated", "setScrollingCoordinatorEnabled");
    ASSERT_GC_OBJECT_INHERITS(castedThis, JSInternalSettingsGenerated::info());
    auto& impl = castedThis->wrapped();
    if (UNLIKELY(state->argumentCount() < 1))
        return throwVMError(state, throwScope, createNotEnoughArgumentsError(state));
    auto scrollingCoordinatorEnabled = state->uncheckedArgument(0).toBoolean(state);
    RETURN_IF_EXCEPTION(throwScope, encodedJSValue());
    impl.setScrollingCoordinatorEnabled(WTFMove(scrollingCoordinatorEnabled));
    return JSValue::encode(jsUndefined());
}

EncodedJSValue JSC_HOST_CALL jsInternalSettingsGeneratedPrototypeFunctionSetScrollingTreeIncludesFrames(ExecState* state)
{
    VM& vm = state->vm();
    auto throwScope = DECLARE_THROW_SCOPE(vm);
    UNUSED_PARAM(throwScope);
    JSValue thisValue = state->thisValue();
    auto castedThis = jsDynamicCast<JSInternalSettingsGenerated*>(thisValue);
    if (UNLIKELY(!castedThis))
        return throwThisTypeError(*state, throwScope, "InternalSettingsGenerated", "setScrollingTreeIncludesFrames");
    ASSERT_GC_OBJECT_INHERITS(castedThis, JSInternalSettingsGenerated::info());
    auto& impl = castedThis->wrapped();
    if (UNLIKELY(state->argumentCount() < 1))
        return throwVMError(state, throwScope, createNotEnoughArgumentsError(state));
    auto scrollingTreeIncludesFrames = state->uncheckedArgument(0).toBoolean(state);
    RETURN_IF_EXCEPTION(throwScope, encodedJSValue());
    impl.setScrollingTreeIncludesFrames(WTFMove(scrollingTreeIncludesFrames));
    return JSValue::encode(jsUndefined());
}

EncodedJSValue JSC_HOST_CALL jsInternalSettingsGeneratedPrototypeFunctionSetSelectTrailingWhitespaceEnabled(ExecState* state)
{
    VM& vm = state->vm();
    auto throwScope = DECLARE_THROW_SCOPE(vm);
    UNUSED_PARAM(throwScope);
    JSValue thisValue = state->thisValue();
    auto castedThis = jsDynamicCast<JSInternalSettingsGenerated*>(thisValue);
    if (UNLIKELY(!castedThis))
        return throwThisTypeError(*state, throwScope, "InternalSettingsGenerated", "setSelectTrailingWhitespaceEnabled");
    ASSERT_GC_OBJECT_INHERITS(castedThis, JSInternalSettingsGenerated::info());
    auto& impl = castedThis->wrapped();
    if (UNLIKELY(state->argumentCount() < 1))
        return throwVMError(state, throwScope, createNotEnoughArgumentsError(state));
    auto selectTrailingWhitespaceEnabled = state->uncheckedArgument(0).toBoolean(state);
    RETURN_IF_EXCEPTION(throwScope, encodedJSValue());
    impl.setSelectTrailingWhitespaceEnabled(WTFMove(selectTrailingWhitespaceEnabled));
    return JSValue::encode(jsUndefined());
}

EncodedJSValue JSC_HOST_CALL jsInternalSettingsGeneratedPrototypeFunctionSetSelectionIncludesAltImageText(ExecState* state)
{
    VM& vm = state->vm();
    auto throwScope = DECLARE_THROW_SCOPE(vm);
    UNUSED_PARAM(throwScope);
    JSValue thisValue = state->thisValue();
    auto castedThis = jsDynamicCast<JSInternalSettingsGenerated*>(thisValue);
    if (UNLIKELY(!castedThis))
        return throwThisTypeError(*state, throwScope, "InternalSettingsGenerated", "setSelectionIncludesAltImageText");
    ASSERT_GC_OBJECT_INHERITS(castedThis, JSInternalSettingsGenerated::info());
    auto& impl = castedThis->wrapped();
    if (UNLIKELY(state->argumentCount() < 1))
        return throwVMError(state, throwScope, createNotEnoughArgumentsError(state));
    auto selectionIncludesAltImageText = state->uncheckedArgument(0).toBoolean(state);
    RETURN_IF_EXCEPTION(throwScope, encodedJSValue());
    impl.setSelectionIncludesAltImageText(WTFMove(selectionIncludesAltImageText));
    return JSValue::encode(jsUndefined());
}

EncodedJSValue JSC_HOST_CALL jsInternalSettingsGeneratedPrototypeFunctionSetSelectionPaintingWithoutSelectionGapsEnabled(ExecState* state)
{
    VM& vm = state->vm();
    auto throwScope = DECLARE_THROW_SCOPE(vm);
    UNUSED_PARAM(throwScope);
    JSValue thisValue = state->thisValue();
    auto castedThis = jsDynamicCast<JSInternalSettingsGenerated*>(thisValue);
    if (UNLIKELY(!castedThis))
        return throwThisTypeError(*state, throwScope, "InternalSettingsGenerated", "setSelectionPaintingWithoutSelectionGapsEnabled");
    ASSERT_GC_OBJECT_INHERITS(castedThis, JSInternalSettingsGenerated::info());
    auto& impl = castedThis->wrapped();
    if (UNLIKELY(state->argumentCount() < 1))
        return throwVMError(state, throwScope, createNotEnoughArgumentsError(state));
    auto selectionPaintingWithoutSelectionGapsEnabled = state->uncheckedArgument(0).toBoolean(state);
    RETURN_IF_EXCEPTION(throwScope, encodedJSValue());
    impl.setSelectionPaintingWithoutSelectionGapsEnabled(WTFMove(selectionPaintingWithoutSelectionGapsEnabled));
    return JSValue::encode(jsUndefined());
}

EncodedJSValue JSC_HOST_CALL jsInternalSettingsGeneratedPrototypeFunctionSetServiceControlsEnabled(ExecState* state)
{
    VM& vm = state->vm();
    auto throwScope = DECLARE_THROW_SCOPE(vm);
    UNUSED_PARAM(throwScope);
    JSValue thisValue = state->thisValue();
    auto castedThis = jsDynamicCast<JSInternalSettingsGenerated*>(thisValue);
    if (UNLIKELY(!castedThis))
        return throwThisTypeError(*state, throwScope, "InternalSettingsGenerated", "setServiceControlsEnabled");
    ASSERT_GC_OBJECT_INHERITS(castedThis, JSInternalSettingsGenerated::info());
    auto& impl = castedThis->wrapped();
    if (UNLIKELY(state->argumentCount() < 1))
        return throwVMError(state, throwScope, createNotEnoughArgumentsError(state));
    auto serviceControlsEnabled = state->uncheckedArgument(0).toBoolean(state);
    RETURN_IF_EXCEPTION(throwScope, encodedJSValue());
    impl.setServiceControlsEnabled(WTFMove(serviceControlsEnabled));
    return JSValue::encode(jsUndefined());
}

EncodedJSValue JSC_HOST_CALL jsInternalSettingsGeneratedPrototypeFunctionSetSessionStorageQuota(ExecState* state)
{
    VM& vm = state->vm();
    auto throwScope = DECLARE_THROW_SCOPE(vm);
    UNUSED_PARAM(throwScope);
    JSValue thisValue = state->thisValue();
    auto castedThis = jsDynamicCast<JSInternalSettingsGenerated*>(thisValue);
    if (UNLIKELY(!castedThis))
        return throwThisTypeError(*state, throwScope, "InternalSettingsGenerated", "setSessionStorageQuota");
    ASSERT_GC_OBJECT_INHERITS(castedThis, JSInternalSettingsGenerated::info());
    auto& impl = castedThis->wrapped();
    if (UNLIKELY(state->argumentCount() < 1))
        return throwVMError(state, throwScope, createNotEnoughArgumentsError(state));
    auto sessionStorageQuota = convert<uint32_t>(*state, state->uncheckedArgument(0), NormalConversion);
    RETURN_IF_EXCEPTION(throwScope, encodedJSValue());
    impl.setSessionStorageQuota(WTFMove(sessionStorageQuota));
    return JSValue::encode(jsUndefined());
}

EncodedJSValue JSC_HOST_CALL jsInternalSettingsGeneratedPrototypeFunctionSetShouldConvertInvalidURLsToBlank(ExecState* state)
{
    VM& vm = state->vm();
    auto throwScope = DECLARE_THROW_SCOPE(vm);
    UNUSED_PARAM(throwScope);
    JSValue thisValue = state->thisValue();
    auto castedThis = jsDynamicCast<JSInternalSettingsGenerated*>(thisValue);
    if (UNLIKELY(!castedThis))
        return throwThisTypeError(*state, throwScope, "InternalSettingsGenerated", "setShouldConvertInvalidURLsToBlank");
    ASSERT_GC_OBJECT_INHERITS(castedThis, JSInternalSettingsGenerated::info());
    auto& impl = castedThis->wrapped();
    if (UNLIKELY(state->argumentCount() < 1))
        return throwVMError(state, throwScope, createNotEnoughArgumentsError(state));
    auto shouldConvertInvalidURLsToBlank = state->uncheckedArgument(0).toBoolean(state);
    RETURN_IF_EXCEPTION(throwScope, encodedJSValue());
    impl.setShouldConvertInvalidURLsToBlank(WTFMove(shouldConvertInvalidURLsToBlank));
    return JSValue::encode(jsUndefined());
}

EncodedJSValue JSC_HOST_CALL jsInternalSettingsGeneratedPrototypeFunctionSetShouldConvertPositionStyleOnCopy(ExecState* state)
{
    VM& vm = state->vm();
    auto throwScope = DECLARE_THROW_SCOPE(vm);
    UNUSED_PARAM(throwScope);
    JSValue thisValue = state->thisValue();
    auto castedThis = jsDynamicCast<JSInternalSettingsGenerated*>(thisValue);
    if (UNLIKELY(!castedThis))
        return throwThisTypeError(*state, throwScope, "InternalSettingsGenerated", "setShouldConvertPositionStyleOnCopy");
    ASSERT_GC_OBJECT_INHERITS(castedThis, JSInternalSettingsGenerated::info());
    auto& impl = castedThis->wrapped();
    if (UNLIKELY(state->argumentCount() < 1))
        return throwVMError(state, throwScope, createNotEnoughArgumentsError(state));
    auto shouldConvertPositionStyleOnCopy = state->uncheckedArgument(0).toBoolean(state);
    RETURN_IF_EXCEPTION(throwScope, encodedJSValue());
    impl.setShouldConvertPositionStyleOnCopy(WTFMove(shouldConvertPositionStyleOnCopy));
    return JSValue::encode(jsUndefined());
}

EncodedJSValue JSC_HOST_CALL jsInternalSettingsGeneratedPrototypeFunctionSetShouldDispatchJavaScriptWindowOnErrorEvents(ExecState* state)
{
    VM& vm = state->vm();
    auto throwScope = DECLARE_THROW_SCOPE(vm);
    UNUSED_PARAM(throwScope);
    JSValue thisValue = state->thisValue();
    auto castedThis = jsDynamicCast<JSInternalSettingsGenerated*>(thisValue);
    if (UNLIKELY(!castedThis))
        return throwThisTypeError(*state, throwScope, "InternalSettingsGenerated", "setShouldDispatchJavaScriptWindowOnErrorEvents");
    ASSERT_GC_OBJECT_INHERITS(castedThis, JSInternalSettingsGenerated::info());
    auto& impl = castedThis->wrapped();
    if (UNLIKELY(state->argumentCount() < 1))
        return throwVMError(state, throwScope, createNotEnoughArgumentsError(state));
    auto shouldDispatchJavaScriptWindowOnErrorEvents = state->uncheckedArgument(0).toBoolean(state);
    RETURN_IF_EXCEPTION(throwScope, encodedJSValue());
    impl.setShouldDispatchJavaScriptWindowOnErrorEvents(WTFMove(shouldDispatchJavaScriptWindowOnErrorEvents));
    return JSValue::encode(jsUndefined());
}

EncodedJSValue JSC_HOST_CALL jsInternalSettingsGeneratedPrototypeFunctionSetShouldDisplayCaptions(ExecState* state)
{
    VM& vm = state->vm();
    auto throwScope = DECLARE_THROW_SCOPE(vm);
    UNUSED_PARAM(throwScope);
    JSValue thisValue = state->thisValue();
    auto castedThis = jsDynamicCast<JSInternalSettingsGenerated*>(thisValue);
    if (UNLIKELY(!castedThis))
        return throwThisTypeError(*state, throwScope, "InternalSettingsGenerated", "setShouldDisplayCaptions");
    ASSERT_GC_OBJECT_INHERITS(castedThis, JSInternalSettingsGenerated::info());
    auto& impl = castedThis->wrapped();
    if (UNLIKELY(state->argumentCount() < 1))
        return throwVMError(state, throwScope, createNotEnoughArgumentsError(state));
    auto shouldDisplayCaptions = state->uncheckedArgument(0).toBoolean(state);
    RETURN_IF_EXCEPTION(throwScope, encodedJSValue());
    impl.setShouldDisplayCaptions(WTFMove(shouldDisplayCaptions));
    return JSValue::encode(jsUndefined());
}

EncodedJSValue JSC_HOST_CALL jsInternalSettingsGeneratedPrototypeFunctionSetShouldDisplaySubtitles(ExecState* state)
{
    VM& vm = state->vm();
    auto throwScope = DECLARE_THROW_SCOPE(vm);
    UNUSED_PARAM(throwScope);
    JSValue thisValue = state->thisValue();
    auto castedThis = jsDynamicCast<JSInternalSettingsGenerated*>(thisValue);
    if (UNLIKELY(!castedThis))
        return throwThisTypeError(*state, throwScope, "InternalSettingsGenerated", "setShouldDisplaySubtitles");
    ASSERT_GC_OBJECT_INHERITS(castedThis, JSInternalSettingsGenerated::info());
    auto& impl = castedThis->wrapped();
    if (UNLIKELY(state->argumentCount() < 1))
        return throwVMError(state, throwScope, createNotEnoughArgumentsError(state));
    auto shouldDisplaySubtitles = state->uncheckedArgument(0).toBoolean(state);
    RETURN_IF_EXCEPTION(throwScope, encodedJSValue());
    impl.setShouldDisplaySubtitles(WTFMove(shouldDisplaySubtitles));
    return JSValue::encode(jsUndefined());
}

EncodedJSValue JSC_HOST_CALL jsInternalSettingsGeneratedPrototypeFunctionSetShouldDisplayTextDescriptions(ExecState* state)
{
    VM& vm = state->vm();
    auto throwScope = DECLARE_THROW_SCOPE(vm);
    UNUSED_PARAM(throwScope);
    JSValue thisValue = state->thisValue();
    auto castedThis = jsDynamicCast<JSInternalSettingsGenerated*>(thisValue);
    if (UNLIKELY(!castedThis))
        return throwThisTypeError(*state, throwScope, "InternalSettingsGenerated", "setShouldDisplayTextDescriptions");
    ASSERT_GC_OBJECT_INHERITS(castedThis, JSInternalSettingsGenerated::info());
    auto& impl = castedThis->wrapped();
    if (UNLIKELY(state->argumentCount() < 1))
        return throwVMError(state, throwScope, createNotEnoughArgumentsError(state));
    auto shouldDisplayTextDescriptions = state->uncheckedArgument(0).toBoolean(state);
    RETURN_IF_EXCEPTION(throwScope, encodedJSValue());
    impl.setShouldDisplayTextDescriptions(WTFMove(shouldDisplayTextDescriptions));
    return JSValue::encode(jsUndefined());
}

EncodedJSValue JSC_HOST_CALL jsInternalSettingsGeneratedPrototypeFunctionSetShouldInjectUserScriptsInInitialEmptyDocument(ExecState* state)
{
    VM& vm = state->vm();
    auto throwScope = DECLARE_THROW_SCOPE(vm);
    UNUSED_PARAM(throwScope);
    JSValue thisValue = state->thisValue();
    auto castedThis = jsDynamicCast<JSInternalSettingsGenerated*>(thisValue);
    if (UNLIKELY(!castedThis))
        return throwThisTypeError(*state, throwScope, "InternalSettingsGenerated", "setShouldInjectUserScriptsInInitialEmptyDocument");
    ASSERT_GC_OBJECT_INHERITS(castedThis, JSInternalSettingsGenerated::info());
    auto& impl = castedThis->wrapped();
    if (UNLIKELY(state->argumentCount() < 1))
        return throwVMError(state, throwScope, createNotEnoughArgumentsError(state));
    auto shouldInjectUserScriptsInInitialEmptyDocument = state->uncheckedArgument(0).toBoolean(state);
    RETURN_IF_EXCEPTION(throwScope, encodedJSValue());
    impl.setShouldInjectUserScriptsInInitialEmptyDocument(WTFMove(shouldInjectUserScriptsInInitialEmptyDocument));
    return JSValue::encode(jsUndefined());
}

EncodedJSValue JSC_HOST_CALL jsInternalSettingsGeneratedPrototypeFunctionSetShouldPrintBackgrounds(ExecState* state)
{
    VM& vm = state->vm();
    auto throwScope = DECLARE_THROW_SCOPE(vm);
    UNUSED_PARAM(throwScope);
    JSValue thisValue = state->thisValue();
    auto castedThis = jsDynamicCast<JSInternalSettingsGenerated*>(thisValue);
    if (UNLIKELY(!castedThis))
        return throwThisTypeError(*state, throwScope, "InternalSettingsGenerated", "setShouldPrintBackgrounds");
    ASSERT_GC_OBJECT_INHERITS(castedThis, JSInternalSettingsGenerated::info());
    auto& impl = castedThis->wrapped();
    if (UNLIKELY(state->argumentCount() < 1))
        return throwVMError(state, throwScope, createNotEnoughArgumentsError(state));
    auto shouldPrintBackgrounds = state->uncheckedArgument(0).toBoolean(state);
    RETURN_IF_EXCEPTION(throwScope, encodedJSValue());
    impl.setShouldPrintBackgrounds(WTFMove(shouldPrintBackgrounds));
    return JSValue::encode(jsUndefined());
}

EncodedJSValue JSC_HOST_CALL jsInternalSettingsGeneratedPrototypeFunctionSetShouldRespectImageOrientation(ExecState* state)
{
    VM& vm = state->vm();
    auto throwScope = DECLARE_THROW_SCOPE(vm);
    UNUSED_PARAM(throwScope);
    JSValue thisValue = state->thisValue();
    auto castedThis = jsDynamicCast<JSInternalSettingsGenerated*>(thisValue);
    if (UNLIKELY(!castedThis))
        return throwThisTypeError(*state, throwScope, "InternalSettingsGenerated", "setShouldRespectImageOrientation");
    ASSERT_GC_OBJECT_INHERITS(castedThis, JSInternalSettingsGenerated::info());
    auto& impl = castedThis->wrapped();
    if (UNLIKELY(state->argumentCount() < 1))
        return throwVMError(state, throwScope, createNotEnoughArgumentsError(state));
    auto shouldRespectImageOrientation = state->uncheckedArgument(0).toBoolean(state);
    RETURN_IF_EXCEPTION(throwScope, encodedJSValue());
    impl.setShouldRespectImageOrientation(WTFMove(shouldRespectImageOrientation));
    return JSValue::encode(jsUndefined());
}

EncodedJSValue JSC_HOST_CALL jsInternalSettingsGeneratedPrototypeFunctionSetShouldTransformsAffectOverflow(ExecState* state)
{
    VM& vm = state->vm();
    auto throwScope = DECLARE_THROW_SCOPE(vm);
    UNUSED_PARAM(throwScope);
    JSValue thisValue = state->thisValue();
    auto castedThis = jsDynamicCast<JSInternalSettingsGenerated*>(thisValue);
    if (UNLIKELY(!castedThis))
        return throwThisTypeError(*state, throwScope, "InternalSettingsGenerated", "setShouldTransformsAffectOverflow");
    ASSERT_GC_OBJECT_INHERITS(castedThis, JSInternalSettingsGenerated::info());
    auto& impl = castedThis->wrapped();
    if (UNLIKELY(state->argumentCount() < 1))
        return throwVMError(state, throwScope, createNotEnoughArgumentsError(state));
    auto shouldTransformsAffectOverflow = state->uncheckedArgument(0).toBoolean(state);
    RETURN_IF_EXCEPTION(throwScope, encodedJSValue());
    impl.setShouldTransformsAffectOverflow(WTFMove(shouldTransformsAffectOverflow));
    return JSValue::encode(jsUndefined());
}

EncodedJSValue JSC_HOST_CALL jsInternalSettingsGeneratedPrototypeFunctionSetShowDebugBorders(ExecState* state)
{
    VM& vm = state->vm();
    auto throwScope = DECLARE_THROW_SCOPE(vm);
    UNUSED_PARAM(throwScope);
    JSValue thisValue = state->thisValue();
    auto castedThis = jsDynamicCast<JSInternalSettingsGenerated*>(thisValue);
    if (UNLIKELY(!castedThis))
        return throwThisTypeError(*state, throwScope, "InternalSettingsGenerated", "setShowDebugBorders");
    ASSERT_GC_OBJECT_INHERITS(castedThis, JSInternalSettingsGenerated::info());
    auto& impl = castedThis->wrapped();
    if (UNLIKELY(state->argumentCount() < 1))
        return throwVMError(state, throwScope, createNotEnoughArgumentsError(state));
    auto showDebugBorders = state->uncheckedArgument(0).toBoolean(state);
    RETURN_IF_EXCEPTION(throwScope, encodedJSValue());
    impl.setShowDebugBorders(WTFMove(showDebugBorders));
    return JSValue::encode(jsUndefined());
}

EncodedJSValue JSC_HOST_CALL jsInternalSettingsGeneratedPrototypeFunctionSetShowRepaintCounter(ExecState* state)
{
    VM& vm = state->vm();
    auto throwScope = DECLARE_THROW_SCOPE(vm);
    UNUSED_PARAM(throwScope);
    JSValue thisValue = state->thisValue();
    auto castedThis = jsDynamicCast<JSInternalSettingsGenerated*>(thisValue);
    if (UNLIKELY(!castedThis))
        return throwThisTypeError(*state, throwScope, "InternalSettingsGenerated", "setShowRepaintCounter");
    ASSERT_GC_OBJECT_INHERITS(castedThis, JSInternalSettingsGenerated::info());
    auto& impl = castedThis->wrapped();
    if (UNLIKELY(state->argumentCount() < 1))
        return throwVMError(state, throwScope, createNotEnoughArgumentsError(state));
    auto showRepaintCounter = state->uncheckedArgument(0).toBoolean(state);
    RETURN_IF_EXCEPTION(throwScope, encodedJSValue());
    impl.setShowRepaintCounter(WTFMove(showRepaintCounter));
    return JSValue::encode(jsUndefined());
}

EncodedJSValue JSC_HOST_CALL jsInternalSettingsGeneratedPrototypeFunctionSetShowsToolTipOverTruncatedText(ExecState* state)
{
    VM& vm = state->vm();
    auto throwScope = DECLARE_THROW_SCOPE(vm);
    UNUSED_PARAM(throwScope);
    JSValue thisValue = state->thisValue();
    auto castedThis = jsDynamicCast<JSInternalSettingsGenerated*>(thisValue);
    if (UNLIKELY(!castedThis))
        return throwThisTypeError(*state, throwScope, "InternalSettingsGenerated", "setShowsToolTipOverTruncatedText");
    ASSERT_GC_OBJECT_INHERITS(castedThis, JSInternalSettingsGenerated::info());
    auto& impl = castedThis->wrapped();
    if (UNLIKELY(state->argumentCount() < 1))
        return throwVMError(state, throwScope, createNotEnoughArgumentsError(state));
    auto showsToolTipOverTruncatedText = state->uncheckedArgument(0).toBoolean(state);
    RETURN_IF_EXCEPTION(throwScope, encodedJSValue());
    impl.setShowsToolTipOverTruncatedText(WTFMove(showsToolTipOverTruncatedText));
    return JSValue::encode(jsUndefined());
}

EncodedJSValue JSC_HOST_CALL jsInternalSettingsGeneratedPrototypeFunctionSetShowsURLsInToolTips(ExecState* state)
{
    VM& vm = state->vm();
    auto throwScope = DECLARE_THROW_SCOPE(vm);
    UNUSED_PARAM(throwScope);
    JSValue thisValue = state->thisValue();
    auto castedThis = jsDynamicCast<JSInternalSettingsGenerated*>(thisValue);
    if (UNLIKELY(!castedThis))
        return throwThisTypeError(*state, throwScope, "InternalSettingsGenerated", "setShowsURLsInToolTips");
    ASSERT_GC_OBJECT_INHERITS(castedThis, JSInternalSettingsGenerated::info());
    auto& impl = castedThis->wrapped();
    if (UNLIKELY(state->argumentCount() < 1))
        return throwVMError(state, throwScope, createNotEnoughArgumentsError(state));
    auto showsURLsInToolTips = state->uncheckedArgument(0).toBoolean(state);
    RETURN_IF_EXCEPTION(throwScope, encodedJSValue());
    impl.setShowsURLsInToolTips(WTFMove(showsURLsInToolTips));
    return JSValue::encode(jsUndefined());
}

EncodedJSValue JSC_HOST_CALL jsInternalSettingsGeneratedPrototypeFunctionSetShrinksStandaloneImagesToFit(ExecState* state)
{
    VM& vm = state->vm();
    auto throwScope = DECLARE_THROW_SCOPE(vm);
    UNUSED_PARAM(throwScope);
    JSValue thisValue = state->thisValue();
    auto castedThis = jsDynamicCast<JSInternalSettingsGenerated*>(thisValue);
    if (UNLIKELY(!castedThis))
        return throwThisTypeError(*state, throwScope, "InternalSettingsGenerated", "setShrinksStandaloneImagesToFit");
    ASSERT_GC_OBJECT_INHERITS(castedThis, JSInternalSettingsGenerated::info());
    auto& impl = castedThis->wrapped();
    if (UNLIKELY(state->argumentCount() < 1))
        return throwVMError(state, throwScope, createNotEnoughArgumentsError(state));
    auto shrinksStandaloneImagesToFit = state->uncheckedArgument(0).toBoolean(state);
    RETURN_IF_EXCEPTION(throwScope, encodedJSValue());
    impl.setShrinksStandaloneImagesToFit(WTFMove(shrinksStandaloneImagesToFit));
    return JSValue::encode(jsUndefined());
}

EncodedJSValue JSC_HOST_CALL jsInternalSettingsGeneratedPrototypeFunctionSetSimpleLineLayoutDebugBordersEnabled(ExecState* state)
{
    VM& vm = state->vm();
    auto throwScope = DECLARE_THROW_SCOPE(vm);
    UNUSED_PARAM(throwScope);
    JSValue thisValue = state->thisValue();
    auto castedThis = jsDynamicCast<JSInternalSettingsGenerated*>(thisValue);
    if (UNLIKELY(!castedThis))
        return throwThisTypeError(*state, throwScope, "InternalSettingsGenerated", "setSimpleLineLayoutDebugBordersEnabled");
    ASSERT_GC_OBJECT_INHERITS(castedThis, JSInternalSettingsGenerated::info());
    auto& impl = castedThis->wrapped();
    if (UNLIKELY(state->argumentCount() < 1))
        return throwVMError(state, throwScope, createNotEnoughArgumentsError(state));
    auto simpleLineLayoutDebugBordersEnabled = state->uncheckedArgument(0).toBoolean(state);
    RETURN_IF_EXCEPTION(throwScope, encodedJSValue());
    impl.setSimpleLineLayoutDebugBordersEnabled(WTFMove(simpleLineLayoutDebugBordersEnabled));
    return JSValue::encode(jsUndefined());
}

EncodedJSValue JSC_HOST_CALL jsInternalSettingsGeneratedPrototypeFunctionSetSimpleLineLayoutEnabled(ExecState* state)
{
    VM& vm = state->vm();
    auto throwScope = DECLARE_THROW_SCOPE(vm);
    UNUSED_PARAM(throwScope);
    JSValue thisValue = state->thisValue();
    auto castedThis = jsDynamicCast<JSInternalSettingsGenerated*>(thisValue);
    if (UNLIKELY(!castedThis))
        return throwThisTypeError(*state, throwScope, "InternalSettingsGenerated", "setSimpleLineLayoutEnabled");
    ASSERT_GC_OBJECT_INHERITS(castedThis, JSInternalSettingsGenerated::info());
    auto& impl = castedThis->wrapped();
    if (UNLIKELY(state->argumentCount() < 1))
        return throwVMError(state, throwScope, createNotEnoughArgumentsError(state));
    auto simpleLineLayoutEnabled = state->uncheckedArgument(0).toBoolean(state);
    RETURN_IF_EXCEPTION(throwScope, encodedJSValue());
    impl.setSimpleLineLayoutEnabled(WTFMove(simpleLineLayoutEnabled));
    return JSValue::encode(jsUndefined());
}

EncodedJSValue JSC_HOST_CALL jsInternalSettingsGeneratedPrototypeFunctionSetSmartInsertDeleteEnabled(ExecState* state)
{
    VM& vm = state->vm();
    auto throwScope = DECLARE_THROW_SCOPE(vm);
    UNUSED_PARAM(throwScope);
    JSValue thisValue = state->thisValue();
    auto castedThis = jsDynamicCast<JSInternalSettingsGenerated*>(thisValue);
    if (UNLIKELY(!castedThis))
        return throwThisTypeError(*state, throwScope, "InternalSettingsGenerated", "setSmartInsertDeleteEnabled");
    ASSERT_GC_OBJECT_INHERITS(castedThis, JSInternalSettingsGenerated::info());
    auto& impl = castedThis->wrapped();
    if (UNLIKELY(state->argumentCount() < 1))
        return throwVMError(state, throwScope, createNotEnoughArgumentsError(state));
    auto smartInsertDeleteEnabled = state->uncheckedArgument(0).toBoolean(state);
    RETURN_IF_EXCEPTION(throwScope, encodedJSValue());
    impl.setSmartInsertDeleteEnabled(WTFMove(smartInsertDeleteEnabled));
    return JSValue::encode(jsUndefined());
}

EncodedJSValue JSC_HOST_CALL jsInternalSettingsGeneratedPrototypeFunctionSetSnapshotAllPlugIns(ExecState* state)
{
    VM& vm = state->vm();
    auto throwScope = DECLARE_THROW_SCOPE(vm);
    UNUSED_PARAM(throwScope);
    JSValue thisValue = state->thisValue();
    auto castedThis = jsDynamicCast<JSInternalSettingsGenerated*>(thisValue);
    if (UNLIKELY(!castedThis))
        return throwThisTypeError(*state, throwScope, "InternalSettingsGenerated", "setSnapshotAllPlugIns");
    ASSERT_GC_OBJECT_INHERITS(castedThis, JSInternalSettingsGenerated::info());
    auto& impl = castedThis->wrapped();
    if (UNLIKELY(state->argumentCount() < 1))
        return throwVMError(state, throwScope, createNotEnoughArgumentsError(state));
    auto snapshotAllPlugIns = state->uncheckedArgument(0).toBoolean(state);
    RETURN_IF_EXCEPTION(throwScope, encodedJSValue());
    impl.setSnapshotAllPlugIns(WTFMove(snapshotAllPlugIns));
    return JSValue::encode(jsUndefined());
}

EncodedJSValue JSC_HOST_CALL jsInternalSettingsGeneratedPrototypeFunctionSetSpatialNavigationEnabled(ExecState* state)
{
    VM& vm = state->vm();
    auto throwScope = DECLARE_THROW_SCOPE(vm);
    UNUSED_PARAM(throwScope);
    JSValue thisValue = state->thisValue();
    auto castedThis = jsDynamicCast<JSInternalSettingsGenerated*>(thisValue);
    if (UNLIKELY(!castedThis))
        return throwThisTypeError(*state, throwScope, "InternalSettingsGenerated", "setSpatialNavigationEnabled");
    ASSERT_GC_OBJECT_INHERITS(castedThis, JSInternalSettingsGenerated::info());
    auto& impl = castedThis->wrapped();
    if (UNLIKELY(state->argumentCount() < 1))
        return throwVMError(state, throwScope, createNotEnoughArgumentsError(state));
    auto spatialNavigationEnabled = state->uncheckedArgument(0).toBoolean(state);
    RETURN_IF_EXCEPTION(throwScope, encodedJSValue());
    impl.setSpatialNavigationEnabled(WTFMove(spatialNavigationEnabled));
    return JSValue::encode(jsUndefined());
}

EncodedJSValue JSC_HOST_CALL jsInternalSettingsGeneratedPrototypeFunctionSetSpringTimingFunctionEnabled(ExecState* state)
{
    VM& vm = state->vm();
    auto throwScope = DECLARE_THROW_SCOPE(vm);
    UNUSED_PARAM(throwScope);
    JSValue thisValue = state->thisValue();
    auto castedThis = jsDynamicCast<JSInternalSettingsGenerated*>(thisValue);
    if (UNLIKELY(!castedThis))
        return throwThisTypeError(*state, throwScope, "InternalSettingsGenerated", "setSpringTimingFunctionEnabled");
    ASSERT_GC_OBJECT_INHERITS(castedThis, JSInternalSettingsGenerated::info());
    auto& impl = castedThis->wrapped();
    if (UNLIKELY(state->argumentCount() < 1))
        return throwVMError(state, throwScope, createNotEnoughArgumentsError(state));
    auto springTimingFunctionEnabled = state->uncheckedArgument(0).toBoolean(state);
    RETURN_IF_EXCEPTION(throwScope, encodedJSValue());
    impl.setSpringTimingFunctionEnabled(WTFMove(springTimingFunctionEnabled));
    return JSValue::encode(jsUndefined());
}

EncodedJSValue JSC_HOST_CALL jsInternalSettingsGeneratedPrototypeFunctionSetStandalone(ExecState* state)
{
    VM& vm = state->vm();
    auto throwScope = DECLARE_THROW_SCOPE(vm);
    UNUSED_PARAM(throwScope);
    JSValue thisValue = state->thisValue();
    auto castedThis = jsDynamicCast<JSInternalSettingsGenerated*>(thisValue);
    if (UNLIKELY(!castedThis))
        return throwThisTypeError(*state, throwScope, "InternalSettingsGenerated", "setStandalone");
    ASSERT_GC_OBJECT_INHERITS(castedThis, JSInternalSettingsGenerated::info());
    auto& impl = castedThis->wrapped();
    if (UNLIKELY(state->argumentCount() < 1))
        return throwVMError(state, throwScope, createNotEnoughArgumentsError(state));
    auto standalone = state->uncheckedArgument(0).toBoolean(state);
    RETURN_IF_EXCEPTION(throwScope, encodedJSValue());
    impl.setStandalone(WTFMove(standalone));
    return JSValue::encode(jsUndefined());
}

EncodedJSValue JSC_HOST_CALL jsInternalSettingsGeneratedPrototypeFunctionSetSubpixelCSSOMElementMetricsEnabled(ExecState* state)
{
    VM& vm = state->vm();
    auto throwScope = DECLARE_THROW_SCOPE(vm);
    UNUSED_PARAM(throwScope);
    JSValue thisValue = state->thisValue();
    auto castedThis = jsDynamicCast<JSInternalSettingsGenerated*>(thisValue);
    if (UNLIKELY(!castedThis))
        return throwThisTypeError(*state, throwScope, "InternalSettingsGenerated", "setSubpixelCSSOMElementMetricsEnabled");
    ASSERT_GC_OBJECT_INHERITS(castedThis, JSInternalSettingsGenerated::info());
    auto& impl = castedThis->wrapped();
    if (UNLIKELY(state->argumentCount() < 1))
        return throwVMError(state, throwScope, createNotEnoughArgumentsError(state));
    auto subpixelCSSOMElementMetricsEnabled = state->uncheckedArgument(0).toBoolean(state);
    RETURN_IF_EXCEPTION(throwScope, encodedJSValue());
    impl.setSubpixelCSSOMElementMetricsEnabled(WTFMove(subpixelCSSOMElementMetricsEnabled));
    return JSValue::encode(jsUndefined());
}

EncodedJSValue JSC_HOST_CALL jsInternalSettingsGeneratedPrototypeFunctionSetSuppressesIncrementalRendering(ExecState* state)
{
    VM& vm = state->vm();
    auto throwScope = DECLARE_THROW_SCOPE(vm);
    UNUSED_PARAM(throwScope);
    JSValue thisValue = state->thisValue();
    auto castedThis = jsDynamicCast<JSInternalSettingsGenerated*>(thisValue);
    if (UNLIKELY(!castedThis))
        return throwThisTypeError(*state, throwScope, "InternalSettingsGenerated", "setSuppressesIncrementalRendering");
    ASSERT_GC_OBJECT_INHERITS(castedThis, JSInternalSettingsGenerated::info());
    auto& impl = castedThis->wrapped();
    if (UNLIKELY(state->argumentCount() < 1))
        return throwVMError(state, throwScope, createNotEnoughArgumentsError(state));
    auto suppressesIncrementalRendering = state->uncheckedArgument(0).toBoolean(state);
    RETURN_IF_EXCEPTION(throwScope, encodedJSValue());
    impl.setSuppressesIncrementalRendering(WTFMove(suppressesIncrementalRendering));
    return JSValue::encode(jsUndefined());
}

EncodedJSValue JSC_HOST_CALL jsInternalSettingsGeneratedPrototypeFunctionSetSyncXHRInDocumentsEnabled(ExecState* state)
{
    VM& vm = state->vm();
    auto throwScope = DECLARE_THROW_SCOPE(vm);
    UNUSED_PARAM(throwScope);
    JSValue thisValue = state->thisValue();
    auto castedThis = jsDynamicCast<JSInternalSettingsGenerated*>(thisValue);
    if (UNLIKELY(!castedThis))
        return throwThisTypeError(*state, throwScope, "InternalSettingsGenerated", "setSyncXHRInDocumentsEnabled");
    ASSERT_GC_OBJECT_INHERITS(castedThis, JSInternalSettingsGenerated::info());
    auto& impl = castedThis->wrapped();
    if (UNLIKELY(state->argumentCount() < 1))
        return throwVMError(state, throwScope, createNotEnoughArgumentsError(state));
    auto syncXHRInDocumentsEnabled = state->uncheckedArgument(0).toBoolean(state);
    RETURN_IF_EXCEPTION(throwScope, encodedJSValue());
    impl.setSyncXHRInDocumentsEnabled(WTFMove(syncXHRInDocumentsEnabled));
    return JSValue::encode(jsUndefined());
}

EncodedJSValue JSC_HOST_CALL jsInternalSettingsGeneratedPrototypeFunctionSetTelephoneNumberParsingEnabled(ExecState* state)
{
    VM& vm = state->vm();
    auto throwScope = DECLARE_THROW_SCOPE(vm);
    UNUSED_PARAM(throwScope);
    JSValue thisValue = state->thisValue();
    auto castedThis = jsDynamicCast<JSInternalSettingsGenerated*>(thisValue);
    if (UNLIKELY(!castedThis))
        return throwThisTypeError(*state, throwScope, "InternalSettingsGenerated", "setTelephoneNumberParsingEnabled");
    ASSERT_GC_OBJECT_INHERITS(castedThis, JSInternalSettingsGenerated::info());
    auto& impl = castedThis->wrapped();
    if (UNLIKELY(state->argumentCount() < 1))
        return throwVMError(state, throwScope, createNotEnoughArgumentsError(state));
    auto telephoneNumberParsingEnabled = state->uncheckedArgument(0).toBoolean(state);
    RETURN_IF_EXCEPTION(throwScope, encodedJSValue());
    impl.setTelephoneNumberParsingEnabled(WTFMove(telephoneNumberParsingEnabled));
    return JSValue::encode(jsUndefined());
}

EncodedJSValue JSC_HOST_CALL jsInternalSettingsGeneratedPrototypeFunctionSetTemporaryTileCohortRetentionEnabled(ExecState* state)
{
    VM& vm = state->vm();
    auto throwScope = DECLARE_THROW_SCOPE(vm);
    UNUSED_PARAM(throwScope);
    JSValue thisValue = state->thisValue();
    auto castedThis = jsDynamicCast<JSInternalSettingsGenerated*>(thisValue);
    if (UNLIKELY(!castedThis))
        return throwThisTypeError(*state, throwScope, "InternalSettingsGenerated", "setTemporaryTileCohortRetentionEnabled");
    ASSERT_GC_OBJECT_INHERITS(castedThis, JSInternalSettingsGenerated::info());
    auto& impl = castedThis->wrapped();
    if (UNLIKELY(state->argumentCount() < 1))
        return throwVMError(state, throwScope, createNotEnoughArgumentsError(state));
    auto temporaryTileCohortRetentionEnabled = state->uncheckedArgument(0).toBoolean(state);
    RETURN_IF_EXCEPTION(throwScope, encodedJSValue());
    impl.setTemporaryTileCohortRetentionEnabled(WTFMove(temporaryTileCohortRetentionEnabled));
    return JSValue::encode(jsUndefined());
}

EncodedJSValue JSC_HOST_CALL jsInternalSettingsGeneratedPrototypeFunctionSetTextAreasAreResizable(ExecState* state)
{
    VM& vm = state->vm();
    auto throwScope = DECLARE_THROW_SCOPE(vm);
    UNUSED_PARAM(throwScope);
    JSValue thisValue = state->thisValue();
    auto castedThis = jsDynamicCast<JSInternalSettingsGenerated*>(thisValue);
    if (UNLIKELY(!castedThis))
        return throwThisTypeError(*state, throwScope, "InternalSettingsGenerated", "setTextAreasAreResizable");
    ASSERT_GC_OBJECT_INHERITS(castedThis, JSInternalSettingsGenerated::info());
    auto& impl = castedThis->wrapped();
    if (UNLIKELY(state->argumentCount() < 1))
        return throwVMError(state, throwScope, createNotEnoughArgumentsError(state));
    auto textAreasAreResizable = state->uncheckedArgument(0).toBoolean(state);
    RETURN_IF_EXCEPTION(throwScope, encodedJSValue());
    impl.setTextAreasAreResizable(WTFMove(textAreasAreResizable));
    return JSValue::encode(jsUndefined());
}

EncodedJSValue JSC_HOST_CALL jsInternalSettingsGeneratedPrototypeFunctionSetTextAutosizingEnabled(ExecState* state)
{
    VM& vm = state->vm();
    auto throwScope = DECLARE_THROW_SCOPE(vm);
    UNUSED_PARAM(throwScope);
    JSValue thisValue = state->thisValue();
    auto castedThis = jsDynamicCast<JSInternalSettingsGenerated*>(thisValue);
    if (UNLIKELY(!castedThis))
        return throwThisTypeError(*state, throwScope, "InternalSettingsGenerated", "setTextAutosizingEnabled");
    ASSERT_GC_OBJECT_INHERITS(castedThis, JSInternalSettingsGenerated::info());
    auto& impl = castedThis->wrapped();
    if (UNLIKELY(state->argumentCount() < 1))
        return throwVMError(state, throwScope, createNotEnoughArgumentsError(state));
    auto textAutosizingEnabled = state->uncheckedArgument(0).toBoolean(state);
    RETURN_IF_EXCEPTION(throwScope, encodedJSValue());
    impl.setTextAutosizingEnabled(WTFMove(textAutosizingEnabled));
    return JSValue::encode(jsUndefined());
}

EncodedJSValue JSC_HOST_CALL jsInternalSettingsGeneratedPrototypeFunctionSetTreatIPAddressAsDomain(ExecState* state)
{
    VM& vm = state->vm();
    auto throwScope = DECLARE_THROW_SCOPE(vm);
    UNUSED_PARAM(throwScope);
    JSValue thisValue = state->thisValue();
    auto castedThis = jsDynamicCast<JSInternalSettingsGenerated*>(thisValue);
    if (UNLIKELY(!castedThis))
        return throwThisTypeError(*state, throwScope, "InternalSettingsGenerated", "setTreatIPAddressAsDomain");
    ASSERT_GC_OBJECT_INHERITS(castedThis, JSInternalSettingsGenerated::info());
    auto& impl = castedThis->wrapped();
    if (UNLIKELY(state->argumentCount() < 1))
        return throwVMError(state, throwScope, createNotEnoughArgumentsError(state));
    auto treatIPAddressAsDomain = state->uncheckedArgument(0).toBoolean(state);
    RETURN_IF_EXCEPTION(throwScope, encodedJSValue());
    impl.setTreatIPAddressAsDomain(WTFMove(treatIPAddressAsDomain));
    return JSValue::encode(jsUndefined());
}

EncodedJSValue JSC_HOST_CALL jsInternalSettingsGeneratedPrototypeFunctionSetTreatsAnyTextCSSLinkAsStylesheet(ExecState* state)
{
    VM& vm = state->vm();
    auto throwScope = DECLARE_THROW_SCOPE(vm);
    UNUSED_PARAM(throwScope);
    JSValue thisValue = state->thisValue();
    auto castedThis = jsDynamicCast<JSInternalSettingsGenerated*>(thisValue);
    if (UNLIKELY(!castedThis))
        return throwThisTypeError(*state, throwScope, "InternalSettingsGenerated", "setTreatsAnyTextCSSLinkAsStylesheet");
    ASSERT_GC_OBJECT_INHERITS(castedThis, JSInternalSettingsGenerated::info());
    auto& impl = castedThis->wrapped();
    if (UNLIKELY(state->argumentCount() < 1))
        return throwVMError(state, throwScope, createNotEnoughArgumentsError(state));
    auto treatsAnyTextCSSLinkAsStylesheet = state->uncheckedArgument(0).toBoolean(state);
    RETURN_IF_EXCEPTION(throwScope, encodedJSValue());
    impl.setTreatsAnyTextCSSLinkAsStylesheet(WTFMove(treatsAnyTextCSSLinkAsStylesheet));
    return JSValue::encode(jsUndefined());
}

EncodedJSValue JSC_HOST_CALL jsInternalSettingsGeneratedPrototypeFunctionSetUnifiedTextCheckerEnabled(ExecState* state)
{
    VM& vm = state->vm();
    auto throwScope = DECLARE_THROW_SCOPE(vm);
    UNUSED_PARAM(throwScope);
    JSValue thisValue = state->thisValue();
    auto castedThis = jsDynamicCast<JSInternalSettingsGenerated*>(thisValue);
    if (UNLIKELY(!castedThis))
        return throwThisTypeError(*state, throwScope, "InternalSettingsGenerated", "setUnifiedTextCheckerEnabled");
    ASSERT_GC_OBJECT_INHERITS(castedThis, JSInternalSettingsGenerated::info());
    auto& impl = castedThis->wrapped();
    if (UNLIKELY(state->argumentCount() < 1))
        return throwVMError(state, throwScope, createNotEnoughArgumentsError(state));
    auto unifiedTextCheckerEnabled = state->uncheckedArgument(0).toBoolean(state);
    RETURN_IF_EXCEPTION(throwScope, encodedJSValue());
    impl.setUnifiedTextCheckerEnabled(WTFMove(unifiedTextCheckerEnabled));
    return JSValue::encode(jsUndefined());
}

EncodedJSValue JSC_HOST_CALL jsInternalSettingsGeneratedPrototypeFunctionSetUnsafePluginPastingEnabled(ExecState* state)
{
    VM& vm = state->vm();
    auto throwScope = DECLARE_THROW_SCOPE(vm);
    UNUSED_PARAM(throwScope);
    JSValue thisValue = state->thisValue();
    auto castedThis = jsDynamicCast<JSInternalSettingsGenerated*>(thisValue);
    if (UNLIKELY(!castedThis))
        return throwThisTypeError(*state, throwScope, "InternalSettingsGenerated", "setUnsafePluginPastingEnabled");
    ASSERT_GC_OBJECT_INHERITS(castedThis, JSInternalSettingsGenerated::info());
    auto& impl = castedThis->wrapped();
    if (UNLIKELY(state->argumentCount() < 1))
        return throwVMError(state, throwScope, createNotEnoughArgumentsError(state));
    auto unsafePluginPastingEnabled = state->uncheckedArgument(0).toBoolean(state);
    RETURN_IF_EXCEPTION(throwScope, encodedJSValue());
    impl.setUnsafePluginPastingEnabled(WTFMove(unsafePluginPastingEnabled));
    return JSValue::encode(jsUndefined());
}

EncodedJSValue JSC_HOST_CALL jsInternalSettingsGeneratedPrototypeFunctionSetUseGiantTiles(ExecState* state)
{
    VM& vm = state->vm();
    auto throwScope = DECLARE_THROW_SCOPE(vm);
    UNUSED_PARAM(throwScope);
    JSValue thisValue = state->thisValue();
    auto castedThis = jsDynamicCast<JSInternalSettingsGenerated*>(thisValue);
    if (UNLIKELY(!castedThis))
        return throwThisTypeError(*state, throwScope, "InternalSettingsGenerated", "setUseGiantTiles");
    ASSERT_GC_OBJECT_INHERITS(castedThis, JSInternalSettingsGenerated::info());
    auto& impl = castedThis->wrapped();
    if (UNLIKELY(state->argumentCount() < 1))
        return throwVMError(state, throwScope, createNotEnoughArgumentsError(state));
    auto useGiantTiles = state->uncheckedArgument(0).toBoolean(state);
    RETURN_IF_EXCEPTION(throwScope, encodedJSValue());
    impl.setUseGiantTiles(WTFMove(useGiantTiles));
    return JSValue::encode(jsUndefined());
}

EncodedJSValue JSC_HOST_CALL jsInternalSettingsGeneratedPrototypeFunctionSetUseImageDocumentForSubframePDF(ExecState* state)
{
    VM& vm = state->vm();
    auto throwScope = DECLARE_THROW_SCOPE(vm);
    UNUSED_PARAM(throwScope);
    JSValue thisValue = state->thisValue();
    auto castedThis = jsDynamicCast<JSInternalSettingsGenerated*>(thisValue);
    if (UNLIKELY(!castedThis))
        return throwThisTypeError(*state, throwScope, "InternalSettingsGenerated", "setUseImageDocumentForSubframePDF");
    ASSERT_GC_OBJECT_INHERITS(castedThis, JSInternalSettingsGenerated::info());
    auto& impl = castedThis->wrapped();
    if (UNLIKELY(state->argumentCount() < 1))
        return throwVMError(state, throwScope, createNotEnoughArgumentsError(state));
    auto useImageDocumentForSubframePDF = state->uncheckedArgument(0).toBoolean(state);
    RETURN_IF_EXCEPTION(throwScope, encodedJSValue());
    impl.setUseImageDocumentForSubframePDF(WTFMove(useImageDocumentForSubframePDF));
    return JSValue::encode(jsUndefined());
}

EncodedJSValue JSC_HOST_CALL jsInternalSettingsGeneratedPrototypeFunctionSetUseLegacyBackgroundSizeShorthandBehavior(ExecState* state)
{
    VM& vm = state->vm();
    auto throwScope = DECLARE_THROW_SCOPE(vm);
    UNUSED_PARAM(throwScope);
    JSValue thisValue = state->thisValue();
    auto castedThis = jsDynamicCast<JSInternalSettingsGenerated*>(thisValue);
    if (UNLIKELY(!castedThis))
        return throwThisTypeError(*state, throwScope, "InternalSettingsGenerated", "setUseLegacyBackgroundSizeShorthandBehavior");
    ASSERT_GC_OBJECT_INHERITS(castedThis, JSInternalSettingsGenerated::info());
    auto& impl = castedThis->wrapped();
    if (UNLIKELY(state->argumentCount() < 1))
        return throwVMError(state, throwScope, createNotEnoughArgumentsError(state));
    auto useLegacyBackgroundSizeShorthandBehavior = state->uncheckedArgument(0).toBoolean(state);
    RETURN_IF_EXCEPTION(throwScope, encodedJSValue());
    impl.setUseLegacyBackgroundSizeShorthandBehavior(WTFMove(useLegacyBackgroundSizeShorthandBehavior));
    return JSValue::encode(jsUndefined());
}

EncodedJSValue JSC_HOST_CALL jsInternalSettingsGeneratedPrototypeFunctionSetUseLegacyTextAlignPositionedElementBehavior(ExecState* state)
{
    VM& vm = state->vm();
    auto throwScope = DECLARE_THROW_SCOPE(vm);
    UNUSED_PARAM(throwScope);
    JSValue thisValue = state->thisValue();
    auto castedThis = jsDynamicCast<JSInternalSettingsGenerated*>(thisValue);
    if (UNLIKELY(!castedThis))
        return throwThisTypeError(*state, throwScope, "InternalSettingsGenerated", "setUseLegacyTextAlignPositionedElementBehavior");
    ASSERT_GC_OBJECT_INHERITS(castedThis, JSInternalSettingsGenerated::info());
    auto& impl = castedThis->wrapped();
    if (UNLIKELY(state->argumentCount() < 1))
        return throwVMError(state, throwScope, createNotEnoughArgumentsError(state));
    auto useLegacyTextAlignPositionedElementBehavior = state->uncheckedArgument(0).toBoolean(state);
    RETURN_IF_EXCEPTION(throwScope, encodedJSValue());
    impl.setUseLegacyTextAlignPositionedElementBehavior(WTFMove(useLegacyTextAlignPositionedElementBehavior));
    return JSValue::encode(jsUndefined());
}

EncodedJSValue JSC_HOST_CALL jsInternalSettingsGeneratedPrototypeFunctionSetUsePreHTML5ParserQuirks(ExecState* state)
{
    VM& vm = state->vm();
    auto throwScope = DECLARE_THROW_SCOPE(vm);
    UNUSED_PARAM(throwScope);
    JSValue thisValue = state->thisValue();
    auto castedThis = jsDynamicCast<JSInternalSettingsGenerated*>(thisValue);
    if (UNLIKELY(!castedThis))
        return throwThisTypeError(*state, throwScope, "InternalSettingsGenerated", "setUsePreHTML5ParserQuirks");
    ASSERT_GC_OBJECT_INHERITS(castedThis, JSInternalSettingsGenerated::info());
    auto& impl = castedThis->wrapped();
    if (UNLIKELY(state->argumentCount() < 1))
        return throwVMError(state, throwScope, createNotEnoughArgumentsError(state));
    auto usePreHTML5ParserQuirks = state->uncheckedArgument(0).toBoolean(state);
    RETURN_IF_EXCEPTION(throwScope, encodedJSValue());
    impl.setUsePreHTML5ParserQuirks(WTFMove(usePreHTML5ParserQuirks));
    return JSValue::encode(jsUndefined());
}

EncodedJSValue JSC_HOST_CALL jsInternalSettingsGeneratedPrototypeFunctionSetUsesDashboardBackwardCompatibilityMode(ExecState* state)
{
    VM& vm = state->vm();
    auto throwScope = DECLARE_THROW_SCOPE(vm);
    UNUSED_PARAM(throwScope);
    JSValue thisValue = state->thisValue();
    auto castedThis = jsDynamicCast<JSInternalSettingsGenerated*>(thisValue);
    if (UNLIKELY(!castedThis))
        return throwThisTypeError(*state, throwScope, "InternalSettingsGenerated", "setUsesDashboardBackwardCompatibilityMode");
    ASSERT_GC_OBJECT_INHERITS(castedThis, JSInternalSettingsGenerated::info());
    auto& impl = castedThis->wrapped();
    if (UNLIKELY(state->argumentCount() < 1))
        return throwVMError(state, throwScope, createNotEnoughArgumentsError(state));
    auto usesDashboardBackwardCompatibilityMode = state->uncheckedArgument(0).toBoolean(state);
    RETURN_IF_EXCEPTION(throwScope, encodedJSValue());
    impl.setUsesDashboardBackwardCompatibilityMode(WTFMove(usesDashboardBackwardCompatibilityMode));
    return JSValue::encode(jsUndefined());
}

EncodedJSValue JSC_HOST_CALL jsInternalSettingsGeneratedPrototypeFunctionSetUsesEncodingDetector(ExecState* state)
{
    VM& vm = state->vm();
    auto throwScope = DECLARE_THROW_SCOPE(vm);
    UNUSED_PARAM(throwScope);
    JSValue thisValue = state->thisValue();
    auto castedThis = jsDynamicCast<JSInternalSettingsGenerated*>(thisValue);
    if (UNLIKELY(!castedThis))
        return throwThisTypeError(*state, throwScope, "InternalSettingsGenerated", "setUsesEncodingDetector");
    ASSERT_GC_OBJECT_INHERITS(castedThis, JSInternalSettingsGenerated::info());
    auto& impl = castedThis->wrapped();
    if (UNLIKELY(state->argumentCount() < 1))
        return throwVMError(state, throwScope, createNotEnoughArgumentsError(state));
    auto usesEncodingDetector = state->uncheckedArgument(0).toBoolean(state);
    RETURN_IF_EXCEPTION(throwScope, encodedJSValue());
    impl.setUsesEncodingDetector(WTFMove(usesEncodingDetector));
    return JSValue::encode(jsUndefined());
}

EncodedJSValue JSC_HOST_CALL jsInternalSettingsGeneratedPrototypeFunctionSetValidationMessageTimerMagnification(ExecState* state)
{
    VM& vm = state->vm();
    auto throwScope = DECLARE_THROW_SCOPE(vm);
    UNUSED_PARAM(throwScope);
    JSValue thisValue = state->thisValue();
    auto castedThis = jsDynamicCast<JSInternalSettingsGenerated*>(thisValue);
    if (UNLIKELY(!castedThis))
        return throwThisTypeError(*state, throwScope, "InternalSettingsGenerated", "setValidationMessageTimerMagnification");
    ASSERT_GC_OBJECT_INHERITS(castedThis, JSInternalSettingsGenerated::info());
    auto& impl = castedThis->wrapped();
    if (UNLIKELY(state->argumentCount() < 1))
        return throwVMError(state, throwScope, createNotEnoughArgumentsError(state));
    auto validationMessageTimerMagnification = convert<int32_t>(*state, state->uncheckedArgument(0), NormalConversion);
    RETURN_IF_EXCEPTION(throwScope, encodedJSValue());
    impl.setValidationMessageTimerMagnification(WTFMove(validationMessageTimerMagnification));
    return JSValue::encode(jsUndefined());
}

EncodedJSValue JSC_HOST_CALL jsInternalSettingsGeneratedPrototypeFunctionSetVideoPlaybackRequiresUserGesture(ExecState* state)
{
    VM& vm = state->vm();
    auto throwScope = DECLARE_THROW_SCOPE(vm);
    UNUSED_PARAM(throwScope);
    JSValue thisValue = state->thisValue();
    auto castedThis = jsDynamicCast<JSInternalSettingsGenerated*>(thisValue);
    if (UNLIKELY(!castedThis))
        return throwThisTypeError(*state, throwScope, "InternalSettingsGenerated", "setVideoPlaybackRequiresUserGesture");
    ASSERT_GC_OBJECT_INHERITS(castedThis, JSInternalSettingsGenerated::info());
    auto& impl = castedThis->wrapped();
    if (UNLIKELY(state->argumentCount() < 1))
        return throwVMError(state, throwScope, createNotEnoughArgumentsError(state));
    auto videoPlaybackRequiresUserGesture = state->uncheckedArgument(0).toBoolean(state);
    RETURN_IF_EXCEPTION(throwScope, encodedJSValue());
    impl.setVideoPlaybackRequiresUserGesture(WTFMove(videoPlaybackRequiresUserGesture));
    return JSValue::encode(jsUndefined());
}

EncodedJSValue JSC_HOST_CALL jsInternalSettingsGeneratedPrototypeFunctionSetVisualViewportEnabled(ExecState* state)
{
    VM& vm = state->vm();
    auto throwScope = DECLARE_THROW_SCOPE(vm);
    UNUSED_PARAM(throwScope);
    JSValue thisValue = state->thisValue();
    auto castedThis = jsDynamicCast<JSInternalSettingsGenerated*>(thisValue);
    if (UNLIKELY(!castedThis))
        return throwThisTypeError(*state, throwScope, "InternalSettingsGenerated", "setVisualViewportEnabled");
    ASSERT_GC_OBJECT_INHERITS(castedThis, JSInternalSettingsGenerated::info());
    auto& impl = castedThis->wrapped();
    if (UNLIKELY(state->argumentCount() < 1))
        return throwVMError(state, throwScope, createNotEnoughArgumentsError(state));
    auto visualViewportEnabled = state->uncheckedArgument(0).toBoolean(state);
    RETURN_IF_EXCEPTION(throwScope, encodedJSValue());
    impl.setVisualViewportEnabled(WTFMove(visualViewportEnabled));
    return JSValue::encode(jsUndefined());
}

EncodedJSValue JSC_HOST_CALL jsInternalSettingsGeneratedPrototypeFunctionSetWantsBalancedSetDefersLoadingBehavior(ExecState* state)
{
    VM& vm = state->vm();
    auto throwScope = DECLARE_THROW_SCOPE(vm);
    UNUSED_PARAM(throwScope);
    JSValue thisValue = state->thisValue();
    auto castedThis = jsDynamicCast<JSInternalSettingsGenerated*>(thisValue);
    if (UNLIKELY(!castedThis))
        return throwThisTypeError(*state, throwScope, "InternalSettingsGenerated", "setWantsBalancedSetDefersLoadingBehavior");
    ASSERT_GC_OBJECT_INHERITS(castedThis, JSInternalSettingsGenerated::info());
    auto& impl = castedThis->wrapped();
    if (UNLIKELY(state->argumentCount() < 1))
        return throwVMError(state, throwScope, createNotEnoughArgumentsError(state));
    auto wantsBalancedSetDefersLoadingBehavior = state->uncheckedArgument(0).toBoolean(state);
    RETURN_IF_EXCEPTION(throwScope, encodedJSValue());
    impl.setWantsBalancedSetDefersLoadingBehavior(WTFMove(wantsBalancedSetDefersLoadingBehavior));
    return JSValue::encode(jsUndefined());
}

EncodedJSValue JSC_HOST_CALL jsInternalSettingsGeneratedPrototypeFunctionSetWebArchiveDebugModeEnabled(ExecState* state)
{
    VM& vm = state->vm();
    auto throwScope = DECLARE_THROW_SCOPE(vm);
    UNUSED_PARAM(throwScope);
    JSValue thisValue = state->thisValue();
    auto castedThis = jsDynamicCast<JSInternalSettingsGenerated*>(thisValue);
    if (UNLIKELY(!castedThis))
        return throwThisTypeError(*state, throwScope, "InternalSettingsGenerated", "setWebArchiveDebugModeEnabled");
    ASSERT_GC_OBJECT_INHERITS(castedThis, JSInternalSettingsGenerated::info());
    auto& impl = castedThis->wrapped();
    if (UNLIKELY(state->argumentCount() < 1))
        return throwVMError(state, throwScope, createNotEnoughArgumentsError(state));
    auto webArchiveDebugModeEnabled = state->uncheckedArgument(0).toBoolean(state);
    RETURN_IF_EXCEPTION(throwScope, encodedJSValue());
    impl.setWebArchiveDebugModeEnabled(WTFMove(webArchiveDebugModeEnabled));
    return JSValue::encode(jsUndefined());
}

EncodedJSValue JSC_HOST_CALL jsInternalSettingsGeneratedPrototypeFunctionSetWebAudioEnabled(ExecState* state)
{
    VM& vm = state->vm();
    auto throwScope = DECLARE_THROW_SCOPE(vm);
    UNUSED_PARAM(throwScope);
    JSValue thisValue = state->thisValue();
    auto castedThis = jsDynamicCast<JSInternalSettingsGenerated*>(thisValue);
    if (UNLIKELY(!castedThis))
        return throwThisTypeError(*state, throwScope, "InternalSettingsGenerated", "setWebAudioEnabled");
    ASSERT_GC_OBJECT_INHERITS(castedThis, JSInternalSettingsGenerated::info());
    auto& impl = castedThis->wrapped();
    if (UNLIKELY(state->argumentCount() < 1))
        return throwVMError(state, throwScope, createNotEnoughArgumentsError(state));
    auto webAudioEnabled = state->uncheckedArgument(0).toBoolean(state);
    RETURN_IF_EXCEPTION(throwScope, encodedJSValue());
    impl.setWebAudioEnabled(WTFMove(webAudioEnabled));
    return JSValue::encode(jsUndefined());
}

EncodedJSValue JSC_HOST_CALL jsInternalSettingsGeneratedPrototypeFunctionSetWebGLEnabled(ExecState* state)
{
    VM& vm = state->vm();
    auto throwScope = DECLARE_THROW_SCOPE(vm);
    UNUSED_PARAM(throwScope);
    JSValue thisValue = state->thisValue();
    auto castedThis = jsDynamicCast<JSInternalSettingsGenerated*>(thisValue);
    if (UNLIKELY(!castedThis))
        return throwThisTypeError(*state, throwScope, "InternalSettingsGenerated", "setWebGLEnabled");
    ASSERT_GC_OBJECT_INHERITS(castedThis, JSInternalSettingsGenerated::info());
    auto& impl = castedThis->wrapped();
    if (UNLIKELY(state->argumentCount() < 1))
        return throwVMError(state, throwScope, createNotEnoughArgumentsError(state));
    auto webGLEnabled = state->uncheckedArgument(0).toBoolean(state);
    RETURN_IF_EXCEPTION(throwScope, encodedJSValue());
    impl.setWebGLEnabled(WTFMove(webGLEnabled));
    return JSValue::encode(jsUndefined());
}

EncodedJSValue JSC_HOST_CALL jsInternalSettingsGeneratedPrototypeFunctionSetWebGLErrorsToConsoleEnabled(ExecState* state)
{
    VM& vm = state->vm();
    auto throwScope = DECLARE_THROW_SCOPE(vm);
    UNUSED_PARAM(throwScope);
    JSValue thisValue = state->thisValue();
    auto castedThis = jsDynamicCast<JSInternalSettingsGenerated*>(thisValue);
    if (UNLIKELY(!castedThis))
        return throwThisTypeError(*state, throwScope, "InternalSettingsGenerated", "setWebGLErrorsToConsoleEnabled");
    ASSERT_GC_OBJECT_INHERITS(castedThis, JSInternalSettingsGenerated::info());
    auto& impl = castedThis->wrapped();
    if (UNLIKELY(state->argumentCount() < 1))
        return throwVMError(state, throwScope, createNotEnoughArgumentsError(state));
    auto webGLErrorsToConsoleEnabled = state->uncheckedArgument(0).toBoolean(state);
    RETURN_IF_EXCEPTION(throwScope, encodedJSValue());
    impl.setWebGLErrorsToConsoleEnabled(WTFMove(webGLErrorsToConsoleEnabled));
    return JSValue::encode(jsUndefined());
}

EncodedJSValue JSC_HOST_CALL jsInternalSettingsGeneratedPrototypeFunctionSetWebSecurityEnabled(ExecState* state)
{
    VM& vm = state->vm();
    auto throwScope = DECLARE_THROW_SCOPE(vm);
    UNUSED_PARAM(throwScope);
    JSValue thisValue = state->thisValue();
    auto castedThis = jsDynamicCast<JSInternalSettingsGenerated*>(thisValue);
    if (UNLIKELY(!castedThis))
        return throwThisTypeError(*state, throwScope, "InternalSettingsGenerated", "setWebSecurityEnabled");
    ASSERT_GC_OBJECT_INHERITS(castedThis, JSInternalSettingsGenerated::info());
    auto& impl = castedThis->wrapped();
    if (UNLIKELY(state->argumentCount() < 1))
        return throwVMError(state, throwScope, createNotEnoughArgumentsError(state));
    auto webSecurityEnabled = state->uncheckedArgument(0).toBoolean(state);
    RETURN_IF_EXCEPTION(throwScope, encodedJSValue());
    impl.setWebSecurityEnabled(WTFMove(webSecurityEnabled));
    return JSValue::encode(jsUndefined());
}

EncodedJSValue JSC_HOST_CALL jsInternalSettingsGeneratedPrototypeFunctionSetWindowFocusRestricted(ExecState* state)
{
    VM& vm = state->vm();
    auto throwScope = DECLARE_THROW_SCOPE(vm);
    UNUSED_PARAM(throwScope);
    JSValue thisValue = state->thisValue();
    auto castedThis = jsDynamicCast<JSInternalSettingsGenerated*>(thisValue);
    if (UNLIKELY(!castedThis))
        return throwThisTypeError(*state, throwScope, "InternalSettingsGenerated", "setWindowFocusRestricted");
    ASSERT_GC_OBJECT_INHERITS(castedThis, JSInternalSettingsGenerated::info());
    auto& impl = castedThis->wrapped();
    if (UNLIKELY(state->argumentCount() < 1))
        return throwVMError(state, throwScope, createNotEnoughArgumentsError(state));
    auto windowFocusRestricted = state->uncheckedArgument(0).toBoolean(state);
    RETURN_IF_EXCEPTION(throwScope, encodedJSValue());
    impl.setWindowFocusRestricted(WTFMove(windowFocusRestricted));
    return JSValue::encode(jsUndefined());
}

EncodedJSValue JSC_HOST_CALL jsInternalSettingsGeneratedPrototypeFunctionSetXSSAuditorEnabled(ExecState* state)
{
    VM& vm = state->vm();
    auto throwScope = DECLARE_THROW_SCOPE(vm);
    UNUSED_PARAM(throwScope);
    JSValue thisValue = state->thisValue();
    auto castedThis = jsDynamicCast<JSInternalSettingsGenerated*>(thisValue);
    if (UNLIKELY(!castedThis))
        return throwThisTypeError(*state, throwScope, "InternalSettingsGenerated", "setXSSAuditorEnabled");
    ASSERT_GC_OBJECT_INHERITS(castedThis, JSInternalSettingsGenerated::info());
    auto& impl = castedThis->wrapped();
    if (UNLIKELY(state->argumentCount() < 1))
        return throwVMError(state, throwScope, createNotEnoughArgumentsError(state));
    auto xssAuditorEnabled = state->uncheckedArgument(0).toBoolean(state);
    RETURN_IF_EXCEPTION(throwScope, encodedJSValue());
    impl.setXSSAuditorEnabled(WTFMove(xssAuditorEnabled));
    return JSValue::encode(jsUndefined());
}

EncodedJSValue JSC_HOST_CALL jsInternalSettingsGeneratedPrototypeFunctionSetYouTubeFlashPluginReplacementEnabled(ExecState* state)
{
    VM& vm = state->vm();
    auto throwScope = DECLARE_THROW_SCOPE(vm);
    UNUSED_PARAM(throwScope);
    JSValue thisValue = state->thisValue();
    auto castedThis = jsDynamicCast<JSInternalSettingsGenerated*>(thisValue);
    if (UNLIKELY(!castedThis))
        return throwThisTypeError(*state, throwScope, "InternalSettingsGenerated", "setYouTubeFlashPluginReplacementEnabled");
    ASSERT_GC_OBJECT_INHERITS(castedThis, JSInternalSettingsGenerated::info());
    auto& impl = castedThis->wrapped();
    if (UNLIKELY(state->argumentCount() < 1))
        return throwVMError(state, throwScope, createNotEnoughArgumentsError(state));
    auto youTubeFlashPluginReplacementEnabled = state->uncheckedArgument(0).toBoolean(state);
    RETURN_IF_EXCEPTION(throwScope, encodedJSValue());
    impl.setYouTubeFlashPluginReplacementEnabled(WTFMove(youTubeFlashPluginReplacementEnabled));
    return JSValue::encode(jsUndefined());
}

bool JSInternalSettingsGeneratedOwner::isReachableFromOpaqueRoots(JSC::Handle<JSC::Unknown> handle, void*, SlotVisitor& visitor)
{
    UNUSED_PARAM(handle);
    UNUSED_PARAM(visitor);
    return false;
}

void JSInternalSettingsGeneratedOwner::finalize(JSC::Handle<JSC::Unknown> handle, void* context)
{
    auto* jsInternalSettingsGenerated = jsCast<JSInternalSettingsGenerated*>(handle.slot()->asCell());
    auto& world = *static_cast<DOMWrapperWorld*>(context);
    uncacheWrapper(world, &jsInternalSettingsGenerated->wrapped(), jsInternalSettingsGenerated);
}

#if ENABLE(BINDING_INTEGRITY)
#if PLATFORM(WIN)
#pragma warning(disable: 4483)
extern "C" { extern void (*const __identifier("??_7InternalSettingsGenerated@WebCore@@6B@")[])(); }
#else
extern "C" { extern void* _ZTVN7WebCore25InternalSettingsGeneratedE[]; }
#endif
#endif

JSC::JSValue toJSNewlyCreated(JSC::ExecState*, JSDOMGlobalObject* globalObject, Ref<InternalSettingsGenerated>&& impl)
{

#if ENABLE(BINDING_INTEGRITY)
    void* actualVTablePointer = *(reinterpret_cast<void**>(impl.ptr()));
#if PLATFORM(WIN)
    void* expectedVTablePointer = reinterpret_cast<void*>(__identifier("??_7InternalSettingsGenerated@WebCore@@6B@"));
#else
    void* expectedVTablePointer = &_ZTVN7WebCore25InternalSettingsGeneratedE[2];
#if COMPILER(CLANG)
    // If this fails InternalSettingsGenerated does not have a vtable, so you need to add the
    // ImplementationLacksVTable attribute to the interface definition
    static_assert(__is_polymorphic(InternalSettingsGenerated), "InternalSettingsGenerated is not polymorphic");
#endif
#endif
    // If you hit this assertion you either have a use after free bug, or
    // InternalSettingsGenerated has subclasses. If InternalSettingsGenerated has subclasses that get passed
    // to toJS() we currently require InternalSettingsGenerated you to opt out of binding hardening
    // by adding the SkipVTableValidation attribute to the interface IDL definition
    RELEASE_ASSERT(actualVTablePointer == expectedVTablePointer);
#endif
    return createWrapper<InternalSettingsGenerated>(globalObject, WTFMove(impl));
}

JSC::JSValue toJS(JSC::ExecState* state, JSDOMGlobalObject* globalObject, InternalSettingsGenerated& impl)
{
    return wrap(state, globalObject, impl);
}

InternalSettingsGenerated* JSInternalSettingsGenerated::toWrapped(JSC::JSValue value)
{
    if (auto* wrapper = jsDynamicCast<JSInternalSettingsGenerated*>(value))
        return &wrapper->wrapped();
    return nullptr;
}

}
