// Create the text content used as label for the button. // The frame will be generated by the frame constructor. nsIFrame* nsGfxButtonControlFrame::CreateFrameFor(nsIContent* aContent) { nsIFrame * newFrame = nullptr; if (aContent == mTextContent) { nsIFrame * parentFrame = mFrames.FirstChild(); nsPresContext* presContext = PresContext(); nsRefPtr<nsStyleContext> textStyleContext; textStyleContext = presContext->StyleSet()-> ResolveStyleForNonElement(mStyleContext); if (textStyleContext) { newFrame = NS_NewTextFrame(presContext->PresShell(), textStyleContext); if (newFrame) { // initialize the text frame newFrame->Init(mTextContent, parentFrame, nullptr); mTextContent->SetPrimaryFrame(newFrame); } } } return newFrame; }
nsIFrame* nsComboboxControlFrame::CreateFrameFor(nsIContent* aContent) { NS_PRECONDITION(nsnull != aContent, "null ptr"); NS_ASSERTION(mDisplayContent, "mDisplayContent can't be null!"); if (mDisplayContent != aContent) { // We only handle the frames for mDisplayContent here return nsnull; } // Get PresShell nsIPresShell *shell = PresContext()->PresShell(); nsStyleSet *styleSet = shell->StyleSet(); // create the style contexts for the anonymous block frame and text frame nsRefPtr<nsStyleContext> styleContext; styleContext = styleSet-> ResolvePseudoStyleFor(mContent, nsCSSAnonBoxes::mozDisplayComboboxControlFrame, mStyleContext); if (NS_UNLIKELY(!styleContext)) { return nsnull; } nsRefPtr<nsStyleContext> textStyleContext; textStyleContext = styleSet->ResolveStyleForNonElement(mStyleContext); if (NS_UNLIKELY(!textStyleContext)) { return nsnull; } // Start by by creating our anonymous block frame mDisplayFrame = new (shell) nsComboboxDisplayFrame(styleContext, this); if (NS_UNLIKELY(!mDisplayFrame)) { return nsnull; } nsresult rv = mDisplayFrame->Init(mContent, this, nsnull); if (NS_FAILED(rv)) { mDisplayFrame->Destroy(); mDisplayFrame = nsnull; return nsnull; } // Create a text frame and put it inside the block frame mTextFrame = NS_NewTextFrame(shell, textStyleContext); if (NS_UNLIKELY(!mTextFrame)) { return nsnull; } // initialize the text frame rv = mTextFrame->Init(aContent, mDisplayFrame, nsnull); if (NS_FAILED(rv)) { mDisplayFrame->Destroy(); mDisplayFrame = nsnull; mTextFrame->Destroy(); mTextFrame = nsnull; return nsnull; } nsFrameList textList(mTextFrame); mDisplayFrame->SetInitialChildList(nsnull, textList); return mDisplayFrame; }