Bug 1363244 - stylo: Avoid calling lazy_pseudo_rules when possible. r?bholley draft
authorMatt Brubeck <mbrubeck@mozilla.com>
Thu, 11 May 2017 08:21:28 -0700
changeset 576593 acb6db51199b7f0161720ac885f0d73d60328cc1
parent 576334 3b96f277325747fe668ca8cd896d2f581238e4ee
child 628255 41c2031da90898259a58cda9a4618ce845b2d4e1
push id58426
push userbmo:mbrubeck@mozilla.com
push dateThu, 11 May 2017 23:11:14 +0000
reviewersbholley
bugs1363244
milestone55.0a1
Bug 1363244 - stylo: Avoid calling lazy_pseudo_rules when possible. r?bholley MozReview-Commit-ID: D6YS4Dj7ORL
layout/base/nsPresContext.cpp
layout/reftests/css-sizing/reftest.list
layout/reftests/css-ui-invalid/input/reftest.list
layout/reftests/css-ui-valid/input/reftest.list
layout/reftests/forms/input/file/reftest.list
widget/reftests/reftest.list
--- 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