/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ /* ***** BEGIN LICENSE BLOCK ***** * Version: MPL 1.1/GPL 2.0/LGPL 2.1 * * The contents of this file are subject to the Mozilla 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/MPL/ * * 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) 1999 * the Initial Developer. All Rights Reserved. * * Contributor(s): * * Alternatively, the contents of this file may be used under the terms of * either of 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 MPL, 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 MPL, the GPL or the LGPL. * * ***** END LICENSE BLOCK ***** */ /* loading of CSS style sheets using the network APIs */ #ifndef nsICSSLoader_h___ #define nsICSSLoader_h___ #include "nsISupports.h" #include "nsSubstring.h" #include "nsCompatibility.h" class nsIAtom; class nsIURI; class nsICSSParser; class nsICSSStyleSheet; class nsPresContext; class nsIContent; class nsIDocument; class nsIUnicharInputStream; class nsICSSLoaderObserver; class nsMediaList; class nsICSSImportRule; class nsIPrincipal; // IID for the nsICSSLoader interface // 0c6d7e76-dddc-4727-b557-7ef531127e11 #define NS_ICSS_LOADER_IID \ { 0x0c6d7e76, 0xdddc, 0x4727, \ { 0xb5, 0x57, 0x7e, 0xf5, 0x31, 0x12, 0x7e, 0x11 } } typedef void (*nsCSSLoaderCallbackFunc)(nsICSSStyleSheet* aSheet, void *aData, PRBool aDidNotify); class nsICSSLoader : public nsISupports { public: NS_DECLARE_STATIC_IID_ACCESSOR(NS_ICSS_LOADER_IID) NS_IMETHOD Init(nsIDocument* aDocument) = 0; NS_IMETHOD DropDocumentReference(void) = 0; // notification that doc is going away NS_IMETHOD SetCaseSensitive(PRBool aCaseSensitive) = 0; NS_IMETHOD SetCompatibilityMode(nsCompatibility aCompatMode) = 0; NS_IMETHOD SetPreferredSheet(const nsAString& aTitle) = 0; NS_IMETHOD GetPreferredSheet(nsAString& aTitle) = 0; // Get/Recycle a CSS parser for general use NS_IMETHOD GetParserFor(nsICSSStyleSheet* aSheet, nsICSSParser** aParser) = 0; NS_IMETHOD RecycleParser(nsICSSParser* aParser) = 0; // XXXbz sort out what the deal is with events! When should they fire? /** * Load an inline style sheet. If a successful result is returned and * *aCompleted is false, then aObserver is guaranteed to be notified * asynchronously once the sheet is marked complete. If an error is * returned, or if *aCompleted is true, aObserver will not be notified. In * addition to parsing the sheet, this method will insert it into the * stylesheet list of this CSSLoader's document. * * @param aElement the element linking to the stylesheet. This must not be * null and must implement nsIStyleSheetLinkingElement. * @param aStream the character stream that holds the stylesheet data. * @param aLineNumber the line number at which the stylesheet data started. * @param aTitle the title of the sheet. * @param aMedia the media string for the sheet. * @param aObserver the observer to notify when the load completes. * May be null. * @param [out] aCompleted whether parsing of the sheet completed. * @param [out] aIsAlternate whether the stylesheet ended up being an * alternate sheet. */ NS_IMETHOD LoadInlineStyle(nsIContent* aElement, nsIUnicharInputStream* aStream, PRUint32 aLineNumber, const nsSubstring& aTitle, const nsSubstring& aMedia, nsICSSLoaderObserver* aObserver, PRBool* aCompleted, PRBool* aIsAlternate) = 0; /** * Load a linked (document) stylesheet. If a successful result is returned, * aObserver is guaranteed to be notified asynchronously once the sheet is * loaded and marked complete. If an error is returned, aObserver will not * be notified. In addition to loading the sheet, this method will insert it * into the stylesheet list of this CSSLoader's document. * * @param aElement the element linking to the the stylesheet. May be null. * @param aURL the URL of the sheet. * @param aTitle the title of the sheet. * @param aMedia the media string for the sheet. * @param aHasAlternateRel whether the rel for this link included * "alternate". * @param aObserver the observer to notify when the load completes. * May be null. * @param [out] aIsAlternate whether the stylesheet actually ended up beinga * an alternate sheet. Note that this need not match * aHasAlternateRel. */ NS_IMETHOD LoadStyleLink(nsIContent* aElement, nsIURI* aURL, const nsSubstring& aTitle, const nsSubstring& aMedia, PRBool aHasAlternateRel, nsICSSLoaderObserver* aObserver, PRBool* aIsAlternate) = 0; /** * Load a child (@import-ed) style sheet. In addition to loading the sheet, * this method will insert it into the child sheet list of aParentSheet. If * there is no sheet currently being parsed and the child sheet is not * complete when this method returns, then when the child sheet becomes * complete aParentSheet will be QIed to nsICSSLoaderObserver and * asynchronously notified, just like for LoadStyleLink. Note that if the * child sheet is already complete when this method returns, no * nsICSSLoaderObserver notification will be sent. * * @param aParentSheet the parent of this child sheet * @param aURL the URL of the child sheet * @param aMedia the already-parsed media list for the child sheet * @param aRule the @import rule importing this child. This is used to * properly order the child sheet list of aParentSheet. */ NS_IMETHOD LoadChildSheet(nsICSSStyleSheet* aParentSheet, nsIURI* aURL, nsMediaList* aMedia, nsICSSImportRule* aRule) = 0; /** * Synchronously load and return the stylesheet at aURL. Any child sheets * will also be loaded synchronously. Note that synchronous loads over some * protocols may involve spinning up a new event loop, so use of this method * does NOT guarantee not receiving any events before the sheet loads. This * method can be used to load sheets not associated with a document. * * @param aURL the URL of the sheet to load * @param [out] aSheet the loaded, complete sheet. * @param aEnableUnsafeRules whether unsafe rules are enabled for this * sheet load * Unsafe rules are rules that can violate key Gecko invariants if misused. * In particular, most anonymous box pseudoelements must be very carefully * styled or we will have severe problems. Therefore unsafe rules should * never be enabled for stylesheets controlled by untrusted sites; preferably * unsafe rules should only be enabled for agent sheets. * * NOTE: At the moment, this method assumes the sheet will be UTF-8, but * ideally it would allow arbitrary encodings. Callers should NOT depend on * non-UTF8 sheets being treated as UTF-8 by this method. * * NOTE: A successful return from this method doesn't indicate anything about * whether the data could be parsed as CSS and doesn't indicate anything * about the status of child sheets of the returned sheet. */ NS_IMETHOD LoadSheetSync(nsIURI* aURL, PRBool aEnableUnsafeRules, nsICSSStyleSheet** aSheet) = 0; /** * As above, but aEnableUnsafeRules is assumed false. */ nsresult LoadSheetSync(nsIURI* aURL, nsICSSStyleSheet** aSheet) { return LoadSheetSync(aURL, PR_FALSE, aSheet); } /** * Asynchronously load the stylesheet at aURL. If a successful result is * returned, aObserver is guaranteed to be notified asynchronously once the * sheet is loaded and marked complete. This method can be used to load * sheets not associated with a document. * * @param aURL the URL of the sheet to load * @param aOriginPrincipal the principal to use for security checks. This * can be null to indicate that these checks should * be skipped. * @param aObserver the observer to notify when the load completes. * Must not be null. * @param [out] aSheet the sheet to load. Note that the sheet may well * not be loaded by the time this method returns. */ NS_IMETHOD LoadSheet(nsIURI* aURL, nsIPrincipal* aOriginPrincipal, nsICSSLoaderObserver* aObserver, nsICSSStyleSheet** aSheet) = 0; /** * Same as above, to be used when the caller doesn't care about the * not-yet-loaded sheet. */ NS_IMETHOD LoadSheet(nsIURI* aURL, nsIPrincipal* aOriginPrincipal, nsICSSLoaderObserver* aObserver) = 0; /** * Stop loading all sheets. All nsICSSLoaderObservers involved will be * notified with NS_BINDING_ABORTED as the status, possibly synchronously. */ NS_IMETHOD Stop(void) = 0; /** * Stop loading one sheet. The nsICSSLoaderObserver involved will be * notified with NS_BINDING_ABORTED as the status, possibly synchronously. */ NS_IMETHOD StopLoadingSheet(nsIURI* aURL) = 0; /** * Whether the loader is enabled or not. * When disabled, processing of new styles is disabled and an attempt * to do so will fail with a return code of * NS_ERROR_NOT_AVAILABLE. Note that this DOES NOT disable * currently loading styles or already processed styles. */ NS_IMETHOD GetEnabled(PRBool *aEnabled) = 0; NS_IMETHOD SetEnabled(PRBool aEnabled) = 0; /** * Return true if this nsICSSLoader has pending loads (ones that would send * notifications to an nsICSSLoaderObserver attached to this nsICSSLoader). * If called from inside nsICSSLoaderObserver::StyleSheetLoaded, this will * return PR_FALSE if and only if that is the last StyleSheetLoaded * notification the CSSLoader knows it's going to send. In other words, if * two sheets load at once (via load coalescing, e.g.), HasPendingLoads() * will return PR_TRUE during notification for the first one, and PR_FALSE * during notification for the second one. */ NS_IMETHOD_(PRBool) HasPendingLoads() = 0; /** * Add an observer to this nsICSSLoader. The observer will be notified for * all loads that would have notified their own observers (even if those * loads don't have observers attached to them). Load-specific observers * will be notified before generic observers. The CSSLoader holds a * reference to the observer. * * aObserver must not be null. */ NS_IMETHOD AddObserver(nsICSSLoaderObserver* aObserver) = 0; /** * Remove an observer added via AddObserver. */ NS_IMETHOD_(void) RemoveObserver(nsICSSLoaderObserver* aObserver) = 0; }; NS_DEFINE_STATIC_IID_ACCESSOR(nsICSSLoader, NS_ICSS_LOADER_IID) nsresult NS_NewCSSLoader(nsIDocument* aDocument, nsICSSLoader** aLoader); nsresult NS_NewCSSLoader(nsICSSLoader** aLoader); #endif /* nsICSSLoader_h___ */