Bug 1015466 - Part 1, skeleton of PHttpBackgroundChannel. r=mayhemer
PHttpBackgroundChannel is introduced to deliver OnStopRequest/OnTransportAndData/OnProgress/OnStatus on background thread.
FlushedForDiversion/DivertMessages is moved to PHttpBackgroundChannel to ensure no more channel event are delivered after these two messages on the background channel.
OnStartRequestSent is introduced to synchronize the execution order between OnStartRequest (main thread IPC) and all other messages on PHttpBackgroundChannel.
MozReview-Commit-ID: HfqvPML6EKw
--- a/ipc/glue/BackgroundChildImpl.cpp
+++ b/ipc/glue/BackgroundChildImpl.cpp
@@ -554,16 +554,31 @@ bool
BackgroundChildImpl::DeallocPWebAuthnTransactionChild(PWebAuthnTransactionChild* aActor)
{
MOZ_ASSERT(aActor);
RefPtr<dom::WebAuthnTransactionChild> child =
dont_AddRef(static_cast<dom::WebAuthnTransactionChild*>(aActor));
return true;
}
+net::PHttpBackgroundChannelChild*
+BackgroundChildImpl::AllocPHttpBackgroundChannelChild(const uint64_t& aChannelId)
+{
+ MOZ_CRASH("PHttpBackgroundChannelChild actor should be manually constructed!");
+ return nullptr;
+}
+
+bool
+BackgroundChildImpl::DeallocPHttpBackgroundChannelChild(PHttpBackgroundChannelChild* aActor)
+{
+ MOZ_ASSERT(aActor);
+ // TODO
+ return true;
+}
+
} // namespace ipc
} // namespace mozilla
mozilla::ipc::IPCResult
TestChild::Recv__delete__(const nsCString& aTestArg)
{
MOZ_RELEASE_ASSERT(aTestArg == mTestArg,
"BackgroundTest message was corrupted!");
--- a/ipc/glue/BackgroundChildImpl.h
+++ b/ipc/glue/BackgroundChildImpl.h
@@ -197,16 +197,22 @@ protected:
OnChannelReceivedMessage(const Message& aMsg) override;
#endif
virtual PWebAuthnTransactionChild*
AllocPWebAuthnTransactionChild() override;
virtual bool
DeallocPWebAuthnTransactionChild(PWebAuthnTransactionChild* aActor) override;
+
+ virtual PHttpBackgroundChannelChild*
+ AllocPHttpBackgroundChannelChild(const uint64_t& aChannelId) override;
+
+ virtual bool
+ DeallocPHttpBackgroundChannelChild(PHttpBackgroundChannelChild* aActor) override;
};
class BackgroundChildImpl::ThreadLocal final
{
friend class nsAutoPtr<ThreadLocal>;
public:
nsAutoPtr<mozilla::dom::indexedDB::ThreadLocal> mIndexedDBThreadLocal;
--- a/ipc/glue/BackgroundParentImpl.cpp
+++ b/ipc/glue/BackgroundParentImpl.cpp
@@ -32,16 +32,17 @@
#include "mozilla/ipc/BackgroundParent.h"
#include "mozilla/ipc/BackgroundUtils.h"
#include "mozilla/ipc/IPCStreamAlloc.h"
#include "mozilla/ipc/PBackgroundSharedTypes.h"
#include "mozilla/ipc/PBackgroundTestParent.h"
#include "mozilla/ipc/PChildToParentStreamParent.h"
#include "mozilla/ipc/PParentToChildStreamParent.h"
#include "mozilla/layout/VsyncParent.h"
+#include "mozilla/net/HttpBackgroundChannelParent.h"
#include "mozilla/dom/network/UDPSocketParent.h"
#include "mozilla/dom/WebAuthnTransactionParent.h"
#include "mozilla/Preferences.h"
#include "nsNetUtil.h"
#include "nsIScriptSecurityManager.h"
#include "nsProxyRelease.h"
#include "mozilla/RefPtr.h"
#include "nsThreadUtils.h"
@@ -867,16 +868,50 @@ BackgroundParentImpl::AllocPWebAuthnTran
bool
BackgroundParentImpl::DeallocPWebAuthnTransactionParent(dom::PWebAuthnTransactionParent *aActor)
{
MOZ_ASSERT(aActor);
delete aActor;
return true;
}
+net::PHttpBackgroundChannelParent*
+BackgroundParentImpl::AllocPHttpBackgroundChannelParent(const uint64_t& aChannelId)
+{
+ AssertIsInMainProcess();
+ AssertIsOnBackgroundThread();
+
+ return new net::HttpBackgroundChannelParent();
+}
+
+mozilla::ipc::IPCResult
+BackgroundParentImpl::RecvPHttpBackgroundChannelConstructor(
+ net::PHttpBackgroundChannelParent *aActor,
+ const uint64_t& aChannelId)
+{
+ MOZ_ASSERT(aActor);
+ AssertIsInMainProcess();
+ AssertIsOnBackgroundThread();
+
+ //TODO
+ return IPC_OK();
+}
+
+bool
+BackgroundParentImpl::DeallocPHttpBackgroundChannelParent(
+ net::PHttpBackgroundChannelParent *aActor)
+{
+ MOZ_ASSERT(aActor);
+ AssertIsInMainProcess();
+ AssertIsOnBackgroundThread();
+
+ //TODO
+ return true;
+}
+
} // namespace ipc
} // namespace mozilla
void
TestParent::ActorDestroy(ActorDestroyReason aWhy)
{
mozilla::ipc::AssertIsInMainProcess();
AssertIsOnBackgroundThread();
--- a/ipc/glue/BackgroundParentImpl.h
+++ b/ipc/glue/BackgroundParentImpl.h
@@ -221,14 +221,23 @@ protected:
virtual bool
DeallocPGamepadTestChannelParent(PGamepadTestChannelParent* aActor) override;
virtual PWebAuthnTransactionParent*
AllocPWebAuthnTransactionParent() override;
virtual bool
DeallocPWebAuthnTransactionParent(PWebAuthnTransactionParent* aActor) override;
+
+ virtual PHttpBackgroundChannelParent*
+ AllocPHttpBackgroundChannelParent(const uint64_t& aChannelId) override;
+
+ virtual mozilla::ipc::IPCResult
+ RecvPHttpBackgroundChannelConstructor(PHttpBackgroundChannelParent *aActor,
+ const uint64_t& aChannelId) override;
+ virtual bool
+ DeallocPHttpBackgroundChannelParent(PHttpBackgroundChannelParent *aActor) override;
};
} // namespace ipc
} // namespace mozilla
#endif // mozilla_ipc_backgroundparentimpl_h__
--- a/ipc/glue/PBackground.ipdl
+++ b/ipc/glue/PBackground.ipdl
@@ -9,16 +9,17 @@ include protocol PBackgroundTest;
include protocol PBroadcastChannel;
include protocol PCache;
include protocol PCacheStorage;
include protocol PCacheStreamControl;
include protocol PFileDescriptorSet;
include protocol PFileSystemRequest;
include protocol PGamepadEventChannel;
include protocol PGamepadTestChannel;
+include protocol PHttpBackgroundChannel;
include protocol PIPCBlobInputStream;
include protocol PPendingIPCBlob;
include protocol PMessagePort;
include protocol PCameras;
include protocol PQuota;
include protocol PChildToParentStream;
include protocol PParentToChildStream;
include protocol PServiceWorkerManager;
@@ -56,16 +57,17 @@ sync protocol PBackground
manages PBroadcastChannel;
manages PCache;
manages PCacheStorage;
manages PCacheStreamControl;
manages PFileDescriptorSet;
manages PFileSystemRequest;
manages PGamepadEventChannel;
manages PGamepadTestChannel;
+ manages PHttpBackgroundChannel;
manages PIPCBlobInputStream;
manages PPendingIPCBlob;
manages PMessagePort;
manages PCameras;
manages PQuota;
manages PChildToParentStream;
manages PParentToChildStream;
manages PServiceWorkerManager;
@@ -110,16 +112,18 @@ parent:
async PQuota();
async PFileSystemRequest(FileSystemParams params);
async PGamepadEventChannel();
async PGamepadTestChannel();
+ async PHttpBackgroundChannel(uint64_t channelId);
+
async PWebAuthnTransaction();
child:
async PCache();
async PCacheStreamControl();
async PParentToChildStream();
new file mode 100644
--- /dev/null
+++ b/netwerk/protocol/http/HttpBackgroundChannelChild.cpp
@@ -0,0 +1,79 @@
+/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* vim: set sw=2 ts=8 et tw=80 : */
+
+/* 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 "HttpBackgroundChannelChild.h"
+
+using mozilla::ipc::IPCResult;
+
+namespace mozilla {
+namespace net {
+
+HttpBackgroundChannelChild::HttpBackgroundChannelChild()
+{
+}
+
+HttpBackgroundChannelChild::~HttpBackgroundChannelChild()
+{
+}
+
+IPCResult
+HttpBackgroundChannelChild::RecvOnStartRequestSent()
+{
+ return IPC_OK();
+}
+
+IPCResult
+HttpBackgroundChannelChild::RecvOnTransportAndData(
+ const nsresult& aChannelStatus,
+ const nsresult& aTransportStatus,
+ const uint64_t& aOffset,
+ const uint32_t& aCount,
+ const nsCString& aData)
+{
+ return IPC_OK();
+}
+
+IPCResult
+HttpBackgroundChannelChild::RecvOnStopRequest(
+ const nsresult& aChannelStatus,
+ const ResourceTimingStruct& aTiming)
+{
+ return IPC_OK();
+}
+
+IPCResult
+HttpBackgroundChannelChild::RecvOnProgress(const int64_t& aProgress,
+ const int64_t& aProgressMax)
+{
+ return IPC_OK();
+}
+
+IPCResult
+HttpBackgroundChannelChild::RecvOnStatus(const nsresult& aStatus)
+{
+ return IPC_OK();
+}
+
+IPCResult
+HttpBackgroundChannelChild::RecvFlushedForDiversion()
+{
+ return IPC_OK();
+}
+
+IPCResult
+HttpBackgroundChannelChild::RecvDivertMessages()
+{
+ return IPC_OK();
+}
+
+void
+HttpBackgroundChannelChild::ActorDestroy(ActorDestroyReason aWhy)
+{
+}
+
+} // namespace net
+} // namespace mozilla
new file mode 100644
--- /dev/null
+++ b/netwerk/protocol/http/HttpBackgroundChannelChild.h
@@ -0,0 +1,52 @@
+/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* vim: set sw=2 ts=8 et tw=80 : */
+
+/* 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 mozilla_net_HttpBackgroundChannelChild_h
+#define mozilla_net_HttpBackgroundChannelChild_h
+
+#include "mozilla/net/PHttpBackgroundChannelChild.h"
+
+using mozilla::ipc::IPCResult;
+
+namespace mozilla {
+namespace net {
+
+class HttpBackgroundChannelChild final : public PHttpBackgroundChannelChild
+{
+public:
+ explicit HttpBackgroundChannelChild();
+
+ virtual ~HttpBackgroundChannelChild();
+
+protected:
+ IPCResult RecvOnTransportAndData(const nsresult& aChannelStatus,
+ const nsresult& aTransportStatus,
+ const uint64_t& aOffset,
+ const uint32_t& aCount,
+ const nsCString& aData) override;
+
+ IPCResult RecvOnStopRequest(const nsresult& aChannelStatus,
+ const ResourceTimingStruct& aTiming) override;
+
+ IPCResult RecvOnProgress(const int64_t& aProgress,
+ const int64_t& aProgressMax) override;
+
+ IPCResult RecvOnStatus(const nsresult& aStatus) override;
+
+ IPCResult RecvFlushedForDiversion() override;
+
+ IPCResult RecvDivertMessages() override;
+
+ IPCResult RecvOnStartRequestSent() override;
+
+ void ActorDestroy(ActorDestroyReason aWhy) override;
+};
+
+} // namespace net
+} // namespace mozilla
+
+#endif // mozilla_net_HttpBackgroundChannelChild_h
new file mode 100644
--- /dev/null
+++ b/netwerk/protocol/http/HttpBackgroundChannelParent.cpp
@@ -0,0 +1,29 @@
+/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* vim: set sw=2 ts=8 et tw=80 : */
+
+/* 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 "HttpBackgroundChannelParent.h"
+
+using mozilla::ipc::IPCResult;
+
+namespace mozilla {
+namespace net {
+
+HttpBackgroundChannelParent::HttpBackgroundChannelParent()
+{
+}
+
+HttpBackgroundChannelParent::~HttpBackgroundChannelParent()
+{
+}
+
+void
+HttpBackgroundChannelParent::ActorDestroy(ActorDestroyReason aWhy)
+{
+}
+
+} // namespace net
+} // namespace mozilla
new file mode 100644
--- /dev/null
+++ b/netwerk/protocol/http/HttpBackgroundChannelParent.h
@@ -0,0 +1,30 @@
+/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* vim: set sw=2 ts=8 et tw=80 : */
+
+/* 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 mozilla_net_HttpBackgroundChannelParent_h
+#define mozilla_net_HttpBackgroundChannelParent_h
+
+#include "mozilla/net/PHttpBackgroundChannelParent.h"
+
+namespace mozilla {
+namespace net {
+
+class HttpBackgroundChannelParent final : public PHttpBackgroundChannelParent
+{
+public:
+ explicit HttpBackgroundChannelParent();
+
+ virtual ~HttpBackgroundChannelParent();
+
+protected:
+ void ActorDestroy(ActorDestroyReason aWhy) override;
+};
+
+} // namespace net
+} // namespace mozilla
+
+#endif // mozilla_net_HttpBackgroundChannelParent_h
new file mode 100644
--- /dev/null
+++ b/netwerk/protocol/http/PHttpBackgroundChannel.ipdl
@@ -0,0 +1,57 @@
+/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* 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 "mozilla/net/NeckoMessageUtils.h";
+
+using struct mozilla::net::ResourceTimingStruct from "mozilla/net/TimingStruct.h";
+
+namespace mozilla {
+namespace net {
+
+//-------------------------------------------------------------------
+async protocol PHttpBackgroundChannel
+{
+ manager PBackground;
+
+child:
+ // OnStartRequest is sent over main thread IPC. The following
+ // OnTransportAndData/OnStopRequest/OnProgress/OnStatus/FlushForDiversion/
+ // DivertMessages needs to wait in content process until OnStartRequest
+ // is processed. For synchronizing the event sequence.
+ async OnStartRequestSent();
+
+ // Combines a single OnDataAvailable and its associated OnProgress &
+ // OnStatus calls into one IPDL message
+ async OnTransportAndData(nsresult channelStatus,
+ nsresult transportStatus,
+ uint64_t offset,
+ uint32_t count,
+ nsCString data);
+
+ async OnStopRequest(nsresult channelStatus, ResourceTimingStruct timing);
+
+ async OnProgress(int64_t progress, int64_t progressMax);
+
+ async OnStatus(nsresult status);
+
+ // 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();
+
+ async __delete__();
+
+};
+
+
+} // namespace net
+} // namespace mozilla
--- a/netwerk/protocol/http/moz.build
+++ b/netwerk/protocol/http/moz.build
@@ -34,16 +34,18 @@ EXPORTS += [
'nsHttpRequestHead.h',
'nsHttpResponseHead.h',
]
EXPORTS.mozilla.net += [
'AltDataOutputStreamChild.h',
'AltDataOutputStreamParent.h',
'HttpAuthUtils.h',
+ 'HttpBackgroundChannelChild.h',
+ 'HttpBackgroundChannelParent.h',
'HttpBaseChannel.h',
'HttpChannelChild.h',
'HttpChannelParent.h',
'HttpInfo.h',
'NullHttpChannel.h',
'PHttpChannelParams.h',
'PSpdyPush.h',
'TimingStruct.h',
@@ -61,16 +63,18 @@ UNIFIED_SOURCES += [
'CacheControlParser.cpp',
'ConnectionDiagnostics.cpp',
'HSTSPrimerListener.cpp',
'Http2Compression.cpp',
'Http2Push.cpp',
'Http2Session.cpp',
'Http2Stream.cpp',
'HttpAuthUtils.cpp',
+ 'HttpBackgroundChannelChild.cpp',
+ 'HttpBackgroundChannelParent.cpp',
'HttpBaseChannel.cpp',
'HttpChannelChild.cpp',
'HttpChannelParent.cpp',
'HttpChannelParentListener.cpp',
'HttpInfo.cpp',
'InterceptedChannel.cpp',
'nsCORSListenerProxy.cpp',
'nsHttp.cpp',
@@ -96,16 +100,17 @@ UNIFIED_SOURCES += [
# These files cannot be built in unified mode because of OS X headers.
SOURCES += [
'nsHttpHandler.cpp',
]
IPDL_SOURCES += [
'PAltDataOutputStream.ipdl',
+ 'PHttpBackgroundChannel.ipdl',
'PHttpChannel.ipdl',
]
EXTRA_JS_MODULES += [
'UserAgentOverrides.jsm',
'UserAgentUpdates.jsm',
]