Backed out 4 changesets (bug 1331322) for Android reftest failures in 1169331-1.html and forced-bg-color-outside-visible-region.html

Backed out changeset 96c6b5a11284 (bug 1331322)
Backed out changeset 15877d32de7d (bug 1331322)
Backed out changeset 841d608704d7 (bug 1331322)
Backed out changeset 02096c5eb029 (bug 1331322)
This commit is contained in:
Phil Ringnalda
2017-02-15 21:24:00 -08:00
parent b1ef1c8c3b
commit a6b8226a11
25 changed files with 131 additions and 269 deletions

View File

@@ -166,7 +166,8 @@ nsIContent::DoGetID() const
const nsAttrValue*
Element::DoGetClasses() const
{
MOZ_ASSERT(MayHaveClass(), "Unexpected call");
MOZ_ASSERT(HasFlag(NODE_MAY_HAVE_CLASS), "Unexpected call");
if (IsSVGElement()) {
const nsAttrValue* animClass =
static_cast<const nsSVGElement*>(this)->GetAnimatedClassName();
@@ -2548,7 +2549,7 @@ Element::ParseAttribute(int32_t aNamespaceID,
{
if (aNamespaceID == kNameSpaceID_None) {
if (aAttribute == nsGkAtoms::_class) {
SetMayHaveClass();
SetFlags(NODE_MAY_HAVE_CLASS);
// Result should have been preparsed above.
return true;
}

View File

@@ -623,7 +623,7 @@ public:
* guaranteed (e.g. we could have class="").
*/
const nsAttrValue* GetClasses() const {
if (MayHaveClass()) {
if (HasFlag(NODE_MAY_HAVE_CLASS)) {
return DoGetClasses();
}
return nullptr;
@@ -793,25 +793,6 @@ public:
already_AddRefed<nsIHTMLCollection>
GetElementsByClassName(const nsAString& aClassNames);
CSSPseudoElementType GetPseudoElementType() const {
if (!HasProperties()) {
return CSSPseudoElementType::NotPseudo;
}
nsresult rv = NS_OK;
auto raw = GetProperty(nsGkAtoms::pseudoProperty, &rv);
if (rv == NS_PROPTABLE_PROP_NOT_THERE) {
return CSSPseudoElementType::NotPseudo;
}
return CSSPseudoElementType(reinterpret_cast<uintptr_t>(raw));
}
void SetPseudoElementType(CSSPseudoElementType aPseudo) {
static_assert(sizeof(CSSPseudoElementType) <= sizeof(uintptr_t),
"Need to be able to store this in a void*");
MOZ_ASSERT(aPseudo != CSSPseudoElementType::NotPseudo);
SetProperty(nsGkAtoms::pseudoProperty, reinterpret_cast<void*>(aPseudo));
}
private:
/**
* Implement the algorithm specified at

View File

@@ -193,7 +193,7 @@ load 930250.html
load 942979.html
load 973401.html
load 978646.html
skip-if(stylo) pref(dom.webcomponents.enabled,true) load 1024428-1.html # bug 1340009
asserts-if(stylo,1-11) pref(dom.webcomponents.enabled,true) load 1024428-1.html # bug 1324671
load 1026714.html
pref(dom.webcomponents.enabled,true) load 1027461-1.html
pref(dom.webcomponents.enabled,true) load 1029710.html

View File

@@ -2152,7 +2152,6 @@ GK_ATOM(lockedStyleStates, "lockedStyleStates")
GK_ATOM(apzCallbackTransform, "apzCallbackTransform")
GK_ATOM(restylableAnonymousNode, "restylableAnonymousNode")
GK_ATOM(paintRequestTime, "PaintRequestTime")
GK_ATOM(pseudoProperty, "PseudoProperty") // CSSPseudoElementType
// Languages for lang-specific transforms
GK_ATOM(Japanese, "ja")

View File

@@ -194,7 +194,7 @@ public:
void SetIsNativeAnonymousRoot()
{
SetFlags(NODE_IS_ANONYMOUS_ROOT | NODE_IS_IN_NATIVE_ANONYMOUS_SUBTREE |
NODE_IS_NATIVE_ANONYMOUS_ROOT | NODE_IS_NATIVE_ANONYMOUS);
NODE_IS_NATIVE_ANONYMOUS_ROOT);
}
/**

View File

@@ -1529,6 +1529,7 @@ nsINode::SetExplicitBaseURI(nsIURI* aURI)
{
nsresult rv = SetProperty(nsGkAtoms::baseURIProperty, aURI, ReleaseURI);
if (NS_SUCCEEDED(rv)) {
SetHasExplicitBaseURI();
NS_ADDREF(aURI);
}
return rv;

View File

@@ -127,28 +127,9 @@ enum {
NODE_IS_EDITABLE = NODE_FLAG_BIT(7),
// This node was created by layout as native anonymous content. This
// generally corresponds to things created by nsIAnonymousContentCreator,
// though there are exceptions (svg:use content does not have this flag
// set, and any non-nsIAnonymousContentCreator callers of
// SetIsNativeAnonymousRoot also get this flag).
//
// One very important aspect here is that this node is not transitive over
// the subtree (if you want that, use NODE_IS_IN_NATIVE_ANONYMOUS_SUBTREE).
// If Gecko code somewhere attaches children to a node with this bit set,
// the children will not have the bit themselves unless the calling code sets
// it explicitly. This means that XBL content bound to NAC doesn't get this
// bit, nor do nodes inserted by editor.
//
// For now, this bit exists primarily to control style inheritance behavior,
// since the nodes for which we set it are often used to implement pseudo-
// elements, which need to inherit style from a script-visible element.
//
// A more general principle for this bit might be this: If the node is entirely
// a detail of layout, is not script-observable in any way, and other engines
// might accomplish the same task with a nodeless layout frame, then the node
// should have this bit set.
NODE_IS_NATIVE_ANONYMOUS = NODE_FLAG_BIT(8),
// For all Element nodes, NODE_MAY_HAVE_CLASS is guaranteed to be set if the
// node in fact has a class, but may be set even if it doesn't.
NODE_MAY_HAVE_CLASS = NODE_FLAG_BIT(8),
// Whether the node participates in a shadow tree.
NODE_IS_IN_SHADOW_TREE = NODE_FLAG_BIT(9),
@@ -1190,15 +1171,6 @@ public:
#endif
}
/**
* Returns true if |this| is native anonymous (i.e. created by
* nsIAnonymousContentCreator);
*/
bool IsNativeAnonymous() const
{
return HasFlag(NODE_IS_NATIVE_ANONYMOUS);
}
/**
* Returns true if |this| or any of its ancestors is native anonymous.
*/
@@ -1331,12 +1303,11 @@ public:
protected:
nsIURI* GetExplicitBaseURI() const {
if (!HasProperties()) {
return nullptr;
}
if (HasExplicitBaseURI()) {
return static_cast<nsIURI*>(GetProperty(nsGkAtoms::baseURIProperty));
}
return nullptr;
}
public:
void GetTextContent(nsAString& aTextContent,
@@ -1525,8 +1496,6 @@ private:
// cases lie for nsXMLElement, such as when the node has been moved between
// documents with different id mappings.
ElementHasID,
// Set if the element might have a class.
ElementMayHaveClass,
// Set if the element might have inline style.
ElementMayHaveStyle,
// Set if the element has a name attribute set.
@@ -1545,6 +1514,8 @@ private:
// Maybe set if the node is a root of a subtree
// which needs to be kept in the purple buffer.
NodeIsPurpleRoot,
// Set if the node has an explicit base URI stored
NodeHasExplicitBaseURI,
// Set if the element has some style states locked
ElementHasLockedStyleStates,
// Set if element has pointer locked
@@ -1621,8 +1592,6 @@ public:
{ SetBoolFlag(NodeHasRenderingObservers, aValue); }
bool IsContent() const { return GetBoolFlag(NodeIsContent); }
bool HasID() const { return GetBoolFlag(ElementHasID); }
bool MayHaveClass() const { return GetBoolFlag(ElementMayHaveClass); }
void SetMayHaveClass() { SetBoolFlag(ElementMayHaveClass); }
bool MayHaveStyle() const { return GetBoolFlag(ElementMayHaveStyle); }
bool HasName() const { return GetBoolFlag(ElementHasName); }
bool MayHaveContentEditableAttr() const
@@ -1752,6 +1721,8 @@ protected:
void ClearHasName() { ClearBoolFlag(ElementHasName); }
void SetMayHaveContentEditableAttr()
{ SetBoolFlag(ElementMayHaveContentEditableAttr); }
bool HasExplicitBaseURI() const { return GetBoolFlag(NodeHasExplicitBaseURI); }
void SetHasExplicitBaseURI() { SetBoolFlag(NodeHasExplicitBaseURI); }
void SetHasLockedStyleStates() { SetBoolFlag(ElementHasLockedStyleStates); }
void ClearHasLockedStyleStates() { ClearBoolFlag(ElementHasLockedStyleStates); }
bool HasLockedStyleStates() const

View File

@@ -70,7 +70,7 @@ nsSVGClass::SetBaseValue(const nsAString& aValue,
{
NS_ASSERTION(aSVGElement, "Null element passed to SetBaseValue");
aSVGElement->SetMayHaveClass();
aSVGElement->SetFlags(NODE_MAY_HAVE_CLASS);
if (aDoSetAttr) {
aSVGElement->SetAttr(kNameSpaceID_None, nsGkAtoms::_class, aValue, true);
}
@@ -106,7 +106,7 @@ nsSVGClass::SetAnimValue(const nsAString& aValue, nsSVGElement *aSVGElement)
mAnimVal = new nsString();
}
*mAnimVal = aValue;
aSVGElement->SetMayHaveClass();
aSVGElement->SetFlags(NODE_MAY_HAVE_CLASS);
aSVGElement->DidAnimateClass();
}

View File

@@ -231,7 +231,7 @@ nsXULElement::Create(nsXULPrototypeElement* aPrototype, mozilla::dom::NodeInfo *
element->SetHasID();
}
if (aPrototype->mHasClassAttribute) {
element->SetMayHaveClass();
element->SetFlags(NODE_MAY_HAVE_CLASS);
}
if (aPrototype->mHasStyleAttribute) {
element->SetMayHaveStyle();
@@ -405,7 +405,7 @@ nsXULElement::Clone(mozilla::dom::NodeInfo *aNodeInfo, nsINode **aResult) const
element->SetHasID();
}
if (originalName->Equals(nsGkAtoms::_class)) {
element->SetMayHaveClass();
element->SetFlags(NODE_MAY_HAVE_CLASS);
}
if (originalName->Equals(nsGkAtoms::style)) {
element->SetMayHaveStyle();

View File

@@ -2012,16 +2012,6 @@ ElementRestyler::ComputeRestyleResultFromFrame(nsIFrame* aSelf,
return;
}
// Each NAC element inherits from the first non-NAC ancestor, so child
// NAC may inherit from our parent instead of us. That means we can't
// cull traversal if our style context didn't change.
if (aSelf->GetContent() && aSelf->GetContent()->IsNativeAnonymous()) {
LOG_RESTYLE_CONTINUE("native anonymous content");
aRestyleResult = RestyleResult::eContinue;
aCanStopWithStyleChange = false;
return;
}
// Style changes might have moved children between the two nsLetterFrames
// (the one matching ::first-letter and the one containing the rest of the
// content). Continue restyling to the children of the nsLetterFrame so

View File

@@ -1867,7 +1867,6 @@ nsCSSFrameConstructor::CreateGeneratedContentItem(nsFrameConstructorState& aStat
if (NS_FAILED(rv))
return;
container->SetIsNativeAnonymousRoot();
container->SetPseudoElementType(aPseudoElement);
// If the parent is in a shadow tree, make sure we don't
// bind with a document because shadow roots and its descendants
@@ -4188,13 +4187,6 @@ ConnectAnonymousTreeDescendants(nsIContent* aParent,
}
}
void SetNativeAnonymousBitOnDescendants(nsIContent *aRoot)
{
for (nsIContent* curr = aRoot; curr; curr = curr->GetNextNode(aRoot)) {
curr->SetFlags(NODE_IS_NATIVE_ANONYMOUS);
}
}
nsresult
nsCSSFrameConstructor::GetAnonymousContent(nsIContent* aParent,
nsIFrame* aParentFrame,
@@ -4216,17 +4208,16 @@ nsCSSFrameConstructor::GetAnonymousContent(nsIContent* aParent,
nsIContent* content = aContent[i].mContent;
NS_ASSERTION(content, "null anonymous content?");
ConnectAnonymousTreeDescendants(content, aContent[i].mChildren);
// least-surprise CSS binding until we do the SVG specified
// cascading rules for <svg:use> - bug 265894
if (aParentFrame->GetType() == nsGkAtoms::svgUseFrame) {
content->SetFlags(NODE_IS_ANONYMOUS_ROOT);
} else {
content->SetIsNativeAnonymousRoot();
SetNativeAnonymousBitOnDescendants(content);
}
ConnectAnonymousTreeDescendants(content, aContent[i].mChildren);
bool anonContentIsEditable = content->HasFlag(NODE_IS_EDITABLE);
// If the parent is in a shadow tree, make sure we don't
@@ -4251,9 +4242,11 @@ nsCSSFrameConstructor::GetAnonymousContent(nsIContent* aParent,
}
if (ServoStyleSet* styleSet = mPresShell->StyleSet()->GetAsServo()) {
// Eagerly compute styles for the anonymous content tree.
// Eagerly compute styles for the anonymous content tree, but only do so
// if the content doesn't have an explicit style context (if it does, we
// don't need the normal computed values).
for (auto& info : aContent) {
if (info.mContent->IsElement()) {
if (!info.mStyleContext && info.mContent->IsElement()) {
styleSet->StyleNewSubtree(info.mContent->AsElement());
}
}
@@ -5033,17 +5026,13 @@ nsCSSFrameConstructor::ResolveStyleContext(const InsertionPoint& aInsertion,
already_AddRefed<nsStyleContext>
nsCSSFrameConstructor::ResolveStyleContext(nsStyleContext* aParentStyleContext,
nsIContent* aContent,
nsFrameConstructorState* aState,
Element* aOriginatingElementOrNull)
nsFrameConstructorState* aState)
{
StyleSetHandle styleSet = mPresShell->StyleSet();
aContent->OwnerDoc()->FlushPendingLinkUpdates();
RefPtr<nsStyleContext> result;
if (aContent->IsElement()) {
auto pseudoType = aContent->AsElement()->GetPseudoElementType();
if (pseudoType == CSSPseudoElementType::NotPseudo) {
MOZ_ASSERT(!aOriginatingElementOrNull);
if (aState) {
result = styleSet->ResolveStyleFor(aContent->AsElement(),
aParentStyleContext,
@@ -5055,15 +5044,6 @@ nsCSSFrameConstructor::ResolveStyleContext(nsStyleContext* aParentStyleContext,
LazyComputeBehavior::Assert);
}
} else {
MOZ_ASSERT(aOriginatingElementOrNull);
MOZ_ASSERT(aContent->IsInNativeAnonymousSubtree());
result = styleSet->ResolvePseudoElementStyle(aOriginatingElementOrNull,
pseudoType,
aParentStyleContext,
aContent->AsElement());
}
} else {
MOZ_ASSERT(!aOriginatingElementOrNull);
NS_ASSERTION(aContent->IsNodeOfType(nsINode::eTEXT),
"shouldn't waste time creating style contexts for "
"comments and processing instructions");
@@ -10737,95 +10717,24 @@ nsCSSFrameConstructor::AddFCItemsForAnonymousContent(
RefPtr<nsStyleContext> styleContext;
TreeMatchContext::AutoParentDisplayBasedStyleFixupSkipper
parentDisplayBasedStyleFixupSkipper(aState.mTreeMatchContext);
// Make sure we eagerly performed the servo cascade when the anonymous
// nodes were created.
if (aAnonymousItems[i].mStyleContext) {
// If we have an explicit style context, that means that the anonymous
// content creator had its own plan for the style, and doesn't need the
// computed style obtained by cascading this content as a normal node.
// This happens when a native anonymous node is used to implement a
// pseudo-element. Allowing Servo to traverse these nodes would be wasted
// work, so assert that we didn't do that.
MOZ_ASSERT_IF(content->IsStyledByServo(),
!content->IsElement() || !content->AsElement()->HasServoData());
styleContext = aAnonymousItems[i].mStyleContext.forget();
} else {
// If we don't have an explicit style context, that means we need the
// ordinary computed values. Make sure we eagerly cascaded them when the
// anonymous nodes were created.
MOZ_ASSERT_IF(content->IsStyledByServo() && content->IsElement(),
content->AsElement()->HasServoData());
// Determine whether this NAC is pseudo-implementing.
nsIAtom* pseudo = nullptr;
if (content->IsElement()) {
auto pseudoType = content->AsElement()->GetPseudoElementType();
if (pseudoType != CSSPseudoElementType::NotPseudo) {
pseudo = nsCSSPseudoElements::GetPseudoAtom(pseudoType);
styleContext = ResolveStyleContext(aFrame, content, &aState);
}
}
// Determine the appropriate parent style for this NAC, and if the NAC
// implements a pseudo-element, the appropriate originating element
// (that is to say, the element to the left of the ::pseudo-element in
// the selector). This is all rather tricky, and merits some discussion.
//
// First, it's important to note that author stylesheets generally do not
// apply to elements in native-anonymous subtrees. The exceptions to
// this are web-exposed pseudo-elements, where authors can style the
// pseudo-implementing NAC if the originating element is not itself in a NAC
// subtree.
//
// For this reason, it's very important that we avoid using a style parent
// that is inside a NAC subtree together with an originating element that
// is not inside a NAC subtree, since that would allow authors to
// explicitly inherit styles from internal elements, potentially making
// the NAC hierarchy observable. To ensure this, and generally simplify
// things, we always set the originating element to the style parent.
//
// As a consequence of the above, all web-exposed pseudo-elements (which,
// by definition, must have a content-accessible originating element) must
// also inherit style from that same content-accessible element. To avoid
// unintuitive behavior differences between NAC elements that do and don't
// correspond to web-exposed pseudo-elements, we follow this protocol for
// all NAC, pseudo-implementing or not.
//
// However, things get tricky with the <video> element, where we have a
// bunch of XBL-generated anonymous content descending from a native-
// anonymous XULElement. The XBL elements inherit style from their
// flattened tree parent, because that's how XBL works. But then we need
// to figure out what to do when one of those anonymous XBL elements
// (like an <input> element) generates its own (possibly pseudo-element-
// implementing) NAC.
//
// In this case, we inherit style from the XBL-generated NAC-creating
// element, rather than the <video> element. There are a number of good
// reasons for this. First, inheriting from the great-grandparent while
// the parent inherits from the grandparent would be bizarre at best.
// Second, exposing pseudo-elements from elements within our particular
// XBL implementation would allow content styles to (un)intentionally
// alter the video controls, which would be very bad. Third, our UA
// stylesheets have selectors like:
//
// input[type=range][orient=horizontal]::-moz-range-track
//
// and we need to make sure that the originating element is the <input>,
// not the <video>, because that's where the |orient| attribute lives.
//
// The upshot of all of this is that, to find the style parent (and
// originating element, if applicable), we walk up our parent chain to the
// first element that is not itself NAC (distinct from whether it happens
// to be in a NAC subtree).
//
// To implement all this, we need to pass the correct parent style context
// here because SetPrimaryFrame() may not have been called on the content
// yet and thus ResolveStyleContext can't find it otherwise.
//
// We don't need to worry about display:contents here, because such
// elements don't get a frame and thus can't generate NAC. But we do need
// to worry about anonymous boxes, which CorrectStyleParentFrame handles
// for us.
nsIFrame* inheritFrame = aFrame;
while (inheritFrame->GetContent()->IsNativeAnonymous()) {
inheritFrame = inheritFrame->GetParent();
}
if (inheritFrame->GetType() == nsGkAtoms::canvasFrame) {
// CorrectStyleParentFrame returns nullptr if the prospective parent is
// the canvas frame, so avoid calling it in that situation.
} else {
inheritFrame = nsFrame::CorrectStyleParentFrame(inheritFrame, pseudo);
}
Element* originating = pseudo ? inheritFrame->GetContent()->AsElement() : nullptr;
styleContext =
ResolveStyleContext(inheritFrame->StyleContext(), content, &aState, originating);
nsTArray<nsIAnonymousContentCreator::ContentInfo>* anonChildren = nullptr;
if (!aAnonymousItems[i].mChildren.IsEmpty()) {

View File

@@ -364,8 +364,7 @@ private:
already_AddRefed<nsStyleContext>
ResolveStyleContext(nsStyleContext* aParentStyleContext,
nsIContent* aContent,
nsFrameConstructorState* aState,
Element* aOriginatingElementOrNull = nullptr);
nsFrameConstructorState* aState);
// Add the frame construction items for the given aContent and aParentFrame
// to the list. This might add more than one item in some rare cases.

View File

@@ -69,7 +69,6 @@ nsColorControlFrame::CreateAnonymousContent(nsTArray<ContentInfo>& aElements)
{
nsCOMPtr<nsIDocument> doc = mContent->GetComposedDoc();
mColorContent = doc->CreateHTMLElement(nsGkAtoms::div);
mColorContent->SetPseudoElementType(CSSPseudoElementType::mozColorSwatch);
// Mark the element to be native anonymous before setting any attributes.
mColorContent->SetIsNativeAnonymousRoot();
@@ -77,7 +76,11 @@ nsColorControlFrame::CreateAnonymousContent(nsTArray<ContentInfo>& aElements)
nsresult rv = UpdateColor();
NS_ENSURE_SUCCESS(rv, rv);
if (!aElements.AppendElement(mColorContent)) {
CSSPseudoElementType pseudoType = CSSPseudoElementType::mozColorSwatch;
RefPtr<nsStyleContext> newStyleContext = PresContext()->StyleSet()->
ResolvePseudoElementStyle(mContent->AsElement(), pseudoType,
StyleContext(), mColorContent->AsElement());
if (!aElements.AppendElement(ContentInfo(mColorContent, newStyleContext))) {
return NS_ERROR_OUT_OF_MEMORY;
}

View File

@@ -75,9 +75,14 @@ nsMeterFrame::CreateAnonymousContent(nsTArray<ContentInfo>& aElements)
mBarDiv = doc->CreateHTMLElement(nsGkAtoms::div);
// Associate ::-moz-meter-bar pseudo-element to the anonymous child.
mBarDiv->SetPseudoElementType(CSSPseudoElementType::mozMeterBar);
CSSPseudoElementType pseudoType = CSSPseudoElementType::mozMeterBar;
RefPtr<nsStyleContext> newStyleContext = PresContext()->StyleSet()->
ResolvePseudoElementStyle(mContent->AsElement(), pseudoType,
StyleContext(), mBarDiv->AsElement());
aElements.AppendElement(mBarDiv);
if (!aElements.AppendElement(ContentInfo(mBarDiv, newStyleContext))) {
return NS_ERROR_OUT_OF_MEMORY;
}
return NS_OK;
}

View File

@@ -325,15 +325,27 @@ nsresult
nsNumberControlFrame::MakeAnonymousElement(Element** aResult,
nsTArray<ContentInfo>& aElements,
nsIAtom* aTagName,
CSSPseudoElementType aPseudoType)
CSSPseudoElementType aPseudoType,
nsStyleContext* aParentContext)
{
// Get the NodeInfoManager and tag necessary to create the anonymous divs.
nsCOMPtr<nsIDocument> doc = mContent->GetComposedDoc();
RefPtr<Element> resultElement = doc->CreateHTMLElement(aTagName);
resultElement->SetPseudoElementType(aPseudoType);
// If we legitimately fail this assertion and need to allow
// non-pseudo-element anonymous children, then we'll need to add a branch
// that calls ResolveStyleFor((*aResult)->AsElement(), aParentContext)") to
// set newStyleContext.
NS_ASSERTION(aPseudoType != CSSPseudoElementType::NotPseudo,
"Expecting anonymous children to all be pseudo-elements");
// Associate the pseudo-element with the anonymous child
if (!aElements.AppendElement(resultElement)) {
RefPtr<nsStyleContext> newStyleContext =
PresContext()->StyleSet()->ResolvePseudoElementStyle(mContent->AsElement(),
aPseudoType,
aParentContext,
resultElement);
if (!aElements.AppendElement(ContentInfo(resultElement, newStyleContext))) {
return NS_ERROR_OUT_OF_MEMORY;
}
@@ -370,7 +382,8 @@ nsNumberControlFrame::CreateAnonymousContent(nsTArray<ContentInfo>& aElements)
rv = MakeAnonymousElement(getter_AddRefs(mOuterWrapper),
aElements,
nsGkAtoms::div,
CSSPseudoElementType::mozNumberWrapper);
CSSPseudoElementType::mozNumberWrapper,
mStyleContext);
NS_ENSURE_SUCCESS(rv, rv);
ContentInfo& outerWrapperCI = aElements.LastElement();
@@ -379,7 +392,8 @@ nsNumberControlFrame::CreateAnonymousContent(nsTArray<ContentInfo>& aElements)
rv = MakeAnonymousElement(getter_AddRefs(mTextField),
outerWrapperCI.mChildren,
nsGkAtoms::input,
CSSPseudoElementType::mozNumberText);
CSSPseudoElementType::mozNumberText,
outerWrapperCI.mStyleContext);
NS_ENSURE_SUCCESS(rv, rv);
mTextField->SetAttr(kNameSpaceID_None, nsGkAtoms::type,
@@ -426,7 +440,8 @@ nsNumberControlFrame::CreateAnonymousContent(nsTArray<ContentInfo>& aElements)
rv = MakeAnonymousElement(getter_AddRefs(mSpinBox),
outerWrapperCI.mChildren,
nsGkAtoms::div,
CSSPseudoElementType::mozNumberSpinBox);
CSSPseudoElementType::mozNumberSpinBox,
outerWrapperCI.mStyleContext);
NS_ENSURE_SUCCESS(rv, rv);
ContentInfo& spinBoxCI = outerWrapperCI.mChildren.LastElement();
@@ -435,14 +450,16 @@ nsNumberControlFrame::CreateAnonymousContent(nsTArray<ContentInfo>& aElements)
rv = MakeAnonymousElement(getter_AddRefs(mSpinUp),
spinBoxCI.mChildren,
nsGkAtoms::div,
CSSPseudoElementType::mozNumberSpinUp);
CSSPseudoElementType::mozNumberSpinUp,
spinBoxCI.mStyleContext);
NS_ENSURE_SUCCESS(rv, rv);
// Create the ::-moz-number-spin-down pseudo-element:
rv = MakeAnonymousElement(getter_AddRefs(mSpinDown),
spinBoxCI.mChildren,
nsGkAtoms::div,
CSSPseudoElementType::mozNumberSpinDown);
CSSPseudoElementType::mozNumberSpinDown,
spinBoxCI.mStyleContext);
SyncDisabledState();

View File

@@ -170,7 +170,8 @@ private:
nsresult MakeAnonymousElement(Element** aResult,
nsTArray<ContentInfo>& aElements,
nsIAtom* aTagName,
CSSPseudoElementType aPseudoType);
CSSPseudoElementType aPseudoType,
nsStyleContext* aParentContext);
class SyncDisabledStateEvent;
friend class SyncDisabledStateEvent;

View File

@@ -72,9 +72,12 @@ nsProgressFrame::CreateAnonymousContent(nsTArray<ContentInfo>& aElements)
mBarDiv = doc->CreateHTMLElement(nsGkAtoms::div);
// Associate ::-moz-progress-bar pseudo-element to the anonymous child.
mBarDiv->SetPseudoElementType(CSSPseudoElementType::mozProgressBar);
CSSPseudoElementType pseudoType = CSSPseudoElementType::mozProgressBar;
RefPtr<nsStyleContext> newStyleContext = PresContext()->StyleSet()->
ResolvePseudoElementStyle(mContent->AsElement(), pseudoType,
StyleContext(), mBarDiv->AsElement());
if (!aElements.AppendElement(mBarDiv)) {
if (!aElements.AppendElement(ContentInfo(mBarDiv, newStyleContext))) {
return NS_ERROR_OUT_OF_MEMORY;
}

View File

@@ -119,9 +119,13 @@ nsRangeFrame::MakeAnonymousDiv(Element** aResult,
RefPtr<Element> resultElement = doc->CreateHTMLElement(nsGkAtoms::div);
// Associate the pseudo-element with the anonymous child.
resultElement->SetPseudoElementType(aPseudoType);
RefPtr<nsStyleContext> newStyleContext =
PresContext()->StyleSet()->ResolvePseudoElementStyle(mContent->AsElement(),
aPseudoType,
StyleContext(),
resultElement);
if (!aElements.AppendElement(resultElement)) {
if (!aElements.AppendElement(ContentInfo(resultElement, newStyleContext))) {
return NS_ERROR_OUT_OF_MEMORY;
}

View File

@@ -347,12 +347,32 @@ nsTextControlFrame::CreateAnonymousContent(nsTArray<ContentInfo>& aElements)
// Create the placeholder anonymous content if needed.
if (mUsePlaceholder) {
Element* placeholderNode = txtCtrl->CreatePlaceholderNode();
nsIContent* placeholderNode = txtCtrl->CreatePlaceholderNode();
NS_ENSURE_TRUE(placeholderNode, NS_ERROR_OUT_OF_MEMORY);
// Associate ::placeholder pseudo-element with the placeholder node.
placeholderNode->SetPseudoElementType(CSSPseudoElementType::placeholder);
aElements.AppendElement(placeholderNode);
CSSPseudoElementType pseudoType = CSSPseudoElementType::placeholder;
// If this is a text input inside a number input then we want to use the
// main number input as the source of style for the placeholder frame.
nsIFrame* mainInputFrame = this;
if (StyleContext()->GetPseudoType() == CSSPseudoElementType::mozNumberText) {
do {
mainInputFrame = mainInputFrame->GetParent();
} while (mainInputFrame &&
mainInputFrame->GetType() != nsGkAtoms::numberControlFrame);
MOZ_ASSERT(mainInputFrame);
}
RefPtr<nsStyleContext> placeholderStyleContext =
PresContext()->StyleSet()->ResolvePseudoElementStyle(
mainInputFrame->GetContent()->AsElement(), pseudoType, StyleContext(),
placeholderNode->AsElement());
if (!aElements.AppendElement(ContentInfo(placeholderNode,
placeholderStyleContext))) {
return NS_ERROR_OUT_OF_MEMORY;
}
if (!IsSingleLineTextControl()) {
// For textareas, UpdateValueDisplay doesn't initialize the visibility

View File

@@ -9065,8 +9065,6 @@ GetIBSplitSiblingForAnonymousBlock(const nsIFrame* aFrame)
*
* Also skip anonymous scrolled-content parents; inherit directly from the
* outer scroll frame.
*
* Also skip NAC parents if the child frame is NAC.
*/
static nsIFrame*
GetCorrectedParent(const nsIFrame* aFrame)
@@ -9092,31 +9090,6 @@ GetCorrectedParent(const nsIFrame* aFrame)
if (pseudo == nsCSSAnonBoxes::tableWrapper) {
pseudo = aFrame->PrincipalChildList().FirstChild()->StyleContext()->GetPseudo();
}
// Prevent NAC from inheriting NAC. This partially duplicates the logic
// implemented in nsCSSFrameConstructor::AddFCItemsForAnonymousContent, and is
// necessary so that restyle inherits style contexts in the same way as the
// initial styling performed in frame construction.
//
// It would be nice to put it in CorrectStyleParentFrame and therefore share
// it, but that would lose the information of whether the _child_ is NAC,
// since CorrectStyleParentFrame only knows about the prospective _parent_.
// This duplication and complexity will go away when we fully switch to the
// Servo style system, where all this can be handled much more naturally.
//
// We need to take special care not to disrupt the style inheritance of frames
// whose content is NAC but who implement a pseudo (like an anonymous
// box, or a non-NAC-backed pseudo like ::first-line) that does not match the
// one that the NAC implements, if any.
nsIContent* content = aFrame->GetContent();
Element* element = content->IsElement() ? content->AsElement() : nullptr;
if (element && element->IsNativeAnonymous() &&
element->GetPseudoElementType() == aFrame->StyleContext()->GetPseudoType()) {
while (parent->GetContent() && parent->GetContent()->IsNativeAnonymous()) {
parent = parent->GetParent();
}
}
return nsFrame::CorrectStyleParentFrame(parent, pseudo);
}
@@ -9187,9 +9160,6 @@ nsFrame::DoGetParentStyleContext(nsIFrame** aProviderFrame) const
{
*aProviderFrame = nullptr;
nsFrameManager* fm = PresContext()->FrameManager();
// Handle display:contents and the root frame, when there's no parent frame
// to inherit from.
if (MOZ_LIKELY(mContent)) {
nsIContent* parentContent = mContent->GetFlattenedTreeParent();
if (MOZ_LIKELY(parentContent)) {

View File

@@ -34,7 +34,12 @@ public:
mContent(aContent)
{}
ContentInfo(nsIContent* aContent, nsStyleContext* aStyleContext) :
mContent(aContent), mStyleContext(aStyleContext)
{}
nsIContent* mContent;
RefPtr<nsStyleContext> mStyleContext;
nsTArray<ContentInfo> mChildren;
};

View File

@@ -1,6 +0,0 @@
<!DOCTYPE html>
<html>
<body>
<input type="text" style="width: 100px; text-decoration: underline;" value="1234">
</body>
</html>

View File

@@ -1,6 +0,0 @@
<!DOCTYPE html>
<html>
<body>
<input type="number" style="width: 100px; -moz-appearance: textfield; text-decoration: underline;" value="1234">
</body>
</html>

View File

@@ -52,6 +52,3 @@ fuzzy-if(skiaContent,2,5) needs-focus == focus-handling.html focus-handling-ref.
fuzzy(128,4) == number-reframe-anon-text-field.html number-reframe-anon-text-field-ref.html
== pseudo-classes.html about:blank
# Style inheritance:
== number-style-inheritance.html number-style-inheritance-ref.html

View File

@@ -1172,7 +1172,6 @@ input[type=number]::-moz-number-spin-box {
}
input[type=number]::-moz-number-spin-up {
writing-mode: horizontal-tb;
-moz-appearance: spinner-upbutton;
display: block; /* bug 926670 */
flex: none;
@@ -1190,7 +1189,6 @@ input[type=number]::-moz-number-spin-up {
}
input[type=number]::-moz-number-spin-down {
writing-mode: horizontal-tb;
-moz-appearance: spinner-downbutton;
display: block; /* bug 926670 */
flex: none;