Add completion handlers to TestRunner functions setStatisticsLastSeen(), setStatistic...
[WebKit-https.git] / Source / WebKit / UIProcess / WebResourceLoadStatisticsStore.h
1 /*
2  * Copyright (C) 2016-2018 Apple Inc. All rights reserved.
3  *
4  * Redistribution and use in source and binary forms, with or without
5  * modification, are permitted provided that the following conditions
6  * are met:
7  * 1. Redistributions of source code must retain the above copyright
8  *    notice, this list of conditions and the following disclaimer.
9  * 2. Redistributions in binary form must reproduce the above copyright
10  *    notice, this list of conditions and the following disclaimer in the
11  *    documentation and/or other materials provided with the distribution.
12  *
13  * THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS''
14  * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
15  * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
16  * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS
17  * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
18  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
19  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
20  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
21  * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
22  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
23  * THE POSSIBILITY OF SUCH DAMAGE.
24  */
25
26 #pragma once
27
28 #include "Connection.h"
29 #include "WebsiteDataType.h"
30 #include <wtf/CompletionHandler.h>
31 #include <wtf/RunLoop.h>
32 #include <wtf/ThreadSafeRefCounted.h>
33 #include <wtf/Vector.h>
34 #include <wtf/WallTime.h>
35 #include <wtf/WeakPtr.h>
36 #include <wtf/text/WTFString.h>
37
38 namespace WTF {
39 class WorkQueue;
40 }
41
42 namespace WebCore {
43 class ResourceRequest;
44 class URL;
45 struct ResourceLoadStatistics;
46 }
47
48 namespace WebKit {
49
50 class ResourceLoadStatisticsMemoryStore;
51 class ResourceLoadStatisticsPersistentStorage;
52 class WebFrameProxy;
53 class WebProcessProxy;
54 class WebsiteDataStore;
55
56 enum class ShouldClearFirst;
57 enum class StorageAccessStatus {
58     CannotRequestAccess,
59     RequiresUserPrompt,
60     HasAccess
61 };
62
63 class WebResourceLoadStatisticsStore final : public ThreadSafeRefCounted<WebResourceLoadStatisticsStore, WTF::DestructionThread::Main>, private IPC::MessageReceiver {
64 public:
65     static Ref<WebResourceLoadStatisticsStore> create(WebsiteDataStore& websiteDataStore)
66     {
67         return adoptRef(*new WebResourceLoadStatisticsStore(websiteDataStore));
68     }
69
70     ~WebResourceLoadStatisticsStore();
71
72     static const OptionSet<WebsiteDataType>& monitoredDataTypes();
73
74     WorkQueue& statisticsQueue() { return m_statisticsQueue.get(); }
75
76     void setNotifyPagesWhenDataRecordsWereScanned(bool);
77     void setShouldClassifyResourcesBeforeDataRecordsRemoval(bool);
78     void setShouldSubmitTelemetry(bool);
79
80     void hasStorageAccess(String&& subFrameHost, String&& topFrameHost, uint64_t frameID, uint64_t pageID, CompletionHandler<void(bool)>&& callback);
81     void requestStorageAccess(String&& subFrameHost, String&& topFrameHost, uint64_t frameID, uint64_t pageID, bool promptEnabled, CompletionHandler<void(StorageAccessStatus)>&&);
82     void grantStorageAccess(String&& subFrameHost, String&& topFrameHost, uint64_t frameID, uint64_t pageID, bool userWasPromptedNow, CompletionHandler<void(bool)>&&);
83     void requestStorageAccessCallback(bool wasGranted, uint64_t contextId);
84
85     void processWillOpenConnection(WebProcessProxy&, IPC::Connection&);
86     void processDidCloseConnection(WebProcessProxy&, IPC::Connection&);
87     void applicationWillTerminate();
88
89     void logFrameNavigation(const WebFrameProxy&, const WebCore::URL& pageURL, const WebCore::ResourceRequest&, const WebCore::URL& redirectURL);
90     void logUserInteraction(const WebCore::URL&, CompletionHandler<void()>&&);
91     void logNonRecentUserInteraction(const WebCore::URL&, CompletionHandler<void()>&&);
92     void clearUserInteraction(const WebCore::URL&, CompletionHandler<void()>&&);
93     void hasHadUserInteraction(const WebCore::URL&, CompletionHandler<void(bool)>&&);
94     void setLastSeen(const WebCore::URL&, Seconds, CompletionHandler<void()>&&);
95     void setPrevalentResource(const WebCore::URL&, CompletionHandler<void()>&&);
96     void setVeryPrevalentResource(const WebCore::URL&, CompletionHandler<void()>&&);
97     void isPrevalentResource(const WebCore::URL&, CompletionHandler<void(bool)>&&);
98     void isVeryPrevalentResource(const WebCore::URL&, CompletionHandler<void(bool)>&&);
99     void isRegisteredAsSubFrameUnder(const WebCore::URL& subFrame, const WebCore::URL& topFrame, CompletionHandler<void(bool)>&&);
100     void isRegisteredAsRedirectingTo(const WebCore::URL& hostRedirectedFrom, const WebCore::URL& hostRedirectedTo, CompletionHandler<void(bool)>&&);
101     void clearPrevalentResource(const WebCore::URL&, CompletionHandler<void()>&&);
102     void setGrandfathered(const WebCore::URL&, bool);
103     void isGrandfathered(const WebCore::URL&, CompletionHandler<void(bool)>&&);
104     void setSubframeUnderTopFrameOrigin(const WebCore::URL& subframe, const WebCore::URL& topFrame);
105     void setSubresourceUnderTopFrameOrigin(const WebCore::URL& subresource, const WebCore::URL& topFrame);
106     void setSubresourceUniqueRedirectTo(const WebCore::URL& subresource, const WebCore::URL& hostNameRedirectedTo);
107     void setSubresourceUniqueRedirectFrom(const WebCore::URL& subresource, const WebCore::URL& hostNameRedirectedFrom);
108     void setTopFrameUniqueRedirectTo(const WebCore::URL& topFrameHostName, const WebCore::URL& hostNameRedirectedTo);
109     void setTopFrameUniqueRedirectFrom(const WebCore::URL& topFrameHostName, const WebCore::URL& hostNameRedirectedFrom);
110     void scheduleCookiePartitioningUpdate(CompletionHandler<void()>&&);
111     void scheduleCookiePartitioningUpdateForDomains(const Vector<String>& domainsToPartition, const Vector<String>& domainsToBlock, const Vector<String>& domainsToNeitherPartitionNorBlock, ShouldClearFirst, CompletionHandler<void()>&&);
112     void scheduleClearPartitioningStateForDomains(const Vector<String>& domains, CompletionHandler<void()>&&);
113     void scheduleStatisticsAndDataRecordsProcessing();
114     void submitTelemetry();
115     void scheduleCookiePartitioningStateReset();
116
117     void scheduleClearInMemory(CompletionHandler<void()>&&);
118     
119     enum class ShouldGrandfather {
120         No,
121         Yes,
122     };
123     void scheduleClearInMemoryAndPersistent(ShouldGrandfather, CompletionHandler<void()>&&);
124     void scheduleClearInMemoryAndPersistent(WallTime modifiedSince, ShouldGrandfather, CompletionHandler<void()>&&);
125
126     void setTimeToLiveUserInteraction(Seconds);
127     void setTimeToLiveCookiePartitionFree(Seconds);
128     void setMinimumTimeBetweenDataRecordsRemoval(Seconds);
129     void setGrandfatheringTime(Seconds);
130     void setMaxStatisticsEntries(size_t);
131     void setPruneEntriesDownTo(size_t);
132
133     void resetParametersToDefaultValues(CompletionHandler<void()>&&);
134
135     void setResourceLoadStatisticsDebugMode(bool);
136
137     void setStatisticsTestingCallback(WTF::Function<void(const String&)>&& callback) { m_statisticsTestingCallback = WTFMove(callback); }
138     void logTestingEvent(const String&);
139     void callGrantStorageAccessHandler(const String& subFramePrimaryDomain, const String& topFramePrimaryDomain, std::optional<uint64_t> frameID, uint64_t pageID, CompletionHandler<void(bool)>&&);
140     void removeAllStorageAccess();
141     void callUpdatePrevalentDomainsToPartitionOrBlockCookiesHandler(const Vector<String>& domainsToPartition, const Vector<String>& domainsToBlock, const Vector<String>& domainsToNeitherPartitionNorBlock, ShouldClearFirst, CompletionHandler<void()>&&);
142     void callRemoveDomainsHandler(const Vector<String>& domains);
143     void callHasStorageAccessForFrameHandler(const String& resourceDomain, const String& firstPartyDomain, uint64_t frameID, uint64_t pageID, CompletionHandler<void(bool)>&&);
144
145 private:
146     explicit WebResourceLoadStatisticsStore(WebsiteDataStore&);
147
148     void postTask(WTF::Function<void()>&&);
149     static void postTaskReply(WTF::Function<void()>&&);
150
151     // IPC::MessageReceiver.
152     void didReceiveMessage(IPC::Connection&, IPC::Decoder&) override;
153
154     // IPC message handlers.
155     void resourceLoadStatisticsUpdated(Vector<WebCore::ResourceLoadStatistics>&& origins);
156     void requestStorageAccessUnderOpener(String&& primaryDomainInNeedOfStorageAccess, uint64_t openerPageID, String&& openerPrimaryDomain, bool isTriggeredByUserGesture);
157
158     void performDailyTasks();
159
160     StorageAccessStatus storageAccessStatus(const String& subFramePrimaryDomain, const String& topFramePrimaryDomain);
161
162     void flushAndDestroyPersistentStore();
163
164     WeakPtr<WebsiteDataStore> m_websiteDataStore;
165     Ref<WorkQueue> m_statisticsQueue;
166     std::unique_ptr<ResourceLoadStatisticsMemoryStore> m_memoryStore;
167     std::unique_ptr<ResourceLoadStatisticsPersistentStorage> m_persistentStorage;
168
169     RunLoop::Timer<WebResourceLoadStatisticsStore> m_dailyTasksTimer;
170
171     bool m_hasScheduledProcessStats { false };
172
173     WTF::Function<void(const String&)> m_statisticsTestingCallback;
174 };
175
176 } // namespace WebKit