diff --git a/dom/base/ContentBlockingLog.h b/dom/base/ContentBlockingLog.h index 7ec955964ed9..2843a988b2a0 100644 --- a/dom/base/ContentBlockingLog.h +++ b/dom/base/ContentBlockingLog.h @@ -30,7 +30,8 @@ class ContentBlockingLog final // Each element is a tuple of (type, blocked, repeatCount). The type values // come from the blocking types defined in nsIWebProgressListener. typedef nsTArray OriginLog; - typedef nsClassHashtable OriginLogHashTable; + typedef Pair OriginData; + typedef nsClassHashtable OriginDataHashTable; struct StringWriteFunc : public JSONWriteFunc { @@ -56,9 +57,14 @@ public: } auto entry = mLog.LookupForAdd(aOrigin); if (entry) { - auto& log = entry.Data(); - if (!log->IsEmpty()) { - auto& last = log->LastElement(); + auto& data = entry.Data(); + if (aType == nsIWebProgressListener::STATE_LOADED_TRACKING_CONTENT) { + data->first() = aBlocked; + return; + } + auto& log = data->second(); + if (!log.IsEmpty()) { + auto& last = log.LastElement(); if (last.mType == aType && last.mBlocked == aBlocked) { ++last.mRepeatCount; @@ -66,17 +72,21 @@ public: return; } } - if (log->Length() == + if (log.Length() == std::max(1u, StaticPrefs::browser_contentblocking_originlog_length())) { // Cap the size at the maximum length adjustable by the pref - log->RemoveElementAt(0); + log.RemoveElementAt(0); } - log->AppendElement(LogEntry{aType, 1u, aBlocked}); + log.AppendElement(LogEntry{aType, 1u, aBlocked}); } else { entry.OrInsert([=] { - auto log(MakeUnique()); - log->AppendElement(LogEntry{aType, 1u, aBlocked}); - return log.release(); + nsAutoPtr data(new OriginData(false, OriginLog())); + if (aType == nsIWebProgressListener::STATE_LOADED_TRACKING_CONTENT) { + data->first() = true; + } else { + data->second().AppendElement(LogEntry{aType, 1u, aBlocked}); + } + return data.forget(); }); } } @@ -96,7 +106,17 @@ public: } w.StartArrayProperty(NS_ConvertUTF16toUTF8(iter.Key()).get(), w.SingleLineStyle); - for (auto& item: *iter.UserData()) { + auto& data = *iter.UserData(); + if (data.first()) { + w.StartArrayElement(w.SingleLineStyle); + { + w.IntElement(nsIWebProgressListener::STATE_LOADED_TRACKING_CONTENT); + w.BoolElement(true); // blocked + w.IntElement(1); // repeat count + } + w.EndArray(); + } + for (auto& item: data.second()) { w.StartArrayElement(w.SingleLineStyle); { w.IntElement(item.mType); @@ -120,10 +140,16 @@ public: continue; } - for (auto& item: *iter.UserData()) { - if ((item.mType & aType) != 0) { + if (aType == nsIWebProgressListener::STATE_LOADED_TRACKING_CONTENT) { + if (iter.UserData()->first()) { return true; } + } else { + for (auto& item: iter.UserData()->second()) { + if ((item.mType & aType) != 0) { + return true; + } + } } } return false; @@ -136,17 +162,17 @@ public: // Now add the sizes of each origin log queue. // The const_cast is needed because the nsTHashtable::Iterator interface is // not const-safe. :-( - for (auto iter = const_cast(mLog).Iter(); + for (auto iter = const_cast(mLog).Iter(); !iter.Done(); iter.Next()) { if (iter.UserData()) { aSizes.mDOMOtherSize += - iter.UserData()->ShallowSizeOfIncludingThis(aSizes.mState.mMallocSizeOf); + iter.UserData()->second().ShallowSizeOfIncludingThis(aSizes.mState.mMallocSizeOf); } } } private: - OriginLogHashTable mLog; + OriginDataHashTable mLog; }; } // namespace dom diff --git a/toolkit/components/antitracking/test/browser/browser_subResources.js b/toolkit/components/antitracking/test/browser/browser_subResources.js index ae52c2143713..21285963b255 100644 --- a/toolkit/components/antitracking/test/browser/browser_subResources.js +++ b/toolkit/components/antitracking/test/browser/browser_subResources.js @@ -156,55 +156,29 @@ add_task(async function() { is(text, 1, "One cookie received received for scripts."); }); - let expectTrackerFound = item => { - is(item[0], Ci.nsIWebProgressListener.STATE_LOADED_TRACKING_CONTENT, - "Correct blocking type reported"); - is(item[1], true, - "Correct blocking status reported"); - ok(item[2] >= 1, - "Correct repeat count reported"); - }; - let log = JSON.parse(await browser.getContentBlockingLog()); for (let trackerOrigin in log) { is(trackerOrigin, TEST_3RD_PARTY_DOMAIN, "Correct tracker origin must be reported"); let originLog = log[trackerOrigin]; - is(originLog.length, 10, "We should have 10 entries in the compressed log"); - expectTrackerFound(originLog[0]); + is(originLog.length, 3, "We should have 3 entries in the compressed log"); + is(originLog[0][0], Ci.nsIWebProgressListener.STATE_LOADED_TRACKING_CONTENT, + "Correct blocking type reported"); + is(originLog[0][1], true, + "Correct blocking status reported"); + ok(originLog[0][2] >= 1, + "Correct repeat count reported"); is(originLog[1][0], Ci.nsIWebProgressListener.STATE_COOKIES_BLOCKED_TRACKER, "Correct blocking type reported"); is(originLog[1][1], true, "Correct blocking status reported"); - is(originLog[1][2], 1, + is(originLog[1][2], 6, "Correct repeat count reported"); - expectTrackerFound(originLog[2]); - is(originLog[3][0], Ci.nsIWebProgressListener.STATE_COOKIES_BLOCKED_TRACKER, + is(originLog[2][0], Ci.nsIWebProgressListener.STATE_COOKIES_BLOCKED_TRACKER, "Correct blocking type reported"); - is(originLog[3][1], true, + is(originLog[2][1], false, "Correct blocking status reported"); - is(originLog[3][2], 1, + ok(originLog[2][2] >= 1, "Correct repeat count reported"); - expectTrackerFound(originLog[4]); - is(originLog[5][0], Ci.nsIWebProgressListener.STATE_COOKIES_BLOCKED_TRACKER, - "Correct blocking type reported"); - is(originLog[5][1], true, - "Correct blocking status reported"); - is(originLog[5][2], 1, - "Correct repeat count reported"); - expectTrackerFound(originLog[6]); - is(originLog[7][0], Ci.nsIWebProgressListener.STATE_COOKIES_BLOCKED_TRACKER, - "Correct blocking type reported"); - is(originLog[7][1], true, - "Correct blocking status reported"); - is(originLog[7][2], 3, - "Correct repeat count reported"); - is(originLog[8][0], Ci.nsIWebProgressListener.STATE_COOKIES_BLOCKED_TRACKER, - "Correct blocking type reported"); - is(originLog[8][1], false, - "Correct blocking status reported"); - is(originLog[8][2], 1, - "Correct repeat count reported"); - expectTrackerFound(originLog[9]); } info("Removing the tab");