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;
struct ResourceLoadStatistics;
}
namespace WebKit {
class ResourceLoadStatisticsMemoryStore;
class ResourceLoadStatisticsPersistentStorage;
class WebFrameProxy;
class WebProcessProxy;
class WebsiteDataStore;
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 URL& pageURL, const WebCore::ResourceRequest&, const URL& redirectURL);
void logUserInteraction(const URL&, CompletionHandler<void()>&&);
void clearUserInteraction(const URL&, CompletionHandler<void()>&&);
void hasHadUserInteraction(const URL&, CompletionHandler<void(bool)>&&);
void setLastSeen(const URL&, Seconds, CompletionHandler<void()>&&);
void setPrevalentResource(const URL&, CompletionHandler<void()>&&);
void setVeryPrevalentResource(const URL&, CompletionHandler<void()>&&);
void dumpResourceLoadStatistics(CompletionHandler<void(const String&)>&&);
void isPrevalentResource(const URL&, CompletionHandler<void(bool)>&&);
void isVeryPrevalentResource(const URL&, CompletionHandler<void(bool)>&&);
void isRegisteredAsSubresourceUnder(const URL& subresource, const URL& topFrame, CompletionHandler<void(bool)>&&);
void isRegisteredAsSubFrameUnder(const URL& subFrame, const URL& topFrame, CompletionHandler<void(bool)>&&);
void isRegisteredAsRedirectingTo(const URL& hostRedirectedFrom, const URL& hostRedirectedTo, CompletionHandler<void(bool)>&&);
void clearPrevalentResource(const URL&, CompletionHandler<void()>&&);
void setGrandfathered(const URL&, bool);
void isGrandfathered(const URL&, CompletionHandler<void(bool)>&&);
void setSubframeUnderTopFrameOrigin(const URL& subframe, const URL& topFrame);
void setSubresourceUnderTopFrameOrigin(const URL& subresource, const URL& topFrame);
void setSubresourceUniqueRedirectTo(const URL& subresource, const URL& hostNameRedirectedTo);
void setSubresourceUniqueRedirectFrom(const URL& subresource, const URL& hostNameRedirectedFrom);
void setTopFrameUniqueRedirectTo(const URL& topFrameHostName, const URL& hostNameRedirectedTo);
void setTopFrameUniqueRedirectFrom(const URL& topFrameHostName, const URL& hostNameRedirectedFrom);
void scheduleCookieBlockingUpdate(CompletionHandler<void()>&&);
void scheduleCookieBlockingUpdateForDomains(const Vector<String>& domainsToBlock, CompletionHandler<void()>&&);
void scheduleClearBlockingStateForDomains(const Vector<String>& domains, CompletionHandler<void()>&&);
void scheduleStatisticsAndDataRecordsProcessing();
void submitTelemetry();
enum class ShouldGrandfather {
No,
Yes,
};
void scheduleClearInMemoryAndPersistent(ShouldGrandfather, CompletionHandler<void()>&&);
void scheduleClearInMemoryAndPersistent(WallTime modifiedSince, ShouldGrandfather, CompletionHandler<void()>&&);
void setTimeToLiveUserInteraction(Seconds);
void setMinimumTimeBetweenDataRecordsRemoval(Seconds);
void setGrandfatheringTime(Seconds);
void setCacheMaxAgeCap(Seconds, CompletionHandler<void()>&&);
void setMaxStatisticsEntries(size_t);
void setPruneEntriesDownTo(size_t);
void resetParametersToDefaultValues(CompletionHandler<void()>&&);
void setResourceLoadStatisticsDebugMode(bool, CompletionHandler<void()>&&);
void setPrevalentResourceForDebugMode(const URL&, CompletionHandler<void()>&&);
void setStatisticsTestingCallback(WTF::Function<void(const String&)>&& callback) { m_statisticsTestingCallback = WTFMove(callback); }
void logTestingEvent(const String&);
void callGrantStorageAccessHandler(const String& subFramePrimaryDomain, const String& topFramePrimaryDomain, Optional<uint64_t> frameID, uint64_t pageID, CompletionHandler<void(bool)>&&);
void removeAllStorageAccess(CompletionHandler<void()>&&);
void callUpdatePrevalentDomainsToBlockCookiesForHandler(const Vector<String>& domainsToBlock, 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);
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 };
};
}