[iOS] Replace "node assistance" terminology in WebKit with "focused element"
[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/ThreadSafeRefCounted.h>
33 #include <wtf/Vector.h>
34 #include <wtf/WallTime.h>
35 #include <wtf/WeakPtr.h>
36 #include <wtf/text/WTFString.h>
37
38 namespace WTF {
39 class WorkQueue;
40 }
41
42 namespace WebCore {
43 class ResourceRequest;
44 struct ResourceLoadStatistics;
45 }
46
47 namespace WebKit {
48
49 class ResourceLoadStatisticsMemoryStore;
50 class ResourceLoadStatisticsPersistentStorage;
51 class WebFrameProxy;
52 class WebProcessProxy;
53 class WebsiteDataStore;
54
55 enum class StorageAccessStatus {
56     CannotRequestAccess,
57     RequiresUserPrompt,
58     HasAccess
59 };
60
61 class WebResourceLoadStatisticsStore final : public ThreadSafeRefCounted<WebResourceLoadStatisticsStore, WTF::DestructionThread::Main>, public IPC::MessageReceiver {
62 public:
63     static Ref<WebResourceLoadStatisticsStore> create(WebsiteDataStore& websiteDataStore)
64     {
65         return adoptRef(*new WebResourceLoadStatisticsStore(websiteDataStore));
66     }
67
68     ~WebResourceLoadStatisticsStore();
69
70     static const OptionSet<WebsiteDataType>& monitoredDataTypes();
71
72     WorkQueue& statisticsQueue() { return m_statisticsQueue.get(); }
73
74     void setNotifyPagesWhenDataRecordsWereScanned(bool);
75     void setShouldClassifyResourcesBeforeDataRecordsRemoval(bool);
76     void setShouldSubmitTelemetry(bool);
77
78     void hasStorageAccess(String&& subFrameHost, String&& topFrameHost, uint64_t frameID, uint64_t pageID, CompletionHandler<void(bool)>&& callback);
79     void requestStorageAccess(String&& subFrameHost, String&& topFrameHost, uint64_t frameID, uint64_t pageID, bool promptEnabled, CompletionHandler<void(StorageAccessStatus)>&&);
80     void grantStorageAccess(String&& subFrameHost, String&& topFrameHost, uint64_t frameID, uint64_t pageID, bool userWasPromptedNow, CompletionHandler<void(bool)>&&);
81     void requestStorageAccessCallback(bool wasGranted, uint64_t contextId);
82
83     void applicationWillTerminate();
84
85     void logFrameNavigation(const WebFrameProxy&, const URL& pageURL, const WebCore::ResourceRequest&, const URL& redirectURL);
86     void logUserInteraction(const URL&, CompletionHandler<void()>&&);
87     void clearUserInteraction(const URL&, CompletionHandler<void()>&&);
88     void hasHadUserInteraction(const URL&, CompletionHandler<void(bool)>&&);
89     void setLastSeen(const URL&, Seconds, CompletionHandler<void()>&&);
90     void setPrevalentResource(const URL&, CompletionHandler<void()>&&);
91     void setVeryPrevalentResource(const URL&, CompletionHandler<void()>&&);
92     void dumpResourceLoadStatistics(CompletionHandler<void(const String&)>&&);
93     void isPrevalentResource(const URL&, CompletionHandler<void(bool)>&&);
94     void isVeryPrevalentResource(const URL&, CompletionHandler<void(bool)>&&);
95     void isRegisteredAsSubresourceUnder(const URL& subresource, const URL& topFrame, CompletionHandler<void(bool)>&&);
96     void isRegisteredAsSubFrameUnder(const URL& subFrame, const URL& topFrame, CompletionHandler<void(bool)>&&);
97     void isRegisteredAsRedirectingTo(const URL& hostRedirectedFrom, const URL& hostRedirectedTo, CompletionHandler<void(bool)>&&);
98     void clearPrevalentResource(const URL&, CompletionHandler<void()>&&);
99     void setGrandfathered(const URL&, bool);
100     void isGrandfathered(const URL&, CompletionHandler<void(bool)>&&);
101     void setSubframeUnderTopFrameOrigin(const URL& subframe, const URL& topFrame);
102     void setSubresourceUnderTopFrameOrigin(const URL& subresource, const URL& topFrame);
103     void setSubresourceUniqueRedirectTo(const URL& subresource, const URL& hostNameRedirectedTo);
104     void setSubresourceUniqueRedirectFrom(const URL& subresource, const URL& hostNameRedirectedFrom);
105     void setTopFrameUniqueRedirectTo(const URL& topFrameHostName, const URL& hostNameRedirectedTo);
106     void setTopFrameUniqueRedirectFrom(const URL& topFrameHostName, const URL& hostNameRedirectedFrom);
107     void scheduleCookieBlockingUpdate(CompletionHandler<void()>&&);
108     void scheduleCookieBlockingUpdateForDomains(const Vector<String>& domainsToBlock, CompletionHandler<void()>&&);
109     void scheduleClearBlockingStateForDomains(const Vector<String>& domains, CompletionHandler<void()>&&);
110     void scheduleStatisticsAndDataRecordsProcessing();
111     void submitTelemetry();
112
113     enum class ShouldGrandfather {
114         No,
115         Yes,
116     };
117     void scheduleClearInMemoryAndPersistent(ShouldGrandfather, CompletionHandler<void()>&&);
118     void scheduleClearInMemoryAndPersistent(WallTime modifiedSince, ShouldGrandfather, CompletionHandler<void()>&&);
119
120     void setTimeToLiveUserInteraction(Seconds);
121     void setMinimumTimeBetweenDataRecordsRemoval(Seconds);
122     void setGrandfatheringTime(Seconds);
123     void setCacheMaxAgeCap(Seconds, CompletionHandler<void()>&&);
124     void setMaxStatisticsEntries(size_t);
125     void setPruneEntriesDownTo(size_t);
126
127     void resetParametersToDefaultValues(CompletionHandler<void()>&&);
128
129     void setResourceLoadStatisticsDebugMode(bool, CompletionHandler<void()>&&);
130     void setPrevalentResourceForDebugMode(const URL&, CompletionHandler<void()>&&);
131     
132     void setStatisticsTestingCallback(WTF::Function<void(const String&)>&& callback) { m_statisticsTestingCallback = WTFMove(callback); }
133     void logTestingEvent(const String&);
134     void callGrantStorageAccessHandler(const String& subFramePrimaryDomain, const String& topFramePrimaryDomain, Optional<uint64_t> frameID, uint64_t pageID, CompletionHandler<void(bool)>&&);
135     void removeAllStorageAccess(CompletionHandler<void()>&&);
136     void callUpdatePrevalentDomainsToBlockCookiesForHandler(const Vector<String>& domainsToBlock, CompletionHandler<void()>&&);
137     void callRemoveDomainsHandler(const Vector<String>& domains);
138     void callHasStorageAccessForFrameHandler(const String& resourceDomain, const String& firstPartyDomain, uint64_t frameID, uint64_t pageID, CompletionHandler<void(bool)>&&);
139
140     void didCreateNetworkProcess();
141
142     WebsiteDataStore* websiteDataStore() { return m_websiteDataStore.get(); }
143
144 private:
145     explicit WebResourceLoadStatisticsStore(WebsiteDataStore&);
146
147     void postTask(WTF::Function<void()>&&);
148     static void postTaskReply(WTF::Function<void()>&&);
149
150     // IPC::MessageReceiver.
151     void didReceiveMessage(IPC::Connection&, IPC::Decoder&) override;
152
153     // IPC message handlers.
154     void resourceLoadStatisticsUpdated(Vector<WebCore::ResourceLoadStatistics>&& origins);
155     void requestStorageAccessUnderOpener(String&& primaryDomainInNeedOfStorageAccess, uint64_t openerPageID, String&& openerPrimaryDomain);
156
157     void performDailyTasks();
158
159     StorageAccessStatus storageAccessStatus(const String& subFramePrimaryDomain, const String& topFramePrimaryDomain);
160
161     void flushAndDestroyPersistentStore();
162
163     WeakPtr<WebsiteDataStore> m_websiteDataStore;
164     Ref<WorkQueue> m_statisticsQueue;
165     std::unique_ptr<ResourceLoadStatisticsMemoryStore> m_memoryStore;
166     std::unique_ptr<ResourceLoadStatisticsPersistentStorage> m_persistentStorage;
167
168     RunLoop::Timer<WebResourceLoadStatisticsStore> m_dailyTasksTimer;
169
170     bool m_hasScheduledProcessStats { false };
171
172     WTF::Function<void(const String&)> m_statisticsTestingCallback;
173
174     bool m_firstNetworkProcessCreated { false };
175 };
176
177 } // namespace WebKit