Create a WebResourceLoadStatisticsStore attached to the NetworkSession
[WebKit-https.git] / Source / WebKit / NetworkProcess / Classifier / 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 struct ResourceLoadStatistics;
45 }
46
47 namespace WebKit {
48
49 class NetworkSession;
50 class ResourceLoadStatisticsMemoryStore;
51 class ResourceLoadStatisticsPersistentStorage;
52 class WebFrameProxy;
53 class WebProcessProxy;
54 class WebsiteDataStore;
55
56 enum class StorageAccessStatus {
57     CannotRequestAccess,
58     RequiresUserPrompt,
59     HasAccess
60 };
61
62 class WebResourceLoadStatisticsStore final : public ThreadSafeRefCounted<WebResourceLoadStatisticsStore, WTF::DestructionThread::Main>, public IPC::MessageReceiver {
63 public:
64     static Ref<WebResourceLoadStatisticsStore> create(WebsiteDataStore& websiteDataStore)
65     {
66         return adoptRef(*new WebResourceLoadStatisticsStore(websiteDataStore));
67     }
68
69     static Ref<WebResourceLoadStatisticsStore> create(NetworkSession& networkSession, const String& resourceLoadStatisticsDirectory)
70     {
71         return adoptRef(*new WebResourceLoadStatisticsStore(networkSession, resourceLoadStatisticsDirectory));
72     }
73
74     ~WebResourceLoadStatisticsStore();
75
76     static const OptionSet<WebsiteDataType>& monitoredDataTypes();
77
78     WorkQueue& statisticsQueue() { return m_statisticsQueue.get(); }
79
80     void setNotifyPagesWhenDataRecordsWereScanned(bool);
81     void setShouldClassifyResourcesBeforeDataRecordsRemoval(bool);
82     void setShouldSubmitTelemetry(bool);
83
84     void hasStorageAccess(String&& subFrameHost, String&& topFrameHost, uint64_t frameID, uint64_t pageID, CompletionHandler<void(bool)>&& callback);
85     void requestStorageAccess(String&& subFrameHost, String&& topFrameHost, uint64_t frameID, uint64_t pageID, bool promptEnabled, CompletionHandler<void(StorageAccessStatus)>&&);
86     void grantStorageAccess(String&& subFrameHost, String&& topFrameHost, uint64_t frameID, uint64_t pageID, bool userWasPromptedNow, CompletionHandler<void(bool)>&&);
87     void requestStorageAccessCallback(bool wasGranted, uint64_t contextId);
88
89     void applicationWillTerminate();
90
91     void logFrameNavigation(const WebFrameProxy&, const URL& pageURL, const WebCore::ResourceRequest&, const URL& redirectURL);
92     void logFrameNavigation(const String& targetPrimaryDomain, const String& mainFramePrimaryDomain, const String& sourcePrimaryDomain, const String& targetHost, const String& mainFrameHost, bool isRedirect, bool isMainFrame);
93     void logUserInteraction(const URL&, CompletionHandler<void()>&&);
94     void logUserInteraction(const String& targetPrimaryDomain, CompletionHandler<void()>&&);
95     void clearUserInteraction(const URL&, CompletionHandler<void()>&&);
96     bool grantStorageAccess(const String& resourceDomain, const String& firstPartyDomain, Optional<uint64_t> frameID, uint64_t pageID);
97     void hasHadUserInteraction(const URL&, CompletionHandler<void(bool)>&&);
98     bool hasStorageAccessForFrame(const String& resourceDomain, const String& firstPartyDomain, uint64_t frameID, uint64_t pageID);
99     void setLastSeen(const URL&, Seconds, CompletionHandler<void()>&&);
100     void setPrevalentResource(const URL&, CompletionHandler<void()>&&);
101     void setVeryPrevalentResource(const URL&, CompletionHandler<void()>&&);
102     void dumpResourceLoadStatistics(CompletionHandler<void(const String&)>&&);
103     void isPrevalentResource(const URL&, CompletionHandler<void(bool)>&&);
104     void isVeryPrevalentResource(const URL&, CompletionHandler<void(bool)>&&);
105     void isRegisteredAsSubresourceUnder(const URL& subresource, const URL& topFrame, CompletionHandler<void(bool)>&&);
106     void isRegisteredAsSubFrameUnder(const URL& subFrame, const URL& topFrame, CompletionHandler<void(bool)>&&);
107     void isRegisteredAsRedirectingTo(const URL& hostRedirectedFrom, const URL& hostRedirectedTo, CompletionHandler<void(bool)>&&);
108     void clearPrevalentResource(const URL&, CompletionHandler<void()>&&);
109     void setGrandfathered(const URL&, bool);
110     void isGrandfathered(const URL&, CompletionHandler<void(bool)>&&);
111     void removeAllStorageAccess();
112     void removePrevalentDomains(const Vector<String>& domainsToBlock);
113     void setCacheMaxAgeCapForPrevalentResources(Seconds);
114     void setSubframeUnderTopFrameOrigin(const URL& subframe, const URL& topFrame);
115     void setSubresourceUnderTopFrameOrigin(const URL& subresource, const URL& topFrame);
116     void setSubresourceUniqueRedirectTo(const URL& subresource, const URL& hostNameRedirectedTo);
117     void setSubresourceUniqueRedirectFrom(const URL& subresource, const URL& hostNameRedirectedFrom);
118     void setTopFrameUniqueRedirectTo(const URL& topFrameHostName, const URL& hostNameRedirectedTo);
119     void setTopFrameUniqueRedirectFrom(const URL& topFrameHostName, const URL& hostNameRedirectedFrom);
120     void scheduleCookieBlockingUpdate(CompletionHandler<void()>&&);
121     void scheduleCookieBlockingUpdateForDomains(const Vector<String>& domainsToBlock, CompletionHandler<void()>&&);
122     void scheduleClearBlockingStateForDomains(const Vector<String>& domains, CompletionHandler<void()>&&);
123     void scheduleStatisticsAndDataRecordsProcessing();
124     void submitTelemetry();
125     void updatePrevalentDomainsToBlockCookiesFor(const Vector<String>& domainsToBlock);
126
127     enum class ShouldGrandfather {
128         No,
129         Yes,
130     };
131     void scheduleClearInMemoryAndPersistent(ShouldGrandfather, CompletionHandler<void()>&&);
132     void scheduleClearInMemoryAndPersistent(WallTime modifiedSince, ShouldGrandfather, CompletionHandler<void()>&&);
133
134     void setTimeToLiveUserInteraction(Seconds);
135     void setMinimumTimeBetweenDataRecordsRemoval(Seconds);
136     void setGrandfatheringTime(Seconds);
137     void setCacheMaxAgeCap(Seconds, CompletionHandler<void()>&&);
138     void setMaxStatisticsEntries(size_t);
139     void setPruneEntriesDownTo(size_t);
140
141     void resetParametersToDefaultValues(CompletionHandler<void()>&&);
142
143     void setResourceLoadStatisticsDebugMode(bool, CompletionHandler<void()>&&);
144     void setPrevalentResourceForDebugMode(const URL&, CompletionHandler<void()>&&);
145     
146     void setStatisticsTestingCallback(WTF::Function<void(const String&)>&& callback) { m_statisticsTestingCallback = WTFMove(callback); }
147     void logTestingEvent(const String&);
148     void callGrantStorageAccessHandler(const String& subFramePrimaryDomain, const String& topFramePrimaryDomain, Optional<uint64_t> frameID, uint64_t pageID, CompletionHandler<void(bool)>&&);
149     void removeAllStorageAccess(CompletionHandler<void()>&&);
150     void callUpdatePrevalentDomainsToBlockCookiesForHandler(const Vector<String>& domainsToBlock, CompletionHandler<void()>&&);
151     void callRemoveDomainsHandler(const Vector<String>& domains);
152     void callHasStorageAccessForFrameHandler(const String& resourceDomain, const String& firstPartyDomain, uint64_t frameID, uint64_t pageID, CompletionHandler<void(bool)>&&);
153
154     void didCreateNetworkProcess();
155
156     WebsiteDataStore* websiteDataStore() { return m_websiteDataStore.get(); }
157     NetworkSession* networkSession() { return m_networkSession.get(); }
158
159 private:
160     explicit WebResourceLoadStatisticsStore(WebsiteDataStore&);
161     explicit WebResourceLoadStatisticsStore(NetworkSession&, const String&);
162
163     void postTask(WTF::Function<void()>&&);
164     static void postTaskReply(WTF::Function<void()>&&);
165
166     // IPC::MessageReceiver.
167     void didReceiveMessage(IPC::Connection&, IPC::Decoder&) override;
168
169     // IPC message handlers.
170     void resourceLoadStatisticsUpdated(Vector<WebCore::ResourceLoadStatistics>&& origins);
171     void requestStorageAccessUnderOpener(String&& primaryDomainInNeedOfStorageAccess, uint64_t openerPageID, String&& openerPrimaryDomain);
172
173     void performDailyTasks();
174
175     StorageAccessStatus storageAccessStatus(const String& subFramePrimaryDomain, const String& topFramePrimaryDomain);
176
177     void flushAndDestroyPersistentStore();
178
179     WeakPtr<WebsiteDataStore> m_websiteDataStore;
180     WeakPtr<NetworkSession> m_networkSession;
181     Ref<WorkQueue> m_statisticsQueue;
182     std::unique_ptr<ResourceLoadStatisticsMemoryStore> m_memoryStore;
183     std::unique_ptr<ResourceLoadStatisticsPersistentStorage> m_persistentStorage;
184
185     RunLoop::Timer<WebResourceLoadStatisticsStore> m_dailyTasksTimer;
186
187     bool m_hasScheduledProcessStats { false };
188
189     WTF::Function<void(const String&)> m_statisticsTestingCallback;
190
191     bool m_firstNetworkProcessCreated { false };
192 };
193
194 } // namespace WebKit