Move URL from WebCore to WTF
[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 <wtf/HashCountedSet.h>
30 #include <wtf/HashSet.h>
31 #include <wtf/OptionSet.h>
32 #include <wtf/URL.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     // This set represents the registrable domain of the top frame where web API
100     // were used in the top frame or one of its subframes.
101     HashCountedSet<String> topFrameRegistrableDomainsWhichAccessedWebAPIs;
102     HashSet<String> fontsFailedToLoad;
103     HashSet<String> fontsSuccessfullyLoaded;
104     CanvasActivityRecord canvasActivityRecord;
105     enum class NavigatorAPI : uint64_t {
106         AppVersion = 1 << 0,
107         UserAgent = 1 << 1,
108         Plugins = 1 << 2,
109         MimeTypes = 1 << 3,
110         CookieEnabled = 1 << 4,
111         JavaEnabled = 1 << 5,
112     };
113     enum class ScreenAPI : uint64_t {
114         Height = 1 << 0,
115         Width = 1 << 1,
116         ColorDepth = 1 << 2,
117         PixelDepth = 1 << 3,
118         AvailLeft = 1 << 4,
119         AvailTop = 1 << 5,
120         AvailHeight = 1 << 6,
121         AvailWidth = 1 << 7,
122     };
123     OptionSet<NavigatorAPI> navigatorFunctionsAccessed;
124     OptionSet<ScreenAPI> screenFunctionsAccessed;
125 };
126
127 } // namespace WebCore