c1e651172fc6d0549d8334551c6b6b726f6e13ea
[WebKit-https.git] / Source / WebKit / UIProcess / WebResourceLoadStatisticsStore.h
1 /*
2  * Copyright (C) 2016-2017 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 "ResourceLoadStatisticsClassifier.h"
30 #include "ResourceLoadStatisticsPersistentStorage.h"
31 #include <wtf/MonotonicTime.h>
32 #include <wtf/RunLoop.h>
33 #include <wtf/Vector.h>
34 #include <wtf/WallTime.h>
35 #include <wtf/text/WTFString.h>
36
37 #if HAVE(CORE_PREDICTION)
38 #include "ResourceLoadStatisticsClassifierCocoa.h"
39 #endif
40
41 namespace WTF {
42 class WorkQueue;
43 }
44
45 namespace WebCore {
46 class KeyedDecoder;
47 class KeyedEncoder;
48 class URL;
49 struct ResourceLoadStatistics;
50 }
51
52 namespace WebKit {
53
54 class OperatingDate;
55 class WebProcessProxy;
56
57 enum class ShouldClearFirst;
58
59 class WebResourceLoadStatisticsStore final : public IPC::Connection::WorkQueueMessageReceiver {
60 public:
61     using UpdateCookiePartitioningForDomainsHandler = WTF::Function<void(const Vector<String>& domainsToRemove, const Vector<String>& domainsToAdd, ShouldClearFirst)>;
62     static Ref<WebResourceLoadStatisticsStore> create(const String& resourceLoadStatisticsDirectory, UpdateCookiePartitioningForDomainsHandler&& updateCookiePartitioningForDomainsHandler = { })
63     {
64         return adoptRef(*new WebResourceLoadStatisticsStore(resourceLoadStatisticsDirectory, WTFMove(updateCookiePartitioningForDomainsHandler)));
65     }
66
67     ~WebResourceLoadStatisticsStore();
68
69     bool isEmpty() const { return m_resourceStatisticsMap.isEmpty(); }
70     WorkQueue& statisticsQueue() { return m_statisticsQueue.get(); }
71
72     void setNotifyPagesWhenDataRecordsWereScanned(bool value) { m_parameters.shouldNotifyPagesWhenDataRecordsWereScanned = value; }
73     void setShouldClassifyResourcesBeforeDataRecordsRemoval(bool value) { m_parameters.shouldClassifyResourcesBeforeDataRecordsRemoval = value; }
74     void setShouldSubmitTelemetry(bool value) { m_parameters.shouldSubmitTelemetry = value; }
75
76     void resourceLoadStatisticsUpdated(Vector<WebCore::ResourceLoadStatistics>&& origins);
77
78     void processWillOpenConnection(WebProcessProxy&, IPC::Connection&);
79     void processDidCloseConnection(WebProcessProxy&, IPC::Connection&);
80     void applicationWillTerminate();
81
82     void logUserInteraction(const WebCore::URL&);
83     void clearUserInteraction(const WebCore::URL&);
84     void hasHadUserInteraction(const WebCore::URL&, WTF::Function<void (bool)>&&);
85     void setLastSeen(const WebCore::URL&, Seconds);
86     void setPrevalentResource(const WebCore::URL&);
87     void isPrevalentResource(const WebCore::URL&, WTF::Function<void (bool)>&&);
88     void clearPrevalentResource(const WebCore::URL&);
89     void setGrandfathered(const WebCore::URL&, bool);
90     void isGrandfathered(const WebCore::URL&, WTF::Function<void (bool)>&&);
91     void setSubframeUnderTopFrameOrigin(const WebCore::URL& subframe, const WebCore::URL& topFrame);
92     void setSubresourceUnderTopFrameOrigin(const WebCore::URL& subresource, const WebCore::URL& topFrame);
93     void setSubresourceUniqueRedirectTo(const WebCore::URL& subresource, const WebCore::URL& hostNameRedirectedTo);
94     void scheduleCookiePartitioningUpdate();
95     void scheduleCookiePartitioningUpdateForDomains(const Vector<String>& domainsToRemove, const Vector<String>& domainsToAdd, ShouldClearFirst);
96     void processStatisticsAndDataRecords();
97     void submitTelemetry();
98     void scheduleCookiePartitioningStateReset();
99
100     void scheduleClearInMemory();
101     void scheduleClearInMemoryAndPersistent();
102     void scheduleClearInMemoryAndPersistent(std::chrono::system_clock::time_point modifiedSince);
103
104     void setTimeToLiveUserInteraction(Seconds);
105     void setTimeToLiveCookiePartitionFree(Seconds);
106     void setMinimumTimeBetweenDataRecordsRemoval(Seconds);
107     void setGrandfatheringTime(Seconds);
108     void setMaxStatisticsEntries(size_t);
109     void setPruneEntriesDownTo(size_t);
110     
111     void processStatistics(const WTF::Function<void (const WebCore::ResourceLoadStatistics&)>&) const;
112     void pruneStatisticsIfNeeded();
113
114     void resetParametersToDefaultValues();
115
116     std::unique_ptr<WebCore::KeyedEncoder> createEncoderFromData() const;
117     void mergeWithDataFromDecoder(WebCore::KeyedDecoder&);
118     void clearInMemory();
119     void grandfatherExistingWebsiteData();
120     
121 private:
122     WebResourceLoadStatisticsStore(const String&, UpdateCookiePartitioningForDomainsHandler&&);
123
124     void removeDataRecords();
125
126     // IPC::MessageReceiver
127     void didReceiveMessage(IPC::Connection&, IPC::Decoder&) override;
128
129     void performDailyTasks();
130     bool shouldRemoveDataRecords() const;
131     void setDataRecordsBeingRemoved(bool);
132
133     bool shouldPartitionCookies(const WebCore::ResourceLoadStatistics&) const;
134     bool hasStatisticsExpired(const WebCore::ResourceLoadStatistics&) const;
135     bool hasHadUnexpiredRecentUserInteraction(WebCore::ResourceLoadStatistics&) const;
136     void includeTodayAsOperatingDateIfNecessary();
137     Vector<String> topPrivatelyControlledDomainsToRemoveWebsiteDataFor();
138     void updateCookiePartitioning();
139     void updateCookiePartitioningForDomains(const Vector<String>& domainsToRemove, const Vector<String>& domainsToAdd, ShouldClearFirst);
140     void mergeStatistics(Vector<WebCore::ResourceLoadStatistics>&&);
141     WebCore::ResourceLoadStatistics& ensureResourceStatisticsForPrimaryDomain(const String&);
142
143     void resetCookiePartitioningState();
144
145 #if PLATFORM(COCOA)
146     void registerUserDefaultsIfNeeded();
147 #endif
148
149     struct Parameters {
150         size_t pruneEntriesDownTo { 800 };
151         size_t maxStatisticsEntries { 1000 };
152         std::optional<Seconds> timeToLiveUserInteraction;
153         Seconds timeToLiveCookiePartitionFree { 24_h };
154         Seconds minimumTimeBetweenDataRecordsRemoval { 1_h };
155         Seconds grandfatheringTime { 1_h };
156         bool shouldNotifyPagesWhenDataRecordsWereScanned { false };
157         bool shouldClassifyResourcesBeforeDataRecordsRemoval { true };
158         bool shouldSubmitTelemetry { true };
159     };
160
161     HashMap<String, WebCore::ResourceLoadStatistics> m_resourceStatisticsMap;
162 #if HAVE(CORE_PREDICTION)
163     ResourceLoadStatisticsClassifierCocoa m_resourceLoadStatisticsClassifier;
164 #else
165     ResourceLoadStatisticsClassifier m_resourceLoadStatisticsClassifier;
166 #endif
167     Ref<WTF::WorkQueue> m_statisticsQueue;
168     ResourceLoadStatisticsPersistentStorage m_persistentStorage;
169     Vector<OperatingDate> m_operatingDates;
170
171     UpdateCookiePartitioningForDomainsHandler m_updateCookiePartitioningForDomainsHandler;
172
173     WallTime m_endOfGrandfatheringTimestamp;
174     RunLoop::Timer<WebResourceLoadStatisticsStore> m_dailyTasksTimer;
175     MonotonicTime m_lastTimeDataRecordsWereRemoved;
176
177     Parameters m_parameters;
178
179     bool m_dataRecordsBeingRemoved { false };
180 };
181
182 } // namespace WebKit