Move URL from WebCore to WTF
[WebKit-https.git] / Source / WebCore / loader / ResourceLoadObserver.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. ``AS IS'' AND ANY
14  * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
15  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
16  * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE INC. OR
17  * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
18  * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
19  * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
20  * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
21  * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
22  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
23  * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
24  */
25
26 #pragma once
27
28 #include "CanvasActivityRecord.h"
29 #include "ResourceLoadStatistics.h"
30 #include "Timer.h"
31 #include <wtf/HashMap.h>
32 #include <wtf/HashSet.h>
33 #include <wtf/NeverDestroyed.h>
34 #include <wtf/text/WTFString.h>
35
36 namespace WTF {
37 class Lock;
38 class WorkQueue;
39 class WallTime;
40 }
41
42 namespace WebCore {
43
44 class Document;
45 class Frame;
46 class Page;
47 class ResourceRequest;
48 class ResourceResponse;
49 class ScriptExecutionContext;
50
51 struct ResourceLoadStatistics;
52
53 class ResourceLoadObserver {
54     friend class WTF::NeverDestroyed<ResourceLoadObserver>;
55 public:
56     WEBCORE_EXPORT static ResourceLoadObserver& shared();
57
58     void logSubresourceLoading(const Frame*, const ResourceRequest& newRequest, const ResourceResponse& redirectResponse);
59     void logWebSocketLoading(const URL& targetURL, const URL& mainFrameURL, bool usesEphemeralSession);
60     void logUserInteractionWithReducedTimeResolution(const Document&);
61     
62     void logFontLoad(const Document&, const String& familyName, bool loadStatus);
63     void logCanvasRead(const Document&);
64     void logCanvasWriteOrMeasure(const Document&, const String& textWritten);
65     void logNavigatorAPIAccessed(const Document&, const ResourceLoadStatistics::NavigatorAPI);
66     void logScreenAPIAccessed(const Document&, const ResourceLoadStatistics::ScreenAPI);
67
68     WEBCORE_EXPORT String statisticsForOrigin(const String&);
69
70     WEBCORE_EXPORT void setNotificationCallback(WTF::Function<void (Vector<ResourceLoadStatistics>&&)>&&);
71     WEBCORE_EXPORT void setRequestStorageAccessUnderOpenerCallback(WTF::Function<void(const String&, uint64_t, const String&)>&&);
72
73     WEBCORE_EXPORT void notifyObserver();
74     WEBCORE_EXPORT void clearState();
75
76 #if ENABLE(RESOURCE_LOAD_STATISTICS) && !RELEASE_LOG_DISABLED
77     bool shouldLogUserInteraction() const { return m_shouldLogUserInteraction; }
78     void setShouldLogUserInteraction(bool shouldLogUserInteraction) { m_shouldLogUserInteraction = shouldLogUserInteraction; }
79 #endif
80
81 private:
82     ResourceLoadObserver();
83
84     bool shouldLog(bool usesEphemeralSession) const;
85     ResourceLoadStatistics& ensureResourceStatisticsForPrimaryDomain(const String&);
86
87     void scheduleNotificationIfNeeded();
88     Vector<ResourceLoadStatistics> takeStatistics();
89
90 #if ENABLE(RESOURCE_LOAD_STATISTICS)
91     void requestStorageAccessUnderOpener(const String& domainInNeedOfStorageAccess, uint64_t openerPageID, Document& openerDocument);
92 #endif
93
94     HashMap<String, ResourceLoadStatistics> m_resourceStatisticsMap;
95     HashMap<String, WTF::WallTime> m_lastReportedUserInteractionMap;
96     WTF::Function<void (Vector<ResourceLoadStatistics>&&)> m_notificationCallback;
97     WTF::Function<void(const String&, uint64_t, const String&)> m_requestStorageAccessUnderOpenerCallback;
98     Timer m_notificationTimer;
99 #if ENABLE(RESOURCE_LOAD_STATISTICS) && !RELEASE_LOG_DISABLED
100     uint64_t m_loggingCounter { 0 };
101     bool m_shouldLogUserInteraction { false };
102 #endif
103
104     URL nonNullOwnerURL(const Document&) const;
105 };
106     
107 } // namespace WebCore