184 lines
8.1 KiB
C++
184 lines
8.1 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_antitrackingutils_h
|
|
#define mozilla_antitrackingutils_h
|
|
|
|
#include "mozilla/AlreadyAddRefed.h"
|
|
#include "mozilla/Maybe.h"
|
|
#include "nsStringFwd.h"
|
|
#include "ContentBlockingNotifier.h"
|
|
|
|
#include "nsILoadInfo.h"
|
|
|
|
class nsPIDOMWindowInner;
|
|
class nsPIDOMWindowOuter;
|
|
class nsIChannel;
|
|
class nsIPermission;
|
|
class nsIPrincipal;
|
|
class nsIURI;
|
|
|
|
namespace mozilla {
|
|
namespace dom {
|
|
class BrowsingContext;
|
|
class CanonicalBrowsingContext;
|
|
class Document;
|
|
class WindowGlobalParent;
|
|
} // namespace dom
|
|
|
|
class AntiTrackingUtils final {
|
|
public:
|
|
static already_AddRefed<nsPIDOMWindowInner> GetInnerWindow(
|
|
dom::BrowsingContext* aBrowsingContext);
|
|
|
|
static already_AddRefed<nsPIDOMWindowOuter> GetTopWindow(
|
|
nsPIDOMWindowInner* aWindow);
|
|
|
|
// Get the current document URI from a document channel as it is being loaded.
|
|
static already_AddRefed<nsIURI> MaybeGetDocumentURIBeingLoaded(
|
|
nsIChannel* aChannel);
|
|
|
|
static void CreateStoragePermissionKey(const nsACString& aTrackingOrigin,
|
|
nsACString& aPermissionKey);
|
|
|
|
// Given a principal, returns the storage permission key that will be used for
|
|
// the principal. Returns true on success.
|
|
static bool CreateStoragePermissionKey(nsIPrincipal* aPrincipal,
|
|
nsACString& aKey);
|
|
|
|
static void CreateStorageFramePermissionKey(const nsACString& aTrackingSite,
|
|
nsACString& aPermissionKey);
|
|
|
|
// Given a principal, returns the per-frame storage permission key that will
|
|
// be used for the principal. Returns true on success.
|
|
static bool CreateStorageFramePermissionKey(nsIPrincipal* aPrincipal,
|
|
nsACString& aKey);
|
|
|
|
// Given and embedded URI, returns the permission for allowing storage access
|
|
// requests from that URI's site. This permission is site-scoped in two ways:
|
|
// the principal it is stored under and the suffix built from aURI are both
|
|
// the Site rather than Origin.
|
|
static bool CreateStorageRequestPermissionKey(nsIURI* aURI,
|
|
nsACString& aPermissionKey);
|
|
|
|
// Returns true if the permission passed in is a storage access permission
|
|
// for the passed in principal argument.
|
|
static bool IsStorageAccessPermission(nsIPermission* aPermission,
|
|
nsIPrincipal* aPrincipal);
|
|
|
|
// Returns true if the storage permission is granted for the given principal
|
|
// and the storage permission key.
|
|
static bool CheckStoragePermission(nsIPrincipal* aPrincipal,
|
|
const nsAutoCString& aType,
|
|
bool aIsInPrivateBrowsing,
|
|
uint32_t* aRejectedReason,
|
|
uint32_t aBlockedReason);
|
|
|
|
// Returns the number of sites that give this principal's origin storage
|
|
// access.
|
|
static Maybe<size_t> CountSitesAllowStorageAccess(nsIPrincipal* aPrincipal);
|
|
|
|
// Test whether or not there is a storage access permission in aTopPrincipal
|
|
// with secondary key for embedee aPrincipal.
|
|
static nsresult TestStoragePermissionInParent(nsIPrincipal* aTopPrincipal,
|
|
nsIPrincipal* aPrincipal,
|
|
uint32_t* aResult);
|
|
|
|
// Returns the storage permission state for the given channel. And this is
|
|
// meant to be called in the parent process. This only reflects the fact that
|
|
// whether the channel has the storage permission. It doesn't take the window
|
|
// hierarchy into account. i.e. this will return
|
|
// nsILoadInfo::HasStoragePermission even for a nested iframe that has storage
|
|
// permission.
|
|
static nsILoadInfo::StoragePermissionState GetStoragePermissionStateInParent(
|
|
nsIChannel* aChannel);
|
|
|
|
// Returns the toplevel inner window id, returns 0 if this is a toplevel
|
|
// window.
|
|
static uint64_t GetTopLevelAntiTrackingWindowId(
|
|
dom::BrowsingContext* aBrowsingContext);
|
|
|
|
// Returns the parent inner window id, returns 0 if this or the parent are not
|
|
// a toplevel window. This is mainly used to determine the anti-tracking
|
|
// storage area.
|
|
static uint64_t GetTopLevelStorageAreaWindowId(
|
|
dom::BrowsingContext* aBrowsingContext);
|
|
|
|
// Returns the principal of the given browsing context.
|
|
// This API should only be used either in child processes with an in-process
|
|
// browsing context or in the parent process.
|
|
static already_AddRefed<nsIPrincipal> GetPrincipal(
|
|
dom::BrowsingContext* aBrowsingContext);
|
|
|
|
// Returns the principal of the given browsing context and tracking origin.
|
|
// This API should only be used either in child processes with an in-process
|
|
// browsing context or in the parent process.
|
|
static bool GetPrincipalAndTrackingOrigin(
|
|
dom::BrowsingContext* aBrowsingContext, nsIPrincipal** aPrincipal,
|
|
nsACString& aTrackingOrigin);
|
|
|
|
// Retruns the cookie behavior of the given browsingContext,
|
|
// return BEHAVIOR_REJECT when fail.
|
|
static uint32_t GetCookieBehavior(dom::BrowsingContext* aBrowsingContext);
|
|
|
|
// Returns the top-level global window parent. But we would stop at the
|
|
// content window which is loaded by addons and consider this window as a top.
|
|
//
|
|
// Note that this is the parent-process implementation of
|
|
// nsGlobalWindowOuter::GetTopExcludingExtensionAccessibleContentFrames
|
|
static already_AddRefed<dom::WindowGlobalParent>
|
|
GetTopWindowExcludingExtensionAccessibleContentFrames(
|
|
dom::CanonicalBrowsingContext* aBrowsingContext, nsIURI* aURIBeingLoaded);
|
|
|
|
// Given a channel, compute and set the IsThirdPartyContextToTopWindow for
|
|
// this channel. This function is supposed to be called in the parent process.
|
|
static void ComputeIsThirdPartyToTopWindow(nsIChannel* aChannel);
|
|
|
|
// Given a channel, this function determines if this channel is a third party.
|
|
// Note that this function also considers the top-level window. The channel
|
|
// will be considered as a third party only when it's a third party to both
|
|
// its parent and the top-level window.
|
|
static bool IsThirdPartyChannel(nsIChannel* aChannel);
|
|
|
|
// Given a window and a URI, this function first determines if the window is
|
|
// third-party with respect to the URI. The function returns if it's true.
|
|
// Otherwise, it will continue to check if the window is third-party.
|
|
static bool IsThirdPartyWindow(nsPIDOMWindowInner* aWindow, nsIURI* aURI);
|
|
|
|
// Given a Document, this function determines if this document
|
|
// is considered as a third party with respect to the top level context.
|
|
// This prefers to use the document's Channel's LoadInfo, but falls back to
|
|
// the BrowsingContext.
|
|
static bool IsThirdPartyDocument(dom::Document* aDocument);
|
|
|
|
// Given a browsing context, this function determines if this browsing context
|
|
// is considered as a third party in respect to the top-level context.
|
|
static bool IsThirdPartyContext(dom::BrowsingContext* aBrowsingContext);
|
|
|
|
static nsCString GrantedReasonToString(
|
|
ContentBlockingNotifier::StorageAccessPermissionGrantedReason aReason);
|
|
|
|
/**
|
|
* This function updates all the fields used by anti-tracking when a channel
|
|
* is opened. We have to do this in the parent to access cross-origin info
|
|
* that is not exposed to child processes.
|
|
*/
|
|
static void UpdateAntiTrackingInfoForChannel(nsIChannel* aChannel);
|
|
|
|
private:
|
|
// Helper function for ComputeIsThirdPartyToTopWindow to peer into the
|
|
// partition
|
|
// key in the case that we don't have any other way to determine
|
|
// third-partiness to the top level, e.g. third party SharedWorker script
|
|
// loads.
|
|
static nsresult IsThirdPartyToPartitionKeySite(nsIChannel* aChannel,
|
|
const nsCOMPtr<nsIURI>& aURI,
|
|
bool* aIsThirdParty);
|
|
};
|
|
|
|
} // namespace mozilla
|
|
|
|
#endif // mozilla_antitrackingutils_h
|