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

This commit is contained in:
Xidorn Quan 2014-11-11 16:41:58 +11:00
Родитель 08b79732f2
Коммит 2d623e68f6
2 изменённых файлов: 62 добавлений и 10 удалений

Просмотреть файл

@ -2282,8 +2282,8 @@ NeedFrameFor(const nsFrameConstructorState& aState,
// should be considered ignorable just because they evaluate to
// whitespace.
// We could handle all this in CreateNeededPseudos or some other place
// after we build our frame construction items, but that would involve
// We could handle all this in CreateNeededPseudoContainers or some other
// place after we build our frame construction items, but that would involve
// creating frame construction items for whitespace kids of
// eExcludesIgnorableWhitespace frames, where we know we'll be dropping them
// all anyway, and involve an extra walk down the frame construction item
@ -9347,7 +9347,8 @@ nsCSSFrameConstructor::CreateNeededAnonFlexOrGridItems(
* contain only items for frames that can be direct kids of aParentFrame.
*/
void
nsCSSFrameConstructor::CreateNeededPseudos(nsFrameConstructorState& aState,
nsCSSFrameConstructor::CreateNeededPseudoContainers(
nsFrameConstructorState& aState,
FrameConstructionItemList& aItems,
nsIFrame* aParentFrame)
{
@ -9622,14 +9623,58 @@ nsCSSFrameConstructor::CreateNeededPseudos(nsFrameConstructorState& aState,
} 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
nsCSSFrameConstructor::ConstructFramesFromItemList(nsFrameConstructorState& aState,
FrameConstructionItemList& aItems,
nsContainerFrame* aParentFrame,
nsFrameItems& aFrameItems)
{
CreateNeededPseudos(aState, aItems, aParentFrame);
CreateNeededPseudoContainers(aState, aItems, aParentFrame);
CreateNeededAnonFlexOrGridItems(aState, aItems, aParentFrame);
CreateNeededPseudoSiblings(aState, aItems, aParentFrame);
aItems.SetTriedConstructingFrames();
for (FCItemIterator iter(aItems); !iter.IsDone(); iter.Next()) {

Просмотреть файл

@ -1097,11 +1097,18 @@ private:
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 aParentFrame the parent frame we're creating pseudos for
*/
inline void CreateNeededPseudos(nsFrameConstructorState& aState,
inline void CreateNeededPseudoContainers(nsFrameConstructorState& aState,
FrameConstructionItemList& aItems,
nsIFrame* aParentFrame);
/**
* Function to create the pseudo siblings we need.
*/
inline void CreateNeededPseudoSiblings(nsFrameConstructorState& aState,
FrameConstructionItemList& aItems,
nsIFrame* aParentFrame);