forked from mirrors/gecko-dev
Bug 544112 part 2: DeCOMtaminate and devirtualize nsCSSLoader. r=bzbarsky sr=dbaron
--HG-- rename : layout/style/nsICSSLoader.h => layout/style/nsCSSLoader.h
This commit is contained in:
parent
a5be3ffde2
commit
6ce13b76a5
43 changed files with 825 additions and 976 deletions
|
|
@ -119,7 +119,6 @@
|
||||||
#define SELECTED_LOCALE_PREF "general.useragent.locale"
|
#define SELECTED_LOCALE_PREF "general.useragent.locale"
|
||||||
#define SELECTED_SKIN_PREF "general.skins.selectedSkin"
|
#define SELECTED_SKIN_PREF "general.skins.selectedSkin"
|
||||||
|
|
||||||
static NS_DEFINE_CID(kCSSLoaderCID, NS_CSS_LOADER_CID);
|
|
||||||
static NS_DEFINE_CID(kLookAndFeelCID, NS_LOOKANDFEEL_CID);
|
static NS_DEFINE_CID(kLookAndFeelCID, NS_LOOKANDFEEL_CID);
|
||||||
|
|
||||||
nsChromeRegistry* nsChromeRegistry::gChromeRegistry;
|
nsChromeRegistry* nsChromeRegistry::gChromeRegistry;
|
||||||
|
|
|
||||||
|
|
@ -90,7 +90,6 @@ class nsIDOMDocumentType;
|
||||||
class nsScriptLoader;
|
class nsScriptLoader;
|
||||||
class nsIContentSink;
|
class nsIContentSink;
|
||||||
class nsIScriptEventManager;
|
class nsIScriptEventManager;
|
||||||
class nsICSSLoader;
|
|
||||||
class nsHTMLStyleSheet;
|
class nsHTMLStyleSheet;
|
||||||
class nsHTMLCSSStyleSheet;
|
class nsHTMLCSSStyleSheet;
|
||||||
class nsILayoutHistoryState;
|
class nsILayoutHistoryState;
|
||||||
|
|
@ -106,6 +105,10 @@ class nsFrameLoader;
|
||||||
class nsIBoxObject;
|
class nsIBoxObject;
|
||||||
|
|
||||||
namespace mozilla {
|
namespace mozilla {
|
||||||
|
namespace css {
|
||||||
|
class Loader;
|
||||||
|
} // namespace css
|
||||||
|
|
||||||
namespace dom {
|
namespace dom {
|
||||||
class Link;
|
class Link;
|
||||||
} // namespace dom
|
} // namespace dom
|
||||||
|
|
@ -568,7 +571,7 @@ public:
|
||||||
/**
|
/**
|
||||||
* Get this document's CSSLoader. This is guaranteed to not return null.
|
* Get this document's CSSLoader. This is guaranteed to not return null.
|
||||||
*/
|
*/
|
||||||
nsICSSLoader* CSSLoader() const {
|
mozilla::css::Loader* CSSLoader() const {
|
||||||
return mCSSLoader;
|
return mCSSLoader;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -1333,7 +1336,7 @@ protected:
|
||||||
// additional headers that we don't want to expose.
|
// additional headers that we don't want to expose.
|
||||||
// The cleanup is handled by the nsDocument destructor.
|
// The cleanup is handled by the nsDocument destructor.
|
||||||
nsNodeInfoManager* mNodeInfoManager; // [STRONG]
|
nsNodeInfoManager* mNodeInfoManager; // [STRONG]
|
||||||
nsICSSLoader* mCSSLoader; // [STRONG]
|
mozilla::css::Loader* mCSSLoader; // [STRONG]
|
||||||
|
|
||||||
// The set of all object, embed, applet, video and audio elements for
|
// The set of all object, embed, applet, video and audio elements for
|
||||||
// which this is the owner document. (They might not be in the document.)
|
// which this is the owner document. (They might not be in the document.)
|
||||||
|
|
|
||||||
|
|
@ -46,7 +46,7 @@
|
||||||
#include "nsScriptLoader.h"
|
#include "nsScriptLoader.h"
|
||||||
#include "nsIDocument.h"
|
#include "nsIDocument.h"
|
||||||
#include "nsIDOMDocument.h"
|
#include "nsIDOMDocument.h"
|
||||||
#include "nsICSSLoader.h"
|
#include "nsCSSLoader.h"
|
||||||
#include "nsStyleConsts.h"
|
#include "nsStyleConsts.h"
|
||||||
#include "nsStyleLinkElement.h"
|
#include "nsStyleLinkElement.h"
|
||||||
#include "nsINodeInfo.h"
|
#include "nsINodeInfo.h"
|
||||||
|
|
|
||||||
|
|
@ -69,7 +69,6 @@ class nsIDocument;
|
||||||
class nsIURI;
|
class nsIURI;
|
||||||
class nsIChannel;
|
class nsIChannel;
|
||||||
class nsIDocShell;
|
class nsIDocShell;
|
||||||
class nsICSSLoader;
|
|
||||||
class nsIParser;
|
class nsIParser;
|
||||||
class nsIAtom;
|
class nsIAtom;
|
||||||
class nsIChannel;
|
class nsIChannel;
|
||||||
|
|
@ -79,6 +78,12 @@ class nsNodeInfoManager;
|
||||||
class nsScriptLoader;
|
class nsScriptLoader;
|
||||||
class nsIApplicationCache;
|
class nsIApplicationCache;
|
||||||
|
|
||||||
|
namespace mozilla {
|
||||||
|
namespace css {
|
||||||
|
class Loader;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
#ifdef NS_DEBUG
|
#ifdef NS_DEBUG
|
||||||
|
|
||||||
extern PRLogModuleInfo* gContentSinkLogModuleInfo;
|
extern PRLogModuleInfo* gContentSinkLogModuleInfo;
|
||||||
|
|
@ -303,7 +308,7 @@ protected:
|
||||||
nsCOMPtr<nsIURI> mDocumentURI;
|
nsCOMPtr<nsIURI> mDocumentURI;
|
||||||
nsCOMPtr<nsIURI> mDocumentBaseURI;
|
nsCOMPtr<nsIURI> mDocumentBaseURI;
|
||||||
nsCOMPtr<nsIDocShell> mDocShell;
|
nsCOMPtr<nsIDocShell> mDocShell;
|
||||||
nsCOMPtr<nsICSSLoader> mCSSLoader;
|
nsRefPtr<mozilla::css::Loader> mCSSLoader;
|
||||||
nsRefPtr<nsNodeInfoManager> mNodeInfoManager;
|
nsRefPtr<nsNodeInfoManager> mNodeInfoManager;
|
||||||
nsRefPtr<nsScriptLoader> mScriptLoader;
|
nsRefPtr<nsScriptLoader> mScriptLoader;
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -63,6 +63,7 @@
|
||||||
#include "nsContentList.h"
|
#include "nsContentList.h"
|
||||||
#include "nsIObserver.h"
|
#include "nsIObserver.h"
|
||||||
#include "nsIBaseWindow.h"
|
#include "nsIBaseWindow.h"
|
||||||
|
#include "nsCSSLoader.h"
|
||||||
#include "nsIDocShell.h"
|
#include "nsIDocShell.h"
|
||||||
#include "nsIDocShellTreeItem.h"
|
#include "nsIDocShellTreeItem.h"
|
||||||
#include "nsIScriptRuntime.h"
|
#include "nsIScriptRuntime.h"
|
||||||
|
|
@ -1750,9 +1751,10 @@ nsDocument::Init()
|
||||||
|
|
||||||
mOnloadBlocker = new nsOnloadBlocker();
|
mOnloadBlocker = new nsOnloadBlocker();
|
||||||
NS_ENSURE_TRUE(mOnloadBlocker, NS_ERROR_OUT_OF_MEMORY);
|
NS_ENSURE_TRUE(mOnloadBlocker, NS_ERROR_OUT_OF_MEMORY);
|
||||||
|
|
||||||
NS_NewCSSLoader(this, &mCSSLoader);
|
mCSSLoader = new mozilla::css::Loader(this);
|
||||||
NS_ENSURE_TRUE(mCSSLoader, NS_ERROR_OUT_OF_MEMORY);
|
NS_ENSURE_TRUE(mCSSLoader, NS_ERROR_OUT_OF_MEMORY);
|
||||||
|
NS_ADDREF(mCSSLoader);
|
||||||
// Assume we're not quirky, until we know otherwise
|
// Assume we're not quirky, until we know otherwise
|
||||||
mCSSLoader->SetCompatibilityMode(eCompatibility_FullStandards);
|
mCSSLoader->SetCompatibilityMode(eCompatibility_FullStandards);
|
||||||
|
|
||||||
|
|
@ -3493,9 +3495,8 @@ nsDocument::AddCatalogStyleSheet(nsIStyleSheet* aSheet)
|
||||||
void
|
void
|
||||||
nsDocument::EnsureCatalogStyleSheet(const char *aStyleSheetURI)
|
nsDocument::EnsureCatalogStyleSheet(const char *aStyleSheetURI)
|
||||||
{
|
{
|
||||||
nsICSSLoader* cssLoader = CSSLoader();
|
mozilla::css::Loader* cssLoader = CSSLoader();
|
||||||
PRBool enabled;
|
if (cssLoader->GetEnabled()) {
|
||||||
if (NS_SUCCEEDED(cssLoader->GetEnabled(&enabled)) && enabled) {
|
|
||||||
PRInt32 sheetCount = GetNumberOfCatalogStyleSheets();
|
PRInt32 sheetCount = GetNumberOfCatalogStyleSheets();
|
||||||
for (PRInt32 i = 0; i < sheetCount; i++) {
|
for (PRInt32 i = 0; i < sheetCount; i++) {
|
||||||
nsIStyleSheet* sheet = GetCatalogStyleSheetAt(i);
|
nsIStyleSheet* sheet = GetCatalogStyleSheetAt(i);
|
||||||
|
|
|
||||||
|
|
@ -82,7 +82,6 @@
|
||||||
#include "nsIScriptObjectPrincipal.h"
|
#include "nsIScriptObjectPrincipal.h"
|
||||||
#include "nsIURI.h"
|
#include "nsIURI.h"
|
||||||
#include "nsScriptLoader.h"
|
#include "nsScriptLoader.h"
|
||||||
#include "nsICSSLoader.h"
|
|
||||||
#include "nsIRadioGroupContainer.h"
|
#include "nsIRadioGroupContainer.h"
|
||||||
#include "nsIScriptEventManager.h"
|
#include "nsIScriptEventManager.h"
|
||||||
#include "nsILayoutHistoryState.h"
|
#include "nsILayoutHistoryState.h"
|
||||||
|
|
|
||||||
|
|
@ -46,7 +46,7 @@
|
||||||
#include "nsStyleLinkElement.h"
|
#include "nsStyleLinkElement.h"
|
||||||
|
|
||||||
#include "nsIContent.h"
|
#include "nsIContent.h"
|
||||||
#include "nsICSSLoader.h"
|
#include "nsCSSLoader.h"
|
||||||
#include "nsICSSStyleSheet.h"
|
#include "nsICSSStyleSheet.h"
|
||||||
#include "nsIDocument.h"
|
#include "nsIDocument.h"
|
||||||
#include "nsIDOMComment.h"
|
#include "nsIDOMComment.h"
|
||||||
|
|
@ -240,18 +240,11 @@ nsStyleLinkElement::DoUpdateStyleSheet(nsIDocument *aOldDocument,
|
||||||
|
|
||||||
nsCOMPtr<nsIDocument> doc = thisContent->GetDocument();
|
nsCOMPtr<nsIDocument> doc = thisContent->GetDocument();
|
||||||
|
|
||||||
if (!doc) {
|
if (!doc || !doc->CSSLoader()->GetEnabled()) {
|
||||||
return NS_OK;
|
|
||||||
}
|
|
||||||
|
|
||||||
PRBool enabled = PR_FALSE;
|
|
||||||
doc->CSSLoader()->GetEnabled(&enabled);
|
|
||||||
if (!enabled) {
|
|
||||||
return NS_OK;
|
return NS_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
PRBool isInline;
|
PRBool isInline;
|
||||||
|
|
||||||
nsCOMPtr<nsIURI> uri = GetStyleSheetURL(&isInline);
|
nsCOMPtr<nsIURI> uri = GetStyleSheetURL(&isInline);
|
||||||
|
|
||||||
if (!aForceUpdate && mStyleSheet && !isInline && uri) {
|
if (!aForceUpdate && mStyleSheet && !isInline && uri) {
|
||||||
|
|
|
||||||
|
|
@ -49,7 +49,7 @@
|
||||||
#include "nsIDocument.h"
|
#include "nsIDocument.h"
|
||||||
#include "nsICSSStyleRule.h"
|
#include "nsICSSStyleRule.h"
|
||||||
#include "nsCSSParser.h"
|
#include "nsCSSParser.h"
|
||||||
#include "nsICSSLoader.h"
|
#include "nsCSSLoader.h"
|
||||||
#include "nsIDOMMutationEvent.h"
|
#include "nsIDOMMutationEvent.h"
|
||||||
|
|
||||||
#ifdef MOZ_SVG
|
#ifdef MOZ_SVG
|
||||||
|
|
@ -242,7 +242,7 @@ nsStyledElement::ParseStyleAttribute(const nsAString& aValue,
|
||||||
}
|
}
|
||||||
|
|
||||||
if (isCSS) {
|
if (isCSS) {
|
||||||
nsICSSLoader* cssLoader = doc->CSSLoader();
|
mozilla::css::Loader* cssLoader = doc->CSSLoader();
|
||||||
nsCSSParser cssParser(cssLoader);
|
nsCSSParser cssParser(cssLoader);
|
||||||
if (cssParser) {
|
if (cssParser) {
|
||||||
nsCOMPtr<nsIURI> baseURI = GetBaseURI();
|
nsCOMPtr<nsIURI> baseURI = GetBaseURI();
|
||||||
|
|
|
||||||
|
|
@ -41,7 +41,6 @@
|
||||||
#include "nsCOMPtr.h"
|
#include "nsCOMPtr.h"
|
||||||
#include "nsIAtom.h"
|
#include "nsIAtom.h"
|
||||||
#include "nsIContentViewer.h"
|
#include "nsIContentViewer.h"
|
||||||
#include "nsICSSLoader.h"
|
|
||||||
#include "nsICSSStyleRule.h"
|
#include "nsICSSStyleRule.h"
|
||||||
#include "nsCSSStruct.h"
|
#include "nsCSSStruct.h"
|
||||||
#include "nsIDocument.h"
|
#include "nsIDocument.h"
|
||||||
|
|
|
||||||
|
|
@ -98,7 +98,7 @@
|
||||||
#include "nsIDOMHTMLBodyElement.h"
|
#include "nsIDOMHTMLBodyElement.h"
|
||||||
#include "nsINameSpaceManager.h"
|
#include "nsINameSpaceManager.h"
|
||||||
#include "nsGenericHTMLElement.h"
|
#include "nsGenericHTMLElement.h"
|
||||||
#include "nsICSSLoader.h"
|
#include "nsCSSLoader.h"
|
||||||
#include "nsIHttpChannel.h"
|
#include "nsIHttpChannel.h"
|
||||||
#include "nsIFile.h"
|
#include "nsIFile.h"
|
||||||
#include "nsIEventListenerManager.h"
|
#include "nsIEventListenerManager.h"
|
||||||
|
|
|
||||||
|
|
@ -49,7 +49,6 @@ class nsIDOMHTMLFormElement;
|
||||||
class nsIDOMHTMLMapElement;
|
class nsIDOMHTMLMapElement;
|
||||||
class nsHTMLStyleSheet;
|
class nsHTMLStyleSheet;
|
||||||
class nsIStyleSheet;
|
class nsIStyleSheet;
|
||||||
class nsICSSLoader;
|
|
||||||
class nsIContent;
|
class nsIContent;
|
||||||
class nsIDOMHTMLBodyElement;
|
class nsIDOMHTMLBodyElement;
|
||||||
class nsIScriptElement;
|
class nsIScriptElement;
|
||||||
|
|
|
||||||
|
|
@ -61,7 +61,6 @@
|
||||||
#include "nsCSSDeclaration.h"
|
#include "nsCSSDeclaration.h"
|
||||||
#include "nsCSSProps.h"
|
#include "nsCSSProps.h"
|
||||||
#include "nsCSSParser.h"
|
#include "nsCSSParser.h"
|
||||||
#include "nsICSSLoader.h"
|
|
||||||
#include "nsGenericHTMLElement.h"
|
#include "nsGenericHTMLElement.h"
|
||||||
#include "nsNodeInfoManager.h"
|
#include "nsNodeInfoManager.h"
|
||||||
#include "nsIScriptGlobalObject.h"
|
#include "nsIScriptGlobalObject.h"
|
||||||
|
|
|
||||||
|
|
@ -74,7 +74,6 @@
|
||||||
|
|
||||||
#include "nsIScriptContext.h"
|
#include "nsIScriptContext.h"
|
||||||
|
|
||||||
#include "nsICSSLoader.h"
|
|
||||||
#include "nsIStyleRuleProcessor.h"
|
#include "nsIStyleRuleProcessor.h"
|
||||||
#include "nsXBLResourceLoader.h"
|
#include "nsXBLResourceLoader.h"
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -45,15 +45,14 @@
|
||||||
#include "nsIServiceManager.h"
|
#include "nsIServiceManager.h"
|
||||||
#include "nsXBLResourceLoader.h"
|
#include "nsXBLResourceLoader.h"
|
||||||
#include "nsXBLPrototypeResources.h"
|
#include "nsXBLPrototypeResources.h"
|
||||||
|
#include "nsXBLPrototypeBinding.h"
|
||||||
#include "nsIDocumentObserver.h"
|
#include "nsIDocumentObserver.h"
|
||||||
#include "nsICSSLoader.h"
|
#include "nsCSSLoader.h"
|
||||||
#include "nsIURI.h"
|
#include "nsIURI.h"
|
||||||
#include "nsLayoutCID.h"
|
#include "nsLayoutCID.h"
|
||||||
#include "nsCSSRuleProcessor.h"
|
#include "nsCSSRuleProcessor.h"
|
||||||
#include "nsStyleSet.h"
|
#include "nsStyleSet.h"
|
||||||
|
|
||||||
static NS_DEFINE_CID(kCSSLoaderCID, NS_CSS_LOADER_CID);
|
|
||||||
|
|
||||||
nsXBLPrototypeResources::nsXBLPrototypeResources(nsXBLPrototypeBinding* aBinding)
|
nsXBLPrototypeResources::nsXBLPrototypeResources(nsXBLPrototypeBinding* aBinding)
|
||||||
{
|
{
|
||||||
MOZ_COUNT_CTOR(nsXBLPrototypeResources);
|
MOZ_COUNT_CTOR(nsXBLPrototypeResources);
|
||||||
|
|
@ -108,11 +107,10 @@ nsXBLPrototypeResources::FlushSkinSheets()
|
||||||
if (mStyleSheetList.Count() == 0)
|
if (mStyleSheetList.Count() == 0)
|
||||||
return NS_OK;
|
return NS_OK;
|
||||||
|
|
||||||
nsresult rv;
|
nsCOMPtr<nsIDocument> doc;
|
||||||
// XXXbz should be getting loader off the document or something
|
mLoader->mBinding->XBLDocumentInfo()->GetDocument(getter_AddRefs(doc));
|
||||||
nsCOMPtr<nsICSSLoader> loader = do_CreateInstance(kCSSLoaderCID, &rv);
|
mozilla::css::Loader* cssLoader = doc->CSSLoader();
|
||||||
if (NS_FAILED(rv)) return rv;
|
|
||||||
|
|
||||||
// We have scoped stylesheets. Reload any chrome stylesheets we
|
// We have scoped stylesheets. Reload any chrome stylesheets we
|
||||||
// encounter. (If they aren't skin sheets, it doesn't matter, since
|
// encounter. (If they aren't skin sheets, it doesn't matter, since
|
||||||
// they'll still be in the chrome cache.
|
// they'll still be in the chrome cache.
|
||||||
|
|
@ -120,28 +118,28 @@ nsXBLPrototypeResources::FlushSkinSheets()
|
||||||
|
|
||||||
nsCOMArray<nsICSSStyleSheet> oldSheets(mStyleSheetList);
|
nsCOMArray<nsICSSStyleSheet> oldSheets(mStyleSheetList);
|
||||||
mStyleSheetList.Clear();
|
mStyleSheetList.Clear();
|
||||||
|
|
||||||
PRInt32 i;
|
PRInt32 i;
|
||||||
PRInt32 count = oldSheets.Count();
|
PRInt32 count = oldSheets.Count();
|
||||||
for (i = 0; i < count; i++) {
|
for (i = 0; i < count; i++) {
|
||||||
nsICSSStyleSheet* oldSheet = oldSheets[i];
|
nsICSSStyleSheet* oldSheet = oldSheets[i];
|
||||||
|
|
||||||
nsCOMPtr<nsIURI> uri;
|
nsCOMPtr<nsIURI> uri;
|
||||||
oldSheet->GetSheetURI(getter_AddRefs(uri));
|
oldSheet->GetSheetURI(getter_AddRefs(uri));
|
||||||
|
|
||||||
nsCOMPtr<nsICSSStyleSheet> newSheet;
|
nsCOMPtr<nsICSSStyleSheet> newSheet;
|
||||||
if (IsChromeURI(uri)) {
|
if (IsChromeURI(uri)) {
|
||||||
if (NS_FAILED(loader->LoadSheetSync(uri, getter_AddRefs(newSheet))))
|
if (NS_FAILED(cssLoader->LoadSheetSync(uri, getter_AddRefs(newSheet))))
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
newSheet = oldSheet;
|
newSheet = oldSheet;
|
||||||
}
|
}
|
||||||
|
|
||||||
mStyleSheetList.AppendObject(newSheet);
|
mStyleSheetList.AppendObject(newSheet);
|
||||||
}
|
}
|
||||||
mRuleProcessor = new nsCSSRuleProcessor(mStyleSheetList,
|
mRuleProcessor = new nsCSSRuleProcessor(mStyleSheetList,
|
||||||
nsStyleSet::eDocSheet);
|
nsStyleSet::eDocSheet);
|
||||||
|
|
||||||
return NS_OK;
|
return NS_OK;
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -48,7 +48,7 @@
|
||||||
#include "nsIDocumentObserver.h"
|
#include "nsIDocumentObserver.h"
|
||||||
#include "imgILoader.h"
|
#include "imgILoader.h"
|
||||||
#include "imgIRequest.h"
|
#include "imgIRequest.h"
|
||||||
#include "nsICSSLoader.h"
|
#include "nsCSSLoader.h"
|
||||||
#include "nsIXBLDocumentInfo.h"
|
#include "nsIXBLDocumentInfo.h"
|
||||||
#include "nsIURI.h"
|
#include "nsIURI.h"
|
||||||
#include "nsNetUtil.h"
|
#include "nsNetUtil.h"
|
||||||
|
|
@ -112,7 +112,7 @@ nsXBLResourceLoader::LoadResources(PRBool* aResult)
|
||||||
nsCOMPtr<nsIDocument> doc;
|
nsCOMPtr<nsIDocument> doc;
|
||||||
mBinding->XBLDocumentInfo()->GetDocument(getter_AddRefs(doc));
|
mBinding->XBLDocumentInfo()->GetDocument(getter_AddRefs(doc));
|
||||||
|
|
||||||
nsICSSLoader* cssLoader = doc->CSSLoader();
|
mozilla::css::Loader* cssLoader = doc->CSSLoader();
|
||||||
nsIURI *docURL = doc->GetDocumentURI();
|
nsIURI *docURL = doc->GetDocumentURI();
|
||||||
nsIPrincipal* docPrincipal = doc->NodePrincipal();
|
nsIPrincipal* docPrincipal = doc->NodePrincipal();
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -59,8 +59,8 @@
|
||||||
#include "nsDOMDocumentType.h"
|
#include "nsDOMDocumentType.h"
|
||||||
#include "nsHTMLParts.h"
|
#include "nsHTMLParts.h"
|
||||||
#include "nsCRT.h"
|
#include "nsCRT.h"
|
||||||
#include "nsICSSLoader.h"
|
|
||||||
#include "nsICSSStyleSheet.h"
|
#include "nsICSSStyleSheet.h"
|
||||||
|
#include "nsCSSLoader.h"
|
||||||
#include "nsGkAtoms.h"
|
#include "nsGkAtoms.h"
|
||||||
#include "nsContentUtils.h"
|
#include "nsContentUtils.h"
|
||||||
#include "nsIScriptContext.h"
|
#include "nsIScriptContext.h"
|
||||||
|
|
|
||||||
|
|
@ -63,7 +63,7 @@
|
||||||
#include "nsIHTMLDocument.h"
|
#include "nsIHTMLDocument.h"
|
||||||
#include "nsIStyleSheetLinkingElement.h"
|
#include "nsIStyleSheetLinkingElement.h"
|
||||||
#include "nsIDocumentTransformer.h"
|
#include "nsIDocumentTransformer.h"
|
||||||
#include "nsICSSLoader.h"
|
#include "nsCSSLoader.h"
|
||||||
#include "nsICharsetAlias.h"
|
#include "nsICharsetAlias.h"
|
||||||
#include "nsIHTMLContentSink.h"
|
#include "nsIHTMLContentSink.h"
|
||||||
#include "nsContentUtils.h"
|
#include "nsContentUtils.h"
|
||||||
|
|
|
||||||
|
|
@ -83,7 +83,7 @@
|
||||||
#include "nsCRT.h"
|
#include "nsCRT.h"
|
||||||
|
|
||||||
#include "nsXULPrototypeDocument.h" // XXXbe temporary
|
#include "nsXULPrototypeDocument.h" // XXXbe temporary
|
||||||
#include "nsICSSLoader.h"
|
#include "nsCSSLoader.h"
|
||||||
|
|
||||||
#include "nsUnicharUtils.h"
|
#include "nsUnicharUtils.h"
|
||||||
#include "nsGkAtoms.h"
|
#include "nsGkAtoms.h"
|
||||||
|
|
|
||||||
|
|
@ -113,6 +113,7 @@
|
||||||
#include "nsIParser.h"
|
#include "nsIParser.h"
|
||||||
#include "nsIParserService.h"
|
#include "nsIParserService.h"
|
||||||
#include "nsICSSStyleSheet.h"
|
#include "nsICSSStyleSheet.h"
|
||||||
|
#include "nsCSSLoader.h"
|
||||||
#include "nsIScriptError.h"
|
#include "nsIScriptError.h"
|
||||||
#include "nsIStyleSheetLinkingElement.h"
|
#include "nsIStyleSheetLinkingElement.h"
|
||||||
#include "nsEventDispatcher.h"
|
#include "nsEventDispatcher.h"
|
||||||
|
|
|
||||||
|
|
@ -64,7 +64,6 @@
|
||||||
#include "nsISelectionController.h"
|
#include "nsISelectionController.h"
|
||||||
#include "nsIFileChannel.h"
|
#include "nsIFileChannel.h"
|
||||||
|
|
||||||
#include "nsICSSLoader.h"
|
|
||||||
#include "nsICSSStyleSheet.h"
|
#include "nsICSSStyleSheet.h"
|
||||||
#include "nsIDocumentObserver.h"
|
#include "nsIDocumentObserver.h"
|
||||||
#include "nsIDocumentStateListener.h"
|
#include "nsIDocumentStateListener.h"
|
||||||
|
|
|
||||||
|
|
@ -72,7 +72,7 @@
|
||||||
#include "nsIDOMEventGroup.h"
|
#include "nsIDOMEventGroup.h"
|
||||||
#include "nsILinkHandler.h"
|
#include "nsILinkHandler.h"
|
||||||
|
|
||||||
#include "nsICSSLoader.h"
|
#include "nsCSSLoader.h"
|
||||||
#include "nsICSSStyleSheet.h"
|
#include "nsICSSStyleSheet.h"
|
||||||
#include "nsIDOMStyleSheet.h"
|
#include "nsIDOMStyleSheet.h"
|
||||||
#include "nsIDocumentObserver.h"
|
#include "nsIDocumentObserver.h"
|
||||||
|
|
@ -3372,29 +3372,22 @@ nsHTMLEditor::ReplaceStyleSheet(const nsAString& aURL)
|
||||||
{
|
{
|
||||||
// Disable last sheet if not the same as new one
|
// Disable last sheet if not the same as new one
|
||||||
if (!mLastStyleSheetURL.IsEmpty() && !mLastStyleSheetURL.Equals(aURL))
|
if (!mLastStyleSheetURL.IsEmpty() && !mLastStyleSheetURL.Equals(aURL))
|
||||||
return EnableStyleSheet(mLastStyleSheetURL, PR_FALSE);
|
return EnableStyleSheet(mLastStyleSheetURL, PR_FALSE);
|
||||||
|
|
||||||
return NS_OK;
|
return NS_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
nsCOMPtr<nsICSSLoader> cssLoader;
|
// Make sure the pres shell doesn't disappear during the load.
|
||||||
nsresult rv = GetCSSLoader(aURL, getter_AddRefs(cssLoader));
|
|
||||||
NS_ENSURE_SUCCESS(rv, rv);
|
|
||||||
|
|
||||||
if (!mPresShellWeak) return NS_ERROR_NOT_INITIALIZED;
|
if (!mPresShellWeak) return NS_ERROR_NOT_INITIALIZED;
|
||||||
nsCOMPtr<nsIPresShell> ps = do_QueryReferent(mPresShellWeak);
|
nsCOMPtr<nsIPresShell> ps = do_QueryReferent(mPresShellWeak);
|
||||||
if (!ps) return NS_ERROR_NOT_INITIALIZED;
|
if (!ps) return NS_ERROR_NOT_INITIALIZED;
|
||||||
nsIDocument *document = ps->GetDocument();
|
|
||||||
if (!document) return NS_ERROR_NULL_POINTER;
|
|
||||||
|
|
||||||
nsCOMPtr<nsIURI> uaURI;
|
nsCOMPtr<nsIURI> uaURI;
|
||||||
rv = NS_NewURI(getter_AddRefs(uaURI), aURL);
|
nsresult rv = NS_NewURI(getter_AddRefs(uaURI), aURL);
|
||||||
NS_ENSURE_SUCCESS(rv, rv);
|
NS_ENSURE_SUCCESS(rv, rv);
|
||||||
|
|
||||||
rv = cssLoader->LoadSheet(uaURI, nsnull, EmptyCString(), this);
|
return ps->GetDocument()->CSSLoader()->
|
||||||
NS_ENSURE_SUCCESS(rv, rv);
|
LoadSheet(uaURI, nsnull, EmptyCString(), this);
|
||||||
|
|
||||||
return NS_OK;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
NS_IMETHODIMP
|
NS_IMETHODIMP
|
||||||
|
|
@ -3423,19 +3416,20 @@ nsHTMLEditor::RemoveStyleSheet(const nsAString &aURL)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
NS_IMETHODIMP
|
NS_IMETHODIMP
|
||||||
nsHTMLEditor::AddOverrideStyleSheet(const nsAString& aURL)
|
nsHTMLEditor::AddOverrideStyleSheet(const nsAString& aURL)
|
||||||
{
|
{
|
||||||
// Enable existing sheet if already loaded.
|
// Enable existing sheet if already loaded.
|
||||||
if (EnableExistingStyleSheet(aURL))
|
if (EnableExistingStyleSheet(aURL))
|
||||||
return NS_OK;
|
return NS_OK;
|
||||||
|
|
||||||
nsCOMPtr<nsICSSLoader> cssLoader;
|
// Make sure the pres shell doesn't disappear during the load.
|
||||||
nsresult rv = GetCSSLoader(aURL, getter_AddRefs(cssLoader));
|
nsCOMPtr<nsIPresShell> ps = do_QueryReferent(mPresShellWeak);
|
||||||
NS_ENSURE_SUCCESS(rv, rv);
|
if (!ps)
|
||||||
|
return NS_ERROR_NOT_INITIALIZED;
|
||||||
|
|
||||||
nsCOMPtr<nsIURI> uaURI;
|
nsCOMPtr<nsIURI> uaURI;
|
||||||
rv = NS_NewURI(getter_AddRefs(uaURI), aURL);
|
nsresult rv = NS_NewURI(getter_AddRefs(uaURI), aURL);
|
||||||
NS_ENSURE_SUCCESS(rv, rv);
|
NS_ENSURE_SUCCESS(rv, rv);
|
||||||
|
|
||||||
// We MUST ONLY load synchronous local files (no @import)
|
// We MUST ONLY load synchronous local files (no @import)
|
||||||
|
|
@ -3443,16 +3437,13 @@ nsHTMLEditor::AddOverrideStyleSheet(const nsAString& aURL)
|
||||||
// synchronously, of course..
|
// synchronously, of course..
|
||||||
nsCOMPtr<nsICSSStyleSheet> sheet;
|
nsCOMPtr<nsICSSStyleSheet> sheet;
|
||||||
// Editor override style sheets may want to style Gecko anonymous boxes
|
// Editor override style sheets may want to style Gecko anonymous boxes
|
||||||
rv = cssLoader->LoadSheetSync(uaURI, PR_TRUE, PR_TRUE, getter_AddRefs(sheet));
|
rv = ps->GetDocument()->CSSLoader()->
|
||||||
|
LoadSheetSync(uaURI, PR_TRUE, PR_TRUE, getter_AddRefs(sheet));
|
||||||
|
|
||||||
// Synchronous loads should ALWAYS return completed
|
// Synchronous loads should ALWAYS return completed
|
||||||
if (!sheet)
|
if (!sheet)
|
||||||
return NS_ERROR_NULL_POINTER;
|
return NS_ERROR_NULL_POINTER;
|
||||||
|
|
||||||
nsCOMPtr<nsIPresShell> ps = do_QueryReferent(mPresShellWeak);
|
|
||||||
if (!ps)
|
|
||||||
return NS_ERROR_NOT_INITIALIZED;
|
|
||||||
|
|
||||||
// Add the override style sheet
|
// Add the override style sheet
|
||||||
// (This checks if already exists)
|
// (This checks if already exists)
|
||||||
ps->AddOverrideStyleSheet(sheet);
|
ps->AddOverrideStyleSheet(sheet);
|
||||||
|
|
@ -3630,29 +3621,9 @@ nsHTMLEditor::GetURLForStyleSheet(nsICSSStyleSheet *aStyleSheet,
|
||||||
return NS_OK;
|
return NS_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
nsresult
|
/*
|
||||||
nsHTMLEditor::GetCSSLoader(const nsAString& aURL, nsICSSLoader** aCSSLoader)
|
* nsIEditorMailSupport methods
|
||||||
{
|
*/
|
||||||
if (!aCSSLoader)
|
|
||||||
return NS_ERROR_NULL_POINTER;
|
|
||||||
*aCSSLoader = 0;
|
|
||||||
|
|
||||||
if (!mPresShellWeak) return NS_ERROR_NOT_INITIALIZED;
|
|
||||||
nsCOMPtr<nsIPresShell> ps = do_QueryReferent(mPresShellWeak);
|
|
||||||
if (!ps) return NS_ERROR_NOT_INITIALIZED;
|
|
||||||
nsIDocument *document = ps->GetDocument();
|
|
||||||
if (!document) return NS_ERROR_NULL_POINTER;
|
|
||||||
|
|
||||||
NS_ADDREF(*aCSSLoader = document->CSSLoader());
|
|
||||||
|
|
||||||
return NS_OK;
|
|
||||||
}
|
|
||||||
|
|
||||||
#ifdef XP_MAC
|
|
||||||
#pragma mark -
|
|
||||||
#pragma mark nsIEditorMailSupport methods
|
|
||||||
#pragma mark -
|
|
||||||
#endif
|
|
||||||
|
|
||||||
NS_IMETHODIMP
|
NS_IMETHODIMP
|
||||||
nsHTMLEditor::GetEmbeddedObjects(nsISupportsArray** aNodeList)
|
nsHTMLEditor::GetEmbeddedObjects(nsISupportsArray** aNodeList)
|
||||||
|
|
|
||||||
|
|
@ -53,7 +53,6 @@
|
||||||
#include "nsEditor.h"
|
#include "nsEditor.h"
|
||||||
#include "nsIDOMElement.h"
|
#include "nsIDOMElement.h"
|
||||||
#include "nsIDOMEventListener.h"
|
#include "nsIDOMEventListener.h"
|
||||||
#include "nsICSSLoader.h"
|
|
||||||
#include "nsICSSLoaderObserver.h"
|
#include "nsICSSLoaderObserver.h"
|
||||||
#include "nsITableLayout.h"
|
#include "nsITableLayout.h"
|
||||||
|
|
||||||
|
|
@ -410,9 +409,6 @@ public:
|
||||||
PRBool aSafeToAskFrames,
|
PRBool aSafeToAskFrames,
|
||||||
PRBool *aSeenBR);
|
PRBool *aSeenBR);
|
||||||
|
|
||||||
// Stylesheet-related methods that aren't part of nsIEditorStyleSheets.
|
|
||||||
nsresult GetCSSLoader(const nsAString& aURL, nsICSSLoader** aCSSLoader);
|
|
||||||
|
|
||||||
// Returns TRUE if sheet was loaded, false if it wasn't
|
// Returns TRUE if sheet was loaded, false if it wasn't
|
||||||
PRBool EnableExistingStyleSheet(const nsAString& aURL);
|
PRBool EnableExistingStyleSheet(const nsAString& aURL);
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -50,7 +50,6 @@
|
||||||
#include "nsISelectionPrivate.h"
|
#include "nsISelectionPrivate.h"
|
||||||
#include "nsIDOMHTMLImageElement.h"
|
#include "nsIDOMHTMLImageElement.h"
|
||||||
#include "nsISelectionController.h"
|
#include "nsISelectionController.h"
|
||||||
#include "nsICSSLoader.h"
|
|
||||||
#include "nsICSSStyleSheet.h"
|
#include "nsICSSStyleSheet.h"
|
||||||
#include "nsIDocumentObserver.h"
|
#include "nsIDocumentObserver.h"
|
||||||
#include "TypeInState.h"
|
#include "TypeInState.h"
|
||||||
|
|
|
||||||
|
|
@ -89,7 +89,7 @@
|
||||||
#include "nsNetUtil.h"
|
#include "nsNetUtil.h"
|
||||||
#include "nsIContentViewerEdit.h"
|
#include "nsIContentViewerEdit.h"
|
||||||
#include "nsIContentViewerFile.h"
|
#include "nsIContentViewerFile.h"
|
||||||
#include "nsICSSLoader.h"
|
#include "nsCSSLoader.h"
|
||||||
#include "nsIMarkupDocumentViewer.h"
|
#include "nsIMarkupDocumentViewer.h"
|
||||||
#include "nsIInterfaceRequestor.h"
|
#include "nsIInterfaceRequestor.h"
|
||||||
#include "nsIInterfaceRequestorUtils.h"
|
#include "nsIInterfaceRequestorUtils.h"
|
||||||
|
|
@ -2144,8 +2144,7 @@ DocumentViewerImpl::CreateStyleSet(nsIDocument* aDocument,
|
||||||
nsAutoString sheets;
|
nsAutoString sheets;
|
||||||
elt->GetAttribute(NS_LITERAL_STRING("usechromesheets"), sheets);
|
elt->GetAttribute(NS_LITERAL_STRING("usechromesheets"), sheets);
|
||||||
if (!sheets.IsEmpty() && baseURI) {
|
if (!sheets.IsEmpty() && baseURI) {
|
||||||
nsCOMPtr<nsICSSLoader> cssLoader;
|
nsRefPtr<mozilla::css::Loader> cssLoader = new mozilla::css::Loader();
|
||||||
NS_NewCSSLoader(getter_AddRefs(cssLoader));
|
|
||||||
|
|
||||||
char *str = ToNewCString(sheets);
|
char *str = ToNewCString(sheets);
|
||||||
char *newStr = str;
|
char *newStr = str;
|
||||||
|
|
|
||||||
|
|
@ -41,7 +41,7 @@
|
||||||
#include "prlog.h"
|
#include "prlog.h"
|
||||||
#include "nsStyleSheetService.h"
|
#include "nsStyleSheetService.h"
|
||||||
#include "nsIStyleSheet.h"
|
#include "nsIStyleSheet.h"
|
||||||
#include "nsICSSLoader.h"
|
#include "nsCSSLoader.h"
|
||||||
#include "nsICSSStyleSheet.h"
|
#include "nsICSSStyleSheet.h"
|
||||||
#include "nsIURI.h"
|
#include "nsIURI.h"
|
||||||
#include "nsContentCID.h"
|
#include "nsContentCID.h"
|
||||||
|
|
@ -53,8 +53,6 @@
|
||||||
#include "nsIObserverService.h"
|
#include "nsIObserverService.h"
|
||||||
#include "nsLayoutStatics.h"
|
#include "nsLayoutStatics.h"
|
||||||
|
|
||||||
static NS_DEFINE_CID(kCSSLoaderCID, NS_CSS_LOADER_CID);
|
|
||||||
|
|
||||||
nsStyleSheetService *nsStyleSheetService::gInstance = nsnull;
|
nsStyleSheetService *nsStyleSheetService::gInstance = nsnull;
|
||||||
|
|
||||||
nsStyleSheetService::nsStyleSheetService()
|
nsStyleSheetService::nsStyleSheetService()
|
||||||
|
|
@ -171,7 +169,9 @@ nsStyleSheetService::LoadAndRegisterSheetInternal(nsIURI *aSheetURI,
|
||||||
NS_ENSURE_ARG(aSheetType == AGENT_SHEET || aSheetType == USER_SHEET);
|
NS_ENSURE_ARG(aSheetType == AGENT_SHEET || aSheetType == USER_SHEET);
|
||||||
NS_ENSURE_ARG_POINTER(aSheetURI);
|
NS_ENSURE_ARG_POINTER(aSheetURI);
|
||||||
|
|
||||||
nsCOMPtr<nsICSSLoader> loader = do_CreateInstance(kCSSLoaderCID);
|
nsRefPtr<mozilla::css::Loader> loader = new mozilla::css::Loader();
|
||||||
|
NS_ENSURE_TRUE(loader, NS_ERROR_OUT_OF_MEMORY);
|
||||||
|
|
||||||
nsCOMPtr<nsICSSStyleSheet> sheet;
|
nsCOMPtr<nsICSSStyleSheet> sheet;
|
||||||
// Allow UA sheets, but not user sheets, to use unsafe rules
|
// Allow UA sheets, but not user sheets, to use unsafe rules
|
||||||
nsresult rv = loader->LoadSheetSync(aSheetURI, aSheetType == AGENT_SHEET,
|
nsresult rv = loader->LoadSheetSync(aSheetURI, aSheetType == AGENT_SHEET,
|
||||||
|
|
|
||||||
|
|
@ -46,14 +46,12 @@
|
||||||
#include "nsIDocument.h"
|
#include "nsIDocument.h"
|
||||||
#include "nsIDocumentViewer.h"
|
#include "nsIDocumentViewer.h"
|
||||||
#include "nsIURL.h"
|
#include "nsIURL.h"
|
||||||
#include "nsICSSStyleSheet.h"
|
|
||||||
#include "nsNodeInfo.h"
|
#include "nsNodeInfo.h"
|
||||||
#include "nsNodeInfoManager.h"
|
#include "nsNodeInfoManager.h"
|
||||||
#include "nsString.h"
|
#include "nsString.h"
|
||||||
#include "nsContentCID.h"
|
#include "nsContentCID.h"
|
||||||
#include "prprf.h"
|
#include "prprf.h"
|
||||||
#include "nsNetUtil.h"
|
#include "nsNetUtil.h"
|
||||||
#include "nsICSSLoader.h"
|
|
||||||
#include "nsCRT.h"
|
#include "nsCRT.h"
|
||||||
#include "nsIViewSourceChannel.h"
|
#include "nsIViewSourceChannel.h"
|
||||||
#ifdef MOZ_MEDIA
|
#ifdef MOZ_MEDIA
|
||||||
|
|
|
||||||
|
|
@ -46,7 +46,6 @@
|
||||||
#include "nsHTMLContentSerializer.h"
|
#include "nsHTMLContentSerializer.h"
|
||||||
#include "nsHTMLParts.h"
|
#include "nsHTMLParts.h"
|
||||||
#include "nsGenericHTMLElement.h"
|
#include "nsGenericHTMLElement.h"
|
||||||
#include "nsICSSLoader.h"
|
|
||||||
#include "nsICategoryManager.h"
|
#include "nsICategoryManager.h"
|
||||||
#include "nsIComponentManager.h"
|
#include "nsIComponentManager.h"
|
||||||
#include "nsIContentIterator.h"
|
#include "nsIContentIterator.h"
|
||||||
|
|
@ -483,7 +482,6 @@ MAKE_CTOR(CreateXMLDocument, nsIDocument, NS_NewXML
|
||||||
MAKE_CTOR(CreateSVGDocument, nsIDocument, NS_NewSVGDocument)
|
MAKE_CTOR(CreateSVGDocument, nsIDocument, NS_NewSVGDocument)
|
||||||
#endif
|
#endif
|
||||||
MAKE_CTOR(CreateImageDocument, nsIDocument, NS_NewImageDocument)
|
MAKE_CTOR(CreateImageDocument, nsIDocument, NS_NewImageDocument)
|
||||||
MAKE_CTOR(CreateCSSLoader, nsICSSLoader, NS_NewCSSLoader)
|
|
||||||
MAKE_CTOR(CreateDOMSelection, nsISelection, NS_NewDomSelection)
|
MAKE_CTOR(CreateDOMSelection, nsISelection, NS_NewDomSelection)
|
||||||
MAKE_CTOR(CreateSelection, nsFrameSelection, NS_NewSelection)
|
MAKE_CTOR(CreateSelection, nsFrameSelection, NS_NewSelection)
|
||||||
MAKE_CTOR(CreateRange, nsIDOMRange, NS_NewRange)
|
MAKE_CTOR(CreateRange, nsIDOMRange, NS_NewRange)
|
||||||
|
|
@ -1046,11 +1044,6 @@ static const nsModuleComponentInfo gComponents[] = {
|
||||||
nsnull,
|
nsnull,
|
||||||
CreateImageDocument },
|
CreateImageDocument },
|
||||||
|
|
||||||
{ "CSS loader",
|
|
||||||
NS_CSS_LOADER_CID,
|
|
||||||
nsnull,
|
|
||||||
CreateCSSLoader },
|
|
||||||
|
|
||||||
{ "Dom selection",
|
{ "Dom selection",
|
||||||
NS_DOMSELECTION_CID,
|
NS_DOMSELECTION_CID,
|
||||||
"@mozilla.org/content/dom-selection;1",
|
"@mozilla.org/content/dom-selection;1",
|
||||||
|
|
|
||||||
|
|
@ -57,6 +57,7 @@ EXPORTS = \
|
||||||
nsCSSAnonBoxes.h \
|
nsCSSAnonBoxes.h \
|
||||||
nsCSSKeywordList.h \
|
nsCSSKeywordList.h \
|
||||||
nsCSSKeywords.h \
|
nsCSSKeywords.h \
|
||||||
|
nsCSSLoader.h \
|
||||||
nsCSSParser.h \
|
nsCSSParser.h \
|
||||||
nsCSSPropList.h \
|
nsCSSPropList.h \
|
||||||
nsCSSProperty.h \
|
nsCSSProperty.h \
|
||||||
|
|
@ -74,7 +75,6 @@ EXPORTS = \
|
||||||
nsICSSDeclaration.h \
|
nsICSSDeclaration.h \
|
||||||
nsICSSGroupRule.h \
|
nsICSSGroupRule.h \
|
||||||
nsICSSImportRule.h \
|
nsICSSImportRule.h \
|
||||||
nsICSSLoader.h \
|
|
||||||
nsICSSLoaderObserver.h \
|
nsICSSLoaderObserver.h \
|
||||||
nsICSSNameSpaceRule.h \
|
nsICSSNameSpaceRule.h \
|
||||||
nsICSSPseudoComparator.h \
|
nsICSSPseudoComparator.h \
|
||||||
|
|
|
||||||
File diff suppressed because it is too large
Load diff
500
layout/style/nsCSSLoader.h
Normal file
500
layout/style/nsCSSLoader.h
Normal file
|
|
@ -0,0 +1,500 @@
|
||||||
|
/* -*- 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 "nsIPrincipal.h"
|
||||||
|
#include "nsAString.h"
|
||||||
|
#include "nsAutoPtr.h"
|
||||||
|
#include "nsCompatibility.h"
|
||||||
|
#include "nsDataHashtable.h"
|
||||||
|
#include "nsInterfaceHashtable.h"
|
||||||
|
#include "nsTArray.h"
|
||||||
|
#include "nsTObserverArray.h"
|
||||||
|
#include "nsURIHashKey.h"
|
||||||
|
|
||||||
|
class nsIAtom;
|
||||||
|
class nsICSSImportRule;
|
||||||
|
class nsICSSLoaderObserver;
|
||||||
|
class nsICSSStyleSheet;
|
||||||
|
class nsIContent;
|
||||||
|
class nsIDocument;
|
||||||
|
class nsIUnicharInputStream;
|
||||||
|
class nsCSSParser;
|
||||||
|
class nsMediaList;
|
||||||
|
class nsPresContext;
|
||||||
|
|
||||||
|
namespace mozilla {
|
||||||
|
|
||||||
|
class URIAndPrincipalHashKey : public nsURIHashKey
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
typedef URIAndPrincipalHashKey* KeyType;
|
||||||
|
typedef const URIAndPrincipalHashKey* KeyTypePointer;
|
||||||
|
|
||||||
|
URIAndPrincipalHashKey(const URIAndPrincipalHashKey* aKey)
|
||||||
|
: nsURIHashKey(aKey->mKey), mPrincipal(aKey->mPrincipal)
|
||||||
|
{
|
||||||
|
MOZ_COUNT_CTOR(URIAndPrincipalHashKey);
|
||||||
|
}
|
||||||
|
URIAndPrincipalHashKey(nsIURI* aURI, nsIPrincipal* aPrincipal)
|
||||||
|
: nsURIHashKey(aURI), mPrincipal(aPrincipal)
|
||||||
|
{
|
||||||
|
MOZ_COUNT_CTOR(URIAndPrincipalHashKey);
|
||||||
|
}
|
||||||
|
URIAndPrincipalHashKey(const URIAndPrincipalHashKey& toCopy)
|
||||||
|
: nsURIHashKey(toCopy), mPrincipal(toCopy.mPrincipal)
|
||||||
|
{
|
||||||
|
MOZ_COUNT_CTOR(URIAndPrincipalHashKey);
|
||||||
|
}
|
||||||
|
~URIAndPrincipalHashKey()
|
||||||
|
{
|
||||||
|
MOZ_COUNT_DTOR(URIAndPrincipalHashKey);
|
||||||
|
}
|
||||||
|
|
||||||
|
URIAndPrincipalHashKey* GetKey() const {
|
||||||
|
return const_cast<URIAndPrincipalHashKey*>(this);
|
||||||
|
}
|
||||||
|
const URIAndPrincipalHashKey* GetKeyPointer() const { return this; }
|
||||||
|
|
||||||
|
PRBool KeyEquals(const URIAndPrincipalHashKey* aKey) const {
|
||||||
|
if (!nsURIHashKey::KeyEquals(aKey->mKey)) {
|
||||||
|
return PR_FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!mPrincipal != !aKey->mPrincipal) {
|
||||||
|
// One or the other has a principal, but not both... not equal
|
||||||
|
return PR_FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
|
PRBool eq;
|
||||||
|
return !mPrincipal ||
|
||||||
|
(NS_SUCCEEDED(mPrincipal->Equals(aKey->mPrincipal, &eq)) && eq);
|
||||||
|
}
|
||||||
|
|
||||||
|
static const URIAndPrincipalHashKey*
|
||||||
|
KeyToPointer(URIAndPrincipalHashKey* aKey) { return aKey; }
|
||||||
|
static PLDHashNumber HashKey(const URIAndPrincipalHashKey* aKey) {
|
||||||
|
return nsURIHashKey::HashKey(aKey->mKey);
|
||||||
|
}
|
||||||
|
|
||||||
|
enum { ALLOW_MEMMOVE = PR_TRUE };
|
||||||
|
|
||||||
|
protected:
|
||||||
|
nsCOMPtr<nsIPrincipal> mPrincipal;
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
namespace css {
|
||||||
|
|
||||||
|
class SheetLoadData;
|
||||||
|
|
||||||
|
/***********************************************************************
|
||||||
|
* Enum that describes the state of the sheet returned by CreateSheet. *
|
||||||
|
***********************************************************************/
|
||||||
|
enum StyleSheetState {
|
||||||
|
eSheetStateUnknown = 0,
|
||||||
|
eSheetNeedsParser,
|
||||||
|
eSheetPending,
|
||||||
|
eSheetLoading,
|
||||||
|
eSheetComplete
|
||||||
|
};
|
||||||
|
|
||||||
|
class Loader {
|
||||||
|
public:
|
||||||
|
Loader();
|
||||||
|
Loader(nsIDocument*);
|
||||||
|
~Loader();
|
||||||
|
|
||||||
|
// This isn't a COM class but it's reference-counted like one.
|
||||||
|
NS_IMETHOD_(nsrefcnt) AddRef();
|
||||||
|
NS_IMETHOD_(nsrefcnt) Release();
|
||||||
|
|
||||||
|
void DropDocumentReference(); // notification that doc is going away
|
||||||
|
|
||||||
|
void SetCompatibilityMode(nsCompatibility aCompatMode)
|
||||||
|
{ mCompatMode = aCompatMode; }
|
||||||
|
nsCompatibility GetCompatibilityMode() { return mCompatMode; }
|
||||||
|
nsresult SetPreferredSheet(const nsAString& aTitle);
|
||||||
|
nsresult GetPreferredSheet(nsAString& aTitle);
|
||||||
|
|
||||||
|
// 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.
|
||||||
|
*/
|
||||||
|
nsresult LoadInlineStyle(nsIContent* aElement,
|
||||||
|
nsIUnicharInputStream* aStream,
|
||||||
|
PRUint32 aLineNumber,
|
||||||
|
const nsAString& aTitle,
|
||||||
|
const nsAString& aMedia,
|
||||||
|
nsICSSLoaderObserver* aObserver,
|
||||||
|
PRBool* aCompleted,
|
||||||
|
PRBool* aIsAlternate);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 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.
|
||||||
|
*/
|
||||||
|
nsresult LoadStyleLink(nsIContent* aElement,
|
||||||
|
nsIURI* aURL,
|
||||||
|
const nsAString& aTitle,
|
||||||
|
const nsAString& aMedia,
|
||||||
|
PRBool aHasAlternateRel,
|
||||||
|
nsICSSLoaderObserver* aObserver,
|
||||||
|
PRBool* aIsAlternate);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 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.
|
||||||
|
*/
|
||||||
|
nsresult LoadChildSheet(nsICSSStyleSheet* aParentSheet,
|
||||||
|
nsIURI* aURL,
|
||||||
|
nsMediaList* aMedia,
|
||||||
|
nsICSSImportRule* aRule);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 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 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.
|
||||||
|
* @param aUseSystemPrincipal if true, give the resulting sheet the system
|
||||||
|
* principal no matter where it's being loaded from.
|
||||||
|
* @param [out] aSheet the loaded, complete sheet.
|
||||||
|
*
|
||||||
|
* 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.
|
||||||
|
*/
|
||||||
|
nsresult LoadSheetSync(nsIURI* aURL, PRBool aEnableUnsafeRules,
|
||||||
|
PRBool aUseSystemPrincipal,
|
||||||
|
nsICSSStyleSheet** aSheet);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* As above, but aUseSystemPrincipal and aEnableUnsafeRules are assumed false.
|
||||||
|
*/
|
||||||
|
nsresult LoadSheetSync(nsIURI* aURL, nsICSSStyleSheet** aSheet) {
|
||||||
|
return LoadSheetSync(aURL, PR_FALSE, 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 aCharset the encoding to use for converting the sheet data
|
||||||
|
* from bytes to Unicode. May be empty to indicate that the
|
||||||
|
* charset of the CSSLoader's document should be used. This
|
||||||
|
* is only used if neither the network transport nor the
|
||||||
|
* sheet itself indicate an encoding.
|
||||||
|
* @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.
|
||||||
|
*/
|
||||||
|
nsresult LoadSheet(nsIURI* aURL,
|
||||||
|
nsIPrincipal* aOriginPrincipal,
|
||||||
|
const nsCString& aCharset,
|
||||||
|
nsICSSLoaderObserver* aObserver,
|
||||||
|
nsICSSStyleSheet** aSheet);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Same as above, to be used when the caller doesn't care about the
|
||||||
|
* not-yet-loaded sheet.
|
||||||
|
*/
|
||||||
|
nsresult LoadSheet(nsIURI* aURL,
|
||||||
|
nsIPrincipal* aOriginPrincipal,
|
||||||
|
const nsCString& aCharset,
|
||||||
|
nsICSSLoaderObserver* aObserver);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Stop loading all sheets. All nsICSSLoaderObservers involved will be
|
||||||
|
* notified with NS_BINDING_ABORTED as the status, possibly synchronously.
|
||||||
|
*/
|
||||||
|
nsresult Stop(void);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Stop loading one sheet. The nsICSSLoaderObserver involved will be
|
||||||
|
* notified with NS_BINDING_ABORTED as the status, possibly synchronously.
|
||||||
|
*/
|
||||||
|
nsresult StopLoadingSheet(nsIURI* aURL);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 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.
|
||||||
|
*/
|
||||||
|
PRBool GetEnabled() { return mEnabled; }
|
||||||
|
void SetEnabled(PRBool aEnabled) { mEnabled = aEnabled; }
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Return true if this loader has pending loads (ones that would send
|
||||||
|
* notifications to an nsICSSLoaderObserver attached to this loader).
|
||||||
|
* 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.
|
||||||
|
*/
|
||||||
|
PRBool HasPendingLoads();
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Add an observer to this loader. 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 loader holds a reference to the observer.
|
||||||
|
*
|
||||||
|
* aObserver must not be null.
|
||||||
|
*/
|
||||||
|
nsresult AddObserver(nsICSSLoaderObserver* aObserver);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Remove an observer added via AddObserver.
|
||||||
|
*/
|
||||||
|
void RemoveObserver(nsICSSLoaderObserver* aObserver);
|
||||||
|
|
||||||
|
// These interfaces are public only for the benefit of static functions
|
||||||
|
// within nsCSSLoader.cpp.
|
||||||
|
|
||||||
|
// IsAlternate can change our currently selected style set if none
|
||||||
|
// is selected and aHasAlternateRel is false.
|
||||||
|
PRBool IsAlternate(const nsAString& aTitle, PRBool aHasAlternateRel);
|
||||||
|
|
||||||
|
typedef nsTArray<nsRefPtr<SheetLoadData> > LoadDataArray;
|
||||||
|
|
||||||
|
private:
|
||||||
|
friend class SheetLoadData;
|
||||||
|
|
||||||
|
// Note: null aSourcePrincipal indicates that the content policy and
|
||||||
|
// CheckLoadURI checks should be skipped.
|
||||||
|
nsresult CheckLoadAllowed(nsIPrincipal* aSourcePrincipal,
|
||||||
|
nsIURI* aTargetURI,
|
||||||
|
nsISupports* aContext);
|
||||||
|
|
||||||
|
|
||||||
|
// For inline style, the aURI param is null, but the aLinkingContent
|
||||||
|
// must be non-null then. The loader principal must never be null
|
||||||
|
// if aURI is not null.
|
||||||
|
nsresult CreateSheet(nsIURI* aURI,
|
||||||
|
nsIContent* aLinkingContent,
|
||||||
|
nsIPrincipal* aLoaderPrincipal,
|
||||||
|
PRBool aSyncLoad,
|
||||||
|
StyleSheetState& aSheetState,
|
||||||
|
nsICSSStyleSheet** aSheet);
|
||||||
|
|
||||||
|
// Pass in either a media string or the nsMediaList from the
|
||||||
|
// CSSParser. Don't pass both.
|
||||||
|
// If aIsAlternate is non-null, this method will set *aIsAlternate to
|
||||||
|
// correspond to the sheet's enabled state (which it will set no matter what)
|
||||||
|
nsresult PrepareSheet(nsICSSStyleSheet* aSheet,
|
||||||
|
const nsAString& aTitle,
|
||||||
|
const nsAString& aMediaString,
|
||||||
|
nsMediaList* aMediaList,
|
||||||
|
PRBool aHasAlternateRel = PR_FALSE,
|
||||||
|
PRBool *aIsAlternate = nsnull);
|
||||||
|
|
||||||
|
nsresult InsertSheetInDoc(nsICSSStyleSheet* aSheet,
|
||||||
|
nsIContent* aLinkingContent,
|
||||||
|
nsIDocument* aDocument);
|
||||||
|
|
||||||
|
nsresult InsertChildSheet(nsICSSStyleSheet* aSheet,
|
||||||
|
nsICSSStyleSheet* aParentSheet,
|
||||||
|
nsICSSImportRule* aParentRule);
|
||||||
|
|
||||||
|
nsresult InternalLoadNonDocumentSheet(nsIURI* aURL,
|
||||||
|
PRBool aAllowUnsafeRules,
|
||||||
|
PRBool aUseSystemPrincipal,
|
||||||
|
nsIPrincipal* aOriginPrincipal,
|
||||||
|
const nsCString& aCharset,
|
||||||
|
nsICSSStyleSheet** aSheet,
|
||||||
|
nsICSSLoaderObserver* aObserver);
|
||||||
|
|
||||||
|
// Post a load event for aObserver to be notified about aSheet. The
|
||||||
|
// notification will be sent with status NS_OK unless the load event is
|
||||||
|
// canceled at some point (in which case it will be sent with
|
||||||
|
// NS_BINDING_ABORTED). aWasAlternate indicates the state when the load was
|
||||||
|
// initiated, not the state at some later time. aURI should be the URI the
|
||||||
|
// sheet was loaded from (may be null for inline sheets).
|
||||||
|
nsresult PostLoadEvent(nsIURI* aURI,
|
||||||
|
nsICSSStyleSheet* aSheet,
|
||||||
|
nsICSSLoaderObserver* aObserver,
|
||||||
|
PRBool aWasAlternate);
|
||||||
|
|
||||||
|
// Start the loads of all the sheets in mPendingDatas
|
||||||
|
void StartAlternateLoads();
|
||||||
|
|
||||||
|
// Handle an event posted by PostLoadEvent
|
||||||
|
void HandleLoadEvent(SheetLoadData* aEvent);
|
||||||
|
|
||||||
|
// Note: LoadSheet is responsible for releasing aLoadData and setting the
|
||||||
|
// sheet to complete on failure.
|
||||||
|
nsresult LoadSheet(SheetLoadData* aLoadData, StyleSheetState aSheetState);
|
||||||
|
|
||||||
|
// Parse the stylesheet in aLoadData. The sheet data comes from aStream.
|
||||||
|
// Set aCompleted to true if the parse finished, false otherwise (e.g. if the
|
||||||
|
// sheet had an @import). If aCompleted is true when this returns, then
|
||||||
|
// ParseSheet also called SheetComplete on aLoadData
|
||||||
|
nsresult ParseSheet(nsIUnicharInputStream* aStream,
|
||||||
|
SheetLoadData* aLoadData,
|
||||||
|
PRBool& aCompleted);
|
||||||
|
|
||||||
|
// The load of the sheet in aLoadData is done, one way or another. Do final
|
||||||
|
// cleanup, including releasing aLoadData.
|
||||||
|
void SheetComplete(SheetLoadData* aLoadData, nsresult aStatus);
|
||||||
|
|
||||||
|
// The guts of SheetComplete. This may be called recursively on parent datas
|
||||||
|
// or datas that had glommed on to a single load. The array is there so load
|
||||||
|
// datas whose observers need to be notified can be added to it.
|
||||||
|
void DoSheetComplete(SheetLoadData* aLoadData, nsresult aStatus,
|
||||||
|
LoadDataArray& aDatasToNotify);
|
||||||
|
|
||||||
|
nsInterfaceHashtable<URIAndPrincipalHashKey, nsICSSStyleSheet>
|
||||||
|
mCompleteSheets;
|
||||||
|
nsDataHashtable<URIAndPrincipalHashKey, SheetLoadData*>
|
||||||
|
mLoadingDatas; // weak refs
|
||||||
|
nsDataHashtable<URIAndPrincipalHashKey, SheetLoadData*>
|
||||||
|
mPendingDatas; // weak refs
|
||||||
|
|
||||||
|
// We're not likely to have many levels of @import... But likely to have
|
||||||
|
// some. Allocate some storage, what the hell.
|
||||||
|
nsAutoTArray<SheetLoadData*, 8> mParsingDatas;
|
||||||
|
|
||||||
|
// The array of posted stylesheet loaded events (SheetLoadDatas) we have.
|
||||||
|
// Note that these are rare.
|
||||||
|
LoadDataArray mPostedEvents;
|
||||||
|
|
||||||
|
// Our array of "global" observers
|
||||||
|
nsTObserverArray<nsCOMPtr<nsICSSLoaderObserver> > mObservers;
|
||||||
|
|
||||||
|
// the load data needs access to the document...
|
||||||
|
nsIDocument* mDocument; // the document we live for
|
||||||
|
|
||||||
|
// Refcounting
|
||||||
|
nsAutoRefCnt mRefCnt;
|
||||||
|
NS_DECL_OWNINGTHREAD
|
||||||
|
|
||||||
|
// Number of datas still waiting to be notified on if we're notifying on a
|
||||||
|
// whole bunch at once (e.g. in one of the stop methods). This is used to
|
||||||
|
// make sure that HasPendingLoads() won't return false until we're notifying
|
||||||
|
// on the last data we're working with.
|
||||||
|
PRUint32 mDatasToNotifyOn;
|
||||||
|
|
||||||
|
nsCompatibility mCompatMode;
|
||||||
|
nsString mPreferredSheet; // title of preferred sheet
|
||||||
|
|
||||||
|
PRPackedBool mEnabled; // is enabled to load new styles
|
||||||
|
|
||||||
|
#ifdef DEBUG
|
||||||
|
PRPackedBool mSyncCallback;
|
||||||
|
#endif
|
||||||
|
};
|
||||||
|
|
||||||
|
} // namespace css
|
||||||
|
} // namespace mozilla
|
||||||
|
|
||||||
|
#endif /* nsICSSLoader_h___ */
|
||||||
|
|
@ -50,7 +50,7 @@
|
||||||
#include "nsCSSProps.h"
|
#include "nsCSSProps.h"
|
||||||
#include "nsCSSKeywords.h"
|
#include "nsCSSKeywords.h"
|
||||||
#include "nsCSSScanner.h"
|
#include "nsCSSScanner.h"
|
||||||
#include "nsICSSLoader.h"
|
#include "nsCSSLoader.h"
|
||||||
#include "nsICSSStyleRule.h"
|
#include "nsICSSStyleRule.h"
|
||||||
#include "nsICSSImportRule.h"
|
#include "nsICSSImportRule.h"
|
||||||
#include "nsCSSRules.h"
|
#include "nsCSSRules.h"
|
||||||
|
|
@ -176,7 +176,7 @@ public:
|
||||||
nsresult SetSVGMode(PRBool aSVGMode);
|
nsresult SetSVGMode(PRBool aSVGMode);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
nsresult SetChildLoader(nsICSSLoader* aChildLoader);
|
nsresult SetChildLoader(mozilla::css::Loader* aChildLoader);
|
||||||
|
|
||||||
// Clears everything set by the above Set*() functions.
|
// Clears everything set by the above Set*() functions.
|
||||||
void Reset();
|
void Reset();
|
||||||
|
|
@ -619,7 +619,7 @@ protected:
|
||||||
nsCOMPtr<nsICSSStyleSheet> mSheet;
|
nsCOMPtr<nsICSSStyleSheet> mSheet;
|
||||||
|
|
||||||
// Used for @import rules
|
// Used for @import rules
|
||||||
nsICSSLoader* mChildLoader; // not ref counted, it owns us
|
mozilla::css::Loader* mChildLoader; // not ref counted, it owns us
|
||||||
|
|
||||||
// Sheet section we're in. This is used to enforce correct ordering of the
|
// Sheet section we're in. This is used to enforce correct ordering of the
|
||||||
// various rule types (eg the fact that a @charset rule must come before
|
// various rule types (eg the fact that a @charset rule must come before
|
||||||
|
|
@ -793,7 +793,7 @@ CSSParserImpl::SetSVGMode(PRBool aSVGMode)
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
nsresult
|
nsresult
|
||||||
CSSParserImpl::SetChildLoader(nsICSSLoader* aChildLoader)
|
CSSParserImpl::SetChildLoader(mozilla::css::Loader* aChildLoader)
|
||||||
{
|
{
|
||||||
mChildLoader = aChildLoader; // not ref counted, it owns us
|
mChildLoader = aChildLoader; // not ref counted, it owns us
|
||||||
return NS_OK;
|
return NS_OK;
|
||||||
|
|
@ -9137,7 +9137,7 @@ CSSParserImpl::ParseMarker()
|
||||||
|
|
||||||
static CSSParserImpl* gFreeList = nsnull;
|
static CSSParserImpl* gFreeList = nsnull;
|
||||||
|
|
||||||
nsCSSParser::nsCSSParser(nsICSSLoader* aLoader,
|
nsCSSParser::nsCSSParser(mozilla::css::Loader* aLoader,
|
||||||
nsICSSStyleSheet* aSheet)
|
nsICSSStyleSheet* aSheet)
|
||||||
{
|
{
|
||||||
CSSParserImpl *impl = gFreeList;
|
CSSParserImpl *impl = gFreeList;
|
||||||
|
|
@ -9207,7 +9207,7 @@ nsCSSParser::SetSVGMode(PRBool aSVGMode)
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
nsresult
|
nsresult
|
||||||
nsCSSParser::SetChildLoader(nsICSSLoader* aChildLoader)
|
nsCSSParser::SetChildLoader(mozilla::css::Loader* aChildLoader)
|
||||||
{
|
{
|
||||||
return static_cast<CSSParserImpl*>(mImpl)->
|
return static_cast<CSSParserImpl*>(mImpl)->
|
||||||
SetChildLoader(aChildLoader);
|
SetChildLoader(aChildLoader);
|
||||||
|
|
|
||||||
|
|
@ -45,23 +45,27 @@
|
||||||
#include "nsColor.h"
|
#include "nsColor.h"
|
||||||
#include "nsCOMArray.h"
|
#include "nsCOMArray.h"
|
||||||
|
|
||||||
class nsICSSStyleRule;
|
|
||||||
class nsICSSLoader;
|
|
||||||
class nsICSSStyleSheet;
|
|
||||||
class nsIUnicharInputStream;
|
|
||||||
class nsIURI;
|
|
||||||
class nsCSSDeclaration;
|
|
||||||
class nsICSSLoader;
|
|
||||||
class nsICSSRule;
|
class nsICSSRule;
|
||||||
class nsMediaList;
|
class nsICSSStyleRule;
|
||||||
|
class nsICSSStyleSheet;
|
||||||
class nsIPrincipal;
|
class nsIPrincipal;
|
||||||
|
class nsIURI;
|
||||||
|
class nsIUnicharInputStream;
|
||||||
|
class nsCSSDeclaration;
|
||||||
struct nsCSSSelectorList;
|
struct nsCSSSelectorList;
|
||||||
|
class nsMediaList;
|
||||||
|
|
||||||
|
namespace mozilla {
|
||||||
|
namespace css {
|
||||||
|
class Loader;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// Interface to the css parser.
|
// Interface to the css parser.
|
||||||
|
|
||||||
class NS_STACK_CLASS nsCSSParser {
|
class NS_STACK_CLASS nsCSSParser {
|
||||||
public:
|
public:
|
||||||
NS_HIDDEN nsCSSParser(nsICSSLoader* aLoader = nsnull,
|
NS_HIDDEN nsCSSParser(mozilla::css::Loader* aLoader = nsnull,
|
||||||
nsICSSStyleSheet* aSheet = nsnull);
|
nsICSSStyleSheet* aSheet = nsnull);
|
||||||
NS_HIDDEN ~nsCSSParser();
|
NS_HIDDEN ~nsCSSParser();
|
||||||
|
|
||||||
|
|
@ -92,7 +96,7 @@ public:
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
// Set loader to use for child sheets
|
// Set loader to use for child sheets
|
||||||
NS_HIDDEN_(nsresult) SetChildLoader(nsICSSLoader* aChildLoader);
|
NS_HIDDEN_(nsresult) SetChildLoader(mozilla::css::Loader* aChildLoader);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Parse aInput into the stylesheet that was previously set by calling
|
* Parse aInput into the stylesheet that was previously set by calling
|
||||||
|
|
@ -108,7 +112,7 @@ public:
|
||||||
* the principal of the sheet passed to SetStyleSheet.
|
* the principal of the sheet passed to SetStyleSheet.
|
||||||
* @param aLineNumber the line number of the first line of the sheet.
|
* @param aLineNumber the line number of the first line of the sheet.
|
||||||
* @param aAllowUnsafeRules see aEnableUnsafeRules in
|
* @param aAllowUnsafeRules see aEnableUnsafeRules in
|
||||||
* nsICSSLoader::LoadSheetSync
|
* mozilla::css::Loader::LoadSheetSync
|
||||||
*/
|
*/
|
||||||
NS_HIDDEN_(nsresult) Parse(nsIUnicharInputStream* aInput,
|
NS_HIDDEN_(nsresult) Parse(nsIUnicharInputStream* aInput,
|
||||||
nsIURI* aSheetURL,
|
nsIURI* aSheetURL,
|
||||||
|
|
|
||||||
|
|
@ -50,7 +50,7 @@
|
||||||
#include "nsICSSGroupRule.h"
|
#include "nsICSSGroupRule.h"
|
||||||
#include "nsCSSDeclaration.h"
|
#include "nsCSSDeclaration.h"
|
||||||
#include "nsICSSStyleSheet.h"
|
#include "nsICSSStyleSheet.h"
|
||||||
#include "nsICSSLoader.h"
|
#include "nsCSSLoader.h"
|
||||||
#include "nsIURL.h"
|
#include "nsIURL.h"
|
||||||
#include "nsPresContext.h"
|
#include "nsPresContext.h"
|
||||||
#include "nsIDocument.h"
|
#include "nsIDocument.h"
|
||||||
|
|
@ -912,7 +912,7 @@ public:
|
||||||
virtual nsresult GetCSSParsingEnvironment(nsIURI** aSheetURI,
|
virtual nsresult GetCSSParsingEnvironment(nsIURI** aSheetURI,
|
||||||
nsIURI** aBaseURI,
|
nsIURI** aBaseURI,
|
||||||
nsIPrincipal** aSheetPrincipal,
|
nsIPrincipal** aSheetPrincipal,
|
||||||
nsICSSLoader** aCSSLoader);
|
mozilla::css::Loader** aCSSLoader);
|
||||||
virtual nsresult DeclarationChanged();
|
virtual nsresult DeclarationChanged();
|
||||||
virtual nsIDocument* DocToUpdate();
|
virtual nsIDocument* DocToUpdate();
|
||||||
|
|
||||||
|
|
@ -1019,7 +1019,7 @@ nsresult
|
||||||
DOMCSSDeclarationImpl::GetCSSParsingEnvironment(nsIURI** aSheetURI,
|
DOMCSSDeclarationImpl::GetCSSParsingEnvironment(nsIURI** aSheetURI,
|
||||||
nsIURI** aBaseURI,
|
nsIURI** aBaseURI,
|
||||||
nsIPrincipal** aSheetPrincipal,
|
nsIPrincipal** aSheetPrincipal,
|
||||||
nsICSSLoader** aCSSLoader)
|
mozilla::css::Loader** aCSSLoader)
|
||||||
{
|
{
|
||||||
// null out the out params since some of them may not get initialized below
|
// null out the out params since some of them may not get initialized below
|
||||||
*aSheetURI = nsnull;
|
*aSheetURI = nsnull;
|
||||||
|
|
|
||||||
|
|
@ -66,7 +66,7 @@
|
||||||
#include "nsIDOMNode.h"
|
#include "nsIDOMNode.h"
|
||||||
#include "nsDOMError.h"
|
#include "nsDOMError.h"
|
||||||
#include "nsCSSParser.h"
|
#include "nsCSSParser.h"
|
||||||
#include "nsICSSLoader.h"
|
#include "nsCSSLoader.h"
|
||||||
#include "nsICSSLoaderObserver.h"
|
#include "nsICSSLoaderObserver.h"
|
||||||
#include "nsINameSpaceManager.h"
|
#include "nsINameSpaceManager.h"
|
||||||
#include "nsXMLNameSpaceMap.h"
|
#include "nsXMLNameSpaceMap.h"
|
||||||
|
|
@ -78,6 +78,8 @@
|
||||||
#include "nsCSSDeclaration.h"
|
#include "nsCSSDeclaration.h"
|
||||||
#include "nsRuleNode.h"
|
#include "nsRuleNode.h"
|
||||||
|
|
||||||
|
namespace css = mozilla::css;
|
||||||
|
|
||||||
// -------------------------------
|
// -------------------------------
|
||||||
// Style Rule List for the DOM
|
// Style Rule List for the DOM
|
||||||
//
|
//
|
||||||
|
|
@ -1843,7 +1845,7 @@ nsCSSStyleSheet::InsertRuleInternal(const nsAString& aRule,
|
||||||
|
|
||||||
// Hold strong ref to the CSSLoader in case the document update
|
// Hold strong ref to the CSSLoader in case the document update
|
||||||
// kills the document
|
// kills the document
|
||||||
nsCOMPtr<nsICSSLoader> loader;
|
nsRefPtr<css::Loader> loader;
|
||||||
if (mDocument) {
|
if (mDocument) {
|
||||||
loader = mDocument->CSSLoader();
|
loader = mDocument->CSSLoader();
|
||||||
NS_ASSERTION(loader, "Document with no CSS loader!");
|
NS_ASSERTION(loader, "Document with no CSS loader!");
|
||||||
|
|
@ -2062,10 +2064,10 @@ nsCSSStyleSheet::InsertRuleIntoGroup(const nsAString & aRule,
|
||||||
// Nothing to do here
|
// Nothing to do here
|
||||||
return NS_OK;
|
return NS_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Hold strong ref to the CSSLoader in case the document update
|
// Hold strong ref to the CSSLoader in case the document update
|
||||||
// kills the document
|
// kills the document
|
||||||
nsCOMPtr<nsICSSLoader> loader;
|
nsRefPtr<css::Loader> loader;
|
||||||
if (mDocument) {
|
if (mDocument) {
|
||||||
loader = mDocument->CSSLoader();
|
loader = mDocument->CSSLoader();
|
||||||
NS_ASSERTION(loader, "Document with no CSS loader!");
|
NS_ASSERTION(loader, "Document with no CSS loader!");
|
||||||
|
|
|
||||||
|
|
@ -42,7 +42,7 @@
|
||||||
#include "nsIDocument.h"
|
#include "nsIDocument.h"
|
||||||
#include "nsIDOMMutationEvent.h"
|
#include "nsIDOMMutationEvent.h"
|
||||||
#include "nsICSSStyleRule.h"
|
#include "nsICSSStyleRule.h"
|
||||||
#include "nsICSSLoader.h"
|
#include "nsCSSLoader.h"
|
||||||
#include "nsIURI.h"
|
#include "nsIURI.h"
|
||||||
#include "nsINameSpaceManager.h"
|
#include "nsINameSpaceManager.h"
|
||||||
#include "nsStyleConsts.h"
|
#include "nsStyleConsts.h"
|
||||||
|
|
@ -182,7 +182,7 @@ nsresult
|
||||||
nsDOMCSSAttributeDeclaration::GetCSSParsingEnvironment(nsIURI** aSheetURI,
|
nsDOMCSSAttributeDeclaration::GetCSSParsingEnvironment(nsIURI** aSheetURI,
|
||||||
nsIURI** aBaseURI,
|
nsIURI** aBaseURI,
|
||||||
nsIPrincipal** aSheetPrincipal,
|
nsIPrincipal** aSheetPrincipal,
|
||||||
nsICSSLoader** aCSSLoader)
|
mozilla::css::Loader** aCSSLoader)
|
||||||
{
|
{
|
||||||
NS_ASSERTION(mContent, "Something is severely broken -- there should be an nsIContent here!");
|
NS_ASSERTION(mContent, "Something is severely broken -- there should be an nsIContent here!");
|
||||||
// null out the out params since some of them may not get initialized below
|
// null out the out params since some of them may not get initialized below
|
||||||
|
|
|
||||||
|
|
@ -46,7 +46,11 @@
|
||||||
#include "nsWrapperCache.h"
|
#include "nsWrapperCache.h"
|
||||||
#include "nsIContent.h"
|
#include "nsIContent.h"
|
||||||
|
|
||||||
class nsICSSLoader;
|
namespace mozilla {
|
||||||
|
namespace css {
|
||||||
|
class Loader;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
class nsDOMCSSAttributeDeclaration : public nsDOMCSSDeclaration,
|
class nsDOMCSSAttributeDeclaration : public nsDOMCSSDeclaration,
|
||||||
public nsWrapperCache
|
public nsWrapperCache
|
||||||
|
|
@ -69,7 +73,7 @@ public:
|
||||||
virtual nsresult GetCSSParsingEnvironment(nsIURI** aSheetURI,
|
virtual nsresult GetCSSParsingEnvironment(nsIURI** aSheetURI,
|
||||||
nsIURI** aBaseURI,
|
nsIURI** aBaseURI,
|
||||||
nsIPrincipal** aSheetPrincipal,
|
nsIPrincipal** aSheetPrincipal,
|
||||||
nsICSSLoader** aCSSLoader);
|
mozilla::css::Loader** aCSSLoader);
|
||||||
NS_IMETHOD GetParentRule(nsIDOMCSSRule **aParent);
|
NS_IMETHOD GetParentRule(nsIDOMCSSRule **aParent);
|
||||||
|
|
||||||
virtual nsINode *GetParentObject()
|
virtual nsINode *GetParentObject()
|
||||||
|
|
|
||||||
|
|
@ -41,7 +41,7 @@
|
||||||
#include "nsDOMCSSDeclaration.h"
|
#include "nsDOMCSSDeclaration.h"
|
||||||
#include "nsIDOMCSSRule.h"
|
#include "nsIDOMCSSRule.h"
|
||||||
#include "nsCSSParser.h"
|
#include "nsCSSParser.h"
|
||||||
#include "nsICSSLoader.h"
|
#include "nsCSSLoader.h"
|
||||||
#include "nsIStyleRule.h"
|
#include "nsIStyleRule.h"
|
||||||
#include "nsCSSDeclaration.h"
|
#include "nsCSSDeclaration.h"
|
||||||
#include "nsCSSProps.h"
|
#include "nsCSSProps.h"
|
||||||
|
|
@ -53,6 +53,7 @@
|
||||||
#include "nsContentUtils.h"
|
#include "nsContentUtils.h"
|
||||||
#include "mozAutoDocUpdate.h"
|
#include "mozAutoDocUpdate.h"
|
||||||
|
|
||||||
|
namespace css = mozilla::css;
|
||||||
|
|
||||||
nsDOMCSSDeclaration::~nsDOMCSSDeclaration()
|
nsDOMCSSDeclaration::~nsDOMCSSDeclaration()
|
||||||
{
|
{
|
||||||
|
|
@ -252,7 +253,7 @@ nsDOMCSSDeclaration::ParsePropertyValue(const nsCSSProperty aPropID,
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
nsCOMPtr<nsICSSLoader> cssLoader;
|
nsRefPtr<css::Loader> cssLoader;
|
||||||
nsCOMPtr<nsIURI> baseURI, sheetURI;
|
nsCOMPtr<nsIURI> baseURI, sheetURI;
|
||||||
nsCOMPtr<nsIPrincipal> sheetPrincipal;
|
nsCOMPtr<nsIPrincipal> sheetPrincipal;
|
||||||
|
|
||||||
|
|
@ -293,7 +294,7 @@ nsDOMCSSDeclaration::ParseDeclaration(const nsAString& aDecl,
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
nsCOMPtr<nsICSSLoader> cssLoader;
|
nsRefPtr<css::Loader> cssLoader;
|
||||||
nsCOMPtr<nsIURI> baseURI, sheetURI;
|
nsCOMPtr<nsIURI> baseURI, sheetURI;
|
||||||
nsCOMPtr<nsIPrincipal> sheetPrincipal;
|
nsCOMPtr<nsIPrincipal> sheetPrincipal;
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -47,11 +47,16 @@
|
||||||
|
|
||||||
class nsCSSDeclaration;
|
class nsCSSDeclaration;
|
||||||
class nsCSSParser;
|
class nsCSSParser;
|
||||||
class nsICSSLoader;
|
|
||||||
class nsIURI;
|
class nsIURI;
|
||||||
class nsIPrincipal;
|
class nsIPrincipal;
|
||||||
class nsIDocument;
|
class nsIDocument;
|
||||||
|
|
||||||
|
namespace mozilla {
|
||||||
|
namespace css {
|
||||||
|
class Loader;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
class CSS2PropertiesTearoff : public nsIDOMNSCSS2Properties
|
class CSS2PropertiesTearoff : public nsIDOMNSCSS2Properties
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
|
|
@ -114,7 +119,7 @@ protected:
|
||||||
virtual nsresult GetCSSParsingEnvironment(nsIURI** aSheetURI,
|
virtual nsresult GetCSSParsingEnvironment(nsIURI** aSheetURI,
|
||||||
nsIURI** aBaseURI,
|
nsIURI** aBaseURI,
|
||||||
nsIPrincipal** aSheetPrincipal,
|
nsIPrincipal** aSheetPrincipal,
|
||||||
nsICSSLoader** aCSSLoader) = 0;
|
mozilla::css::Loader** aCSSLoader) = 0;
|
||||||
|
|
||||||
nsresult ParsePropertyValue(const nsCSSProperty aPropID,
|
nsresult ParsePropertyValue(const nsCSSProperty aPropID,
|
||||||
const nsAString& aPropValue);
|
const nsAString& aPropValue);
|
||||||
|
|
|
||||||
|
|
@ -1,291 +0,0 @@
|
||||||
/* -*- 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 nsCSSParser;
|
|
||||||
class nsICSSStyleSheet;
|
|
||||||
class nsPresContext;
|
|
||||||
class nsIContent;
|
|
||||||
class nsIDocument;
|
|
||||||
class nsIUnicharInputStream;
|
|
||||||
class nsICSSLoaderObserver;
|
|
||||||
class nsMediaList;
|
|
||||||
class nsICSSImportRule;
|
|
||||||
class nsIPrincipal;
|
|
||||||
|
|
||||||
// IID for the nsICSSLoader interface
|
|
||||||
// 4e12812e-490c-4cec-b0f4-75c8b79779ba
|
|
||||||
#define NS_ICSS_LOADER_IID \
|
|
||||||
{ 0x4e12812e, 0x490c, 0x4cec, \
|
|
||||||
{ 0xb0, 0xf4, 0x75, 0xc8, 0xb7, 0x97, 0x79, 0xba } }
|
|
||||||
|
|
||||||
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 SetCompatibilityMode(nsCompatibility aCompatMode) = 0;
|
|
||||||
NS_IMETHOD_(nsCompatibility) GetCompatibilityMode() = 0;
|
|
||||||
NS_IMETHOD SetPreferredSheet(const nsAString& aTitle) = 0;
|
|
||||||
NS_IMETHOD GetPreferredSheet(nsAString& aTitle) = 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 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.
|
|
||||||
* @param aUseSystemPrincipal if true, give the resulting sheet the system
|
|
||||||
* principal no matter where it's being loaded from.
|
|
||||||
* @param [out] aSheet the loaded, complete sheet.
|
|
||||||
*
|
|
||||||
* 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,
|
|
||||||
PRBool aUseSystemPrincipal,
|
|
||||||
nsICSSStyleSheet** aSheet) = 0;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* As above, but aUseSystemPrincipal and aEnableUnsafeRules are assumed false.
|
|
||||||
*/
|
|
||||||
nsresult LoadSheetSync(nsIURI* aURL, nsICSSStyleSheet** aSheet) {
|
|
||||||
return LoadSheetSync(aURL, PR_FALSE, 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 aCharset the encoding to use for converting the sheet data
|
|
||||||
* from bytes to Unicode. May be empty to indicate that the
|
|
||||||
* charset of the CSSLoader's document should be used. This
|
|
||||||
* is only used if neither the network transport nor the
|
|
||||||
* sheet itself indicate an encoding.
|
|
||||||
* @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,
|
|
||||||
const nsCString& aCharset,
|
|
||||||
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,
|
|
||||||
const nsCString& aCharset,
|
|
||||||
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___ */
|
|
||||||
|
|
@ -38,7 +38,7 @@
|
||||||
#include "nsLayoutStylesheetCache.h"
|
#include "nsLayoutStylesheetCache.h"
|
||||||
|
|
||||||
#include "nsAppDirectoryServiceDefs.h"
|
#include "nsAppDirectoryServiceDefs.h"
|
||||||
#include "nsICSSLoader.h"
|
#include "nsCSSLoader.h"
|
||||||
#include "nsIFile.h"
|
#include "nsIFile.h"
|
||||||
#include "nsLayoutCID.h"
|
#include "nsLayoutCID.h"
|
||||||
#include "nsNetUtil.h"
|
#include "nsNetUtil.h"
|
||||||
|
|
@ -254,7 +254,8 @@ nsLayoutStylesheetCache::LoadSheetFile(nsIFile* aFile, nsCOMPtr<nsICSSStyleSheet
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
nsLayoutStylesheetCache::LoadSheet(nsIURI* aURI, nsCOMPtr<nsICSSStyleSheet> &aSheet,
|
nsLayoutStylesheetCache::LoadSheet(nsIURI* aURI,
|
||||||
|
nsCOMPtr<nsICSSStyleSheet> &aSheet,
|
||||||
PRBool aEnableUnsafeRules)
|
PRBool aEnableUnsafeRules)
|
||||||
{
|
{
|
||||||
if (!aURI) {
|
if (!aURI) {
|
||||||
|
|
@ -262,17 +263,19 @@ nsLayoutStylesheetCache::LoadSheet(nsIURI* aURI, nsCOMPtr<nsICSSStyleSheet> &aSh
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!gCSSLoader)
|
if (!gCSSLoader) {
|
||||||
NS_NewCSSLoader(&gCSSLoader);
|
gCSSLoader = new mozilla::css::Loader();
|
||||||
|
NS_IF_ADDREF(gCSSLoader);
|
||||||
|
}
|
||||||
|
|
||||||
if (gCSSLoader) {
|
if (gCSSLoader) {
|
||||||
gCSSLoader->LoadSheetSync(aURI, aEnableUnsafeRules, PR_TRUE,
|
gCSSLoader->LoadSheetSync(aURI, aEnableUnsafeRules, PR_TRUE,
|
||||||
getter_AddRefs(aSheet));
|
getter_AddRefs(aSheet));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
nsLayoutStylesheetCache*
|
nsLayoutStylesheetCache*
|
||||||
nsLayoutStylesheetCache::gStyleCache = nsnull;
|
nsLayoutStylesheetCache::gStyleCache = nsnull;
|
||||||
|
|
||||||
nsICSSLoader*
|
mozilla::css::Loader*
|
||||||
nsLayoutStylesheetCache::gCSSLoader = nsnull;
|
nsLayoutStylesheetCache::gCSSLoader = nsnull;
|
||||||
|
|
|
||||||
|
|
@ -43,7 +43,12 @@
|
||||||
#include "nsIObserver.h"
|
#include "nsIObserver.h"
|
||||||
|
|
||||||
class nsIFile;
|
class nsIFile;
|
||||||
class nsICSSLoader;
|
|
||||||
|
namespace mozilla {
|
||||||
|
namespace css {
|
||||||
|
class Loader;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
class nsLayoutStylesheetCache
|
class nsLayoutStylesheetCache
|
||||||
: public nsIObserver
|
: public nsIObserver
|
||||||
|
|
@ -71,7 +76,7 @@ private:
|
||||||
PRBool aEnableUnsafeRules);
|
PRBool aEnableUnsafeRules);
|
||||||
|
|
||||||
static nsLayoutStylesheetCache* gStyleCache;
|
static nsLayoutStylesheetCache* gStyleCache;
|
||||||
static nsICSSLoader* gCSSLoader;
|
static mozilla::css::Loader* gCSSLoader;
|
||||||
nsCOMPtr<nsICSSStyleSheet> mScrollbarsSheet;
|
nsCOMPtr<nsICSSStyleSheet> mScrollbarsSheet;
|
||||||
nsCOMPtr<nsICSSStyleSheet> mFormsSheet;
|
nsCOMPtr<nsICSSStyleSheet> mFormsSheet;
|
||||||
nsCOMPtr<nsICSSStyleSheet> mUserContentSheet;
|
nsCOMPtr<nsICSSStyleSheet> mUserContentSheet;
|
||||||
|
|
|
||||||
|
|
@ -48,7 +48,6 @@
|
||||||
#include "nsStyleSet.h"
|
#include "nsStyleSet.h"
|
||||||
#include "nsComputedDOMStyle.h"
|
#include "nsComputedDOMStyle.h"
|
||||||
#include "nsCSSParser.h"
|
#include "nsCSSParser.h"
|
||||||
#include "nsICSSLoader.h"
|
|
||||||
#include "nsCSSDataBlock.h"
|
#include "nsCSSDataBlock.h"
|
||||||
#include "nsCSSDeclaration.h"
|
#include "nsCSSDeclaration.h"
|
||||||
#include "nsCSSStruct.h"
|
#include "nsCSSStruct.h"
|
||||||
|
|
|
||||||
|
|
@ -51,11 +51,9 @@
|
||||||
#include "nsNetUtil.h"
|
#include "nsNetUtil.h"
|
||||||
|
|
||||||
#include "nsContentCID.h"
|
#include "nsContentCID.h"
|
||||||
#include "nsICSSLoader.h"
|
#include "nsCSSLoader.h"
|
||||||
#include "nsICSSStyleSheet.h"
|
#include "nsICSSStyleSheet.h"
|
||||||
|
|
||||||
static NS_DEFINE_CID(kCSSLoaderCID, NS_CSS_LOADER_CID);
|
|
||||||
|
|
||||||
static already_AddRefed<nsIURI>
|
static already_AddRefed<nsIURI>
|
||||||
FileToURI(const char *aFilename, nsresult *aRv = 0)
|
FileToURI(const char *aFilename, nsresult *aRv = 0)
|
||||||
{
|
{
|
||||||
|
|
@ -74,7 +72,7 @@ FileToURI(const char *aFilename, nsresult *aRv = 0)
|
||||||
static int
|
static int
|
||||||
ParseCSSFile(nsIURI *aSheetURI)
|
ParseCSSFile(nsIURI *aSheetURI)
|
||||||
{
|
{
|
||||||
nsCOMPtr<nsICSSLoader> loader(do_CreateInstance(kCSSLoaderCID));
|
nsRefPtr<mozilla::css::Loader> = new mozilla::css::Loader();
|
||||||
nsCOMPtr<nsICSSStyleSheet> sheet;
|
nsCOMPtr<nsICSSStyleSheet> sheet;
|
||||||
loader->LoadSheetSync(aSheetURI, getter_AddRefs(sheet));
|
loader->LoadSheetSync(aSheetURI, getter_AddRefs(sheet));
|
||||||
NS_ASSERTION(sheet, "sheet load failed");
|
NS_ASSERTION(sheet, "sheet load failed");
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue