Fix for 96042. r=dbaron, sr=sspitzer

This commit is contained in:
hyatt%netscape.com 2001-08-20 21:42:14 +00:00
parent 6b7463a799
commit 8330834eb2
9 changed files with 188 additions and 27 deletions

View File

@ -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

View File

@ -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,

View File

@ -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

View File

@ -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,

View File

@ -55,6 +55,7 @@ CPPSRCS = \
nsMonumentLayout.cpp \
nsImageBoxFrame.cpp \
nsRootBoxFrame.cpp \
nsDocElementBoxFrame.cpp \
nsBox.cpp \
nsBoxLayoutState.cpp \
nsBoxToBlockAdaptor.cpp \

View File

@ -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 \

View File

@ -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<nsIElementFactory> 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<nsINodeInfoManager> nodeInfoManager;
nsCOMPtr<nsIDocument> doc;
mContent->GetDocument(*getter_AddRefs(doc));
doc->GetNodeInfoManager(*getter_AddRefs(nodeInfoManager));
NS_ENSURE_TRUE(nodeInfoManager, NS_ERROR_FAILURE);
nsCOMPtr<nsINodeInfo> nodeInfo;
nodeInfoManager->GetNodeInfo(NS_ConvertASCIItoUCS2("popupgroup"), nsString(), NS_ConvertASCIItoUCS2("http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul"),
*getter_AddRefs(nodeInfo));
nsCOMPtr<nsIContent> 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

View File

@ -4,13 +4,6 @@
xmlns="http://www.mozilla.org/xbl"
xmlns:xul="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul">
<binding id="basewindow">
<content>
<xul:popupgroup/>
<children/>
</content>
</binding>
<binding id="basetext">
<implementation>
<!-- public implementation -->

View File

@ -70,10 +70,6 @@ window {
overflow: hidden;
}
window,wizard,dialog,page {
-moz-binding: url(chrome://global/content/bindings/general.xml#basewindow);
}
/******** box *******/
vbox {