diff --git a/layout/base/nsCSSFrameConstructor.cpp b/layout/base/nsCSSFrameConstructor.cpp index ce6ebbc04ca9..e31aeb9ffc4c 100644 --- a/layout/base/nsCSSFrameConstructor.cpp +++ b/layout/base/nsCSSFrameConstructor.cpp @@ -203,6 +203,9 @@ NS_NewAutoRepeatBoxFrame ( nsIPresShell* aPresShell, nsIFrame** aNewFrame); nsresult NS_NewRootBoxFrame ( nsIPresShell* aPresShell, nsIFrame** aNewFrame); +nsresult +NS_NewDocElementBoxFrame(nsIPresShell* aPresShell, nsIFrame** aNewFrame); + nsresult NS_NewThumbFrame ( nsIPresShell* aPresShell, nsIFrame** aNewFrame ); @@ -3529,7 +3532,7 @@ nsCSSFrameConstructor::ConstructDocElementFrame(nsIPresShell* aPresShell, PRInt32 nameSpaceID; if (NS_SUCCEEDED(aDocElement->GetNameSpaceID(nameSpaceID)) && nameSpaceID == nsXULAtoms::nameSpaceID) { - rv = NS_NewBoxFrame(aPresShell, &contentFrame, PR_TRUE); + rv = NS_NewDocElementBoxFrame(aPresShell, &contentFrame); if (NS_FAILED(rv)) { return rv; } @@ -3620,7 +3623,7 @@ nsCSSFrameConstructor::ConstructDocElementFrame(nsIPresShell* aPresShell, // Create any anonymous frames the doc element frame requires CreateAnonymousFrames(aPresShell, aPresContext, nsnull, aState, aDocElement, contentFrame, - childItems); + childItems, PR_TRUE); // Set the initial child lists contentFrame->SetInitialChildList(aPresContext, nsnull, @@ -4009,7 +4012,6 @@ nsCSSFrameConstructor::ConstructRootFrame(nsIPresShell* aPresShell, // The eventual parent of the document element frame mDocElementContainingBlock = pageFrame; - // Set the initial child lists rootFrame->SetInitialChildList(aPresContext, nsnull, pageFrame); @@ -5257,7 +5259,8 @@ nsCSSFrameConstructor::CreateAnonymousFrames(nsIPresShell* aPresShell, nsFrameConstructorState& aState, nsIContent* aParent, nsIFrame* aNewFrame, - nsFrameItems& aChildItems) + nsFrameItems& aChildItems, + PRBool aIsRoot) { // See if we might have anonymous content // by looking at the tag rather than doing a QueryInterface on @@ -5269,14 +5272,13 @@ nsCSSFrameConstructor::CreateAnonymousFrames(nsIPresShell* aPresShell, // nsGenericElement::SetDocument ought to keep a list like this one, // but it can't because nsGfxScrollFrames get around this. #ifdef INCLUDE_XUL - if (aTag != nsHTMLAtoms::input && + if (!aIsRoot && aTag != nsHTMLAtoms::input && aTag != nsHTMLAtoms::textarea && aTag != nsHTMLAtoms::combobox && aTag != nsHTMLAtoms::isindex && aTag != nsXULAtoms::scrollbar - ) { + ) { return NS_OK; - } #endif diff --git a/layout/base/nsCSSFrameConstructor.h b/layout/base/nsCSSFrameConstructor.h index 5a6636db6cd7..eb620f97a82c 100644 --- a/layout/base/nsCSSFrameConstructor.h +++ b/layout/base/nsCSSFrameConstructor.h @@ -515,7 +515,8 @@ protected: nsFrameConstructorState& aState, nsIContent* aParent, nsIFrame* aNewFrame, - nsFrameItems& aChildItems); + nsFrameItems& aChildItems, + PRBool aIsRoot = PR_FALSE); nsresult CreateAnonymousFrames(nsIPresShell* aPresShell, nsIPresContext* aPresContext, diff --git a/layout/html/style/src/nsCSSFrameConstructor.cpp b/layout/html/style/src/nsCSSFrameConstructor.cpp index ce6ebbc04ca9..e31aeb9ffc4c 100644 --- a/layout/html/style/src/nsCSSFrameConstructor.cpp +++ b/layout/html/style/src/nsCSSFrameConstructor.cpp @@ -203,6 +203,9 @@ NS_NewAutoRepeatBoxFrame ( nsIPresShell* aPresShell, nsIFrame** aNewFrame); nsresult NS_NewRootBoxFrame ( nsIPresShell* aPresShell, nsIFrame** aNewFrame); +nsresult +NS_NewDocElementBoxFrame(nsIPresShell* aPresShell, nsIFrame** aNewFrame); + nsresult NS_NewThumbFrame ( nsIPresShell* aPresShell, nsIFrame** aNewFrame ); @@ -3529,7 +3532,7 @@ nsCSSFrameConstructor::ConstructDocElementFrame(nsIPresShell* aPresShell, PRInt32 nameSpaceID; if (NS_SUCCEEDED(aDocElement->GetNameSpaceID(nameSpaceID)) && nameSpaceID == nsXULAtoms::nameSpaceID) { - rv = NS_NewBoxFrame(aPresShell, &contentFrame, PR_TRUE); + rv = NS_NewDocElementBoxFrame(aPresShell, &contentFrame); if (NS_FAILED(rv)) { return rv; } @@ -3620,7 +3623,7 @@ nsCSSFrameConstructor::ConstructDocElementFrame(nsIPresShell* aPresShell, // Create any anonymous frames the doc element frame requires CreateAnonymousFrames(aPresShell, aPresContext, nsnull, aState, aDocElement, contentFrame, - childItems); + childItems, PR_TRUE); // Set the initial child lists contentFrame->SetInitialChildList(aPresContext, nsnull, @@ -4009,7 +4012,6 @@ nsCSSFrameConstructor::ConstructRootFrame(nsIPresShell* aPresShell, // The eventual parent of the document element frame mDocElementContainingBlock = pageFrame; - // Set the initial child lists rootFrame->SetInitialChildList(aPresContext, nsnull, pageFrame); @@ -5257,7 +5259,8 @@ nsCSSFrameConstructor::CreateAnonymousFrames(nsIPresShell* aPresShell, nsFrameConstructorState& aState, nsIContent* aParent, nsIFrame* aNewFrame, - nsFrameItems& aChildItems) + nsFrameItems& aChildItems, + PRBool aIsRoot) { // See if we might have anonymous content // by looking at the tag rather than doing a QueryInterface on @@ -5269,14 +5272,13 @@ nsCSSFrameConstructor::CreateAnonymousFrames(nsIPresShell* aPresShell, // nsGenericElement::SetDocument ought to keep a list like this one, // but it can't because nsGfxScrollFrames get around this. #ifdef INCLUDE_XUL - if (aTag != nsHTMLAtoms::input && + if (!aIsRoot && aTag != nsHTMLAtoms::input && aTag != nsHTMLAtoms::textarea && aTag != nsHTMLAtoms::combobox && aTag != nsHTMLAtoms::isindex && aTag != nsXULAtoms::scrollbar - ) { + ) { return NS_OK; - } #endif diff --git a/layout/html/style/src/nsCSSFrameConstructor.h b/layout/html/style/src/nsCSSFrameConstructor.h index 5a6636db6cd7..eb620f97a82c 100644 --- a/layout/html/style/src/nsCSSFrameConstructor.h +++ b/layout/html/style/src/nsCSSFrameConstructor.h @@ -515,7 +515,8 @@ protected: nsFrameConstructorState& aState, nsIContent* aParent, nsIFrame* aNewFrame, - nsFrameItems& aChildItems); + nsFrameItems& aChildItems, + PRBool aIsRoot = PR_FALSE); nsresult CreateAnonymousFrames(nsIPresShell* aPresShell, nsIPresContext* aPresContext, diff --git a/layout/xul/base/src/Makefile.in b/layout/xul/base/src/Makefile.in index 545609228f1c..8bdc13cd862d 100644 --- a/layout/xul/base/src/Makefile.in +++ b/layout/xul/base/src/Makefile.in @@ -55,6 +55,7 @@ CPPSRCS = \ nsMonumentLayout.cpp \ nsImageBoxFrame.cpp \ nsRootBoxFrame.cpp \ + nsDocElementBoxFrame.cpp \ nsBox.cpp \ nsBoxLayoutState.cpp \ nsBoxToBlockAdaptor.cpp \ diff --git a/layout/xul/base/src/makefile.win b/layout/xul/base/src/makefile.win index 6e622d0012e0..e81b6f40be1e 100644 --- a/layout/xul/base/src/makefile.win +++ b/layout/xul/base/src/makefile.win @@ -44,6 +44,7 @@ CPPSRCS= \ nsMonumentLayout.cpp \ nsImageBoxFrame.cpp \ nsRootBoxFrame.cpp \ + nsDocElementBoxFrame.cpp \ nsStackLayout.cpp \ nsSplitterFrame.cpp \ nsButtonBoxFrame.cpp \ @@ -103,6 +104,7 @@ CPP_OBJS= \ .\$(OBJDIR)\nsMonumentLayout.obj \ .\$(OBJDIR)\nsImageBoxFrame.obj \ .\$(OBJDIR)\nsRootBoxFrame.obj \ + .\$(OBJDIR)\nsDocElementBoxFrame.obj \ .\$(OBJDIR)\nsStackLayout.obj \ .\$(OBJDIR)\nsPopupSetFrame.obj \ .\$(OBJDIR)\nsMenuBarFrame.obj \ diff --git a/layout/xul/base/src/nsDocElementBoxFrame.cpp b/layout/xul/base/src/nsDocElementBoxFrame.cpp new file mode 100644 index 000000000000..48be99e7af20 --- /dev/null +++ b/layout/xul/base/src/nsDocElementBoxFrame.cpp @@ -0,0 +1,163 @@ +/* -*- 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) 1998 Netscape Communications Corporation. All + * Rights Reserved. + * + * Contributor(s): + */ +#include "nsHTMLParts.h" +#include "nsContainerFrame.h" +#include "nsCSSRendering.h" +#include "nsIDocument.h" +#include "nsIReflowCommand.h" +#include "nsIPresContext.h" +#include "nsIStyleContext.h" +#include "nsViewsCID.h" +#include "nsIView.h" +#include "nsIViewManager.h" +#include "nsIWidget.h" +#include "nsHTMLIIDs.h" +#include "nsPageFrame.h" +#include "nsIRenderingContext.h" +#include "nsGUIEvent.h" +#include "nsIDOMEvent.h" +#include "nsStyleConsts.h" +#include "nsIViewManager.h" +#include "nsHTMLAtoms.h" +#include "nsIEventStateManager.h" +#include "nsIDeviceContext.h" +#include "nsIScrollableView.h" +#include "nsLayoutAtoms.h" +#include "nsIPresShell.h" +#include "nsBoxFrame.h" +#include "nsStackLayout.h" +#include "nsIRootBox.h" +#include "nsIAnonymousContentCreator.h" +#include "nsIElementFactory.h" +#include "nsINodeInfo.h" +#include "nsIServiceManager.h" +#include "nsISupportsArray.h" + +// Interface IDs + +//#define DEBUG_REFLOW + +class nsDocElementBoxFrame : public nsBoxFrame, public nsIAnonymousContentCreator { +public: + + friend nsresult NS_NewBoxFrame(nsIPresShell* aPresShell, nsIFrame** aNewFrame); + + nsDocElementBoxFrame(nsIPresShell* aShell); + + NS_DECL_ISUPPORTS_INHERITED + + // nsIAnonymousContentCreator + NS_IMETHOD CreateAnonymousContent(nsIPresContext* aPresContext, + nsISupportsArray& aAnonymousItems); + NS_IMETHOD CreateFrameFor(nsIPresContext* aPresContext, + nsIContent * aContent, + nsIFrame** aFrame) { if (aFrame) *aFrame = nsnull; return NS_ERROR_FAILURE; } + +#ifdef DEBUG + NS_IMETHOD GetFrameName(nsString& aResult) const; + NS_IMETHOD SizeOf(nsISizeOfHandler* aHandler, PRUint32* aResult) const; +#endif +}; + +//---------------------------------------------------------------------- + +nsresult +NS_NewDocElementBoxFrame(nsIPresShell* aPresShell, nsIFrame** aNewFrame) +{ + NS_PRECONDITION(aNewFrame, "null OUT ptr"); + if (nsnull == aNewFrame) { + return NS_ERROR_NULL_POINTER; + } + nsDocElementBoxFrame* it = new (aPresShell) nsDocElementBoxFrame (aPresShell); + if (nsnull == it) { + return NS_ERROR_OUT_OF_MEMORY; + } + + *aNewFrame = it; + + return NS_OK; +} + +nsDocElementBoxFrame::nsDocElementBoxFrame(nsIPresShell* aShell):nsBoxFrame(aShell, PR_TRUE) +{ +} + +NS_IMETHODIMP +nsDocElementBoxFrame::CreateAnonymousContent(nsIPresContext* aPresContext, + nsISupportsArray& aAnonymousItems) +{ + nsresult rv; + nsCOMPtr elementFactory = + do_GetService(NS_ELEMENT_FACTORY_CONTRACTID_PREFIX "http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul", &rv); + if (!elementFactory) + return NS_ERROR_FAILURE; + + nsCOMPtr nodeInfoManager; + nsCOMPtr doc; + mContent->GetDocument(*getter_AddRefs(doc)); + doc->GetNodeInfoManager(*getter_AddRefs(nodeInfoManager)); + NS_ENSURE_TRUE(nodeInfoManager, NS_ERROR_FAILURE); + + nsCOMPtr nodeInfo; + nodeInfoManager->GetNodeInfo(NS_ConvertASCIItoUCS2("popupgroup"), nsString(), NS_ConvertASCIItoUCS2("http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul"), + *getter_AddRefs(nodeInfo)); + + nsCOMPtr content; + elementFactory->CreateInstanceByTag(nodeInfo, getter_AddRefs(content)); + + aAnonymousItems.AppendElement(content); + return NS_OK; +} + +NS_IMETHODIMP_(nsrefcnt) +nsDocElementBoxFrame::AddRef(void) +{ + return NS_OK; +} + +NS_IMETHODIMP_(nsrefcnt) +nsDocElementBoxFrame::Release(void) +{ + return NS_OK; +} + +NS_INTERFACE_MAP_BEGIN(nsDocElementBoxFrame) + NS_INTERFACE_MAP_ENTRY(nsIAnonymousContentCreator) +NS_INTERFACE_MAP_END_INHERITING(nsBoxFrame) + +#ifdef DEBUG +NS_IMETHODIMP +nsDocElementBoxFrame::GetFrameName(nsString& aResult) const +{ + return MakeFrameName("DocElementBox", aResult); +} + +NS_IMETHODIMP +nsDocElementBoxFrame::SizeOf(nsISizeOfHandler* aHandler, PRUint32* aResult) const +{ + if (!aResult) { + return NS_ERROR_NULL_POINTER; + } + *aResult = sizeof(*this); + return NS_OK; +} +#endif diff --git a/xpfe/global/resources/content/bindings/general.xml b/xpfe/global/resources/content/bindings/general.xml index ed3ed8714cd3..ab2b37c0a9f8 100644 --- a/xpfe/global/resources/content/bindings/general.xml +++ b/xpfe/global/resources/content/bindings/general.xml @@ -4,13 +4,6 @@ xmlns="http://www.mozilla.org/xbl" xmlns:xul="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul"> - - - - - - - diff --git a/xpfe/global/resources/content/xul.css b/xpfe/global/resources/content/xul.css index 1ce9c6d3cada..30c6b9974c93 100644 --- a/xpfe/global/resources/content/xul.css +++ b/xpfe/global/resources/content/xul.css @@ -70,10 +70,6 @@ window { overflow: hidden; } -window,wizard,dialog,page { - -moz-binding: url(chrome://global/content/bindings/general.xml#basewindow); -} - /******** box *******/ vbox {