Files

123 lines
4.1 KiB
C++

/* 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 https://mozilla.org/MPL/2.0/. */
#ifndef mozilla_ContentClassifierEngine_h
#define mozilla_ContentClassifierEngine_h
#include "content_classifier_ffi.h"
#include "nsError.h"
#include "nsString.h"
#include "nsTArray.h"
#include "nsIChannel.h"
namespace mozilla {
class ContentClassifierService;
struct ContentClassifierFeature;
// Per-engine outcome from ContentClassifierEngine::CheckNetworkRequest.
// Carries a reference back to the feature definition whose engine produced
// it, so consumers can attribute the match.
class ContentClassifierEngineResult {
public:
ContentClassifierEngineResult(bool aMatched, bool aException, bool aImportant,
nsresult aEngineResult,
const ContentClassifierFeature& aFeature)
: mMatched(aMatched),
mException(aException),
mImportant(aImportant),
mEngineResult(aEngineResult),
mFeature(aFeature) {}
ContentClassifierEngineResult(nsresult aEngineResult,
const ContentClassifierFeature& aFeature)
: mEngineResult(aEngineResult), mFeature(aFeature) {}
nsresult EngineResult() const { return mEngineResult; }
bool Matched() const { return NS_SUCCEEDED(mEngineResult) && mMatched; }
bool Exception() const { return NS_SUCCEEDED(mEngineResult) && mException; }
bool Important() const { return NS_SUCCEEDED(mEngineResult) && mImportant; }
const ContentClassifierFeature& Feature() const { return mFeature; }
private:
bool mMatched = false;
bool mException = false;
bool mImportant = false;
nsresult mEngineResult = NS_ERROR_UNEXPECTED;
const ContentClassifierFeature& mFeature;
};
class ContentClassifierRequest {
friend class ContentClassifierEngine;
nsCString mUrl;
nsCString mSchemelessSite;
nsCString mSourceSchemelessSite;
nsCString mTopWindowSchemelessSite;
nsCString mRequestType;
bool mThirdParty = false;
bool mThirdPartyToSource = false;
bool mPrivateBrowsing = false;
bool mValid = false;
bool mIsNonRecommendedAddon = false;
public:
bool Valid() const { return mValid; }
const nsCString& Url() const { return mUrl; }
bool ThirdParty() const { return mThirdParty; }
bool PrivateBrowsing() const { return mPrivateBrowsing; }
bool IsNonRecommendedAddon() const { return mIsNonRecommendedAddon; }
explicit ContentClassifierRequest(nsIChannel* aChannel);
ContentClassifierRequest(const nsACString& aUrl, const nsACString& aSourceUrl,
const nsACString& aTopWindowUrl,
const nsACString& aRequestType,
bool aPrivateBrowsing, bool aForceThirdParty,
bool aIsNonRecommendedAddon);
};
class ContentClassifierEngine final {
public:
NS_INLINE_DECL_THREADSAFE_REFCOUNTING(ContentClassifierEngine)
explicit ContentClassifierEngine(const ContentClassifierFeature& aFeature)
: mFeature(aFeature), mEngine(nullptr) {
if (!sInitializedETLDService) {
nsresult rv = content_classifier_initialize_domain_resolver();
if (NS_SUCCEEDED(rv)) {
sInitializedETLDService = true;
}
}
}
nsresult InitFromRules(const nsTArray<nsCString>& aRules) {
return content_classifier_engine_from_rules(&aRules, &mEngine);
}
const ContentClassifierFeature& Feature() const { return mFeature; }
ContentClassifierEngineResult CheckNetworkRequest(
const ContentClassifierRequest& aRequest, bool aPreviouslyMatched);
private:
~ContentClassifierEngine() {
if (mEngine) {
content_classifier_engine_destroy(mEngine);
mEngine = nullptr;
}
}
static inline bool sInitializedETLDService = false;
const ContentClassifierFeature& mFeature;
ContentClassifierFFIEngine* mEngine;
ContentClassifierEngine(const ContentClassifierEngine&) = delete;
ContentClassifierEngine& operator=(const ContentClassifierEngine&) = delete;
};
} // namespace mozilla
#endif // mozilla_ContentClassifierEngine_h