diff --git a/content/base/src/nsDocument.cpp b/content/base/src/nsDocument.cpp index e4dd9a19b42..0bc16975cef 100644 --- a/content/base/src/nsDocument.cpp +++ b/content/base/src/nsDocument.cpp @@ -143,6 +143,8 @@ static NS_DEFINE_CID(kDOMEventGroupCID, NS_DOMEVENTGROUP_CID); #include "nsIDOMXPathEvaluator.h" #include "nsDOMCID.h" +#include "nsLayoutStatics.h" + #ifdef MOZ_LOGGING // so we can get logging even in release builds #define FORCE_PR_LOG 1 @@ -707,6 +709,7 @@ nsDocument::nsDocument(const char* aContentType) : nsIDocument(), mVisible(PR_TRUE) { + nsLayoutStatics::AddRef(); mContentType = aContentType; #ifdef PR_LOGGING @@ -826,6 +829,7 @@ nsDocument::~nsDocument() delete mHeaderData; delete mBoxObjectTable; + nsLayoutStatics::Release(); } NS_INTERFACE_MAP_BEGIN(nsDocument) diff --git a/dom/public/coreEvents/nsIDOMKeyListener.h b/dom/public/coreEvents/nsIDOMKeyListener.h index fc43c420cb4..a9f1a6c0730 100644 --- a/dom/public/coreEvents/nsIDOMKeyListener.h +++ b/dom/public/coreEvents/nsIDOMKeyListener.h @@ -41,6 +41,11 @@ #include "nsIDOMEvent.h" #include "nsIDOMEventListener.h" +// X.h defines KeyPress +#ifdef KeyPress +#undef KeyPress +#endif + /* * Key pressed / released / typed listener interface. */ diff --git a/dom/src/base/nsGlobalWindow.cpp b/dom/src/base/nsGlobalWindow.cpp index b5f69fbd4a8..35524daa819 100644 --- a/dom/src/base/nsGlobalWindow.cpp +++ b/dom/src/base/nsGlobalWindow.cpp @@ -69,6 +69,7 @@ #include "nsIJVMManager.h" #endif #include "nsContentCID.h" +#include "nsLayoutStatics.h" // Interfaces Needed #include "nsIWidget.h" @@ -345,6 +346,8 @@ nsGlobalWindow::nsGlobalWindow(nsGlobalWindow *aOuterWindow) , mSetOpenerWindowCalled(PR_FALSE) #endif { + nsLayoutStatics::AddRef(); + // Initialize the PRCList (this). PR_INIT_CLIST(this); @@ -463,6 +466,8 @@ nsGlobalWindow::~nsGlobalWindow() CleanUp(); delete mPendingStorageEvents; + + nsLayoutStatics::Release(); } // static diff --git a/layout/build/Makefile.in b/layout/build/Makefile.in index 7874b22674e..d42fa5d1c92 100644 --- a/layout/build/Makefile.in +++ b/layout/build/Makefile.in @@ -111,11 +111,13 @@ CPPSRCS = \ nsLayoutModule.cpp \ nsContentHTTPStartup.cpp \ nsContentDLF.cpp \ + nsLayoutStatics.cpp \ $(NULL) EXPORTS = \ nsLayoutCID.h \ nsContentDLF.h \ + nsLayoutStatics.h \ $(NULL) SHARED_LIBRARY_LIBS = \ diff --git a/layout/build/nsLayoutModule.cpp b/layout/build/nsLayoutModule.cpp index 522a6ece0a4..e85a95461c5 100644 --- a/layout/build/nsLayoutModule.cpp +++ b/layout/build/nsLayoutModule.cpp @@ -35,33 +35,21 @@ * the terms of any one of the MPL, the GPL or the LGPL. * * ***** END LICENSE BLOCK ***** */ -#include "nsXBLAtoms.h" // to addref/release table -#include "nsCSSPseudoElements.h" // to addref/release table -#include "nsCSSPseudoClasses.h" // to addref/release table -#include "nsCSSAnonBoxes.h" // to addref/release table -#include "nsCSSKeywords.h" // to addref/release table -#include "nsCSSProps.h" // to addref/release table -#include "nsColorNames.h" // to addref/release table + +#include "nsLayoutStatics.h" #include "nsContentCID.h" #include "nsContentHTTPStartup.h" #include "nsContentDLF.h" #include "nsContentPolicyUtils.h" -#include "nsContentUtils.h" #include "nsDataDocumentContentPolicy.h" -#include "nsLayoutStylesheetCache.h" #include "nsDOMCID.h" #include "nsCSSOMFactory.h" #include "nsInspectorCSSUtils.h" -#include "nsEventListenerManager.h" -#include "nsGenericElement.h" -#include "nsHTMLAtoms.h" -#include "nsHTMLAtoms.h" #include "nsHTMLContentSerializer.h" #include "nsHTMLParts.h" #include "nsGenericHTMLElement.h" #include "nsICSSLoader.h" #include "nsICSSParser.h" -#include "nsCSSScanner.h" #include "nsICSSStyleSheet.h" #include "nsICategoryManager.h" #include "nsIComponentManager.h" @@ -98,38 +86,23 @@ #include "nsISelection.h" #include "nsIXBLService.h" #include "nsICaret.h" -#include "nsJSEnvironment.h" -#include "nsLayoutAtoms.h" #include "nsPlainTextSerializer.h" #include "mozSanitizingSerializer.h" -#include "nsRange.h" -#include "nsComputedDOMStyle.h" #include "nsXMLContentSerializer.h" #include "nsRuleNode.h" #include "nsWyciwygProtocolHandler.h" #include "nsContentAreaDragDrop.h" #include "nsContentList.h" #include "nsISyncLoadDOMService.h" -#include "nsCSSFrameConstructor.h" -#include "nsRepeatService.h" -#include "nsSprocketLayout.h" -#include "nsStackLayout.h" #include "nsBox.h" -#include "nsSpaceManager.h" -#include "nsTextTransformer.h" #include "nsIFrameTraversal.h" #ifndef MOZ_CAIRO_GFX #include "nsISelectionImageService.h" #endif -#include "nsCSSLoader.h" #include "nsXULAtoms.h" #include "nsLayoutCID.h" -#include "nsStyleSet.h" -#include "nsImageFrame.h" #include "nsILanguageAtomService.h" -#include "nsTextControlFrame.h" #include "nsStyleSheetService.h" -#include "nsNodeInfo.h" // Transformiix stuff #include "nsXPathEvaluator.h" @@ -147,21 +120,15 @@ #include "nsViewsCID.h" #include "nsViewManager.h" #include "nsContentCreatorFunctions.h" -#include "nsFrame.h" -#include "nsXBLWindowKeyHandler.h" // DOM includes #include "nsDOMException.h" #include "nsGlobalWindowCommands.h" #include "nsIControllerCommandTable.h" #include "nsJSProtocolHandler.h" -#include "nsGlobalWindow.h" -#include "nsDOMClassInfo.h" #include "nsScriptNameSpaceManager.h" #include "nsIControllerContext.h" #include "nsDOMScriptObjectFactory.h" -#include "nsAutoCopyListener.h" -#include "nsDOMAttribute.h" #include "nsDOMStorage.h" #include "nsHTMLCanvasFrame.h" @@ -191,14 +158,13 @@ class nsIDocumentLoaderFactory; static NS_DEFINE_CID(kWindowCommandTableCID, NS_WINDOWCOMMANDTABLE_CID); #ifdef MOZ_XUL +#include "nsIBoxObject.h" #include "nsIXULDocument.h" #include "nsIXULPopupListener.h" #include "nsIXULPrototypeCache.h" #include "nsIXULPrototypeDocument.h" #include "nsIXULPrototypeDocument.h" #include "nsIXULSortService.h" -#include "nsXULContentUtils.h" -#include "nsXULElement.h" NS_IMETHODIMP NS_NewXULContentBuilder(nsISupports* aOuter, REFNSIID aIID, void** aResult); @@ -210,20 +176,13 @@ NS_NewXULTreeBuilder(nsISupports* aOuter, REFNSIID aIID, void** aResult); PR_STATIC_CALLBACK(nsresult) Initialize(nsIModule* aSelf); static void Shutdown(); -#ifdef MOZ_MATHML -#include "nsMathMLAtoms.h" -#include "nsMathMLOperators.h" -#endif - #ifdef MOZ_XTF #include "nsIXTFService.h" #include "nsIXMLContentBuilder.h" #endif #ifdef MOZ_SVG -#include "nsSVGAtoms.h" #include "nsISVGRenderer.h" -#include "nsSVGUtils.h" #endif // Transformiix @@ -289,79 +248,11 @@ Initialize(nsIModule* aSelf) gInitialized = PR_TRUE; - nsJSEnvironment::Startup(); - nsresult rv = nsContentUtils::Init(); + nsresult rv = nsLayoutStatics::Initialize(); if (NS_FAILED(rv)) { - NS_ERROR("Could not initialize nsContentUtils"); - Shutdown(); - return rv; } - rv = nsAttrValue::Init(); - if (NS_FAILED(rv)) { - NS_ERROR("Could not initialize nsAttrValue"); - - Shutdown(); - - return rv; - } - - rv = nsTextFragment::Init(); - if (NS_FAILED(rv)) { - NS_ERROR("Could not initialize nsAttrValue"); - - Shutdown(); - - return rv; - } - - // Register all of our atoms once - nsCSSAnonBoxes::AddRefAtoms(); - nsCSSPseudoClasses::AddRefAtoms(); - nsCSSPseudoElements::AddRefAtoms(); - nsCSSKeywords::AddRefTable(); - nsCSSProps::AddRefTable(); - nsColorNames::AddRefTable(); - nsGkAtoms::AddRefAtoms(); - -#ifdef MOZ_XUL - rv = nsXULContentUtils::Init(); - if (NS_FAILED(rv)) { - NS_ERROR("Could not initialize nsXULContentUtils"); - - Shutdown(); - - return rv; - } -#endif - -#ifdef MOZ_MATHML - nsMathMLOperators::AddRefTable(); -#endif - -#ifdef MOZ_SVG - if (nsSVGUtils::SVGEnabled()) - nsContentDLF::RegisterSVG(); -#endif - -#ifdef DEBUG - nsFrame::DisplayReflowStartup(); -#endif - rv = nsTextTransformer::Initialize(); - if (NS_FAILED(rv)) { - NS_ERROR("Could not initialize nsTextTransformer"); - - Shutdown(); - - return rv; - } - nsDOMAttribute::Initialize(); - - if (!txXSLTProcessor::init()) { - Shutdown(); - return NS_ERROR_OUT_OF_MEMORY; - } // Add our shutdown observer. nsCOMPtr observerService = @@ -396,62 +287,7 @@ Shutdown() gInitialized = PR_FALSE; - nsNodeInfo::ClearCache(); - txXSLTProcessor::shutdown(); - nsDOMAttribute::Shutdown(); - nsRange::Shutdown(); - nsDOMEventRTTearoff::Shutdown(); - nsEventListenerManager::Shutdown(); - nsContentList::Shutdown(); - nsComputedDOMStyle::Shutdown(); - CSSLoaderImpl::Shutdown(); -#ifdef DEBUG - nsFrame::DisplayReflowShutdown(); -#endif - - // Release all of our atoms - nsColorNames::ReleaseTable(); - nsCSSProps::ReleaseTable(); - nsCSSKeywords::ReleaseTable(); - nsRepeatService::Shutdown(); - nsStackLayout::Shutdown(); - nsBox::Shutdown(); - -#ifdef MOZ_XUL - nsXULContentUtils::Finish(); - nsXULElement::ReleaseGlobals(); - nsXULPrototypeElement::ReleaseGlobals(); - nsXULPrototypeScript::ReleaseGlobals(); - nsSprocketLayout::Shutdown(); -#endif - -#ifdef MOZ_MATHML - nsMathMLOperators::ReleaseTable(); -#endif - - nsCSSFrameConstructor::ReleaseGlobals(); - nsTextTransformer::Shutdown(); - nsSpaceManager::Shutdown(); - nsImageFrame::ReleaseGlobals(); - - nsCSSScanner::ReleaseGlobals(); - - NS_IF_RELEASE(nsContentDLF::gUAStyleSheet); - NS_IF_RELEASE(nsRuleNode::gLangService); - nsGenericHTMLElement::Shutdown(); - - nsTextFragment::Shutdown(); - nsAttrValue::Shutdown(); - nsContentUtils::Shutdown(); - nsLayoutStylesheetCache::Shutdown(); - NS_NameSpaceManagerShutdown(); - nsStyleSet::FreeGlobals(); - - nsGlobalWindow::ShutDown(); - nsDOMClassInfo::ShutDown(); - nsTextControlFrame::ShutDown(); - nsXBLWindowKeyHandler::ShutDown(); - nsAutoCopyListener::Shutdown(); + nsLayoutStatics::Release(); } #ifdef NS_DEBUG diff --git a/layout/build/nsLayoutStatics.cpp b/layout/build/nsLayoutStatics.cpp new file mode 100644 index 00000000000..ea575f9867d --- /dev/null +++ b/layout/build/nsLayoutStatics.cpp @@ -0,0 +1,265 @@ +/* ***** 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 the Mozilla platform. + * + * The Initial Developer of the Original Code is + * Benjamin Smedberg . + * + * Portions created by the Initial Developer are Copyright (C) 2006 + * the Mozilla Foundation . All Rights Reserved. + * + * Contributor(s): + * + * Alternatively, the contents of this file may be used under the terms of + * either 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 ***** */ + +#include "nsLayoutStatics.h" +#include "nscore.h" + +#include "nsAttrValue.h" +#include "nsAutoCopyListener.h" +#include "nsColorNames.h" +#include "nsComputedDOMStyle.h" +#include "nsContentDLF.h" +#include "nsContentUtils.h" +#include "nsCSSAnonBoxes.h" +#include "nsCSSFrameConstructor.h" +#include "nsCSSKeywords.h" +#include "nsCSSLoader.h" +#include "nsCSSProps.h" +#include "nsCSSPseudoClasses.h" +#include "nsCSSPseudoElements.h" +#include "nsCSSScanner.h" +#include "nsICSSStyleSheet.h" +#include "nsDOMAttribute.h" +#include "nsDOMClassInfo.h" +#include "nsEventListenerManager.h" +#include "nsFrame.h" +#include "nsGenericElement.h" // for nsDOMEventRTTearoff +#include "nsGenericHTMLElement.h" +#include "nsGlobalWindow.h" +#include "nsHTMLAtoms.h" +#include "nsImageFrame.h" +#include "nsJSEnvironment.h" +#include "nsLayoutAtoms.h" +#include "nsLayoutStylesheetCache.h" +#include "nsNodeInfo.h" +#include "nsRange.h" +#include "nsRepeatService.h" +#include "nsSpaceManager.h" +#include "nsSprocketLayout.h" +#include "nsStackLayout.h" +#include "nsStyleSet.h" +#include "nsTextControlFrame.h" +#include "nsTextTransformer.h" +#include "nsXBLAtoms.h" +#include "nsXBLWindowKeyHandler.h" +#include "txXSLTProcessor.h" + +#ifdef MOZ_XUL +#include "nsXULContentUtils.h" +#include "nsXULElement.h" +#endif + +#ifdef MOZ_MATHML +#include "nsMathMLAtoms.h" +#include "nsMathMLOperators.h" +#endif + +#ifdef MOZ_SVG +#include "nsSVGAtoms.h" +#include "nsSVGUtils.h" +#endif + +#include "nsError.h" +#include "nsTraceRefcnt.h" + +static nsrefcnt sLayoutStaticRefcnt; + +nsresult +nsLayoutStatics::Initialize() +{ +#ifdef NS_BUILD_REFCNT_LOGGING + NS_LogCtor(&sLayoutStaticRefcnt, "nsLayoutStatics", 1); +#endif + + NS_ASSERTION(sLayoutStaticRefcnt == 0, + "nsLayoutStatics isn't zero!"); + + sLayoutStaticRefcnt = 1; + NS_LOG_ADDREF(&sLayoutStaticRefcnt, sLayoutStaticRefcnt, + "nsLayoutStatics", 0); + + nsresult rv; + + nsJSEnvironment::Startup(); + rv = nsContentUtils::Init(); + if (NS_FAILED(rv)) { + NS_ERROR("Could not initialize nsContentUtils"); + return rv; + } + + rv = nsAttrValue::Init(); + if (NS_FAILED(rv)) { + NS_ERROR("Could not initialize nsAttrValue"); + return rv; + } + + rv = nsTextFragment::Init(); + if (NS_FAILED(rv)) { + NS_ERROR("Could not initialize nsTextFragment"); + return rv; + } + + // Register all of our atoms once + nsCSSAnonBoxes::AddRefAtoms(); + nsCSSPseudoClasses::AddRefAtoms(); + nsCSSPseudoElements::AddRefAtoms(); + nsCSSKeywords::AddRefTable(); + nsCSSProps::AddRefTable(); + nsColorNames::AddRefTable(); + nsGkAtoms::AddRefAtoms(); + +#ifdef MOZ_XUL + rv = nsXULContentUtils::Init(); + if (NS_FAILED(rv)) { + NS_ERROR("Could not initialize nsXULContentUtils"); + return rv; + } +#endif + +#ifdef MOZ_MATHML + nsMathMLOperators::AddRefTable(); +#endif + +#ifdef MOZ_SVG + if (nsSVGUtils::SVGEnabled()) + nsContentDLF::RegisterSVG(); +#endif + +#ifdef DEBUG + nsFrame::DisplayReflowStartup(); +#endif + rv = nsTextTransformer::Initialize(); + if (NS_FAILED(rv)) { + NS_ERROR("Could not initialize nsTextTransformer"); + return rv; + } + nsDOMAttribute::Initialize(); + + if (!txXSLTProcessor::init()) { + return NS_ERROR_OUT_OF_MEMORY; + } + + return NS_OK; +} + +void +nsLayoutStatics::Shutdown() +{ +#ifdef NS_BUILD_REFCNT_LOGGING + NS_LogDtor(&sLayoutStaticRefcnt, "nsLayoutStatics", 1); +#endif + + nsNodeInfo::ClearCache(); + txXSLTProcessor::shutdown(); + nsDOMAttribute::Shutdown(); + nsRange::Shutdown(); + nsDOMEventRTTearoff::Shutdown(); + nsEventListenerManager::Shutdown(); + nsContentList::Shutdown(); + nsComputedDOMStyle::Shutdown(); + CSSLoaderImpl::Shutdown(); +#ifdef DEBUG + nsFrame::DisplayReflowShutdown(); +#endif + + // Release all of our atoms + nsColorNames::ReleaseTable(); + nsCSSProps::ReleaseTable(); + nsCSSKeywords::ReleaseTable(); + nsRepeatService::Shutdown(); + nsStackLayout::Shutdown(); + nsBox::Shutdown(); + +#ifdef MOZ_XUL + nsXULContentUtils::Finish(); + nsXULElement::ReleaseGlobals(); + nsXULPrototypeElement::ReleaseGlobals(); + nsXULPrototypeScript::ReleaseGlobals(); + nsSprocketLayout::Shutdown(); +#endif + +#ifdef MOZ_MATHML + nsMathMLOperators::ReleaseTable(); +#endif + + nsCSSFrameConstructor::ReleaseGlobals(); + nsTextTransformer::Shutdown(); + nsSpaceManager::Shutdown(); + nsImageFrame::ReleaseGlobals(); + + nsCSSScanner::ReleaseGlobals(); + + NS_IF_RELEASE(nsContentDLF::gUAStyleSheet); + NS_IF_RELEASE(nsRuleNode::gLangService); + nsGenericHTMLElement::Shutdown(); + + nsTextFragment::Shutdown(); + + nsAttrValue::Shutdown(); + nsContentUtils::Shutdown(); + nsLayoutStylesheetCache::Shutdown(); + NS_NameSpaceManagerShutdown(); + nsStyleSet::FreeGlobals(); + + nsGlobalWindow::ShutDown(); + nsDOMClassInfo::ShutDown(); + nsTextControlFrame::ShutDown(); + nsXBLWindowKeyHandler::ShutDown(); + nsAutoCopyListener::Shutdown(); +} + +void +nsLayoutStatics::AddRef() +{ + NS_ASSERTION(sLayoutStaticRefcnt, + "nsLayoutStatics already dropped to zero!"); + + ++sLayoutStaticRefcnt; + NS_LOG_ADDREF(&sLayoutStaticRefcnt, sLayoutStaticRefcnt, + "nsLayoutStatics", 1); +} + +void +nsLayoutStatics::Release() +{ + --sLayoutStaticRefcnt; + NS_LOG_RELEASE(&sLayoutStaticRefcnt, sLayoutStaticRefcnt, + "nsLayoutStatics"); + + if (!sLayoutStaticRefcnt) + Shutdown(); +} diff --git a/layout/build/nsLayoutStatics.h b/layout/build/nsLayoutStatics.h new file mode 100644 index 00000000000..ebda3f6cdc2 --- /dev/null +++ b/layout/build/nsLayoutStatics.h @@ -0,0 +1,64 @@ +/* ***** 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 the Mozilla platform. + * + * The Initial Developer of the Original Code is + * Benjamin Smedberg . + * + * Portions created by the Initial Developer are Copyright (C) 2006 + * the Mozilla Foundation . All Rights Reserved. + * + * Contributor(s): + * + * Alternatively, the contents of this file may be used under the terms of + * either 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 ***** */ + +#ifndef nsLayoutStatics_h__ +#define nsLayoutStatics_h__ + +#include "nscore.h" + +// This isn't really a class, it's a namespace for static methods. +// Documents and other objects can hold a reference to the layout static +// objects so that they last past the xpcom-shutdown notification. + +class nsLayoutStatics +{ +public: + // Called by the layout module constructor. This call performs an AddRef() + // internally. + static nsresult Initialize(); + + static void AddRef(); + static void Release(); + +private: + // not to be called! + nsLayoutStatics(); + + static void Shutdown(); +}; + +#endif // nsLayoutStatics_h__