diff --git a/chrome/src/nsChromeRegistry.cpp b/chrome/src/nsChromeRegistry.cpp index 04919061395..93e17860c70 100644 --- a/chrome/src/nsChromeRegistry.cpp +++ b/chrome/src/nsChromeRegistry.cpp @@ -76,7 +76,6 @@ #include "nsIAtom.h" #include "nsICommandLine.h" -#include "nsICSSLoader.h" #include "nsICSSStyleSheet.h" #include "nsIConsoleService.h" #include "nsIDirectoryService.h" @@ -865,10 +864,6 @@ static void FlushSkinBindingsForWindow(nsIDOMWindowInternal* aWindow) // XXXbsmedberg: move this to nsIWindowMediator NS_IMETHODIMP nsChromeRegistry::RefreshSkins() { - nsCOMPtr cssLoader(do_CreateInstance(kCSSLoaderCID)); - if (!cssLoader) - return NS_OK; - nsCOMPtr windowMediator (do_GetService(NS_WINDOWMEDIATOR_CONTRACTID)); if (!windowMediator) @@ -890,7 +885,7 @@ NS_IMETHODIMP nsChromeRegistry::RefreshSkins() } FlushSkinCaches(); - + windowMediator->GetEnumerator(nsnull, getter_AddRefs(windowEnumerator)); windowEnumerator->HasMoreElements(&more); while (more) { @@ -899,7 +894,7 @@ NS_IMETHODIMP nsChromeRegistry::RefreshSkins() if (protoWindow) { nsCOMPtr domWindow = do_QueryInterface(protoWindow); if (domWindow) - RefreshWindow(domWindow, cssLoader); + RefreshWindow(domWindow); } windowEnumerator->HasMoreElements(&more); } @@ -927,8 +922,7 @@ static PRBool IsChromeURI(nsIURI* aURI) } // XXXbsmedberg: move this to windowmediator -nsresult nsChromeRegistry::RefreshWindow(nsIDOMWindowInternal* aWindow, - nsICSSLoader* aCSSLoader) +nsresult nsChromeRegistry::RefreshWindow(nsIDOMWindowInternal* aWindow) { // Deal with our subframes first. nsCOMPtr frames; @@ -940,7 +934,7 @@ nsresult nsChromeRegistry::RefreshWindow(nsIDOMWindowInternal* aWindow, nsCOMPtr childWin; frames->Item(j, getter_AddRefs(childWin)); nsCOMPtr childInt(do_QueryInterface(childWin)); - RefreshWindow(childInt, aCSSLoader); + RefreshWindow(childInt); } nsresult rv; @@ -973,8 +967,8 @@ nsresult nsChromeRegistry::RefreshWindow(nsIDOMWindowInternal* aWindow, if (IsChromeURI(uri)) { // Reload the sheet. nsCOMPtr newSheet; - rv = aCSSLoader->LoadSheetSync(uri, PR_TRUE, PR_TRUE, - getter_AddRefs(newSheet)); + rv = document->LoadChromeSheetSync(uri, PR_TRUE, + getter_AddRefs(newSheet)); if (NS_FAILED(rv)) return rv; if (newSheet) { rv = newAgentSheets.AppendObject(newSheet) ? NS_OK : NS_ERROR_FAILURE; @@ -1002,13 +996,13 @@ nsresult nsChromeRegistry::RefreshWindow(nsIDOMWindowInternal* aWindow, for (i = 0; i < count; i++) { // Get the style sheet nsIStyleSheet *styleSheet = document->GetStyleSheetAt(i); - + if (!oldSheets.AppendObject(styleSheet)) { return NS_ERROR_OUT_OF_MEMORY; } } - // Iterate over our old sheets and kick off a sync load of the new + // Iterate over our old sheets and kick off a sync load of the new // sheet if and only if it's a chrome URL. for (i = 0; i < count; i++) { nsCOMPtr sheet = do_QueryInterface(oldSheets[i]); @@ -1019,8 +1013,7 @@ nsresult nsChromeRegistry::RefreshWindow(nsIDOMWindowInternal* aWindow, nsCOMPtr newSheet; // 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! - aCSSLoader->LoadSheetSync(uri, getter_AddRefs(newSheet)); + document->LoadChromeSheetSync(uri, PR_FALSE, getter_AddRefs(newSheet)); // Even if it's null, we put in in there. newSheets.AppendObject(newSheet); } diff --git a/chrome/src/nsChromeRegistry.h b/chrome/src/nsChromeRegistry.h index 2216cd010cc..46d6eb0c51f 100644 --- a/chrome/src/nsChromeRegistry.h +++ b/chrome/src/nsChromeRegistry.h @@ -58,8 +58,6 @@ struct PRFileDesc; class nsIAtom; -class nsICSSLoader; -class nsICSSStyleSheet; class nsIDOMWindowInternal; class nsILocalFile; class nsIPrefBranch; @@ -119,8 +117,7 @@ protected: private: nsresult SelectLocaleFromPref(nsIPrefBranch* prefs); - static nsresult RefreshWindow(nsIDOMWindowInternal* aWindow, - nsICSSLoader* aCSSLoader); + static nsresult RefreshWindow(nsIDOMWindowInternal* aWindow); static nsresult GetProviderAndPath(nsIURL* aChromeURL, nsACString& aProvider, nsACString& aPath); diff --git a/content/base/public/nsIDocument.h b/content/base/public/nsIDocument.h index fefe17ea273..8b29ab719ad 100644 --- a/content/base/public/nsIDocument.h +++ b/content/base/public/nsIDocument.h @@ -69,6 +69,7 @@ class nsIDocShell; class nsStyleSet; class nsIStyleSheet; class nsIStyleRule; +class nsICSSStyleSheet; class nsIViewManager; class nsIScriptGlobalObject; class nsPIDOMWindow; @@ -110,10 +111,10 @@ class Link; } // namespace dom } // namespace mozilla -// IID for the nsIDocument interface +// 0bce8f8b-8e27-44e6-92bc-65d0805b7fb4 #define NS_IDOCUMENT_IID \ - { 0xd7978655, 0x9b7d, 0x41e6, \ - { 0xad, 0x48, 0xdf, 0x32, 0x0b, 0x06, 0xb4, 0xda } } +{ 0x0bce8f8b, 0x8e27, 0x44e6, \ + { 0x92, 0xbc, 0x65, 0xd0, 0x80, 0x5b, 0x7f, 0xb4 } } // Flag for AddStyleSheet(). #define NS_STYLESHEET_FROM_CATALOG (1 << 0) @@ -1208,6 +1209,23 @@ public: */ virtual void MaybePreLoadImage(nsIURI* uri) = 0; + /** + * Called by nsParser to preload style sheets. Can also be merged into + * the parser if and when the parser is merged with libgklayout. + */ + virtual void PreloadStyle(nsIURI* aURI, const nsAString& aCharset) = 0; + + /** + * Called by the chrome registry to load style sheets. Can be put + * back there if and when when that module is merged with libgklayout. + * + * This always does a synchronous load. If aIsAgentSheet is true, + * it also uses the system principal and enables unsafe rules. + * DO NOT USE FOR UNTRUSTED CONTENT. + */ + virtual nsresult LoadChromeSheetSync(nsIURI* aURI, PRBool aIsAgentSheet, + nsICSSStyleSheet** aSheet) = 0; + /** * Returns true if the locale used for the document specifies a direction of * right to left. For chrome documents, this comes from the chrome registry. diff --git a/content/base/src/nsDocument.cpp b/content/base/src/nsDocument.cpp index 016d0268ca4..29efe880e88 100644 --- a/content/base/src/nsDocument.cpp +++ b/content/base/src/nsDocument.cpp @@ -7618,6 +7618,44 @@ nsDocument::MaybePreLoadImage(nsIURI* uri) } } +namespace { + +/** + * Stub for LoadSheet(), since all we want is to get the sheet into + * the CSSLoader's style cache + */ +class StubCSSLoaderObserver : public nsICSSLoaderObserver { +public: + NS_IMETHOD + StyleSheetLoaded(nsICSSStyleSheet*, PRBool, nsresult) + { + return NS_OK; + } + NS_DECL_ISUPPORTS +}; +NS_IMPL_ISUPPORTS1(StubCSSLoaderObserver, nsICSSLoaderObserver) + +} + +void +nsDocument::PreloadStyle(nsIURI* uri, const nsAString& charset) +{ + // The CSSLoader will retain this object after we return. + nsCOMPtr obs = new StubCSSLoaderObserver(); + + // Charset names are always ASCII. + CSSLoader()->LoadSheet(uri, NodePrincipal(), + NS_LossyConvertUTF16toASCII(charset), + obs); +} + +nsresult +nsDocument::LoadChromeSheetSync(nsIURI* uri, PRBool isAgentSheet, + nsICSSStyleSheet** sheet) +{ + return CSSLoader()->LoadSheetSync(uri, isAgentSheet, isAgentSheet, sheet); +} + class nsDelayedEventDispatcher : public nsRunnable { public: diff --git a/content/base/src/nsDocument.h b/content/base/src/nsDocument.h index a456ae4fc40..17bda86580c 100644 --- a/content/base/src/nsDocument.h +++ b/content/base/src/nsDocument.h @@ -933,6 +933,11 @@ public: virtual void MaybePreLoadImage(nsIURI* uri); + virtual void PreloadStyle(nsIURI* uri, const nsAString& charset); + + virtual nsresult LoadChromeSheetSync(nsIURI* uri, PRBool isAgentSheet, + nsICSSStyleSheet** sheet); + virtual nsISupports* GetCurrentContentSink(); protected: diff --git a/layout/Makefile.in b/layout/Makefile.in index a296692b60b..3de0a61501a 100644 --- a/layout/Makefile.in +++ b/layout/Makefile.in @@ -83,12 +83,8 @@ PARALLEL_DIRS += \ xul/base/test \ $(NULL) -TOOL_DIRS += tools/reftest +TOOL_DIRS += tools/reftest reftests/fonts reftests/fonts/mplus DIRS += tools/pageloader -ifndef MOZ_ENABLE_LIBXUL -TOOL_DIRS += html/tests -endif -TOOL_DIRS += reftests/fonts reftests/fonts/mplus endif include $(topsrcdir)/config/rules.mk diff --git a/layout/html/tests/Makefile.in b/layout/html/tests/Makefile.in deleted file mode 100644 index 5d566fc57b3..00000000000 --- a/layout/html/tests/Makefile.in +++ /dev/null @@ -1,80 +0,0 @@ -# -# ***** 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) 1998 -# 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 ***** - -DEPTH = ../../.. -topsrcdir = @top_srcdir@ -srcdir = @srcdir@ -VPATH = @srcdir@ - -include $(DEPTH)/config/autoconf.mk - -MOZILLA_INTERNAL_API = 1 - - -SIMPLE_PROGRAMS = $(CPPSRCS:.cpp=$(BIN_SUFFIX)) - -CPPSRCS = \ - ParseCSS.cpp \ - TestCSSPropertyLookup.cpp \ - $(NULL) - -LIBS = \ - $(LIBS_DIR) \ - $(DEPTH)/content/html/content/src/$(LIB_PREFIX)gkconhtmlcon_s.$(LIB_SUFFIX) \ - $(DEPTH)/content/html/document/src/$(LIB_PREFIX)gkconhtmldoc_s.$(LIB_SUFFIX) \ - ../../forms/$(LIB_PREFIX)gkforms_s.$(LIB_SUFFIX) \ - ../../style/$(LIB_PREFIX)gkstyle_s.$(LIB_SUFFIX) \ - ../../tables/$(LIB_PREFIX)gktable_s.$(LIB_SUFFIX) \ - ../../base/$(LIB_PREFIX)gkbase_s.$(LIB_SUFFIX) \ - ../../generic/$(LIB_PREFIX)gkgeneric_s.$(LIB_SUFFIX) \ - $(DEPTH)/content/base/src/$(LIB_PREFIX)gkconbase_s.$(LIB_SUFFIX) \ - $(DEPTH)/content/events/src/$(LIB_PREFIX)gkconevents_s.$(LIB_SUFFIX) \ - $(DEPTH)/content/xml/content/src/$(LIB_PREFIX)gkconxmlcon_s.$(LIB_SUFFIX) \ - $(DEPTH)/content/xml/document/src/$(LIB_PREFIX)gkconxmldoc_s.$(LIB_SUFFIX) \ - ../../xul/base/src/$(LIB_PREFIX)gkxulbase_s.$(LIB_SUFFIX) \ - $(MOZ_JS_LIBS) \ - $(call EXPAND_LIBNAME_PATH,gkgfx,$(DEPTH)/gfx/src) \ - $(TK_LIBS) \ - $(MOZ_UNICHARUTIL_LIBS) \ - $(MOZ_COMPONENT_LIBS) \ - $(NULL) - -include $(topsrcdir)/config/config.mk - -include $(topsrcdir)/config/rules.mk - -DEFINES += -D_IMPL_NS_LAYOUT diff --git a/layout/style/Makefile.in b/layout/style/Makefile.in index a47513075a6..f9e410f7b6c 100644 --- a/layout/style/Makefile.in +++ b/layout/style/Makefile.in @@ -41,10 +41,10 @@ VPATH = @srcdir@ include $(DEPTH)/config/autoconf.mk -DIRS = xbl-marquee +DIRS = xbl-marquee ifdef ENABLE_TESTS -DIRS += test +TOOL_DIRS = test endif MODULE = layout diff --git a/layout/style/test/Makefile.in b/layout/style/test/Makefile.in index 6daaef5b342..02e2ec78390 100644 --- a/layout/style/test/Makefile.in +++ b/layout/style/test/Makefile.in @@ -62,10 +62,27 @@ HOST_CPPSRCS = \ HOST_SIMPLE_PROGRAMS = $(addprefix host_, $(HOST_CPPSRCS:.cpp=$(HOST_BIN_SUFFIX))) + +# ParseCSS.cpp used to be built as a test program, but it was not +# being used for anything, and recent changes to the CSS loader have +# made it fail to link. Further changes are planned which should make +# it buildable again. +# +# TestCSSPropertyLookup.cpp needs the internal XPCOM APIs and so cannot +# be built with libxul enabled. + +ifndef MOZ_ENABLE_LIBXUL +CPP_UNIT_TESTS = TestCSSPropertyLookup.cpp +LIBS += ../nsCSSKeywords.o ../nsCSSProps.o $(XPCOM_LIBS) +endif + include $(topsrcdir)/config/rules.mk +DEFINES += -DMOZILLA_INTERNAL_API -D_IMPL_NS_LAYOUT + # FIXME: We don't seem to do auto-generated dependencies here. host_ListCSSProperties.$(OBJ_SUFFIX): $(srcdir)/../nsCSSPropList.h +TestCSSPropertyLookup.$(OBJ_SUFFIX): $(srcdir)/../nsCSSProps.h $(srcdir)/../nsCSSKeywords.h css_properties.js: host_ListCSSProperties$(HOST_BIN_SUFFIX) css_properties_like_longhand.js Makefile $(RM) $@ @@ -74,6 +91,7 @@ css_properties.js: host_ListCSSProperties$(HOST_BIN_SUFFIX) css_properties_like_ GARBAGE += css_properties.js + _TEST_FILES = test_acid3_test46.html \ test_at_rule_parse_serialize.html \ test_bug73586.html \ diff --git a/layout/html/tests/ParseCSS.cpp b/layout/style/test/ParseCSS.cpp similarity index 100% rename from layout/html/tests/ParseCSS.cpp rename to layout/style/test/ParseCSS.cpp diff --git a/layout/html/tests/TestCSSPropertyLookup.cpp b/layout/style/test/TestCSSPropertyLookup.cpp similarity index 89% rename from layout/html/tests/TestCSSPropertyLookup.cpp rename to layout/style/test/TestCSSPropertyLookup.cpp index 171cf99d818..fcf010b6a2b 100644 --- a/layout/html/tests/TestCSSPropertyLookup.cpp +++ b/layout/style/test/TestCSSPropertyLookup.cpp @@ -39,6 +39,7 @@ #include "nsCSSProps.h" #include "nsCSSKeywords.h" #include "nsString.h" +#include "nsXPCOM.h" static const char* const kJunkNames[] = { nsnull, @@ -49,8 +50,10 @@ static const char* const kJunkNames[] = { "#@$&@#*@*$@$#" }; -int TestProps() { - int rv = 0; +static bool +TestProps() +{ + bool success = true; nsCSSProperty id; nsCSSProperty index; @@ -72,11 +75,11 @@ int TestProps() { id = nsCSSProps::LookupProperty(nsCString(tagName)); if (id == eCSSProperty_UNKNOWN) { printf("bug: can't find '%s'\n", tagName); - rv = -1; + success = false; } if (id != index) { printf("bug: name='%s' id=%d index=%d\n", tagName, id, index); - rv = -1; + success = false; } // fiddle with the case to make sure we can still find it @@ -86,11 +89,11 @@ int TestProps() { id = nsCSSProps::LookupProperty(NS_ConvertASCIItoUTF16(tagName)); if (id < 0) { printf("bug: can't find '%s'\n", tagName); - rv = -1; + success = false; } if (index != id) { printf("bug: name='%s' id=%d index=%d\n", tagName, id, index); - rv = -1; + success = false; } et++; } @@ -101,18 +104,20 @@ int TestProps() { id = nsCSSProps::LookupProperty(nsCAutoString(tag)); if (id >= 0) { printf("bug: found '%s'\n", tag ? tag : "(null)"); - rv = -1; + success = false; } } nsCSSProps::ReleaseTable(); - return rv; + return success; } -int TestKeywords() { +bool +TestKeywords() +{ nsCSSKeywords::AddRefTable(); - int rv = 0; + bool success = true; nsCSSKeyword id; nsCSSKeyword index; @@ -140,11 +145,11 @@ int TestKeywords() { id = nsCSSKeywords::LookupKeyword(nsCString(tagName)); if (id <= eCSSKeyword_UNKNOWN) { printf("bug: can't find '%s'\n", tagName); - rv = -1; + success = false; } if (id != index) { printf("bug: name='%s' id=%d index=%d\n", tagName, id, index); - rv = -1; + success = false; } // fiddle with the case to make sure we can still find it @@ -154,11 +159,11 @@ int TestKeywords() { id = nsCSSKeywords::LookupKeyword(nsCString(tagName)); if (id <= eCSSKeyword_UNKNOWN) { printf("bug: can't find '%s'\n", tagName); - rv = -1; + success = false; } if (id != index) { printf("bug: name='%s' id=%d index=%d\n", tagName, id, index); - rv = -1; + success = false; } et++; } @@ -169,17 +174,26 @@ int TestKeywords() { id = nsCSSKeywords::LookupKeyword(nsCAutoString(tag)); if (eCSSKeyword_UNKNOWN < id) { printf("bug: found '%s'\n", tag ? tag : "(null)"); - rv = -1; + success = false; } } nsCSSKeywords::ReleaseTable(); - return rv; + return success; } -int main(int argc, char** argv) +int +main(void) { - TestProps(); - TestKeywords(); - return 0; + nsresult rv = NS_InitXPCOM2(nsnull, nsnull, nsnull); + NS_ENSURE_SUCCESS(rv, 2); + + bool testOK = true; + testOK &= TestProps(); + testOK &= TestKeywords(); + + rv = NS_ShutdownXPCOM(nsnull); + NS_ENSURE_SUCCESS(rv, 2); + + return testOK ? 0 : 1; } diff --git a/parser/html/nsHtml5SpeculativeLoader.cpp b/parser/html/nsHtml5SpeculativeLoader.cpp index 1663807d969..93f2e1183d7 100644 --- a/parser/html/nsHtml5SpeculativeLoader.cpp +++ b/parser/html/nsHtml5SpeculativeLoader.cpp @@ -39,28 +39,12 @@ * ***** END LICENSE BLOCK ***** */ #include "nsHtml5SpeculativeLoader.h" -#include "nsICSSLoader.h" #include "nsNetUtil.h" #include "nsScriptLoader.h" -#include "nsICSSLoaderObserver.h" #include "nsIDocument.h" -/** - * Used if we need to pass an nsICSSLoaderObserver as parameter, - * but don't really need its services - */ -class nsHtml5DummyCSSLoaderObserver : public nsICSSLoaderObserver { -public: - NS_IMETHOD - StyleSheetLoaded(nsICSSStyleSheet* aSheet, PRBool aWasAlternate, nsresult aStatus) { - return NS_OK; - } - NS_DECL_ISUPPORTS -}; - -NS_IMPL_ISUPPORTS1(nsHtml5DummyCSSLoaderObserver, nsICSSLoaderObserver) - -nsHtml5SpeculativeLoader::nsHtml5SpeculativeLoader(nsHtml5TreeOpExecutor* aExecutor) +nsHtml5SpeculativeLoader:: +nsHtml5SpeculativeLoader(nsHtml5TreeOpExecutor* aExecutor) : mExecutor(aExecutor) { MOZ_COUNT_CTOR(nsHtml5SpeculativeLoader); @@ -125,13 +109,9 @@ nsHtml5SpeculativeLoader::PreloadStyle(const nsAString& aURL, if (!uri) { return; } - nsCOMPtr obs = new nsHtml5DummyCSSLoaderObserver(); nsIDocument* doc = mExecutor->GetDocument(); if (doc) { - doc->CSSLoader()->LoadSheet(uri, - doc->NodePrincipal(), - NS_LossyConvertUTF16toASCII(aCharset), - obs); + doc->PreloadStyle(uri, aCharset); } } diff --git a/parser/htmlparser/src/nsParser.cpp b/parser/htmlparser/src/nsParser.cpp index 47579527d36..e1d4eeec4d2 100644 --- a/parser/htmlparser/src/nsParser.cpp +++ b/parser/htmlparser/src/nsParser.cpp @@ -72,8 +72,6 @@ #include "nsIThreadPool.h" #include "nsXPCOMCIDInternal.h" #include "nsICSSStyleSheet.h" -#include "nsICSSLoaderObserver.h" -#include "nsICSSLoader.h" #include "nsMimeTypes.h" #ifdef MOZ_VIEW_SOURCE @@ -295,21 +293,6 @@ private: PRBool mTerminated; }; -/** - * Used if we need to pass an nsICSSLoaderObserver as parameter, - * but don't really need its services - */ -class nsDummyCSSLoaderObserver : public nsICSSLoaderObserver { -public: - NS_IMETHOD - StyleSheetLoaded(nsICSSStyleSheet* aSheet, PRBool aWasAlternate, nsresult aStatus) { - return NS_OK; - } - NS_DECL_ISUPPORTS -}; - -NS_IMPL_ISUPPORTS1(nsDummyCSSLoaderObserver, nsICSSLoaderObserver) - class nsPreloadURIs : public nsIRunnable { public: nsPreloadURIs(nsAutoTArray &aURIs, @@ -386,13 +369,9 @@ nsPreloadURIs::PreloadURIs(const nsAutoTArrayMaybePreLoadImage(uri); break; - case nsSpeculativeScriptThread::STYLESHEET: { - nsCOMPtr obs = new nsDummyCSSLoaderObserver(); - doc->CSSLoader()->LoadSheet(uri, doc->NodePrincipal(), - NS_LossyConvertUTF16toASCII(pe.charset), - obs); + case nsSpeculativeScriptThread::STYLESHEET: + doc->PreloadStyle(uri, pe.charset); break; - } case nsSpeculativeScriptThread::NONE: NS_NOTREACHED("Uninitialized preload entry?"); break;