tor-browser

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

mozIThirdPartyUtil.idl (8260B)


      1 /* This Source Code Form is subject to the terms of the Mozilla Public
      2 * License, v. 2.0. If a copy of the MPL was not distributed with this
      3 * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
      4 
      5 #include "nsISupports.idl"
      6 
      7 interface nsIURI;
      8 interface mozIDOMWindowProxy;
      9 interface nsIChannel;
     10 interface nsIPrincipal;
     11 interface nsILoadInfo;
     12 
     13 %{C++
     14 
     15 #include "mozilla/EnumSet.h"
     16 
     17 enum class ThirdPartyAnalysis {
     18  IsForeign,
     19  IsThirdPartyTrackingResource,
     20  IsThirdPartySocialTrackingResource,
     21  IsStorageAccessPermissionGranted,
     22 };
     23 
     24 using ThirdPartyAnalysisResult = mozilla::EnumSet<ThirdPartyAnalysis>;
     25 
     26 typedef bool (*RequireThirdPartyCheck)(nsILoadInfo*);
     27 
     28 %}
     29 
     30 native ThirdPartyAnalysisResult(ThirdPartyAnalysisResult);
     31 native RequireThirdPartyCheck(RequireThirdPartyCheck);
     32 
     33 /**
     34 * Utility functions for determining whether a given URI, channel, or window
     35 * hierarchy is third party with respect to a known URI.
     36 */
     37 [scriptable, builtinclass, uuid(fd82700e-ffb4-4932-b7d6-08f0b5697dda)]
     38 interface mozIThirdPartyUtil : nsISupports
     39 {
     40  /**
     41   * isThirdPartyURI
     42   *
     43   * Determine whether two URIs are third party with respect to each other.
     44   * This is determined by computing the base domain for both URIs. If they can
     45   * be determined, and the base domains match, the request is defined as first
     46   * party. If it cannot be determined because one or both URIs do not have a
     47   * base domain (for instance, in the case of IP addresses, host aliases such
     48   * as 'localhost', or a file:// URI), an exact string comparison on host is
     49   * performed.
     50   *
     51   * For example, the URI "http://mail.google.com/" is not third party with
     52   * respect to "http://images.google.com/", but "http://mail.yahoo.com/" and
     53   * "http://192.168.1.1/" are.
     54   *
     55   * @return true if aFirstURI is third party with respect to aSecondURI.
     56   *
     57   * @throws if either URI is null, has a malformed host, or has an empty host
     58   *         and is not a file:// URI.
     59   */
     60  boolean isThirdPartyURI(in nsIURI aFirstURI, in nsIURI aSecondURI);
     61 
     62  /**
     63   * isThirdPartyWindow
     64   *
     65   * Determine whether the given window hierarchy is third party. This is done
     66   * as follows:
     67   *
     68   * 1) Obtain the URI of the principal associated with 'aWindow'. Call this the
     69   *    'bottom URI'.
     70   * 2) If 'aURI' is provided, determine if it is third party with respect to
     71   *    the bottom URI. If so, return.
     72   * 3) Find the same-type parent window, if there is one, and its URI.
     73   *    Determine whether it is third party with respect to the bottom URI. If
     74   *    so, return.
     75   *
     76   * Therefore, each level in the window hierarchy is tested. (This means that
     77   * nested iframes with different base domains, even though the bottommost and
     78   * topmost URIs might be equal, will be considered third party.)
     79   *
     80   * @param aWindow
     81   *        The bottommost window in the hierarchy.
     82   * @param aURI
     83   *        A URI to test against. If null, the URI of the principal
     84   *        associated with 'aWindow' will be used.
     85   *
     86   * For example, if 'aURI' is "http://mail.google.com/", 'aWindow' has a URI
     87   * of "http://google.com/", and its parent is the topmost content window with
     88   * a URI of "http://mozilla.com", the result will be true.
     89   *
     90   * @return true if 'aURI' is third party with respect to any of the URIs
     91   *         associated with aWindow and its same-type parents.
     92   *
     93   * @throws if aWindow is null; the same-type parent of any window in the
     94   *         hierarchy cannot be determined; or the URI associated with any
     95   *         window in the hierarchy is null, has a malformed host, or has an
     96   *         empty host and is not a file:// URI.
     97   *
     98   * @see isThirdPartyURI
     99   */
    100  boolean isThirdPartyWindow(in mozIDOMWindowProxy aWindow, [optional] in nsIURI aURI);
    101 
    102  /**
    103   * isThirdPartyChannel
    104   *
    105   * Determine whether the given channel and its content window hierarchy is
    106   * third party. This is done as follows:
    107   *
    108   * 1) If 'aChannel' is an nsIHttpChannel and has the
    109   *    'forceAllowThirdPartyCookie' property set, then:
    110   *    a) If 'aURI' is null, return false.
    111   *    b) Otherwise, find the URI of the channel, determine whether it is
    112   *       foreign with respect to 'aURI', and return.
    113   * 2) Find the URI of the channel and determine whether it is third party with
    114   *    respect to the URI of the channel. If so, return.
    115   * 3) Obtain the bottommost nsIDOMWindow, and its same-type parent if it
    116   *    exists, from the channel's notification callbacks. Then:
    117   *    a) If the parent is the same as the bottommost window, and the channel
    118   *       has the LOAD_DOCUMENT_URI flag set, return false. This represents the
    119   *       case where a toplevel load is occurring and the window's URI has not
    120   *       yet been updated. (We have already checked that 'aURI' is not foreign
    121   *       with respect to the channel URI.)
    122   *    b) Otherwise, return the result of isThirdPartyWindow with arguments
    123   *       of the channel's bottommost window and the channel URI, respectively.
    124   *
    125   * Therefore, both the channel's URI and each level in the window hierarchy
    126   * associated with the channel is tested.
    127   *
    128   * @param aChannel
    129   *        The channel associated with the load.
    130   * @param aURI
    131   *        A URI to test against. If null, the URI of the channel will be used.
    132   *
    133   * For example, if 'aURI' is "http://mail.google.com/", 'aChannel' has a URI
    134   * of "http://google.com/", and its parent is the topmost content window with
    135   * a URI of "http://mozilla.com", the result will be true.
    136   *
    137   * @return true if aURI is third party with respect to the channel URI or any
    138   *         of the URIs associated with the same-type window hierarchy of the
    139   *         channel.
    140   *
    141   * @throws if 'aChannel' is null; the channel has no notification callbacks or
    142   *         an associated window; or isThirdPartyWindow throws.
    143   *
    144   * @see isThirdPartyWindow
    145   */
    146  boolean isThirdPartyChannel(in nsIChannel aChannel, [optional] in nsIURI aURI);
    147 
    148  /**
    149   * getBaseDomain
    150   *
    151   * Get the base domain for aHostURI; e.g. for "www.bbc.co.uk", this would be
    152   * "bbc.co.uk". Only properly-formed URI's are tolerated, though a trailing
    153   * dot may be present. If aHostURI is an IP address, an alias such as
    154   * 'localhost', an eTLD such as 'co.uk', or the empty string, aBaseDomain will
    155   * be the exact host. The result of this function should only be used in exact
    156   * string comparisons, since substring comparisons will not be valid for the
    157   * special cases elided above.
    158   *
    159   * @param aHostURI
    160   *        The URI to analyze.
    161   *
    162   * @return the base domain.
    163   */
    164  AUTF8String getBaseDomain(in nsIURI aHostURI);
    165 
    166  /**
    167   * getURIFromWindow
    168   *
    169   * Returns the URI associated with the script object principal for the
    170   * window.
    171   */
    172  nsIURI getURIFromWindow(in mozIDOMWindowProxy aWindow);
    173 
    174  /**
    175   * getPrincipalFromWindow
    176   *
    177   * Returns the script object principal for the window.
    178   */
    179  nsIPrincipal getPrincipalFromWindow(in mozIDOMWindowProxy aWindow);
    180 
    181  /**
    182   * getTopWindowForChannel
    183   *
    184   * Returns the top-level window associated with the given channel.
    185   */
    186  [noscript]
    187  mozIDOMWindowProxy getTopWindowForChannel(in nsIChannel aChannel, [optional] in nsIURI aURIBeingLoaded);
    188 
    189  /*
    190   * Performs a full analysis of a channel.
    191   *
    192   * aChannel the input channel
    193   * aNotify whether to send content blocking notifications if access control checks fail
    194   * aURI optional URI to check for (the channel URI will be used instead if not provided)
    195   * aRequireThirdPartyCheck a functor used to determine whether the load info requires third-party checks
    196   */
    197  [noscript, notxpcom]
    198  ThirdPartyAnalysisResult analyzeChannel(in nsIChannel aChannel,
    199                                          in boolean aNotify,
    200                                          [optional] in nsIURI aURI,
    201                                          [optional] in RequireThirdPartyCheck aRequireThirdPartyCheck,
    202                                          out uint32_t aRejectedReason);
    203 };
    204 
    205 %{ C++
    206 /**
    207 * The mozIThirdPartyUtil implementation is an XPCOM service registered
    208 * under the ContractID:
    209 */
    210 #define THIRDPARTYUTIL_CONTRACTID "@mozilla.org/thirdpartyutil;1"
    211 %}