tor-browser

The Tor Browser
git clone https://git.dasho.dev/tor-browser.git
Log | Files | Refs | README | LICENSE

BackgroundUtils.cpp (44583B)


      1 /* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
      2 /* vim: set ts=8 sts=2 et sw=2 tw=80: */
      3 /* This Source Code Form is subject to the terms of the Mozilla Public
      4 * License, v. 2.0. If a copy of the MPL was not distributed with this file,
      5 * You can obtain one at http://mozilla.org/MPL/2.0/. */
      6 
      7 #include "BackgroundUtils.h"
      8 
      9 #include "MainThreadUtils.h"
     10 #include "mozilla/Assertions.h"
     11 #include "mozilla/BasePrincipal.h"
     12 #include "mozilla/ContentPrincipal.h"
     13 #include "mozilla/NullPrincipal.h"
     14 #include "mozilla/SystemPrincipal.h"
     15 #include "mozilla/ipc/PBackgroundSharedTypes.h"
     16 #include "mozilla/ipc/URIUtils.h"
     17 #include "mozilla/net/CookieJarSettings.h"
     18 #include "mozilla/net/InterceptionInfo.h"
     19 #include "mozilla/net/NeckoChannelParams.h"
     20 #include "ExpandedPrincipal.h"
     21 #include "nsIContentPolicy.h"
     22 #include "nsIScriptSecurityManager.h"
     23 #include "nsIURI.h"
     24 #include "nsNetUtil.h"
     25 #include "mozilla/LoadInfo.h"
     26 #include "nsContentUtils.h"
     27 #include "nsString.h"
     28 #include "nsTArray.h"
     29 #include "mozilla/nsRedirectHistoryEntry.h"
     30 #include "mozilla/dom/nsCSPUtils.h"
     31 #include "mozilla/dom/nsCSPContext.h"
     32 #include "mozilla/dom/BrowsingContext.h"
     33 #include "mozilla/dom/CanonicalBrowsingContext.h"
     34 #include "mozilla/dom/Document.h"
     35 #include "mozilla/dom/PolicyContainer.h"
     36 #include "mozilla/dom/WindowGlobalParent.h"
     37 #include "mozilla/LoadInfo.h"
     38 
     39 using namespace mozilla::dom;
     40 using namespace mozilla::net;
     41 
     42 namespace mozilla {
     43 
     44 namespace ipc {
     45 
     46 Result<nsCOMPtr<nsIPrincipal>, nsresult> PrincipalInfoToPrincipal(
     47    const PrincipalInfo& aPrincipalInfo) {
     48  MOZ_ASSERT(aPrincipalInfo.type() != PrincipalInfo::T__None);
     49 
     50  nsCOMPtr<nsIPrincipal> principal;
     51  nsresult rv;
     52 
     53  switch (aPrincipalInfo.type()) {
     54    case PrincipalInfo::TSystemPrincipalInfo: {
     55      principal = SystemPrincipal::Get();
     56      if (NS_WARN_IF(!principal)) {
     57        return Err(NS_ERROR_NOT_INITIALIZED);
     58      }
     59 
     60      return principal;
     61    }
     62 
     63    case PrincipalInfo::TNullPrincipalInfo: {
     64      const NullPrincipalInfo& info = aPrincipalInfo.get_NullPrincipalInfo();
     65 
     66      nsCOMPtr<nsIURI> uri;
     67      rv = NS_NewURI(getter_AddRefs(uri), info.spec());
     68      if (NS_WARN_IF(NS_FAILED(rv))) {
     69        return Err(rv);
     70      }
     71 
     72      if (!uri->SchemeIs(NS_NULLPRINCIPAL_SCHEME)) {
     73        return Err(NS_ERROR_ILLEGAL_VALUE);
     74      }
     75 
     76      principal = NullPrincipal::Create(info.attrs(), uri);
     77      return principal;
     78    }
     79 
     80    case PrincipalInfo::TContentPrincipalInfo: {
     81      const ContentPrincipalInfo& info =
     82          aPrincipalInfo.get_ContentPrincipalInfo();
     83 
     84      nsCOMPtr<nsIURI> uri;
     85      rv = NS_NewURI(getter_AddRefs(uri), info.spec());
     86      if (NS_WARN_IF(NS_FAILED(rv))) {
     87        return Err(rv);
     88      }
     89 
     90      nsCOMPtr<nsIURI> domain;
     91      if (info.domain()) {
     92        rv = NS_NewURI(getter_AddRefs(domain), *info.domain());
     93        if (NS_WARN_IF(NS_FAILED(rv))) {
     94          return Err(rv);
     95        }
     96      }
     97 
     98      principal =
     99          BasePrincipal::CreateContentPrincipal(uri, info.attrs(), domain);
    100      if (NS_WARN_IF(!principal)) {
    101        return Err(NS_ERROR_NULL_POINTER);
    102      }
    103 
    104      // Origin must match what the_new_principal.getOrigin returns.
    105      nsAutoCString originNoSuffix;
    106      rv = principal->GetOriginNoSuffix(originNoSuffix);
    107      if (NS_WARN_IF(NS_FAILED(rv))) {
    108        return Err(rv);
    109      }
    110 
    111      if (NS_WARN_IF(!info.originNoSuffix().Equals(originNoSuffix))) {
    112        return Err(NS_ERROR_FAILURE);
    113      }
    114 
    115      if (!info.baseDomain().IsVoid()) {
    116        nsAutoCString baseDomain;
    117        rv = principal->GetBaseDomain(baseDomain);
    118        if (NS_WARN_IF(NS_FAILED(rv))) {
    119          return Err(rv);
    120        }
    121 
    122        if (NS_WARN_IF(!info.baseDomain().Equals(baseDomain))) {
    123          return Err(NS_ERROR_FAILURE);
    124        }
    125      }
    126      return principal;
    127    }
    128 
    129    case PrincipalInfo::TExpandedPrincipalInfo: {
    130      const ExpandedPrincipalInfo& info =
    131          aPrincipalInfo.get_ExpandedPrincipalInfo();
    132 
    133      nsTArray<nsCOMPtr<nsIPrincipal>> allowlist;
    134      nsCOMPtr<nsIPrincipal> alPrincipal;
    135 
    136      for (uint32_t i = 0; i < info.allowlist().Length(); i++) {
    137        auto principalOrErr = PrincipalInfoToPrincipal(info.allowlist()[i]);
    138        if (NS_WARN_IF(principalOrErr.isErr())) {
    139          nsresult ret = principalOrErr.unwrapErr();
    140          return Err(ret);
    141        }
    142        // append that principal to the allowlist
    143        allowlist.AppendElement(principalOrErr.unwrap());
    144      }
    145 
    146      RefPtr<ExpandedPrincipal> expandedPrincipal =
    147          ExpandedPrincipal::Create(allowlist, info.attrs());
    148      if (!expandedPrincipal) {
    149        return Err(NS_ERROR_FAILURE);
    150      }
    151 
    152      principal = expandedPrincipal;
    153      return principal;
    154    }
    155 
    156    default:
    157      return Err(NS_ERROR_FAILURE);
    158  }
    159 }
    160 
    161 bool StorageKeysEqual(const PrincipalInfo& aLeft, const PrincipalInfo& aRight) {
    162  MOZ_RELEASE_ASSERT(aLeft.type() == PrincipalInfo::TContentPrincipalInfo ||
    163                     aLeft.type() == PrincipalInfo::TSystemPrincipalInfo);
    164  MOZ_RELEASE_ASSERT(aRight.type() == PrincipalInfo::TContentPrincipalInfo ||
    165                     aRight.type() == PrincipalInfo::TSystemPrincipalInfo);
    166 
    167  if (aLeft.type() != aRight.type()) {
    168    return false;
    169  }
    170 
    171  if (aLeft.type() == PrincipalInfo::TContentPrincipalInfo) {
    172    const ContentPrincipalInfo& leftContent = aLeft.get_ContentPrincipalInfo();
    173    const ContentPrincipalInfo& rightContent =
    174        aRight.get_ContentPrincipalInfo();
    175 
    176    return leftContent.attrs() == rightContent.attrs() &&
    177           leftContent.originNoSuffix() == rightContent.originNoSuffix();
    178  }
    179 
    180  // Storage keys for the System principal always equal.
    181  return true;
    182 }
    183 
    184 already_AddRefed<nsIContentSecurityPolicy> CSPInfoToCSP(
    185    const CSPInfo& aCSPInfo, Document* aRequestingDoc,
    186    nsresult* aOptionalResult) {
    187  MOZ_ASSERT(NS_IsMainThread());
    188 
    189  nsresult stackResult;
    190  nsresult& rv = aOptionalResult ? *aOptionalResult : stackResult;
    191 
    192  RefPtr<nsCSPContext> csp = new nsCSPContext();
    193 
    194  if (aRequestingDoc) {
    195    rv = csp->SetRequestContextWithDocument(aRequestingDoc);
    196    if (NS_WARN_IF(NS_FAILED(rv))) {
    197      return nullptr;
    198    }
    199  } else {
    200    auto principalOrErr =
    201        PrincipalInfoToPrincipal(aCSPInfo.requestPrincipalInfo());
    202    if (NS_WARN_IF(principalOrErr.isErr())) {
    203      return nullptr;
    204    }
    205 
    206    nsCOMPtr<nsIURI> selfURI;
    207    if (!aCSPInfo.selfURISpec().IsEmpty()) {
    208      rv = NS_NewURI(getter_AddRefs(selfURI), aCSPInfo.selfURISpec());
    209      if (NS_WARN_IF(NS_FAILED(rv))) {
    210        return nullptr;
    211      }
    212    }
    213 
    214    nsCOMPtr<nsIPrincipal> principal = principalOrErr.unwrap();
    215 
    216    rv = csp->SetRequestContextWithPrincipal(
    217        principal, selfURI, aCSPInfo.referrer(), aCSPInfo.innerWindowID());
    218    if (NS_WARN_IF(NS_FAILED(rv))) {
    219      return nullptr;
    220    }
    221  }
    222  csp->SetSkipAllowInlineStyleCheck(aCSPInfo.skipAllowInlineStyleCheck());
    223 
    224  for (uint32_t i = 0; i < aCSPInfo.policyInfos().Length(); i++) {
    225    csp->AddIPCPolicy(aCSPInfo.policyInfos()[i]);
    226  }
    227  return csp.forget();
    228 }
    229 
    230 nsresult CSPToCSPInfo(nsIContentSecurityPolicy* aCSP, CSPInfo* aCSPInfo) {
    231  MOZ_ASSERT(NS_IsMainThread());
    232  MOZ_ASSERT(aCSP);
    233  MOZ_ASSERT(aCSPInfo);
    234 
    235  if (!aCSP || !aCSPInfo) {
    236    return NS_ERROR_FAILURE;
    237  }
    238 
    239  nsCOMPtr<nsIPrincipal> requestPrincipal = aCSP->GetRequestPrincipal();
    240 
    241  PrincipalInfo requestingPrincipalInfo;
    242  nsresult rv =
    243      PrincipalToPrincipalInfo(requestPrincipal, &requestingPrincipalInfo);
    244  if (NS_WARN_IF(NS_FAILED(rv))) {
    245    return rv;
    246  }
    247 
    248  nsCOMPtr<nsIURI> selfURI = aCSP->GetSelfURI();
    249  nsAutoCString selfURISpec;
    250  if (selfURI) {
    251    selfURI->GetSpec(selfURISpec);
    252  }
    253 
    254  nsAutoCString referrer;
    255  aCSP->GetReferrer(referrer);
    256 
    257  uint64_t windowID = aCSP->GetInnerWindowID();
    258  bool skipAllowInlineStyleCheck = aCSP->GetSkipAllowInlineStyleCheck();
    259 
    260  RequireTrustedTypesForDirectiveState requireTrustedTypesForDirectiveState =
    261      aCSP->GetRequireTrustedTypesForDirectiveState();
    262 
    263  nsTArray<ContentSecurityPolicy> policies;
    264  static_cast<nsCSPContext*>(aCSP)->SerializePolicies(policies);
    265 
    266  *aCSPInfo = CSPInfo(std::move(policies), requestingPrincipalInfo, selfURISpec,
    267                      referrer, windowID, requireTrustedTypesForDirectiveState,
    268                      skipAllowInlineStyleCheck);
    269  return NS_OK;
    270 }
    271 
    272 nsresult PrincipalToPrincipalInfo(nsIPrincipal* aPrincipal,
    273                                  PrincipalInfo* aPrincipalInfo,
    274                                  bool aSkipBaseDomain) {
    275  MOZ_ASSERT(aPrincipal);
    276  MOZ_ASSERT(aPrincipalInfo);
    277 
    278  nsresult rv;
    279  if (aPrincipal->GetIsNullPrincipal()) {
    280    nsAutoCString spec;
    281    rv = aPrincipal->GetAsciiSpec(spec);
    282    if (NS_WARN_IF(NS_FAILED(rv))) {
    283      return rv;
    284    }
    285 
    286    *aPrincipalInfo =
    287        NullPrincipalInfo(aPrincipal->OriginAttributesRef(), spec);
    288    return NS_OK;
    289  }
    290 
    291  if (aPrincipal->IsSystemPrincipal()) {
    292    *aPrincipalInfo = SystemPrincipalInfo();
    293    return NS_OK;
    294  }
    295 
    296  // might be an expanded principal
    297  auto* basePrin = BasePrincipal::Cast(aPrincipal);
    298  if (basePrin->Is<ExpandedPrincipal>()) {
    299    auto* expanded = basePrin->As<ExpandedPrincipal>();
    300 
    301    nsTArray<PrincipalInfo> allowlistInfo;
    302    PrincipalInfo info;
    303 
    304    for (auto& prin : expanded->AllowList()) {
    305      rv = PrincipalToPrincipalInfo(prin, &info, aSkipBaseDomain);
    306      if (NS_WARN_IF(NS_FAILED(rv))) {
    307        return rv;
    308      }
    309      // append that spec to the allowlist
    310      allowlistInfo.AppendElement(info);
    311    }
    312 
    313    *aPrincipalInfo = ExpandedPrincipalInfo(aPrincipal->OriginAttributesRef(),
    314                                            std::move(allowlistInfo));
    315    return NS_OK;
    316  }
    317 
    318  nsAutoCString spec;
    319  rv = aPrincipal->GetAsciiSpec(spec);
    320  if (NS_WARN_IF(NS_FAILED(rv))) {
    321    return rv;
    322  }
    323 
    324  nsCString originNoSuffix;
    325  rv = aPrincipal->GetOriginNoSuffix(originNoSuffix);
    326  if (NS_WARN_IF(NS_FAILED(rv))) {
    327    return rv;
    328  }
    329 
    330  nsCOMPtr<nsIURI> domainUri;
    331  rv = aPrincipal->GetDomain(getter_AddRefs(domainUri));
    332  if (NS_WARN_IF(NS_FAILED(rv))) {
    333    return rv;
    334  }
    335 
    336  Maybe<nsCString> domain;
    337  if (domainUri) {
    338    domain.emplace();
    339    rv = domainUri->GetSpec(domain.ref());
    340    if (NS_WARN_IF(NS_FAILED(rv))) {
    341      return rv;
    342    }
    343  }
    344 
    345  // This attribute is not crucial.
    346  nsCString baseDomain;
    347  if (aSkipBaseDomain) {
    348    baseDomain.SetIsVoid(true);
    349  } else {
    350    if (NS_FAILED(aPrincipal->GetBaseDomain(baseDomain))) {
    351      // No warning here. Some principal URLs do not have a base-domain.
    352      baseDomain.SetIsVoid(true);
    353    }
    354  }
    355 
    356  *aPrincipalInfo =
    357      ContentPrincipalInfo(aPrincipal->OriginAttributesRef(), originNoSuffix,
    358                           spec, domain, baseDomain);
    359  return NS_OK;
    360 }
    361 
    362 bool IsPrincipalInfoPrivate(const PrincipalInfo& aPrincipalInfo) {
    363  if (aPrincipalInfo.type() != ipc::PrincipalInfo::TContentPrincipalInfo) {
    364    return false;
    365  }
    366 
    367  const ContentPrincipalInfo& info = aPrincipalInfo.get_ContentPrincipalInfo();
    368  return info.attrs().IsPrivateBrowsing();
    369 }
    370 
    371 already_AddRefed<nsIRedirectHistoryEntry> RHEntryInfoToRHEntry(
    372    const RedirectHistoryEntryInfo& aRHEntryInfo) {
    373  auto principalOrErr = PrincipalInfoToPrincipal(aRHEntryInfo.principalInfo());
    374  if (NS_WARN_IF(principalOrErr.isErr())) {
    375    return nullptr;
    376  }
    377 
    378  nsCOMPtr<nsIPrincipal> principal = principalOrErr.unwrap();
    379  nsCOMPtr<nsIURI> referrerUri = DeserializeURI(aRHEntryInfo.referrerUri());
    380 
    381  nsCOMPtr<nsIRedirectHistoryEntry> entry = new nsRedirectHistoryEntry(
    382      principal, referrerUri, aRHEntryInfo.remoteAddress());
    383 
    384  return entry.forget();
    385 }
    386 
    387 nsresult RHEntryToRHEntryInfo(nsIRedirectHistoryEntry* aRHEntry,
    388                              RedirectHistoryEntryInfo* aRHEntryInfo) {
    389  MOZ_ASSERT(aRHEntry);
    390  MOZ_ASSERT(aRHEntryInfo);
    391 
    392  nsresult rv;
    393  aRHEntry->GetRemoteAddress(aRHEntryInfo->remoteAddress());
    394 
    395  nsCOMPtr<nsIURI> referrerUri;
    396  rv = aRHEntry->GetReferrerURI(getter_AddRefs(referrerUri));
    397  NS_ENSURE_SUCCESS(rv, rv);
    398  SerializeURI(referrerUri, aRHEntryInfo->referrerUri());
    399 
    400  nsCOMPtr<nsIPrincipal> principal;
    401  rv = aRHEntry->GetPrincipal(getter_AddRefs(principal));
    402  NS_ENSURE_SUCCESS(rv, rv);
    403 
    404  return PrincipalToPrincipalInfo(principal, &aRHEntryInfo->principalInfo());
    405 }
    406 
    407 nsresult LoadInfoToLoadInfoArgs(nsILoadInfo* aLoadInfo,
    408                                LoadInfoArgs* outLoadInfoArgs) {
    409  nsresult rv = NS_OK;
    410  Maybe<PrincipalInfo> loadingPrincipalInfo;
    411  if (nsIPrincipal* loadingPrin = aLoadInfo->GetLoadingPrincipal()) {
    412    loadingPrincipalInfo.emplace();
    413    rv = PrincipalToPrincipalInfo(loadingPrin, loadingPrincipalInfo.ptr());
    414    NS_ENSURE_SUCCESS(rv, rv);
    415  }
    416 
    417  PrincipalInfo triggeringPrincipalInfo;
    418  rv = PrincipalToPrincipalInfo(aLoadInfo->TriggeringPrincipal(),
    419                                &triggeringPrincipalInfo);
    420  NS_ENSURE_SUCCESS(rv, rv);
    421 
    422  Maybe<PrincipalInfo> principalToInheritInfo;
    423  if (nsIPrincipal* principalToInherit = aLoadInfo->PrincipalToInherit()) {
    424    principalToInheritInfo.emplace();
    425    rv = PrincipalToPrincipalInfo(principalToInherit,
    426                                  principalToInheritInfo.ptr());
    427    NS_ENSURE_SUCCESS(rv, rv);
    428  }
    429 
    430  Maybe<PrincipalInfo> topLevelPrincipalInfo;
    431  if (nsIPrincipal* topLevenPrin = aLoadInfo->GetTopLevelPrincipal()) {
    432    topLevelPrincipalInfo.emplace();
    433    rv = PrincipalToPrincipalInfo(topLevenPrin, topLevelPrincipalInfo.ptr());
    434    NS_ENSURE_SUCCESS(rv, rv);
    435  }
    436 
    437  Maybe<URIParams> optionalResultPrincipalURI;
    438  nsCOMPtr<nsIURI> resultPrincipalURI;
    439  (void)aLoadInfo->GetResultPrincipalURI(getter_AddRefs(resultPrincipalURI));
    440  if (resultPrincipalURI) {
    441    SerializeURI(resultPrincipalURI, optionalResultPrincipalURI);
    442  }
    443 
    444  nsCString triggeringRemoteType;
    445  rv = aLoadInfo->GetTriggeringRemoteType(triggeringRemoteType);
    446  NS_ENSURE_SUCCESS(rv, rv);
    447 
    448  nsTArray<RedirectHistoryEntryInfo> redirectChainIncludingInternalRedirects;
    449  for (const nsCOMPtr<nsIRedirectHistoryEntry>& redirectEntry :
    450       aLoadInfo->RedirectChainIncludingInternalRedirects()) {
    451    RedirectHistoryEntryInfo* entry =
    452        redirectChainIncludingInternalRedirects.AppendElement();
    453    rv = RHEntryToRHEntryInfo(redirectEntry, entry);
    454    NS_ENSURE_SUCCESS(rv, rv);
    455  }
    456 
    457  nsTArray<RedirectHistoryEntryInfo> redirectChain;
    458  for (const nsCOMPtr<nsIRedirectHistoryEntry>& redirectEntry :
    459       aLoadInfo->RedirectChain()) {
    460    RedirectHistoryEntryInfo* entry = redirectChain.AppendElement();
    461    rv = RHEntryToRHEntryInfo(redirectEntry, entry);
    462    NS_ENSURE_SUCCESS(rv, rv);
    463  }
    464 
    465  Maybe<IPCClientInfo> ipcClientInfo;
    466  const Maybe<ClientInfo>& clientInfo = aLoadInfo->GetClientInfo();
    467  if (clientInfo.isSome()) {
    468    ipcClientInfo.emplace(clientInfo.ref().ToIPC());
    469  }
    470 
    471  Maybe<IPCClientInfo> ipcReservedClientInfo;
    472  const Maybe<ClientInfo>& reservedClientInfo =
    473      aLoadInfo->GetReservedClientInfo();
    474  if (reservedClientInfo.isSome()) {
    475    ipcReservedClientInfo.emplace(reservedClientInfo.ref().ToIPC());
    476  }
    477 
    478  Maybe<IPCClientInfo> ipcInitialClientInfo;
    479  const Maybe<ClientInfo>& initialClientInfo =
    480      aLoadInfo->GetInitialClientInfo();
    481  if (initialClientInfo.isSome()) {
    482    ipcInitialClientInfo.emplace(initialClientInfo.ref().ToIPC());
    483  }
    484 
    485  Maybe<IPCServiceWorkerDescriptor> ipcController;
    486  const Maybe<ServiceWorkerDescriptor>& controller = aLoadInfo->GetController();
    487  if (controller.isSome()) {
    488    ipcController.emplace(controller.ref().ToIPC());
    489  }
    490 
    491  nsAutoString cspNonce;
    492  (void)NS_WARN_IF(NS_FAILED(aLoadInfo->GetCspNonce(cspNonce)));
    493 
    494  nsAutoString integrityMetadata;
    495  (void)NS_WARN_IF(
    496      NS_FAILED(aLoadInfo->GetIntegrityMetadata(integrityMetadata)));
    497 
    498  nsCOMPtr<nsICookieJarSettings> cookieJarSettings;
    499  rv = aLoadInfo->GetCookieJarSettings(getter_AddRefs(cookieJarSettings));
    500  NS_ENSURE_SUCCESS(rv, rv);
    501 
    502  CookieJarSettingsArgs cookieJarSettingsArgs;
    503  static_cast<CookieJarSettings*>(cookieJarSettings.get())
    504      ->Serialize(cookieJarSettingsArgs);
    505 
    506  nsCOMPtr<nsIURI> unstrippedURI;
    507  (void)aLoadInfo->GetUnstrippedURI(getter_AddRefs(unstrippedURI));
    508 
    509  Maybe<bool> isThirdPartyContextToTopWindow;
    510  if (static_cast<LoadInfo*>(aLoadInfo)
    511          ->HasIsThirdPartyContextToTopWindowSet()) {
    512    isThirdPartyContextToTopWindow.emplace(
    513        aLoadInfo->GetIsThirdPartyContextToTopWindow());
    514  }
    515 
    516  Maybe<InterceptionInfoArg> interceptionInfoArg;
    517  nsIInterceptionInfo* interceptionInfo = aLoadInfo->InterceptionInfo();
    518  if (interceptionInfo) {
    519    Maybe<PrincipalInfo> triggeringPrincipalInfo;
    520    if (interceptionInfo->TriggeringPrincipal()) {
    521      triggeringPrincipalInfo.emplace();
    522      rv = PrincipalToPrincipalInfo(interceptionInfo->TriggeringPrincipal(),
    523                                    triggeringPrincipalInfo.ptr());
    524    }
    525 
    526    nsTArray<RedirectHistoryEntryInfo> redirectChain;
    527    for (const nsCOMPtr<nsIRedirectHistoryEntry>& redirectEntry :
    528         interceptionInfo->RedirectChain()) {
    529      RedirectHistoryEntryInfo* entry = redirectChain.AppendElement();
    530      rv = RHEntryToRHEntryInfo(redirectEntry, entry);
    531      NS_ENSURE_SUCCESS(rv, rv);
    532    }
    533 
    534    interceptionInfoArg = Some(InterceptionInfoArg(
    535        triggeringPrincipalInfo, interceptionInfo->ContentPolicyType(),
    536        redirectChain, interceptionInfo->FromThirdParty()));
    537  }
    538 
    539  Maybe<RFPTargetSet> overriddenFingerprintingSettingsArg;
    540  Maybe<RFPTargetSet> overriddenFingerprintingSettings =
    541      aLoadInfo->GetOverriddenFingerprintingSettings();
    542 
    543  if (overriddenFingerprintingSettings) {
    544    overriddenFingerprintingSettingsArg =
    545        Some(overriddenFingerprintingSettings.ref());
    546  }
    547 
    548  Maybe<RequestMode> requestMode;
    549  aLoadInfo->GetRequestMode(&requestMode);
    550 
    551  Maybe<PolicyContainerArgs> maybePolicyContainerToInherit;
    552  nsCOMPtr<nsIPolicyContainer> policyContainerToInherit =
    553      aLoadInfo->GetPolicyContainerToInherit();
    554  if (policyContainerToInherit) {
    555    PolicyContainerArgs args;
    556    PolicyContainer::ToArgs(PolicyContainer::Cast(policyContainerToInherit),
    557                            args);
    558    maybePolicyContainerToInherit.emplace(args);
    559  }
    560 
    561  *outLoadInfoArgs = LoadInfoArgs(
    562      loadingPrincipalInfo, triggeringPrincipalInfo, principalToInheritInfo,
    563      topLevelPrincipalInfo, optionalResultPrincipalURI, triggeringRemoteType,
    564      aLoadInfo->GetSandboxedNullPrincipalID(), aLoadInfo->GetSecurityFlags(),
    565      aLoadInfo->GetSandboxFlags(), aLoadInfo->GetTriggeringSandboxFlags(),
    566      aLoadInfo->GetTriggeringWindowId(),
    567      aLoadInfo->GetTriggeringStorageAccess(),
    568      aLoadInfo->GetTriggeringFirstPartyClassificationFlags(),
    569      aLoadInfo->GetTriggeringThirdPartyClassificationFlags(),
    570      aLoadInfo->InternalContentPolicyType(),
    571      static_cast<uint32_t>(aLoadInfo->GetTainting()),
    572      aLoadInfo->GetBlockAllMixedContent(),
    573      aLoadInfo->GetUpgradeInsecureRequests(),
    574      aLoadInfo->GetBrowserUpgradeInsecureRequests(),
    575      aLoadInfo->GetBrowserDidUpgradeInsecureRequests(),
    576      aLoadInfo->GetBrowserWouldUpgradeInsecureRequests(),
    577      aLoadInfo->GetForceAllowDataURI(),
    578      aLoadInfo->GetAllowInsecureRedirectToDataURI(),
    579      aLoadInfo->GetForceMediaDocument(),
    580      aLoadInfo->GetSkipContentPolicyCheckForWebRequest(),
    581      aLoadInfo->GetOriginalFrameSrcLoad(),
    582      aLoadInfo->GetForceInheritPrincipalDropped(),
    583      aLoadInfo->GetInnerWindowID(), aLoadInfo->GetBrowsingContextID(),
    584      aLoadInfo->GetFrameBrowsingContextID(),
    585      aLoadInfo->GetInitialSecurityCheckDone(),
    586      aLoadInfo->GetIsInThirdPartyContext(), isThirdPartyContextToTopWindow,
    587      aLoadInfo->GetIsOn3PCBExceptionList(), aLoadInfo->GetIsFormSubmission(),
    588      aLoadInfo->GetIsGETRequest(), aLoadInfo->GetSendCSPViolationEvents(),
    589      aLoadInfo->GetOriginAttributes(), redirectChainIncludingInternalRedirects,
    590      redirectChain, aLoadInfo->GetHasInjectedCookieForCookieBannerHandling(),
    591      aLoadInfo->GetSchemelessInput(), aLoadInfo->GetHttpsUpgradeTelemetry(),
    592      ipcClientInfo, ipcReservedClientInfo, ipcInitialClientInfo, ipcController,
    593      aLoadInfo->CorsUnsafeHeaders(), aLoadInfo->GetForcePreflight(),
    594      aLoadInfo->GetIsPreflight(), aLoadInfo->GetLoadTriggeredFromExternal(),
    595      aLoadInfo->GetServiceWorkerTaintingSynthesized(),
    596      aLoadInfo->GetDocumentHasUserInteracted(),
    597      aLoadInfo->GetAllowListFutureDocumentsCreatedFromThisRedirectChain(),
    598      aLoadInfo->GetNeedForCheckingAntiTrackingHeuristic(), cspNonce,
    599      integrityMetadata, aLoadInfo->GetSkipContentSniffing(),
    600      aLoadInfo->GetHttpsOnlyStatus(), aLoadInfo->GetHstsStatus(),
    601      aLoadInfo->GetHasValidUserGestureActivation(),
    602      aLoadInfo->GetTextDirectiveUserActivation(),
    603      aLoadInfo->GetAllowDeprecatedSystemRequests(),
    604      aLoadInfo->GetIsInDevToolsContext(), aLoadInfo->GetParserCreatedScript(),
    605      requestMode, aLoadInfo->GetIsFromProcessingFrameAttributes(),
    606      aLoadInfo->GetIsMediaRequest(), aLoadInfo->GetIsMediaInitialRequest(),
    607      aLoadInfo->GetIsFromObjectOrEmbed(), cookieJarSettingsArgs,
    608      aLoadInfo->GetRequestBlockingReason(), maybePolicyContainerToInherit,
    609      aLoadInfo->GetStoragePermission(), aLoadInfo->GetParentIpAddressSpace(),
    610      aLoadInfo->GetIpAddressSpace(), overriddenFingerprintingSettingsArg,
    611      aLoadInfo->GetIsMetaRefresh(), aLoadInfo->GetLoadingEmbedderPolicy(),
    612      aLoadInfo->GetIsOriginTrialCoepCredentiallessEnabledForTopLevel(),
    613      unstrippedURI, interceptionInfoArg, aLoadInfo->GetIsNewWindowTarget(),
    614      aLoadInfo->GetUserNavigationInvolvement(),
    615      aLoadInfo->GetContainerFeaturePolicyInfo(), {});
    616 
    617  return NS_OK;
    618 }
    619 
    620 nsresult LoadInfoArgsToLoadInfo(const LoadInfoArgs& aLoadInfoArgs,
    621                                const nsACString& aOriginRemoteType,
    622                                nsILoadInfo** outLoadInfo) {
    623  return LoadInfoArgsToLoadInfo(aLoadInfoArgs, aOriginRemoteType, nullptr,
    624                                outLoadInfo);
    625 }
    626 nsresult LoadInfoArgsToLoadInfo(const LoadInfoArgs& aLoadInfoArgs,
    627                                const nsACString& aOriginRemoteType,
    628                                nsINode* aCspToInheritLoadingContext,
    629                                nsILoadInfo** outLoadInfo) {
    630  RefPtr<LoadInfo> loadInfo;
    631  nsresult rv = LoadInfoArgsToLoadInfo(aLoadInfoArgs, aOriginRemoteType,
    632                                       aCspToInheritLoadingContext,
    633                                       getter_AddRefs(loadInfo));
    634  NS_ENSURE_SUCCESS(rv, rv);
    635 
    636  loadInfo.forget(outLoadInfo);
    637  return NS_OK;
    638 }
    639 
    640 nsresult LoadInfoArgsToLoadInfo(const LoadInfoArgs& aLoadInfoArgs,
    641                                const nsACString& aOriginRemoteType,
    642                                LoadInfo** outLoadInfo) {
    643  return LoadInfoArgsToLoadInfo(aLoadInfoArgs, aOriginRemoteType, nullptr,
    644                                outLoadInfo);
    645 }
    646 nsresult LoadInfoArgsToLoadInfo(const LoadInfoArgs& loadInfoArgs,
    647                                const nsACString& aOriginRemoteType,
    648                                nsINode* aCspToInheritLoadingContext,
    649                                LoadInfo** outLoadInfo) {
    650  nsCOMPtr<nsIPrincipal> loadingPrincipal;
    651  if (loadInfoArgs.requestingPrincipalInfo().isSome()) {
    652    auto loadingPrincipalOrErr =
    653        PrincipalInfoToPrincipal(loadInfoArgs.requestingPrincipalInfo().ref());
    654    if (NS_WARN_IF(loadingPrincipalOrErr.isErr())) {
    655      return loadingPrincipalOrErr.unwrapErr();
    656    }
    657    loadingPrincipal = loadingPrincipalOrErr.unwrap();
    658  }
    659 
    660  auto triggeringPrincipalOrErr =
    661      PrincipalInfoToPrincipal(loadInfoArgs.triggeringPrincipalInfo());
    662  if (NS_WARN_IF(triggeringPrincipalOrErr.isErr())) {
    663    return triggeringPrincipalOrErr.unwrapErr();
    664  }
    665  nsCOMPtr<nsIPrincipal> triggeringPrincipal =
    666      triggeringPrincipalOrErr.unwrap();
    667 
    668  nsCOMPtr<nsIPrincipal> principalToInherit;
    669  nsCOMPtr<nsIPrincipal> flattenedPrincipalToInherit;
    670  if (loadInfoArgs.principalToInheritInfo().isSome()) {
    671    auto principalToInheritOrErr =
    672        PrincipalInfoToPrincipal(loadInfoArgs.principalToInheritInfo().ref());
    673    if (NS_WARN_IF(principalToInheritOrErr.isErr())) {
    674      return principalToInheritOrErr.unwrapErr();
    675    }
    676    flattenedPrincipalToInherit = principalToInheritOrErr.unwrap();
    677  }
    678 
    679  if (XRE_IsContentProcess()) {
    680    auto targetBrowsingContextId = loadInfoArgs.frameBrowsingContextID()
    681                                       ? loadInfoArgs.frameBrowsingContextID()
    682                                       : loadInfoArgs.browsingContextID();
    683    if (RefPtr<BrowsingContext> bc =
    684            BrowsingContext::Get(targetBrowsingContextId)) {
    685      auto [originalTriggeringPrincipal, originalPrincipalToInherit] =
    686          bc->GetTriggeringAndInheritPrincipalsForCurrentLoad();
    687 
    688      if (originalTriggeringPrincipal &&
    689          originalTriggeringPrincipal->Equals(triggeringPrincipal)) {
    690        triggeringPrincipal = originalTriggeringPrincipal;
    691      }
    692      if (originalPrincipalToInherit &&
    693          (loadInfoArgs.securityFlags() &
    694           nsILoadInfo::SEC_FORCE_INHERIT_PRINCIPAL) &&
    695          originalPrincipalToInherit->Equals(flattenedPrincipalToInherit)) {
    696        principalToInherit = originalPrincipalToInherit;
    697      }
    698    }
    699  }
    700  if (!principalToInherit && loadInfoArgs.principalToInheritInfo().isSome()) {
    701    principalToInherit = flattenedPrincipalToInherit;
    702  }
    703 
    704  nsCOMPtr<nsIPrincipal> topLevelPrincipal;
    705  if (loadInfoArgs.topLevelPrincipalInfo().isSome()) {
    706    auto topLevelPrincipalOrErr =
    707        PrincipalInfoToPrincipal(loadInfoArgs.topLevelPrincipalInfo().ref());
    708    if (NS_WARN_IF(topLevelPrincipalOrErr.isErr())) {
    709      return topLevelPrincipalOrErr.unwrapErr();
    710    }
    711    topLevelPrincipal = topLevelPrincipalOrErr.unwrap();
    712  }
    713 
    714  nsCOMPtr<nsIURI> resultPrincipalURI;
    715  if (loadInfoArgs.resultPrincipalURI().isSome()) {
    716    resultPrincipalURI = DeserializeURI(loadInfoArgs.resultPrincipalURI());
    717    NS_ENSURE_TRUE(resultPrincipalURI, NS_ERROR_UNEXPECTED);
    718  }
    719 
    720  // If we received this message from a content process, reset
    721  // triggeringRemoteType to the process which sent us the message. If the
    722  // parent sent us the message, we trust it to provide the correct triggering
    723  // remote type.
    724  //
    725  // This means that the triggering remote type will be reset if a LoadInfo is
    726  // bounced through a content process, as the LoadInfo can no longer be
    727  // validated to be coming from the originally specified remote type.
    728  nsCString triggeringRemoteType = loadInfoArgs.triggeringRemoteType();
    729  if (aOriginRemoteType != NOT_REMOTE_TYPE &&
    730      aOriginRemoteType != triggeringRemoteType) {
    731    triggeringRemoteType = aOriginRemoteType;
    732  }
    733 
    734  RedirectHistoryArray redirectChainIncludingInternalRedirects;
    735  for (const RedirectHistoryEntryInfo& entryInfo :
    736       loadInfoArgs.redirectChainIncludingInternalRedirects()) {
    737    nsCOMPtr<nsIRedirectHistoryEntry> redirectHistoryEntry =
    738        RHEntryInfoToRHEntry(entryInfo);
    739    NS_ENSURE_TRUE(redirectHistoryEntry, NS_ERROR_UNEXPECTED);
    740    redirectChainIncludingInternalRedirects.AppendElement(
    741        redirectHistoryEntry.forget());
    742  }
    743 
    744  RedirectHistoryArray redirectChain;
    745  for (const RedirectHistoryEntryInfo& entryInfo :
    746       loadInfoArgs.redirectChain()) {
    747    nsCOMPtr<nsIRedirectHistoryEntry> redirectHistoryEntry =
    748        RHEntryInfoToRHEntry(entryInfo);
    749    NS_ENSURE_TRUE(redirectHistoryEntry, NS_ERROR_UNEXPECTED);
    750    redirectChain.AppendElement(redirectHistoryEntry.forget());
    751  }
    752  nsTArray<nsCOMPtr<nsIPrincipal>> ancestorPrincipals;
    753  nsTArray<uint64_t> ancestorBrowsingContextIDs;
    754  if (XRE_IsParentProcess() &&
    755      (nsContentUtils::InternalContentPolicyTypeToExternal(
    756           loadInfoArgs.contentPolicyType()) !=
    757       ExtContentPolicy::TYPE_DOCUMENT)) {
    758    // Only fill out ancestor principals and browsing context IDs when we
    759    // are deserializing LoadInfoArgs to be LoadInfo for a subresource
    760    RefPtr<BrowsingContext> parentBC =
    761        BrowsingContext::Get(loadInfoArgs.browsingContextID());
    762    if (parentBC) {
    763      LoadInfo::ComputeAncestors(parentBC->Canonical(), ancestorPrincipals,
    764                                 ancestorBrowsingContextIDs);
    765    }
    766  } else {
    767    // Fill out (possibly redacted) ancestor principals for
    768    // Location.ancestorOrigins
    769    for (const auto& principalInfo : loadInfoArgs.ancestorOrigins()) {
    770      if (principalInfo.isNothing()) {
    771        ancestorPrincipals.AppendElement(nullptr);
    772      } else {
    773        auto principal = PrincipalInfoToPrincipal(principalInfo.value());
    774        // If this operation fail, we censor the origin.
    775        ancestorPrincipals.AppendElement(principal.unwrapOr(nullptr));
    776      }
    777    }
    778  }
    779 
    780  Maybe<ClientInfo> clientInfo;
    781  if (loadInfoArgs.clientInfo().isSome()) {
    782    clientInfo.emplace(ClientInfo(loadInfoArgs.clientInfo().ref()));
    783  }
    784 
    785  Maybe<ClientInfo> reservedClientInfo;
    786  if (loadInfoArgs.reservedClientInfo().isSome()) {
    787    reservedClientInfo.emplace(
    788        ClientInfo(loadInfoArgs.reservedClientInfo().ref()));
    789  }
    790 
    791  Maybe<ClientInfo> initialClientInfo;
    792  if (loadInfoArgs.initialClientInfo().isSome()) {
    793    initialClientInfo.emplace(
    794        ClientInfo(loadInfoArgs.initialClientInfo().ref()));
    795  }
    796 
    797  // We can have an initial client info or a reserved client info, but not both.
    798  MOZ_DIAGNOSTIC_ASSERT(reservedClientInfo.isNothing() ||
    799                        initialClientInfo.isNothing());
    800  NS_ENSURE_TRUE(
    801      reservedClientInfo.isNothing() || initialClientInfo.isNothing(),
    802      NS_ERROR_UNEXPECTED);
    803 
    804  Maybe<ServiceWorkerDescriptor> controller;
    805  if (loadInfoArgs.controller().isSome()) {
    806    controller.emplace(
    807        ServiceWorkerDescriptor(loadInfoArgs.controller().ref()));
    808  }
    809 
    810  nsCOMPtr<nsICookieJarSettings> cookieJarSettings;
    811  CookieJarSettings::Deserialize(loadInfoArgs.cookieJarSettings(),
    812                                 getter_AddRefs(cookieJarSettings));
    813 
    814  Maybe<RFPTargetSet> overriddenFingerprintingSettings;
    815  if (loadInfoArgs.overriddenFingerprintingSettings().isSome()) {
    816    overriddenFingerprintingSettings.emplace(
    817        loadInfoArgs.overriddenFingerprintingSettings().ref());
    818  }
    819 
    820  // Restore the loadingContext for frames using the BrowsingContext's
    821  // embedder element. Note that this only works if the embedder is
    822  // same-process, so won't be fission compatible.
    823  nsCOMPtr<nsINode> loadingContext;
    824  RefPtr<BrowsingContext> frameBrowsingContext =
    825      BrowsingContext::Get(loadInfoArgs.frameBrowsingContextID());
    826  if (frameBrowsingContext) {
    827    loadingContext = frameBrowsingContext->GetEmbedderElement();
    828  }
    829 
    830  Maybe<bool> isThirdPartyContextToTopWindow;
    831  if (loadInfoArgs.isThirdPartyContextToTopWindow().isSome()) {
    832    isThirdPartyContextToTopWindow.emplace(
    833        loadInfoArgs.isThirdPartyContextToTopWindow().ref());
    834  }
    835 
    836  nsCOMPtr<nsIInterceptionInfo> interceptionInfo;
    837  if (loadInfoArgs.interceptionInfo().isSome()) {
    838    const InterceptionInfoArg& interceptionInfoArg =
    839        loadInfoArgs.interceptionInfo().ref();
    840    nsCOMPtr<nsIPrincipal> triggeringPrincipal;
    841    if (interceptionInfoArg.triggeringPrincipalInfo().isSome()) {
    842      auto triggeringPrincipalOrErr = PrincipalInfoToPrincipal(
    843          interceptionInfoArg.triggeringPrincipalInfo().ref());
    844      if (NS_WARN_IF(triggeringPrincipalOrErr.isErr())) {
    845        return triggeringPrincipalOrErr.unwrapErr();
    846      }
    847      triggeringPrincipal = triggeringPrincipalOrErr.unwrap();
    848    }
    849 
    850    RedirectHistoryArray redirectChain;
    851    for (const RedirectHistoryEntryInfo& entryInfo :
    852         interceptionInfoArg.redirectChain()) {
    853      nsCOMPtr<nsIRedirectHistoryEntry> redirectHistoryEntry =
    854          RHEntryInfoToRHEntry(entryInfo);
    855      NS_ENSURE_TRUE(redirectHistoryEntry, NS_ERROR_UNEXPECTED);
    856      redirectChain.AppendElement(redirectHistoryEntry.forget());
    857    }
    858 
    859    interceptionInfo = new InterceptionInfo(
    860        triggeringPrincipal, interceptionInfoArg.contentPolicyType(),
    861        redirectChain, interceptionInfoArg.fromThirdParty());
    862  }
    863 
    864  RefPtr<PolicyContainer> policyContainerToInherit;
    865  const auto& policyContainerToInheritArgs =
    866      loadInfoArgs.policyContainerToInherit();
    867  if (policyContainerToInheritArgs.isSome()) {
    868    nsCOMPtr<Document> doc = do_QueryInterface(aCspToInheritLoadingContext);
    869    PolicyContainer::FromArgs(policyContainerToInheritArgs.ref(), doc,
    870                              getter_AddRefs(policyContainerToInherit));
    871  }
    872 
    873  RefPtr<mozilla::net::LoadInfo> loadInfo = new mozilla::net::LoadInfo(
    874      loadingPrincipal, triggeringPrincipal, principalToInherit,
    875      topLevelPrincipal, resultPrincipalURI, cookieJarSettings,
    876      policyContainerToInherit, loadInfoArgs.containerFeaturePolicyInfo(),
    877      triggeringRemoteType, loadInfoArgs.sandboxedNullPrincipalID(), clientInfo,
    878      reservedClientInfo, initialClientInfo, controller,
    879      loadInfoArgs.securityFlags(), loadInfoArgs.sandboxFlags(),
    880      loadInfoArgs.contentPolicyType(),
    881      static_cast<LoadTainting>(loadInfoArgs.tainting()),
    882 
    883 #define DEFINE_ARGUMENT(_t, _n, name, _d) loadInfoArgs.name(),
    884      LOADINFO_FOR_EACH_FIELD(DEFINE_ARGUMENT, LOADINFO_DUMMY_SETTER)
    885 #undef DEFINE_ARGUMENT
    886 
    887          loadInfoArgs.initialSecurityCheckDone(),
    888      loadInfoArgs.isInThirdPartyContext(), isThirdPartyContextToTopWindow,
    889      loadInfoArgs.originAttributes(),
    890      std::move(redirectChainIncludingInternalRedirects),
    891      std::move(redirectChain), std::move(ancestorPrincipals),
    892      ancestorBrowsingContextIDs, loadInfoArgs.corsUnsafeHeaders(),
    893      loadInfoArgs.loadTriggeredFromExternal(), loadInfoArgs.cspNonce(),
    894      loadInfoArgs.integrityMetadata(),
    895      // This function is only called for moving LoadInfo across processes.
    896      // Same-document navigation won't cross process boundaries.
    897      /* aIsSameDocumentNavigation */ false, overriddenFingerprintingSettings,
    898      loadingContext, loadInfoArgs.unstrippedURI(), interceptionInfo,
    899      loadInfoArgs.schemelessInput(), loadInfoArgs.userNavigationInvolvement());
    900 
    901  loadInfo.forget(outLoadInfo);
    902  return NS_OK;
    903 }
    904 
    905 void LoadInfoToParentLoadInfoForwarder(
    906    nsILoadInfo* aLoadInfo, ParentLoadInfoForwarderArgs* aForwarderArgsOut) {
    907  Maybe<IPCServiceWorkerDescriptor> ipcController;
    908  Maybe<ServiceWorkerDescriptor> controller(aLoadInfo->GetController());
    909  if (controller.isSome()) {
    910    ipcController.emplace(controller.ref().ToIPC());
    911  }
    912 
    913  uint32_t tainting = nsILoadInfo::TAINTING_BASIC;
    914  (void)aLoadInfo->GetTainting(&tainting);
    915 
    916  Maybe<CookieJarSettingsArgs> cookieJarSettingsArgs;
    917 
    918  nsCOMPtr<nsICookieJarSettings> cookieJarSettings;
    919  nsresult rv =
    920      aLoadInfo->GetCookieJarSettings(getter_AddRefs(cookieJarSettings));
    921  CookieJarSettings* cs =
    922      static_cast<CookieJarSettings*>(cookieJarSettings.get());
    923  if (NS_SUCCEEDED(rv) && cookieJarSettings && cs->HasBeenChanged()) {
    924    CookieJarSettingsArgs args;
    925    cs->Serialize(args);
    926    cookieJarSettingsArgs = Some(args);
    927  }
    928 
    929  nsCOMPtr<nsIURI> unstrippedURI;
    930  (void)aLoadInfo->GetUnstrippedURI(getter_AddRefs(unstrippedURI));
    931 
    932  Maybe<bool> isThirdPartyContextToTopWindow;
    933  if (static_cast<LoadInfo*>(aLoadInfo)
    934          ->HasIsThirdPartyContextToTopWindowSet()) {
    935    isThirdPartyContextToTopWindow.emplace(
    936        aLoadInfo->GetIsThirdPartyContextToTopWindow());
    937  }
    938 
    939  Maybe<RFPTargetSet> overriddenFingerprintingSettingsArg;
    940  Maybe<RFPTargetSet> overriddenFingerprintingSettings =
    941      aLoadInfo->GetOverriddenFingerprintingSettings();
    942 
    943  if (overriddenFingerprintingSettings) {
    944    overriddenFingerprintingSettingsArg =
    945        Some(overriddenFingerprintingSettings.ref());
    946  }
    947 
    948  Maybe<RequestMode> requestMode;
    949  aLoadInfo->GetRequestMode(&requestMode);
    950 
    951  *aForwarderArgsOut = ParentLoadInfoForwarderArgs(
    952      aLoadInfo->GetAllowInsecureRedirectToDataURI(), ipcController, tainting,
    953      aLoadInfo->GetSkipContentSniffing(), aLoadInfo->GetHttpsOnlyStatus(),
    954      aLoadInfo->GetSchemelessInput(), aLoadInfo->GetHttpsUpgradeTelemetry(),
    955      aLoadInfo->GetHstsStatus(), aLoadInfo->GetHasValidUserGestureActivation(),
    956      aLoadInfo->GetTextDirectiveUserActivation(),
    957      aLoadInfo->GetAllowDeprecatedSystemRequests(),
    958      aLoadInfo->GetIsInDevToolsContext(), aLoadInfo->GetParserCreatedScript(),
    959      requestMode, aLoadInfo->GetTriggeringSandboxFlags(),
    960      aLoadInfo->GetTriggeringWindowId(),
    961      aLoadInfo->GetTriggeringStorageAccess(),
    962      aLoadInfo->GetServiceWorkerTaintingSynthesized(),
    963      aLoadInfo->GetDocumentHasUserInteracted(),
    964      aLoadInfo->GetAllowListFutureDocumentsCreatedFromThisRedirectChain(),
    965      cookieJarSettingsArgs, aLoadInfo->GetContainerFeaturePolicyInfo(),
    966      aLoadInfo->GetRequestBlockingReason(), aLoadInfo->GetStoragePermission(),
    967      overriddenFingerprintingSettingsArg, aLoadInfo->GetIsMetaRefresh(),
    968      isThirdPartyContextToTopWindow, aLoadInfo->GetIsInThirdPartyContext(),
    969      aLoadInfo->GetIsOn3PCBExceptionList(), unstrippedURI,
    970      aLoadInfo->GetUserNavigationInvolvement());
    971 }
    972 
    973 nsresult MergeParentLoadInfoForwarder(
    974    ParentLoadInfoForwarderArgs const& aForwarderArgs, nsILoadInfo* aLoadInfo) {
    975  nsresult rv;
    976 
    977  rv = aLoadInfo->SetAllowInsecureRedirectToDataURI(
    978      aForwarderArgs.allowInsecureRedirectToDataURI());
    979  NS_ENSURE_SUCCESS(rv, rv);
    980 
    981  aLoadInfo->ClearController();
    982  auto& controller = aForwarderArgs.controller();
    983  if (controller.isSome()) {
    984    aLoadInfo->SetController(ServiceWorkerDescriptor(controller.ref()));
    985  }
    986 
    987  if (aForwarderArgs.serviceWorkerTaintingSynthesized()) {
    988    aLoadInfo->SynthesizeServiceWorkerTainting(
    989        static_cast<LoadTainting>(aForwarderArgs.tainting()));
    990  } else {
    991    aLoadInfo->MaybeIncreaseTainting(aForwarderArgs.tainting());
    992  }
    993  rv = aLoadInfo->SetTextDirectiveUserActivation(
    994      aForwarderArgs.textDirectiveUserActivation());
    995  NS_ENSURE_SUCCESS(rv, rv);
    996 
    997  rv = aLoadInfo->SetSkipContentSniffing(aForwarderArgs.skipContentSniffing());
    998  NS_ENSURE_SUCCESS(rv, rv);
    999 
   1000  rv = aLoadInfo->SetHttpsOnlyStatus(aForwarderArgs.httpsOnlyStatus());
   1001  NS_ENSURE_SUCCESS(rv, rv);
   1002 
   1003  rv = aLoadInfo->SetSchemelessInput(aForwarderArgs.schemelessInput());
   1004  NS_ENSURE_SUCCESS(rv, rv);
   1005 
   1006  rv = aLoadInfo->SetHttpsUpgradeTelemetry(
   1007      aForwarderArgs.httpsUpgradeTelemetry());
   1008  NS_ENSURE_SUCCESS(rv, rv);
   1009 
   1010  rv = aLoadInfo->SetHstsStatus(aForwarderArgs.hstsStatus());
   1011  NS_ENSURE_SUCCESS(rv, rv);
   1012 
   1013  rv = aLoadInfo->SetTriggeringSandboxFlags(
   1014      aForwarderArgs.triggeringSandboxFlags());
   1015  NS_ENSURE_SUCCESS(rv, rv);
   1016 
   1017  rv = aLoadInfo->SetTriggeringWindowId(aForwarderArgs.triggeringWindowId());
   1018  NS_ENSURE_SUCCESS(rv, rv);
   1019 
   1020  rv = aLoadInfo->SetTriggeringStorageAccess(
   1021      aForwarderArgs.triggeringStorageAccess());
   1022  NS_ENSURE_SUCCESS(rv, rv);
   1023 
   1024  rv = aLoadInfo->SetHasValidUserGestureActivation(
   1025      aForwarderArgs.hasValidUserGestureActivation());
   1026  NS_ENSURE_SUCCESS(rv, rv);
   1027 
   1028  rv = aLoadInfo->SetAllowDeprecatedSystemRequests(
   1029      aForwarderArgs.allowDeprecatedSystemRequests());
   1030  NS_ENSURE_SUCCESS(rv, rv);
   1031 
   1032  rv = aLoadInfo->SetIsInDevToolsContext(aForwarderArgs.isInDevToolsContext());
   1033  NS_ENSURE_SUCCESS(rv, rv);
   1034 
   1035  rv = aLoadInfo->SetParserCreatedScript(aForwarderArgs.parserCreatedScript());
   1036  NS_ENSURE_SUCCESS(rv, rv);
   1037 
   1038  rv = aLoadInfo->SetRequestMode(aForwarderArgs.requestMode());
   1039  NS_ENSURE_SUCCESS(rv, rv);
   1040 
   1041  MOZ_ALWAYS_SUCCEEDS(aLoadInfo->SetDocumentHasUserInteracted(
   1042      aForwarderArgs.documentHasUserInteracted()));
   1043  MOZ_ALWAYS_SUCCEEDS(
   1044      aLoadInfo->SetAllowListFutureDocumentsCreatedFromThisRedirectChain(
   1045          aForwarderArgs
   1046              .allowListFutureDocumentsCreatedFromThisRedirectChain()));
   1047  MOZ_ALWAYS_SUCCEEDS(aLoadInfo->SetRequestBlockingReason(
   1048      aForwarderArgs.requestBlockingReason()));
   1049 
   1050  const Maybe<CookieJarSettingsArgs>& cookieJarSettingsArgs =
   1051      aForwarderArgs.cookieJarSettings();
   1052  if (cookieJarSettingsArgs.isSome()) {
   1053    nsCOMPtr<nsICookieJarSettings> cookieJarSettings;
   1054    nsresult rv =
   1055        aLoadInfo->GetCookieJarSettings(getter_AddRefs(cookieJarSettings));
   1056    if (NS_SUCCEEDED(rv) && cookieJarSettings) {
   1057      nsCOMPtr<nsICookieJarSettings> mergedCookieJarSettings;
   1058      mergedCookieJarSettings =
   1059          static_cast<CookieJarSettings*>(cookieJarSettings.get())
   1060              ->Merge(cookieJarSettingsArgs.ref());
   1061      aLoadInfo->SetCookieJarSettings(mergedCookieJarSettings);
   1062    }
   1063  }
   1064 
   1065  rv = aLoadInfo->SetStoragePermission(aForwarderArgs.storagePermission());
   1066  NS_ENSURE_SUCCESS(rv, rv);
   1067 
   1068  rv = aLoadInfo->SetIsMetaRefresh(aForwarderArgs.isMetaRefresh());
   1069  NS_ENSURE_SUCCESS(rv, rv);
   1070 
   1071  const Maybe<RFPTargetSet> overriddenFingerprintingSettings =
   1072      aForwarderArgs.overriddenFingerprintingSettings();
   1073  if (overriddenFingerprintingSettings.isSome()) {
   1074    aLoadInfo->SetOverriddenFingerprintingSettings(
   1075        overriddenFingerprintingSettings.ref());
   1076  }
   1077 
   1078  static_cast<LoadInfo*>(aLoadInfo)->ClearIsThirdPartyContextToTopWindow();
   1079  if (aForwarderArgs.isThirdPartyContextToTopWindow().isSome()) {
   1080    rv = aLoadInfo->SetIsThirdPartyContextToTopWindow(
   1081        aForwarderArgs.isThirdPartyContextToTopWindow().ref());
   1082  }
   1083  NS_ENSURE_SUCCESS(rv, rv);
   1084 
   1085  rv = aLoadInfo->SetIsInThirdPartyContext(
   1086      aForwarderArgs.isInThirdPartyContext());
   1087  NS_ENSURE_SUCCESS(rv, rv);
   1088 
   1089  rv = aLoadInfo->SetIsOn3PCBExceptionList(
   1090      aForwarderArgs.isOn3PCBExceptionList());
   1091  NS_ENSURE_SUCCESS(rv, rv);
   1092 
   1093  rv = aLoadInfo->SetUnstrippedURI(aForwarderArgs.unstrippedURI());
   1094  NS_ENSURE_SUCCESS(rv, rv);
   1095 
   1096  if (aForwarderArgs.containerFeaturePolicyInfo()) {
   1097    aLoadInfo->SetContainerFeaturePolicyInfo(
   1098        *aForwarderArgs.containerFeaturePolicyInfo());
   1099  }
   1100 
   1101  aLoadInfo->SetUserNavigationInvolvement(
   1102      uint8_t(aForwarderArgs.userNavigationInvolvement()));
   1103 
   1104  return NS_OK;
   1105 }
   1106 
   1107 void LoadInfoToChildLoadInfoForwarder(
   1108    nsILoadInfo* aLoadInfo, ChildLoadInfoForwarderArgs* aForwarderArgsOut) {
   1109  Maybe<IPCClientInfo> ipcReserved;
   1110  Maybe<ClientInfo> reserved(aLoadInfo->GetReservedClientInfo());
   1111  if (reserved.isSome()) {
   1112    ipcReserved.emplace(reserved.ref().ToIPC());
   1113  }
   1114 
   1115  Maybe<IPCClientInfo> ipcInitial;
   1116  Maybe<ClientInfo> initial(aLoadInfo->GetInitialClientInfo());
   1117  if (initial.isSome()) {
   1118    ipcInitial.emplace(initial.ref().ToIPC());
   1119  }
   1120 
   1121  Maybe<IPCServiceWorkerDescriptor> ipcController;
   1122  Maybe<ServiceWorkerDescriptor> controller(aLoadInfo->GetController());
   1123  if (controller.isSome()) {
   1124    ipcController.emplace(controller.ref().ToIPC());
   1125  }
   1126 
   1127  *aForwarderArgsOut =
   1128      ChildLoadInfoForwarderArgs(ipcReserved, ipcInitial, ipcController,
   1129                                 aLoadInfo->GetRequestBlockingReason());
   1130 }
   1131 
   1132 nsresult MergeChildLoadInfoForwarder(
   1133    const ChildLoadInfoForwarderArgs& aForwarderArgs, nsILoadInfo* aLoadInfo) {
   1134  Maybe<ClientInfo> reservedClientInfo;
   1135  auto& ipcReserved = aForwarderArgs.reservedClientInfo();
   1136  if (ipcReserved.isSome()) {
   1137    reservedClientInfo.emplace(ClientInfo(ipcReserved.ref()));
   1138  }
   1139 
   1140  Maybe<ClientInfo> initialClientInfo;
   1141  auto& ipcInitial = aForwarderArgs.initialClientInfo();
   1142  if (ipcInitial.isSome()) {
   1143    initialClientInfo.emplace(ClientInfo(ipcInitial.ref()));
   1144  }
   1145 
   1146  // There should only be at most one reserved or initial ClientInfo.
   1147  if (NS_WARN_IF(reservedClientInfo.isSome() && initialClientInfo.isSome())) {
   1148    return NS_ERROR_FAILURE;
   1149  }
   1150 
   1151  // If we received no reserved or initial ClientInfo, then we must not
   1152  // already have one set.  There are no use cases where this should
   1153  // happen and we don't have a way to clear the current value.
   1154  if (NS_WARN_IF(reservedClientInfo.isNothing() &&
   1155                 initialClientInfo.isNothing() &&
   1156                 (aLoadInfo->GetReservedClientInfo().isSome() ||
   1157                  aLoadInfo->GetInitialClientInfo().isSome()))) {
   1158    return NS_ERROR_FAILURE;
   1159  }
   1160 
   1161  if (reservedClientInfo.isSome()) {
   1162    // We need to override here instead of simply set the value.  This
   1163    // allows us to change the reserved client.  This is necessary when
   1164    // the ClientChannelHelper created a new reserved client in the
   1165    // child-side of the redirect.
   1166    aLoadInfo->OverrideReservedClientInfoInParent(reservedClientInfo.ref());
   1167  } else if (initialClientInfo.isSome()) {
   1168    aLoadInfo->SetInitialClientInfo(initialClientInfo.ref());
   1169  }
   1170 
   1171  aLoadInfo->ClearController();
   1172  auto& controller = aForwarderArgs.controller();
   1173  if (controller.isSome()) {
   1174    aLoadInfo->SetController(ServiceWorkerDescriptor(controller.ref()));
   1175  }
   1176 
   1177  uint32_t blockingReason = aForwarderArgs.requestBlockingReason();
   1178  if (blockingReason) {
   1179    // We only want to override when non-null, so that any earlier set non-null
   1180    // value is not reverted to 0.
   1181    aLoadInfo->SetRequestBlockingReason(blockingReason);
   1182  }
   1183 
   1184  return NS_OK;
   1185 }
   1186 
   1187 }  // namespace ipc
   1188 }  // namespace mozilla