diff --git a/ghcjs-dom.cabal b/ghcjs-dom.cabal
--- a/ghcjs-dom.cabal
+++ b/ghcjs-dom.cabal
@@ -1,627 +1,649 @@
-name: ghcjs-dom
-version: 0.9.2.0
-cabal-version: >=1.24
-build-type: Simple
-license: MIT
-license-file: LICENSE
-maintainer: Hamish Mackenzie <Hamish.K.Mackenzie@googlemail.com>
-synopsis: DOM library that supports both GHCJS and GHC
-description: Documentent Object Model (DOM) functions that work with
-             GHCJS, but can also be used with GHC and a Browser.
-author: Hamish Mackenzie
-data-dir: ""
-category: Web
-
-Source-Repository head
-  type:         git
-  location:     https://github.com/ghcjs/ghcjs-dom
-  subdir:       ghcjs-dom
-
-flag jsffi
-    description: Use JavaScriptFFI extension for GHCJS JavaScript output
-    default: True
-    manual: True
-
-library
-    build-depends: base <5,
-                   transformers >=0.2 && <0.6,
-                   text >= 0.11.0.6 && < 1.3
-
-    default-language: Haskell2010
-
-    exposed: True
-    buildable: True
-
-    if (impl(ghcjs) && flag(jsffi))
-        build-depends: ghcjs-dom-jsffi ==0.9.2.0
-    else
-        build-depends: ghcjs-dom-jsaddle ==0.9.2.0
-
-    reexported-modules:
-            GHCJS.DOM
-          , GHCJS.DOM.Types
-          , GHCJS.DOM.EventM
-          , GHCJS.DOM.EventTargetClosures
-          -- (cd src/JSDOM/Generated && for a in *.hs; do echo "          , GHCJS.DOM.${a%.*}"; done | pbcopy)
-          , GHCJS.DOM.ANGLEInstancedArrays
-          , GHCJS.DOM.AbstractWorker
-          , GHCJS.DOM.AnalyserNode
-          , GHCJS.DOM.Animatable
-          , GHCJS.DOM.Animation
-          , GHCJS.DOM.AnimationEvent
-          , GHCJS.DOM.ApplePayError
-          , GHCJS.DOM.ApplePayPaymentAuthorizedEvent
-          , GHCJS.DOM.ApplePayPaymentMethodSelectedEvent
-          , GHCJS.DOM.ApplePaySession
-          , GHCJS.DOM.ApplePayShippingContactSelectedEvent
-          , GHCJS.DOM.ApplePayShippingMethodSelectedEvent
-          , GHCJS.DOM.ApplePayValidateMerchantEvent
-          , GHCJS.DOM.ApplicationCache
-          , GHCJS.DOM.Attr
-          , GHCJS.DOM.AudioBuffer
-          , GHCJS.DOM.AudioBufferCallback
-          , GHCJS.DOM.AudioBufferSourceNode
-          , GHCJS.DOM.AudioContext
-          , GHCJS.DOM.AudioDestinationNode
-          , GHCJS.DOM.AudioListener
-          , GHCJS.DOM.AudioNode
-          , GHCJS.DOM.AudioParam
-          , GHCJS.DOM.AudioProcessingEvent
-          , GHCJS.DOM.AudioTrack
-          , GHCJS.DOM.AudioTrackList
-          , GHCJS.DOM.AutocompleteErrorEvent
-          , GHCJS.DOM.BarProp
-          , GHCJS.DOM.BasicCredential
-          , GHCJS.DOM.BeforeLoadEvent
-          , GHCJS.DOM.BeforeUnloadEvent
-          , GHCJS.DOM.BiquadFilterNode
-          , GHCJS.DOM.Blob
-          , GHCJS.DOM.BlobCallback
-          , GHCJS.DOM.Body
-          , GHCJS.DOM.ByteLengthQueuingStrategy
-          , GHCJS.DOM.CSS
-          , GHCJS.DOM.CSSFontFaceLoadEvent
-          , GHCJS.DOM.CSSFontFaceRule
-          , GHCJS.DOM.CSSImportRule
-          , GHCJS.DOM.CSSKeyframeRule
-          , GHCJS.DOM.CSSKeyframesRule
-          , GHCJS.DOM.CSSMediaRule
-          , GHCJS.DOM.CSSNamespaceRule
-          , GHCJS.DOM.CSSPageRule
-          , GHCJS.DOM.CSSPrimitiveValue
-          , GHCJS.DOM.CSSRule
-          , GHCJS.DOM.CSSRuleList
-          , GHCJS.DOM.CSSStyleDeclaration
-          , GHCJS.DOM.CSSStyleRule
-          , GHCJS.DOM.CSSStyleSheet
-          , GHCJS.DOM.CSSSupportsRule
-          , GHCJS.DOM.CSSValue
-          , GHCJS.DOM.CSSValueList
-          , GHCJS.DOM.CanvasCaptureMediaStreamTrack
-          , GHCJS.DOM.CanvasGradient
-          , GHCJS.DOM.CanvasPath
-          , GHCJS.DOM.CanvasRenderingContext2D
-          , GHCJS.DOM.CharacterData
-          , GHCJS.DOM.ChildNode
-          , GHCJS.DOM.ClipboardEvent
-          , GHCJS.DOM.CloseEvent
-          , GHCJS.DOM.CommandLineAPIHost
-          , GHCJS.DOM.Comment
-          , GHCJS.DOM.CompositionEvent
-          , GHCJS.DOM.ConvolverNode
-          , GHCJS.DOM.Coordinates
-          , GHCJS.DOM.CountQueuingStrategy
-          , GHCJS.DOM.Counter
-          , GHCJS.DOM.Crypto
-          , GHCJS.DOM.CryptoKey
-          , GHCJS.DOM.CustomElementRegistry
-          , GHCJS.DOM.CustomEvent
-          , GHCJS.DOM.DOMError
-          , GHCJS.DOM.DOMException
-          , GHCJS.DOM.DOMImplementation
-          , GHCJS.DOM.DOMNamedFlowCollection
-          , GHCJS.DOM.DOMParser
-          , GHCJS.DOM.DOMPoint
-          , GHCJS.DOM.DOMPointReadOnly
-          , GHCJS.DOM.DOMRect
-          , GHCJS.DOM.DOMRectReadOnly
-          , GHCJS.DOM.DOMStringList
-          , GHCJS.DOM.DOMStringMap
-          , GHCJS.DOM.DOMTokenList
-          , GHCJS.DOM.DataCue
-          , GHCJS.DOM.DataTransfer
-          , GHCJS.DOM.DataTransferItem
-          , GHCJS.DOM.DataTransferItemList
-          , GHCJS.DOM.Database
-          , GHCJS.DOM.DatabaseCallback
-          , GHCJS.DOM.DedicatedWorkerGlobalScope
-          , GHCJS.DOM.DelayNode
-          , GHCJS.DOM.DeviceMotionEvent
-          , GHCJS.DOM.DeviceOrientationEvent
-          , GHCJS.DOM.DeviceProximityEvent
-          , GHCJS.DOM.Document
-          , GHCJS.DOM.DocumentAndElementEventHandlers
-          , GHCJS.DOM.DocumentFragment
-          , GHCJS.DOM.DocumentOrShadowRoot
-          , GHCJS.DOM.DocumentTimeline
-          , GHCJS.DOM.DocumentType
-          , GHCJS.DOM.DynamicsCompressorNode
-          , GHCJS.DOM.EXTBlendMinMax
-          , GHCJS.DOM.EXTTextureFilterAnisotropic
-          , GHCJS.DOM.EXTsRGB
-          , GHCJS.DOM.Element
-          , GHCJS.DOM.ElementCSSInlineStyle
-          , GHCJS.DOM.Enums
-          , GHCJS.DOM.ErrorEvent
-          , GHCJS.DOM.Event
-          , GHCJS.DOM.EventListener
-          , GHCJS.DOM.EventSource
-          , GHCJS.DOM.EventTarget
-          , GHCJS.DOM.File
-          , GHCJS.DOM.FileError
-          , GHCJS.DOM.FileException
-          , GHCJS.DOM.FileList
-          , GHCJS.DOM.FileReader
-          , GHCJS.DOM.FileReaderSync
-          , GHCJS.DOM.FocusEvent
-          , GHCJS.DOM.FontFace
-          , GHCJS.DOM.FontFaceSet
-          , GHCJS.DOM.FormData
-          , GHCJS.DOM.GainNode
-          , GHCJS.DOM.Gamepad
-          , GHCJS.DOM.GamepadButton
-          , GHCJS.DOM.GamepadEvent
-          , GHCJS.DOM.Geolocation
-          , GHCJS.DOM.Geoposition
-          , GHCJS.DOM.GlobalCrypto
-          , GHCJS.DOM.GlobalEventHandlers
-          , GHCJS.DOM.GlobalPerformance
-          , GHCJS.DOM.HTMLAllCollection
-          , GHCJS.DOM.HTMLAnchorElement
-          , GHCJS.DOM.HTMLAppletElement
-          , GHCJS.DOM.HTMLAreaElement
-          , GHCJS.DOM.HTMLAttachmentElement
-          , GHCJS.DOM.HTMLBRElement
-          , GHCJS.DOM.HTMLBaseElement
-          , GHCJS.DOM.HTMLBodyElement
-          , GHCJS.DOM.HTMLButtonElement
-          , GHCJS.DOM.HTMLCanvasElement
-          , GHCJS.DOM.HTMLCollection
-          , GHCJS.DOM.HTMLDListElement
-          , GHCJS.DOM.HTMLDataElement
-          , GHCJS.DOM.HTMLDataListElement
-          , GHCJS.DOM.HTMLDetailsElement
-          , GHCJS.DOM.HTMLDirectoryElement
-          , GHCJS.DOM.HTMLDivElement
-          , GHCJS.DOM.HTMLDocument
-          , GHCJS.DOM.HTMLElement
-          , GHCJS.DOM.HTMLEmbedElement
-          , GHCJS.DOM.HTMLFieldSetElement
-          , GHCJS.DOM.HTMLFontElement
-          , GHCJS.DOM.HTMLFormControlsCollection
-          , GHCJS.DOM.HTMLFormElement
-          , GHCJS.DOM.HTMLFrameElement
-          , GHCJS.DOM.HTMLFrameSetElement
-          , GHCJS.DOM.HTMLHRElement
-          , GHCJS.DOM.HTMLHeadElement
-          , GHCJS.DOM.HTMLHeadingElement
-          , GHCJS.DOM.HTMLHtmlElement
-          , GHCJS.DOM.HTMLHyperlinkElementUtils
-          , GHCJS.DOM.HTMLIFrameElement
-          , GHCJS.DOM.HTMLImageElement
-          , GHCJS.DOM.HTMLInputElement
-          , GHCJS.DOM.HTMLKeygenElement
-          , GHCJS.DOM.HTMLLIElement
-          , GHCJS.DOM.HTMLLabelElement
-          , GHCJS.DOM.HTMLLegendElement
-          , GHCJS.DOM.HTMLLinkElement
-          , GHCJS.DOM.HTMLMapElement
-          , GHCJS.DOM.HTMLMarqueeElement
-          , GHCJS.DOM.HTMLMediaElement
-          , GHCJS.DOM.HTMLMenuElement
-          , GHCJS.DOM.HTMLMetaElement
-          , GHCJS.DOM.HTMLMeterElement
-          , GHCJS.DOM.HTMLModElement
-          , GHCJS.DOM.HTMLOListElement
-          , GHCJS.DOM.HTMLObjectElement
-          , GHCJS.DOM.HTMLOptGroupElement
-          , GHCJS.DOM.HTMLOptionElement
-          , GHCJS.DOM.HTMLOptionsCollection
-          , GHCJS.DOM.HTMLOutputElement
-          , GHCJS.DOM.HTMLParagraphElement
-          , GHCJS.DOM.HTMLParamElement
-          , GHCJS.DOM.HTMLPreElement
-          , GHCJS.DOM.HTMLProgressElement
-          , GHCJS.DOM.HTMLQuoteElement
-          , GHCJS.DOM.HTMLScriptElement
-          , GHCJS.DOM.HTMLSelectElement
-          , GHCJS.DOM.HTMLSlotElement
-          , GHCJS.DOM.HTMLSourceElement
-          , GHCJS.DOM.HTMLStyleElement
-          , GHCJS.DOM.HTMLTableCaptionElement
-          , GHCJS.DOM.HTMLTableCellElement
-          , GHCJS.DOM.HTMLTableColElement
-          , GHCJS.DOM.HTMLTableElement
-          , GHCJS.DOM.HTMLTableRowElement
-          , GHCJS.DOM.HTMLTableSectionElement
-          , GHCJS.DOM.HTMLTemplateElement
-          , GHCJS.DOM.HTMLTextAreaElement
-          , GHCJS.DOM.HTMLTimeElement
-          , GHCJS.DOM.HTMLTitleElement
-          , GHCJS.DOM.HTMLTrackElement
-          , GHCJS.DOM.HTMLUListElement
-          , GHCJS.DOM.HTMLVideoElement
-          , GHCJS.DOM.HashChangeEvent
-          , GHCJS.DOM.Headers
-          , GHCJS.DOM.History
-          , GHCJS.DOM.IDBCursor
-          , GHCJS.DOM.IDBCursorWithValue
-          , GHCJS.DOM.IDBDatabase
-          , GHCJS.DOM.IDBFactory
-          , GHCJS.DOM.IDBIndex
-          , GHCJS.DOM.IDBKeyRange
-          , GHCJS.DOM.IDBObjectStore
-          , GHCJS.DOM.IDBOpenDBRequest
-          , GHCJS.DOM.IDBRequest
-          , GHCJS.DOM.IDBTransaction
-          , GHCJS.DOM.IDBVersionChangeEvent
-          , GHCJS.DOM.ImageData
-          , GHCJS.DOM.InputEvent
-          , GHCJS.DOM.InspectorFrontendHost
-          , GHCJS.DOM.IntersectionObserver
-          , GHCJS.DOM.IntersectionObserverCallback
-          , GHCJS.DOM.IntersectionObserverEntry
-          , GHCJS.DOM.KeyboardEvent
-          , GHCJS.DOM.KeyframeEffect
-          , GHCJS.DOM.Location
-          , GHCJS.DOM.MediaController
-          , GHCJS.DOM.MediaControlsHost
-          , GHCJS.DOM.MediaDeviceInfo
-          , GHCJS.DOM.MediaDevices
-          , GHCJS.DOM.MediaElementAudioSourceNode
-          , GHCJS.DOM.MediaEncryptedEvent
-          , GHCJS.DOM.MediaError
-          , GHCJS.DOM.MediaKeyMessageEvent
-          , GHCJS.DOM.MediaKeySession
-          , GHCJS.DOM.MediaKeyStatusMap
-          , GHCJS.DOM.MediaKeySystemAccess
-          , GHCJS.DOM.MediaKeys
-          , GHCJS.DOM.MediaList
-          , GHCJS.DOM.MediaQueryList
-          , GHCJS.DOM.MediaQueryListListener
-          , GHCJS.DOM.MediaRemoteControls
-          , GHCJS.DOM.MediaSession
-          , GHCJS.DOM.MediaSource
-          , GHCJS.DOM.MediaStream
-          , GHCJS.DOM.MediaStreamAudioDestinationNode
-          , GHCJS.DOM.MediaStreamAudioSourceNode
-          , GHCJS.DOM.MediaStreamEvent
-          , GHCJS.DOM.MediaStreamTrack
-          , GHCJS.DOM.MediaStreamTrackEvent
-          , GHCJS.DOM.MessageChannel
-          , GHCJS.DOM.MessageEvent
-          , GHCJS.DOM.MessagePort
-          , GHCJS.DOM.MimeType
-          , GHCJS.DOM.MimeTypeArray
-          , GHCJS.DOM.MouseEvent
-          , GHCJS.DOM.MutationEvent
-          , GHCJS.DOM.MutationObserver
-          , GHCJS.DOM.MutationRecord
-          , GHCJS.DOM.NamedNodeMap
-          , GHCJS.DOM.Navigator
-          , GHCJS.DOM.NavigatorConcurrentHardware
-          , GHCJS.DOM.NavigatorID
-          , GHCJS.DOM.NavigatorLanguage
-          , GHCJS.DOM.NavigatorOnLine
-          , GHCJS.DOM.NavigatorUserMediaError
-          , GHCJS.DOM.NavigatorUserMediaErrorCallback
-          , GHCJS.DOM.NavigatorUserMediaSuccessCallback
-          , GHCJS.DOM.Node
-          , GHCJS.DOM.NodeFilter
-          , GHCJS.DOM.NodeIterator
-          , GHCJS.DOM.NodeList
-          , GHCJS.DOM.NonDocumentTypeChildNode
-          , GHCJS.DOM.NonElementParentNode
-          , GHCJS.DOM.Notification
-          , GHCJS.DOM.NotificationPermissionCallback
-          , GHCJS.DOM.OESStandardDerivatives
-          , GHCJS.DOM.OESTextureHalfFloat
-          , GHCJS.DOM.OESVertexArrayObject
-          , GHCJS.DOM.OfflineAudioCompletionEvent
-          , GHCJS.DOM.OfflineAudioContext
-          , GHCJS.DOM.OscillatorNode
-          , GHCJS.DOM.OverconstrainedError
-          , GHCJS.DOM.OverconstrainedErrorEvent
-          , GHCJS.DOM.OverflowEvent
-          , GHCJS.DOM.PageTransitionEvent
-          , GHCJS.DOM.PannerNode
-          , GHCJS.DOM.ParentNode
-          , GHCJS.DOM.PasswordCredential
-          , GHCJS.DOM.Path2D
-          , GHCJS.DOM.Performance
-          , GHCJS.DOM.PerformanceEntry
-          , GHCJS.DOM.PerformanceNavigation
-          , GHCJS.DOM.PerformanceObserver
-          , GHCJS.DOM.PerformanceObserverCallback
-          , GHCJS.DOM.PerformanceObserverEntryList
-          , GHCJS.DOM.PerformanceResourceTiming
-          , GHCJS.DOM.PerformanceTiming
-          , GHCJS.DOM.Plugin
-          , GHCJS.DOM.PluginArray
-          , GHCJS.DOM.PopStateEvent
-          , GHCJS.DOM.PositionCallback
-          , GHCJS.DOM.PositionError
-          , GHCJS.DOM.PositionErrorCallback
-          , GHCJS.DOM.ProcessingInstruction
-          , GHCJS.DOM.ProgressEvent
-          , GHCJS.DOM.PromiseRejectionEvent
-          , GHCJS.DOM.QuickTimePluginReplacement
-          , GHCJS.DOM.RGBColor
-          , GHCJS.DOM.RTCDTMFSender
-          , GHCJS.DOM.RTCDTMFToneChangeEvent
-          , GHCJS.DOM.RTCDataChannel
-          , GHCJS.DOM.RTCDataChannelEvent
-          , GHCJS.DOM.RTCIceCandidate
-          , GHCJS.DOM.RTCIceCandidateEvent
-          , GHCJS.DOM.RTCIceTransport
-          , GHCJS.DOM.RTCPeerConnection
-          , GHCJS.DOM.RTCPeerConnectionIceEvent
-          , GHCJS.DOM.RTCRtpReceiver
-          , GHCJS.DOM.RTCRtpSender
-          , GHCJS.DOM.RTCRtpTransceiver
-          , GHCJS.DOM.RTCSessionDescription
-          , GHCJS.DOM.RTCTrackEvent
-          , GHCJS.DOM.RadioNodeList
-          , GHCJS.DOM.Range
-          , GHCJS.DOM.ReadableByteStreamController
-          , GHCJS.DOM.ReadableStream
-          , GHCJS.DOM.ReadableStreamBYOBReader
-          , GHCJS.DOM.ReadableStreamBYOBRequest
-          , GHCJS.DOM.ReadableStreamDefaultController
-          , GHCJS.DOM.ReadableStreamDefaultReader
-          , GHCJS.DOM.ReadableStreamSource
-          , GHCJS.DOM.Rect
-          , GHCJS.DOM.Request
-          , GHCJS.DOM.RequestAnimationFrameCallback
-          , GHCJS.DOM.Response
-          , GHCJS.DOM.SQLError
-          , GHCJS.DOM.SQLException
-          , GHCJS.DOM.SQLResultSet
-          , GHCJS.DOM.SQLResultSetRowList
-          , GHCJS.DOM.SQLStatementCallback
-          , GHCJS.DOM.SQLStatementErrorCallback
-          , GHCJS.DOM.SQLTransaction
-          , GHCJS.DOM.SQLTransactionCallback
-          , GHCJS.DOM.SQLTransactionErrorCallback
-          , GHCJS.DOM.SVGAElement
-          , GHCJS.DOM.SVGAltGlyphElement
-          , GHCJS.DOM.SVGAngle
-          , GHCJS.DOM.SVGAnimatedAngle
-          , GHCJS.DOM.SVGAnimatedBoolean
-          , GHCJS.DOM.SVGAnimatedEnumeration
-          , GHCJS.DOM.SVGAnimatedInteger
-          , GHCJS.DOM.SVGAnimatedLength
-          , GHCJS.DOM.SVGAnimatedLengthList
-          , GHCJS.DOM.SVGAnimatedNumber
-          , GHCJS.DOM.SVGAnimatedNumberList
-          , GHCJS.DOM.SVGAnimatedPreserveAspectRatio
-          , GHCJS.DOM.SVGAnimatedRect
-          , GHCJS.DOM.SVGAnimatedString
-          , GHCJS.DOM.SVGAnimatedTransformList
-          , GHCJS.DOM.SVGAnimationElement
-          , GHCJS.DOM.SVGCircleElement
-          , GHCJS.DOM.SVGClipPathElement
-          , GHCJS.DOM.SVGComponentTransferFunctionElement
-          , GHCJS.DOM.SVGCursorElement
-          , GHCJS.DOM.SVGElement
-          , GHCJS.DOM.SVGEllipseElement
-          , GHCJS.DOM.SVGException
-          , GHCJS.DOM.SVGExternalResourcesRequired
-          , GHCJS.DOM.SVGFEBlendElement
-          , GHCJS.DOM.SVGFEColorMatrixElement
-          , GHCJS.DOM.SVGFEComponentTransferElement
-          , GHCJS.DOM.SVGFECompositeElement
-          , GHCJS.DOM.SVGFEConvolveMatrixElement
-          , GHCJS.DOM.SVGFEDiffuseLightingElement
-          , GHCJS.DOM.SVGFEDisplacementMapElement
-          , GHCJS.DOM.SVGFEDistantLightElement
-          , GHCJS.DOM.SVGFEDropShadowElement
-          , GHCJS.DOM.SVGFEGaussianBlurElement
-          , GHCJS.DOM.SVGFEImageElement
-          , GHCJS.DOM.SVGFEMergeNodeElement
-          , GHCJS.DOM.SVGFEMorphologyElement
-          , GHCJS.DOM.SVGFEOffsetElement
-          , GHCJS.DOM.SVGFEPointLightElement
-          , GHCJS.DOM.SVGFESpecularLightingElement
-          , GHCJS.DOM.SVGFESpotLightElement
-          , GHCJS.DOM.SVGFETileElement
-          , GHCJS.DOM.SVGFETurbulenceElement
-          , GHCJS.DOM.SVGFilterElement
-          , GHCJS.DOM.SVGFilterPrimitiveStandardAttributes
-          , GHCJS.DOM.SVGFitToViewBox
-          , GHCJS.DOM.SVGForeignObjectElement
-          , GHCJS.DOM.SVGGlyphRefElement
-          , GHCJS.DOM.SVGGradientElement
-          , GHCJS.DOM.SVGGraphicsElement
-          , GHCJS.DOM.SVGImageElement
-          , GHCJS.DOM.SVGLength
-          , GHCJS.DOM.SVGLengthList
-          , GHCJS.DOM.SVGLineElement
-          , GHCJS.DOM.SVGLinearGradientElement
-          , GHCJS.DOM.SVGMarkerElement
-          , GHCJS.DOM.SVGMaskElement
-          , GHCJS.DOM.SVGMatrix
-          , GHCJS.DOM.SVGNumber
-          , GHCJS.DOM.SVGNumberList
-          , GHCJS.DOM.SVGPathElement
-          , GHCJS.DOM.SVGPathSeg
-          , GHCJS.DOM.SVGPathSegArcAbs
-          , GHCJS.DOM.SVGPathSegArcRel
-          , GHCJS.DOM.SVGPathSegCurvetoCubicAbs
-          , GHCJS.DOM.SVGPathSegCurvetoCubicRel
-          , GHCJS.DOM.SVGPathSegCurvetoCubicSmoothAbs
-          , GHCJS.DOM.SVGPathSegCurvetoCubicSmoothRel
-          , GHCJS.DOM.SVGPathSegCurvetoQuadraticAbs
-          , GHCJS.DOM.SVGPathSegCurvetoQuadraticRel
-          , GHCJS.DOM.SVGPathSegCurvetoQuadraticSmoothAbs
-          , GHCJS.DOM.SVGPathSegCurvetoQuadraticSmoothRel
-          , GHCJS.DOM.SVGPathSegLinetoAbs
-          , GHCJS.DOM.SVGPathSegLinetoHorizontalAbs
-          , GHCJS.DOM.SVGPathSegLinetoHorizontalRel
-          , GHCJS.DOM.SVGPathSegLinetoRel
-          , GHCJS.DOM.SVGPathSegLinetoVerticalAbs
-          , GHCJS.DOM.SVGPathSegLinetoVerticalRel
-          , GHCJS.DOM.SVGPathSegList
-          , GHCJS.DOM.SVGPathSegMovetoAbs
-          , GHCJS.DOM.SVGPathSegMovetoRel
-          , GHCJS.DOM.SVGPatternElement
-          , GHCJS.DOM.SVGPoint
-          , GHCJS.DOM.SVGPointList
-          , GHCJS.DOM.SVGPolygonElement
-          , GHCJS.DOM.SVGPolylineElement
-          , GHCJS.DOM.SVGPreserveAspectRatio
-          , GHCJS.DOM.SVGRadialGradientElement
-          , GHCJS.DOM.SVGRect
-          , GHCJS.DOM.SVGRectElement
-          , GHCJS.DOM.SVGRenderingIntent
-          , GHCJS.DOM.SVGSVGElement
-          , GHCJS.DOM.SVGScriptElement
-          , GHCJS.DOM.SVGStopElement
-          , GHCJS.DOM.SVGStringList
-          , GHCJS.DOM.SVGStyleElement
-          , GHCJS.DOM.SVGTests
-          , GHCJS.DOM.SVGTextContentElement
-          , GHCJS.DOM.SVGTextPathElement
-          , GHCJS.DOM.SVGTextPositioningElement
-          , GHCJS.DOM.SVGTransform
-          , GHCJS.DOM.SVGTransformList
-          , GHCJS.DOM.SVGURIReference
-          , GHCJS.DOM.SVGUnitTypes
-          , GHCJS.DOM.SVGUseElement
-          , GHCJS.DOM.SVGViewElement
-          , GHCJS.DOM.SVGViewSpec
-          , GHCJS.DOM.SVGZoomAndPan
-          , GHCJS.DOM.SVGZoomEvent
-          , GHCJS.DOM.Screen
-          , GHCJS.DOM.ScriptProcessorNode
-          , GHCJS.DOM.SecurityPolicyViolationEvent
-          , GHCJS.DOM.Selection
-          , GHCJS.DOM.ShadowRoot
-          , GHCJS.DOM.SiteBoundCredential
-          , GHCJS.DOM.Slotable
-          , GHCJS.DOM.SourceBuffer
-          , GHCJS.DOM.SourceBufferList
-          , GHCJS.DOM.SpeechSynthesis
-          , GHCJS.DOM.SpeechSynthesisEvent
-          , GHCJS.DOM.SpeechSynthesisUtterance
-          , GHCJS.DOM.SpeechSynthesisVoice
-          , GHCJS.DOM.StaticRange
-          , GHCJS.DOM.Storage
-          , GHCJS.DOM.StorageErrorCallback
-          , GHCJS.DOM.StorageEvent
-          , GHCJS.DOM.StorageInfo
-          , GHCJS.DOM.StorageQuota
-          , GHCJS.DOM.StorageQuotaCallback
-          , GHCJS.DOM.StorageUsageCallback
-          , GHCJS.DOM.StringCallback
-          , GHCJS.DOM.StyleMedia
-          , GHCJS.DOM.StyleSheet
-          , GHCJS.DOM.StyleSheetList
-          , GHCJS.DOM.SubtleCrypto
-          , GHCJS.DOM.Text
-          , GHCJS.DOM.TextDecoder
-          , GHCJS.DOM.TextEncoder
-          , GHCJS.DOM.TextEvent
-          , GHCJS.DOM.TextMetrics
-          , GHCJS.DOM.TextTrack
-          , GHCJS.DOM.TextTrackCue
-          , GHCJS.DOM.TextTrackCueList
-          , GHCJS.DOM.TextTrackList
-          , GHCJS.DOM.TimeRanges
-          , GHCJS.DOM.Touch
-          , GHCJS.DOM.TouchEvent
-          , GHCJS.DOM.TouchList
-          , GHCJS.DOM.TrackEvent
-          , GHCJS.DOM.TransitionEvent
-          , GHCJS.DOM.TreeWalker
-          , GHCJS.DOM.UIEvent
-          , GHCJS.DOM.URL
-          , GHCJS.DOM.URLSearchParams
-          , GHCJS.DOM.UserMessageHandler
-          , GHCJS.DOM.VTTCue
-          , GHCJS.DOM.VTTRegion
-          , GHCJS.DOM.VTTRegionList
-          , GHCJS.DOM.ValidityState
-          , GHCJS.DOM.VideoPlaybackQuality
-          , GHCJS.DOM.VideoTrack
-          , GHCJS.DOM.VideoTrackList
-          , GHCJS.DOM.VoidCallback
-          , GHCJS.DOM.WaveShaperNode
-          , GHCJS.DOM.WebGL2RenderingContext
-          , GHCJS.DOM.WebGLActiveInfo
-          , GHCJS.DOM.WebGLCompressedTextureATC
-          , GHCJS.DOM.WebGLCompressedTexturePVRTC
-          , GHCJS.DOM.WebGLCompressedTextureS3TC
-          , GHCJS.DOM.WebGLContextEvent
-          , GHCJS.DOM.WebGLDebugRendererInfo
-          , GHCJS.DOM.WebGLDebugShaders
-          , GHCJS.DOM.WebGLDepthTexture
-          , GHCJS.DOM.WebGLDrawBuffers
-          , GHCJS.DOM.WebGLLoseContext
-          , GHCJS.DOM.WebGLRenderingContextBase
-          , GHCJS.DOM.WebGLShaderPrecisionFormat
-          , GHCJS.DOM.WebGPUBuffer
-          , GHCJS.DOM.WebGPUCommandBuffer
-          , GHCJS.DOM.WebGPUCommandQueue
-          , GHCJS.DOM.WebGPUComputeCommandEncoder
-          , GHCJS.DOM.WebGPUDepthStencilDescriptor
-          , GHCJS.DOM.WebGPUDepthStencilState
-          , GHCJS.DOM.WebGPUDrawable
-          , GHCJS.DOM.WebGPUFunction
-          , GHCJS.DOM.WebGPULibrary
-          , GHCJS.DOM.WebGPURenderCommandEncoder
-          , GHCJS.DOM.WebGPURenderPassAttachmentDescriptor
-          , GHCJS.DOM.WebGPURenderPassColorAttachmentDescriptor
-          , GHCJS.DOM.WebGPURenderPassDepthAttachmentDescriptor
-          , GHCJS.DOM.WebGPURenderPassDescriptor
-          , GHCJS.DOM.WebGPURenderPipelineColorAttachmentDescriptor
-          , GHCJS.DOM.WebGPURenderPipelineDescriptor
-          , GHCJS.DOM.WebGPURenderPipelineState
-          , GHCJS.DOM.WebGPURenderingContext
-          , GHCJS.DOM.WebGPUTexture
-          , GHCJS.DOM.WebGPUTextureDescriptor
-          , GHCJS.DOM.WebKitAnimationEvent
-          , GHCJS.DOM.WebKitCSSMatrix
-          , GHCJS.DOM.WebKitCSSRegionRule
-          , GHCJS.DOM.WebKitCSSViewportRule
-          , GHCJS.DOM.WebKitMediaKeyError
-          , GHCJS.DOM.WebKitMediaKeyMessageEvent
-          , GHCJS.DOM.WebKitMediaKeyNeededEvent
-          , GHCJS.DOM.WebKitMediaKeySession
-          , GHCJS.DOM.WebKitMediaKeys
-          , GHCJS.DOM.WebKitNamedFlow
-          , GHCJS.DOM.WebKitNamespace
-          , GHCJS.DOM.WebKitPlaybackTargetAvailabilityEvent
-          , GHCJS.DOM.WebKitPoint
-          , GHCJS.DOM.WebKitSubtleCrypto
-          , GHCJS.DOM.WebKitTransitionEvent
-          , GHCJS.DOM.WebSocket
-          , GHCJS.DOM.WheelEvent
-          , GHCJS.DOM.Window
-          , GHCJS.DOM.WindowEventHandlers
-          , GHCJS.DOM.WindowOrWorkerGlobalScope
-          , GHCJS.DOM.Worker
-          , GHCJS.DOM.WorkerGlobalScope
-          , GHCJS.DOM.WorkerLocation
-          , GHCJS.DOM.WorkerNavigator
-          , GHCJS.DOM.WritableStream
-          , GHCJS.DOM.XMLHttpRequest
-          , GHCJS.DOM.XMLHttpRequestEventTarget
-          , GHCJS.DOM.XMLHttpRequestProgressEvent
-          , GHCJS.DOM.XMLSerializer
-          , GHCJS.DOM.XPathEvaluator
-          , GHCJS.DOM.XPathException
-          , GHCJS.DOM.XPathExpression
-          , GHCJS.DOM.XPathNSResolver
-          , GHCJS.DOM.XPathResult
-          , GHCJS.DOM.XSLTProcessor
+cabal-version: 3.6
+name: ghcjs-dom
+version: 0.9.9.2
+build-type: Simple
+license: MIT
+license-file: LICENSE
+maintainer: Hamish Mackenzie <Hamish.K.Mackenzie@googlemail.com>
+synopsis: DOM library that supports both GHCJS and GHC
+description:
+    Documentent Object Model (DOM) functions that work with
+    GHCJS, but can also be used with GHC and a Browser.
+category: Web
+author: Hamish Mackenzie
+
+tested-with:
+  GHC == 8.8.1 || == 8.6.5 ||  == 8.4.4 || == 8.2.2 || == 8.0.2 || == 7.10.3,
+  GHCJS == 8.4 || == 8.2
+
+source-repository head
+  type:         git
+  location:     https://github.com/ghcjs/ghcjs-dom
+  subdir:       ghcjs-dom
+
+flag jsffi
+    description:
+        Use JavaScriptFFI extension for GHCJS JavaScript output
+    manual: True
+
+flag debug
+    description:
+        Enable debug features
+    default: False
+    manual: True
+
+library
+    build-depends: base <5,
+                   containers >=0.5.7.1 && <0.8,
+                   transformers >=0.2 && <0.7,
+                   text >= 0.11.0.6 && < 2.2
+
+    default-language: Haskell2010
+
+    hs-source-dirs: src
+
+    exposed-modules:
+        GHCJS.DOM.Debug
+        GHCJS.DOM.Debug.Internal
+        GHCJS.DOM.Document
+
+    if flag(debug)
+        cpp-options: -DGHCJS_DOM_DEBUG
+
+    if flag(jsffi) && (impl(ghcjs <9) || (impl(ghc >=9.6.4) && arch(javascript)))
+      if impl(ghcjs <9)
+        build-depends:
+            ghcjs-dom-jsffi >=0.9.9.0
+      else
+        build-depends:
+            ghcjs-dom-javascript >=0.9.9.2
+    else
+        build-depends:
+            ghcjs-dom-jsaddle >=0.9.9.0
+
+    reexported-modules: GHCJS.DOM,
+                        GHCJS.DOM.Types,
+                        GHCJS.DOM.EventM,
+                        GHCJS.DOM.EventTargetClosures,
+    -- (cd src/JSDOM/Generated && for a in *.hs; do echo "                        GHCJS.DOM.${a%.*},"; done | pbcopy)
+                        GHCJS.DOM.ANGLEInstancedArrays,
+                        GHCJS.DOM.AbstractWorker,
+                        GHCJS.DOM.AnalyserNode,
+                        GHCJS.DOM.Animatable,
+                        GHCJS.DOM.Animation,
+                        GHCJS.DOM.AnimationEvent,
+                        GHCJS.DOM.ApplePayError,
+                        GHCJS.DOM.ApplePayPaymentAuthorizedEvent,
+                        GHCJS.DOM.ApplePayPaymentMethodSelectedEvent,
+                        GHCJS.DOM.ApplePaySession,
+                        GHCJS.DOM.ApplePayShippingContactSelectedEvent,
+                        GHCJS.DOM.ApplePayShippingMethodSelectedEvent,
+                        GHCJS.DOM.ApplePayValidateMerchantEvent,
+                        GHCJS.DOM.ApplicationCache,
+                        GHCJS.DOM.Attr,
+                        GHCJS.DOM.AudioBuffer,
+                        GHCJS.DOM.AudioBufferCallback,
+                        GHCJS.DOM.AudioBufferSourceNode,
+                        GHCJS.DOM.AudioContext,
+                        GHCJS.DOM.AudioDestinationNode,
+                        GHCJS.DOM.AudioListener,
+                        GHCJS.DOM.AudioNode,
+                        GHCJS.DOM.AudioParam,
+                        GHCJS.DOM.AudioProcessingEvent,
+                        GHCJS.DOM.AudioTrack,
+                        GHCJS.DOM.AudioTrackList,
+                        GHCJS.DOM.AutocompleteErrorEvent,
+                        GHCJS.DOM.BarProp,
+                        GHCJS.DOM.BasicCredential,
+                        GHCJS.DOM.BeforeLoadEvent,
+                        GHCJS.DOM.BeforeUnloadEvent,
+                        GHCJS.DOM.BiquadFilterNode,
+                        GHCJS.DOM.Blob,
+                        GHCJS.DOM.BlobCallback,
+                        GHCJS.DOM.Body,
+                        GHCJS.DOM.ByteLengthQueuingStrategy,
+                        GHCJS.DOM.CSS,
+                        GHCJS.DOM.CSSFontFaceLoadEvent,
+                        GHCJS.DOM.CSSFontFaceRule,
+                        GHCJS.DOM.CSSImportRule,
+                        GHCJS.DOM.CSSKeyframeRule,
+                        GHCJS.DOM.CSSKeyframesRule,
+                        GHCJS.DOM.CSSMediaRule,
+                        GHCJS.DOM.CSSNamespaceRule,
+                        GHCJS.DOM.CSSPageRule,
+                        GHCJS.DOM.CSSPrimitiveValue,
+                        GHCJS.DOM.CSSRule,
+                        GHCJS.DOM.CSSRuleList,
+                        GHCJS.DOM.CSSStyleDeclaration,
+                        GHCJS.DOM.CSSStyleRule,
+                        GHCJS.DOM.CSSStyleSheet,
+                        GHCJS.DOM.CSSSupportsRule,
+                        GHCJS.DOM.CSSValue,
+                        GHCJS.DOM.CSSValueList,
+                        GHCJS.DOM.CanvasCaptureMediaStreamTrack,
+                        GHCJS.DOM.CanvasGradient,
+                        GHCJS.DOM.CanvasPath,
+                        GHCJS.DOM.CanvasRenderingContext2D,
+                        GHCJS.DOM.CharacterData,
+                        GHCJS.DOM.ChildNode,
+                        GHCJS.DOM.ClipboardEvent,
+                        GHCJS.DOM.CloseEvent,
+                        GHCJS.DOM.CommandLineAPIHost,
+                        GHCJS.DOM.Comment,
+                        GHCJS.DOM.CompositionEvent,
+                        GHCJS.DOM.ConvolverNode,
+                        GHCJS.DOM.Coordinates,
+                        GHCJS.DOM.CountQueuingStrategy,
+                        GHCJS.DOM.Counter,
+                        GHCJS.DOM.Crypto,
+                        GHCJS.DOM.CryptoKey,
+                        GHCJS.DOM.CustomElementRegistry,
+                        GHCJS.DOM.CustomEvent,
+                        GHCJS.DOM.DOMError,
+                        GHCJS.DOM.DOMException,
+                        GHCJS.DOM.DOMImplementation,
+                        GHCJS.DOM.DOMNamedFlowCollection,
+                        GHCJS.DOM.DOMParser,
+                        GHCJS.DOM.DOMPoint,
+                        GHCJS.DOM.DOMPointReadOnly,
+                        GHCJS.DOM.DOMRect,
+                        GHCJS.DOM.DOMRectReadOnly,
+                        GHCJS.DOM.DOMStringList,
+                        GHCJS.DOM.DOMStringMap,
+                        GHCJS.DOM.DOMTokenList,
+                        GHCJS.DOM.DataCue,
+                        GHCJS.DOM.DataTransfer,
+                        GHCJS.DOM.DataTransferItem,
+                        GHCJS.DOM.DataTransferItemList,
+                        GHCJS.DOM.Database,
+                        GHCJS.DOM.DatabaseCallback,
+                        GHCJS.DOM.DedicatedWorkerGlobalScope,
+                        GHCJS.DOM.DelayNode,
+                        GHCJS.DOM.DeviceMotionEvent,
+                        GHCJS.DOM.DeviceOrientationEvent,
+                        GHCJS.DOM.DeviceProximityEvent,
+                        GHCJS.DOM.DocumentAndElementEventHandlers,
+                        GHCJS.DOM.DocumentFragment,
+                        GHCJS.DOM.DocumentOrShadowRoot,
+                        GHCJS.DOM.DocumentTimeline,
+                        GHCJS.DOM.DocumentType,
+                        GHCJS.DOM.DynamicsCompressorNode,
+                        GHCJS.DOM.EXTBlendMinMax,
+                        GHCJS.DOM.EXTTextureFilterAnisotropic,
+                        GHCJS.DOM.EXTsRGB,
+                        GHCJS.DOM.Element,
+                        GHCJS.DOM.ElementCSSInlineStyle,
+                        GHCJS.DOM.Enums,
+                        GHCJS.DOM.ErrorEvent,
+                        GHCJS.DOM.Event,
+                        GHCJS.DOM.EventListener,
+                        GHCJS.DOM.EventSource,
+                        GHCJS.DOM.EventTarget,
+                        GHCJS.DOM.File,
+                        GHCJS.DOM.FileError,
+                        GHCJS.DOM.FileException,
+                        GHCJS.DOM.FileList,
+                        GHCJS.DOM.FileReader,
+                        GHCJS.DOM.FileReaderSync,
+                        GHCJS.DOM.FocusEvent,
+                        GHCJS.DOM.FontFace,
+                        GHCJS.DOM.FontFaceSet,
+                        GHCJS.DOM.FormData,
+                        GHCJS.DOM.GainNode,
+                        GHCJS.DOM.Gamepad,
+                        GHCJS.DOM.GamepadButton,
+                        GHCJS.DOM.GamepadEvent,
+                        GHCJS.DOM.Geolocation,
+                        GHCJS.DOM.Geoposition,
+                        GHCJS.DOM.GlobalCrypto,
+                        GHCJS.DOM.GlobalEventHandlers,
+                        GHCJS.DOM.GlobalPerformance,
+                        GHCJS.DOM.HTMLAllCollection,
+                        GHCJS.DOM.HTMLAnchorElement,
+                        GHCJS.DOM.HTMLAppletElement,
+                        GHCJS.DOM.HTMLAreaElement,
+                        GHCJS.DOM.HTMLAttachmentElement,
+                        GHCJS.DOM.HTMLBRElement,
+                        GHCJS.DOM.HTMLBaseElement,
+                        GHCJS.DOM.HTMLBodyElement,
+                        GHCJS.DOM.HTMLButtonElement,
+                        GHCJS.DOM.HTMLCanvasElement,
+                        GHCJS.DOM.HTMLCollection,
+                        GHCJS.DOM.HTMLDListElement,
+                        GHCJS.DOM.HTMLDataElement,
+                        GHCJS.DOM.HTMLDataListElement,
+                        GHCJS.DOM.HTMLDetailsElement,
+                        GHCJS.DOM.HTMLDirectoryElement,
+                        GHCJS.DOM.HTMLDivElement,
+                        GHCJS.DOM.HTMLDocument,
+                        GHCJS.DOM.HTMLElement,
+                        GHCJS.DOM.HTMLEmbedElement,
+                        GHCJS.DOM.HTMLFieldSetElement,
+                        GHCJS.DOM.HTMLFontElement,
+                        GHCJS.DOM.HTMLFormControlsCollection,
+                        GHCJS.DOM.HTMLFormElement,
+                        GHCJS.DOM.HTMLFrameElement,
+                        GHCJS.DOM.HTMLFrameSetElement,
+                        GHCJS.DOM.HTMLHRElement,
+                        GHCJS.DOM.HTMLHeadElement,
+                        GHCJS.DOM.HTMLHeadingElement,
+                        GHCJS.DOM.HTMLHtmlElement,
+                        GHCJS.DOM.HTMLHyperlinkElementUtils,
+                        GHCJS.DOM.HTMLIFrameElement,
+                        GHCJS.DOM.HTMLImageElement,
+                        GHCJS.DOM.HTMLInputElement,
+                        GHCJS.DOM.HTMLKeygenElement,
+                        GHCJS.DOM.HTMLLIElement,
+                        GHCJS.DOM.HTMLLabelElement,
+                        GHCJS.DOM.HTMLLegendElement,
+                        GHCJS.DOM.HTMLLinkElement,
+                        GHCJS.DOM.HTMLMapElement,
+                        GHCJS.DOM.HTMLMarqueeElement,
+                        GHCJS.DOM.HTMLMediaElement,
+                        GHCJS.DOM.HTMLMenuElement,
+                        GHCJS.DOM.HTMLMetaElement,
+                        GHCJS.DOM.HTMLMeterElement,
+                        GHCJS.DOM.HTMLModElement,
+                        GHCJS.DOM.HTMLOListElement,
+                        GHCJS.DOM.HTMLObjectElement,
+                        GHCJS.DOM.HTMLOptGroupElement,
+                        GHCJS.DOM.HTMLOptionElement,
+                        GHCJS.DOM.HTMLOptionsCollection,
+                        GHCJS.DOM.HTMLOutputElement,
+                        GHCJS.DOM.HTMLParagraphElement,
+                        GHCJS.DOM.HTMLParamElement,
+                        GHCJS.DOM.HTMLPreElement,
+                        GHCJS.DOM.HTMLProgressElement,
+                        GHCJS.DOM.HTMLQuoteElement,
+                        GHCJS.DOM.HTMLScriptElement,
+                        GHCJS.DOM.HTMLSelectElement,
+                        GHCJS.DOM.HTMLSlotElement,
+                        GHCJS.DOM.HTMLSourceElement,
+                        GHCJS.DOM.HTMLStyleElement,
+                        GHCJS.DOM.HTMLTableCaptionElement,
+                        GHCJS.DOM.HTMLTableCellElement,
+                        GHCJS.DOM.HTMLTableColElement,
+                        GHCJS.DOM.HTMLTableElement,
+                        GHCJS.DOM.HTMLTableRowElement,
+                        GHCJS.DOM.HTMLTableSectionElement,
+                        GHCJS.DOM.HTMLTemplateElement,
+                        GHCJS.DOM.HTMLTextAreaElement,
+                        GHCJS.DOM.HTMLTimeElement,
+                        GHCJS.DOM.HTMLTitleElement,
+                        GHCJS.DOM.HTMLTrackElement,
+                        GHCJS.DOM.HTMLUListElement,
+                        GHCJS.DOM.HTMLVideoElement,
+                        GHCJS.DOM.HashChangeEvent,
+                        GHCJS.DOM.Headers,
+                        GHCJS.DOM.History,
+                        GHCJS.DOM.IDBCursor,
+                        GHCJS.DOM.IDBCursorWithValue,
+                        GHCJS.DOM.IDBDatabase,
+                        GHCJS.DOM.IDBFactory,
+                        GHCJS.DOM.IDBIndex,
+                        GHCJS.DOM.IDBKeyRange,
+                        GHCJS.DOM.IDBObjectStore,
+                        GHCJS.DOM.IDBOpenDBRequest,
+                        GHCJS.DOM.IDBRequest,
+                        GHCJS.DOM.IDBTransaction,
+                        GHCJS.DOM.IDBVersionChangeEvent,
+                        GHCJS.DOM.ImageData,
+                        GHCJS.DOM.InputEvent,
+                        GHCJS.DOM.InspectorFrontendHost,
+                        GHCJS.DOM.IntersectionObserver,
+                        GHCJS.DOM.IntersectionObserverCallback,
+                        GHCJS.DOM.IntersectionObserverEntry,
+                        GHCJS.DOM.KeyboardEvent,
+                        GHCJS.DOM.KeyframeEffect,
+                        GHCJS.DOM.Location,
+                        GHCJS.DOM.MediaController,
+                        GHCJS.DOM.MediaControlsHost,
+                        GHCJS.DOM.MediaDeviceInfo,
+                        GHCJS.DOM.MediaDevices,
+                        GHCJS.DOM.MediaElementAudioSourceNode,
+                        GHCJS.DOM.MediaEncryptedEvent,
+                        GHCJS.DOM.MediaError,
+                        GHCJS.DOM.MediaKeyMessageEvent,
+                        GHCJS.DOM.MediaKeySession,
+                        GHCJS.DOM.MediaKeyStatusMap,
+                        GHCJS.DOM.MediaKeySystemAccess,
+                        GHCJS.DOM.MediaKeys,
+                        GHCJS.DOM.MediaList,
+                        GHCJS.DOM.MediaQueryList,
+                        GHCJS.DOM.MediaQueryListListener,
+                        GHCJS.DOM.MediaRemoteControls,
+                        GHCJS.DOM.MediaSession,
+                        GHCJS.DOM.MediaSource,
+                        GHCJS.DOM.MediaStream,
+                        GHCJS.DOM.MediaStreamAudioDestinationNode,
+                        GHCJS.DOM.MediaStreamAudioSourceNode,
+                        GHCJS.DOM.MediaStreamEvent,
+                        GHCJS.DOM.MediaStreamTrack,
+                        GHCJS.DOM.MediaStreamTrackEvent,
+                        GHCJS.DOM.MessageChannel,
+                        GHCJS.DOM.MessageEvent,
+                        GHCJS.DOM.MessagePort,
+                        GHCJS.DOM.MimeType,
+                        GHCJS.DOM.MimeTypeArray,
+                        GHCJS.DOM.MouseEvent,
+                        GHCJS.DOM.MutationEvent,
+                        GHCJS.DOM.MutationObserver,
+                        GHCJS.DOM.MutationRecord,
+                        GHCJS.DOM.NamedNodeMap,
+                        GHCJS.DOM.Navigator,
+                        GHCJS.DOM.NavigatorConcurrentHardware,
+                        GHCJS.DOM.NavigatorID,
+                        GHCJS.DOM.NavigatorLanguage,
+                        GHCJS.DOM.NavigatorOnLine,
+                        GHCJS.DOM.NavigatorUserMediaError,
+                        GHCJS.DOM.NavigatorUserMediaErrorCallback,
+                        GHCJS.DOM.NavigatorUserMediaSuccessCallback,
+                        GHCJS.DOM.Node,
+                        GHCJS.DOM.NodeFilter,
+                        GHCJS.DOM.NodeIterator,
+                        GHCJS.DOM.NodeList,
+                        GHCJS.DOM.NonDocumentTypeChildNode,
+                        GHCJS.DOM.NonElementParentNode,
+                        GHCJS.DOM.Notification,
+                        GHCJS.DOM.NotificationPermissionCallback,
+                        GHCJS.DOM.OESStandardDerivatives,
+                        GHCJS.DOM.OESTextureHalfFloat,
+                        GHCJS.DOM.OESVertexArrayObject,
+                        GHCJS.DOM.OfflineAudioCompletionEvent,
+                        GHCJS.DOM.OfflineAudioContext,
+                        GHCJS.DOM.OscillatorNode,
+                        GHCJS.DOM.OverconstrainedError,
+                        GHCJS.DOM.OverconstrainedErrorEvent,
+                        GHCJS.DOM.OverflowEvent,
+                        GHCJS.DOM.PageTransitionEvent,
+                        GHCJS.DOM.PannerNode,
+                        GHCJS.DOM.ParentNode,
+                        GHCJS.DOM.PasswordCredential,
+                        GHCJS.DOM.Path2D,
+                        GHCJS.DOM.Performance,
+                        GHCJS.DOM.PerformanceEntry,
+                        GHCJS.DOM.PerformanceNavigation,
+                        GHCJS.DOM.PerformanceObserver,
+                        GHCJS.DOM.PerformanceObserverCallback,
+                        GHCJS.DOM.PerformanceObserverEntryList,
+                        GHCJS.DOM.PerformanceResourceTiming,
+                        GHCJS.DOM.PerformanceTiming,
+                        GHCJS.DOM.Plugin,
+                        GHCJS.DOM.PluginArray,
+                        GHCJS.DOM.PopStateEvent,
+                        GHCJS.DOM.PositionCallback,
+                        GHCJS.DOM.PositionError,
+                        GHCJS.DOM.PositionErrorCallback,
+                        GHCJS.DOM.ProcessingInstruction,
+                        GHCJS.DOM.ProgressEvent,
+                        GHCJS.DOM.PromiseRejectionEvent,
+                        GHCJS.DOM.QuickTimePluginReplacement,
+                        GHCJS.DOM.RGBColor,
+                        GHCJS.DOM.RTCDTMFSender,
+                        GHCJS.DOM.RTCDTMFToneChangeEvent,
+                        GHCJS.DOM.RTCDataChannel,
+                        GHCJS.DOM.RTCDataChannelEvent,
+                        GHCJS.DOM.RTCIceCandidate,
+                        GHCJS.DOM.RTCIceCandidateEvent,
+                        GHCJS.DOM.RTCIceTransport,
+                        GHCJS.DOM.RTCPeerConnection,
+                        GHCJS.DOM.RTCPeerConnectionIceEvent,
+                        GHCJS.DOM.RTCRtpReceiver,
+                        GHCJS.DOM.RTCRtpSender,
+                        GHCJS.DOM.RTCRtpTransceiver,
+                        GHCJS.DOM.RTCSessionDescription,
+                        GHCJS.DOM.RTCTrackEvent,
+                        GHCJS.DOM.RadioNodeList,
+                        GHCJS.DOM.Range,
+                        GHCJS.DOM.ReadableByteStreamController,
+                        GHCJS.DOM.ReadableStream,
+                        GHCJS.DOM.ReadableStreamBYOBReader,
+                        GHCJS.DOM.ReadableStreamBYOBRequest,
+                        GHCJS.DOM.ReadableStreamDefaultController,
+                        GHCJS.DOM.ReadableStreamDefaultReader,
+                        GHCJS.DOM.ReadableStreamSource,
+                        GHCJS.DOM.Rect,
+                        GHCJS.DOM.Request,
+                        GHCJS.DOM.RequestAnimationFrameCallback,
+                        GHCJS.DOM.Response,
+                        GHCJS.DOM.SQLError,
+                        GHCJS.DOM.SQLException,
+                        GHCJS.DOM.SQLResultSet,
+                        GHCJS.DOM.SQLResultSetRowList,
+                        GHCJS.DOM.SQLStatementCallback,
+                        GHCJS.DOM.SQLStatementErrorCallback,
+                        GHCJS.DOM.SQLTransaction,
+                        GHCJS.DOM.SQLTransactionCallback,
+                        GHCJS.DOM.SQLTransactionErrorCallback,
+                        GHCJS.DOM.SVGAElement,
+                        GHCJS.DOM.SVGAltGlyphElement,
+                        GHCJS.DOM.SVGAngle,
+                        GHCJS.DOM.SVGAnimatedAngle,
+                        GHCJS.DOM.SVGAnimatedBoolean,
+                        GHCJS.DOM.SVGAnimatedEnumeration,
+                        GHCJS.DOM.SVGAnimatedInteger,
+                        GHCJS.DOM.SVGAnimatedLength,
+                        GHCJS.DOM.SVGAnimatedLengthList,
+                        GHCJS.DOM.SVGAnimatedNumber,
+                        GHCJS.DOM.SVGAnimatedNumberList,
+                        GHCJS.DOM.SVGAnimatedPreserveAspectRatio,
+                        GHCJS.DOM.SVGAnimatedRect,
+                        GHCJS.DOM.SVGAnimatedString,
+                        GHCJS.DOM.SVGAnimatedTransformList,
+                        GHCJS.DOM.SVGAnimationElement,
+                        GHCJS.DOM.SVGCircleElement,
+                        GHCJS.DOM.SVGClipPathElement,
+                        GHCJS.DOM.SVGComponentTransferFunctionElement,
+                        GHCJS.DOM.SVGCursorElement,
+                        GHCJS.DOM.SVGElement,
+                        GHCJS.DOM.SVGEllipseElement,
+                        GHCJS.DOM.SVGException,
+                        GHCJS.DOM.SVGExternalResourcesRequired,
+                        GHCJS.DOM.SVGFEBlendElement,
+                        GHCJS.DOM.SVGFEColorMatrixElement,
+                        GHCJS.DOM.SVGFEComponentTransferElement,
+                        GHCJS.DOM.SVGFECompositeElement,
+                        GHCJS.DOM.SVGFEConvolveMatrixElement,
+                        GHCJS.DOM.SVGFEDiffuseLightingElement,
+                        GHCJS.DOM.SVGFEDisplacementMapElement,
+                        GHCJS.DOM.SVGFEDistantLightElement,
+                        GHCJS.DOM.SVGFEDropShadowElement,
+                        GHCJS.DOM.SVGFEGaussianBlurElement,
+                        GHCJS.DOM.SVGFEImageElement,
+                        GHCJS.DOM.SVGFEMergeNodeElement,
+                        GHCJS.DOM.SVGFEMorphologyElement,
+                        GHCJS.DOM.SVGFEOffsetElement,
+                        GHCJS.DOM.SVGFEPointLightElement,
+                        GHCJS.DOM.SVGFESpecularLightingElement,
+                        GHCJS.DOM.SVGFESpotLightElement,
+                        GHCJS.DOM.SVGFETileElement,
+                        GHCJS.DOM.SVGFETurbulenceElement,
+                        GHCJS.DOM.SVGFilterElement,
+                        GHCJS.DOM.SVGFilterPrimitiveStandardAttributes,
+                        GHCJS.DOM.SVGFitToViewBox,
+                        GHCJS.DOM.SVGForeignObjectElement,
+                        GHCJS.DOM.SVGGlyphRefElement,
+                        GHCJS.DOM.SVGGradientElement,
+                        GHCJS.DOM.SVGGraphicsElement,
+                        GHCJS.DOM.SVGImageElement,
+                        GHCJS.DOM.SVGLength,
+                        GHCJS.DOM.SVGLengthList,
+                        GHCJS.DOM.SVGLineElement,
+                        GHCJS.DOM.SVGLinearGradientElement,
+                        GHCJS.DOM.SVGMarkerElement,
+                        GHCJS.DOM.SVGMaskElement,
+                        GHCJS.DOM.SVGMatrix,
+                        GHCJS.DOM.SVGNumber,
+                        GHCJS.DOM.SVGNumberList,
+                        GHCJS.DOM.SVGPathElement,
+                        GHCJS.DOM.SVGPathSeg,
+                        GHCJS.DOM.SVGPathSegArcAbs,
+                        GHCJS.DOM.SVGPathSegArcRel,
+                        GHCJS.DOM.SVGPathSegCurvetoCubicAbs,
+                        GHCJS.DOM.SVGPathSegCurvetoCubicRel,
+                        GHCJS.DOM.SVGPathSegCurvetoCubicSmoothAbs,
+                        GHCJS.DOM.SVGPathSegCurvetoCubicSmoothRel,
+                        GHCJS.DOM.SVGPathSegCurvetoQuadraticAbs,
+                        GHCJS.DOM.SVGPathSegCurvetoQuadraticRel,
+                        GHCJS.DOM.SVGPathSegCurvetoQuadraticSmoothAbs,
+                        GHCJS.DOM.SVGPathSegCurvetoQuadraticSmoothRel,
+                        GHCJS.DOM.SVGPathSegLinetoAbs,
+                        GHCJS.DOM.SVGPathSegLinetoHorizontalAbs,
+                        GHCJS.DOM.SVGPathSegLinetoHorizontalRel,
+                        GHCJS.DOM.SVGPathSegLinetoRel,
+                        GHCJS.DOM.SVGPathSegLinetoVerticalAbs,
+                        GHCJS.DOM.SVGPathSegLinetoVerticalRel,
+                        GHCJS.DOM.SVGPathSegList,
+                        GHCJS.DOM.SVGPathSegMovetoAbs,
+                        GHCJS.DOM.SVGPathSegMovetoRel,
+                        GHCJS.DOM.SVGPatternElement,
+                        GHCJS.DOM.SVGPoint,
+                        GHCJS.DOM.SVGPointList,
+                        GHCJS.DOM.SVGPolygonElement,
+                        GHCJS.DOM.SVGPolylineElement,
+                        GHCJS.DOM.SVGPreserveAspectRatio,
+                        GHCJS.DOM.SVGRadialGradientElement,
+                        GHCJS.DOM.SVGRect,
+                        GHCJS.DOM.SVGRectElement,
+                        GHCJS.DOM.SVGRenderingIntent,
+                        GHCJS.DOM.SVGSVGElement,
+                        GHCJS.DOM.SVGScriptElement,
+                        GHCJS.DOM.SVGStopElement,
+                        GHCJS.DOM.SVGStringList,
+                        GHCJS.DOM.SVGStyleElement,
+                        GHCJS.DOM.SVGTests,
+                        GHCJS.DOM.SVGTextContentElement,
+                        GHCJS.DOM.SVGTextPathElement,
+                        GHCJS.DOM.SVGTextPositioningElement,
+                        GHCJS.DOM.SVGTransform,
+                        GHCJS.DOM.SVGTransformList,
+                        GHCJS.DOM.SVGURIReference,
+                        GHCJS.DOM.SVGUnitTypes,
+                        GHCJS.DOM.SVGUseElement,
+                        GHCJS.DOM.SVGViewElement,
+                        GHCJS.DOM.SVGViewSpec,
+                        GHCJS.DOM.SVGZoomAndPan,
+                        GHCJS.DOM.SVGZoomEvent,
+                        GHCJS.DOM.Screen,
+                        GHCJS.DOM.ScriptProcessorNode,
+                        GHCJS.DOM.SecurityPolicyViolationEvent,
+                        GHCJS.DOM.Selection,
+                        GHCJS.DOM.ShadowRoot,
+                        GHCJS.DOM.SiteBoundCredential,
+                        GHCJS.DOM.Slotable,
+                        GHCJS.DOM.SourceBuffer,
+                        GHCJS.DOM.SourceBufferList,
+                        GHCJS.DOM.SpeechSynthesis,
+                        GHCJS.DOM.SpeechSynthesisEvent,
+                        GHCJS.DOM.SpeechSynthesisUtterance,
+                        GHCJS.DOM.SpeechSynthesisVoice,
+                        GHCJS.DOM.StaticRange,
+                        GHCJS.DOM.Storage,
+                        GHCJS.DOM.StorageErrorCallback,
+                        GHCJS.DOM.StorageEvent,
+                        GHCJS.DOM.StorageInfo,
+                        GHCJS.DOM.StorageQuota,
+                        GHCJS.DOM.StorageQuotaCallback,
+                        GHCJS.DOM.StorageUsageCallback,
+                        GHCJS.DOM.StringCallback,
+                        GHCJS.DOM.StyleMedia,
+                        GHCJS.DOM.StyleSheet,
+                        GHCJS.DOM.StyleSheetList,
+                        GHCJS.DOM.SubtleCrypto,
+                        GHCJS.DOM.Text,
+                        GHCJS.DOM.TextDecoder,
+                        GHCJS.DOM.TextEncoder,
+                        GHCJS.DOM.TextEvent,
+                        GHCJS.DOM.TextMetrics,
+                        GHCJS.DOM.TextTrack,
+                        GHCJS.DOM.TextTrackCue,
+                        GHCJS.DOM.TextTrackCueList,
+                        GHCJS.DOM.TextTrackList,
+                        GHCJS.DOM.TimeRanges,
+                        GHCJS.DOM.Touch,
+                        GHCJS.DOM.TouchEvent,
+                        GHCJS.DOM.TouchList,
+                        GHCJS.DOM.TrackEvent,
+                        GHCJS.DOM.TransitionEvent,
+                        GHCJS.DOM.TreeWalker,
+                        GHCJS.DOM.UIEvent,
+                        GHCJS.DOM.URL,
+                        GHCJS.DOM.URLSearchParams,
+                        GHCJS.DOM.UserMessageHandler,
+                        GHCJS.DOM.VTTCue,
+                        GHCJS.DOM.VTTRegion,
+                        GHCJS.DOM.VTTRegionList,
+                        GHCJS.DOM.ValidityState,
+                        GHCJS.DOM.VideoPlaybackQuality,
+                        GHCJS.DOM.VideoTrack,
+                        GHCJS.DOM.VideoTrackList,
+                        GHCJS.DOM.VoidCallback,
+                        GHCJS.DOM.WaveShaperNode,
+                        GHCJS.DOM.WebGL2RenderingContext,
+                        GHCJS.DOM.WebGLActiveInfo,
+                        GHCJS.DOM.WebGLCompressedTextureATC,
+                        GHCJS.DOM.WebGLCompressedTexturePVRTC,
+                        GHCJS.DOM.WebGLCompressedTextureS3TC,
+                        GHCJS.DOM.WebGLContextEvent,
+                        GHCJS.DOM.WebGLDebugRendererInfo,
+                        GHCJS.DOM.WebGLDebugShaders,
+                        GHCJS.DOM.WebGLDepthTexture,
+                        GHCJS.DOM.WebGLDrawBuffers,
+                        GHCJS.DOM.WebGLLoseContext,
+                        GHCJS.DOM.WebGLRenderingContextBase,
+                        GHCJS.DOM.WebGLShaderPrecisionFormat,
+                        GHCJS.DOM.WebGPUBuffer,
+                        GHCJS.DOM.WebGPUCommandBuffer,
+                        GHCJS.DOM.WebGPUCommandQueue,
+                        GHCJS.DOM.WebGPUComputeCommandEncoder,
+                        GHCJS.DOM.WebGPUDepthStencilDescriptor,
+                        GHCJS.DOM.WebGPUDepthStencilState,
+                        GHCJS.DOM.WebGPUDrawable,
+                        GHCJS.DOM.WebGPUFunction,
+                        GHCJS.DOM.WebGPULibrary,
+                        GHCJS.DOM.WebGPURenderCommandEncoder,
+                        GHCJS.DOM.WebGPURenderPassAttachmentDescriptor,
+                        GHCJS.DOM.WebGPURenderPassColorAttachmentDescriptor,
+                        GHCJS.DOM.WebGPURenderPassDepthAttachmentDescriptor,
+                        GHCJS.DOM.WebGPURenderPassDescriptor,
+                        GHCJS.DOM.WebGPURenderPipelineColorAttachmentDescriptor,
+                        GHCJS.DOM.WebGPURenderPipelineDescriptor,
+                        GHCJS.DOM.WebGPURenderPipelineState,
+                        GHCJS.DOM.WebGPURenderingContext,
+                        GHCJS.DOM.WebGPUTexture,
+                        GHCJS.DOM.WebGPUTextureDescriptor,
+                        GHCJS.DOM.WebKitAnimationEvent,
+                        GHCJS.DOM.WebKitCSSMatrix,
+                        GHCJS.DOM.WebKitCSSRegionRule,
+                        GHCJS.DOM.WebKitCSSViewportRule,
+                        GHCJS.DOM.WebKitMediaKeyError,
+                        GHCJS.DOM.WebKitMediaKeyMessageEvent,
+                        GHCJS.DOM.WebKitMediaKeyNeededEvent,
+                        GHCJS.DOM.WebKitMediaKeySession,
+                        GHCJS.DOM.WebKitMediaKeys,
+                        GHCJS.DOM.WebKitNamedFlow,
+                        GHCJS.DOM.WebKitNamespace,
+                        GHCJS.DOM.WebKitPlaybackTargetAvailabilityEvent,
+                        GHCJS.DOM.WebKitPoint,
+                        GHCJS.DOM.WebKitSubtleCrypto,
+                        GHCJS.DOM.WebKitTransitionEvent,
+                        GHCJS.DOM.WebSocket,
+                        GHCJS.DOM.WheelEvent,
+                        GHCJS.DOM.Window,
+                        GHCJS.DOM.WindowEventHandlers,
+                        GHCJS.DOM.WindowOrWorkerGlobalScope,
+                        GHCJS.DOM.Worker,
+                        GHCJS.DOM.WorkerGlobalScope,
+                        GHCJS.DOM.WorkerLocation,
+                        GHCJS.DOM.WorkerNavigator,
+                        GHCJS.DOM.WritableStream,
+                        GHCJS.DOM.XMLHttpRequest,
+                        GHCJS.DOM.XMLHttpRequestEventTarget,
+                        GHCJS.DOM.XMLHttpRequestProgressEvent,
+                        GHCJS.DOM.XMLSerializer,
+                        GHCJS.DOM.XPathEvaluator,
+                        GHCJS.DOM.XPathException,
+                        GHCJS.DOM.XPathExpression,
+                        GHCJS.DOM.XPathNSResolver,
+                        GHCJS.DOM.XPathResult,
+                        GHCJS.DOM.XSLTProcessor
diff --git a/src/GHCJS/DOM/Debug.hs b/src/GHCJS/DOM/Debug.hs
new file mode 100644
--- /dev/null
+++ b/src/GHCJS/DOM/Debug.hs
@@ -0,0 +1,179 @@
+{-# LANGUAGE ConstraintKinds #-}
+{-# LANGUAGE LambdaCase #-}
+{-# LANGUAGE ScopedTypeVariables #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+module GHCJS.DOM.Debug (
+    DomHasCallStack
+  , debugEnabled
+  , getElementStack
+  , addDebugMenu
+  , addDebugMenu'
+) where
+
+import Control.Arrow (Arrow(..))
+import Control.Monad.IO.Class (MonadIO(..))
+
+import Data.Char (toLower)
+import Data.Foldable (forM_)
+import Data.Monoid ((<>))
+
+import System.IO (stderr, hPutStrLn)
+
+import GHC.Stack
+       (srcLocStartLine, srcLocFile, SrcLoc(..), HasCallStack)
+import GHC.Exts (Constraint)
+
+import GHCJS.DOM (currentDocumentUnchecked)
+import GHCJS.DOM.Types
+       (HTMLDivElement(..), HTMLStyleElement(..), uncheckedCastTo,
+        HTMLUListElement(..), MouseEvent(..), Document(..), Element(..),
+        HTMLAnchorElement(..), MonadJSM, JSM, liftJSM, JSString)
+import GHCJS.DOM.Debug.Internal (DomHasCallStack, getElementStack, debugEnabled)
+import GHCJS.DOM.Document
+       (createTextNode, getBodyUnchecked,
+        getElementsByTagName, createElement)
+import GHCJS.DOM.DocumentOrShadowRoot (elementFromPoint)
+import GHCJS.DOM.Element
+       (getTagName, setAttribute, getAttribute, setInnerHTML)
+import GHCJS.DOM.EventM
+       (addListener, uiPageXY, mouseClientXY, mouseShiftKey, target,
+        newListener, on, preventDefault)
+import GHCJS.DOM.EventTargetClosures (SaferEventListener(..))
+import GHCJS.DOM.GlobalEventHandlers (click, contextMenu)
+import GHCJS.DOM.HTMLCollection (itemUnchecked)
+import GHCJS.DOM.HTMLStyleElement (setType)
+import GHCJS.DOM.Node (getParentElement, appendChild_)
+import GHCJS.DOM.NonElementParentNode (getElementById)
+
+addDebugMenu :: MonadJSM m => m (JSM ())
+addDebugMenu = addDebugMenu' (const Nothing)
+
+addDebugMenu' :: MonadJSM m => (SrcLoc -> Maybe String) -> m (JSM ())
+addDebugMenu' getSourceLink = liftJSM $ do
+    let menuId = "ghcjs-dom-debug" :: JSString
+    doc <- currentDocumentUnchecked
+    style <- uncheckedCastTo HTMLStyleElement <$> createElement doc ("style" :: JSString)
+    setType style ("text/css" :: JSString)
+    setInnerHTML style $ mconcat [
+        "#", menuId, ", #", menuId, " ul ul{"
+      , "  display: block;"
+      , "  position: absolute;"
+      , "  box-shadow: 0 4px 8px 0 rgba(0, 0, 0, 0.2), 0 6px 20px 0 rgba(0, 0, 0, 0.19);"
+      , "  padding: 2px;"
+      , "  z-index:1000;"
+      , "  margin: 0;"
+      , "  list-style-type: none;"
+      , "  list-style: none;"
+      , "  background-color:#fff;"
+      , "  color:#000;"
+      , "}\n"
+      , "#", menuId, " ul{"
+      , "  list-style-type: none;"
+      , "  margin: 0;"
+      , "  padding: 2px;"
+      , "  cursor: pointer;"
+      , "}\n"
+      , "#", menuId, " li{"
+      , "  white-space: nowrap;"
+      , "}\n"
+      , "#", menuId, " ul ul{"
+      , "  display: none;"
+      , "}\n"
+      , "#", menuId, ">li:hover{"
+      , "  background-color:#ddd;"
+      , "}\n"
+      , "#", menuId, " li:hover ul{"
+      , "  display: inline-block;"
+      , "  position: absolute;"
+      , "  z-index:1001;"
+      , "}\n"
+      ]
+    getElementsByTagName doc ("head" :: JSString) >>= (`itemUnchecked` 0) >>= (`appendChild_` style)
+    body <- getBodyUnchecked doc
+    clickListener <- newListener $ do
+        target >>= \case
+            Just (t :: HTMLAnchorElement) ->
+                getAttribute t ("hs-srcloc" :: JSString)
+                    >>= mapM_ (liftIO . hPutStrLn stderr . ("OPEN " <>))
+            Nothing -> return ()
+        getElementById doc menuId >>= mapM_
+            (\e -> setAttribute e ("style" :: JSString) ("display: none;" :: JSString))
+    on doc contextMenu $ mouseShiftKey >>= \case
+        True -> ((fromIntegral *** fromIntegral) <$> mouseClientXY) >>= uncurry (elementFromPoint doc) >>= \case
+            Just e ->  do
+                preventDefault
+                menu <- getElementById doc menuId >>= \case
+                    Just menu -> setInnerHTML menu ("" :: JSString) >> return (uncheckedCastTo HTMLDivElement menu)
+                    Nothing -> do
+                        menu <- uncheckedCastTo HTMLDivElement <$> createElement doc ("div" :: JSString)
+                        setAttribute menu ("id" :: JSString) menuId
+                        appendChild_ body menu
+                        return menu
+
+                if debugEnabled
+                    then do
+                        ul <- uncheckedCastTo HTMLUListElement <$> createElement doc ("ul" :: JSString)
+                        appendChild_ menu ul
+                        addMenu doc clickListener ul e
+                    else do
+                        a <- uncheckedCastTo HTMLAnchorElement <$> createElement doc ("a" :: JSString)
+                        appendChild_ menu a
+                        createTextNode doc ("The ghcjs-dom debug cabal flag is switched off" :: JSString)
+                            >>= appendChild_ a
+                        setAttribute a ("href" :: JSString)
+                            ("https://github.com/ghcjs/ghcjs-dom/blob/master/README.md#debug" :: JSString)
+                        setAttribute a ("target" :: JSString) ("_blank" :: JSString)
+                        liftJSM $ addListener a click clickListener False
+
+                (pageX, pageY) <- uiPageXY
+                setAttribute menu ("style" :: JSString) ("display: block; left: " <> show pageX <> "px; top:" <> show pageY <> "px;" )
+            Nothing -> return ()
+        False -> return ()
+
+  where
+    addMenu :: MonadJSM m => Document -> SaferEventListener HTMLAnchorElement MouseEvent -> HTMLUListElement -> Element -> m ()
+    addMenu doc clickListener parentMenu = loop
+      where
+        loop e = do
+            getElementStack e >>= mapM_ (addElementMenu doc clickListener parentMenu e)
+            getParentElement e >>= mapM_ loop
+
+    addElementMenu
+        :: MonadJSM m
+        => Document
+        -> SaferEventListener HTMLAnchorElement MouseEvent
+        -> HTMLUListElement
+        -> Element
+        -> [(String, SrcLoc)]
+        -> m ()
+    addElementMenu doc clickListener parentMenu e cs = do
+        tagName <- map toLower <$> getTagName e
+        parentLi <- createElement doc ("li" :: JSString)
+        appendChild_ parentMenu parentLi
+        createTextNode doc tagName >>= appendChild_ parentLi
+        ul <- createElement doc ("ul" :: JSString)
+        appendChild_ parentLi ul
+        forM_ (reverse cs) $ \(f, loc) -> do
+            li <- createElement doc ("li" :: JSString)
+            appendChild_ ul li
+            a <- uncheckedCastTo HTMLAnchorElement <$> createElement doc ("a" :: JSString)
+            appendChild_ li a
+            createTextNode doc (f <> " " <> srcLocFile loc <> ":" <> show (srcLocStartLine loc))
+                >>= appendChild_ a
+            forM_ (getSourceLink loc) $ \link -> do
+                setAttribute a ("href" :: JSString) link
+                setAttribute a ("target" :: JSString) ("_blank" :: JSString)
+            setAttribute a ("hs-srcloc" :: JSString) $ prettySrcLoc loc
+            liftJSM $ addListener a click clickListener False
+
+    prettySrcLoc :: SrcLoc -> String
+    prettySrcLoc SrcLoc {..} = mconcat
+        [ srcLocFile          , ":("
+        , show srcLocStartLine, ","
+        , show srcLocStartCol , ")-("
+        , show srcLocEndLine  , ","
+        , show srcLocEndCol   , ") in "
+        , srcLocPackage, ":", srcLocModule
+        ]
+
diff --git a/src/GHCJS/DOM/Debug/Internal.hs b/src/GHCJS/DOM/Debug/Internal.hs
new file mode 100644
--- /dev/null
+++ b/src/GHCJS/DOM/Debug/Internal.hs
@@ -0,0 +1,71 @@
+{-# LANGUAGE CPP #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE ConstraintKinds #-}
+{-# LANGUAGE LambdaCase #-}
+{-# LANGUAGE KindSignatures #-}
+module GHCJS.DOM.Debug.Internal (
+    DomHasCallStack
+  , debugEnabled
+  , cachedStacks
+  , cacheStack
+  , lookupStack
+  , getElementStack
+) where
+
+import Control.Monad (void)
+import Control.Monad.IO.Class (MonadIO, liftIO)
+import Data.Map (Map)
+import qualified Data.Map as M (insert, size, lookup)
+import Data.IORef (atomicModifyIORef', IORef, newIORef, readIORef)
+import GHC.Stack
+       (SrcLoc, CallStack, callStack, getCallStack, HasCallStack)
+import GHC.Exts (Constraint)
+import System.IO.Unsafe (unsafePerformIO)
+import Text.Read (readMaybe)
+
+import GHCJS.DOM.Types (Element(..), MonadDOM, ToJSString, JSString)
+import GHCJS.DOM.Element (setAttribute, getAttribute)
+
+#ifdef GHCJS_DOM_DEBUG
+
+type DomHasCallStack = (HasCallStack :: Constraint)
+debugEnabled :: Bool
+debugEnabled = True
+
+#else
+
+type DomHasCallStack = (() :: Constraint)
+
+debugEnabled :: Bool
+debugEnabled = False
+
+#endif
+
+cachedStacks :: IORef (Map String Int, Map Int [(String, SrcLoc)])
+cachedStacks = unsafePerformIO $ newIORef (mempty, mempty)
+{-# NOINLINE cachedStacks #-}
+
+lookupStack :: MonadIO m => Int -> m (Maybe [(String, SrcLoc)])
+lookupStack n = do
+    (_, intToStack) <- liftIO $ readIORef cachedStacks
+    return $ M.lookup n intToStack
+
+getElementStack :: MonadDOM m => Element -> m (Maybe [(String, SrcLoc)])
+getElementStack e =
+    getAttribute e ("hs-creator" :: JSString) >>= \case
+        Just a -> case readMaybe a of
+            Just n -> lookupStack n
+            Nothing -> return Nothing
+        Nothing -> return Nothing
+
+cacheStack :: MonadIO m => [(String, SrcLoc)] -> m Int
+cacheStack cs = do
+    let csString = show cs
+    liftIO $ atomicModifyIORef' cachedStacks $ \(stackToInt, intToStack) ->
+        case M.lookup csString stackToInt of
+            Just n -> ((stackToInt, intToStack), n)
+            Nothing ->
+                let n = M.size stackToInt in
+                ((M.insert csString n stackToInt, M.insert n cs intToStack), n)
+
+
diff --git a/src/GHCJS/DOM/Document.hs b/src/GHCJS/DOM/Document.hs
new file mode 100644
--- /dev/null
+++ b/src/GHCJS/DOM/Document.hs
@@ -0,0 +1,102 @@
+{-# LANGUAGE CPP #-}
+{-# LANGUAGE PackageImports #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE ConstraintKinds #-}
+module GHCJS.DOM.Document (
+    module Export
+  , createElement
+  , createElement_
+  , createElementNS
+  , createElementNS_
+) where
+
+#ifdef GHCJS_DOM_DEBUG
+
+import Control.Monad (void)
+import Control.Monad.IO.Class (MonadIO, liftIO)
+import Data.IORef (atomicModifyIORef', IORef, newIORef, readIORef)
+import GHC.Stack
+       (SrcLoc, CallStack, callStack, getCallStack, HasCallStack)
+import System.IO.Unsafe (unsafePerformIO)
+import Text.Read (readMaybe)
+
+import GHCJS.DOM.Types (Element(..), MonadDOM, ToJSString, JSString)
+import GHCJS.DOM.Debug.Internal (cacheStack)
+import GHCJS.DOM.Element (setAttribute, getAttribute)
+#ifdef  MIN_VERSION_ghcjs_dom_javascript
+import qualified "ghcjs-dom-javascript" GHCJS.DOM.Document as Raw (createElement, createElement_, createElementNS, createElementNS_)
+import "ghcjs-dom-javascript" GHCJS.DOM.Document as Export hiding (createElement, createElement_, createElementNS, createElementNS_)
+#else
+#ifdef  MIN_VERSION_ghcjs_dom_jsffi
+import qualified "ghcjs-dom-jsffi" GHCJS.DOM.Document as Raw (createElement, createElement_, createElementNS, createElementNS_)
+import "ghcjs-dom-jsffi" GHCJS.DOM.Document as Export hiding (createElement, createElement_, createElementNS, createElementNS_)
+#else
+#if __GLASGOW_HASKELL__ >= 900
+import qualified "ghcjs-dom-jsaddle" GHCJS.DOM.Document as Raw (createElement, createElement_, createElementNS, createElementNS_)
+import "ghcjs-dom-jsaddle" GHCJS.DOM.Document as Export hiding (createElement, createElement_, createElementNS, createElementNS_)
+#else
+import qualified "jsaddle-dom" GHCJS.DOM.Document as Raw (createElement, createElement_, createElementNS, createElementNS_)
+import "jsaddle-dom" GHCJS.DOM.Document as Export hiding (createElement, createElement_, createElementNS, createElementNS_)
+#endif
+#endif
+#endif
+
+
+createElement
+    :: (MonadDOM m, IsDocument doc, ToJSString localName, HasCallStack)
+    => doc
+    -> localName
+    -> m Element
+createElement doc localName = do
+    e <- Raw.createElement doc localName
+    let cs = getCallStack callStack
+    setAttribute e ("hs-creator"::JSString) . show =<< cacheStack cs
+    return e
+
+createElement_
+    :: (MonadDOM m, IsDocument doc, ToJSString localName, HasCallStack)
+    => doc
+    -> localName
+    -> m ()
+createElement_ doc localName = void $ createElement doc localName
+
+createElementNS
+    :: (MonadDOM m, IsDocument doc, ToJSString namespaceURI, ToJSString qualifiedName, HasCallStack)
+    => doc
+    -> Maybe namespaceURI
+    -> qualifiedName
+    -> m Element
+createElementNS doc namespaceURI qualifiedName = do
+    e <- Raw.createElementNS doc namespaceURI qualifiedName
+    setAttribute e ("haskell-stack"::JSString) . show =<< cacheStack (getCallStack callStack)
+    return e
+
+createElementNS_
+    :: (MonadDOM m, IsDocument doc, ToJSString namespaceURI, ToJSString qualifiedName, HasCallStack)
+    => doc
+    -> Maybe namespaceURI
+    -> qualifiedName
+    -> m ()
+createElementNS_ doc namespaceURI qualifiedName = void $ createElementNS doc namespaceURI qualifiedName
+
+#else
+
+#ifdef MIN_VERSION_ghcjs_dom_javascript
+import "ghcjs-dom-javascript" GHCJS.DOM.Document (createElement, createElement_, createElementNS, createElementNS_)
+import "ghcjs-dom-javascript" GHCJS.DOM.Document as Export hiding (createElement, createElement_, createElementNS, createElementNS_)
+#else
+#ifdef MIN_VERSION_ghcjs_dom_jsffi
+import "ghcjs-dom-jsffi" GHCJS.DOM.Document (createElement, createElement_, createElementNS, createElementNS_)
+import "ghcjs-dom-jsffi" GHCJS.DOM.Document as Export hiding (createElement, createElement_, createElementNS, createElementNS_)
+#else
+#if __GLASGOW_HASKELL__ >= 900
+import "ghcjs-dom-jsaddle" GHCJS.DOM.Document (createElement, createElement_, createElementNS, createElementNS_)
+import "ghcjs-dom-jsaddle" GHCJS.DOM.Document as Export hiding (createElement, createElement_, createElementNS, createElementNS_)
+#else
+import "jsaddle-dom" GHCJS.DOM.Document (createElement, createElement_, createElementNS, createElementNS_)
+import "jsaddle-dom" GHCJS.DOM.Document as Export hiding (createElement, createElement_, createElementNS, createElementNS_)
+#endif
+#endif
+#endif
+
+#endif
