f94d6fd19e7746df5e683a957f0fd99a772d321a
[WebKit-https.git] / Source / WebCore / loader / ResourceLoadStatistics.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. ``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 "URL.h"
30 #include <wtf/HashCountedSet.h>
31 #include <wtf/HashSet.h>
32 #include <wtf/OptionSet.h>
33 #include <wtf/WallTime.h>
34 #include <wtf/text/StringHash.h>
35 #include <wtf/text/WTFString.h>
36
37 namespace WebCore {
38
39 class KeyedDecoder;
40 class KeyedEncoder;
41
42 struct ResourceLoadStatistics {
43     explicit ResourceLoadStatistics(const String& primaryDomain)
44         : highLevelDomain(primaryDomain)
45     {
46     }
47
48     ResourceLoadStatistics() = default;
49
50     ResourceLoadStatistics(const ResourceLoadStatistics&) = delete;
51     ResourceLoadStatistics& operator=(const ResourceLoadStatistics&) = delete;
52     ResourceLoadStatistics(ResourceLoadStatistics&&) = default;
53     ResourceLoadStatistics& operator=(ResourceLoadStatistics&&) = default;
54
55     WEBCORE_EXPORT static String primaryDomain(const URL&);
56     WEBCORE_EXPORT static String primaryDomain(StringView host);
57
58     WEBCORE_EXPORT static WallTime reduceTimeResolution(WallTime);
59
60     WEBCORE_EXPORT void encode(KeyedEncoder&) const;
61     WEBCORE_EXPORT bool decode(KeyedDecoder&, unsigned modelVersion);
62
63     WEBCORE_EXPORT String toString() const;
64
65     WEBCORE_EXPORT void merge(const ResourceLoadStatistics&);
66
67     String highLevelDomain;
68
69     WallTime lastSeen;
70     
71     // User interaction
72     bool hadUserInteraction { false };
73     // Timestamp. Default value is negative, 0 means it was reset.
74     WallTime mostRecentUserInteractionTime { WallTime::fromRawSeconds(-1) };
75     bool grandfathered { false };
76
77     // Storage access
78     HashSet<String> storageAccessUnderTopFrameOrigins;
79
80     // Top frame stats
81     HashCountedSet<String> topFrameUniqueRedirectsTo;
82     HashCountedSet<String> topFrameUniqueRedirectsFrom;
83
84     // Subframe stats
85     HashCountedSet<String> subframeUnderTopFrameOrigins;
86     
87     // Subresource stats
88     HashCountedSet<String> subresourceUnderTopFrameOrigins;
89     HashCountedSet<String> subresourceUniqueRedirectsTo;
90     HashCountedSet<String> subresourceUniqueRedirectsFrom;
91
92     // Prevalent resource stats
93     bool isPrevalentResource { false };
94     bool isVeryPrevalentResource { false };
95     unsigned dataRecordsRemoved { 0 };
96     unsigned timesAccessedAsFirstPartyDueToUserInteraction { 0 };
97     unsigned timesAccessedAsFirstPartyDueToStorageAccessAPI { 0 };
98
99     // In-memory only
100     bool isMarkedForCookieBlocking { false };
101     
102     // This set represents the registrable domain of the top frame where web API
103     // were used in the top frame or one of its subframes.
104     HashCountedSet<String> topFrameRegistrableDomainsWhichAccessedWebAPIs;
105     HashSet<String> fontsFailedToLoad;
106     HashSet<String> fontsSuccessfullyLoaded;
107     CanvasActivityRecord canvasActivityRecord;
108     enum class NavigatorAPI : uint64_t {
109         AppVersion = 1 << 0,
110         UserAgent = 1 << 1,
111         Plugins = 1 << 2,
112         MimeTypes = 1 << 3,
113         CookieEnabled = 1 << 4,
114         JavaEnabled = 1 << 5,
115     };
116     enum class ScreenAPI : uint64_t {
117         Height = 1 << 0,
118         Width = 1 << 1,
119         ColorDepth = 1 << 2,
120         PixelDepth = 1 << 3,
121         AvailLeft = 1 << 4,
122         AvailTop = 1 << 5,
123         AvailHeight = 1 << 6,
124         AvailWidth = 1 << 7,
125     };
126     OptionSet<NavigatorAPI> navigatorFunctionsAccessed;
127     OptionSet<ScreenAPI> screenFunctionsAccessed;
128 };
129
130 } // namespace WebCore