Bug 1384542: Remove usage of GetParentAllowServo in the frame constructor. r?bz
MozReview-Commit-ID: HPMzM8p3GSO
--- a/layout/base/nsCSSFrameConstructor.cpp
+++ b/layout/base/nsCSSFrameConstructor.cpp
@@ -11696,19 +11696,22 @@ static bool IsFirstLetterContent(nsICont
* Create a letter frame, only make it a floating frame.
*/
nsFirstLetterFrame*
nsCSSFrameConstructor::CreateFloatingLetterFrame(
nsFrameConstructorState& aState,
nsIContent* aTextContent,
nsIFrame* aTextFrame,
nsContainerFrame* aParentFrame,
+ nsStyleContext* aParentStyleContext,
nsStyleContext* aStyleContext,
nsFrameItems& aResult)
{
+ MOZ_ASSERT(aParentStyleContext);
+
nsFirstLetterFrame* letterFrame =
NS_NewFirstLetterFrame(mPresShell, aStyleContext);
// We don't want to use a text content for a non-text frame (because we want
// its primary frame to be a text frame). So use its parent for the
// first-letter.
nsIContent* letterContent = aTextContent->GetParent();
nsContainerFrame* containingBlock = aState.GetGeometricParent(
aStyleContext->StyleDisplay(), aParentFrame);
@@ -11730,23 +11733,19 @@ nsCSSFrameConstructor::CreateFloatingLet
// See if we will need to continue the text frame (does it contain
// more than just the first-letter text or not?) If it does, then we
// create (in advance) a continuation frame for it.
nsIFrame* nextTextFrame = nullptr;
if (NeedFirstLetterContinuation(aTextContent)) {
// Create continuation
nextTextFrame =
CreateContinuingFrame(aState.mPresContext, aTextFrame, aParentFrame);
- // Repair the continuations style context
- nsStyleContext* parentStyleContext = aStyleContext->GetParentAllowServo();
- if (parentStyleContext) {
- RefPtr<nsStyleContext> newSC = styleSet->
- ResolveStyleForText(aTextContent, parentStyleContext);
- nextTextFrame->SetStyleContext(newSC);
- }
+ RefPtr<nsStyleContext> newSC = styleSet->
+ ResolveStyleForText(aTextContent, aParentStyleContext);
+ nextTextFrame->SetStyleContext(newSC);
}
NS_ASSERTION(aResult.IsEmpty(), "aResult should be an empty nsFrameItems!");
// Put the new float before any of the floats in the block we're doing
// first-letter for, that is, before any floats whose parent is
// containingBlock.
nsFrameList::FrameLinkEnumerator link(aState.mFloatedItems);
while (!link.AtEnd() && link.NextFrame()->GetParent() != containingBlock) {
@@ -11787,18 +11786,18 @@ nsCSSFrameConstructor::CreateLetterFrame
nsCSSPseudoElements::firstLetter)->
StyleContext();
// Use content from containing block so that we can actually
// find a matching style rule.
nsIContent* blockContent = aBlockFrame->GetContent();
// Create first-letter style rule
- RefPtr<nsStyleContext> sc = GetFirstLetterStyle(blockContent,
- parentStyleContext);
+ RefPtr<nsStyleContext> sc =
+ GetFirstLetterStyle(blockContent, parentStyleContext);
if (sc) {
RefPtr<nsStyleContext> textSC = mPresShell->StyleSet()->
ResolveStyleForText(aTextContent, sc);
// Create a new text frame (the original one will be discarded)
// pass a temporary stylecontext, the correct one will be set
// later. Start off by unsetting the primary frame for
// aTextContent, so it's no longer pointing to the to-be-destroyed
@@ -11819,17 +11818,18 @@ nsCSSFrameConstructor::CreateLetterFrame
// Create the right type of first-letter frame
const nsStyleDisplay* display = sc->StyleDisplay();
nsFirstLetterFrame* letterFrame;
if (display->IsFloatingStyle() &&
!nsSVGUtils::IsInSVGTextSubtree(aParentFrame)) {
// Make a floating first-letter frame
letterFrame = CreateFloatingLetterFrame(state, aTextContent, textFrame,
- aParentFrame, sc, aResult);
+ aParentFrame, parentStyleContext,
+ sc, aResult);
}
else {
// Make an inflow first-letter frame
letterFrame = NS_NewFirstLetterFrame(mPresShell, sc);
// Initialize the first-letter-frame. We don't want to use a text
// content for a non-text frame (because we want its primary frame to
// be a text frame). So use its parent for the first-letter.
--- a/layout/base/nsCSSFrameConstructor.h
+++ b/layout/base/nsCSSFrameConstructor.h
@@ -1944,16 +1944,17 @@ private:
// Methods support :first-letter style
nsFirstLetterFrame*
CreateFloatingLetterFrame(nsFrameConstructorState& aState,
nsIContent* aTextContent,
nsIFrame* aTextFrame,
nsContainerFrame* aParentFrame,
+ nsStyleContext* aParentStyleContext,
nsStyleContext* aStyleContext,
nsFrameItems& aResult);
void CreateLetterFrame(nsContainerFrame* aBlockFrame,
nsContainerFrame* aBlockContinuation,
nsIContent* aTextContent,
nsContainerFrame* aParentFrame,
nsFrameItems& aResult);