Bug 1141814 - Part2: Lower the priority of channel loading tracking resource, r=honzab

--HG--
extra : rebase_source : 8b79d23c4d2f8a813a9e76816bd540dd91bc6f8e
This commit is contained in:
Kershaw Chang 2016-11-23 22:23:00 +01:00
Родитель 90c2d1f846
Коммит d7704a975d
4 изменённых файлов: 68 добавлений и 19 удалений

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

@ -312,9 +312,9 @@ nsBaseChannel::ClassifyURI()
}
if (mLoadFlags & LOAD_CLASSIFY_URI) {
RefPtr<nsChannelClassifier> classifier = new nsChannelClassifier();
RefPtr<nsChannelClassifier> classifier = new nsChannelClassifier(this);
if (classifier) {
classifier->Start(this);
classifier->Start();
} else {
Cancel(NS_ERROR_OUT_OF_MEMORY);
}

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

@ -25,6 +25,7 @@
#include "nsIScriptSecurityManager.h"
#include "nsISecureBrowserUI.h"
#include "nsISecurityEventSink.h"
#include "nsISupportsPriority.h"
#include "nsIURL.h"
#include "nsIWebProgressListener.h"
#include "nsNetUtil.h"
@ -50,14 +51,25 @@ static LazyLogModule gChannelClassifierLog("nsChannelClassifier");
NS_IMPL_ISUPPORTS(nsChannelClassifier,
nsIURIClassifierCallback)
nsChannelClassifier::nsChannelClassifier()
nsChannelClassifier::nsChannelClassifier(nsIChannel *aChannel)
: mIsAllowListed(false),
mSuspendedChannel(false)
mSuspendedChannel(false),
mChannel(aChannel),
mTrackingProtectionEnabled(Nothing())
{
MOZ_ASSERT(mChannel);
}
nsresult
nsChannelClassifier::ShouldEnableTrackingProtection(nsIChannel *aChannel,
nsChannelClassifier::ShouldEnableTrackingProtection(bool *result)
{
nsresult rv = ShouldEnableTrackingProtectionInternal(mChannel, result);
mTrackingProtectionEnabled = Some(*result);
return rv;
}
nsresult
nsChannelClassifier::ShouldEnableTrackingProtectionInternal(nsIChannel *aChannel,
bool *result)
{
// Should only be called in the parent process.
@ -252,10 +264,8 @@ nsChannelClassifier::NotifyTrackingProtectionDisabled(nsIChannel *aChannel)
}
void
nsChannelClassifier::Start(nsIChannel *aChannel)
nsChannelClassifier::Start()
{
mChannel = aChannel;
nsresult rv = StartInternal();
if (NS_FAILED(rv)) {
// If we aren't getting a callback for any reason, assume a good verdict and
@ -344,7 +354,19 @@ nsChannelClassifier::StartInternal()
bool expectCallback;
bool trackingProtectionEnabled = false;
(void)ShouldEnableTrackingProtection(mChannel, &trackingProtectionEnabled);
if (mTrackingProtectionEnabled.isNothing()) {
(void)ShouldEnableTrackingProtection(&trackingProtectionEnabled);
} else {
trackingProtectionEnabled = mTrackingProtectionEnabled.value();
}
static bool sAnnotateChannelEnabled = false;
static bool sIsInited = false;
if (!sIsInited) {
sIsInited = true;
Preferences::AddBoolVarCache(&sAnnotateChannelEnabled,
"privacy.trackingprotection.annotate_channels");
}
if (LOG_ENABLED()) {
nsCOMPtr<nsIURI> principalURI;
@ -353,8 +375,8 @@ nsChannelClassifier::StartInternal()
"uri %s", this, principalURI->GetSpecOrDefault().get(),
uri->GetSpecOrDefault().get()));
}
rv = uriClassifier->Classify(principal, trackingProtectionEnabled, this,
&expectCallback);
rv = uriClassifier->Classify(principal, sAnnotateChannelEnabled | trackingProtectionEnabled,
this, &expectCallback);
if (NS_FAILED(rv)) {
return rv;
}
@ -667,6 +689,26 @@ nsChannelClassifier::OnClassifyComplete(nsresult aErrorCode)
}
MarkEntryClassified(aErrorCode);
// The value of |mTrackingProtectionEnabled| should be assigned at
// |ShouldEnableTrackingProtection| before.
MOZ_ASSERT(mTrackingProtectionEnabled, "Should contain a value.");
if (aErrorCode == NS_ERROR_TRACKING_URI &&
!mTrackingProtectionEnabled.valueOr(false)) {
if (LOG_ENABLED()) {
nsCOMPtr<nsIURI> uri;
mChannel->GetURI(getter_AddRefs(uri));
LOG(("nsChannelClassifier[%p]: lower the priority of channel %p"
", since %s is a tracker", this, mChannel.get(),
uri->GetSpecOrDefault().get()));
}
nsCOMPtr<nsISupportsPriority> p = do_QueryInterface(mChannel);
if (p) {
p->SetPriority(nsISupportsPriority::PRIORITY_LOWEST);
}
aErrorCode = NS_OK;
}
if (NS_FAILED(aErrorCode)) {
if (LOG_ENABLED()) {
nsCOMPtr<nsIURI> uri;

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

@ -8,6 +8,7 @@
#include "nsIURIClassifier.h"
#include "nsCOMPtr.h"
#include "mozilla/Attributes.h"
#include "mozilla/Maybe.h"
class nsIChannel;
class nsIHttpChannelInternal;
@ -19,16 +20,16 @@ namespace net {
class nsChannelClassifier final : public nsIURIClassifierCallback
{
public:
nsChannelClassifier();
explicit nsChannelClassifier(nsIChannel* aChannel);
NS_DECL_ISUPPORTS
NS_DECL_NSIURICLASSIFIERCALLBACK
// Calls nsIURIClassifier.Classify with the principal of the given channel,
// and cancels the channel on a bad verdict.
void Start(nsIChannel *aChannel);
void Start();
// Whether or not tracking protection should be enabled on this channel.
nsresult ShouldEnableTrackingProtection(nsIChannel *aChannel, bool *result);
nsresult ShouldEnableTrackingProtection(bool *result);
private:
// True if the channel is on the allow list.
@ -36,6 +37,7 @@ private:
// True if the channel has been suspended.
bool mSuspendedChannel;
nsCOMPtr<nsIChannel> mChannel;
Maybe<bool> mTrackingProtectionEnabled;
~nsChannelClassifier() {}
// Caches good classifications for the channel principal.
@ -52,6 +54,9 @@ private:
// Checks that the channel was loaded by the URI currently loaded in aDoc
static bool SameLoadingURI(nsIDocument *aDoc, nsIChannel *aChannel);
nsresult ShouldEnableTrackingProtectionInternal(nsIChannel *aChannel,
bool *result);
public:
// If we are blocking tracking content, update the corresponding flag in
// the respective docshell and call nsISecurityEventSink::onSecurityChange.

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

@ -5885,12 +5885,14 @@ nsHttpChannel::BeginConnect()
return AsyncCall(&nsHttpChannel::HandleAsyncAPIRedirect);
}
// Check to see if this principal exists on local blocklists.
RefPtr<nsChannelClassifier> channelClassifier = new nsChannelClassifier();
RefPtr<nsChannelClassifier> channelClassifier = new nsChannelClassifier(this);
if (mLoadFlags & LOAD_CLASSIFY_URI) {
nsCOMPtr<nsIURIClassifier> classifier = do_GetService(NS_URICLASSIFIERSERVICE_CONTRACTID);
bool tpEnabled = false;
channelClassifier->ShouldEnableTrackingProtection(this, &tpEnabled);
if (classifier && tpEnabled) {
channelClassifier->ShouldEnableTrackingProtection(&tpEnabled);
bool annotateChannelEnabled =
Preferences::GetBool("privacy.trackingprotection.annotate_channels");
if (classifier && (tpEnabled || annotateChannelEnabled)) {
// We skip speculative connections by setting mLocalBlocklist only
// when tracking protection is enabled. Though we could do this for
// both phishing and malware, it is not necessary for correctness,
@ -6012,7 +6014,7 @@ nsHttpChannel::BeginConnect()
// be overridden.
LOG(("nsHttpChannel::Starting nsChannelClassifier %p [this=%p]",
channelClassifier.get(), this));
channelClassifier->Start(this);
channelClassifier->Start();
if (callContinueBeginConnect) {
return ContinueBeginConnectWithResult();
}