From 0840105d7f794c8f1c429eced58ffb80af453ff8 Mon Sep 17 00:00:00 2001 From: XhmikosR Date: Thu, 9 Dec 2021 21:52:39 +0200 Subject: SelectorEngine: remove moot space --- js/src/dom/selector-engine.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'js/src/dom/selector-engine.js') diff --git a/js/src/dom/selector-engine.js b/js/src/dom/selector-engine.js index af27dc379..39f3971dc 100644 --- a/js/src/dom/selector-engine.js +++ b/js/src/dom/selector-engine.js @@ -79,7 +79,7 @@ const SelectorEngine = { 'details', '[tabindex]', '[contenteditable="true"]' - ].map(selector => `${selector}:not([tabindex^="-"])`).join(', ') + ].map(selector => `${selector}:not([tabindex^="-"])`).join(',') return this.find(focusables, element).filter(el => !isDisabled(el) && isVisible(el)) } -- cgit v1.2.3 From 882185bbde9fa6ce0e7885404e76afa0090bdabb Mon Sep 17 00:00:00 2001 From: GeoSot Date: Sun, 30 Jan 2022 16:24:03 +0200 Subject: Change selector-engine.js `parents` method to utilize better js native methods (#35684) Co-authored-by: XhmikosR --- js/src/dom/selector-engine.js | 13 ++++--------- 1 file changed, 4 insertions(+), 9 deletions(-) (limited to 'js/src/dom/selector-engine.js') diff --git a/js/src/dom/selector-engine.js b/js/src/dom/selector-engine.js index 39f3971dc..7f4165afc 100644 --- a/js/src/dom/selector-engine.js +++ b/js/src/dom/selector-engine.js @@ -11,8 +11,6 @@ import { isDisabled, isVisible } from '../util/index' * Constants */ -const NODE_TEXT = 3 - const SelectorEngine = { find(selector, element = document.documentElement) { return [].concat(...Element.prototype.querySelectorAll.call(element, selector)) @@ -28,14 +26,11 @@ const SelectorEngine = { parents(element, selector) { const parents = [] - let ancestor = element.parentNode - - while (ancestor && ancestor.nodeType === Node.ELEMENT_NODE && ancestor.nodeType !== NODE_TEXT) { - if (ancestor.matches(selector)) { - parents.push(ancestor) - } + let ancestor = element.parentNode.closest(selector) - ancestor = ancestor.parentNode + while (ancestor) { + parents.push(ancestor) + ancestor = ancestor.parentNode.closest(selector) } return parents -- cgit v1.2.3 From 5f1c542d677add524c94054ba8583269d81d87d0 Mon Sep 17 00:00:00 2001 From: GeoSot Date: Mon, 13 Dec 2021 02:10:26 +0200 Subject: Dropdown: get dropdown's parent in one place --- js/src/dom/selector-engine.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'js/src/dom/selector-engine.js') diff --git a/js/src/dom/selector-engine.js b/js/src/dom/selector-engine.js index 7f4165afc..ed565bebb 100644 --- a/js/src/dom/selector-engine.js +++ b/js/src/dom/selector-engine.js @@ -49,7 +49,7 @@ const SelectorEngine = { return [] }, - + // TODO: this is now unused; remove later along with prev() next(element, selector) { let next = element.nextElementSibling -- cgit v1.2.3 From f7e8ca91e03165abb82d4c82555dc4ef96340cc9 Mon Sep 17 00:00:00 2001 From: Mark Otto Date: Fri, 6 May 2022 23:57:58 +0300 Subject: Prepare v5.2.0-beta1 --- js/src/dom/selector-engine.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'js/src/dom/selector-engine.js') diff --git a/js/src/dom/selector-engine.js b/js/src/dom/selector-engine.js index ed565bebb..37d09a227 100644 --- a/js/src/dom/selector-engine.js +++ b/js/src/dom/selector-engine.js @@ -1,6 +1,6 @@ /** * -------------------------------------------------------------------------- - * Bootstrap (v5.1.3): dom/selector-engine.js + * Bootstrap (v5.2.0-beta1): dom/selector-engine.js * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE) * -------------------------------------------------------------------------- */ -- cgit v1.2.3 From edf9c40956d19e6ab3f9151bfe0dfac6be06fa21 Mon Sep 17 00:00:00 2001 From: XhmikosR Date: Tue, 19 Jul 2022 18:43:58 +0300 Subject: Release v5.2.0 (#36768) * Bump version to 5.2.0 * Dist * Update masthead.html --- js/src/dom/selector-engine.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'js/src/dom/selector-engine.js') diff --git a/js/src/dom/selector-engine.js b/js/src/dom/selector-engine.js index 37d09a227..d2af46ff6 100644 --- a/js/src/dom/selector-engine.js +++ b/js/src/dom/selector-engine.js @@ -1,6 +1,6 @@ /** * -------------------------------------------------------------------------- - * Bootstrap (v5.2.0-beta1): dom/selector-engine.js + * Bootstrap (v5.2.0): dom/selector-engine.js * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE) * -------------------------------------------------------------------------- */ -- cgit v1.2.3 From 23e50829f958ea1d741d63e2781716be037e4644 Mon Sep 17 00:00:00 2001 From: XhmikosR Date: Wed, 7 Sep 2022 18:31:39 +0300 Subject: Release v5.2.1 (#37098) * Bump version to v5.2.1. * Dist --- js/src/dom/selector-engine.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'js/src/dom/selector-engine.js') diff --git a/js/src/dom/selector-engine.js b/js/src/dom/selector-engine.js index d2af46ff6..d023b0662 100644 --- a/js/src/dom/selector-engine.js +++ b/js/src/dom/selector-engine.js @@ -1,6 +1,6 @@ /** * -------------------------------------------------------------------------- - * Bootstrap (v5.2.0): dom/selector-engine.js + * Bootstrap (v5.2.1): dom/selector-engine.js * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE) * -------------------------------------------------------------------------- */ -- cgit v1.2.3 From 961d5ff9844372a4e294980c667bbe7e0651cdeb Mon Sep 17 00:00:00 2001 From: XhmikosR Date: Mon, 3 Oct 2022 10:44:02 +0300 Subject: Release v5.2.2 (#37236) * Bump version to v5.2.2 * Dist --- js/src/dom/selector-engine.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'js/src/dom/selector-engine.js') diff --git a/js/src/dom/selector-engine.js b/js/src/dom/selector-engine.js index d023b0662..28f23ff8f 100644 --- a/js/src/dom/selector-engine.js +++ b/js/src/dom/selector-engine.js @@ -1,6 +1,6 @@ /** * -------------------------------------------------------------------------- - * Bootstrap (v5.2.1): dom/selector-engine.js + * Bootstrap (v5.2.2): dom/selector-engine.js * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE) * -------------------------------------------------------------------------- */ -- cgit v1.2.3 From aa9d32dd153ed16943ad8be5e8795afaad24d0cf Mon Sep 17 00:00:00 2001 From: GeoSot Date: Wed, 26 Oct 2022 08:26:51 +0300 Subject: Use explicit imports in our javascript source files (#36854) --- js/src/dom/selector-engine.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'js/src/dom/selector-engine.js') diff --git a/js/src/dom/selector-engine.js b/js/src/dom/selector-engine.js index 28f23ff8f..63bc2d176 100644 --- a/js/src/dom/selector-engine.js +++ b/js/src/dom/selector-engine.js @@ -5,7 +5,7 @@ * -------------------------------------------------------------------------- */ -import { isDisabled, isVisible } from '../util/index' +import { isDisabled, isVisible } from '../util/index.js' /** * Constants -- cgit v1.2.3 From e81e7cda90026cdb2a05fcdadd2d66f48f0bbdc4 Mon Sep 17 00:00:00 2001 From: GeoSot Date: Sun, 6 Nov 2022 20:31:43 +0200 Subject: Move `getElementFromSelector` & `getSelectorFromElement` to SelectorEngine (#36027) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * Move `getElementFromSelector` & getSelectorFromElement` inside selector-engine.js, in order to use SelectorEngine methods, avoiding raw querySelector usage * add `getMultipleElementsFromSelector` helper Co-authored-by: Julien Déramond --- js/src/dom/selector-engine.js | 47 +++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 47 insertions(+) (limited to 'js/src/dom/selector-engine.js') diff --git a/js/src/dom/selector-engine.js b/js/src/dom/selector-engine.js index 63bc2d176..ad10a6083 100644 --- a/js/src/dom/selector-engine.js +++ b/js/src/dom/selector-engine.js @@ -77,6 +77,53 @@ const SelectorEngine = { ].map(selector => `${selector}:not([tabindex^="-"])`).join(',') return this.find(focusables, element).filter(el => !isDisabled(el) && isVisible(el)) + }, + + getSelector(element) { + let selector = element.getAttribute('data-bs-target') + + if (!selector || selector === '#') { + let hrefAttribute = element.getAttribute('href') + + // The only valid content that could double as a selector are IDs or classes, + // so everything starting with `#` or `.`. If a "real" URL is used as the selector, + // `document.querySelector` will rightfully complain it is invalid. + // See https://github.com/twbs/bootstrap/issues/32273 + if (!hrefAttribute || (!hrefAttribute.includes('#') && !hrefAttribute.startsWith('.'))) { + return null + } + + // Just in case some CMS puts out a full URL with the anchor appended + if (hrefAttribute.includes('#') && !hrefAttribute.startsWith('#')) { + hrefAttribute = `#${hrefAttribute.split('#')[1]}` + } + + selector = hrefAttribute && hrefAttribute !== '#' ? hrefAttribute.trim() : null + } + + return selector + }, + + getSelectorFromElement(element) { + const selector = SelectorEngine.getSelector(element) + + if (selector) { + return SelectorEngine.findOne(selector) ? selector : null + } + + return null + }, + + getElementFromSelector(element) { + const selector = SelectorEngine.getSelector(element) + + return selector ? SelectorEngine.findOne(selector) : null + }, + + getMultipleElementsFromSelector(element) { + const selector = SelectorEngine.getSelector(element) + + return selector ? SelectorEngine.find(selector) : [] } } -- cgit v1.2.3 From ef4e2daa48193463b36fdc297d79c6a002e4ee67 Mon Sep 17 00:00:00 2001 From: Pierre Souchay Date: Mon, 7 Nov 2022 13:43:06 +0100 Subject: Properly escape IDs in getSelector() to handle weird IDs (#35565) (#35566) --- js/src/dom/selector-engine.js | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) (limited to 'js/src/dom/selector-engine.js') diff --git a/js/src/dom/selector-engine.js b/js/src/dom/selector-engine.js index ad10a6083..248dab494 100644 --- a/js/src/dom/selector-engine.js +++ b/js/src/dom/selector-engine.js @@ -5,7 +5,7 @@ * -------------------------------------------------------------------------- */ -import { isDisabled, isVisible } from '../util/index.js' +import { isDisabled, isVisible, parseSelector } from '../util/index.js' /** * Constants @@ -99,6 +99,7 @@ const SelectorEngine = { } selector = hrefAttribute && hrefAttribute !== '#' ? hrefAttribute.trim() : null + selector = parseSelector(selector) } return selector -- cgit v1.2.3 From fcdfee90b3a181573ad6d7aeb13aa481b11f2ef5 Mon Sep 17 00:00:00 2001 From: GeoSot Date: Mon, 7 Nov 2022 14:55:34 +0200 Subject: ref: refactor `getSelector` not to be exported (#37438) --- js/src/dom/selector-engine.js | 59 ++++++++++++++++++++----------------------- 1 file changed, 27 insertions(+), 32 deletions(-) (limited to 'js/src/dom/selector-engine.js') diff --git a/js/src/dom/selector-engine.js b/js/src/dom/selector-engine.js index 248dab494..88d4c86ea 100644 --- a/js/src/dom/selector-engine.js +++ b/js/src/dom/selector-engine.js @@ -7,9 +7,30 @@ import { isDisabled, isVisible, parseSelector } from '../util/index.js' -/** - * Constants - */ +const getSelector = element => { + let selector = element.getAttribute('data-bs-target') + + if (!selector || selector === '#') { + let hrefAttribute = element.getAttribute('href') + + // The only valid content that could double as a selector are IDs or classes, + // so everything starting with `#` or `.`. If a "real" URL is used as the selector, + // `document.querySelector` will rightfully complain it is invalid. + // See https://github.com/twbs/bootstrap/issues/32273 + if (!hrefAttribute || (!hrefAttribute.includes('#') && !hrefAttribute.startsWith('.'))) { + return null + } + + // Just in case some CMS puts out a full URL with the anchor appended + if (hrefAttribute.includes('#') && !hrefAttribute.startsWith('#')) { + hrefAttribute = `#${hrefAttribute.split('#')[1]}` + } + + selector = hrefAttribute && hrefAttribute !== '#' ? hrefAttribute.trim() : null + } + + return parseSelector(selector) +} const SelectorEngine = { find(selector, element = document.documentElement) { @@ -79,34 +100,8 @@ const SelectorEngine = { return this.find(focusables, element).filter(el => !isDisabled(el) && isVisible(el)) }, - getSelector(element) { - let selector = element.getAttribute('data-bs-target') - - if (!selector || selector === '#') { - let hrefAttribute = element.getAttribute('href') - - // The only valid content that could double as a selector are IDs or classes, - // so everything starting with `#` or `.`. If a "real" URL is used as the selector, - // `document.querySelector` will rightfully complain it is invalid. - // See https://github.com/twbs/bootstrap/issues/32273 - if (!hrefAttribute || (!hrefAttribute.includes('#') && !hrefAttribute.startsWith('.'))) { - return null - } - - // Just in case some CMS puts out a full URL with the anchor appended - if (hrefAttribute.includes('#') && !hrefAttribute.startsWith('#')) { - hrefAttribute = `#${hrefAttribute.split('#')[1]}` - } - - selector = hrefAttribute && hrefAttribute !== '#' ? hrefAttribute.trim() : null - selector = parseSelector(selector) - } - - return selector - }, - getSelectorFromElement(element) { - const selector = SelectorEngine.getSelector(element) + const selector = getSelector(element) if (selector) { return SelectorEngine.findOne(selector) ? selector : null @@ -116,13 +111,13 @@ const SelectorEngine = { }, getElementFromSelector(element) { - const selector = SelectorEngine.getSelector(element) + const selector = getSelector(element) return selector ? SelectorEngine.findOne(selector) : null }, getMultipleElementsFromSelector(element) { - const selector = SelectorEngine.getSelector(element) + const selector = getSelector(element) return selector ? SelectorEngine.find(selector) : [] } -- cgit v1.2.3 From 39589472f709ddf7d614ffd4f0ab1a50e542ac91 Mon Sep 17 00:00:00 2001 From: XhmikosR Date: Mon, 21 Nov 2022 20:15:33 +0200 Subject: Bump version to 5.2.3 --- js/src/dom/selector-engine.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'js/src/dom/selector-engine.js') diff --git a/js/src/dom/selector-engine.js b/js/src/dom/selector-engine.js index 28f23ff8f..1ba104f9e 100644 --- a/js/src/dom/selector-engine.js +++ b/js/src/dom/selector-engine.js @@ -1,6 +1,6 @@ /** * -------------------------------------------------------------------------- - * Bootstrap (v5.2.2): dom/selector-engine.js + * Bootstrap (v5.2.3): dom/selector-engine.js * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE) * -------------------------------------------------------------------------- */ -- cgit v1.2.3 From cf9454caa00872899215603e5e036d9a824b1b11 Mon Sep 17 00:00:00 2001 From: XhmikosR Date: Sat, 24 Dec 2022 18:37:22 +0200 Subject: Release v5.3.0-alpha1 (#37661) * Bump version to 5.3.0-alpha1 * Dist * Add docs versions updates * Update note in homepage hero Co-authored-by: Mark Otto --- js/src/dom/selector-engine.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'js/src/dom/selector-engine.js') diff --git a/js/src/dom/selector-engine.js b/js/src/dom/selector-engine.js index da93a35be..49b8f38d6 100644 --- a/js/src/dom/selector-engine.js +++ b/js/src/dom/selector-engine.js @@ -1,6 +1,6 @@ /** * -------------------------------------------------------------------------- - * Bootstrap (v5.2.3): dom/selector-engine.js + * Bootstrap (v5.3.0-alpha1): dom/selector-engine.js * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE) * -------------------------------------------------------------------------- */ -- cgit v1.2.3 From ab049cd4a02650ca95d490217f93bd628f9295a6 Mon Sep 17 00:00:00 2001 From: GeoSot Date: Wed, 22 Mar 2023 09:12:33 +0200 Subject: Remove version comment from JavaScript src files (#38294) --- js/src/dom/selector-engine.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'js/src/dom/selector-engine.js') diff --git a/js/src/dom/selector-engine.js b/js/src/dom/selector-engine.js index 49b8f38d6..3cecf6f40 100644 --- a/js/src/dom/selector-engine.js +++ b/js/src/dom/selector-engine.js @@ -1,6 +1,6 @@ /** * -------------------------------------------------------------------------- - * Bootstrap (v5.3.0-alpha1): dom/selector-engine.js + * Bootstrap dom/selector-engine.js * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE) * -------------------------------------------------------------------------- */ -- cgit v1.2.3 From 9900cf33c0d980353303b0fee381199c9ee89fb8 Mon Sep 17 00:00:00 2001 From: Louis-Maxime Piton Date: Wed, 13 Sep 2023 09:30:32 +0200 Subject: Fix collapse multiple ids target (#38989) --- js/src/dom/selector-engine.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) (limited to 'js/src/dom/selector-engine.js') diff --git a/js/src/dom/selector-engine.js b/js/src/dom/selector-engine.js index 3cecf6f40..a47f72001 100644 --- a/js/src/dom/selector-engine.js +++ b/js/src/dom/selector-engine.js @@ -26,10 +26,10 @@ const getSelector = element => { hrefAttribute = `#${hrefAttribute.split('#')[1]}` } - selector = hrefAttribute && hrefAttribute !== '#' ? hrefAttribute.trim() : null + selector = hrefAttribute && hrefAttribute !== '#' ? parseSelector(hrefAttribute.trim()) : null } - return parseSelector(selector) + return selector } const SelectorEngine = { -- cgit v1.2.3 From 6ed1cdd43e7a063ce9a668f5623e8dae02fa8d37 Mon Sep 17 00:00:00 2001 From: GeoSot Date: Sun, 18 Feb 2024 08:58:07 +0200 Subject: Selector Engine: fix multiple IDs (#39201) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * fix: regression of #38989 * Add unit test in selector-engine.spec.js --------- Co-authored-by: Julien Déramond Co-authored-by: XhmikosR --- js/src/dom/selector-engine.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) (limited to 'js/src/dom/selector-engine.js') diff --git a/js/src/dom/selector-engine.js b/js/src/dom/selector-engine.js index a47f72001..a4d81f3b9 100644 --- a/js/src/dom/selector-engine.js +++ b/js/src/dom/selector-engine.js @@ -26,10 +26,10 @@ const getSelector = element => { hrefAttribute = `#${hrefAttribute.split('#')[1]}` } - selector = hrefAttribute && hrefAttribute !== '#' ? parseSelector(hrefAttribute.trim()) : null + selector = hrefAttribute && hrefAttribute !== '#' ? hrefAttribute.trim() : null } - return selector + return selector ? selector.split(',').map(sel => parseSelector(sel)).join(',') : null } const SelectorEngine = { -- cgit v1.2.3