|
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 nsIDOMWindow; |
|
9 interface nsIChannel; |
|
10 interface nsIDocument; |
|
11 |
|
12 /** |
|
13 * Utility functions for determining whether a given URI, channel, or window |
|
14 * hierarchy is third party with respect to a known URI. |
|
15 */ |
|
16 [scriptable, uuid(d994fd1d-d2fe-4372-9ae7-88b08b7d9d90)] |
|
17 interface mozIThirdPartyUtil : nsISupports |
|
18 { |
|
19 /** |
|
20 * isThirdPartyURI |
|
21 * |
|
22 * Determine whether two URIs are third party with respect to each other. |
|
23 * This is determined by computing the base domain for both URIs. If they can |
|
24 * be determined, and the base domains match, the request is defined as first |
|
25 * party. If it cannot be determined because one or both URIs do not have a |
|
26 * base domain (for instance, in the case of IP addresses, host aliases such |
|
27 * as 'localhost', or a file:// URI), an exact string comparison on host is |
|
28 * performed. |
|
29 * |
|
30 * For example, the URI "http://mail.google.com/" is not third party with |
|
31 * respect to "http://images.google.com/", but "http://mail.yahoo.com/" and |
|
32 * "http://192.168.1.1/" are. |
|
33 * |
|
34 * @return true if aFirstURI is third party with respect to aSecondURI. |
|
35 * |
|
36 * @throws if either URI is null, has a malformed host, or has an empty host |
|
37 * and is not a file:// URI. |
|
38 */ |
|
39 boolean isThirdPartyURI(in nsIURI aFirstURI, in nsIURI aSecondURI); |
|
40 |
|
41 /** |
|
42 * isThirdPartyWindow |
|
43 * |
|
44 * Determine whether the given window hierarchy is third party. This is done |
|
45 * as follows: |
|
46 * |
|
47 * 1) Obtain the URI of the principal associated with 'aWindow'. Call this the |
|
48 * 'bottom URI'. |
|
49 * 2) If 'aURI' is provided, determine if it is third party with respect to |
|
50 * the bottom URI. If so, return. |
|
51 * 3) Find the same-type parent window, if there is one, and its URI. |
|
52 * Determine whether it is third party with respect to the bottom URI. If |
|
53 * so, return. |
|
54 * |
|
55 * Therefore, each level in the window hierarchy is tested. (This means that |
|
56 * nested iframes with different base domains, even though the bottommost and |
|
57 * topmost URIs might be equal, will be considered third party.) |
|
58 * |
|
59 * @param aWindow |
|
60 * The bottommost window in the hierarchy. |
|
61 * @param aURI |
|
62 * A URI to test against. If null, the URI of the principal |
|
63 * associated with 'aWindow' will be used. |
|
64 * |
|
65 * For example, if 'aURI' is "http://mail.google.com/", 'aWindow' has a URI |
|
66 * of "http://google.com/", and its parent is the topmost content window with |
|
67 * a URI of "http://mozilla.com", the result will be true. |
|
68 * |
|
69 * @return true if 'aURI' is third party with respect to any of the URIs |
|
70 * associated with aWindow and its same-type parents. |
|
71 * |
|
72 * @throws if aWindow is null; the same-type parent of any window in the |
|
73 * hierarchy cannot be determined; or the URI associated with any |
|
74 * window in the hierarchy is null, has a malformed host, or has an |
|
75 * empty host and is not a file:// URI. |
|
76 * |
|
77 * @see isThirdPartyURI |
|
78 */ |
|
79 boolean isThirdPartyWindow(in nsIDOMWindow aWindow, [optional] in nsIURI aURI); |
|
80 |
|
81 /** |
|
82 * isThirdPartyChannel |
|
83 * |
|
84 * Determine whether the given channel and its content window hierarchy is |
|
85 * third party. This is done as follows: |
|
86 * |
|
87 * 1) If 'aChannel' is an nsIHttpChannel and has the |
|
88 * 'forceAllowThirdPartyCookie' property set, then: |
|
89 * a) If 'aURI' is null, return false. |
|
90 * b) Otherwise, find the URI of the channel, determine whether it is |
|
91 * foreign with respect to 'aURI', and return. |
|
92 * 2) Find the URI of the channel and determine whether it is third party with |
|
93 * respect to the URI of the channel. If so, return. |
|
94 * 3) Obtain the bottommost nsIDOMWindow, and its same-type parent if it |
|
95 * exists, from the channel's notification callbacks. Then: |
|
96 * a) If the parent is the same as the bottommost window, and the channel |
|
97 * has the LOAD_DOCUMENT_URI flag set, return false. This represents the |
|
98 * case where a toplevel load is occurring and the window's URI has not |
|
99 * yet been updated. (We have already checked that 'aURI' is not foreign |
|
100 * with respect to the channel URI.) |
|
101 * b) Otherwise, return the result of isThirdPartyWindow with arguments |
|
102 * of the channel's bottommost window and the channel URI, respectively. |
|
103 * |
|
104 * Therefore, both the channel's URI and each level in the window hierarchy |
|
105 * associated with the channel is tested. |
|
106 * |
|
107 * @param aChannel |
|
108 * The channel associated with the load. |
|
109 * @param aURI |
|
110 * A URI to test against. If null, the URI of the channel will be used. |
|
111 * |
|
112 * For example, if 'aURI' is "http://mail.google.com/", 'aChannel' has a URI |
|
113 * of "http://google.com/", and its parent is the topmost content window with |
|
114 * a URI of "http://mozilla.com", the result will be true. |
|
115 * |
|
116 * @return true if aURI is third party with respect to the channel URI or any |
|
117 * of the URIs associated with the same-type window hierarchy of the |
|
118 * channel. |
|
119 * |
|
120 * @throws if 'aChannel' is null; the channel has no notification callbacks or |
|
121 * an associated window; or isThirdPartyWindow throws. |
|
122 * |
|
123 * @see isThirdPartyWindow |
|
124 */ |
|
125 boolean isThirdPartyChannel(in nsIChannel aChannel, [optional] in nsIURI aURI); |
|
126 |
|
127 /** |
|
128 * getBaseDomain |
|
129 * |
|
130 * Get the base domain for aHostURI; e.g. for "www.bbc.co.uk", this would be |
|
131 * "bbc.co.uk". Only properly-formed URI's are tolerated, though a trailing |
|
132 * dot may be present. If aHostURI is an IP address, an alias such as |
|
133 * 'localhost', an eTLD such as 'co.uk', or the empty string, aBaseDomain will |
|
134 * be the exact host. The result of this function should only be used in exact |
|
135 * string comparisons, since substring comparisons will not be valid for the |
|
136 * special cases elided above. |
|
137 * |
|
138 * @param aHostURI |
|
139 * The URI to analyze. |
|
140 * |
|
141 * @return the base domain. |
|
142 */ |
|
143 AUTF8String getBaseDomain(in nsIURI aHostURI); |
|
144 |
|
145 |
|
146 /** |
|
147 * getFirstPartyURI |
|
148 * |
|
149 * Obtain the top-level url bar URI for either a channel or a document. |
|
150 * Either parameter may be null (but not both). |
|
151 * |
|
152 * @param aChannel |
|
153 * An arbitrary channel for some content element of a first party |
|
154 * load. Can be null. |
|
155 * |
|
156 * @param aDoc |
|
157 * An arbitrary third party document. Can be null. |
|
158 * |
|
159 * @return the first party url bar URI for the load. |
|
160 * |
|
161 * @throws if the URI cannot be obtained or the URI lacks a hostname and the |
|
162 * URI's scheme is not white listed. |
|
163 */ |
|
164 [noscript] nsIURI getFirstPartyURI(in nsIChannel aChannel, |
|
165 in nsIDocument aDoc); |
|
166 |
|
167 /** |
|
168 * getFirstPartyIsolationURI |
|
169 * |
|
170 * If first-party isolation is active, then |
|
171 * obtains the top-level url bar URI for either a channel or a document. |
|
172 * Otherwise returns null. |
|
173 * Either parameter may be null (but not both). |
|
174 * |
|
175 * @param aChannel |
|
176 * An arbitrary channel for some content element of a first party |
|
177 * load. Can be null. |
|
178 * |
|
179 * @param aDoc |
|
180 * An arbitrary third party document. Can be null. |
|
181 * |
|
182 * @return the first party url bar URI for the load. |
|
183 * |
|
184 * @throws if the URI cannot be obtained or the URI lacks a hostname and the |
|
185 * URI's scheme is not white listed. |
|
186 */ |
|
187 [noscript] nsIURI getFirstPartyIsolationURI(in nsIChannel aChannel, |
|
188 in nsIDocument aDoc); |
|
189 |
|
190 /** |
|
191 * getFirstPartyURIFromChannel |
|
192 * |
|
193 * Obtain the top-level url bar URI for a channel. |
|
194 * |
|
195 * @param aChannel |
|
196 * An arbitrary channel for some content element of a first party |
|
197 * load. |
|
198 * |
|
199 * @param aLogErrors |
|
200 * If true, log errors to the Error Console. |
|
201 * |
|
202 * @return the first party url bar URI for the load. |
|
203 * |
|
204 * @throws if the URI cannot be obtained or the URI lacks a hostname and the |
|
205 * URI's scheme is not white listed. |
|
206 */ |
|
207 nsIURI getFirstPartyURIFromChannel(in nsIChannel aChannel, |
|
208 in bool aLogErrors); |
|
209 |
|
210 /** |
|
211 * getFirstPartyHostForIsolation |
|
212 * |
|
213 * Obtain the host or pseudo-host for aFirstPartyURI. Some examples: |
|
214 * aFirstPartyURI Return Value |
|
215 * -------------- ------------ |
|
216 * https://news.google.com/nwshp?hl=en "news.google.com" |
|
217 * about:home "--NoFirstPartyHost-about-home--" |
|
218 * chrome://browser/content/browser.xul "--NoFirstPartyHost-chrome-browser.xul--" |
|
219 * |
|
220 * @param aFirstPartyURI |
|
221 * The first party URI. |
|
222 * |
|
223 * @return host or pseudo host. |
|
224 * |
|
225 * @throws if the URI lacks a host and the scheme is not a whitelisted one |
|
226 * for which we generate a pseudo host. |
|
227 */ |
|
228 AUTF8String getFirstPartyHostForIsolation(in nsIURI aFirstPartyURI); |
|
229 }; |
|
230 |
|
231 %{ C++ |
|
232 /** |
|
233 * The mozIThirdPartyUtil implementation is an XPCOM service registered |
|
234 * under the ContractID: |
|
235 */ |
|
236 #define THIRDPARTYUTIL_CONTRACTID "@mozilla.org/thirdpartyutil;1" |
|
237 %} |
|
238 |