1 /* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
2 /* This Source Code Form is subject to the terms of the Mozilla Public
3  * License, v. 2.0. If a copy of the MPL was not distributed with this
4  * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
5 
6 #ifndef mozilla_net_SocketProcessParent_h
7 #define mozilla_net_SocketProcessParent_h
8 
9 #include "mozilla/UniquePtr.h"
10 #include "mozilla/ipc/BackgroundParent.h"
11 #include "mozilla/ipc/CrashReporterHelper.h"
12 #include "mozilla/ipc/InputStreamUtils.h"
13 #include "mozilla/net/PSocketProcessParent.h"
14 
15 namespace mozilla {
16 
17 namespace dom {
18 class MemoryReport;
19 class MemoryReportRequestHost;
20 }  // namespace dom
21 
22 namespace net {
23 
24 class SocketProcessHost;
25 
26 // IPC actor of socket process in parent process. This is allocated and managed
27 // by SocketProcessHost.
28 class SocketProcessParent final
29     : public PSocketProcessParent,
30       public ipc::CrashReporterHelper<GeckoProcessType_Socket>,
31       public ipc::ParentToChildStreamActorManager {
32  public:
33   friend class SocketProcessHost;
34 
35   explicit SocketProcessParent(SocketProcessHost* aHost);
36   ~SocketProcessParent();
37 
38   static SocketProcessParent* GetSingleton();
39 
40   mozilla::ipc::IPCResult RecvAddMemoryReport(const MemoryReport& aReport);
41   mozilla::ipc::IPCResult RecvFinishMemoryReport(const uint32_t& aGeneration);
42   mozilla::ipc::IPCResult RecvAccumulateChildHistograms(
43       nsTArray<HistogramAccumulation>&& aAccumulations);
44   mozilla::ipc::IPCResult RecvAccumulateChildKeyedHistograms(
45       nsTArray<KeyedHistogramAccumulation>&& aAccumulations);
46   mozilla::ipc::IPCResult RecvUpdateChildScalars(
47       nsTArray<ScalarAction>&& aScalarActions);
48   mozilla::ipc::IPCResult RecvUpdateChildKeyedScalars(
49       nsTArray<KeyedScalarAction>&& aScalarActions);
50   mozilla::ipc::IPCResult RecvRecordChildEvents(
51       nsTArray<ChildEventData>&& events);
52   mozilla::ipc::IPCResult RecvRecordDiscardedData(
53       const DiscardedData& aDiscardedData);
54 
55   PWebrtcTCPSocketParent* AllocPWebrtcTCPSocketParent(
56       const Maybe<TabId>& aTabId);
57   bool DeallocPWebrtcTCPSocketParent(PWebrtcTCPSocketParent* aActor);
58   already_AddRefed<PDNSRequestParent> AllocPDNSRequestParent(
59       const nsCString& aHost, const nsCString& aTrrServer,
60       const uint16_t& aType, const OriginAttributes& aOriginAttributes,
61       const uint32_t& aFlags);
62   virtual mozilla::ipc::IPCResult RecvPDNSRequestConstructor(
63       PDNSRequestParent* actor, const nsCString& hostName,
64       const nsCString& trrServer, const uint16_t& type,
65       const OriginAttributes& aOriginAttributes,
66       const uint32_t& flags) override;
67 
68   void ActorDestroy(ActorDestroyReason aWhy) override;
69   bool SendRequestMemoryReport(const uint32_t& aGeneration,
70                                const bool& aAnonymize,
71                                const bool& aMinimizeMemoryUsage,
72                                const Maybe<ipc::FileDescriptor>& aDMDFile);
73 
74   PFileDescriptorSetParent* AllocPFileDescriptorSetParent(
75       const FileDescriptor& fd);
76   bool DeallocPFileDescriptorSetParent(PFileDescriptorSetParent* aActor);
77 
78   PChildToParentStreamParent* AllocPChildToParentStreamParent();
79   bool DeallocPChildToParentStreamParent(PChildToParentStreamParent* aActor);
80   PParentToChildStreamParent* AllocPParentToChildStreamParent();
81   bool DeallocPParentToChildStreamParent(PParentToChildStreamParent* aActor);
82 
83   PParentToChildStreamParent* SendPParentToChildStreamConstructor(
84       PParentToChildStreamParent* aActor) override;
85   PFileDescriptorSetParent* SendPFileDescriptorSetConstructor(
86       const FileDescriptor& aFD) override;
87 
88   mozilla::ipc::IPCResult RecvObserveHttpActivity(
89       const HttpActivityArgs& aArgs, const uint32_t& aActivityType,
90       const uint32_t& aActivitySubtype, const PRTime& aTimestamp,
91       const uint64_t& aExtraSizeData, const nsCString& aExtraStringData);
92 
93   mozilla::ipc::IPCResult RecvInitBackground(
94       Endpoint<PBackgroundParent>&& aEndpoint);
95 
96   already_AddRefed<PAltServiceParent> AllocPAltServiceParent();
97 
98   mozilla::ipc::IPCResult RecvGetTLSClientCert(
99       const nsCString& aHostName, const OriginAttributes& aOriginAttributes,
100       const int32_t& aPort, const uint32_t& aProviderFlags,
101       const uint32_t& aProviderTlsFlags, const ByteArray& aServerCert,
102       Maybe<ByteArray>&& aClientCert, nsTArray<ByteArray>&& aCollectedCANames,
103       bool* aSucceeded, ByteArray* aOutCert, ByteArray* aOutKey,
104       nsTArray<ByteArray>* aBuiltChain);
105 
106   already_AddRefed<PProxyConfigLookupParent> AllocPProxyConfigLookupParent(
107       nsIURI* aURI, const uint32_t& aProxyResolveFlags);
108   mozilla::ipc::IPCResult RecvPProxyConfigLookupConstructor(
109       PProxyConfigLookupParent* aActor, nsIURI* aURI,
110       const uint32_t& aProxyResolveFlags) override;
111 
112   mozilla::ipc::IPCResult RecvCachePushCheck(
113       nsIURI* aPushedURL, OriginAttributes&& aOriginAttributes,
114       nsCString&& aRequestString, CachePushCheckResolver&& aResolver);
115 
116  private:
117   SocketProcessHost* mHost;
118   UniquePtr<dom::MemoryReportRequestHost> mMemoryReportRequest;
119 
120   static void Destroy(UniquePtr<SocketProcessParent>&& aParent);
121 };
122 
123 }  // namespace net
124 }  // namespace mozilla
125 
126 #endif  // mozilla_net_SocketProcessParent_h
127