diff --git a/content/html/style/src/nsHTMLStyleSheet.cpp b/content/html/style/src/nsHTMLStyleSheet.cpp index 08b8fa8952d2..45bf50df27f3 100644 --- a/content/html/style/src/nsHTMLStyleSheet.cpp +++ b/content/html/style/src/nsHTMLStyleSheet.cpp @@ -46,6 +46,10 @@ #include "nsINameSpaceManager.h" #include "nsLayoutAtoms.h" +#ifdef INCLUDE_XUL +#include "nsXULAtoms.h" +#endif + static NS_DEFINE_IID(kIHTMLStyleSheetIID, NS_IHTML_STYLE_SHEET_IID); static NS_DEFINE_IID(kIStyleSheetIID, NS_ISTYLE_SHEET_IID); static NS_DEFINE_IID(kIStyleRuleIID, NS_ISTYLE_RULE_IID); @@ -424,6 +428,16 @@ protected: nsAbsoluteItems& aAbsoluteItems, nsIFrame*& aNewFrame); +#ifdef INCLUDE_XUL + nsresult ConstructXULFrame(nsIPresContext* aPresContext, + nsIContent* aContent, + nsIFrame* aParentFrame, + nsIAtom* aTag, + nsIStyleContext* aStyleContext, + nsAbsoluteItems& aAbsoluteItems, + nsIFrame*& aNewFrame); +#endif + nsresult ConstructFrameByDisplayType(nsIPresContext* aPresContext, const nsStyleDisplay* aDisplay, nsIContent* aContent, @@ -1793,6 +1807,88 @@ HTMLStyleSheetImpl::ConstructFrameByTag(nsIPresContext* aPresContext, return rv; } +#ifdef INCLUDE_XUL +nsresult +HTMLStyleSheetImpl::ConstructXULFrame(nsIPresContext* aPresContext, + nsIContent* aContent, + nsIFrame* aParentFrame, + nsIAtom* aTag, + nsIStyleContext* aStyleContext, + nsAbsoluteItems& aAbsoluteItems, + nsIFrame*& aNewFrame) +{ + PRBool processChildren = PR_FALSE; // whether we should process child content + nsresult rv = NS_OK; + PRBool isAbsolutelyPositioned = PR_FALSE; + + // Initialize OUT parameter + aNewFrame = nsnull; + + NS_ASSERTION(aTag != nsnull, "null XUL tag"); + if (aTag == nsnull) + return NS_OK; + + PRInt32 nameSpaceID; + if (NS_SUCCEEDED(aContent->GetNameSpaceID(nameSpaceID)) && + nameSpaceID == nsXULAtoms::nameSpaceID) { + + // See if the element is absolutely positioned + const nsStylePosition* position = (const nsStylePosition*) + aStyleContext->GetStyleData(eStyleStruct_Position); + if (NS_STYLE_POSITION_ABSOLUTE == position->mPosition) + isAbsolutelyPositioned = PR_TRUE; + + // Create a frame based on the tag + if (aTag == nsXULAtoms::button) + rv = NS_NewButtonControlFrame(aNewFrame); + else if (aTag == nsXULAtoms::checkbox) + rv = NS_NewCheckboxControlFrame(aNewFrame); + else if (aTag == nsXULAtoms::radio) + rv = NS_NewRadioControlFrame(aNewFrame); + else if (aTag == nsXULAtoms::text) + rv = NS_NewTextControlFrame(aNewFrame); + } + + // If we succeeded in creating a frame then initialize it, process its + // children (if requested), and set the initial child list + if (NS_SUCCEEDED(rv) && aNewFrame != nsnull) { + nsIFrame* geometricParent = isAbsolutelyPositioned ? aAbsoluteItems.containingBlock : + aParentFrame; + aNewFrame->Init(*aPresContext, aContent, geometricParent, aStyleContext); + + // See if we need to create a view, e.g. the frame is absolutely positioned + nsHTMLContainerFrame::CreateViewForFrame(*aPresContext, aNewFrame, + aStyleContext, PR_FALSE); + + // Process the child content if requested + nsIFrame* childList = nsnull; + if (processChildren) + rv = ProcessChildren(aPresContext, aContent, aNewFrame, aAbsoluteItems, + childList); + + // Set the frame's initial child list + aNewFrame->SetInitialChildList(*aPresContext, nsnull, childList); + + // If the frame is absolutely positioned then create a placeholder frame + if (isAbsolutelyPositioned) { + nsIFrame* placeholderFrame; + + CreatePlaceholderFrameFor(aPresContext, aContent, aNewFrame, aStyleContext, + aParentFrame, placeholderFrame); + + // Add the absolutely positioned frame to its containing block's list + // of child frames + aAbsoluteItems.AddAbsolutelyPositionedChild(aNewFrame); + + // Add the placeholder frame to the flow + aNewFrame = placeholderFrame; + } + } + + return rv; +} +#endif + nsresult HTMLStyleSheetImpl::ConstructFrameByDisplayType(nsIPresContext* aPresContext, const nsStyleDisplay* aDisplay, @@ -2224,6 +2320,15 @@ HTMLStyleSheetImpl::ConstructFrame(nsIPresContext* aPresContext, rv = ConstructFrameByTag(aPresContext, aContent, aParentFrame, tag, styleContext, aAbsoluteItems, aFrameSubTree); +#ifdef INCLUDE_XUL + // failing to find a matching HTML frame, try creating a specialized + // XUL frame. this is temporary, pending planned factoring of this + // whole process into separate, pluggable steps. + if (NS_SUCCEEDED(rv) && nsnull == aFrameSubTree) + rv = ConstructXULFrame(aPresContext, aContent, aParentFrame, tag, + styleContext, aAbsoluteItems, aFrameSubTree); +#endif + if (NS_SUCCEEDED(rv) && (nsnull == aFrameSubTree)) { // When there is no explicit frame to create, assume it's a // container and let display style dictate the rest diff --git a/layout/html/style/src/Makefile.in b/layout/html/style/src/Makefile.in index 6b11b533483a..d5bd208984f5 100644 --- a/layout/html/style/src/Makefile.in +++ b/layout/html/style/src/Makefile.in @@ -66,7 +66,8 @@ EXPORTS := $(addprefix $(srcdir)/, $(EXPORTS)) MODULE=layout INCLUDES += -I$(srcdir)/../../base/src -I$(srcdir)/../../../base/src \ - -I$(srcdir)/../../table/src -I$(srcdir)/../../content/src -I$(srcdir)/. + -I$(srcdir)/../../table/src -I$(srcdir)/../../content/src \ + -I$(srcdir)/../../../xul/content/src -I$(srcdir)/. REQUIRES = xpcom raptor dom netlib js diff --git a/layout/html/style/src/makefile.win b/layout/html/style/src/makefile.win index 8b45040ef7d4..0a7f3db5134d 100644 --- a/layout/html/style/src/makefile.win +++ b/layout/html/style/src/makefile.win @@ -77,6 +77,7 @@ CPP_OBJS = \ LINCS=-I$(PUBLIC)\xpcom -I$(PUBLIC)\raptor -I$(PUBLIC)\netlib \ -I..\..\..\base\src \ + -I..\..\..\xul\content\src \ -I..\..\base\src -I..\..\table\src -I..\..\content\src -I$(PUBLIC)\js -I$(PUBLIC)\dom LCFLAGS = \ diff --git a/layout/html/style/src/nsHTMLStyleSheet.cpp b/layout/html/style/src/nsHTMLStyleSheet.cpp index 08b8fa8952d2..45bf50df27f3 100644 --- a/layout/html/style/src/nsHTMLStyleSheet.cpp +++ b/layout/html/style/src/nsHTMLStyleSheet.cpp @@ -46,6 +46,10 @@ #include "nsINameSpaceManager.h" #include "nsLayoutAtoms.h" +#ifdef INCLUDE_XUL +#include "nsXULAtoms.h" +#endif + static NS_DEFINE_IID(kIHTMLStyleSheetIID, NS_IHTML_STYLE_SHEET_IID); static NS_DEFINE_IID(kIStyleSheetIID, NS_ISTYLE_SHEET_IID); static NS_DEFINE_IID(kIStyleRuleIID, NS_ISTYLE_RULE_IID); @@ -424,6 +428,16 @@ protected: nsAbsoluteItems& aAbsoluteItems, nsIFrame*& aNewFrame); +#ifdef INCLUDE_XUL + nsresult ConstructXULFrame(nsIPresContext* aPresContext, + nsIContent* aContent, + nsIFrame* aParentFrame, + nsIAtom* aTag, + nsIStyleContext* aStyleContext, + nsAbsoluteItems& aAbsoluteItems, + nsIFrame*& aNewFrame); +#endif + nsresult ConstructFrameByDisplayType(nsIPresContext* aPresContext, const nsStyleDisplay* aDisplay, nsIContent* aContent, @@ -1793,6 +1807,88 @@ HTMLStyleSheetImpl::ConstructFrameByTag(nsIPresContext* aPresContext, return rv; } +#ifdef INCLUDE_XUL +nsresult +HTMLStyleSheetImpl::ConstructXULFrame(nsIPresContext* aPresContext, + nsIContent* aContent, + nsIFrame* aParentFrame, + nsIAtom* aTag, + nsIStyleContext* aStyleContext, + nsAbsoluteItems& aAbsoluteItems, + nsIFrame*& aNewFrame) +{ + PRBool processChildren = PR_FALSE; // whether we should process child content + nsresult rv = NS_OK; + PRBool isAbsolutelyPositioned = PR_FALSE; + + // Initialize OUT parameter + aNewFrame = nsnull; + + NS_ASSERTION(aTag != nsnull, "null XUL tag"); + if (aTag == nsnull) + return NS_OK; + + PRInt32 nameSpaceID; + if (NS_SUCCEEDED(aContent->GetNameSpaceID(nameSpaceID)) && + nameSpaceID == nsXULAtoms::nameSpaceID) { + + // See if the element is absolutely positioned + const nsStylePosition* position = (const nsStylePosition*) + aStyleContext->GetStyleData(eStyleStruct_Position); + if (NS_STYLE_POSITION_ABSOLUTE == position->mPosition) + isAbsolutelyPositioned = PR_TRUE; + + // Create a frame based on the tag + if (aTag == nsXULAtoms::button) + rv = NS_NewButtonControlFrame(aNewFrame); + else if (aTag == nsXULAtoms::checkbox) + rv = NS_NewCheckboxControlFrame(aNewFrame); + else if (aTag == nsXULAtoms::radio) + rv = NS_NewRadioControlFrame(aNewFrame); + else if (aTag == nsXULAtoms::text) + rv = NS_NewTextControlFrame(aNewFrame); + } + + // If we succeeded in creating a frame then initialize it, process its + // children (if requested), and set the initial child list + if (NS_SUCCEEDED(rv) && aNewFrame != nsnull) { + nsIFrame* geometricParent = isAbsolutelyPositioned ? aAbsoluteItems.containingBlock : + aParentFrame; + aNewFrame->Init(*aPresContext, aContent, geometricParent, aStyleContext); + + // See if we need to create a view, e.g. the frame is absolutely positioned + nsHTMLContainerFrame::CreateViewForFrame(*aPresContext, aNewFrame, + aStyleContext, PR_FALSE); + + // Process the child content if requested + nsIFrame* childList = nsnull; + if (processChildren) + rv = ProcessChildren(aPresContext, aContent, aNewFrame, aAbsoluteItems, + childList); + + // Set the frame's initial child list + aNewFrame->SetInitialChildList(*aPresContext, nsnull, childList); + + // If the frame is absolutely positioned then create a placeholder frame + if (isAbsolutelyPositioned) { + nsIFrame* placeholderFrame; + + CreatePlaceholderFrameFor(aPresContext, aContent, aNewFrame, aStyleContext, + aParentFrame, placeholderFrame); + + // Add the absolutely positioned frame to its containing block's list + // of child frames + aAbsoluteItems.AddAbsolutelyPositionedChild(aNewFrame); + + // Add the placeholder frame to the flow + aNewFrame = placeholderFrame; + } + } + + return rv; +} +#endif + nsresult HTMLStyleSheetImpl::ConstructFrameByDisplayType(nsIPresContext* aPresContext, const nsStyleDisplay* aDisplay, @@ -2224,6 +2320,15 @@ HTMLStyleSheetImpl::ConstructFrame(nsIPresContext* aPresContext, rv = ConstructFrameByTag(aPresContext, aContent, aParentFrame, tag, styleContext, aAbsoluteItems, aFrameSubTree); +#ifdef INCLUDE_XUL + // failing to find a matching HTML frame, try creating a specialized + // XUL frame. this is temporary, pending planned factoring of this + // whole process into separate, pluggable steps. + if (NS_SUCCEEDED(rv) && nsnull == aFrameSubTree) + rv = ConstructXULFrame(aPresContext, aContent, aParentFrame, tag, + styleContext, aAbsoluteItems, aFrameSubTree); +#endif + if (NS_SUCCEEDED(rv) && (nsnull == aFrameSubTree)) { // When there is no explicit frame to create, assume it's a // container and let display style dictate the rest diff --git a/layout/style/nsHTMLStyleSheet.cpp b/layout/style/nsHTMLStyleSheet.cpp index 08b8fa8952d2..45bf50df27f3 100644 --- a/layout/style/nsHTMLStyleSheet.cpp +++ b/layout/style/nsHTMLStyleSheet.cpp @@ -46,6 +46,10 @@ #include "nsINameSpaceManager.h" #include "nsLayoutAtoms.h" +#ifdef INCLUDE_XUL +#include "nsXULAtoms.h" +#endif + static NS_DEFINE_IID(kIHTMLStyleSheetIID, NS_IHTML_STYLE_SHEET_IID); static NS_DEFINE_IID(kIStyleSheetIID, NS_ISTYLE_SHEET_IID); static NS_DEFINE_IID(kIStyleRuleIID, NS_ISTYLE_RULE_IID); @@ -424,6 +428,16 @@ protected: nsAbsoluteItems& aAbsoluteItems, nsIFrame*& aNewFrame); +#ifdef INCLUDE_XUL + nsresult ConstructXULFrame(nsIPresContext* aPresContext, + nsIContent* aContent, + nsIFrame* aParentFrame, + nsIAtom* aTag, + nsIStyleContext* aStyleContext, + nsAbsoluteItems& aAbsoluteItems, + nsIFrame*& aNewFrame); +#endif + nsresult ConstructFrameByDisplayType(nsIPresContext* aPresContext, const nsStyleDisplay* aDisplay, nsIContent* aContent, @@ -1793,6 +1807,88 @@ HTMLStyleSheetImpl::ConstructFrameByTag(nsIPresContext* aPresContext, return rv; } +#ifdef INCLUDE_XUL +nsresult +HTMLStyleSheetImpl::ConstructXULFrame(nsIPresContext* aPresContext, + nsIContent* aContent, + nsIFrame* aParentFrame, + nsIAtom* aTag, + nsIStyleContext* aStyleContext, + nsAbsoluteItems& aAbsoluteItems, + nsIFrame*& aNewFrame) +{ + PRBool processChildren = PR_FALSE; // whether we should process child content + nsresult rv = NS_OK; + PRBool isAbsolutelyPositioned = PR_FALSE; + + // Initialize OUT parameter + aNewFrame = nsnull; + + NS_ASSERTION(aTag != nsnull, "null XUL tag"); + if (aTag == nsnull) + return NS_OK; + + PRInt32 nameSpaceID; + if (NS_SUCCEEDED(aContent->GetNameSpaceID(nameSpaceID)) && + nameSpaceID == nsXULAtoms::nameSpaceID) { + + // See if the element is absolutely positioned + const nsStylePosition* position = (const nsStylePosition*) + aStyleContext->GetStyleData(eStyleStruct_Position); + if (NS_STYLE_POSITION_ABSOLUTE == position->mPosition) + isAbsolutelyPositioned = PR_TRUE; + + // Create a frame based on the tag + if (aTag == nsXULAtoms::button) + rv = NS_NewButtonControlFrame(aNewFrame); + else if (aTag == nsXULAtoms::checkbox) + rv = NS_NewCheckboxControlFrame(aNewFrame); + else if (aTag == nsXULAtoms::radio) + rv = NS_NewRadioControlFrame(aNewFrame); + else if (aTag == nsXULAtoms::text) + rv = NS_NewTextControlFrame(aNewFrame); + } + + // If we succeeded in creating a frame then initialize it, process its + // children (if requested), and set the initial child list + if (NS_SUCCEEDED(rv) && aNewFrame != nsnull) { + nsIFrame* geometricParent = isAbsolutelyPositioned ? aAbsoluteItems.containingBlock : + aParentFrame; + aNewFrame->Init(*aPresContext, aContent, geometricParent, aStyleContext); + + // See if we need to create a view, e.g. the frame is absolutely positioned + nsHTMLContainerFrame::CreateViewForFrame(*aPresContext, aNewFrame, + aStyleContext, PR_FALSE); + + // Process the child content if requested + nsIFrame* childList = nsnull; + if (processChildren) + rv = ProcessChildren(aPresContext, aContent, aNewFrame, aAbsoluteItems, + childList); + + // Set the frame's initial child list + aNewFrame->SetInitialChildList(*aPresContext, nsnull, childList); + + // If the frame is absolutely positioned then create a placeholder frame + if (isAbsolutelyPositioned) { + nsIFrame* placeholderFrame; + + CreatePlaceholderFrameFor(aPresContext, aContent, aNewFrame, aStyleContext, + aParentFrame, placeholderFrame); + + // Add the absolutely positioned frame to its containing block's list + // of child frames + aAbsoluteItems.AddAbsolutelyPositionedChild(aNewFrame); + + // Add the placeholder frame to the flow + aNewFrame = placeholderFrame; + } + } + + return rv; +} +#endif + nsresult HTMLStyleSheetImpl::ConstructFrameByDisplayType(nsIPresContext* aPresContext, const nsStyleDisplay* aDisplay, @@ -2224,6 +2320,15 @@ HTMLStyleSheetImpl::ConstructFrame(nsIPresContext* aPresContext, rv = ConstructFrameByTag(aPresContext, aContent, aParentFrame, tag, styleContext, aAbsoluteItems, aFrameSubTree); +#ifdef INCLUDE_XUL + // failing to find a matching HTML frame, try creating a specialized + // XUL frame. this is temporary, pending planned factoring of this + // whole process into separate, pluggable steps. + if (NS_SUCCEEDED(rv) && nsnull == aFrameSubTree) + rv = ConstructXULFrame(aPresContext, aContent, aParentFrame, tag, + styleContext, aAbsoluteItems, aFrameSubTree); +#endif + if (NS_SUCCEEDED(rv) && (nsnull == aFrameSubTree)) { // When there is no explicit frame to create, assume it's a // container and let display style dictate the rest