haikuwebkit/Source/WebCore/storage/StorageQuotaManager.h

77 lines
3.2 KiB
C
Raw Permalink Normal View History

Introduce a quota manager for Cache API/Service Worker/IDB storage https://bugs.webkit.org/show_bug.cgi?id=195283 Reviewed by Chris Dumez. Source/WebCore: Introduce a generic quota manager and quota users to be used in Network Process. Quota manager/users are scoped by client origin. Quota manager is used to check for quota by an entity wanting to execute a storage task of a given taskSize. Quota manager will check the current space used by all its quota users. If the size + taskSize is above quota, it will call a function to try extend the quota. In the meantime, the task (and all tasks that may be added) are queued. Once the new quota is received, the quota manager will either allow or disallow the first task in the queue. The quota manager will try to execute as many tasks as possible with the provided quota. If some tasks are remaining and quota limit is hit, the quota manager will compute the space needed for all remaining requests and do another quota extension request. * Sources.txt: * WebCore.xcodeproj/project.pbxproj: * page/ClientOrigin.h: * storage/StorageQuotaManager.cpp: Added. (WebCore::StorageQuotaManager::~StorageQuotaManager): (WebCore::StorageQuotaManager::spaceUsage const): (WebCore::StorageQuotaManager::requestSpace): (WebCore::StorageQuotaManager::askForMoreSpace): (WebCore::StorageQuotaManager::processPendingRequests): * storage/StorageQuotaManager.h: Added. (WebCore::StorageQuotaManager::StorageQuotaManager): (WebCore::StorageQuotaManager::addUser): (WebCore::StorageQuotaManager::removeUser): * storage/StorageQuotaUser.h: Added. Source/WebKit: Remove quota handling from Cache API storage and use StorageQuotaManager/StorageQuotaUser. CacheStorage::Caches becomes a quota user and has a StorageQuotaManager to check for space for any cache API write task. NetworkProcess is responsible to manage the quota managers. Quota managers will go through network process to ask UIProcess for quota extension. Remove pending callback handling from CacheStorage since they are queued in QuotaManager now. * NetworkProcess/NetworkProcess.cpp: (WebKit::NetworkProcess::~NetworkProcess): (WebKit::NetworkProcess::destroySession): (WebKit::NetworkProcess::cacheStorageRootPath): (WebKit::NetworkProcess::setCacheStorageParameters): (WebKit::NetworkProcess::storageQuotaManager): * NetworkProcess/NetworkProcess.h: * NetworkProcess/cache/CacheStorageEngine.cpp: (WebKit::CacheStorage::Engine::from): (WebKit::CacheStorage::Engine::Engine): (WebKit::CacheStorage::Engine::readCachesFromDisk): * NetworkProcess/cache/CacheStorageEngine.h: * NetworkProcess/cache/CacheStorageEngineCache.cpp: (WebKit::CacheStorage::Cache::put): * NetworkProcess/cache/CacheStorageEngineCache.h: * NetworkProcess/cache/CacheStorageEngineCaches.cpp: (WebKit::CacheStorage::Caches::Caches): (WebKit::CacheStorage::Caches::~Caches): (WebKit::CacheStorage::Caches::requestSpace): (WebKit::CacheStorage::Caches::writeRecord): * NetworkProcess/cache/CacheStorageEngineCaches.h: Canonical link: https://commits.webkit.org/209739@main git-svn-id: https://svn.webkit.org/repository/webkit/trunk@242599 268f45cc-cd09-0410-ab3c-d52691b4dbfc
2019-03-07 17:40:40 +00:00
/*
* Copyright (C) 2019 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. ``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.
*/
#pragma once
#include <wtf/CompletionHandler.h>
#include <wtf/Deque.h>
Drop CheckedLock / CheckedCondition aliases https://bugs.webkit.org/show_bug.cgi?id=226176 Reviewed by Kate Cheney. Drop CheckedLock / CheckedCondition aliases now that they are the default. Source/JavaScriptCore: * API/JSVirtualMachine.mm: * API/glib/JSCVirtualMachine.cpp: * assembler/PerfLog.h: * assembler/testmasm.cpp: * bytecode/StructureStubInfo.h: * bytecode/SuperSampler.cpp: * dfg/DFGCommon.cpp: * dfg/DFGCommonData.cpp: * dfg/DFGPlan.h: * dfg/DFGThreadData.h: * dfg/DFGWorklist.cpp: (JSC::DFG::Worklist::Worklist): * dfg/DFGWorklist.h: * disassembler/Disassembler.cpp: * dynbench.cpp: * heap/BlockDirectory.cpp: (JSC::BlockDirectory::parallelNotEmptyBlockSource): * heap/BlockDirectory.h: (JSC::BlockDirectory::bitvectorLock): * heap/CodeBlockSet.h: (JSC::CodeBlockSet::getLock): * heap/Heap.cpp: (JSC::Heap::Heap): * heap/Heap.h: * heap/IsoSubspacePerVM.h: * heap/MarkedSpace.h: (JSC::MarkedSpace::directoryLock): * heap/MarkingConstraintSolver.h: * heap/SlotVisitor.cpp: (JSC::SlotVisitor::donateKnownParallel): * heap/SlotVisitor.h: * inspector/remote/socket/RemoteInspectorConnectionClient.h: * inspector/remote/socket/RemoteInspectorSocketEndpoint.h: * jit/ExecutableAllocator.cpp: (JSC::ExecutableAllocator::getLock const): (JSC::dumpJITMemory): * jit/ExecutableAllocator.h: (JSC::ExecutableAllocatorBase::getLock const): * jit/JITWorklist.cpp: (JSC::JITWorklist::JITWorklist): * jit/JITWorklist.h: * jsc.cpp: * profiler/ProfilerDatabase.h: * runtime/ConcurrentJSLock.h: * runtime/DeferredWorkTimer.h: * runtime/JSLock.h: * runtime/SamplingProfiler.cpp: (JSC::FrameWalker::FrameWalker): (JSC::CFrameWalker::CFrameWalker): (JSC::SamplingProfiler::takeSample): * runtime/SamplingProfiler.h: (JSC::SamplingProfiler::getLock): * runtime/VM.h: * runtime/VMTraps.cpp: (JSC::VMTraps::invalidateCodeBlocksOnStack): (JSC::VMTraps::VMTraps): * runtime/VMTraps.h: * tools/FunctionOverrides.h: * tools/VMInspector.cpp: (JSC::ensureIsSafeToLock): * tools/VMInspector.h: (JSC::VMInspector::getLock): * wasm/WasmCalleeRegistry.h: (JSC::Wasm::CalleeRegistry::getLock): * wasm/WasmPlan.h: * wasm/WasmStreamingCompiler.h: * wasm/WasmThunks.h: * wasm/WasmWorklist.cpp: (JSC::Wasm::Worklist::Worklist): * wasm/WasmWorklist.h: Source/WebCore: * Modules/indexeddb/IDBObjectStore.h: * Modules/indexeddb/IDBTransaction.h: * Modules/indexeddb/client/IDBConnectionProxy.h: * Modules/indexeddb/server/IDBSerializationContext.cpp: * Modules/indexeddb/server/IDBServer.cpp: * Modules/mediastream/RTCDataChannel.cpp: * Modules/mediastream/RTCRtpSFrameTransformer.h: * Modules/mediastream/RTCRtpScriptTransform.h: * Modules/mediastream/libwebrtc/LibWebRTCDataChannelHandler.h: * Modules/mediastream/libwebrtc/LibWebRTCRtpTransformBackend.h: * Modules/speech/SpeechRecognitionCaptureSourceImpl.h: * Modules/webaudio/AudioParamTimeline.h: * Modules/webaudio/MediaElementAudioSourceNode.h: * Modules/webdatabase/Database.cpp: * Modules/webdatabase/Database.h: * Modules/webdatabase/DatabaseManager.h: * Modules/webdatabase/DatabaseTask.h: * Modules/webdatabase/DatabaseThread.h: * Modules/webdatabase/DatabaseTracker.cpp: (WebCore::DatabaseTracker::openDatabaseMutex): * Modules/webdatabase/DatabaseTracker.h: * Modules/webdatabase/OriginLock.cpp: * Modules/webdatabase/SQLCallbackWrapper.h: * Modules/webdatabase/SQLTransaction.h: * Modules/webgpu/WebGPUDevice.cpp: (WebCore::WebGPUDevice::instancesLock): * Modules/webgpu/WebGPUDevice.h: * Modules/webgpu/WebGPUPipeline.cpp: (WebCore::WebGPUPipeline::instancesLock): * Modules/webgpu/WebGPUPipeline.h: * Modules/websockets/WebSocket.cpp: (WebCore::WebSocket::allActiveWebSocketsLock): * Modules/websockets/WebSocket.h: * accessibility/isolatedtree/AXIsolatedTree.cpp: * accessibility/isolatedtree/AXIsolatedTree.h: * bindings/js/JSDOMGlobalObject.h: * bridge/objc/WebScriptObject.mm: * crypto/CryptoAlgorithmRegistry.h: * dom/MessagePort.cpp: * dom/Node.cpp: * dom/ScriptExecutionContext.cpp: * html/HTMLMediaElement.cpp: (WebCore::HTMLMediaElement::createMediaPlayer): * html/canvas/CanvasRenderingContext.cpp: (WebCore::CanvasRenderingContext::instancesLock): * html/canvas/CanvasRenderingContext.h: * html/canvas/WebGLContextGroup.cpp: (WebCore::WebGLContextGroup::objectGraphLockForAContext): * html/canvas/WebGLContextGroup.h: * html/canvas/WebGLContextObject.cpp: (WebCore::WebGLContextObject::objectGraphLockForContext): * html/canvas/WebGLContextObject.h: * html/canvas/WebGLObject.h: * html/canvas/WebGLProgram.cpp: (WebCore::WebGLProgram::instancesLock): * html/canvas/WebGLProgram.h: * html/canvas/WebGLRenderingContextBase.cpp: (WebCore::WebGLRenderingContextBase::objectGraphLock): * html/canvas/WebGLRenderingContextBase.h: * html/canvas/WebGLSharedObject.cpp: (WebCore::WebGLSharedObject::objectGraphLockForContext): * html/canvas/WebGLSharedObject.h: * inspector/agents/WebHeapAgent.cpp: * page/ResourceUsageThread.h: * page/SecurityPolicy.cpp: * page/WheelEventTestMonitor.h: * page/scrolling/ScrollingTree.h: (WebCore::ScrollingTree::WTF_RETURNS_LOCK): * page/scrolling/ScrollingTreeLatchingController.h: * page/scrolling/ThreadedScrollingTree.h: (WebCore::ThreadedScrollingTree::WTF_RETURNS_LOCK): * page/scrolling/mac/ScrollingTreeMac.h: * platform/AbortableTaskQueue.h: * platform/GenericTaskQueue.cpp: * platform/GenericTaskQueue.h: * platform/LegacySchemeRegistry.cpp: * platform/audio/AudioDestination.h: * platform/audio/HRTFDatabaseLoader.h: * platform/audio/ReverbConvolver.cpp: (WebCore::ReverbConvolver::backgroundThreadEntry): * platform/audio/cocoa/AudioDestinationCocoa.h: * platform/audio/gstreamer/AudioSourceProviderGStreamer.h: * platform/audio/gstreamer/WebKitWebAudioSourceGStreamer.cpp: * platform/audio/mac/FFTFrameMac.cpp: * platform/encryptedmedia/CDMProxy.h: * platform/graphics/MediaPlayer.cpp: * platform/graphics/ShadowBlur.cpp: (WebCore::ScratchBuffer::lock): (WebCore::ShadowBlur::drawRectShadowWithTiling): (WebCore::ShadowBlur::drawInsetShadowWithTiling): * platform/graphics/avfoundation/MediaPlayerPrivateAVFoundation.h: * platform/graphics/avfoundation/cf/MediaPlayerPrivateAVFoundationCF.cpp: * platform/graphics/avfoundation/objc/MediaPlayerPrivateMediaStreamAVFObjC.h: * platform/graphics/ca/cocoa/PlatformCALayerCocoa.mm: * platform/graphics/cg/IOSurfacePool.h: * platform/graphics/cg/SubimageCacheWithTimer.h: * platform/graphics/cocoa/FontCacheCoreText.cpp: * platform/graphics/gstreamer/ImageDecoderGStreamer.h: * platform/graphics/gstreamer/MainThreadNotifier.h: * platform/graphics/gstreamer/MediaPlayerPrivateGStreamer.h: * platform/graphics/gstreamer/VideoSinkGStreamer.cpp: * platform/graphics/gstreamer/WebKitWebSourceGStreamer.cpp: * platform/graphics/gstreamer/eme/WebKitCommonEncryptionDecryptorGStreamer.cpp: * platform/graphics/gstreamer/mse/WebKitMediaSourceGStreamer.cpp: * platform/graphics/texmap/TextureMapperPlatformLayerProxy.h: (WebCore::TextureMapperPlatformLayerProxy::WTF_RETURNS_LOCK): * platform/image-decoders/ScalableImageDecoder.h: * platform/ios/QuickLook.mm: * platform/ios/WebSQLiteDatabaseTrackerClient.mm: * platform/ios/wak/WebCoreThreadRun.cpp: * platform/mediarecorder/MediaRecorderPrivateMock.h: * platform/mediarecorder/cocoa/MediaRecorderPrivateWriterCocoa.h: * platform/mediastream/RealtimeMediaSource.h: * platform/mediastream/RealtimeOutgoingAudioSource.h: * platform/mediastream/RealtimeOutgoingVideoSource.h: * platform/mediastream/cocoa/AudioMediaStreamTrackRendererUnit.h: * platform/mediastream/gstreamer/RealtimeOutgoingAudioSourceLibWebRTC.h: * platform/network/cf/LoaderRunLoopCF.cpp: (WebCore::loaderRunLoop): * platform/network/cocoa/WebCoreNSURLSession.mm: * platform/network/mac/UTIUtilities.mm: * platform/network/mac/WebCoreResourceHandleAsOperationQueueDelegate.h: * platform/sql/SQLiteDatabase.cpp: * platform/sql/SQLiteDatabase.h: * platform/sql/SQLiteDatabaseTracker.cpp: * platform/text/TextEncodingRegistry.cpp: * storage/StorageQuotaManager.h: * workers/WorkerGlobalScope.cpp: * workers/WorkerOrWorkletScriptController.h: * workers/WorkerOrWorkletThread.cpp: (WebCore::WorkerOrWorkletThread::workerOrWorkletThreadsLock): * workers/WorkerOrWorkletThread.h: * worklets/PaintWorkletGlobalScope.h: Source/WebKit: * GPUProcess/graphics/RemoteGraphicsContextGL.cpp: (WebKit::RemoteGraphicsContextGL::paintPixelBufferToImageBuffer): * GPUProcess/webrtc/LibWebRTCCodecsProxy.h: * NetworkProcess/Classifier/WebResourceLoadStatisticsStore.cpp: * NetworkProcess/Classifier/WebResourceLoadStatisticsStore.h: * NetworkProcess/CustomProtocols/LegacyCustomProtocolManager.h: * NetworkProcess/IndexedDB/WebIDBServer.cpp: * NetworkProcess/NetworkProcess.h: * NetworkProcess/WebStorage/StorageManagerSet.h: * NetworkProcess/cache/NetworkCacheStorage.cpp: * NetworkProcess/cocoa/LaunchServicesDatabaseObserver.h: * NetworkProcess/glib/DNSCache.h: * Platform/IPC/Connection.cpp: * Platform/IPC/Connection.h: * Platform/IPC/StreamConnectionWorkQueue.h: * Platform/IPC/StreamServerConnection.h: * Shared/BlockingResponseMap.h: * Shared/Cocoa/XPCEndpointClient.h: * Shared/CoordinatedGraphics/threadedcompositor/CompositingRunLoop.h: * Shared/mac/MediaFormatReader/MediaFormatReader.h: * Shared/mac/MediaFormatReader/MediaSampleCursor.h: * Shared/mac/MediaFormatReader/MediaTrackReader.h: * UIProcess/API/glib/IconDatabase.h: * UIProcess/WebURLSchemeTask.h: * UIProcess/mac/DisplayLink.h: * UIProcess/mac/WKPrintingView.mm: (-[WKPrintingView knowsPageRange:]): * WebProcess/GPU/graphics/RemoteImageBufferProxy.h: * WebProcess/GPU/webrtc/LibWebRTCCodecs.h: * WebProcess/Network/WebSocketStream.cpp: * WebProcess/Plugins/PluginProcessConnectionManager.h: * WebProcess/WebPage/EventDispatcher.h: * WebProcess/WebPage/ViewUpdateDispatcher.h: Source/WebKitLegacy: * Storage/StorageAreaSync.h: Source/WebKitLegacy/mac: * DOM/DOMInternal.mm: Source/WTF: * WTF.xcodeproj/project.pbxproj: * wtf/Assertions.cpp: * wtf/AutomaticThread.cpp: (WTF::AutomaticThreadCondition::wait): (WTF::AutomaticThreadCondition::waitFor): (WTF::AutomaticThread::AutomaticThread): * wtf/AutomaticThread.h: * wtf/CMakeLists.txt: * wtf/CheckedCondition.h: Removed. * wtf/CheckedLock.h: Removed. * wtf/Condition.h: * wtf/CrossThreadQueue.h: * wtf/CrossThreadTaskHandler.h: * wtf/CryptographicallyRandomNumber.cpp: * wtf/FastMalloc.cpp: * wtf/Forward.h: * wtf/Language.cpp: * wtf/Lock.cpp: (WTF::UncheckedLock::lockSlow): (WTF::UncheckedLock::unlockSlow): (WTF::UncheckedLock::unlockFairlySlow): (WTF::UncheckedLock::safepointSlow): * wtf/Lock.h: (WTF::WTF_ASSERTS_ACQUIRED_LOCK): * wtf/Logger.cpp: * wtf/Logger.h: (WTF::Logger::WTF_RETURNS_LOCK): * wtf/MessageQueue.h: * wtf/MetaAllocator.cpp: (WTF::MetaAllocator::release): (WTF::MetaAllocator::MetaAllocator): (WTF::MetaAllocator::allocate): (WTF::MetaAllocator::currentStatistics): * wtf/MetaAllocator.h: * wtf/OSLogPrintStream.h: * wtf/ParallelHelperPool.cpp: (WTF::ParallelHelperPool::ParallelHelperPool): * wtf/ParallelHelperPool.h: * wtf/ParallelJobsGeneric.h: * wtf/ParallelVectorIterator.h: * wtf/ReadWriteLock.h: * wtf/RecursiveLockAdapter.h: * wtf/RunLoop.h: * wtf/SynchronizedFixedQueue.h: * wtf/Threading.cpp: (WTF::Thread::allThreadsLock): * wtf/Threading.h: * wtf/TimingScope.cpp: * wtf/URL.cpp: * wtf/WTFSemaphore.h: * wtf/WorkQueue.cpp: (WTF::WorkQueue::concurrentApply): * wtf/WorkerPool.cpp: (WTF::WorkerPool::WorkerPool): * wtf/WorkerPool.h: * wtf/cf/LanguageCF.cpp: * wtf/text/AtomStringImpl.cpp: (WTF::AtomStringTableLocker::AtomStringTableLocker): * wtf/text/StringView.cpp: * wtf/threads/BinarySemaphore.h: * wtf/unicode/icu/CollatorICU.cpp: Tools: * TestWebKitAPI/CMakeLists.txt: * TestWebKitAPI/TestWebKitAPI.xcodeproj/project.pbxproj: * TestWebKitAPI/Tests/WTF/CheckedConditionTest.cpp: Removed. * TestWebKitAPI/Tests/WTF/CheckedLockTest.cpp: Removed. * TestWebKitAPI/Tests/WTF/Condition.cpp: (TestWebKitAPI::TEST): * TestWebKitAPI/Tests/WTF/Lock.cpp: (TestWebKitAPI::TEST): * TestWebKitAPI/Tests/WTF/MetaAllocator.cpp: * WebKitTestRunner/InjectedBundle/AccessibilityController.cpp: (WTR::AXThread::createThreadIfNeeded): Canonical link: https://commits.webkit.org/238085@main git-svn-id: https://svn.webkit.org/repository/webkit/trunk@277958 268f45cc-cd09-0410-ab3c-d52691b4dbfc
2021-05-24 18:29:01 +00:00
#include <wtf/Lock.h>
Introduce a quota manager for Cache API/Service Worker/IDB storage https://bugs.webkit.org/show_bug.cgi?id=195283 Reviewed by Chris Dumez. Source/WebCore: Introduce a generic quota manager and quota users to be used in Network Process. Quota manager/users are scoped by client origin. Quota manager is used to check for quota by an entity wanting to execute a storage task of a given taskSize. Quota manager will check the current space used by all its quota users. If the size + taskSize is above quota, it will call a function to try extend the quota. In the meantime, the task (and all tasks that may be added) are queued. Once the new quota is received, the quota manager will either allow or disallow the first task in the queue. The quota manager will try to execute as many tasks as possible with the provided quota. If some tasks are remaining and quota limit is hit, the quota manager will compute the space needed for all remaining requests and do another quota extension request. * Sources.txt: * WebCore.xcodeproj/project.pbxproj: * page/ClientOrigin.h: * storage/StorageQuotaManager.cpp: Added. (WebCore::StorageQuotaManager::~StorageQuotaManager): (WebCore::StorageQuotaManager::spaceUsage const): (WebCore::StorageQuotaManager::requestSpace): (WebCore::StorageQuotaManager::askForMoreSpace): (WebCore::StorageQuotaManager::processPendingRequests): * storage/StorageQuotaManager.h: Added. (WebCore::StorageQuotaManager::StorageQuotaManager): (WebCore::StorageQuotaManager::addUser): (WebCore::StorageQuotaManager::removeUser): * storage/StorageQuotaUser.h: Added. Source/WebKit: Remove quota handling from Cache API storage and use StorageQuotaManager/StorageQuotaUser. CacheStorage::Caches becomes a quota user and has a StorageQuotaManager to check for space for any cache API write task. NetworkProcess is responsible to manage the quota managers. Quota managers will go through network process to ask UIProcess for quota extension. Remove pending callback handling from CacheStorage since they are queued in QuotaManager now. * NetworkProcess/NetworkProcess.cpp: (WebKit::NetworkProcess::~NetworkProcess): (WebKit::NetworkProcess::destroySession): (WebKit::NetworkProcess::cacheStorageRootPath): (WebKit::NetworkProcess::setCacheStorageParameters): (WebKit::NetworkProcess::storageQuotaManager): * NetworkProcess/NetworkProcess.h: * NetworkProcess/cache/CacheStorageEngine.cpp: (WebKit::CacheStorage::Engine::from): (WebKit::CacheStorage::Engine::Engine): (WebKit::CacheStorage::Engine::readCachesFromDisk): * NetworkProcess/cache/CacheStorageEngine.h: * NetworkProcess/cache/CacheStorageEngineCache.cpp: (WebKit::CacheStorage::Cache::put): * NetworkProcess/cache/CacheStorageEngineCache.h: * NetworkProcess/cache/CacheStorageEngineCaches.cpp: (WebKit::CacheStorage::Caches::Caches): (WebKit::CacheStorage::Caches::~Caches): (WebKit::CacheStorage::Caches::requestSpace): (WebKit::CacheStorage::Caches::writeRecord): * NetworkProcess/cache/CacheStorageEngineCaches.h: Canonical link: https://commits.webkit.org/209739@main git-svn-id: https://svn.webkit.org/repository/webkit/trunk@242599 268f45cc-cd09-0410-ab3c-d52691b4dbfc
2019-03-07 17:40:40 +00:00
#include <wtf/WeakPtr.h>
Cross-thread version StorageQuotaManager https://bugs.webkit.org/show_bug.cgi?id=203971 <rdar://problem/57290349> Reviewed by Chris Dumez. Source/WebCore: Implement a lock-based StorageQuotaManager so that quota check can be done on different threads. If space request is made on a background thread, it needs to hold a lock until it is finished, so no request from different threads can be performed at the same time. If space request is made on the main thread, we will dispatch it to a background thread and schedule a calllback to the main thread when result is available, so the main thread will not be blocked. Covered by existing quota related tests. * Headers.cmake: * Modules/indexeddb/server/IDBServer.cpp: (WebCore::IDBServer::IDBServer::create): (WebCore::IDBServer::IDBServer::IDBServer): (WebCore::IDBServer::IDBServer::didPerformCloseAndDeleteDatabases): (WebCore::IDBServer::IDBServer::requestSpace): (WebCore::IDBServer::IDBServer::diskUsage): (WebCore::IDBServer::IDBServer::QuotaUser::QuotaUser): Deleted. (WebCore::IDBServer::IDBServer::QuotaUser::~QuotaUser): Deleted. (WebCore::IDBServer::IDBServer::QuotaUser::resetSpaceUsed): Deleted. (WebCore::IDBServer::IDBServer::QuotaUser::computeSpaceUsed): Deleted. (WebCore::IDBServer::IDBServer::QuotaUser::increaseSpaceUsed): Deleted. (WebCore::IDBServer::IDBServer::QuotaUser::decreaseSpaceUsed): Deleted. (WebCore::IDBServer::IDBServer::QuotaUser::whenInitialized): Deleted. (WebCore::IDBServer::IDBServer::QuotaUser::initializeSpaceUsed): Deleted. (WebCore::IDBServer::IDBServer::ensureQuotaUser): Deleted. (WebCore::IDBServer::IDBServer::startComputingSpaceUsedForOrigin): Deleted. (WebCore::IDBServer::IDBServer::computeSpaceUsedForOrigin): Deleted. (WebCore::IDBServer::IDBServer::finishComputingSpaceUsedForOrigin): Deleted. (WebCore::IDBServer::IDBServer::resetSpaceUsed): Deleted. (WebCore::IDBServer::IDBServer::increaseSpaceUsed): Deleted. (WebCore::IDBServer::IDBServer::decreaseSpaceUsed): Deleted. (WebCore::IDBServer::IDBServer::increasePotentialSpaceUsed): Deleted. (WebCore::IDBServer::IDBServer::decreasePotentialSpaceUsed): Deleted. * Modules/indexeddb/server/IDBServer.h: (WebCore::IDBServer::IDBServer::initializeQuotaUser): Deleted. (): Deleted. * Modules/indexeddb/server/UniqueIDBDatabase.cpp: (WebCore::IDBServer::UniqueIDBDatabase::performCurrentOpenOperation): (WebCore::IDBServer::UniqueIDBDatabase::openBackingStore): (WebCore::IDBServer::UniqueIDBDatabase::didOpenBackingStore): (WebCore::IDBServer::UniqueIDBDatabase::createObjectStore): (WebCore::IDBServer::UniqueIDBDatabase::performCreateObjectStore): (WebCore::IDBServer::UniqueIDBDatabase::didPerformCreateObjectStore): (WebCore::IDBServer::UniqueIDBDatabase::deleteObjectStore): (WebCore::IDBServer::UniqueIDBDatabase::renameObjectStore): (WebCore::IDBServer::UniqueIDBDatabase::performRenameObjectStore): (WebCore::IDBServer::UniqueIDBDatabase::didPerformRenameObjectStore): (WebCore::IDBServer::UniqueIDBDatabase::clearObjectStore): (WebCore::IDBServer::UniqueIDBDatabase::createIndex): (WebCore::IDBServer::UniqueIDBDatabase::performCreateIndex): (WebCore::IDBServer::UniqueIDBDatabase::didPerformCreateIndex): (WebCore::IDBServer::UniqueIDBDatabase::deleteIndex): (WebCore::IDBServer::UniqueIDBDatabase::renameIndex): (WebCore::IDBServer::UniqueIDBDatabase::performRenameIndex): (WebCore::IDBServer::UniqueIDBDatabase::didPerformRenameIndex): (WebCore::IDBServer::UniqueIDBDatabase::putOrAdd): (WebCore::IDBServer::UniqueIDBDatabase::performPutOrAdd): (WebCore::IDBServer::UniqueIDBDatabase::didPerformPutOrAdd): (WebCore::IDBServer::UniqueIDBDatabase::getRecord): (WebCore::IDBServer::UniqueIDBDatabase::getAllRecords): (WebCore::IDBServer::UniqueIDBDatabase::performGetRecord): (WebCore::IDBServer::UniqueIDBDatabase::performGetAllRecords): (WebCore::IDBServer::UniqueIDBDatabase::getCount): (WebCore::IDBServer::UniqueIDBDatabase::deleteRecord): (WebCore::IDBServer::UniqueIDBDatabase::openCursor): (WebCore::IDBServer::UniqueIDBDatabase::iterateCursor): (WebCore::IDBServer::UniqueIDBDatabase::commitTransaction): (WebCore::IDBServer::UniqueIDBDatabase::abortTransaction): (WebCore::IDBServer::UniqueIDBDatabase::requestSpace): Deleted. (WebCore::IDBServer::UniqueIDBDatabase::waitForRequestSpaceCompletion): Deleted. (WebCore::IDBServer::UniqueIDBDatabase::startSpaceIncreaseTask): Deleted. (WebCore::IDBServer::UniqueIDBDatabase::finishSpaceIncreaseTask): Deleted. (WebCore::IDBServer::UniqueIDBDatabase::createObjectStoreAfterQuotaCheck): Deleted. (WebCore::IDBServer::UniqueIDBDatabase::deleteObjectStoreAfterQuotaCheck): Deleted. (WebCore::IDBServer::UniqueIDBDatabase::renameObjectStoreAfterQuotaCheck): Deleted. (WebCore::IDBServer::UniqueIDBDatabase::clearObjectStoreAfetQuotaCheck): Deleted. (WebCore::IDBServer::UniqueIDBDatabase::createIndexAfterQuotaCheck): Deleted. (WebCore::IDBServer::UniqueIDBDatabase::deleteIndexAfterQuotaCheck): Deleted. (WebCore::IDBServer::UniqueIDBDatabase::renameIndexAfterQuotaCheck): Deleted. (WebCore::IDBServer::UniqueIDBDatabase::putOrAddAfterQuotaCheck): Deleted. (WebCore::IDBServer::UniqueIDBDatabase::getRecordAfterQuotaCheck): Deleted. (WebCore::IDBServer::UniqueIDBDatabase::getAllRecordsAfterQuotaCheck): Deleted. (WebCore::IDBServer::UniqueIDBDatabase::getCountAfterQuotaCheck): Deleted. (WebCore::IDBServer::UniqueIDBDatabase::deleteRecordAfterQuotaCheck): Deleted. (WebCore::IDBServer::UniqueIDBDatabase::openCursorAfterQuotaCheck): Deleted. (WebCore::IDBServer::UniqueIDBDatabase::iterateCursorAfterQuotaCheck): Deleted. (WebCore::IDBServer::UniqueIDBDatabase::commitTransactionAfterQuotaCheck): Deleted. * Modules/indexeddb/server/UniqueIDBDatabase.h: * Modules/indexeddb/server/UniqueIDBDatabaseConnection.cpp: (WebCore::IDBServer::UniqueIDBDatabaseConnection::abortTransactionWithoutCallback): * Modules/indexeddb/server/UniqueIDBDatabaseTransaction.cpp: (WebCore::IDBServer::UniqueIDBDatabaseTransaction::abort): (WebCore::IDBServer::UniqueIDBDatabaseTransaction::putOrAdd): (WebCore::IDBServer::UniqueIDBDatabaseTransaction::getRecord): (WebCore::IDBServer::UniqueIDBDatabaseTransaction::getAllRecords): (WebCore::IDBServer::UniqueIDBDatabaseTransaction::getCount): (WebCore::IDBServer::UniqueIDBDatabaseTransaction::deleteRecord): (WebCore::IDBServer::UniqueIDBDatabaseTransaction::openCursor): (WebCore::IDBServer::UniqueIDBDatabaseTransaction::iterateCursor): * Modules/indexeddb/shared/InProcessIDBServer.cpp: (WebCore::InProcessIDBServer::quotaManager): (WebCore::storageQuotaManagerSpaceRequester): (WebCore::InProcessIDBServer::InProcessIDBServer): (WebCore::storageQuotaManagerGetter): Deleted. * Modules/indexeddb/shared/InProcessIDBServer.h: * WebCore.xcodeproj/project.pbxproj: * storage/StorageQuotaManager.cpp: (WebCore::StorageQuotaManager::create): (WebCore::StorageQuotaManager::StorageQuotaManager): (WebCore::StorageQuotaManager::requestSpaceOnMainThread): (WebCore::StorageQuotaManager::requestSpaceOnBackgroundThread): (WebCore::StorageQuotaManager::tryGrantRequest): (WebCore::StorageQuotaManager::updateQuotaBasedOnUsage): (WebCore::StorageQuotaManager::resetQuotaUpdatedBasedOnUsageForTesting): (WebCore::StorageQuotaManager::resetQuotaForTesting): (WebCore::StorageQuotaManager::~StorageQuotaManager): Deleted. (WebCore::StorageQuotaManager::spaceUsage const): Deleted. (WebCore::StorageQuotaManager::updateQuotaBasedOnSpaceUsage): Deleted. (WebCore::StorageQuotaManager::initializeUsersIfNeeded): Deleted. (WebCore::StorageQuotaManager::askUserToInitialize): Deleted. (WebCore::StorageQuotaManager::addUser): Deleted. (WebCore::StorageQuotaManager::shouldAskForMoreSpace const): Deleted. (WebCore::StorageQuotaManager::removeUser): Deleted. (WebCore::StorageQuotaManager::requestSpace): Deleted. (WebCore::StorageQuotaManager::askForMoreSpace): Deleted. (WebCore::StorageQuotaManager::processPendingRequests): Deleted. * storage/StorageQuotaManager.h: (WebCore::StorageQuotaManager::defaultThirdPartyQuotaFromPerOriginQuota): (WebCore::StorageQuotaManager::StorageQuotaManager): Deleted. (WebCore::StorageQuotaManager::resetQuota): Deleted. (WebCore::StorageQuotaManager::state const): Deleted. * storage/StorageQuotaUser.h: Removed. Source/WebKit: * NetworkProcess/NetworkProcess.cpp: Introduce class SessionStorageQuotaManager to manage all StorageQuotaManagers of the same session. (WebKit::NetworkProcess::initializeNetworkProcess): (WebKit::NetworkProcess::addWebsiteDataStore): (WebKit::NetworkProcess::addSessionStorageQuotaManager): (WebKit::NetworkProcess::removeSessionStorageQuotaManager): (WebKit::NetworkProcess::destroySession): (WebKit::NetworkProcess::deleteWebsiteData): (WebKit::NetworkProcess::deleteWebsiteDataForOrigins): (WebKit::NetworkProcess::createIDBServer): (WebKit::NetworkProcess::addIndexedDatabaseSession): (WebKit::NetworkProcess::setSessionStorageQuotaManagerIDBRootPath): (WebKit::NetworkProcess::updateQuotaBasedOnSpaceUsageForTesting): (WebKit::NetworkProcess::resetQuota): (WebKit::NetworkProcess::storageQuotaManager): (WebKit::NetworkProcess::initializeStorageQuota): Deleted. (WebKit::NetworkProcess::clearStorageQuota): Deleted. (): Deleted. (WebKit::NetworkProcess::initializeQuotaUsers): Deleted. * NetworkProcess/NetworkProcess.h: (WebKit::NetworkProcess::SessionStorageQuotaManager::SessionStorageQuotaManager): (WebKit::NetworkProcess::SessionStorageQuotaManager::defaultQuota const): (WebKit::NetworkProcess::SessionStorageQuotaManager::ensureOriginStorageQuotaManager): (WebKit::NetworkProcess::SessionStorageQuotaManager::existingStorageQuotaManagers): (WebKit::NetworkProcess::SessionStorageQuotaManager::cacheRootPath const): (WebKit::NetworkProcess::SessionStorageQuotaManager::setIDBRootPath): (WebKit::NetworkProcess::SessionStorageQuotaManager::idbRootPath const): (WebKit::NetworkProcess::StorageQuotaManagers::defaultQuota const): Deleted. (WebKit::NetworkProcess::StorageQuotaManagers::setDefaultQuotas): Deleted. (WebKit::NetworkProcess::StorageQuotaManagers::managersPerOrigin): Deleted. * NetworkProcess/NetworkProcess.messages.in: * NetworkProcess/cache/CacheStorageEngine.cpp: (WebKit::CacheStorage::getDirectorySize): (WebKit::CacheStorage::Engine::diskUsage): static function to get the disk usage of CacheStorage given CacheStorage root directory. (WebKit::CacheStorage::Engine::requestSpace): (WebKit::CacheStorage::Engine::readCachesFromDisk): (WebKit::CacheStorage::Engine::writeSizeFile): (WebKit::CacheStorage::Engine::readSizeFile): (WebKit::CacheStorage::Engine::initializeQuotaUser): Deleted. * NetworkProcess/cache/CacheStorageEngine.h: * NetworkProcess/cache/CacheStorageEngineCache.cpp: (WebKit::CacheStorage::Cache::put): (WebKit::CacheStorage::Cache::remove): * NetworkProcess/cache/CacheStorageEngineCaches.cpp: (WebKit::CacheStorage::Caches::create): (WebKit::CacheStorage::Caches::Caches): (WebKit::CacheStorage::Caches::~Caches): (WebKit::CacheStorage::Caches::updateSizeFile): (WebKit::CacheStorage::Caches::initializeSize): (WebKit::CacheStorage::Caches::clear): (WebKit::CacheStorage::Caches::requestSpace): (WebKit::CacheStorage::Caches::writeRecord): (WebKit::CacheStorage::Caches::removeRecord): (WebKit::CacheStorage::Caches::whenInitialized): Deleted. (WebKit::CacheStorage::Caches::resetSpaceUsed): Deleted. * NetworkProcess/cache/CacheStorageEngineCaches.h: * Shared/WebsiteDataStoreParameters.cpp: (WebKit::WebsiteDataStoreParameters::encode const): (WebKit::WebsiteDataStoreParameters::decode): * Shared/WebsiteDataStoreParameters.h: Add a cacheStorageDirectory parameter so we know the direcotry of CacheStorage when we start using WebsiteDataStore. * UIProcess/API/C/WKWebsiteDataStoreRef.cpp: (WKWebsiteDataStoreResetQuota): * UIProcess/API/C/WKWebsiteDataStoreRef.h: Add a C API for reseting quota in TestRunner. * UIProcess/Network/NetworkProcessProxy.cpp: (WebKit::NetworkProcessProxy::resetQuota): * UIProcess/Network/NetworkProcessProxy.h: * UIProcess/WebProcessPool.cpp: (WebKit::WebProcessPool::ensureNetworkProcess): * UIProcess/WebsiteData/Cocoa/WebsiteDataStoreCocoa.mm: (WebKit::WebsiteDataStore::parameters): * UIProcess/WebsiteData/WebsiteDataStore.cpp: (WebKit::WebsiteDataStore::parameters): (WebKit::WebsiteDataStore::resetQuota): * UIProcess/WebsiteData/WebsiteDataStore.h: Tools: * TestWebKitAPI/TestWebKitAPI.xcodeproj/project.pbxproj: * TestWebKitAPI/Tests/WebCore/StorageQuotaManager.cpp: Removed as we have a different StorageQuotaManager implementation now. * WebKitTestRunner/TestController.cpp: reset StorageQuotaManager's quota between tests. (WTR::TestController::resetStateToConsistentValues): (WTR::TestController::resetQuota): * WebKitTestRunner/TestController.h: Canonical link: https://commits.webkit.org/217990@main git-svn-id: https://svn.webkit.org/repository/webkit/trunk@253025 268f45cc-cd09-0410-ab3c-d52691b4dbfc
2019-12-03 06:53:42 +00:00
#include <wtf/WorkQueue.h>
Introduce a quota manager for Cache API/Service Worker/IDB storage https://bugs.webkit.org/show_bug.cgi?id=195283 Reviewed by Chris Dumez. Source/WebCore: Introduce a generic quota manager and quota users to be used in Network Process. Quota manager/users are scoped by client origin. Quota manager is used to check for quota by an entity wanting to execute a storage task of a given taskSize. Quota manager will check the current space used by all its quota users. If the size + taskSize is above quota, it will call a function to try extend the quota. In the meantime, the task (and all tasks that may be added) are queued. Once the new quota is received, the quota manager will either allow or disallow the first task in the queue. The quota manager will try to execute as many tasks as possible with the provided quota. If some tasks are remaining and quota limit is hit, the quota manager will compute the space needed for all remaining requests and do another quota extension request. * Sources.txt: * WebCore.xcodeproj/project.pbxproj: * page/ClientOrigin.h: * storage/StorageQuotaManager.cpp: Added. (WebCore::StorageQuotaManager::~StorageQuotaManager): (WebCore::StorageQuotaManager::spaceUsage const): (WebCore::StorageQuotaManager::requestSpace): (WebCore::StorageQuotaManager::askForMoreSpace): (WebCore::StorageQuotaManager::processPendingRequests): * storage/StorageQuotaManager.h: Added. (WebCore::StorageQuotaManager::StorageQuotaManager): (WebCore::StorageQuotaManager::addUser): (WebCore::StorageQuotaManager::removeUser): * storage/StorageQuotaUser.h: Added. Source/WebKit: Remove quota handling from Cache API storage and use StorageQuotaManager/StorageQuotaUser. CacheStorage::Caches becomes a quota user and has a StorageQuotaManager to check for space for any cache API write task. NetworkProcess is responsible to manage the quota managers. Quota managers will go through network process to ask UIProcess for quota extension. Remove pending callback handling from CacheStorage since they are queued in QuotaManager now. * NetworkProcess/NetworkProcess.cpp: (WebKit::NetworkProcess::~NetworkProcess): (WebKit::NetworkProcess::destroySession): (WebKit::NetworkProcess::cacheStorageRootPath): (WebKit::NetworkProcess::setCacheStorageParameters): (WebKit::NetworkProcess::storageQuotaManager): * NetworkProcess/NetworkProcess.h: * NetworkProcess/cache/CacheStorageEngine.cpp: (WebKit::CacheStorage::Engine::from): (WebKit::CacheStorage::Engine::Engine): (WebKit::CacheStorage::Engine::readCachesFromDisk): * NetworkProcess/cache/CacheStorageEngine.h: * NetworkProcess/cache/CacheStorageEngineCache.cpp: (WebKit::CacheStorage::Cache::put): * NetworkProcess/cache/CacheStorageEngineCache.h: * NetworkProcess/cache/CacheStorageEngineCaches.cpp: (WebKit::CacheStorage::Caches::Caches): (WebKit::CacheStorage::Caches::~Caches): (WebKit::CacheStorage::Caches::requestSpace): (WebKit::CacheStorage::Caches::writeRecord): * NetworkProcess/cache/CacheStorageEngineCaches.h: Canonical link: https://commits.webkit.org/209739@main git-svn-id: https://svn.webkit.org/repository/webkit/trunk@242599 268f45cc-cd09-0410-ab3c-d52691b4dbfc
2019-03-07 17:40:40 +00:00
namespace WebCore {
Cross-thread version StorageQuotaManager https://bugs.webkit.org/show_bug.cgi?id=203971 <rdar://problem/57290349> Reviewed by Chris Dumez. Source/WebCore: Implement a lock-based StorageQuotaManager so that quota check can be done on different threads. If space request is made on a background thread, it needs to hold a lock until it is finished, so no request from different threads can be performed at the same time. If space request is made on the main thread, we will dispatch it to a background thread and schedule a calllback to the main thread when result is available, so the main thread will not be blocked. Covered by existing quota related tests. * Headers.cmake: * Modules/indexeddb/server/IDBServer.cpp: (WebCore::IDBServer::IDBServer::create): (WebCore::IDBServer::IDBServer::IDBServer): (WebCore::IDBServer::IDBServer::didPerformCloseAndDeleteDatabases): (WebCore::IDBServer::IDBServer::requestSpace): (WebCore::IDBServer::IDBServer::diskUsage): (WebCore::IDBServer::IDBServer::QuotaUser::QuotaUser): Deleted. (WebCore::IDBServer::IDBServer::QuotaUser::~QuotaUser): Deleted. (WebCore::IDBServer::IDBServer::QuotaUser::resetSpaceUsed): Deleted. (WebCore::IDBServer::IDBServer::QuotaUser::computeSpaceUsed): Deleted. (WebCore::IDBServer::IDBServer::QuotaUser::increaseSpaceUsed): Deleted. (WebCore::IDBServer::IDBServer::QuotaUser::decreaseSpaceUsed): Deleted. (WebCore::IDBServer::IDBServer::QuotaUser::whenInitialized): Deleted. (WebCore::IDBServer::IDBServer::QuotaUser::initializeSpaceUsed): Deleted. (WebCore::IDBServer::IDBServer::ensureQuotaUser): Deleted. (WebCore::IDBServer::IDBServer::startComputingSpaceUsedForOrigin): Deleted. (WebCore::IDBServer::IDBServer::computeSpaceUsedForOrigin): Deleted. (WebCore::IDBServer::IDBServer::finishComputingSpaceUsedForOrigin): Deleted. (WebCore::IDBServer::IDBServer::resetSpaceUsed): Deleted. (WebCore::IDBServer::IDBServer::increaseSpaceUsed): Deleted. (WebCore::IDBServer::IDBServer::decreaseSpaceUsed): Deleted. (WebCore::IDBServer::IDBServer::increasePotentialSpaceUsed): Deleted. (WebCore::IDBServer::IDBServer::decreasePotentialSpaceUsed): Deleted. * Modules/indexeddb/server/IDBServer.h: (WebCore::IDBServer::IDBServer::initializeQuotaUser): Deleted. (): Deleted. * Modules/indexeddb/server/UniqueIDBDatabase.cpp: (WebCore::IDBServer::UniqueIDBDatabase::performCurrentOpenOperation): (WebCore::IDBServer::UniqueIDBDatabase::openBackingStore): (WebCore::IDBServer::UniqueIDBDatabase::didOpenBackingStore): (WebCore::IDBServer::UniqueIDBDatabase::createObjectStore): (WebCore::IDBServer::UniqueIDBDatabase::performCreateObjectStore): (WebCore::IDBServer::UniqueIDBDatabase::didPerformCreateObjectStore): (WebCore::IDBServer::UniqueIDBDatabase::deleteObjectStore): (WebCore::IDBServer::UniqueIDBDatabase::renameObjectStore): (WebCore::IDBServer::UniqueIDBDatabase::performRenameObjectStore): (WebCore::IDBServer::UniqueIDBDatabase::didPerformRenameObjectStore): (WebCore::IDBServer::UniqueIDBDatabase::clearObjectStore): (WebCore::IDBServer::UniqueIDBDatabase::createIndex): (WebCore::IDBServer::UniqueIDBDatabase::performCreateIndex): (WebCore::IDBServer::UniqueIDBDatabase::didPerformCreateIndex): (WebCore::IDBServer::UniqueIDBDatabase::deleteIndex): (WebCore::IDBServer::UniqueIDBDatabase::renameIndex): (WebCore::IDBServer::UniqueIDBDatabase::performRenameIndex): (WebCore::IDBServer::UniqueIDBDatabase::didPerformRenameIndex): (WebCore::IDBServer::UniqueIDBDatabase::putOrAdd): (WebCore::IDBServer::UniqueIDBDatabase::performPutOrAdd): (WebCore::IDBServer::UniqueIDBDatabase::didPerformPutOrAdd): (WebCore::IDBServer::UniqueIDBDatabase::getRecord): (WebCore::IDBServer::UniqueIDBDatabase::getAllRecords): (WebCore::IDBServer::UniqueIDBDatabase::performGetRecord): (WebCore::IDBServer::UniqueIDBDatabase::performGetAllRecords): (WebCore::IDBServer::UniqueIDBDatabase::getCount): (WebCore::IDBServer::UniqueIDBDatabase::deleteRecord): (WebCore::IDBServer::UniqueIDBDatabase::openCursor): (WebCore::IDBServer::UniqueIDBDatabase::iterateCursor): (WebCore::IDBServer::UniqueIDBDatabase::commitTransaction): (WebCore::IDBServer::UniqueIDBDatabase::abortTransaction): (WebCore::IDBServer::UniqueIDBDatabase::requestSpace): Deleted. (WebCore::IDBServer::UniqueIDBDatabase::waitForRequestSpaceCompletion): Deleted. (WebCore::IDBServer::UniqueIDBDatabase::startSpaceIncreaseTask): Deleted. (WebCore::IDBServer::UniqueIDBDatabase::finishSpaceIncreaseTask): Deleted. (WebCore::IDBServer::UniqueIDBDatabase::createObjectStoreAfterQuotaCheck): Deleted. (WebCore::IDBServer::UniqueIDBDatabase::deleteObjectStoreAfterQuotaCheck): Deleted. (WebCore::IDBServer::UniqueIDBDatabase::renameObjectStoreAfterQuotaCheck): Deleted. (WebCore::IDBServer::UniqueIDBDatabase::clearObjectStoreAfetQuotaCheck): Deleted. (WebCore::IDBServer::UniqueIDBDatabase::createIndexAfterQuotaCheck): Deleted. (WebCore::IDBServer::UniqueIDBDatabase::deleteIndexAfterQuotaCheck): Deleted. (WebCore::IDBServer::UniqueIDBDatabase::renameIndexAfterQuotaCheck): Deleted. (WebCore::IDBServer::UniqueIDBDatabase::putOrAddAfterQuotaCheck): Deleted. (WebCore::IDBServer::UniqueIDBDatabase::getRecordAfterQuotaCheck): Deleted. (WebCore::IDBServer::UniqueIDBDatabase::getAllRecordsAfterQuotaCheck): Deleted. (WebCore::IDBServer::UniqueIDBDatabase::getCountAfterQuotaCheck): Deleted. (WebCore::IDBServer::UniqueIDBDatabase::deleteRecordAfterQuotaCheck): Deleted. (WebCore::IDBServer::UniqueIDBDatabase::openCursorAfterQuotaCheck): Deleted. (WebCore::IDBServer::UniqueIDBDatabase::iterateCursorAfterQuotaCheck): Deleted. (WebCore::IDBServer::UniqueIDBDatabase::commitTransactionAfterQuotaCheck): Deleted. * Modules/indexeddb/server/UniqueIDBDatabase.h: * Modules/indexeddb/server/UniqueIDBDatabaseConnection.cpp: (WebCore::IDBServer::UniqueIDBDatabaseConnection::abortTransactionWithoutCallback): * Modules/indexeddb/server/UniqueIDBDatabaseTransaction.cpp: (WebCore::IDBServer::UniqueIDBDatabaseTransaction::abort): (WebCore::IDBServer::UniqueIDBDatabaseTransaction::putOrAdd): (WebCore::IDBServer::UniqueIDBDatabaseTransaction::getRecord): (WebCore::IDBServer::UniqueIDBDatabaseTransaction::getAllRecords): (WebCore::IDBServer::UniqueIDBDatabaseTransaction::getCount): (WebCore::IDBServer::UniqueIDBDatabaseTransaction::deleteRecord): (WebCore::IDBServer::UniqueIDBDatabaseTransaction::openCursor): (WebCore::IDBServer::UniqueIDBDatabaseTransaction::iterateCursor): * Modules/indexeddb/shared/InProcessIDBServer.cpp: (WebCore::InProcessIDBServer::quotaManager): (WebCore::storageQuotaManagerSpaceRequester): (WebCore::InProcessIDBServer::InProcessIDBServer): (WebCore::storageQuotaManagerGetter): Deleted. * Modules/indexeddb/shared/InProcessIDBServer.h: * WebCore.xcodeproj/project.pbxproj: * storage/StorageQuotaManager.cpp: (WebCore::StorageQuotaManager::create): (WebCore::StorageQuotaManager::StorageQuotaManager): (WebCore::StorageQuotaManager::requestSpaceOnMainThread): (WebCore::StorageQuotaManager::requestSpaceOnBackgroundThread): (WebCore::StorageQuotaManager::tryGrantRequest): (WebCore::StorageQuotaManager::updateQuotaBasedOnUsage): (WebCore::StorageQuotaManager::resetQuotaUpdatedBasedOnUsageForTesting): (WebCore::StorageQuotaManager::resetQuotaForTesting): (WebCore::StorageQuotaManager::~StorageQuotaManager): Deleted. (WebCore::StorageQuotaManager::spaceUsage const): Deleted. (WebCore::StorageQuotaManager::updateQuotaBasedOnSpaceUsage): Deleted. (WebCore::StorageQuotaManager::initializeUsersIfNeeded): Deleted. (WebCore::StorageQuotaManager::askUserToInitialize): Deleted. (WebCore::StorageQuotaManager::addUser): Deleted. (WebCore::StorageQuotaManager::shouldAskForMoreSpace const): Deleted. (WebCore::StorageQuotaManager::removeUser): Deleted. (WebCore::StorageQuotaManager::requestSpace): Deleted. (WebCore::StorageQuotaManager::askForMoreSpace): Deleted. (WebCore::StorageQuotaManager::processPendingRequests): Deleted. * storage/StorageQuotaManager.h: (WebCore::StorageQuotaManager::defaultThirdPartyQuotaFromPerOriginQuota): (WebCore::StorageQuotaManager::StorageQuotaManager): Deleted. (WebCore::StorageQuotaManager::resetQuota): Deleted. (WebCore::StorageQuotaManager::state const): Deleted. * storage/StorageQuotaUser.h: Removed. Source/WebKit: * NetworkProcess/NetworkProcess.cpp: Introduce class SessionStorageQuotaManager to manage all StorageQuotaManagers of the same session. (WebKit::NetworkProcess::initializeNetworkProcess): (WebKit::NetworkProcess::addWebsiteDataStore): (WebKit::NetworkProcess::addSessionStorageQuotaManager): (WebKit::NetworkProcess::removeSessionStorageQuotaManager): (WebKit::NetworkProcess::destroySession): (WebKit::NetworkProcess::deleteWebsiteData): (WebKit::NetworkProcess::deleteWebsiteDataForOrigins): (WebKit::NetworkProcess::createIDBServer): (WebKit::NetworkProcess::addIndexedDatabaseSession): (WebKit::NetworkProcess::setSessionStorageQuotaManagerIDBRootPath): (WebKit::NetworkProcess::updateQuotaBasedOnSpaceUsageForTesting): (WebKit::NetworkProcess::resetQuota): (WebKit::NetworkProcess::storageQuotaManager): (WebKit::NetworkProcess::initializeStorageQuota): Deleted. (WebKit::NetworkProcess::clearStorageQuota): Deleted. (): Deleted. (WebKit::NetworkProcess::initializeQuotaUsers): Deleted. * NetworkProcess/NetworkProcess.h: (WebKit::NetworkProcess::SessionStorageQuotaManager::SessionStorageQuotaManager): (WebKit::NetworkProcess::SessionStorageQuotaManager::defaultQuota const): (WebKit::NetworkProcess::SessionStorageQuotaManager::ensureOriginStorageQuotaManager): (WebKit::NetworkProcess::SessionStorageQuotaManager::existingStorageQuotaManagers): (WebKit::NetworkProcess::SessionStorageQuotaManager::cacheRootPath const): (WebKit::NetworkProcess::SessionStorageQuotaManager::setIDBRootPath): (WebKit::NetworkProcess::SessionStorageQuotaManager::idbRootPath const): (WebKit::NetworkProcess::StorageQuotaManagers::defaultQuota const): Deleted. (WebKit::NetworkProcess::StorageQuotaManagers::setDefaultQuotas): Deleted. (WebKit::NetworkProcess::StorageQuotaManagers::managersPerOrigin): Deleted. * NetworkProcess/NetworkProcess.messages.in: * NetworkProcess/cache/CacheStorageEngine.cpp: (WebKit::CacheStorage::getDirectorySize): (WebKit::CacheStorage::Engine::diskUsage): static function to get the disk usage of CacheStorage given CacheStorage root directory. (WebKit::CacheStorage::Engine::requestSpace): (WebKit::CacheStorage::Engine::readCachesFromDisk): (WebKit::CacheStorage::Engine::writeSizeFile): (WebKit::CacheStorage::Engine::readSizeFile): (WebKit::CacheStorage::Engine::initializeQuotaUser): Deleted. * NetworkProcess/cache/CacheStorageEngine.h: * NetworkProcess/cache/CacheStorageEngineCache.cpp: (WebKit::CacheStorage::Cache::put): (WebKit::CacheStorage::Cache::remove): * NetworkProcess/cache/CacheStorageEngineCaches.cpp: (WebKit::CacheStorage::Caches::create): (WebKit::CacheStorage::Caches::Caches): (WebKit::CacheStorage::Caches::~Caches): (WebKit::CacheStorage::Caches::updateSizeFile): (WebKit::CacheStorage::Caches::initializeSize): (WebKit::CacheStorage::Caches::clear): (WebKit::CacheStorage::Caches::requestSpace): (WebKit::CacheStorage::Caches::writeRecord): (WebKit::CacheStorage::Caches::removeRecord): (WebKit::CacheStorage::Caches::whenInitialized): Deleted. (WebKit::CacheStorage::Caches::resetSpaceUsed): Deleted. * NetworkProcess/cache/CacheStorageEngineCaches.h: * Shared/WebsiteDataStoreParameters.cpp: (WebKit::WebsiteDataStoreParameters::encode const): (WebKit::WebsiteDataStoreParameters::decode): * Shared/WebsiteDataStoreParameters.h: Add a cacheStorageDirectory parameter so we know the direcotry of CacheStorage when we start using WebsiteDataStore. * UIProcess/API/C/WKWebsiteDataStoreRef.cpp: (WKWebsiteDataStoreResetQuota): * UIProcess/API/C/WKWebsiteDataStoreRef.h: Add a C API for reseting quota in TestRunner. * UIProcess/Network/NetworkProcessProxy.cpp: (WebKit::NetworkProcessProxy::resetQuota): * UIProcess/Network/NetworkProcessProxy.h: * UIProcess/WebProcessPool.cpp: (WebKit::WebProcessPool::ensureNetworkProcess): * UIProcess/WebsiteData/Cocoa/WebsiteDataStoreCocoa.mm: (WebKit::WebsiteDataStore::parameters): * UIProcess/WebsiteData/WebsiteDataStore.cpp: (WebKit::WebsiteDataStore::parameters): (WebKit::WebsiteDataStore::resetQuota): * UIProcess/WebsiteData/WebsiteDataStore.h: Tools: * TestWebKitAPI/TestWebKitAPI.xcodeproj/project.pbxproj: * TestWebKitAPI/Tests/WebCore/StorageQuotaManager.cpp: Removed as we have a different StorageQuotaManager implementation now. * WebKitTestRunner/TestController.cpp: reset StorageQuotaManager's quota between tests. (WTR::TestController::resetStateToConsistentValues): (WTR::TestController::resetQuota): * WebKitTestRunner/TestController.h: Canonical link: https://commits.webkit.org/217990@main git-svn-id: https://svn.webkit.org/repository/webkit/trunk@253025 268f45cc-cd09-0410-ab3c-d52691b4dbfc
2019-12-03 06:53:42 +00:00
class StorageQuotaManager : public ThreadSafeRefCounted<StorageQuotaManager>, public CanMakeWeakPtr<StorageQuotaManager> {
Introduce a quota manager for Cache API/Service Worker/IDB storage https://bugs.webkit.org/show_bug.cgi?id=195283 Reviewed by Chris Dumez. Source/WebCore: Introduce a generic quota manager and quota users to be used in Network Process. Quota manager/users are scoped by client origin. Quota manager is used to check for quota by an entity wanting to execute a storage task of a given taskSize. Quota manager will check the current space used by all its quota users. If the size + taskSize is above quota, it will call a function to try extend the quota. In the meantime, the task (and all tasks that may be added) are queued. Once the new quota is received, the quota manager will either allow or disallow the first task in the queue. The quota manager will try to execute as many tasks as possible with the provided quota. If some tasks are remaining and quota limit is hit, the quota manager will compute the space needed for all remaining requests and do another quota extension request. * Sources.txt: * WebCore.xcodeproj/project.pbxproj: * page/ClientOrigin.h: * storage/StorageQuotaManager.cpp: Added. (WebCore::StorageQuotaManager::~StorageQuotaManager): (WebCore::StorageQuotaManager::spaceUsage const): (WebCore::StorageQuotaManager::requestSpace): (WebCore::StorageQuotaManager::askForMoreSpace): (WebCore::StorageQuotaManager::processPendingRequests): * storage/StorageQuotaManager.h: Added. (WebCore::StorageQuotaManager::StorageQuotaManager): (WebCore::StorageQuotaManager::addUser): (WebCore::StorageQuotaManager::removeUser): * storage/StorageQuotaUser.h: Added. Source/WebKit: Remove quota handling from Cache API storage and use StorageQuotaManager/StorageQuotaUser. CacheStorage::Caches becomes a quota user and has a StorageQuotaManager to check for space for any cache API write task. NetworkProcess is responsible to manage the quota managers. Quota managers will go through network process to ask UIProcess for quota extension. Remove pending callback handling from CacheStorage since they are queued in QuotaManager now. * NetworkProcess/NetworkProcess.cpp: (WebKit::NetworkProcess::~NetworkProcess): (WebKit::NetworkProcess::destroySession): (WebKit::NetworkProcess::cacheStorageRootPath): (WebKit::NetworkProcess::setCacheStorageParameters): (WebKit::NetworkProcess::storageQuotaManager): * NetworkProcess/NetworkProcess.h: * NetworkProcess/cache/CacheStorageEngine.cpp: (WebKit::CacheStorage::Engine::from): (WebKit::CacheStorage::Engine::Engine): (WebKit::CacheStorage::Engine::readCachesFromDisk): * NetworkProcess/cache/CacheStorageEngine.h: * NetworkProcess/cache/CacheStorageEngineCache.cpp: (WebKit::CacheStorage::Cache::put): * NetworkProcess/cache/CacheStorageEngineCache.h: * NetworkProcess/cache/CacheStorageEngineCaches.cpp: (WebKit::CacheStorage::Caches::Caches): (WebKit::CacheStorage::Caches::~Caches): (WebKit::CacheStorage::Caches::requestSpace): (WebKit::CacheStorage::Caches::writeRecord): * NetworkProcess/cache/CacheStorageEngineCaches.h: Canonical link: https://commits.webkit.org/209739@main git-svn-id: https://svn.webkit.org/repository/webkit/trunk@242599 268f45cc-cd09-0410-ab3c-d52691b4dbfc
2019-03-07 17:40:40 +00:00
WTF_MAKE_FAST_ALLOCATED;
public:
Remove logging for investigating http/tests/IndexedDB/storage-limit-1.html failure https://bugs.webkit.org/show_bug.cgi?id=223086 <rdar://problem/75591816> Reviewed by Chris Dumez. Source/WebCore: * Modules/indexeddb/server/IDBServer.cpp: (WebCore::IDBServer::IDBServer::diskUsage): * Modules/indexeddb/server/IDBServer.h: * Modules/indexeddb/server/SQLiteIDBBackingStore.cpp: (WebCore::IDBServer::SQLiteIDBBackingStore::databasesSizeForDirectory): * Modules/indexeddb/server/SQLiteIDBBackingStore.h: * storage/StorageQuotaManager.cpp: (WebCore::StorageQuotaManager::requestSpaceOnBackgroundThread): (WebCore::StorageQuotaManager::tryGrantRequest): (WebCore::StorageQuotaManager::setLoggingEnabled): Deleted. * storage/StorageQuotaManager.h: Source/WebKit: * NetworkProcess/NetworkProcess.cpp: (WebKit::NetworkProcess::storageQuotaManager): (WebKit::NetworkProcess::setQuotaLoggingEnabled): Deleted. * NetworkProcess/NetworkProcess.h: * NetworkProcess/NetworkProcess.messages.in: * UIProcess/API/C/WKWebsiteDataStoreRef.cpp: (WKWebsiteDataStoreSetQuotaLoggingEnabled): Deleted. * UIProcess/API/C/WKWebsiteDataStoreRef.h: * UIProcess/Network/NetworkProcessProxy.cpp: (WebKit::NetworkProcessProxy::setQuotaLoggingEnabled): Deleted. * UIProcess/Network/NetworkProcessProxy.h: * UIProcess/WebsiteData/WebsiteDataStore.cpp: (WebKit::WebsiteDataStore::setQuotaLoggingEnabled): Deleted. * UIProcess/WebsiteData/WebsiteDataStore.h: Source/WebKitLegacy: * Storage/InProcessIDBServer.cpp: (InProcessIDBServer::quotaManager): Tools: * WebKitTestRunner/InjectedBundle/Bindings/TestRunner.idl: * WebKitTestRunner/InjectedBundle/TestRunner.cpp: (WTR::TestRunner::setQuotaLoggingEnabled): Deleted. * WebKitTestRunner/InjectedBundle/TestRunner.h: * WebKitTestRunner/TestController.cpp: (WTR::TestController::setQuotaLoggingEnabled): Deleted. * WebKitTestRunner/TestController.h: * WebKitTestRunner/TestInvocation.cpp: (WTR::TestInvocation::didReceiveSynchronousMessageFromInjectedBundle): LayoutTests: * http/tests/IndexedDB/storage-limit-1.https.html: * http/tests/IndexedDB/storage-limit-2.https.html: * http/tests/IndexedDB/storage-limit.https.html: Canonical link: https://commits.webkit.org/236295@main git-svn-id: https://svn.webkit.org/repository/webkit/trunk@275659 268f45cc-cd09-0410-ab3c-d52691b4dbfc
2021-04-08 16:14:46 +00:00
using UsageGetter = Function<uint64_t()>;
Remove WTF::Optional synonym for std::optional, using that class template directly instead https://bugs.webkit.org/show_bug.cgi?id=226433 Reviewed by Chris Dumez. Source/JavaScriptCore: * <many files>: Let the do-webcore-rename script rename Optional<> to std::optional<>. * inspector/scripts/codegen/generate_objc_protocol_types_implementation.py: (ObjCProtocolTypesImplementationGenerator._generate_init_method_for_payload): Use auto instead of Optional<>. Also use * instead of value() and nest the definition of the local inside an if statement in the case where it's an optional. * inspector/scripts/tests/expected/*: Regenerated these results. Source/WebCore: * <many files>: Let the do-webcore-rename script rename Optional<> to std::optional<>. Source/WebCore/PAL: * <many files>: Let the do-webcore-rename script rename Optional<> to std::optional<>. Source/WebDriver: * <many files>: Let the do-webcore-rename script rename Optional<> to std::optional<>. Source/WebKit: * <many files>: Let the do-webcore-rename script rename Optional<> to std::optional<>. * Scripts/webkit/tests: Regenerated expected results, by running the command "python Scripts/webkit/messages_unittest.py -r". (How am I supposed to know to do that?) Source/WebKitLegacy/ios: * WebCoreSupport/WebChromeClientIOS.h: Let the do-webcore-rename script rename Optional<> to std::optional<>. Source/WebKitLegacy/mac: * <many files>: Let the do-webcore-rename script rename Optional<> to std::optional<>. Source/WebKitLegacy/win: * <many files>: Let the do-webcore-rename script rename Optional<> to std::optional<>. Source/WTF: * <many files>: Let the do-webcore-rename script rename Optional<> to std::optional<>. * wtf/Optional.h: Remove WTF::Optional. Tools: * <many files>: Let the do-webcore-rename script rename Optional<> to std::optional<>. Canonical link: https://commits.webkit.org/238290@main git-svn-id: https://svn.webkit.org/repository/webkit/trunk@278253 268f45cc-cd09-0410-ab3c-d52691b4dbfc
2021-05-30 16:11:40 +00:00
using QuotaIncreaseRequester = Function<void(uint64_t currentQuota, uint64_t currentUsage, uint64_t requestedIncrease, CompletionHandler<void(std::optional<uint64_t>)>&&)>;
Cross-thread version StorageQuotaManager https://bugs.webkit.org/show_bug.cgi?id=203971 <rdar://problem/57290349> Reviewed by Chris Dumez. Source/WebCore: Implement a lock-based StorageQuotaManager so that quota check can be done on different threads. If space request is made on a background thread, it needs to hold a lock until it is finished, so no request from different threads can be performed at the same time. If space request is made on the main thread, we will dispatch it to a background thread and schedule a calllback to the main thread when result is available, so the main thread will not be blocked. Covered by existing quota related tests. * Headers.cmake: * Modules/indexeddb/server/IDBServer.cpp: (WebCore::IDBServer::IDBServer::create): (WebCore::IDBServer::IDBServer::IDBServer): (WebCore::IDBServer::IDBServer::didPerformCloseAndDeleteDatabases): (WebCore::IDBServer::IDBServer::requestSpace): (WebCore::IDBServer::IDBServer::diskUsage): (WebCore::IDBServer::IDBServer::QuotaUser::QuotaUser): Deleted. (WebCore::IDBServer::IDBServer::QuotaUser::~QuotaUser): Deleted. (WebCore::IDBServer::IDBServer::QuotaUser::resetSpaceUsed): Deleted. (WebCore::IDBServer::IDBServer::QuotaUser::computeSpaceUsed): Deleted. (WebCore::IDBServer::IDBServer::QuotaUser::increaseSpaceUsed): Deleted. (WebCore::IDBServer::IDBServer::QuotaUser::decreaseSpaceUsed): Deleted. (WebCore::IDBServer::IDBServer::QuotaUser::whenInitialized): Deleted. (WebCore::IDBServer::IDBServer::QuotaUser::initializeSpaceUsed): Deleted. (WebCore::IDBServer::IDBServer::ensureQuotaUser): Deleted. (WebCore::IDBServer::IDBServer::startComputingSpaceUsedForOrigin): Deleted. (WebCore::IDBServer::IDBServer::computeSpaceUsedForOrigin): Deleted. (WebCore::IDBServer::IDBServer::finishComputingSpaceUsedForOrigin): Deleted. (WebCore::IDBServer::IDBServer::resetSpaceUsed): Deleted. (WebCore::IDBServer::IDBServer::increaseSpaceUsed): Deleted. (WebCore::IDBServer::IDBServer::decreaseSpaceUsed): Deleted. (WebCore::IDBServer::IDBServer::increasePotentialSpaceUsed): Deleted. (WebCore::IDBServer::IDBServer::decreasePotentialSpaceUsed): Deleted. * Modules/indexeddb/server/IDBServer.h: (WebCore::IDBServer::IDBServer::initializeQuotaUser): Deleted. (): Deleted. * Modules/indexeddb/server/UniqueIDBDatabase.cpp: (WebCore::IDBServer::UniqueIDBDatabase::performCurrentOpenOperation): (WebCore::IDBServer::UniqueIDBDatabase::openBackingStore): (WebCore::IDBServer::UniqueIDBDatabase::didOpenBackingStore): (WebCore::IDBServer::UniqueIDBDatabase::createObjectStore): (WebCore::IDBServer::UniqueIDBDatabase::performCreateObjectStore): (WebCore::IDBServer::UniqueIDBDatabase::didPerformCreateObjectStore): (WebCore::IDBServer::UniqueIDBDatabase::deleteObjectStore): (WebCore::IDBServer::UniqueIDBDatabase::renameObjectStore): (WebCore::IDBServer::UniqueIDBDatabase::performRenameObjectStore): (WebCore::IDBServer::UniqueIDBDatabase::didPerformRenameObjectStore): (WebCore::IDBServer::UniqueIDBDatabase::clearObjectStore): (WebCore::IDBServer::UniqueIDBDatabase::createIndex): (WebCore::IDBServer::UniqueIDBDatabase::performCreateIndex): (WebCore::IDBServer::UniqueIDBDatabase::didPerformCreateIndex): (WebCore::IDBServer::UniqueIDBDatabase::deleteIndex): (WebCore::IDBServer::UniqueIDBDatabase::renameIndex): (WebCore::IDBServer::UniqueIDBDatabase::performRenameIndex): (WebCore::IDBServer::UniqueIDBDatabase::didPerformRenameIndex): (WebCore::IDBServer::UniqueIDBDatabase::putOrAdd): (WebCore::IDBServer::UniqueIDBDatabase::performPutOrAdd): (WebCore::IDBServer::UniqueIDBDatabase::didPerformPutOrAdd): (WebCore::IDBServer::UniqueIDBDatabase::getRecord): (WebCore::IDBServer::UniqueIDBDatabase::getAllRecords): (WebCore::IDBServer::UniqueIDBDatabase::performGetRecord): (WebCore::IDBServer::UniqueIDBDatabase::performGetAllRecords): (WebCore::IDBServer::UniqueIDBDatabase::getCount): (WebCore::IDBServer::UniqueIDBDatabase::deleteRecord): (WebCore::IDBServer::UniqueIDBDatabase::openCursor): (WebCore::IDBServer::UniqueIDBDatabase::iterateCursor): (WebCore::IDBServer::UniqueIDBDatabase::commitTransaction): (WebCore::IDBServer::UniqueIDBDatabase::abortTransaction): (WebCore::IDBServer::UniqueIDBDatabase::requestSpace): Deleted. (WebCore::IDBServer::UniqueIDBDatabase::waitForRequestSpaceCompletion): Deleted. (WebCore::IDBServer::UniqueIDBDatabase::startSpaceIncreaseTask): Deleted. (WebCore::IDBServer::UniqueIDBDatabase::finishSpaceIncreaseTask): Deleted. (WebCore::IDBServer::UniqueIDBDatabase::createObjectStoreAfterQuotaCheck): Deleted. (WebCore::IDBServer::UniqueIDBDatabase::deleteObjectStoreAfterQuotaCheck): Deleted. (WebCore::IDBServer::UniqueIDBDatabase::renameObjectStoreAfterQuotaCheck): Deleted. (WebCore::IDBServer::UniqueIDBDatabase::clearObjectStoreAfetQuotaCheck): Deleted. (WebCore::IDBServer::UniqueIDBDatabase::createIndexAfterQuotaCheck): Deleted. (WebCore::IDBServer::UniqueIDBDatabase::deleteIndexAfterQuotaCheck): Deleted. (WebCore::IDBServer::UniqueIDBDatabase::renameIndexAfterQuotaCheck): Deleted. (WebCore::IDBServer::UniqueIDBDatabase::putOrAddAfterQuotaCheck): Deleted. (WebCore::IDBServer::UniqueIDBDatabase::getRecordAfterQuotaCheck): Deleted. (WebCore::IDBServer::UniqueIDBDatabase::getAllRecordsAfterQuotaCheck): Deleted. (WebCore::IDBServer::UniqueIDBDatabase::getCountAfterQuotaCheck): Deleted. (WebCore::IDBServer::UniqueIDBDatabase::deleteRecordAfterQuotaCheck): Deleted. (WebCore::IDBServer::UniqueIDBDatabase::openCursorAfterQuotaCheck): Deleted. (WebCore::IDBServer::UniqueIDBDatabase::iterateCursorAfterQuotaCheck): Deleted. (WebCore::IDBServer::UniqueIDBDatabase::commitTransactionAfterQuotaCheck): Deleted. * Modules/indexeddb/server/UniqueIDBDatabase.h: * Modules/indexeddb/server/UniqueIDBDatabaseConnection.cpp: (WebCore::IDBServer::UniqueIDBDatabaseConnection::abortTransactionWithoutCallback): * Modules/indexeddb/server/UniqueIDBDatabaseTransaction.cpp: (WebCore::IDBServer::UniqueIDBDatabaseTransaction::abort): (WebCore::IDBServer::UniqueIDBDatabaseTransaction::putOrAdd): (WebCore::IDBServer::UniqueIDBDatabaseTransaction::getRecord): (WebCore::IDBServer::UniqueIDBDatabaseTransaction::getAllRecords): (WebCore::IDBServer::UniqueIDBDatabaseTransaction::getCount): (WebCore::IDBServer::UniqueIDBDatabaseTransaction::deleteRecord): (WebCore::IDBServer::UniqueIDBDatabaseTransaction::openCursor): (WebCore::IDBServer::UniqueIDBDatabaseTransaction::iterateCursor): * Modules/indexeddb/shared/InProcessIDBServer.cpp: (WebCore::InProcessIDBServer::quotaManager): (WebCore::storageQuotaManagerSpaceRequester): (WebCore::InProcessIDBServer::InProcessIDBServer): (WebCore::storageQuotaManagerGetter): Deleted. * Modules/indexeddb/shared/InProcessIDBServer.h: * WebCore.xcodeproj/project.pbxproj: * storage/StorageQuotaManager.cpp: (WebCore::StorageQuotaManager::create): (WebCore::StorageQuotaManager::StorageQuotaManager): (WebCore::StorageQuotaManager::requestSpaceOnMainThread): (WebCore::StorageQuotaManager::requestSpaceOnBackgroundThread): (WebCore::StorageQuotaManager::tryGrantRequest): (WebCore::StorageQuotaManager::updateQuotaBasedOnUsage): (WebCore::StorageQuotaManager::resetQuotaUpdatedBasedOnUsageForTesting): (WebCore::StorageQuotaManager::resetQuotaForTesting): (WebCore::StorageQuotaManager::~StorageQuotaManager): Deleted. (WebCore::StorageQuotaManager::spaceUsage const): Deleted. (WebCore::StorageQuotaManager::updateQuotaBasedOnSpaceUsage): Deleted. (WebCore::StorageQuotaManager::initializeUsersIfNeeded): Deleted. (WebCore::StorageQuotaManager::askUserToInitialize): Deleted. (WebCore::StorageQuotaManager::addUser): Deleted. (WebCore::StorageQuotaManager::shouldAskForMoreSpace const): Deleted. (WebCore::StorageQuotaManager::removeUser): Deleted. (WebCore::StorageQuotaManager::requestSpace): Deleted. (WebCore::StorageQuotaManager::askForMoreSpace): Deleted. (WebCore::StorageQuotaManager::processPendingRequests): Deleted. * storage/StorageQuotaManager.h: (WebCore::StorageQuotaManager::defaultThirdPartyQuotaFromPerOriginQuota): (WebCore::StorageQuotaManager::StorageQuotaManager): Deleted. (WebCore::StorageQuotaManager::resetQuota): Deleted. (WebCore::StorageQuotaManager::state const): Deleted. * storage/StorageQuotaUser.h: Removed. Source/WebKit: * NetworkProcess/NetworkProcess.cpp: Introduce class SessionStorageQuotaManager to manage all StorageQuotaManagers of the same session. (WebKit::NetworkProcess::initializeNetworkProcess): (WebKit::NetworkProcess::addWebsiteDataStore): (WebKit::NetworkProcess::addSessionStorageQuotaManager): (WebKit::NetworkProcess::removeSessionStorageQuotaManager): (WebKit::NetworkProcess::destroySession): (WebKit::NetworkProcess::deleteWebsiteData): (WebKit::NetworkProcess::deleteWebsiteDataForOrigins): (WebKit::NetworkProcess::createIDBServer): (WebKit::NetworkProcess::addIndexedDatabaseSession): (WebKit::NetworkProcess::setSessionStorageQuotaManagerIDBRootPath): (WebKit::NetworkProcess::updateQuotaBasedOnSpaceUsageForTesting): (WebKit::NetworkProcess::resetQuota): (WebKit::NetworkProcess::storageQuotaManager): (WebKit::NetworkProcess::initializeStorageQuota): Deleted. (WebKit::NetworkProcess::clearStorageQuota): Deleted. (): Deleted. (WebKit::NetworkProcess::initializeQuotaUsers): Deleted. * NetworkProcess/NetworkProcess.h: (WebKit::NetworkProcess::SessionStorageQuotaManager::SessionStorageQuotaManager): (WebKit::NetworkProcess::SessionStorageQuotaManager::defaultQuota const): (WebKit::NetworkProcess::SessionStorageQuotaManager::ensureOriginStorageQuotaManager): (WebKit::NetworkProcess::SessionStorageQuotaManager::existingStorageQuotaManagers): (WebKit::NetworkProcess::SessionStorageQuotaManager::cacheRootPath const): (WebKit::NetworkProcess::SessionStorageQuotaManager::setIDBRootPath): (WebKit::NetworkProcess::SessionStorageQuotaManager::idbRootPath const): (WebKit::NetworkProcess::StorageQuotaManagers::defaultQuota const): Deleted. (WebKit::NetworkProcess::StorageQuotaManagers::setDefaultQuotas): Deleted. (WebKit::NetworkProcess::StorageQuotaManagers::managersPerOrigin): Deleted. * NetworkProcess/NetworkProcess.messages.in: * NetworkProcess/cache/CacheStorageEngine.cpp: (WebKit::CacheStorage::getDirectorySize): (WebKit::CacheStorage::Engine::diskUsage): static function to get the disk usage of CacheStorage given CacheStorage root directory. (WebKit::CacheStorage::Engine::requestSpace): (WebKit::CacheStorage::Engine::readCachesFromDisk): (WebKit::CacheStorage::Engine::writeSizeFile): (WebKit::CacheStorage::Engine::readSizeFile): (WebKit::CacheStorage::Engine::initializeQuotaUser): Deleted. * NetworkProcess/cache/CacheStorageEngine.h: * NetworkProcess/cache/CacheStorageEngineCache.cpp: (WebKit::CacheStorage::Cache::put): (WebKit::CacheStorage::Cache::remove): * NetworkProcess/cache/CacheStorageEngineCaches.cpp: (WebKit::CacheStorage::Caches::create): (WebKit::CacheStorage::Caches::Caches): (WebKit::CacheStorage::Caches::~Caches): (WebKit::CacheStorage::Caches::updateSizeFile): (WebKit::CacheStorage::Caches::initializeSize): (WebKit::CacheStorage::Caches::clear): (WebKit::CacheStorage::Caches::requestSpace): (WebKit::CacheStorage::Caches::writeRecord): (WebKit::CacheStorage::Caches::removeRecord): (WebKit::CacheStorage::Caches::whenInitialized): Deleted. (WebKit::CacheStorage::Caches::resetSpaceUsed): Deleted. * NetworkProcess/cache/CacheStorageEngineCaches.h: * Shared/WebsiteDataStoreParameters.cpp: (WebKit::WebsiteDataStoreParameters::encode const): (WebKit::WebsiteDataStoreParameters::decode): * Shared/WebsiteDataStoreParameters.h: Add a cacheStorageDirectory parameter so we know the direcotry of CacheStorage when we start using WebsiteDataStore. * UIProcess/API/C/WKWebsiteDataStoreRef.cpp: (WKWebsiteDataStoreResetQuota): * UIProcess/API/C/WKWebsiteDataStoreRef.h: Add a C API for reseting quota in TestRunner. * UIProcess/Network/NetworkProcessProxy.cpp: (WebKit::NetworkProcessProxy::resetQuota): * UIProcess/Network/NetworkProcessProxy.h: * UIProcess/WebProcessPool.cpp: (WebKit::WebProcessPool::ensureNetworkProcess): * UIProcess/WebsiteData/Cocoa/WebsiteDataStoreCocoa.mm: (WebKit::WebsiteDataStore::parameters): * UIProcess/WebsiteData/WebsiteDataStore.cpp: (WebKit::WebsiteDataStore::parameters): (WebKit::WebsiteDataStore::resetQuota): * UIProcess/WebsiteData/WebsiteDataStore.h: Tools: * TestWebKitAPI/TestWebKitAPI.xcodeproj/project.pbxproj: * TestWebKitAPI/Tests/WebCore/StorageQuotaManager.cpp: Removed as we have a different StorageQuotaManager implementation now. * WebKitTestRunner/TestController.cpp: reset StorageQuotaManager's quota between tests. (WTR::TestController::resetStateToConsistentValues): (WTR::TestController::resetQuota): * WebKitTestRunner/TestController.h: Canonical link: https://commits.webkit.org/217990@main git-svn-id: https://svn.webkit.org/repository/webkit/trunk@253025 268f45cc-cd09-0410-ab3c-d52691b4dbfc
2019-12-03 06:53:42 +00:00
WEBCORE_EXPORT static Ref<StorageQuotaManager> create(uint64_t quota, UsageGetter&&, QuotaIncreaseRequester&&);
Introduce a quota manager for Cache API/Service Worker/IDB storage https://bugs.webkit.org/show_bug.cgi?id=195283 Reviewed by Chris Dumez. Source/WebCore: Introduce a generic quota manager and quota users to be used in Network Process. Quota manager/users are scoped by client origin. Quota manager is used to check for quota by an entity wanting to execute a storage task of a given taskSize. Quota manager will check the current space used by all its quota users. If the size + taskSize is above quota, it will call a function to try extend the quota. In the meantime, the task (and all tasks that may be added) are queued. Once the new quota is received, the quota manager will either allow or disallow the first task in the queue. The quota manager will try to execute as many tasks as possible with the provided quota. If some tasks are remaining and quota limit is hit, the quota manager will compute the space needed for all remaining requests and do another quota extension request. * Sources.txt: * WebCore.xcodeproj/project.pbxproj: * page/ClientOrigin.h: * storage/StorageQuotaManager.cpp: Added. (WebCore::StorageQuotaManager::~StorageQuotaManager): (WebCore::StorageQuotaManager::spaceUsage const): (WebCore::StorageQuotaManager::requestSpace): (WebCore::StorageQuotaManager::askForMoreSpace): (WebCore::StorageQuotaManager::processPendingRequests): * storage/StorageQuotaManager.h: Added. (WebCore::StorageQuotaManager::StorageQuotaManager): (WebCore::StorageQuotaManager::addUser): (WebCore::StorageQuotaManager::removeUser): * storage/StorageQuotaUser.h: Added. Source/WebKit: Remove quota handling from Cache API storage and use StorageQuotaManager/StorageQuotaUser. CacheStorage::Caches becomes a quota user and has a StorageQuotaManager to check for space for any cache API write task. NetworkProcess is responsible to manage the quota managers. Quota managers will go through network process to ask UIProcess for quota extension. Remove pending callback handling from CacheStorage since they are queued in QuotaManager now. * NetworkProcess/NetworkProcess.cpp: (WebKit::NetworkProcess::~NetworkProcess): (WebKit::NetworkProcess::destroySession): (WebKit::NetworkProcess::cacheStorageRootPath): (WebKit::NetworkProcess::setCacheStorageParameters): (WebKit::NetworkProcess::storageQuotaManager): * NetworkProcess/NetworkProcess.h: * NetworkProcess/cache/CacheStorageEngine.cpp: (WebKit::CacheStorage::Engine::from): (WebKit::CacheStorage::Engine::Engine): (WebKit::CacheStorage::Engine::readCachesFromDisk): * NetworkProcess/cache/CacheStorageEngine.h: * NetworkProcess/cache/CacheStorageEngineCache.cpp: (WebKit::CacheStorage::Cache::put): * NetworkProcess/cache/CacheStorageEngineCache.h: * NetworkProcess/cache/CacheStorageEngineCaches.cpp: (WebKit::CacheStorage::Caches::Caches): (WebKit::CacheStorage::Caches::~Caches): (WebKit::CacheStorage::Caches::requestSpace): (WebKit::CacheStorage::Caches::writeRecord): * NetworkProcess/cache/CacheStorageEngineCaches.h: Canonical link: https://commits.webkit.org/209739@main git-svn-id: https://svn.webkit.org/repository/webkit/trunk@242599 268f45cc-cd09-0410-ab3c-d52691b4dbfc
2019-03-07 17:40:40 +00:00
Pass storage quota parameters from UIProcess to NetworkProcess as part of WebsiteDataStore parameters https://bugs.webkit.org/show_bug.cgi?id=196543 Reviewed by Alex Christensen. Source/WebCore: Add a default routine to compute a third party quota from a per origin quota. No change of behavior. * storage/StorageQuotaManager.h: (WebCore::StorageQuotaManager::defaultThirdPartyQuotaFromPerOriginQuota): (WebCore::StorageQuotaManager::defaultThirdPartyQuota): Source/WebKit: Renamed methods used to set cache storage quota to be storage generic since they will apply to all storage. Pass quota parameters as part of WebsiteDataStoreParameters from UIProcess to NetworkProcess (start-up time and new WebsiteDataStore time). Compute on UIProcess the quota for third party origins using the default rule of dividing by 10. * NetworkProcess/NetworkProcess.cpp: (WebKit::NetworkProcess::initializeNetworkProcess): (WebKit::NetworkProcess::addWebsiteDataStore): (WebKit::NetworkProcess::initializeStorageQuota): (WebKit::NetworkProcess::setCacheStorageParameters): * NetworkProcess/NetworkProcess.h: * NetworkProcess/NetworkProcess.messages.in: * Shared/WebsiteDataStoreParameters.cpp: (WebKit::WebsiteDataStoreParameters::encode const): (WebKit::WebsiteDataStoreParameters::decode): * Shared/WebsiteDataStoreParameters.h: * UIProcess/API/C/WKWebsiteDataStoreRef.cpp: (WKWebsiteDataStoreSetPerOriginStorageQuota): (WKWebsiteDataStoreSetCacheStoragePerOriginQuota): Deleted. * UIProcess/API/C/WKWebsiteDataStoreRef.h: * UIProcess/API/Cocoa/WKWebsiteDataStore.mm: (-[WKWebsiteDataStore _perOriginStorageQuota]): (-[WKWebsiteDataStore _setPerOriginStorageQuota:]): (-[WKWebsiteDataStore _cacheStoragePerOriginQuota]): Deleted. (-[WKWebsiteDataStore _setCacheStoragePerOriginQuota:]): Deleted. * UIProcess/API/Cocoa/WKWebsiteDataStorePrivate.h: * UIProcess/Network/NetworkProcessProxy.cpp: (WebKit::NetworkProcessProxy::retrieveCacheStorageParameters): * UIProcess/WebsiteData/WebsiteDataStore.cpp: (WebKit::WebsiteDataStore::parameters): * UIProcess/WebsiteData/WebsiteDataStore.h: (WebKit::WebsiteDataStore::perOriginStorageQuota const): (WebKit::WebsiteDataStore::setPerOriginStorageQuota): (WebKit::WebsiteDataStore::cacheStoragePerOriginQuota const): Deleted. (WebKit::WebsiteDataStore::setCacheStoragePerOriginQuota): Deleted. * UIProcess/WebsiteData/WebsiteDataStoreConfiguration.cpp: (WebKit::WebsiteDataStoreConfiguration::copy): * UIProcess/WebsiteData/WebsiteDataStoreConfiguration.h: (WebKit::WebsiteDataStoreConfiguration::perOriginStorageQuota): (WebKit::WebsiteDataStoreConfiguration::setPerOriginStorageQuota): (WebKit::WebsiteDataStoreConfiguration::cacheStoragePerOriginQuota): Deleted. (WebKit::WebsiteDataStoreConfiguration::setCacheStoragePerOriginQuota): Deleted. Tools: * WebKitTestRunner/TestController.cpp: (WTR::TestController::generatePageConfiguration): Canonical link: https://commits.webkit.org/210901@main git-svn-id: https://svn.webkit.org/repository/webkit/trunk@243911 268f45cc-cd09-0410-ab3c-d52691b4dbfc
2019-04-04 22:07:09 +00:00
static constexpr uint64_t defaultThirdPartyQuotaFromPerOriginQuota(uint64_t quota) { return quota / 10; }
static constexpr uint64_t defaultQuota() { return 1000 * MB; }
Pass storage quota parameters from UIProcess to NetworkProcess as part of WebsiteDataStore parameters https://bugs.webkit.org/show_bug.cgi?id=196543 Reviewed by Alex Christensen. Source/WebCore: Add a default routine to compute a third party quota from a per origin quota. No change of behavior. * storage/StorageQuotaManager.h: (WebCore::StorageQuotaManager::defaultThirdPartyQuotaFromPerOriginQuota): (WebCore::StorageQuotaManager::defaultThirdPartyQuota): Source/WebKit: Renamed methods used to set cache storage quota to be storage generic since they will apply to all storage. Pass quota parameters as part of WebsiteDataStoreParameters from UIProcess to NetworkProcess (start-up time and new WebsiteDataStore time). Compute on UIProcess the quota for third party origins using the default rule of dividing by 10. * NetworkProcess/NetworkProcess.cpp: (WebKit::NetworkProcess::initializeNetworkProcess): (WebKit::NetworkProcess::addWebsiteDataStore): (WebKit::NetworkProcess::initializeStorageQuota): (WebKit::NetworkProcess::setCacheStorageParameters): * NetworkProcess/NetworkProcess.h: * NetworkProcess/NetworkProcess.messages.in: * Shared/WebsiteDataStoreParameters.cpp: (WebKit::WebsiteDataStoreParameters::encode const): (WebKit::WebsiteDataStoreParameters::decode): * Shared/WebsiteDataStoreParameters.h: * UIProcess/API/C/WKWebsiteDataStoreRef.cpp: (WKWebsiteDataStoreSetPerOriginStorageQuota): (WKWebsiteDataStoreSetCacheStoragePerOriginQuota): Deleted. * UIProcess/API/C/WKWebsiteDataStoreRef.h: * UIProcess/API/Cocoa/WKWebsiteDataStore.mm: (-[WKWebsiteDataStore _perOriginStorageQuota]): (-[WKWebsiteDataStore _setPerOriginStorageQuota:]): (-[WKWebsiteDataStore _cacheStoragePerOriginQuota]): Deleted. (-[WKWebsiteDataStore _setCacheStoragePerOriginQuota:]): Deleted. * UIProcess/API/Cocoa/WKWebsiteDataStorePrivate.h: * UIProcess/Network/NetworkProcessProxy.cpp: (WebKit::NetworkProcessProxy::retrieveCacheStorageParameters): * UIProcess/WebsiteData/WebsiteDataStore.cpp: (WebKit::WebsiteDataStore::parameters): * UIProcess/WebsiteData/WebsiteDataStore.h: (WebKit::WebsiteDataStore::perOriginStorageQuota const): (WebKit::WebsiteDataStore::setPerOriginStorageQuota): (WebKit::WebsiteDataStore::cacheStoragePerOriginQuota const): Deleted. (WebKit::WebsiteDataStore::setCacheStoragePerOriginQuota): Deleted. * UIProcess/WebsiteData/WebsiteDataStoreConfiguration.cpp: (WebKit::WebsiteDataStoreConfiguration::copy): * UIProcess/WebsiteData/WebsiteDataStoreConfiguration.h: (WebKit::WebsiteDataStoreConfiguration::perOriginStorageQuota): (WebKit::WebsiteDataStoreConfiguration::setPerOriginStorageQuota): (WebKit::WebsiteDataStoreConfiguration::cacheStoragePerOriginQuota): Deleted. (WebKit::WebsiteDataStoreConfiguration::setCacheStoragePerOriginQuota): Deleted. Tools: * WebKitTestRunner/TestController.cpp: (WTR::TestController::generatePageConfiguration): Canonical link: https://commits.webkit.org/210901@main git-svn-id: https://svn.webkit.org/repository/webkit/trunk@243911 268f45cc-cd09-0410-ab3c-d52691b4dbfc
2019-04-04 22:07:09 +00:00
static constexpr uint64_t defaultThirdPartyQuota() { return defaultThirdPartyQuotaFromPerOriginQuota(defaultQuota()); }
Introduce a quota manager for Cache API/Service Worker/IDB storage https://bugs.webkit.org/show_bug.cgi?id=195283 Reviewed by Chris Dumez. Source/WebCore: Introduce a generic quota manager and quota users to be used in Network Process. Quota manager/users are scoped by client origin. Quota manager is used to check for quota by an entity wanting to execute a storage task of a given taskSize. Quota manager will check the current space used by all its quota users. If the size + taskSize is above quota, it will call a function to try extend the quota. In the meantime, the task (and all tasks that may be added) are queued. Once the new quota is received, the quota manager will either allow or disallow the first task in the queue. The quota manager will try to execute as many tasks as possible with the provided quota. If some tasks are remaining and quota limit is hit, the quota manager will compute the space needed for all remaining requests and do another quota extension request. * Sources.txt: * WebCore.xcodeproj/project.pbxproj: * page/ClientOrigin.h: * storage/StorageQuotaManager.cpp: Added. (WebCore::StorageQuotaManager::~StorageQuotaManager): (WebCore::StorageQuotaManager::spaceUsage const): (WebCore::StorageQuotaManager::requestSpace): (WebCore::StorageQuotaManager::askForMoreSpace): (WebCore::StorageQuotaManager::processPendingRequests): * storage/StorageQuotaManager.h: Added. (WebCore::StorageQuotaManager::StorageQuotaManager): (WebCore::StorageQuotaManager::addUser): (WebCore::StorageQuotaManager::removeUser): * storage/StorageQuotaUser.h: Added. Source/WebKit: Remove quota handling from Cache API storage and use StorageQuotaManager/StorageQuotaUser. CacheStorage::Caches becomes a quota user and has a StorageQuotaManager to check for space for any cache API write task. NetworkProcess is responsible to manage the quota managers. Quota managers will go through network process to ask UIProcess for quota extension. Remove pending callback handling from CacheStorage since they are queued in QuotaManager now. * NetworkProcess/NetworkProcess.cpp: (WebKit::NetworkProcess::~NetworkProcess): (WebKit::NetworkProcess::destroySession): (WebKit::NetworkProcess::cacheStorageRootPath): (WebKit::NetworkProcess::setCacheStorageParameters): (WebKit::NetworkProcess::storageQuotaManager): * NetworkProcess/NetworkProcess.h: * NetworkProcess/cache/CacheStorageEngine.cpp: (WebKit::CacheStorage::Engine::from): (WebKit::CacheStorage::Engine::Engine): (WebKit::CacheStorage::Engine::readCachesFromDisk): * NetworkProcess/cache/CacheStorageEngine.h: * NetworkProcess/cache/CacheStorageEngineCache.cpp: (WebKit::CacheStorage::Cache::put): * NetworkProcess/cache/CacheStorageEngineCache.h: * NetworkProcess/cache/CacheStorageEngineCaches.cpp: (WebKit::CacheStorage::Caches::Caches): (WebKit::CacheStorage::Caches::~Caches): (WebKit::CacheStorage::Caches::requestSpace): (WebKit::CacheStorage::Caches::writeRecord): * NetworkProcess/cache/CacheStorageEngineCaches.h: Canonical link: https://commits.webkit.org/209739@main git-svn-id: https://svn.webkit.org/repository/webkit/trunk@242599 268f45cc-cd09-0410-ab3c-d52691b4dbfc
2019-03-07 17:40:40 +00:00
enum class Decision { Deny, Grant };
using RequestCallback = CompletionHandler<void(Decision)>;
Cross-thread version StorageQuotaManager https://bugs.webkit.org/show_bug.cgi?id=203971 <rdar://problem/57290349> Reviewed by Chris Dumez. Source/WebCore: Implement a lock-based StorageQuotaManager so that quota check can be done on different threads. If space request is made on a background thread, it needs to hold a lock until it is finished, so no request from different threads can be performed at the same time. If space request is made on the main thread, we will dispatch it to a background thread and schedule a calllback to the main thread when result is available, so the main thread will not be blocked. Covered by existing quota related tests. * Headers.cmake: * Modules/indexeddb/server/IDBServer.cpp: (WebCore::IDBServer::IDBServer::create): (WebCore::IDBServer::IDBServer::IDBServer): (WebCore::IDBServer::IDBServer::didPerformCloseAndDeleteDatabases): (WebCore::IDBServer::IDBServer::requestSpace): (WebCore::IDBServer::IDBServer::diskUsage): (WebCore::IDBServer::IDBServer::QuotaUser::QuotaUser): Deleted. (WebCore::IDBServer::IDBServer::QuotaUser::~QuotaUser): Deleted. (WebCore::IDBServer::IDBServer::QuotaUser::resetSpaceUsed): Deleted. (WebCore::IDBServer::IDBServer::QuotaUser::computeSpaceUsed): Deleted. (WebCore::IDBServer::IDBServer::QuotaUser::increaseSpaceUsed): Deleted. (WebCore::IDBServer::IDBServer::QuotaUser::decreaseSpaceUsed): Deleted. (WebCore::IDBServer::IDBServer::QuotaUser::whenInitialized): Deleted. (WebCore::IDBServer::IDBServer::QuotaUser::initializeSpaceUsed): Deleted. (WebCore::IDBServer::IDBServer::ensureQuotaUser): Deleted. (WebCore::IDBServer::IDBServer::startComputingSpaceUsedForOrigin): Deleted. (WebCore::IDBServer::IDBServer::computeSpaceUsedForOrigin): Deleted. (WebCore::IDBServer::IDBServer::finishComputingSpaceUsedForOrigin): Deleted. (WebCore::IDBServer::IDBServer::resetSpaceUsed): Deleted. (WebCore::IDBServer::IDBServer::increaseSpaceUsed): Deleted. (WebCore::IDBServer::IDBServer::decreaseSpaceUsed): Deleted. (WebCore::IDBServer::IDBServer::increasePotentialSpaceUsed): Deleted. (WebCore::IDBServer::IDBServer::decreasePotentialSpaceUsed): Deleted. * Modules/indexeddb/server/IDBServer.h: (WebCore::IDBServer::IDBServer::initializeQuotaUser): Deleted. (): Deleted. * Modules/indexeddb/server/UniqueIDBDatabase.cpp: (WebCore::IDBServer::UniqueIDBDatabase::performCurrentOpenOperation): (WebCore::IDBServer::UniqueIDBDatabase::openBackingStore): (WebCore::IDBServer::UniqueIDBDatabase::didOpenBackingStore): (WebCore::IDBServer::UniqueIDBDatabase::createObjectStore): (WebCore::IDBServer::UniqueIDBDatabase::performCreateObjectStore): (WebCore::IDBServer::UniqueIDBDatabase::didPerformCreateObjectStore): (WebCore::IDBServer::UniqueIDBDatabase::deleteObjectStore): (WebCore::IDBServer::UniqueIDBDatabase::renameObjectStore): (WebCore::IDBServer::UniqueIDBDatabase::performRenameObjectStore): (WebCore::IDBServer::UniqueIDBDatabase::didPerformRenameObjectStore): (WebCore::IDBServer::UniqueIDBDatabase::clearObjectStore): (WebCore::IDBServer::UniqueIDBDatabase::createIndex): (WebCore::IDBServer::UniqueIDBDatabase::performCreateIndex): (WebCore::IDBServer::UniqueIDBDatabase::didPerformCreateIndex): (WebCore::IDBServer::UniqueIDBDatabase::deleteIndex): (WebCore::IDBServer::UniqueIDBDatabase::renameIndex): (WebCore::IDBServer::UniqueIDBDatabase::performRenameIndex): (WebCore::IDBServer::UniqueIDBDatabase::didPerformRenameIndex): (WebCore::IDBServer::UniqueIDBDatabase::putOrAdd): (WebCore::IDBServer::UniqueIDBDatabase::performPutOrAdd): (WebCore::IDBServer::UniqueIDBDatabase::didPerformPutOrAdd): (WebCore::IDBServer::UniqueIDBDatabase::getRecord): (WebCore::IDBServer::UniqueIDBDatabase::getAllRecords): (WebCore::IDBServer::UniqueIDBDatabase::performGetRecord): (WebCore::IDBServer::UniqueIDBDatabase::performGetAllRecords): (WebCore::IDBServer::UniqueIDBDatabase::getCount): (WebCore::IDBServer::UniqueIDBDatabase::deleteRecord): (WebCore::IDBServer::UniqueIDBDatabase::openCursor): (WebCore::IDBServer::UniqueIDBDatabase::iterateCursor): (WebCore::IDBServer::UniqueIDBDatabase::commitTransaction): (WebCore::IDBServer::UniqueIDBDatabase::abortTransaction): (WebCore::IDBServer::UniqueIDBDatabase::requestSpace): Deleted. (WebCore::IDBServer::UniqueIDBDatabase::waitForRequestSpaceCompletion): Deleted. (WebCore::IDBServer::UniqueIDBDatabase::startSpaceIncreaseTask): Deleted. (WebCore::IDBServer::UniqueIDBDatabase::finishSpaceIncreaseTask): Deleted. (WebCore::IDBServer::UniqueIDBDatabase::createObjectStoreAfterQuotaCheck): Deleted. (WebCore::IDBServer::UniqueIDBDatabase::deleteObjectStoreAfterQuotaCheck): Deleted. (WebCore::IDBServer::UniqueIDBDatabase::renameObjectStoreAfterQuotaCheck): Deleted. (WebCore::IDBServer::UniqueIDBDatabase::clearObjectStoreAfetQuotaCheck): Deleted. (WebCore::IDBServer::UniqueIDBDatabase::createIndexAfterQuotaCheck): Deleted. (WebCore::IDBServer::UniqueIDBDatabase::deleteIndexAfterQuotaCheck): Deleted. (WebCore::IDBServer::UniqueIDBDatabase::renameIndexAfterQuotaCheck): Deleted. (WebCore::IDBServer::UniqueIDBDatabase::putOrAddAfterQuotaCheck): Deleted. (WebCore::IDBServer::UniqueIDBDatabase::getRecordAfterQuotaCheck): Deleted. (WebCore::IDBServer::UniqueIDBDatabase::getAllRecordsAfterQuotaCheck): Deleted. (WebCore::IDBServer::UniqueIDBDatabase::getCountAfterQuotaCheck): Deleted. (WebCore::IDBServer::UniqueIDBDatabase::deleteRecordAfterQuotaCheck): Deleted. (WebCore::IDBServer::UniqueIDBDatabase::openCursorAfterQuotaCheck): Deleted. (WebCore::IDBServer::UniqueIDBDatabase::iterateCursorAfterQuotaCheck): Deleted. (WebCore::IDBServer::UniqueIDBDatabase::commitTransactionAfterQuotaCheck): Deleted. * Modules/indexeddb/server/UniqueIDBDatabase.h: * Modules/indexeddb/server/UniqueIDBDatabaseConnection.cpp: (WebCore::IDBServer::UniqueIDBDatabaseConnection::abortTransactionWithoutCallback): * Modules/indexeddb/server/UniqueIDBDatabaseTransaction.cpp: (WebCore::IDBServer::UniqueIDBDatabaseTransaction::abort): (WebCore::IDBServer::UniqueIDBDatabaseTransaction::putOrAdd): (WebCore::IDBServer::UniqueIDBDatabaseTransaction::getRecord): (WebCore::IDBServer::UniqueIDBDatabaseTransaction::getAllRecords): (WebCore::IDBServer::UniqueIDBDatabaseTransaction::getCount): (WebCore::IDBServer::UniqueIDBDatabaseTransaction::deleteRecord): (WebCore::IDBServer::UniqueIDBDatabaseTransaction::openCursor): (WebCore::IDBServer::UniqueIDBDatabaseTransaction::iterateCursor): * Modules/indexeddb/shared/InProcessIDBServer.cpp: (WebCore::InProcessIDBServer::quotaManager): (WebCore::storageQuotaManagerSpaceRequester): (WebCore::InProcessIDBServer::InProcessIDBServer): (WebCore::storageQuotaManagerGetter): Deleted. * Modules/indexeddb/shared/InProcessIDBServer.h: * WebCore.xcodeproj/project.pbxproj: * storage/StorageQuotaManager.cpp: (WebCore::StorageQuotaManager::create): (WebCore::StorageQuotaManager::StorageQuotaManager): (WebCore::StorageQuotaManager::requestSpaceOnMainThread): (WebCore::StorageQuotaManager::requestSpaceOnBackgroundThread): (WebCore::StorageQuotaManager::tryGrantRequest): (WebCore::StorageQuotaManager::updateQuotaBasedOnUsage): (WebCore::StorageQuotaManager::resetQuotaUpdatedBasedOnUsageForTesting): (WebCore::StorageQuotaManager::resetQuotaForTesting): (WebCore::StorageQuotaManager::~StorageQuotaManager): Deleted. (WebCore::StorageQuotaManager::spaceUsage const): Deleted. (WebCore::StorageQuotaManager::updateQuotaBasedOnSpaceUsage): Deleted. (WebCore::StorageQuotaManager::initializeUsersIfNeeded): Deleted. (WebCore::StorageQuotaManager::askUserToInitialize): Deleted. (WebCore::StorageQuotaManager::addUser): Deleted. (WebCore::StorageQuotaManager::shouldAskForMoreSpace const): Deleted. (WebCore::StorageQuotaManager::removeUser): Deleted. (WebCore::StorageQuotaManager::requestSpace): Deleted. (WebCore::StorageQuotaManager::askForMoreSpace): Deleted. (WebCore::StorageQuotaManager::processPendingRequests): Deleted. * storage/StorageQuotaManager.h: (WebCore::StorageQuotaManager::defaultThirdPartyQuotaFromPerOriginQuota): (WebCore::StorageQuotaManager::StorageQuotaManager): Deleted. (WebCore::StorageQuotaManager::resetQuota): Deleted. (WebCore::StorageQuotaManager::state const): Deleted. * storage/StorageQuotaUser.h: Removed. Source/WebKit: * NetworkProcess/NetworkProcess.cpp: Introduce class SessionStorageQuotaManager to manage all StorageQuotaManagers of the same session. (WebKit::NetworkProcess::initializeNetworkProcess): (WebKit::NetworkProcess::addWebsiteDataStore): (WebKit::NetworkProcess::addSessionStorageQuotaManager): (WebKit::NetworkProcess::removeSessionStorageQuotaManager): (WebKit::NetworkProcess::destroySession): (WebKit::NetworkProcess::deleteWebsiteData): (WebKit::NetworkProcess::deleteWebsiteDataForOrigins): (WebKit::NetworkProcess::createIDBServer): (WebKit::NetworkProcess::addIndexedDatabaseSession): (WebKit::NetworkProcess::setSessionStorageQuotaManagerIDBRootPath): (WebKit::NetworkProcess::updateQuotaBasedOnSpaceUsageForTesting): (WebKit::NetworkProcess::resetQuota): (WebKit::NetworkProcess::storageQuotaManager): (WebKit::NetworkProcess::initializeStorageQuota): Deleted. (WebKit::NetworkProcess::clearStorageQuota): Deleted. (): Deleted. (WebKit::NetworkProcess::initializeQuotaUsers): Deleted. * NetworkProcess/NetworkProcess.h: (WebKit::NetworkProcess::SessionStorageQuotaManager::SessionStorageQuotaManager): (WebKit::NetworkProcess::SessionStorageQuotaManager::defaultQuota const): (WebKit::NetworkProcess::SessionStorageQuotaManager::ensureOriginStorageQuotaManager): (WebKit::NetworkProcess::SessionStorageQuotaManager::existingStorageQuotaManagers): (WebKit::NetworkProcess::SessionStorageQuotaManager::cacheRootPath const): (WebKit::NetworkProcess::SessionStorageQuotaManager::setIDBRootPath): (WebKit::NetworkProcess::SessionStorageQuotaManager::idbRootPath const): (WebKit::NetworkProcess::StorageQuotaManagers::defaultQuota const): Deleted. (WebKit::NetworkProcess::StorageQuotaManagers::setDefaultQuotas): Deleted. (WebKit::NetworkProcess::StorageQuotaManagers::managersPerOrigin): Deleted. * NetworkProcess/NetworkProcess.messages.in: * NetworkProcess/cache/CacheStorageEngine.cpp: (WebKit::CacheStorage::getDirectorySize): (WebKit::CacheStorage::Engine::diskUsage): static function to get the disk usage of CacheStorage given CacheStorage root directory. (WebKit::CacheStorage::Engine::requestSpace): (WebKit::CacheStorage::Engine::readCachesFromDisk): (WebKit::CacheStorage::Engine::writeSizeFile): (WebKit::CacheStorage::Engine::readSizeFile): (WebKit::CacheStorage::Engine::initializeQuotaUser): Deleted. * NetworkProcess/cache/CacheStorageEngine.h: * NetworkProcess/cache/CacheStorageEngineCache.cpp: (WebKit::CacheStorage::Cache::put): (WebKit::CacheStorage::Cache::remove): * NetworkProcess/cache/CacheStorageEngineCaches.cpp: (WebKit::CacheStorage::Caches::create): (WebKit::CacheStorage::Caches::Caches): (WebKit::CacheStorage::Caches::~Caches): (WebKit::CacheStorage::Caches::updateSizeFile): (WebKit::CacheStorage::Caches::initializeSize): (WebKit::CacheStorage::Caches::clear): (WebKit::CacheStorage::Caches::requestSpace): (WebKit::CacheStorage::Caches::writeRecord): (WebKit::CacheStorage::Caches::removeRecord): (WebKit::CacheStorage::Caches::whenInitialized): Deleted. (WebKit::CacheStorage::Caches::resetSpaceUsed): Deleted. * NetworkProcess/cache/CacheStorageEngineCaches.h: * Shared/WebsiteDataStoreParameters.cpp: (WebKit::WebsiteDataStoreParameters::encode const): (WebKit::WebsiteDataStoreParameters::decode): * Shared/WebsiteDataStoreParameters.h: Add a cacheStorageDirectory parameter so we know the direcotry of CacheStorage when we start using WebsiteDataStore. * UIProcess/API/C/WKWebsiteDataStoreRef.cpp: (WKWebsiteDataStoreResetQuota): * UIProcess/API/C/WKWebsiteDataStoreRef.h: Add a C API for reseting quota in TestRunner. * UIProcess/Network/NetworkProcessProxy.cpp: (WebKit::NetworkProcessProxy::resetQuota): * UIProcess/Network/NetworkProcessProxy.h: * UIProcess/WebProcessPool.cpp: (WebKit::WebProcessPool::ensureNetworkProcess): * UIProcess/WebsiteData/Cocoa/WebsiteDataStoreCocoa.mm: (WebKit::WebsiteDataStore::parameters): * UIProcess/WebsiteData/WebsiteDataStore.cpp: (WebKit::WebsiteDataStore::parameters): (WebKit::WebsiteDataStore::resetQuota): * UIProcess/WebsiteData/WebsiteDataStore.h: Tools: * TestWebKitAPI/TestWebKitAPI.xcodeproj/project.pbxproj: * TestWebKitAPI/Tests/WebCore/StorageQuotaManager.cpp: Removed as we have a different StorageQuotaManager implementation now. * WebKitTestRunner/TestController.cpp: reset StorageQuotaManager's quota between tests. (WTR::TestController::resetStateToConsistentValues): (WTR::TestController::resetQuota): * WebKitTestRunner/TestController.h: Canonical link: https://commits.webkit.org/217990@main git-svn-id: https://svn.webkit.org/repository/webkit/trunk@253025 268f45cc-cd09-0410-ab3c-d52691b4dbfc
2019-12-03 06:53:42 +00:00
WEBCORE_EXPORT void requestSpaceOnMainThread(uint64_t, RequestCallback&&);
WEBCORE_EXPORT Decision requestSpaceOnBackgroundThread(uint64_t);
Introduce a quota manager for Cache API/Service Worker/IDB storage https://bugs.webkit.org/show_bug.cgi?id=195283 Reviewed by Chris Dumez. Source/WebCore: Introduce a generic quota manager and quota users to be used in Network Process. Quota manager/users are scoped by client origin. Quota manager is used to check for quota by an entity wanting to execute a storage task of a given taskSize. Quota manager will check the current space used by all its quota users. If the size + taskSize is above quota, it will call a function to try extend the quota. In the meantime, the task (and all tasks that may be added) are queued. Once the new quota is received, the quota manager will either allow or disallow the first task in the queue. The quota manager will try to execute as many tasks as possible with the provided quota. If some tasks are remaining and quota limit is hit, the quota manager will compute the space needed for all remaining requests and do another quota extension request. * Sources.txt: * WebCore.xcodeproj/project.pbxproj: * page/ClientOrigin.h: * storage/StorageQuotaManager.cpp: Added. (WebCore::StorageQuotaManager::~StorageQuotaManager): (WebCore::StorageQuotaManager::spaceUsage const): (WebCore::StorageQuotaManager::requestSpace): (WebCore::StorageQuotaManager::askForMoreSpace): (WebCore::StorageQuotaManager::processPendingRequests): * storage/StorageQuotaManager.h: Added. (WebCore::StorageQuotaManager::StorageQuotaManager): (WebCore::StorageQuotaManager::addUser): (WebCore::StorageQuotaManager::removeUser): * storage/StorageQuotaUser.h: Added. Source/WebKit: Remove quota handling from Cache API storage and use StorageQuotaManager/StorageQuotaUser. CacheStorage::Caches becomes a quota user and has a StorageQuotaManager to check for space for any cache API write task. NetworkProcess is responsible to manage the quota managers. Quota managers will go through network process to ask UIProcess for quota extension. Remove pending callback handling from CacheStorage since they are queued in QuotaManager now. * NetworkProcess/NetworkProcess.cpp: (WebKit::NetworkProcess::~NetworkProcess): (WebKit::NetworkProcess::destroySession): (WebKit::NetworkProcess::cacheStorageRootPath): (WebKit::NetworkProcess::setCacheStorageParameters): (WebKit::NetworkProcess::storageQuotaManager): * NetworkProcess/NetworkProcess.h: * NetworkProcess/cache/CacheStorageEngine.cpp: (WebKit::CacheStorage::Engine::from): (WebKit::CacheStorage::Engine::Engine): (WebKit::CacheStorage::Engine::readCachesFromDisk): * NetworkProcess/cache/CacheStorageEngine.h: * NetworkProcess/cache/CacheStorageEngineCache.cpp: (WebKit::CacheStorage::Cache::put): * NetworkProcess/cache/CacheStorageEngineCache.h: * NetworkProcess/cache/CacheStorageEngineCaches.cpp: (WebKit::CacheStorage::Caches::Caches): (WebKit::CacheStorage::Caches::~Caches): (WebKit::CacheStorage::Caches::requestSpace): (WebKit::CacheStorage::Caches::writeRecord): * NetworkProcess/cache/CacheStorageEngineCaches.h: Canonical link: https://commits.webkit.org/209739@main git-svn-id: https://svn.webkit.org/repository/webkit/trunk@242599 268f45cc-cd09-0410-ab3c-d52691b4dbfc
2019-03-07 17:40:40 +00:00
Cross-thread version StorageQuotaManager https://bugs.webkit.org/show_bug.cgi?id=203971 <rdar://problem/57290349> Reviewed by Chris Dumez. Source/WebCore: Implement a lock-based StorageQuotaManager so that quota check can be done on different threads. If space request is made on a background thread, it needs to hold a lock until it is finished, so no request from different threads can be performed at the same time. If space request is made on the main thread, we will dispatch it to a background thread and schedule a calllback to the main thread when result is available, so the main thread will not be blocked. Covered by existing quota related tests. * Headers.cmake: * Modules/indexeddb/server/IDBServer.cpp: (WebCore::IDBServer::IDBServer::create): (WebCore::IDBServer::IDBServer::IDBServer): (WebCore::IDBServer::IDBServer::didPerformCloseAndDeleteDatabases): (WebCore::IDBServer::IDBServer::requestSpace): (WebCore::IDBServer::IDBServer::diskUsage): (WebCore::IDBServer::IDBServer::QuotaUser::QuotaUser): Deleted. (WebCore::IDBServer::IDBServer::QuotaUser::~QuotaUser): Deleted. (WebCore::IDBServer::IDBServer::QuotaUser::resetSpaceUsed): Deleted. (WebCore::IDBServer::IDBServer::QuotaUser::computeSpaceUsed): Deleted. (WebCore::IDBServer::IDBServer::QuotaUser::increaseSpaceUsed): Deleted. (WebCore::IDBServer::IDBServer::QuotaUser::decreaseSpaceUsed): Deleted. (WebCore::IDBServer::IDBServer::QuotaUser::whenInitialized): Deleted. (WebCore::IDBServer::IDBServer::QuotaUser::initializeSpaceUsed): Deleted. (WebCore::IDBServer::IDBServer::ensureQuotaUser): Deleted. (WebCore::IDBServer::IDBServer::startComputingSpaceUsedForOrigin): Deleted. (WebCore::IDBServer::IDBServer::computeSpaceUsedForOrigin): Deleted. (WebCore::IDBServer::IDBServer::finishComputingSpaceUsedForOrigin): Deleted. (WebCore::IDBServer::IDBServer::resetSpaceUsed): Deleted. (WebCore::IDBServer::IDBServer::increaseSpaceUsed): Deleted. (WebCore::IDBServer::IDBServer::decreaseSpaceUsed): Deleted. (WebCore::IDBServer::IDBServer::increasePotentialSpaceUsed): Deleted. (WebCore::IDBServer::IDBServer::decreasePotentialSpaceUsed): Deleted. * Modules/indexeddb/server/IDBServer.h: (WebCore::IDBServer::IDBServer::initializeQuotaUser): Deleted. (): Deleted. * Modules/indexeddb/server/UniqueIDBDatabase.cpp: (WebCore::IDBServer::UniqueIDBDatabase::performCurrentOpenOperation): (WebCore::IDBServer::UniqueIDBDatabase::openBackingStore): (WebCore::IDBServer::UniqueIDBDatabase::didOpenBackingStore): (WebCore::IDBServer::UniqueIDBDatabase::createObjectStore): (WebCore::IDBServer::UniqueIDBDatabase::performCreateObjectStore): (WebCore::IDBServer::UniqueIDBDatabase::didPerformCreateObjectStore): (WebCore::IDBServer::UniqueIDBDatabase::deleteObjectStore): (WebCore::IDBServer::UniqueIDBDatabase::renameObjectStore): (WebCore::IDBServer::UniqueIDBDatabase::performRenameObjectStore): (WebCore::IDBServer::UniqueIDBDatabase::didPerformRenameObjectStore): (WebCore::IDBServer::UniqueIDBDatabase::clearObjectStore): (WebCore::IDBServer::UniqueIDBDatabase::createIndex): (WebCore::IDBServer::UniqueIDBDatabase::performCreateIndex): (WebCore::IDBServer::UniqueIDBDatabase::didPerformCreateIndex): (WebCore::IDBServer::UniqueIDBDatabase::deleteIndex): (WebCore::IDBServer::UniqueIDBDatabase::renameIndex): (WebCore::IDBServer::UniqueIDBDatabase::performRenameIndex): (WebCore::IDBServer::UniqueIDBDatabase::didPerformRenameIndex): (WebCore::IDBServer::UniqueIDBDatabase::putOrAdd): (WebCore::IDBServer::UniqueIDBDatabase::performPutOrAdd): (WebCore::IDBServer::UniqueIDBDatabase::didPerformPutOrAdd): (WebCore::IDBServer::UniqueIDBDatabase::getRecord): (WebCore::IDBServer::UniqueIDBDatabase::getAllRecords): (WebCore::IDBServer::UniqueIDBDatabase::performGetRecord): (WebCore::IDBServer::UniqueIDBDatabase::performGetAllRecords): (WebCore::IDBServer::UniqueIDBDatabase::getCount): (WebCore::IDBServer::UniqueIDBDatabase::deleteRecord): (WebCore::IDBServer::UniqueIDBDatabase::openCursor): (WebCore::IDBServer::UniqueIDBDatabase::iterateCursor): (WebCore::IDBServer::UniqueIDBDatabase::commitTransaction): (WebCore::IDBServer::UniqueIDBDatabase::abortTransaction): (WebCore::IDBServer::UniqueIDBDatabase::requestSpace): Deleted. (WebCore::IDBServer::UniqueIDBDatabase::waitForRequestSpaceCompletion): Deleted. (WebCore::IDBServer::UniqueIDBDatabase::startSpaceIncreaseTask): Deleted. (WebCore::IDBServer::UniqueIDBDatabase::finishSpaceIncreaseTask): Deleted. (WebCore::IDBServer::UniqueIDBDatabase::createObjectStoreAfterQuotaCheck): Deleted. (WebCore::IDBServer::UniqueIDBDatabase::deleteObjectStoreAfterQuotaCheck): Deleted. (WebCore::IDBServer::UniqueIDBDatabase::renameObjectStoreAfterQuotaCheck): Deleted. (WebCore::IDBServer::UniqueIDBDatabase::clearObjectStoreAfetQuotaCheck): Deleted. (WebCore::IDBServer::UniqueIDBDatabase::createIndexAfterQuotaCheck): Deleted. (WebCore::IDBServer::UniqueIDBDatabase::deleteIndexAfterQuotaCheck): Deleted. (WebCore::IDBServer::UniqueIDBDatabase::renameIndexAfterQuotaCheck): Deleted. (WebCore::IDBServer::UniqueIDBDatabase::putOrAddAfterQuotaCheck): Deleted. (WebCore::IDBServer::UniqueIDBDatabase::getRecordAfterQuotaCheck): Deleted. (WebCore::IDBServer::UniqueIDBDatabase::getAllRecordsAfterQuotaCheck): Deleted. (WebCore::IDBServer::UniqueIDBDatabase::getCountAfterQuotaCheck): Deleted. (WebCore::IDBServer::UniqueIDBDatabase::deleteRecordAfterQuotaCheck): Deleted. (WebCore::IDBServer::UniqueIDBDatabase::openCursorAfterQuotaCheck): Deleted. (WebCore::IDBServer::UniqueIDBDatabase::iterateCursorAfterQuotaCheck): Deleted. (WebCore::IDBServer::UniqueIDBDatabase::commitTransactionAfterQuotaCheck): Deleted. * Modules/indexeddb/server/UniqueIDBDatabase.h: * Modules/indexeddb/server/UniqueIDBDatabaseConnection.cpp: (WebCore::IDBServer::UniqueIDBDatabaseConnection::abortTransactionWithoutCallback): * Modules/indexeddb/server/UniqueIDBDatabaseTransaction.cpp: (WebCore::IDBServer::UniqueIDBDatabaseTransaction::abort): (WebCore::IDBServer::UniqueIDBDatabaseTransaction::putOrAdd): (WebCore::IDBServer::UniqueIDBDatabaseTransaction::getRecord): (WebCore::IDBServer::UniqueIDBDatabaseTransaction::getAllRecords): (WebCore::IDBServer::UniqueIDBDatabaseTransaction::getCount): (WebCore::IDBServer::UniqueIDBDatabaseTransaction::deleteRecord): (WebCore::IDBServer::UniqueIDBDatabaseTransaction::openCursor): (WebCore::IDBServer::UniqueIDBDatabaseTransaction::iterateCursor): * Modules/indexeddb/shared/InProcessIDBServer.cpp: (WebCore::InProcessIDBServer::quotaManager): (WebCore::storageQuotaManagerSpaceRequester): (WebCore::InProcessIDBServer::InProcessIDBServer): (WebCore::storageQuotaManagerGetter): Deleted. * Modules/indexeddb/shared/InProcessIDBServer.h: * WebCore.xcodeproj/project.pbxproj: * storage/StorageQuotaManager.cpp: (WebCore::StorageQuotaManager::create): (WebCore::StorageQuotaManager::StorageQuotaManager): (WebCore::StorageQuotaManager::requestSpaceOnMainThread): (WebCore::StorageQuotaManager::requestSpaceOnBackgroundThread): (WebCore::StorageQuotaManager::tryGrantRequest): (WebCore::StorageQuotaManager::updateQuotaBasedOnUsage): (WebCore::StorageQuotaManager::resetQuotaUpdatedBasedOnUsageForTesting): (WebCore::StorageQuotaManager::resetQuotaForTesting): (WebCore::StorageQuotaManager::~StorageQuotaManager): Deleted. (WebCore::StorageQuotaManager::spaceUsage const): Deleted. (WebCore::StorageQuotaManager::updateQuotaBasedOnSpaceUsage): Deleted. (WebCore::StorageQuotaManager::initializeUsersIfNeeded): Deleted. (WebCore::StorageQuotaManager::askUserToInitialize): Deleted. (WebCore::StorageQuotaManager::addUser): Deleted. (WebCore::StorageQuotaManager::shouldAskForMoreSpace const): Deleted. (WebCore::StorageQuotaManager::removeUser): Deleted. (WebCore::StorageQuotaManager::requestSpace): Deleted. (WebCore::StorageQuotaManager::askForMoreSpace): Deleted. (WebCore::StorageQuotaManager::processPendingRequests): Deleted. * storage/StorageQuotaManager.h: (WebCore::StorageQuotaManager::defaultThirdPartyQuotaFromPerOriginQuota): (WebCore::StorageQuotaManager::StorageQuotaManager): Deleted. (WebCore::StorageQuotaManager::resetQuota): Deleted. (WebCore::StorageQuotaManager::state const): Deleted. * storage/StorageQuotaUser.h: Removed. Source/WebKit: * NetworkProcess/NetworkProcess.cpp: Introduce class SessionStorageQuotaManager to manage all StorageQuotaManagers of the same session. (WebKit::NetworkProcess::initializeNetworkProcess): (WebKit::NetworkProcess::addWebsiteDataStore): (WebKit::NetworkProcess::addSessionStorageQuotaManager): (WebKit::NetworkProcess::removeSessionStorageQuotaManager): (WebKit::NetworkProcess::destroySession): (WebKit::NetworkProcess::deleteWebsiteData): (WebKit::NetworkProcess::deleteWebsiteDataForOrigins): (WebKit::NetworkProcess::createIDBServer): (WebKit::NetworkProcess::addIndexedDatabaseSession): (WebKit::NetworkProcess::setSessionStorageQuotaManagerIDBRootPath): (WebKit::NetworkProcess::updateQuotaBasedOnSpaceUsageForTesting): (WebKit::NetworkProcess::resetQuota): (WebKit::NetworkProcess::storageQuotaManager): (WebKit::NetworkProcess::initializeStorageQuota): Deleted. (WebKit::NetworkProcess::clearStorageQuota): Deleted. (): Deleted. (WebKit::NetworkProcess::initializeQuotaUsers): Deleted. * NetworkProcess/NetworkProcess.h: (WebKit::NetworkProcess::SessionStorageQuotaManager::SessionStorageQuotaManager): (WebKit::NetworkProcess::SessionStorageQuotaManager::defaultQuota const): (WebKit::NetworkProcess::SessionStorageQuotaManager::ensureOriginStorageQuotaManager): (WebKit::NetworkProcess::SessionStorageQuotaManager::existingStorageQuotaManagers): (WebKit::NetworkProcess::SessionStorageQuotaManager::cacheRootPath const): (WebKit::NetworkProcess::SessionStorageQuotaManager::setIDBRootPath): (WebKit::NetworkProcess::SessionStorageQuotaManager::idbRootPath const): (WebKit::NetworkProcess::StorageQuotaManagers::defaultQuota const): Deleted. (WebKit::NetworkProcess::StorageQuotaManagers::setDefaultQuotas): Deleted. (WebKit::NetworkProcess::StorageQuotaManagers::managersPerOrigin): Deleted. * NetworkProcess/NetworkProcess.messages.in: * NetworkProcess/cache/CacheStorageEngine.cpp: (WebKit::CacheStorage::getDirectorySize): (WebKit::CacheStorage::Engine::diskUsage): static function to get the disk usage of CacheStorage given CacheStorage root directory. (WebKit::CacheStorage::Engine::requestSpace): (WebKit::CacheStorage::Engine::readCachesFromDisk): (WebKit::CacheStorage::Engine::writeSizeFile): (WebKit::CacheStorage::Engine::readSizeFile): (WebKit::CacheStorage::Engine::initializeQuotaUser): Deleted. * NetworkProcess/cache/CacheStorageEngine.h: * NetworkProcess/cache/CacheStorageEngineCache.cpp: (WebKit::CacheStorage::Cache::put): (WebKit::CacheStorage::Cache::remove): * NetworkProcess/cache/CacheStorageEngineCaches.cpp: (WebKit::CacheStorage::Caches::create): (WebKit::CacheStorage::Caches::Caches): (WebKit::CacheStorage::Caches::~Caches): (WebKit::CacheStorage::Caches::updateSizeFile): (WebKit::CacheStorage::Caches::initializeSize): (WebKit::CacheStorage::Caches::clear): (WebKit::CacheStorage::Caches::requestSpace): (WebKit::CacheStorage::Caches::writeRecord): (WebKit::CacheStorage::Caches::removeRecord): (WebKit::CacheStorage::Caches::whenInitialized): Deleted. (WebKit::CacheStorage::Caches::resetSpaceUsed): Deleted. * NetworkProcess/cache/CacheStorageEngineCaches.h: * Shared/WebsiteDataStoreParameters.cpp: (WebKit::WebsiteDataStoreParameters::encode const): (WebKit::WebsiteDataStoreParameters::decode): * Shared/WebsiteDataStoreParameters.h: Add a cacheStorageDirectory parameter so we know the direcotry of CacheStorage when we start using WebsiteDataStore. * UIProcess/API/C/WKWebsiteDataStoreRef.cpp: (WKWebsiteDataStoreResetQuota): * UIProcess/API/C/WKWebsiteDataStoreRef.h: Add a C API for reseting quota in TestRunner. * UIProcess/Network/NetworkProcessProxy.cpp: (WebKit::NetworkProcessProxy::resetQuota): * UIProcess/Network/NetworkProcessProxy.h: * UIProcess/WebProcessPool.cpp: (WebKit::WebProcessPool::ensureNetworkProcess): * UIProcess/WebsiteData/Cocoa/WebsiteDataStoreCocoa.mm: (WebKit::WebsiteDataStore::parameters): * UIProcess/WebsiteData/WebsiteDataStore.cpp: (WebKit::WebsiteDataStore::parameters): (WebKit::WebsiteDataStore::resetQuota): * UIProcess/WebsiteData/WebsiteDataStore.h: Tools: * TestWebKitAPI/TestWebKitAPI.xcodeproj/project.pbxproj: * TestWebKitAPI/Tests/WebCore/StorageQuotaManager.cpp: Removed as we have a different StorageQuotaManager implementation now. * WebKitTestRunner/TestController.cpp: reset StorageQuotaManager's quota between tests. (WTR::TestController::resetStateToConsistentValues): (WTR::TestController::resetQuota): * WebKitTestRunner/TestController.h: Canonical link: https://commits.webkit.org/217990@main git-svn-id: https://svn.webkit.org/repository/webkit/trunk@253025 268f45cc-cd09-0410-ab3c-d52691b4dbfc
2019-12-03 06:53:42 +00:00
WEBCORE_EXPORT void resetQuotaUpdatedBasedOnUsageForTesting();
WEBCORE_EXPORT void resetQuotaForTesting();
Introduce a quota manager for Cache API/Service Worker/IDB storage https://bugs.webkit.org/show_bug.cgi?id=195283 Reviewed by Chris Dumez. Source/WebCore: Introduce a generic quota manager and quota users to be used in Network Process. Quota manager/users are scoped by client origin. Quota manager is used to check for quota by an entity wanting to execute a storage task of a given taskSize. Quota manager will check the current space used by all its quota users. If the size + taskSize is above quota, it will call a function to try extend the quota. In the meantime, the task (and all tasks that may be added) are queued. Once the new quota is received, the quota manager will either allow or disallow the first task in the queue. The quota manager will try to execute as many tasks as possible with the provided quota. If some tasks are remaining and quota limit is hit, the quota manager will compute the space needed for all remaining requests and do another quota extension request. * Sources.txt: * WebCore.xcodeproj/project.pbxproj: * page/ClientOrigin.h: * storage/StorageQuotaManager.cpp: Added. (WebCore::StorageQuotaManager::~StorageQuotaManager): (WebCore::StorageQuotaManager::spaceUsage const): (WebCore::StorageQuotaManager::requestSpace): (WebCore::StorageQuotaManager::askForMoreSpace): (WebCore::StorageQuotaManager::processPendingRequests): * storage/StorageQuotaManager.h: Added. (WebCore::StorageQuotaManager::StorageQuotaManager): (WebCore::StorageQuotaManager::addUser): (WebCore::StorageQuotaManager::removeUser): * storage/StorageQuotaUser.h: Added. Source/WebKit: Remove quota handling from Cache API storage and use StorageQuotaManager/StorageQuotaUser. CacheStorage::Caches becomes a quota user and has a StorageQuotaManager to check for space for any cache API write task. NetworkProcess is responsible to manage the quota managers. Quota managers will go through network process to ask UIProcess for quota extension. Remove pending callback handling from CacheStorage since they are queued in QuotaManager now. * NetworkProcess/NetworkProcess.cpp: (WebKit::NetworkProcess::~NetworkProcess): (WebKit::NetworkProcess::destroySession): (WebKit::NetworkProcess::cacheStorageRootPath): (WebKit::NetworkProcess::setCacheStorageParameters): (WebKit::NetworkProcess::storageQuotaManager): * NetworkProcess/NetworkProcess.h: * NetworkProcess/cache/CacheStorageEngine.cpp: (WebKit::CacheStorage::Engine::from): (WebKit::CacheStorage::Engine::Engine): (WebKit::CacheStorage::Engine::readCachesFromDisk): * NetworkProcess/cache/CacheStorageEngine.h: * NetworkProcess/cache/CacheStorageEngineCache.cpp: (WebKit::CacheStorage::Cache::put): * NetworkProcess/cache/CacheStorageEngineCache.h: * NetworkProcess/cache/CacheStorageEngineCaches.cpp: (WebKit::CacheStorage::Caches::Caches): (WebKit::CacheStorage::Caches::~Caches): (WebKit::CacheStorage::Caches::requestSpace): (WebKit::CacheStorage::Caches::writeRecord): * NetworkProcess/cache/CacheStorageEngineCaches.h: Canonical link: https://commits.webkit.org/209739@main git-svn-id: https://svn.webkit.org/repository/webkit/trunk@242599 268f45cc-cd09-0410-ab3c-d52691b4dbfc
2019-03-07 17:40:40 +00:00
private:
Cross-thread version StorageQuotaManager https://bugs.webkit.org/show_bug.cgi?id=203971 <rdar://problem/57290349> Reviewed by Chris Dumez. Source/WebCore: Implement a lock-based StorageQuotaManager so that quota check can be done on different threads. If space request is made on a background thread, it needs to hold a lock until it is finished, so no request from different threads can be performed at the same time. If space request is made on the main thread, we will dispatch it to a background thread and schedule a calllback to the main thread when result is available, so the main thread will not be blocked. Covered by existing quota related tests. * Headers.cmake: * Modules/indexeddb/server/IDBServer.cpp: (WebCore::IDBServer::IDBServer::create): (WebCore::IDBServer::IDBServer::IDBServer): (WebCore::IDBServer::IDBServer::didPerformCloseAndDeleteDatabases): (WebCore::IDBServer::IDBServer::requestSpace): (WebCore::IDBServer::IDBServer::diskUsage): (WebCore::IDBServer::IDBServer::QuotaUser::QuotaUser): Deleted. (WebCore::IDBServer::IDBServer::QuotaUser::~QuotaUser): Deleted. (WebCore::IDBServer::IDBServer::QuotaUser::resetSpaceUsed): Deleted. (WebCore::IDBServer::IDBServer::QuotaUser::computeSpaceUsed): Deleted. (WebCore::IDBServer::IDBServer::QuotaUser::increaseSpaceUsed): Deleted. (WebCore::IDBServer::IDBServer::QuotaUser::decreaseSpaceUsed): Deleted. (WebCore::IDBServer::IDBServer::QuotaUser::whenInitialized): Deleted. (WebCore::IDBServer::IDBServer::QuotaUser::initializeSpaceUsed): Deleted. (WebCore::IDBServer::IDBServer::ensureQuotaUser): Deleted. (WebCore::IDBServer::IDBServer::startComputingSpaceUsedForOrigin): Deleted. (WebCore::IDBServer::IDBServer::computeSpaceUsedForOrigin): Deleted. (WebCore::IDBServer::IDBServer::finishComputingSpaceUsedForOrigin): Deleted. (WebCore::IDBServer::IDBServer::resetSpaceUsed): Deleted. (WebCore::IDBServer::IDBServer::increaseSpaceUsed): Deleted. (WebCore::IDBServer::IDBServer::decreaseSpaceUsed): Deleted. (WebCore::IDBServer::IDBServer::increasePotentialSpaceUsed): Deleted. (WebCore::IDBServer::IDBServer::decreasePotentialSpaceUsed): Deleted. * Modules/indexeddb/server/IDBServer.h: (WebCore::IDBServer::IDBServer::initializeQuotaUser): Deleted. (): Deleted. * Modules/indexeddb/server/UniqueIDBDatabase.cpp: (WebCore::IDBServer::UniqueIDBDatabase::performCurrentOpenOperation): (WebCore::IDBServer::UniqueIDBDatabase::openBackingStore): (WebCore::IDBServer::UniqueIDBDatabase::didOpenBackingStore): (WebCore::IDBServer::UniqueIDBDatabase::createObjectStore): (WebCore::IDBServer::UniqueIDBDatabase::performCreateObjectStore): (WebCore::IDBServer::UniqueIDBDatabase::didPerformCreateObjectStore): (WebCore::IDBServer::UniqueIDBDatabase::deleteObjectStore): (WebCore::IDBServer::UniqueIDBDatabase::renameObjectStore): (WebCore::IDBServer::UniqueIDBDatabase::performRenameObjectStore): (WebCore::IDBServer::UniqueIDBDatabase::didPerformRenameObjectStore): (WebCore::IDBServer::UniqueIDBDatabase::clearObjectStore): (WebCore::IDBServer::UniqueIDBDatabase::createIndex): (WebCore::IDBServer::UniqueIDBDatabase::performCreateIndex): (WebCore::IDBServer::UniqueIDBDatabase::didPerformCreateIndex): (WebCore::IDBServer::UniqueIDBDatabase::deleteIndex): (WebCore::IDBServer::UniqueIDBDatabase::renameIndex): (WebCore::IDBServer::UniqueIDBDatabase::performRenameIndex): (WebCore::IDBServer::UniqueIDBDatabase::didPerformRenameIndex): (WebCore::IDBServer::UniqueIDBDatabase::putOrAdd): (WebCore::IDBServer::UniqueIDBDatabase::performPutOrAdd): (WebCore::IDBServer::UniqueIDBDatabase::didPerformPutOrAdd): (WebCore::IDBServer::UniqueIDBDatabase::getRecord): (WebCore::IDBServer::UniqueIDBDatabase::getAllRecords): (WebCore::IDBServer::UniqueIDBDatabase::performGetRecord): (WebCore::IDBServer::UniqueIDBDatabase::performGetAllRecords): (WebCore::IDBServer::UniqueIDBDatabase::getCount): (WebCore::IDBServer::UniqueIDBDatabase::deleteRecord): (WebCore::IDBServer::UniqueIDBDatabase::openCursor): (WebCore::IDBServer::UniqueIDBDatabase::iterateCursor): (WebCore::IDBServer::UniqueIDBDatabase::commitTransaction): (WebCore::IDBServer::UniqueIDBDatabase::abortTransaction): (WebCore::IDBServer::UniqueIDBDatabase::requestSpace): Deleted. (WebCore::IDBServer::UniqueIDBDatabase::waitForRequestSpaceCompletion): Deleted. (WebCore::IDBServer::UniqueIDBDatabase::startSpaceIncreaseTask): Deleted. (WebCore::IDBServer::UniqueIDBDatabase::finishSpaceIncreaseTask): Deleted. (WebCore::IDBServer::UniqueIDBDatabase::createObjectStoreAfterQuotaCheck): Deleted. (WebCore::IDBServer::UniqueIDBDatabase::deleteObjectStoreAfterQuotaCheck): Deleted. (WebCore::IDBServer::UniqueIDBDatabase::renameObjectStoreAfterQuotaCheck): Deleted. (WebCore::IDBServer::UniqueIDBDatabase::clearObjectStoreAfetQuotaCheck): Deleted. (WebCore::IDBServer::UniqueIDBDatabase::createIndexAfterQuotaCheck): Deleted. (WebCore::IDBServer::UniqueIDBDatabase::deleteIndexAfterQuotaCheck): Deleted. (WebCore::IDBServer::UniqueIDBDatabase::renameIndexAfterQuotaCheck): Deleted. (WebCore::IDBServer::UniqueIDBDatabase::putOrAddAfterQuotaCheck): Deleted. (WebCore::IDBServer::UniqueIDBDatabase::getRecordAfterQuotaCheck): Deleted. (WebCore::IDBServer::UniqueIDBDatabase::getAllRecordsAfterQuotaCheck): Deleted. (WebCore::IDBServer::UniqueIDBDatabase::getCountAfterQuotaCheck): Deleted. (WebCore::IDBServer::UniqueIDBDatabase::deleteRecordAfterQuotaCheck): Deleted. (WebCore::IDBServer::UniqueIDBDatabase::openCursorAfterQuotaCheck): Deleted. (WebCore::IDBServer::UniqueIDBDatabase::iterateCursorAfterQuotaCheck): Deleted. (WebCore::IDBServer::UniqueIDBDatabase::commitTransactionAfterQuotaCheck): Deleted. * Modules/indexeddb/server/UniqueIDBDatabase.h: * Modules/indexeddb/server/UniqueIDBDatabaseConnection.cpp: (WebCore::IDBServer::UniqueIDBDatabaseConnection::abortTransactionWithoutCallback): * Modules/indexeddb/server/UniqueIDBDatabaseTransaction.cpp: (WebCore::IDBServer::UniqueIDBDatabaseTransaction::abort): (WebCore::IDBServer::UniqueIDBDatabaseTransaction::putOrAdd): (WebCore::IDBServer::UniqueIDBDatabaseTransaction::getRecord): (WebCore::IDBServer::UniqueIDBDatabaseTransaction::getAllRecords): (WebCore::IDBServer::UniqueIDBDatabaseTransaction::getCount): (WebCore::IDBServer::UniqueIDBDatabaseTransaction::deleteRecord): (WebCore::IDBServer::UniqueIDBDatabaseTransaction::openCursor): (WebCore::IDBServer::UniqueIDBDatabaseTransaction::iterateCursor): * Modules/indexeddb/shared/InProcessIDBServer.cpp: (WebCore::InProcessIDBServer::quotaManager): (WebCore::storageQuotaManagerSpaceRequester): (WebCore::InProcessIDBServer::InProcessIDBServer): (WebCore::storageQuotaManagerGetter): Deleted. * Modules/indexeddb/shared/InProcessIDBServer.h: * WebCore.xcodeproj/project.pbxproj: * storage/StorageQuotaManager.cpp: (WebCore::StorageQuotaManager::create): (WebCore::StorageQuotaManager::StorageQuotaManager): (WebCore::StorageQuotaManager::requestSpaceOnMainThread): (WebCore::StorageQuotaManager::requestSpaceOnBackgroundThread): (WebCore::StorageQuotaManager::tryGrantRequest): (WebCore::StorageQuotaManager::updateQuotaBasedOnUsage): (WebCore::StorageQuotaManager::resetQuotaUpdatedBasedOnUsageForTesting): (WebCore::StorageQuotaManager::resetQuotaForTesting): (WebCore::StorageQuotaManager::~StorageQuotaManager): Deleted. (WebCore::StorageQuotaManager::spaceUsage const): Deleted. (WebCore::StorageQuotaManager::updateQuotaBasedOnSpaceUsage): Deleted. (WebCore::StorageQuotaManager::initializeUsersIfNeeded): Deleted. (WebCore::StorageQuotaManager::askUserToInitialize): Deleted. (WebCore::StorageQuotaManager::addUser): Deleted. (WebCore::StorageQuotaManager::shouldAskForMoreSpace const): Deleted. (WebCore::StorageQuotaManager::removeUser): Deleted. (WebCore::StorageQuotaManager::requestSpace): Deleted. (WebCore::StorageQuotaManager::askForMoreSpace): Deleted. (WebCore::StorageQuotaManager::processPendingRequests): Deleted. * storage/StorageQuotaManager.h: (WebCore::StorageQuotaManager::defaultThirdPartyQuotaFromPerOriginQuota): (WebCore::StorageQuotaManager::StorageQuotaManager): Deleted. (WebCore::StorageQuotaManager::resetQuota): Deleted. (WebCore::StorageQuotaManager::state const): Deleted. * storage/StorageQuotaUser.h: Removed. Source/WebKit: * NetworkProcess/NetworkProcess.cpp: Introduce class SessionStorageQuotaManager to manage all StorageQuotaManagers of the same session. (WebKit::NetworkProcess::initializeNetworkProcess): (WebKit::NetworkProcess::addWebsiteDataStore): (WebKit::NetworkProcess::addSessionStorageQuotaManager): (WebKit::NetworkProcess::removeSessionStorageQuotaManager): (WebKit::NetworkProcess::destroySession): (WebKit::NetworkProcess::deleteWebsiteData): (WebKit::NetworkProcess::deleteWebsiteDataForOrigins): (WebKit::NetworkProcess::createIDBServer): (WebKit::NetworkProcess::addIndexedDatabaseSession): (WebKit::NetworkProcess::setSessionStorageQuotaManagerIDBRootPath): (WebKit::NetworkProcess::updateQuotaBasedOnSpaceUsageForTesting): (WebKit::NetworkProcess::resetQuota): (WebKit::NetworkProcess::storageQuotaManager): (WebKit::NetworkProcess::initializeStorageQuota): Deleted. (WebKit::NetworkProcess::clearStorageQuota): Deleted. (): Deleted. (WebKit::NetworkProcess::initializeQuotaUsers): Deleted. * NetworkProcess/NetworkProcess.h: (WebKit::NetworkProcess::SessionStorageQuotaManager::SessionStorageQuotaManager): (WebKit::NetworkProcess::SessionStorageQuotaManager::defaultQuota const): (WebKit::NetworkProcess::SessionStorageQuotaManager::ensureOriginStorageQuotaManager): (WebKit::NetworkProcess::SessionStorageQuotaManager::existingStorageQuotaManagers): (WebKit::NetworkProcess::SessionStorageQuotaManager::cacheRootPath const): (WebKit::NetworkProcess::SessionStorageQuotaManager::setIDBRootPath): (WebKit::NetworkProcess::SessionStorageQuotaManager::idbRootPath const): (WebKit::NetworkProcess::StorageQuotaManagers::defaultQuota const): Deleted. (WebKit::NetworkProcess::StorageQuotaManagers::setDefaultQuotas): Deleted. (WebKit::NetworkProcess::StorageQuotaManagers::managersPerOrigin): Deleted. * NetworkProcess/NetworkProcess.messages.in: * NetworkProcess/cache/CacheStorageEngine.cpp: (WebKit::CacheStorage::getDirectorySize): (WebKit::CacheStorage::Engine::diskUsage): static function to get the disk usage of CacheStorage given CacheStorage root directory. (WebKit::CacheStorage::Engine::requestSpace): (WebKit::CacheStorage::Engine::readCachesFromDisk): (WebKit::CacheStorage::Engine::writeSizeFile): (WebKit::CacheStorage::Engine::readSizeFile): (WebKit::CacheStorage::Engine::initializeQuotaUser): Deleted. * NetworkProcess/cache/CacheStorageEngine.h: * NetworkProcess/cache/CacheStorageEngineCache.cpp: (WebKit::CacheStorage::Cache::put): (WebKit::CacheStorage::Cache::remove): * NetworkProcess/cache/CacheStorageEngineCaches.cpp: (WebKit::CacheStorage::Caches::create): (WebKit::CacheStorage::Caches::Caches): (WebKit::CacheStorage::Caches::~Caches): (WebKit::CacheStorage::Caches::updateSizeFile): (WebKit::CacheStorage::Caches::initializeSize): (WebKit::CacheStorage::Caches::clear): (WebKit::CacheStorage::Caches::requestSpace): (WebKit::CacheStorage::Caches::writeRecord): (WebKit::CacheStorage::Caches::removeRecord): (WebKit::CacheStorage::Caches::whenInitialized): Deleted. (WebKit::CacheStorage::Caches::resetSpaceUsed): Deleted. * NetworkProcess/cache/CacheStorageEngineCaches.h: * Shared/WebsiteDataStoreParameters.cpp: (WebKit::WebsiteDataStoreParameters::encode const): (WebKit::WebsiteDataStoreParameters::decode): * Shared/WebsiteDataStoreParameters.h: Add a cacheStorageDirectory parameter so we know the direcotry of CacheStorage when we start using WebsiteDataStore. * UIProcess/API/C/WKWebsiteDataStoreRef.cpp: (WKWebsiteDataStoreResetQuota): * UIProcess/API/C/WKWebsiteDataStoreRef.h: Add a C API for reseting quota in TestRunner. * UIProcess/Network/NetworkProcessProxy.cpp: (WebKit::NetworkProcessProxy::resetQuota): * UIProcess/Network/NetworkProcessProxy.h: * UIProcess/WebProcessPool.cpp: (WebKit::WebProcessPool::ensureNetworkProcess): * UIProcess/WebsiteData/Cocoa/WebsiteDataStoreCocoa.mm: (WebKit::WebsiteDataStore::parameters): * UIProcess/WebsiteData/WebsiteDataStore.cpp: (WebKit::WebsiteDataStore::parameters): (WebKit::WebsiteDataStore::resetQuota): * UIProcess/WebsiteData/WebsiteDataStore.h: Tools: * TestWebKitAPI/TestWebKitAPI.xcodeproj/project.pbxproj: * TestWebKitAPI/Tests/WebCore/StorageQuotaManager.cpp: Removed as we have a different StorageQuotaManager implementation now. * WebKitTestRunner/TestController.cpp: reset StorageQuotaManager's quota between tests. (WTR::TestController::resetStateToConsistentValues): (WTR::TestController::resetQuota): * WebKitTestRunner/TestController.h: Canonical link: https://commits.webkit.org/217990@main git-svn-id: https://svn.webkit.org/repository/webkit/trunk@253025 268f45cc-cd09-0410-ab3c-d52691b4dbfc
2019-12-03 06:53:42 +00:00
StorageQuotaManager(uint64_t quota, UsageGetter&&, QuotaIncreaseRequester&&);
Use CheckedLock more in WebCore https://bugs.webkit.org/show_bug.cgi?id=226026 Reviewed by Geoffrey Garen. Use CheckedLock more in WebCore to benefit from Clang Thread Safety Analysis. * Modules/indexeddb/IDBObjectStore.cpp: (WebCore::IDBObjectStore::createIndex): (WebCore::IDBObjectStore::index): (WebCore::IDBObjectStore::deleteIndex): (WebCore::IDBObjectStore::rollbackForVersionChangeAbort): (WebCore::IDBObjectStore::visitReferencedIndexes const): (WebCore::IDBObjectStore::renameReferencedIndex): * Modules/indexeddb/IDBObjectStore.h: * Modules/indexeddb/IDBTransaction.cpp: (WebCore::IDBTransaction::objectStore): (WebCore::IDBTransaction::internalAbort): (WebCore::IDBTransaction::createObjectStore): (WebCore::IDBTransaction::renameObjectStore): (WebCore::IDBTransaction::renameIndex): (WebCore::IDBTransaction::deleteObjectStore): (WebCore::IDBTransaction::visitReferencedObjectStores const): * Modules/indexeddb/IDBTransaction.h: * Modules/indexeddb/client/IDBConnectionProxy.cpp: (WebCore::IDBClient::IDBConnectionProxy::openDatabase): (WebCore::IDBClient::IDBConnectionProxy::deleteDatabase): (WebCore::IDBClient::IDBConnectionProxy::completeOpenDBRequest): (WebCore::IDBClient::IDBConnectionProxy::saveOperation): (WebCore::IDBClient::IDBConnectionProxy::completeOperation): (WebCore::IDBClient::IDBConnectionProxy::fireVersionChangeEvent): (WebCore::IDBClient::IDBConnectionProxy::notifyOpenDBRequestBlocked): (WebCore::IDBClient::IDBConnectionProxy::establishTransaction): (WebCore::IDBClient::IDBConnectionProxy::didStartTransaction): (WebCore::IDBClient::IDBConnectionProxy::commitTransaction): (WebCore::IDBClient::IDBConnectionProxy::didCommitTransaction): (WebCore::IDBClient::IDBConnectionProxy::abortTransaction): (WebCore::IDBClient::IDBConnectionProxy::didAbortTransaction): (WebCore::IDBClient::IDBConnectionProxy::didCloseFromServer): (WebCore::IDBClient::IDBConnectionProxy::connectionToServerLost): (WebCore::IDBClient::IDBConnectionProxy::scheduleMainThreadTasks): (WebCore::IDBClient::IDBConnectionProxy::handleMainThreadTasks): (WebCore::IDBClient::IDBConnectionProxy::getAllDatabaseNamesAndVersions): (WebCore::IDBClient::IDBConnectionProxy::didGetAllDatabaseNamesAndVersions): (WebCore::IDBClient::IDBConnectionProxy::registerDatabaseConnection): (WebCore::IDBClient::IDBConnectionProxy::unregisterDatabaseConnection): (WebCore::IDBClient::IDBConnectionProxy::forgetActiveOperations): (WebCore::IDBClient::IDBConnectionProxy::forgetTransaction): (WebCore::IDBClient::IDBConnectionProxy::forgetActivityForCurrentThread): (WebCore::IDBClient::IDBConnectionProxy::setContextSuspended): * Modules/indexeddb/client/IDBConnectionProxy.h: * Modules/mediastream/RTCRtpSFrameTransformer.cpp: (WebCore::RTCRtpSFrameTransformer::setEncryptionKey): (WebCore::RTCRtpSFrameTransformer::decryptFrame): (WebCore::RTCRtpSFrameTransformer::encryptFrame): * Modules/mediastream/RTCRtpSFrameTransformer.h: * Modules/mediastream/RTCRtpScriptTransform.cpp: (WebCore::RTCRtpScriptTransform::setTransformer): (WebCore::RTCRtpScriptTransform::setupTransformer): (WebCore::RTCRtpScriptTransform::clear): * Modules/mediastream/RTCRtpScriptTransform.h: * Modules/mediastream/libwebrtc/LibWebRTCDataChannelHandler.cpp: (WebCore::LibWebRTCDataChannelHandler::setClient): (WebCore::LibWebRTCDataChannelHandler::checkState): (WebCore::LibWebRTCDataChannelHandler::OnMessage): (WebCore::LibWebRTCDataChannelHandler::OnBufferedAmountChange): * Modules/mediastream/libwebrtc/LibWebRTCDataChannelHandler.h: * Modules/mediastream/libwebrtc/LibWebRTCRtpTransformBackend.cpp: (WebCore::LibWebRTCRtpTransformBackend::setInputCallback): (WebCore::LibWebRTCRtpTransformBackend::setOutputCallback): (WebCore::LibWebRTCRtpTransformBackend::processTransformedFrame): (WebCore::LibWebRTCRtpTransformBackend::Transform): * Modules/mediastream/libwebrtc/LibWebRTCRtpTransformBackend.h: * inspector/agents/WebHeapAgent.cpp: (WebCore::SendGarbageCollectionEventsTask::addGarbageCollection): (WebCore::SendGarbageCollectionEventsTask::reset): (WebCore::SendGarbageCollectionEventsTask::timerFired): * page/ResourceUsageThread.cpp: (WebCore::ResourceUsageThread::addObserver): (WebCore::ResourceUsageThread::removeObserver): (WebCore::ResourceUsageThread::waitUntilObservers): (WebCore::ResourceUsageThread::notifyObservers): * page/ResourceUsageThread.h: * page/WheelEventTestMonitor.cpp: (WebCore::WheelEventTestMonitor::clearAllTestDeferrals): (WebCore::WheelEventTestMonitor::setTestCallbackAndStartMonitoring): (WebCore::WheelEventTestMonitor::deferForReason): (WebCore::WheelEventTestMonitor::removeDeferralForReason): (WebCore::WheelEventTestMonitor::receivedWheelEvent): (WebCore::WheelEventTestMonitor::checkShouldFireCallbacks): * page/WheelEventTestMonitor.h: (WebCore::WheelEventTestMonitor::WTF_GUARDED_BY_LOCK): * page/scrolling/ScrollingTree.cpp: (WebCore::ScrollingTree::computeWheelProcessingSteps): (WebCore::ScrollingTree::determineWheelEventProcessing): (WebCore::ScrollingTree::handleWheelEvent): (WebCore::ScrollingTree::commitTreeState): (WebCore::ScrollingTree::mainFrameScrollPosition const): (WebCore::ScrollingTree::setMainFrameScrollPosition): (WebCore::ScrollingTree::setGestureState): (WebCore::ScrollingTree::gestureState): (WebCore::ScrollingTree::eventTrackingTypeForPoint): (WebCore::ScrollingTree::isRubberBandInProgressForNode): (WebCore::ScrollingTree::setRubberBandingInProgressForNode): (WebCore::ScrollingTree::isUserScrollInProgressForNode): (WebCore::ScrollingTree::setUserScrollInProgressForNode): (WebCore::ScrollingTree::clearNodesWithUserScrollInProgress): (WebCore::ScrollingTree::isScrollSnapInProgressForNode): (WebCore::ScrollingTree::setNodeScrollSnapInProgress): (WebCore::ScrollingTree::setMainFramePinnedState): (WebCore::ScrollingTree::setMainFrameCanRubberBand): (WebCore::ScrollingTree::mainFrameCanRubberBandInDirection): (WebCore::ScrollingTree::addPendingScrollUpdate): (WebCore::ScrollingTree::takePendingScrollUpdates): (WebCore::ScrollingTree::setScrollPinningBehavior): (WebCore::ScrollingTree::scrollPinningBehavior): (WebCore::ScrollingTree::willWheelEventStartSwipeGesture): (WebCore::ScrollingTree::windowScreenDidChange): (WebCore::ScrollingTree::displayID): (WebCore::ScrollingTree::hasProcessedWheelEventsRecently): (WebCore::ScrollingTree::willProcessWheelEvent): (WebCore::ScrollingTree::nominalFramesPerSecond): (WebCore::ScrollingTree::scrollingTreeAsText): * page/scrolling/ScrollingTree.h: * page/scrolling/ScrollingTreeLatchingController.cpp: (WebCore::ScrollingTreeLatchingController::receivedWheelEvent): (WebCore::ScrollingTreeLatchingController::latchingDataForEvent const): (WebCore::ScrollingTreeLatchingController::latchedNodeID const): (WebCore::ScrollingTreeLatchingController::latchedNodeAndSteps const): (WebCore::ScrollingTreeLatchingController::nodeDidHandleEvent): (WebCore::ScrollingTreeLatchingController::nodeWasRemoved): (WebCore::ScrollingTreeLatchingController::clearLatchedNode): * page/scrolling/ScrollingTreeLatchingController.h: * platform/audio/HRTFDatabaseLoader.cpp: (WebCore::HRTFDatabaseLoader::loadAsynchronously): (WebCore::HRTFDatabaseLoader::waitForLoaderThreadCompletion): * platform/audio/HRTFDatabaseLoader.h: * platform/audio/cocoa/AudioDestinationCocoa.cpp: (WebCore::AudioDestinationCocoa::hasEnoughFrames const): (WebCore::AudioDestinationCocoa::render): (WebCore::AudioDestinationCocoa::renderOnRenderingThead): * platform/audio/cocoa/AudioDestinationCocoa.h: * platform/encryptedmedia/CDMProxy.cpp: (WebCore::CDMProxy::instance const): (WebCore::CDMProxy::setInstance): (WebCore::CDMProxy::startedWaitingForKey const): (WebCore::CDMProxy::stoppedWaitingForKey const): * platform/encryptedmedia/CDMProxy.h: * platform/graphics/avfoundation/MediaPlayerPrivateAVFoundation.cpp: (WebCore::MediaPlayerPrivateAVFoundation::MediaPlayerPrivateAVFoundation): (WebCore::MediaPlayerPrivateAVFoundation::setDelayCallbacks const): (WebCore::MediaPlayerPrivateAVFoundation::clearMainThreadPendingFlag): (WebCore::MediaPlayerPrivateAVFoundation::scheduleMainThreadNotification): (WebCore::MediaPlayerPrivateAVFoundation::dispatchNotification): * platform/graphics/avfoundation/MediaPlayerPrivateAVFoundation.h: * platform/graphics/avfoundation/objc/MediaPlayerPrivateMediaStreamAVFObjC.h: * platform/graphics/avfoundation/objc/MediaPlayerPrivateMediaStreamAVFObjC.mm: (WebCore::MediaPlayerPrivateMediaStreamAVFObjC::processNewVideoSample): * platform/graphics/cg/IOSurfacePool.cpp: (WebCore::IOSurfacePool::takeSurface): (WebCore::IOSurfacePool::addSurface): (WebCore::IOSurfacePool::setPoolSize): (WebCore::IOSurfacePool::collectionTimerFired): (WebCore::IOSurfacePool::discardAllSurfaces): * platform/graphics/cg/IOSurfacePool.h: (WebCore::IOSurfacePool::WTF_GUARDED_BY_LOCK): * platform/graphics/cg/SubimageCacheWithTimer.cpp: (WebCore::SubimageCacheWithTimer::pruneCacheTimerFired): (WebCore::SubimageCacheWithTimer::subimage): (WebCore::SubimageCacheWithTimer::clearImageAndSubimages): (WebCore::SubimageCacheWithTimer::clearAll): * platform/graphics/cg/SubimageCacheWithTimer.h: * platform/graphics/cocoa/FontCacheCoreText.cpp: (WebCore::FontDatabase::collectionForFamily): (WebCore::FontDatabase::clear): * platform/network/cocoa/WebCoreNSURLSession.mm: (WebCore::WebCoreNSURLSessionDataTaskClient::clearTask): (WebCore::WebCoreNSURLSessionDataTaskClient::dataSent): (WebCore::WebCoreNSURLSessionDataTaskClient::responseReceived): (WebCore::WebCoreNSURLSessionDataTaskClient::shouldCacheResponse): (WebCore::WebCoreNSURLSessionDataTaskClient::dataReceived): (WebCore::WebCoreNSURLSessionDataTaskClient::redirectReceived): (WebCore::WebCoreNSURLSessionDataTaskClient::accessControlCheckFailed): (WebCore::WebCoreNSURLSessionDataTaskClient::loadFailed): (WebCore::WebCoreNSURLSessionDataTaskClient::loadFinished): * platform/network/mac/WebCoreResourceHandleAsOperationQueueDelegate.h: * platform/network/mac/WebCoreResourceHandleAsOperationQueueDelegate.mm: (-[WebCoreResourceHandleAsOperationQueueDelegate detachHandle]): (-[WebCoreResourceHandleAsOperationQueueDelegate connection:willSendRequest:redirectResponse:]): (-[WebCoreResourceHandleAsOperationQueueDelegate connection:canAuthenticateAgainstProtectionSpace:]): (-[WebCoreResourceHandleAsOperationQueueDelegate connection:willCacheResponse:]): * storage/StorageQuotaManager.cpp: (WebCore::StorageQuotaManager::requestSpaceOnBackgroundThread): (WebCore::StorageQuotaManager::resetQuotaUpdatedBasedOnUsageForTesting): (WebCore::StorageQuotaManager::resetQuotaForTesting): * storage/StorageQuotaManager.h: (WebCore::StorageQuotaManager::WTF_GUARDED_BY_LOCK): * workers/WorkerOrWorkletScriptController.cpp: (WebCore::WorkerOrWorkletScriptController::scheduleExecutionTermination): (WebCore::WorkerOrWorkletScriptController::isTerminatingExecution const): * workers/WorkerOrWorkletScriptController.h: (WebCore::WorkerOrWorkletScriptController::WTF_GUARDED_BY_LOCK): Canonical link: https://commits.webkit.org/237960@main git-svn-id: https://svn.webkit.org/repository/webkit/trunk@277805 268f45cc-cd09-0410-ab3c-d52691b4dbfc
2021-05-20 18:41:33 +00:00
bool tryGrantRequest(uint64_t) WTF_REQUIRES_LOCK(m_quotaCountDownLock);
2019-04-10 16:30:58 +00:00
Cross-thread version StorageQuotaManager https://bugs.webkit.org/show_bug.cgi?id=203971 <rdar://problem/57290349> Reviewed by Chris Dumez. Source/WebCore: Implement a lock-based StorageQuotaManager so that quota check can be done on different threads. If space request is made on a background thread, it needs to hold a lock until it is finished, so no request from different threads can be performed at the same time. If space request is made on the main thread, we will dispatch it to a background thread and schedule a calllback to the main thread when result is available, so the main thread will not be blocked. Covered by existing quota related tests. * Headers.cmake: * Modules/indexeddb/server/IDBServer.cpp: (WebCore::IDBServer::IDBServer::create): (WebCore::IDBServer::IDBServer::IDBServer): (WebCore::IDBServer::IDBServer::didPerformCloseAndDeleteDatabases): (WebCore::IDBServer::IDBServer::requestSpace): (WebCore::IDBServer::IDBServer::diskUsage): (WebCore::IDBServer::IDBServer::QuotaUser::QuotaUser): Deleted. (WebCore::IDBServer::IDBServer::QuotaUser::~QuotaUser): Deleted. (WebCore::IDBServer::IDBServer::QuotaUser::resetSpaceUsed): Deleted. (WebCore::IDBServer::IDBServer::QuotaUser::computeSpaceUsed): Deleted. (WebCore::IDBServer::IDBServer::QuotaUser::increaseSpaceUsed): Deleted. (WebCore::IDBServer::IDBServer::QuotaUser::decreaseSpaceUsed): Deleted. (WebCore::IDBServer::IDBServer::QuotaUser::whenInitialized): Deleted. (WebCore::IDBServer::IDBServer::QuotaUser::initializeSpaceUsed): Deleted. (WebCore::IDBServer::IDBServer::ensureQuotaUser): Deleted. (WebCore::IDBServer::IDBServer::startComputingSpaceUsedForOrigin): Deleted. (WebCore::IDBServer::IDBServer::computeSpaceUsedForOrigin): Deleted. (WebCore::IDBServer::IDBServer::finishComputingSpaceUsedForOrigin): Deleted. (WebCore::IDBServer::IDBServer::resetSpaceUsed): Deleted. (WebCore::IDBServer::IDBServer::increaseSpaceUsed): Deleted. (WebCore::IDBServer::IDBServer::decreaseSpaceUsed): Deleted. (WebCore::IDBServer::IDBServer::increasePotentialSpaceUsed): Deleted. (WebCore::IDBServer::IDBServer::decreasePotentialSpaceUsed): Deleted. * Modules/indexeddb/server/IDBServer.h: (WebCore::IDBServer::IDBServer::initializeQuotaUser): Deleted. (): Deleted. * Modules/indexeddb/server/UniqueIDBDatabase.cpp: (WebCore::IDBServer::UniqueIDBDatabase::performCurrentOpenOperation): (WebCore::IDBServer::UniqueIDBDatabase::openBackingStore): (WebCore::IDBServer::UniqueIDBDatabase::didOpenBackingStore): (WebCore::IDBServer::UniqueIDBDatabase::createObjectStore): (WebCore::IDBServer::UniqueIDBDatabase::performCreateObjectStore): (WebCore::IDBServer::UniqueIDBDatabase::didPerformCreateObjectStore): (WebCore::IDBServer::UniqueIDBDatabase::deleteObjectStore): (WebCore::IDBServer::UniqueIDBDatabase::renameObjectStore): (WebCore::IDBServer::UniqueIDBDatabase::performRenameObjectStore): (WebCore::IDBServer::UniqueIDBDatabase::didPerformRenameObjectStore): (WebCore::IDBServer::UniqueIDBDatabase::clearObjectStore): (WebCore::IDBServer::UniqueIDBDatabase::createIndex): (WebCore::IDBServer::UniqueIDBDatabase::performCreateIndex): (WebCore::IDBServer::UniqueIDBDatabase::didPerformCreateIndex): (WebCore::IDBServer::UniqueIDBDatabase::deleteIndex): (WebCore::IDBServer::UniqueIDBDatabase::renameIndex): (WebCore::IDBServer::UniqueIDBDatabase::performRenameIndex): (WebCore::IDBServer::UniqueIDBDatabase::didPerformRenameIndex): (WebCore::IDBServer::UniqueIDBDatabase::putOrAdd): (WebCore::IDBServer::UniqueIDBDatabase::performPutOrAdd): (WebCore::IDBServer::UniqueIDBDatabase::didPerformPutOrAdd): (WebCore::IDBServer::UniqueIDBDatabase::getRecord): (WebCore::IDBServer::UniqueIDBDatabase::getAllRecords): (WebCore::IDBServer::UniqueIDBDatabase::performGetRecord): (WebCore::IDBServer::UniqueIDBDatabase::performGetAllRecords): (WebCore::IDBServer::UniqueIDBDatabase::getCount): (WebCore::IDBServer::UniqueIDBDatabase::deleteRecord): (WebCore::IDBServer::UniqueIDBDatabase::openCursor): (WebCore::IDBServer::UniqueIDBDatabase::iterateCursor): (WebCore::IDBServer::UniqueIDBDatabase::commitTransaction): (WebCore::IDBServer::UniqueIDBDatabase::abortTransaction): (WebCore::IDBServer::UniqueIDBDatabase::requestSpace): Deleted. (WebCore::IDBServer::UniqueIDBDatabase::waitForRequestSpaceCompletion): Deleted. (WebCore::IDBServer::UniqueIDBDatabase::startSpaceIncreaseTask): Deleted. (WebCore::IDBServer::UniqueIDBDatabase::finishSpaceIncreaseTask): Deleted. (WebCore::IDBServer::UniqueIDBDatabase::createObjectStoreAfterQuotaCheck): Deleted. (WebCore::IDBServer::UniqueIDBDatabase::deleteObjectStoreAfterQuotaCheck): Deleted. (WebCore::IDBServer::UniqueIDBDatabase::renameObjectStoreAfterQuotaCheck): Deleted. (WebCore::IDBServer::UniqueIDBDatabase::clearObjectStoreAfetQuotaCheck): Deleted. (WebCore::IDBServer::UniqueIDBDatabase::createIndexAfterQuotaCheck): Deleted. (WebCore::IDBServer::UniqueIDBDatabase::deleteIndexAfterQuotaCheck): Deleted. (WebCore::IDBServer::UniqueIDBDatabase::renameIndexAfterQuotaCheck): Deleted. (WebCore::IDBServer::UniqueIDBDatabase::putOrAddAfterQuotaCheck): Deleted. (WebCore::IDBServer::UniqueIDBDatabase::getRecordAfterQuotaCheck): Deleted. (WebCore::IDBServer::UniqueIDBDatabase::getAllRecordsAfterQuotaCheck): Deleted. (WebCore::IDBServer::UniqueIDBDatabase::getCountAfterQuotaCheck): Deleted. (WebCore::IDBServer::UniqueIDBDatabase::deleteRecordAfterQuotaCheck): Deleted. (WebCore::IDBServer::UniqueIDBDatabase::openCursorAfterQuotaCheck): Deleted. (WebCore::IDBServer::UniqueIDBDatabase::iterateCursorAfterQuotaCheck): Deleted. (WebCore::IDBServer::UniqueIDBDatabase::commitTransactionAfterQuotaCheck): Deleted. * Modules/indexeddb/server/UniqueIDBDatabase.h: * Modules/indexeddb/server/UniqueIDBDatabaseConnection.cpp: (WebCore::IDBServer::UniqueIDBDatabaseConnection::abortTransactionWithoutCallback): * Modules/indexeddb/server/UniqueIDBDatabaseTransaction.cpp: (WebCore::IDBServer::UniqueIDBDatabaseTransaction::abort): (WebCore::IDBServer::UniqueIDBDatabaseTransaction::putOrAdd): (WebCore::IDBServer::UniqueIDBDatabaseTransaction::getRecord): (WebCore::IDBServer::UniqueIDBDatabaseTransaction::getAllRecords): (WebCore::IDBServer::UniqueIDBDatabaseTransaction::getCount): (WebCore::IDBServer::UniqueIDBDatabaseTransaction::deleteRecord): (WebCore::IDBServer::UniqueIDBDatabaseTransaction::openCursor): (WebCore::IDBServer::UniqueIDBDatabaseTransaction::iterateCursor): * Modules/indexeddb/shared/InProcessIDBServer.cpp: (WebCore::InProcessIDBServer::quotaManager): (WebCore::storageQuotaManagerSpaceRequester): (WebCore::InProcessIDBServer::InProcessIDBServer): (WebCore::storageQuotaManagerGetter): Deleted. * Modules/indexeddb/shared/InProcessIDBServer.h: * WebCore.xcodeproj/project.pbxproj: * storage/StorageQuotaManager.cpp: (WebCore::StorageQuotaManager::create): (WebCore::StorageQuotaManager::StorageQuotaManager): (WebCore::StorageQuotaManager::requestSpaceOnMainThread): (WebCore::StorageQuotaManager::requestSpaceOnBackgroundThread): (WebCore::StorageQuotaManager::tryGrantRequest): (WebCore::StorageQuotaManager::updateQuotaBasedOnUsage): (WebCore::StorageQuotaManager::resetQuotaUpdatedBasedOnUsageForTesting): (WebCore::StorageQuotaManager::resetQuotaForTesting): (WebCore::StorageQuotaManager::~StorageQuotaManager): Deleted. (WebCore::StorageQuotaManager::spaceUsage const): Deleted. (WebCore::StorageQuotaManager::updateQuotaBasedOnSpaceUsage): Deleted. (WebCore::StorageQuotaManager::initializeUsersIfNeeded): Deleted. (WebCore::StorageQuotaManager::askUserToInitialize): Deleted. (WebCore::StorageQuotaManager::addUser): Deleted. (WebCore::StorageQuotaManager::shouldAskForMoreSpace const): Deleted. (WebCore::StorageQuotaManager::removeUser): Deleted. (WebCore::StorageQuotaManager::requestSpace): Deleted. (WebCore::StorageQuotaManager::askForMoreSpace): Deleted. (WebCore::StorageQuotaManager::processPendingRequests): Deleted. * storage/StorageQuotaManager.h: (WebCore::StorageQuotaManager::defaultThirdPartyQuotaFromPerOriginQuota): (WebCore::StorageQuotaManager::StorageQuotaManager): Deleted. (WebCore::StorageQuotaManager::resetQuota): Deleted. (WebCore::StorageQuotaManager::state const): Deleted. * storage/StorageQuotaUser.h: Removed. Source/WebKit: * NetworkProcess/NetworkProcess.cpp: Introduce class SessionStorageQuotaManager to manage all StorageQuotaManagers of the same session. (WebKit::NetworkProcess::initializeNetworkProcess): (WebKit::NetworkProcess::addWebsiteDataStore): (WebKit::NetworkProcess::addSessionStorageQuotaManager): (WebKit::NetworkProcess::removeSessionStorageQuotaManager): (WebKit::NetworkProcess::destroySession): (WebKit::NetworkProcess::deleteWebsiteData): (WebKit::NetworkProcess::deleteWebsiteDataForOrigins): (WebKit::NetworkProcess::createIDBServer): (WebKit::NetworkProcess::addIndexedDatabaseSession): (WebKit::NetworkProcess::setSessionStorageQuotaManagerIDBRootPath): (WebKit::NetworkProcess::updateQuotaBasedOnSpaceUsageForTesting): (WebKit::NetworkProcess::resetQuota): (WebKit::NetworkProcess::storageQuotaManager): (WebKit::NetworkProcess::initializeStorageQuota): Deleted. (WebKit::NetworkProcess::clearStorageQuota): Deleted. (): Deleted. (WebKit::NetworkProcess::initializeQuotaUsers): Deleted. * NetworkProcess/NetworkProcess.h: (WebKit::NetworkProcess::SessionStorageQuotaManager::SessionStorageQuotaManager): (WebKit::NetworkProcess::SessionStorageQuotaManager::defaultQuota const): (WebKit::NetworkProcess::SessionStorageQuotaManager::ensureOriginStorageQuotaManager): (WebKit::NetworkProcess::SessionStorageQuotaManager::existingStorageQuotaManagers): (WebKit::NetworkProcess::SessionStorageQuotaManager::cacheRootPath const): (WebKit::NetworkProcess::SessionStorageQuotaManager::setIDBRootPath): (WebKit::NetworkProcess::SessionStorageQuotaManager::idbRootPath const): (WebKit::NetworkProcess::StorageQuotaManagers::defaultQuota const): Deleted. (WebKit::NetworkProcess::StorageQuotaManagers::setDefaultQuotas): Deleted. (WebKit::NetworkProcess::StorageQuotaManagers::managersPerOrigin): Deleted. * NetworkProcess/NetworkProcess.messages.in: * NetworkProcess/cache/CacheStorageEngine.cpp: (WebKit::CacheStorage::getDirectorySize): (WebKit::CacheStorage::Engine::diskUsage): static function to get the disk usage of CacheStorage given CacheStorage root directory. (WebKit::CacheStorage::Engine::requestSpace): (WebKit::CacheStorage::Engine::readCachesFromDisk): (WebKit::CacheStorage::Engine::writeSizeFile): (WebKit::CacheStorage::Engine::readSizeFile): (WebKit::CacheStorage::Engine::initializeQuotaUser): Deleted. * NetworkProcess/cache/CacheStorageEngine.h: * NetworkProcess/cache/CacheStorageEngineCache.cpp: (WebKit::CacheStorage::Cache::put): (WebKit::CacheStorage::Cache::remove): * NetworkProcess/cache/CacheStorageEngineCaches.cpp: (WebKit::CacheStorage::Caches::create): (WebKit::CacheStorage::Caches::Caches): (WebKit::CacheStorage::Caches::~Caches): (WebKit::CacheStorage::Caches::updateSizeFile): (WebKit::CacheStorage::Caches::initializeSize): (WebKit::CacheStorage::Caches::clear): (WebKit::CacheStorage::Caches::requestSpace): (WebKit::CacheStorage::Caches::writeRecord): (WebKit::CacheStorage::Caches::removeRecord): (WebKit::CacheStorage::Caches::whenInitialized): Deleted. (WebKit::CacheStorage::Caches::resetSpaceUsed): Deleted. * NetworkProcess/cache/CacheStorageEngineCaches.h: * Shared/WebsiteDataStoreParameters.cpp: (WebKit::WebsiteDataStoreParameters::encode const): (WebKit::WebsiteDataStoreParameters::decode): * Shared/WebsiteDataStoreParameters.h: Add a cacheStorageDirectory parameter so we know the direcotry of CacheStorage when we start using WebsiteDataStore. * UIProcess/API/C/WKWebsiteDataStoreRef.cpp: (WKWebsiteDataStoreResetQuota): * UIProcess/API/C/WKWebsiteDataStoreRef.h: Add a C API for reseting quota in TestRunner. * UIProcess/Network/NetworkProcessProxy.cpp: (WebKit::NetworkProcessProxy::resetQuota): * UIProcess/Network/NetworkProcessProxy.h: * UIProcess/WebProcessPool.cpp: (WebKit::WebProcessPool::ensureNetworkProcess): * UIProcess/WebsiteData/Cocoa/WebsiteDataStoreCocoa.mm: (WebKit::WebsiteDataStore::parameters): * UIProcess/WebsiteData/WebsiteDataStore.cpp: (WebKit::WebsiteDataStore::parameters): (WebKit::WebsiteDataStore::resetQuota): * UIProcess/WebsiteData/WebsiteDataStore.h: Tools: * TestWebKitAPI/TestWebKitAPI.xcodeproj/project.pbxproj: * TestWebKitAPI/Tests/WebCore/StorageQuotaManager.cpp: Removed as we have a different StorageQuotaManager implementation now. * WebKitTestRunner/TestController.cpp: reset StorageQuotaManager's quota between tests. (WTR::TestController::resetStateToConsistentValues): (WTR::TestController::resetQuota): * WebKitTestRunner/TestController.h: Canonical link: https://commits.webkit.org/217990@main git-svn-id: https://svn.webkit.org/repository/webkit/trunk@253025 268f45cc-cd09-0410-ab3c-d52691b4dbfc
2019-12-03 06:53:42 +00:00
void updateQuotaBasedOnUsage();
Introduce a quota manager for Cache API/Service Worker/IDB storage https://bugs.webkit.org/show_bug.cgi?id=195283 Reviewed by Chris Dumez. Source/WebCore: Introduce a generic quota manager and quota users to be used in Network Process. Quota manager/users are scoped by client origin. Quota manager is used to check for quota by an entity wanting to execute a storage task of a given taskSize. Quota manager will check the current space used by all its quota users. If the size + taskSize is above quota, it will call a function to try extend the quota. In the meantime, the task (and all tasks that may be added) are queued. Once the new quota is received, the quota manager will either allow or disallow the first task in the queue. The quota manager will try to execute as many tasks as possible with the provided quota. If some tasks are remaining and quota limit is hit, the quota manager will compute the space needed for all remaining requests and do another quota extension request. * Sources.txt: * WebCore.xcodeproj/project.pbxproj: * page/ClientOrigin.h: * storage/StorageQuotaManager.cpp: Added. (WebCore::StorageQuotaManager::~StorageQuotaManager): (WebCore::StorageQuotaManager::spaceUsage const): (WebCore::StorageQuotaManager::requestSpace): (WebCore::StorageQuotaManager::askForMoreSpace): (WebCore::StorageQuotaManager::processPendingRequests): * storage/StorageQuotaManager.h: Added. (WebCore::StorageQuotaManager::StorageQuotaManager): (WebCore::StorageQuotaManager::addUser): (WebCore::StorageQuotaManager::removeUser): * storage/StorageQuotaUser.h: Added. Source/WebKit: Remove quota handling from Cache API storage and use StorageQuotaManager/StorageQuotaUser. CacheStorage::Caches becomes a quota user and has a StorageQuotaManager to check for space for any cache API write task. NetworkProcess is responsible to manage the quota managers. Quota managers will go through network process to ask UIProcess for quota extension. Remove pending callback handling from CacheStorage since they are queued in QuotaManager now. * NetworkProcess/NetworkProcess.cpp: (WebKit::NetworkProcess::~NetworkProcess): (WebKit::NetworkProcess::destroySession): (WebKit::NetworkProcess::cacheStorageRootPath): (WebKit::NetworkProcess::setCacheStorageParameters): (WebKit::NetworkProcess::storageQuotaManager): * NetworkProcess/NetworkProcess.h: * NetworkProcess/cache/CacheStorageEngine.cpp: (WebKit::CacheStorage::Engine::from): (WebKit::CacheStorage::Engine::Engine): (WebKit::CacheStorage::Engine::readCachesFromDisk): * NetworkProcess/cache/CacheStorageEngine.h: * NetworkProcess/cache/CacheStorageEngineCache.cpp: (WebKit::CacheStorage::Cache::put): * NetworkProcess/cache/CacheStorageEngineCache.h: * NetworkProcess/cache/CacheStorageEngineCaches.cpp: (WebKit::CacheStorage::Caches::Caches): (WebKit::CacheStorage::Caches::~Caches): (WebKit::CacheStorage::Caches::requestSpace): (WebKit::CacheStorage::Caches::writeRecord): * NetworkProcess/cache/CacheStorageEngineCaches.h: Canonical link: https://commits.webkit.org/209739@main git-svn-id: https://svn.webkit.org/repository/webkit/trunk@242599 268f45cc-cd09-0410-ab3c-d52691b4dbfc
2019-03-07 17:40:40 +00:00
Drop CheckedLock / CheckedCondition aliases https://bugs.webkit.org/show_bug.cgi?id=226176 Reviewed by Kate Cheney. Drop CheckedLock / CheckedCondition aliases now that they are the default. Source/JavaScriptCore: * API/JSVirtualMachine.mm: * API/glib/JSCVirtualMachine.cpp: * assembler/PerfLog.h: * assembler/testmasm.cpp: * bytecode/StructureStubInfo.h: * bytecode/SuperSampler.cpp: * dfg/DFGCommon.cpp: * dfg/DFGCommonData.cpp: * dfg/DFGPlan.h: * dfg/DFGThreadData.h: * dfg/DFGWorklist.cpp: (JSC::DFG::Worklist::Worklist): * dfg/DFGWorklist.h: * disassembler/Disassembler.cpp: * dynbench.cpp: * heap/BlockDirectory.cpp: (JSC::BlockDirectory::parallelNotEmptyBlockSource): * heap/BlockDirectory.h: (JSC::BlockDirectory::bitvectorLock): * heap/CodeBlockSet.h: (JSC::CodeBlockSet::getLock): * heap/Heap.cpp: (JSC::Heap::Heap): * heap/Heap.h: * heap/IsoSubspacePerVM.h: * heap/MarkedSpace.h: (JSC::MarkedSpace::directoryLock): * heap/MarkingConstraintSolver.h: * heap/SlotVisitor.cpp: (JSC::SlotVisitor::donateKnownParallel): * heap/SlotVisitor.h: * inspector/remote/socket/RemoteInspectorConnectionClient.h: * inspector/remote/socket/RemoteInspectorSocketEndpoint.h: * jit/ExecutableAllocator.cpp: (JSC::ExecutableAllocator::getLock const): (JSC::dumpJITMemory): * jit/ExecutableAllocator.h: (JSC::ExecutableAllocatorBase::getLock const): * jit/JITWorklist.cpp: (JSC::JITWorklist::JITWorklist): * jit/JITWorklist.h: * jsc.cpp: * profiler/ProfilerDatabase.h: * runtime/ConcurrentJSLock.h: * runtime/DeferredWorkTimer.h: * runtime/JSLock.h: * runtime/SamplingProfiler.cpp: (JSC::FrameWalker::FrameWalker): (JSC::CFrameWalker::CFrameWalker): (JSC::SamplingProfiler::takeSample): * runtime/SamplingProfiler.h: (JSC::SamplingProfiler::getLock): * runtime/VM.h: * runtime/VMTraps.cpp: (JSC::VMTraps::invalidateCodeBlocksOnStack): (JSC::VMTraps::VMTraps): * runtime/VMTraps.h: * tools/FunctionOverrides.h: * tools/VMInspector.cpp: (JSC::ensureIsSafeToLock): * tools/VMInspector.h: (JSC::VMInspector::getLock): * wasm/WasmCalleeRegistry.h: (JSC::Wasm::CalleeRegistry::getLock): * wasm/WasmPlan.h: * wasm/WasmStreamingCompiler.h: * wasm/WasmThunks.h: * wasm/WasmWorklist.cpp: (JSC::Wasm::Worklist::Worklist): * wasm/WasmWorklist.h: Source/WebCore: * Modules/indexeddb/IDBObjectStore.h: * Modules/indexeddb/IDBTransaction.h: * Modules/indexeddb/client/IDBConnectionProxy.h: * Modules/indexeddb/server/IDBSerializationContext.cpp: * Modules/indexeddb/server/IDBServer.cpp: * Modules/mediastream/RTCDataChannel.cpp: * Modules/mediastream/RTCRtpSFrameTransformer.h: * Modules/mediastream/RTCRtpScriptTransform.h: * Modules/mediastream/libwebrtc/LibWebRTCDataChannelHandler.h: * Modules/mediastream/libwebrtc/LibWebRTCRtpTransformBackend.h: * Modules/speech/SpeechRecognitionCaptureSourceImpl.h: * Modules/webaudio/AudioParamTimeline.h: * Modules/webaudio/MediaElementAudioSourceNode.h: * Modules/webdatabase/Database.cpp: * Modules/webdatabase/Database.h: * Modules/webdatabase/DatabaseManager.h: * Modules/webdatabase/DatabaseTask.h: * Modules/webdatabase/DatabaseThread.h: * Modules/webdatabase/DatabaseTracker.cpp: (WebCore::DatabaseTracker::openDatabaseMutex): * Modules/webdatabase/DatabaseTracker.h: * Modules/webdatabase/OriginLock.cpp: * Modules/webdatabase/SQLCallbackWrapper.h: * Modules/webdatabase/SQLTransaction.h: * Modules/webgpu/WebGPUDevice.cpp: (WebCore::WebGPUDevice::instancesLock): * Modules/webgpu/WebGPUDevice.h: * Modules/webgpu/WebGPUPipeline.cpp: (WebCore::WebGPUPipeline::instancesLock): * Modules/webgpu/WebGPUPipeline.h: * Modules/websockets/WebSocket.cpp: (WebCore::WebSocket::allActiveWebSocketsLock): * Modules/websockets/WebSocket.h: * accessibility/isolatedtree/AXIsolatedTree.cpp: * accessibility/isolatedtree/AXIsolatedTree.h: * bindings/js/JSDOMGlobalObject.h: * bridge/objc/WebScriptObject.mm: * crypto/CryptoAlgorithmRegistry.h: * dom/MessagePort.cpp: * dom/Node.cpp: * dom/ScriptExecutionContext.cpp: * html/HTMLMediaElement.cpp: (WebCore::HTMLMediaElement::createMediaPlayer): * html/canvas/CanvasRenderingContext.cpp: (WebCore::CanvasRenderingContext::instancesLock): * html/canvas/CanvasRenderingContext.h: * html/canvas/WebGLContextGroup.cpp: (WebCore::WebGLContextGroup::objectGraphLockForAContext): * html/canvas/WebGLContextGroup.h: * html/canvas/WebGLContextObject.cpp: (WebCore::WebGLContextObject::objectGraphLockForContext): * html/canvas/WebGLContextObject.h: * html/canvas/WebGLObject.h: * html/canvas/WebGLProgram.cpp: (WebCore::WebGLProgram::instancesLock): * html/canvas/WebGLProgram.h: * html/canvas/WebGLRenderingContextBase.cpp: (WebCore::WebGLRenderingContextBase::objectGraphLock): * html/canvas/WebGLRenderingContextBase.h: * html/canvas/WebGLSharedObject.cpp: (WebCore::WebGLSharedObject::objectGraphLockForContext): * html/canvas/WebGLSharedObject.h: * inspector/agents/WebHeapAgent.cpp: * page/ResourceUsageThread.h: * page/SecurityPolicy.cpp: * page/WheelEventTestMonitor.h: * page/scrolling/ScrollingTree.h: (WebCore::ScrollingTree::WTF_RETURNS_LOCK): * page/scrolling/ScrollingTreeLatchingController.h: * page/scrolling/ThreadedScrollingTree.h: (WebCore::ThreadedScrollingTree::WTF_RETURNS_LOCK): * page/scrolling/mac/ScrollingTreeMac.h: * platform/AbortableTaskQueue.h: * platform/GenericTaskQueue.cpp: * platform/GenericTaskQueue.h: * platform/LegacySchemeRegistry.cpp: * platform/audio/AudioDestination.h: * platform/audio/HRTFDatabaseLoader.h: * platform/audio/ReverbConvolver.cpp: (WebCore::ReverbConvolver::backgroundThreadEntry): * platform/audio/cocoa/AudioDestinationCocoa.h: * platform/audio/gstreamer/AudioSourceProviderGStreamer.h: * platform/audio/gstreamer/WebKitWebAudioSourceGStreamer.cpp: * platform/audio/mac/FFTFrameMac.cpp: * platform/encryptedmedia/CDMProxy.h: * platform/graphics/MediaPlayer.cpp: * platform/graphics/ShadowBlur.cpp: (WebCore::ScratchBuffer::lock): (WebCore::ShadowBlur::drawRectShadowWithTiling): (WebCore::ShadowBlur::drawInsetShadowWithTiling): * platform/graphics/avfoundation/MediaPlayerPrivateAVFoundation.h: * platform/graphics/avfoundation/cf/MediaPlayerPrivateAVFoundationCF.cpp: * platform/graphics/avfoundation/objc/MediaPlayerPrivateMediaStreamAVFObjC.h: * platform/graphics/ca/cocoa/PlatformCALayerCocoa.mm: * platform/graphics/cg/IOSurfacePool.h: * platform/graphics/cg/SubimageCacheWithTimer.h: * platform/graphics/cocoa/FontCacheCoreText.cpp: * platform/graphics/gstreamer/ImageDecoderGStreamer.h: * platform/graphics/gstreamer/MainThreadNotifier.h: * platform/graphics/gstreamer/MediaPlayerPrivateGStreamer.h: * platform/graphics/gstreamer/VideoSinkGStreamer.cpp: * platform/graphics/gstreamer/WebKitWebSourceGStreamer.cpp: * platform/graphics/gstreamer/eme/WebKitCommonEncryptionDecryptorGStreamer.cpp: * platform/graphics/gstreamer/mse/WebKitMediaSourceGStreamer.cpp: * platform/graphics/texmap/TextureMapperPlatformLayerProxy.h: (WebCore::TextureMapperPlatformLayerProxy::WTF_RETURNS_LOCK): * platform/image-decoders/ScalableImageDecoder.h: * platform/ios/QuickLook.mm: * platform/ios/WebSQLiteDatabaseTrackerClient.mm: * platform/ios/wak/WebCoreThreadRun.cpp: * platform/mediarecorder/MediaRecorderPrivateMock.h: * platform/mediarecorder/cocoa/MediaRecorderPrivateWriterCocoa.h: * platform/mediastream/RealtimeMediaSource.h: * platform/mediastream/RealtimeOutgoingAudioSource.h: * platform/mediastream/RealtimeOutgoingVideoSource.h: * platform/mediastream/cocoa/AudioMediaStreamTrackRendererUnit.h: * platform/mediastream/gstreamer/RealtimeOutgoingAudioSourceLibWebRTC.h: * platform/network/cf/LoaderRunLoopCF.cpp: (WebCore::loaderRunLoop): * platform/network/cocoa/WebCoreNSURLSession.mm: * platform/network/mac/UTIUtilities.mm: * platform/network/mac/WebCoreResourceHandleAsOperationQueueDelegate.h: * platform/sql/SQLiteDatabase.cpp: * platform/sql/SQLiteDatabase.h: * platform/sql/SQLiteDatabaseTracker.cpp: * platform/text/TextEncodingRegistry.cpp: * storage/StorageQuotaManager.h: * workers/WorkerGlobalScope.cpp: * workers/WorkerOrWorkletScriptController.h: * workers/WorkerOrWorkletThread.cpp: (WebCore::WorkerOrWorkletThread::workerOrWorkletThreadsLock): * workers/WorkerOrWorkletThread.h: * worklets/PaintWorkletGlobalScope.h: Source/WebKit: * GPUProcess/graphics/RemoteGraphicsContextGL.cpp: (WebKit::RemoteGraphicsContextGL::paintPixelBufferToImageBuffer): * GPUProcess/webrtc/LibWebRTCCodecsProxy.h: * NetworkProcess/Classifier/WebResourceLoadStatisticsStore.cpp: * NetworkProcess/Classifier/WebResourceLoadStatisticsStore.h: * NetworkProcess/CustomProtocols/LegacyCustomProtocolManager.h: * NetworkProcess/IndexedDB/WebIDBServer.cpp: * NetworkProcess/NetworkProcess.h: * NetworkProcess/WebStorage/StorageManagerSet.h: * NetworkProcess/cache/NetworkCacheStorage.cpp: * NetworkProcess/cocoa/LaunchServicesDatabaseObserver.h: * NetworkProcess/glib/DNSCache.h: * Platform/IPC/Connection.cpp: * Platform/IPC/Connection.h: * Platform/IPC/StreamConnectionWorkQueue.h: * Platform/IPC/StreamServerConnection.h: * Shared/BlockingResponseMap.h: * Shared/Cocoa/XPCEndpointClient.h: * Shared/CoordinatedGraphics/threadedcompositor/CompositingRunLoop.h: * Shared/mac/MediaFormatReader/MediaFormatReader.h: * Shared/mac/MediaFormatReader/MediaSampleCursor.h: * Shared/mac/MediaFormatReader/MediaTrackReader.h: * UIProcess/API/glib/IconDatabase.h: * UIProcess/WebURLSchemeTask.h: * UIProcess/mac/DisplayLink.h: * UIProcess/mac/WKPrintingView.mm: (-[WKPrintingView knowsPageRange:]): * WebProcess/GPU/graphics/RemoteImageBufferProxy.h: * WebProcess/GPU/webrtc/LibWebRTCCodecs.h: * WebProcess/Network/WebSocketStream.cpp: * WebProcess/Plugins/PluginProcessConnectionManager.h: * WebProcess/WebPage/EventDispatcher.h: * WebProcess/WebPage/ViewUpdateDispatcher.h: Source/WebKitLegacy: * Storage/StorageAreaSync.h: Source/WebKitLegacy/mac: * DOM/DOMInternal.mm: Source/WTF: * WTF.xcodeproj/project.pbxproj: * wtf/Assertions.cpp: * wtf/AutomaticThread.cpp: (WTF::AutomaticThreadCondition::wait): (WTF::AutomaticThreadCondition::waitFor): (WTF::AutomaticThread::AutomaticThread): * wtf/AutomaticThread.h: * wtf/CMakeLists.txt: * wtf/CheckedCondition.h: Removed. * wtf/CheckedLock.h: Removed. * wtf/Condition.h: * wtf/CrossThreadQueue.h: * wtf/CrossThreadTaskHandler.h: * wtf/CryptographicallyRandomNumber.cpp: * wtf/FastMalloc.cpp: * wtf/Forward.h: * wtf/Language.cpp: * wtf/Lock.cpp: (WTF::UncheckedLock::lockSlow): (WTF::UncheckedLock::unlockSlow): (WTF::UncheckedLock::unlockFairlySlow): (WTF::UncheckedLock::safepointSlow): * wtf/Lock.h: (WTF::WTF_ASSERTS_ACQUIRED_LOCK): * wtf/Logger.cpp: * wtf/Logger.h: (WTF::Logger::WTF_RETURNS_LOCK): * wtf/MessageQueue.h: * wtf/MetaAllocator.cpp: (WTF::MetaAllocator::release): (WTF::MetaAllocator::MetaAllocator): (WTF::MetaAllocator::allocate): (WTF::MetaAllocator::currentStatistics): * wtf/MetaAllocator.h: * wtf/OSLogPrintStream.h: * wtf/ParallelHelperPool.cpp: (WTF::ParallelHelperPool::ParallelHelperPool): * wtf/ParallelHelperPool.h: * wtf/ParallelJobsGeneric.h: * wtf/ParallelVectorIterator.h: * wtf/ReadWriteLock.h: * wtf/RecursiveLockAdapter.h: * wtf/RunLoop.h: * wtf/SynchronizedFixedQueue.h: * wtf/Threading.cpp: (WTF::Thread::allThreadsLock): * wtf/Threading.h: * wtf/TimingScope.cpp: * wtf/URL.cpp: * wtf/WTFSemaphore.h: * wtf/WorkQueue.cpp: (WTF::WorkQueue::concurrentApply): * wtf/WorkerPool.cpp: (WTF::WorkerPool::WorkerPool): * wtf/WorkerPool.h: * wtf/cf/LanguageCF.cpp: * wtf/text/AtomStringImpl.cpp: (WTF::AtomStringTableLocker::AtomStringTableLocker): * wtf/text/StringView.cpp: * wtf/threads/BinarySemaphore.h: * wtf/unicode/icu/CollatorICU.cpp: Tools: * TestWebKitAPI/CMakeLists.txt: * TestWebKitAPI/TestWebKitAPI.xcodeproj/project.pbxproj: * TestWebKitAPI/Tests/WTF/CheckedConditionTest.cpp: Removed. * TestWebKitAPI/Tests/WTF/CheckedLockTest.cpp: Removed. * TestWebKitAPI/Tests/WTF/Condition.cpp: (TestWebKitAPI::TEST): * TestWebKitAPI/Tests/WTF/Lock.cpp: (TestWebKitAPI::TEST): * TestWebKitAPI/Tests/WTF/MetaAllocator.cpp: * WebKitTestRunner/InjectedBundle/AccessibilityController.cpp: (WTR::AXThread::createThreadIfNeeded): Canonical link: https://commits.webkit.org/238085@main git-svn-id: https://svn.webkit.org/repository/webkit/trunk@277958 268f45cc-cd09-0410-ab3c-d52691b4dbfc
2021-05-24 18:29:01 +00:00
Lock m_quotaCountDownLock;
Use CheckedLock more in WebCore https://bugs.webkit.org/show_bug.cgi?id=226026 Reviewed by Geoffrey Garen. Use CheckedLock more in WebCore to benefit from Clang Thread Safety Analysis. * Modules/indexeddb/IDBObjectStore.cpp: (WebCore::IDBObjectStore::createIndex): (WebCore::IDBObjectStore::index): (WebCore::IDBObjectStore::deleteIndex): (WebCore::IDBObjectStore::rollbackForVersionChangeAbort): (WebCore::IDBObjectStore::visitReferencedIndexes const): (WebCore::IDBObjectStore::renameReferencedIndex): * Modules/indexeddb/IDBObjectStore.h: * Modules/indexeddb/IDBTransaction.cpp: (WebCore::IDBTransaction::objectStore): (WebCore::IDBTransaction::internalAbort): (WebCore::IDBTransaction::createObjectStore): (WebCore::IDBTransaction::renameObjectStore): (WebCore::IDBTransaction::renameIndex): (WebCore::IDBTransaction::deleteObjectStore): (WebCore::IDBTransaction::visitReferencedObjectStores const): * Modules/indexeddb/IDBTransaction.h: * Modules/indexeddb/client/IDBConnectionProxy.cpp: (WebCore::IDBClient::IDBConnectionProxy::openDatabase): (WebCore::IDBClient::IDBConnectionProxy::deleteDatabase): (WebCore::IDBClient::IDBConnectionProxy::completeOpenDBRequest): (WebCore::IDBClient::IDBConnectionProxy::saveOperation): (WebCore::IDBClient::IDBConnectionProxy::completeOperation): (WebCore::IDBClient::IDBConnectionProxy::fireVersionChangeEvent): (WebCore::IDBClient::IDBConnectionProxy::notifyOpenDBRequestBlocked): (WebCore::IDBClient::IDBConnectionProxy::establishTransaction): (WebCore::IDBClient::IDBConnectionProxy::didStartTransaction): (WebCore::IDBClient::IDBConnectionProxy::commitTransaction): (WebCore::IDBClient::IDBConnectionProxy::didCommitTransaction): (WebCore::IDBClient::IDBConnectionProxy::abortTransaction): (WebCore::IDBClient::IDBConnectionProxy::didAbortTransaction): (WebCore::IDBClient::IDBConnectionProxy::didCloseFromServer): (WebCore::IDBClient::IDBConnectionProxy::connectionToServerLost): (WebCore::IDBClient::IDBConnectionProxy::scheduleMainThreadTasks): (WebCore::IDBClient::IDBConnectionProxy::handleMainThreadTasks): (WebCore::IDBClient::IDBConnectionProxy::getAllDatabaseNamesAndVersions): (WebCore::IDBClient::IDBConnectionProxy::didGetAllDatabaseNamesAndVersions): (WebCore::IDBClient::IDBConnectionProxy::registerDatabaseConnection): (WebCore::IDBClient::IDBConnectionProxy::unregisterDatabaseConnection): (WebCore::IDBClient::IDBConnectionProxy::forgetActiveOperations): (WebCore::IDBClient::IDBConnectionProxy::forgetTransaction): (WebCore::IDBClient::IDBConnectionProxy::forgetActivityForCurrentThread): (WebCore::IDBClient::IDBConnectionProxy::setContextSuspended): * Modules/indexeddb/client/IDBConnectionProxy.h: * Modules/mediastream/RTCRtpSFrameTransformer.cpp: (WebCore::RTCRtpSFrameTransformer::setEncryptionKey): (WebCore::RTCRtpSFrameTransformer::decryptFrame): (WebCore::RTCRtpSFrameTransformer::encryptFrame): * Modules/mediastream/RTCRtpSFrameTransformer.h: * Modules/mediastream/RTCRtpScriptTransform.cpp: (WebCore::RTCRtpScriptTransform::setTransformer): (WebCore::RTCRtpScriptTransform::setupTransformer): (WebCore::RTCRtpScriptTransform::clear): * Modules/mediastream/RTCRtpScriptTransform.h: * Modules/mediastream/libwebrtc/LibWebRTCDataChannelHandler.cpp: (WebCore::LibWebRTCDataChannelHandler::setClient): (WebCore::LibWebRTCDataChannelHandler::checkState): (WebCore::LibWebRTCDataChannelHandler::OnMessage): (WebCore::LibWebRTCDataChannelHandler::OnBufferedAmountChange): * Modules/mediastream/libwebrtc/LibWebRTCDataChannelHandler.h: * Modules/mediastream/libwebrtc/LibWebRTCRtpTransformBackend.cpp: (WebCore::LibWebRTCRtpTransformBackend::setInputCallback): (WebCore::LibWebRTCRtpTransformBackend::setOutputCallback): (WebCore::LibWebRTCRtpTransformBackend::processTransformedFrame): (WebCore::LibWebRTCRtpTransformBackend::Transform): * Modules/mediastream/libwebrtc/LibWebRTCRtpTransformBackend.h: * inspector/agents/WebHeapAgent.cpp: (WebCore::SendGarbageCollectionEventsTask::addGarbageCollection): (WebCore::SendGarbageCollectionEventsTask::reset): (WebCore::SendGarbageCollectionEventsTask::timerFired): * page/ResourceUsageThread.cpp: (WebCore::ResourceUsageThread::addObserver): (WebCore::ResourceUsageThread::removeObserver): (WebCore::ResourceUsageThread::waitUntilObservers): (WebCore::ResourceUsageThread::notifyObservers): * page/ResourceUsageThread.h: * page/WheelEventTestMonitor.cpp: (WebCore::WheelEventTestMonitor::clearAllTestDeferrals): (WebCore::WheelEventTestMonitor::setTestCallbackAndStartMonitoring): (WebCore::WheelEventTestMonitor::deferForReason): (WebCore::WheelEventTestMonitor::removeDeferralForReason): (WebCore::WheelEventTestMonitor::receivedWheelEvent): (WebCore::WheelEventTestMonitor::checkShouldFireCallbacks): * page/WheelEventTestMonitor.h: (WebCore::WheelEventTestMonitor::WTF_GUARDED_BY_LOCK): * page/scrolling/ScrollingTree.cpp: (WebCore::ScrollingTree::computeWheelProcessingSteps): (WebCore::ScrollingTree::determineWheelEventProcessing): (WebCore::ScrollingTree::handleWheelEvent): (WebCore::ScrollingTree::commitTreeState): (WebCore::ScrollingTree::mainFrameScrollPosition const): (WebCore::ScrollingTree::setMainFrameScrollPosition): (WebCore::ScrollingTree::setGestureState): (WebCore::ScrollingTree::gestureState): (WebCore::ScrollingTree::eventTrackingTypeForPoint): (WebCore::ScrollingTree::isRubberBandInProgressForNode): (WebCore::ScrollingTree::setRubberBandingInProgressForNode): (WebCore::ScrollingTree::isUserScrollInProgressForNode): (WebCore::ScrollingTree::setUserScrollInProgressForNode): (WebCore::ScrollingTree::clearNodesWithUserScrollInProgress): (WebCore::ScrollingTree::isScrollSnapInProgressForNode): (WebCore::ScrollingTree::setNodeScrollSnapInProgress): (WebCore::ScrollingTree::setMainFramePinnedState): (WebCore::ScrollingTree::setMainFrameCanRubberBand): (WebCore::ScrollingTree::mainFrameCanRubberBandInDirection): (WebCore::ScrollingTree::addPendingScrollUpdate): (WebCore::ScrollingTree::takePendingScrollUpdates): (WebCore::ScrollingTree::setScrollPinningBehavior): (WebCore::ScrollingTree::scrollPinningBehavior): (WebCore::ScrollingTree::willWheelEventStartSwipeGesture): (WebCore::ScrollingTree::windowScreenDidChange): (WebCore::ScrollingTree::displayID): (WebCore::ScrollingTree::hasProcessedWheelEventsRecently): (WebCore::ScrollingTree::willProcessWheelEvent): (WebCore::ScrollingTree::nominalFramesPerSecond): (WebCore::ScrollingTree::scrollingTreeAsText): * page/scrolling/ScrollingTree.h: * page/scrolling/ScrollingTreeLatchingController.cpp: (WebCore::ScrollingTreeLatchingController::receivedWheelEvent): (WebCore::ScrollingTreeLatchingController::latchingDataForEvent const): (WebCore::ScrollingTreeLatchingController::latchedNodeID const): (WebCore::ScrollingTreeLatchingController::latchedNodeAndSteps const): (WebCore::ScrollingTreeLatchingController::nodeDidHandleEvent): (WebCore::ScrollingTreeLatchingController::nodeWasRemoved): (WebCore::ScrollingTreeLatchingController::clearLatchedNode): * page/scrolling/ScrollingTreeLatchingController.h: * platform/audio/HRTFDatabaseLoader.cpp: (WebCore::HRTFDatabaseLoader::loadAsynchronously): (WebCore::HRTFDatabaseLoader::waitForLoaderThreadCompletion): * platform/audio/HRTFDatabaseLoader.h: * platform/audio/cocoa/AudioDestinationCocoa.cpp: (WebCore::AudioDestinationCocoa::hasEnoughFrames const): (WebCore::AudioDestinationCocoa::render): (WebCore::AudioDestinationCocoa::renderOnRenderingThead): * platform/audio/cocoa/AudioDestinationCocoa.h: * platform/encryptedmedia/CDMProxy.cpp: (WebCore::CDMProxy::instance const): (WebCore::CDMProxy::setInstance): (WebCore::CDMProxy::startedWaitingForKey const): (WebCore::CDMProxy::stoppedWaitingForKey const): * platform/encryptedmedia/CDMProxy.h: * platform/graphics/avfoundation/MediaPlayerPrivateAVFoundation.cpp: (WebCore::MediaPlayerPrivateAVFoundation::MediaPlayerPrivateAVFoundation): (WebCore::MediaPlayerPrivateAVFoundation::setDelayCallbacks const): (WebCore::MediaPlayerPrivateAVFoundation::clearMainThreadPendingFlag): (WebCore::MediaPlayerPrivateAVFoundation::scheduleMainThreadNotification): (WebCore::MediaPlayerPrivateAVFoundation::dispatchNotification): * platform/graphics/avfoundation/MediaPlayerPrivateAVFoundation.h: * platform/graphics/avfoundation/objc/MediaPlayerPrivateMediaStreamAVFObjC.h: * platform/graphics/avfoundation/objc/MediaPlayerPrivateMediaStreamAVFObjC.mm: (WebCore::MediaPlayerPrivateMediaStreamAVFObjC::processNewVideoSample): * platform/graphics/cg/IOSurfacePool.cpp: (WebCore::IOSurfacePool::takeSurface): (WebCore::IOSurfacePool::addSurface): (WebCore::IOSurfacePool::setPoolSize): (WebCore::IOSurfacePool::collectionTimerFired): (WebCore::IOSurfacePool::discardAllSurfaces): * platform/graphics/cg/IOSurfacePool.h: (WebCore::IOSurfacePool::WTF_GUARDED_BY_LOCK): * platform/graphics/cg/SubimageCacheWithTimer.cpp: (WebCore::SubimageCacheWithTimer::pruneCacheTimerFired): (WebCore::SubimageCacheWithTimer::subimage): (WebCore::SubimageCacheWithTimer::clearImageAndSubimages): (WebCore::SubimageCacheWithTimer::clearAll): * platform/graphics/cg/SubimageCacheWithTimer.h: * platform/graphics/cocoa/FontCacheCoreText.cpp: (WebCore::FontDatabase::collectionForFamily): (WebCore::FontDatabase::clear): * platform/network/cocoa/WebCoreNSURLSession.mm: (WebCore::WebCoreNSURLSessionDataTaskClient::clearTask): (WebCore::WebCoreNSURLSessionDataTaskClient::dataSent): (WebCore::WebCoreNSURLSessionDataTaskClient::responseReceived): (WebCore::WebCoreNSURLSessionDataTaskClient::shouldCacheResponse): (WebCore::WebCoreNSURLSessionDataTaskClient::dataReceived): (WebCore::WebCoreNSURLSessionDataTaskClient::redirectReceived): (WebCore::WebCoreNSURLSessionDataTaskClient::accessControlCheckFailed): (WebCore::WebCoreNSURLSessionDataTaskClient::loadFailed): (WebCore::WebCoreNSURLSessionDataTaskClient::loadFinished): * platform/network/mac/WebCoreResourceHandleAsOperationQueueDelegate.h: * platform/network/mac/WebCoreResourceHandleAsOperationQueueDelegate.mm: (-[WebCoreResourceHandleAsOperationQueueDelegate detachHandle]): (-[WebCoreResourceHandleAsOperationQueueDelegate connection:willSendRequest:redirectResponse:]): (-[WebCoreResourceHandleAsOperationQueueDelegate connection:canAuthenticateAgainstProtectionSpace:]): (-[WebCoreResourceHandleAsOperationQueueDelegate connection:willCacheResponse:]): * storage/StorageQuotaManager.cpp: (WebCore::StorageQuotaManager::requestSpaceOnBackgroundThread): (WebCore::StorageQuotaManager::resetQuotaUpdatedBasedOnUsageForTesting): (WebCore::StorageQuotaManager::resetQuotaForTesting): * storage/StorageQuotaManager.h: (WebCore::StorageQuotaManager::WTF_GUARDED_BY_LOCK): * workers/WorkerOrWorkletScriptController.cpp: (WebCore::WorkerOrWorkletScriptController::scheduleExecutionTermination): (WebCore::WorkerOrWorkletScriptController::isTerminatingExecution const): * workers/WorkerOrWorkletScriptController.h: (WebCore::WorkerOrWorkletScriptController::WTF_GUARDED_BY_LOCK): Canonical link: https://commits.webkit.org/237960@main git-svn-id: https://svn.webkit.org/repository/webkit/trunk@277805 268f45cc-cd09-0410-ab3c-d52691b4dbfc
2021-05-20 18:41:33 +00:00
uint64_t m_quotaCountDown WTF_GUARDED_BY_LOCK(m_quotaCountDownLock) { 0 };
Introduce a quota manager for Cache API/Service Worker/IDB storage https://bugs.webkit.org/show_bug.cgi?id=195283 Reviewed by Chris Dumez. Source/WebCore: Introduce a generic quota manager and quota users to be used in Network Process. Quota manager/users are scoped by client origin. Quota manager is used to check for quota by an entity wanting to execute a storage task of a given taskSize. Quota manager will check the current space used by all its quota users. If the size + taskSize is above quota, it will call a function to try extend the quota. In the meantime, the task (and all tasks that may be added) are queued. Once the new quota is received, the quota manager will either allow or disallow the first task in the queue. The quota manager will try to execute as many tasks as possible with the provided quota. If some tasks are remaining and quota limit is hit, the quota manager will compute the space needed for all remaining requests and do another quota extension request. * Sources.txt: * WebCore.xcodeproj/project.pbxproj: * page/ClientOrigin.h: * storage/StorageQuotaManager.cpp: Added. (WebCore::StorageQuotaManager::~StorageQuotaManager): (WebCore::StorageQuotaManager::spaceUsage const): (WebCore::StorageQuotaManager::requestSpace): (WebCore::StorageQuotaManager::askForMoreSpace): (WebCore::StorageQuotaManager::processPendingRequests): * storage/StorageQuotaManager.h: Added. (WebCore::StorageQuotaManager::StorageQuotaManager): (WebCore::StorageQuotaManager::addUser): (WebCore::StorageQuotaManager::removeUser): * storage/StorageQuotaUser.h: Added. Source/WebKit: Remove quota handling from Cache API storage and use StorageQuotaManager/StorageQuotaUser. CacheStorage::Caches becomes a quota user and has a StorageQuotaManager to check for space for any cache API write task. NetworkProcess is responsible to manage the quota managers. Quota managers will go through network process to ask UIProcess for quota extension. Remove pending callback handling from CacheStorage since they are queued in QuotaManager now. * NetworkProcess/NetworkProcess.cpp: (WebKit::NetworkProcess::~NetworkProcess): (WebKit::NetworkProcess::destroySession): (WebKit::NetworkProcess::cacheStorageRootPath): (WebKit::NetworkProcess::setCacheStorageParameters): (WebKit::NetworkProcess::storageQuotaManager): * NetworkProcess/NetworkProcess.h: * NetworkProcess/cache/CacheStorageEngine.cpp: (WebKit::CacheStorage::Engine::from): (WebKit::CacheStorage::Engine::Engine): (WebKit::CacheStorage::Engine::readCachesFromDisk): * NetworkProcess/cache/CacheStorageEngine.h: * NetworkProcess/cache/CacheStorageEngineCache.cpp: (WebKit::CacheStorage::Cache::put): * NetworkProcess/cache/CacheStorageEngineCache.h: * NetworkProcess/cache/CacheStorageEngineCaches.cpp: (WebKit::CacheStorage::Caches::Caches): (WebKit::CacheStorage::Caches::~Caches): (WebKit::CacheStorage::Caches::requestSpace): (WebKit::CacheStorage::Caches::writeRecord): * NetworkProcess/cache/CacheStorageEngineCaches.h: Canonical link: https://commits.webkit.org/209739@main git-svn-id: https://svn.webkit.org/repository/webkit/trunk@242599 268f45cc-cd09-0410-ab3c-d52691b4dbfc
2019-03-07 17:40:40 +00:00
uint64_t m_quota { 0 };
Cross-thread version StorageQuotaManager https://bugs.webkit.org/show_bug.cgi?id=203971 <rdar://problem/57290349> Reviewed by Chris Dumez. Source/WebCore: Implement a lock-based StorageQuotaManager so that quota check can be done on different threads. If space request is made on a background thread, it needs to hold a lock until it is finished, so no request from different threads can be performed at the same time. If space request is made on the main thread, we will dispatch it to a background thread and schedule a calllback to the main thread when result is available, so the main thread will not be blocked. Covered by existing quota related tests. * Headers.cmake: * Modules/indexeddb/server/IDBServer.cpp: (WebCore::IDBServer::IDBServer::create): (WebCore::IDBServer::IDBServer::IDBServer): (WebCore::IDBServer::IDBServer::didPerformCloseAndDeleteDatabases): (WebCore::IDBServer::IDBServer::requestSpace): (WebCore::IDBServer::IDBServer::diskUsage): (WebCore::IDBServer::IDBServer::QuotaUser::QuotaUser): Deleted. (WebCore::IDBServer::IDBServer::QuotaUser::~QuotaUser): Deleted. (WebCore::IDBServer::IDBServer::QuotaUser::resetSpaceUsed): Deleted. (WebCore::IDBServer::IDBServer::QuotaUser::computeSpaceUsed): Deleted. (WebCore::IDBServer::IDBServer::QuotaUser::increaseSpaceUsed): Deleted. (WebCore::IDBServer::IDBServer::QuotaUser::decreaseSpaceUsed): Deleted. (WebCore::IDBServer::IDBServer::QuotaUser::whenInitialized): Deleted. (WebCore::IDBServer::IDBServer::QuotaUser::initializeSpaceUsed): Deleted. (WebCore::IDBServer::IDBServer::ensureQuotaUser): Deleted. (WebCore::IDBServer::IDBServer::startComputingSpaceUsedForOrigin): Deleted. (WebCore::IDBServer::IDBServer::computeSpaceUsedForOrigin): Deleted. (WebCore::IDBServer::IDBServer::finishComputingSpaceUsedForOrigin): Deleted. (WebCore::IDBServer::IDBServer::resetSpaceUsed): Deleted. (WebCore::IDBServer::IDBServer::increaseSpaceUsed): Deleted. (WebCore::IDBServer::IDBServer::decreaseSpaceUsed): Deleted. (WebCore::IDBServer::IDBServer::increasePotentialSpaceUsed): Deleted. (WebCore::IDBServer::IDBServer::decreasePotentialSpaceUsed): Deleted. * Modules/indexeddb/server/IDBServer.h: (WebCore::IDBServer::IDBServer::initializeQuotaUser): Deleted. (): Deleted. * Modules/indexeddb/server/UniqueIDBDatabase.cpp: (WebCore::IDBServer::UniqueIDBDatabase::performCurrentOpenOperation): (WebCore::IDBServer::UniqueIDBDatabase::openBackingStore): (WebCore::IDBServer::UniqueIDBDatabase::didOpenBackingStore): (WebCore::IDBServer::UniqueIDBDatabase::createObjectStore): (WebCore::IDBServer::UniqueIDBDatabase::performCreateObjectStore): (WebCore::IDBServer::UniqueIDBDatabase::didPerformCreateObjectStore): (WebCore::IDBServer::UniqueIDBDatabase::deleteObjectStore): (WebCore::IDBServer::UniqueIDBDatabase::renameObjectStore): (WebCore::IDBServer::UniqueIDBDatabase::performRenameObjectStore): (WebCore::IDBServer::UniqueIDBDatabase::didPerformRenameObjectStore): (WebCore::IDBServer::UniqueIDBDatabase::clearObjectStore): (WebCore::IDBServer::UniqueIDBDatabase::createIndex): (WebCore::IDBServer::UniqueIDBDatabase::performCreateIndex): (WebCore::IDBServer::UniqueIDBDatabase::didPerformCreateIndex): (WebCore::IDBServer::UniqueIDBDatabase::deleteIndex): (WebCore::IDBServer::UniqueIDBDatabase::renameIndex): (WebCore::IDBServer::UniqueIDBDatabase::performRenameIndex): (WebCore::IDBServer::UniqueIDBDatabase::didPerformRenameIndex): (WebCore::IDBServer::UniqueIDBDatabase::putOrAdd): (WebCore::IDBServer::UniqueIDBDatabase::performPutOrAdd): (WebCore::IDBServer::UniqueIDBDatabase::didPerformPutOrAdd): (WebCore::IDBServer::UniqueIDBDatabase::getRecord): (WebCore::IDBServer::UniqueIDBDatabase::getAllRecords): (WebCore::IDBServer::UniqueIDBDatabase::performGetRecord): (WebCore::IDBServer::UniqueIDBDatabase::performGetAllRecords): (WebCore::IDBServer::UniqueIDBDatabase::getCount): (WebCore::IDBServer::UniqueIDBDatabase::deleteRecord): (WebCore::IDBServer::UniqueIDBDatabase::openCursor): (WebCore::IDBServer::UniqueIDBDatabase::iterateCursor): (WebCore::IDBServer::UniqueIDBDatabase::commitTransaction): (WebCore::IDBServer::UniqueIDBDatabase::abortTransaction): (WebCore::IDBServer::UniqueIDBDatabase::requestSpace): Deleted. (WebCore::IDBServer::UniqueIDBDatabase::waitForRequestSpaceCompletion): Deleted. (WebCore::IDBServer::UniqueIDBDatabase::startSpaceIncreaseTask): Deleted. (WebCore::IDBServer::UniqueIDBDatabase::finishSpaceIncreaseTask): Deleted. (WebCore::IDBServer::UniqueIDBDatabase::createObjectStoreAfterQuotaCheck): Deleted. (WebCore::IDBServer::UniqueIDBDatabase::deleteObjectStoreAfterQuotaCheck): Deleted. (WebCore::IDBServer::UniqueIDBDatabase::renameObjectStoreAfterQuotaCheck): Deleted. (WebCore::IDBServer::UniqueIDBDatabase::clearObjectStoreAfetQuotaCheck): Deleted. (WebCore::IDBServer::UniqueIDBDatabase::createIndexAfterQuotaCheck): Deleted. (WebCore::IDBServer::UniqueIDBDatabase::deleteIndexAfterQuotaCheck): Deleted. (WebCore::IDBServer::UniqueIDBDatabase::renameIndexAfterQuotaCheck): Deleted. (WebCore::IDBServer::UniqueIDBDatabase::putOrAddAfterQuotaCheck): Deleted. (WebCore::IDBServer::UniqueIDBDatabase::getRecordAfterQuotaCheck): Deleted. (WebCore::IDBServer::UniqueIDBDatabase::getAllRecordsAfterQuotaCheck): Deleted. (WebCore::IDBServer::UniqueIDBDatabase::getCountAfterQuotaCheck): Deleted. (WebCore::IDBServer::UniqueIDBDatabase::deleteRecordAfterQuotaCheck): Deleted. (WebCore::IDBServer::UniqueIDBDatabase::openCursorAfterQuotaCheck): Deleted. (WebCore::IDBServer::UniqueIDBDatabase::iterateCursorAfterQuotaCheck): Deleted. (WebCore::IDBServer::UniqueIDBDatabase::commitTransactionAfterQuotaCheck): Deleted. * Modules/indexeddb/server/UniqueIDBDatabase.h: * Modules/indexeddb/server/UniqueIDBDatabaseConnection.cpp: (WebCore::IDBServer::UniqueIDBDatabaseConnection::abortTransactionWithoutCallback): * Modules/indexeddb/server/UniqueIDBDatabaseTransaction.cpp: (WebCore::IDBServer::UniqueIDBDatabaseTransaction::abort): (WebCore::IDBServer::UniqueIDBDatabaseTransaction::putOrAdd): (WebCore::IDBServer::UniqueIDBDatabaseTransaction::getRecord): (WebCore::IDBServer::UniqueIDBDatabaseTransaction::getAllRecords): (WebCore::IDBServer::UniqueIDBDatabaseTransaction::getCount): (WebCore::IDBServer::UniqueIDBDatabaseTransaction::deleteRecord): (WebCore::IDBServer::UniqueIDBDatabaseTransaction::openCursor): (WebCore::IDBServer::UniqueIDBDatabaseTransaction::iterateCursor): * Modules/indexeddb/shared/InProcessIDBServer.cpp: (WebCore::InProcessIDBServer::quotaManager): (WebCore::storageQuotaManagerSpaceRequester): (WebCore::InProcessIDBServer::InProcessIDBServer): (WebCore::storageQuotaManagerGetter): Deleted. * Modules/indexeddb/shared/InProcessIDBServer.h: * WebCore.xcodeproj/project.pbxproj: * storage/StorageQuotaManager.cpp: (WebCore::StorageQuotaManager::create): (WebCore::StorageQuotaManager::StorageQuotaManager): (WebCore::StorageQuotaManager::requestSpaceOnMainThread): (WebCore::StorageQuotaManager::requestSpaceOnBackgroundThread): (WebCore::StorageQuotaManager::tryGrantRequest): (WebCore::StorageQuotaManager::updateQuotaBasedOnUsage): (WebCore::StorageQuotaManager::resetQuotaUpdatedBasedOnUsageForTesting): (WebCore::StorageQuotaManager::resetQuotaForTesting): (WebCore::StorageQuotaManager::~StorageQuotaManager): Deleted. (WebCore::StorageQuotaManager::spaceUsage const): Deleted. (WebCore::StorageQuotaManager::updateQuotaBasedOnSpaceUsage): Deleted. (WebCore::StorageQuotaManager::initializeUsersIfNeeded): Deleted. (WebCore::StorageQuotaManager::askUserToInitialize): Deleted. (WebCore::StorageQuotaManager::addUser): Deleted. (WebCore::StorageQuotaManager::shouldAskForMoreSpace const): Deleted. (WebCore::StorageQuotaManager::removeUser): Deleted. (WebCore::StorageQuotaManager::requestSpace): Deleted. (WebCore::StorageQuotaManager::askForMoreSpace): Deleted. (WebCore::StorageQuotaManager::processPendingRequests): Deleted. * storage/StorageQuotaManager.h: (WebCore::StorageQuotaManager::defaultThirdPartyQuotaFromPerOriginQuota): (WebCore::StorageQuotaManager::StorageQuotaManager): Deleted. (WebCore::StorageQuotaManager::resetQuota): Deleted. (WebCore::StorageQuotaManager::state const): Deleted. * storage/StorageQuotaUser.h: Removed. Source/WebKit: * NetworkProcess/NetworkProcess.cpp: Introduce class SessionStorageQuotaManager to manage all StorageQuotaManagers of the same session. (WebKit::NetworkProcess::initializeNetworkProcess): (WebKit::NetworkProcess::addWebsiteDataStore): (WebKit::NetworkProcess::addSessionStorageQuotaManager): (WebKit::NetworkProcess::removeSessionStorageQuotaManager): (WebKit::NetworkProcess::destroySession): (WebKit::NetworkProcess::deleteWebsiteData): (WebKit::NetworkProcess::deleteWebsiteDataForOrigins): (WebKit::NetworkProcess::createIDBServer): (WebKit::NetworkProcess::addIndexedDatabaseSession): (WebKit::NetworkProcess::setSessionStorageQuotaManagerIDBRootPath): (WebKit::NetworkProcess::updateQuotaBasedOnSpaceUsageForTesting): (WebKit::NetworkProcess::resetQuota): (WebKit::NetworkProcess::storageQuotaManager): (WebKit::NetworkProcess::initializeStorageQuota): Deleted. (WebKit::NetworkProcess::clearStorageQuota): Deleted. (): Deleted. (WebKit::NetworkProcess::initializeQuotaUsers): Deleted. * NetworkProcess/NetworkProcess.h: (WebKit::NetworkProcess::SessionStorageQuotaManager::SessionStorageQuotaManager): (WebKit::NetworkProcess::SessionStorageQuotaManager::defaultQuota const): (WebKit::NetworkProcess::SessionStorageQuotaManager::ensureOriginStorageQuotaManager): (WebKit::NetworkProcess::SessionStorageQuotaManager::existingStorageQuotaManagers): (WebKit::NetworkProcess::SessionStorageQuotaManager::cacheRootPath const): (WebKit::NetworkProcess::SessionStorageQuotaManager::setIDBRootPath): (WebKit::NetworkProcess::SessionStorageQuotaManager::idbRootPath const): (WebKit::NetworkProcess::StorageQuotaManagers::defaultQuota const): Deleted. (WebKit::NetworkProcess::StorageQuotaManagers::setDefaultQuotas): Deleted. (WebKit::NetworkProcess::StorageQuotaManagers::managersPerOrigin): Deleted. * NetworkProcess/NetworkProcess.messages.in: * NetworkProcess/cache/CacheStorageEngine.cpp: (WebKit::CacheStorage::getDirectorySize): (WebKit::CacheStorage::Engine::diskUsage): static function to get the disk usage of CacheStorage given CacheStorage root directory. (WebKit::CacheStorage::Engine::requestSpace): (WebKit::CacheStorage::Engine::readCachesFromDisk): (WebKit::CacheStorage::Engine::writeSizeFile): (WebKit::CacheStorage::Engine::readSizeFile): (WebKit::CacheStorage::Engine::initializeQuotaUser): Deleted. * NetworkProcess/cache/CacheStorageEngine.h: * NetworkProcess/cache/CacheStorageEngineCache.cpp: (WebKit::CacheStorage::Cache::put): (WebKit::CacheStorage::Cache::remove): * NetworkProcess/cache/CacheStorageEngineCaches.cpp: (WebKit::CacheStorage::Caches::create): (WebKit::CacheStorage::Caches::Caches): (WebKit::CacheStorage::Caches::~Caches): (WebKit::CacheStorage::Caches::updateSizeFile): (WebKit::CacheStorage::Caches::initializeSize): (WebKit::CacheStorage::Caches::clear): (WebKit::CacheStorage::Caches::requestSpace): (WebKit::CacheStorage::Caches::writeRecord): (WebKit::CacheStorage::Caches::removeRecord): (WebKit::CacheStorage::Caches::whenInitialized): Deleted. (WebKit::CacheStorage::Caches::resetSpaceUsed): Deleted. * NetworkProcess/cache/CacheStorageEngineCaches.h: * Shared/WebsiteDataStoreParameters.cpp: (WebKit::WebsiteDataStoreParameters::encode const): (WebKit::WebsiteDataStoreParameters::decode): * Shared/WebsiteDataStoreParameters.h: Add a cacheStorageDirectory parameter so we know the direcotry of CacheStorage when we start using WebsiteDataStore. * UIProcess/API/C/WKWebsiteDataStoreRef.cpp: (WKWebsiteDataStoreResetQuota): * UIProcess/API/C/WKWebsiteDataStoreRef.h: Add a C API for reseting quota in TestRunner. * UIProcess/Network/NetworkProcessProxy.cpp: (WebKit::NetworkProcessProxy::resetQuota): * UIProcess/Network/NetworkProcessProxy.h: * UIProcess/WebProcessPool.cpp: (WebKit::WebProcessPool::ensureNetworkProcess): * UIProcess/WebsiteData/Cocoa/WebsiteDataStoreCocoa.mm: (WebKit::WebsiteDataStore::parameters): * UIProcess/WebsiteData/WebsiteDataStore.cpp: (WebKit::WebsiteDataStore::parameters): (WebKit::WebsiteDataStore::resetQuota): * UIProcess/WebsiteData/WebsiteDataStore.h: Tools: * TestWebKitAPI/TestWebKitAPI.xcodeproj/project.pbxproj: * TestWebKitAPI/Tests/WebCore/StorageQuotaManager.cpp: Removed as we have a different StorageQuotaManager implementation now. * WebKitTestRunner/TestController.cpp: reset StorageQuotaManager's quota between tests. (WTR::TestController::resetStateToConsistentValues): (WTR::TestController::resetQuota): * WebKitTestRunner/TestController.h: Canonical link: https://commits.webkit.org/217990@main git-svn-id: https://svn.webkit.org/repository/webkit/trunk@253025 268f45cc-cd09-0410-ab3c-d52691b4dbfc
2019-12-03 06:53:42 +00:00
uint64_t m_usage { 0 };
Cache API and IDB space usages should be initialized on first quota check https://bugs.webkit.org/show_bug.cgi?id=195707 Reviewed by Chris Dumez. Source/WebCore: Add a way to require IDBServer to create a quota user for a given origin. Make sure that removing a user might kick-in processing of pending requests. In the case of processing pending requests, we should not decide on the first task except if it is triggered by a request space response. Update processPendingRequests accordingly. Tests: http/tests/IndexedDB/storage-limit-1.https.html http/tests/IndexedDB/storage-limit-2.https.html * Modules/indexeddb/server/IDBServer.h: (WebCore::IDBServer::IDBServer::initializeQuotaUser): * storage/StorageQuotaManager.cpp: (WebCore::StorageQuotaManager::removeUser): (WebCore::StorageQuotaManager::askForMoreSpace): (WebCore::StorageQuotaManager::processPendingRequests): * storage/StorageQuotaManager.h: Source/WebKit: When the quota manager is created, make sure it delays quota check decisions until IDB and Cache API quota users are initialized. For IDB, the creation is synchronous but it may not be synchronous for Cache API. For that purpose, add a temporary quota user that will stay uninitialized until these two quota users are added. Once added, the temporary quota user is removed. The addition of the real users is made asynchronously as this is triggered by the creation of one of the two quota users. In the case of a Cache API caches being cleared, make sure to reset the size to zero and to redo the quota user initialization dance. * NetworkProcess/NetworkProcess.cpp: (WebKit::QuotaUserInitializer::initialize): (WebKit::QuotaUserInitializer::~QuotaUserInitializer): (WebKit::QuotaUserInitializer::QuotaUserInitializer): (WebKit::NetworkProcess::storageQuotaManager): * NetworkProcess/cache/CacheStorageEngine.cpp: (WebKit::CacheStorage::Engine::initializeQuotaUser): * NetworkProcess/cache/CacheStorageEngine.h: * NetworkProcess/cache/CacheStorageEngineCaches.cpp: (WebKit::CacheStorage::Caches::clear): LayoutTests: * TestExpectations: Marking http/tests/cache-storage/cache-clearing-origin.https.html as flaky on iOS as it is already marked flaky in MacOS. * platform/mac-wk2/TestExpectations: * http/tests/IndexedDB/storage-limit-1.https-expected.txt: Added. * http/tests/IndexedDB/storage-limit-1.https.html: Added. * http/tests/IndexedDB/storage-limit-2.https-expected.txt: Added. * http/tests/IndexedDB/storage-limit-2.https.html: Added. * http/tests/IndexedDB/storage-limit.https.html: * platform/mac-wk1/TestExpectations: * platform/win/TestExpectations: Canonical link: https://commits.webkit.org/210403@main git-svn-id: https://svn.webkit.org/repository/webkit/trunk@243339 268f45cc-cd09-0410-ab3c-d52691b4dbfc
2019-03-21 22:52:18 +00:00
Cross-thread version StorageQuotaManager https://bugs.webkit.org/show_bug.cgi?id=203971 <rdar://problem/57290349> Reviewed by Chris Dumez. Source/WebCore: Implement a lock-based StorageQuotaManager so that quota check can be done on different threads. If space request is made on a background thread, it needs to hold a lock until it is finished, so no request from different threads can be performed at the same time. If space request is made on the main thread, we will dispatch it to a background thread and schedule a calllback to the main thread when result is available, so the main thread will not be blocked. Covered by existing quota related tests. * Headers.cmake: * Modules/indexeddb/server/IDBServer.cpp: (WebCore::IDBServer::IDBServer::create): (WebCore::IDBServer::IDBServer::IDBServer): (WebCore::IDBServer::IDBServer::didPerformCloseAndDeleteDatabases): (WebCore::IDBServer::IDBServer::requestSpace): (WebCore::IDBServer::IDBServer::diskUsage): (WebCore::IDBServer::IDBServer::QuotaUser::QuotaUser): Deleted. (WebCore::IDBServer::IDBServer::QuotaUser::~QuotaUser): Deleted. (WebCore::IDBServer::IDBServer::QuotaUser::resetSpaceUsed): Deleted. (WebCore::IDBServer::IDBServer::QuotaUser::computeSpaceUsed): Deleted. (WebCore::IDBServer::IDBServer::QuotaUser::increaseSpaceUsed): Deleted. (WebCore::IDBServer::IDBServer::QuotaUser::decreaseSpaceUsed): Deleted. (WebCore::IDBServer::IDBServer::QuotaUser::whenInitialized): Deleted. (WebCore::IDBServer::IDBServer::QuotaUser::initializeSpaceUsed): Deleted. (WebCore::IDBServer::IDBServer::ensureQuotaUser): Deleted. (WebCore::IDBServer::IDBServer::startComputingSpaceUsedForOrigin): Deleted. (WebCore::IDBServer::IDBServer::computeSpaceUsedForOrigin): Deleted. (WebCore::IDBServer::IDBServer::finishComputingSpaceUsedForOrigin): Deleted. (WebCore::IDBServer::IDBServer::resetSpaceUsed): Deleted. (WebCore::IDBServer::IDBServer::increaseSpaceUsed): Deleted. (WebCore::IDBServer::IDBServer::decreaseSpaceUsed): Deleted. (WebCore::IDBServer::IDBServer::increasePotentialSpaceUsed): Deleted. (WebCore::IDBServer::IDBServer::decreasePotentialSpaceUsed): Deleted. * Modules/indexeddb/server/IDBServer.h: (WebCore::IDBServer::IDBServer::initializeQuotaUser): Deleted. (): Deleted. * Modules/indexeddb/server/UniqueIDBDatabase.cpp: (WebCore::IDBServer::UniqueIDBDatabase::performCurrentOpenOperation): (WebCore::IDBServer::UniqueIDBDatabase::openBackingStore): (WebCore::IDBServer::UniqueIDBDatabase::didOpenBackingStore): (WebCore::IDBServer::UniqueIDBDatabase::createObjectStore): (WebCore::IDBServer::UniqueIDBDatabase::performCreateObjectStore): (WebCore::IDBServer::UniqueIDBDatabase::didPerformCreateObjectStore): (WebCore::IDBServer::UniqueIDBDatabase::deleteObjectStore): (WebCore::IDBServer::UniqueIDBDatabase::renameObjectStore): (WebCore::IDBServer::UniqueIDBDatabase::performRenameObjectStore): (WebCore::IDBServer::UniqueIDBDatabase::didPerformRenameObjectStore): (WebCore::IDBServer::UniqueIDBDatabase::clearObjectStore): (WebCore::IDBServer::UniqueIDBDatabase::createIndex): (WebCore::IDBServer::UniqueIDBDatabase::performCreateIndex): (WebCore::IDBServer::UniqueIDBDatabase::didPerformCreateIndex): (WebCore::IDBServer::UniqueIDBDatabase::deleteIndex): (WebCore::IDBServer::UniqueIDBDatabase::renameIndex): (WebCore::IDBServer::UniqueIDBDatabase::performRenameIndex): (WebCore::IDBServer::UniqueIDBDatabase::didPerformRenameIndex): (WebCore::IDBServer::UniqueIDBDatabase::putOrAdd): (WebCore::IDBServer::UniqueIDBDatabase::performPutOrAdd): (WebCore::IDBServer::UniqueIDBDatabase::didPerformPutOrAdd): (WebCore::IDBServer::UniqueIDBDatabase::getRecord): (WebCore::IDBServer::UniqueIDBDatabase::getAllRecords): (WebCore::IDBServer::UniqueIDBDatabase::performGetRecord): (WebCore::IDBServer::UniqueIDBDatabase::performGetAllRecords): (WebCore::IDBServer::UniqueIDBDatabase::getCount): (WebCore::IDBServer::UniqueIDBDatabase::deleteRecord): (WebCore::IDBServer::UniqueIDBDatabase::openCursor): (WebCore::IDBServer::UniqueIDBDatabase::iterateCursor): (WebCore::IDBServer::UniqueIDBDatabase::commitTransaction): (WebCore::IDBServer::UniqueIDBDatabase::abortTransaction): (WebCore::IDBServer::UniqueIDBDatabase::requestSpace): Deleted. (WebCore::IDBServer::UniqueIDBDatabase::waitForRequestSpaceCompletion): Deleted. (WebCore::IDBServer::UniqueIDBDatabase::startSpaceIncreaseTask): Deleted. (WebCore::IDBServer::UniqueIDBDatabase::finishSpaceIncreaseTask): Deleted. (WebCore::IDBServer::UniqueIDBDatabase::createObjectStoreAfterQuotaCheck): Deleted. (WebCore::IDBServer::UniqueIDBDatabase::deleteObjectStoreAfterQuotaCheck): Deleted. (WebCore::IDBServer::UniqueIDBDatabase::renameObjectStoreAfterQuotaCheck): Deleted. (WebCore::IDBServer::UniqueIDBDatabase::clearObjectStoreAfetQuotaCheck): Deleted. (WebCore::IDBServer::UniqueIDBDatabase::createIndexAfterQuotaCheck): Deleted. (WebCore::IDBServer::UniqueIDBDatabase::deleteIndexAfterQuotaCheck): Deleted. (WebCore::IDBServer::UniqueIDBDatabase::renameIndexAfterQuotaCheck): Deleted. (WebCore::IDBServer::UniqueIDBDatabase::putOrAddAfterQuotaCheck): Deleted. (WebCore::IDBServer::UniqueIDBDatabase::getRecordAfterQuotaCheck): Deleted. (WebCore::IDBServer::UniqueIDBDatabase::getAllRecordsAfterQuotaCheck): Deleted. (WebCore::IDBServer::UniqueIDBDatabase::getCountAfterQuotaCheck): Deleted. (WebCore::IDBServer::UniqueIDBDatabase::deleteRecordAfterQuotaCheck): Deleted. (WebCore::IDBServer::UniqueIDBDatabase::openCursorAfterQuotaCheck): Deleted. (WebCore::IDBServer::UniqueIDBDatabase::iterateCursorAfterQuotaCheck): Deleted. (WebCore::IDBServer::UniqueIDBDatabase::commitTransactionAfterQuotaCheck): Deleted. * Modules/indexeddb/server/UniqueIDBDatabase.h: * Modules/indexeddb/server/UniqueIDBDatabaseConnection.cpp: (WebCore::IDBServer::UniqueIDBDatabaseConnection::abortTransactionWithoutCallback): * Modules/indexeddb/server/UniqueIDBDatabaseTransaction.cpp: (WebCore::IDBServer::UniqueIDBDatabaseTransaction::abort): (WebCore::IDBServer::UniqueIDBDatabaseTransaction::putOrAdd): (WebCore::IDBServer::UniqueIDBDatabaseTransaction::getRecord): (WebCore::IDBServer::UniqueIDBDatabaseTransaction::getAllRecords): (WebCore::IDBServer::UniqueIDBDatabaseTransaction::getCount): (WebCore::IDBServer::UniqueIDBDatabaseTransaction::deleteRecord): (WebCore::IDBServer::UniqueIDBDatabaseTransaction::openCursor): (WebCore::IDBServer::UniqueIDBDatabaseTransaction::iterateCursor): * Modules/indexeddb/shared/InProcessIDBServer.cpp: (WebCore::InProcessIDBServer::quotaManager): (WebCore::storageQuotaManagerSpaceRequester): (WebCore::InProcessIDBServer::InProcessIDBServer): (WebCore::storageQuotaManagerGetter): Deleted. * Modules/indexeddb/shared/InProcessIDBServer.h: * WebCore.xcodeproj/project.pbxproj: * storage/StorageQuotaManager.cpp: (WebCore::StorageQuotaManager::create): (WebCore::StorageQuotaManager::StorageQuotaManager): (WebCore::StorageQuotaManager::requestSpaceOnMainThread): (WebCore::StorageQuotaManager::requestSpaceOnBackgroundThread): (WebCore::StorageQuotaManager::tryGrantRequest): (WebCore::StorageQuotaManager::updateQuotaBasedOnUsage): (WebCore::StorageQuotaManager::resetQuotaUpdatedBasedOnUsageForTesting): (WebCore::StorageQuotaManager::resetQuotaForTesting): (WebCore::StorageQuotaManager::~StorageQuotaManager): Deleted. (WebCore::StorageQuotaManager::spaceUsage const): Deleted. (WebCore::StorageQuotaManager::updateQuotaBasedOnSpaceUsage): Deleted. (WebCore::StorageQuotaManager::initializeUsersIfNeeded): Deleted. (WebCore::StorageQuotaManager::askUserToInitialize): Deleted. (WebCore::StorageQuotaManager::addUser): Deleted. (WebCore::StorageQuotaManager::shouldAskForMoreSpace const): Deleted. (WebCore::StorageQuotaManager::removeUser): Deleted. (WebCore::StorageQuotaManager::requestSpace): Deleted. (WebCore::StorageQuotaManager::askForMoreSpace): Deleted. (WebCore::StorageQuotaManager::processPendingRequests): Deleted. * storage/StorageQuotaManager.h: (WebCore::StorageQuotaManager::defaultThirdPartyQuotaFromPerOriginQuota): (WebCore::StorageQuotaManager::StorageQuotaManager): Deleted. (WebCore::StorageQuotaManager::resetQuota): Deleted. (WebCore::StorageQuotaManager::state const): Deleted. * storage/StorageQuotaUser.h: Removed. Source/WebKit: * NetworkProcess/NetworkProcess.cpp: Introduce class SessionStorageQuotaManager to manage all StorageQuotaManagers of the same session. (WebKit::NetworkProcess::initializeNetworkProcess): (WebKit::NetworkProcess::addWebsiteDataStore): (WebKit::NetworkProcess::addSessionStorageQuotaManager): (WebKit::NetworkProcess::removeSessionStorageQuotaManager): (WebKit::NetworkProcess::destroySession): (WebKit::NetworkProcess::deleteWebsiteData): (WebKit::NetworkProcess::deleteWebsiteDataForOrigins): (WebKit::NetworkProcess::createIDBServer): (WebKit::NetworkProcess::addIndexedDatabaseSession): (WebKit::NetworkProcess::setSessionStorageQuotaManagerIDBRootPath): (WebKit::NetworkProcess::updateQuotaBasedOnSpaceUsageForTesting): (WebKit::NetworkProcess::resetQuota): (WebKit::NetworkProcess::storageQuotaManager): (WebKit::NetworkProcess::initializeStorageQuota): Deleted. (WebKit::NetworkProcess::clearStorageQuota): Deleted. (): Deleted. (WebKit::NetworkProcess::initializeQuotaUsers): Deleted. * NetworkProcess/NetworkProcess.h: (WebKit::NetworkProcess::SessionStorageQuotaManager::SessionStorageQuotaManager): (WebKit::NetworkProcess::SessionStorageQuotaManager::defaultQuota const): (WebKit::NetworkProcess::SessionStorageQuotaManager::ensureOriginStorageQuotaManager): (WebKit::NetworkProcess::SessionStorageQuotaManager::existingStorageQuotaManagers): (WebKit::NetworkProcess::SessionStorageQuotaManager::cacheRootPath const): (WebKit::NetworkProcess::SessionStorageQuotaManager::setIDBRootPath): (WebKit::NetworkProcess::SessionStorageQuotaManager::idbRootPath const): (WebKit::NetworkProcess::StorageQuotaManagers::defaultQuota const): Deleted. (WebKit::NetworkProcess::StorageQuotaManagers::setDefaultQuotas): Deleted. (WebKit::NetworkProcess::StorageQuotaManagers::managersPerOrigin): Deleted. * NetworkProcess/NetworkProcess.messages.in: * NetworkProcess/cache/CacheStorageEngine.cpp: (WebKit::CacheStorage::getDirectorySize): (WebKit::CacheStorage::Engine::diskUsage): static function to get the disk usage of CacheStorage given CacheStorage root directory. (WebKit::CacheStorage::Engine::requestSpace): (WebKit::CacheStorage::Engine::readCachesFromDisk): (WebKit::CacheStorage::Engine::writeSizeFile): (WebKit::CacheStorage::Engine::readSizeFile): (WebKit::CacheStorage::Engine::initializeQuotaUser): Deleted. * NetworkProcess/cache/CacheStorageEngine.h: * NetworkProcess/cache/CacheStorageEngineCache.cpp: (WebKit::CacheStorage::Cache::put): (WebKit::CacheStorage::Cache::remove): * NetworkProcess/cache/CacheStorageEngineCaches.cpp: (WebKit::CacheStorage::Caches::create): (WebKit::CacheStorage::Caches::Caches): (WebKit::CacheStorage::Caches::~Caches): (WebKit::CacheStorage::Caches::updateSizeFile): (WebKit::CacheStorage::Caches::initializeSize): (WebKit::CacheStorage::Caches::clear): (WebKit::CacheStorage::Caches::requestSpace): (WebKit::CacheStorage::Caches::writeRecord): (WebKit::CacheStorage::Caches::removeRecord): (WebKit::CacheStorage::Caches::whenInitialized): Deleted. (WebKit::CacheStorage::Caches::resetSpaceUsed): Deleted. * NetworkProcess/cache/CacheStorageEngineCaches.h: * Shared/WebsiteDataStoreParameters.cpp: (WebKit::WebsiteDataStoreParameters::encode const): (WebKit::WebsiteDataStoreParameters::decode): * Shared/WebsiteDataStoreParameters.h: Add a cacheStorageDirectory parameter so we know the direcotry of CacheStorage when we start using WebsiteDataStore. * UIProcess/API/C/WKWebsiteDataStoreRef.cpp: (WKWebsiteDataStoreResetQuota): * UIProcess/API/C/WKWebsiteDataStoreRef.h: Add a C API for reseting quota in TestRunner. * UIProcess/Network/NetworkProcessProxy.cpp: (WebKit::NetworkProcessProxy::resetQuota): * UIProcess/Network/NetworkProcessProxy.h: * UIProcess/WebProcessPool.cpp: (WebKit::WebProcessPool::ensureNetworkProcess): * UIProcess/WebsiteData/Cocoa/WebsiteDataStoreCocoa.mm: (WebKit::WebsiteDataStore::parameters): * UIProcess/WebsiteData/WebsiteDataStore.cpp: (WebKit::WebsiteDataStore::parameters): (WebKit::WebsiteDataStore::resetQuota): * UIProcess/WebsiteData/WebsiteDataStore.h: Tools: * TestWebKitAPI/TestWebKitAPI.xcodeproj/project.pbxproj: * TestWebKitAPI/Tests/WebCore/StorageQuotaManager.cpp: Removed as we have a different StorageQuotaManager implementation now. * WebKitTestRunner/TestController.cpp: reset StorageQuotaManager's quota between tests. (WTR::TestController::resetStateToConsistentValues): (WTR::TestController::resetQuota): * WebKitTestRunner/TestController.h: Canonical link: https://commits.webkit.org/217990@main git-svn-id: https://svn.webkit.org/repository/webkit/trunk@253025 268f45cc-cd09-0410-ab3c-d52691b4dbfc
2019-12-03 06:53:42 +00:00
UsageGetter m_usageGetter;
QuotaIncreaseRequester m_quotaIncreaseRequester;
2019-04-10 16:30:58 +00:00
Cross-thread version StorageQuotaManager https://bugs.webkit.org/show_bug.cgi?id=203971 <rdar://problem/57290349> Reviewed by Chris Dumez. Source/WebCore: Implement a lock-based StorageQuotaManager so that quota check can be done on different threads. If space request is made on a background thread, it needs to hold a lock until it is finished, so no request from different threads can be performed at the same time. If space request is made on the main thread, we will dispatch it to a background thread and schedule a calllback to the main thread when result is available, so the main thread will not be blocked. Covered by existing quota related tests. * Headers.cmake: * Modules/indexeddb/server/IDBServer.cpp: (WebCore::IDBServer::IDBServer::create): (WebCore::IDBServer::IDBServer::IDBServer): (WebCore::IDBServer::IDBServer::didPerformCloseAndDeleteDatabases): (WebCore::IDBServer::IDBServer::requestSpace): (WebCore::IDBServer::IDBServer::diskUsage): (WebCore::IDBServer::IDBServer::QuotaUser::QuotaUser): Deleted. (WebCore::IDBServer::IDBServer::QuotaUser::~QuotaUser): Deleted. (WebCore::IDBServer::IDBServer::QuotaUser::resetSpaceUsed): Deleted. (WebCore::IDBServer::IDBServer::QuotaUser::computeSpaceUsed): Deleted. (WebCore::IDBServer::IDBServer::QuotaUser::increaseSpaceUsed): Deleted. (WebCore::IDBServer::IDBServer::QuotaUser::decreaseSpaceUsed): Deleted. (WebCore::IDBServer::IDBServer::QuotaUser::whenInitialized): Deleted. (WebCore::IDBServer::IDBServer::QuotaUser::initializeSpaceUsed): Deleted. (WebCore::IDBServer::IDBServer::ensureQuotaUser): Deleted. (WebCore::IDBServer::IDBServer::startComputingSpaceUsedForOrigin): Deleted. (WebCore::IDBServer::IDBServer::computeSpaceUsedForOrigin): Deleted. (WebCore::IDBServer::IDBServer::finishComputingSpaceUsedForOrigin): Deleted. (WebCore::IDBServer::IDBServer::resetSpaceUsed): Deleted. (WebCore::IDBServer::IDBServer::increaseSpaceUsed): Deleted. (WebCore::IDBServer::IDBServer::decreaseSpaceUsed): Deleted. (WebCore::IDBServer::IDBServer::increasePotentialSpaceUsed): Deleted. (WebCore::IDBServer::IDBServer::decreasePotentialSpaceUsed): Deleted. * Modules/indexeddb/server/IDBServer.h: (WebCore::IDBServer::IDBServer::initializeQuotaUser): Deleted. (): Deleted. * Modules/indexeddb/server/UniqueIDBDatabase.cpp: (WebCore::IDBServer::UniqueIDBDatabase::performCurrentOpenOperation): (WebCore::IDBServer::UniqueIDBDatabase::openBackingStore): (WebCore::IDBServer::UniqueIDBDatabase::didOpenBackingStore): (WebCore::IDBServer::UniqueIDBDatabase::createObjectStore): (WebCore::IDBServer::UniqueIDBDatabase::performCreateObjectStore): (WebCore::IDBServer::UniqueIDBDatabase::didPerformCreateObjectStore): (WebCore::IDBServer::UniqueIDBDatabase::deleteObjectStore): (WebCore::IDBServer::UniqueIDBDatabase::renameObjectStore): (WebCore::IDBServer::UniqueIDBDatabase::performRenameObjectStore): (WebCore::IDBServer::UniqueIDBDatabase::didPerformRenameObjectStore): (WebCore::IDBServer::UniqueIDBDatabase::clearObjectStore): (WebCore::IDBServer::UniqueIDBDatabase::createIndex): (WebCore::IDBServer::UniqueIDBDatabase::performCreateIndex): (WebCore::IDBServer::UniqueIDBDatabase::didPerformCreateIndex): (WebCore::IDBServer::UniqueIDBDatabase::deleteIndex): (WebCore::IDBServer::UniqueIDBDatabase::renameIndex): (WebCore::IDBServer::UniqueIDBDatabase::performRenameIndex): (WebCore::IDBServer::UniqueIDBDatabase::didPerformRenameIndex): (WebCore::IDBServer::UniqueIDBDatabase::putOrAdd): (WebCore::IDBServer::UniqueIDBDatabase::performPutOrAdd): (WebCore::IDBServer::UniqueIDBDatabase::didPerformPutOrAdd): (WebCore::IDBServer::UniqueIDBDatabase::getRecord): (WebCore::IDBServer::UniqueIDBDatabase::getAllRecords): (WebCore::IDBServer::UniqueIDBDatabase::performGetRecord): (WebCore::IDBServer::UniqueIDBDatabase::performGetAllRecords): (WebCore::IDBServer::UniqueIDBDatabase::getCount): (WebCore::IDBServer::UniqueIDBDatabase::deleteRecord): (WebCore::IDBServer::UniqueIDBDatabase::openCursor): (WebCore::IDBServer::UniqueIDBDatabase::iterateCursor): (WebCore::IDBServer::UniqueIDBDatabase::commitTransaction): (WebCore::IDBServer::UniqueIDBDatabase::abortTransaction): (WebCore::IDBServer::UniqueIDBDatabase::requestSpace): Deleted. (WebCore::IDBServer::UniqueIDBDatabase::waitForRequestSpaceCompletion): Deleted. (WebCore::IDBServer::UniqueIDBDatabase::startSpaceIncreaseTask): Deleted. (WebCore::IDBServer::UniqueIDBDatabase::finishSpaceIncreaseTask): Deleted. (WebCore::IDBServer::UniqueIDBDatabase::createObjectStoreAfterQuotaCheck): Deleted. (WebCore::IDBServer::UniqueIDBDatabase::deleteObjectStoreAfterQuotaCheck): Deleted. (WebCore::IDBServer::UniqueIDBDatabase::renameObjectStoreAfterQuotaCheck): Deleted. (WebCore::IDBServer::UniqueIDBDatabase::clearObjectStoreAfetQuotaCheck): Deleted. (WebCore::IDBServer::UniqueIDBDatabase::createIndexAfterQuotaCheck): Deleted. (WebCore::IDBServer::UniqueIDBDatabase::deleteIndexAfterQuotaCheck): Deleted. (WebCore::IDBServer::UniqueIDBDatabase::renameIndexAfterQuotaCheck): Deleted. (WebCore::IDBServer::UniqueIDBDatabase::putOrAddAfterQuotaCheck): Deleted. (WebCore::IDBServer::UniqueIDBDatabase::getRecordAfterQuotaCheck): Deleted. (WebCore::IDBServer::UniqueIDBDatabase::getAllRecordsAfterQuotaCheck): Deleted. (WebCore::IDBServer::UniqueIDBDatabase::getCountAfterQuotaCheck): Deleted. (WebCore::IDBServer::UniqueIDBDatabase::deleteRecordAfterQuotaCheck): Deleted. (WebCore::IDBServer::UniqueIDBDatabase::openCursorAfterQuotaCheck): Deleted. (WebCore::IDBServer::UniqueIDBDatabase::iterateCursorAfterQuotaCheck): Deleted. (WebCore::IDBServer::UniqueIDBDatabase::commitTransactionAfterQuotaCheck): Deleted. * Modules/indexeddb/server/UniqueIDBDatabase.h: * Modules/indexeddb/server/UniqueIDBDatabaseConnection.cpp: (WebCore::IDBServer::UniqueIDBDatabaseConnection::abortTransactionWithoutCallback): * Modules/indexeddb/server/UniqueIDBDatabaseTransaction.cpp: (WebCore::IDBServer::UniqueIDBDatabaseTransaction::abort): (WebCore::IDBServer::UniqueIDBDatabaseTransaction::putOrAdd): (WebCore::IDBServer::UniqueIDBDatabaseTransaction::getRecord): (WebCore::IDBServer::UniqueIDBDatabaseTransaction::getAllRecords): (WebCore::IDBServer::UniqueIDBDatabaseTransaction::getCount): (WebCore::IDBServer::UniqueIDBDatabaseTransaction::deleteRecord): (WebCore::IDBServer::UniqueIDBDatabaseTransaction::openCursor): (WebCore::IDBServer::UniqueIDBDatabaseTransaction::iterateCursor): * Modules/indexeddb/shared/InProcessIDBServer.cpp: (WebCore::InProcessIDBServer::quotaManager): (WebCore::storageQuotaManagerSpaceRequester): (WebCore::InProcessIDBServer::InProcessIDBServer): (WebCore::storageQuotaManagerGetter): Deleted. * Modules/indexeddb/shared/InProcessIDBServer.h: * WebCore.xcodeproj/project.pbxproj: * storage/StorageQuotaManager.cpp: (WebCore::StorageQuotaManager::create): (WebCore::StorageQuotaManager::StorageQuotaManager): (WebCore::StorageQuotaManager::requestSpaceOnMainThread): (WebCore::StorageQuotaManager::requestSpaceOnBackgroundThread): (WebCore::StorageQuotaManager::tryGrantRequest): (WebCore::StorageQuotaManager::updateQuotaBasedOnUsage): (WebCore::StorageQuotaManager::resetQuotaUpdatedBasedOnUsageForTesting): (WebCore::StorageQuotaManager::resetQuotaForTesting): (WebCore::StorageQuotaManager::~StorageQuotaManager): Deleted. (WebCore::StorageQuotaManager::spaceUsage const): Deleted. (WebCore::StorageQuotaManager::updateQuotaBasedOnSpaceUsage): Deleted. (WebCore::StorageQuotaManager::initializeUsersIfNeeded): Deleted. (WebCore::StorageQuotaManager::askUserToInitialize): Deleted. (WebCore::StorageQuotaManager::addUser): Deleted. (WebCore::StorageQuotaManager::shouldAskForMoreSpace const): Deleted. (WebCore::StorageQuotaManager::removeUser): Deleted. (WebCore::StorageQuotaManager::requestSpace): Deleted. (WebCore::StorageQuotaManager::askForMoreSpace): Deleted. (WebCore::StorageQuotaManager::processPendingRequests): Deleted. * storage/StorageQuotaManager.h: (WebCore::StorageQuotaManager::defaultThirdPartyQuotaFromPerOriginQuota): (WebCore::StorageQuotaManager::StorageQuotaManager): Deleted. (WebCore::StorageQuotaManager::resetQuota): Deleted. (WebCore::StorageQuotaManager::state const): Deleted. * storage/StorageQuotaUser.h: Removed. Source/WebKit: * NetworkProcess/NetworkProcess.cpp: Introduce class SessionStorageQuotaManager to manage all StorageQuotaManagers of the same session. (WebKit::NetworkProcess::initializeNetworkProcess): (WebKit::NetworkProcess::addWebsiteDataStore): (WebKit::NetworkProcess::addSessionStorageQuotaManager): (WebKit::NetworkProcess::removeSessionStorageQuotaManager): (WebKit::NetworkProcess::destroySession): (WebKit::NetworkProcess::deleteWebsiteData): (WebKit::NetworkProcess::deleteWebsiteDataForOrigins): (WebKit::NetworkProcess::createIDBServer): (WebKit::NetworkProcess::addIndexedDatabaseSession): (WebKit::NetworkProcess::setSessionStorageQuotaManagerIDBRootPath): (WebKit::NetworkProcess::updateQuotaBasedOnSpaceUsageForTesting): (WebKit::NetworkProcess::resetQuota): (WebKit::NetworkProcess::storageQuotaManager): (WebKit::NetworkProcess::initializeStorageQuota): Deleted. (WebKit::NetworkProcess::clearStorageQuota): Deleted. (): Deleted. (WebKit::NetworkProcess::initializeQuotaUsers): Deleted. * NetworkProcess/NetworkProcess.h: (WebKit::NetworkProcess::SessionStorageQuotaManager::SessionStorageQuotaManager): (WebKit::NetworkProcess::SessionStorageQuotaManager::defaultQuota const): (WebKit::NetworkProcess::SessionStorageQuotaManager::ensureOriginStorageQuotaManager): (WebKit::NetworkProcess::SessionStorageQuotaManager::existingStorageQuotaManagers): (WebKit::NetworkProcess::SessionStorageQuotaManager::cacheRootPath const): (WebKit::NetworkProcess::SessionStorageQuotaManager::setIDBRootPath): (WebKit::NetworkProcess::SessionStorageQuotaManager::idbRootPath const): (WebKit::NetworkProcess::StorageQuotaManagers::defaultQuota const): Deleted. (WebKit::NetworkProcess::StorageQuotaManagers::setDefaultQuotas): Deleted. (WebKit::NetworkProcess::StorageQuotaManagers::managersPerOrigin): Deleted. * NetworkProcess/NetworkProcess.messages.in: * NetworkProcess/cache/CacheStorageEngine.cpp: (WebKit::CacheStorage::getDirectorySize): (WebKit::CacheStorage::Engine::diskUsage): static function to get the disk usage of CacheStorage given CacheStorage root directory. (WebKit::CacheStorage::Engine::requestSpace): (WebKit::CacheStorage::Engine::readCachesFromDisk): (WebKit::CacheStorage::Engine::writeSizeFile): (WebKit::CacheStorage::Engine::readSizeFile): (WebKit::CacheStorage::Engine::initializeQuotaUser): Deleted. * NetworkProcess/cache/CacheStorageEngine.h: * NetworkProcess/cache/CacheStorageEngineCache.cpp: (WebKit::CacheStorage::Cache::put): (WebKit::CacheStorage::Cache::remove): * NetworkProcess/cache/CacheStorageEngineCaches.cpp: (WebKit::CacheStorage::Caches::create): (WebKit::CacheStorage::Caches::Caches): (WebKit::CacheStorage::Caches::~Caches): (WebKit::CacheStorage::Caches::updateSizeFile): (WebKit::CacheStorage::Caches::initializeSize): (WebKit::CacheStorage::Caches::clear): (WebKit::CacheStorage::Caches::requestSpace): (WebKit::CacheStorage::Caches::writeRecord): (WebKit::CacheStorage::Caches::removeRecord): (WebKit::CacheStorage::Caches::whenInitialized): Deleted. (WebKit::CacheStorage::Caches::resetSpaceUsed): Deleted. * NetworkProcess/cache/CacheStorageEngineCaches.h: * Shared/WebsiteDataStoreParameters.cpp: (WebKit::WebsiteDataStoreParameters::encode const): (WebKit::WebsiteDataStoreParameters::decode): * Shared/WebsiteDataStoreParameters.h: Add a cacheStorageDirectory parameter so we know the direcotry of CacheStorage when we start using WebsiteDataStore. * UIProcess/API/C/WKWebsiteDataStoreRef.cpp: (WKWebsiteDataStoreResetQuota): * UIProcess/API/C/WKWebsiteDataStoreRef.h: Add a C API for reseting quota in TestRunner. * UIProcess/Network/NetworkProcessProxy.cpp: (WebKit::NetworkProcessProxy::resetQuota): * UIProcess/Network/NetworkProcessProxy.h: * UIProcess/WebProcessPool.cpp: (WebKit::WebProcessPool::ensureNetworkProcess): * UIProcess/WebsiteData/Cocoa/WebsiteDataStoreCocoa.mm: (WebKit::WebsiteDataStore::parameters): * UIProcess/WebsiteData/WebsiteDataStore.cpp: (WebKit::WebsiteDataStore::parameters): (WebKit::WebsiteDataStore::resetQuota): * UIProcess/WebsiteData/WebsiteDataStore.h: Tools: * TestWebKitAPI/TestWebKitAPI.xcodeproj/project.pbxproj: * TestWebKitAPI/Tests/WebCore/StorageQuotaManager.cpp: Removed as we have a different StorageQuotaManager implementation now. * WebKitTestRunner/TestController.cpp: reset StorageQuotaManager's quota between tests. (WTR::TestController::resetStateToConsistentValues): (WTR::TestController::resetQuota): * WebKitTestRunner/TestController.h: Canonical link: https://commits.webkit.org/217990@main git-svn-id: https://svn.webkit.org/repository/webkit/trunk@253025 268f45cc-cd09-0410-ab3c-d52691b4dbfc
2019-12-03 06:53:42 +00:00
Ref<WorkQueue> m_workQueue;
Introduce a quota manager for Cache API/Service Worker/IDB storage https://bugs.webkit.org/show_bug.cgi?id=195283 Reviewed by Chris Dumez. Source/WebCore: Introduce a generic quota manager and quota users to be used in Network Process. Quota manager/users are scoped by client origin. Quota manager is used to check for quota by an entity wanting to execute a storage task of a given taskSize. Quota manager will check the current space used by all its quota users. If the size + taskSize is above quota, it will call a function to try extend the quota. In the meantime, the task (and all tasks that may be added) are queued. Once the new quota is received, the quota manager will either allow or disallow the first task in the queue. The quota manager will try to execute as many tasks as possible with the provided quota. If some tasks are remaining and quota limit is hit, the quota manager will compute the space needed for all remaining requests and do another quota extension request. * Sources.txt: * WebCore.xcodeproj/project.pbxproj: * page/ClientOrigin.h: * storage/StorageQuotaManager.cpp: Added. (WebCore::StorageQuotaManager::~StorageQuotaManager): (WebCore::StorageQuotaManager::spaceUsage const): (WebCore::StorageQuotaManager::requestSpace): (WebCore::StorageQuotaManager::askForMoreSpace): (WebCore::StorageQuotaManager::processPendingRequests): * storage/StorageQuotaManager.h: Added. (WebCore::StorageQuotaManager::StorageQuotaManager): (WebCore::StorageQuotaManager::addUser): (WebCore::StorageQuotaManager::removeUser): * storage/StorageQuotaUser.h: Added. Source/WebKit: Remove quota handling from Cache API storage and use StorageQuotaManager/StorageQuotaUser. CacheStorage::Caches becomes a quota user and has a StorageQuotaManager to check for space for any cache API write task. NetworkProcess is responsible to manage the quota managers. Quota managers will go through network process to ask UIProcess for quota extension. Remove pending callback handling from CacheStorage since they are queued in QuotaManager now. * NetworkProcess/NetworkProcess.cpp: (WebKit::NetworkProcess::~NetworkProcess): (WebKit::NetworkProcess::destroySession): (WebKit::NetworkProcess::cacheStorageRootPath): (WebKit::NetworkProcess::setCacheStorageParameters): (WebKit::NetworkProcess::storageQuotaManager): * NetworkProcess/NetworkProcess.h: * NetworkProcess/cache/CacheStorageEngine.cpp: (WebKit::CacheStorage::Engine::from): (WebKit::CacheStorage::Engine::Engine): (WebKit::CacheStorage::Engine::readCachesFromDisk): * NetworkProcess/cache/CacheStorageEngine.h: * NetworkProcess/cache/CacheStorageEngineCache.cpp: (WebKit::CacheStorage::Cache::put): * NetworkProcess/cache/CacheStorageEngineCache.h: * NetworkProcess/cache/CacheStorageEngineCaches.cpp: (WebKit::CacheStorage::Caches::Caches): (WebKit::CacheStorage::Caches::~Caches): (WebKit::CacheStorage::Caches::requestSpace): (WebKit::CacheStorage::Caches::writeRecord): * NetworkProcess/cache/CacheStorageEngineCaches.h: Canonical link: https://commits.webkit.org/209739@main git-svn-id: https://svn.webkit.org/repository/webkit/trunk@242599 268f45cc-cd09-0410-ab3c-d52691b4dbfc
2019-03-07 17:40:40 +00:00
Cross-thread version StorageQuotaManager https://bugs.webkit.org/show_bug.cgi?id=203971 <rdar://problem/57290349> Reviewed by Chris Dumez. Source/WebCore: Implement a lock-based StorageQuotaManager so that quota check can be done on different threads. If space request is made on a background thread, it needs to hold a lock until it is finished, so no request from different threads can be performed at the same time. If space request is made on the main thread, we will dispatch it to a background thread and schedule a calllback to the main thread when result is available, so the main thread will not be blocked. Covered by existing quota related tests. * Headers.cmake: * Modules/indexeddb/server/IDBServer.cpp: (WebCore::IDBServer::IDBServer::create): (WebCore::IDBServer::IDBServer::IDBServer): (WebCore::IDBServer::IDBServer::didPerformCloseAndDeleteDatabases): (WebCore::IDBServer::IDBServer::requestSpace): (WebCore::IDBServer::IDBServer::diskUsage): (WebCore::IDBServer::IDBServer::QuotaUser::QuotaUser): Deleted. (WebCore::IDBServer::IDBServer::QuotaUser::~QuotaUser): Deleted. (WebCore::IDBServer::IDBServer::QuotaUser::resetSpaceUsed): Deleted. (WebCore::IDBServer::IDBServer::QuotaUser::computeSpaceUsed): Deleted. (WebCore::IDBServer::IDBServer::QuotaUser::increaseSpaceUsed): Deleted. (WebCore::IDBServer::IDBServer::QuotaUser::decreaseSpaceUsed): Deleted. (WebCore::IDBServer::IDBServer::QuotaUser::whenInitialized): Deleted. (WebCore::IDBServer::IDBServer::QuotaUser::initializeSpaceUsed): Deleted. (WebCore::IDBServer::IDBServer::ensureQuotaUser): Deleted. (WebCore::IDBServer::IDBServer::startComputingSpaceUsedForOrigin): Deleted. (WebCore::IDBServer::IDBServer::computeSpaceUsedForOrigin): Deleted. (WebCore::IDBServer::IDBServer::finishComputingSpaceUsedForOrigin): Deleted. (WebCore::IDBServer::IDBServer::resetSpaceUsed): Deleted. (WebCore::IDBServer::IDBServer::increaseSpaceUsed): Deleted. (WebCore::IDBServer::IDBServer::decreaseSpaceUsed): Deleted. (WebCore::IDBServer::IDBServer::increasePotentialSpaceUsed): Deleted. (WebCore::IDBServer::IDBServer::decreasePotentialSpaceUsed): Deleted. * Modules/indexeddb/server/IDBServer.h: (WebCore::IDBServer::IDBServer::initializeQuotaUser): Deleted. (): Deleted. * Modules/indexeddb/server/UniqueIDBDatabase.cpp: (WebCore::IDBServer::UniqueIDBDatabase::performCurrentOpenOperation): (WebCore::IDBServer::UniqueIDBDatabase::openBackingStore): (WebCore::IDBServer::UniqueIDBDatabase::didOpenBackingStore): (WebCore::IDBServer::UniqueIDBDatabase::createObjectStore): (WebCore::IDBServer::UniqueIDBDatabase::performCreateObjectStore): (WebCore::IDBServer::UniqueIDBDatabase::didPerformCreateObjectStore): (WebCore::IDBServer::UniqueIDBDatabase::deleteObjectStore): (WebCore::IDBServer::UniqueIDBDatabase::renameObjectStore): (WebCore::IDBServer::UniqueIDBDatabase::performRenameObjectStore): (WebCore::IDBServer::UniqueIDBDatabase::didPerformRenameObjectStore): (WebCore::IDBServer::UniqueIDBDatabase::clearObjectStore): (WebCore::IDBServer::UniqueIDBDatabase::createIndex): (WebCore::IDBServer::UniqueIDBDatabase::performCreateIndex): (WebCore::IDBServer::UniqueIDBDatabase::didPerformCreateIndex): (WebCore::IDBServer::UniqueIDBDatabase::deleteIndex): (WebCore::IDBServer::UniqueIDBDatabase::renameIndex): (WebCore::IDBServer::UniqueIDBDatabase::performRenameIndex): (WebCore::IDBServer::UniqueIDBDatabase::didPerformRenameIndex): (WebCore::IDBServer::UniqueIDBDatabase::putOrAdd): (WebCore::IDBServer::UniqueIDBDatabase::performPutOrAdd): (WebCore::IDBServer::UniqueIDBDatabase::didPerformPutOrAdd): (WebCore::IDBServer::UniqueIDBDatabase::getRecord): (WebCore::IDBServer::UniqueIDBDatabase::getAllRecords): (WebCore::IDBServer::UniqueIDBDatabase::performGetRecord): (WebCore::IDBServer::UniqueIDBDatabase::performGetAllRecords): (WebCore::IDBServer::UniqueIDBDatabase::getCount): (WebCore::IDBServer::UniqueIDBDatabase::deleteRecord): (WebCore::IDBServer::UniqueIDBDatabase::openCursor): (WebCore::IDBServer::UniqueIDBDatabase::iterateCursor): (WebCore::IDBServer::UniqueIDBDatabase::commitTransaction): (WebCore::IDBServer::UniqueIDBDatabase::abortTransaction): (WebCore::IDBServer::UniqueIDBDatabase::requestSpace): Deleted. (WebCore::IDBServer::UniqueIDBDatabase::waitForRequestSpaceCompletion): Deleted. (WebCore::IDBServer::UniqueIDBDatabase::startSpaceIncreaseTask): Deleted. (WebCore::IDBServer::UniqueIDBDatabase::finishSpaceIncreaseTask): Deleted. (WebCore::IDBServer::UniqueIDBDatabase::createObjectStoreAfterQuotaCheck): Deleted. (WebCore::IDBServer::UniqueIDBDatabase::deleteObjectStoreAfterQuotaCheck): Deleted. (WebCore::IDBServer::UniqueIDBDatabase::renameObjectStoreAfterQuotaCheck): Deleted. (WebCore::IDBServer::UniqueIDBDatabase::clearObjectStoreAfetQuotaCheck): Deleted. (WebCore::IDBServer::UniqueIDBDatabase::createIndexAfterQuotaCheck): Deleted. (WebCore::IDBServer::UniqueIDBDatabase::deleteIndexAfterQuotaCheck): Deleted. (WebCore::IDBServer::UniqueIDBDatabase::renameIndexAfterQuotaCheck): Deleted. (WebCore::IDBServer::UniqueIDBDatabase::putOrAddAfterQuotaCheck): Deleted. (WebCore::IDBServer::UniqueIDBDatabase::getRecordAfterQuotaCheck): Deleted. (WebCore::IDBServer::UniqueIDBDatabase::getAllRecordsAfterQuotaCheck): Deleted. (WebCore::IDBServer::UniqueIDBDatabase::getCountAfterQuotaCheck): Deleted. (WebCore::IDBServer::UniqueIDBDatabase::deleteRecordAfterQuotaCheck): Deleted. (WebCore::IDBServer::UniqueIDBDatabase::openCursorAfterQuotaCheck): Deleted. (WebCore::IDBServer::UniqueIDBDatabase::iterateCursorAfterQuotaCheck): Deleted. (WebCore::IDBServer::UniqueIDBDatabase::commitTransactionAfterQuotaCheck): Deleted. * Modules/indexeddb/server/UniqueIDBDatabase.h: * Modules/indexeddb/server/UniqueIDBDatabaseConnection.cpp: (WebCore::IDBServer::UniqueIDBDatabaseConnection::abortTransactionWithoutCallback): * Modules/indexeddb/server/UniqueIDBDatabaseTransaction.cpp: (WebCore::IDBServer::UniqueIDBDatabaseTransaction::abort): (WebCore::IDBServer::UniqueIDBDatabaseTransaction::putOrAdd): (WebCore::IDBServer::UniqueIDBDatabaseTransaction::getRecord): (WebCore::IDBServer::UniqueIDBDatabaseTransaction::getAllRecords): (WebCore::IDBServer::UniqueIDBDatabaseTransaction::getCount): (WebCore::IDBServer::UniqueIDBDatabaseTransaction::deleteRecord): (WebCore::IDBServer::UniqueIDBDatabaseTransaction::openCursor): (WebCore::IDBServer::UniqueIDBDatabaseTransaction::iterateCursor): * Modules/indexeddb/shared/InProcessIDBServer.cpp: (WebCore::InProcessIDBServer::quotaManager): (WebCore::storageQuotaManagerSpaceRequester): (WebCore::InProcessIDBServer::InProcessIDBServer): (WebCore::storageQuotaManagerGetter): Deleted. * Modules/indexeddb/shared/InProcessIDBServer.h: * WebCore.xcodeproj/project.pbxproj: * storage/StorageQuotaManager.cpp: (WebCore::StorageQuotaManager::create): (WebCore::StorageQuotaManager::StorageQuotaManager): (WebCore::StorageQuotaManager::requestSpaceOnMainThread): (WebCore::StorageQuotaManager::requestSpaceOnBackgroundThread): (WebCore::StorageQuotaManager::tryGrantRequest): (WebCore::StorageQuotaManager::updateQuotaBasedOnUsage): (WebCore::StorageQuotaManager::resetQuotaUpdatedBasedOnUsageForTesting): (WebCore::StorageQuotaManager::resetQuotaForTesting): (WebCore::StorageQuotaManager::~StorageQuotaManager): Deleted. (WebCore::StorageQuotaManager::spaceUsage const): Deleted. (WebCore::StorageQuotaManager::updateQuotaBasedOnSpaceUsage): Deleted. (WebCore::StorageQuotaManager::initializeUsersIfNeeded): Deleted. (WebCore::StorageQuotaManager::askUserToInitialize): Deleted. (WebCore::StorageQuotaManager::addUser): Deleted. (WebCore::StorageQuotaManager::shouldAskForMoreSpace const): Deleted. (WebCore::StorageQuotaManager::removeUser): Deleted. (WebCore::StorageQuotaManager::requestSpace): Deleted. (WebCore::StorageQuotaManager::askForMoreSpace): Deleted. (WebCore::StorageQuotaManager::processPendingRequests): Deleted. * storage/StorageQuotaManager.h: (WebCore::StorageQuotaManager::defaultThirdPartyQuotaFromPerOriginQuota): (WebCore::StorageQuotaManager::StorageQuotaManager): Deleted. (WebCore::StorageQuotaManager::resetQuota): Deleted. (WebCore::StorageQuotaManager::state const): Deleted. * storage/StorageQuotaUser.h: Removed. Source/WebKit: * NetworkProcess/NetworkProcess.cpp: Introduce class SessionStorageQuotaManager to manage all StorageQuotaManagers of the same session. (WebKit::NetworkProcess::initializeNetworkProcess): (WebKit::NetworkProcess::addWebsiteDataStore): (WebKit::NetworkProcess::addSessionStorageQuotaManager): (WebKit::NetworkProcess::removeSessionStorageQuotaManager): (WebKit::NetworkProcess::destroySession): (WebKit::NetworkProcess::deleteWebsiteData): (WebKit::NetworkProcess::deleteWebsiteDataForOrigins): (WebKit::NetworkProcess::createIDBServer): (WebKit::NetworkProcess::addIndexedDatabaseSession): (WebKit::NetworkProcess::setSessionStorageQuotaManagerIDBRootPath): (WebKit::NetworkProcess::updateQuotaBasedOnSpaceUsageForTesting): (WebKit::NetworkProcess::resetQuota): (WebKit::NetworkProcess::storageQuotaManager): (WebKit::NetworkProcess::initializeStorageQuota): Deleted. (WebKit::NetworkProcess::clearStorageQuota): Deleted. (): Deleted. (WebKit::NetworkProcess::initializeQuotaUsers): Deleted. * NetworkProcess/NetworkProcess.h: (WebKit::NetworkProcess::SessionStorageQuotaManager::SessionStorageQuotaManager): (WebKit::NetworkProcess::SessionStorageQuotaManager::defaultQuota const): (WebKit::NetworkProcess::SessionStorageQuotaManager::ensureOriginStorageQuotaManager): (WebKit::NetworkProcess::SessionStorageQuotaManager::existingStorageQuotaManagers): (WebKit::NetworkProcess::SessionStorageQuotaManager::cacheRootPath const): (WebKit::NetworkProcess::SessionStorageQuotaManager::setIDBRootPath): (WebKit::NetworkProcess::SessionStorageQuotaManager::idbRootPath const): (WebKit::NetworkProcess::StorageQuotaManagers::defaultQuota const): Deleted. (WebKit::NetworkProcess::StorageQuotaManagers::setDefaultQuotas): Deleted. (WebKit::NetworkProcess::StorageQuotaManagers::managersPerOrigin): Deleted. * NetworkProcess/NetworkProcess.messages.in: * NetworkProcess/cache/CacheStorageEngine.cpp: (WebKit::CacheStorage::getDirectorySize): (WebKit::CacheStorage::Engine::diskUsage): static function to get the disk usage of CacheStorage given CacheStorage root directory. (WebKit::CacheStorage::Engine::requestSpace): (WebKit::CacheStorage::Engine::readCachesFromDisk): (WebKit::CacheStorage::Engine::writeSizeFile): (WebKit::CacheStorage::Engine::readSizeFile): (WebKit::CacheStorage::Engine::initializeQuotaUser): Deleted. * NetworkProcess/cache/CacheStorageEngine.h: * NetworkProcess/cache/CacheStorageEngineCache.cpp: (WebKit::CacheStorage::Cache::put): (WebKit::CacheStorage::Cache::remove): * NetworkProcess/cache/CacheStorageEngineCaches.cpp: (WebKit::CacheStorage::Caches::create): (WebKit::CacheStorage::Caches::Caches): (WebKit::CacheStorage::Caches::~Caches): (WebKit::CacheStorage::Caches::updateSizeFile): (WebKit::CacheStorage::Caches::initializeSize): (WebKit::CacheStorage::Caches::clear): (WebKit::CacheStorage::Caches::requestSpace): (WebKit::CacheStorage::Caches::writeRecord): (WebKit::CacheStorage::Caches::removeRecord): (WebKit::CacheStorage::Caches::whenInitialized): Deleted. (WebKit::CacheStorage::Caches::resetSpaceUsed): Deleted. * NetworkProcess/cache/CacheStorageEngineCaches.h: * Shared/WebsiteDataStoreParameters.cpp: (WebKit::WebsiteDataStoreParameters::encode const): (WebKit::WebsiteDataStoreParameters::decode): * Shared/WebsiteDataStoreParameters.h: Add a cacheStorageDirectory parameter so we know the direcotry of CacheStorage when we start using WebsiteDataStore. * UIProcess/API/C/WKWebsiteDataStoreRef.cpp: (WKWebsiteDataStoreResetQuota): * UIProcess/API/C/WKWebsiteDataStoreRef.h: Add a C API for reseting quota in TestRunner. * UIProcess/Network/NetworkProcessProxy.cpp: (WebKit::NetworkProcessProxy::resetQuota): * UIProcess/Network/NetworkProcessProxy.h: * UIProcess/WebProcessPool.cpp: (WebKit::WebProcessPool::ensureNetworkProcess): * UIProcess/WebsiteData/Cocoa/WebsiteDataStoreCocoa.mm: (WebKit::WebsiteDataStore::parameters): * UIProcess/WebsiteData/WebsiteDataStore.cpp: (WebKit::WebsiteDataStore::parameters): (WebKit::WebsiteDataStore::resetQuota): * UIProcess/WebsiteData/WebsiteDataStore.h: Tools: * TestWebKitAPI/TestWebKitAPI.xcodeproj/project.pbxproj: * TestWebKitAPI/Tests/WebCore/StorageQuotaManager.cpp: Removed as we have a different StorageQuotaManager implementation now. * WebKitTestRunner/TestController.cpp: reset StorageQuotaManager's quota between tests. (WTR::TestController::resetStateToConsistentValues): (WTR::TestController::resetQuota): * WebKitTestRunner/TestController.h: Canonical link: https://commits.webkit.org/217990@main git-svn-id: https://svn.webkit.org/repository/webkit/trunk@253025 268f45cc-cd09-0410-ab3c-d52691b4dbfc
2019-12-03 06:53:42 +00:00
bool m_quotaUpdatedBasedOnUsage { false };
IndexedDB: update size to actual disk usage only when estimated increase is bigger than space available https://bugs.webkit.org/show_bug.cgi?id=201957 Reviewed by Youenn Fablet. For better performance. Covered by existing tests. * Modules/indexeddb/server/IDBServer.cpp: (WebCore::IDBServer::IDBServer::QuotaUser::resetSpaceUsed): m_estimatedSpaceIncrease will be updated when task is finished, so no need to clear it when doing reset. (WebCore::IDBServer::IDBServer::QuotaUser::computeSpaceUsed): * Modules/indexeddb/server/IDBServer.h: * Modules/indexeddb/server/UniqueIDBDatabase.cpp: instead of reading file size after each task, just add the task size to known usage and get an estimated usage. (WebCore::IDBServer::UniqueIDBDatabase::startSpaceIncreaseTask): (WebCore::IDBServer::UniqueIDBDatabase::finishSpaceIncreaseTask): (WebCore::IDBServer::UniqueIDBDatabase::performCurrentOpenOperation): (WebCore::IDBServer::UniqueIDBDatabase::deleteBackingStore): (WebCore::IDBServer::UniqueIDBDatabase::shutdownForClose): (WebCore::IDBServer::UniqueIDBDatabase::didShutdownForClose): (WebCore::IDBServer::UniqueIDBDatabase::didDeleteBackingStore): (WebCore::IDBServer::UniqueIDBDatabase::generateUniqueCallbackIdentifier): (WebCore::IDBServer::UniqueIDBDatabase::storeCallbackOrFireError): (WebCore::IDBServer::UniqueIDBDatabase::openBackingStore): (WebCore::IDBServer::UniqueIDBDatabase::didOpenBackingStore): (WebCore::IDBServer::UniqueIDBDatabase::createObjectStoreAfterQuotaCheck): (WebCore::IDBServer::UniqueIDBDatabase::didPerformCreateObjectStore): (WebCore::IDBServer::UniqueIDBDatabase::renameObjectStoreAfterQuotaCheck): (WebCore::IDBServer::UniqueIDBDatabase::didPerformRenameObjectStore): (WebCore::IDBServer::UniqueIDBDatabase::createIndexAfterQuotaCheck): (WebCore::IDBServer::UniqueIDBDatabase::didPerformCreateIndex): (WebCore::IDBServer::UniqueIDBDatabase::renameIndexAfterQuotaCheck): (WebCore::IDBServer::UniqueIDBDatabase::didPerformRenameIndex): (WebCore::IDBServer::UniqueIDBDatabase::putOrAddAfterQuotaCheck): (WebCore::IDBServer::UniqueIDBDatabase::didPerformPutOrAdd): (WebCore::IDBServer::UniqueIDBDatabase::postDatabaseTaskReply): (WebCore::IDBServer::UniqueIDBDatabase::immediateCloseForUserDelete): (WebCore::IDBServer::UniqueIDBDatabase::performErrorCallback): (WebCore::IDBServer::UniqueIDBDatabase::performKeyDataCallback): (WebCore::IDBServer::UniqueIDBDatabase::forgetErrorCallback): (WebCore::IDBServer::generateUniqueCallbackIdentifier): Deleted. (WebCore::IDBServer::UniqueIDBDatabase::updateSpaceUsedIfNeeded): Deleted. * Modules/indexeddb/server/UniqueIDBDatabase.h: * storage/StorageQuotaManager.cpp: use m_state to decide what action to take on next request. Previously when a request asked for size bigger than space available, we would go to ask for more space directly. Now because IDB can be reporting estimated usage, we first ask IDB to compute its actual disk usage and ask for more space if actual space available is smaller than requested size. (WebCore::StorageQuotaManager::askUserToInitialize): (WebCore::StorageQuotaManager::removeUser): (WebCore::StorageQuotaManager::requestSpace): (WebCore::StorageQuotaManager::askForMoreSpace): (WebCore::StorageQuotaManager::processPendingRequests): * storage/StorageQuotaManager.h: * storage/StorageQuotaUser.h: (WebCore::StorageQuotaUser::computeSpaceUsed): Canonical link: https://commits.webkit.org/216229@main git-svn-id: https://svn.webkit.org/repository/webkit/trunk@250937 268f45cc-cd09-0410-ab3c-d52691b4dbfc
2019-10-09 22:38:56 +00:00
Cross-thread version StorageQuotaManager https://bugs.webkit.org/show_bug.cgi?id=203971 <rdar://problem/57290349> Reviewed by Chris Dumez. Source/WebCore: Implement a lock-based StorageQuotaManager so that quota check can be done on different threads. If space request is made on a background thread, it needs to hold a lock until it is finished, so no request from different threads can be performed at the same time. If space request is made on the main thread, we will dispatch it to a background thread and schedule a calllback to the main thread when result is available, so the main thread will not be blocked. Covered by existing quota related tests. * Headers.cmake: * Modules/indexeddb/server/IDBServer.cpp: (WebCore::IDBServer::IDBServer::create): (WebCore::IDBServer::IDBServer::IDBServer): (WebCore::IDBServer::IDBServer::didPerformCloseAndDeleteDatabases): (WebCore::IDBServer::IDBServer::requestSpace): (WebCore::IDBServer::IDBServer::diskUsage): (WebCore::IDBServer::IDBServer::QuotaUser::QuotaUser): Deleted. (WebCore::IDBServer::IDBServer::QuotaUser::~QuotaUser): Deleted. (WebCore::IDBServer::IDBServer::QuotaUser::resetSpaceUsed): Deleted. (WebCore::IDBServer::IDBServer::QuotaUser::computeSpaceUsed): Deleted. (WebCore::IDBServer::IDBServer::QuotaUser::increaseSpaceUsed): Deleted. (WebCore::IDBServer::IDBServer::QuotaUser::decreaseSpaceUsed): Deleted. (WebCore::IDBServer::IDBServer::QuotaUser::whenInitialized): Deleted. (WebCore::IDBServer::IDBServer::QuotaUser::initializeSpaceUsed): Deleted. (WebCore::IDBServer::IDBServer::ensureQuotaUser): Deleted. (WebCore::IDBServer::IDBServer::startComputingSpaceUsedForOrigin): Deleted. (WebCore::IDBServer::IDBServer::computeSpaceUsedForOrigin): Deleted. (WebCore::IDBServer::IDBServer::finishComputingSpaceUsedForOrigin): Deleted. (WebCore::IDBServer::IDBServer::resetSpaceUsed): Deleted. (WebCore::IDBServer::IDBServer::increaseSpaceUsed): Deleted. (WebCore::IDBServer::IDBServer::decreaseSpaceUsed): Deleted. (WebCore::IDBServer::IDBServer::increasePotentialSpaceUsed): Deleted. (WebCore::IDBServer::IDBServer::decreasePotentialSpaceUsed): Deleted. * Modules/indexeddb/server/IDBServer.h: (WebCore::IDBServer::IDBServer::initializeQuotaUser): Deleted. (): Deleted. * Modules/indexeddb/server/UniqueIDBDatabase.cpp: (WebCore::IDBServer::UniqueIDBDatabase::performCurrentOpenOperation): (WebCore::IDBServer::UniqueIDBDatabase::openBackingStore): (WebCore::IDBServer::UniqueIDBDatabase::didOpenBackingStore): (WebCore::IDBServer::UniqueIDBDatabase::createObjectStore): (WebCore::IDBServer::UniqueIDBDatabase::performCreateObjectStore): (WebCore::IDBServer::UniqueIDBDatabase::didPerformCreateObjectStore): (WebCore::IDBServer::UniqueIDBDatabase::deleteObjectStore): (WebCore::IDBServer::UniqueIDBDatabase::renameObjectStore): (WebCore::IDBServer::UniqueIDBDatabase::performRenameObjectStore): (WebCore::IDBServer::UniqueIDBDatabase::didPerformRenameObjectStore): (WebCore::IDBServer::UniqueIDBDatabase::clearObjectStore): (WebCore::IDBServer::UniqueIDBDatabase::createIndex): (WebCore::IDBServer::UniqueIDBDatabase::performCreateIndex): (WebCore::IDBServer::UniqueIDBDatabase::didPerformCreateIndex): (WebCore::IDBServer::UniqueIDBDatabase::deleteIndex): (WebCore::IDBServer::UniqueIDBDatabase::renameIndex): (WebCore::IDBServer::UniqueIDBDatabase::performRenameIndex): (WebCore::IDBServer::UniqueIDBDatabase::didPerformRenameIndex): (WebCore::IDBServer::UniqueIDBDatabase::putOrAdd): (WebCore::IDBServer::UniqueIDBDatabase::performPutOrAdd): (WebCore::IDBServer::UniqueIDBDatabase::didPerformPutOrAdd): (WebCore::IDBServer::UniqueIDBDatabase::getRecord): (WebCore::IDBServer::UniqueIDBDatabase::getAllRecords): (WebCore::IDBServer::UniqueIDBDatabase::performGetRecord): (WebCore::IDBServer::UniqueIDBDatabase::performGetAllRecords): (WebCore::IDBServer::UniqueIDBDatabase::getCount): (WebCore::IDBServer::UniqueIDBDatabase::deleteRecord): (WebCore::IDBServer::UniqueIDBDatabase::openCursor): (WebCore::IDBServer::UniqueIDBDatabase::iterateCursor): (WebCore::IDBServer::UniqueIDBDatabase::commitTransaction): (WebCore::IDBServer::UniqueIDBDatabase::abortTransaction): (WebCore::IDBServer::UniqueIDBDatabase::requestSpace): Deleted. (WebCore::IDBServer::UniqueIDBDatabase::waitForRequestSpaceCompletion): Deleted. (WebCore::IDBServer::UniqueIDBDatabase::startSpaceIncreaseTask): Deleted. (WebCore::IDBServer::UniqueIDBDatabase::finishSpaceIncreaseTask): Deleted. (WebCore::IDBServer::UniqueIDBDatabase::createObjectStoreAfterQuotaCheck): Deleted. (WebCore::IDBServer::UniqueIDBDatabase::deleteObjectStoreAfterQuotaCheck): Deleted. (WebCore::IDBServer::UniqueIDBDatabase::renameObjectStoreAfterQuotaCheck): Deleted. (WebCore::IDBServer::UniqueIDBDatabase::clearObjectStoreAfetQuotaCheck): Deleted. (WebCore::IDBServer::UniqueIDBDatabase::createIndexAfterQuotaCheck): Deleted. (WebCore::IDBServer::UniqueIDBDatabase::deleteIndexAfterQuotaCheck): Deleted. (WebCore::IDBServer::UniqueIDBDatabase::renameIndexAfterQuotaCheck): Deleted. (WebCore::IDBServer::UniqueIDBDatabase::putOrAddAfterQuotaCheck): Deleted. (WebCore::IDBServer::UniqueIDBDatabase::getRecordAfterQuotaCheck): Deleted. (WebCore::IDBServer::UniqueIDBDatabase::getAllRecordsAfterQuotaCheck): Deleted. (WebCore::IDBServer::UniqueIDBDatabase::getCountAfterQuotaCheck): Deleted. (WebCore::IDBServer::UniqueIDBDatabase::deleteRecordAfterQuotaCheck): Deleted. (WebCore::IDBServer::UniqueIDBDatabase::openCursorAfterQuotaCheck): Deleted. (WebCore::IDBServer::UniqueIDBDatabase::iterateCursorAfterQuotaCheck): Deleted. (WebCore::IDBServer::UniqueIDBDatabase::commitTransactionAfterQuotaCheck): Deleted. * Modules/indexeddb/server/UniqueIDBDatabase.h: * Modules/indexeddb/server/UniqueIDBDatabaseConnection.cpp: (WebCore::IDBServer::UniqueIDBDatabaseConnection::abortTransactionWithoutCallback): * Modules/indexeddb/server/UniqueIDBDatabaseTransaction.cpp: (WebCore::IDBServer::UniqueIDBDatabaseTransaction::abort): (WebCore::IDBServer::UniqueIDBDatabaseTransaction::putOrAdd): (WebCore::IDBServer::UniqueIDBDatabaseTransaction::getRecord): (WebCore::IDBServer::UniqueIDBDatabaseTransaction::getAllRecords): (WebCore::IDBServer::UniqueIDBDatabaseTransaction::getCount): (WebCore::IDBServer::UniqueIDBDatabaseTransaction::deleteRecord): (WebCore::IDBServer::UniqueIDBDatabaseTransaction::openCursor): (WebCore::IDBServer::UniqueIDBDatabaseTransaction::iterateCursor): * Modules/indexeddb/shared/InProcessIDBServer.cpp: (WebCore::InProcessIDBServer::quotaManager): (WebCore::storageQuotaManagerSpaceRequester): (WebCore::InProcessIDBServer::InProcessIDBServer): (WebCore::storageQuotaManagerGetter): Deleted. * Modules/indexeddb/shared/InProcessIDBServer.h: * WebCore.xcodeproj/project.pbxproj: * storage/StorageQuotaManager.cpp: (WebCore::StorageQuotaManager::create): (WebCore::StorageQuotaManager::StorageQuotaManager): (WebCore::StorageQuotaManager::requestSpaceOnMainThread): (WebCore::StorageQuotaManager::requestSpaceOnBackgroundThread): (WebCore::StorageQuotaManager::tryGrantRequest): (WebCore::StorageQuotaManager::updateQuotaBasedOnUsage): (WebCore::StorageQuotaManager::resetQuotaUpdatedBasedOnUsageForTesting): (WebCore::StorageQuotaManager::resetQuotaForTesting): (WebCore::StorageQuotaManager::~StorageQuotaManager): Deleted. (WebCore::StorageQuotaManager::spaceUsage const): Deleted. (WebCore::StorageQuotaManager::updateQuotaBasedOnSpaceUsage): Deleted. (WebCore::StorageQuotaManager::initializeUsersIfNeeded): Deleted. (WebCore::StorageQuotaManager::askUserToInitialize): Deleted. (WebCore::StorageQuotaManager::addUser): Deleted. (WebCore::StorageQuotaManager::shouldAskForMoreSpace const): Deleted. (WebCore::StorageQuotaManager::removeUser): Deleted. (WebCore::StorageQuotaManager::requestSpace): Deleted. (WebCore::StorageQuotaManager::askForMoreSpace): Deleted. (WebCore::StorageQuotaManager::processPendingRequests): Deleted. * storage/StorageQuotaManager.h: (WebCore::StorageQuotaManager::defaultThirdPartyQuotaFromPerOriginQuota): (WebCore::StorageQuotaManager::StorageQuotaManager): Deleted. (WebCore::StorageQuotaManager::resetQuota): Deleted. (WebCore::StorageQuotaManager::state const): Deleted. * storage/StorageQuotaUser.h: Removed. Source/WebKit: * NetworkProcess/NetworkProcess.cpp: Introduce class SessionStorageQuotaManager to manage all StorageQuotaManagers of the same session. (WebKit::NetworkProcess::initializeNetworkProcess): (WebKit::NetworkProcess::addWebsiteDataStore): (WebKit::NetworkProcess::addSessionStorageQuotaManager): (WebKit::NetworkProcess::removeSessionStorageQuotaManager): (WebKit::NetworkProcess::destroySession): (WebKit::NetworkProcess::deleteWebsiteData): (WebKit::NetworkProcess::deleteWebsiteDataForOrigins): (WebKit::NetworkProcess::createIDBServer): (WebKit::NetworkProcess::addIndexedDatabaseSession): (WebKit::NetworkProcess::setSessionStorageQuotaManagerIDBRootPath): (WebKit::NetworkProcess::updateQuotaBasedOnSpaceUsageForTesting): (WebKit::NetworkProcess::resetQuota): (WebKit::NetworkProcess::storageQuotaManager): (WebKit::NetworkProcess::initializeStorageQuota): Deleted. (WebKit::NetworkProcess::clearStorageQuota): Deleted. (): Deleted. (WebKit::NetworkProcess::initializeQuotaUsers): Deleted. * NetworkProcess/NetworkProcess.h: (WebKit::NetworkProcess::SessionStorageQuotaManager::SessionStorageQuotaManager): (WebKit::NetworkProcess::SessionStorageQuotaManager::defaultQuota const): (WebKit::NetworkProcess::SessionStorageQuotaManager::ensureOriginStorageQuotaManager): (WebKit::NetworkProcess::SessionStorageQuotaManager::existingStorageQuotaManagers): (WebKit::NetworkProcess::SessionStorageQuotaManager::cacheRootPath const): (WebKit::NetworkProcess::SessionStorageQuotaManager::setIDBRootPath): (WebKit::NetworkProcess::SessionStorageQuotaManager::idbRootPath const): (WebKit::NetworkProcess::StorageQuotaManagers::defaultQuota const): Deleted. (WebKit::NetworkProcess::StorageQuotaManagers::setDefaultQuotas): Deleted. (WebKit::NetworkProcess::StorageQuotaManagers::managersPerOrigin): Deleted. * NetworkProcess/NetworkProcess.messages.in: * NetworkProcess/cache/CacheStorageEngine.cpp: (WebKit::CacheStorage::getDirectorySize): (WebKit::CacheStorage::Engine::diskUsage): static function to get the disk usage of CacheStorage given CacheStorage root directory. (WebKit::CacheStorage::Engine::requestSpace): (WebKit::CacheStorage::Engine::readCachesFromDisk): (WebKit::CacheStorage::Engine::writeSizeFile): (WebKit::CacheStorage::Engine::readSizeFile): (WebKit::CacheStorage::Engine::initializeQuotaUser): Deleted. * NetworkProcess/cache/CacheStorageEngine.h: * NetworkProcess/cache/CacheStorageEngineCache.cpp: (WebKit::CacheStorage::Cache::put): (WebKit::CacheStorage::Cache::remove): * NetworkProcess/cache/CacheStorageEngineCaches.cpp: (WebKit::CacheStorage::Caches::create): (WebKit::CacheStorage::Caches::Caches): (WebKit::CacheStorage::Caches::~Caches): (WebKit::CacheStorage::Caches::updateSizeFile): (WebKit::CacheStorage::Caches::initializeSize): (WebKit::CacheStorage::Caches::clear): (WebKit::CacheStorage::Caches::requestSpace): (WebKit::CacheStorage::Caches::writeRecord): (WebKit::CacheStorage::Caches::removeRecord): (WebKit::CacheStorage::Caches::whenInitialized): Deleted. (WebKit::CacheStorage::Caches::resetSpaceUsed): Deleted. * NetworkProcess/cache/CacheStorageEngineCaches.h: * Shared/WebsiteDataStoreParameters.cpp: (WebKit::WebsiteDataStoreParameters::encode const): (WebKit::WebsiteDataStoreParameters::decode): * Shared/WebsiteDataStoreParameters.h: Add a cacheStorageDirectory parameter so we know the direcotry of CacheStorage when we start using WebsiteDataStore. * UIProcess/API/C/WKWebsiteDataStoreRef.cpp: (WKWebsiteDataStoreResetQuota): * UIProcess/API/C/WKWebsiteDataStoreRef.h: Add a C API for reseting quota in TestRunner. * UIProcess/Network/NetworkProcessProxy.cpp: (WebKit::NetworkProcessProxy::resetQuota): * UIProcess/Network/NetworkProcessProxy.h: * UIProcess/WebProcessPool.cpp: (WebKit::WebProcessPool::ensureNetworkProcess): * UIProcess/WebsiteData/Cocoa/WebsiteDataStoreCocoa.mm: (WebKit::WebsiteDataStore::parameters): * UIProcess/WebsiteData/WebsiteDataStore.cpp: (WebKit::WebsiteDataStore::parameters): (WebKit::WebsiteDataStore::resetQuota): * UIProcess/WebsiteData/WebsiteDataStore.h: Tools: * TestWebKitAPI/TestWebKitAPI.xcodeproj/project.pbxproj: * TestWebKitAPI/Tests/WebCore/StorageQuotaManager.cpp: Removed as we have a different StorageQuotaManager implementation now. * WebKitTestRunner/TestController.cpp: reset StorageQuotaManager's quota between tests. (WTR::TestController::resetStateToConsistentValues): (WTR::TestController::resetQuota): * WebKitTestRunner/TestController.h: Canonical link: https://commits.webkit.org/217990@main git-svn-id: https://svn.webkit.org/repository/webkit/trunk@253025 268f45cc-cd09-0410-ab3c-d52691b4dbfc
2019-12-03 06:53:42 +00:00
// Test only.
uint64_t m_initialQuota { 0 };
Introduce a quota manager for Cache API/Service Worker/IDB storage https://bugs.webkit.org/show_bug.cgi?id=195283 Reviewed by Chris Dumez. Source/WebCore: Introduce a generic quota manager and quota users to be used in Network Process. Quota manager/users are scoped by client origin. Quota manager is used to check for quota by an entity wanting to execute a storage task of a given taskSize. Quota manager will check the current space used by all its quota users. If the size + taskSize is above quota, it will call a function to try extend the quota. In the meantime, the task (and all tasks that may be added) are queued. Once the new quota is received, the quota manager will either allow or disallow the first task in the queue. The quota manager will try to execute as many tasks as possible with the provided quota. If some tasks are remaining and quota limit is hit, the quota manager will compute the space needed for all remaining requests and do another quota extension request. * Sources.txt: * WebCore.xcodeproj/project.pbxproj: * page/ClientOrigin.h: * storage/StorageQuotaManager.cpp: Added. (WebCore::StorageQuotaManager::~StorageQuotaManager): (WebCore::StorageQuotaManager::spaceUsage const): (WebCore::StorageQuotaManager::requestSpace): (WebCore::StorageQuotaManager::askForMoreSpace): (WebCore::StorageQuotaManager::processPendingRequests): * storage/StorageQuotaManager.h: Added. (WebCore::StorageQuotaManager::StorageQuotaManager): (WebCore::StorageQuotaManager::addUser): (WebCore::StorageQuotaManager::removeUser): * storage/StorageQuotaUser.h: Added. Source/WebKit: Remove quota handling from Cache API storage and use StorageQuotaManager/StorageQuotaUser. CacheStorage::Caches becomes a quota user and has a StorageQuotaManager to check for space for any cache API write task. NetworkProcess is responsible to manage the quota managers. Quota managers will go through network process to ask UIProcess for quota extension. Remove pending callback handling from CacheStorage since they are queued in QuotaManager now. * NetworkProcess/NetworkProcess.cpp: (WebKit::NetworkProcess::~NetworkProcess): (WebKit::NetworkProcess::destroySession): (WebKit::NetworkProcess::cacheStorageRootPath): (WebKit::NetworkProcess::setCacheStorageParameters): (WebKit::NetworkProcess::storageQuotaManager): * NetworkProcess/NetworkProcess.h: * NetworkProcess/cache/CacheStorageEngine.cpp: (WebKit::CacheStorage::Engine::from): (WebKit::CacheStorage::Engine::Engine): (WebKit::CacheStorage::Engine::readCachesFromDisk): * NetworkProcess/cache/CacheStorageEngine.h: * NetworkProcess/cache/CacheStorageEngineCache.cpp: (WebKit::CacheStorage::Cache::put): * NetworkProcess/cache/CacheStorageEngineCache.h: * NetworkProcess/cache/CacheStorageEngineCaches.cpp: (WebKit::CacheStorage::Caches::Caches): (WebKit::CacheStorage::Caches::~Caches): (WebKit::CacheStorage::Caches::requestSpace): (WebKit::CacheStorage::Caches::writeRecord): * NetworkProcess/cache/CacheStorageEngineCaches.h: Canonical link: https://commits.webkit.org/209739@main git-svn-id: https://svn.webkit.org/repository/webkit/trunk@242599 268f45cc-cd09-0410-ab3c-d52691b4dbfc
2019-03-07 17:40:40 +00:00
};
} // namespace WebCore