From 6eb67e93bd6d9434757baeef36d044e4a35ebcfd Mon Sep 17 00:00:00 2001 From: "vidur%netscape.com" Date: Sat, 4 Dec 1999 01:27:14 +0000 Subject: [PATCH] For bug 17325: Added nsICSSLoaderObserver as a way to see when style sheets complete loading. r=pierre. git-svn-id: svn://10.0.0.236/trunk@55251 18797224-902f-48f8-a5cc-f745e15eee43 --- .../content/html/style/public/nsICSSLoader.h | 12 +- .../html/style/public/nsICSSLoaderObserver.h | 38 +++++++ .../content/html/style/src/nsCSSLoader.cpp | 103 +++++++++++------- mozilla/layout/html/style/public/MANIFEST | 1 + mozilla/layout/html/style/public/Makefile.in | 1 + mozilla/layout/html/style/public/makefile.win | 2 +- .../layout/html/style/public/nsICSSLoader.h | 12 +- .../html/style/public/nsICSSLoaderObserver.h | 38 +++++++ mozilla/layout/html/style/src/nsCSSLoader.cpp | 103 +++++++++++------- mozilla/layout/style/nsCSSLoader.cpp | 103 +++++++++++------- mozilla/layout/style/nsICSSLoader.h | 12 +- mozilla/layout/style/nsICSSLoaderObserver.h | 38 +++++++ 12 files changed, 321 insertions(+), 142 deletions(-) create mode 100644 mozilla/content/html/style/public/nsICSSLoaderObserver.h create mode 100644 mozilla/layout/html/style/public/nsICSSLoaderObserver.h create mode 100644 mozilla/layout/style/nsICSSLoaderObserver.h diff --git a/mozilla/content/html/style/public/nsICSSLoader.h b/mozilla/content/html/style/public/nsICSSLoader.h index 367b8777a8a..67f066ca555 100644 --- a/mozilla/content/html/style/public/nsICSSLoader.h +++ b/mozilla/content/html/style/public/nsICSSLoader.h @@ -35,12 +35,13 @@ class nsIContent; class nsIParser; class nsIDocument; class nsIUnicharInputStream; +class nsICSSLoaderObserver; // IID for the nsIStyleSheetLoader interface {a6cf9101-15b3-11d2-932e-00805f8add32} #define NS_ICSS_LOADER_IID \ {0xa6cf9101, 0x15b3, 0x11d2, {0x93, 0x2e, 0x00, 0x80, 0x5f, 0x8a, 0xdd, 0x32}} -typedef void (*nsCSSLoaderCallbackFunc)(nsICSSStyleSheet* aSheet, void *aData); +typedef void (*nsCSSLoaderCallbackFunc)(nsICSSStyleSheet* aSheet, void *aData, PRBool aDidNotify); class nsICSSLoader : public nsISupports { public: @@ -70,7 +71,8 @@ public: PRInt32 aDefaultNameSpaceID, PRInt32 aDocIndex, nsIParser* aParserToUnblock, - PRBool& aCompleted) = 0; + PRBool& aCompleted, + nsICSSLoaderObserver* aObserver) = 0; // Load a linked style sheet // - if aCompleted is PR_TRUE, the sheet is fully loaded, don't @@ -84,7 +86,8 @@ public: PRInt32 aDefaultNameSpaceID, PRInt32 aDocIndex, nsIParser* aParserToUnblock, - PRBool& aCompleted) = 0; + PRBool& aCompleted, + nsICSSLoaderObserver* aObserver) = 0; // Load a child style sheet (@import) NS_IMETHOD LoadChildSheet(nsICSSStyleSheet* aParentSheet, @@ -101,8 +104,7 @@ public: NS_IMETHOD LoadAgentSheet(nsIURI* aURL, nsICSSStyleSheet*& aSheet, PRBool& aCompleted, - nsCSSLoaderCallbackFunc aCallback, - void *aData) = 0; + nsICSSLoaderObserver* aObserver) = 0; }; extern NS_HTML nsresult diff --git a/mozilla/content/html/style/public/nsICSSLoaderObserver.h b/mozilla/content/html/style/public/nsICSSLoaderObserver.h new file mode 100644 index 00000000000..142c19ceffa --- /dev/null +++ b/mozilla/content/html/style/public/nsICSSLoaderObserver.h @@ -0,0 +1,38 @@ +/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- + * + * The contents of this file are subject to the Netscape Public + * License Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.mozilla.org/NPL/ + * + * Software distributed under the License is distributed on an "AS + * IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or + * implied. See the License for the specific language governing + * rights and limitations under the License. + * + * The Original Code is mozilla.org code. + * + * The Initial Developer of the Original Code is Netscape + * Communications Corporation. Portions created by Netscape are + * Copyright (C) 1999 Netscape Communications Corporation. All + * Rights Reserved. + * + * Contributor(s): + */ +#ifndef nsICSSLoaderObserver_h___ +#define nsICSSLoaderObserver_h___ + +#include "nsISupports.h" + +#define NS_ICSSLOADEROBSERVER_IID \ +{ 0xa6cf9116, 0x15b3, 0x11d2, \ +{0x93, 0x2e, 0x00, 0x80, 0x5f, 0x8a, 0xdd, 0x32} } + +class nsICSSLoaderObserver : public nsISupports { +public: + static const nsIID& GetIID() { static nsIID iid = NS_ICSSLOADEROBSERVER_IID; return iid; } + + NS_IMETHOD StyleSheetLoaded(nsICSSStyleSheet*aSheet, PRBool aNotify) = 0; +}; + +#endif // nsICSSLoaderObserver_h___ diff --git a/mozilla/content/html/style/src/nsCSSLoader.cpp b/mozilla/content/html/style/src/nsCSSLoader.cpp index 8377ee0abb5..68dd1d5de00 100644 --- a/mozilla/content/html/style/src/nsCSSLoader.cpp +++ b/mozilla/content/html/style/src/nsCSSLoader.cpp @@ -20,7 +20,7 @@ * Contributor(s): */ #include "nsICSSLoader.h" - +#include "nsICSSLoaderObserver.h" #include "nsICSSParser.h" #include "nsICSSStyleSheet.h" @@ -161,12 +161,13 @@ public: const nsString& aTitle, const nsString& aMedia, PRInt32 aDefaultNameSpaceID, nsIContent* aOwner, PRInt32 aDocIndex, - nsIParser* aParserToUnblock, PRBool aIsInline); + nsIParser* aParserToUnblock, PRBool aIsInline, + nsICSSLoaderObserver* aObserver); SheetLoadData(CSSLoaderImpl* aLoader, nsIURI* aURL, const nsString& aMedia, PRInt32 aDefaultNameSpaceID, nsICSSStyleSheet* aParentSheet, PRInt32 aSheetIndex); - SheetLoadData(CSSLoaderImpl* aLoader, nsIURI* aURL, nsCSSLoaderCallbackFunc aCallback, - void* aData); + SheetLoadData(CSSLoaderImpl* aLoader, nsIURI* aURL, + nsICSSLoaderObserver* aObserver); NS_DECL_ISUPPORTS NS_DECL_NSIUNICHARSTREAMLOADEROBSERVER @@ -193,8 +194,7 @@ public: PRBool mIsAgent; PRBool mSyncLoad; - nsCSSLoaderCallbackFunc mCallback; - void* mCallbackData; + nsICSSLoaderObserver* mObserver; }; NS_IMPL_ISUPPORTS1(SheetLoadData, nsIUnicharStreamLoaderObserver); @@ -203,15 +203,17 @@ MOZ_DECL_CTOR_COUNTER(PendingSheetData); struct PendingSheetData { PendingSheetData(nsICSSStyleSheet* aSheet, PRInt32 aDocIndex, - nsIContent* aElement) + nsIContent* aElement, nsICSSLoaderObserver* aObserver) : mSheet(aSheet), mDocIndex(aDocIndex), mOwningElement(aElement), - mNotify(PR_FALSE) + mNotify(PR_FALSE), + mObserver(aObserver) { MOZ_COUNT_CTOR(PendingSheetData); NS_ADDREF(mSheet); NS_IF_ADDREF(mOwningElement); + NS_IF_ADDREF(mObserver); } ~PendingSheetData(void) @@ -219,12 +221,14 @@ struct PendingSheetData { MOZ_COUNT_DTOR(PendingSheetData); NS_RELEASE(mSheet); NS_IF_RELEASE(mOwningElement); + NS_IF_RELEASE(mObserver); } nsICSSStyleSheet* mSheet; PRInt32 mDocIndex; nsIContent* mOwningElement; PRBool mNotify; + nsICSSLoaderObserver* mObserver; }; class CSSLoaderImpl: public nsICSSLoader { @@ -252,7 +256,8 @@ public: PRInt32 aDefaultNameSpaceID, PRInt32 aIndex, nsIParser* aParserToUnblock, - PRBool& aCompleted); + PRBool& aCompleted, + nsICSSLoaderObserver* aObserver); NS_IMETHOD LoadStyleLink(nsIContent* aElement, nsIURI* aURL, @@ -261,7 +266,8 @@ public: PRInt32 aDefaultNameSpaceID, PRInt32 aIndex, nsIParser* aParserToUnblock, - PRBool& aCompleted); + PRBool& aCompleted, + nsICSSLoaderObserver* aObserver); NS_IMETHOD LoadChildSheet(nsICSSStyleSheet* aParentSheet, nsIURI* aURL, @@ -270,10 +276,9 @@ public: PRInt32 aIndex); NS_IMETHOD LoadAgentSheet(nsIURI* aURL, - nsICSSStyleSheet*& aSheet, - PRBool& aCompleted, - nsCSSLoaderCallbackFunc aCallback, - void *aData); + nsICSSStyleSheet*& aSheet, + PRBool& aCompleted, + nsICSSLoaderObserver* aObserver); // local helper methods (public for access from statics) void Cleanup(URLKey& aKey, SheetLoadData* aLoadData); @@ -293,12 +298,14 @@ public: const nsString& aMedia); nsresult AddPendingSheet(nsICSSStyleSheet* aSheet, PRInt32 aDocIndex, - nsIContent* aElement); + nsIContent* aElement, + nsICSSLoaderObserver* aObserver); PRBool IsAlternate(const nsString& aTitle); nsresult InsertSheetInDoc(nsICSSStyleSheet* aSheet, PRInt32 aDocIndex, - nsIContent* aElement, PRBool aNotify); + nsIContent* aElement, PRBool aNotify, + nsICSSLoaderObserver* aObserver); nsresult InsertChildSheet(nsICSSStyleSheet* aSheet, nsICSSStyleSheet* aParentSheet, PRInt32 aIndex); @@ -332,7 +339,8 @@ SheetLoadData::SheetLoadData(CSSLoaderImpl* aLoader, nsIURI* aURL, const nsString& aTitle, const nsString& aMedia, PRInt32 aDefaultNameSpaceID, nsIContent* aOwner, PRInt32 aDocIndex, - nsIParser* aParserToUnblock, PRBool aIsInline) + nsIParser* aParserToUnblock, PRBool aIsInline, + nsICSSLoaderObserver* aObserver) : mLoader(aLoader), mURL(aURL), mTitle(aTitle), @@ -349,14 +357,14 @@ SheetLoadData::SheetLoadData(CSSLoaderImpl* aLoader, nsIURI* aURL, mIsInline(aIsInline), mIsAgent(PR_FALSE), mSyncLoad(PR_FALSE), - mCallback(nsnull), - mCallbackData(nsnull) + mObserver(aObserver) { NS_INIT_REFCNT(); NS_ADDREF(mLoader); NS_ADDREF(mURL); NS_IF_ADDREF(mOwningElement); NS_IF_ADDREF(mParserToUnblock); + NS_IF_ADDREF(mObserver); } SheetLoadData::SheetLoadData(CSSLoaderImpl* aLoader, nsIURI* aURL, @@ -379,8 +387,7 @@ SheetLoadData::SheetLoadData(CSSLoaderImpl* aLoader, nsIURI* aURL, mIsInline(PR_FALSE), mIsAgent(PR_FALSE), mSyncLoad(PR_FALSE), - mCallback(nsnull), - mCallbackData(nsnull) + mObserver(nsnull) { NS_INIT_REFCNT(); NS_ADDREF(mLoader); @@ -389,7 +396,7 @@ SheetLoadData::SheetLoadData(CSSLoaderImpl* aLoader, nsIURI* aURL, } SheetLoadData::SheetLoadData(CSSLoaderImpl* aLoader, nsIURI* aURL, - nsCSSLoaderCallbackFunc aCallback, void* aData) + nsICSSLoaderObserver* aObserver) : mLoader(aLoader), mURL(aURL), mTitle(), @@ -405,13 +412,13 @@ SheetLoadData::SheetLoadData(CSSLoaderImpl* aLoader, nsIURI* aURL, mPendingChildren(0), mIsInline(PR_FALSE), mIsAgent(PR_TRUE), - mSyncLoad(PRBool(nsnull == aCallback)), - mCallback(aCallback), - mCallbackData(nsnull) + mSyncLoad(PRBool(nsnull == aObserver)), + mObserver(aObserver) { NS_INIT_REFCNT(); NS_ADDREF(mLoader); NS_ADDREF(mURL); + NS_IF_ADDREF(mObserver); } @@ -422,6 +429,7 @@ SheetLoadData::~SheetLoadData(void) NS_IF_RELEASE(mOwningElement); NS_IF_RELEASE(mParserToUnblock); NS_IF_RELEASE(mParentSheet); + NS_IF_RELEASE(mObserver); if (mNext) { delete mNext; } @@ -611,7 +619,8 @@ InsertPendingSheet(void* aPendingData, void* aLoader) PendingSheetData* data = (PendingSheetData*)aPendingData; CSSLoaderImpl* loader = (CSSLoaderImpl*)aLoader; loader->InsertSheetInDoc(data->mSheet, data->mDocIndex, - data->mOwningElement, data->mNotify); + data->mOwningElement, data->mNotify, + data->mObserver); delete data; return PR_TRUE; } @@ -704,16 +713,16 @@ CSSLoaderImpl::SheetComplete(nsICSSStyleSheet* aSheet, SheetLoadData* aLoadData) InsertChildSheet(aSheet, data->mParentSheet, data->mSheetIndex); } else if (data->mIsAgent) { // is agent sheet - if (data->mCallback) { - (*(data->mCallback))(aSheet, data->mCallbackData); + if (data->mObserver) { + data->mObserver->StyleSheetLoaded(aSheet, PR_FALSE); } } else { // doc sheet if (data->mParserToUnblock) { // if blocking, insert it immediately - InsertSheetInDoc(aSheet, data->mSheetIndex, data->mOwningElement, PR_TRUE); + InsertSheetInDoc(aSheet, data->mSheetIndex, data->mOwningElement, PR_TRUE, data->mObserver); } else { // otherwise wait until all are loaded (even inlines) - AddPendingSheet(aSheet, data->mSheetIndex, data->mOwningElement); + AddPendingSheet(aSheet, data->mSheetIndex, data->mOwningElement, data->mObserver); } } @@ -927,9 +936,13 @@ CSSLoaderImpl::PrepareSheet(nsICSSStyleSheet* aSheet, const nsString& aTitle, nsresult CSSLoaderImpl::AddPendingSheet(nsICSSStyleSheet* aSheet, PRInt32 aDocIndex, - nsIContent* aElement) + nsIContent* aElement, + nsICSSLoaderObserver* aObserver) { - PendingSheetData* data = new PendingSheetData(aSheet, aDocIndex, aElement); + PendingSheetData* data = new PendingSheetData(aSheet, + aDocIndex, + aElement, + aObserver); if (data) { mPendingDocSheets.AppendElement(data); return NS_OK; @@ -948,7 +961,8 @@ CSSLoaderImpl::IsAlternate(const nsString& aTitle) nsresult CSSLoaderImpl::InsertSheetInDoc(nsICSSStyleSheet* aSheet, PRInt32 aDocIndex, - nsIContent* aElement, PRBool aNotify) + nsIContent* aElement, PRBool aNotify, + nsICSSLoaderObserver* aObserver) { if ((! mDocument) || (! aSheet)) { return NS_ERROR_NULL_POINTER; @@ -997,6 +1011,9 @@ CSSLoaderImpl::InsertSheetInDoc(nsICSSStyleSheet* aSheet, PRInt32 aDocIndex, mDocument->InsertStyleSheetAt(aSheet, 0, aNotify); sheetMap->InsertElementAt((void*)aDocIndex, 0); } + if (nsnull != aObserver) { + aObserver->StyleSheetLoaded(aSheet, aNotify); + } return NS_OK; } return NS_ERROR_OUT_OF_MEMORY; @@ -1140,7 +1157,8 @@ CSSLoaderImpl::LoadInlineStyle(nsIContent* aElement, PRInt32 aDefaultNameSpaceID, PRInt32 aDocIndex, nsIParser* aParserToUnblock, - PRBool& aCompleted) + PRBool& aCompleted, + nsICSSLoaderObserver* aObserver) { NS_ASSERTION(mDocument, "not initialized"); if (! mDocument) { @@ -1155,7 +1173,7 @@ CSSLoaderImpl::LoadInlineStyle(nsIContent* aElement, SheetLoadData* data = new SheetLoadData(this, docURL, aTitle, aMedia, aDefaultNameSpaceID, aElement, aDocIndex, aParserToUnblock, - PR_TRUE); + PR_TRUE, aObserver); if (data == nsnull) { result = NS_ERROR_OUT_OF_MEMORY; } @@ -1182,7 +1200,8 @@ CSSLoaderImpl::LoadStyleLink(nsIContent* aElement, PRInt32 aDefaultNameSpaceID, PRInt32 aDocIndex, nsIParser* aParserToUnblock, - PRBool& aCompleted) + PRBool& aCompleted, + nsICSSLoaderObserver* aObserver) { NS_ASSERTION(mDocument, "not initialized"); if (! mDocument) { @@ -1207,10 +1226,10 @@ CSSLoaderImpl::LoadStyleLink(nsIContent* aElement, if (NS_SUCCEEDED(result)) { PrepareSheet(clone, aTitle, aMedia); if (aParserToUnblock) { // stick it in now, parser is waiting for it - result = InsertSheetInDoc(clone, aDocIndex, aElement, PR_TRUE); + result = InsertSheetInDoc(clone, aDocIndex, aElement, PR_TRUE, aObserver); } else { // add to pending list - result = AddPendingSheet(clone, aDocIndex, aElement); + result = AddPendingSheet(clone, aDocIndex, aElement, aObserver); } NS_RELEASE(clone); } @@ -1218,7 +1237,8 @@ CSSLoaderImpl::LoadStyleLink(nsIContent* aElement, else { // need to load it SheetLoadData* data = new SheetLoadData(this, aURL, aTitle, aMedia, aDefaultNameSpaceID, aElement, aDocIndex, - aParserToUnblock, PR_FALSE); + aParserToUnblock, PR_FALSE, + aObserver); if (data == nsnull) { result = NS_ERROR_OUT_OF_MEMORY; } @@ -1310,8 +1330,7 @@ NS_IMETHODIMP CSSLoaderImpl::LoadAgentSheet(nsIURI* aURL, nsICSSStyleSheet*& aSheet, PRBool& aCompleted, - nsCSSLoaderCallbackFunc aCallback, - void *aData) + nsICSSLoaderObserver* aObserver) { nsresult result = NS_ERROR_NULL_POINTER; if (aURL) { @@ -1327,7 +1346,7 @@ CSSLoaderImpl::LoadAgentSheet(nsIURI* aURL, nsIUnicharInputStream* uin; result = NS_NewConverterStream(&uin, nsnull, in); if (NS_SUCCEEDED(result)) { - SheetLoadData* data = new SheetLoadData(this, aURL, aCallback, aData); + SheetLoadData* data = new SheetLoadData(this, aURL, aObserver); if (data == nsnull) { result = NS_ERROR_OUT_OF_MEMORY; } diff --git a/mozilla/layout/html/style/public/MANIFEST b/mozilla/layout/html/style/public/MANIFEST index 5edb16aa7e9..e129144a200 100644 --- a/mozilla/layout/html/style/public/MANIFEST +++ b/mozilla/layout/html/style/public/MANIFEST @@ -8,3 +8,4 @@ nsICSSLoader.h nsICSSParser.h nsICSSStyleSheet.h nsStyleUtil.h +nsICSSLoaderObserver.h \ No newline at end of file diff --git a/mozilla/layout/html/style/public/Makefile.in b/mozilla/layout/html/style/public/Makefile.in index 8e65b7a8cf5..feb076606c7 100644 --- a/mozilla/layout/html/style/public/Makefile.in +++ b/mozilla/layout/html/style/public/Makefile.in @@ -35,6 +35,7 @@ EXPORTS = \ nsICSSParser.h \ nsICSSStyleSheet.h \ nsStyleUtil.h \ + nsICSSLoaderObserver.h \ $(NULL) EXPORTS := $(addprefix $(srcdir)/, $(EXPORTS)) diff --git a/mozilla/layout/html/style/public/makefile.win b/mozilla/layout/html/style/public/makefile.win index f64791cfe12..03b38f05c18 100644 --- a/mozilla/layout/html/style/public/makefile.win +++ b/mozilla/layout/html/style/public/makefile.win @@ -21,7 +21,7 @@ DEPTH=..\..\..\.. -EXPORTS=nsCSSAtoms.h nsCSSAtomList.h nsICSSLoader.h nsICSSParser.h nsICSSStyleSheet.h nsStyleUtil.h +EXPORTS=nsCSSAtoms.h nsCSSAtomList.h nsICSSLoader.h nsICSSParser.h nsICSSStyleSheet.h nsStyleUtil.h nsICSSLoaderObserver.h MODULE=raptor include <$(DEPTH)\config\rules.mak> diff --git a/mozilla/layout/html/style/public/nsICSSLoader.h b/mozilla/layout/html/style/public/nsICSSLoader.h index 367b8777a8a..67f066ca555 100644 --- a/mozilla/layout/html/style/public/nsICSSLoader.h +++ b/mozilla/layout/html/style/public/nsICSSLoader.h @@ -35,12 +35,13 @@ class nsIContent; class nsIParser; class nsIDocument; class nsIUnicharInputStream; +class nsICSSLoaderObserver; // IID for the nsIStyleSheetLoader interface {a6cf9101-15b3-11d2-932e-00805f8add32} #define NS_ICSS_LOADER_IID \ {0xa6cf9101, 0x15b3, 0x11d2, {0x93, 0x2e, 0x00, 0x80, 0x5f, 0x8a, 0xdd, 0x32}} -typedef void (*nsCSSLoaderCallbackFunc)(nsICSSStyleSheet* aSheet, void *aData); +typedef void (*nsCSSLoaderCallbackFunc)(nsICSSStyleSheet* aSheet, void *aData, PRBool aDidNotify); class nsICSSLoader : public nsISupports { public: @@ -70,7 +71,8 @@ public: PRInt32 aDefaultNameSpaceID, PRInt32 aDocIndex, nsIParser* aParserToUnblock, - PRBool& aCompleted) = 0; + PRBool& aCompleted, + nsICSSLoaderObserver* aObserver) = 0; // Load a linked style sheet // - if aCompleted is PR_TRUE, the sheet is fully loaded, don't @@ -84,7 +86,8 @@ public: PRInt32 aDefaultNameSpaceID, PRInt32 aDocIndex, nsIParser* aParserToUnblock, - PRBool& aCompleted) = 0; + PRBool& aCompleted, + nsICSSLoaderObserver* aObserver) = 0; // Load a child style sheet (@import) NS_IMETHOD LoadChildSheet(nsICSSStyleSheet* aParentSheet, @@ -101,8 +104,7 @@ public: NS_IMETHOD LoadAgentSheet(nsIURI* aURL, nsICSSStyleSheet*& aSheet, PRBool& aCompleted, - nsCSSLoaderCallbackFunc aCallback, - void *aData) = 0; + nsICSSLoaderObserver* aObserver) = 0; }; extern NS_HTML nsresult diff --git a/mozilla/layout/html/style/public/nsICSSLoaderObserver.h b/mozilla/layout/html/style/public/nsICSSLoaderObserver.h new file mode 100644 index 00000000000..142c19ceffa --- /dev/null +++ b/mozilla/layout/html/style/public/nsICSSLoaderObserver.h @@ -0,0 +1,38 @@ +/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- + * + * The contents of this file are subject to the Netscape Public + * License Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.mozilla.org/NPL/ + * + * Software distributed under the License is distributed on an "AS + * IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or + * implied. See the License for the specific language governing + * rights and limitations under the License. + * + * The Original Code is mozilla.org code. + * + * The Initial Developer of the Original Code is Netscape + * Communications Corporation. Portions created by Netscape are + * Copyright (C) 1999 Netscape Communications Corporation. All + * Rights Reserved. + * + * Contributor(s): + */ +#ifndef nsICSSLoaderObserver_h___ +#define nsICSSLoaderObserver_h___ + +#include "nsISupports.h" + +#define NS_ICSSLOADEROBSERVER_IID \ +{ 0xa6cf9116, 0x15b3, 0x11d2, \ +{0x93, 0x2e, 0x00, 0x80, 0x5f, 0x8a, 0xdd, 0x32} } + +class nsICSSLoaderObserver : public nsISupports { +public: + static const nsIID& GetIID() { static nsIID iid = NS_ICSSLOADEROBSERVER_IID; return iid; } + + NS_IMETHOD StyleSheetLoaded(nsICSSStyleSheet*aSheet, PRBool aNotify) = 0; +}; + +#endif // nsICSSLoaderObserver_h___ diff --git a/mozilla/layout/html/style/src/nsCSSLoader.cpp b/mozilla/layout/html/style/src/nsCSSLoader.cpp index 8377ee0abb5..68dd1d5de00 100644 --- a/mozilla/layout/html/style/src/nsCSSLoader.cpp +++ b/mozilla/layout/html/style/src/nsCSSLoader.cpp @@ -20,7 +20,7 @@ * Contributor(s): */ #include "nsICSSLoader.h" - +#include "nsICSSLoaderObserver.h" #include "nsICSSParser.h" #include "nsICSSStyleSheet.h" @@ -161,12 +161,13 @@ public: const nsString& aTitle, const nsString& aMedia, PRInt32 aDefaultNameSpaceID, nsIContent* aOwner, PRInt32 aDocIndex, - nsIParser* aParserToUnblock, PRBool aIsInline); + nsIParser* aParserToUnblock, PRBool aIsInline, + nsICSSLoaderObserver* aObserver); SheetLoadData(CSSLoaderImpl* aLoader, nsIURI* aURL, const nsString& aMedia, PRInt32 aDefaultNameSpaceID, nsICSSStyleSheet* aParentSheet, PRInt32 aSheetIndex); - SheetLoadData(CSSLoaderImpl* aLoader, nsIURI* aURL, nsCSSLoaderCallbackFunc aCallback, - void* aData); + SheetLoadData(CSSLoaderImpl* aLoader, nsIURI* aURL, + nsICSSLoaderObserver* aObserver); NS_DECL_ISUPPORTS NS_DECL_NSIUNICHARSTREAMLOADEROBSERVER @@ -193,8 +194,7 @@ public: PRBool mIsAgent; PRBool mSyncLoad; - nsCSSLoaderCallbackFunc mCallback; - void* mCallbackData; + nsICSSLoaderObserver* mObserver; }; NS_IMPL_ISUPPORTS1(SheetLoadData, nsIUnicharStreamLoaderObserver); @@ -203,15 +203,17 @@ MOZ_DECL_CTOR_COUNTER(PendingSheetData); struct PendingSheetData { PendingSheetData(nsICSSStyleSheet* aSheet, PRInt32 aDocIndex, - nsIContent* aElement) + nsIContent* aElement, nsICSSLoaderObserver* aObserver) : mSheet(aSheet), mDocIndex(aDocIndex), mOwningElement(aElement), - mNotify(PR_FALSE) + mNotify(PR_FALSE), + mObserver(aObserver) { MOZ_COUNT_CTOR(PendingSheetData); NS_ADDREF(mSheet); NS_IF_ADDREF(mOwningElement); + NS_IF_ADDREF(mObserver); } ~PendingSheetData(void) @@ -219,12 +221,14 @@ struct PendingSheetData { MOZ_COUNT_DTOR(PendingSheetData); NS_RELEASE(mSheet); NS_IF_RELEASE(mOwningElement); + NS_IF_RELEASE(mObserver); } nsICSSStyleSheet* mSheet; PRInt32 mDocIndex; nsIContent* mOwningElement; PRBool mNotify; + nsICSSLoaderObserver* mObserver; }; class CSSLoaderImpl: public nsICSSLoader { @@ -252,7 +256,8 @@ public: PRInt32 aDefaultNameSpaceID, PRInt32 aIndex, nsIParser* aParserToUnblock, - PRBool& aCompleted); + PRBool& aCompleted, + nsICSSLoaderObserver* aObserver); NS_IMETHOD LoadStyleLink(nsIContent* aElement, nsIURI* aURL, @@ -261,7 +266,8 @@ public: PRInt32 aDefaultNameSpaceID, PRInt32 aIndex, nsIParser* aParserToUnblock, - PRBool& aCompleted); + PRBool& aCompleted, + nsICSSLoaderObserver* aObserver); NS_IMETHOD LoadChildSheet(nsICSSStyleSheet* aParentSheet, nsIURI* aURL, @@ -270,10 +276,9 @@ public: PRInt32 aIndex); NS_IMETHOD LoadAgentSheet(nsIURI* aURL, - nsICSSStyleSheet*& aSheet, - PRBool& aCompleted, - nsCSSLoaderCallbackFunc aCallback, - void *aData); + nsICSSStyleSheet*& aSheet, + PRBool& aCompleted, + nsICSSLoaderObserver* aObserver); // local helper methods (public for access from statics) void Cleanup(URLKey& aKey, SheetLoadData* aLoadData); @@ -293,12 +298,14 @@ public: const nsString& aMedia); nsresult AddPendingSheet(nsICSSStyleSheet* aSheet, PRInt32 aDocIndex, - nsIContent* aElement); + nsIContent* aElement, + nsICSSLoaderObserver* aObserver); PRBool IsAlternate(const nsString& aTitle); nsresult InsertSheetInDoc(nsICSSStyleSheet* aSheet, PRInt32 aDocIndex, - nsIContent* aElement, PRBool aNotify); + nsIContent* aElement, PRBool aNotify, + nsICSSLoaderObserver* aObserver); nsresult InsertChildSheet(nsICSSStyleSheet* aSheet, nsICSSStyleSheet* aParentSheet, PRInt32 aIndex); @@ -332,7 +339,8 @@ SheetLoadData::SheetLoadData(CSSLoaderImpl* aLoader, nsIURI* aURL, const nsString& aTitle, const nsString& aMedia, PRInt32 aDefaultNameSpaceID, nsIContent* aOwner, PRInt32 aDocIndex, - nsIParser* aParserToUnblock, PRBool aIsInline) + nsIParser* aParserToUnblock, PRBool aIsInline, + nsICSSLoaderObserver* aObserver) : mLoader(aLoader), mURL(aURL), mTitle(aTitle), @@ -349,14 +357,14 @@ SheetLoadData::SheetLoadData(CSSLoaderImpl* aLoader, nsIURI* aURL, mIsInline(aIsInline), mIsAgent(PR_FALSE), mSyncLoad(PR_FALSE), - mCallback(nsnull), - mCallbackData(nsnull) + mObserver(aObserver) { NS_INIT_REFCNT(); NS_ADDREF(mLoader); NS_ADDREF(mURL); NS_IF_ADDREF(mOwningElement); NS_IF_ADDREF(mParserToUnblock); + NS_IF_ADDREF(mObserver); } SheetLoadData::SheetLoadData(CSSLoaderImpl* aLoader, nsIURI* aURL, @@ -379,8 +387,7 @@ SheetLoadData::SheetLoadData(CSSLoaderImpl* aLoader, nsIURI* aURL, mIsInline(PR_FALSE), mIsAgent(PR_FALSE), mSyncLoad(PR_FALSE), - mCallback(nsnull), - mCallbackData(nsnull) + mObserver(nsnull) { NS_INIT_REFCNT(); NS_ADDREF(mLoader); @@ -389,7 +396,7 @@ SheetLoadData::SheetLoadData(CSSLoaderImpl* aLoader, nsIURI* aURL, } SheetLoadData::SheetLoadData(CSSLoaderImpl* aLoader, nsIURI* aURL, - nsCSSLoaderCallbackFunc aCallback, void* aData) + nsICSSLoaderObserver* aObserver) : mLoader(aLoader), mURL(aURL), mTitle(), @@ -405,13 +412,13 @@ SheetLoadData::SheetLoadData(CSSLoaderImpl* aLoader, nsIURI* aURL, mPendingChildren(0), mIsInline(PR_FALSE), mIsAgent(PR_TRUE), - mSyncLoad(PRBool(nsnull == aCallback)), - mCallback(aCallback), - mCallbackData(nsnull) + mSyncLoad(PRBool(nsnull == aObserver)), + mObserver(aObserver) { NS_INIT_REFCNT(); NS_ADDREF(mLoader); NS_ADDREF(mURL); + NS_IF_ADDREF(mObserver); } @@ -422,6 +429,7 @@ SheetLoadData::~SheetLoadData(void) NS_IF_RELEASE(mOwningElement); NS_IF_RELEASE(mParserToUnblock); NS_IF_RELEASE(mParentSheet); + NS_IF_RELEASE(mObserver); if (mNext) { delete mNext; } @@ -611,7 +619,8 @@ InsertPendingSheet(void* aPendingData, void* aLoader) PendingSheetData* data = (PendingSheetData*)aPendingData; CSSLoaderImpl* loader = (CSSLoaderImpl*)aLoader; loader->InsertSheetInDoc(data->mSheet, data->mDocIndex, - data->mOwningElement, data->mNotify); + data->mOwningElement, data->mNotify, + data->mObserver); delete data; return PR_TRUE; } @@ -704,16 +713,16 @@ CSSLoaderImpl::SheetComplete(nsICSSStyleSheet* aSheet, SheetLoadData* aLoadData) InsertChildSheet(aSheet, data->mParentSheet, data->mSheetIndex); } else if (data->mIsAgent) { // is agent sheet - if (data->mCallback) { - (*(data->mCallback))(aSheet, data->mCallbackData); + if (data->mObserver) { + data->mObserver->StyleSheetLoaded(aSheet, PR_FALSE); } } else { // doc sheet if (data->mParserToUnblock) { // if blocking, insert it immediately - InsertSheetInDoc(aSheet, data->mSheetIndex, data->mOwningElement, PR_TRUE); + InsertSheetInDoc(aSheet, data->mSheetIndex, data->mOwningElement, PR_TRUE, data->mObserver); } else { // otherwise wait until all are loaded (even inlines) - AddPendingSheet(aSheet, data->mSheetIndex, data->mOwningElement); + AddPendingSheet(aSheet, data->mSheetIndex, data->mOwningElement, data->mObserver); } } @@ -927,9 +936,13 @@ CSSLoaderImpl::PrepareSheet(nsICSSStyleSheet* aSheet, const nsString& aTitle, nsresult CSSLoaderImpl::AddPendingSheet(nsICSSStyleSheet* aSheet, PRInt32 aDocIndex, - nsIContent* aElement) + nsIContent* aElement, + nsICSSLoaderObserver* aObserver) { - PendingSheetData* data = new PendingSheetData(aSheet, aDocIndex, aElement); + PendingSheetData* data = new PendingSheetData(aSheet, + aDocIndex, + aElement, + aObserver); if (data) { mPendingDocSheets.AppendElement(data); return NS_OK; @@ -948,7 +961,8 @@ CSSLoaderImpl::IsAlternate(const nsString& aTitle) nsresult CSSLoaderImpl::InsertSheetInDoc(nsICSSStyleSheet* aSheet, PRInt32 aDocIndex, - nsIContent* aElement, PRBool aNotify) + nsIContent* aElement, PRBool aNotify, + nsICSSLoaderObserver* aObserver) { if ((! mDocument) || (! aSheet)) { return NS_ERROR_NULL_POINTER; @@ -997,6 +1011,9 @@ CSSLoaderImpl::InsertSheetInDoc(nsICSSStyleSheet* aSheet, PRInt32 aDocIndex, mDocument->InsertStyleSheetAt(aSheet, 0, aNotify); sheetMap->InsertElementAt((void*)aDocIndex, 0); } + if (nsnull != aObserver) { + aObserver->StyleSheetLoaded(aSheet, aNotify); + } return NS_OK; } return NS_ERROR_OUT_OF_MEMORY; @@ -1140,7 +1157,8 @@ CSSLoaderImpl::LoadInlineStyle(nsIContent* aElement, PRInt32 aDefaultNameSpaceID, PRInt32 aDocIndex, nsIParser* aParserToUnblock, - PRBool& aCompleted) + PRBool& aCompleted, + nsICSSLoaderObserver* aObserver) { NS_ASSERTION(mDocument, "not initialized"); if (! mDocument) { @@ -1155,7 +1173,7 @@ CSSLoaderImpl::LoadInlineStyle(nsIContent* aElement, SheetLoadData* data = new SheetLoadData(this, docURL, aTitle, aMedia, aDefaultNameSpaceID, aElement, aDocIndex, aParserToUnblock, - PR_TRUE); + PR_TRUE, aObserver); if (data == nsnull) { result = NS_ERROR_OUT_OF_MEMORY; } @@ -1182,7 +1200,8 @@ CSSLoaderImpl::LoadStyleLink(nsIContent* aElement, PRInt32 aDefaultNameSpaceID, PRInt32 aDocIndex, nsIParser* aParserToUnblock, - PRBool& aCompleted) + PRBool& aCompleted, + nsICSSLoaderObserver* aObserver) { NS_ASSERTION(mDocument, "not initialized"); if (! mDocument) { @@ -1207,10 +1226,10 @@ CSSLoaderImpl::LoadStyleLink(nsIContent* aElement, if (NS_SUCCEEDED(result)) { PrepareSheet(clone, aTitle, aMedia); if (aParserToUnblock) { // stick it in now, parser is waiting for it - result = InsertSheetInDoc(clone, aDocIndex, aElement, PR_TRUE); + result = InsertSheetInDoc(clone, aDocIndex, aElement, PR_TRUE, aObserver); } else { // add to pending list - result = AddPendingSheet(clone, aDocIndex, aElement); + result = AddPendingSheet(clone, aDocIndex, aElement, aObserver); } NS_RELEASE(clone); } @@ -1218,7 +1237,8 @@ CSSLoaderImpl::LoadStyleLink(nsIContent* aElement, else { // need to load it SheetLoadData* data = new SheetLoadData(this, aURL, aTitle, aMedia, aDefaultNameSpaceID, aElement, aDocIndex, - aParserToUnblock, PR_FALSE); + aParserToUnblock, PR_FALSE, + aObserver); if (data == nsnull) { result = NS_ERROR_OUT_OF_MEMORY; } @@ -1310,8 +1330,7 @@ NS_IMETHODIMP CSSLoaderImpl::LoadAgentSheet(nsIURI* aURL, nsICSSStyleSheet*& aSheet, PRBool& aCompleted, - nsCSSLoaderCallbackFunc aCallback, - void *aData) + nsICSSLoaderObserver* aObserver) { nsresult result = NS_ERROR_NULL_POINTER; if (aURL) { @@ -1327,7 +1346,7 @@ CSSLoaderImpl::LoadAgentSheet(nsIURI* aURL, nsIUnicharInputStream* uin; result = NS_NewConverterStream(&uin, nsnull, in); if (NS_SUCCEEDED(result)) { - SheetLoadData* data = new SheetLoadData(this, aURL, aCallback, aData); + SheetLoadData* data = new SheetLoadData(this, aURL, aObserver); if (data == nsnull) { result = NS_ERROR_OUT_OF_MEMORY; } diff --git a/mozilla/layout/style/nsCSSLoader.cpp b/mozilla/layout/style/nsCSSLoader.cpp index 8377ee0abb5..68dd1d5de00 100644 --- a/mozilla/layout/style/nsCSSLoader.cpp +++ b/mozilla/layout/style/nsCSSLoader.cpp @@ -20,7 +20,7 @@ * Contributor(s): */ #include "nsICSSLoader.h" - +#include "nsICSSLoaderObserver.h" #include "nsICSSParser.h" #include "nsICSSStyleSheet.h" @@ -161,12 +161,13 @@ public: const nsString& aTitle, const nsString& aMedia, PRInt32 aDefaultNameSpaceID, nsIContent* aOwner, PRInt32 aDocIndex, - nsIParser* aParserToUnblock, PRBool aIsInline); + nsIParser* aParserToUnblock, PRBool aIsInline, + nsICSSLoaderObserver* aObserver); SheetLoadData(CSSLoaderImpl* aLoader, nsIURI* aURL, const nsString& aMedia, PRInt32 aDefaultNameSpaceID, nsICSSStyleSheet* aParentSheet, PRInt32 aSheetIndex); - SheetLoadData(CSSLoaderImpl* aLoader, nsIURI* aURL, nsCSSLoaderCallbackFunc aCallback, - void* aData); + SheetLoadData(CSSLoaderImpl* aLoader, nsIURI* aURL, + nsICSSLoaderObserver* aObserver); NS_DECL_ISUPPORTS NS_DECL_NSIUNICHARSTREAMLOADEROBSERVER @@ -193,8 +194,7 @@ public: PRBool mIsAgent; PRBool mSyncLoad; - nsCSSLoaderCallbackFunc mCallback; - void* mCallbackData; + nsICSSLoaderObserver* mObserver; }; NS_IMPL_ISUPPORTS1(SheetLoadData, nsIUnicharStreamLoaderObserver); @@ -203,15 +203,17 @@ MOZ_DECL_CTOR_COUNTER(PendingSheetData); struct PendingSheetData { PendingSheetData(nsICSSStyleSheet* aSheet, PRInt32 aDocIndex, - nsIContent* aElement) + nsIContent* aElement, nsICSSLoaderObserver* aObserver) : mSheet(aSheet), mDocIndex(aDocIndex), mOwningElement(aElement), - mNotify(PR_FALSE) + mNotify(PR_FALSE), + mObserver(aObserver) { MOZ_COUNT_CTOR(PendingSheetData); NS_ADDREF(mSheet); NS_IF_ADDREF(mOwningElement); + NS_IF_ADDREF(mObserver); } ~PendingSheetData(void) @@ -219,12 +221,14 @@ struct PendingSheetData { MOZ_COUNT_DTOR(PendingSheetData); NS_RELEASE(mSheet); NS_IF_RELEASE(mOwningElement); + NS_IF_RELEASE(mObserver); } nsICSSStyleSheet* mSheet; PRInt32 mDocIndex; nsIContent* mOwningElement; PRBool mNotify; + nsICSSLoaderObserver* mObserver; }; class CSSLoaderImpl: public nsICSSLoader { @@ -252,7 +256,8 @@ public: PRInt32 aDefaultNameSpaceID, PRInt32 aIndex, nsIParser* aParserToUnblock, - PRBool& aCompleted); + PRBool& aCompleted, + nsICSSLoaderObserver* aObserver); NS_IMETHOD LoadStyleLink(nsIContent* aElement, nsIURI* aURL, @@ -261,7 +266,8 @@ public: PRInt32 aDefaultNameSpaceID, PRInt32 aIndex, nsIParser* aParserToUnblock, - PRBool& aCompleted); + PRBool& aCompleted, + nsICSSLoaderObserver* aObserver); NS_IMETHOD LoadChildSheet(nsICSSStyleSheet* aParentSheet, nsIURI* aURL, @@ -270,10 +276,9 @@ public: PRInt32 aIndex); NS_IMETHOD LoadAgentSheet(nsIURI* aURL, - nsICSSStyleSheet*& aSheet, - PRBool& aCompleted, - nsCSSLoaderCallbackFunc aCallback, - void *aData); + nsICSSStyleSheet*& aSheet, + PRBool& aCompleted, + nsICSSLoaderObserver* aObserver); // local helper methods (public for access from statics) void Cleanup(URLKey& aKey, SheetLoadData* aLoadData); @@ -293,12 +298,14 @@ public: const nsString& aMedia); nsresult AddPendingSheet(nsICSSStyleSheet* aSheet, PRInt32 aDocIndex, - nsIContent* aElement); + nsIContent* aElement, + nsICSSLoaderObserver* aObserver); PRBool IsAlternate(const nsString& aTitle); nsresult InsertSheetInDoc(nsICSSStyleSheet* aSheet, PRInt32 aDocIndex, - nsIContent* aElement, PRBool aNotify); + nsIContent* aElement, PRBool aNotify, + nsICSSLoaderObserver* aObserver); nsresult InsertChildSheet(nsICSSStyleSheet* aSheet, nsICSSStyleSheet* aParentSheet, PRInt32 aIndex); @@ -332,7 +339,8 @@ SheetLoadData::SheetLoadData(CSSLoaderImpl* aLoader, nsIURI* aURL, const nsString& aTitle, const nsString& aMedia, PRInt32 aDefaultNameSpaceID, nsIContent* aOwner, PRInt32 aDocIndex, - nsIParser* aParserToUnblock, PRBool aIsInline) + nsIParser* aParserToUnblock, PRBool aIsInline, + nsICSSLoaderObserver* aObserver) : mLoader(aLoader), mURL(aURL), mTitle(aTitle), @@ -349,14 +357,14 @@ SheetLoadData::SheetLoadData(CSSLoaderImpl* aLoader, nsIURI* aURL, mIsInline(aIsInline), mIsAgent(PR_FALSE), mSyncLoad(PR_FALSE), - mCallback(nsnull), - mCallbackData(nsnull) + mObserver(aObserver) { NS_INIT_REFCNT(); NS_ADDREF(mLoader); NS_ADDREF(mURL); NS_IF_ADDREF(mOwningElement); NS_IF_ADDREF(mParserToUnblock); + NS_IF_ADDREF(mObserver); } SheetLoadData::SheetLoadData(CSSLoaderImpl* aLoader, nsIURI* aURL, @@ -379,8 +387,7 @@ SheetLoadData::SheetLoadData(CSSLoaderImpl* aLoader, nsIURI* aURL, mIsInline(PR_FALSE), mIsAgent(PR_FALSE), mSyncLoad(PR_FALSE), - mCallback(nsnull), - mCallbackData(nsnull) + mObserver(nsnull) { NS_INIT_REFCNT(); NS_ADDREF(mLoader); @@ -389,7 +396,7 @@ SheetLoadData::SheetLoadData(CSSLoaderImpl* aLoader, nsIURI* aURL, } SheetLoadData::SheetLoadData(CSSLoaderImpl* aLoader, nsIURI* aURL, - nsCSSLoaderCallbackFunc aCallback, void* aData) + nsICSSLoaderObserver* aObserver) : mLoader(aLoader), mURL(aURL), mTitle(), @@ -405,13 +412,13 @@ SheetLoadData::SheetLoadData(CSSLoaderImpl* aLoader, nsIURI* aURL, mPendingChildren(0), mIsInline(PR_FALSE), mIsAgent(PR_TRUE), - mSyncLoad(PRBool(nsnull == aCallback)), - mCallback(aCallback), - mCallbackData(nsnull) + mSyncLoad(PRBool(nsnull == aObserver)), + mObserver(aObserver) { NS_INIT_REFCNT(); NS_ADDREF(mLoader); NS_ADDREF(mURL); + NS_IF_ADDREF(mObserver); } @@ -422,6 +429,7 @@ SheetLoadData::~SheetLoadData(void) NS_IF_RELEASE(mOwningElement); NS_IF_RELEASE(mParserToUnblock); NS_IF_RELEASE(mParentSheet); + NS_IF_RELEASE(mObserver); if (mNext) { delete mNext; } @@ -611,7 +619,8 @@ InsertPendingSheet(void* aPendingData, void* aLoader) PendingSheetData* data = (PendingSheetData*)aPendingData; CSSLoaderImpl* loader = (CSSLoaderImpl*)aLoader; loader->InsertSheetInDoc(data->mSheet, data->mDocIndex, - data->mOwningElement, data->mNotify); + data->mOwningElement, data->mNotify, + data->mObserver); delete data; return PR_TRUE; } @@ -704,16 +713,16 @@ CSSLoaderImpl::SheetComplete(nsICSSStyleSheet* aSheet, SheetLoadData* aLoadData) InsertChildSheet(aSheet, data->mParentSheet, data->mSheetIndex); } else if (data->mIsAgent) { // is agent sheet - if (data->mCallback) { - (*(data->mCallback))(aSheet, data->mCallbackData); + if (data->mObserver) { + data->mObserver->StyleSheetLoaded(aSheet, PR_FALSE); } } else { // doc sheet if (data->mParserToUnblock) { // if blocking, insert it immediately - InsertSheetInDoc(aSheet, data->mSheetIndex, data->mOwningElement, PR_TRUE); + InsertSheetInDoc(aSheet, data->mSheetIndex, data->mOwningElement, PR_TRUE, data->mObserver); } else { // otherwise wait until all are loaded (even inlines) - AddPendingSheet(aSheet, data->mSheetIndex, data->mOwningElement); + AddPendingSheet(aSheet, data->mSheetIndex, data->mOwningElement, data->mObserver); } } @@ -927,9 +936,13 @@ CSSLoaderImpl::PrepareSheet(nsICSSStyleSheet* aSheet, const nsString& aTitle, nsresult CSSLoaderImpl::AddPendingSheet(nsICSSStyleSheet* aSheet, PRInt32 aDocIndex, - nsIContent* aElement) + nsIContent* aElement, + nsICSSLoaderObserver* aObserver) { - PendingSheetData* data = new PendingSheetData(aSheet, aDocIndex, aElement); + PendingSheetData* data = new PendingSheetData(aSheet, + aDocIndex, + aElement, + aObserver); if (data) { mPendingDocSheets.AppendElement(data); return NS_OK; @@ -948,7 +961,8 @@ CSSLoaderImpl::IsAlternate(const nsString& aTitle) nsresult CSSLoaderImpl::InsertSheetInDoc(nsICSSStyleSheet* aSheet, PRInt32 aDocIndex, - nsIContent* aElement, PRBool aNotify) + nsIContent* aElement, PRBool aNotify, + nsICSSLoaderObserver* aObserver) { if ((! mDocument) || (! aSheet)) { return NS_ERROR_NULL_POINTER; @@ -997,6 +1011,9 @@ CSSLoaderImpl::InsertSheetInDoc(nsICSSStyleSheet* aSheet, PRInt32 aDocIndex, mDocument->InsertStyleSheetAt(aSheet, 0, aNotify); sheetMap->InsertElementAt((void*)aDocIndex, 0); } + if (nsnull != aObserver) { + aObserver->StyleSheetLoaded(aSheet, aNotify); + } return NS_OK; } return NS_ERROR_OUT_OF_MEMORY; @@ -1140,7 +1157,8 @@ CSSLoaderImpl::LoadInlineStyle(nsIContent* aElement, PRInt32 aDefaultNameSpaceID, PRInt32 aDocIndex, nsIParser* aParserToUnblock, - PRBool& aCompleted) + PRBool& aCompleted, + nsICSSLoaderObserver* aObserver) { NS_ASSERTION(mDocument, "not initialized"); if (! mDocument) { @@ -1155,7 +1173,7 @@ CSSLoaderImpl::LoadInlineStyle(nsIContent* aElement, SheetLoadData* data = new SheetLoadData(this, docURL, aTitle, aMedia, aDefaultNameSpaceID, aElement, aDocIndex, aParserToUnblock, - PR_TRUE); + PR_TRUE, aObserver); if (data == nsnull) { result = NS_ERROR_OUT_OF_MEMORY; } @@ -1182,7 +1200,8 @@ CSSLoaderImpl::LoadStyleLink(nsIContent* aElement, PRInt32 aDefaultNameSpaceID, PRInt32 aDocIndex, nsIParser* aParserToUnblock, - PRBool& aCompleted) + PRBool& aCompleted, + nsICSSLoaderObserver* aObserver) { NS_ASSERTION(mDocument, "not initialized"); if (! mDocument) { @@ -1207,10 +1226,10 @@ CSSLoaderImpl::LoadStyleLink(nsIContent* aElement, if (NS_SUCCEEDED(result)) { PrepareSheet(clone, aTitle, aMedia); if (aParserToUnblock) { // stick it in now, parser is waiting for it - result = InsertSheetInDoc(clone, aDocIndex, aElement, PR_TRUE); + result = InsertSheetInDoc(clone, aDocIndex, aElement, PR_TRUE, aObserver); } else { // add to pending list - result = AddPendingSheet(clone, aDocIndex, aElement); + result = AddPendingSheet(clone, aDocIndex, aElement, aObserver); } NS_RELEASE(clone); } @@ -1218,7 +1237,8 @@ CSSLoaderImpl::LoadStyleLink(nsIContent* aElement, else { // need to load it SheetLoadData* data = new SheetLoadData(this, aURL, aTitle, aMedia, aDefaultNameSpaceID, aElement, aDocIndex, - aParserToUnblock, PR_FALSE); + aParserToUnblock, PR_FALSE, + aObserver); if (data == nsnull) { result = NS_ERROR_OUT_OF_MEMORY; } @@ -1310,8 +1330,7 @@ NS_IMETHODIMP CSSLoaderImpl::LoadAgentSheet(nsIURI* aURL, nsICSSStyleSheet*& aSheet, PRBool& aCompleted, - nsCSSLoaderCallbackFunc aCallback, - void *aData) + nsICSSLoaderObserver* aObserver) { nsresult result = NS_ERROR_NULL_POINTER; if (aURL) { @@ -1327,7 +1346,7 @@ CSSLoaderImpl::LoadAgentSheet(nsIURI* aURL, nsIUnicharInputStream* uin; result = NS_NewConverterStream(&uin, nsnull, in); if (NS_SUCCEEDED(result)) { - SheetLoadData* data = new SheetLoadData(this, aURL, aCallback, aData); + SheetLoadData* data = new SheetLoadData(this, aURL, aObserver); if (data == nsnull) { result = NS_ERROR_OUT_OF_MEMORY; } diff --git a/mozilla/layout/style/nsICSSLoader.h b/mozilla/layout/style/nsICSSLoader.h index 367b8777a8a..67f066ca555 100644 --- a/mozilla/layout/style/nsICSSLoader.h +++ b/mozilla/layout/style/nsICSSLoader.h @@ -35,12 +35,13 @@ class nsIContent; class nsIParser; class nsIDocument; class nsIUnicharInputStream; +class nsICSSLoaderObserver; // IID for the nsIStyleSheetLoader interface {a6cf9101-15b3-11d2-932e-00805f8add32} #define NS_ICSS_LOADER_IID \ {0xa6cf9101, 0x15b3, 0x11d2, {0x93, 0x2e, 0x00, 0x80, 0x5f, 0x8a, 0xdd, 0x32}} -typedef void (*nsCSSLoaderCallbackFunc)(nsICSSStyleSheet* aSheet, void *aData); +typedef void (*nsCSSLoaderCallbackFunc)(nsICSSStyleSheet* aSheet, void *aData, PRBool aDidNotify); class nsICSSLoader : public nsISupports { public: @@ -70,7 +71,8 @@ public: PRInt32 aDefaultNameSpaceID, PRInt32 aDocIndex, nsIParser* aParserToUnblock, - PRBool& aCompleted) = 0; + PRBool& aCompleted, + nsICSSLoaderObserver* aObserver) = 0; // Load a linked style sheet // - if aCompleted is PR_TRUE, the sheet is fully loaded, don't @@ -84,7 +86,8 @@ public: PRInt32 aDefaultNameSpaceID, PRInt32 aDocIndex, nsIParser* aParserToUnblock, - PRBool& aCompleted) = 0; + PRBool& aCompleted, + nsICSSLoaderObserver* aObserver) = 0; // Load a child style sheet (@import) NS_IMETHOD LoadChildSheet(nsICSSStyleSheet* aParentSheet, @@ -101,8 +104,7 @@ public: NS_IMETHOD LoadAgentSheet(nsIURI* aURL, nsICSSStyleSheet*& aSheet, PRBool& aCompleted, - nsCSSLoaderCallbackFunc aCallback, - void *aData) = 0; + nsICSSLoaderObserver* aObserver) = 0; }; extern NS_HTML nsresult diff --git a/mozilla/layout/style/nsICSSLoaderObserver.h b/mozilla/layout/style/nsICSSLoaderObserver.h new file mode 100644 index 00000000000..142c19ceffa --- /dev/null +++ b/mozilla/layout/style/nsICSSLoaderObserver.h @@ -0,0 +1,38 @@ +/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- + * + * The contents of this file are subject to the Netscape Public + * License Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.mozilla.org/NPL/ + * + * Software distributed under the License is distributed on an "AS + * IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or + * implied. See the License for the specific language governing + * rights and limitations under the License. + * + * The Original Code is mozilla.org code. + * + * The Initial Developer of the Original Code is Netscape + * Communications Corporation. Portions created by Netscape are + * Copyright (C) 1999 Netscape Communications Corporation. All + * Rights Reserved. + * + * Contributor(s): + */ +#ifndef nsICSSLoaderObserver_h___ +#define nsICSSLoaderObserver_h___ + +#include "nsISupports.h" + +#define NS_ICSSLOADEROBSERVER_IID \ +{ 0xa6cf9116, 0x15b3, 0x11d2, \ +{0x93, 0x2e, 0x00, 0x80, 0x5f, 0x8a, 0xdd, 0x32} } + +class nsICSSLoaderObserver : public nsISupports { +public: + static const nsIID& GetIID() { static nsIID iid = NS_ICSSLOADEROBSERVER_IID; return iid; } + + NS_IMETHOD StyleSheetLoaded(nsICSSStyleSheet*aSheet, PRBool aNotify) = 0; +}; + +#endif // nsICSSLoaderObserver_h___