Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/twbs/bootstrap.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
path: root/js
diff options
context:
space:
mode:
authorRyan Berliner <22206986+RyanBerliner@users.noreply.github.com>2022-01-13 11:55:05 +0300
committerGitHub <noreply@github.com>2022-01-13 11:55:05 +0300
commit14c7dc1e886015f2ed845f0f8e88d3597694250f (patch)
tree86b1432f333f304c3ead0706fdfd6a01c8f9ecd2 /js
parentd581737f784d144a961d61248d42f59440159571 (diff)
Fix: `isVisible` function behavior in case of a `<details>` element, on chrome 97 (#35682)
Diffstat (limited to 'js')
-rw-r--r--js/src/util/index.js21
-rw-r--r--js/tests/unit/util/index.spec.js36
2 files changed, 56 insertions, 1 deletions
diff --git a/js/src/util/index.js b/js/src/util/index.js
index 8bd614d40c..4e52fd3eb0 100644
--- a/js/src/util/index.js
+++ b/js/src/util/index.js
@@ -128,7 +128,26 @@ const isVisible = element => {
return false
}
- return getComputedStyle(element).getPropertyValue('visibility') === 'visible'
+ const elementIsVisible = getComputedStyle(element).getPropertyValue('visibility') === 'visible'
+ // Handle `details` element as its content may falsie appear visible when it is closed
+ const closedDetails = element.closest('details:not([open])')
+
+ if (!closedDetails) {
+ return elementIsVisible
+ }
+
+ if (closedDetails !== element) {
+ const summary = element.closest('summary')
+ if (summary && summary.parentNode !== closedDetails) {
+ return false
+ }
+
+ if (summary === null) {
+ return false
+ }
+ }
+
+ return elementIsVisible
}
const isDisabled = element => {
diff --git a/js/tests/unit/util/index.spec.js b/js/tests/unit/util/index.spec.js
index 52e64faa91..9d8c5ed986 100644
--- a/js/tests/unit/util/index.spec.js
+++ b/js/tests/unit/util/index.spec.js
@@ -320,6 +320,42 @@ describe('Util', () => {
expect(Util.isVisible(div)).toBeFalse()
})
+
+ it('should return true if its a closed details element', () => {
+ fixtureEl.innerHTML = '<details id="element"></details>'
+
+ const div = fixtureEl.querySelector('#element')
+
+ expect(Util.isVisible(div)).toBeTrue()
+ })
+
+ it('should return true if the element is visible inside an open details element', () => {
+ fixtureEl.innerHTML = [
+ '<details open>',
+ ' <div id="element"></div>',
+ '</details>'
+ ].join('')
+
+ const div = fixtureEl.querySelector('#element')
+
+ expect(Util.isVisible(div)).toBeTrue()
+ })
+
+ it('should return true if the element is a visible summary in a closed details element', () => {
+ fixtureEl.innerHTML = [
+ '<details>',
+ ' <summary id="element-1">',
+ ' <span id="element-2"></span>',
+ ' </summary>',
+ '</details>'
+ ].join('')
+
+ const element1 = fixtureEl.querySelector('#element-1')
+ const element2 = fixtureEl.querySelector('#element-2')
+
+ expect(Util.isVisible(element1)).toBeTrue()
+ expect(Util.isVisible(element2)).toBeTrue()
+ })
})
describe('isDisabled', () => {