Files
sousa-gecko/dom/fetch/FetchChild.h
T
Simon Farre 79294530f2 Bug 2016380 - Fix edge case CSP Violation report sending r=edenchuang,dom-worker-reviewers,tschuster
An edge case amount of CSP reports, are triggered not with the global
present, in the parent process.

In those scenarios it uses listeners and fires events by
dispatching IPC, FetchChild::RecvOnCSPViolationEvent and
WindowGlobalChild::RecvDispatchSecurityPolicyViolation to fire an actual
"securitypolicyviolation" event that the webcontent can see.

This is the same time we should be
reporting the event to a potential ReportingObserver and also queuing
the report to be sent.

These two methods therefore get a "violated policy index" by which it
can use to look up the name for the group it should report to.

Differential Revision: https://phabricator.services.mozilla.com/D283683
2026-03-04 13:40:39 +00:00

100 lines
3.1 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 mozilla_dom_fetchChild_h_
#define mozilla_dom_fetchChild_h_
#include "mozilla/dom/AbortFollower.h"
#include "mozilla/dom/AbortSignal.h"
#include "mozilla/dom/FlippedOnce.h"
#include "mozilla/dom/PFetchChild.h"
#include "mozilla/dom/SerializedStackHolder.h"
#include "nsIConsoleReportCollector.h"
#include "nsISupports.h"
#include "nsIWorkerChannelInfo.h"
namespace mozilla::dom {
class FetchObserver;
class ThreadSafeWorkerRef;
class Promise;
class WorkerPrivate;
class FetchChild final : public PFetchChild, public AbortFollower {
friend class PFetchChild;
public:
NS_DECL_THREADSAFE_ISUPPORTS
mozilla::ipc::IPCResult Recv__delete__(const nsresult&& aResult);
mozilla::ipc::IPCResult RecvOnResponseAvailableInternal(
ParentToChildInternalResponse&& aResponse);
mozilla::ipc::IPCResult RecvOnResponseEnd(ResponseEndArgs&& aArgs);
mozilla::ipc::IPCResult RecvOnDataAvailable();
mozilla::ipc::IPCResult RecvOnFlushConsoleReport(
nsTArray<net::ConsoleReportCollected>&& aReports);
mozilla::ipc::IPCResult RecvOnCSPViolationEvent(
const nsAString& aJSon, const nsAString& aReportGroupName);
mozilla::ipc::IPCResult RecvOnReportPerformanceTiming(
ResponseTiming&& aTiming);
mozilla::ipc::IPCResult RecvOnNotifyNetworkMonitorAlternateStack(
uint64_t aChannelID);
void SetCSPEventListener(nsICSPEventListener* aListener);
// Creates the actor for worker fetch requests
static RefPtr<FetchChild> CreateForWorker(WorkerPrivate* aWorkerPrivate,
RefPtr<Promise> aPromise,
RefPtr<AbortSignalImpl> aSignalImpl,
RefPtr<FetchObserver> aObserver);
// Creates the actor for main thread fetch requests
static RefPtr<FetchChild> CreateForMainThread(
RefPtr<Promise> aPromise, RefPtr<AbortSignalImpl> aSignalImpl,
RefPtr<FetchObserver> aObserver);
FetchChild(RefPtr<Promise>&& aPromise, RefPtr<AbortSignalImpl>&& aSignalImpl,
RefPtr<FetchObserver>&& aObserver);
// AbortFollower
void RunAbortAlgorithm() override;
void DoFetchOp(const FetchOpArgs& aArgs);
void SetOriginStack(UniquePtr<SerializedStackHolder>&& aStack) {
MOZ_ASSERT(!mOriginStack);
mOriginStack = std::move(aStack);
}
private:
~FetchChild() = default;
// WorkerPrivate shutdown callback.
void Shutdown();
void ActorDestroy(ActorDestroyReason aReason) override;
RefPtr<ThreadSafeWorkerRef> mWorkerRef;
bool mIsKeepAliveRequest{false};
uint64_t mKeepaliveRequestSize{0};
RefPtr<Promise> mPromise;
RefPtr<AbortSignalImpl> mSignalImpl;
RefPtr<FetchObserver> mFetchObserver;
UniquePtr<SerializedStackHolder> mOriginStack;
nsCOMPtr<nsICSPEventListener> mCSPEventListener;
nsCOMPtr<nsIConsoleReportCollector> mReporter;
FlippedOnce<false> mIsShutdown;
nsCOMPtr<nsIWorkerChannelInfo> mWorkerChannelInfo;
};
} // namespace mozilla::dom
#endif