1 /* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
2 /* vim: set ts=8 sts=2 et sw=2 tw=80: */
3 /* This Source Code Form is subject to the terms of the Mozilla Public
4 * License, v. 2.0. If a copy of the MPL was not distributed with this
5 * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
7 #include "UrlClassifierFeatureBase.h"
8 #include "Classifier.h"
9 #include "mozilla/Preferences.h"
13 using namespace safebrowsing
;
19 void OnPrefsChange(const char* aPrefName
, void* aArray
) {
20 auto array
= static_cast<nsTArray
<nsCString
>*>(aArray
);
24 Preferences::GetCString(aPrefName
, value
);
25 Classifier::SplitTables(value
, *array
);
30 NS_INTERFACE_MAP_BEGIN(UrlClassifierFeatureBase
)
31 NS_INTERFACE_MAP_ENTRY_AMBIGUOUS(nsISupports
, nsIUrlClassifierFeature
)
32 NS_INTERFACE_MAP_ENTRY(nsIUrlClassifierFeature
)
33 NS_INTERFACE_MAP_ENTRY(nsIUrlClassifierSkipListObserver
)
36 NS_IMPL_ADDREF(UrlClassifierFeatureBase
)
37 NS_IMPL_RELEASE(UrlClassifierFeatureBase
)
39 UrlClassifierFeatureBase::UrlClassifierFeatureBase(
40 const nsACString
& aName
, const nsACString
& aPrefBlacklistTables
,
41 const nsACString
& aPrefWhitelistTables
,
42 const nsACString
& aPrefBlacklistHosts
,
43 const nsACString
& aPrefWhitelistHosts
,
44 const nsACString
& aPrefBlacklistTableName
,
45 const nsACString
& aPrefWhitelistTableName
, const nsACString
& aPrefSkipHosts
)
46 : mName(aName
), mPrefSkipHosts(aPrefSkipHosts
) {
47 static_assert(nsIUrlClassifierFeature::blacklist
== 0,
48 "nsIUrlClassifierFeature::blacklist must be 0");
49 static_assert(nsIUrlClassifierFeature::whitelist
== 1,
50 "nsIUrlClassifierFeature::whitelist must be 1");
52 mPrefTables
[nsIUrlClassifierFeature::blacklist
] = aPrefBlacklistTables
;
53 mPrefTables
[nsIUrlClassifierFeature::whitelist
] = aPrefWhitelistTables
;
55 mPrefHosts
[nsIUrlClassifierFeature::blacklist
] = aPrefBlacklistHosts
;
56 mPrefHosts
[nsIUrlClassifierFeature::whitelist
] = aPrefWhitelistHosts
;
58 mPrefTableNames
[nsIUrlClassifierFeature::blacklist
] = aPrefBlacklistTableName
;
59 mPrefTableNames
[nsIUrlClassifierFeature::whitelist
] = aPrefWhitelistTableName
;
62 UrlClassifierFeatureBase::~UrlClassifierFeatureBase() = default;
64 void UrlClassifierFeatureBase::InitializePreferences() {
65 for (uint32_t i
= 0; i
< 2; ++i
) {
66 if (!mPrefTables
[i
].IsEmpty()) {
67 Preferences::RegisterCallbackAndCall(OnPrefsChange
, mPrefTables
[i
],
71 if (!mPrefHosts
[i
].IsEmpty()) {
72 Preferences::RegisterCallbackAndCall(OnPrefsChange
, mPrefHosts
[i
],
77 nsCOMPtr
<nsIUrlClassifierSkipListService
> skipListService
=
78 do_GetService("@mozilla.org/url-classifier/skip-list-service;1");
79 if (NS_WARN_IF(!skipListService
)) {
83 skipListService
->RegisterAndRunSkipListObserver(mName
, mPrefSkipHosts
, this);
86 void UrlClassifierFeatureBase::ShutdownPreferences() {
87 for (uint32_t i
= 0; i
< 2; ++i
) {
88 if (!mPrefTables
[i
].IsEmpty()) {
89 Preferences::UnregisterCallback(OnPrefsChange
, mPrefTables
[i
],
93 if (!mPrefHosts
[i
].IsEmpty()) {
94 Preferences::UnregisterCallback(OnPrefsChange
, mPrefHosts
[i
], &mHosts
[i
]);
98 nsCOMPtr
<nsIUrlClassifierSkipListService
> skipListService
=
99 do_GetService("@mozilla.org/url-classifier/skip-list-service;1");
100 if (skipListService
) {
101 skipListService
->UnregisterSkipListObserver(mName
, this);
106 UrlClassifierFeatureBase::OnSkipListUpdate(const nsACString
& aList
) {
112 UrlClassifierFeatureBase::GetName(nsACString
& aName
) {
118 UrlClassifierFeatureBase::GetTables(nsIUrlClassifierFeature::listType aListType
,
119 nsTArray
<nsCString
>& aTables
) {
120 if (aListType
!= nsIUrlClassifierFeature::blacklist
&&
121 aListType
!= nsIUrlClassifierFeature::whitelist
) {
122 return NS_ERROR_INVALID_ARG
;
125 aTables
= mTables
[aListType
].Clone();
130 UrlClassifierFeatureBase::HasTable(const nsACString
& aTable
,
131 nsIUrlClassifierFeature::listType aListType
,
133 NS_ENSURE_ARG_POINTER(aResult
);
135 if (aListType
!= nsIUrlClassifierFeature::blacklist
&&
136 aListType
!= nsIUrlClassifierFeature::whitelist
) {
137 return NS_ERROR_INVALID_ARG
;
140 *aResult
= mTables
[aListType
].Contains(aTable
);
145 UrlClassifierFeatureBase::HasHostInPreferences(
146 const nsACString
& aHost
, nsIUrlClassifierFeature::listType aListType
,
147 nsACString
& aPrefTableName
, bool* aResult
) {
148 NS_ENSURE_ARG_POINTER(aResult
);
150 if (aListType
!= nsIUrlClassifierFeature::blacklist
&&
151 aListType
!= nsIUrlClassifierFeature::whitelist
) {
152 return NS_ERROR_INVALID_ARG
;
155 *aResult
= mHosts
[aListType
].Contains(aHost
);
157 aPrefTableName
= mPrefTableNames
[aListType
];
163 UrlClassifierFeatureBase::GetSkipHostList(nsACString
& aList
) {
169 } // namespace mozilla