gecko-dev/netwerk/base/nsChannelClassifier.h
Kershaw Chang c0c44ffb82 Bug 1360581 - Part2: Do channel annotation a bit earlier and only for third-party uri, r=francois
This patch includes two changes:
1. The current channel annotation is happened at nsChannelClassifier::OnClassifyComplete and this is too late because this channel might be already hit the network.
This patch adds a new API CheckIsTrackerWithLocalTable in nsChannelClassifier to check if the URI is in local blacklist and whitelist before calling BeginConnectActual.
Please note that whitelist will be checked only when TP is disabled.
2. Skip channel annotation for first-party and top-level load http channels

--HG--
extra : rebase_source : 78f98f8200d3dbb1cb96cd0a33901b2a82227974
2017-06-13 01:16:00 +02:00

107 lines
4.3 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 http://mozilla.org/MPL/2.0/. */
#ifndef nsChannelClassifier_h__
#define nsChannelClassifier_h__
#include "nsIObserver.h"
#include "nsIURIClassifier.h"
#include "nsCOMPtr.h"
#include "mozilla/Attributes.h"
#include "mozilla/Maybe.h"
class nsIChannel;
class nsIHttpChannelInternal;
class nsIDocument;
namespace mozilla {
namespace net {
class nsChannelClassifier final : public nsIURIClassifierCallback,
public nsIObserver
{
public:
explicit nsChannelClassifier(nsIChannel* aChannel);
NS_DECL_ISUPPORTS
NS_DECL_NSIURICLASSIFIERCALLBACK
NS_DECL_NSIOBSERVER
// Calls nsIURIClassifier.Classify with the principal of the given channel,
// and cancels the channel on a bad verdict.
void Start();
// Whether or not tracking protection should be enabled on this channel.
bool ShouldEnableTrackingProtection();
// Whether or not to annotate the channel with tracking protection list.
bool ShouldEnableTrackingAnnotation();
// Helper function to check a tracking URI against the whitelist
nsresult IsTrackerWhitelisted(nsIURI* aWhiteListURI,
nsIURIClassifierCallback* aCallback);
// Called once we actually classified an URI. (An additional whitelist
// check will be done if the classifier reports the URI is a tracker.)
nsresult OnClassifyCompleteInternal(nsresult aErrorCode,
const nsACString& aList,
const nsACString& aProvider,
const nsACString& aPrefix);
// Check a tracking URI against the local blacklist and whitelist.
// Returning NS_OK means the check will be processed
// and the caller should wait for the result.
nsresult CheckIsTrackerWithLocalTable(nsIURIClassifierCallback* aCallback);
// Helper function to create a whitelist URL.
already_AddRefed<nsIURI> CreateWhiteListURI() const;
already_AddRefed<nsIChannel> GetChannel();
private:
// True if the channel is on the allow list.
bool mIsAllowListed;
// True if the channel has been suspended.
bool mSuspendedChannel;
nsCOMPtr<nsIChannel> mChannel;
Maybe<bool> mTrackingProtectionEnabled;
Maybe<bool> mTrackingAnnotationEnabled;
~nsChannelClassifier() {}
// Caches good classifications for the channel principal.
void MarkEntryClassified(nsresult status);
bool HasBeenClassified(nsIChannel *aChannel);
// Helper function so that we ensure we call ContinueBeginConnect once
// Start is called. Returns NS_OK if and only if we will get a callback
// from the classifier service.
nsresult StartInternal();
// Helper function to check a URI against the hostname whitelist
bool IsHostnameWhitelisted(nsIURI *aUri, const nsACString &aWhitelisted);
// Checks that the channel was loaded by the URI currently loaded in aDoc
static bool SameLoadingURI(nsIDocument *aDoc, nsIChannel *aChannel);
// Note this function will be also used to decide whether or not to enable
// channel annotation. When |aAnnotationsOnly| is true, this function
// is called by ShouldEnableTrackingAnnotation(). Otherwise, this is called
// by ShouldEnableTrackingProtection().
nsresult ShouldEnableTrackingProtectionInternal(nsIChannel *aChannel,
bool aAnnotationsOnly,
bool *result);
bool AddonMayLoad(nsIChannel *aChannel, nsIURI *aUri);
void AddShutdownObserver();
void RemoveShutdownObserver();
public:
// If we are blocking content, update the corresponding flag in the respective
// docshell and call nsISecurityEventSink::onSecurityChange.
static nsresult SetBlockedContent(nsIChannel *channel,
nsresult aErrorCode,
const nsACString& aList,
const nsACString& aProvider,
const nsACString& aPrefix);
static nsresult NotifyTrackingProtectionDisabled(nsIChannel *aChannel);
};
} // namespace net
} // namespace mozilla
#endif