blob: cbca908e38360d1d9c99442e093fa089151e96d6 [file] [log] [blame]
/*
* 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