/* * Copyright (C) 2006 Eric Seidel * Copyright (C) 2008, 2009, 2012 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 "ApplicationCacheStorage.h" #include "ColorChooser.h" #include "DatabaseProvider.h" #include "DocumentLoader.h" #include "FileChooser.h" #include "FormState.h" #include "Frame.h" #include "FrameNetworkingContext.h" #include "HTMLFormElement.h" #include "InProcessIDBServer.h" #include "PageConfiguration.h" #include "StorageArea.h" #include "StorageNamespace.h" #include "StorageNamespaceProvider.h" #include #if USE(APPLE_INTERNAL_SDK) #include #endif namespace WebCore { class EmptyDatabaseProvider final : public DatabaseProvider { #if ENABLE(INDEXED_DATABASE) virtual IDBClient::IDBConnectionToServer& idbConnectionToServerForSession(const SessionID&) { static NeverDestroyed> sharedConnection(InProcessIDBServer::create()); return sharedConnection.get()->connectionToServer(); } #endif }; class EmptyStorageNamespaceProvider final : public StorageNamespaceProvider { struct EmptyStorageArea : public StorageArea { virtual unsigned length() override { return 0; } virtual String key(unsigned) override { return String(); } virtual String item(const String&) override { return String(); } virtual void setItem(Frame*, const String&, const String&, bool&) override { } virtual void removeItem(Frame*, const String&) override { } virtual void clear(Frame*) override { } virtual bool contains(const String&) override { return false; } virtual bool canAccessStorage(Frame*) override { return false; } virtual StorageType storageType() const override { return LocalStorage; } virtual size_t memoryBytesUsedByCache() override { return 0; } SecurityOrigin& securityOrigin() override { return SecurityOrigin::createUnique(); } }; struct EmptyStorageNamespace final : public StorageNamespace { virtual RefPtr storageArea(RefPtr&&) override { return adoptRef(new EmptyStorageArea); } virtual RefPtr copy(Page*) override { return adoptRef(new EmptyStorageNamespace); } }; virtual RefPtr createSessionStorageNamespace(Page&, unsigned) override { return adoptRef(new EmptyStorageNamespace); } virtual RefPtr createLocalStorageNamespace(unsigned) override { return adoptRef(new EmptyStorageNamespace); } virtual RefPtr createTransientLocalStorageNamespace(SecurityOrigin&, unsigned) override { return adoptRef(new EmptyStorageNamespace); } }; class EmptyVisitedLinkStore : public VisitedLinkStore { virtual bool isLinkVisited(Page&, LinkHash, const URL&, const AtomicString&) override { return false; } virtual void addVisitedLink(Page&, LinkHash) override { } }; void fillWithEmptyClients(PageConfiguration& pageConfiguration) { static NeverDestroyed dummyChromeClient; pageConfiguration.chromeClient = &dummyChromeClient.get(); #if ENABLE(CONTEXT_MENUS) static NeverDestroyed dummyContextMenuClient; pageConfiguration.contextMenuClient = &dummyContextMenuClient.get(); #endif #if ENABLE(DRAG_SUPPORT) static NeverDestroyed dummyDragClient; pageConfiguration.dragClient = &dummyDragClient.get(); #endif static NeverDestroyed dummyEditorClient; pageConfiguration.editorClient = &dummyEditorClient.get(); static NeverDestroyed dummyInspectorClient; pageConfiguration.inspectorClient = &dummyInspectorClient.get(); static NeverDestroyed dummyFrameLoaderClient; pageConfiguration.loaderClientForMainFrame = &dummyFrameLoaderClient.get(); static NeverDestroyed dummyProgressTrackerClient; pageConfiguration.progressTrackerClient = &dummyProgressTrackerClient.get(); static NeverDestroyed dummyDiagnosticLoggingClient; pageConfiguration.diagnosticLoggingClient = &dummyDiagnosticLoggingClient.get(); pageConfiguration.applicationCacheStorage = ApplicationCacheStorage::create(String(), String()); pageConfiguration.databaseProvider = adoptRef(new EmptyDatabaseProvider); pageConfiguration.storageNamespaceProvider = adoptRef(new EmptyStorageNamespaceProvider); pageConfiguration.visitedLinkStore = adoptRef(new EmptyVisitedLinkStore); #if USE(APPLE_INTERNAL_SDK) #include #endif } class EmptyPopupMenu : public PopupMenu { public: virtual void show(const IntRect&, FrameView*, int) { } virtual void hide() { } virtual void updateFromElement() { } virtual void disconnectClient() { } }; class EmptySearchPopupMenu : public SearchPopupMenu { public: virtual PopupMenu* popupMenu() { return m_popup.get(); } virtual void saveRecentSearches(const AtomicString&, const Vector&) { } virtual void loadRecentSearches(const AtomicString&, Vector&) { } virtual bool enabled() { return false; } private: RefPtr m_popup; }; RefPtr EmptyChromeClient::createPopupMenu(PopupMenuClient*) const { return adoptRef(new EmptyPopupMenu()); } RefPtr EmptyChromeClient::createSearchPopupMenu(PopupMenuClient*) const { return adoptRef(new EmptySearchPopupMenu()); } #if ENABLE(INPUT_TYPE_COLOR) std::unique_ptr EmptyChromeClient::createColorChooser(ColorChooserClient*, const Color&) { return nullptr; } #endif void EmptyChromeClient::runOpenPanel(Frame*, PassRefPtr) { } void EmptyFrameLoaderClient::dispatchDecidePolicyForNewWindowAction(const NavigationAction&, const ResourceRequest&, PassRefPtr, const String&, FramePolicyFunction) { } void EmptyFrameLoaderClient::dispatchDecidePolicyForNavigationAction(const NavigationAction&, const ResourceRequest&, PassRefPtr, FramePolicyFunction) { } void EmptyFrameLoaderClient::dispatchWillSendSubmitEvent(PassRefPtr) { } void EmptyFrameLoaderClient::dispatchWillSubmitForm(PassRefPtr, FramePolicyFunction) { } Ref EmptyFrameLoaderClient::createDocumentLoader(const ResourceRequest& request, const SubstituteData& substituteData) { return DocumentLoader::create(request, substituteData); } RefPtr EmptyFrameLoaderClient::createFrame(const URL&, const String&, HTMLFrameOwnerElement*, const String&, bool, int, int) { return nullptr; } RefPtr EmptyFrameLoaderClient::createPlugin(const IntSize&, HTMLPlugInElement*, const URL&, const Vector&, const Vector&, const String&, bool) { return nullptr; } void EmptyFrameLoaderClient::recreatePlugin(Widget*) { } PassRefPtr EmptyFrameLoaderClient::createJavaAppletWidget(const IntSize&, HTMLAppletElement*, const URL&, const Vector&, const Vector&) { return nullptr; } PassRefPtr EmptyFrameLoaderClient::createNetworkingContext() { return PassRefPtr(); } void EmptyTextCheckerClient::requestCheckingOfString(PassRefPtr) { } void EmptyEditorClient::registerUndoStep(PassRefPtr) { } void EmptyEditorClient::registerRedoStep(PassRefPtr) { } }