Web Inspector: "Reload Web Inspector" button no longer partially works
[WebKit-https.git] / Source / WebKit / UIProcess / ResourceLoadStatisticsMemoryStore.h
1 /*
2  * Copyright (C) 2017-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 "ResourceLoadStatisticsClassifier.h"
29 #include "WebResourceLoadStatisticsStore.h"
30 #include <wtf/CompletionHandler.h>
31 #include <wtf/Vector.h>
32 #include <wtf/WeakPtr.h>
33 #include <wtf/WorkQueue.h>
34
35 #if HAVE(CORE_PREDICTION)
36 #include "ResourceLoadStatisticsClassifierCocoa.h"
37 #endif
38
39 namespace WebCore {
40 class KeyedDecoder;
41 class KeyedEncoder;
42 struct ResourceLoadStatistics;
43 }
44
45 namespace WebKit {
46
47 class OperatingDate;
48 class ResourceLoadStatisticsPersistentStorage;
49
50 // This is always constructed / used / destroyed on the WebResourceLoadStatisticsStore's statistics queue.
51 class ResourceLoadStatisticsMemoryStore : public CanMakeWeakPtr<ResourceLoadStatisticsMemoryStore> {
52 public:
53     ResourceLoadStatisticsMemoryStore(WebResourceLoadStatisticsStore&, WorkQueue&);
54     ~ResourceLoadStatisticsMemoryStore();
55
56     void setPersistentStorage(ResourceLoadStatisticsPersistentStorage&);
57
58     void clear(CompletionHandler<void()>&&);
59     bool isEmpty() const { return m_resourceStatisticsMap.isEmpty(); }
60
61     std::unique_ptr<WebCore::KeyedEncoder> createEncoderFromData() const;
62     void mergeWithDataFromDecoder(WebCore::KeyedDecoder&);
63
64     void mergeStatistics(Vector<WebCore::ResourceLoadStatistics>&&);
65     void processStatistics(const Function<void(const WebCore::ResourceLoadStatistics&)>&) const;
66
67     void updateCookieBlocking(CompletionHandler<void()>&&);
68     void updateCookieBlockingForDomains(const Vector<String>& domainsToBlock, CompletionHandler<void()>&&);
69     void clearBlockingStateForDomains(const Vector<String>& domains, CompletionHandler<void()>&&);
70
71     void includeTodayAsOperatingDateIfNecessary();
72     void processStatisticsAndDataRecords();
73
74     void requestStorageAccessUnderOpener(String&& primaryDomainInNeedOfStorageAccess, uint64_t openerPageID, String&& openerPrimaryDomain);
75     void removeAllStorageAccess(CompletionHandler<void()>&&);
76
77     void grandfatherExistingWebsiteData(CompletionHandler<void()>&&);
78     void cancelPendingStatisticsProcessingRequest();
79
80     bool isRegisteredAsSubresourceUnder(const String& subresourcePrimaryDomain, const String& topFramePrimaryDomain) const;
81     bool isRegisteredAsSubFrameUnder(const String& subFramePrimaryDomain, const String& topFramePrimaryDomain) const;
82     bool isRegisteredAsRedirectingTo(const String& hostRedirectedFromPrimaryDomain, const String& hostRedirectedToPrimaryDomain) const;
83
84     void clearPrevalentResource(const String& primaryDomain);
85     String dumpResourceLoadStatistics() const;
86     bool isPrevalentResource(const String& primaryDomain) const;
87     bool isVeryPrevalentResource(const String& primaryDomain) const;
88     void setPrevalentResource(const String& primaryDomain);
89     void setVeryPrevalentResource(const String& primaryDomain);
90
91     void setGrandfathered(const String& primaryDomain, bool value);
92     bool isGrandfathered(const String& primaryDomain) const;
93
94     void setSubframeUnderTopFrameOrigin(const String& primarySubFrameDomain, const String& primaryTopFrameDomain);
95     void setSubresourceUnderTopFrameOrigin(const String& primarySubresourceDomain, const String& primaryTopFrameDomain);
96     void setSubresourceUniqueRedirectTo(const String& primarySubresourceDomain, const String& primaryRedirectDomain);
97     void setSubresourceUniqueRedirectFrom(const String& primarySubresourceDomain, const String& primaryRedirectDomain);
98     void setTopFrameUniqueRedirectTo(const String& topFramePrimaryDomain, const String& primaryRedirectDomain);
99     void setTopFrameUniqueRedirectFrom(const String& topFramePrimaryDomain, const String& primaryRedirectDomain);
100
101     void logTestingEvent(const String&);
102
103     void setMaxStatisticsEntries(size_t maximumEntryCount);
104     void setPruneEntriesDownTo(size_t pruneTargetCount);
105     void resetParametersToDefaultValues();
106
107     void calculateAndSubmitTelemetry() const;
108
109     void setNotifyPagesWhenDataRecordsWereScanned(bool);
110     void setShouldClassifyResourcesBeforeDataRecordsRemoval(bool);
111     void setShouldSubmitTelemetry(bool);
112     void setTimeToLiveUserInteraction(Seconds);
113     void setMinimumTimeBetweenDataRecordsRemoval(Seconds);
114     void setGrandfatheringTime(Seconds);
115     void setResourceLoadStatisticsDebugMode(bool);
116     bool isDebugModeEnabled() const { return m_debugModeEnabled; };
117     void setPrevalentResourceForDebugMode(const String& domain);
118
119     void hasStorageAccess(const String& subFramePrimaryDomain, const String& topFramePrimaryDomain, uint64_t frameID, uint64_t pageID, CompletionHandler<void(bool)>&&);
120     void requestStorageAccess(String&& subFramePrimaryDomain, String&& topFramePrimaryDomain, uint64_t frameID, uint64_t pageID, bool promptEnabled, CompletionHandler<void(StorageAccessStatus)>&&);
121     void grantStorageAccess(String&& subFrameHost, String&& topFrameHost, uint64_t frameID, uint64_t pageID, bool userWasPromptedNow, CompletionHandler<void(bool)>&&);
122
123     void logFrameNavigation(const String& targetPrimaryDomain, const String& mainFramePrimaryDomain, const String& sourcePrimaryDomain, const String& targetHost, const String& mainFrameHost, bool isRedirect, bool isMainFrame);
124     void logUserInteraction(const String& primaryDomain);
125
126     void clearUserInteraction(const String& primaryDomain);
127     bool hasHadUserInteraction(const String& primaryDomain);
128
129     void setLastSeen(const String& primaryDomain, Seconds);
130
131     void didCreateNetworkProcess();
132
133 private:
134     static bool shouldBlockAndKeepCookies(const WebCore::ResourceLoadStatistics&);
135     static bool shouldBlockAndPurgeCookies(const WebCore::ResourceLoadStatistics&);
136     static bool hasUserGrantedStorageAccessThroughPrompt(const WebCore::ResourceLoadStatistics&, const String& firstPartyPrimaryDomain);
137     bool hasHadUnexpiredRecentUserInteraction(WebCore::ResourceLoadStatistics&) const;
138     bool hasStatisticsExpired(const WebCore::ResourceLoadStatistics&) const;
139     bool wasAccessedAsFirstPartyDueToUserInteraction(const WebCore::ResourceLoadStatistics& current, const WebCore::ResourceLoadStatistics& updated) const;
140     void setPrevalentResource(WebCore::ResourceLoadStatistics&, ResourceLoadPrevalence);
141     unsigned recursivelyGetAllDomainsThatHaveRedirectedToThisDomain(const WebCore::ResourceLoadStatistics&, HashSet<String>& domainsThatHaveRedirectedTo, unsigned numberOfRecursiveCalls) const;
142     void setStorageAccessPromptsEnabled(bool enabled) { m_storageAccessPromptsEnabled  = enabled; }
143     bool shouldRemoveDataRecords() const;
144     void setDebugLogggingEnabled(bool enabled) { m_debugLoggingEnabled  = enabled; }
145     void setDataRecordsBeingRemoved(bool);
146     void scheduleStatisticsProcessingRequestIfNecessary();
147     void grantStorageAccessInternal(String&& subFrameHost, String&& topFrameHost, std::optional<uint64_t> frameID, uint64_t pageID, bool userWasPromptedNowOrEarlier, CompletionHandler<void(bool)>&&);
148     void markAsPrevalentIfHasRedirectedToPrevalent(WebCore::ResourceLoadStatistics&);
149     bool isPrevalentDueToDebugMode(WebCore::ResourceLoadStatistics&);
150     Vector<String> ensurePrevalentResourcesForDebugMode();
151     void removeDataRecords(CompletionHandler<void()>&&);
152     void pruneStatisticsIfNeeded();
153     WebCore::ResourceLoadStatistics& ensureResourceStatisticsForPrimaryDomain(const String&);
154     Vector<String> topPrivatelyControlledDomainsToRemoveWebsiteDataFor();
155     void setCacheMaxAgeCap(Seconds);
156     void updateCacheMaxAgeCap();
157     void setAgeCapForClientSideCookies(Seconds);
158     void updateClientSideCookiesAgeCap();
159
160 #if PLATFORM(COCOA)
161     void registerUserDefaultsIfNeeded();
162 #endif
163
164     struct Parameters {
165         size_t pruneEntriesDownTo { 800 };
166         size_t maxStatisticsEntries { 1000 };
167         std::optional<Seconds> timeToLiveUserInteraction;
168         Seconds minimumTimeBetweenDataRecordsRemoval { 1_h };
169         Seconds grandfatheringTime { 24_h * 7 };
170         Seconds cacheMaxAgeCapTime { 24_h * 7 };
171         Seconds clientSideCookiesAgeCapTime { 24_h * 7 };
172         bool shouldNotifyPagesWhenDataRecordsWereScanned { false };
173         bool shouldClassifyResourcesBeforeDataRecordsRemoval { true };
174         bool shouldSubmitTelemetry { true };
175     };
176
177     WebResourceLoadStatisticsStore& m_store;
178     Ref<WorkQueue> m_workQueue;
179     WeakPtr<ResourceLoadStatisticsPersistentStorage> m_persistentStorage;
180     HashMap<String, WebCore::ResourceLoadStatistics> m_resourceStatisticsMap;
181 #if HAVE(CORE_PREDICTION)
182     ResourceLoadStatisticsClassifierCocoa m_resourceLoadStatisticsClassifier;
183 #else
184     ResourceLoadStatisticsClassifier m_resourceLoadStatisticsClassifier;
185 #endif
186 #if ENABLE(NETSCAPE_PLUGIN_API)
187     HashSet<uint64_t> m_activePluginTokens;
188 #endif
189     Parameters m_parameters;
190     Vector<OperatingDate> m_operatingDates;
191     WallTime m_endOfGrandfatheringTimestamp;
192     bool m_debugLoggingEnabled { false };
193     bool m_debugModeEnabled { false };
194     String m_debugManualPrevalentResource;
195     bool m_storageAccessPromptsEnabled { false };
196     bool m_dataRecordsBeingRemoved { false };
197     MonotonicTime m_lastTimeDataRecordsWereRemoved;
198
199     uint64_t m_lastStatisticsProcessingRequestIdentifier { 0 };
200     std::optional<uint64_t> m_pendingStatisticsProcessingRequestIdentifier;
201 };
202
203 } // namespace WebKit