Commit 741281cc authored by Kershaw Chang's avatar Kershaw Chang
Browse files

Bug 1543990 - Use origin attributes to start speculative connections for link...

Bug 1543990 - Use origin attributes to start speculative connections for link header, r=necko-reviewers,timhuang,valentin

Differential Revision: https://phabricator.services.mozilla.com/D179068
parent 2e7f3943
Loading
Loading
Loading
Loading
+4 −2
Original line number Diff line number Diff line
@@ -12485,8 +12485,10 @@ void Document::MaybePreconnect(nsIURI* aOrigURI, mozilla::CORSMode aCORSMode) {
    return;
  }
  speculator->SpeculativeConnect(uri, NodePrincipal(), nullptr,
                                 aCORSMode == CORS_ANONYMOUS);
  OriginAttributes oa;
  StoragePrincipalHelper::GetOriginAttributesForNetworkState(this, oa);
  speculator->SpeculativeConnectWithOriginAttributesNative(
      uri, std::move(oa), nullptr, aCORSMode == CORS_ANONYMOUS);
}
void Document::ForgetImagePreload(nsIURI* aURI) {
+5 −5
Original line number Diff line number Diff line
@@ -70,9 +70,9 @@ EarlyHintsPreConnectOverride::GetAllow1918(bool* allow) {

}  // namespace

void EarlyHintPreconnect::MaybePreconnect(const LinkHeader& aHeader,
                                          nsIURI* aBaseURI,
                                          nsIPrincipal* aPrincipal) {
void EarlyHintPreconnect::MaybePreconnect(
    const LinkHeader& aHeader, nsIURI* aBaseURI,
    OriginAttributes&& aOriginAttributes) {
  if (!StaticPrefs::network_early_hints_preconnect_enabled()) {
    return;
  }
@@ -99,8 +99,8 @@ void EarlyHintPreconnect::MaybePreconnect(const LinkHeader& aHeader,
  // connections we can make, so it should be fine we don't check duplicate
  // preconnect attempts here.
  CORSMode corsMode = dom::Element::StringToCORSMode(aHeader.mCrossOrigin);
  gIOService->SpeculativeConnect(uri, aPrincipal, callbacks,
                                 corsMode == CORS_ANONYMOUS);
  gIOService->SpeculativeConnectWithOriginAttributesNative(
      uri, std::move(aOriginAttributes), callbacks, corsMode == CORS_ANONYMOUS);
}

}  // namespace mozilla::net
+1 −1
Original line number Diff line number Diff line
@@ -12,7 +12,7 @@ namespace mozilla::net {
class EarlyHintPreconnect final {
 public:
  static void MaybePreconnect(const LinkHeader& aHeader, nsIURI* aBaseURI,
                              nsIPrincipal* aPrincipal);
                              OriginAttributes&& aOriginAttributes);

  EarlyHintPreconnect() = delete;
  EarlyHintPreconnect(const EarlyHintPreconnect&) = delete;
+6 −1
Original line number Diff line number Diff line
@@ -12,6 +12,7 @@
#include "mozilla/PreloadHashKey.h"
#include "mozilla/Telemetry.h"
#include "mozilla/glean/GleanMetrics.h"
#include "mozilla/StoragePrincipalHelper.h"
#include "nsContentUtils.h"
#include "nsIChannel.h"
#include "nsICookieJarSettings.h"
@@ -90,7 +91,11 @@ void EarlyHintsService::EarlyHint(const nsACString& aLinkHeader,
    CollectLinkTypeTelemetry(linkHeader.mRel);
    if (linkHeader.mRel.LowerCaseEqualsLiteral("preconnect")) {
      mLinkType |= dom::LinkStyle::ePRECONNECT;
      EarlyHintPreconnect::MaybePreconnect(linkHeader, aBaseURI, principal);
      OriginAttributes originAttributes;
      StoragePrincipalHelper::GetOriginAttributesForNetworkState(
          aChannel, originAttributes);
      EarlyHintPreconnect::MaybePreconnect(linkHeader, aBaseURI,
                                           std::move(originAttributes));
    } else if (linkHeader.mRel.LowerCaseEqualsLiteral("preload")) {
      mLinkType |= dom::LinkStyle::ePRELOAD;
      EarlyHintPreloader::MaybeCreateAndInsertPreload(
+24 −20
Original line number Diff line number Diff line
@@ -2216,26 +2216,6 @@ nsresult nsHttpHandler::SpeculativeConnectInternal(
  if (!mHandlerActive) return NS_OK;

  MOZ_ASSERT(NS_IsMainThread());
  nsCOMPtr<nsIObserverService> obsService = services::GetObserverService();
  if (mDebugObservations && obsService) {
    // this is basically used for test coverage of an otherwise 'hintable'
    // feature

    // This is used to test if the `crossOrigin` attribute is parsed correctly.
    nsPrintfCString debugURL("%s%s", aURI->GetSpecOrDefault().get(),
                             anonymous ? "anonymous" : "use-credentials");
    obsService->NotifyObservers(nullptr, "speculative-connect-request",
                                NS_ConvertUTF8toUTF16(debugURL).get());
    for (auto* cp :
         dom::ContentParent::AllProcesses(dom::ContentParent::eLive)) {
      PNeckoParent* neckoParent =
          SingleManagedOrNull(cp->ManagedPNeckoParent());
      if (!neckoParent) {
        continue;
      }
      Unused << neckoParent->SendSpeculativeConnectRequest();
    }
  }

  nsISiteSecurityService* sss = gHttpHandler->GetSSService();
  bool isStsHost = false;
@@ -2302,6 +2282,30 @@ nsresult nsHttpHandler::SpeculativeConnectInternal(
  if (originAttributes.mPrivateBrowsingId > 0) {
    ci->SetPrivate(true);
  }

  if (mDebugObservations) {
    // this is basically used for test coverage of an otherwise 'hintable'
    // feature

    nsCOMPtr<nsIObserverService> obsService = services::GetObserverService();
    if (obsService) {
      // This is used to test if the speculative connection has the right
      // connection info.
      nsPrintfCString debugHashKey("%s", ci->HashKey().get());
      obsService->NotifyObservers(nullptr, "speculative-connect-request",
                                  NS_ConvertUTF8toUTF16(debugHashKey).get());
      for (auto* cp :
           dom::ContentParent::AllProcesses(dom::ContentParent::eLive)) {
        PNeckoParent* neckoParent =
            SingleManagedOrNull(cp->ManagedPNeckoParent());
        if (!neckoParent) {
          continue;
        }
        Unused << neckoParent->SendSpeculativeConnectRequest();
      }
    }
  }

  return SpeculativeConnect(ci, aCallbacks);
}

Loading