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 %}