blob: 1fbb3866c1a7c1694249680fcea9d46c1704f879 [file] [log] [blame]
/*
* Copyright (C) 2006 Eric Seidel <[email protected]>
* Copyright (C) 2008-2025 Apple Inc. All rights reserved.
* Copyright (C) Research In Motion Limited 2011. 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. ``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
* 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 "EmptyClients.h"
#include "AppHighlight.h"
#include "BackForwardClient.h"
#include "BadgeClient.h"
#include "BroadcastChannelRegistry.h"
#include "CacheStorageProvider.h"
#include "ColorChooser.h"
#include "ContextMenuClient.h"
#include "CookieConsentDecisionResult.h"
#include "CookieJar.h"
#include "CredentialRequestCoordinatorClient.h"
#include "DOMPasteAccess.h"
#include "DataListSuggestionPicker.h"
#include "DatabaseProvider.h"
#include "DateTimeChooser.h"
#include "DiagnosticLoggingClient.h"
#include "DisplayRefreshMonitor.h"
#include "DisplayRefreshMonitorFactory.h"
#include "DocumentFragment.h"
#include "DocumentLoader.h"
#include "DocumentSyncClient.h"
#include "DragClient.h"
#include "DummyModelPlayerProvider.h"
#include "DummySpeechRecognitionProvider.h"
#include "DummyStorageProvider.h"
#include "EditorClient.h"
#include "EmptyAttachmentElementClient.h"
#include "EmptyBadgeClient.h"
#include "EmptyFrameLoaderClient.h"
#include "FormState.h"
#include "FrameNetworkingContext.h"
#include "HTMLFormElement.h"
#include "HistoryItem.h"
#include "IDBConnectionToServer.h"
#include "IDBIndexIdentifier.h"
#include "IDBObjectStoreIdentifier.h"
#include "Icon.h"
#include "InspectorBackendClient.h"
#include "LocalFrame.h"
#include "LocalFrameLoaderClient.h"
#include "ModalContainerTypes.h"
#include "NetworkStorageSession.h"
#include "Page.h"
#include "PageConfiguration.h"
#include "PaymentCoordinatorClient.h"
#include "PluginInfoProvider.h"
#include "PopupMenu.h"
#include "ProgressTrackerClient.h"
#include "RemoteFrameClient.h"
#include "SearchPopupMenu.h"
#include "SecurityOriginData.h"
#include "SocketProvider.h"
#include "StorageArea.h"
#include "StorageNamespace.h"
#include "StorageNamespaceProvider.h"
#include "StorageType.h"
#include "TextCheckerClient.h"
#include "ThreadableWebSocketChannel.h"
#include "UserContentProvider.h"
#include "VisitedLinkStore.h"
#include "WebRTCProvider.h"
#include "WebTransportSession.h"
#include <JavaScriptCore/HeapInlines.h>
#include <pal/SessionID.h>
#include <wtf/NeverDestroyed.h>
#include <wtf/TZoneMallocInlines.h>
#include <wtf/Unexpected.h>
#if ENABLE(CONTENT_EXTENSIONS)
#include "CompiledContentExtension.h"
#endif
#if USE(QUICK_LOOK)
#include "LegacyPreviewLoaderClient.h"
#endif
#if ENABLE(WEB_AUTHN)
#include "DigitalCredentialsRequestData.h"
#include "DigitalCredentialsResponseData.h"
#include "ExceptionData.h"
#endif
#if USE(GSTREAMER_WEBRTC) && USE(LIBRICE)
#include "GStreamerIceAgent.h"
#endif
namespace WebCore {
WTF_MAKE_TZONE_ALLOCATED_IMPL(DummyStorageProvider);
WTF_MAKE_TZONE_ALLOCATED_IMPL(EmptyChromeClient);
WTF_MAKE_TZONE_ALLOCATED_IMPL(EmptyCryptoClient);
class UserMessageHandlerDescriptor;
class EmptyBackForwardClient final : public BackForwardClient {
void addItem(Ref<HistoryItem>&&) final { }
void setChildItem(BackForwardFrameItemIdentifier, Ref<HistoryItem>&&) final { }
void goToItem(HistoryItem&) final { }
Vector<Ref<HistoryItem>> allItems(FrameIdentifier) { return { }; }
RefPtr<HistoryItem> itemAtIndex(int, FrameIdentifier) final { return nullptr; }
unsigned backListCount() const final { return 0; }
unsigned forwardListCount() const final { return 0; }
bool containsItem(const HistoryItem&) const final { return false; }
void close() final { }
};
#if ENABLE(CONTEXT_MENUS)
class EmptyContextMenuClient final : public ContextMenuClient {
WTF_MAKE_TZONE_ALLOCATED(EmptyContextMenuClient);
void downloadURL(const URL&) final { }
void searchWithGoogle(const LocalFrame*) final { }
void lookUpInDictionary(LocalFrame*) final { }
bool isSpeaking() const final { return false; }
void speak(const String&) final { }
void stopSpeaking() final { }
#if HAVE(TRANSLATION_UI_SERVICES)
void handleTranslation(const TranslationContextMenuInfo&) final { }
#endif
#if PLATFORM(GTK)
void insertEmoji(LocalFrame&) final { }
#endif
#if USE(ACCESSIBILITY_CONTEXT_MENUS)
void showContextMenu() final { }
#endif
#if ENABLE(IMAGE_ANALYSIS)
bool supportsLookUpInImages() final { return false; }
#endif
#if ENABLE(IMAGE_ANALYSIS_ENHANCEMENTS)
bool supportsCopySubject() final { return false; }
#endif
};
WTF_MAKE_TZONE_ALLOCATED_IMPL(EmptyContextMenuClient);
#endif // ENABLE(CONTEXT_MENUS)
class EmptyDisplayRefreshMonitor final : public DisplayRefreshMonitor {
public:
static Ref<EmptyDisplayRefreshMonitor> create(PlatformDisplayID displayID)
{
return adoptRef(*new EmptyDisplayRefreshMonitor(displayID));
}
void displayLinkFired(const DisplayUpdate&) final { }
bool requestRefreshCallback() final { return false; }
void stop() final { }
bool startNotificationMechanism() final { return true; }
void stopNotificationMechanism() final { }
private:
explicit EmptyDisplayRefreshMonitor(PlatformDisplayID displayID)
: DisplayRefreshMonitor(displayID)
{
}
};
class EmptyDisplayRefreshMonitorFactory final : public DisplayRefreshMonitorFactory {
public:
static DisplayRefreshMonitorFactory* sharedEmptyDisplayRefreshMonitorFactory()
{
static NeverDestroyed<EmptyDisplayRefreshMonitorFactory> emptyFactory;
return &emptyFactory.get();
}
private:
RefPtr<DisplayRefreshMonitor> createDisplayRefreshMonitor(PlatformDisplayID displayID) final
{
return EmptyDisplayRefreshMonitor::create(displayID);
}
};
class EmptyDatabaseProvider final : public DatabaseProvider {
struct EmptyIDBConnectionToServerDeletegate final : public IDBClient::IDBConnectionToServerDelegate, public RefCounted<EmptyIDBConnectionToServerDeletegate> {
static Ref<EmptyIDBConnectionToServerDeletegate> create() { return adoptRef(*new EmptyIDBConnectionToServerDeletegate); }
void ref() const final { RefCounted::ref(); }
void deref() const final { RefCounted::deref(); }
std::optional<IDBConnectionIdentifier> identifier() const final { return std::nullopt; }
void deleteDatabase(const IDBOpenRequestData&) final { }
void openDatabase(const IDBOpenRequestData&) final { }
void abortTransaction(const IDBResourceIdentifier&) final { }
void commitTransaction(const IDBResourceIdentifier&, uint64_t) final { }
void didFinishHandlingVersionChangeTransaction(IDBDatabaseConnectionIdentifier, const IDBResourceIdentifier&) final { }
void createObjectStore(const IDBRequestData&, const IDBObjectStoreInfo&) final { }
void deleteObjectStore(const IDBRequestData&, const String&) final { }
void renameObjectStore(const IDBRequestData&, IDBObjectStoreIdentifier, const String&) final { }
void clearObjectStore(const IDBRequestData&, IDBObjectStoreIdentifier) final { }
void createIndex(const IDBRequestData&, const IDBIndexInfo&) final { }
void deleteIndex(const IDBRequestData&, IDBObjectStoreIdentifier, const String&) final { }
void renameIndex(const IDBRequestData&, IDBObjectStoreIdentifier, IDBIndexIdentifier, const String&) final { }
void putOrAdd(const IDBRequestData&, const IDBKeyData&, const IDBValue&, const IndexIDToIndexKeyMap&, const IndexedDB::ObjectStoreOverwriteMode) final { }
void getRecord(const IDBRequestData&, const IDBGetRecordData&) final { }
void getAllRecords(const IDBRequestData&, const IDBGetAllRecordsData&) final { }
void getCount(const IDBRequestData&, const IDBKeyRangeData&) final { }
void deleteRecord(const IDBRequestData&, const IDBKeyRangeData&) final { }
void openCursor(const IDBRequestData&, const IDBCursorInfo&) final { }
void iterateCursor(const IDBRequestData&, const IDBIterateCursorData&) final { }
void establishTransaction(IDBDatabaseConnectionIdentifier, const IDBTransactionInfo&) final { }
void databaseConnectionPendingClose(IDBDatabaseConnectionIdentifier) final { }
void databaseConnectionClosed(IDBDatabaseConnectionIdentifier) final { }
void abortOpenAndUpgradeNeeded(IDBDatabaseConnectionIdentifier, const std::optional<IDBResourceIdentifier>&) final { }
void didFireVersionChangeEvent(IDBDatabaseConnectionIdentifier, const IDBResourceIdentifier&, const IndexedDB::ConnectionClosedOnBehalfOfServer) final { }
void openDBRequestCancelled(const IDBOpenRequestData&) final { }
void getAllDatabaseNamesAndVersions(const IDBResourceIdentifier&, const ClientOrigin&) final { }
void didGenerateIndexKeyForRecord(const IDBResourceIdentifier&, const IDBResourceIdentifier&, const IDBIndexInfo&, const IDBKeyData&, const IndexKey&, std::optional<int64_t>) { }
private:
EmptyIDBConnectionToServerDeletegate() = default;
};
IDBClient::IDBConnectionToServer& idbConnectionToServerForSession(PAL::SessionID sessionID) final
{
static NeverDestroyed<Ref<EmptyIDBConnectionToServerDeletegate>> emptyDelegate = EmptyIDBConnectionToServerDeletegate::create();
static NeverDestroyed<Ref<IDBClient::IDBConnectionToServer>> emptyConnection = IDBClient::IDBConnectionToServer::create(emptyDelegate.get(), sessionID).leakRef();
return emptyConnection->get();
}
};
class EmptyDiagnosticLoggingClient final : public DiagnosticLoggingClient {
WTF_MAKE_TZONE_ALLOCATED(EmptyDiagnosticLoggingClient);
WTF_OVERRIDE_DELETE_FOR_CHECKED_PTR(EmptyDiagnosticLoggingClient);
void logDiagnosticMessage(const String&, const String&, ShouldSample) final { }
void logDiagnosticMessageWithResult(const String&, const String&, DiagnosticLoggingResultType, ShouldSample) final { }
void logDiagnosticMessageWithValue(const String&, const String&, double, unsigned, ShouldSample) final { }
void logDiagnosticMessageWithEnhancedPrivacy(const String&, const String&, ShouldSample) final { }
void logDiagnosticMessageWithValueDictionary(const String&, const String&, const ValueDictionary&, ShouldSample) final { }
void logDiagnosticMessageWithDomain(const String&, DiagnosticLoggingDomain) final { };
};
WTF_MAKE_TZONE_ALLOCATED_IMPL(EmptyDiagnosticLoggingClient);
#if ENABLE(DRAG_SUPPORT)
class EmptyDragClient final : public DragClient {
void willPerformDragDestinationAction(DragDestinationAction, const DragData&) final { }
void willPerformDragSourceAction(DragSourceAction, const IntPoint&, DataTransfer&) final { }
OptionSet<DragSourceAction> dragSourceActionMaskForPoint(const IntPoint&) final { return { }; }
void startDrag(DragItem, DataTransfer&, Frame&, const std::optional<NodeIdentifier>&) final { }
};
#endif // ENABLE(DRAG_SUPPORT)
class EmptyEditorClient final : public EditorClient {
WTF_MAKE_TZONE_ALLOCATED(EmptyEditorClient);
WTF_OVERRIDE_DELETE_FOR_CHECKED_PTR(EmptyEditorClient);
private:
bool shouldDeleteRange(const std::optional<SimpleRange>&) final { return false; }
bool smartInsertDeleteEnabled() final { return false; }
bool isSelectTrailingWhitespaceEnabled() const final { return false; }
bool isContinuousSpellCheckingEnabled() final { return false; }
void toggleContinuousSpellChecking() final { }
bool isGrammarCheckingEnabled() final { return false; }
void toggleGrammarChecking() final { }
int spellCheckerDocumentTag() final { return -1; }
bool shouldBeginEditing(const SimpleRange&) final { return false; }
bool shouldEndEditing(const SimpleRange&) final { return false; }
bool shouldInsertNode(Node&, const std::optional<SimpleRange>&, EditorInsertAction) final { return false; }
bool shouldInsertText(const String&, const std::optional<SimpleRange>&, EditorInsertAction) final { return false; }
bool shouldChangeSelectedRange(const std::optional<SimpleRange>&, const std::optional<SimpleRange>&, Affinity, bool) final { return false; }
bool shouldApplyStyle(const StyleProperties&, const std::optional<SimpleRange>&) final { return false; }
void didApplyStyle() final { }
bool shouldMoveRangeAfterDelete(const SimpleRange&, const SimpleRange&) final { return false; }
void didBeginEditing() final { }
void respondToChangedContents() final { }
void respondToChangedSelection(LocalFrame*) final { }
void updateEditorStateAfterLayoutIfEditabilityChanged() final { }
void discardedComposition(const Document&) final { }
void canceledComposition() final { }
void didUpdateComposition() final { }
void didEndEditing() final { }
void didEndUserTriggeredSelectionChanges() final { }
void willWriteSelectionToPasteboard(const std::optional<SimpleRange>&) final { }
void didWriteSelectionToPasteboard() final { }
void getClientPasteboardData(const std::optional<SimpleRange>&, Vector<std::pair<String, RefPtr<SharedBuffer>>>&) final { }
void requestCandidatesForSelection(const VisibleSelection&) final { }
void handleAcceptedCandidateWithSoftSpaces(TextCheckingResult) final { }
void registerUndoStep(UndoStep&) final;
void registerRedoStep(UndoStep&) final;
void clearUndoRedoOperations() final { }
DOMPasteAccessResponse requestDOMPasteAccess(DOMPasteAccessCategory, FrameIdentifier, const String&) final { return DOMPasteAccessResponse::DeniedForGesture; }
bool canCopyCut(LocalFrame*, bool defaultValue) const final { return defaultValue; }
bool canPaste(LocalFrame*, bool defaultValue) const final { return defaultValue; }
bool canUndo() const final { return false; }
bool canRedo() const final { return false; }
void undo() final { }
void redo() final { }
void handleKeyboardEvent(KeyboardEvent&) final { }
void handleInputMethodKeydown(KeyboardEvent&) final { }
void textFieldDidBeginEditing(Element&) final { }
void textFieldDidEndEditing(Element&) final { }
void textDidChangeInTextField(Element&) final { }
bool doTextFieldCommandFromEvent(Element&, KeyboardEvent*) final { return false; }
void textWillBeDeletedInTextField(Element&) final { }
void textDidChangeInTextArea(Element&) final { }
void overflowScrollPositionChanged() final { }
void subFrameScrollPositionChanged() final { }
#if PLATFORM(IOS_FAMILY)
void startDelayingAndCoalescingContentChangeNotifications() final { }
void stopDelayingAndCoalescingContentChangeNotifications() final { }
bool hasRichlyEditableSelection() final { return false; }
int getPasteboardItemsCount() final { return 0; }
RefPtr<DocumentFragment> documentFragmentFromDelegate(int) final { return nullptr; }
bool performsTwoStepPaste(DocumentFragment*) final { return false; }
void updateStringForFind(const String&) final { }
#endif
bool performTwoStepDrop(DocumentFragment&, const SimpleRange&, bool) final { return false; }
#if PLATFORM(COCOA)
void setInsertionPasteboard(const String&) final { };
#endif
#if USE(APPKIT)
void uppercaseWord() final { }
void lowercaseWord() final { }
void capitalizeWord() final { }
#endif
#if USE(AUTOMATIC_TEXT_REPLACEMENT)
void showSubstitutionsPanel(bool) final { }
bool substitutionsPanelIsShowing() final { return false; }
void toggleSmartInsertDelete() final { }
bool isAutomaticQuoteSubstitutionEnabled() final { return false; }
void toggleAutomaticQuoteSubstitution() final { }
bool isAutomaticLinkDetectionEnabled() final { return false; }
void toggleAutomaticLinkDetection() final { }
bool isAutomaticDashSubstitutionEnabled() final { return false; }
void toggleAutomaticDashSubstitution() final { }
bool isAutomaticTextReplacementEnabled() final { return false; }
void toggleAutomaticTextReplacement() final { }
bool isAutomaticSpellingCorrectionEnabled() final { return false; }
void toggleAutomaticSpellingCorrection() final { }
bool isSmartListsEnabled() final { return false; }
void toggleSmartLists() { }
#endif
#if PLATFORM(GTK)
bool shouldShowUnicodeMenu() final { return false; }
#endif
TextCheckerClient* textChecker() final { return &m_textCheckerClient; }
void updateSpellingUIWithGrammarString(const String&, const GrammarDetail&) final { }
void updateSpellingUIWithMisspelledWord(const String&) final { }
void showSpellingUI(bool) final { }
bool spellingUIIsShowing() final { return false; }
void setInputMethodState(Element*) final { }
class EmptyTextCheckerClient final : public TextCheckerClient {
bool shouldEraseMarkersAfterChangeSelection(TextCheckingType) const final { return true; }
void ignoreWordInSpellDocument(const String&) final { }
void learnWord(const String&) final { }
void checkSpellingOfString(StringView, int*, int*) final { }
void checkGrammarOfString(StringView, Vector<GrammarDetail>&, int*, int*) final { }
#if USE(UNIFIED_TEXT_CHECKING)
Vector<TextCheckingResult> checkTextOfParagraph(StringView, OptionSet<TextCheckingType>, const VisibleSelection&) final { return Vector<TextCheckingResult>(); }
#endif
void getGuessesForWord(const String&, const String&, const VisibleSelection&, Vector<String>&) final { }
void requestCheckingOfString(TextCheckingRequest&, const VisibleSelection&) final;
void requestExtendedCheckingOfString(TextCheckingRequest&, const VisibleSelection&) final;
};
EmptyTextCheckerClient m_textCheckerClient;
};
WTF_MAKE_TZONE_ALLOCATED_IMPL(EmptyEditorClient);
class EmptyFrameNetworkingContext final : public FrameNetworkingContext {
public:
static Ref<EmptyFrameNetworkingContext> create() { return adoptRef(*new EmptyFrameNetworkingContext); }
private:
EmptyFrameNetworkingContext();
bool shouldClearReferrerOnHTTPSToHTTPRedirect() const { return true; }
NetworkStorageSession* storageSession() const final { return nullptr; }
#if PLATFORM(COCOA)
bool localFileContentSniffingEnabled() const { return false; }
SchedulePairHashSet* scheduledRunLoopPairs() const { return nullptr; }
RetainPtr<CFDataRef> sourceApplicationAuditData() const { return nullptr; };
#endif
#if PLATFORM(COCOA) || PLATFORM(WIN)
ResourceError blockedError(const ResourceRequest&) const final { return { }; }
#endif
};
class EmptyInspectorBackendClient final : public InspectorBackendClient {
WTF_MAKE_TZONE_ALLOCATED(EmptyInspectorBackendClient);
void inspectedPageDestroyed() final { }
Inspector::FrontendChannel* openLocalFrontend(PageInspectorController*) final { return nullptr; }
void bringFrontendToFront() final { }
void highlight() final { }
void hideHighlight() final { }
};
WTF_MAKE_TZONE_ALLOCATED_IMPL(EmptyInspectorBackendClient);
#if ENABLE(APPLE_PAY)
class EmptyPaymentCoordinatorClient final : public PaymentCoordinatorClient, public RefCounted<EmptyPaymentCoordinatorClient> {
WTF_MAKE_TZONE_ALLOCATED(EmptyPaymentCoordinatorClient);
public:
static Ref<EmptyPaymentCoordinatorClient> create()
{
return adoptRef(*new EmptyPaymentCoordinatorClient);
}
void ref() const final { RefCounted::ref(); }
void deref() const final { RefCounted::deref(); }
private:
EmptyPaymentCoordinatorClient() = default;
std::optional<String> validatedPaymentNetwork(const String&) const final { return std::nullopt; }
bool canMakePayments() final { return false; }
void canMakePaymentsWithActiveCard(const String&, const String&, CompletionHandler<void(bool)>&& completionHandler) final { callOnMainThread([completionHandler = WTF::move(completionHandler)]() mutable { completionHandler(false); }); }
void openPaymentSetup(const String&, const String&, CompletionHandler<void(bool)>&& completionHandler) final { callOnMainThread([completionHandler = WTF::move(completionHandler)]() mutable { completionHandler(false); }); }
bool showPaymentUI(const URL&, const Vector<URL>&, const ApplePaySessionPaymentRequest&) final { return false; }
void completeMerchantValidation(const PaymentMerchantSession&) final { }
void completeShippingMethodSelection(std::optional<ApplePayShippingMethodUpdate>&&) final { }
void completeShippingContactSelection(std::optional<ApplePayShippingContactUpdate>&&) final { }
void completePaymentMethodSelection(std::optional<ApplePayPaymentMethodUpdate>&&) final { }
#if ENABLE(APPLE_PAY_COUPON_CODE)
void completeCouponCodeChange(std::optional<ApplePayCouponCodeUpdate>&&) final { }
#endif
void completePaymentSession(ApplePayPaymentAuthorizationResult&&) final { }
void cancelPaymentSession() final { }
void abortPaymentSession() final { }
};
WTF_MAKE_TZONE_ALLOCATED_IMPL(EmptyPaymentCoordinatorClient);
#endif
#if ENABLE(WEB_AUTHN)
class EmptyCredentialRequestCoordinatorClient final : public CredentialRequestCoordinatorClient {
WTF_MAKE_TZONE_ALLOCATED(EmptyCredentialRequestCoordinatorClient);
public:
static Ref<EmptyCredentialRequestCoordinatorClient> create()
{
return adoptRef(*new EmptyCredentialRequestCoordinatorClient);
}
void showDigitalCredentialsPicker(Vector<WebCore::UnvalidatedDigitalCredentialRequest>&&, const DigitalCredentialsRequestData&, CompletionHandler<void(Expected<DigitalCredentialsResponseData, ExceptionData>&&)>&& completionHandler)
{
callOnMainThread([completionHandler = WTF::move(completionHandler)]() mutable {
completionHandler(makeUnexpected(ExceptionData { ExceptionCode::NotSupportedError, "Empty client."_s }));
});
}
void dismissDigitalCredentialsPicker(CompletionHandler<void(bool)>&& completionHandler) final
{
callOnMainThread([completionHandler = WTF::move(completionHandler)]() mutable {
completionHandler(false);
});
}
ExceptionOr<Vector<ValidatedDigitalCredentialRequest>> validateAndParseDigitalCredentialRequests(const SecurityOrigin&, const Document&, const Vector<UnvalidatedDigitalCredentialRequest>&)
{
return Exception { ExceptionCode::InvalidStateError };
}
private:
EmptyCredentialRequestCoordinatorClient() = default;
};
WTF_MAKE_TZONE_ALLOCATED_IMPL(EmptyCredentialRequestCoordinatorClient);
#endif
class EmptyPluginInfoProvider final : public PluginInfoProvider {
void refreshPlugins() final { };
Vector<PluginInfo> pluginInfo(Page&, std::optional<Vector<SupportedPluginIdentifier>>&) final { return { }; }
Vector<PluginInfo> webVisiblePluginInfo(Page&, const URL&) final { return { }; }
};
class EmptyPopupMenu : public PopupMenu {
private:
void show(const IntRect&, LocalFrameView&, int) final { }
void hide() final { }
void updateFromElement() final { }
void disconnectClient() final { }
};
class EmptyProgressTrackerClient final : public ProgressTrackerClient {
void willChangeEstimatedProgress() final { }
void didChangeEstimatedProgress() final { }
void progressStarted(LocalFrame&) final { }
void progressEstimateChanged(LocalFrame&) final { }
void progressFinished(LocalFrame&) final { }
};
class EmptySearchPopupMenu : public SearchPopupMenu {
public:
EmptySearchPopupMenu()
: m_popup(adoptRef(*new EmptyPopupMenu))
{
}
private:
PopupMenu* popupMenu() final { return m_popup.ptr(); }
void saveRecentSearches(const AtomString&, const Vector<RecentSearch>&) final { }
void loadRecentSearches(const AtomString&, Vector<RecentSearch>&) final { }
bool enabled() final { return false; }
const Ref<EmptyPopupMenu> m_popup;
};
class EmptyStorageNamespaceProvider final : public StorageNamespaceProvider {
struct EmptyStorageArea : public StorageArea {
unsigned length() final { return 0; }
String key(unsigned) final { return { }; }
String item(const String&) final { return { }; }
void setItem(LocalFrame&, const String&, const String&, bool&) final { }
void removeItem(LocalFrame&, const String&) final { }
void clear(LocalFrame&) final { }
bool contains(const String&) final { return false; }
StorageType storageType() const final { return StorageType::Local; }
size_t memoryBytesUsedByCache() final { return 0; }
};
struct EmptyStorageNamespace final : public StorageNamespace {
explicit EmptyStorageNamespace(PAL::SessionID sessionID)
: m_sessionID(sessionID)
{
}
const SecurityOrigin* topLevelOrigin() const final { return nullptr; };
private:
Ref<StorageArea> storageArea(const SecurityOrigin&) final { return adoptRef(*new EmptyStorageArea); }
Ref<StorageNamespace> copy(Page&) final { return adoptRef(*new EmptyStorageNamespace { m_sessionID }); }
PAL::SessionID sessionID() const final { return m_sessionID; }
void setSessionIDForTesting(PAL::SessionID sessionID) final { m_sessionID = sessionID; };
PAL::SessionID m_sessionID;
};
Ref<StorageNamespace> createLocalStorageNamespace(unsigned, PAL::SessionID) final;
Ref<StorageNamespace> createTransientLocalStorageNamespace(SecurityOrigin&, unsigned, PAL::SessionID) final;
RefPtr<StorageNamespace> sessionStorageNamespace(const SecurityOrigin&, Page&, ShouldCreateNamespace) final;
};
class EmptyUserContentProvider final : public UserContentProvider {
void forEachUserScript(NOESCAPE const Function<void(DOMWrapperWorld&, const UserScript&)>&) const final { }
void forEachUserStyleSheet(NOESCAPE const Function<void(const UserStyleSheet&)>&) const final { }
#if ENABLE(USER_MESSAGE_HANDLERS)
void forEachUserMessageHandler(NOESCAPE const Function<void(const UserMessageHandlerDescriptor&)>&) const final { }
#endif
bool hasBuffersForWorld(const DOMWrapperWorld&) const final { return false; }
WebKitBuffer* buffer(const DOMWrapperWorld&, const String&) const final { return nullptr; }
#if ENABLE(CONTENT_EXTENSIONS)
const ContentExtensions::ContentExtensionsBackend& userContentExtensionBackend() const final { static NeverDestroyed<ContentExtensions::ContentExtensionsBackend> backend; return backend.get(); };
#endif
};
class EmptyVisitedLinkStore final : public VisitedLinkStore {
bool isLinkVisited(Page&, SharedStringHash, const URL&, const AtomString&) final { return false; }
void addVisitedLink(Page&, SharedStringHash) final { }
};
RefPtr<PopupMenu> EmptyChromeClient::createPopupMenu(PopupMenuClient&) const
{
return adoptRef(*new EmptyPopupMenu);
}
RefPtr<SearchPopupMenu> EmptyChromeClient::createSearchPopupMenu(PopupMenuClient&) const
{
return adoptRef(*new EmptySearchPopupMenu);
}
RefPtr<ColorChooser> EmptyChromeClient::createColorChooser(ColorChooserClient&, const Color&)
{
return nullptr;
}
RefPtr<DataListSuggestionPicker> EmptyChromeClient::createDataListSuggestionPicker(DataListSuggestionsClient&)
{
return nullptr;
}
RefPtr<DateTimeChooser> EmptyChromeClient::createDateTimeChooser(DateTimeChooserClient&)
{
return nullptr;
}
void EmptyChromeClient::setTextIndicator(RefPtr<TextIndicator>&&) const
{
}
void EmptyChromeClient::updateTextIndicator(RefPtr<TextIndicator>&&) const
{
}
DisplayRefreshMonitorFactory* EmptyChromeClient::displayRefreshMonitorFactory() const
{
return EmptyDisplayRefreshMonitorFactory::sharedEmptyDisplayRefreshMonitorFactory();
}
void EmptyChromeClient::runOpenPanel(LocalFrame&, FileChooser&)
{
}
void EmptyChromeClient::showShareSheet(ShareDataWithParsedURL&&, CompletionHandler<void(bool)>&&)
{
}
void EmptyChromeClient::requestCookieConsent(CompletionHandler<void(CookieConsentDecisionResult)>&& completion)
{
completion(CookieConsentDecisionResult::NotSupported);
}
RefPtr<Icon> EmptyChromeClient::createIconForFiles(const Vector<String>& /* filenames */)
{
return nullptr;
}
// MARK: -
void EmptyFrameLoaderClient::dispatchDecidePolicyForNewWindowAction(const NavigationAction&, const ResourceRequest&, FormState*, const String&, std::optional<HitTestResult>&&, FramePolicyFunction&&)
{
}
void EmptyFrameLoaderClient::dispatchDecidePolicyForNavigationAction(const NavigationAction&, const ResourceRequest&, const ResourceResponse&, FormState*, const String&, std::optional<NavigationIdentifier>, std::optional<HitTestResult>&&, bool, NavigationUpgradeToHTTPSBehavior, SandboxFlags, PolicyDecisionMode, FramePolicyFunction&&)
{
}
void EmptyFrameLoaderClient::updateSandboxFlags(SandboxFlags)
{
}
void EmptyFrameLoaderClient::updateOpener(std::optional<FrameIdentifier>)
{
}
void EmptyFrameLoaderClient::setPrinting(bool, FloatSize, FloatSize, float, AdjustViewSize)
{
}
void EmptyFrameLoaderClient::dispatchWillSendSubmitEvent(Ref<FormState>&&)
{
}
void EmptyFrameLoaderClient::dispatchWillSubmitForm(FormState&, URL&&, String&&, CompletionHandler<void()>&& completionHandler)
{
completionHandler();
}
Ref<DocumentLoader> EmptyFrameLoaderClient::createDocumentLoader(ResourceRequest&& request, SubstituteData&& substituteData, ResourceRequest&& originalRequest)
{
return DocumentLoader::create(WTF::move(request), WTF::move(substituteData), WTF::move(originalRequest));
}
Ref<DocumentLoader> EmptyFrameLoaderClient::createDocumentLoader(ResourceRequest&& request, SubstituteData&& substituteData)
{
return DocumentLoader::create(WTF::move(request), WTF::move(substituteData), { });
}
RefPtr<LocalFrame> EmptyFrameLoaderClient::createFrame(const AtomString&, HTMLFrameOwnerElement&)
{
return nullptr;
}
RefPtr<Widget> EmptyFrameLoaderClient::createPlugin(HTMLPlugInElement&, const URL&, const Vector<AtomString>&, const Vector<AtomString>&, const String&, bool)
{
return nullptr;
}
bool EmptyFrameLoaderClient::hasWebView() const
{
return true; // mainly for assertions
}
void EmptyFrameLoaderClient::makeRepresentation(DocumentLoader*)
{
}
#if PLATFORM(IOS_FAMILY)
bool EmptyFrameLoaderClient::forceLayoutOnRestoreFromBackForwardCache()
{
return false;
}
#endif
void EmptyFrameLoaderClient::forceLayoutForNonHTML()
{
}
void EmptyFrameLoaderClient::setCopiesOnScroll()
{
}
void EmptyFrameLoaderClient::detachedFromParent2()
{
}
void EmptyFrameLoaderClient::detachedFromParent3()
{
}
void EmptyFrameLoaderClient::convertMainResourceLoadToDownload(DocumentLoader*, const ResourceRequest&, const ResourceResponse&)
{
}
void EmptyFrameLoaderClient::assignIdentifierToInitialRequest(ResourceLoaderIdentifier, DocumentLoader*, const ResourceRequest&)
{
}
bool EmptyFrameLoaderClient::shouldUseCredentialStorage(DocumentLoader*, ResourceLoaderIdentifier)
{
return false;
}
void EmptyFrameLoaderClient::dispatchWillSendRequest(DocumentLoader*, ResourceLoaderIdentifier, ResourceRequest&, const ResourceResponse&)
{
}
void EmptyFrameLoaderClient::dispatchDidReceiveAuthenticationChallenge(DocumentLoader*, ResourceLoaderIdentifier, const AuthenticationChallenge&)
{
}
#if USE(PROTECTION_SPACE_AUTH_CALLBACK)
bool EmptyFrameLoaderClient::canAuthenticateAgainstProtectionSpace(DocumentLoader*, ResourceLoaderIdentifier, const ProtectionSpace&)
{
return false;
}
#endif
#if PLATFORM(IOS_FAMILY)
RetainPtr<CFDictionaryRef> EmptyFrameLoaderClient::connectionProperties(DocumentLoader*, ResourceLoaderIdentifier)
{
return nullptr;
}
#endif
void EmptyFrameLoaderClient::dispatchDidReceiveResponse(DocumentLoader*, ResourceLoaderIdentifier, const ResourceResponse&)
{
}
void EmptyFrameLoaderClient::dispatchDidReceiveContentLength(DocumentLoader*, ResourceLoaderIdentifier, int)
{
}
void EmptyFrameLoaderClient::dispatchDidFinishLoading(DocumentLoader*, ResourceLoaderIdentifier)
{
}
#if ENABLE(DATA_DETECTION)
void EmptyFrameLoaderClient::dispatchDidFinishDataDetection(NSArray *)
{
}
#endif
void EmptyFrameLoaderClient::dispatchDidFailLoading(DocumentLoader*, ResourceLoaderIdentifier, const ResourceError&)
{
}
bool EmptyFrameLoaderClient::dispatchDidLoadResourceFromMemoryCache(DocumentLoader*, const ResourceRequest&, const ResourceResponse&, int)
{
return false;
}
void EmptyFrameLoaderClient::dispatchDidDispatchOnloadEvents()
{
}
void EmptyFrameLoaderClient::dispatchDidReceiveServerRedirectForProvisionalLoad()
{
}
void EmptyFrameLoaderClient::dispatchDidCancelClientRedirect()
{
}
void EmptyFrameLoaderClient::dispatchWillPerformClientRedirect(const URL&, double, WallTime, LockBackForwardList)
{
}
void EmptyFrameLoaderClient::dispatchDidChangeLocationWithinPage()
{
}
void EmptyFrameLoaderClient::dispatchDidPushStateWithinPage()
{
}
void EmptyFrameLoaderClient::dispatchDidReplaceStateWithinPage()
{
}
void EmptyFrameLoaderClient::dispatchDidPopStateWithinPage()
{
}
void EmptyFrameLoaderClient::dispatchWillClose()
{
}
void EmptyFrameLoaderClient::dispatchDidStartProvisionalLoad()
{
}
void EmptyFrameLoaderClient::dispatchDidReceiveTitle(const StringWithDirection&)
{
}
void EmptyFrameLoaderClient::dispatchDidCommitLoad(std::optional<HasInsecureContent>, std::optional<UsedLegacyTLS>, std::optional<WasPrivateRelayed>)
{
}
void EmptyFrameLoaderClient::dispatchDidFailProvisionalLoad(const ResourceError&, WillContinueLoading, WillInternallyHandleFailure)
{
}
void EmptyFrameLoaderClient::dispatchDidFailLoad(const ResourceError&)
{
}
void EmptyFrameLoaderClient::dispatchDidFinishDocumentLoad()
{
}
void EmptyFrameLoaderClient::dispatchDidFinishLoad()
{
}
void EmptyFrameLoaderClient::dispatchDidReachLayoutMilestone(OptionSet<LayoutMilestone>)
{
}
void EmptyFrameLoaderClient::dispatchDidReachVisuallyNonEmptyState()
{
}
LocalFrame* EmptyFrameLoaderClient::dispatchCreatePage(const NavigationAction&, NewFrameOpenerPolicy)
{
return nullptr;
}
void EmptyFrameLoaderClient::dispatchShow()
{
}
void EmptyFrameLoaderClient::dispatchDecidePolicyForResponse(const ResourceResponse&, const ResourceRequest&, const String&, FramePolicyFunction&&)
{
}
void EmptyFrameLoaderClient::cancelPolicyCheck()
{
}
void EmptyFrameLoaderClient::dispatchUnableToImplementPolicy(const ResourceError&)
{
}
void EmptyFrameLoaderClient::revertToProvisionalState(DocumentLoader*)
{
}
void EmptyFrameLoaderClient::setMainDocumentError(DocumentLoader*, const ResourceError&)
{
}
void EmptyFrameLoaderClient::setMainFrameDocumentReady(bool)
{
}
void EmptyFrameLoaderClient::startDownload(const ResourceRequest&, const String&, FromDownloadAttribute)
{
}
void EmptyFrameLoaderClient::willChangeTitle(DocumentLoader*)
{
}
void EmptyFrameLoaderClient::didChangeTitle(DocumentLoader*)
{
}
void EmptyFrameLoaderClient::willReplaceMultipartContent()
{
}
void EmptyFrameLoaderClient::didReplaceMultipartContent()
{
}
void EmptyFrameLoaderClient::committedLoad(DocumentLoader*, const SharedBuffer&)
{
}
void EmptyFrameLoaderClient::finishedLoading(DocumentLoader*)
{
}
bool EmptyFrameLoaderClient::shouldFallBack(const ResourceError&) const
{
return false;
}
void EmptyFrameLoaderClient::loadStorageAccessQuirksIfNeeded()
{
}
bool EmptyFrameLoaderClient::canHandleRequest(const ResourceRequest&) const
{
return false;
}
bool EmptyFrameLoaderClient::canShowMIMEType(const String&) const
{
return false;
}
bool EmptyFrameLoaderClient::canShowMIMETypeAsHTML(const String&) const
{
return false;
}
bool EmptyFrameLoaderClient::representationExistsForURLScheme(StringView) const
{
return false;
}
String EmptyFrameLoaderClient::generatedMIMETypeForURLScheme(StringView) const
{
return emptyString();
}
void EmptyFrameLoaderClient::frameLoadCompleted()
{
}
void EmptyFrameLoaderClient::restoreViewState()
{
}
void EmptyFrameLoaderClient::provisionalLoadStarted()
{
}
void EmptyFrameLoaderClient::didFinishLoad()
{
}
void EmptyFrameLoaderClient::prepareForDataSourceReplacement()
{
}
void EmptyFrameLoaderClient::updateCachedDocumentLoader(DocumentLoader&)
{
}
void EmptyFrameLoaderClient::setTitle(const StringWithDirection&, const URL&)
{
}
String EmptyFrameLoaderClient::userAgent(const URL&) const
{
return emptyString();
}
void EmptyFrameLoaderClient::savePlatformDataToCachedFrame(CachedFrame*)
{
}
void EmptyFrameLoaderClient::transitionToCommittedFromCachedFrame(CachedFrame*)
{
}
#if PLATFORM(IOS_FAMILY)
void EmptyFrameLoaderClient::didRestoreFrameHierarchyForCachedFrame()
{
}
#endif
void EmptyFrameLoaderClient::transitionToCommittedForNewPage(InitializingIframe)
{
}
void EmptyFrameLoaderClient::didRestoreFromBackForwardCache()
{
}
void EmptyFrameLoaderClient::updateGlobalHistory()
{
}
void EmptyFrameLoaderClient::updateGlobalHistoryRedirectLinks()
{
}
ShouldGoToHistoryItem EmptyFrameLoaderClient::shouldGoToHistoryItem(HistoryItem&, IsSameDocumentNavigation, ProcessSwapDisposition) const
{
return ShouldGoToHistoryItem::No;
}
bool EmptyFrameLoaderClient::supportsAsyncShouldGoToHistoryItem() const
{
return false;
}
void EmptyFrameLoaderClient::shouldGoToHistoryItemAsync(HistoryItem&, CompletionHandler<void(ShouldGoToHistoryItem)>&&) const
{
RELEASE_ASSERT_NOT_REACHED();
}
void EmptyFrameLoaderClient::saveViewStateToItem(HistoryItem&)
{
}
bool EmptyFrameLoaderClient::canCachePage() const
{
return false;
}
ObjectContentType EmptyFrameLoaderClient::objectContentType(const URL&, const String&)
{
return ObjectContentType::None;
}
AtomString EmptyFrameLoaderClient::overrideMediaType() const
{
return nullAtom();
}
void EmptyFrameLoaderClient::redirectDataToPlugin(Widget&)
{
}
void EmptyFrameLoaderClient::dispatchDidClearWindowObjectInWorld(DOMWrapperWorld&)
{
}
#if PLATFORM(COCOA)
RemoteAXObjectRef EmptyFrameLoaderClient::accessibilityRemoteObject()
{
return nullptr;
}
IntPoint EmptyFrameLoaderClient::accessibilityRemoteFrameOffset()
{
return { };
}
#if ENABLE(ACCESSIBILITY_ISOLATED_TREE)
void EmptyFrameLoaderClient::setIsolatedTree(Ref<WebCore::AXIsolatedTree>&&)
{
}
RefPtr<WebCore::AXIsolatedTree> EmptyFrameLoaderClient::isolatedTree() const
{
return nullptr;
}
#endif
void EmptyFrameLoaderClient::willCacheResponse(DocumentLoader*, ResourceLoaderIdentifier, NSCachedURLResponse *response, CompletionHandler<void(NSCachedURLResponse *)>&& completionHandler) const
{
completionHandler(response);
}
#endif
bool EmptyFrameLoaderClient::isEmptyFrameLoaderClient() const
{
return true;
}
void EmptyFrameLoaderClient::prefetchDNS(const String&)
{
}
RefPtr<HistoryItem> EmptyFrameLoaderClient::createHistoryItemTree(bool, BackForwardItemIdentifier) const
{
return nullptr;
}
#if USE(QUICK_LOOK)
RefPtr<LegacyPreviewLoaderClient> EmptyFrameLoaderClient::createPreviewLoaderClient(const String&, const String&)
{
return nullptr;
}
#endif
bool EmptyFrameLoaderClient::hasFrameSpecificStorageAccess()
{
return false;
}
void EmptyFrameLoaderClient::revokeFrameSpecificStorageAccess()
{
}
void EmptyFrameLoaderClient::dispatchLoadEventToOwnerElementInAnotherProcess()
{
}
inline EmptyFrameNetworkingContext::EmptyFrameNetworkingContext()
: FrameNetworkingContext { nullptr }
{
}
Ref<FrameNetworkingContext> EmptyFrameLoaderClient::createNetworkingContext()
{
return EmptyFrameNetworkingContext::create();
}
void EmptyFrameLoaderClient::sendH2Ping(const URL& url, CompletionHandler<void(Expected<Seconds, ResourceError>&&)>&& completionHandler)
{
ASSERT_NOT_REACHED();
completionHandler(makeUnexpected(internalError(url)));
}
void EmptyEditorClient::EmptyTextCheckerClient::requestCheckingOfString(TextCheckingRequest&, const VisibleSelection&)
{
}
void EmptyEditorClient::EmptyTextCheckerClient::requestExtendedCheckingOfString(TextCheckingRequest&, const VisibleSelection&)
{
}
void EmptyEditorClient::registerUndoStep(UndoStep&)
{
}
void EmptyEditorClient::registerRedoStep(UndoStep&)
{
}
RefPtr<StorageNamespace> EmptyStorageNamespaceProvider::sessionStorageNamespace(const SecurityOrigin&, Page& page, ShouldCreateNamespace)
{
return adoptRef(*new EmptyStorageNamespace { page.sessionID() });
}
Ref<StorageNamespace> EmptyStorageNamespaceProvider::createLocalStorageNamespace(unsigned, PAL::SessionID sessionID)
{
return adoptRef(*new EmptyStorageNamespace { sessionID });
}
Ref<StorageNamespace> EmptyStorageNamespaceProvider::createTransientLocalStorageNamespace(SecurityOrigin&, unsigned, PAL::SessionID sessionID)
{
return adoptRef(*new EmptyStorageNamespace { sessionID });
}
class EmptyStorageSessionProvider final : public StorageSessionProvider {
NetworkStorageSession* storageSession() const final { return nullptr; }
};
class EmptyBroadcastChannelRegistry final : public BroadcastChannelRegistry {
public:
static Ref<EmptyBroadcastChannelRegistry> create()
{
return adoptRef(*new EmptyBroadcastChannelRegistry);
}
private:
EmptyBroadcastChannelRegistry() = default;
void registerChannel(const PartitionedSecurityOrigin&, const String&, BroadcastChannelIdentifier) final { }
void unregisterChannel(const PartitionedSecurityOrigin&, const String&, BroadcastChannelIdentifier) final { }
void postMessage(const PartitionedSecurityOrigin&, const String&, BroadcastChannelIdentifier, Ref<SerializedScriptValue>&&, CompletionHandler<void()>&&) final { }
};
class EmptySocketProvider final : public SocketProvider {
public:
RefPtr<ThreadableWebSocketChannel> createWebSocketChannel(Document&, WebSocketChannelClient&) final { return nullptr; }
std::pair<RefPtr<WebTransportSession>, Ref<WebTransportSessionPromise>> initializeWebTransportSession(ScriptExecutionContext&, WebTransportSessionClient&, const URL&, const WebTransportOptions&) { return { nullptr, WebTransportSessionPromise::createAndReject() }; }
#if USE(LIBRICE)
RefPtr<WebCore::RiceBackend> createRiceBackend(WebCore::RiceBackendClient&) final { return nullptr; }
#endif
};
class EmptyHistoryItemClient final : public HistoryItemClient {
public:
static Ref<EmptyHistoryItemClient> create() { return adoptRef(*new EmptyHistoryItemClient); }
private:
void historyItemChanged(const HistoryItem&) { }
void clearChildren(const HistoryItem&) const { }
};
PageConfiguration pageConfigurationWithEmptyClients(std::optional<PageIdentifier> identifier, PAL::SessionID sessionID)
{
PageConfiguration pageConfiguration {
identifier,
sessionID,
makeUniqueRef<EmptyEditorClient>(),
adoptRef(*new EmptySocketProvider),
WebRTCProvider::create(),
CacheStorageProvider::create(),
adoptRef(*new EmptyUserContentProvider),
adoptRef(*new EmptyBackForwardClient),
CookieJar::create(adoptRef(*new EmptyStorageSessionProvider)),
makeUniqueRef<EmptyProgressTrackerClient>(),
PageConfiguration::LocalMainFrameCreationParameters {
CompletionHandler<UniqueRef<LocalFrameLoaderClient>(LocalFrame&, FrameLoader&)> { [] (auto&, auto& frameLoader) {
return makeUniqueRefWithoutRefCountedCheck<EmptyFrameLoaderClient>(frameLoader);
} },
SandboxFlags::all(),
ReferrerPolicy::EmptyString
},
generateFrameIdentifier(),
nullptr,
makeUniqueRef<DummySpeechRecognitionProvider>(),
EmptyBroadcastChannelRegistry::create(),
makeUniqueRef<DummyStorageProvider>(),
DummyModelPlayerProvider::create(),
EmptyBadgeClient::create(),
EmptyHistoryItemClient::create(),
#if ENABLE(CONTEXT_MENUS)
makeUniqueRef<EmptyContextMenuClient>(),
#endif
#if ENABLE(APPLE_PAY)
EmptyPaymentCoordinatorClient::create(),
#endif
makeUniqueRef<EmptyChromeClient>(),
makeUniqueRef<EmptyCryptoClient>(),
makeUniqueRef<DocumentSyncClient>()
#if ENABLE(WEB_AUTHN)
, EmptyCredentialRequestCoordinatorClient::create()
#endif
};
#if ENABLE(DRAG_SUPPORT)
pageConfiguration.dragClient = makeUnique<EmptyDragClient>();
#endif
pageConfiguration.inspectorBackendClient = makeUnique<EmptyInspectorBackendClient>();
pageConfiguration.diagnosticLoggingClient = makeUnique<EmptyDiagnosticLoggingClient>();
pageConfiguration.databaseProvider = adoptRef(*new EmptyDatabaseProvider);
pageConfiguration.pluginInfoProvider = adoptRef(*new EmptyPluginInfoProvider);
pageConfiguration.storageNamespaceProvider = adoptRef(*new EmptyStorageNamespaceProvider);
pageConfiguration.visitedLinkStore = adoptRef(*new EmptyVisitedLinkStore);
#if ENABLE(ATTACHMENT_ELEMENT)
pageConfiguration.attachmentElementClient = makeUnique<EmptyAttachmentElementClient>();
#endif
return pageConfiguration;
}
DiagnosticLoggingClient& emptyDiagnosticLoggingClient()
{
static NeverDestroyed<EmptyDiagnosticLoggingClient> client;
return client;
}
}