Unreviewed attempt to fix Win Cairo build after r233310.
[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/Vector.h>
33 #include <wtf/WallTime.h>
34 #include <wtf/text/WTFString.h>
35
36 namespace WTF {
37 class WorkQueue;
38 }
39
40 namespace WebCore {
41 class ResourceRequest;
42 class URL;
43 struct ResourceLoadStatistics;
44 }
45
46 namespace WebKit {
47
48 class ResourceLoadStatisticsMemoryStore;
49 class ResourceLoadStatisticsPersistentStorage;
50 class WebFrameProxy;
51 class WebProcessProxy;
52
53 enum class ShouldClearFirst;
54 enum class StorageAccessStatus {
55     CannotRequestAccess,
56     RequiresUserPrompt,
57     HasAccess
58 };
59
60 class WebResourceLoadStatisticsStore final : public IPC::Connection::WorkQueueMessageReceiver {
61 public:
62     using UpdatePrevalentDomainsToPartitionOrBlockCookiesHandler = WTF::Function<void(const WTF::Vector<String>& domainsToPartition, const WTF::Vector<String>& domainsToBlock, const WTF::Vector<String>& domainsToNeitherPartitionNorBlock, ShouldClearFirst, CompletionHandler<void()>&&)>;
63     using HasStorageAccessForFrameHandler = WTF::Function<void(const String& resourceDomain, const String& firstPartyDomain, uint64_t frameID, uint64_t pageID, WTF::Function<void(bool hasAccess)>&& callback)>;
64     using GrantStorageAccessHandler = WTF::Function<void(const String& resourceDomain, const String& firstPartyDomain, std::optional<uint64_t> frameID, uint64_t pageID, WTF::Function<void(bool wasGranted)>&& callback)>;
65     using RemoveAllStorageAccessHandler = WTF::Function<void()>;
66     using RemovePrevalentDomainsHandler = WTF::Function<void(const WTF::Vector<String>&)>;
67     static Ref<WebResourceLoadStatisticsStore> create(const String& resourceLoadStatisticsDirectory, WTF::Function<void(const String&)>&& testingCallback, bool isEphemeral, UpdatePrevalentDomainsToPartitionOrBlockCookiesHandler&& updatePrevalentDomainsToPartitionOrBlockCookiesHandler = [](const WTF::Vector<String>&, const WTF::Vector<String>&, const WTF::Vector<String>&, ShouldClearFirst, CompletionHandler<void()>&& callback) { callback(); }, HasStorageAccessForFrameHandler&& hasStorageAccessForFrameHandler = [](const String&, const String&, uint64_t, uint64_t, WTF::Function<void(bool)>&&) { }, GrantStorageAccessHandler&& grantStorageAccessHandler = [](const String&, const String&, std::optional<uint64_t>, uint64_t, WTF::Function<void(bool)>&&) { }, RemoveAllStorageAccessHandler&& removeAllStorageAccessHandler = []() { }, RemovePrevalentDomainsHandler&& removeDomainsHandler = [] (const WTF::Vector<String>&) { })
68     {
69         return adoptRef(*new WebResourceLoadStatisticsStore(resourceLoadStatisticsDirectory, WTFMove(testingCallback), isEphemeral, WTFMove(updatePrevalentDomainsToPartitionOrBlockCookiesHandler), WTFMove(hasStorageAccessForFrameHandler), WTFMove(grantStorageAccessHandler), WTFMove(removeAllStorageAccessHandler), WTFMove(removeDomainsHandler)));
70     }
71
72     ~WebResourceLoadStatisticsStore();
73
74     static const OptionSet<WebsiteDataType>& monitoredDataTypes();
75
76     WorkQueue& statisticsQueue() { return m_statisticsQueue.get(); }
77
78     void setNotifyPagesWhenDataRecordsWereScanned(bool);
79     void setShouldClassifyResourcesBeforeDataRecordsRemoval(bool);
80     void setShouldSubmitTelemetry(bool);
81
82     void resourceLoadStatisticsUpdated(Vector<WebCore::ResourceLoadStatistics>&& origins);
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 requestStorageAccessUnderOpener(String&& primaryDomainInNeedOfStorageAccess, uint64_t openerPageID, String&& openerPrimaryDomain, bool isTriggeredByUserGesture);
87     void grantStorageAccess(String&& subFrameHost, String&& topFrameHost, uint64_t frameID, uint64_t pageID, bool userWasPromptedNow, CompletionHandler<void(bool)>&&);
88     void requestStorageAccessCallback(bool wasGranted, uint64_t contextId);
89
90     void processWillOpenConnection(WebProcessProxy&, IPC::Connection&);
91     void processDidCloseConnection(WebProcessProxy&, IPC::Connection&);
92     void applicationWillTerminate();
93
94     void logFrameNavigation(const WebFrameProxy&, const WebCore::URL& pageURL, const WebCore::ResourceRequest&, const WebCore::URL& redirectURL);
95     void logUserInteraction(const WebCore::URL&);
96     void logNonRecentUserInteraction(const WebCore::URL&);
97     void clearUserInteraction(const WebCore::URL&);
98     void hasHadUserInteraction(const WebCore::URL&, CompletionHandler<void(bool)>&&);
99     void setLastSeen(const WebCore::URL&, Seconds);
100     void setPrevalentResource(const WebCore::URL&);
101     void setVeryPrevalentResource(const WebCore::URL&);
102     void isPrevalentResource(const WebCore::URL&, CompletionHandler<void(bool)>&&);
103     void isVeryPrevalentResource(const WebCore::URL&, CompletionHandler<void(bool)>&&);
104     void isRegisteredAsSubFrameUnder(const WebCore::URL& subFrame, const WebCore::URL& topFrame, CompletionHandler<void(bool)>&&);
105     void isRegisteredAsRedirectingTo(const WebCore::URL& hostRedirectedFrom, const WebCore::URL& hostRedirectedTo, CompletionHandler<void(bool)>&&);
106     void clearPrevalentResource(const WebCore::URL&);
107     void setGrandfathered(const WebCore::URL&, bool);
108     void isGrandfathered(const WebCore::URL&, CompletionHandler<void(bool)>&&);
109     void setSubframeUnderTopFrameOrigin(const WebCore::URL& subframe, const WebCore::URL& topFrame);
110     void setSubresourceUnderTopFrameOrigin(const WebCore::URL& subresource, const WebCore::URL& topFrame);
111     void setSubresourceUniqueRedirectTo(const WebCore::URL& subresource, const WebCore::URL& hostNameRedirectedTo);
112     void setSubresourceUniqueRedirectFrom(const WebCore::URL& subresource, const WebCore::URL& hostNameRedirectedFrom);
113     void setTopFrameUniqueRedirectTo(const WebCore::URL& topFrameHostName, const WebCore::URL& hostNameRedirectedTo);
114     void setTopFrameUniqueRedirectFrom(const WebCore::URL& topFrameHostName, const WebCore::URL& hostNameRedirectedFrom);
115     void scheduleCookiePartitioningUpdate(CompletionHandler<void()>&&);
116     void scheduleCookiePartitioningUpdateForDomains(const Vector<String>& domainsToPartition, const Vector<String>& domainsToBlock, const Vector<String>& domainsToNeitherPartitionNorBlock, ShouldClearFirst, CompletionHandler<void()>&&);
117     void scheduleClearPartitioningStateForDomains(const Vector<String>& domains, CompletionHandler<void()>&&);
118     void scheduleStatisticsAndDataRecordsProcessing();
119     void submitTelemetry();
120     void scheduleCookiePartitioningStateReset();
121
122     void scheduleClearInMemory();
123     
124     enum class ShouldGrandfather {
125         No,
126         Yes,
127     };
128     void scheduleClearInMemoryAndPersistent(ShouldGrandfather, CompletionHandler<void()>&&);
129     void scheduleClearInMemoryAndPersistent(WallTime modifiedSince, ShouldGrandfather, CompletionHandler<void()>&&);
130
131     void setTimeToLiveUserInteraction(Seconds);
132     void setTimeToLiveCookiePartitionFree(Seconds);
133     void setMinimumTimeBetweenDataRecordsRemoval(Seconds);
134     void setGrandfatheringTime(Seconds);
135     void setMaxStatisticsEntries(size_t);
136     void setPruneEntriesDownTo(size_t);
137
138     void resetParametersToDefaultValues();
139
140     void setResourceLoadStatisticsDebugMode(bool);
141
142     void setStatisticsTestingCallback(WTF::Function<void(const String&)>&& callback) { m_statisticsTestingCallback = WTFMove(callback); }
143     void logTestingEvent(const String&);
144     void callGrantStorageAccessHandler(const String& subFramePrimaryDomain, const String& topFramePrimaryDomain, std::optional<uint64_t> frameID, uint64_t pageID, CompletionHandler<void(bool)>&&);
145     void removeAllStorageAccess();
146     void callUpdatePrevalentDomainsToPartitionOrBlockCookiesHandler(const Vector<String>& domainsToPartition, const Vector<String>& domainsToBlock, const Vector<String>& domainsToNeitherPartitionNorBlock, ShouldClearFirst, CompletionHandler<void()>&&);
147     void callRemoveDomainsHandler(const Vector<String>& domains);
148     void callHasStorageAccessForFrameHandler(const String& resourceDomain, const String& firstPartyDomain, uint64_t frameID, uint64_t pageID, WTF::Function<void(bool)>&&);
149
150 private:
151     WebResourceLoadStatisticsStore(const String&, WTF::Function<void(const String&)>&& testingCallback, bool isEphemeral, UpdatePrevalentDomainsToPartitionOrBlockCookiesHandler&&, HasStorageAccessForFrameHandler&&, GrantStorageAccessHandler&&, RemoveAllStorageAccessHandler&&, RemovePrevalentDomainsHandler&&);
152
153     // IPC::MessageReceiver
154     void didReceiveMessage(IPC::Connection&, IPC::Decoder&) override;
155
156     void performDailyTasks();
157
158     StorageAccessStatus storageAccessStatus(const String& subFramePrimaryDomain, const String& topFramePrimaryDomain);
159
160     void flushAndDestroyPersistentStore();
161
162     Ref<WorkQueue> m_statisticsQueue;
163     std::unique_ptr<ResourceLoadStatisticsMemoryStore> m_memoryStore;
164     std::unique_ptr<ResourceLoadStatisticsPersistentStorage> m_persistentStorage;
165
166     UpdatePrevalentDomainsToPartitionOrBlockCookiesHandler m_updatePrevalentDomainsToPartitionOrBlockCookiesHandler;
167     HasStorageAccessForFrameHandler m_hasStorageAccessForFrameHandler;
168     GrantStorageAccessHandler m_grantStorageAccessHandler;
169     RemoveAllStorageAccessHandler m_removeAllStorageAccessHandler;
170     RemovePrevalentDomainsHandler m_removeDomainsHandler;
171
172     RunLoop::Timer<WebResourceLoadStatisticsStore> m_dailyTasksTimer;
173
174     bool m_hasScheduledProcessStats { false };
175
176     WTF::Function<void(const String&)> m_statisticsTestingCallback;
177 };
178
179 } // namespace WebKit