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