зеркало из https://github.com/mozilla/gecko-dev.git
Backed out changeset 5f53c5571125 (bug 1523878) for autobinscope.py bustages.
This commit is contained in:
Родитель
b9f9b240f5
Коммит
d958723822
|
@ -26,22 +26,11 @@ class ContentBlockingLog final {
|
|||
bool mBlocked;
|
||||
};
|
||||
|
||||
struct OriginDataEntry {
|
||||
OriginDataEntry() : mHasTrackingContentLoaded(false) {}
|
||||
|
||||
bool mHasTrackingContentLoaded;
|
||||
Maybe<bool> mHasCookiesLoaded;
|
||||
nsTArray<LogEntry> mLogs;
|
||||
};
|
||||
|
||||
struct OriginEntry {
|
||||
OriginEntry() { mData = MakeUnique<OriginDataEntry>(); }
|
||||
|
||||
nsCString mOrigin;
|
||||
UniquePtr<OriginDataEntry> mData;
|
||||
};
|
||||
|
||||
typedef nsTArray<OriginEntry> OriginDataTable;
|
||||
// Each element is a tuple of (type, blocked, repeatCount). The type values
|
||||
// come from the blocking types defined in nsIWebProgressListener.
|
||||
typedef nsTArray<LogEntry> OriginLog;
|
||||
typedef Tuple<bool, Maybe<bool>, OriginLog> OriginData;
|
||||
typedef nsTArray<Tuple<nsCString, UniquePtr<OriginData>>> OriginDataTable;
|
||||
|
||||
struct StringWriteFunc : public JSONWriteFunc {
|
||||
nsACString&
|
||||
|
@ -55,12 +44,12 @@ class ContentBlockingLog final {
|
|||
public:
|
||||
bool Equals(const OriginDataTable::elem_type& aLeft,
|
||||
const OriginDataTable::elem_type& aRight) const {
|
||||
return aLeft.mOrigin.Equals(aRight.mOrigin);
|
||||
return Get<0>(aLeft).Equals(Get<0>(aRight));
|
||||
}
|
||||
|
||||
bool Equals(const OriginDataTable::elem_type& aLeft,
|
||||
const nsACString& aRight) const {
|
||||
return aLeft.mOrigin.Equals(aRight);
|
||||
return Get<0>(aLeft).Equals(aRight);
|
||||
}
|
||||
};
|
||||
|
||||
|
@ -74,57 +63,51 @@ class ContentBlockingLog final {
|
|||
}
|
||||
auto index = mLog.IndexOf(aOrigin, 0, Comparator());
|
||||
if (index != OriginDataTable::NoIndex) {
|
||||
OriginEntry& entry = mLog[index];
|
||||
if (!entry.mData) {
|
||||
return;
|
||||
}
|
||||
|
||||
auto& data = Get<1>(mLog[index]);
|
||||
if (aType == nsIWebProgressListener::STATE_LOADED_TRACKING_CONTENT) {
|
||||
entry.mData->mHasTrackingContentLoaded = aBlocked;
|
||||
Get<0>(*data) = aBlocked;
|
||||
return;
|
||||
}
|
||||
if (aType == nsIWebProgressListener::STATE_COOKIES_LOADED) {
|
||||
if (entry.mData->mHasCookiesLoaded.isSome()) {
|
||||
entry.mData->mHasCookiesLoaded.ref() = aBlocked;
|
||||
if (Get<1>(*data).isSome()) {
|
||||
Get<1>(*data).ref() = aBlocked;
|
||||
} else {
|
||||
entry.mData->mHasCookiesLoaded.emplace(aBlocked);
|
||||
Get<1>(*data).emplace(aBlocked);
|
||||
}
|
||||
return;
|
||||
}
|
||||
if (!entry.mData->mLogs.IsEmpty()) {
|
||||
auto& last = entry.mData->mLogs.LastElement();
|
||||
auto& log = Get<2>(*data);
|
||||
if (!log.IsEmpty()) {
|
||||
auto& last = log.LastElement();
|
||||
if (last.mType == aType && last.mBlocked == aBlocked) {
|
||||
++last.mRepeatCount;
|
||||
// Don't record recorded events. This helps compress our log.
|
||||
return;
|
||||
}
|
||||
}
|
||||
if (entry.mData->mLogs.Length() ==
|
||||
if (log.Length() ==
|
||||
std::max(1u,
|
||||
StaticPrefs::browser_contentblocking_originlog_length())) {
|
||||
// Cap the size at the maximum length adjustable by the pref
|
||||
entry.mData->mLogs.RemoveElementAt(0);
|
||||
log.RemoveElementAt(0);
|
||||
}
|
||||
entry.mData->mLogs.AppendElement(LogEntry{aType, 1u, aBlocked});
|
||||
return;
|
||||
}
|
||||
|
||||
// The entry has not been found.
|
||||
|
||||
OriginEntry* entry = mLog.AppendElement();
|
||||
if (NS_WARN_IF(!entry || !entry->mData)) {
|
||||
return;
|
||||
}
|
||||
|
||||
entry->mOrigin = aOrigin;
|
||||
|
||||
if (aType == nsIWebProgressListener::STATE_LOADED_TRACKING_CONTENT) {
|
||||
entry->mData->mHasTrackingContentLoaded = aBlocked;
|
||||
} else if (aType == nsIWebProgressListener::STATE_COOKIES_LOADED) {
|
||||
MOZ_ASSERT(entry->mData->mHasCookiesLoaded.isNothing());
|
||||
entry->mData->mHasCookiesLoaded.emplace(aBlocked);
|
||||
log.AppendElement(LogEntry{aType, 1u, aBlocked});
|
||||
} else {
|
||||
entry->mData->mLogs.AppendElement(LogEntry{aType, 1u, aBlocked});
|
||||
auto data = MakeUnique<OriginData>(false, Maybe<bool>(), OriginLog());
|
||||
if (aType == nsIWebProgressListener::STATE_LOADED_TRACKING_CONTENT) {
|
||||
Get<0>(*data) = aBlocked;
|
||||
} else if (aType == nsIWebProgressListener::STATE_COOKIES_LOADED) {
|
||||
if (Get<1>(*data).isSome()) {
|
||||
Get<1>(*data).ref() = aBlocked;
|
||||
} else {
|
||||
Get<1>(*data).emplace(aBlocked);
|
||||
}
|
||||
} else {
|
||||
Get<2>(*data).AppendElement(LogEntry{aType, 1u, aBlocked});
|
||||
}
|
||||
nsAutoCString origin(aOrigin);
|
||||
mLog.AppendElement(Tuple<nsCString, UniquePtr<OriginData>>(
|
||||
std::move(origin), std::move(data)));
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -134,14 +117,17 @@ class ContentBlockingLog final {
|
|||
JSONWriter w(MakeUnique<StringWriteFunc>(buffer));
|
||||
w.Start();
|
||||
|
||||
for (const OriginEntry& entry : mLog) {
|
||||
if (!entry.mData) {
|
||||
const auto end = mLog.end();
|
||||
for (auto iter = mLog.begin(); iter != end; ++iter) {
|
||||
if (!Get<1>(*iter)) {
|
||||
w.StartArrayProperty(Get<0>(*iter).get(), w.SingleLineStyle);
|
||||
w.EndArray();
|
||||
continue;
|
||||
}
|
||||
|
||||
w.StartArrayProperty(entry.mOrigin.get(), w.SingleLineStyle);
|
||||
|
||||
if (entry.mData->mHasTrackingContentLoaded) {
|
||||
w.StartArrayProperty(Get<0>(*iter).get(), w.SingleLineStyle);
|
||||
auto& data = Get<1>(*iter);
|
||||
if (Get<0>(*data)) {
|
||||
w.StartArrayElement(w.SingleLineStyle);
|
||||
{
|
||||
w.IntElement(nsIWebProgressListener::STATE_LOADED_TRACKING_CONTENT);
|
||||
|
@ -150,16 +136,16 @@ class ContentBlockingLog final {
|
|||
}
|
||||
w.EndArray();
|
||||
}
|
||||
if (entry.mData->mHasCookiesLoaded.isSome()) {
|
||||
if (Get<1>(*data).isSome()) {
|
||||
w.StartArrayElement(w.SingleLineStyle);
|
||||
{
|
||||
w.IntElement(nsIWebProgressListener::STATE_COOKIES_LOADED);
|
||||
w.BoolElement(entry.mData->mHasCookiesLoaded.value()); // blocked
|
||||
w.IntElement(1); // repeat count
|
||||
w.BoolElement(Get<1>(*data).value()); // blocked
|
||||
w.IntElement(1); // repeat count
|
||||
}
|
||||
w.EndArray();
|
||||
}
|
||||
for (const LogEntry& item : entry.mData->mLogs) {
|
||||
for (auto& item : Get<2>(*data)) {
|
||||
w.StartArrayElement(w.SingleLineStyle);
|
||||
{
|
||||
w.IntElement(item.mType);
|
||||
|
@ -176,27 +162,27 @@ class ContentBlockingLog final {
|
|||
return buffer;
|
||||
}
|
||||
|
||||
bool HasBlockedAnyOfType(uint32_t aType) const {
|
||||
bool HasBlockedAnyOfType(uint32_t aType) {
|
||||
// Note: nothing inside this loop should return false, the goal for the
|
||||
// loop is to scan the log to see if we find a matching entry, and if so
|
||||
// we would return true, otherwise in the end of the function outside of
|
||||
// the loop we take the common `return false;` statement.
|
||||
for (const OriginEntry& entry : mLog) {
|
||||
if (!entry.mData) {
|
||||
const auto end = mLog.end();
|
||||
for (auto iter = mLog.begin(); iter != end; ++iter) {
|
||||
if (!Get<1>(*iter)) {
|
||||
continue;
|
||||
}
|
||||
|
||||
if (aType == nsIWebProgressListener::STATE_LOADED_TRACKING_CONTENT) {
|
||||
if (entry.mData->mHasTrackingContentLoaded) {
|
||||
if (Get<0>(*Get<1>(*iter))) {
|
||||
return true;
|
||||
}
|
||||
} else if (aType == nsIWebProgressListener::STATE_COOKIES_LOADED) {
|
||||
if (entry.mData->mHasCookiesLoaded.isSome() &&
|
||||
entry.mData->mHasCookiesLoaded.value()) {
|
||||
if (Get<1>(*Get<1>(*iter)).isSome() && Get<1>(*Get<1>(*iter)).value()) {
|
||||
return true;
|
||||
}
|
||||
} else {
|
||||
for (const auto& item : entry.mData->mLogs) {
|
||||
for (auto& item : Get<2>(*Get<1>(*iter))) {
|
||||
if (((item.mType & aType) != 0) && item.mBlocked) {
|
||||
return true;
|
||||
}
|
||||
|
@ -211,11 +197,13 @@ class ContentBlockingLog final {
|
|||
mLog.ShallowSizeOfExcludingThis(aSizes.mState.mMallocSizeOf);
|
||||
|
||||
// Now add the sizes of each origin log queue.
|
||||
for (const OriginEntry& entry : mLog) {
|
||||
if (entry.mData) {
|
||||
aSizes.mDOMOtherSize += aSizes.mState.mMallocSizeOf(entry.mData.get()) +
|
||||
entry.mData->mLogs.ShallowSizeOfExcludingThis(
|
||||
aSizes.mState.mMallocSizeOf);
|
||||
const auto end = mLog.end();
|
||||
for (auto iter = mLog.begin(); iter != end; ++iter) {
|
||||
if (!Get<1>(*iter)) {
|
||||
aSizes.mDOMOtherSize +=
|
||||
aSizes.mState.mMallocSizeOf(Get<1>(*iter).get()) +
|
||||
Get<2>(*Get<1>(*iter))
|
||||
.ShallowSizeOfExcludingThis(aSizes.mState.mMallocSizeOf);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
Загрузка…
Ссылка в новой задаче