Merge mozilla-central to autoland. a=merge CLOSED TREE

This commit is contained in:
Gurzau Raul 2019-01-05 14:40:39 +02:00
Родитель 7444827257 959d44414e
Коммит 8115a1830e
22 изменённых файлов: 474 добавлений и 255 удалений

Просмотреть файл

@ -154,9 +154,16 @@ var TrackingProtection = {
if (this.trackingTable == this.trackingAnnotationTable) { if (this.trackingTable == this.trackingAnnotationTable) {
return true; return true;
} }
let feature = classifierService.getFeatureByName("tracking-protection");
if (!feature) {
return false;
}
return new Promise(resolve => { return new Promise(resolve => {
classifierService.asyncClassifyLocalWithTables(uri, this.trackingTable, [], [], classifierService.asyncClassifyLocalWithFeatures(uri, [feature],
(code, list) => resolve(!!list)); Ci.nsIUrlClassifierFeature.blacklist,
list => resolve(!!list.length));
}); });
}, },

Просмотреть файл

@ -295,8 +295,6 @@ nsresult nsLayoutStatics::Initialize() {
// Reporting API. // Reporting API.
ReportingHeader::Initialize(); ReportingHeader::Initialize();
mozilla::net::UrlClassifierFeatureFactory::Initialize();
return NS_OK; return NS_OK;
} }

Просмотреть файл

@ -0,0 +1,103 @@
/* -*- 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 "UrlClassifierFeatureCustomTables.h"
namespace mozilla {
NS_INTERFACE_MAP_BEGIN(UrlClassifierFeatureCustomTables)
NS_INTERFACE_MAP_ENTRY_AMBIGUOUS(nsISupports, nsIUrlClassifierFeature)
NS_INTERFACE_MAP_ENTRY(nsIUrlClassifierFeature)
NS_INTERFACE_MAP_END
NS_IMPL_ADDREF(UrlClassifierFeatureCustomTables)
NS_IMPL_RELEASE(UrlClassifierFeatureCustomTables)
UrlClassifierFeatureCustomTables::UrlClassifierFeatureCustomTables(
const nsACString& aName, const nsTArray<nsCString>& aBlacklistTables,
const nsTArray<nsCString>& aWhitelistTables)
: mName(aName),
mBlacklistTables(aBlacklistTables),
mWhitelistTables(aWhitelistTables) {}
UrlClassifierFeatureCustomTables::~UrlClassifierFeatureCustomTables() = default;
NS_IMETHODIMP
UrlClassifierFeatureCustomTables::GetName(nsACString& aName) {
aName = mName;
return NS_OK;
}
NS_IMETHODIMP
UrlClassifierFeatureCustomTables::GetTables(
nsIUrlClassifierFeature::listType aListType, nsTArray<nsCString>& aTables) {
if (aListType == nsIUrlClassifierFeature::blacklist) {
aTables = mBlacklistTables;
return NS_OK;
}
if (aListType == nsIUrlClassifierFeature::whitelist) {
aTables = mWhitelistTables;
return NS_OK;
}
return NS_ERROR_FAILURE;
}
NS_IMETHODIMP
UrlClassifierFeatureCustomTables::HasTable(
const nsACString& aTable, nsIUrlClassifierFeature::listType aListType,
bool* aResult) {
NS_ENSURE_ARG_POINTER(aResult);
if (aListType == nsIUrlClassifierFeature::blacklist) {
*aResult = mBlacklistTables.Contains(aTable);
return NS_OK;
}
if (aListType == nsIUrlClassifierFeature::whitelist) {
*aResult = mWhitelistTables.Contains(aTable);
return NS_OK;
}
return NS_ERROR_FAILURE;
}
NS_IMETHODIMP
UrlClassifierFeatureCustomTables::HasHostInPreferences(
const nsACString& aHost, nsIUrlClassifierFeature::listType aListType,
nsACString& aPrefTableName, bool* aResult) {
NS_ENSURE_ARG_POINTER(aResult);
*aResult = false;
return NS_OK;
}
NS_IMETHODIMP
UrlClassifierFeatureCustomTables::GetSkipHostList(nsACString& aList) {
return NS_OK;
}
NS_IMETHODIMP
UrlClassifierFeatureCustomTables::ProcessChannel(nsIChannel* aChannel,
const nsACString& aList,
bool* aShouldContinue) {
NS_ENSURE_ARG_POINTER(aChannel);
NS_ENSURE_ARG_POINTER(aShouldContinue);
// This is not a blocking feature.
*aShouldContinue = true;
return NS_OK;
}
NS_IMETHODIMP
UrlClassifierFeatureCustomTables::GetURIByListType(
nsIChannel* aChannel, nsIUrlClassifierFeature::listType aListType,
nsIURI** aURI) {
return NS_ERROR_NOT_IMPLEMENTED;
}
} // namespace mozilla

Просмотреть файл

@ -0,0 +1,35 @@
/* -*- 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/. */
#ifndef mozilla_UrlClassifierFeatureCustomTables_h
#define mozilla_UrlClassifierFeatureCustomTables_h
#include "nsIUrlClassifierFeature.h"
#include "nsTArray.h"
#include "nsString.h"
namespace mozilla {
class UrlClassifierFeatureCustomTables : public nsIUrlClassifierFeature {
public:
NS_DECL_ISUPPORTS
NS_DECL_NSIURLCLASSIFIERFEATURE
explicit UrlClassifierFeatureCustomTables(
const nsACString& aName, const nsTArray<nsCString>& aBlacklistTables,
const nsTArray<nsCString>& aWhitelistTables);
private:
virtual ~UrlClassifierFeatureCustomTables();
nsCString mName;
nsTArray<nsCString> mBlacklistTables;
nsTArray<nsCString> mWhitelistTables;
};
} // namespace mozilla
#endif // mozilla_UrlClassifierFeatureCustomTables_h

Просмотреть файл

@ -11,33 +11,23 @@
#include "UrlClassifierFeatureLoginReputation.h" #include "UrlClassifierFeatureLoginReputation.h"
#include "UrlClassifierFeatureTrackingProtection.h" #include "UrlClassifierFeatureTrackingProtection.h"
#include "UrlClassifierFeatureTrackingAnnotation.h" #include "UrlClassifierFeatureTrackingAnnotation.h"
#include "UrlClassifierFeatureCustomTables.h"
#include "nsAppRunner.h" #include "nsAppRunner.h"
namespace mozilla { namespace mozilla {
namespace net { namespace net {
/* static */ void UrlClassifierFeatureFactory::Initialize() {
// We want to expose Features only in the parent process.
if (!XRE_IsParentProcess()) {
return;
}
UrlClassifierFeatureFlash::Initialize();
UrlClassifierFeatureTrackingAnnotation::Initialize();
UrlClassifierFeatureTrackingProtection::Initialize();
}
/* static */ void UrlClassifierFeatureFactory::Shutdown() { /* static */ void UrlClassifierFeatureFactory::Shutdown() {
// We want to expose Features only in the parent process. // We want to expose Features only in the parent process.
if (!XRE_IsParentProcess()) { if (!XRE_IsParentProcess()) {
return; return;
} }
UrlClassifierFeatureFlash::Shutdown(); UrlClassifierFeatureFlash::MaybeShutdown();
UrlClassifierFeatureLoginReputation::MaybeShutdown(); UrlClassifierFeatureLoginReputation::MaybeShutdown();
UrlClassifierFeatureTrackingAnnotation::Shutdown(); UrlClassifierFeatureTrackingAnnotation::MaybeShutdown();
UrlClassifierFeatureTrackingProtection::Shutdown(); UrlClassifierFeatureTrackingProtection::MaybeShutdown();
} }
/* static */ void UrlClassifierFeatureFactory::GetFeaturesFromChannel( /* static */ void UrlClassifierFeatureFactory::GetFeaturesFromChannel(
@ -77,5 +67,50 @@ UrlClassifierFeatureFactory::GetFeatureLoginReputation() {
return UrlClassifierFeatureLoginReputation::MaybeGetOrCreate(); return UrlClassifierFeatureLoginReputation::MaybeGetOrCreate();
} }
/* static */ already_AddRefed<nsIUrlClassifierFeature>
UrlClassifierFeatureFactory::GetFeatureByName(const nsACString& aName) {
if (!XRE_IsParentProcess()) {
return nullptr;
}
nsCOMPtr<nsIUrlClassifierFeature> feature;
// Tracking Protection
feature = UrlClassifierFeatureTrackingProtection::GetIfNameMatches(aName);
if (feature) {
return feature.forget();
}
// Tracking Annotation
feature = UrlClassifierFeatureTrackingAnnotation::GetIfNameMatches(aName);
if (feature) {
return feature.forget();
}
// Login reputation
feature = UrlClassifierFeatureLoginReputation::GetIfNameMatches(aName);
if (feature) {
return feature.forget();
}
// We use Flash feature just for document loading.
feature = UrlClassifierFeatureFlash::GetIfNameMatches(aName);
if (feature) {
return feature.forget();
}
return nullptr;
}
/* static */ already_AddRefed<nsIUrlClassifierFeature>
UrlClassifierFeatureFactory::CreateFeatureWithTables(
const nsACString& aName, const nsTArray<nsCString>& aBlacklistTables,
const nsTArray<nsCString>& aWhitelistTables) {
nsCOMPtr<nsIUrlClassifierFeature> feature =
new UrlClassifierFeatureCustomTables(aName, aBlacklistTables,
aWhitelistTables);
return feature.forget();
}
} // namespace net } // namespace net
} // namespace mozilla } // namespace mozilla

Просмотреть файл

@ -18,8 +18,6 @@ namespace net {
class UrlClassifierFeatureFactory final { class UrlClassifierFeatureFactory final {
public: public:
static void Initialize();
static void Shutdown(); static void Shutdown();
static void GetFeaturesFromChannel( static void GetFeaturesFromChannel(
@ -27,6 +25,13 @@ class UrlClassifierFeatureFactory final {
nsTArray<nsCOMPtr<nsIUrlClassifierFeature>>& aFeatures); nsTArray<nsCOMPtr<nsIUrlClassifierFeature>>& aFeatures);
static nsIUrlClassifierFeature* GetFeatureLoginReputation(); static nsIUrlClassifierFeature* GetFeatureLoginReputation();
static already_AddRefed<nsIUrlClassifierFeature> GetFeatureByName(
const nsACString& aFeatureName);
static already_AddRefed<nsIUrlClassifierFeature> CreateFeatureWithTables(
const nsACString& aName, const nsTArray<nsCString>& aBlacklistTables,
const nsTArray<nsCString>& aWhitelistTables);
}; };
} // namespace net } // namespace net

Просмотреть файл

@ -34,6 +34,8 @@ static FlashFeatures sFlashFeaturesMap[] = {
nsIHttpChannel::FlashPluginDeniedInSubdocuments}, nsIHttpChannel::FlashPluginDeniedInSubdocuments},
}; };
bool IsInitialized() { return !!sFlashFeaturesMap[0].mFeature; }
} // namespace } // namespace
UrlClassifierFeatureFlash::UrlClassifierFeatureFlash(uint32_t aId) UrlClassifierFeatureFlash::UrlClassifierFeatureFlash(uint32_t aId)
@ -53,7 +55,13 @@ UrlClassifierFeatureFlash::UrlClassifierFeatureFlash(uint32_t aId)
"nsIHttpChannel::FlashPluginLastValue is out-of-sync!"); "nsIHttpChannel::FlashPluginLastValue is out-of-sync!");
} }
/* static */ void UrlClassifierFeatureFlash::Initialize() { /* static */ void UrlClassifierFeatureFlash::MaybeInitialize() {
MOZ_ASSERT(XRE_IsParentProcess());
if (IsInitialized()) {
return;
}
uint32_t numFeatures = uint32_t numFeatures =
(sizeof(sFlashFeaturesMap) / sizeof(sFlashFeaturesMap[0])); (sizeof(sFlashFeaturesMap) / sizeof(sFlashFeaturesMap[0]));
for (uint32_t i = 0; i < numFeatures; ++i) { for (uint32_t i = 0; i < numFeatures; ++i) {
@ -63,7 +71,11 @@ UrlClassifierFeatureFlash::UrlClassifierFeatureFlash(uint32_t aId)
} }
} }
/* static */ void UrlClassifierFeatureFlash::Shutdown() { /* static */ void UrlClassifierFeatureFlash::MaybeShutdown() {
if (!IsInitialized()) {
return;
}
uint32_t numFeatures = uint32_t numFeatures =
(sizeof(sFlashFeaturesMap) / sizeof(sFlashFeaturesMap[0])); (sizeof(sFlashFeaturesMap) / sizeof(sFlashFeaturesMap[0]));
for (uint32_t i = 0; i < numFeatures; ++i) { for (uint32_t i = 0; i < numFeatures; ++i) {
@ -100,6 +112,8 @@ UrlClassifierFeatureFlash::UrlClassifierFeatureFlash(uint32_t aId)
} }
} }
MaybeInitialize();
uint32_t numFeatures = uint32_t numFeatures =
(sizeof(sFlashFeaturesMap) / sizeof(sFlashFeaturesMap[0])); (sizeof(sFlashFeaturesMap) / sizeof(sFlashFeaturesMap[0]));
for (uint32_t i = 0; i < numFeatures; ++i) { for (uint32_t i = 0; i < numFeatures; ++i) {
@ -111,6 +125,24 @@ UrlClassifierFeatureFlash::UrlClassifierFeatureFlash(uint32_t aId)
} }
} }
/* static */ already_AddRefed<nsIUrlClassifierFeature>
UrlClassifierFeatureFlash::GetIfNameMatches(const nsACString& aName) {
MaybeInitialize();
uint32_t numFeatures =
(sizeof(sFlashFeaturesMap) / sizeof(sFlashFeaturesMap[0]));
for (uint32_t i = 0; i < numFeatures; ++i) {
MOZ_ASSERT(sFlashFeaturesMap[i].mFeature);
if (aName.Equals(sFlashFeaturesMap[i].mName)) {
nsCOMPtr<nsIUrlClassifierFeature> self =
sFlashFeaturesMap[i].mFeature.get();
return self.forget();
}
}
return nullptr;
}
NS_IMETHODIMP NS_IMETHODIMP
UrlClassifierFeatureFlash::ProcessChannel(nsIChannel* aChannel, UrlClassifierFeatureFlash::ProcessChannel(nsIChannel* aChannel,
const nsACString& aList, const nsACString& aList,

Просмотреть файл

@ -14,13 +14,15 @@ namespace net {
class UrlClassifierFeatureFlash final : public UrlClassifierFeatureBase { class UrlClassifierFeatureFlash final : public UrlClassifierFeatureBase {
public: public:
static void Initialize(); static void MaybeShutdown();
static void Shutdown();
static void MaybeCreate( static void MaybeCreate(
nsIChannel* aChannel, nsIChannel* aChannel,
nsTArray<nsCOMPtr<nsIUrlClassifierFeature>>& aFeatures); nsTArray<nsCOMPtr<nsIUrlClassifierFeature>>& aFeatures);
static already_AddRefed<nsIUrlClassifierFeature> GetIfNameMatches(
const nsACString& aName);
NS_IMETHOD NS_IMETHOD
ProcessChannel(nsIChannel* aChannel, const nsACString& aList, ProcessChannel(nsIChannel* aChannel, const nsACString& aList,
bool* aShouldContinue) override; bool* aShouldContinue) override;
@ -32,6 +34,8 @@ class UrlClassifierFeatureFlash final : public UrlClassifierFeatureBase {
private: private:
explicit UrlClassifierFeatureFlash(uint32_t aId); explicit UrlClassifierFeatureFlash(uint32_t aId);
static void MaybeInitialize();
nsIHttpChannel::FlashPluginState mFlashPluginState; nsIHttpChannel::FlashPluginState mFlashPluginState;
}; };

Просмотреть файл

@ -13,6 +13,8 @@ namespace net {
namespace { namespace {
#define LOGIN_REPUTATION_FEATURE_NAME "login-reputation"
#define PREF_PASSWORD_ALLOW_TABLE "urlclassifier.passwordAllowTable" #define PREF_PASSWORD_ALLOW_TABLE "urlclassifier.passwordAllowTable"
StaticRefPtr<UrlClassifierFeatureLoginReputation> gFeatureLoginReputation; StaticRefPtr<UrlClassifierFeatureLoginReputation> gFeatureLoginReputation;
@ -20,14 +22,15 @@ StaticRefPtr<UrlClassifierFeatureLoginReputation> gFeatureLoginReputation;
} // namespace } // namespace
UrlClassifierFeatureLoginReputation::UrlClassifierFeatureLoginReputation() UrlClassifierFeatureLoginReputation::UrlClassifierFeatureLoginReputation()
: UrlClassifierFeatureBase(NS_LITERAL_CSTRING("login-reputation"), : UrlClassifierFeatureBase(
EmptyCString(), // blacklist tables NS_LITERAL_CSTRING(LOGIN_REPUTATION_FEATURE_NAME),
NS_LITERAL_CSTRING(PREF_PASSWORD_ALLOW_TABLE), EmptyCString(), // blacklist tables
EmptyCString(), // blacklist pref NS_LITERAL_CSTRING(PREF_PASSWORD_ALLOW_TABLE),
EmptyCString(), // whitelist pref EmptyCString(), // blacklist pref
EmptyCString(), // blacklist pref table name EmptyCString(), // whitelist pref
EmptyCString(), // whitelist pref table name EmptyCString(), // blacklist pref table name
EmptyCString()) // skip host pref EmptyCString(), // whitelist pref table name
EmptyCString()) // skip host pref
{} {}
/* static */ void UrlClassifierFeatureLoginReputation::MaybeShutdown() { /* static */ void UrlClassifierFeatureLoginReputation::MaybeShutdown() {
@ -53,6 +56,16 @@ UrlClassifierFeatureLoginReputation::MaybeGetOrCreate() {
return gFeatureLoginReputation; return gFeatureLoginReputation;
} }
/* static */ already_AddRefed<nsIUrlClassifierFeature>
UrlClassifierFeatureLoginReputation::GetIfNameMatches(const nsACString& aName) {
if (!aName.EqualsLiteral(LOGIN_REPUTATION_FEATURE_NAME)) {
return nullptr;
}
nsCOMPtr<nsIUrlClassifierFeature> self = MaybeGetOrCreate();
return self.forget();
}
NS_IMETHODIMP NS_IMETHODIMP
UrlClassifierFeatureLoginReputation::ProcessChannel(nsIChannel* aChannel, UrlClassifierFeatureLoginReputation::ProcessChannel(nsIChannel* aChannel,
const nsACString& aList, const nsACString& aList,

Просмотреть файл

@ -21,6 +21,9 @@ class UrlClassifierFeatureLoginReputation final
static nsIUrlClassifierFeature* MaybeGetOrCreate(); static nsIUrlClassifierFeature* MaybeGetOrCreate();
static already_AddRefed<nsIUrlClassifierFeature> GetIfNameMatches(
const nsACString& aName);
NS_IMETHOD NS_IMETHOD
GetTables(nsIUrlClassifierFeature::listType aListType, GetTables(nsIUrlClassifierFeature::listType aListType,
nsTArray<nsCString>& aResult) override; nsTArray<nsCString>& aResult) override;

Просмотреть файл

@ -21,6 +21,8 @@ namespace net {
namespace { namespace {
#define TRACKING_ANNOTATION_FEATURE_NAME "tracking-annotation"
#define URLCLASSIFIER_ANNOTATION_BLACKLIST \ #define URLCLASSIFIER_ANNOTATION_BLACKLIST \
"urlclassifier.trackingAnnotationTable" "urlclassifier.trackingAnnotationTable"
#define URLCLASSIFIER_ANNOTATION_BLACKLIST_TEST_ENTRIES \ #define URLCLASSIFIER_ANNOTATION_BLACKLIST_TEST_ENTRIES \
@ -109,7 +111,7 @@ static void LowerPriorityHelper(nsIChannel* aChannel) {
UrlClassifierFeatureTrackingAnnotation::UrlClassifierFeatureTrackingAnnotation() UrlClassifierFeatureTrackingAnnotation::UrlClassifierFeatureTrackingAnnotation()
: UrlClassifierFeatureBase( : UrlClassifierFeatureBase(
NS_LITERAL_CSTRING("tracking-annotation"), NS_LITERAL_CSTRING(TRACKING_ANNOTATION_FEATURE_NAME),
NS_LITERAL_CSTRING(URLCLASSIFIER_ANNOTATION_BLACKLIST), NS_LITERAL_CSTRING(URLCLASSIFIER_ANNOTATION_BLACKLIST),
NS_LITERAL_CSTRING(URLCLASSIFIER_ANNOTATION_WHITELIST), NS_LITERAL_CSTRING(URLCLASSIFIER_ANNOTATION_WHITELIST),
NS_LITERAL_CSTRING(URLCLASSIFIER_ANNOTATION_BLACKLIST_TEST_ENTRIES), NS_LITERAL_CSTRING(URLCLASSIFIER_ANNOTATION_BLACKLIST_TEST_ENTRIES),
@ -118,25 +120,27 @@ UrlClassifierFeatureTrackingAnnotation::UrlClassifierFeatureTrackingAnnotation()
NS_LITERAL_CSTRING(TABLE_ANNOTATION_WHITELIST_PREF), NS_LITERAL_CSTRING(TABLE_ANNOTATION_WHITELIST_PREF),
NS_LITERAL_CSTRING(URLCLASSIFIER_TRACKING_ANNOTATION_SKIP_URLS)) {} NS_LITERAL_CSTRING(URLCLASSIFIER_TRACKING_ANNOTATION_SKIP_URLS)) {}
/* static */ void UrlClassifierFeatureTrackingAnnotation::Initialize() { /* static */ void UrlClassifierFeatureTrackingAnnotation::MaybeInitialize() {
UC_LOG(("UrlClassifierFeatureTrackingAnnotation: Initializing")); MOZ_ASSERT(XRE_IsParentProcess());
MOZ_ASSERT(!gFeatureTrackingAnnotation); UC_LOG(("UrlClassifierFeatureTrackingAnnotation: MaybeInitialize"));
gFeatureTrackingAnnotation = new UrlClassifierFeatureTrackingAnnotation(); if (!gFeatureTrackingAnnotation) {
gFeatureTrackingAnnotation->InitializePreferences(); gFeatureTrackingAnnotation = new UrlClassifierFeatureTrackingAnnotation();
gFeatureTrackingAnnotation->InitializePreferences();
}
} }
/* static */ void UrlClassifierFeatureTrackingAnnotation::Shutdown() { /* static */ void UrlClassifierFeatureTrackingAnnotation::MaybeShutdown() {
UC_LOG(("UrlClassifierFeatureTrackingAnnotation: Shutdown")); UC_LOG(("UrlClassifierFeatureTrackingAnnotation: MaybeShutdown"));
MOZ_ASSERT(gFeatureTrackingAnnotation);
gFeatureTrackingAnnotation->ShutdownPreferences(); if (gFeatureTrackingAnnotation) {
gFeatureTrackingAnnotation = nullptr; gFeatureTrackingAnnotation->ShutdownPreferences();
gFeatureTrackingAnnotation = nullptr;
}
} }
/* static */ already_AddRefed<UrlClassifierFeatureTrackingAnnotation> /* static */ already_AddRefed<UrlClassifierFeatureTrackingAnnotation>
UrlClassifierFeatureTrackingAnnotation::MaybeCreate(nsIChannel* aChannel) { UrlClassifierFeatureTrackingAnnotation::MaybeCreate(nsIChannel* aChannel) {
MOZ_ASSERT(gFeatureTrackingAnnotation);
MOZ_ASSERT(aChannel); MOZ_ASSERT(aChannel);
UC_LOG(("UrlClassifierFeatureTrackingAnnotation: MaybeCreate for channel %p", UC_LOG(("UrlClassifierFeatureTrackingAnnotation: MaybeCreate for channel %p",
@ -151,6 +155,24 @@ UrlClassifierFeatureTrackingAnnotation::MaybeCreate(nsIChannel* aChannel) {
return nullptr; return nullptr;
} }
MaybeInitialize();
MOZ_ASSERT(gFeatureTrackingAnnotation);
RefPtr<UrlClassifierFeatureTrackingAnnotation> self =
gFeatureTrackingAnnotation;
return self.forget();
}
/* static */ already_AddRefed<nsIUrlClassifierFeature>
UrlClassifierFeatureTrackingAnnotation::GetIfNameMatches(
const nsACString& aName) {
if (!aName.EqualsLiteral(TRACKING_ANNOTATION_FEATURE_NAME)) {
return nullptr;
}
MaybeInitialize();
MOZ_ASSERT(gFeatureTrackingAnnotation);
RefPtr<UrlClassifierFeatureTrackingAnnotation> self = RefPtr<UrlClassifierFeatureTrackingAnnotation> self =
gFeatureTrackingAnnotation; gFeatureTrackingAnnotation;
return self.forget(); return self.forget();

Просмотреть файл

@ -17,13 +17,14 @@ namespace net {
class UrlClassifierFeatureTrackingAnnotation final class UrlClassifierFeatureTrackingAnnotation final
: public UrlClassifierFeatureBase { : public UrlClassifierFeatureBase {
public: public:
static void Initialize(); static void MaybeShutdown();
static void Shutdown();
static already_AddRefed<UrlClassifierFeatureTrackingAnnotation> MaybeCreate( static already_AddRefed<UrlClassifierFeatureTrackingAnnotation> MaybeCreate(
nsIChannel* aChannel); nsIChannel* aChannel);
static already_AddRefed<nsIUrlClassifierFeature> GetIfNameMatches(
const nsACString& aName);
NS_IMETHOD ProcessChannel(nsIChannel* aChannel, const nsACString& aList, NS_IMETHOD ProcessChannel(nsIChannel* aChannel, const nsACString& aList,
bool* aShouldContinue) override; bool* aShouldContinue) override;
@ -33,6 +34,8 @@ class UrlClassifierFeatureTrackingAnnotation final
private: private:
UrlClassifierFeatureTrackingAnnotation(); UrlClassifierFeatureTrackingAnnotation();
static void MaybeInitialize();
}; };
} // namespace net } // namespace net

Просмотреть файл

@ -17,6 +17,8 @@ namespace net {
namespace { namespace {
#define TRACKING_PROTECTION_FEATURE_NAME "tracking-protection"
#define URLCLASSIFIER_TRACKING_BLACKLIST "urlclassifier.trackingTable" #define URLCLASSIFIER_TRACKING_BLACKLIST "urlclassifier.trackingTable"
#define URLCLASSIFIER_TRACKING_BLACKLIST_TEST_ENTRIES \ #define URLCLASSIFIER_TRACKING_BLACKLIST_TEST_ENTRIES \
"urlclassifier.trackingTable.testEntries" "urlclassifier.trackingTable.testEntries"
@ -32,7 +34,7 @@ StaticRefPtr<UrlClassifierFeatureTrackingProtection> gFeatureTrackingProtection;
UrlClassifierFeatureTrackingProtection::UrlClassifierFeatureTrackingProtection() UrlClassifierFeatureTrackingProtection::UrlClassifierFeatureTrackingProtection()
: UrlClassifierFeatureBase( : UrlClassifierFeatureBase(
NS_LITERAL_CSTRING("tracking-protection"), NS_LITERAL_CSTRING(TRACKING_PROTECTION_FEATURE_NAME),
NS_LITERAL_CSTRING(URLCLASSIFIER_TRACKING_BLACKLIST), NS_LITERAL_CSTRING(URLCLASSIFIER_TRACKING_BLACKLIST),
NS_LITERAL_CSTRING(URLCLASSIFIER_TRACKING_WHITELIST), NS_LITERAL_CSTRING(URLCLASSIFIER_TRACKING_WHITELIST),
NS_LITERAL_CSTRING(URLCLASSIFIER_TRACKING_BLACKLIST_TEST_ENTRIES), NS_LITERAL_CSTRING(URLCLASSIFIER_TRACKING_BLACKLIST_TEST_ENTRIES),
@ -40,25 +42,27 @@ UrlClassifierFeatureTrackingProtection::UrlClassifierFeatureTrackingProtection()
NS_LITERAL_CSTRING(TABLE_TRACKING_BLACKLIST_PREF), NS_LITERAL_CSTRING(TABLE_TRACKING_BLACKLIST_PREF),
NS_LITERAL_CSTRING(TABLE_TRACKING_WHITELIST_PREF), EmptyCString()) {} NS_LITERAL_CSTRING(TABLE_TRACKING_WHITELIST_PREF), EmptyCString()) {}
/* static */ void UrlClassifierFeatureTrackingProtection::Initialize() { /* static */ void UrlClassifierFeatureTrackingProtection::MaybeInitialize() {
UC_LOG(("UrlClassifierFeatureTrackingProtection: Initializing")); MOZ_ASSERT(XRE_IsParentProcess());
MOZ_ASSERT(!gFeatureTrackingProtection); UC_LOG(("UrlClassifierFeatureTrackingProtection: MaybeInitialize"));
gFeatureTrackingProtection = new UrlClassifierFeatureTrackingProtection(); if (!gFeatureTrackingProtection) {
gFeatureTrackingProtection->InitializePreferences(); gFeatureTrackingProtection = new UrlClassifierFeatureTrackingProtection();
gFeatureTrackingProtection->InitializePreferences();
}
} }
/* static */ void UrlClassifierFeatureTrackingProtection::Shutdown() { /* static */ void UrlClassifierFeatureTrackingProtection::MaybeShutdown() {
UC_LOG(("UrlClassifierFeatureTrackingProtection: Shutdown")); UC_LOG(("UrlClassifierFeatureTrackingProtection: Shutdown"));
MOZ_ASSERT(gFeatureTrackingProtection);
gFeatureTrackingProtection->ShutdownPreferences(); if (gFeatureTrackingProtection) {
gFeatureTrackingProtection = nullptr; gFeatureTrackingProtection->ShutdownPreferences();
gFeatureTrackingProtection = nullptr;
}
} }
/* static */ already_AddRefed<UrlClassifierFeatureTrackingProtection> /* static */ already_AddRefed<UrlClassifierFeatureTrackingProtection>
UrlClassifierFeatureTrackingProtection::MaybeCreate(nsIChannel* aChannel) { UrlClassifierFeatureTrackingProtection::MaybeCreate(nsIChannel* aChannel) {
MOZ_ASSERT(gFeatureTrackingProtection);
MOZ_ASSERT(aChannel); MOZ_ASSERT(aChannel);
UC_LOG(("UrlClassifierFeatureTrackingProtection: MaybeCreate for channel %p", UC_LOG(("UrlClassifierFeatureTrackingProtection: MaybeCreate for channel %p",
@ -98,6 +102,24 @@ UrlClassifierFeatureTrackingProtection::MaybeCreate(nsIChannel* aChannel) {
return nullptr; return nullptr;
} }
MaybeInitialize();
MOZ_ASSERT(gFeatureTrackingProtection);
RefPtr<UrlClassifierFeatureTrackingProtection> self =
gFeatureTrackingProtection;
return self.forget();
}
/* static */ already_AddRefed<nsIUrlClassifierFeature>
UrlClassifierFeatureTrackingProtection::GetIfNameMatches(
const nsACString& aName) {
if (!aName.EqualsLiteral(TRACKING_PROTECTION_FEATURE_NAME)) {
return nullptr;
}
MaybeInitialize();
MOZ_ASSERT(gFeatureTrackingProtection);
RefPtr<UrlClassifierFeatureTrackingProtection> self = RefPtr<UrlClassifierFeatureTrackingProtection> self =
gFeatureTrackingProtection; gFeatureTrackingProtection;
return self.forget(); return self.forget();

Просмотреть файл

@ -17,13 +17,14 @@ namespace net {
class UrlClassifierFeatureTrackingProtection final class UrlClassifierFeatureTrackingProtection final
: public UrlClassifierFeatureBase { : public UrlClassifierFeatureBase {
public: public:
static void Initialize(); static void MaybeShutdown();
static void Shutdown();
static already_AddRefed<UrlClassifierFeatureTrackingProtection> MaybeCreate( static already_AddRefed<UrlClassifierFeatureTrackingProtection> MaybeCreate(
nsIChannel* aChannel); nsIChannel* aChannel);
static already_AddRefed<nsIUrlClassifierFeature> GetIfNameMatches(
const nsACString& aName);
NS_IMETHOD ProcessChannel(nsIChannel* aChannel, const nsACString& aList, NS_IMETHOD ProcessChannel(nsIChannel* aChannel, const nsACString& aList,
bool* aShouldContinue) override; bool* aShouldContinue) override;
@ -33,6 +34,8 @@ class UrlClassifierFeatureTrackingProtection final
private: private:
UrlClassifierFeatureTrackingProtection(); UrlClassifierFeatureTrackingProtection();
static void MaybeInitialize();
}; };
} // namespace net } // namespace net

Просмотреть файл

@ -22,6 +22,7 @@ UNIFIED_SOURCES += [
'nsChannelClassifier.cpp', 'nsChannelClassifier.cpp',
'UrlClassifierCommon.cpp', 'UrlClassifierCommon.cpp',
'UrlClassifierFeatureBase.cpp', 'UrlClassifierFeatureBase.cpp',
'UrlClassifierFeatureCustomTables.cpp',
'UrlClassifierFeatureFactory.cpp', 'UrlClassifierFeatureFactory.cpp',
'UrlClassifierFeatureFlash.cpp', 'UrlClassifierFeatureFlash.cpp',
'UrlClassifierFeatureLoginReputation.cpp', 'UrlClassifierFeatureLoginReputation.cpp',

Просмотреть файл

@ -81,20 +81,6 @@ interface nsIURIClassifier : nsISupports
in boolean aTrackingProtectionEnabled, in boolean aTrackingProtectionEnabled,
in nsIURIClassifierCallback aCallback); in nsIURIClassifierCallback aCallback);
/**
* Asynchronously classify a URI with a comma-separated string
* containing the given tables. This does not make network requests.
* The callback does NOT totally follow nsIURIClassifierCallback's
* semantics described above. Only |aList| will be meaningful, which
* is a comma separated list of table names. (same as what classifyLocal
* returns.)
*/
void asyncClassifyLocalWithTables(in nsIURI aURI,
in ACString aTables,
in Array<ACString> aExtraTablesByPrefs,
in Array<ACString> aExtraEntriesByPrefs,
in nsIURIClassifierCallback aCallback);
/** /**
* Asynchronously classify a URI with list of features. This does not make * Asynchronously classify a URI with list of features. This does not make
* network requests. * network requests.
@ -104,6 +90,19 @@ interface nsIURIClassifier : nsISupports
in nsIUrlClassifierFeature_listType aListType, in nsIUrlClassifierFeature_listType aListType,
in nsIUrlClassifierFeatureCallback aCallback); in nsIUrlClassifierFeatureCallback aCallback);
/**
* Returns a feature named aFeatureName.
*/
nsIUrlClassifierFeature getFeatureByName(in ACString aFeatureName);
/**
* Create a new feature with a list of tables. This method is just for
* testing! Don't use it elsewhere.
*/
nsIUrlClassifierFeature createFeatureWithTables(in ACString aName,
in Array<ACString> aBlacklistTables,
in Array<ACString> aWhitelistTables);
/** /**
* Report to the provider that a Safe Browsing warning was shown. * Report to the provider that a Safe Browsing warning was shown.
* *

Просмотреть файл

@ -2245,19 +2245,21 @@ SpecialPowersAPI.prototype = {
let classifierService = let classifierService =
Cc["@mozilla.org/url-classifier/dbservice;1"].getService(Ci.nsIURIClassifier); Cc["@mozilla.org/url-classifier/dbservice;1"].getService(Ci.nsIURIClassifier);
let wrapCallback = (...args) => { let wrapCallback = results => {
Services.tm.dispatchToMainThread(() => { Services.tm.dispatchToMainThread(() => {
if (typeof callback == "function") { if (typeof callback == "function") {
callback(...args); callback(wrapIfUnwrapped(results));
} else { } else {
callback.onClassifyComplete.call(undefined, ...args); callback.onClassifyComplete.call(undefined, wrapIfUnwrapped(results));
} }
}); });
}; };
return classifierService.asyncClassifyLocalWithTables(unwrapIfWrapped(uri), let feature = classifierService.createFeatureWithTables("test", tables.split(","), []);
tables, [], [], return classifierService.asyncClassifyLocalWithFeatures(unwrapIfWrapped(uri),
wrapCallback); [feature],
Ci.nsIUrlClassifierFeature.blacklist,
wrapCallback);
}, },
EARLY_BETA_OR_EARLIER: AppConstants.EARLY_BETA_OR_EARLIER, EARLY_BETA_OR_EARLIER: AppConstants.EARLY_BETA_OR_EARLIER,

Просмотреть файл

@ -7,6 +7,7 @@
#define UrlClassifierTelemetryUtils_h__ #define UrlClassifierTelemetryUtils_h__
#include "mozilla/TypedEnumBits.h" #include "mozilla/TypedEnumBits.h"
#include "nsISupportsImpl.h"
namespace mozilla { namespace mozilla {
namespace safebrowsing { namespace safebrowsing {

Просмотреть файл

@ -47,6 +47,7 @@
#include "mozilla/dom/ContentChild.h" #include "mozilla/dom/ContentChild.h"
#include "mozilla/dom/PermissionMessageUtils.h" #include "mozilla/dom/PermissionMessageUtils.h"
#include "mozilla/dom/URLClassifierChild.h" #include "mozilla/dom/URLClassifierChild.h"
#include "mozilla/net/UrlClassifierFeatureFactory.h"
#include "mozilla/net/UrlClassifierFeatureResult.h" #include "mozilla/net/UrlClassifierFeatureResult.h"
#include "mozilla/ipc/URIUtils.h" #include "mozilla/ipc/URIUtils.h"
#include "mozilla/SyncRunnable.h" #include "mozilla/SyncRunnable.h"
@ -240,131 +241,6 @@ class FeatureHolder final {
nsTArray<RefPtr<TableData>> mTableData; nsTArray<RefPtr<TableData>> mTableData;
}; };
// Simple feature which wraps preferences and tables received by
// AsyncClassifyLocalWithTables() as arguments.
class DummyFeature final : public nsIUrlClassifierFeature {
public:
NS_DECL_ISUPPORTS
enum Type { ePreference, eTable };
explicit DummyFeature(const nsACString& aName)
: mType(eTable), mName(aName) {}
explicit DummyFeature(const nsACString& aPreference,
nsTArray<nsCString>& aHostsFromPreference)
: mType(ePreference),
mName(aPreference),
mHostsFromPreference(aHostsFromPreference) {}
NS_IMETHOD
GetName(nsACString& aName) override {
aName = mName;
return NS_OK;
}
NS_IMETHOD
GetTables(nsIUrlClassifierFeature::listType,
nsTArray<nsCString>& aTables) override {
if (mType == eTable) {
aTables.AppendElement(mName);
}
return NS_OK;
}
NS_IMETHOD
HasTable(const nsACString& aTable, nsIUrlClassifierFeature::listType,
bool* aResult) override {
NS_ENSURE_ARG_POINTER(aResult);
*aResult = mType == eTable && aTable == mName;
return NS_OK;
}
NS_IMETHOD
HasHostInPreferences(const nsACString& aHost,
nsIUrlClassifierFeature::listType,
nsACString& aPrefTableName, bool* aResult) override {
NS_ENSURE_ARG_POINTER(aResult);
*aResult = mHostsFromPreference.Contains(aHost);
aPrefTableName = mName;
return NS_OK;
}
NS_IMETHOD
GetSkipHostList(nsACString& aList) override {
// Nothing to do here.
return NS_OK;
}
NS_IMETHOD
ProcessChannel(nsIChannel* aChannel, const nsACString& aList,
bool* aShouldContinue) override {
NS_ENSURE_ARG_POINTER(aShouldContinue);
*aShouldContinue = true;
// Nothing to do here.
return NS_OK;
}
NS_IMETHODIMP
GetURIByListType(nsIChannel* aChannel,
nsIUrlClassifierFeature::listType aListType,
nsIURI** aURI) override {
return NS_ERROR_NOT_IMPLEMENTED;
}
private:
~DummyFeature() = default;
Type mType;
nsCString mName;
nsTArray<nsCString> mHostsFromPreference;
};
NS_IMPL_ISUPPORTS(DummyFeature, nsIUrlClassifierFeature)
// This class is a proxy from nsIUrlClassifierFeatureCallback to
// nsIUrlClassifierCallback.
class CallbackWrapper final : public nsIUrlClassifierFeatureCallback {
public:
NS_DECL_ISUPPORTS
explicit CallbackWrapper(nsIURIClassifierCallback* aCallback)
: mCallback(aCallback) {
MOZ_ASSERT(aCallback);
}
NS_IMETHOD
OnClassifyComplete(const nsTArray<RefPtr<nsIUrlClassifierFeatureResult>>&
aResults) override {
nsAutoCString finalList;
for (nsIUrlClassifierFeatureResult* result : aResults) {
const nsCString& list =
static_cast<mozilla::net::UrlClassifierFeatureResult*>(result)
->List();
MOZ_ASSERT(!list.IsEmpty());
if (!finalList.IsEmpty()) {
finalList.AppendLiteral(",");
}
finalList.Append(list);
}
mCallback->OnClassifyComplete(NS_OK, finalList, EmptyCString(),
EmptyCString());
return NS_OK;
}
private:
~CallbackWrapper() = default;
nsCOMPtr<nsIURIClassifierCallback> mCallback;
};
NS_IMPL_ISUPPORTS(CallbackWrapper, nsIUrlClassifierFeatureCallback)
} // namespace } // namespace
using namespace mozilla; using namespace mozilla;
@ -2003,50 +1879,6 @@ nsUrlClassifierDBService::Classify(nsIPrincipal* aPrincipal,
return NS_OK; return NS_OK;
} }
NS_IMETHODIMP
nsUrlClassifierDBService::AsyncClassifyLocalWithTables(
nsIURI* aURI, const nsACString& aTables,
const nsTArray<nsCString>& aExtraTablesByPrefs,
const nsTArray<nsCString>& aExtraEntriesByPrefs,
nsIURIClassifierCallback* aCallback) {
MOZ_ASSERT(NS_IsMainThread(),
"AsyncClassifyLocalWithTables must be called "
"on main thread");
if (aExtraTablesByPrefs.Length() != aExtraEntriesByPrefs.Length()) {
return NS_ERROR_FAILURE;
}
if (gShuttingDownThread) {
return NS_ERROR_ABORT;
}
// Let's convert the current params in a list of features.
nsTArray<RefPtr<nsIUrlClassifierFeature>> features;
for (uint32_t i = 0; i < aExtraTablesByPrefs.Length(); ++i) {
nsTArray<nsCString> hosts;
Classifier::SplitTables(aExtraEntriesByPrefs[i], hosts);
RefPtr<DummyFeature> feature =
new DummyFeature(aExtraTablesByPrefs[i], hosts);
features.AppendElement(feature);
}
nsTArray<nsCString> tables;
Classifier::SplitTables(aTables, tables);
for (uint32_t i = 0; i < tables.Length(); ++i) {
RefPtr<DummyFeature> feature = new DummyFeature(tables[i]);
features.AppendElement(feature);
}
RefPtr<CallbackWrapper> callback = new CallbackWrapper(aCallback);
// Doesn't really matter if we pass blacklist, whitelist or any other list
// here because the DummyFeature returns always the same values.
return AsyncClassifyLocalWithFeatures(
aURI, features, nsIUrlClassifierFeature::blacklist, callback);
}
class ThreatHitReportListener final : public nsIStreamListener { class ThreatHitReportListener final : public nsIStreamListener {
public: public:
NS_DECL_ISUPPORTS NS_DECL_ISUPPORTS
@ -2317,7 +2149,7 @@ nsresult nsUrlClassifierDBService::LookupURI(
nsCString table = aExtraTablesByPrefs[i]; nsCString table = aExtraTablesByPrefs[i];
nsCOMPtr<nsIUrlClassifierCallback> callback(c); nsCOMPtr<nsIUrlClassifierCallback> callback(c);
nsCOMPtr<nsIRunnable> cbRunnable = NS_NewRunnableFunction( nsCOMPtr<nsIRunnable> cbRunnable = NS_NewRunnableFunction(
"nsUrlClassifierDBService::AsyncClassifyLocalWithTables", "nsUrlClassifierDBService::LookupURI",
[callback, table]() -> void { callback->HandleEvent(table); }); [callback, table]() -> void { callback->HandleEvent(table); });
NS_DispatchToMainThread(cbRunnable); NS_DispatchToMainThread(cbRunnable);
@ -2852,3 +2684,34 @@ bool nsUrlClassifierDBService::AsyncClassifyLocalWithFeaturesUsingPreferences(
NS_DispatchToMainThread(cbRunnable); NS_DispatchToMainThread(cbRunnable);
return true; return true;
} }
NS_IMETHODIMP
nsUrlClassifierDBService::GetFeatureByName(const nsACString& aFeatureName,
nsIUrlClassifierFeature** aFeature) {
NS_ENSURE_ARG_POINTER(aFeature);
nsCOMPtr<nsIUrlClassifierFeature> feature =
mozilla::net::UrlClassifierFeatureFactory::GetFeatureByName(aFeatureName);
if (NS_WARN_IF(!feature)) {
return NS_ERROR_FAILURE;
}
feature.forget(aFeature);
return NS_OK;
}
NS_IMETHODIMP
nsUrlClassifierDBService::CreateFeatureWithTables(
const nsACString& aName, const nsTArray<nsCString>& aBlacklistTables,
const nsTArray<nsCString>& aWhitelistTables,
nsIUrlClassifierFeature** aFeature) {
NS_ENSURE_ARG_POINTER(aFeature);
nsCOMPtr<nsIUrlClassifierFeature> feature =
mozilla::net::UrlClassifierFeatureFactory::CreateFeatureWithTables(
aName, aBlacklistTables, aWhitelistTables);
if (NS_WARN_IF(!feature)) {
return NS_ERROR_FAILURE;
}
feature.forget(aFeature);
return NS_OK;
}

Просмотреть файл

@ -147,9 +147,15 @@ function testService() {
SpecialPowers.doUrlClassify(prin, null, test.trackingProtection, function(errorCode) { SpecialPowers.doUrlClassify(prin, null, test.trackingProtection, function(errorCode) {
is(errorCode, test.result, is(errorCode, test.result,
`Successful asynchronous classification of ${test.url} with TP=${test.trackingProtection}`); `Successful asynchronous classification of ${test.url} with TP=${test.trackingProtection}`);
SpecialPowers.doUrlClassifyLocal(uri, tables, function(errorCode1, tables1) { SpecialPowers.doUrlClassifyLocal(uri, tables, function(results) {
is(tables1, test.table, if (results.length == 0) {
`Successful asynchronous local classification of ${test.url} with TP=${test.trackingProtection}`); is(test.table, "",
`Successful asynchronous local classification of ${test.url} with TP=${test.trackingProtection}`);
} else {
let result = results[0].QueryInterface(Ci.nsIUrlClassifierFeatureResult);
is(result.list, test.table,
`Successful asynchronous local classification of ${test.url} with TP=${test.trackingProtection}`);
}
runNextTest(); runNextTest();
}); });

Просмотреть файл

@ -0,0 +1,61 @@
/* Any copyright is dedicated to the Public Domain.
http://creativecommons.org/publicdomain/zero/1.0/
*/
"use strict";
add_test(async _ => {
Services.prefs.setBoolPref("browser.safebrowsing.passwords.enabled", true);
let classifier = Cc["@mozilla.org/url-classifier/dbservice;1"]
.getService(Ci.nsIURIClassifier);
ok(!!classifier, "We have the URI-Classifier");
var tests = [
{ name: "a", expectedResult: false },
{ name: "tracking-annotation", expectedResult: true },
{ name: "tracking-protection", expectedResult: true },
{ name: "login-reputation", expectedResult: true },
];
tests.forEach(test => {
let feature;
try {
feature = classifier.getFeatureByName(test.name);
} catch (e) {
}
equal(!!feature, test.expectedResult, "Exceptected result for: " + test.name);
if (feature) {
equal(feature.name, test.name, "Feature name matches");
}
});
let uri = Services.io.newURI("https://example.com");
let feature = classifier.getFeatureByName("tracking-protection");
let results = await new Promise(resolve => {
classifier.asyncClassifyLocalWithFeatures(uri, [feature],
Ci.nsIUrlClassifierFeature.blacklist,
r => { resolve(r); });
});
equal(results.length, 0, "No tracker");
Services.prefs.setCharPref("urlclassifier.trackingTable.testEntries", "example.com");
feature = classifier.getFeatureByName("tracking-protection");
results = await new Promise(resolve => {
classifier.asyncClassifyLocalWithFeatures(uri, [feature],
Ci.nsIUrlClassifierFeature.blacklist,
r => { resolve(r); });
});
equal(results.length, 1, "Tracker");
let result = results[0];
equal(result.feature.name, "tracking-protection", "Correct feature");
equal(result.list, "tracking-blacklist-pref", "Correct list");
Services.prefs.clearUserPref("browser.safebrowsing.password.enabled");
run_next_test();
});

Просмотреть файл

@ -23,4 +23,5 @@ support-files =
[test_pref.js] [test_pref.js]
[test_malwaretable_pref.js] [test_malwaretable_pref.js]
[test_safebrowsing_protobuf.js] [test_safebrowsing_protobuf.js]
[test_platform_specific_threats.js] [test_platform_specific_threats.js]
[test_features.js]