Bug 1083004 - Create anonymous ruby base container when necessary. r=bz

This commit is contained in:
Xidorn Quan 2014-11-12 17:31:37 +11:00
parent ccaf23b377
commit 05c9cf167b
2 changed files with 62 additions and 10 deletions

View File

@ -2282,8 +2282,8 @@ NeedFrameFor(const nsFrameConstructorState& aState,
// should be considered ignorable just because they evaluate to // should be considered ignorable just because they evaluate to
// whitespace. // whitespace.
// We could handle all this in CreateNeededPseudos or some other place // We could handle all this in CreateNeededPseudoContainers or some other
// after we build our frame construction items, but that would involve // place after we build our frame construction items, but that would involve
// creating frame construction items for whitespace kids of // creating frame construction items for whitespace kids of
// eExcludesIgnorableWhitespace frames, where we know we'll be dropping them // eExcludesIgnorableWhitespace frames, where we know we'll be dropping them
// all anyway, and involve an extra walk down the frame construction item // all anyway, and involve an extra walk down the frame construction item
@ -9347,9 +9347,10 @@ nsCSSFrameConstructor::CreateNeededAnonFlexOrGridItems(
* contain only items for frames that can be direct kids of aParentFrame. * contain only items for frames that can be direct kids of aParentFrame.
*/ */
void void
nsCSSFrameConstructor::CreateNeededPseudos(nsFrameConstructorState& aState, nsCSSFrameConstructor::CreateNeededPseudoContainers(
FrameConstructionItemList& aItems, nsFrameConstructorState& aState,
nsIFrame* aParentFrame) FrameConstructionItemList& aItems,
nsIFrame* aParentFrame)
{ {
ParentType ourParentType = GetParentType(aParentFrame); ParentType ourParentType = GetParentType(aParentFrame);
if (aItems.AllWantParentType(ourParentType)) { if (aItems.AllWantParentType(ourParentType)) {
@ -9675,14 +9676,58 @@ nsCSSFrameConstructor::CreateNeededPseudos(nsFrameConstructorState& aState,
} while (!iter.IsDone()); } while (!iter.IsDone());
} }
void nsCSSFrameConstructor::CreateNeededPseudoSiblings(
nsFrameConstructorState& aState,
FrameConstructionItemList& aItems,
nsIFrame* aParentFrame)
{
if (aItems.IsEmpty() ||
GetParentType(aParentFrame) != eTypeRuby) {
return;
}
FCItemIterator iter(aItems);
// XXX Use computed display value instead in bug 1096639.
auto creationFunc = reinterpret_cast<void*>(
iter.item().mFCData->mFunc.mCreationFunc);
if (creationFunc == NS_NewRubyBaseContainerFrame) {
return;
}
NS_ASSERTION(creationFunc == NS_NewRubyTextContainerFrame,
"Child of ruby frame should either a rbc or a rtc");
const PseudoParentData& pseudoData =
sPseudoParentData[eTypeRubyBaseContainer];
already_AddRefed<nsStyleContext> pseudoStyle = mPresShell->StyleSet()->
ResolveAnonymousBoxStyle(*pseudoData.mPseudoType,
aParentFrame->StyleContext());
FrameConstructionItem* newItem =
new FrameConstructionItem(&pseudoData.mFCData,
// Use the content of the parent frame
aParentFrame->GetContent(),
// Tag type
*pseudoData.mPseudoType,
// Use the namespace of the rtc frame
iter.item().mNameSpaceID,
// no pending binding
nullptr,
pseudoStyle,
true, nullptr);
newItem->mIsAllInline = true;
newItem->mChildItems.SetParentHasNoXBLChildren(true);
iter.InsertItem(newItem);
}
inline void inline void
nsCSSFrameConstructor::ConstructFramesFromItemList(nsFrameConstructorState& aState, nsCSSFrameConstructor::ConstructFramesFromItemList(nsFrameConstructorState& aState,
FrameConstructionItemList& aItems, FrameConstructionItemList& aItems,
nsContainerFrame* aParentFrame, nsContainerFrame* aParentFrame,
nsFrameItems& aFrameItems) nsFrameItems& aFrameItems)
{ {
CreateNeededPseudos(aState, aItems, aParentFrame); CreateNeededPseudoContainers(aState, aItems, aParentFrame);
CreateNeededAnonFlexOrGridItems(aState, aItems, aParentFrame); CreateNeededAnonFlexOrGridItems(aState, aItems, aParentFrame);
CreateNeededPseudoSiblings(aState, aItems, aParentFrame);
aItems.SetTriedConstructingFrames(); aItems.SetTriedConstructingFrames();
for (FCItemIterator iter(aItems); !iter.IsDone(); iter.Next()) { for (FCItemIterator iter(aItems); !iter.IsDone(); iter.Next()) {

View File

@ -1097,13 +1097,20 @@ private:
nsIFrame* aParentFrame); nsIFrame* aParentFrame);
/** /**
* Function to create the table pseudo items we need. * Function to create the pseudo intermediate containers we need.
* @param aItems the child frame construction items before pseudo creation * @param aItems the child frame construction items before pseudo creation
* @param aParentFrame the parent frame we're creating pseudos for * @param aParentFrame the parent frame we're creating pseudos for
*/ */
inline void CreateNeededPseudos(nsFrameConstructorState& aState, inline void CreateNeededPseudoContainers(nsFrameConstructorState& aState,
FrameConstructionItemList& aItems, FrameConstructionItemList& aItems,
nsIFrame* aParentFrame); nsIFrame* aParentFrame);
/**
* Function to create the pseudo siblings we need.
*/
inline void CreateNeededPseudoSiblings(nsFrameConstructorState& aState,
FrameConstructionItemList& aItems,
nsIFrame* aParentFrame);
/** /**
* Function to adjust aParentFrame to deal with captions. * Function to adjust aParentFrame to deal with captions.