1 /* This Source Code Form is subject to the terms of the Mozilla Public
2  * License, v. 2.0. If a copy of the MPL was not distributed with this
3  * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
4 
5 #include "nsDocShellTelemetryUtils.h"
6 
7 namespace {
8 
9 using ErrorLabel = mozilla::Telemetry::LABELS_PAGE_LOAD_ERROR;
10 
11 struct LoadErrorTelemetryResult {
12   nsresult mValue;
13   ErrorLabel mLabel;
14 };
15 
16 static const LoadErrorTelemetryResult sResult[] = {
17     {
18         NS_ERROR_UNKNOWN_PROTOCOL,
19         ErrorLabel::UNKNOWN_PROTOCOL,
20     },
21     {
22         NS_ERROR_FILE_NOT_FOUND,
23         ErrorLabel::FILE_NOT_FOUND,
24     },
25     {
26         NS_ERROR_FILE_ACCESS_DENIED,
27         ErrorLabel::FILE_ACCESS_DENIED,
28     },
29     {
30         NS_ERROR_UNKNOWN_HOST,
31         ErrorLabel::UNKNOWN_HOST,
32     },
33     {
34         NS_ERROR_CONNECTION_REFUSED,
35         ErrorLabel::CONNECTION_REFUSED,
36     },
37     {
38         NS_ERROR_PROXY_BAD_GATEWAY,
39         ErrorLabel::PROXY_BAD_GATEWAY,
40     },
41     {
42         NS_ERROR_NET_INTERRUPT,
43         ErrorLabel::NET_INTERRUPT,
44     },
45     {
46         NS_ERROR_NET_TIMEOUT,
47         ErrorLabel::NET_TIMEOUT,
48     },
49     {
50         NS_ERROR_PROXY_GATEWAY_TIMEOUT,
51         ErrorLabel::P_GATEWAY_TIMEOUT,
52     },
53     {
54         NS_ERROR_CSP_FRAME_ANCESTOR_VIOLATION,
55         ErrorLabel::CSP_FRAME_ANCEST,
56     },
57     {
58         NS_ERROR_CSP_FORM_ACTION_VIOLATION,
59         ErrorLabel::CSP_FORM_ACTION,
60     },
61     {
62         NS_ERROR_CSP_NAVIGATE_TO_VIOLATION,
63         ErrorLabel::CSP_NAVIGATE_TO,
64     },
65     {
66         NS_ERROR_XFO_VIOLATION,
67         ErrorLabel::XFO_VIOLATION,
68     },
69     {
70         NS_ERROR_PHISHING_URI,
71         ErrorLabel::PHISHING_URI,
72     },
73     {
74         NS_ERROR_MALWARE_URI,
75         ErrorLabel::MALWARE_URI,
76     },
77     {
78         NS_ERROR_UNWANTED_URI,
79         ErrorLabel::UNWANTED_URI,
80     },
81     {
82         NS_ERROR_HARMFUL_URI,
83         ErrorLabel::HARMFUL_URI,
84     },
85     {
86         NS_ERROR_CONTENT_CRASHED,
87         ErrorLabel::CONTENT_CRASHED,
88     },
89     {
90         NS_ERROR_FRAME_CRASHED,
91         ErrorLabel::FRAME_CRASHED,
92     },
93     {
94         NS_ERROR_BUILDID_MISMATCH,
95         ErrorLabel::BUILDID_MISMATCH,
96     },
97     {
98         NS_ERROR_NET_RESET,
99         ErrorLabel::NET_RESET,
100     },
101     {
102         NS_ERROR_MALFORMED_URI,
103         ErrorLabel::MALFORMED_URI,
104     },
105     {
106         NS_ERROR_REDIRECT_LOOP,
107         ErrorLabel::REDIRECT_LOOP,
108     },
109     {
110         NS_ERROR_UNKNOWN_SOCKET_TYPE,
111         ErrorLabel::UNKNOWN_SOCKET,
112     },
113     {
114         NS_ERROR_DOCUMENT_NOT_CACHED,
115         ErrorLabel::DOCUMENT_N_CACHED,
116     },
117     {
118         NS_ERROR_OFFLINE,
119         ErrorLabel::OFFLINE,
120     },
121     {
122         NS_ERROR_DOCUMENT_IS_PRINTMODE,
123         ErrorLabel::DOC_PRINTMODE,
124     },
125     {
126         NS_ERROR_PORT_ACCESS_NOT_ALLOWED,
127         ErrorLabel::PORT_ACCESS,
128     },
129     {
130         NS_ERROR_UNKNOWN_PROXY_HOST,
131         ErrorLabel::UNKNOWN_PROXY_HOST,
132     },
133     {
134         NS_ERROR_PROXY_CONNECTION_REFUSED,
135         ErrorLabel::PROXY_CONNECTION,
136     },
137     {
138         NS_ERROR_PROXY_FORBIDDEN,
139         ErrorLabel::PROXY_FORBIDDEN,
140     },
141     {
142         NS_ERROR_PROXY_NOT_IMPLEMENTED,
143         ErrorLabel::P_NOT_IMPLEMENTED,
144     },
145     {
146         NS_ERROR_PROXY_AUTHENTICATION_FAILED,
147         ErrorLabel::PROXY_AUTH,
148     },
149     {
150         NS_ERROR_PROXY_TOO_MANY_REQUESTS,
151         ErrorLabel::PROXY_TOO_MANY,
152     },
153     {
154         NS_ERROR_INVALID_CONTENT_ENCODING,
155         ErrorLabel::CONTENT_ENCODING,
156     },
157     {
158         NS_ERROR_REMOTE_XUL,
159         ErrorLabel::REMOTE_XUL,
160     },
161     {
162         NS_ERROR_UNSAFE_CONTENT_TYPE,
163         ErrorLabel::UNSAFE_CONTENT,
164     },
165     {
166         NS_ERROR_CORRUPTED_CONTENT,
167         ErrorLabel::CORRUPTED_CONTENT,
168     },
169     {
170         NS_ERROR_INTERCEPTION_FAILED,
171         ErrorLabel::INTERCEPTION_FAIL,
172     },
173     {
174         NS_ERROR_NET_INADEQUATE_SECURITY,
175         ErrorLabel::INADEQUATE_SEC,
176     },
177     {
178         NS_ERROR_BLOCKED_BY_POLICY,
179         ErrorLabel::BLOCKED_BY_POLICY,
180     },
181     {
182         NS_ERROR_NET_HTTP2_SENT_GOAWAY,
183         ErrorLabel::HTTP2_SENT_GOAWAY,
184     },
185     {
186         NS_ERROR_NET_HTTP3_PROTOCOL_ERROR,
187         ErrorLabel::HTTP3_PROTOCOL,
188     },
189     {
190         NS_BINDING_FAILED,
191         ErrorLabel::BINDING_FAILED,
192     },
193 };
194 }  // anonymous namespace
195 
196 namespace mozilla {
197 namespace dom {
LoadErrorToTelemetryLabel(nsresult aRv)198 mozilla::Telemetry::LABELS_PAGE_LOAD_ERROR LoadErrorToTelemetryLabel(
199     nsresult aRv) {
200   MOZ_ASSERT(aRv != NS_OK);
201 
202   for (const auto& p : sResult) {
203     if (p.mValue == aRv) {
204       return p.mLabel;
205     }
206   }
207   return ErrorLabel::otherError;
208 }
209 }  // namespace dom
210 }  // namespace mozilla
211