Skip to content
This repository was archived by the owner on Sep 22, 2022. It is now read-only.

Commit f1cbbbd

Browse files
authored
Merge pull request #39 from bnjamin/fix-dialog-with-include-fragment
Fix dialog with include fragment
2 parents 94290e7 + a4b1713 commit f1cbbbd

File tree

2 files changed

+93
-19
lines changed

2 files changed

+93
-19
lines changed

index.js

Lines changed: 21 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -143,6 +143,23 @@ function loadIncludeFragment(event: Event) {
143143
loader.setAttribute('src', src)
144144
}
145145

146+
function updateIncludeFragmentEventListeners(details: Element, src: ?string, preload: boolean) {
147+
removeIncludeFragmentEventListeners(details)
148+
149+
if (src) {
150+
details.addEventListener('toggle', loadIncludeFragment, {once: true})
151+
}
152+
153+
if (src && preload) {
154+
details.addEventListener('mouseover', loadIncludeFragment, {once: true})
155+
}
156+
}
157+
158+
function removeIncludeFragmentEventListeners(details: Element) {
159+
details.removeEventListener('toggle', loadIncludeFragment)
160+
details.removeEventListener('mouseover', loadIncludeFragment)
161+
}
162+
146163
type State = {|
147164
details: ?Element,
148165
activeElement: ?Element
@@ -202,6 +219,8 @@ class DetailsDialogElement extends HTMLElement {
202219

203220
details.addEventListener('toggle', toggle)
204221
state.details = details
222+
223+
updateIncludeFragmentEventListeners(details, this.src, this.preload)
205224
}
206225

207226
disconnectedCallback() {
@@ -210,6 +229,7 @@ class DetailsDialogElement extends HTMLElement {
210229
const {details} = state
211230
if (!details) return
212231
details.removeEventListener('toggle', toggle)
232+
removeIncludeFragmentEventListeners(details)
213233
const summary = details.querySelector('summary')
214234
if (summary) {
215235
summary.removeEventListener('click', onSummaryClick, {capture: true})
@@ -235,17 +255,7 @@ class DetailsDialogElement extends HTMLElement {
235255
const state = initialized.get(this)
236256
if (!state) return
237257

238-
if (this.src) {
239-
details.addEventListener('toggle', loadIncludeFragment, {once: true})
240-
} else {
241-
details.removeEventListener('toggle', loadIncludeFragment)
242-
}
243-
244-
if (this.src && this.preload) {
245-
details.addEventListener('mouseover', loadIncludeFragment, {once: true})
246-
} else {
247-
details.removeEventListener('mouseover', loadIncludeFragment)
248-
}
258+
updateIncludeFragmentEventListeners(details, this.src, this.preload)
249259
}
250260
}
251261

test/test.js

Lines changed: 72 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -200,6 +200,69 @@ describe('details-dialog-element', function() {
200200
assert(!details.open)
201201
})
202202
})
203+
204+
describe('when using with inlcude-fragment', function() {
205+
let includeFragment
206+
beforeEach(function() {
207+
includeFragment = document.createElement('include-fragment')
208+
dialog.innerHTML = ''
209+
dialog.append(includeFragment)
210+
dialog.src = '/404'
211+
})
212+
213+
afterEach(function() {
214+
dialog.innerHTML = ''
215+
dialog.removeAttribute('src')
216+
})
217+
218+
it('transfers src on toggle', async function() {
219+
assert(!details.open)
220+
assert.notOk(includeFragment.getAttribute('src'))
221+
dialog.toggle(true)
222+
await waitForToggleEvent(details)
223+
assert(details.open)
224+
assert.equal(includeFragment.getAttribute('src'), '/404')
225+
})
226+
227+
it('transfers src on mouseover when preload is true', async function() {
228+
assert(!details.open)
229+
dialog.preload = true
230+
assert(dialog.hasAttribute('preload'))
231+
assert.notOk(includeFragment.getAttribute('src'))
232+
triggerEvent(details, 'mouseover')
233+
assert.equal(includeFragment.getAttribute('src'), '/404')
234+
})
235+
})
236+
237+
describe('with inlcude-fragment works for script made dialogs', function() {
238+
let includeFragment
239+
beforeEach(function() {
240+
dialog.remove()
241+
dialog = document.createElement('details-dialog')
242+
dialog.src = '/404'
243+
dialog.preload = true
244+
includeFragment = document.createElement('include-fragment')
245+
dialog.append(includeFragment)
246+
details.append(dialog)
247+
includeFragment = document.querySelector('include-fragment')
248+
})
249+
250+
it('transfers src on toggle', async function() {
251+
assert(!details.open)
252+
assert.notOk(includeFragment.getAttribute('src'))
253+
dialog.toggle(true)
254+
await waitForToggleEvent(details)
255+
assert(details.open)
256+
assert.equal(includeFragment.getAttribute('src'), '/404')
257+
})
258+
259+
it('transfers src on mouseover', async function() {
260+
assert(!details.open)
261+
assert.notOk(includeFragment.getAttribute('src'))
262+
triggerEvent(details, 'mouseover')
263+
assert.equal(includeFragment.getAttribute('src'), '/404')
264+
})
265+
})
203266
})
204267
})
205268

@@ -215,16 +278,17 @@ function waitForToggleEvent(details) {
215278
})
216279
}
217280

281+
function triggerEvent(element, name, key) {
282+
const event = document.createEvent('Event')
283+
event.initEvent(name, true, true)
284+
if (key) event.key = key
285+
element.dispatchEvent(event)
286+
}
287+
218288
function pressEscape(details) {
219-
const escapeEvent = document.createEvent('Event')
220-
escapeEvent.initEvent('keydown', true, true)
221-
escapeEvent.key = 'Escape'
222-
details.dispatchEvent(escapeEvent)
289+
triggerEvent(details, 'keydown', 'Escape')
223290
}
224291

225292
function pressTab(details) {
226-
const escapeEvent = document.createEvent('Event')
227-
escapeEvent.initEvent('keydown', true, true)
228-
escapeEvent.key = 'Tab'
229-
details.dispatchEvent(escapeEvent)
293+
triggerEvent(details, 'keydown', 'Tab')
230294
}

0 commit comments

Comments
 (0)