WebResourceLoadStatisticsStore.h [plain text]
#pragma once
#include "Connection.h"
#include "WebsiteDataType.h"
#include <wtf/CompletionHandler.h>
#include <wtf/RunLoop.h>
#include <wtf/ThreadSafeRefCounted.h>
#include <wtf/Vector.h>
#include <wtf/WallTime.h>
#include <wtf/WeakPtr.h>
#include <wtf/text/WTFString.h>
namespace WTF {
class WorkQueue;
}
namespace WebCore {
class ResourceRequest;
class URL;
struct ResourceLoadStatistics;
}
namespace WebKit {
class ResourceLoadStatisticsMemoryStore;
class ResourceLoadStatisticsPersistentStorage;
class WebFrameProxy;
class WebProcessProxy;
class WebsiteDataStore;
enum class ShouldClearFirst;
enum class StorageAccessStatus {
CannotRequestAccess,
RequiresUserPrompt,
HasAccess
};
class WebResourceLoadStatisticsStore final : public ThreadSafeRefCounted<WebResourceLoadStatisticsStore, WTF::DestructionThread::Main>, public IPC::MessageReceiver {
public:
static Ref<WebResourceLoadStatisticsStore> create(WebsiteDataStore& websiteDataStore)
{
return adoptRef(*new WebResourceLoadStatisticsStore(websiteDataStore));
}
~WebResourceLoadStatisticsStore();
static const OptionSet<WebsiteDataType>& monitoredDataTypes();
WorkQueue& statisticsQueue() { return m_statisticsQueue.get(); }
void setNotifyPagesWhenDataRecordsWereScanned(bool);
void setShouldClassifyResourcesBeforeDataRecordsRemoval(bool);
void setShouldSubmitTelemetry(bool);
void hasStorageAccess(String&& subFrameHost, String&& topFrameHost, uint64_t frameID, uint64_t pageID, CompletionHandler<void(bool)>&& callback);
void requestStorageAccess(String&& subFrameHost, String&& topFrameHost, uint64_t frameID, uint64_t pageID, bool promptEnabled, CompletionHandler<void(StorageAccessStatus)>&&);
void grantStorageAccess(String&& subFrameHost, String&& topFrameHost, uint64_t frameID, uint64_t pageID, bool userWasPromptedNow, CompletionHandler<void(bool)>&&);
void requestStorageAccessCallback(bool wasGranted, uint64_t contextId);
void applicationWillTerminate();
void logFrameNavigation(const WebFrameProxy&, const WebCore::URL& pageURL, const WebCore::ResourceRequest&, const WebCore::URL& redirectURL);
void logUserInteraction(const WebCore::URL&, CompletionHandler<void()>&&);
void logNonRecentUserInteraction(const WebCore::URL&, CompletionHandler<void()>&&);
void clearUserInteraction(const WebCore::URL&, CompletionHandler<void()>&&);
void hasHadUserInteraction(const WebCore::URL&, CompletionHandler<void(bool)>&&);
void setLastSeen(const WebCore::URL&, Seconds, CompletionHandler<void()>&&);
void setPrevalentResource(const WebCore::URL&, CompletionHandler<void()>&&);
void setVeryPrevalentResource(const WebCore::URL&, CompletionHandler<void()>&&);
void isPrevalentResource(const WebCore::URL&, CompletionHandler<void(bool)>&&);
void isVeryPrevalentResource(const WebCore::URL&, CompletionHandler<void(bool)>&&);
void isRegisteredAsSubFrameUnder(const WebCore::URL& subFrame, const WebCore::URL& topFrame, CompletionHandler<void(bool)>&&);
void isRegisteredAsRedirectingTo(const WebCore::URL& hostRedirectedFrom, const WebCore::URL& hostRedirectedTo, CompletionHandler<void(bool)>&&);
void clearPrevalentResource(const WebCore::URL&, CompletionHandler<void()>&&);
void setGrandfathered(const WebCore::URL&, bool);
void isGrandfathered(const WebCore::URL&, CompletionHandler<void(bool)>&&);
void setSubframeUnderTopFrameOrigin(const WebCore::URL& subframe, const WebCore::URL& topFrame);
void setSubresourceUnderTopFrameOrigin(const WebCore::URL& subresource, const WebCore::URL& topFrame);
void setSubresourceUniqueRedirectTo(const WebCore::URL& subresource, const WebCore::URL& hostNameRedirectedTo);
void setSubresourceUniqueRedirectFrom(const WebCore::URL& subresource, const WebCore::URL& hostNameRedirectedFrom);
void setTopFrameUniqueRedirectTo(const WebCore::URL& topFrameHostName, const WebCore::URL& hostNameRedirectedTo);
void setTopFrameUniqueRedirectFrom(const WebCore::URL& topFrameHostName, const WebCore::URL& hostNameRedirectedFrom);
void scheduleCookiePartitioningUpdate(CompletionHandler<void()>&&);
void scheduleCookiePartitioningUpdateForDomains(const Vector<String>& domainsToPartition, const Vector<String>& domainsToBlock, const Vector<String>& domainsToNeitherPartitionNorBlock, ShouldClearFirst, CompletionHandler<void()>&&);
void scheduleClearPartitioningStateForDomains(const Vector<String>& domains, CompletionHandler<void()>&&);
void scheduleStatisticsAndDataRecordsProcessing();
void submitTelemetry();
void scheduleCookiePartitioningStateReset();
void scheduleClearInMemory(CompletionHandler<void()>&&);
enum class ShouldGrandfather {
No,
Yes,
};
void scheduleClearInMemoryAndPersistent(ShouldGrandfather, CompletionHandler<void()>&&);
void scheduleClearInMemoryAndPersistent(WallTime modifiedSince, ShouldGrandfather, CompletionHandler<void()>&&);
void setTimeToLiveUserInteraction(Seconds);
void setTimeToLiveCookiePartitionFree(Seconds);
void setMinimumTimeBetweenDataRecordsRemoval(Seconds);
void setGrandfatheringTime(Seconds);
void setMaxStatisticsEntries(size_t);
void setPruneEntriesDownTo(size_t);
void resetParametersToDefaultValues(CompletionHandler<void()>&&);
void setResourceLoadStatisticsDebugMode(bool);
void setStatisticsTestingCallback(WTF::Function<void(const String&)>&& callback) { m_statisticsTestingCallback = WTFMove(callback); }
void logTestingEvent(const String&);
void callGrantStorageAccessHandler(const String& subFramePrimaryDomain, const String& topFramePrimaryDomain, std::optional<uint64_t> frameID, uint64_t pageID, CompletionHandler<void(bool)>&&);
void removeAllStorageAccess();
void callUpdatePrevalentDomainsToPartitionOrBlockCookiesHandler(const Vector<String>& domainsToPartition, const Vector<String>& domainsToBlock, const Vector<String>& domainsToNeitherPartitionNorBlock, ShouldClearFirst, CompletionHandler<void()>&&);
void callRemoveDomainsHandler(const Vector<String>& domains);
void callHasStorageAccessForFrameHandler(const String& resourceDomain, const String& firstPartyDomain, uint64_t frameID, uint64_t pageID, CompletionHandler<void(bool)>&&);
void didCreateNetworkProcess();
WebsiteDataStore* websiteDataStore() { return m_websiteDataStore.get(); }
private:
explicit WebResourceLoadStatisticsStore(WebsiteDataStore&);
void postTask(WTF::Function<void()>&&);
static void postTaskReply(WTF::Function<void()>&&);
void didReceiveMessage(IPC::Connection&, IPC::Decoder&) override;
void resourceLoadStatisticsUpdated(Vector<WebCore::ResourceLoadStatistics>&& origins);
void requestStorageAccessUnderOpener(String&& primaryDomainInNeedOfStorageAccess, uint64_t openerPageID, String&& openerPrimaryDomain, bool isTriggeredByUserGesture);
void performDailyTasks();
StorageAccessStatus storageAccessStatus(const String& subFramePrimaryDomain, const String& topFramePrimaryDomain);
void flushAndDestroyPersistentStore();
WeakPtr<WebsiteDataStore> m_websiteDataStore;
Ref<WorkQueue> m_statisticsQueue;
std::unique_ptr<ResourceLoadStatisticsMemoryStore> m_memoryStore;
std::unique_ptr<ResourceLoadStatisticsPersistentStorage> m_persistentStorage;
RunLoop::Timer<WebResourceLoadStatisticsStore> m_dailyTasksTimer;
bool m_hasScheduledProcessStats { false };
WTF::Function<void(const String&)> m_statisticsTestingCallback;
bool m_firstNetworkProcessCreated { false };
};
}