177 lines
6.6 KiB
C++
177 lines
6.6 KiB
C++
/* -*- 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_BounceTrackingState_h
|
|
#define mozilla_BounceTrackingState_h
|
|
|
|
#include "BounceTrackingRecord.h"
|
|
#include "mozilla/WeakPtr.h"
|
|
#include "mozilla/OriginAttributes.h"
|
|
#include "nsIPrincipal.h"
|
|
#include "nsStringFwd.h"
|
|
#include "nsIWebProgressListener.h"
|
|
#include "nsWeakReference.h"
|
|
|
|
class nsIChannel;
|
|
class nsITimer;
|
|
class nsIPrincipal;
|
|
|
|
namespace mozilla {
|
|
|
|
class BounceTrackingProtection;
|
|
|
|
namespace dom {
|
|
class CanonicalBrowsingContext;
|
|
class BrowsingContext;
|
|
class BrowsingContextWebProgress;
|
|
} // namespace dom
|
|
|
|
/**
|
|
* This class manages the bounce tracking state for a given tab. It is attached
|
|
* to top-level CanonicalBrowsingContexts.
|
|
*/
|
|
class BounceTrackingState : public nsIWebProgressListener,
|
|
public nsSupportsWeakReference,
|
|
public SupportsWeakPtr {
|
|
public:
|
|
NS_DECL_ISUPPORTS
|
|
NS_DECL_NSIWEBPROGRESSLISTENER
|
|
|
|
// Gets or creates an existing BrowsingContextState keyed by browserId. May
|
|
// return nullptr if the given web progress / browsing context is not suitable
|
|
// (see ShouldCreateBounceTrackingStateForWebProgress).
|
|
static already_AddRefed<BounceTrackingState> GetOrCreate(
|
|
dom::BrowsingContextWebProgress* aWebProgress, nsresult& aRv);
|
|
|
|
// Reset state for all BounceTrackingState instances this includes resetting
|
|
// BounceTrackingRecords and cancelling any running timers.
|
|
static void ResetAll();
|
|
|
|
// Resets and destroys all BounceTrackingState objects. This is used when the
|
|
// feature gets disabled.
|
|
static void DestroyAll();
|
|
|
|
// Reset BounceTrackingState objects matching OriginAttributes.
|
|
static void ResetAllForOriginAttributes(
|
|
const OriginAttributes& aOriginAttributes);
|
|
// Same as above but for a pattern.
|
|
static void ResetAllForOriginAttributesPattern(
|
|
const OriginAttributesPattern& aPattern);
|
|
|
|
const Maybe<BounceTrackingRecord>& GetBounceTrackingRecord();
|
|
|
|
void ResetBounceTrackingRecord();
|
|
|
|
// The top level BrowsingContext and its BrowsingContextWebProgress are
|
|
// discarded (e.g. tab closed).
|
|
void OnBrowsingContextDiscarded();
|
|
|
|
// Callback for when we received a response from the server and are about to
|
|
// create a document for the response. Calls into
|
|
// BounceTrackingState::OnResponseReceived.
|
|
[[nodiscard]] nsresult OnDocumentStartRequest(nsIChannel* aChannel);
|
|
|
|
// At the start of a navigation, either initialize a new bounce tracking
|
|
// record, or append a client-side redirect to the current bounce tracking
|
|
// record.
|
|
// Should only be called for top level content navigations.
|
|
[[nodiscard]] nsresult OnStartNavigation(
|
|
nsIPrincipal* aTriggeringPrincipal,
|
|
const bool aHasValidUserGestureActivation);
|
|
|
|
// Record sites which have written cookies in the current extended
|
|
// navigation.
|
|
[[nodiscard]] nsresult OnCookieWrite(const nsACString& aSiteHost);
|
|
|
|
// Whether the given BrowsingContext should hold a BounceTrackingState
|
|
// instance to monitor bounce tracking navigations.
|
|
static bool ShouldCreateBounceTrackingStateForBC(
|
|
dom::CanonicalBrowsingContext* aBrowsingContext);
|
|
|
|
// Whether the given principal should be tracked for bounce tracking.
|
|
static bool ShouldTrackPrincipal(nsIPrincipal* aPrincipal);
|
|
|
|
// Check if there is a BounceTrackingState which current browsing context is
|
|
// associated with aSiteHost. Also takes OriginAttributes into account for
|
|
// isolation between normal browsing, private browsing and containers.
|
|
// This is an approximation for checking if a given site is currently loaded
|
|
// in the top level context, e.g. in a tab. See Bug 1842047 for adding a more
|
|
// accurate check that calls into the browser implementations.
|
|
[[nodiscard]] static nsresult HasBounceTrackingStateForSite(
|
|
const nsACString& aSiteHost, const OriginAttributes& aOriginAttributes,
|
|
bool& aResult);
|
|
|
|
// Get the currently associated BrowsingContext. Returns nullptr if it has not
|
|
// been attached yet.
|
|
already_AddRefed<dom::BrowsingContext> CurrentBrowsingContext();
|
|
|
|
uint64_t GetBrowserId() { return mBrowserId; }
|
|
|
|
const OriginAttributes& OriginAttributesRef();
|
|
|
|
// Create a string that describes this object. Used for logging.
|
|
nsCString Describe();
|
|
|
|
// Record sites which have accessed storage in the current extended
|
|
// navigation.
|
|
[[nodiscard]] nsresult OnStorageAccess(nsIPrincipal* aPrincipal);
|
|
|
|
// Record sites which have user activation in the current extended
|
|
// navigation.
|
|
[[nodiscard]] nsresult OnUserActivation(const nsACString& aSiteHost);
|
|
|
|
private:
|
|
explicit BounceTrackingState();
|
|
virtual ~BounceTrackingState();
|
|
|
|
bool mIsInitialized{false};
|
|
|
|
uint64_t mBrowserId{};
|
|
|
|
// OriginAttributes associated with the browser this state is attached to.
|
|
OriginAttributes mOriginAttributes;
|
|
|
|
// Reference to the BounceTrackingProtection singleton.
|
|
RefPtr<BounceTrackingProtection> mBounceTrackingProtection;
|
|
|
|
// Record to keep track of extended navigation data. Reset on extended
|
|
// navigation end.
|
|
Maybe<BounceTrackingRecord> mBounceTrackingRecord;
|
|
|
|
// Timer to wait to wait for a client redirect after a navigation ends.
|
|
RefPtr<nsITimer> mClientBounceDetectionTimeout;
|
|
|
|
// Reset state for all BounceTrackingState instances this includes resetting
|
|
// BounceTrackingRecords and cancelling any running timers.
|
|
// Optionally filter by OriginAttributes or OriginAttributesPattern.
|
|
static void Reset(const OriginAttributes* aOriginAttributes,
|
|
const OriginAttributesPattern* aPattern);
|
|
|
|
// Whether the given web progress should hold a BounceTrackingState
|
|
// instance to monitor bounce tracking navigations.
|
|
static bool ShouldCreateBounceTrackingStateForWebProgress(
|
|
dom::BrowsingContextWebProgress* aWebProgress);
|
|
|
|
// Init to be called after creation, attaches nsIWebProgressListener.
|
|
[[nodiscard]] nsresult Init(dom::BrowsingContextWebProgress* aWebProgress);
|
|
|
|
// When the response is received at the end of a navigation, fill the
|
|
// bounce set.
|
|
[[nodiscard]] nsresult OnResponseReceived(
|
|
const nsTArray<nsCString>& aSiteList);
|
|
|
|
// When the document is loaded at the end of a navigation, update the
|
|
// final host.
|
|
[[nodiscard]] nsresult OnDocumentLoaded(nsIPrincipal* aDocumentPrincipal);
|
|
|
|
// Record sites which have activated service workers in the current
|
|
// extended navigation.
|
|
[[nodiscard]] nsresult OnServiceWorkerActivation();
|
|
};
|
|
|
|
} // namespace mozilla
|
|
|
|
#endif
|