Skip to content

Commit 8c47648

Browse files
authoredJul 29, 2019
fix: gracefully handle portal element being removed from dom (#25)
1 parent 552f71c commit 8c47648

File tree

3 files changed

+16
-1
lines changed

3 files changed

+16
-1
lines changed
 

‎src/portal-popper.spec.jsx

+1
Original file line numberDiff line numberDiff line change
@@ -84,6 +84,7 @@ describe('<PortalPopper />', () => {
8484
expect(Popper.firstCall.args[2].modifiers.preventOverflow).to.eql({
8585
boundariesElement: 'boundary',
8686
})
87+
8788
expect(Popper.firstCall.args[2].onCreate).to.be.a('function')
8889
expect(Popper.firstCall.args[2].onUpdate).to.be.a('function')
8990
})

‎src/portal.jsx

+5-1
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,11 @@ class Portal extends Component {
2525
componentWillUnmount () {
2626
const appendTo = this.props.appendTo
2727

28-
appendTo.removeChild(this._element)
28+
// it's possible the element was removed from the dom or the dom has been
29+
// blown away, which will cause `removeChild` to throw an exception
30+
try {
31+
appendTo.removeChild(this._element)
32+
} catch (err) {} // eslint-disable-line no-empty
2933
}
3034

3135
render () {

‎src/portal.spec.jsx

+10
Original file line numberDiff line numberDiff line change
@@ -28,4 +28,14 @@ describe('<Portal />', () => {
2828
component.unmount()
2929
expect(document.getElementById('portal-0')).not.to.exist
3030
})
31+
32+
it('gracefully handles the portal div no longer existing on unmount', () => {
33+
Portal.idNum = 0
34+
const component = mount(<Portal />)
35+
36+
document.getElementById('portal-0').remove()
37+
38+
component.unmount() // should not error
39+
expect(document.getElementById('portal-0')).not.to.exist
40+
})
3141
})

0 commit comments

Comments
 (0)
Please sign in to comment.