diff --git a/layout/base/nsCSSFrameConstructor.cpp b/layout/base/nsCSSFrameConstructor.cpp index 12e0941d4b7..ecc094abed2 100644 --- a/layout/base/nsCSSFrameConstructor.cpp +++ b/layout/base/nsCSSFrameConstructor.cpp @@ -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,9 +9347,10 @@ nsCSSFrameConstructor::CreateNeededAnonFlexOrGridItems( * contain only items for frames that can be direct kids of aParentFrame. */ void -nsCSSFrameConstructor::CreateNeededPseudos(nsFrameConstructorState& aState, - FrameConstructionItemList& aItems, - nsIFrame* aParentFrame) +nsCSSFrameConstructor::CreateNeededPseudoContainers( + nsFrameConstructorState& aState, + FrameConstructionItemList& aItems, + nsIFrame* aParentFrame) { ParentType ourParentType = GetParentType(aParentFrame); if (aItems.AllWantParentType(ourParentType)) { @@ -9675,14 +9676,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( + 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 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()) { diff --git a/layout/base/nsCSSFrameConstructor.h b/layout/base/nsCSSFrameConstructor.h index 0cc1a3399de..cad3d664965 100644 --- a/layout/base/nsCSSFrameConstructor.h +++ b/layout/base/nsCSSFrameConstructor.h @@ -1097,13 +1097,20 @@ 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, - FrameConstructionItemList& aItems, - nsIFrame* aParentFrame); + 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); /** * Function to adjust aParentFrame to deal with captions.