Source code

Revision control

Copy as Markdown

Other Tools

/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
/* vim: set ts=8 sts=2 et sw=2 tw=80: */
/* 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/. */
#include "UrlClassifierExceptionListEntry.h"
#include "mozilla/ErrorResult.h"
#include "mozilla/Preferences.h"
namespace mozilla::net {
NS_IMPL_ISUPPORTS(UrlClassifierExceptionListEntry,
nsIUrlClassifierExceptionListEntry)
NS_IMETHODIMP
UrlClassifierExceptionListEntry::Init(
const nsACString& aUrlPattern, const nsACString& aTopLevelUrlPattern,
bool aIsPrivateBrowsingOnly,
const nsTArray<nsCString>& aFilterContentBlockingCategories,
const nsTArray<nsCString>& aClassifierFeatures) {
mUrlPattern = aUrlPattern;
mTopLevelUrlPattern = aTopLevelUrlPattern;
mIsPrivateBrowsingOnly = aIsPrivateBrowsingOnly;
mFilterContentBlockingCategories = aFilterContentBlockingCategories.Clone();
mClassifierFeatures = aClassifierFeatures.Clone();
// Create pattern from urlPattern and topLevelUrlPattern strings.
ErrorResult error;
mMatcher = new extensions::MatchPatternCore(
NS_ConvertUTF8toUTF16(mUrlPattern), false, false, error);
RETURN_NSRESULT_ON_FAILURE(error);
if (!mTopLevelUrlPattern.IsEmpty()) {
mTopLevelMatcher = new extensions::MatchPatternCore(
NS_ConvertUTF8toUTF16(mTopLevelUrlPattern), false, false, error);
RETURN_NSRESULT_ON_FAILURE(error);
}
return NS_OK;
}
NS_IMETHODIMP
UrlClassifierExceptionListEntry::Matches(nsIURI* aURI, nsIURI* aTopLevelURI,
bool aIsPrivateBrowsing,
bool* aResult) {
NS_ENSURE_ARG_POINTER(aURI);
NS_ENSURE_ARG_POINTER(aResult);
*aResult = false;
// Do the private browsing check first, because it's cheap.
if (!aIsPrivateBrowsing && mIsPrivateBrowsingOnly) {
return NS_OK;
}
// Next, check if the current content blocking category pref matches the
// allowed content blocking categories for this exception entry.
if (!mFilterContentBlockingCategories.IsEmpty()) {
nsCString prefValue;
// TODO: Bug 1956620: This is a desktop-only pref. We also need to check
// Fenix.
nsresult rv =
Preferences::GetCString("browser.contentblocking.category", prefValue);
// If the pref is not set this check is skipped.
if (NS_SUCCEEDED(rv) && !prefValue.IsEmpty()) {
if (!mFilterContentBlockingCategories.Contains(prefValue)) {
return NS_OK;
}
}
}
// Check if the load URI matches the urlPattern.
if (!mMatcher->Matches(aURI)) {
return NS_OK;
}
// If this entry filters for top level site, check if the top level URI
// matches the topLevelUrlPattern. If the entry filters for top level site,
// but the caller does not provide one, we will not match.
if (mTopLevelMatcher &&
(!aTopLevelURI || !mTopLevelMatcher->Matches(aTopLevelURI))) {
return NS_OK;
}
*aResult = true;
return NS_OK;
}
NS_IMETHODIMP
UrlClassifierExceptionListEntry::GetUrlPattern(nsACString& aUrlPattern) {
aUrlPattern = mUrlPattern;
return NS_OK;
}
NS_IMETHODIMP
UrlClassifierExceptionListEntry::GetTopLevelUrlPattern(
nsACString& aTopLevelUrlPattern) {
aTopLevelUrlPattern = mTopLevelUrlPattern;
return NS_OK;
}
NS_IMETHODIMP
UrlClassifierExceptionListEntry::GetIsPrivateBrowsingOnly(
bool* aIsPrivateBrowsingOnly) {
*aIsPrivateBrowsingOnly = mIsPrivateBrowsingOnly;
return NS_OK;
}
NS_IMETHODIMP
UrlClassifierExceptionListEntry::GetFilterContentBlockingCategories(
nsTArray<nsCString>& aFilterContentBlockingCategories) {
aFilterContentBlockingCategories = mFilterContentBlockingCategories.Clone();
return NS_OK;
}
NS_IMETHODIMP
UrlClassifierExceptionListEntry::GetClassifierFeatures(
nsTArray<nsCString>& aClassifierFeatures) {
aClassifierFeatures = mClassifierFeatures.Clone();
return NS_OK;
}
NS_IMETHODIMP
UrlClassifierExceptionListEntry::Describe(nsACString& aDescription) {
nsAutoCString categories;
for (const auto& category : mFilterContentBlockingCategories) {
if (!categories.IsEmpty()) {
categories.AppendLiteral(", ");
}
categories.Append(category);
}
nsAutoCString classifierFeatures;
for (const auto& feature : mClassifierFeatures) {
if (!classifierFeatures.IsEmpty()) {
classifierFeatures.AppendLiteral(", ");
}
classifierFeatures.Append(feature);
}
aDescription.AppendPrintf(
"UrlClassifierExceptionListEntry(urlPattern='%s', "
"topLevelUrlPattern='%s', isPrivateBrowsingOnly=%s, "
"filterContentBlockingCategories=[%s], classifierFeatures=[%s])",
mUrlPattern.get(), mTopLevelUrlPattern.get(),
mIsPrivateBrowsingOnly ? "true" : "false", categories.get(),
classifierFeatures.get());
return NS_OK;
}
} // namespace mozilla::net