/*
 * Copyright (C) 2010-2018 Apple Inc. All rights reserved.
 *
 * Redistribution and use in source and binary forms, with or without
 * modification, are permitted provided that the following conditions
 * are met:
 * 1. Redistributions of source code must retain the above copyright
 *    notice, this list of conditions and the following disclaimer.
 * 2. Redistributions in binary form must reproduce the above copyright
 *    notice, this list of conditions and the following disclaimer in the
 *    documentation and/or other materials provided with the distribution.
 *
 * THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS''
 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
 * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
 * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS
 * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
 * THE POSSIBILITY OF SUCH DAMAGE.
 */

#include "config.h"
#include "WebPageCreationParameters.h"

#include "WebCoreArgumentCoders.h"

namespace WebKit {

void WebPageCreationParameters::encode(IPC::Encoder& encoder) const
{
    encoder << viewSize;
    encoder << activityState;

    encoder << store;
    encoder << drawingAreaType;
    encoder << drawingAreaIdentifier;
    encoder << webPageProxyIdentifier;
    encoder << pageGroupData;
    encoder << isEditable;
    encoder << underlayColor;
    encoder << useFixedLayout;
    encoder << fixedLayoutSize;
    encoder << viewExposedRect;
    encoder << alwaysShowsHorizontalScroller;
    encoder << alwaysShowsVerticalScroller;
    encoder << paginationMode;
    encoder << paginationBehavesLikeColumns;
    encoder << pageLength;
    encoder << gapBetweenPages;
    encoder << paginationLineGridEnabled;
    encoder << userAgent;
    encoder << itemStatesWereRestoredByAPIRequest;
    encoder << itemStates;
    encoder << visitedLinkTableID;
    encoder << canRunBeforeUnloadConfirmPanel;
    encoder << canRunModal;
    encoder << deviceScaleFactor;
    encoder << viewScaleFactor;
    encoder << textZoomFactor;
    encoder << pageZoomFactor;
    encoder << topContentInset;
    encoder << mediaVolume;
    encoder << muted;
    encoder << mayStartMediaWhenInWindow;
    encoder << mediaPlaybackIsSuspended;
    encoder << minimumSizeForAutoLayout;
    encoder << sizeToContentAutoSizeMaximumSize;
    encoder << autoSizingShouldExpandToViewHeight;
    encoder << viewportSizeForCSSViewportUnits;
    encoder << scrollPinningBehavior;
    encoder << scrollbarOverlayStyle;
    encoder << backgroundExtendsBeyondPage;
    encoder << layerHostingMode;
    encoder << mimeTypesWithCustomContentProviders;
    encoder << controlledByAutomation;
    encoder << isProcessSwap;
    encoder << useDarkAppearance;
    encoder << useElevatedUserInterfaceLevel;
    encoder << hasResourceLoadClient;

#if PLATFORM(MAC)
    encoder << colorSpace;
    encoder << useSystemAppearance;
#endif

#if ENABLE(META_VIEWPORT)
    encoder << ignoresViewportScaleLimits;
    encoder << viewportConfigurationViewLayoutSize;
    encoder << viewportConfigurationLayoutSizeScaleFactor;
    encoder << viewportConfigurationMinimumEffectiveDeviceWidth;
    encoder << viewportConfigurationViewSize;
    encoder << overrideViewportArguments;
#endif

#if ENABLE(ATTACHMENT_ELEMENT)
    encoder << attachmentElementExtensionHandles;
#endif

#if PLATFORM(IOS_FAMILY)
    encoder << screenSize;
    encoder << availableScreenSize;
    encoder << overrideScreenSize;
    encoder << textAutosizingWidth;
    encoder << maximumUnobscuredSize;
    encoder << deviceOrientation;
    encoder << keyboardIsAttached;
    encoder << canShowWhileLocked;
    encoder << isCapturingScreen;
#endif
#if PLATFORM(COCOA)
    encoder << smartInsertDeleteEnabled;
    encoder << additionalSupportedImageTypes;
    // FIXME(207716): The following should be removed when the GPU process is complete.
    encoder << mediaExtensionHandles;
    encoder << mediaIOKitExtensionHandles;
    encoder << gpuIOKitExtensionHandles;
    encoder << gpuMachExtensionHandles;
#endif
#if HAVE(STATIC_FONT_REGISTRY)
    encoder << fontMachExtensionHandle;
#endif
#if HAVE(APP_ACCENT_COLORS)
    encoder << accentColor;
#endif
#if USE(WPE_RENDERER)
    encoder << hostFileDescriptor;
#endif
#if PLATFORM(WIN)
    encoder << nativeWindowHandle;
#endif
    encoder << shouldScaleViewToFitDocument;
    encoder << userInterfaceLayoutDirection;
    encoder << observedLayoutMilestones;
    encoder << overrideContentSecurityPolicy;
    encoder << cpuLimit;
    encoder << urlSchemeHandlers;
    encoder << urlSchemesWithLegacyCustomProtocolHandlers;
#if ENABLE(APPLICATION_MANIFEST)
    encoder << applicationManifest;
#endif
    encoder << needsFontAttributes;
    encoder << iceCandidateFilteringEnabled;
    encoder << enumeratingAllNetworkInterfacesEnabled;
    encoder << userContentControllerParameters;
    encoder << backgroundColor;
    encoder << oldPageID;
    encoder << overriddenMediaType;
    encoder << corsDisablingPatterns;
    encoder << loadsSubresources;
    encoder << allowedNetworkHosts;
    encoder << userScriptsShouldWaitUntilNotification;
    encoder << crossOriginAccessControlCheckEnabled;
    encoder << processDisplayName;

    encoder << shouldCaptureAudioInUIProcess;
    encoder << shouldCaptureAudioInGPUProcess;
    encoder << shouldCaptureVideoInUIProcess;
    encoder << shouldCaptureVideoInGPUProcess;
    encoder << shouldCaptureDisplayInUIProcess;
    encoder << shouldRenderCanvasInGPUProcess;
    encoder << shouldRenderDOMInGPUProcess;
    encoder << shouldPlayMediaInGPUProcess;
#if ENABLE(WEBGL)
    encoder << shouldRenderWebGLInGPUProcess;
#endif
    encoder << shouldEnableVP8Decoder;
    encoder << shouldEnableVP9Decoder;
    encoder << shouldEnableVP9SWDecoder;
#if ENABLE(APP_BOUND_DOMAINS)
    encoder << limitsNavigationsToAppBoundDomains;
#endif
    encoder << lastNavigationWasAppInitiated;
    encoder << shouldRelaxThirdPartyCookieBlocking;
    encoder << canUseCredentialStorage;

#if PLATFORM(GTK)
    encoder << gtkSettings;
#endif
    
    encoder << httpsUpgradeEnabled;
#if PLATFORM(IOS)
    encoder << allowsDeprecatedSynchronousXMLHttpRequestDuringUnload;
#endif

#if ENABLE(APP_HIGHLIGHTS)
    encoder << appHighlightsVisible;
#endif

#if HAVE(TOUCH_BAR)
    encoder << requiresUserActionForEditingControlsManager;
#endif
}

std::optional<WebPageCreationParameters> WebPageCreationParameters::decode(IPC::Decoder& decoder)
{
    WebPageCreationParameters parameters;

    if (!decoder.decode(parameters.viewSize))
        return std::nullopt;
    if (!decoder.decode(parameters.activityState))
        return std::nullopt;
    if (!decoder.decode(parameters.store))
        return std::nullopt;
    if (!decoder.decode(parameters.drawingAreaType))
        return std::nullopt;
    std::optional<DrawingAreaIdentifier> drawingAreaIdentifier;
    decoder >> drawingAreaIdentifier;
    if (!drawingAreaIdentifier)
        return std::nullopt;
    parameters.drawingAreaIdentifier = *drawingAreaIdentifier;
    std::optional<WebPageProxyIdentifier> webPageProxyIdentifier;
    decoder >> webPageProxyIdentifier;
    if (!webPageProxyIdentifier)
        return std::nullopt;
    parameters.webPageProxyIdentifier = WTFMove(*webPageProxyIdentifier);
    std::optional<WebPageGroupData> pageGroupData;
    decoder >> pageGroupData;
    if (!pageGroupData)
        return std::nullopt;
    parameters.pageGroupData = WTFMove(*pageGroupData);
    if (!decoder.decode(parameters.isEditable))
        return std::nullopt;
    if (!decoder.decode(parameters.underlayColor))
        return std::nullopt;
    if (!decoder.decode(parameters.useFixedLayout))
        return std::nullopt;
    if (!decoder.decode(parameters.fixedLayoutSize))
        return std::nullopt;
    if (!decoder.decode(parameters.viewExposedRect))
        return std::nullopt;
    if (!decoder.decode(parameters.alwaysShowsHorizontalScroller))
        return std::nullopt;
    if (!decoder.decode(parameters.alwaysShowsVerticalScroller))
        return std::nullopt;
    if (!decoder.decode(parameters.paginationMode))
        return std::nullopt;
    if (!decoder.decode(parameters.paginationBehavesLikeColumns))
        return std::nullopt;
    if (!decoder.decode(parameters.pageLength))
        return std::nullopt;
    if (!decoder.decode(parameters.gapBetweenPages))
        return std::nullopt;
    if (!decoder.decode(parameters.paginationLineGridEnabled))
        return std::nullopt;

    std::optional<String> userAgent;
    decoder >> userAgent;
    if (!userAgent)
        return std::nullopt;
    parameters.userAgent = WTFMove(*userAgent);

    std::optional<bool> itemStatesWereRestoredByAPIRequest;
    decoder >> itemStatesWereRestoredByAPIRequest;
    if (!itemStatesWereRestoredByAPIRequest)
        return std::nullopt;
    parameters.itemStatesWereRestoredByAPIRequest = *itemStatesWereRestoredByAPIRequest;

    std::optional<Vector<BackForwardListItemState>> itemStates;
    decoder >> itemStates;
    if (!itemStates)
        return std::nullopt;
    parameters.itemStates = WTFMove(*itemStates);

    if (!decoder.decode(parameters.visitedLinkTableID))
        return std::nullopt;
    if (!decoder.decode(parameters.canRunBeforeUnloadConfirmPanel))
        return std::nullopt;
    if (!decoder.decode(parameters.canRunModal))
        return std::nullopt;
    if (!decoder.decode(parameters.deviceScaleFactor))
        return std::nullopt;
    if (!decoder.decode(parameters.viewScaleFactor))
        return std::nullopt;
    if (!decoder.decode(parameters.textZoomFactor))
        return std::nullopt;
    if (!decoder.decode(parameters.pageZoomFactor))
        return std::nullopt;
    if (!decoder.decode(parameters.topContentInset))
        return std::nullopt;
    if (!decoder.decode(parameters.mediaVolume))
        return std::nullopt;

    std::optional<WebCore::MediaProducerMutedStateFlags> mutedStateFlags;
    decoder >> mutedStateFlags;
    if (!mutedStateFlags)
        return std::nullopt;
    parameters.muted = *mutedStateFlags;

    if (!decoder.decode(parameters.mayStartMediaWhenInWindow))
        return std::nullopt;
    if (!decoder.decode(parameters.mediaPlaybackIsSuspended))
        return std::nullopt;
    if (!decoder.decode(parameters.minimumSizeForAutoLayout))
        return std::nullopt;
    if (!decoder.decode(parameters.sizeToContentAutoSizeMaximumSize))
        return std::nullopt;
    if (!decoder.decode(parameters.autoSizingShouldExpandToViewHeight))
        return std::nullopt;
    if (!decoder.decode(parameters.viewportSizeForCSSViewportUnits))
        return std::nullopt;
    if (!decoder.decode(parameters.scrollPinningBehavior))
        return std::nullopt;

    std::optional<std::optional<uint32_t>> scrollbarOverlayStyle;
    decoder >> scrollbarOverlayStyle;
    if (!scrollbarOverlayStyle)
        return std::nullopt;
    parameters.scrollbarOverlayStyle = WTFMove(*scrollbarOverlayStyle);

    if (!decoder.decode(parameters.backgroundExtendsBeyondPage))
        return std::nullopt;
    if (!decoder.decode(parameters.layerHostingMode))
        return std::nullopt;
    if (!decoder.decode(parameters.mimeTypesWithCustomContentProviders))
        return std::nullopt;
    if (!decoder.decode(parameters.controlledByAutomation))
        return std::nullopt;
    if (!decoder.decode(parameters.isProcessSwap))
        return std::nullopt;
    if (!decoder.decode(parameters.useDarkAppearance))
        return std::nullopt;
    if (!decoder.decode(parameters.useElevatedUserInterfaceLevel))
        return std::nullopt;

    std::optional<bool> hasResourceLoadClient;
    decoder >> hasResourceLoadClient;
    if (!hasResourceLoadClient)
        return std::nullopt;
    parameters.hasResourceLoadClient = WTFMove(*hasResourceLoadClient);

#if PLATFORM(MAC)
    std::optional<std::optional<DestinationColorSpace>> colorSpace;
    decoder >> colorSpace;
    if (!colorSpace)
        return std::nullopt;
    parameters.colorSpace = WTFMove(*colorSpace);
    if (!decoder.decode(parameters.useSystemAppearance))
        return std::nullopt;
#endif

#if ENABLE(META_VIEWPORT)
    if (!decoder.decode(parameters.ignoresViewportScaleLimits))
        return std::nullopt;
    if (!decoder.decode(parameters.viewportConfigurationViewLayoutSize))
        return std::nullopt;
    if (!decoder.decode(parameters.viewportConfigurationLayoutSizeScaleFactor))
        return std::nullopt;
    if (!decoder.decode(parameters.viewportConfigurationMinimumEffectiveDeviceWidth))
        return std::nullopt;
    if (!decoder.decode(parameters.viewportConfigurationViewSize))
        return std::nullopt;
    std::optional<std::optional<WebCore::ViewportArguments>> overrideViewportArguments;
    decoder >> overrideViewportArguments;
    if (!overrideViewportArguments)
        return std::nullopt;
    parameters.overrideViewportArguments = WTFMove(*overrideViewportArguments);
#endif

#if ENABLE(ATTACHMENT_ELEMENT)
    std::optional<std::optional<Vector<SandboxExtension::Handle>>> attachmentElementExtensionHandles;
    decoder >> attachmentElementExtensionHandles;
    if (!attachmentElementExtensionHandles)
        return std::nullopt;
    parameters.attachmentElementExtensionHandles = WTFMove(*attachmentElementExtensionHandles);
#endif

#if PLATFORM(IOS_FAMILY)
    if (!decoder.decode(parameters.screenSize))
        return std::nullopt;
    if (!decoder.decode(parameters.availableScreenSize))
        return std::nullopt;
    if (!decoder.decode(parameters.overrideScreenSize))
        return std::nullopt;
    if (!decoder.decode(parameters.textAutosizingWidth))
        return std::nullopt;
    if (!decoder.decode(parameters.maximumUnobscuredSize))
        return std::nullopt;
    if (!decoder.decode(parameters.deviceOrientation))
        return std::nullopt;
    if (!decoder.decode(parameters.keyboardIsAttached))
        return std::nullopt;
    if (!decoder.decode(parameters.canShowWhileLocked))
        return std::nullopt;
    if (!decoder.decode(parameters.isCapturingScreen))
        return std::nullopt;
#endif

#if PLATFORM(COCOA)
    if (!decoder.decode(parameters.smartInsertDeleteEnabled))
        return std::nullopt;
    if (!decoder.decode(parameters.additionalSupportedImageTypes))
        return std::nullopt;

    // FIXME(207716): The following should be removed when the GPU process is complete.
    std::optional<Vector<SandboxExtension::Handle>> mediaExtensionHandles;
    decoder >> mediaExtensionHandles;
    if (!mediaExtensionHandles)
        return std::nullopt;
    parameters.mediaExtensionHandles = WTFMove(*mediaExtensionHandles);

    std::optional<Vector<SandboxExtension::Handle>> mediaIOKitExtensionHandles;
    decoder >> mediaIOKitExtensionHandles;
    if (!mediaIOKitExtensionHandles)
        return std::nullopt;
    parameters.mediaIOKitExtensionHandles = WTFMove(*mediaIOKitExtensionHandles);
    // FIXME(207716): End region to remove.

    std::optional<Vector<SandboxExtension::Handle>> gpuIOKitExtensionHandles;
    decoder >> gpuIOKitExtensionHandles;
    if (!gpuIOKitExtensionHandles)
        return std::nullopt;
    parameters.gpuIOKitExtensionHandles = WTFMove(*gpuIOKitExtensionHandles);

    std::optional<Vector<SandboxExtension::Handle>> gpuMachExtensionHandles;
    decoder >> gpuMachExtensionHandles;
    if (!gpuMachExtensionHandles)
        return std::nullopt;
    parameters.gpuMachExtensionHandles = WTFMove(*gpuMachExtensionHandles);
#endif

#if HAVE(STATIC_FONT_REGISTRY)
    std::optional<std::optional<SandboxExtension::Handle>> fontMachExtensionHandle;
    decoder >> fontMachExtensionHandle;
    if (!fontMachExtensionHandle)
        return std::nullopt;
    parameters.fontMachExtensionHandle = WTFMove(*fontMachExtensionHandle);
#endif

#if HAVE(APP_ACCENT_COLORS)
    if (!decoder.decode(parameters.accentColor))
        return std::nullopt;
#endif

#if USE(WPE_RENDERER)
    if (!decoder.decode(parameters.hostFileDescriptor))
        return std::nullopt;
#endif

#if PLATFORM(WIN)
    if (!decoder.decode(parameters.nativeWindowHandle))
        return std::nullopt;
#endif

    if (!decoder.decode(parameters.shouldScaleViewToFitDocument))
        return std::nullopt;

    if (!decoder.decode(parameters.userInterfaceLayoutDirection))
        return std::nullopt;
    if (!decoder.decode(parameters.observedLayoutMilestones))
        return std::nullopt;

    if (!decoder.decode(parameters.overrideContentSecurityPolicy))
        return std::nullopt;

    std::optional<std::optional<double>> cpuLimit;
    decoder >> cpuLimit;
    if (!cpuLimit)
        return std::nullopt;
    parameters.cpuLimit = WTFMove(*cpuLimit);

    if (!decoder.decode(parameters.urlSchemeHandlers))
        return std::nullopt;
    
    std::optional<Vector<String>> urlSchemesWithLegacyCustomProtocolHandlers;
    decoder >> urlSchemesWithLegacyCustomProtocolHandlers;
    if (!urlSchemesWithLegacyCustomProtocolHandlers)
        return std::nullopt;
    parameters.urlSchemesWithLegacyCustomProtocolHandlers = WTFMove(*urlSchemesWithLegacyCustomProtocolHandlers);

#if ENABLE(APPLICATION_MANIFEST)
    std::optional<std::optional<WebCore::ApplicationManifest>> applicationManifest;
    decoder >> applicationManifest;
    if (!applicationManifest)
        return std::nullopt;
    parameters.applicationManifest = WTFMove(*applicationManifest);
#endif
    if (!decoder.decode(parameters.needsFontAttributes))
        return std::nullopt;

    if (!decoder.decode(parameters.iceCandidateFilteringEnabled))
        return std::nullopt;

    if (!decoder.decode(parameters.enumeratingAllNetworkInterfacesEnabled))
        return std::nullopt;

    std::optional<UserContentControllerParameters> userContentControllerParameters;
    decoder >> userContentControllerParameters;
    if (!userContentControllerParameters)
        return std::nullopt;
    parameters.userContentControllerParameters = WTFMove(*userContentControllerParameters);

    std::optional<std::optional<WebCore::Color>> backgroundColor;
    decoder >> backgroundColor;
    if (!backgroundColor)
        return std::nullopt;
    parameters.backgroundColor = WTFMove(*backgroundColor);

    std::optional<std::optional<WebCore::PageIdentifier>> oldPageID;
    decoder >> oldPageID;
    if (!oldPageID)
        return std::nullopt;
    parameters.oldPageID = WTFMove(*oldPageID);

    if (!decoder.decode(parameters.overriddenMediaType))
        return std::nullopt;

    std::optional<Vector<String>> corsDisablingPatterns;
    decoder >> corsDisablingPatterns;
    if (!corsDisablingPatterns)
        return std::nullopt;
    parameters.corsDisablingPatterns = WTFMove(*corsDisablingPatterns);

    std::optional<bool> loadsSubresources;
    decoder >> loadsSubresources;
    if (!loadsSubresources)
        return std::nullopt;
    parameters.loadsSubresources = *loadsSubresources;

    std::optional<std::optional<HashSet<String>>> allowedNetworkHosts;
    decoder >> allowedNetworkHosts;
    if (!allowedNetworkHosts)
        return std::nullopt;
    parameters.allowedNetworkHosts = *allowedNetworkHosts;

    std::optional<bool> userScriptsShouldWaitUntilNotification;
    decoder >> userScriptsShouldWaitUntilNotification;
    if (!userScriptsShouldWaitUntilNotification)
        return std::nullopt;
    parameters.userScriptsShouldWaitUntilNotification = *userScriptsShouldWaitUntilNotification;
    
    std::optional<bool> crossOriginAccessControlCheckEnabled;
    decoder >> crossOriginAccessControlCheckEnabled;
    if (!crossOriginAccessControlCheckEnabled)
        return std::nullopt;
    parameters.crossOriginAccessControlCheckEnabled = *crossOriginAccessControlCheckEnabled;
    
    std::optional<String> processDisplayName;
    decoder >> processDisplayName;
    if (!processDisplayName)
        return std::nullopt;
    parameters.processDisplayName = WTFMove(*processDisplayName);
    
    if (!decoder.decode(parameters.shouldCaptureAudioInUIProcess))
        return std::nullopt;

    if (!decoder.decode(parameters.shouldCaptureAudioInGPUProcess))
        return std::nullopt;

    if (!decoder.decode(parameters.shouldCaptureVideoInUIProcess))
        return std::nullopt;

    if (!decoder.decode(parameters.shouldCaptureVideoInGPUProcess))
        return std::nullopt;

    if (!decoder.decode(parameters.shouldCaptureDisplayInUIProcess))
        return std::nullopt;

    if (!decoder.decode(parameters.shouldRenderCanvasInGPUProcess))
        return std::nullopt;

    if (!decoder.decode(parameters.shouldRenderDOMInGPUProcess))
        return std::nullopt;

    if (!decoder.decode(parameters.shouldPlayMediaInGPUProcess))
        return std::nullopt;
#if ENABLE(WEBGL)
    if (!decoder.decode(parameters.shouldRenderWebGLInGPUProcess))
        return std::nullopt;
#endif

    if (!decoder.decode(parameters.shouldEnableVP8Decoder))
        return std::nullopt;

    if (!decoder.decode(parameters.shouldEnableVP9Decoder))
        return std::nullopt;

    if (!decoder.decode(parameters.shouldEnableVP9SWDecoder))
        return std::nullopt;

#if ENABLE(APP_BOUND_DOMAINS)
    if (!decoder.decode(parameters.limitsNavigationsToAppBoundDomains))
        return std::nullopt;
#endif
    if (!decoder.decode(parameters.lastNavigationWasAppInitiated))
        return std::nullopt;

    if (!decoder.decode(parameters.shouldRelaxThirdPartyCookieBlocking))
        return std::nullopt;

    if (!decoder.decode(parameters.canUseCredentialStorage))
        return std::nullopt;

#if PLATFORM(GTK)
    if (!decoder.decode(parameters.gtkSettings))
        return std::nullopt;
#endif

    if (!decoder.decode(parameters.httpsUpgradeEnabled))
        return std::nullopt;

#if PLATFORM(IOS)
    if (!decoder.decode(parameters.allowsDeprecatedSynchronousXMLHttpRequestDuringUnload))
        return std::nullopt;
#endif
    
#if ENABLE(APP_HIGHLIGHTS)
    if (!decoder.decode(parameters.appHighlightsVisible))
        return std::nullopt;
#endif

#if HAVE(TOUCH_BAR)
    if (!decoder.decode(parameters.requiresUserActionForEditingControlsManager))
        return std::nullopt;
#endif

    return parameters;
}

} // namespace WebKit
