mirror of
https://github.com/mozilla/gecko-dev.git
synced 2024-11-24 21:31:04 +00:00
Bug 728516. Refactor frame construction for things that want to wrap kids in a block. r=roc
This commit is contained in:
parent
115115757e
commit
11bec6d3bc
@ -373,8 +373,11 @@ GetFieldSetBlockFrame(nsIFrame* aFieldsetFrame)
|
|||||||
return firstChild && firstChild->GetNextSibling() ? firstChild->GetNextSibling() : firstChild;
|
return firstChild && firstChild->GetNextSibling() ? firstChild->GetNextSibling() : firstChild;
|
||||||
}
|
}
|
||||||
|
|
||||||
#define FCDATA_DECL(_flags, _func) \
|
#define FCDATA_DECL(_flags, _func) \
|
||||||
{ _flags, { (FrameCreationFunc)_func } }
|
{ _flags, { (FrameCreationFunc)_func }, nsnull, nsnull }
|
||||||
|
#define FCDATA_WITH_WRAPPING_BLOCK(_flags, _func, _anon_box) \
|
||||||
|
{ _flags | FCDATA_CREATE_BLOCK_WRAPPER_FOR_ALL_KIDS, \
|
||||||
|
{ (FrameCreationFunc)_func }, nsnull, &_anon_box }
|
||||||
|
|
||||||
//----------------------------------------------------------------------
|
//----------------------------------------------------------------------
|
||||||
|
|
||||||
@ -2929,120 +2932,6 @@ ClearLazyBits(nsIContent* aStartContent, nsIContent* aEndContent)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
nsresult
|
|
||||||
nsCSSFrameConstructor::ConstructButtonFrame(nsFrameConstructorState& aState,
|
|
||||||
FrameConstructionItem& aItem,
|
|
||||||
nsIFrame* aParentFrame,
|
|
||||||
const nsStyleDisplay* aStyleDisplay,
|
|
||||||
nsFrameItems& aFrameItems,
|
|
||||||
nsIFrame** aNewFrame)
|
|
||||||
{
|
|
||||||
*aNewFrame = nsnull;
|
|
||||||
nsIFrame* buttonFrame = nsnull;
|
|
||||||
nsIContent* const content = aItem.mContent;
|
|
||||||
nsStyleContext* const styleContext = aItem.mStyleContext;
|
|
||||||
|
|
||||||
if (nsGkAtoms::button == aItem.mTag) {
|
|
||||||
buttonFrame = NS_NewHTMLButtonControlFrame(mPresShell, styleContext);
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
buttonFrame = NS_NewGfxButtonControlFrame(mPresShell, styleContext);
|
|
||||||
}
|
|
||||||
if (NS_UNLIKELY(!buttonFrame)) {
|
|
||||||
return NS_ERROR_OUT_OF_MEMORY;
|
|
||||||
}
|
|
||||||
// Initialize the button frame
|
|
||||||
nsresult rv = InitAndRestoreFrame(aState, content,
|
|
||||||
aState.GetGeometricParent(aStyleDisplay, aParentFrame),
|
|
||||||
nsnull, buttonFrame);
|
|
||||||
if (NS_FAILED(rv)) {
|
|
||||||
buttonFrame->Destroy();
|
|
||||||
return rv;
|
|
||||||
}
|
|
||||||
|
|
||||||
nsRefPtr<nsStyleContext> innerBlockContext;
|
|
||||||
innerBlockContext =
|
|
||||||
mPresShell->StyleSet()->ResolveAnonymousBoxStyle(nsCSSAnonBoxes::buttonContent,
|
|
||||||
styleContext);
|
|
||||||
|
|
||||||
nsIFrame* blockFrame = NS_NewBlockFrame(mPresShell, innerBlockContext,
|
|
||||||
NS_BLOCK_FLOAT_MGR);
|
|
||||||
|
|
||||||
if (NS_UNLIKELY(!blockFrame)) {
|
|
||||||
buttonFrame->Destroy();
|
|
||||||
return NS_ERROR_OUT_OF_MEMORY;
|
|
||||||
}
|
|
||||||
rv = InitAndRestoreFrame(aState, content, buttonFrame, nsnull, blockFrame);
|
|
||||||
if (NS_FAILED(rv)) {
|
|
||||||
blockFrame->Destroy();
|
|
||||||
buttonFrame->Destroy();
|
|
||||||
return rv;
|
|
||||||
}
|
|
||||||
|
|
||||||
rv = aState.AddChild(buttonFrame, aFrameItems, content, styleContext,
|
|
||||||
aParentFrame);
|
|
||||||
if (NS_FAILED(rv)) {
|
|
||||||
blockFrame->Destroy();
|
|
||||||
buttonFrame->Destroy();
|
|
||||||
return rv;
|
|
||||||
}
|
|
||||||
|
|
||||||
bool isLeaf = buttonFrame->IsLeaf();
|
|
||||||
#ifdef DEBUG
|
|
||||||
// Make sure that we're an anonymous content creator exactly when we're a
|
|
||||||
// leaf
|
|
||||||
nsIAnonymousContentCreator* creator = do_QueryFrame(buttonFrame);
|
|
||||||
NS_ASSERTION(!creator == !isLeaf,
|
|
||||||
"Should be creator exactly when we're a leaf");
|
|
||||||
#endif
|
|
||||||
|
|
||||||
if (!isLeaf) {
|
|
||||||
// Process children
|
|
||||||
nsFrameConstructorSaveState absoluteSaveState;
|
|
||||||
nsFrameItems childItems;
|
|
||||||
|
|
||||||
if (aStyleDisplay->IsPositioned()) {
|
|
||||||
aState.PushAbsoluteContainingBlock(buttonFrame, absoluteSaveState);
|
|
||||||
}
|
|
||||||
|
|
||||||
#ifdef DEBUG
|
|
||||||
// Make sure that anonymous child creation will have no effect in this case
|
|
||||||
nsIAnonymousContentCreator* creator = do_QueryFrame(blockFrame);
|
|
||||||
NS_ASSERTION(!creator, "Shouldn't be an anonymous content creator!");
|
|
||||||
#endif
|
|
||||||
|
|
||||||
rv = ProcessChildren(aState, content, styleContext, blockFrame, true,
|
|
||||||
childItems, aStyleDisplay->IsBlockInside(),
|
|
||||||
aItem.mPendingBinding);
|
|
||||||
if (NS_FAILED(rv)) return rv;
|
|
||||||
|
|
||||||
// Set the areas frame's initial child lists
|
|
||||||
blockFrame->SetInitialChildList(kPrincipalList, childItems);
|
|
||||||
}
|
|
||||||
|
|
||||||
SetInitialSingleChild(buttonFrame, blockFrame);
|
|
||||||
|
|
||||||
if (isLeaf) {
|
|
||||||
ClearLazyBits(content->GetFirstChild(), nsnull);
|
|
||||||
|
|
||||||
nsFrameItems anonymousChildItems;
|
|
||||||
// if there are any anonymous children create frames for them. Note that
|
|
||||||
// we're doing this using a different parent frame from the one we pass to
|
|
||||||
// ProcessChildren!
|
|
||||||
CreateAnonymousFrames(aState, content, buttonFrame, aItem.mPendingBinding,
|
|
||||||
anonymousChildItems);
|
|
||||||
if (anonymousChildItems.NotEmpty()) {
|
|
||||||
// the anonymous content is already parented to the area frame
|
|
||||||
AppendFrames(blockFrame, kPrincipalList, anonymousChildItems);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// our new button frame returned is the top frame.
|
|
||||||
*aNewFrame = buttonFrame;
|
|
||||||
|
|
||||||
return NS_OK;
|
|
||||||
}
|
|
||||||
|
|
||||||
nsresult
|
nsresult
|
||||||
nsCSSFrameConstructor::ConstructSelectFrame(nsFrameConstructorState& aState,
|
nsCSSFrameConstructor::ConstructSelectFrame(nsFrameConstructorState& aState,
|
||||||
FrameConstructionItem& aItem,
|
FrameConstructionItem& aItem,
|
||||||
@ -3325,8 +3214,8 @@ FindAncestorWithGeneratedContentPseudo(nsIFrame* aFrame)
|
|||||||
}
|
}
|
||||||
|
|
||||||
#define SIMPLE_FCDATA(_func) FCDATA_DECL(0, _func)
|
#define SIMPLE_FCDATA(_func) FCDATA_DECL(0, _func)
|
||||||
#define FULL_CTOR_FCDATA(_flags, _func) \
|
#define FULL_CTOR_FCDATA(_flags, _func) \
|
||||||
{ _flags | FCDATA_FUNC_IS_FULL_CTOR, { nsnull }, _func }
|
{ _flags | FCDATA_FUNC_IS_FULL_CTOR, { nsnull }, _func, nsnull }
|
||||||
|
|
||||||
/* static */
|
/* static */
|
||||||
const nsCSSFrameConstructor::FrameConstructionData*
|
const nsCSSFrameConstructor::FrameConstructionData*
|
||||||
@ -3523,7 +3412,10 @@ nsCSSFrameConstructor::FindHTMLData(Element* aElement,
|
|||||||
FCDATA_DECL(FCDATA_ALLOW_BLOCK_STYLES, NS_NewLegendFrame) },
|
FCDATA_DECL(FCDATA_ALLOW_BLOCK_STYLES, NS_NewLegendFrame) },
|
||||||
SIMPLE_TAG_CREATE(frameset, NS_NewHTMLFramesetFrame),
|
SIMPLE_TAG_CREATE(frameset, NS_NewHTMLFramesetFrame),
|
||||||
SIMPLE_TAG_CREATE(iframe, NS_NewSubDocumentFrame),
|
SIMPLE_TAG_CREATE(iframe, NS_NewSubDocumentFrame),
|
||||||
COMPLEX_TAG_CREATE(button, &nsCSSFrameConstructor::ConstructButtonFrame),
|
{ &nsGkAtoms::button,
|
||||||
|
FCDATA_WITH_WRAPPING_BLOCK(FCDATA_ALLOW_BLOCK_STYLES,
|
||||||
|
NS_NewHTMLButtonControlFrame,
|
||||||
|
nsCSSAnonBoxes::buttonContent) },
|
||||||
SIMPLE_TAG_CHAIN(canvas, nsCSSFrameConstructor::FindCanvasData),
|
SIMPLE_TAG_CHAIN(canvas, nsCSSFrameConstructor::FindCanvasData),
|
||||||
#if defined(MOZ_MEDIA)
|
#if defined(MOZ_MEDIA)
|
||||||
SIMPLE_TAG_CREATE(video, NS_NewHTMLVideoFrame),
|
SIMPLE_TAG_CREATE(video, NS_NewHTMLVideoFrame),
|
||||||
@ -3580,12 +3472,15 @@ nsCSSFrameConstructor::FindInputData(Element* aElement,
|
|||||||
SIMPLE_INT_CREATE(NS_FORM_INPUT_TEL, NS_NewTextControlFrame),
|
SIMPLE_INT_CREATE(NS_FORM_INPUT_TEL, NS_NewTextControlFrame),
|
||||||
SIMPLE_INT_CREATE(NS_FORM_INPUT_URL, NS_NewTextControlFrame),
|
SIMPLE_INT_CREATE(NS_FORM_INPUT_URL, NS_NewTextControlFrame),
|
||||||
SIMPLE_INT_CREATE(NS_FORM_INPUT_PASSWORD, NS_NewTextControlFrame),
|
SIMPLE_INT_CREATE(NS_FORM_INPUT_PASSWORD, NS_NewTextControlFrame),
|
||||||
COMPLEX_INT_CREATE(NS_FORM_INPUT_SUBMIT,
|
{ NS_FORM_INPUT_SUBMIT,
|
||||||
&nsCSSFrameConstructor::ConstructButtonFrame),
|
FCDATA_WITH_WRAPPING_BLOCK(0, NS_NewGfxButtonControlFrame,
|
||||||
COMPLEX_INT_CREATE(NS_FORM_INPUT_RESET,
|
nsCSSAnonBoxes::buttonContent) },
|
||||||
&nsCSSFrameConstructor::ConstructButtonFrame),
|
{ NS_FORM_INPUT_RESET,
|
||||||
COMPLEX_INT_CREATE(NS_FORM_INPUT_BUTTON,
|
FCDATA_WITH_WRAPPING_BLOCK(0, NS_NewGfxButtonControlFrame,
|
||||||
&nsCSSFrameConstructor::ConstructButtonFrame)
|
nsCSSAnonBoxes::buttonContent) },
|
||||||
|
{ NS_FORM_INPUT_BUTTON,
|
||||||
|
FCDATA_WITH_WRAPPING_BLOCK(0, NS_NewGfxButtonControlFrame,
|
||||||
|
nsCSSAnonBoxes::buttonContent) }
|
||||||
// Keeping hidden inputs out of here on purpose for so they get frames by
|
// Keeping hidden inputs out of here on purpose for so they get frames by
|
||||||
// display (in practice, none).
|
// display (in practice, none).
|
||||||
};
|
};
|
||||||
@ -3675,6 +3570,10 @@ nsCSSFrameConstructor::ConstructFrameFromItemInternal(FrameConstructionItem& aIt
|
|||||||
CHECK_ONLY_ONE_BIT(FCDATA_FUNC_IS_FULL_CTOR,
|
CHECK_ONLY_ONE_BIT(FCDATA_FUNC_IS_FULL_CTOR,
|
||||||
FCDATA_DISALLOW_GENERATED_CONTENT);
|
FCDATA_DISALLOW_GENERATED_CONTENT);
|
||||||
CHECK_ONLY_ONE_BIT(FCDATA_FUNC_IS_FULL_CTOR, FCDATA_ALLOW_BLOCK_STYLES);
|
CHECK_ONLY_ONE_BIT(FCDATA_FUNC_IS_FULL_CTOR, FCDATA_ALLOW_BLOCK_STYLES);
|
||||||
|
CHECK_ONLY_ONE_BIT(FCDATA_FUNC_IS_FULL_CTOR,
|
||||||
|
FCDATA_CREATE_BLOCK_WRAPPER_FOR_ALL_KIDS);
|
||||||
|
CHECK_ONLY_ONE_BIT(FCDATA_WRAP_KIDS_IN_BLOCKS,
|
||||||
|
FCDATA_CREATE_BLOCK_WRAPPER_FOR_ALL_KIDS);
|
||||||
#undef CHECK_ONLY_ONE_BIT
|
#undef CHECK_ONLY_ONE_BIT
|
||||||
NS_ASSERTION(!(bits & FCDATA_FORCED_NON_SCROLLABLE_BLOCK) ||
|
NS_ASSERTION(!(bits & FCDATA_FORCED_NON_SCROLLABLE_BLOCK) ||
|
||||||
((bits & FCDATA_FUNC_IS_FULL_CTOR) &&
|
((bits & FCDATA_FUNC_IS_FULL_CTOR) &&
|
||||||
@ -3748,6 +3647,45 @@ nsCSSFrameConstructor::ConstructFrameFromItemInternal(FrameConstructionItem& aIt
|
|||||||
// primary frame).
|
// primary frame).
|
||||||
primaryFrame = frameToAddToList;
|
primaryFrame = frameToAddToList;
|
||||||
|
|
||||||
|
// If we need to create a block formatting context to wrap our
|
||||||
|
// kids, do it now.
|
||||||
|
const nsStyleDisplay* maybeAbsoluteContainingBlockDisplay = display;
|
||||||
|
nsIFrame* maybeAbsoluteContainingBlock = newFrame;
|
||||||
|
nsIFrame* possiblyLeafFrame = newFrame;
|
||||||
|
if (bits & FCDATA_CREATE_BLOCK_WRAPPER_FOR_ALL_KIDS) {
|
||||||
|
nsRefPtr<nsStyleContext> blockContext;
|
||||||
|
blockContext =
|
||||||
|
mPresShell->StyleSet()->ResolveAnonymousBoxStyle(*data->mAnonBoxPseudo,
|
||||||
|
styleContext);
|
||||||
|
nsIFrame* blockFrame =
|
||||||
|
NS_NewBlockFormattingContext(mPresShell, blockContext);
|
||||||
|
if (NS_UNLIKELY(!blockFrame)) {
|
||||||
|
primaryFrame->Destroy();
|
||||||
|
return NS_ERROR_OUT_OF_MEMORY;
|
||||||
|
}
|
||||||
|
|
||||||
|
rv = InitAndRestoreFrame(aState, content, newFrame, nsnull, blockFrame);
|
||||||
|
if (NS_FAILED(rv)) {
|
||||||
|
blockFrame->Destroy();
|
||||||
|
primaryFrame->Destroy();
|
||||||
|
return rv;
|
||||||
|
}
|
||||||
|
|
||||||
|
SetInitialSingleChild(newFrame, blockFrame);
|
||||||
|
|
||||||
|
// Now figure out whether newFrame or blockFrame should be the
|
||||||
|
// absolute container. It should be the latter if it's
|
||||||
|
// positioned, otherwise the former.
|
||||||
|
const nsStyleDisplay* blockDisplay = blockContext->GetStyleDisplay();
|
||||||
|
if (blockDisplay->IsPositioned()) {
|
||||||
|
maybeAbsoluteContainingBlockDisplay = blockDisplay;
|
||||||
|
maybeAbsoluteContainingBlock = blockFrame;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Our kids should go into the blockFrame
|
||||||
|
newFrame = blockFrame;
|
||||||
|
}
|
||||||
|
|
||||||
rv = aState.AddChild(frameToAddToList, aFrameItems, content, styleContext,
|
rv = aState.AddChild(frameToAddToList, aFrameItems, content, styleContext,
|
||||||
aParentFrame, allowOutOfFlow, allowOutOfFlow, isPopup);
|
aParentFrame, allowOutOfFlow, allowOutOfFlow, isPopup);
|
||||||
if (NS_FAILED(rv)) {
|
if (NS_FAILED(rv)) {
|
||||||
@ -3773,8 +3711,10 @@ nsCSSFrameConstructor::ConstructFrameFromItemInternal(FrameConstructionItem& aIt
|
|||||||
|
|
||||||
if (bits & FCDATA_FORCE_NULL_ABSPOS_CONTAINER) {
|
if (bits & FCDATA_FORCE_NULL_ABSPOS_CONTAINER) {
|
||||||
aState.PushAbsoluteContainingBlock(nsnull, absoluteSaveState);
|
aState.PushAbsoluteContainingBlock(nsnull, absoluteSaveState);
|
||||||
} else if (!(bits & FCDATA_SKIP_ABSPOS_PUSH) && display->IsPositioned()) {
|
} else if (!(bits & FCDATA_SKIP_ABSPOS_PUSH) &&
|
||||||
aState.PushAbsoluteContainingBlock(newFrame, absoluteSaveState);
|
maybeAbsoluteContainingBlockDisplay->IsPositioned()) {
|
||||||
|
aState.PushAbsoluteContainingBlock(maybeAbsoluteContainingBlock,
|
||||||
|
absoluteSaveState);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (bits & FCDATA_USE_CHILD_ITEMS) {
|
if (bits & FCDATA_USE_CHILD_ITEMS) {
|
||||||
@ -3786,7 +3726,7 @@ nsCSSFrameConstructor::ConstructFrameFromItemInternal(FrameConstructionItem& aIt
|
|||||||
!(bits & FCDATA_DISALLOW_GENERATED_CONTENT),
|
!(bits & FCDATA_DISALLOW_GENERATED_CONTENT),
|
||||||
childItems,
|
childItems,
|
||||||
(bits & FCDATA_ALLOW_BLOCK_STYLES) != 0,
|
(bits & FCDATA_ALLOW_BLOCK_STYLES) != 0,
|
||||||
aItem.mPendingBinding);
|
aItem.mPendingBinding, possiblyLeafFrame);
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifdef MOZ_XUL
|
#ifdef MOZ_XUL
|
||||||
@ -4861,8 +4801,9 @@ nsCSSFrameConstructor::FindSVGData(Element* aElement,
|
|||||||
SIMPLE_SVG_CREATE(defs, NS_NewSVGContainerFrame),
|
SIMPLE_SVG_CREATE(defs, NS_NewSVGContainerFrame),
|
||||||
SIMPLE_SVG_CREATE(generic, NS_NewSVGGenericContainerFrame),
|
SIMPLE_SVG_CREATE(generic, NS_NewSVGGenericContainerFrame),
|
||||||
{ &nsGkAtoms::foreignObject,
|
{ &nsGkAtoms::foreignObject,
|
||||||
FULL_CTOR_FCDATA(FCDATA_DISALLOW_OUT_OF_FLOW,
|
FCDATA_WITH_WRAPPING_BLOCK(FCDATA_DISALLOW_OUT_OF_FLOW,
|
||||||
&nsCSSFrameConstructor::ConstructSVGForeignObjectFrame) },
|
NS_NewSVGForeignObjectFrame,
|
||||||
|
nsCSSAnonBoxes::mozSVGForeignContent) },
|
||||||
SIMPLE_SVG_CREATE(a, NS_NewSVGAFrame),
|
SIMPLE_SVG_CREATE(a, NS_NewSVGAFrame),
|
||||||
SIMPLE_SVG_CREATE(altGlyph, NS_NewSVGTSpanFrame),
|
SIMPLE_SVG_CREATE(altGlyph, NS_NewSVGTSpanFrame),
|
||||||
SIMPLE_SVG_CREATE(text, NS_NewSVGTextFrame),
|
SIMPLE_SVG_CREATE(text, NS_NewSVGTextFrame),
|
||||||
@ -4915,59 +4856,6 @@ nsCSSFrameConstructor::FindSVGData(Element* aElement,
|
|||||||
return data;
|
return data;
|
||||||
}
|
}
|
||||||
|
|
||||||
nsresult
|
|
||||||
nsCSSFrameConstructor::ConstructSVGForeignObjectFrame(nsFrameConstructorState& aState,
|
|
||||||
FrameConstructionItem& aItem,
|
|
||||||
nsIFrame* aParentFrame,
|
|
||||||
const nsStyleDisplay* aStyleDisplay,
|
|
||||||
nsFrameItems& aFrameItems,
|
|
||||||
nsIFrame** aNewFrame)
|
|
||||||
{
|
|
||||||
nsIContent* const content = aItem.mContent;
|
|
||||||
nsStyleContext* const styleContext = aItem.mStyleContext;
|
|
||||||
|
|
||||||
nsIFrame* newFrame = NS_NewSVGForeignObjectFrame(mPresShell, styleContext);
|
|
||||||
if (NS_UNLIKELY(!newFrame)) {
|
|
||||||
return NS_ERROR_OUT_OF_MEMORY;
|
|
||||||
}
|
|
||||||
|
|
||||||
// We don't allow this frame to be out of flow
|
|
||||||
InitAndRestoreFrame(aState, content, aParentFrame, nsnull, newFrame);
|
|
||||||
|
|
||||||
nsresult rv = aState.AddChild(newFrame, aFrameItems, content, styleContext,
|
|
||||||
aParentFrame, false, false);
|
|
||||||
if (NS_FAILED(rv)) {
|
|
||||||
return rv;
|
|
||||||
}
|
|
||||||
|
|
||||||
nsRefPtr<nsStyleContext> innerPseudoStyle;
|
|
||||||
innerPseudoStyle = mPresShell->StyleSet()->
|
|
||||||
ResolveAnonymousBoxStyle(nsCSSAnonBoxes::mozSVGForeignContent, styleContext);
|
|
||||||
|
|
||||||
nsIFrame* blockFrame = NS_NewBlockFormattingContext(mPresShell,
|
|
||||||
innerPseudoStyle);
|
|
||||||
if (NS_UNLIKELY(!blockFrame)) {
|
|
||||||
newFrame->Destroy();
|
|
||||||
return NS_ERROR_OUT_OF_MEMORY;
|
|
||||||
}
|
|
||||||
|
|
||||||
nsFrameItems childItems;
|
|
||||||
// We should be relatively positioned so that we end up being the
|
|
||||||
// absolute containing block.
|
|
||||||
const nsStyleDisplay* disp = innerPseudoStyle->GetStyleDisplay();
|
|
||||||
NS_ASSERTION(disp->IsPositioned(), "How did this get to not be positioned?");
|
|
||||||
rv = ConstructBlock(aState, innerPseudoStyle->GetStyleDisplay(), content,
|
|
||||||
newFrame, newFrame, innerPseudoStyle,
|
|
||||||
&blockFrame, childItems, true,
|
|
||||||
aItem.mPendingBinding);
|
|
||||||
|
|
||||||
newFrame->SetInitialChildList(kPrincipalList, childItems);
|
|
||||||
|
|
||||||
*aNewFrame = newFrame;
|
|
||||||
|
|
||||||
return rv;
|
|
||||||
}
|
|
||||||
|
|
||||||
void
|
void
|
||||||
nsCSSFrameConstructor::AddPageBreakItem(nsIContent* aContent,
|
nsCSSFrameConstructor::AddPageBreakItem(nsIContent* aContent,
|
||||||
nsStyleContext* aMainStyleContext,
|
nsStyleContext* aMainStyleContext,
|
||||||
@ -9521,13 +9409,18 @@ nsCSSFrameConstructor::ProcessChildren(nsFrameConstructorState& aState,
|
|||||||
const bool aCanHaveGeneratedContent,
|
const bool aCanHaveGeneratedContent,
|
||||||
nsFrameItems& aFrameItems,
|
nsFrameItems& aFrameItems,
|
||||||
const bool aAllowBlockStyles,
|
const bool aAllowBlockStyles,
|
||||||
PendingBinding* aPendingBinding)
|
PendingBinding* aPendingBinding,
|
||||||
|
nsIFrame* aPossiblyLeafFrame)
|
||||||
{
|
{
|
||||||
NS_PRECONDITION(aFrame, "Must have parent frame here");
|
NS_PRECONDITION(aFrame, "Must have parent frame here");
|
||||||
NS_PRECONDITION(aFrame->GetContentInsertionFrame() == aFrame,
|
NS_PRECONDITION(aFrame->GetContentInsertionFrame() == aFrame,
|
||||||
"Parent frame in ProcessChildren should be its own "
|
"Parent frame in ProcessChildren should be its own "
|
||||||
"content insertion frame");
|
"content insertion frame");
|
||||||
|
|
||||||
|
if (!aPossiblyLeafFrame) {
|
||||||
|
aPossiblyLeafFrame = aFrame;
|
||||||
|
}
|
||||||
|
|
||||||
// XXXbz ideally, this would do all the pushing of various
|
// XXXbz ideally, this would do all the pushing of various
|
||||||
// containing blocks as needed, so callers don't have to do it...
|
// containing blocks as needed, so callers don't have to do it...
|
||||||
|
|
||||||
@ -9563,7 +9456,7 @@ nsCSSFrameConstructor::ProcessChildren(nsFrameConstructorState& aState,
|
|||||||
// non-anonymous children are processed to ensure that popups are never
|
// non-anonymous children are processed to ensure that popups are never
|
||||||
// constructed before the popupset.
|
// constructed before the popupset.
|
||||||
nsAutoTArray<nsIAnonymousContentCreator::ContentInfo, 4> anonymousItems;
|
nsAutoTArray<nsIAnonymousContentCreator::ContentInfo, 4> anonymousItems;
|
||||||
GetAnonymousContent(aContent, aFrame, anonymousItems);
|
GetAnonymousContent(aContent, aPossiblyLeafFrame, anonymousItems);
|
||||||
for (PRUint32 i = 0; i < anonymousItems.Length(); ++i) {
|
for (PRUint32 i = 0; i < anonymousItems.Length(); ++i) {
|
||||||
nsIContent* content = anonymousItems[i].mContent;
|
nsIContent* content = anonymousItems[i].mContent;
|
||||||
#ifdef DEBUG
|
#ifdef DEBUG
|
||||||
@ -9600,7 +9493,7 @@ nsCSSFrameConstructor::ProcessChildren(nsFrameConstructorState& aState,
|
|||||||
itemsToConstruct);
|
itemsToConstruct);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!aFrame->IsLeaf()) {
|
if (!aPossiblyLeafFrame->IsLeaf()) {
|
||||||
// :before/:after content should have the same style context parent
|
// :before/:after content should have the same style context parent
|
||||||
// as normal kids.
|
// as normal kids.
|
||||||
// Note that we don't use this style context for looking up things like
|
// Note that we don't use this style context for looking up things like
|
||||||
|
@ -727,6 +727,11 @@ private:
|
|||||||
would have been scrollable but has been forced to be
|
would have been scrollable but has been forced to be
|
||||||
non-scrollable due to being in a paginated context. */
|
non-scrollable due to being in a paginated context. */
|
||||||
#define FCDATA_FORCED_NON_SCROLLABLE_BLOCK 0x20000
|
#define FCDATA_FORCED_NON_SCROLLABLE_BLOCK 0x20000
|
||||||
|
/* If FCDATA_CREATE_BLOCK_WRAPPER_FOR_ALL_KIDS is set, then create a
|
||||||
|
block formatting context wrapper around the kids of this frame
|
||||||
|
using the FrameConstructionData's mPseudoAtom for its anonymous
|
||||||
|
box type. */
|
||||||
|
#define FCDATA_CREATE_BLOCK_WRAPPER_FOR_ALL_KIDS 0x40000
|
||||||
|
|
||||||
/* Structure representing information about how a frame should be
|
/* Structure representing information about how a frame should be
|
||||||
constructed. */
|
constructed. */
|
||||||
@ -745,6 +750,9 @@ private:
|
|||||||
FrameConstructionDataGetter mDataGetter;
|
FrameConstructionDataGetter mDataGetter;
|
||||||
} mFunc;
|
} mFunc;
|
||||||
FrameFullConstructor mFullConstructor;
|
FrameFullConstructor mFullConstructor;
|
||||||
|
// For cases when FCDATA_CREATE_BLOCK_WRAPPER_FOR_ALL_KIDS is set, the
|
||||||
|
// anonymous box type to use for that wrapper.
|
||||||
|
nsICSSAnonBoxPseudo * const * const mAnonBoxPseudo;
|
||||||
};
|
};
|
||||||
|
|
||||||
/* Structure representing a mapping of an atom to a FrameConstructionData.
|
/* Structure representing a mapping of an atom to a FrameConstructionData.
|
||||||
@ -1130,15 +1138,6 @@ protected:
|
|||||||
nsIFrame** aPlaceholderFrame);
|
nsIFrame** aPlaceholderFrame);
|
||||||
|
|
||||||
private:
|
private:
|
||||||
// ConstructButtonFrame puts the new frame in aFrameItems and
|
|
||||||
// handles the kids of the button.
|
|
||||||
nsresult ConstructButtonFrame(nsFrameConstructorState& aState,
|
|
||||||
FrameConstructionItem& aItem,
|
|
||||||
nsIFrame* aParentFrame,
|
|
||||||
const nsStyleDisplay* aStyleDisplay,
|
|
||||||
nsFrameItems& aFrameItems,
|
|
||||||
nsIFrame** aNewFrame);
|
|
||||||
|
|
||||||
// ConstructSelectFrame puts the new frame in aFrameItems and
|
// ConstructSelectFrame puts the new frame in aFrameItems and
|
||||||
// handles the kids of the select.
|
// handles the kids of the select.
|
||||||
nsresult ConstructSelectFrame(nsFrameConstructorState& aState,
|
nsresult ConstructSelectFrame(nsFrameConstructorState& aState,
|
||||||
@ -1328,13 +1327,6 @@ private:
|
|||||||
nsIFrame* aParentFrame,
|
nsIFrame* aParentFrame,
|
||||||
nsStyleContext* aStyleContext);
|
nsStyleContext* aStyleContext);
|
||||||
|
|
||||||
nsresult ConstructSVGForeignObjectFrame(nsFrameConstructorState& aState,
|
|
||||||
FrameConstructionItem& aItem,
|
|
||||||
nsIFrame* aParentFrame,
|
|
||||||
const nsStyleDisplay* aStyleDisplay,
|
|
||||||
nsFrameItems& aFrameItems,
|
|
||||||
nsIFrame** aNewFrame);
|
|
||||||
|
|
||||||
/* Not static because it does PropagateScrollToViewport. If this
|
/* Not static because it does PropagateScrollToViewport. If this
|
||||||
changes, make this static */
|
changes, make this static */
|
||||||
const FrameConstructionData*
|
const FrameConstructionData*
|
||||||
@ -1388,6 +1380,9 @@ private:
|
|||||||
* styles on the parent.
|
* styles on the parent.
|
||||||
* @param aPendingBinding Make sure to push this into aState before doing any
|
* @param aPendingBinding Make sure to push this into aState before doing any
|
||||||
* child item construction.
|
* child item construction.
|
||||||
|
* @param aPossiblyLeafFrame if non-null, this should be used for the isLeaf
|
||||||
|
* test and the anonymous content creation. If null, aFrame will be
|
||||||
|
* used.
|
||||||
*/
|
*/
|
||||||
nsresult ProcessChildren(nsFrameConstructorState& aState,
|
nsresult ProcessChildren(nsFrameConstructorState& aState,
|
||||||
nsIContent* aContent,
|
nsIContent* aContent,
|
||||||
@ -1396,7 +1391,8 @@ private:
|
|||||||
const bool aCanHaveGeneratedContent,
|
const bool aCanHaveGeneratedContent,
|
||||||
nsFrameItems& aFrameItems,
|
nsFrameItems& aFrameItems,
|
||||||
const bool aAllowBlockStyles,
|
const bool aAllowBlockStyles,
|
||||||
PendingBinding* aPendingBinding);
|
PendingBinding* aPendingBinding,
|
||||||
|
nsIFrame* aPossiblyLeafFrame = nsnull);
|
||||||
|
|
||||||
nsIFrame* GetFrameFor(nsIContent* aContent);
|
nsIFrame* GetFrameFor(nsIContent* aContent);
|
||||||
|
|
||||||
|
5
layout/reftests/forms/button-first-letter-1-noref.html
Normal file
5
layout/reftests/forms/button-first-letter-1-noref.html
Normal file
@ -0,0 +1,5 @@
|
|||||||
|
<!DOCTYPE html>
|
||||||
|
<style>
|
||||||
|
body { line-height: 0; }
|
||||||
|
</style>
|
||||||
|
<button>Some text</button>
|
7
layout/reftests/forms/button-first-letter-1-ref.html
Normal file
7
layout/reftests/forms/button-first-letter-1-ref.html
Normal file
@ -0,0 +1,7 @@
|
|||||||
|
<!DOCTYPE html>
|
||||||
|
<style>
|
||||||
|
button { display: block; }
|
||||||
|
button::first-letter { color: green; }
|
||||||
|
body { line-height: 0; }
|
||||||
|
</style>
|
||||||
|
<button>Some text</button>
|
6
layout/reftests/forms/button-first-letter-1.html
Normal file
6
layout/reftests/forms/button-first-letter-1.html
Normal file
@ -0,0 +1,6 @@
|
|||||||
|
<!DOCTYPE html>
|
||||||
|
<style>
|
||||||
|
button::first-letter { color: green; }
|
||||||
|
body { line-height: 0; }
|
||||||
|
</style>
|
||||||
|
<button>Some text</button>
|
@ -61,6 +61,9 @@ fails-if(Android) != textarea-rtl.html textarea-no-resize.html
|
|||||||
== select-boguskids.html select-boguskids-ref.html
|
== select-boguskids.html select-boguskids-ref.html
|
||||||
== select-dynamic-boguskids.html select-boguskids-ref.html
|
== select-dynamic-boguskids.html select-boguskids-ref.html
|
||||||
|
|
||||||
|
asserts(2) == button-first-letter-1.html button-first-letter-1-ref.html
|
||||||
|
asserts(1) != button-first-letter-1.html button-first-letter-1-noref.html
|
||||||
|
|
||||||
# placeholder
|
# placeholder
|
||||||
include placeholder/reftest.list
|
include placeholder/reftest.list
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user