Bug 818400. Add a preference to control :scope and pref it off in release builds for now. r=dbaron

This commit is contained in:
Boris Zbarsky 2012-12-24 19:35:34 -08:00
parent ab0dbf07d1
commit 7e46a922c1
7 changed files with 139 additions and 102 deletions

View File

@ -100,8 +100,8 @@
/* :root tests */
:root { background-color: green; }
/* :-moz-scope tests */
:-moz-scope { background-color: green; }
/* :scope tests */
:scope { background-color: green; }
/* :nth-child(n) tests */
.nthchild1 > :nth-last-child(odd) { background-color: lime; }
@ -226,7 +226,17 @@
.bar. { background: red; color: yellow; }
</span>
<script><![CDATA[
window.onload = function(){
window.onload = function() {
if (window.parent && window.parent.SpecialPowers) {
window.parent.SpecialPowers.pushPrefEnv(
{ 'set': [[ "layout.css.scope-pseudo.enabled", true]] },
doTest);
} else {
doTest();
}
}
function doTest(){
if ( window.location.hash.indexOf("target") == -1 )
window.location.hash = "#target";
@ -544,7 +554,7 @@
var namespaced = /\|[^=]/.test( q );
var prepend = namespaced ? "xHTML|*#root3 " : "#root3 ";
q = (restrict === false || restrict === ":root" ||
restrict === ":-moz-scope" ? "" : prepend) +
restrict === ":scope" ? "" : prepend) +
q.replace(/,/g, ", " + prepend);
var nq = q.replace(/>/g, "&gt;").replace(/</g, "&lt;");
@ -576,9 +586,9 @@
(pass ? "" : " Expected: " + extra(ids) + " Received: " + extra(results)) );
// For now, don't use checkMatchesSelector when
// restrict === ":-moz-scope" because we have no way to hand the
// restrict === ":scope" because we have no way to hand the
// right scope to it yet.
if (results && restrict !== ":-moz-scope")
if (results && restrict !== ":scope")
checkMatchesSelector( results, q );
}
@ -641,15 +651,15 @@
if ( root == document ) {
t( ":root Selector", ":root", ["html"], false );
t( ":-moz-scope Selector", ":-moz-scope", ["html"], ":-moz-scope" );
t( ":scope Selector", ":scope", ["html"], ":scope" );
} else {
t( ":root Selector", ":root", [], ":root" );
if (root.localName != "nosuchtag") {
t( ":-moz-scope Selector", ":-moz-scope > nosuchtag",
[ "outerbogustag" ], ":-moz-scope");
t( ":scope Selector", ":scope > nosuchtag",
[ "outerbogustag" ], ":scope");
}
t( ":-moz-scope Selector", ":-moz-scope nosuchtag nosuchtag",
[ "innerbogustag" ], ":-moz-scope");
t( ":scope Selector", ":scope nosuchtag nosuchtag",
[ "innerbogustag" ], ":scope");
if ( !root.parentNode ) {
t( ":root All Selector", ":root *", [], ":root" );
@ -659,7 +669,7 @@
if ( root.parentNode || root == document ) {
assert( query(":root *").length == query("*").length - (root == document ? 1 : 0), type + ": :root All Selector" );
}
assert( query(":-moz-scope *").length == query("*").length - (root == document ? 1 : 0), type + ": :-moz-scope All Selector" );
assert( query(":scope *").length == query("*").length - (root == document ? 1 : 0), type + ": :scope All Selector" );
t( "Element Selector", "p", ["firstp","ap","sndp","en","sap","first"] );
t( "Element Selector", "body", ["body"], false );

View File

@ -326,9 +326,9 @@ GetStatesForPseudoClass(const nsAString& aStatePseudo)
// An array of the states that are relevant for various pseudoclasses.
// XXXbz this duplicates code in nsCSSRuleProcessor
static const nsEventStates sPseudoClassStates[] = {
#define CSS_PSEUDO_CLASS(_name, _value) \
#define CSS_PSEUDO_CLASS(_name, _value, _pref) \
nsEventStates(),
#define CSS_STATE_PSEUDO_CLASS(_name, _value, _states) \
#define CSS_STATE_PSEUDO_CLASS(_name, _value, _pref, _states) \
_states,
#include "nsCSSPseudoClassList.h"
#undef CSS_STATE_PSEUDO_CLASS

View File

@ -14,7 +14,10 @@
* will have cruel and unusual things done to them. The entries should
* be kept in some sort of logical order. The first argument to
* CSS_PSEUDO_CLASS is the C++ identifier of the atom. The second
* argument is the string value of the atom.
* argument is the string value of the atom. The third argument is the
* name of the preference controlling whether the pseudo-class is
* recognized by the parser, or the empty string if it's unconditional.
*
* CSS_STATE_DEPENDENT_PSEUDO_CLASS and CSS_STATE_PSEUDO_CLASS also take
* the name of the state bits that the class corresponds to. Only one
* of the bits needs to match for a CSS_STATE_PSEUDO_CLASS to match;
@ -36,8 +39,8 @@
#endif
#ifndef CSS_STATE_DEPENDENT_PSEUDO_CLASS
#define CSS_STATE_DEPENDENT_PSEUDO_CLASS(_name, _value, _bit) \
CSS_PSEUDO_CLASS(_name, _value)
#define CSS_STATE_DEPENDENT_PSEUDO_CLASS(_name, _value, _pref, _bit) \
CSS_PSEUDO_CLASS(_name, _value, _pref)
#define DEFINED_CSS_STATE_DEPENDENT_PSEUDO_CLASS
#endif
@ -46,8 +49,8 @@
#endif
#ifndef CSS_STATE_PSEUDO_CLASS
#define CSS_STATE_PSEUDO_CLASS(_name, _value, _bit) \
CSS_STATE_DEPENDENT_PSEUDO_CLASS(_name, _value, _bit)
#define CSS_STATE_PSEUDO_CLASS(_name, _value, _pref, _bit) \
CSS_STATE_DEPENDENT_PSEUDO_CLASS(_name, _value, _pref, _bit)
#define DEFINED_CSS_STATE_PSEUDO_CLASS
#endif
@ -56,148 +59,148 @@
// must be the same as the order of cases in SelectorMatches. :not
// must be the last CSS_PSEUDO_CLASS.
CSS_PSEUDO_CLASS(empty, ":empty")
CSS_PSEUDO_CLASS(mozOnlyWhitespace, ":-moz-only-whitespace")
CSS_PSEUDO_CLASS(mozEmptyExceptChildrenWithLocalname, ":-moz-empty-except-children-with-localname")
CSS_PSEUDO_CLASS(lang, ":lang")
CSS_PSEUDO_CLASS(mozBoundElement, ":-moz-bound-element")
CSS_PSEUDO_CLASS(root, ":root")
CSS_PSEUDO_CLASS(any, ":-moz-any")
CSS_PSEUDO_CLASS(empty, ":empty", "")
CSS_PSEUDO_CLASS(mozOnlyWhitespace, ":-moz-only-whitespace", "")
CSS_PSEUDO_CLASS(mozEmptyExceptChildrenWithLocalname, ":-moz-empty-except-children-with-localname", "")
CSS_PSEUDO_CLASS(lang, ":lang", "")
CSS_PSEUDO_CLASS(mozBoundElement, ":-moz-bound-element", "")
CSS_PSEUDO_CLASS(root, ":root", "")
CSS_PSEUDO_CLASS(any, ":-moz-any", "")
CSS_PSEUDO_CLASS(firstChild, ":first-child")
CSS_PSEUDO_CLASS(firstNode, ":-moz-first-node")
CSS_PSEUDO_CLASS(lastChild, ":last-child")
CSS_PSEUDO_CLASS(lastNode, ":-moz-last-node")
CSS_PSEUDO_CLASS(onlyChild, ":only-child")
CSS_PSEUDO_CLASS(firstOfType, ":first-of-type")
CSS_PSEUDO_CLASS(lastOfType, ":last-of-type")
CSS_PSEUDO_CLASS(onlyOfType, ":only-of-type")
CSS_PSEUDO_CLASS(nthChild, ":nth-child")
CSS_PSEUDO_CLASS(nthLastChild, ":nth-last-child")
CSS_PSEUDO_CLASS(nthOfType, ":nth-of-type")
CSS_PSEUDO_CLASS(nthLastOfType, ":nth-last-of-type")
CSS_PSEUDO_CLASS(firstChild, ":first-child", "")
CSS_PSEUDO_CLASS(firstNode, ":-moz-first-node", "")
CSS_PSEUDO_CLASS(lastChild, ":last-child", "")
CSS_PSEUDO_CLASS(lastNode, ":-moz-last-node", "")
CSS_PSEUDO_CLASS(onlyChild, ":only-child", "")
CSS_PSEUDO_CLASS(firstOfType, ":first-of-type", "")
CSS_PSEUDO_CLASS(lastOfType, ":last-of-type", "")
CSS_PSEUDO_CLASS(onlyOfType, ":only-of-type", "")
CSS_PSEUDO_CLASS(nthChild, ":nth-child", "")
CSS_PSEUDO_CLASS(nthLastChild, ":nth-last-child", "")
CSS_PSEUDO_CLASS(nthOfType, ":nth-of-type", "")
CSS_PSEUDO_CLASS(nthLastOfType, ":nth-last-of-type", "")
// Match nodes that are HTML but not XHTML
CSS_PSEUDO_CLASS(mozIsHTML, ":-moz-is-html")
CSS_PSEUDO_CLASS(mozIsHTML, ":-moz-is-html", "")
// Matches anything when the specified look-and-feel metric is set
CSS_PSEUDO_CLASS(mozSystemMetric, ":-moz-system-metric")
CSS_PSEUDO_CLASS(mozSystemMetric, ":-moz-system-metric", "")
// -moz-locale-dir(ltr) and -moz-locale-dir(rtl) may be used
// to match based on the locale's chrome direction
CSS_PSEUDO_CLASS(mozLocaleDir, ":-moz-locale-dir")
CSS_PSEUDO_CLASS(mozLocaleDir, ":-moz-locale-dir", "")
// -moz-lwtheme may be used to match a document that has a lightweight theme
CSS_PSEUDO_CLASS(mozLWTheme, ":-moz-lwtheme")
CSS_PSEUDO_CLASS(mozLWTheme, ":-moz-lwtheme", "")
// -moz-lwtheme-brighttext matches a document that has a dark lightweight theme
CSS_PSEUDO_CLASS(mozLWThemeBrightText, ":-moz-lwtheme-brighttext")
CSS_PSEUDO_CLASS(mozLWThemeBrightText, ":-moz-lwtheme-brighttext", "")
// -moz-lwtheme-darktext matches a document that has a bright lightweight theme
CSS_PSEUDO_CLASS(mozLWThemeDarkText, ":-moz-lwtheme-darktext")
CSS_PSEUDO_CLASS(mozLWThemeDarkText, ":-moz-lwtheme-darktext", "")
// Matches anything when the containing window is inactive
CSS_PSEUDO_CLASS(mozWindowInactive, ":-moz-window-inactive")
CSS_PSEUDO_CLASS(mozWindowInactive, ":-moz-window-inactive", "")
// Matches any table elements that have a nonzero border attribute,
// according to HTML integer attribute parsing rules.
CSS_PSEUDO_CLASS(mozTableBorderNonzero, ":-moz-table-border-nonzero")
CSS_PSEUDO_CLASS(mozTableBorderNonzero, ":-moz-table-border-nonzero", "")
// Matches whatever the contextual reference elements are for the
// matching operation.
CSS_PSEUDO_CLASS(scope, ":-moz-scope")
CSS_PSEUDO_CLASS(scope, ":scope", "layout.css.scope-pseudo.enabled")
// :not needs to come at the end of the non-bit pseudo-class list, since
// it doesn't actually get directly matched on in SelectorMatches.
CSS_PSEUDO_CLASS(notPseudo, ":not")
CSS_PSEUDO_CLASS(notPseudo, ":not", "")
// :-moz-dir(ltr) and :-moz-dir(rtl) match elements whose resolved
// directionality in the markup language is ltr or rtl respectively
CSS_STATE_DEPENDENT_PSEUDO_CLASS(dir, ":-moz-dir",
CSS_STATE_DEPENDENT_PSEUDO_CLASS(dir, ":-moz-dir", "",
NS_EVENT_STATE_LTR | NS_EVENT_STATE_RTL)
CSS_STATE_PSEUDO_CLASS(link, ":link", NS_EVENT_STATE_UNVISITED)
CSS_STATE_PSEUDO_CLASS(link, ":link", "", NS_EVENT_STATE_UNVISITED)
// what matches :link or :visited
CSS_STATE_PSEUDO_CLASS(mozAnyLink, ":-moz-any-link",
CSS_STATE_PSEUDO_CLASS(mozAnyLink, ":-moz-any-link", "",
NS_EVENT_STATE_VISITED | NS_EVENT_STATE_UNVISITED)
CSS_STATE_PSEUDO_CLASS(visited, ":visited", NS_EVENT_STATE_VISITED)
CSS_STATE_PSEUDO_CLASS(visited, ":visited", "", NS_EVENT_STATE_VISITED)
CSS_STATE_PSEUDO_CLASS(active, ":active", NS_EVENT_STATE_ACTIVE)
CSS_STATE_PSEUDO_CLASS(checked, ":checked", NS_EVENT_STATE_CHECKED)
CSS_STATE_PSEUDO_CLASS(disabled, ":disabled", NS_EVENT_STATE_DISABLED)
CSS_STATE_PSEUDO_CLASS(enabled, ":enabled", NS_EVENT_STATE_ENABLED)
CSS_STATE_PSEUDO_CLASS(focus, ":focus", NS_EVENT_STATE_FOCUS)
CSS_STATE_PSEUDO_CLASS(hover, ":hover", NS_EVENT_STATE_HOVER)
CSS_STATE_PSEUDO_CLASS(mozDragOver, ":-moz-drag-over", NS_EVENT_STATE_DRAGOVER)
CSS_STATE_PSEUDO_CLASS(target, ":target", NS_EVENT_STATE_URLTARGET)
CSS_STATE_PSEUDO_CLASS(indeterminate, ":indeterminate",
CSS_STATE_PSEUDO_CLASS(active, ":active", "", NS_EVENT_STATE_ACTIVE)
CSS_STATE_PSEUDO_CLASS(checked, ":checked", "", NS_EVENT_STATE_CHECKED)
CSS_STATE_PSEUDO_CLASS(disabled, ":disabled", "", NS_EVENT_STATE_DISABLED)
CSS_STATE_PSEUDO_CLASS(enabled, ":enabled", "", NS_EVENT_STATE_ENABLED)
CSS_STATE_PSEUDO_CLASS(focus, ":focus", "", NS_EVENT_STATE_FOCUS)
CSS_STATE_PSEUDO_CLASS(hover, ":hover", "", NS_EVENT_STATE_HOVER)
CSS_STATE_PSEUDO_CLASS(mozDragOver, ":-moz-drag-over", "", NS_EVENT_STATE_DRAGOVER)
CSS_STATE_PSEUDO_CLASS(target, ":target", "", NS_EVENT_STATE_URLTARGET)
CSS_STATE_PSEUDO_CLASS(indeterminate, ":indeterminate", "",
NS_EVENT_STATE_INDETERMINATE)
// Matches the element which is being displayed full-screen, and
// any containing frames.
CSS_STATE_PSEUDO_CLASS(mozFullScreen, ":-moz-full-screen", NS_EVENT_STATE_FULL_SCREEN)
CSS_STATE_PSEUDO_CLASS(mozFullScreen, ":-moz-full-screen", "", NS_EVENT_STATE_FULL_SCREEN)
// Matches any element which is an ancestor of the DOM full-screen element,
// or an ancestor of a containing frame of the full-screen element.
CSS_STATE_PSEUDO_CLASS(mozFullScreenAncestor, ":-moz-full-screen-ancestor", NS_EVENT_STATE_FULL_SCREEN_ANCESTOR)
CSS_STATE_PSEUDO_CLASS(mozFullScreenAncestor, ":-moz-full-screen-ancestor", "", NS_EVENT_STATE_FULL_SCREEN_ANCESTOR)
// Matches if the element is focused and should show a focus ring
CSS_STATE_PSEUDO_CLASS(mozFocusRing, ":-moz-focusring", NS_EVENT_STATE_FOCUSRING)
CSS_STATE_PSEUDO_CLASS(mozFocusRing, ":-moz-focusring", "", NS_EVENT_STATE_FOCUSRING)
// Image, object, etc state pseudo-classes
CSS_STATE_PSEUDO_CLASS(mozBroken, ":-moz-broken", NS_EVENT_STATE_BROKEN)
CSS_STATE_PSEUDO_CLASS(mozUserDisabled, ":-moz-user-disabled",
CSS_STATE_PSEUDO_CLASS(mozBroken, ":-moz-broken", "", NS_EVENT_STATE_BROKEN)
CSS_STATE_PSEUDO_CLASS(mozUserDisabled, ":-moz-user-disabled", "",
NS_EVENT_STATE_USERDISABLED)
CSS_STATE_PSEUDO_CLASS(mozSuppressed, ":-moz-suppressed",
CSS_STATE_PSEUDO_CLASS(mozSuppressed, ":-moz-suppressed", "",
NS_EVENT_STATE_SUPPRESSED)
CSS_STATE_PSEUDO_CLASS(mozLoading, ":-moz-loading", NS_EVENT_STATE_LOADING)
CSS_STATE_PSEUDO_CLASS(mozTypeUnsupported, ":-moz-type-unsupported",
CSS_STATE_PSEUDO_CLASS(mozLoading, ":-moz-loading", "", NS_EVENT_STATE_LOADING)
CSS_STATE_PSEUDO_CLASS(mozTypeUnsupported, ":-moz-type-unsupported", "",
NS_EVENT_STATE_TYPE_UNSUPPORTED)
CSS_STATE_PSEUDO_CLASS(mozTypeUnsupportedPlatform, ":-moz-type-unsupported-platform",
CSS_STATE_PSEUDO_CLASS(mozTypeUnsupportedPlatform, ":-moz-type-unsupported-platform", "",
NS_EVENT_STATE_TYPE_UNSUPPORTED_PLATFORM)
CSS_STATE_PSEUDO_CLASS(mozHandlerClickToPlay, ":-moz-handler-clicktoplay",
CSS_STATE_PSEUDO_CLASS(mozHandlerClickToPlay, ":-moz-handler-clicktoplay", "",
NS_EVENT_STATE_TYPE_CLICK_TO_PLAY)
CSS_STATE_PSEUDO_CLASS(mozHandlerPlayPreview, ":-moz-handler-playpreview",
CSS_STATE_PSEUDO_CLASS(mozHandlerPlayPreview, ":-moz-handler-playpreview", "",
NS_EVENT_STATE_TYPE_PLAY_PREVIEW)
CSS_STATE_PSEUDO_CLASS(mozHandlerVulnerableUpdatable, ":-moz-handler-vulnerable-updatable",
CSS_STATE_PSEUDO_CLASS(mozHandlerVulnerableUpdatable, ":-moz-handler-vulnerable-updatable", "",
NS_EVENT_STATE_VULNERABLE_UPDATABLE)
CSS_STATE_PSEUDO_CLASS(mozHandlerVulnerableNoUpdate, ":-moz-handler-vulnerable-no-update",
CSS_STATE_PSEUDO_CLASS(mozHandlerVulnerableNoUpdate, ":-moz-handler-vulnerable-no-update", "",
NS_EVENT_STATE_VULNERABLE_NO_UPDATE)
CSS_STATE_PSEUDO_CLASS(mozHandlerDisabled, ":-moz-handler-disabled",
CSS_STATE_PSEUDO_CLASS(mozHandlerDisabled, ":-moz-handler-disabled", "",
NS_EVENT_STATE_HANDLER_DISABLED)
CSS_STATE_PSEUDO_CLASS(mozHandlerBlocked, ":-moz-handler-blocked",
CSS_STATE_PSEUDO_CLASS(mozHandlerBlocked, ":-moz-handler-blocked", "",
NS_EVENT_STATE_HANDLER_BLOCKED)
CSS_STATE_PSEUDO_CLASS(mozHandlerCrashed, ":-moz-handler-crashed",
CSS_STATE_PSEUDO_CLASS(mozHandlerCrashed, ":-moz-handler-crashed", "",
NS_EVENT_STATE_HANDLER_CRASHED)
CSS_STATE_PSEUDO_CLASS(mozMathIncrementScriptLevel,
":-moz-math-increment-script-level",
":-moz-math-increment-script-level", "",
NS_EVENT_STATE_INCREMENT_SCRIPT_LEVEL)
// CSS 3 UI
// http://www.w3.org/TR/2004/CR-css3-ui-20040511/#pseudo-classes
CSS_STATE_PSEUDO_CLASS(required, ":required", NS_EVENT_STATE_REQUIRED)
CSS_STATE_PSEUDO_CLASS(optional, ":optional", NS_EVENT_STATE_OPTIONAL)
CSS_STATE_PSEUDO_CLASS(valid, ":valid", NS_EVENT_STATE_VALID)
CSS_STATE_PSEUDO_CLASS(invalid, ":invalid", NS_EVENT_STATE_INVALID)
CSS_STATE_PSEUDO_CLASS(inRange, ":in-range", NS_EVENT_STATE_INRANGE)
CSS_STATE_PSEUDO_CLASS(outOfRange, ":out-of-range", NS_EVENT_STATE_OUTOFRANGE)
CSS_STATE_PSEUDO_CLASS(defaultPseudo, ":default", NS_EVENT_STATE_DEFAULT)
CSS_STATE_PSEUDO_CLASS(mozReadOnly, ":-moz-read-only",
CSS_STATE_PSEUDO_CLASS(required, ":required", "", NS_EVENT_STATE_REQUIRED)
CSS_STATE_PSEUDO_CLASS(optional, ":optional", "", NS_EVENT_STATE_OPTIONAL)
CSS_STATE_PSEUDO_CLASS(valid, ":valid", "", NS_EVENT_STATE_VALID)
CSS_STATE_PSEUDO_CLASS(invalid, ":invalid", "", NS_EVENT_STATE_INVALID)
CSS_STATE_PSEUDO_CLASS(inRange, ":in-range", "", NS_EVENT_STATE_INRANGE)
CSS_STATE_PSEUDO_CLASS(outOfRange, ":out-of-range", "", NS_EVENT_STATE_OUTOFRANGE)
CSS_STATE_PSEUDO_CLASS(defaultPseudo, ":default", "", NS_EVENT_STATE_DEFAULT)
CSS_STATE_PSEUDO_CLASS(mozReadOnly, ":-moz-read-only", "",
NS_EVENT_STATE_MOZ_READONLY)
CSS_STATE_PSEUDO_CLASS(mozReadWrite, ":-moz-read-write",
CSS_STATE_PSEUDO_CLASS(mozReadWrite, ":-moz-read-write", "",
NS_EVENT_STATE_MOZ_READWRITE)
CSS_STATE_PSEUDO_CLASS(mozSubmitInvalid, ":-moz-submit-invalid",
CSS_STATE_PSEUDO_CLASS(mozSubmitInvalid, ":-moz-submit-invalid", "",
NS_EVENT_STATE_MOZ_SUBMITINVALID)
CSS_STATE_PSEUDO_CLASS(mozUIInvalid, ":-moz-ui-invalid",
CSS_STATE_PSEUDO_CLASS(mozUIInvalid, ":-moz-ui-invalid", "",
NS_EVENT_STATE_MOZ_UI_INVALID)
CSS_STATE_PSEUDO_CLASS(mozUIValid, ":-moz-ui-valid",
CSS_STATE_PSEUDO_CLASS(mozUIValid, ":-moz-ui-valid", "",
NS_EVENT_STATE_MOZ_UI_VALID)
CSS_STATE_PSEUDO_CLASS(mozMeterOptimum, ":-moz-meter-optimum",
CSS_STATE_PSEUDO_CLASS(mozMeterOptimum, ":-moz-meter-optimum", "",
NS_EVENT_STATE_OPTIMUM)
CSS_STATE_PSEUDO_CLASS(mozMeterSubOptimum, ":-moz-meter-sub-optimum",
CSS_STATE_PSEUDO_CLASS(mozMeterSubOptimum, ":-moz-meter-sub-optimum", "",
NS_EVENT_STATE_SUB_OPTIMUM)
CSS_STATE_PSEUDO_CLASS(mozMeterSubSubOptimum, ":-moz-meter-sub-sub-optimum",
CSS_STATE_PSEUDO_CLASS(mozMeterSubSubOptimum, ":-moz-meter-sub-sub-optimum", "",
NS_EVENT_STATE_SUB_SUB_OPTIMUM)
#ifdef DEFINED_CSS_STATE_PSEUDO_CLASS

View File

@ -11,29 +11,46 @@
#include "nsAtomListUtils.h"
#include "nsStaticAtom.h"
#include "nsMemory.h"
#include "mozilla/Preferences.h"
using namespace mozilla;
// define storage for all atoms
#define CSS_PSEUDO_CLASS(_name, _value) static nsIAtom* sPseudoClass_##_name;
#define CSS_PSEUDO_CLASS(_name, _value, _pref) \
static nsIAtom* sPseudoClass_##_name;
#include "nsCSSPseudoClassList.h"
#undef CSS_PSEUDO_CLASS
#define CSS_PSEUDO_CLASS(name_, value_) \
#define CSS_PSEUDO_CLASS(name_, value_, pref_) \
NS_STATIC_ATOM_BUFFER(name_##_buffer, value_)
#include "nsCSSPseudoClassList.h"
#undef CSS_PSEUDO_CLASS
static const nsStaticAtom CSSPseudoClasses_info[] = {
#define CSS_PSEUDO_CLASS(name_, value_) \
#define CSS_PSEUDO_CLASS(name_, value_, pref_) \
NS_STATIC_ATOM(name_##_buffer, &sPseudoClass_##name_),
#include "nsCSSPseudoClassList.h"
#undef CSS_PSEUDO_CLASS
};
static bool sPseudoClassEnabled[] = {
#define CSS_PSEUDO_CLASS(name_, value_, pref_) \
true,
#include "nsCSSPseudoClassList.h"
#undef CSS_PSEUDO_CLASS
};
void nsCSSPseudoClasses::AddRefAtoms()
{
NS_RegisterStaticAtoms(CSSPseudoClasses_info);
#define CSS_PSEUDO_CLASS(name_, value_, pref_) \
if (pref_[0]) { \
Preferences::AddBoolVarCache(&sPseudoClassEnabled[ePseudoClass_##name_], \
pref_); \
}
#include "nsCSSPseudoClassList.h"
#undef CSS_PSEUDO_CLASS
}
bool
@ -68,7 +85,7 @@ nsCSSPseudoClasses::GetPseudoType(nsIAtom* aAtom)
{
for (uint32_t i = 0; i < ArrayLength(CSSPseudoClasses_info); ++i) {
if (*CSSPseudoClasses_info[i].mAtom == aAtom) {
return Type(i);
return sPseudoClassEnabled[i] ? Type(i) : ePseudoClass_NotPseudoClass;
}
}

View File

@ -16,7 +16,7 @@ public:
static void AddRefAtoms();
enum Type {
#define CSS_PSEUDO_CLASS(_name, _value) \
#define CSS_PSEUDO_CLASS(_name, _value, _pref) \
ePseudoClass_##_name,
#include "nsCSSPseudoClassList.h"
#undef CSS_PSEUDO_CLASS

View File

@ -1538,9 +1538,9 @@ checkGenericEmptyMatches(Element* aElement,
// Arrays of the states that are relevant for various pseudoclasses.
static const nsEventStates sPseudoClassStateDependences[] = {
#define CSS_PSEUDO_CLASS(_name, _value) \
#define CSS_PSEUDO_CLASS(_name, _value, _pref) \
nsEventStates(),
#define CSS_STATE_DEPENDENT_PSEUDO_CLASS(_name, _value, _states) \
#define CSS_STATE_DEPENDENT_PSEUDO_CLASS(_name, _value, _pref, _states) \
_states,
#include "nsCSSPseudoClassList.h"
#undef CSS_STATE_DEPENDENT_PSEUDO_CLASS
@ -1552,9 +1552,9 @@ static const nsEventStates sPseudoClassStateDependences[] = {
};
static const nsEventStates sPseudoClassStates[] = {
#define CSS_PSEUDO_CLASS(_name, _value) \
#define CSS_PSEUDO_CLASS(_name, _value, _pref) \
nsEventStates(),
#define CSS_STATE_PSEUDO_CLASS(_name, _value, _states) \
#define CSS_STATE_PSEUDO_CLASS(_name, _value, _pref, _states) \
_states,
#include "nsCSSPseudoClassList.h"
#undef CSS_STATE_PSEUDO_CLASS

View File

@ -1661,6 +1661,13 @@ pref("layout.css.prefixes.transforms", true);
pref("layout.css.prefixes.transitions", true);
pref("layout.css.prefixes.animations", true);
// Is support for the :scope selector enabled?
#ifdef RELEASE_BUILD
pref("layout.css.scope-pseudo.enabled", false);
#else
pref("layout.css.scope-pseudo.enabled", true);
#endif
// pref for which side vertical scrollbars should be on
// 0 = end-side in UI direction
// 1 = end-side in document/content direction