/* This Source Code Form is subject to the terms of the Mozilla Public * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ #ifndef mozilla_netwerk_protocol_http_HttpTrafficAnalyzer_h #define mozilla_netwerk_protocol_http_HttpTrafficAnalyzer_h #include #include "nsTArrayForwardDeclare.h" // Type A) Parser blocking script loads will have an mContentPolicyType // indicating a script load and a nsIClassOfService::Leader class of // service. // Type B) I couldn’t find a class flag that corresponds to synchronous loads // that block the load event, but I think a simple way to determine // which ones they are is to examine whether the channel belongs to a // load group and do not have a LOAD_BACKGROUND load flag. // If that condition holds, then it is blocking the load event of some // document. // Type C) I think a simple way to find channels that don’t block document loads // (e.g. XHR and fetch) is to look for those which are in a load group // and have a LOAD_BACKGROUND load flag. #define FOR_EACH_HTTP_TRAFFIC_CATEGORY(DEFINE_CATEGORY) \ /* Y=0 - all system principal connections. */ \ DEFINE_CATEGORY(N1Sys, 0) \ /* Y=1 - all requests/connections/bytes that are first party. */ \ DEFINE_CATEGORY(N1, 1) \ /* Y=2 - all requests/connections/bytes that are third party but don’t fall \ * into other categories */ \ DEFINE_CATEGORY(N3Oth, 2) \ /* Y=3 - all requests/connections/bytes associated with third party loads \ * that match the Analytics/Social/Advertising (Basic) Category and have a \ * load of type (A) */ \ DEFINE_CATEGORY(N3BasicLead, 3) \ /* Y=4 - all requests/connections/bytes associated with third party loads \ * that match the Analytics/Social/Advertising (Basic) Category and have a \ * load of type (B) */ \ DEFINE_CATEGORY(N3BasicBg, 4) \ /* Y=5 - all requests/connections/bytes associated with third party loads \ * that match the Analytics/Social/Advertising (Basic) Category and have a \ * load of type (C) */ \ DEFINE_CATEGORY(N3BasicOth, 5) \ /* Y=6 - all requests/connections/bytes associated with third party loads \ * that match the Content Category and have a load of type (A) */ \ DEFINE_CATEGORY(N3ContentLead, 6) \ /* Y=7 - all requests/connections/bytes associated with third party loads \ * that match the Content Category and have a load of type (B) */ \ DEFINE_CATEGORY(N3ContentBg, 7) \ /* Y=8 - all requests/connections/bytes associated with third party loads \ * that match the Content Category and have a load of type (C) */ \ DEFINE_CATEGORY(N3ContentOth, 8) \ /* Y=9 - all requests/connections/bytes associated with third party loads \ * that match the Fingerprinting Category and have a load of type (A) */ \ DEFINE_CATEGORY(N3FpLead, 9) \ /* Y=10 - all requests/connections/bytes associated with third party loads \ * that match the Fingerprinting Category and have a load of type (B) */ \ DEFINE_CATEGORY(N3FpBg, 10) \ /* Y=11 - all requests/connections/bytes associated with third party loads \ * that match the Fingerprinting Category and have a load of type (C) */ \ DEFINE_CATEGORY(N3FpOth, 11) \ /* Y=12 - private mode system principal connections. */ \ DEFINE_CATEGORY(P1Sys, 12) \ /* Y=13 - private mode and all requests/connections/bytes that are first \ * party. */ \ DEFINE_CATEGORY(P1, 13) \ /* Y=14 - private mode and all requests/connections/bytes that are third \ * party but don’t fall into other categories */ \ DEFINE_CATEGORY(P3Oth, 14) \ /* Y=15 - private mode and all requests/connections/bytes associated with \ * third party loads that match the Analytics/Social/Advertising (Basic) \ * Category and have a load of type (A) */ \ DEFINE_CATEGORY(P3BasicLead, 15) \ /* Y=16 - private mode and all requests/connections/bytes associated with \ * third party loads that match the Analytics/Social/Advertising (Basic) \ * Category and have a load of type (B) */ \ DEFINE_CATEGORY(P3BasicBg, 16) \ /* Y=17 - private mode and all requests/connections/bytes associated with \ * third party loads that match the Analytics/Social/Advertising (Basic) \ * Category and have a load of type (C) */ \ DEFINE_CATEGORY(P3BasicOth, 17) \ /* Y=18 - private mode and all requests/connections/bytes associated with \ * third party loads that match the Content Category and have a load of type \ * (A) */ \ DEFINE_CATEGORY(P3ContentLead, 18) \ /* Y=19 - private mode and all requests/connections/bytes associated with \ * third party loads that match the Content Category and have a load of type \ * (B) */ \ DEFINE_CATEGORY(P3ContentBg, 19) \ /* Y=20 - private mode and all requests/connections/bytes associated with \ * third party loads that match the Content Category and have a load of type \ * (C) */ \ DEFINE_CATEGORY(P3ContentOth, 20) \ /* Y=21 - private mode and all requests/connections/bytes associated with \ * third party loads that match the Fingerprinting Category and have a load \ * of type (A) */ \ DEFINE_CATEGORY(P3FpLead, 21) \ /* Y=22 - private mode and all requests/connections/bytes associated with \ * third party loads that match the Fingerprinting Category and have a load \ * of type (B) */ \ DEFINE_CATEGORY(P3FpBg, 22) \ /* Y=23 - private mode and all requests/connections/bytes associated with \ * third party loads that match the Fingerprinting Category and have a load \ * of type (C) */ \ DEFINE_CATEGORY(P3FpOth, 23) namespace mozilla { namespace net { #define DEFINE_CATEGORY(_name, _idx) e##_name = _idx##u, enum HttpTrafficCategory : uint8_t { FOR_EACH_HTTP_TRAFFIC_CATEGORY(DEFINE_CATEGORY) eInvalid, }; #undef DEFINE_CATEGORY class HttpTrafficAnalyzer final { public: enum ClassOfService : uint8_t { eLeader = 0, eBackground = 1, eOther = 255, }; enum TrackingClassification : uint8_t { eNone = 0, eBasic = 1, eContent = 2, eFingerprinting = 3, }; static HttpTrafficCategory CreateTrafficCategory( bool aIsPrivateMode, bool aIsSystemPrincipal, bool aIsThirdParty, ClassOfService aClassOfService, TrackingClassification aClassification); void IncrementHttpTransaction(HttpTrafficCategory aCategory); void IncrementHttpConnection(HttpTrafficCategory aCategory); void IncrementHttpConnection(nsTArray&& aCategories); void AccumulateHttpTransferredSize(HttpTrafficCategory aCategory, uint64_t aBytesRead, uint64_t aBytesSent); }; } // namespace net } // namespace mozilla #endif // mozilla_netwerk_protocol_http_HttpTrafficAnalyzer_h