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