diff --git a/content/html/document/src/nsHTMLContentSink.cpp b/content/html/document/src/nsHTMLContentSink.cpp index b9423565f55..7244f6673a5 100644 --- a/content/html/document/src/nsHTMLContentSink.cpp +++ b/content/html/document/src/nsHTMLContentSink.cpp @@ -5232,15 +5232,12 @@ HTMLContentSink::ProcessHeaderData(nsIAtom* aHeader, const nsAString& aValue, } } - nsCOMPtr httpChannel; + nsCOMPtr channel; if (mParser) { - nsCOMPtr channel; - if (NS_SUCCEEDED(mParser->GetChannel(getter_AddRefs(channel)))) { - httpChannel = do_QueryInterface(channel); - } + mParser->GetChannel(getter_AddRefs(channel)); } - rv = cookieServ->SetCookieString(codebaseURI, prompt, cookie, httpChannel); + rv = cookieServ->SetCookieString(codebaseURI, prompt, cookie, channel); nsCRT::free(cookie); if (NS_FAILED(rv)) { diff --git a/content/html/document/src/nsHTMLDocument.cpp b/content/html/document/src/nsHTMLDocument.cpp index 673437d23a5..4262bf3dc5a 100644 --- a/content/html/document/src/nsHTMLDocument.cpp +++ b/content/html/document/src/nsHTMLDocument.cpp @@ -756,6 +756,7 @@ nsHTMLDocument::StartAutodetection(nsIDocShell *aDocShell, nsAString& aCharset, void nsHTMLDocument::RetrieveRelevantHeaders(nsIChannel *aChannel) { + mChannel = aChannel; mHttpChannel = do_QueryInterface(aChannel); nsDocument::RetrieveRelevantHeaders(aChannel); @@ -2286,7 +2287,7 @@ nsHTMLDocument::GetCookie(nsAString& aCookie) NS_ENSURE_SUCCESS(rv, rv); nsXPIDLCString cookie; - rv = service->GetCookieString(codebaseURI, getter_Copies(cookie)); + rv = service->GetCookieString(codebaseURI, mChannel, getter_Copies(cookie)); if (NS_SUCCEEDED(rv) && cookie) CopyASCIItoUCS2(nsDependentCString(cookie), aCookie); } @@ -2342,8 +2343,7 @@ nsHTMLDocument::SetCookie(const nsAString& aCookie) rv = NS_ERROR_OUT_OF_MEMORY; char* cookie = ToNewCString(aCookie); if (cookie) { - rv = service->SetCookieString(codebaseURI, prompt, cookie, - mHttpChannel); + rv = service->SetCookieString(codebaseURI, prompt, cookie, mChannel); nsCRT::free(cookie); } } diff --git a/content/html/document/src/nsHTMLDocument.h b/content/html/document/src/nsHTMLDocument.h index 462da74ea93..a14993143ba 100644 --- a/content/html/document/src/nsHTMLDocument.h +++ b/content/html/document/src/nsHTMLDocument.h @@ -267,6 +267,7 @@ protected: nsString mBaseTarget; nsString mReferrer; + nsCOMPtr mChannel; nsCOMPtr mHttpChannel; nsCompatibility mCompatMode; diff --git a/content/xml/document/src/nsXMLContentSink.cpp b/content/xml/document/src/nsXMLContentSink.cpp index 1ed41a2ca66..4b44f87d079 100644 --- a/content/xml/document/src/nsXMLContentSink.cpp +++ b/content/xml/document/src/nsXMLContentSink.cpp @@ -1138,15 +1138,12 @@ nsXMLContentSink::ProcessHeaderData(nsIAtom* aHeader,const nsAString& aValue,nsI } } - nsCOMPtr httpChannel; + nsCOMPtr channel; if (mParser) { - nsCOMPtr channel; - if (NS_SUCCEEDED(mParser->GetChannel(getter_AddRefs(channel)))) { - httpChannel = do_QueryInterface(channel); - } + mParser->GetChannel(getter_AddRefs(channel)); } - rv = cookieServ->SetCookieString(codebaseURI, prompt, NS_ConvertUCS2toUTF8(aValue).get(), httpChannel); + rv = cookieServ->SetCookieString(codebaseURI, prompt, NS_ConvertUCS2toUTF8(aValue).get(), channel); if (NS_FAILED(rv)) return rv; } // END set-cookie diff --git a/extensions/cookie/nsCookieHTTPNotify.cpp b/extensions/cookie/nsCookieHTTPNotify.cpp index ffb958cbc6e..fe5bc3d41c7 100644 --- a/extensions/cookie/nsCookieHTTPNotify.cpp +++ b/extensions/cookie/nsCookieHTTPNotify.cpp @@ -187,7 +187,7 @@ nsCookieHTTPNotify::OnModifyRequest(nsIHttpChannel *aHttpChannel) // Get the cookies char * cookie; - rv = mCookieService->GetCookieStringFromHttp(pURL, pFirstURL, &cookie); + rv = mCookieService->GetCookieStringFromHttp(pURL, pFirstURL, aHttpChannel, &cookie); if (NS_FAILED(rv)) return rv; const char *headerVal = ""; diff --git a/extensions/cookie/nsCookieService.cpp b/extensions/cookie/nsCookieService.cpp index 94ffc9aead7..4733e270733 100644 --- a/extensions/cookie/nsCookieService.cpp +++ b/extensions/cookie/nsCookieService.cpp @@ -243,46 +243,54 @@ nsCookieService::OnSecurityChange(nsIWebProgress *aWebProgress, } NS_IMETHODIMP -nsCookieService::GetCookieString(nsIURI *aHostURI, char ** aCookie) { - *aCookie = COOKIE_GetCookie(aHostURI, nsnull); - return NS_OK; -} - -NS_IMETHODIMP -nsCookieService::GetCookieStringFromHttp(nsIURI *aHostURI, nsIURI *aFirstURI, char ** aCookie) { - *aCookie = COOKIE_GetCookie(aHostURI, aFirstURI); - return NS_OK; -} - -NS_IMETHODIMP -nsCookieService::SetCookieString(nsIURI *aHostURI, nsIPrompt *aPrompt, const char *aCookieHeader, nsIHttpChannel *aHttpChannel) +nsCookieService::GetCookieString(nsIURI *aHostURI, nsIChannel *aChannel, char ** aCookie) { + // try to determine first party URI nsCOMPtr firstURI; - - if (aHttpChannel) { - nsCOMPtr httpInternal = do_QueryInterface(aHttpChannel); - if (!httpInternal || - NS_FAILED(httpInternal->GetDocumentURI(getter_AddRefs(firstURI)))) { - COOKIE_LOGFAILURE(SET_COOKIE, aHostURI, aCookieHeader, "unable to determine first URI"); - return NS_OK; - } + if (aChannel) { + nsCOMPtr httpInternal = do_QueryInterface(aChannel); + if (httpInternal) + httpInternal->GetDocumentURI(getter_AddRefs(firstURI)); } - COOKIE_SetCookie(aHostURI, firstURI, aPrompt, aCookieHeader, nsnull, aHttpChannel); - LazyWrite(PR_TRUE); + *aCookie = COOKIE_GetCookie(aHostURI, firstURI, aChannel); return NS_OK; } NS_IMETHODIMP -nsCookieService::SetCookieStringFromHttp(nsIURI *aHostURI, nsIURI *aFirstURI, nsIPrompt *aPrompt, const char *aCookieHeader, const char *aServerTime, nsIHttpChannel* aHttpChannel) +nsCookieService::GetCookieStringFromHttp(nsIURI *aHostURI, nsIURI *aFirstURI, nsIChannel *aChannel, char ** aCookie) { - COOKIE_SetCookie(aHostURI, aFirstURI, aPrompt, aCookieHeader, aServerTime, aHttpChannel); + *aCookie = COOKIE_GetCookie(aHostURI, aFirstURI, aChannel); + return NS_OK; +} + +NS_IMETHODIMP +nsCookieService::SetCookieString(nsIURI *aHostURI, nsIPrompt *aPrompt, const char *aCookieHeader, nsIChannel *aChannel) +{ + // try to determine first party URI + nsCOMPtr firstURI; + if (aChannel) { + nsCOMPtr httpInternal = do_QueryInterface(aChannel); + if (httpInternal) + httpInternal->GetDocumentURI(getter_AddRefs(firstURI)); + } + + COOKIE_SetCookie(aHostURI, firstURI, aPrompt, aCookieHeader, nsnull, aChannel); LazyWrite(PR_TRUE); return NS_OK; } NS_IMETHODIMP -nsCookieService::GetCookieIconIsVisible(PRBool *aIsVisible) { +nsCookieService::SetCookieStringFromHttp(nsIURI *aHostURI, nsIURI *aFirstURI, nsIPrompt *aPrompt, const char *aCookieHeader, const char *aServerTime, nsIChannel* aChannel) +{ + COOKIE_SetCookie(aHostURI, aFirstURI, aPrompt, aCookieHeader, aServerTime, aChannel); + LazyWrite(PR_TRUE); + return NS_OK; +} + +NS_IMETHODIMP +nsCookieService::GetCookieIconIsVisible(PRBool *aIsVisible) +{ *aIsVisible = gCookieIconVisible; return NS_OK; } diff --git a/extensions/cookie/nsCookies.cpp b/extensions/cookie/nsCookies.cpp index cf668fff414..db08feda738 100644 --- a/extensions/cookie/nsCookies.cpp +++ b/extensions/cookie/nsCookies.cpp @@ -64,6 +64,9 @@ // until this point, we have an evil hack: #include "nsIHttpChannelInternal.h" +#include "nsIDocShell.h" +#include "nsIDocShellTreeItem.h" + /****************************************************************************** * gCookiePrefObserver * This is instanced as a global variable in nsCookieService.cpp. @@ -1243,10 +1246,10 @@ cookie_ParseAttributes(nsDependentCString &aCookieHeader, *****************************************************************************/ PRIVATE nsCookieStatus -cookie_CheckPrefs(nsIURI *aHostURI, - nsIURI *aFirstURI, - nsIHttpChannel *aHttpChannel, - const char *aCookieHeader) +cookie_CheckPrefs(nsIURI *aHostURI, + nsIURI *aFirstURI, + nsIChannel *aChannel, + const char *aCookieHeader) { // pref tree: // 0) get the scheme strings from the two URI's @@ -1288,11 +1291,51 @@ cookie_CheckPrefs(nsIURI *aHostURI, // in all cases. // XXX removed the aFirstURI check, to make cookies from javascript work // bug 198870 - if (gCookiePrefObserver->mCookiesDisabledForMailNews && - ((aFirstURI && cookie_IsFromMailNews(firstURIScheme)) || - cookie_IsFromMailNews(currentURIScheme))) { - COOKIE_LOGFAILURE(aCookieHeader ? SET_COOKIE : GET_COOKIE, aHostURI, aCookieHeader ? "" : aCookieHeader, "cookies disabled for mailnews"); - return nsICookie::STATUS_REJECTED; + if (gCookiePrefObserver->mCookiesDisabledForMailNews) { + // + // try to examine the "app type" of the docshell owning this request. if + // we find a docshell in the heirarchy of type APP_TYPE_MAIL, then assume + // this URI is being loaded from within mailnews. + // + // XXX this is a pretty ugly hack at the moment since cookies really + // shouldn't have to talk to the docshell directly. ultimately, we want + // to talk to some more generic interface, which the docshell would also + // implement. but, the basic mechanism here of leveraging the channel's + // (or loadgroup's) notification callbacks attribute seems ideal as it + // avoids the problem of having to modify all places in the code which + // kick off network requests. + // + PRUint32 appType = nsIDocShell::APP_TYPE_UNKNOWN; + if (aChannel) { + nsCOMPtr req; + aChannel->GetNotificationCallbacks(getter_AddRefs(req)); + if (!req) { + // check the load group's notification callbacks... + nsCOMPtr group; + aChannel->GetLoadGroup(getter_AddRefs(group)); + if (group) + group->GetNotificationCallbacks(getter_AddRefs(req)); + } + if (req) { + nsCOMPtr item, parent = do_GetInterface(req); + if (parent) { + do { + item = parent; + nsCOMPtr docshell = do_QueryInterface(item); + if (docshell) + docshell->GetAppType(&appType); + } while (appType != nsIDocShell::APP_TYPE_MAIL && + NS_SUCCEEDED(item->GetParent(getter_AddRefs(parent))) && + parent); + } + } + } + if ((appType == nsIDocShell::APP_TYPE_MAIL) || + (aFirstURI && cookie_IsFromMailNews(firstURIScheme)) || + cookie_IsFromMailNews(currentURIScheme)) { + COOKIE_LOGFAILURE(aCookieHeader ? SET_COOKIE : GET_COOKIE, aHostURI, aCookieHeader ? "" : aCookieHeader, "cookies disabled for mailnews"); + return nsICookie::STATUS_REJECTED; + } } // check default prefs - go thru enumerated permissions @@ -1324,7 +1367,8 @@ cookie_CheckPrefs(nsIURI *aHostURI, // to do this, at the moment, we need an httpChannel, but we can live without // the two URI's (as long as no foreign checks are required). // if the channel is null, we can fall back on "no p3p policy" prefs. - nsCookieStatus p3pStatus = cookie_P3PDecision(aHostURI, aFirstURI, aHttpChannel); + nsCOMPtr httpChannel = do_QueryInterface(aChannel); + nsCookieStatus p3pStatus = cookie_P3PDecision(aHostURI, aFirstURI, httpChannel); if (p3pStatus == nsICookie::STATUS_REJECTED) { COOKIE_LOGFAILURE(aCookieHeader ? SET_COOKIE : GET_COOKIE, aHostURI, aCookieHeader ? "" : aCookieHeader, "P3P test failed"); } @@ -1339,8 +1383,9 @@ cookie_CheckPrefs(nsIURI *aHostURI, PRIVATE inline PRBool ispathdelimiter(char c) { return c == '/' || c == '?' || c == '#' || c == ';'; } PUBLIC char * -COOKIE_GetCookie(nsIURI *aHostURI, - nsIURI *aFirstURI) +COOKIE_GetCookie(nsIURI *aHostURI, + nsIURI *aFirstURI, + nsIChannel *aChannel) { if (!aHostURI) { COOKIE_LOGFAILURE(GET_COOKIE, nsnull, "", "host URI is null"); @@ -1348,7 +1393,7 @@ COOKIE_GetCookie(nsIURI *aHostURI, } // check default prefs - nsCookieStatus cookieStatus = cookie_CheckPrefs(aHostURI, aFirstURI, nsnull, nsnull); + nsCookieStatus cookieStatus = cookie_CheckPrefs(aHostURI, aFirstURI, aChannel, nsnull); // for GetCookie(), we don't update the UI icon if cookie was rejected. if (cookieStatus == nsICookie::STATUS_REJECTED) { return nsnull; @@ -1823,12 +1868,12 @@ cookie_SetCookieInternal(nsIURI *aHostURI, // performs functions common to all cookies (checking user prefs and processing // the time string from the server), and processes each cookie in the header. PUBLIC void -COOKIE_SetCookie(nsIURI *aHostURI, - nsIURI *aFirstURI, - nsIPrompt *aPrompt, - const char *aCookieHeader, - const char *aServerTime, - nsIHttpChannel *aHttpChannel) +COOKIE_SetCookie(nsIURI *aHostURI, + nsIURI *aFirstURI, + nsIPrompt *aPrompt, + const char *aCookieHeader, + const char *aServerTime, + nsIChannel *aChannel) { if (!aHostURI) { COOKIE_LOGFAILURE(SET_COOKIE, nsnull, aCookieHeader, "host URI is null"); @@ -1836,7 +1881,7 @@ COOKIE_SetCookie(nsIURI *aHostURI, } // check default prefs - nsCookieStatus cookieStatus = cookie_CheckPrefs(aHostURI, aFirstURI, aHttpChannel, aCookieHeader); + nsCookieStatus cookieStatus = cookie_CheckPrefs(aHostURI, aFirstURI, aChannel, aCookieHeader); // update UI icon, and return, if cookie was rejected. // should we be doing this just for p3p? if (cookieStatus == nsICookie::STATUS_REJECTED) { @@ -1846,8 +1891,9 @@ COOKIE_SetCookie(nsIURI *aHostURI, } return; } + nsCOMPtr httpChannel = do_QueryInterface(aChannel); // get the site's p3p policy now (common to all cookies) - nsCookiePolicy cookiePolicy = cookie_GetPolicy(P3P_SitePolicy(aHostURI, aHttpChannel)); + nsCookiePolicy cookiePolicy = cookie_GetPolicy(P3P_SitePolicy(aHostURI, httpChannel)); // parse server local time. this is not just done here for efficiency // reasons - if there's an error parsing it, and we need to default it diff --git a/extensions/cookie/nsCookies.h b/extensions/cookie/nsCookies.h index 58083e1d02a..e69de29bb2d 100644 --- a/extensions/cookie/nsCookies.h +++ b/extensions/cookie/nsCookies.h @@ -1,115 +0,0 @@ -/* -*- Mode: C; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ -/* ***** BEGIN LICENSE BLOCK ***** - * Version: NPL 1.1/GPL 2.0/LGPL 2.1 - * - * The contents of this file are subject to the Netscape Public License - * Version 1.1 (the "License"); you may not use this file except in - * compliance with the License. You may obtain a copy of the License at - * http://www.mozilla.org/NPL/ - * - * Software distributed under the License is distributed on an "AS IS" basis, - * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License - * for the specific language governing rights and limitations under the - * License. - * - * The Original Code is mozilla.org code. - * - * The Initial Developer of the Original Code is - * Netscape Communications Corporation. - * Portions created by the Initial Developer are Copyright (C) 1998 - * the Initial Developer. All Rights Reserved. - * - * Contributor(s): - * - * - * Alternatively, the contents of this file may be used under the terms of - * either the GNU General Public License Version 2 or later (the "GPL"), or - * the GNU Lesser General Public License Version 2.1 or later (the "LGPL"), - * in which case the provisions of the GPL or the LGPL are applicable instead - * of those above. If you wish to allow use of your version of this file only - * under the terms of either the GPL or the LGPL, and not to allow others to - * use your version of this file under the terms of the NPL, indicate your - * decision by deleting the provisions above and replace them with the notice - * and other provisions required by the GPL or the LGPL. If you do not delete - * the provisions above, a recipient may use your version of this file under - * the terms of any one of the NPL, the GPL or the LGPL. - * - * ***** END LICENSE BLOCK ***** */ - -#ifndef COOKIES_H -#define COOKIES_H - -#include "nsCookie.h" -#include "nsString.h" -#include "nsInt64.h" -#include "prtime.h" -#include "nsVoidArray.h" -#include "nsIURI.h" -#include "nsIHttpChannel.h" -#include "nsIDOMWindowInternal.h" - -// XXX these casts and constructs are horrible, but our nsInt64/nsTime -// classes are lacking so we need them for now. see bug 198694. -#define USEC_PER_SEC (nsInt64(PRInt32(1000000))) -#define NOW_IN_SECONDS (nsInt64(PR_Now()) / USEC_PER_SEC) - -// main cookie storage struct -typedef struct _cookie_CookieStruct { - nsCString path; - nsCString host; - nsCString name; - nsCString cookie; - PRInt64 expires; - PRInt64 lastAccessed; - PRPackedBool isSession; - PRPackedBool isSecure; - PRPackedBool isDomain; - nsCookieStatus status; - nsCookiePolicy policy; -} cookie_CookieStruct; - -// define logging macros for convenience -#define SET_COOKIE PR_TRUE -#define GET_COOKIE PR_FALSE - -// logging handlers -#ifdef MOZ_LOGGING -// in order to do logging, the following environment variables need to be set: -// -// set NSPR_LOG_MODULES=cookie:3 -- shows rejected cookies -// set NSPR_LOG_MODULES=cookie:4 -- shows accepted and rejected cookies -// set NSPR_LOG_FILE=c:\cookie.log -// -// this next define has to appear before the include of prlog.h -#define FORCE_PR_LOG /* Allow logging in the release build */ -#include "prlog.h" -#endif - -#ifdef PR_LOGGING -#define COOKIE_LOGFAILURE(a, b, c, d) cookie_LogFailure(a, b, c, d) -#define COOKIE_LOGSUCCESS(a, b, c, d) cookie_LogSuccess(a, b, c, d) - -extern void cookie_LogFailure(PRBool aSetCookie, nsIURI *aHostURI, const char *aCookieString, const char *aReason); -extern void cookie_LogSuccess(PRBool aSetCookie, nsIURI *aHostURI, const char *aCookieString, cookie_CookieStruct *aCookie); -extern void cookie_LogFailure(PRBool aSetCookie, nsIURI *aHostURI, const nsAFlatCString &aCookieString, const char *aReason); -extern void cookie_LogSuccess(PRBool aSetCookie, nsIURI *aHostURI, const nsAFlatCString &aCookieString, cookie_CookieStruct *aCookie); -#else -#define COOKIE_LOGFAILURE(a, b, c, d) /* nothing */ -#define COOKIE_LOGSUCCESS(a, b, c, d) /* nothing */ -#endif - -// function prototypes -extern nsresult COOKIE_Read(); -extern nsresult COOKIE_Write(); -extern void COOKIE_RemoveExpiredCookies(nsInt64 aCurrentTime, PRInt32 &aOldestPosition); -extern char * COOKIE_GetCookie(nsIURI *aHostURI, nsIURI *aFirstURI); -extern void COOKIE_SetCookie(nsIURI *aHostURI, nsIURI *aFirstURI, nsIPrompt *aPrompt, const char *aCookieHeader, const char *aServerTime, nsIHttpChannel *aHttpChannel); -extern void COOKIE_RemoveAll(); -extern void COOKIE_Remove(const nsACString &host, const nsACString &name, const nsACString &path, PRBool blocked); -extern nsresult COOKIE_Add(cookie_CookieStruct *aCookie, nsInt64 aCurrentTime, nsIURI *aHostURI, const char *aCookieHeader); -extern already_AddRefed COOKIE_ChangeFormat(cookie_CookieStruct *aCookie); - -// constants & variables -extern nsVoidArray *sCookieList; - -#endif /* COOKIES_H */ diff --git a/extensions/cookie/tests/TestCookie.cpp b/extensions/cookie/tests/TestCookie.cpp index 30856c504bf..cb3aafd2e03 100644 --- a/extensions/cookie/tests/TestCookie.cpp +++ b/extensions/cookie/tests/TestCookie.cpp @@ -90,7 +90,7 @@ GetACookie(nsICookieService *aCookieService, const char *aSpec1, const char *aSp NS_NewURI(getter_AddRefs(uri2), aSpec2); printf(" \"%s\": GOT ", aSpec1); - nsresult rv = aCookieService->GetCookieStringFromHttp(uri1, uri2, aCookie); + nsresult rv = aCookieService->GetCookieStringFromHttp(uri1, uri2, nsnull, aCookie); if (NS_FAILED(rv)) printf("XXX GetCookieString() failed!\n"); if (!*aCookie) { printf("nothing\n"); diff --git a/modules/plugin/base/src/nsPluginHostImpl.cpp b/modules/plugin/base/src/nsPluginHostImpl.cpp index 772532959e1..ade79344a43 100644 --- a/modules/plugin/base/src/nsPluginHostImpl.cpp +++ b/modules/plugin/base/src/nsPluginHostImpl.cpp @@ -6022,7 +6022,7 @@ NS_IMETHODIMP nsPluginHostImpl::GetCookie(const char* inCookieURL, void* inOutCo return rv; } - rv = cookieService->GetCookieString(uriIn, getter_Copies(cookieString)); + rv = cookieService->GetCookieString(uriIn, nsnull, getter_Copies(cookieString)); if (NS_FAILED(rv) || (!cookieString) || (inOutCookieSize <= (cookieStringLen = PL_strlen(cookieString.get())))) { @@ -6073,7 +6073,7 @@ NS_IMETHODIMP nsPluginHostImpl::SetCookie(const char* inCookieURL, const void* i char * cookie = (char *)inCookieBuffer; char c = cookie[inCookieSize]; cookie[inCookieSize] = '\0'; - rv = cookieService->SetCookieString(uriIn, prompt, cookie,0); + rv = cookieService->SetCookieString(uriIn, prompt, cookie, nsnull); cookie[inCookieSize] = c; return rv; diff --git a/netwerk/cookie/public/nsICookieService.idl b/netwerk/cookie/public/nsICookieService.idl index 708a0ca9c0b..c1abe65d88b 100644 --- a/netwerk/cookie/public/nsICookieService.idl +++ b/netwerk/cookie/public/nsICookieService.idl @@ -21,7 +21,6 @@ * * Contributor(s): * - * * Alternatively, the contents of this file may be used under the terms of * either the GNU General Public License Version 2 or later (the "GPL"), or * the GNU Lesser General Public License Version 2.1 or later (the "LGPL"), @@ -36,69 +35,122 @@ * * ***** END LICENSE BLOCK ***** */ -/* - - This file contains an interface to the Cookie Service. - - */ - #include "nsISupports.idl" -#include "nsIURI.idl" -#include "nsIPrompt.idl" -interface nsIHttpChannel; +interface nsIURI; +interface nsIPrompt; +interface nsIChannel; +/** + * nsICookieService + * + * Provides methods for setting and getting cookies in the context of a + * page load. See nsICookieManager for methods to manipulate the cookie + * database directly. This separation of interface is mainly historical. + */ [scriptable, uuid(011C3190-1434-11d6-A618-0010A401EB10)] interface nsICookieService : nsISupports { /* - * Get the complete cookie string associated with the URL + * Get the complete cookie string associated with the URI. * - * @param aURL The URL for which to get the cookie string - * @param aCookie The string object which will hold the result - * @return Returns NS_OK if successful, or NS_FALSE if an error occurred. + * @param aURI + * the URI of the document for which cookies are being queried. + * @param aChannel + * the channel used to load the document. this parameter may be null, + * but it is strongly recommended that a non-null value be provided to + * ensure that the cookie privacy preferences are honored. + * + * @return the resulting cookie string */ - string getCookieString(in nsIURI aURL); + string getCookieString(in nsIURI aURI, in nsIChannel aChannel); /* - * Get the complete cookie string associated with the URL + * Get the complete cookie string associated with the URI. * - * @param aURL The URL for which to get the cookie string - * @param aFirstURL The URL which the user typed in or clicked on - * @param aCookie The string object which will hold the result - * @return Returns NS_OK if successful, or NS_FALSE if an error occurred. + * XXX this function is redundant and will most likely be removed in a future + * revision of this interface. GetCookieString will query the documentURI + * property off of nsIHttpChannelInternal if supported, so GetCookieString + * can be used in place of this method. + * + * @param aURI + * the URI of the document for which cookies are being queried. + * @param aFirstURI + * the URI that the user originally typed in or clicked on to initiate + * the load of the document referenced by aURI. + * @param aChannel + * the channel used to load the document. this parameter may be null, + * but it is strongly recommended that a non-null value be provided to + * ensure that the cookie privacy preferences are honored. + * + * @return the resulting cookie string */ - string getCookieStringFromHttp(in nsIURI aURL, in nsIURI aFirstURL); + string getCookieStringFromHttp(in nsIURI aURI, in nsIURI aFirstURI, in nsIChannel aChannel); /* - * Set the cookie string associated with the URL + * Set the cookie string associated with the URI. * - * @param aURL The URL for which to set the cookie string - * @param aCookie The string to set - * @return Returns NS_OK if successful, or NS_FALSE if an error occurred. + * @param aURI + * the URI of the document for which cookies are being set. + * @param aPrompt + * the prompt to use for all user-level cookie notifications. + * @param aCookie + * the cookie string to set. + * @param aChannel + * the channel used to load the document. this parameter may be null, + * but it is strongly recommended that a non-null value be provided to + * ensure that the cookie privacy preferences are honored. + * + * XXX should be able to allow null aPrompt, since nsIPrompt can be queryied + * from aChannel. */ - void setCookieString(in nsIURI aURL, in nsIPrompt aPrompt, in string aCookie, in nsIHttpChannel aHttpChannel); + void setCookieString(in nsIURI aURI, in nsIPrompt aPrompt, in string aCookie, in nsIChannel aChannel); /* - * Set the cookie string and expires associated with the URL + * Set the cookie string and expires associated with the URI. * - * @param aURL The URL for which to set the cookie string - * @param aFirstURL The URL which the user typed in or clicked on - * @param aPrompter The nsIPrompt implementation to use. If null, a default - * will be used. - * @param aCookie The char * string to set - * @param aExpires The expiry information of the cookie - * @return Returns NS_OK if successful, or NS_FALSE if an error occurred. + * XXX this function is redundant and will most likely be removed in a future + * revision of this interface. SetCookieString will query the documentURI + * property off of nsIHttpChannelInternal if supported, and SetCookieString + * could also query the Date header from the channel if aChannel supports + * nsIHttpChannel. + * + * @param aURI + * the URI of the document for which cookies are being set. + * @param aFirstURI + * the URI that the user originally typed in or clicked on to initiate + * the load of the document referenced by aURI. + * @param aPrompt + * the prompt to use for all user-level cookie notifications. + * @param aCookie + * the cookie string to set. + * @param aServerTime + * the expiry information of the cookie (the Date header from the HTTP + * response). + * @param aChannel + * the channel used to load the document. this parameter may be null, + * but it is strongly recommended that a non-null value be provided to + * ensure that the cookie privacy preferences are honored. */ - void setCookieStringFromHttp(in nsIURI aURL, in nsIURI aFirstURL, in nsIPrompt aPrompter, in string aCookie, in string aExpires, in nsIHttpChannel aHttpChannel); + void setCookieStringFromHttp(in nsIURI aURI, in nsIURI aFirstURI, in nsIPrompt aPrompt, in string aCookie, in string aServerTime, in nsIChannel aChannel); + /** + * This attribute really doesn't belong on this interface. CVS blame will + * tell you why it is here. It remains until we can find a better home for + * it. Read the source if you want to know what it does :-( + */ readonly attribute boolean cookieIconIsVisible; - }; %{ C++ -// {011C3190-1434-11d6-A618-0010A401EB10} +// nsCookieService CID and ContractID: #define NS_COOKIESERVICE_CID \ -{ 0xc375fa80, 0x150f, 0x11d6, { 0xa6, 0x18, 0x0, 0x10, 0xa4, 0x1, 0xeb, 0x10 } } -#define NS_COOKIESERVICE_CONTRACTID "@mozilla.org/cookieService;1" +{ /* 011C3190-1434-11d6-A618-0010A401EB10 */ \ + 0xc375fa80, \ + 0x150f, \ + 0x11d6, \ + {0xa6, 0x18, 0x0, 0x10, 0xa4, 0x1, 0xeb, 0x10} \ +} +#define NS_COOKIESERVICE_CONTRACTID \ + "@mozilla.org/cookieService;1" %}