/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ /* vim: set ts=8 sts=2 et sw=2 tw=80: */ /* 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_ReferrerInfo_h #define mozilla_dom_ReferrerInfo_h #include "nsCOMPtr.h" #include "nsIReferrerInfo.h" #include "nsReadableUtils.h" #include "mozilla/Maybe.h" #include "mozilla/HashFunctions.h" #include "mozilla/dom/ReferrerPolicyBinding.h" #define REFERRERINFOF_CONTRACTID "@mozilla.org/referrer-info;1" // 041a129f-10ce-4bda-a60d-e027a26d5ed0 #define REFERRERINFO_CID \ { \ 0x041a129f, 0x10ce, 0x4bda, { \ 0xa6, 0x0d, 0xe0, 0x27, 0xa2, 0x6d, 0x5e, 0xd0 \ } \ } class nsIHttpChannel; class nsIURI; class nsIChannel; class nsILoadInfo; class nsINode; class nsIPrincipal; namespace mozilla { class StyleSheet; class URLAndReferrerInfo; namespace net { class HttpBaseChannel; class nsHttpChannel; } // namespace net } // namespace mozilla namespace mozilla::dom { /** * The ReferrerInfo class holds the raw referrer and potentially a referrer * policy which allows to query the computed referrer which should be applied to * a channel as the actual referrer value. * * The ReferrerInfo class solely contains readonly fields and represents a 1:1 * sync to the referrer header of the corresponding channel. In turn that means * the class is immutable - so any modifications require to clone the current * ReferrerInfo. * * For example if a request undergoes a redirect, the new channel * will need a new ReferrerInfo clone with members being updated accordingly. */ class ReferrerInfo : public nsIReferrerInfo { public: typedef enum ReferrerPolicy ReferrerPolicyEnum; ReferrerInfo(); explicit ReferrerInfo( nsIURI* aOriginalReferrer, ReferrerPolicyEnum aPolicy = ReferrerPolicy::_empty, bool aSendReferrer = true, const Maybe& aComputedReferrer = Maybe()); // Creates already initialized ReferrerInfo from an element or a document. explicit ReferrerInfo(const Element&); explicit ReferrerInfo(const Document&); // create an exact copy of the ReferrerInfo already_AddRefed Clone() const; // create an copy of the ReferrerInfo with new referrer policy already_AddRefed CloneWithNewPolicy( ReferrerPolicyEnum aPolicy) const; // create an copy of the ReferrerInfo with new send referrer already_AddRefed CloneWithNewSendReferrer( bool aSendReferrer) const; // create an copy of the ReferrerInfo with new original referrer already_AddRefed CloneWithNewOriginalReferrer( nsIURI* aOriginalReferrer) const; // Record the telemetry for the referrer policy. void RecordTelemetry(nsIHttpChannel* aChannel); /* * Helper function to create a new ReferrerInfo object from other. We will not * pass in any computed values and override referrer policy if needed * * @param aOther the other referrerInfo object to init from. * @param aPolicyOverride referrer policy to override if necessary. */ static already_AddRefed CreateFromOtherAndPolicyOverride( nsIReferrerInfo* aOther, ReferrerPolicyEnum aPolicyOverride); /* * Helper function to create a new ReferrerInfo object from a given document * and override referrer policy if needed (for example, when parsing link * header or speculative loading). * * @param aDocument the document to init referrerInfo object. * @param aPolicyOverride referrer policy to override if necessary. */ static already_AddRefed CreateFromDocumentAndPolicyOverride( Document* aDoc, ReferrerPolicyEnum aPolicyOverride); /* * Implements step 3.1 and 3.3 of the Determine request's Referrer algorithm * from the Referrer Policy specification. * * https://w3c.github.io/webappsec/specs/referrer-policy/#determine-requests-referrer */ static already_AddRefed CreateForFetch( nsIPrincipal* aPrincipal, Document* aDoc); /** * Helper function to create new ReferrerInfo object from a given external * stylesheet. The returned nsIReferrerInfo object will be used for any * requests or resources referenced by the sheet. * * @param aSheet the stylesheet to init referrerInfo. * @param aPolicy referrer policy from header if there's any. */ static already_AddRefed CreateForExternalCSSResources( StyleSheet* aExternalSheet, ReferrerPolicyEnum aPolicy = ReferrerPolicy::_empty); /** * Helper function to create new ReferrerInfo object from a given document. * The returned nsIReferrerInfo object will be used for any requests or * resources referenced by internal stylesheet (for example style="" or * wrapped by