Bug 1363244 - stylo: Avoid calling lazy_pseudo_rules when possible. r?bholley
MozReview-Commit-ID: D6YS4Dj7ORL
--- a/layout/base/nsPresContext.cpp
+++ b/layout/base/nsPresContext.cpp
@@ -8,16 +8,17 @@
#include "mozilla/ArrayUtils.h"
#include "mozilla/DebugOnly.h"
#include "mozilla/EventDispatcher.h"
#include "mozilla/EventStateManager.h"
#include "base/basictypes.h"
#include "nsCOMPtr.h"
+#include "nsCSSPseudoElements.h"
#include "nsPresContext.h"
#include "nsIPresShell.h"
#include "nsIPresShellInlines.h"
#include "nsDocShell.h"
#include "nsIContentViewer.h"
#include "nsPIDOMWindow.h"
#include "mozilla/StyleSetHandle.h"
#include "mozilla/StyleSetHandleInlines.h"
@@ -2215,24 +2216,31 @@ nsPresContext::HasAuthorSpecifiedRules(c
{
if (mShell->StyleSet()->IsGecko()) {
return
nsRuleNode::HasAuthorSpecifiedRules(aFrame->StyleContext(),
ruleTypeMask,
UseDocumentColors());
} else {
Element *elem = aFrame->GetContent()->AsElement();
+ nsIAtom *pseudoTag = aFrame->StyleContext()->GetPseudo();
+
if (elem->IsNativeAnonymous()) {
- elem = nsContentUtils::GetClosestNonNativeAnonymousAncestor(elem);
+ if (elem->GetPseudoElementType() == aFrame->StyleContext()->GetPseudoType()) {
+ // `elem` is the pseudo-element we are looking for, so use its rule node
+ // directly instead of resolving rules for the pseudo tag.
+ pseudoTag = 0;
+ } else {
+ elem = nsContentUtils::GetClosestNonNativeAnonymousAncestor(elem);
+ }
}
if (!elem->HasServoData()) {
return false;
}
- nsIAtom *pseudoTag = aFrame->StyleContext()->GetPseudo();
RefPtr<RawServoRuleNode> ruleNode;
ruleNode = mShell->StyleSet()->AsServo()->ResolveRuleNode(elem, pseudoTag);
if (!ruleNode) {
return false;
}
return Servo_HasAuthorSpecifiedRules(ruleNode,
elem,
ruleTypeMask,
--- a/layout/reftests/css-sizing/reftest.list
+++ b/layout/reftests/css-sizing/reftest.list
@@ -1,7 +1,7 @@
== min-intrinsic-with-percents-across-img-cases.html min-intrinsic-with-percents-across-img-cases-ref.html
== min-intrinsic-with-percents-across-elements.html min-intrinsic-with-percents-across-elements-ref.html
skip-if(!webrender) pref(layers.advanced.border-layers,1) == min-intrinsic-with-percents-across-elements.html min-intrinsic-with-percents-across-elements-ref.html
-fails-if(stylo) == min-intrinsic-with-max-width-percents-across-form-controls.html min-intrinsic-with-max-width-percents-across-form-controls-ref.html
-skip-if(!webrender) pref(layers.advanced.border-layers,1) fails-if(stylo) == min-intrinsic-with-max-width-percents-across-form-controls.html min-intrinsic-with-max-width-percents-across-form-controls-ref.html
-fails-if(stylo) == min-intrinsic-with-width-percents-across-form-controls.html min-intrinsic-with-width-percents-across-form-controls-ref.html
-skip-if(!webrender) pref(layers.advanced.border-layers,1) fails-if(stylo) == min-intrinsic-with-width-percents-across-form-controls.html min-intrinsic-with-width-percents-across-form-controls-ref.html
+== min-intrinsic-with-max-width-percents-across-form-controls.html min-intrinsic-with-max-width-percents-across-form-controls-ref.html
+skip-if(!webrender) pref(layers.advanced.border-layers,1) == min-intrinsic-with-max-width-percents-across-form-controls.html min-intrinsic-with-max-width-percents-across-form-controls-ref.html
+== min-intrinsic-with-width-percents-across-form-controls.html min-intrinsic-with-width-percents-across-form-controls-ref.html
+skip-if(!webrender) pref(layers.advanced.border-layers,1) == min-intrinsic-with-width-percents-across-form-controls.html min-intrinsic-with-width-percents-across-form-controls-ref.html
--- a/layout/reftests/css-ui-invalid/input/reftest.list
+++ b/layout/reftests/css-ui-invalid/input/reftest.list
@@ -25,18 +25,18 @@ fuzzy-if(skiaContent,2,5) == input-type-
fuzzy(64,4) == input-type-invalid.html input-ref.html
== input-disabled-fieldset-1.html input-fieldset-ref.html
fuzzy-if(skiaContent,1,3) == input-disabled-fieldset-2.html input-fieldset-ref.html
fuzzy-if(skiaContent,1,3) == input-fieldset-legend.html input-fieldset-legend-ref.html
== input-checkbox-required-invalid-changed.html success-ref.html
== input-checkbox-required-invalid-default.html success-ref.html
== input-radio-required-invalid-changed.html success-ref.html
== input-radio-required-invalid-default.html success-ref.html
-fails-if(stylo) == input-file-required-invalid-changed.html input-file-ref.html
-fails-if(stylo) == input-file-required-invalid-default.html input-file-ref.html
+== input-file-required-invalid-changed.html input-file-ref.html
+== input-file-required-invalid-default.html input-file-ref.html
== input-radio-required.html success-ref.html
== input-radio-customerror.html success-ref.html
== input-radio-dyn-valid-1.html success-ref.html
== input-radio-dyn-valid-2.html success-ref.html
== input-radio-nogroup-required-valid.html success-ref.html
== input-radio-nogroup-required-invalid.html success-ref.html
fuzzy-if(skiaContent,1,3) == input-novalidate.html input-ref.html
# input type='hidden' shouldn't show
--- a/layout/reftests/css-ui-valid/input/reftest.list
+++ b/layout/reftests/css-ui-valid/input/reftest.list
@@ -24,18 +24,18 @@ fuzzy-if(skiaContent,1,3) == input-requi
== input-pattern-invalid.html input-withtext-ref.html
== input-type-barred.html input-button-ref.html
fuzzy(64,4) == input-type-invalid.html input-ref.html
== input-disabled-fieldset-1.html input-fieldset-ref.html
fuzzy-if(skiaContent,1,3) == input-disabled-fieldset-2.html input-fieldset-ref.html
fuzzy-if(skiaContent,1,3) == input-fieldset-legend.html input-fieldset-legend-ref.html
== input-checkbox-valid-changed.html success-ref.html
== input-checkbox-valid-default.html success-ref.html
-fails-if(stylo) == input-file-valid-changed.html input-file-ref.html
-fails-if(stylo) == input-file-valid-default.html input-file-ref.html
+== input-file-valid-changed.html input-file-ref.html
+== input-file-valid-default.html input-file-ref.html
== input-radio-required.html success-ref.html
== input-radio-customerror.html success-ref.html
== input-radio-dyn-valid-1.html success-ref.html
== input-radio-dyn-valid-2.html success-ref.html
== input-radio-nogroup-required-valid.html success-ref.html
== input-radio-nogroup-required-invalid.html success-ref.html
fuzzy-if(skiaContent,1,3) == input-novalidate.html input-withtext-ref.html
# input type='hidden' shouldn't show
--- a/layout/reftests/forms/input/file/reftest.list
+++ b/layout/reftests/forms/input/file/reftest.list
@@ -1,7 +1,7 @@
fuzzy-if(webrender,1,34) fails-if(Android) == simple.html simple-ref.xul
fuzzy-if(webrender,1,17) fails-if(Android) == rtl.html rtl-ref.xul
fuzzy-if(webrender,1,34) fails-if(Android) == size.html simple-ref.xul
fuzzy-if(webrender,1,10) fails-if(Android) == background.html background-ref.xul
-fails-if(Android) fails-if(stylo) == style.html style-ref.xul
+fails-if(Android) == style.html style-ref.xul
!= width-clip.html width-clip-ref.html
fails-if(Android) == color-inherit.html color-inherit-ref.html
--- a/widget/reftests/reftest.list
+++ b/widget/reftests/reftest.list
@@ -1,6 +1,6 @@
pref(layout.css.moz-appearance.enabled,true) pref(layout.css.appearance.enabled,true) skip-if(!cocoaWidget) != 507947.html about:blank
-pref(layout.css.moz-appearance.enabled,true) == progressbar-fallback-default-style.html progressbar-fallback-default-style-ref.html
+fails-if(stylo) pref(layout.css.moz-appearance.enabled,true) == progressbar-fallback-default-style.html progressbar-fallback-default-style-ref.html
fuzzy-if(Android,17,1120) == meter-native-style.html meter-native-style-ref.html
skip-if(!cocoaWidget) fails-if(stylo) == meter-vertical-native-style.html meter-vertical-native-style-ref.html # dithering
pref(layout.css.moz-appearance.enabled,true) fails-if(stylo) == meter-fallback-default-style.html meter-fallback-default-style-ref.html
pref(layout.css.moz-appearance.enabled,true) pref(layout.css.appearance.enabled,true) load 664925.xhtml