From e06ff08849057cd099365bf43598c8952fe9956d Mon Sep 17 00:00:00 2001 From: =?utf8?q?Micha=C5=82=20Go=C5=82=C4=99biowski-Owczarek?= Date: Fri, 12 Jan 2024 01:18:03 +0100 Subject: [PATCH] Selector: Make `selector.js` module depend on `attributes/attr.js` This fixes custom builds using the `--include` switch that don't include the `attributes` module. Fixes gh-5379 Closes gh-5384 Co-authored-by: Richard Gibson --- src/attributes/attr.js | 10 +++++++++- src/selector-native.js | 2 -- src/selector.js | 3 +-- src/selector/var/booleans.js | 2 -- 4 files changed, 10 insertions(+), 7 deletions(-) delete mode 100644 src/selector/var/booleans.js diff --git a/src/attributes/attr.js b/src/attributes/attr.js index ddddcada6..5a911c7d0 100644 --- a/src/attributes/attr.js +++ b/src/attributes/attr.js @@ -97,7 +97,15 @@ if ( isIE ) { }; } -jQuery.each( jQuery.expr.match.bool.source.match( /\w+/g ), function( _i, name ) { +// HTML boolean attributes have special behavior: +// we consider the lowercase name to be the only valid value, so +// getting (if the attribute is present) normalizes to that, as does +// setting to any non-`false` value (and setting to `false` removes the attribute). +// See https://html.spec.whatwg.org/multipage/common-microsyntaxes.html#boolean-attributes +jQuery.each( ( + "checked selected async autofocus autoplay controls defer disabled " + + "hidden ismap loop multiple open readonly required scoped" +).split( " " ), function( _i, name ) { jQuery.attrHooks[ name ] = { get: function( elem ) { var ret, diff --git a/src/selector-native.js b/src/selector-native.js index afb60f227..b245e3350 100644 --- a/src/selector-native.js +++ b/src/selector-native.js @@ -25,7 +25,6 @@ import { jQuery } from "./core.js"; import { document } from "./var/document.js"; import { whitespace } from "./var/whitespace.js"; import { isIE } from "./var/isIE.js"; -import { booleans } from "./selector/var/booleans.js"; import { rleadingCombinator } from "./selector/var/rleadingCombinator.js"; import { rdescend } from "./selector/var/rdescend.js"; import { rsibling } from "./selector/var/rsibling.js"; @@ -41,7 +40,6 @@ import "./selector/escapeSelector.js"; import "./selector/uniqueSort.js"; var matchExpr = jQuery.extend( { - bool: new RegExp( "^(?:" + booleans + ")$", "i" ), needsContext: new RegExp( "^" + whitespace + "*[>+~]" ) }, filterMatchExpr ); diff --git a/src/selector.js b/src/selector.js index d71e65ad4..da535718e 100644 --- a/src/selector.js +++ b/src/selector.js @@ -9,7 +9,6 @@ import { rbuggyQSA } from "./selector/rbuggyQSA.js"; import { rtrimCSS } from "./var/rtrimCSS.js"; import { isIE } from "./var/isIE.js"; import { identifier } from "./selector/var/identifier.js"; -import { booleans } from "./selector/var/booleans.js"; import { rleadingCombinator } from "./selector/var/rleadingCombinator.js"; import { rdescend } from "./selector/var/rdescend.js"; import { rsibling } from "./selector/var/rsibling.js"; @@ -24,6 +23,7 @@ import { tokenize } from "./selector/tokenize.js"; import { toSelector } from "./selector/toSelector.js"; // The following utils are attached directly to the jQuery object. +import "./attributes/attr.js"; // jQuery.attr import "./selector/escapeSelector.js"; import "./selector/uniqueSort.js"; @@ -50,7 +50,6 @@ var i, ridentifier = new RegExp( "^" + identifier + "$" ), matchExpr = jQuery.extend( { - bool: new RegExp( "^(?:" + booleans + ")$", "i" ), // For use in libraries implementing .is() // We use this for POS matching in `select` diff --git a/src/selector/var/booleans.js b/src/selector/var/booleans.js deleted file mode 100644 index bbdc4fdfc..000000000 --- a/src/selector/var/booleans.js +++ /dev/null @@ -1,2 +0,0 @@ -export var booleans = "checked|selected|async|autofocus|autoplay|controls|" + - "defer|disabled|hidden|ismap|loop|multiple|open|readonly|required|scoped"; -- 2.39.5