Bug 1015466 - Part 5, move tracking protection and safe browsing state update IPC to PBackground. r?mayhemer
NotifyTrackingProtectionDisabled/NotifyTrackingResource/SetClassifierMatchedInfo updates tracking protection and safe browsing states from parent to child.
They should at least handled by child process before OnStopRequest. Move them to PHttpBackgroundChannel can ensure that.
MozReview-Commit-ID: 8T6k9z9FgrI
--- a/netwerk/protocol/http/HttpBackgroundChannelChild.cpp
+++ b/netwerk/protocol/http/HttpBackgroundChannelChild.cpp
@@ -352,16 +352,67 @@ HttpBackgroundChannelChild::RecvDivertMe
return IPC_OK();
}
mChannelChild->ProcessDivertMessages();
return IPC_OK();
}
+IPCResult
+HttpBackgroundChannelChild::RecvNotifyTrackingProtectionDisabled()
+{
+ LOG(("HttpBackgroundChannelChild::RecvNotifyTrackingProtectionDisabled [this=%p]\n", this));
+ MOZ_ASSERT(NS_IsMainThread());
+
+ if (NS_WARN_IF(!mChannelChild)) {
+ return IPC_OK();
+ }
+
+ // NotifyTrackingProtectionDisabled has no order dependency to OnStartRequest.
+ // It this be handled as soon as possible
+ mChannelChild->ProcessNotifyTrackingProtectionDisabled();
+
+ return IPC_OK();
+}
+
+IPCResult
+HttpBackgroundChannelChild::RecvNotifyTrackingResource()
+{
+ LOG(("HttpBackgroundChannelChild::RecvNotifyTrackingResource [this=%p]\n", this));
+ MOZ_ASSERT(NS_IsMainThread());
+
+ if (NS_WARN_IF(!mChannelChild)) {
+ return IPC_OK();
+ }
+
+ // NotifyTrackingResource has no order dependency to OnStartRequest.
+ // It this be handled as soon as possible
+ mChannelChild->ProcessNotifyTrackingResource();
+
+ return IPC_OK();
+}
+
+IPCResult
+HttpBackgroundChannelChild::RecvSetClassifierMatchedInfo(const ClassifierInfo& info)
+{
+ LOG(("HttpBackgroundChannelChild::RecvSetClassifierMatchedInfo [this=%p]\n", this));
+ MOZ_ASSERT(NS_IsMainThread());
+
+ if (NS_WARN_IF(!mChannelChild)) {
+ return IPC_OK();
+ }
+
+ // SetClassifierMatchedInfo has no order dependency to OnStartRequest.
+ // It this be handled as soon as possible
+ mChannelChild->ProcessSetClassifierMatchedInfo(info.list(), info.provider(), info.prefix());
+
+ return IPC_OK();
+}
+
void
HttpBackgroundChannelChild::ActorDestroy(ActorDestroyReason aWhy)
{
LOG(("HttpBackgroundChannelChild::ActorDestroy[this=%p]\n", this));
MOZ_ASSERT(NS_IsMainThread());
// Ensure all IPC messages received before ActorDestroy can be
// handled correctly. If there is any pending IPC message, destroyed
--- a/netwerk/protocol/http/HttpBackgroundChannelChild.h
+++ b/netwerk/protocol/http/HttpBackgroundChannelChild.h
@@ -8,16 +8,17 @@
#ifndef mozilla_net_HttpBackgroundChannelChild_h
#define mozilla_net_HttpBackgroundChannelChild_h
#include "mozilla/net/PHttpBackgroundChannelChild.h"
#include "nsIRunnable.h"
#include "nsTArray.h"
using mozilla::ipc::IPCResult;
+using mozilla::dom::ClassifierInfo;
namespace mozilla {
namespace net {
class HttpChannelChild;
class HttpBackgroundChannelChild final : public PHttpBackgroundChannelChild
{
@@ -58,16 +59,22 @@ protected:
IPCResult RecvOnStatus(const nsresult& aStatus) override;
IPCResult RecvFlushedForDiversion() override;
IPCResult RecvDivertMessages() override;
IPCResult RecvOnStartRequestSent() override;
+ IPCResult RecvNotifyTrackingProtectionDisabled() override;
+
+ IPCResult RecvNotifyTrackingResource() override;
+
+ IPCResult RecvSetClassifierMatchedInfo(const ClassifierInfo& info) override;
+
void ActorDestroy(ActorDestroyReason aWhy) override;
private:
virtual ~HttpBackgroundChannelChild();
// Initiate the creation of the PBckground IPC channel.
// Return false if failed.
bool CreateBackgroundChannel();
--- a/netwerk/protocol/http/HttpBackgroundChannelParent.cpp
+++ b/netwerk/protocol/http/HttpBackgroundChannelParent.cpp
@@ -299,16 +299,95 @@ HttpBackgroundChannelParent::OnDiversion
// the OnDataAvailables and OnStopRequest to associated HttpChannelParent.
if (!SendDivertMessages()) {
return false;
}
return true;
}
+bool
+HttpBackgroundChannelParent::OnNotifyTrackingProtectionDisabled()
+{
+ LOG(("HttpBackgroundChannelParent::OnNotifyTrackingProtectionDisabled [this=%p]\n", this));
+ AssertIsInMainProcess();
+
+ if (NS_WARN_IF(!mIPCOpened)) {
+ return false;
+ }
+
+ if (!IsOnBackgroundThread()) {
+ nsresult rv = mBackgroundThread->Dispatch(
+ NewRunnableMethod(this, &HttpBackgroundChannelParent::OnNotifyTrackingProtectionDisabled),
+ NS_DISPATCH_NORMAL);
+
+ MOZ_DIAGNOSTIC_ASSERT(NS_SUCCEEDED(rv));
+
+ return NS_SUCCEEDED(rv);
+ }
+
+ return SendNotifyTrackingProtectionDisabled();
+}
+
+bool
+HttpBackgroundChannelParent::OnNotifyTrackingResource()
+{
+ LOG(("HttpBackgroundChannelParent::OnNotifyTrackingResource [this=%p]\n", this));
+ AssertIsInMainProcess();
+
+ if (NS_WARN_IF(!mIPCOpened)) {
+ return false;
+ }
+
+ if (!IsOnBackgroundThread()) {
+ nsresult rv = mBackgroundThread->Dispatch(
+ NewRunnableMethod(this, &HttpBackgroundChannelParent::OnNotifyTrackingResource),
+ NS_DISPATCH_NORMAL);
+
+ MOZ_DIAGNOSTIC_ASSERT(NS_SUCCEEDED(rv));
+
+ return NS_SUCCEEDED(rv);
+ }
+
+ return SendNotifyTrackingResource();
+}
+
+bool
+HttpBackgroundChannelParent::OnSetClassifierMatchedInfo(
+ const nsACString& aList,
+ const nsACString& aProvider,
+ const nsACString& aPrefix)
+{
+ LOG(("HttpBackgroundChannelParent::OnSetClassifierMatchedInfo [this=%p]\n", this));
+ AssertIsInMainProcess();
+
+ if (NS_WARN_IF(!mIPCOpened)) {
+ return false;
+ }
+
+ if (!IsOnBackgroundThread()) {
+ nsresult rv = mBackgroundThread->Dispatch(
+ NewRunnableMethod<const nsCString, const nsCString, const nsCString>
+ (this, &HttpBackgroundChannelParent::OnSetClassifierMatchedInfo,
+ aList, aProvider, aPrefix),
+ NS_DISPATCH_NORMAL);
+
+ MOZ_DIAGNOSTIC_ASSERT(NS_SUCCEEDED(rv));
+
+ return NS_SUCCEEDED(rv);
+ }
+
+ ClassifierInfo info;
+ info.list() = aList;
+ info.prefix() = aPrefix;
+ info.provider() = aProvider;
+
+ return SendSetClassifierMatchedInfo(info);
+}
+
void
HttpBackgroundChannelParent::ActorDestroy(ActorDestroyReason aWhy)
{
LOG(("HttpBackgroundChannelParent::ActorDestroy [this=%p]\n", this));
AssertIsInMainProcess();
AssertIsOnBackgroundThread();
mIPCOpened = false;
--- a/netwerk/protocol/http/HttpBackgroundChannelParent.h
+++ b/netwerk/protocol/http/HttpBackgroundChannelParent.h
@@ -59,16 +59,27 @@ public:
// To send OnStatus message over background channel.
bool OnStatus(const nsresult& aStatus);
// To send FlushedForDiversion and DivertMessages messages
// over background channel.
bool OnDiversion();
+ // To send NotifyTrackingProtectionDisabled message over background channel.
+ bool OnNotifyTrackingProtectionDisabled();
+
+ // To send NotifyTrackingResource message over background channel.
+ bool OnNotifyTrackingResource();
+
+ // To send SetClassifierMatchedInfo message over background channel.
+ bool OnSetClassifierMatchedInfo(const nsACString& aList,
+ const nsACString& aProvider,
+ const nsACString& aPrefix);
+
protected:
void ActorDestroy(ActorDestroyReason aWhy) override;
private:
virtual ~HttpBackgroundChannelParent();
Atomic<bool> mIPCOpened;
--- a/netwerk/protocol/http/HttpChannelChild.cpp
+++ b/netwerk/protocol/http/HttpChannelChild.cpp
@@ -1726,49 +1726,57 @@ HttpChannelChild::ProcessFlushedForDiver
{
LOG(("HttpChannelChild::ProcessFlushedForDiversion [this=%p]\n", this));
MOZ_ASSERT(NS_IsMainThread());
MOZ_RELEASE_ASSERT(mDivertingToParent);
mEventQ->RunOrEnqueue(new HttpFlushedForDiversionEvent(this), true);
}
-mozilla::ipc::IPCResult
-HttpChannelChild::RecvNotifyTrackingProtectionDisabled()
+void
+HttpChannelChild::ProcessNotifyTrackingProtectionDisabled()
{
+ LOG(("HttpChannelChild::ProcessNotifyTrackingProtectionDisabled [this=%p]\n", this));
+ MOZ_ASSERT(NS_IsMainThread());
+
nsChannelClassifier::NotifyTrackingProtectionDisabled(this);
- return IPC_OK();
}
-mozilla::ipc::IPCResult
-HttpChannelChild::RecvNotifyTrackingResource()
+void
+HttpChannelChild::ProcessNotifyTrackingResource()
{
+ LOG(("HttpChannelChild::ProcessNotifyTrackingResource [this=%p]\n", this));
+ MOZ_ASSERT(NS_IsMainThread());
+
SetIsTrackingResource();
- return IPC_OK();
}
void
HttpChannelChild::FlushedForDiversion()
{
LOG(("HttpChannelChild::FlushedForDiversion [this=%p]\n", this));
MOZ_RELEASE_ASSERT(mDivertingToParent);
// Once this is set, it should not be unset before HttpChannelChild is taken
// down. After it is set, no OnStart/OnData/OnStop callbacks should be
// received from the parent channel, nor dequeued from the ChannelEventQueue.
mFlushedForDiversion = true;
SendDivertComplete();
}
-mozilla::ipc::IPCResult
-HttpChannelChild::RecvSetClassifierMatchedInfo(const ClassifierInfo& aInfo)
+void
+HttpChannelChild::ProcessSetClassifierMatchedInfo(const nsCString& aList,
+ const nsCString& aProvider,
+ const nsCString& aPrefix)
{
- SetMatchedInfo(aInfo.list(), aInfo.provider(), aInfo.prefix());
- return IPC_OK();
+ LOG(("HttpChannelChild::ProcessSetClassifierMatchedInfo [this=%p]\n", this));
+ MOZ_ASSERT(NS_IsMainThread());
+
+ SetMatchedInfo(aList, aProvider, aPrefix);
}
void
HttpChannelChild::ProcessDivertMessages()
{
LOG(("HttpChannelChild::ProcessDivertMessages [this=%p]\n", this));
MOZ_ASSERT(NS_IsMainThread());
MOZ_RELEASE_ASSERT(mDivertingToParent);
--- a/netwerk/protocol/http/HttpChannelChild.h
+++ b/netwerk/protocol/http/HttpChannelChild.h
@@ -106,20 +106,17 @@ public:
// IPDL holds a reference while the PHttpChannel protocol is live (starting at
// AsyncOpen, and ending at either OnStopRequest or any IPDL error, either of
// which call NeckoChild::DeallocPHttpChannelChild()).
void AddIPDLReference();
void ReleaseIPDLReference();
MOZ_MUST_USE bool IsSuspended();
- mozilla::ipc::IPCResult RecvNotifyTrackingProtectionDisabled() override;
- mozilla::ipc::IPCResult RecvNotifyTrackingResource() override;
void FlushedForDiversion();
- mozilla::ipc::IPCResult RecvSetClassifierMatchedInfo(const ClassifierInfo& aInfo) override;
void OnCopyComplete(nsresult aStatus) override;
// Callback while background channel is ready.
void OnBackgroundChildReady(HttpBackgroundChannelChild* aBgChild);
// Callback while background channel is destroyed.
void OnBackgroundChildDestroyed();
@@ -221,16 +218,22 @@ private:
const uint32_t& aCount,
const nsCString& aData);
void ProcessOnStopRequest(const nsresult& aStatusCode,
const ResourceTimingStruct& aTiming);
void ProcessOnProgress(const int64_t& aProgress, const int64_t& aProgressMax);
void ProcessOnStatus(const nsresult& aStatus);
void ProcessFlushedForDiversion();
void ProcessDivertMessages();
+ void ProcessNotifyTrackingProtectionDisabled();
+ void ProcessNotifyTrackingResource();
+ void ProcessSetClassifierMatchedInfo(const nsCString& aList,
+ const nsCString& aProvider,
+ const nsCString& aPrefix);
+
void DoOnStartRequest(nsIRequest* aRequest, nsISupports* aContext);
void DoOnStatus(nsIRequest* aRequest, nsresult status);
void DoOnProgress(nsIRequest* aRequest, int64_t progress, int64_t progressMax);
void DoOnDataAvailable(nsIRequest* aRequest, nsISupports* aContext, nsIInputStream* aStream,
uint64_t offset, uint32_t count);
void DoPreOnStopRequest(nsresult aStatus);
void DoOnStopRequest(nsIRequest* aRequest, nsresult aChannelStatus, nsISupports* aContext);
--- a/netwerk/protocol/http/HttpChannelParent.cpp
+++ b/netwerk/protocol/http/HttpChannelParent.cpp
@@ -1690,42 +1690,45 @@ HttpChannelParent::SetParentListener(Htt
"mParentListener is null.");
mParentListener = aListener;
return NS_OK;
}
NS_IMETHODIMP
HttpChannelParent::NotifyTrackingProtectionDisabled()
{
- if (!mIPCClosed)
- Unused << SendNotifyTrackingProtectionDisabled();
+ LOG(("HttpChannelParent::NotifyTrackingProtectionDisabled [this=%p]\n", this));
+ if (!mIPCClosed) {
+ MOZ_ASSERT(mBgParent);
+ Unused << mBgParent->OnNotifyTrackingProtectionDisabled();
+ }
return NS_OK;
}
NS_IMETHODIMP
HttpChannelParent::SetClassifierMatchedInfo(const nsACString& aList,
const nsACString& aProvider,
const nsACString& aPrefix)
{
+ LOG(("HttpChannelParent::SetClassifierMatchedInfo [this=%p]\n", this));
if (!mIPCClosed) {
- ClassifierInfo info;
- info.list() = aList;
- info.prefix() = aPrefix;
- info.provider() = aProvider;
-
- Unused << SendSetClassifierMatchedInfo(info);
+ MOZ_ASSERT(mBgParent);
+ Unused << mBgParent->OnSetClassifierMatchedInfo(aList, aProvider, aPrefix);
}
return NS_OK;
}
NS_IMETHODIMP
HttpChannelParent::NotifyTrackingResource()
{
- if (!mIPCClosed)
- Unused << SendNotifyTrackingResource();
+ LOG(("HttpChannelParent::NotifyTrackingResource [this=%p]\n", this));
+ if (!mIPCClosed) {
+ MOZ_ASSERT(mBgParent);
+ Unused << mBgParent->OnNotifyTrackingResource();
+ }
return NS_OK;
}
NS_IMETHODIMP
HttpChannelParent::Delete()
{
if (!mIPCClosed)
Unused << DoSendDeleteSelf();
--- a/netwerk/protocol/http/PHttpBackgroundChannel.ipdl
+++ b/netwerk/protocol/http/PHttpBackgroundChannel.ipdl
@@ -2,16 +2,17 @@
/* vim: set sw=2 ts=8 et tw=80 ft=cpp : */
/* 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 protocol PBackground;
include NeckoChannelParams;
+include PURLClassifierInfo;
include "mozilla/net/NeckoMessageUtils.h";
using struct mozilla::net::ResourceTimingStruct from "mozilla/net/TimingStruct.h";
namespace mozilla {
namespace net {
@@ -43,15 +44,25 @@ child:
// Parent has been suspended for diversion; no more events to be enqueued.
async FlushedForDiversion();
// Child should resume processing the ChannelEventQueue, i.e. diverting any
// OnDataAvailable and OnStopRequest messages in the queue back to the parent.
async DivertMessages();
+ // Tell the child that tracking protection was disabled for this load.
+ async NotifyTrackingProtectionDisabled();
+
+ // Tell the child that the resource being loaded is on the tracking
+ // protection list.
+ async NotifyTrackingResource();
+
+ // Tell the child information of matched URL againts SafeBrowsing list
+ async SetClassifierMatchedInfo(ClassifierInfo info);
+
async __delete__();
};
} // namespace net
} // namespace mozilla
--- a/netwerk/protocol/http/PHttpChannel.ipdl
+++ b/netwerk/protocol/http/PHttpChannel.ipdl
@@ -5,17 +5,16 @@
* 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 protocol PNecko;
include InputStreamParams;
include URIParams;
include PBackgroundSharedTypes;
include NeckoChannelParams;
-include PURLClassifierInfo;
include "mozilla/net/NeckoMessageUtils.h";
using class nsHttpHeaderArray from "nsHttpHeaderArray.h";
using mozilla::net::NetAddr from "mozilla/net/DNS.h";
using struct mozilla::net::ResourceTimingStruct from "mozilla/net/TimingStruct.h";
namespace mozilla {
@@ -125,37 +124,27 @@ child:
// Called if redirect successful so that child can complete setup.
async Redirect3Complete();
// Associate the child with an application ids
async AssociateApplicationCache(nsCString groupID,
nsCString clientID);
- // Tell the child that tracking protection was disabled for this load.
- async NotifyTrackingProtectionDisabled();
-
- // Tell the child that the resource being loaded is on the tracking
- // protection list.
- async NotifyTrackingResource();
-
// Report a security message to the console associated with this
// channel.
async ReportSecurityMessage(nsString messageTag, nsString messageCategory);
// Tell child to delete channel (all IPDL deletes must be done from child to
// avoid races: see bug 591708).
async DeleteSelf();
// Tell the child to issue a deprecation warning.
async IssueDeprecationWarning(uint32_t warning, bool asError);
- // Tell the child information of matched URL againts SafeBrowsing list
- async SetClassifierMatchedInfo(ClassifierInfo info);
-
both:
// After receiving this message, the parent also calls
// SendFinishInterceptedRedirect, and makes sure not to send any more messages
// after that. When receiving this message, the child will call
// Send__delete__() and complete the steps required to finish the redirect.
async FinishInterceptedRedirect();
async SetPriority(int16_t priority);