зеркало из https://github.com/mozilla/gecko-dev.git
Bug 1522370 - Report anti-tracking warnings to console from the idle event queue; r=baku
Differential Revision: https://phabricator.services.mozilla.com/D17450
This commit is contained in:
Родитель
e3e01de090
Коммит
15e5d573b4
|
@ -45,6 +45,7 @@ using mozilla::dom::Document;
|
|||
|
||||
static LazyLogModule gAntiTrackingLog("AntiTracking");
|
||||
static const nsCString::size_type sMaxSpecLength = 128;
|
||||
static const uint32_t kMaxConsoleOutputDelayMs = 100;
|
||||
|
||||
#define LOG(format) MOZ_LOG(gAntiTrackingLog, mozilla::LogLevel::Debug, format)
|
||||
|
||||
|
@ -277,53 +278,79 @@ void ReportBlockingToConsole(nsPIDOMWindowOuter* aWindow, nsIURI* aURI,
|
|||
return;
|
||||
}
|
||||
|
||||
const char* message = nullptr;
|
||||
nsAutoCString category;
|
||||
switch (aRejectedReason) {
|
||||
case nsIWebProgressListener::STATE_COOKIES_BLOCKED_BY_PERMISSION:
|
||||
message = "CookieBlockedByPermission";
|
||||
category = NS_LITERAL_CSTRING("cookieBlockedPermission");
|
||||
break;
|
||||
|
||||
case nsIWebProgressListener::STATE_COOKIES_BLOCKED_TRACKER:
|
||||
message = "CookieBlockedTracker";
|
||||
category = NS_LITERAL_CSTRING("cookieBlockedTracker");
|
||||
break;
|
||||
|
||||
case nsIWebProgressListener::STATE_COOKIES_BLOCKED_ALL:
|
||||
message = "CookieBlockedAll";
|
||||
category = NS_LITERAL_CSTRING("cookieBlockedAll");
|
||||
break;
|
||||
|
||||
case nsIWebProgressListener::STATE_COOKIES_BLOCKED_FOREIGN:
|
||||
message = "CookieBlockedForeign";
|
||||
category = NS_LITERAL_CSTRING("cookieBlockedForeign");
|
||||
break;
|
||||
|
||||
default:
|
||||
return;
|
||||
nsAutoString sourceLine;
|
||||
uint32_t lineNumber = 0, columnNumber = 0;
|
||||
JSContext* cx = nsContentUtils::GetCurrentJSContext();
|
||||
if (cx) {
|
||||
nsJSUtils::GetCallingLocation(cx, sourceLine, &lineNumber, &columnNumber);
|
||||
}
|
||||
|
||||
MOZ_ASSERT(message);
|
||||
nsCOMPtr<nsIURI> uri(aURI);
|
||||
|
||||
// Strip the URL of any possible username/password and make it ready to be
|
||||
// presented in the UI.
|
||||
nsCOMPtr<nsIURIFixup> urifixup = services::GetURIFixup();
|
||||
NS_ENSURE_TRUE_VOID(urifixup);
|
||||
nsCOMPtr<nsIURI> exposableURI;
|
||||
nsresult rv =
|
||||
urifixup->CreateExposableURI(aURI, getter_AddRefs(exposableURI));
|
||||
NS_ENSURE_SUCCESS_VOID(rv);
|
||||
nsresult rv = NS_IdleDispatchToCurrentThread(
|
||||
NS_NewRunnableFunction(
|
||||
"ReportBlockingToConsoleDelayed",
|
||||
[doc, sourceLine, lineNumber, columnNumber, uri, aRejectedReason]() {
|
||||
const char* message = nullptr;
|
||||
nsAutoCString category;
|
||||
switch (aRejectedReason) {
|
||||
case nsIWebProgressListener::STATE_COOKIES_BLOCKED_BY_PERMISSION:
|
||||
message = "CookieBlockedByPermission";
|
||||
category = NS_LITERAL_CSTRING("cookieBlockedPermission");
|
||||
break;
|
||||
|
||||
NS_ConvertUTF8toUTF16 spec(exposableURI->GetSpecOrDefault());
|
||||
const char16_t* params[] = {spec.get()};
|
||||
case nsIWebProgressListener::STATE_COOKIES_BLOCKED_TRACKER:
|
||||
message = "CookieBlockedTracker";
|
||||
category = NS_LITERAL_CSTRING("cookieBlockedTracker");
|
||||
break;
|
||||
|
||||
nsContentUtils::ReportToConsole(nsIScriptError::warningFlag, category, doc,
|
||||
nsContentUtils::eNECKO_PROPERTIES, message,
|
||||
params, ArrayLength(params));
|
||||
case nsIWebProgressListener::STATE_COOKIES_BLOCKED_ALL:
|
||||
message = "CookieBlockedAll";
|
||||
category = NS_LITERAL_CSTRING("cookieBlockedAll");
|
||||
break;
|
||||
|
||||
case nsIWebProgressListener::STATE_COOKIES_BLOCKED_FOREIGN:
|
||||
message = "CookieBlockedForeign";
|
||||
category = NS_LITERAL_CSTRING("cookieBlockedForeign");
|
||||
break;
|
||||
|
||||
default:
|
||||
return;
|
||||
}
|
||||
|
||||
MOZ_ASSERT(message);
|
||||
|
||||
// Strip the URL of any possible username/password and make it ready
|
||||
// to be presented in the UI.
|
||||
nsCOMPtr<nsIURIFixup> urifixup = services::GetURIFixup();
|
||||
NS_ENSURE_TRUE_VOID(urifixup);
|
||||
nsCOMPtr<nsIURI> exposableURI;
|
||||
nsresult rv =
|
||||
urifixup->CreateExposableURI(uri, getter_AddRefs(exposableURI));
|
||||
NS_ENSURE_SUCCESS_VOID(rv);
|
||||
|
||||
NS_ConvertUTF8toUTF16 spec(exposableURI->GetSpecOrDefault());
|
||||
bool overflows = spec.Length() > sMaxSpecLength;
|
||||
spec.Truncate(std::min(spec.Length(), sMaxSpecLength));
|
||||
if (overflows) {
|
||||
NS_NAMED_LITERAL_STRING(kEllipsis, u"\x2026");
|
||||
spec.Append(kEllipsis);
|
||||
}
|
||||
const char16_t* params[] = {spec.get()};
|
||||
|
||||
nsContentUtils::ReportToConsole(
|
||||
nsIScriptError::warningFlag, category, doc,
|
||||
nsContentUtils::eNECKO_PROPERTIES, message, params,
|
||||
ArrayLength(params), nullptr, sourceLine, lineNumber,
|
||||
columnNumber);
|
||||
}),
|
||||
kMaxConsoleOutputDelayMs);
|
||||
if (NS_WARN_IF(NS_FAILED(rv))) {
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
void ReportUnblockingConsole(
|
||||
void ReportUnblockingToConsole(
|
||||
nsPIDOMWindowInner* aWindow, const nsAString& aTrackingOrigin,
|
||||
const nsAString& aGrantedOrigin,
|
||||
AntiTrackingCommon::StorageAccessGrantedReason aReason) {
|
||||
|
@ -333,12 +360,6 @@ void ReportUnblockingConsole(
|
|||
return;
|
||||
}
|
||||
|
||||
nsAutoString origin;
|
||||
nsresult rv = nsContentUtils::GetUTFOrigin(principal, origin);
|
||||
if (NS_WARN_IF(NS_FAILED(rv))) {
|
||||
return;
|
||||
}
|
||||
|
||||
nsCOMPtr<nsIDocShell> docShell = aWindow->GetDocShell();
|
||||
if (NS_WARN_IF(!docShell)) {
|
||||
return;
|
||||
|
@ -349,37 +370,67 @@ void ReportUnblockingConsole(
|
|||
return;
|
||||
}
|
||||
|
||||
const char16_t* params[] = {origin.BeginReading(),
|
||||
aTrackingOrigin.BeginReading(),
|
||||
aGrantedOrigin.BeginReading()};
|
||||
const char* messageWithDifferentOrigin = nullptr;
|
||||
const char* messageWithSameOrigin = nullptr;
|
||||
nsAutoString trackingOrigin(aTrackingOrigin);
|
||||
nsAutoString grantedOrigin(aGrantedOrigin);
|
||||
|
||||
switch (aReason) {
|
||||
case AntiTrackingCommon::eStorageAccessAPI:
|
||||
messageWithDifferentOrigin =
|
||||
"CookieAllowedForOriginOnTrackerByStorageAccessAPI";
|
||||
messageWithSameOrigin = "CookieAllowedForTrackerByStorageAccessAPI";
|
||||
break;
|
||||
|
||||
case AntiTrackingCommon::eOpenerAfterUserInteraction:
|
||||
MOZ_FALLTHROUGH;
|
||||
case AntiTrackingCommon::eOpener:
|
||||
messageWithDifferentOrigin = "CookieAllowedForOriginOnTrackerByHeuristic";
|
||||
messageWithSameOrigin = "CookieAllowedForTrackerByHeuristic";
|
||||
break;
|
||||
nsAutoString sourceLine;
|
||||
uint32_t lineNumber = 0, columnNumber = 0;
|
||||
JSContext* cx = nsContentUtils::GetCurrentJSContext();
|
||||
if (cx) {
|
||||
nsJSUtils::GetCallingLocation(cx, sourceLine, &lineNumber, &columnNumber);
|
||||
}
|
||||
|
||||
if (aTrackingOrigin == aGrantedOrigin) {
|
||||
nsContentUtils::ReportToConsole(nsIScriptError::warningFlag,
|
||||
NS_LITERAL_CSTRING("Content Blocking"), doc,
|
||||
nsContentUtils::eNECKO_PROPERTIES,
|
||||
messageWithSameOrigin, params, 2);
|
||||
} else {
|
||||
nsContentUtils::ReportToConsole(nsIScriptError::warningFlag,
|
||||
NS_LITERAL_CSTRING("Content Blocking"), doc,
|
||||
nsContentUtils::eNECKO_PROPERTIES,
|
||||
messageWithDifferentOrigin, params, 3);
|
||||
nsresult rv = NS_IdleDispatchToCurrentThread(
|
||||
NS_NewRunnableFunction(
|
||||
"ReportUnblockingToConsoleDelayed",
|
||||
[doc, principal, trackingOrigin, grantedOrigin, sourceLine,
|
||||
lineNumber, columnNumber, aReason]() {
|
||||
nsAutoString origin;
|
||||
nsresult rv = nsContentUtils::GetUTFOrigin(principal, origin);
|
||||
if (NS_WARN_IF(NS_FAILED(rv))) {
|
||||
return;
|
||||
}
|
||||
|
||||
const char16_t* params[] = {origin.BeginReading(),
|
||||
trackingOrigin.BeginReading(),
|
||||
grantedOrigin.BeginReading()};
|
||||
const char* messageWithDifferentOrigin = nullptr;
|
||||
const char* messageWithSameOrigin = nullptr;
|
||||
|
||||
switch (aReason) {
|
||||
case AntiTrackingCommon::eStorageAccessAPI:
|
||||
messageWithDifferentOrigin =
|
||||
"CookieAllowedForOriginOnTrackerByStorageAccessAPI";
|
||||
messageWithSameOrigin =
|
||||
"CookieAllowedForTrackerByStorageAccessAPI";
|
||||
break;
|
||||
|
||||
case AntiTrackingCommon::eOpenerAfterUserInteraction:
|
||||
MOZ_FALLTHROUGH;
|
||||
case AntiTrackingCommon::eOpener:
|
||||
messageWithDifferentOrigin =
|
||||
"CookieAllowedForOriginOnTrackerByHeuristic";
|
||||
messageWithSameOrigin = "CookieAllowedForTrackerByHeuristic";
|
||||
break;
|
||||
}
|
||||
|
||||
if (trackingOrigin == grantedOrigin) {
|
||||
nsContentUtils::ReportToConsole(
|
||||
nsIScriptError::warningFlag,
|
||||
NS_LITERAL_CSTRING("Content Blocking"), doc,
|
||||
nsContentUtils::eNECKO_PROPERTIES, messageWithSameOrigin,
|
||||
params, 2, nullptr, sourceLine, lineNumber, columnNumber);
|
||||
} else {
|
||||
nsContentUtils::ReportToConsole(
|
||||
nsIScriptError::warningFlag,
|
||||
NS_LITERAL_CSTRING("Content Blocking"), doc,
|
||||
nsContentUtils::eNECKO_PROPERTIES, messageWithDifferentOrigin,
|
||||
params, 3, nullptr, sourceLine, lineNumber, columnNumber);
|
||||
}
|
||||
}),
|
||||
kMaxConsoleOutputDelayMs);
|
||||
if (NS_WARN_IF(NS_FAILED(rv))) {
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -625,8 +676,9 @@ AntiTrackingCommon::AddFirstPartyStorageAccessGrantedFor(
|
|||
|
||||
pwin->NotifyContentBlockingEvent(blockReason, channel, false, trackingURI);
|
||||
|
||||
ReportUnblockingConsole(parentWindow, NS_ConvertUTF8toUTF16(trackingOrigin),
|
||||
NS_ConvertUTF8toUTF16(origin), aReason);
|
||||
ReportUnblockingToConsole(parentWindow,
|
||||
NS_ConvertUTF8toUTF16(trackingOrigin),
|
||||
NS_ConvertUTF8toUTF16(origin), aReason);
|
||||
|
||||
if (XRE_IsParentProcess()) {
|
||||
LOG(("Saving the permission: trackingOrigin=%s, grantedOrigin=%s",
|
||||
|
|
Загрузка…
Ссылка в новой задаче