Bug 318128 Fix abuse of the CSS loader as a service r=bsmedberg sr=bz

This commit is contained in:
neil%parkwaycc.co.uk 2005-12-09 11:10:36 +00:00
parent 93ef502cdc
commit ed906ab7d1
8 changed files with 36 additions and 34 deletions

View File

@ -823,6 +823,10 @@ static void FlushSkinBindingsForWindow(nsIDOMWindowInternal* aWindow)
// XXXbsmedberg: move this to nsIWindowMediator
NS_IMETHODIMP nsChromeRegistry::RefreshSkins()
{
nsCOMPtr<nsICSSLoader> cssLoader(do_CreateInstance(kCSSLoaderCID));
if (!cssLoader)
return NS_OK;
nsCOMPtr<nsIWindowMediator> windowMediator
(do_GetService(NS_WINDOWMEDIATOR_CONTRACTID));
if (!windowMediator)
@ -853,7 +857,7 @@ NS_IMETHODIMP nsChromeRegistry::RefreshSkins()
if (protoWindow) {
nsCOMPtr<nsIDOMWindowInternal> domWindow = do_QueryInterface(protoWindow);
if (domWindow)
RefreshWindow(domWindow);
RefreshWindow(domWindow, cssLoader);
}
windowEnumerator->HasMoreElements(&more);
}
@ -881,7 +885,8 @@ static PRBool IsChromeURI(nsIURI* aURI)
}
// XXXbsmedberg: move this to windowmediator
nsresult nsChromeRegistry::RefreshWindow(nsIDOMWindowInternal* aWindow)
nsresult nsChromeRegistry::RefreshWindow(nsIDOMWindowInternal* aWindow,
nsICSSLoader* aCSSLoader)
{
// Deal with our subframes first.
nsCOMPtr<nsIDOMWindowCollection> frames;
@ -893,7 +898,7 @@ nsresult nsChromeRegistry::RefreshWindow(nsIDOMWindowInternal* aWindow)
nsCOMPtr<nsIDOMWindow> childWin;
frames->Item(j, getter_AddRefs(childWin));
nsCOMPtr<nsIDOMWindowInternal> childInt(do_QueryInterface(childWin));
RefreshWindow(childInt);
RefreshWindow(childInt, aCSSLoader);
}
nsresult rv;
@ -928,7 +933,7 @@ nsresult nsChromeRegistry::RefreshWindow(nsIDOMWindowInternal* aWindow)
if (IsChromeURI(uri)) {
// Reload the sheet.
nsCOMPtr<nsICSSStyleSheet> newSheet;
rv = LoadStyleSheetWithURL(uri, getter_AddRefs(newSheet));
rv = aCSSLoader->LoadSheetSync(uri, getter_AddRefs(newSheet));
if (NS_FAILED(rv)) return rv;
if (newSheet) {
rv = newAgentSheets.AppendObject(newSheet) ? NS_OK : NS_ERROR_FAILURE;
@ -980,7 +985,7 @@ nsresult nsChromeRegistry::RefreshWindow(nsIDOMWindowInternal* aWindow)
// XXX what about chrome sheets that have a title or are disabled? This
// only works by sheer dumb luck.
// XXXbz this should really use the document's CSSLoader!
LoadStyleSheetWithURL(uri, getter_AddRefs(newSheet));
aCSSLoader->LoadSheetSync(uri, getter_AddRefs(newSheet));
// Even if it's null, we put in in there.
newSheets.AppendObject(newSheet);
}
@ -1049,17 +1054,6 @@ nsChromeRegistry::ReloadChrome()
return rv;
}
nsresult
nsChromeRegistry::LoadStyleSheetWithURL(nsIURI* aURL, nsICSSStyleSheet** aSheet)
{
*aSheet = nsnull;
nsCOMPtr<nsICSSLoader> cssLoader = do_GetService(kCSSLoaderCID);
if (!cssLoader) return NS_ERROR_FAILURE;
return cssLoader->LoadSheetSync(aURL, aSheet);
}
NS_IMETHODIMP
nsChromeRegistry::AllowScriptsForPackage(nsIURI* aChromeURI, PRBool *aResult)
{

View File

@ -54,6 +54,7 @@
struct PRFileDesc;
class nsIAtom;
class nsICSSLoader;
class nsICSSStyleSheet;
class nsIDOMWindowInternal;
class nsILocalFile;
@ -96,8 +97,6 @@ public:
protected:
nsresult GetDynamicInfo(nsIURI *aChromeURL, PRBool aIsOverlay, nsISimpleEnumerator **aResult);
static nsresult LoadStyleSheetWithURL(nsIURI* aURL, nsICSSStyleSheet** aSheet);
nsresult LoadInstallDataSource();
nsresult LoadProfileDataSource();
@ -105,7 +104,8 @@ protected:
void FlushAllCaches();
private:
static nsresult RefreshWindow(nsIDOMWindowInternal* aWindow);
static nsresult RefreshWindow(nsIDOMWindowInternal* aWindow,
nsICSSLoader* aCSSLoader);
static nsresult GetProviderAndPath(nsIURL* aChromeURL,
nsACString& aProvider, nsACString& aPath);

View File

@ -2095,8 +2095,6 @@ DocumentViewerImpl::RequestWindowClose(PRBool* aCanClose)
return NS_OK;
}
NS_DEFINE_CID(kCSSLoaderCID, NS_CSS_LOADER_CID);
PR_STATIC_CALLBACK(PRBool)
AppendAgentSheet(nsIStyleSheet *aSheet, void *aData)
{
@ -2151,7 +2149,6 @@ DocumentViewerImpl::CreateStyleSet(nsIDocument* aDocument,
PRBool shouldOverride = PR_FALSE;
nsCOMPtr<nsIDocShell> ds(do_QueryInterface(docShell));
nsCOMPtr<nsIChromeEventHandler> chromeHandler;
nsCOMPtr<nsICSSLoader> cssLoader( do_GetService(kCSSLoaderCID) );
nsCOMPtr<nsIURI> uri;
nsCOMPtr<nsICSSStyleSheet> csssheet;
@ -2165,6 +2162,9 @@ DocumentViewerImpl::CreateStyleSet(nsIDocument* aDocument,
nsAutoString sheets;
elt->GetAttribute(NS_LITERAL_STRING("usechromesheets"), sheets);
if (!sheets.IsEmpty() && baseURI) {
nsCOMPtr<nsICSSLoader> cssLoader;
NS_NewCSSLoader(getter_AddRefs(cssLoader));
char *str = ToNewCString(sheets);
char *newStr = str;
char *token;

View File

@ -142,6 +142,7 @@ nsLayoutStylesheetCache::UserChromeSheet()
void
nsLayoutStylesheetCache::Shutdown()
{
NS_IF_RELEASE(gCSSLoader);
NS_IF_RELEASE(gStyleCache);
}
@ -163,6 +164,7 @@ nsLayoutStylesheetCache::nsLayoutStylesheetCache()
nsLayoutStylesheetCache::~nsLayoutStylesheetCache()
{
gCSSLoader = nsnull;
gStyleCache = nsnull;
}
@ -214,8 +216,6 @@ nsLayoutStylesheetCache::LoadSheetFile(nsIFile* aFile, nsCOMPtr<nsICSSStyleSheet
LoadSheet(uri, aSheet);
}
static NS_DEFINE_CID(kCSSLoaderCID, NS_CSS_LOADER_CID);
void
nsLayoutStylesheetCache::LoadSheet(nsIURI* aURI, nsCOMPtr<nsICSSStyleSheet> &aSheet)
{
@ -224,13 +224,15 @@ nsLayoutStylesheetCache::LoadSheet(nsIURI* aURI, nsCOMPtr<nsICSSStyleSheet> &aSh
return;
}
// note: CSS Loader is treated as a service here... slightly unusual,
// but within the rules.
nsCOMPtr<nsICSSLoader> cssLoader = do_GetService(kCSSLoaderCID);
if (!cssLoader) return;
if (!gCSSLoader)
NS_NewCSSLoader(&gCSSLoader);
cssLoader->LoadSheetSync(aURI, getter_AddRefs(aSheet));
if (gCSSLoader)
gCSSLoader->LoadSheetSync(aURI, getter_AddRefs(aSheet));
}
nsLayoutStylesheetCache*
nsLayoutStylesheetCache::gStyleCache = nsnull;
nsICSSLoader*
nsLayoutStylesheetCache::gCSSLoader = nsnull;

View File

@ -43,7 +43,7 @@
#include "nsIObserver.h"
class nsIFile;
class nsICSSLoader;
class nsLayoutStylesheetCache
: public nsIObserver
@ -68,6 +68,7 @@ private:
static void LoadSheet(nsIURI* aURI, nsCOMPtr<nsICSSStyleSheet> &aSheet);
static nsLayoutStylesheetCache* gStyleCache;
static nsICSSLoader* gCSSLoader;
nsCOMPtr<nsICSSStyleSheet> mScrollbarsSheet;
nsCOMPtr<nsICSSStyleSheet> mFormsSheet;
nsCOMPtr<nsICSSStyleSheet> mUserContentSheet;

View File

@ -57,6 +57,7 @@ REQUIRES = xpcom \
rdf \
necko \
content \
layout \
xuldoc \
jar \
$(NULL)

View File

@ -71,7 +71,6 @@
#include "nsIDocument.h"
#include "nsIDOMDocument.h"
#include "nsIStyleSheet.h"
#include "nsICSSLoader.h"
#include "nsICSSStyleSheet.h"
#include "nsIPresShell.h"
#include "nsIDocShell.h"
@ -2984,10 +2983,13 @@ nsresult nsChromeRegistry::LoadStyleSheetWithURL(nsIURI* aURL, nsICSSStyleSheet*
{
*aSheet = nsnull;
nsCOMPtr<nsICSSLoader> cssLoader = do_GetService(kCSSLoaderCID);
if (!cssLoader) return NS_ERROR_FAILURE;
if (!mCSSLoader) {
nsresult rv;
mCSSLoader = do_CreateInstance(kCSSLoaderCID, &rv);
NS_ENSURE_SUCCESS(rv, rv);
}
return cssLoader->LoadSheetSync(aURL, aSheet);
return mCSSLoader->LoadSheetSync(aURL, aSheet);
}
nsresult nsChromeRegistry::LoadInstallDataSource()

View File

@ -56,6 +56,7 @@ class nsIDocument;
#include "nsIObserver.h"
#include "nsWeakReference.h"
#include "nsString.h"
#include "nsICSSLoader.h"
#include "nsIZipReader.h"
#include "nsCOMArray.h"
@ -257,6 +258,7 @@ protected:
nsCOMPtr<nsIRDFResource> mDisabled;
nsCOMPtr<nsIRDFResource> mXPCNativeWrappers;
nsCOMPtr<nsICSSLoader> mCSSLoader;
nsCOMPtr<nsIZipReader> mOverrideJAR;
nsCString mOverrideJARURL;