@@ -137,7 +137,7 @@ import GHCJS.DOM.Node (appendChild_, getOwnerDocumentUnchecked, getParentNodeUnc
137import qualified GHCJS.DOM.Node as DOM (insertBefore_)
137import qualified GHCJS.DOM.Node as DOM (insertBefore_)
138import GHCJS.DOM.Types
138import GHCJS.DOM.Types
139 (liftJSM, askJSM, runJSM, JSM, MonadJSM(..),
139 (liftJSM, askJSM, runJSM, JSM, MonadJSM(..),
140− FocusEvent, IsHTMLElement, IsEvent, IsNode, KeyboardEvent, Node,
140+ FocusEvent, IsElement, IsEvent, IsNode, KeyboardEvent, Node,
141 ToDOMString, TouchEvent, WheelEvent, uncheckedCastTo, ClipboardEvent)
141 ToDOMString, TouchEvent, WheelEvent, uncheckedCastTo, ClipboardEvent)
142import qualified GHCJS.DOM.Types as DOM
142import qualified GHCJS.DOM.Types as DOM
143import GHCJS.DOM.UIEvent
143import GHCJS.DOM.UIEvent
@@ -314,7 +314,7 @@ wrap e cfg = do
314 Just ns -> maybe (removeAttributeNS e (Just ns) n) (setAttributeNS e (Just ns) n) mv
314 Just ns -> maybe (removeAttributeNS e (Just ns) n) (setAttributeNS e (Just ns) n) mv
315 eventTriggerRefs :: DMap EventName (EventFilterTriggerRef t er) <- liftJSM $ fmap DMap.fromList $ forM (DMap.toList $ _ghcjsEventSpec_filters $ _rawElementConfig_eventSpec cfg) $ \(en :=> GhcjsEventFilter f) -> do
315 eventTriggerRefs :: DMap EventName (EventFilterTriggerRef t er) <- liftJSM $ fmap DMap.fromList $ forM (DMap.toList $ _ghcjsEventSpec_filters $ _rawElementConfig_eventSpec cfg) $ \(en :=> GhcjsEventFilter f) -> do
316 triggerRef <- liftIO $ newIORef Nothing
316 triggerRef <- liftIO $ newIORef Nothing
317− _ <- elementOnEventName en e $ do
317+ _ <- elementOnEventName en e $ do --TODO: Something safer than this cast
318 evt <- DOM.event
318 evt <- DOM.event
319 (flags, k) <- liftJSM $ f $ GhcjsDomEvent evt
319 (flags, k) <- liftJSM $ f $ GhcjsDomEvent evt
320 when (_eventFlags_preventDefault flags) $ withIsEvent en DOM.preventDefault
320 when (_eventFlags_preventDefault flags) $ withIsEvent en DOM.preventDefault
@@ -350,10 +350,10 @@ wrap e cfg = do
352{-# INLINABLE makeElement #-}
352{-# INLINABLE makeElement #-}
353−makeElement :: forall er t m a. SupportsImmediateDomBuilder t m => Text -> ElementConfig er t (ImmediateDomBuilderT t m) -> ImmediateDomBuilderT t m a -> ImmediateDomBuilderT t m ((Element er GhcjsDomSpace t, a), DOM.HTMLElement)
353+makeElement :: forall er t m a. SupportsImmediateDomBuilder t m => Text -> ElementConfig er t (ImmediateDomBuilderT t m) -> ImmediateDomBuilderT t m a -> ImmediateDomBuilderT t m ((Element er GhcjsDomSpace t, a), DOM.Element)
354makeElement elementTag cfg child = do
354makeElement elementTag cfg child = do
355 doc <- askDocument
355 doc <- askDocument
356− e <- liftJSM $ uncheckedCastTo DOM.HTMLElement <$> case cfg ^. namespace of
356+ e <- liftJSM $ uncheckedCastTo DOM.Element <$> case cfg ^. namespace of
357 Nothing -> createElement doc elementTag
357 Nothing -> createElement doc elementTag
358 Just ens -> createElementNS doc (Just ens) elementTag
358 Just ens -> createElementNS doc (Just ens) elementTag
359 ImmediateDomBuilderT $ iforM_ (cfg ^. initialAttributes) $ \(AttributeName mAttrNamespace n) v -> case mAttrNamespace of
359 ImmediateDomBuilderT $ iforM_ (cfg ^. initialAttributes) $ \(AttributeName mAttrNamespace n) v -> case mAttrNamespace of
@@ -377,7 +377,7 @@ data GhcjsDomSpace
377instance DomSpace GhcjsDomSpace where
377instance DomSpace GhcjsDomSpace where
378 type EventSpec GhcjsDomSpace = GhcjsEventSpec
378 type EventSpec GhcjsDomSpace = GhcjsEventSpec
379 type RawTextNode GhcjsDomSpace = DOM.Text
379 type RawTextNode GhcjsDomSpace = DOM.Text
380− type RawElement GhcjsDomSpace = DOM.HTMLElement
380+ type RawElement GhcjsDomSpace = DOM.Element
381 type RawFile GhcjsDomSpace = DOM.File
381 type RawFile GhcjsDomSpace = DOM.File
382 type RawInputElement GhcjsDomSpace = DOM.HTMLInputElement
382 type RawInputElement GhcjsDomSpace = DOM.HTMLInputElement
383 type RawTextAreaElement GhcjsDomSpace = DOM.HTMLTextAreaElement
383 type RawTextAreaElement GhcjsDomSpace = DOM.HTMLTextAreaElement
@@ -427,7 +427,7 @@ instance er ~ EventResult => Default (GhcjsEventSpec er) where
427 { _ghcjsEventSpec_filters = mempty
427 { _ghcjsEventSpec_filters = mempty
428 , _ghcjsEventSpec_handler = GhcjsEventHandler $ \(en, GhcjsDomEvent evt) -> do
428 , _ghcjsEventSpec_handler = GhcjsEventHandler $ \(en, GhcjsDomEvent evt) -> do
429 t :: DOM.EventTarget <- withIsEvent en $ Event.getTarget evt --TODO: Rework this; defaultDomEventHandler shouldn't need to take this as an argument
429 t :: DOM.EventTarget <- withIsEvent en $ Event.getTarget evt --TODO: Rework this; defaultDomEventHandler shouldn't need to take this as an argument
430− let e = uncheckedCastTo DOM.HTMLElement t
430+ let e = uncheckedCastTo DOM.Element t
431 runReaderT (defaultDomEventHandler e en) evt
431 runReaderT (defaultDomEventHandler e en) evt
@@ -952,7 +952,7 @@ type family EventType en where
952 EventType 'TouchcancelTag = TouchEvent
952 EventType 'TouchcancelTag = TouchEvent
954{-# INLINABLE defaultDomEventHandler #-}
954{-# INLINABLE defaultDomEventHandler #-}
955−defaultDomEventHandler :: IsHTMLElement e => e -> EventName en -> EventM e (EventType en) (Maybe (EventResult en))
955+defaultDomEventHandler :: IsElement e => e -> EventName en -> EventM e (EventType en) (Maybe (EventResult en))
956defaultDomEventHandler e evt = fmap (Just . EventResult) $ case evt of
956defaultDomEventHandler e evt = fmap (Just . EventResult) $ case evt of
957 Click -> return ()
957 Click -> return ()
958 Dblclick -> getMouseEventCoords
958 Dblclick -> getMouseEventCoords
@@ -1150,9 +1150,17 @@ showEventName en = case en of
1150 Touchend -> "Touchend"
1150 Touchend -> "Touchend"
1151 Touchcancel -> "Touchcancel"
1151 Touchcancel -> "Touchcancel"
1153+--TODO: Get rid of this hack
1154+-- ElementEventTarget is here to allow us to treat SVG and HTML elements as the same thing; without it, we'll break any existing SVG code.
1155+newtype ElementEventTarget = ElementEventTarget DOM.Element deriving (DOM.IsGObject, DOM.ToJSVal, DOM.IsSlotable, DOM.IsParentNode, DOM.IsNonDocumentTypeChildNode, DOM.IsChildNode, DOM.IsAnimatable, IsNode, IsElement)
1156+instance DOM.FromJSVal ElementEventTarget where
1157+ fromJSVal = fmap (fmap ElementEventTarget) . DOM.fromJSVal
1158+instance DOM.IsEventTarget ElementEventTarget
1159+instance DOM.IsGlobalEventHandlers ElementEventTarget
1153{-# INLINABLE elementOnEventName #-}
1161{-# INLINABLE elementOnEventName #-}
1154−elementOnEventName :: IsHTMLElement e => EventName en -> e -> EventM e (EventType en) () -> JSM (JSM ())
1162+elementOnEventName :: IsElement e => EventName en -> e -> EventM e (EventType en) () -> JSM (JSM ())
1155−elementOnEventName en e = case en of
1163+elementOnEventName en e_ = let e = ElementEventTarget (DOM.toElement e_) in case en of
1156 Abort -> on e Events.abort
1164 Abort -> on e Events.abort
1157 Blur -> on e Events.blur
1165 Blur -> on e Events.blur
1158 Change -> on e Events.change
1166 Change -> on e Events.change