Commit 95e14a9e authored by Manuel Bucher's avatar Manuel Bucher
Browse files

Bug 1815934 - Only allow correct ContentParent to connect to...

Bug 1815934 - Only allow correct ContentParent to connect to EarlyHintPreloader r=necko-reviewers,kershaw

Differential Revision: https://phabricator.services.mozilla.com/D179473
parent 965534d8
Loading
Loading
Loading
Loading
+8 −5
Original line number Diff line number Diff line
@@ -97,7 +97,6 @@ bool DocumentChannelParent::Init(dom::CanonicalBrowsingContext* aContext,
        auto promise = self->RedirectToRealChannel(
            std::move(aResolveValue.mStreamFilterEndpoints),
            aResolveValue.mRedirectFlags, aResolveValue.mLoadFlags,
            std::move(aResolveValue.mEarlyHints),
            aResolveValue.mEarlyHintLinkType);
        // We chain the promise the DLL is waiting on to the one returned by
        // RedirectToRealChannel. As soon as the promise returned is resolved
@@ -137,16 +136,20 @@ RefPtr<PDocumentChannelParent::RedirectToRealChannelPromise>
DocumentChannelParent::RedirectToRealChannel(
    nsTArray<ipc::Endpoint<extensions::PStreamFilterParent>>&&
        aStreamFilterEndpoints,
    uint32_t aRedirectFlags, uint32_t aLoadFlags,
    nsTArray<EarlyHintConnectArgs>&& aEarlyHints, uint32_t aEarlyHintLinkType) {
    uint32_t aRedirectFlags, uint32_t aLoadFlags, uint32_t aEarlyHintLinkType) {
  if (!CanSend()) {
    return PDocumentChannelParent::RedirectToRealChannelPromise::
        CreateAndReject(ResponseRejectReason::ChannelClosed, __func__);
  }

  ContentParent* cp = static_cast<ContentParent*>(Manager()->Manager());
  nsTArray<EarlyHintConnectArgs> earlyHints;
  mDocumentLoadListener->RegisterEarlyHintLinksAndGetConnectArgs(cp->ChildID(),
                                                                 earlyHints);

  RedirectToRealChannelArgs args;
  mDocumentLoadListener->SerializeRedirectData(
      args, false, aRedirectFlags, aLoadFlags,
      static_cast<ContentParent*>(Manager()->Manager()), std::move(aEarlyHints),
      args, false, aRedirectFlags, aLoadFlags, cp, std::move(earlyHints),
      aEarlyHintLinkType);
  return SendRedirectToRealChannel(args, std::move(aStreamFilterEndpoints));
}
+0 −1
Original line number Diff line number Diff line
@@ -55,7 +55,6 @@ class DocumentChannelParent final
      nsTArray<ipc::Endpoint<extensions::PStreamFilterParent>>&&
          aStreamFilterEndpoints,
      uint32_t aRedirectFlags, uint32_t aLoadFlags,
      nsTArray<EarlyHintConnectArgs>&& aEarlyHints,
      uint32_t aEarlyHintLinkType);

  virtual ~DocumentChannelParent();
+11 −5
Original line number Diff line number Diff line
@@ -1454,6 +1454,15 @@ bool DocumentLoadListener::ResumeSuspendedChannel(
  return !mIsFinished;
}

void DocumentLoadListener::CancelEarlyHintPreloads() {
  mEarlyHintsService.Cancel("DocumentLoadListener::CancelEarlyHintPreloads"_ns);
}

void DocumentLoadListener::RegisterEarlyHintLinksAndGetConnectArgs(
    dom::ContentParentId aCpId, nsTArray<EarlyHintConnectArgs>& aOutLinks) {
  mEarlyHintsService.RegisterLinksAndGetConnectArgs(aCpId, aOutLinks);
}

void DocumentLoadListener::SerializeRedirectData(
    RedirectToRealChannelArgs& aArgs, bool aIsCrossProcess,
    uint32_t aRedirectFlags, uint32_t aLoadFlags, ContentParent* aParent,
@@ -2094,7 +2103,7 @@ DocumentLoadListener::RedirectToRealChannel(
    }

    nsTArray<EarlyHintConnectArgs> ehArgs;
    mEarlyHintsService.RegisterLinksAndGetConnectArgs(ehArgs);
    mEarlyHintsService.RegisterLinksAndGetConnectArgs(cp->ChildID(), ehArgs);

    RedirectToRealChannelArgs args;
    SerializeRedirectData(args, /* aIsCrossProcess */ true, aRedirectFlags,
@@ -2142,12 +2151,9 @@ DocumentLoadListener::RedirectToRealChannel(
      MakeRefPtr<PDocumentChannelParent::RedirectToRealChannelPromise::Private>(
          __func__);

  nsTArray<EarlyHintConnectArgs> ehArgs;
  mEarlyHintsService.RegisterLinksAndGetConnectArgs(ehArgs);

  mOpenPromise->Resolve(
      OpenPromiseSucceededType({std::move(aStreamFilterEndpoints),
                                aRedirectFlags, aLoadFlags, std::move(ehArgs),
                                aRedirectFlags, aLoadFlags,
                                mEarlyHintsService.LinkType(), promise}),
      __func__);

+9 −1
Original line number Diff line number Diff line
@@ -110,7 +110,6 @@ class DocumentLoadListener : public nsIInterfaceRequestor,
        mStreamFilterEndpoints;
    uint32_t mRedirectFlags;
    uint32_t mLoadFlags;
    nsTArray<EarlyHintConnectArgs> mEarlyHints;
    uint32_t mEarlyHintLinkType;
    RefPtr<PDocumentChannelParent::RedirectToRealChannelPromise::Private>
        mPromise;
@@ -280,6 +279,15 @@ class DocumentLoadListener : public nsIInterfaceRequestor,

  [[nodiscard]] RefPtr<ChildEndpointPromise> AttachStreamFilter();

  // EarlyHints aren't supported on ParentProcessDocumentChannels yet, allow
  // EarlyHints to be cancelled from there (Bug 1819886)
  void CancelEarlyHintPreloads();

  // Gets the EarlyHint preloads for this document to pass them to the
  // ContentProcess. Registers them in the EarlyHintRegister
  void RegisterEarlyHintLinksAndGetConnectArgs(
      dom::ContentParentId aCpId, nsTArray<EarlyHintConnectArgs>& aOutLinks);

  // Serializes all data needed to setup the new replacement channel
  // in the content process into the RedirectToRealChannelArgs struct.
  void SerializeRedirectData(RedirectToRealChannelArgs& aArgs,
+4 −1
Original line number Diff line number Diff line
@@ -203,13 +203,16 @@ NS_IMETHODIMP ParentProcessDocumentChannel::AsyncOpen(
  promise->Then(
      GetCurrentSerialEventTarget(), __func__,
      [self](DocumentLoadListener::OpenPromiseSucceededType&& aResolveValue) {
        self->mDocumentLoadListener->CancelEarlyHintPreloads();
        nsTArray<EarlyHintConnectArgs> earlyHints;

        // The DLL is waiting for us to resolve the
        // RedirectToRealChannelPromise given as parameter.
        RefPtr<RedirectToRealChannelPromise> p =
            self->RedirectToRealChannel(
                    std::move(aResolveValue.mStreamFilterEndpoints),
                    aResolveValue.mRedirectFlags, aResolveValue.mLoadFlags,
                    aResolveValue.mEarlyHints)
                    earlyHints)
                ->Then(
                    GetCurrentSerialEventTarget(), __func__,
                    [self](RedirectToRealChannelPromise::ResolveOrRejectValue&&
Loading