on develop help sign in
Merge remote-tracking branch 'origin/ghcjs-dom-0.8' into HEAD
8ac807cRyan Trinkle
reflex-dom-core/reflex-dom-core.cabal+2−2
@@ -41,7 +41,7 @@ flag build-examples
41library
41library
42 hs-source-dirs: src
42 hs-source-dirs: src
43 build-depends:
43 build-depends:
44− aeson >= 0.8 && < 1.1,
44+ aeson >= 0.8 && < 1.2,
45 base >= 4.7 && < 4.11,
45 base >= 4.7 && < 4.11,
46 bifunctors >= 4.2 && < 6,
46 bifunctors >= 4.2 && < 6,
47 bimap >= 0.3 && < 0.4,
47 bimap >= 0.3 && < 0.4,
@@ -55,7 +55,7 @@ library
55 dependent-sum-template >= 0.0.0.4 && < 0.1,
55 dependent-sum-template >= 0.0.0.4 && < 0.1,
56 directory >= 1.2 && < 1.4,
56 directory >= 1.2 && < 1.4,
57 exception-transformers == 0.4.*,
57 exception-transformers == 0.4.*,
58− ghcjs-dom >= 0.7.0.4 && < 0.8,
58+ ghcjs-dom >= 0.8.0.0 && < 0.9,
59 jsaddle >=0.8.0.1 && <0.9,
59 jsaddle >=0.8.0.1 && <0.9,
60 -- keycode-0.2 has a bug on firefox
60 -- keycode-0.2 has a bug on firefox
61 keycode >= 0.2.1 && < 0.3,
61 keycode >= 0.2.1 && < 0.3,
reflex-dom-core/src/Reflex/Dom/Builder/Class.hs+1−1
@@ -189,7 +189,7 @@ instance (Reflex t) => Default (TextNodeConfig t) where
189 , _textNodeConfig_setContents = Nothing
189 , _textNodeConfig_setContents = Nothing
190 }
190 }
191
191
192−data TextNode d t = TextNode
192+newtype TextNode d t = TextNode
193 { _textNode_raw :: RawTextNode d
193 { _textNode_raw :: RawTextNode d
194 }
194 }
195
195
reflex-dom-core/src/Reflex/Dom/Builder/Class/Events.hs+4−4
@@ -117,10 +117,10 @@ newtype EventResult en = EventResult { unEventResult :: EventResultType en }
117type family EventResultType (en :: EventTag) :: * where
117type family EventResultType (en :: EventTag) :: * where
118 EventResultType 'ClickTag = ()
118 EventResultType 'ClickTag = ()
119 EventResultType 'DblclickTag = (Int, Int)
119 EventResultType 'DblclickTag = (Int, Int)
120− EventResultType 'KeypressTag = Int
120+ EventResultType 'KeypressTag = Word
121− EventResultType 'KeydownTag = Int
121+ EventResultType 'KeydownTag = Word
122− EventResultType 'KeyupTag = Int
122+ EventResultType 'KeyupTag = Word
123− EventResultType 'ScrollTag = Int
123+ EventResultType 'ScrollTag = Double
124 EventResultType 'MousemoveTag = (Int, Int)
124 EventResultType 'MousemoveTag = (Int, Int)
125 EventResultType 'MousedownTag = (Int, Int)
125 EventResultType 'MousedownTag = (Int, Int)
126 EventResultType 'MouseupTag = (Int, Int)
126 EventResultType 'MouseupTag = (Int, Int)
reflex-dom-core/src/Reflex/Dom/Builder/Immediate.hs+138−139
@@ -118,10 +118,11 @@ import Data.Text (Text)
118import qualified Data.Text as T
118import qualified Data.Text as T
119import qualified GHCJS.DOM as DOM
119import qualified GHCJS.DOM as DOM
120import GHCJS.DOM.RequestAnimationFrameCallback
120import GHCJS.DOM.RequestAnimationFrameCallback
121−import GHCJS.DOM.Document (Document, createDocumentFragmentUnchecked, createElementUnchecked, createElementNSUnchecked, createTextNodeUnchecked)
121+import GHCJS.DOM.Document (Document, createDocumentFragment, createElement, createElementNS, createTextNode)
122import GHCJS.DOM.Element (getScrollTop, removeAttribute, removeAttributeNS, setAttribute, setAttributeNS)
122import GHCJS.DOM.Element (getScrollTop, removeAttribute, removeAttributeNS, setAttribute, setAttributeNS)
123import qualified GHCJS.DOM.Element as Element
123import qualified GHCJS.DOM.Element as Element
124import qualified GHCJS.DOM.Event as Event
124import qualified GHCJS.DOM.Event as Event
125+import qualified GHCJS.DOM.GlobalEventHandlers as Events
125import GHCJS.DOM.EventM (EventM, event, on)
126import GHCJS.DOM.EventM (EventM, event, on)
126import qualified GHCJS.DOM.EventM as DOM
127import qualified GHCJS.DOM.EventM as DOM
127import qualified GHCJS.DOM.FileList as FileList
128import qualified GHCJS.DOM.FileList as FileList
@@ -136,10 +137,11 @@ import GHCJS.DOM.Node (appendChild_, getOwnerDocumentUnchecked, getParentNodeUnc
136import qualified GHCJS.DOM.Node as DOM (insertBefore_)
137import qualified GHCJS.DOM.Node as DOM (insertBefore_)
137import GHCJS.DOM.Types
138import GHCJS.DOM.Types
138 (liftJSM, askJSM, runJSM, JSM, MonadJSM(..),
139 (liftJSM, askJSM, runJSM, JSM, MonadJSM(..),
139− FocusEvent, IsElement, IsEvent, IsNode, KeyboardEvent, Node,
140+ FocusEvent, IsHTMLElement, IsEvent, IsNode, KeyboardEvent, Node,
140− ToDOMString, TouchEvent, WheelEvent, uncheckedCastTo)
141+ ToDOMString, TouchEvent, WheelEvent, uncheckedCastTo, ClipboardEvent)
141import qualified GHCJS.DOM.Types as DOM
142import qualified GHCJS.DOM.Types as DOM
142import GHCJS.DOM.UIEvent
143import GHCJS.DOM.UIEvent
144+import GHCJS.DOM.KeyboardEvent as KeyboardEvent
143import qualified GHCJS.DOM.Window as Window
145import qualified GHCJS.DOM.Window as Window
144import Language.Javascript.JSaddle (call, eval)
146import Language.Javascript.JSaddle (call, eval)
145
147
@@ -205,7 +207,7 @@ runImmediateDomBuilderT (ImmediateDomBuilderT a) env eventChan = flip runTrigger
205 v <- synchronously x
207 v <- synchronously x
206 _ <- liftIO $ f v
208 _ <- liftIO $ f v
207 freeRequestAnimationFrameCallback cb
209 freeRequestAnimationFrameCallback cb
208− _ <- Window.requestAnimationFrame win $ Just cb
210+ _ <- Window.requestAnimationFrame win cb
209 return ()
211 return ()
210
212
211{-# INLINABLE askDocument #-}
213{-# INLINABLE askDocument #-}
@@ -227,14 +229,14 @@ localEnv f = ImmediateDomBuilderT . local f . unImmediateDomBuilderT
227append :: (IsNode n, MonadJSM m) => n -> ImmediateDomBuilderT t m ()
229append :: (IsNode n, MonadJSM m) => n -> ImmediateDomBuilderT t m ()
228append n = do
230append n = do
229 p <- askParent
231 p <- askParent
230− liftJSM $ appendChild_ p $ Just n
232+ liftJSM $ appendChild_ p n
231 return ()
233 return ()
232
234
233{-# INLINABLE textNodeInternal #-}
235{-# INLINABLE textNodeInternal #-}
234textNodeInternal :: (MonadJSM m, ToDOMString contents) => contents -> ImmediateDomBuilderT t m DOM.Text
236textNodeInternal :: (MonadJSM m, ToDOMString contents) => contents -> ImmediateDomBuilderT t m DOM.Text
235textNodeInternal t = do
237textNodeInternal t = do
236 doc <- askDocument
238 doc <- askDocument
237− n <- liftJSM $ createTextNodeUnchecked doc t
239+ n <- liftJSM $ createTextNode doc t
238 append n
240 append n
239 return n
241 return n
240
242
@@ -242,7 +244,7 @@ textNodeInternal t = do
242-- all nodes between s and e will be removed, but s and e will not be removed
244-- all nodes between s and e will be removed, but s and e will not be removed
243deleteBetweenExclusive :: (MonadJSM m, IsNode start, IsNode end) => start -> end -> m ()
245deleteBetweenExclusive :: (MonadJSM m, IsNode start, IsNode end) => start -> end -> m ()
244deleteBetweenExclusive s e = liftJSM $ do
246deleteBetweenExclusive s e = liftJSM $ do
245− df <- createDocumentFragmentUnchecked =<< getOwnerDocumentUnchecked s
247+ df <- createDocumentFragment =<< getOwnerDocumentUnchecked s
246 extractBetweenExclusive df s e -- In many places in ImmediateDomBuilderT, we assume that things always have a parent; by adding them to this DocumentFragment, we maintain that invariant
248 extractBetweenExclusive df s e -- In many places in ImmediateDomBuilderT, we assume that things always have a parent; by adding them to this DocumentFragment, we maintain that invariant
247
249
248-- | s and e must both be children of the same node and s must precede e; all
250-- | s and e must both be children of the same node and s must precede e; all
@@ -267,7 +269,7 @@ extractBetweenExclusive df s e = liftJSM $ do
267{-# INLINABLE deleteUpTo #-}
269{-# INLINABLE deleteUpTo #-}
268deleteUpTo :: (MonadJSM m, IsNode start, IsNode end) => start -> end -> m ()
270deleteUpTo :: (MonadJSM m, IsNode start, IsNode end) => start -> end -> m ()
269deleteUpTo s e = do
271deleteUpTo s e = do
270− df <- createDocumentFragmentUnchecked =<< getOwnerDocumentUnchecked s
272+ df <- createDocumentFragment =<< getOwnerDocumentUnchecked s
271 extractUpTo df s e -- In many places in ImmediateDomBuilderT, we assume that things always have a parent; by adding them to this DocumentFragment, we maintain that invariant
273 extractUpTo df s e -- In many places in ImmediateDomBuilderT, we assume that things always have a parent; by adding them to this DocumentFragment, we maintain that invariant
272
274
273extractUpTo :: (MonadJSM m, IsNode start, IsNode end) => DOM.DocumentFragment -> start -> end -> m ()
275extractUpTo :: (MonadJSM m, IsNode start, IsNode end) => DOM.DocumentFragment -> start -> end -> m ()
@@ -298,7 +300,7 @@ collectUpTo s e = do
298collectUpToGivenParent :: (MonadJSM m, IsNode parent, IsNode start, IsNode end) => parent -> start -> end -> m DOM.DocumentFragment
300collectUpToGivenParent :: (MonadJSM m, IsNode parent, IsNode start, IsNode end) => parent -> start -> end -> m DOM.DocumentFragment
299collectUpToGivenParent currentParent s e = do
301collectUpToGivenParent currentParent s e = do
300 doc <- getOwnerDocumentUnchecked currentParent
302 doc <- getOwnerDocumentUnchecked currentParent
301− df <- createDocumentFragmentUnchecked doc
303+ df <- createDocumentFragment doc
302 extractUpTo df s e
304 extractUpTo df s e
303 return df
305 return df
304
306
@@ -348,12 +350,12 @@ wrap e cfg = do
348 }
350 }
349
351
350{-# INLINABLE makeElement #-}
352{-# INLINABLE makeElement #-}
351−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)
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)
352makeElement elementTag cfg child = do
354makeElement elementTag cfg child = do
353 doc <- askDocument
355 doc <- askDocument
354− e <- liftJSM $ case cfg ^. namespace of
356+ e <- liftJSM $ uncheckedCastTo DOM.HTMLElement <$> case cfg ^. namespace of
355− Nothing -> createElementUnchecked doc (Just elementTag)
357+ Nothing -> createElement doc elementTag
356− Just ens -> createElementNSUnchecked doc (Just ens) (Just elementTag)
358+ Just ens -> createElementNS doc (Just ens) elementTag
357 ImmediateDomBuilderT $ iforM_ (cfg ^. initialAttributes) $ \(AttributeName mAttrNamespace n) v -> case mAttrNamespace of
359 ImmediateDomBuilderT $ iforM_ (cfg ^. initialAttributes) $ \(AttributeName mAttrNamespace n) v -> case mAttrNamespace of
358 Nothing -> lift $ setAttribute e n v
360 Nothing -> lift $ setAttribute e n v
359 Just ans -> lift $ setAttributeNS e (Just ans) n v
361 Just ans -> lift $ setAttributeNS e (Just ans) n v
@@ -375,7 +377,7 @@ data GhcjsDomSpace
375instance DomSpace GhcjsDomSpace where
377instance DomSpace GhcjsDomSpace where
376 type EventSpec GhcjsDomSpace = GhcjsEventSpec
378 type EventSpec GhcjsDomSpace = GhcjsEventSpec
377 type RawTextNode GhcjsDomSpace = DOM.Text
379 type RawTextNode GhcjsDomSpace = DOM.Text
378− type RawElement GhcjsDomSpace = DOM.Element
380+ type RawElement GhcjsDomSpace = DOM.HTMLElement
379 type RawFile GhcjsDomSpace = DOM.File
381 type RawFile GhcjsDomSpace = DOM.File
380 type RawInputElement GhcjsDomSpace = DOM.HTMLInputElement
382 type RawInputElement GhcjsDomSpace = DOM.HTMLInputElement
381 type RawTextAreaElement GhcjsDomSpace = DOM.HTMLTextAreaElement
383 type RawTextAreaElement GhcjsDomSpace = DOM.HTMLTextAreaElement
@@ -424,8 +426,8 @@ instance er ~ EventResult => Default (GhcjsEventSpec er) where
424 def = GhcjsEventSpec
426 def = GhcjsEventSpec
425 { _ghcjsEventSpec_filters = mempty
427 { _ghcjsEventSpec_filters = mempty
426 , _ghcjsEventSpec_handler = GhcjsEventHandler $ \(en, GhcjsDomEvent evt) -> do
428 , _ghcjsEventSpec_handler = GhcjsEventHandler $ \(en, GhcjsDomEvent evt) -> do
427− t :: DOM.EventTarget <- withIsEvent en $ Event.getTargetUnchecked 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
428− let e = uncheckedCastTo DOM.Element t
430+ let e = uncheckedCastTo DOM.HTMLElement t
429 runReaderT (defaultDomEventHandler e en) evt
431 runReaderT (defaultDomEventHandler e en) evt
430 }
432 }
431
433
@@ -456,7 +458,7 @@ instance SupportsImmediateDomBuilder t m => DomBuilder t (ImmediateDomBuilderT t
456 , valueChangedByUI
458 , valueChangedByUI
457 ]
459 ]
458 Input.setChecked domInputElement $ _inputElementConfig_initialChecked cfg
460 Input.setChecked domInputElement $ _inputElementConfig_initialChecked cfg
459− checkedChangedByUI <- wrapDomEvent domInputElement (`on` Element.click) $ do
461+ checkedChangedByUI <- wrapDomEvent domInputElement (`on` Events.click) $ do
460 Input.getChecked domInputElement
462 Input.getChecked domInputElement
461 checkedChangedBySetChecked <- case _inputElementConfig_setChecked cfg of
463 checkedChangedBySetChecked <- case _inputElementConfig_setChecked cfg of
462 Nothing -> return never
464 Nothing -> return never
@@ -475,7 +477,7 @@ instance SupportsImmediateDomBuilder t m => DomBuilder t (ImmediateDomBuilderT t
475 [ False <$ Reflex.select (_element_events e) (WrapArg Blur)
477 [ False <$ Reflex.select (_element_events e) (WrapArg Blur)
476 , True <$ Reflex.select (_element_events e) (WrapArg Focus)
478 , True <$ Reflex.select (_element_events e) (WrapArg Focus)
477 ]
479 ]
478− files <- holdDyn mempty <=< wrapDomEvent domInputElement (`on` Element.change) $ do
480+ files <- holdDyn mempty <=< wrapDomEvent domInputElement (`on` Events.change) $ do
479 mfiles <- Input.getFiles domInputElement
481 mfiles <- Input.getFiles domInputElement
480 let getMyFiles xs = fmap catMaybes . mapM (FileList.item xs) . flip take [0..] . fromIntegral =<< FileList.getLength xs
482 let getMyFiles xs = fmap catMaybes . mapM (FileList.item xs) . flip take [0..] . fromIntegral =<< FileList.getLength xs
481 maybe (return []) getMyFiles mfiles
483 maybe (return []) getMyFiles mfiles
@@ -518,14 +520,14 @@ instance SupportsImmediateDomBuilder t m => DomBuilder t (ImmediateDomBuilderT t
518 selectElement cfg child = do
520 selectElement cfg child = do
519 ((e, result), domElement) <- makeElement "select" (cfg ^. selectElementConfig_elementConfig) child
521 ((e, result), domElement) <- makeElement "select" (cfg ^. selectElementConfig_elementConfig) child
520 let domSelectElement = uncheckedCastTo DOM.HTMLSelectElement domElement
522 let domSelectElement = uncheckedCastTo DOM.HTMLSelectElement domElement
521− Select.setValue domSelectElement $ Just (cfg ^. selectElementConfig_initialValue)
523+ Select.setValue domSelectElement $ cfg ^. selectElementConfig_initialValue
522− Just v0 <- Select.getValue domSelectElement
524+ v0 <- Select.getValue domSelectElement
523− let getMyValue = fromMaybe "" <$> Select.getValue domSelectElement
525+ let getMyValue = Select.getValue domSelectElement
524 valueChangedByUI <- requestDomAction $ liftJSM getMyValue <$ Reflex.select (_element_events e) (WrapArg Change)
526 valueChangedByUI <- requestDomAction $ liftJSM getMyValue <$ Reflex.select (_element_events e) (WrapArg Change)
525 valueChangedBySetValue <- case _selectElementConfig_setValue cfg of
527 valueChangedBySetValue <- case _selectElementConfig_setValue cfg of
526 Nothing -> return never
528 Nothing -> return never
527 Just eSetValue -> requestDomAction $ ffor eSetValue $ \v' -> do
529 Just eSetValue -> requestDomAction $ ffor eSetValue $ \v' -> do
528− Select.setValue domSelectElement $ Just v'
530+ Select.setValue domSelectElement v'
529 getMyValue -- We get the value after setting it in case the browser has mucked with it somehow
531 getMyValue -- We get the value after setting it in case the browser has mucked with it somehow
530 v <- holdDyn v0 $ leftmost
532 v <- holdDyn v0 $ leftmost
531 [ valueChangedBySetValue
533 [ valueChangedBySetValue
@@ -579,7 +581,7 @@ extractFragment fragment = do
579instance SupportsImmediateDomBuilder t m => MountableDomBuilder t (ImmediateDomBuilderT t m) where
581instance SupportsImmediateDomBuilder t m => MountableDomBuilder t (ImmediateDomBuilderT t m) where
580 type DomFragment (ImmediateDomBuilderT t m) = ImmediateDomFragment
582 type DomFragment (ImmediateDomBuilderT t m) = ImmediateDomFragment
581 buildDomFragment w = do
583 buildDomFragment w = do
582− df <- createDocumentFragmentUnchecked =<< askDocument
584+ df <- createDocumentFragment =<< askDocument
583 result <- flip localEnv w $ \env -> env
585 result <- flip localEnv w $ \env -> env
584 { _immediateDomBuilderEnv_parent = toNode df
586 { _immediateDomBuilderEnv_parent = toNode df
585 }
587 }
@@ -589,7 +591,7 @@ instance SupportsImmediateDomBuilder t m => MountableDomBuilder t (ImmediateDomB
589 parent <- askParent
591 parent <- askParent
590 extractFragment fragment
592 extractFragment fragment
591 before <- textNodeInternal ("" :: Text)
593 before <- textNodeInternal ("" :: Text)
592− appendChild_ parent $ Just $ _immediateDomFragment_document fragment
594+ appendChild_ parent $ _immediateDomFragment_document fragment
593 after <- textNodeInternal ("" :: Text)
595 after <- textNodeInternal ("" :: Text)
594 xs <- foldDyn (\new (previous, _) -> (new, Just previous)) (fragment, Nothing) setFragment
596 xs <- foldDyn (\new (previous, _) -> (new, Just previous)) (fragment, Nothing) setFragment
595 requestDomAction_ $ ffor (updated xs) $ \(childFragment, Just previousFragment) -> do
597 requestDomAction_ $ ffor (updated xs) $ \(childFragment, Just previousFragment) -> do
@@ -617,7 +619,7 @@ instance (Reflex t, MonadAdjust t m, MonadJSM m, MonadHold t m, MonadFix m, Prim
617 when (new == 0) $ _immediateDomBuilderEnv_commitAction initialEnv
619 when (new == 0) $ _immediateDomBuilderEnv_commitAction initialEnv
618 -- We draw 'after' in this roundabout way to avoid using MonadFix
620 -- We draw 'after' in this roundabout way to avoid using MonadFix
619 doc <- askDocument
621 doc <- askDocument
620− after <- createTextNodeUnchecked doc ("" :: Text)
622+ after <- createTextNode doc ("" :: Text)
621 let drawInitialChild = do
623 let drawInitialChild = do
622 unreadyChildren <- liftIO $ newIORef 0
624 unreadyChildren <- liftIO $ newIORef 0
623 let f = do
625 let f = do
@@ -634,7 +636,7 @@ instance (Reflex t, MonadAdjust t m, MonadJSM m, MonadHold t m, MonadFix m, Prim
634 return result
636 return result
635 a'' <- numberOccurrences a'
637 a'' <- numberOccurrences a'
636 (result0, child') <- ImmediateDomBuilderT $ lift $ runWithReplace drawInitialChild $ ffor a'' $ \(cohortId, child) -> do
638 (result0, child') <- ImmediateDomBuilderT $ lift $ runWithReplace drawInitialChild $ ffor a'' $ \(cohortId, child) -> do
637− df <- createDocumentFragmentUnchecked doc
639+ df <- createDocumentFragment doc
638 unreadyChildren <- liftIO $ newIORef 0
640 unreadyChildren <- liftIO $ newIORef 0
639 let commitAction = do
641 let commitAction = do
640 c <- liftIO $ readIORef currentCohort
642 c <- liftIO $ readIORef currentCohort
@@ -832,7 +834,7 @@ drawChildUpdate :: (MonadIO m, MonadJSM m)
832drawChildUpdate initialEnv markReady child = do
834drawChildUpdate initialEnv markReady child = do
833 childReadyState <- liftIO $ newIORef $ ChildReadyState_Unready Nothing
835 childReadyState <- liftIO $ newIORef $ ChildReadyState_Unready Nothing
834 unreadyChildren <- liftIO $ newIORef 0
836 unreadyChildren <- liftIO $ newIORef 0
835− df <- createDocumentFragmentUnchecked $ _immediateDomBuilderEnv_document initialEnv
837+ df <- createDocumentFragment $ _immediateDomBuilderEnv_document initialEnv
836 (placeholder, result) <- runReaderT (unImmediateDomBuilderT $ (,) <$> textNodeInternal ("" :: Text) <*> child) $ initialEnv
838 (placeholder, result) <- runReaderT (unImmediateDomBuilderT $ (,) <$> textNodeInternal ("" :: Text) <*> child) $ initialEnv
837 { _immediateDomBuilderEnv_parent = toNode df
839 { _immediateDomBuilderEnv_parent = toNode df
838 , _immediateDomBuilderEnv_unreadyChildren = unreadyChildren
840 , _immediateDomBuilderEnv_unreadyChildren = unreadyChildren
@@ -853,7 +855,7 @@ mkHasFocus e = do
853insertBefore :: (MonadJSM m, IsNode new, IsNode existing) => new -> existing -> m ()
855insertBefore :: (MonadJSM m, IsNode new, IsNode existing) => new -> existing -> m ()
854insertBefore new existing = do
856insertBefore new existing = do
855 p <- getParentNodeUnchecked existing
857 p <- getParentNodeUnchecked existing
856− DOM.insertBefore_ p (Just new) (Just existing) -- If there's no parent, that means we've been removed from the DOM; this should not happen if the we're removing ourselves from the performEvent properly
858+ DOM.insertBefore_ p new (Just existing) -- If there's no parent, that means we've been removed from the DOM; this should not happen if the we're removing ourselves from the performEvent properly
857
859
858instance PerformEvent t m => PerformEvent t (ImmediateDomBuilderT t m) where
860instance PerformEvent t m => PerformEvent t (ImmediateDomBuilderT t m) where
859 type Performable (ImmediateDomBuilderT t m) = Performable m
861 type Performable (ImmediateDomBuilderT t m) = Performable m
@@ -935,12 +937,12 @@ type family EventType en where
935 EventType 'SelectTag = UIEvent
937 EventType 'SelectTag = UIEvent
936 EventType 'SubmitTag = DOM.Event
938 EventType 'SubmitTag = DOM.Event
937 EventType 'WheelTag = WheelEvent
939 EventType 'WheelTag = WheelEvent
938− EventType 'BeforecutTag = DOM.Event
940+ EventType 'BeforecutTag = ClipboardEvent
939− EventType 'CutTag = DOM.Event
941+ EventType 'CutTag = ClipboardEvent
940− EventType 'BeforecopyTag = DOM.Event
942+ EventType 'BeforecopyTag = ClipboardEvent
941− EventType 'CopyTag = DOM.Event
943+ EventType 'CopyTag = ClipboardEvent
942− EventType 'BeforepasteTag = DOM.Event
944+ EventType 'BeforepasteTag = ClipboardEvent
943− EventType 'PasteTag = DOM.Event
945+ EventType 'PasteTag = ClipboardEvent
944 EventType 'ResetTag = DOM.Event
946 EventType 'ResetTag = DOM.Event
945 EventType 'SearchTag = DOM.Event
947 EventType 'SearchTag = DOM.Event
946 EventType 'SelectstartTag = DOM.Event
948 EventType 'SelectstartTag = DOM.Event
@@ -950,12 +952,12 @@ type family EventType en where
950 EventType 'TouchcancelTag = TouchEvent
952 EventType 'TouchcancelTag = TouchEvent
951
953
952{-# INLINABLE defaultDomEventHandler #-}
954{-# INLINABLE defaultDomEventHandler #-}
953−defaultDomEventHandler :: IsElement e => e -> EventName en -> EventM e (EventType en) (Maybe (EventResult en))
955+defaultDomEventHandler :: IsHTMLElement e => e -> EventName en -> EventM e (EventType en) (Maybe (EventResult en))
954defaultDomEventHandler e evt = fmap (Just . EventResult) $ case evt of
956defaultDomEventHandler e evt = fmap (Just . EventResult) $ case evt of
955 Click -> return ()
957 Click -> return ()
956 Dblclick -> getMouseEventCoords
958 Dblclick -> getMouseEventCoords
957 Keypress -> getKeyEvent
959 Keypress -> getKeyEvent
958− Scroll -> getScrollTop e
960+ Scroll -> fromIntegral <$> getScrollTop e
959 Keydown -> getKeyEvent
961 Keydown -> getKeyEvent
960 Keyup -> getKeyEvent
962 Keyup -> getKeyEvent
961 Mousemove -> getMouseEventCoords
963 Mousemove -> getMouseEventCoords
@@ -1149,104 +1151,104 @@ showEventName en = case en of
1149 Touchcancel -> "Touchcancel"
1151 Touchcancel -> "Touchcancel"
1150
1152
1151{-# INLINABLE elementOnEventName #-}
1153{-# INLINABLE elementOnEventName #-}
1152−elementOnEventName :: IsElement e => EventName en -> e -> EventM e (EventType en) () -> JSM (JSM ())
1154+elementOnEventName :: IsHTMLElement e => EventName en -> e -> EventM e (EventType en) () -> JSM (JSM ())
1153elementOnEventName en e = case en of
1155elementOnEventName en e = case en of
1154− Abort -> on e Element.abort
1156+ Abort -> on e Events.abort
1155− Blur -> on e Element.blurEvent
1157+ Blur -> on e Events.blur
1156− Change -> on e Element.change
1158+ Change -> on e Events.change
1157− Click -> on e Element.click
1159+ Click -> on e Events.click
1158− Contextmenu -> on e Element.contextMenu
1160+ Contextmenu -> on e Events.contextMenu
1159− Dblclick -> on e Element.dblClick
1161+ Dblclick -> on e Events.dblClick
1160− Drag -> on e Element.drag
1162+ Drag -> on e Events.drag
1161− Dragend -> on e Element.dragEnd
1163+ Dragend -> on e Events.dragEnd
1162− Dragenter -> on e Element.dragEnter
1164+ Dragenter -> on e Events.dragEnter
1163− Dragleave -> on e Element.dragLeave
1165+ Dragleave -> on e Events.dragLeave
1164− Dragover -> on e Element.dragOver
1166+ Dragover -> on e Events.dragOver
1165− Dragstart -> on e Element.dragStart
1167+ Dragstart -> on e Events.dragStart
1166− Drop -> on e Element.drop
1168+ Drop -> on e Events.drop
1167− Error -> on e Element.error
1169+ Error -> on e Events.error
1168− Focus -> on e Element.focusEvent
1170+ Focus -> on e Events.focus
1169− Input -> on e Element.input
1171+ Input -> on e Events.input
1170− Invalid -> on e Element.invalid
1172+ Invalid -> on e Events.invalid
1171− Keydown -> on e Element.keyDown
1173+ Keydown -> on e Events.keyDown
1172− Keypress -> on e Element.keyPress
1174+ Keypress -> on e Events.keyPress
1173− Keyup -> on e Element.keyUp
1175+ Keyup -> on e Events.keyUp
1174− Load -> on e Element.load
1176+ Load -> on e Events.load
1175− Mousedown -> on e Element.mouseDown
1177+ Mousedown -> on e Events.mouseDown
1176− Mouseenter -> on e Element.mouseEnter
1178+ Mouseenter -> on e Events.mouseEnter
1177− Mouseleave -> on e Element.mouseLeave
1179+ Mouseleave -> on e Events.mouseLeave
1178− Mousemove -> on e Element.mouseMove
1180+ Mousemove -> on e Events.mouseMove
1179− Mouseout -> on e Element.mouseOut
1181+ Mouseout -> on e Events.mouseOut
1180− Mouseover -> on e Element.mouseOver
1182+ Mouseover -> on e Events.mouseOver
1181− Mouseup -> on e Element.mouseUp
1183+ Mouseup -> on e Events.mouseUp
1182− Mousewheel -> on e Element.mouseWheel
1184+ Mousewheel -> on e Events.mouseWheel
1183− Scroll -> on e Element.scroll
1185+ Scroll -> on e Events.scroll
1184− Select -> on e Element.select
1186+ Select -> on e Events.select
1185− Submit -> on e Element.submit
1187+ Submit -> on e Events.submit
1186− Wheel -> on e Element.wheel
1188+ Wheel -> on e Events.wheel
1187 Beforecut -> on e Element.beforeCut
1189 Beforecut -> on e Element.beforeCut
1188 Cut -> on e Element.cut
1190 Cut -> on e Element.cut
1189 Beforecopy -> on e Element.beforeCopy
1191 Beforecopy -> on e Element.beforeCopy
1190 Copy -> on e Element.copy
1192 Copy -> on e Element.copy
1191 Beforepaste -> on e Element.beforePaste
1193 Beforepaste -> on e Element.beforePaste
1192 Paste -> on e Element.paste
1194 Paste -> on e Element.paste
1193− Reset -> on e Element.reset
1195+ Reset -> on e Events.reset
1194− Search -> on e Element.search
1196+ Search -> on e Events.search
1195 Selectstart -> on e Element.selectStart
1197 Selectstart -> on e Element.selectStart
1196− Touchstart -> on e Element.touchStart
1198+ Touchstart -> on e Events.touchStart
1197− Touchmove -> on e Element.touchMove
1199+ Touchmove -> on e Events.touchMove
1198− Touchend -> on e Element.touchEnd
1200+ Touchend -> on e Events.touchEnd
1199− Touchcancel -> on e Element.touchCancel
1201+ Touchcancel -> on e Events.touchCancel
1200
1202
1201{-# INLINABLE windowOnEventName #-}
1203{-# INLINABLE windowOnEventName #-}
1202windowOnEventName :: EventName en -> DOM.Window -> EventM DOM.Window (EventType en) () -> JSM (JSM ())
1204windowOnEventName :: EventName en -> DOM.Window -> EventM DOM.Window (EventType en) () -> JSM (JSM ())
1203windowOnEventName en e = case en of
1205windowOnEventName en e = case en of
1204− Abort -> on e Window.abort
1206+ Abort -> on e Events.abort
1205− Blur -> on e Window.blurEvent
1207+ Blur -> on e Events.blur
1206− Change -> on e Window.change
1208+ Change -> on e Events.change
1207− Click -> on e Window.click
1209+ Click -> on e Events.click
1208− Contextmenu -> on e Window.contextMenu
1210+ Contextmenu -> on e Events.contextMenu
1209− Dblclick -> on e Window.dblClick
1211+ Dblclick -> on e Events.dblClick
1210− Drag -> on e Window.drag
1212+ Drag -> on e Events.drag
1211− Dragend -> on e Window.dragEnd
1213+ Dragend -> on e Events.dragEnd
1212− Dragenter -> on e Window.dragEnter
1214+ Dragenter -> on e Events.dragEnter
1213− Dragleave -> on e Window.dragLeave
1215+ Dragleave -> on e Events.dragLeave
1214− Dragover -> on e Window.dragOver
1216+ Dragover -> on e Events.dragOver
1215− Dragstart -> on e Window.dragStart
1217+ Dragstart -> on e Events.dragStart
1216− Drop -> on e Window.drop
1218+ Drop -> on e Events.drop
1217− Error -> on e Window.error
1219+ Error -> on e Events.error
1218− Focus -> on e Window.focusEvent
1220+ Focus -> on e Events.focus
1219− Input -> on e Window.input
1221+ Input -> on e Events.input
1220− Invalid -> on e Window.invalid
1222+ Invalid -> on e Events.invalid
1221− Keydown -> on e Window.keyDown
1223+ Keydown -> on e Events.keyDown
1222− Keypress -> on e Window.keyPress
1224+ Keypress -> on e Events.keyPress
1223− Keyup -> on e Window.keyUp
1225+ Keyup -> on e Events.keyUp
1224− Load -> on e Window.load
1226+ Load -> on e Events.load
1225− Mousedown -> on e Window.mouseDown
1227+ Mousedown -> on e Events.mouseDown
1226− Mouseenter -> on e Window.mouseEnter
1228+ Mouseenter -> on e Events.mouseEnter
1227− Mouseleave -> on e Window.mouseLeave
1229+ Mouseleave -> on e Events.mouseLeave
1228− Mousemove -> on e Window.mouseMove
1230+ Mousemove -> on e Events.mouseMove
1229− Mouseout -> on e Window.mouseOut
1231+ Mouseout -> on e Events.mouseOut
1230− Mouseover -> on e Window.mouseOver
1232+ Mouseover -> on e Events.mouseOver
1231− Mouseup -> on e Window.mouseUp
1233+ Mouseup -> on e Events.mouseUp
1232− Mousewheel -> on e Window.mouseWheel
1234+ Mousewheel -> on e Events.mouseWheel
1233− Scroll -> on e Window.scrollEvent
1235+ Scroll -> on e Events.scroll
1234− Select -> on e Window.select
1236+ Select -> on e Events.select
1235− Submit -> on e Window.submit
1237+ Submit -> on e Events.submit
1236− Wheel -> on e Window.wheel
1238+ Wheel -> on e Events.wheel
1237 Beforecut -> const $ return $ return () --TODO
1239 Beforecut -> const $ return $ return () --TODO
1238 Cut -> const $ return $ return () --TODO
1240 Cut -> const $ return $ return () --TODO
1239 Beforecopy -> const $ return $ return () --TODO
1241 Beforecopy -> const $ return $ return () --TODO
1240 Copy -> const $ return $ return () --TODO
1242 Copy -> const $ return $ return () --TODO
1241 Beforepaste -> const $ return $ return () --TODO
1243 Beforepaste -> const $ return $ return () --TODO
1242 Paste -> const $ return $ return () --TODO
1244 Paste -> const $ return $ return () --TODO
1243− Reset -> on e Window.reset
1245+ Reset -> on e Events.reset
1244− Search -> on e Window.search
1246+ Search -> on e Events.search
1245 Selectstart -> const $ return $ return () --TODO
1247 Selectstart -> const $ return $ return () --TODO
1246− Touchstart -> on e Window.touchStart
1248+ Touchstart -> on e Events.touchStart
1247− Touchmove -> on e Window.touchMove
1249+ Touchmove -> on e Events.touchMove
1248− Touchend -> on e Window.touchEnd
1250+ Touchend -> on e Events.touchEnd
1249− Touchcancel -> on e Window.touchCancel
1251+ Touchcancel -> on e Events.touchCancel
1250
1252
1251{-# INLINABLE wrapDomEvent #-}
1253{-# INLINABLE wrapDomEvent #-}
1252wrapDomEvent :: (TriggerEvent t m, MonadJSM m) => e -> (e -> EventM e event () -> JSM (JSM ())) -> EventM e event a -> m (Event t a)
1254wrapDomEvent :: (TriggerEvent t m, MonadJSM m) => e -> (e -> EventM e event () -> JSM (JSM ())) -> EventM e event a -> m (Event t a)
@@ -1291,10 +1293,10 @@ wrapDomEventsMaybe target handlers onEventName = do
1291 return $! e
1293 return $! e
1292
1294
1293{-# INLINABLE getKeyEvent #-}
1295{-# INLINABLE getKeyEvent #-}
1294−getKeyEvent :: EventM e KeyboardEvent Int
1296+getKeyEvent :: EventM e KeyboardEvent Word
1295getKeyEvent = do
1297getKeyEvent = do
1296 e <- event
1298 e <- event
1297− which <- getWhich e
1299+ which <- KeyboardEvent.getWhich e
1298 if which /= 0 then return which else do
1300 if which /= 0 then return which else do
1299 charCode <- getCharCode e
1301 charCode <- getCharCode e
1300 if charCode /= 0 then return charCode else
1302 if charCode /= 0 then return charCode else
@@ -1309,29 +1311,26 @@ getMouseEventCoords = do
1309{-# INLINABLE getTouchEvent #-}
1311{-# INLINABLE getTouchEvent #-}
1310getTouchEvent :: EventM e TouchEvent TouchEventResult
1312getTouchEvent :: EventM e TouchEvent TouchEventResult
1311getTouchEvent = do
1313getTouchEvent = do
1312− let touchResults = \case
1314+ let touchResults ts = do
1313− Nothing -> return []
1314− Just ts -> do
1315 n <- TouchList.getLength ts
1315 n <- TouchList.getLength ts
1316− fmap catMaybes . forM (takeWhile (< n) [0..]) $ \ix -> do
1316+ forM (takeWhile (< n) [0..]) $ \ix -> do
1317− mt <- TouchList.item ts ix
1317+ t <- TouchList.item ts ix
1318− forM mt $ \t -> do
1319− identifier <- Touch.getIdentifier t
1318+ identifier <- Touch.getIdentifier t
1320− screenX <- Touch.getScreenX t
1319+ screenX <- Touch.getScreenX t
1321− screenY <- Touch.getScreenY t
1320+ screenY <- Touch.getScreenY t
1322− clientX <- Touch.getClientX t
1321+ clientX <- Touch.getClientX t
1323− clientY <- Touch.getClientY t
1322+ clientY <- Touch.getClientY t
1324− pageX <- Touch.getPageX t
1323+ pageX <- Touch.getPageX t
1325− pageY <- Touch.getPageY t
1324+ pageY <- Touch.getPageY t
1326− return $ TouchResult
1325+ return TouchResult
1327− { _touchResult_identifier = identifier
1326+ { _touchResult_identifier = identifier
1328− , _touchResult_screenX = screenX
1327+ , _touchResult_screenX = screenX
1329− , _touchResult_screenY = screenY
1328+ , _touchResult_screenY = screenY
1330− , _touchResult_clientX = clientX
1329+ , _touchResult_clientX = clientX
1331− , _touchResult_clientY = clientY
1330+ , _touchResult_clientY = clientY
1332− , _touchResult_pageX = pageX
1331+ , _touchResult_pageX = pageX
1333− , _touchResult_pageY = pageY
1332+ , _touchResult_pageY = pageY
1334− }
1333+ }
1335 e <- event
1334 e <- event
1336 altKey <- TouchEvent.getAltKey e
1335 altKey <- TouchEvent.getAltKey e
1337 ctrlKey <- TouchEvent.getCtrlKey e
1336 ctrlKey <- TouchEvent.getCtrlKey e
reflex-dom-core/src/Reflex/Dom/Builder/Static.hs−1
@@ -5,7 +5,6 @@
5{-# LANGUAGE FlexibleContexts #-}
5{-# LANGUAGE FlexibleContexts #-}
6{-# LANGUAGE FlexibleInstances #-}
6{-# LANGUAGE FlexibleInstances #-}
7{-# LANGUAGE GeneralizedNewtypeDeriving #-}
7{-# LANGUAGE GeneralizedNewtypeDeriving #-}
8−{-# LANGUAGE LambdaCase #-}
9{-# LANGUAGE MultiParamTypeClasses #-}
8{-# LANGUAGE MultiParamTypeClasses #-}
10{-# LANGUAGE OverloadedStrings #-}
9{-# LANGUAGE OverloadedStrings #-}
11{-# LANGUAGE PolyKinds #-}
10{-# LANGUAGE PolyKinds #-}
reflex-dom-core/src/Reflex/Dom/Location.hs+3−3
@@ -3,11 +3,11 @@ module Reflex.Dom.Location (getLocationHost, getLocationProtocol) where
3import Data.Text (Text)
3import Data.Text (Text)
4import GHCJS.DOM.Types (MonadJSM)
4import GHCJS.DOM.Types (MonadJSM)
5import GHCJS.DOM (currentWindowUnchecked)
5import GHCJS.DOM (currentWindowUnchecked)
6−import GHCJS.DOM.Window (getLocationUnchecked)
6+import GHCJS.DOM.Window (getLocation)
7import GHCJS.DOM.Location (getProtocol, getHost)
7import GHCJS.DOM.Location (getProtocol, getHost)
8
8
9getLocationHost :: (MonadJSM m) => m Text
9getLocationHost :: (MonadJSM m) => m Text
10−getLocationHost = currentWindowUnchecked >>= getLocationUnchecked >>= getHost
10+getLocationHost = currentWindowUnchecked >>= getLocation >>= getHost
11
11
12getLocationProtocol :: (MonadJSM m) => m Text
12getLocationProtocol :: (MonadJSM m) => m Text
13−getLocationProtocol = currentWindowUnchecked >>= getLocationUnchecked >>= getProtocol
13+getLocationProtocol = currentWindowUnchecked >>= getLocation >>= getProtocol
reflex-dom-core/src/Reflex/Dom/Main.hs+8−9
@@ -1,9 +1,7 @@
1−{-# LANGUAGE CPP #-}
2{-# LANGUAGE ConstraintKinds #-}
1{-# LANGUAGE ConstraintKinds #-}
3{-# LANGUAGE FlexibleContexts #-}
2{-# LANGUAGE FlexibleContexts #-}
4{-# LANGUAGE FlexibleInstances #-}
3{-# LANGUAGE FlexibleInstances #-}
5{-# LANGUAGE GADTs #-}
4{-# LANGUAGE GADTs #-}
6−{-# LANGUAGE LambdaCase #-}
7{-# LANGUAGE MultiParamTypeClasses #-}
5{-# LANGUAGE MultiParamTypeClasses #-}
8{-# LANGUAGE NoMonomorphismRestriction #-}
6{-# LANGUAGE NoMonomorphismRestriction #-}
9{-# LANGUAGE RankNTypes #-}
7{-# LANGUAGE RankNTypes #-}
@@ -41,6 +39,7 @@ import Data.Text.Encoding
41import GHCJS.DOM
39import GHCJS.DOM
42import GHCJS.DOM.Document
40import GHCJS.DOM.Document
43import GHCJS.DOM.Element
41import GHCJS.DOM.Element
42+import GHCJS.DOM.NonElementParentNode
44import GHCJS.DOM.Node
43import GHCJS.DOM.Node
45import qualified GHCJS.DOM.Types as DOM
44import qualified GHCJS.DOM.Types as DOM
46import GHCJS.DOM.Types (JSM)
45import GHCJS.DOM.Types (JSM)
@@ -90,9 +89,9 @@ mainWidgetWithHead' :: (a -> Widget () b, b -> Widget () a) -> JSM ()
90mainWidgetWithHead' widgets = withJSContextSingletonMono $ \jsSing -> do
89mainWidgetWithHead' widgets = withJSContextSingletonMono $ \jsSing -> do
91 doc <- currentDocumentUnchecked
90 doc <- currentDocumentUnchecked
92 headElement <- getHeadUnchecked doc
91 headElement <- getHeadUnchecked doc
93− headFragment <- createDocumentFragmentUnchecked doc
92+ headFragment <- createDocumentFragment doc
94 bodyElement <- getBodyUnchecked doc
93 bodyElement <- getBodyUnchecked doc
95− bodyFragment <- createDocumentFragmentUnchecked doc
94+ bodyFragment <- createDocumentFragment doc
96 (events, fc) <- liftIO . attachWidget'' $ \events -> do
95 (events, fc) <- liftIO . attachWidget'' $ \events -> do
97 let (headWidget, bodyWidget) = widgets
96 let (headWidget, bodyWidget) = widgets
98 (postBuild, postBuildTriggerRef) <- newEventWithTriggerRef
97 (postBuild, postBuildTriggerRef) <- newEventWithTriggerRef
@@ -116,14 +115,14 @@ mainWidgetWithHead' widgets = withJSContextSingletonMono $ \jsSing -> do
116replaceElementContents :: DOM.IsElement e => e -> DOM.DocumentFragment -> JSM ()
115replaceElementContents :: DOM.IsElement e => e -> DOM.DocumentFragment -> JSM ()
117replaceElementContents e df = do
116replaceElementContents e df = do
118 setInnerHTML e $ Just ("" :: String)
117 setInnerHTML e $ Just ("" :: String)
119− _ <- appendChildUnchecked e $ Just df
118+ _ <- appendChild e df
120 return ()
119 return ()
121
120
122{-# INLINABLE attachWidget' #-}
121{-# INLINABLE attachWidget' #-}
123attachWidget' :: DOM.IsElement e => e -> JSContextSingleton x -> Widget x a -> JSM (a, FireCommand Spider (SpiderHost Global))
122attachWidget' :: DOM.IsElement e => e -> JSContextSingleton x -> Widget x a -> JSM (a, FireCommand Spider (SpiderHost Global))
124attachWidget' rootElement jsSing w = do
123attachWidget' rootElement jsSing w = do
125 doc <- getOwnerDocumentUnchecked rootElement
124 doc <- getOwnerDocumentUnchecked rootElement
126− df <- createDocumentFragmentUnchecked doc
125+ df <- createDocumentFragment doc
127 ((a, events), fc) <- liftIO . attachWidget'' $ \events -> do
126 ((a, events), fc) <- liftIO . attachWidget'' $ \events -> do
128 (postBuild, postBuildTriggerRef) <- newEventWithTriggerRef
127 (postBuild, postBuildTriggerRef) <- newEventWithTriggerRef
129 unreadyChildren <- liftIO $ newIORef 0
128 unreadyChildren <- liftIO $ newIORef 0
@@ -170,11 +169,11 @@ mainWidgetInElementById eid w = withJSContextSingleton $ \jsSing -> do
170 root <- getElementByIdUnchecked doc eid
169 root <- getElementByIdUnchecked doc eid
171 attachWidget root jsSing w
170 attachWidget root jsSing w
172
171
173−data AppInput t = AppInput
172+newtype AppInput t = AppInput
174 { _appInput_window :: Window t
173 { _appInput_window :: Window t
175 }
174 }
176
175
177−data AppOutput t = AppOutput --TODO: Add quit event
176+newtype AppOutput t = AppOutput --TODO: Add quit event
178 { _appOutput_windowConfig :: WindowConfig t
177 { _appOutput_windowConfig :: WindowConfig t
179 }
178 }
180
179
@@ -182,7 +181,7 @@ runApp' :: (t ~ Spider) => (forall x. AppInput t -> Widget x (AppOutput t)) -> J
182runApp' app = withJSContextSingleton $ \jsSing -> do
181runApp' app = withJSContextSingleton $ \jsSing -> do
183 doc <- currentDocumentUnchecked
182 doc <- currentDocumentUnchecked
184 body <- getBodyUnchecked doc
183 body <- getBodyUnchecked doc
185− win <- getDefaultViewUnchecked doc
184+ win <- getDefaultView doc
186 rec o <- attachWidget body jsSing $ do
185 rec o <- attachWidget body jsSing $ do
187 w <- lift $ wrapWindow win $ _appOutput_windowConfig o
186 w <- lift $ wrapWindow win $ _appOutput_windowConfig o
188 app $ AppInput
187 app $ AppInput
reflex-dom-core/src/Reflex/Dom/Old.hs+11−14
@@ -61,17 +61,16 @@ import Data.Dependent.Map as DMap
61import Data.Functor.Misc
61import Data.Functor.Misc
62import Data.Map (Map)
62import Data.Map (Map)
63import qualified Data.Map as Map
63import qualified Data.Map as Map
64−import Data.Maybe
65import Data.Set (Set)
64import Data.Set (Set)
66import qualified Data.Set as Set
65import qualified Data.Set as Set
67−import Data.Text
66+import Data.Text (Text)
68import Foreign.JavaScript.TH
67import Foreign.JavaScript.TH
69import qualified GHCJS.DOM.Element as Element
68import qualified GHCJS.DOM.Element as Element
70import GHCJS.DOM.EventM (EventM)
69import GHCJS.DOM.EventM (EventM)
71import GHCJS.DOM.NamedNodeMap as NNM
70import GHCJS.DOM.NamedNodeMap as NNM
72−import GHCJS.DOM.Node (getFirstChild, getNodeName, removeChildUnchecked)
71+import GHCJS.DOM.Node (getFirstChild, getNodeName, removeChild)
73import GHCJS.DOM.Types
72import GHCJS.DOM.Types
74− (MonadJSM, liftJSM, JSM, IsElement, IsNode)
73+ (MonadJSM, liftJSM, JSM, IsHTMLElement, IsNode)
75import qualified GHCJS.DOM.Types as DOM
74import qualified GHCJS.DOM.Types as DOM
76import Reflex.Class
75import Reflex.Class
77import Reflex.Dom.Builder.Class
76import Reflex.Dom.Builder.Class
@@ -180,7 +179,7 @@ buildElementCommon :: MonadWidget t m => Text -> m a -> ElementConfig er t m ->
180buildElementCommon elementTag child cfg = element elementTag cfg child
179buildElementCommon elementTag child cfg = element elementTag cfg child
181
180
182
181
183−onEventName :: IsElement e => EventName en -> e -> EventM e (EventType en) () -> JSM (JSM ())
182+onEventName :: IsHTMLElement e => EventName en -> e -> EventM e (EventType en) () -> JSM (JSM ())
184onEventName = elementOnEventName
183onEventName = elementOnEventName
185
184
186schedulePostBuild :: (PostBuild t m, PerformEvent t m) => WidgetHost m () -> m ()
185schedulePostBuild :: (PostBuild t m, PerformEvent t m) => WidgetHost m () -> m ()
@@ -223,14 +222,14 @@ _el_events :: Element er d t -> EventSelector t (WrapArg er EventName)
223_el_events = _element_events
222_el_events = _element_events
224
223
225{-# DEPRECATED _el_keypress "Use 'domEvent Keypress' instead" #-}
224{-# DEPRECATED _el_keypress "Use 'domEvent Keypress' instead" #-}
226−_el_keypress :: Reflex t => El t -> Event t Int
225+_el_keypress :: Reflex t => El t -> Event t Word
227_el_keypress = domEvent Keypress
226_el_keypress = domEvent Keypress
228
227
229{-# DEPRECATED _el_scrolled "Use 'domEvent Scroll' instead" #-}
228{-# DEPRECATED _el_scrolled "Use 'domEvent Scroll' instead" #-}
230−_el_scrolled :: Reflex t => El t -> Event t Int
229+_el_scrolled :: Reflex t => El t -> Event t Double
231_el_scrolled = domEvent Scroll
230_el_scrolled = domEvent Scroll
232
231
233−wrapElement :: forall t m. MonadWidget t m => (forall en. DOM.Element -> EventName en -> EventM DOM.Element (EventType en) (Maybe (EventResult en))) -> DOM.Element -> m (El t)
232+wrapElement :: forall t m. MonadWidget t m => (forall en. DOM.HTMLElement -> EventName en -> EventM DOM.Element (EventType en) (Maybe (EventResult en))) -> DOM.HTMLElement -> m (El t)
234wrapElement eh e = do
233wrapElement eh e = do
235 let h :: (EventName en, GhcjsDomEvent en) -> JSM (Maybe (EventResult en))
234 let h :: (EventName en, GhcjsDomEvent en) -> JSM (Maybe (EventResult en))
236 h (en, GhcjsDomEvent evt) = runReaderT (eh e en) evt
235 h (en, GhcjsDomEvent evt) = runReaderT (eh e en) evt
@@ -240,7 +239,7 @@ wrapElement eh e = do
240 }
239 }
241 }
240 }
242
241
243−unsafePlaceElement :: MonadWidget t m => DOM.Element -> m (Element EventResult (DomBuilderSpace m) t)
242+unsafePlaceElement :: MonadWidget t m => DOM.HTMLElement -> m (Element EventResult (DomBuilderSpace m) t)
244unsafePlaceElement e = do
243unsafePlaceElement e = do
245 placeRawElement e
244 placeRawElement e
246 wrapRawElement e def
245 wrapRawElement e def
@@ -248,10 +247,8 @@ unsafePlaceElement e = do
248namedNodeMapGetNames :: DOM.NamedNodeMap -> JSM (Set Text)
247namedNodeMapGetNames :: DOM.NamedNodeMap -> JSM (Set Text)
249namedNodeMapGetNames self = do
248namedNodeMapGetNames self = do
250 l <- NNM.getLength self
249 l <- NNM.getLength self
251− let locations = if l == 0 then [] else [0..l-1] -- Can't use 0..l-1 if l is 0 because l is unsigned and will wrap around
252− fmap (Set.fromList . catMaybes) $ forM locations $ \i -> do
250+ Set.fromList <$> forM (take (fromIntegral l) [0..]) (
253− n <- NNM.itemUnchecked self i
251+ NNM.itemUnchecked self >=> getNodeName)
254− getNodeName n
255
252
256nodeClear :: IsNode self => self -> JSM ()
253nodeClear :: IsNode self => self -> JSM ()
257nodeClear n = do
254nodeClear n = do
@@ -259,7 +256,7 @@ nodeClear n = do
259 case mfc of
256 case mfc of
260 Nothing -> return ()
257 Nothing -> return ()
261 Just fc -> do
258 Just fc -> do
262− _ <- removeChildUnchecked n $ Just fc
259+ _ <- removeChild n fc
263 nodeClear n
260 nodeClear n
264
261
265elStopPropagationNS :: forall t m en a. (MonadWidget t m) => Maybe Text -> Text -> EventName en -> m a -> m a
262elStopPropagationNS :: forall t m en a. (MonadWidget t m) => Maybe Text -> Text -> EventName en -> m a -> m a
reflex-dom-core/src/Reflex/Dom/WebSocket/Foreign.hs+5−5
@@ -21,13 +21,13 @@ import Foreign.JavaScript.Utils (bsFromMutableArrayBuffer, bsToArrayBuffer)
21import GHCJS.DOM.CloseEvent
21import GHCJS.DOM.CloseEvent
22import GHCJS.DOM.EventM (on)
22import GHCJS.DOM.EventM (on)
23import GHCJS.DOM.MessageEvent
23import GHCJS.DOM.MessageEvent
24−import GHCJS.DOM.Types hiding (Text)
24+import GHCJS.DOM.Types hiding (Text, ByteString)
25import qualified GHCJS.DOM.WebSocket as GD
25import qualified GHCJS.DOM.WebSocket as GD
26import GHCJS.Foreign (JSType(..), jsTypeOf)
26import GHCJS.Foreign (JSType(..), jsTypeOf)
27import Language.Javascript.JSaddle.Helper (mutableArrayBufferFromJSVal)
27import Language.Javascript.JSaddle.Helper (mutableArrayBufferFromJSVal)
28import Language.Javascript.JSaddle.Types (ghcjsPure)
28import Language.Javascript.JSaddle.Types (ghcjsPure)
29
29
30−data JSWebSocket = JSWebSocket { unWebSocket :: WebSocket }
30+newtype JSWebSocket = JSWebSocket { unWebSocket :: WebSocket }
31
31
32class IsWebSocketMessage a where
32class IsWebSocketMessage a where
33 webSocketSend :: JSWebSocket -> a -> JSM ()
33 webSocketSend :: JSWebSocket -> a -> JSM ()
@@ -37,14 +37,14 @@ class IsWebSocketMessage a where
37instance IsWebSocketMessage ByteString where
37instance IsWebSocketMessage ByteString where
38 webSocketSend (JSWebSocket ws) bs = do
38 webSocketSend (JSWebSocket ws) bs = do
39 ab <- bsToArrayBuffer bs
39 ab <- bsToArrayBuffer bs
40− GD.send ws $ Just ab
40+ GD.send ws ab
41
41
42-- Use plaintext websocket communication for Text, and String
42-- Use plaintext websocket communication for Text, and String
43instance IsWebSocketMessage Text where
43instance IsWebSocketMessage Text where
44 webSocketSend (JSWebSocket ws) = GD.sendString ws . T.unpack
44 webSocketSend (JSWebSocket ws) = GD.sendString ws . T.unpack
45
45
46closeWebSocket :: JSWebSocket -> Word -> Text -> JSM ()
46closeWebSocket :: JSWebSocket -> Word -> Text -> JSM ()
47−closeWebSocket (JSWebSocket ws) = GD.close ws
47+closeWebSocket (JSWebSocket ws) code reason = GD.close ws (Just code) (Just reason)
48
48
49newWebSocket
49newWebSocket
50 :: a
50 :: a
@@ -55,7 +55,7 @@ newWebSocket
55 -> ((Bool, Word, Text) -> JSM ()) -- onclose
55 -> ((Bool, Word, Text) -> JSM ()) -- onclose
56 -> JSM JSWebSocket
56 -> JSM JSWebSocket
57newWebSocket _ url onMessage onOpen onError onClose = do
57newWebSocket _ url onMessage onOpen onError onClose = do
58− ws <- GD.newWebSocket url (Just [] :: Maybe [Text])
58+ ws <- GD.newWebSocket url ([] :: [Text])
59 GD.setBinaryType ws "arraybuffer"
59 GD.setBinaryType ws "arraybuffer"
60 _ <- on ws GD.open $ liftJSM onOpen
60 _ <- on ws GD.open $ liftJSM onOpen
61 _ <- on ws GD.error $ liftJSM onError
61 _ <- on ws GD.error $ liftJSM onError
reflex-dom-core/src/Reflex/Dom/Widget/Basic.hs+4−4
@@ -397,7 +397,7 @@ elDynHtmlAttr' elementTag attrs html = do
397 wrapElement defaultDomEventHandler e
397 wrapElement defaultDomEventHandler e
398-}
398-}
399
399
400−data Link t
400+newtype Link t
401 = Link { _link_clicked :: Event t ()
401 = Link { _link_clicked :: Event t ()
402 }
402 }
403
403
@@ -446,11 +446,11 @@ tableDynAttr :: forall t m r k v. (Ord k, DomBuilder t m, MonadHold t m, PostBui
446 -> Dynamic t (Map k r) -- ^ Map from row key to row value
446 -> Dynamic t (Map k r) -- ^ Map from row key to row value
447 -> (k -> m (Dynamic t (Map Text Text))) -- ^ Function to compute <tr> element attributes from row key
447 -> (k -> m (Dynamic t (Map Text Text))) -- ^ Function to compute <tr> element attributes from row key
448 -> m (Dynamic t (Map k (Element EventResult (DomBuilderSpace m) t, [v]))) -- ^ Map from row key to (El, list of widget return values)
448 -> m (Dynamic t (Map k (Element EventResult (DomBuilderSpace m) t, [v]))) -- ^ Map from row key to (El, list of widget return values)
449−tableDynAttr klass cols dRows rowAttrs = elAttr "div" (Map.singleton "style" "zoom: 1; overflow: auto; background: white;") $ do
449+tableDynAttr klass cols dRows rowAttrs = elAttr "div" (Map.singleton "style" "zoom: 1; overflow: auto; background: white;") $
450 elAttr "table" (Map.singleton "class" klass) $ do
450 elAttr "table" (Map.singleton "class" klass) $ do
451− el "thead" $ el "tr" $ do
451+ el "thead" $ el "tr" $
452 mapM_ (\(h, _) -> el "th" $ text h) cols
452 mapM_ (\(h, _) -> el "th" $ text h) cols
453− el "tbody" $ do
453+ el "tbody" $
454 listWithKey dRows (\k r -> do
454 listWithKey dRows (\k r -> do
455 dAttrs <- rowAttrs k
455 dAttrs <- rowAttrs k
456 elDynAttr' "tr" dAttrs $ mapM (\x -> el "td" $ snd x k r) cols)
456 elDynAttr' "tr" dAttrs $ mapM (\x -> el "td" $ snd x k r) cols)
reflex-dom-core/src/Reflex/Dom/Widget/Input.hs+17−17
@@ -33,13 +33,13 @@ import Data.Maybe
33import Data.Semigroup
33import Data.Semigroup
34import Data.Text (Text)
34import Data.Text (Text)
35import qualified Data.Text as T
35import qualified Data.Text as T
36−import qualified GHCJS.DOM.Element as Element
36+import qualified GHCJS.DOM.GlobalEventHandlers as Events
37import GHCJS.DOM.EventM (on)
37import GHCJS.DOM.EventM (on)
38import qualified GHCJS.DOM.FileList as FileList
38import qualified GHCJS.DOM.FileList as FileList
39import GHCJS.DOM.HTMLInputElement (HTMLInputElement)
39import GHCJS.DOM.HTMLInputElement (HTMLInputElement)
40import GHCJS.DOM.HTMLTextAreaElement (HTMLTextAreaElement)
40import GHCJS.DOM.HTMLTextAreaElement (HTMLTextAreaElement)
41import GHCJS.DOM.Types (MonadJSM, File, uncheckedCastTo)
41import GHCJS.DOM.Types (MonadJSM, File, uncheckedCastTo)
42−import qualified GHCJS.DOM.Types as DOM (Element(..), EventTarget(..))
42+import qualified GHCJS.DOM.Types as DOM (HTMLElement(..), EventTarget(..))
43import Reflex.Class
43import Reflex.Class
44import Reflex.Dom.Builder.Class
44import Reflex.Dom.Builder.Class
45import Reflex.Dom.Builder.Immediate
45import Reflex.Dom.Builder.Immediate
@@ -56,9 +56,9 @@ import qualified GHCJS.DOM.HTMLInputElement as Input
56data TextInput t
56data TextInput t
57 = TextInput { _textInput_value :: Dynamic t Text
57 = TextInput { _textInput_value :: Dynamic t Text
58 , _textInput_input :: Event t Text
58 , _textInput_input :: Event t Text
59− , _textInput_keypress :: Event t Int
59+ , _textInput_keypress :: Event t Word
60− , _textInput_keydown :: Event t Int
60+ , _textInput_keydown :: Event t Word
61− , _textInput_keyup :: Event t Int
61+ , _textInput_keyup :: Event t Word
62 , _textInput_hasFocus :: Dynamic t Bool
62 , _textInput_hasFocus :: Dynamic t Bool
63 , _textInput_builderElement :: InputElement EventResult GhcjsDomSpace t
63 , _textInput_builderElement :: InputElement EventResult GhcjsDomSpace t
64 }
64 }
@@ -110,8 +110,8 @@ textInputGetEnter :: Reflex t => TextInput t -> Event t ()
110textInputGetEnter = keypress Enter
110textInputGetEnter = keypress Enter
111
111
112{-# INLINABLE keypress #-}
112{-# INLINABLE keypress #-}
113−keypress :: (Reflex t, HasDomEvent t e 'KeypressTag, DomEventType e 'KeypressTag ~ Int) => Key -> e -> Event t ()
113+keypress :: (Reflex t, HasDomEvent t e 'KeypressTag, DomEventType e 'KeypressTag ~ Word) => Key -> e -> Event t ()
114−keypress key i = fmapMaybe (\n -> if keyCodeLookup n == key then Just () else Nothing) $ domEvent Keypress i
114+keypress key i = fmapMaybe (\n -> if keyCodeLookup (fromIntegral n) == key then Just () else Nothing) $ domEvent Keypress i
115
115
116data RangeInputConfig t
116data RangeInputConfig t
117 = RangeInputConfig { _rangeInputConfig_initialValue :: Float
117 = RangeInputConfig { _rangeInputConfig_initialValue :: Float
@@ -169,7 +169,7 @@ data TextArea t
169 = TextArea { _textArea_value :: Dynamic t Text
169 = TextArea { _textArea_value :: Dynamic t Text
170 , _textArea_input :: Event t Text
170 , _textArea_input :: Event t Text
171 , _textArea_hasFocus :: Dynamic t Bool
171 , _textArea_hasFocus :: Dynamic t Bool
172− , _textArea_keypress :: Event t Int
172+ , _textArea_keypress :: Event t Word
173 , _textArea_element :: HTMLTextAreaElement
173 , _textArea_element :: HTMLTextAreaElement
174 }
174 }
175
175
@@ -287,7 +287,7 @@ checkboxView dAttrs dValue = do
287 postBuild <- getPostBuild
287 postBuild <- getPostBuild
288 let filters :: DMap EventName (GhcjsEventFilter CheckboxViewEventResult)
288 let filters :: DMap EventName (GhcjsEventFilter CheckboxViewEventResult)
289 filters = DMap.singleton Click $ GhcjsEventFilter $ \(GhcjsDomEvent evt) -> do
289 filters = DMap.singleton Click $ GhcjsEventFilter $ \(GhcjsDomEvent evt) -> do
290− t <- Event.getTargetUnchecked evt
290+ t <- Event.getTarget evt
291 b <- Input.getChecked $ uncheckedCastTo Input.HTMLInputElement t
291 b <- Input.getChecked $ uncheckedCastTo Input.HTMLInputElement t
292 return $ (,) preventDefault $ return $ Just $ CheckboxViewEventResult b
292 return $ (,) preventDefault $ return $ Just $ CheckboxViewEventResult b
293 elementConfig :: ElementConfig CheckboxViewEventResult t m
293 elementConfig :: ElementConfig CheckboxViewEventResult t m
@@ -299,8 +299,8 @@ checkboxView dAttrs dValue = do
299 , _ghcjsEventSpec_handler = GhcjsEventHandler $ \(en, GhcjsDomEvent evt) -> case en of
299 , _ghcjsEventSpec_handler = GhcjsEventHandler $ \(en, GhcjsDomEvent evt) -> case en of
300 Click -> error "impossible"
300 Click -> error "impossible"
301 _ -> do
301 _ -> do
302− e :: DOM.EventTarget <- withIsEvent en $ Event.getTargetUnchecked evt
302+ e :: DOM.EventTarget <- withIsEvent en $ Event.getTarget evt
303− let myElement = uncheckedCastTo DOM.Element e
303+ let myElement = uncheckedCastTo DOM.HTMLElement e
304 mr <- runReaderT (defaultDomEventHandler myElement en) evt
304 mr <- runReaderT (defaultDomEventHandler myElement en) evt
305 return $ ffor mr $ \(EventResult r) -> CheckboxViewEventResult $ regularToCheckboxViewEventType en r
305 return $ ffor mr $ \(EventResult r) -> CheckboxViewEventResult $ regularToCheckboxViewEventType en r
306 }
306 }
@@ -317,7 +317,7 @@ data FileInput d t
317 , _fileInput_element :: RawInputElement d
317 , _fileInput_element :: RawInputElement d
318 }
318 }
319
319
320−data FileInputConfig t
320+newtype FileInputConfig t
321 = FileInputConfig { _fileInputConfig_attributes :: Dynamic t (Map Text Text)
321 = FileInputConfig { _fileInputConfig_attributes :: Dynamic t (Map Text Text)
322 }
322 }
323
323
@@ -339,7 +339,7 @@ fileInput config = do
339 cfg = (def :: InputElementConfig EventResult t m) & inputElementConfig_elementConfig .~ elCfg
339 cfg = (def :: InputElementConfig EventResult t m) & inputElementConfig_elementConfig .~ elCfg
340 eRaw <- inputElement cfg
340 eRaw <- inputElement cfg
341 let e = _inputElement_raw eRaw
341 let e = _inputElement_raw eRaw
342− eChange <- wrapDomEvent e (`on` Element.change) $ do
342+ eChange <- wrapDomEvent e (`on` Events.change) $ do
343 files <- Input.getFilesUnchecked e
343 files <- Input.getFilesUnchecked e
344 len <- FileList.getLength files
344 len <- FileList.getLength files
345 mapM (fmap (fromMaybe (error "fileInput: fileList.item returned null")) . FileList.item files) [0 .. len-1]
345 mapM (fmap (fromMaybe (error "fileInput: fileList.item returned null")) . FileList.item files) [0 .. len-1]
@@ -481,7 +481,7 @@ textArea_hasFocus f (TextArea x1 x2 x3 x4 x5) = (\y -> TextArea x1 x2 y x4 x5) <
481textArea_input :: Lens' (TextArea t) (Event t Text)
481textArea_input :: Lens' (TextArea t) (Event t Text)
482textArea_input f (TextArea x1 x2 x3 x4 x5) = (\y -> TextArea x1 y x3 x4 x5) <$> f x2
482textArea_input f (TextArea x1 x2 x3 x4 x5) = (\y -> TextArea x1 y x3 x4 x5) <$> f x2
483{-# INLINE textArea_input #-}
483{-# INLINE textArea_input #-}
484−textArea_keypress :: Lens' (TextArea t) (Event t Int)
484+textArea_keypress :: Lens' (TextArea t) (Event t Word)
485textArea_keypress f (TextArea x1 x2 x3 x4 x5) = (\y -> TextArea x1 x2 x3 y x5) <$> f x4
485textArea_keypress f (TextArea x1 x2 x3 x4 x5) = (\y -> TextArea x1 x2 x3 y x5) <$> f x4
486{-# INLINE textArea_keypress #-}
486{-# INLINE textArea_keypress #-}
487textArea_value :: Lens' (TextArea t) (Dynamic t Text)
487textArea_value :: Lens' (TextArea t) (Dynamic t Text)
@@ -508,13 +508,13 @@ textInput_hasFocus f (TextInput x1 x2 x3 x4 x5 x6 x7) = (\y -> TextInput x1 x2 x
508textInput_input :: Lens' (TextInput t) (Event t Text)
508textInput_input :: Lens' (TextInput t) (Event t Text)
509textInput_input f (TextInput x1 x2 x3 x4 x5 x6 x7) = (\y -> TextInput x1 y x3 x4 x5 x6 x7) <$> f x2
509textInput_input f (TextInput x1 x2 x3 x4 x5 x6 x7) = (\y -> TextInput x1 y x3 x4 x5 x6 x7) <$> f x2
510{-# INLINE textInput_input #-}
510{-# INLINE textInput_input #-}
511−textInput_keydown :: Lens' (TextInput t) (Event t Int)
511+textInput_keydown :: Lens' (TextInput t) (Event t Word)
512textInput_keydown f (TextInput x1 x2 x3 x4 x5 x6 x7) = (\y -> TextInput x1 x2 x3 y x5 x6 x7) <$> f x4
512textInput_keydown f (TextInput x1 x2 x3 x4 x5 x6 x7) = (\y -> TextInput x1 x2 x3 y x5 x6 x7) <$> f x4
513{-# INLINE textInput_keydown #-}
513{-# INLINE textInput_keydown #-}
514−textInput_keypress :: Lens' (TextInput t) (Event t Int)
514+textInput_keypress :: Lens' (TextInput t) (Event t Word)
515textInput_keypress f (TextInput x1 x2 x3 x4 x5 x6 x7) = (\y -> TextInput x1 x2 y x4 x5 x6 x7) <$> f x3
515textInput_keypress f (TextInput x1 x2 x3 x4 x5 x6 x7) = (\y -> TextInput x1 x2 y x4 x5 x6 x7) <$> f x3
516{-# INLINE textInput_keypress #-}
516{-# INLINE textInput_keypress #-}
517−textInput_keyup :: Lens' (TextInput t) (Event t Int)
517+textInput_keyup :: Lens' (TextInput t) (Event t Word)
518textInput_keyup f (TextInput x1 x2 x3 x4 x5 x6 x7) = (\y -> TextInput x1 x2 x3 x4 y x6 x7) <$> f x5
518textInput_keyup f (TextInput x1 x2 x3 x4 x5 x6 x7) = (\y -> TextInput x1 x2 x3 x4 y x6 x7) <$> f x5
519{-# INLINE textInput_keyup #-}
519{-# INLINE textInput_keyup #-}
520textInput_value :: Lens' (TextInput t) (Dynamic t Text)
520textInput_value :: Lens' (TextInput t) (Dynamic t Text)
reflex-dom-core/src/Reflex/Dom/Widget/Lazy.hs+2−2
@@ -52,7 +52,7 @@ virtualListWithSelection heightPx rowPx maxIndex i0 setI listTag listAttrs rowTa
52 return lis
52 return lis
53 selected <- holdDyn (indexToKey i0) sel
53 selected <- holdDyn (indexToKey i0) sel
54 pb <- getPostBuild
54 pb <- getPostBuild
55− scrollPosition <- holdDyn 0 $ leftmost [ domEvent Scroll container
55+ scrollPosition <- holdDyn 0 $ leftmost [ round <$> domEvent Scroll container
56 , fmap (const (i0 * rowPx)) pb
56 , fmap (const (i0 * rowPx)) pb
57 ]
57 ]
58 let window = zipDynWith (findWindow rowPx) heightPx scrollPosition
58 let window = zipDynWith (findWindow rowPx) heightPx scrollPosition
@@ -98,7 +98,7 @@ virtualList heightPx rowPx maxIndex i0 setI keyToIndex items0 itemsUpdate itemBu
98 pb <- getPostBuild
98 pb <- getPostBuild
99 rec (viewport, result) <- elDynAttr "div" containerStyle $ elDynAttr' "div" viewportStyle $ elDynAttr "div" virtualH $
99 rec (viewport, result) <- elDynAttr "div" containerStyle $ elDynAttr' "div" viewportStyle $ elDynAttr "div" virtualH $
100 listWithKeyShallowDiff items0 itemsUpdate $ \k v e -> elAttr "div" (mkRow k) $ itemBuilder k v e
100 listWithKeyShallowDiff items0 itemsUpdate $ \k v e -> elAttr "div" (mkRow k) $ itemBuilder k v e
101− scrollPosition <- holdDyn 0 $ leftmost [ domEvent Scroll viewport
101+ scrollPosition <- holdDyn 0 $ leftmost [ round <$> domEvent Scroll viewport
102 , fmap (const (i0 * rowPx)) pb
102 , fmap (const (i0 * rowPx)) pb
103 ]
103 ]
104 let window = zipDynWith (findWindow rowPx) heightPx scrollPosition
104 let window = zipDynWith (findWindow rowPx) heightPx scrollPosition
reflex-dom-core/src/Reflex/Dom/Widget/Resize.hs+4−3
@@ -24,7 +24,8 @@ import qualified Data.Map as Map
24import Data.Monoid
24import Data.Monoid
25import Data.Text (Text)
25import Data.Text (Text)
26import qualified Data.Text as T
26import qualified Data.Text as T
27−import GHCJS.DOM.Element hiding (reset)
27+import GHCJS.DOM.Element
28+import qualified GHCJS.DOM.GlobalEventHandlers as Events (scroll)
28import GHCJS.DOM.EventM (on)
29import GHCJS.DOM.EventM (on)
29import GHCJS.DOM.Types (liftJSM, MonadJSM)
30import GHCJS.DOM.Types (liftJSM, MonadJSM)
30
31
@@ -78,8 +79,8 @@ resizeDetectorWithAttrs attrs w = do
78 then return Nothing
79 then return Nothing
79 else fmap Just reset
80 else fmap Just reset
80 pb <- delay 0 =<< getPostBuild
81 pb <- delay 0 =<< getPostBuild
81− expandScroll <- wrapDomEvent (_element_raw expand) (`on` scroll) $ return ()
82+ expandScroll <- wrapDomEvent (_element_raw expand) (`on` Events.scroll) $ return ()
82− shrinkScroll <- wrapDomEvent (_element_raw shrink) (`on` scroll) $ return ()
83+ shrinkScroll <- wrapDomEvent (_element_raw shrink) (`on` Events.scroll) $ return ()
83 size0 <- performEvent $ fmap (const $ liftJSM reset) pb
84 size0 <- performEvent $ fmap (const $ liftJSM reset) pb
84 rec resize <- performEventAsync $ fmap (\d cb -> (liftIO . cb) =<< liftJSM (resetIfChanged d)) $ tag (current dimensions) $ leftmost [expandScroll, shrinkScroll]
85 rec resize <- performEventAsync $ fmap (\d cb -> (liftIO . cb) =<< liftJSM (resetIfChanged d)) $ tag (current dimensions) $ leftmost [expandScroll, shrinkScroll]
85 dimensions <- holdDyn (Nothing, Nothing) $ leftmost [ size0, fmapMaybe id resize ]
86 dimensions <- holdDyn (Nothing, Nothing) $ leftmost [ size0, fmapMaybe id resize ]
reflex-dom-core/src/Reflex/Dom/Xhr/Foreign.hs+8−11
@@ -10,7 +10,6 @@ module Reflex.Dom.Xhr.Foreign (
10) where
10) where
11
11
12import Control.Exception (throwIO)
12import Control.Exception (throwIO)
13−import Control.Monad (join)
14import Control.Monad.IO.Class (MonadIO(..))
13import Control.Monad.IO.Class (MonadIO(..))
15import Data.Maybe (fromMaybe)
14import Data.Maybe (fromMaybe)
16import Data.Text (Text)
15import Data.Text (Text)
@@ -19,7 +18,7 @@ import Foreign.JavaScript.Utils (bsFromMutableArrayBuffer, bsToArrayBuffer)
19import GHCJS.DOM.Enums
18import GHCJS.DOM.Enums
20import GHCJS.DOM.EventM (EventM, on)
19import GHCJS.DOM.EventM (EventM, on)
21import GHCJS.DOM.EventTarget (dispatchEvent)
20import GHCJS.DOM.EventTarget (dispatchEvent)
22−import GHCJS.DOM.Types hiding (Text)
21+import GHCJS.DOM.Types hiding (Text, ByteString)
23import GHCJS.DOM.XMLHttpRequest
22import GHCJS.DOM.XMLHttpRequest
24import Language.Javascript.JSaddle.Helper (mutableArrayBufferFromJSVal)
23import Language.Javascript.JSaddle.Helper (mutableArrayBufferFromJSVal)
25import qualified Language.Javascript.JSaddle.Monad as JS (catch)
24import qualified Language.Javascript.JSaddle.Monad as JS (catch)
@@ -33,7 +32,7 @@ xmlHttpRequestNew = newXMLHttpRequest
33xmlHttpRequestOpen ::
32xmlHttpRequestOpen ::
34 (ToJSString method, ToJSString url, ToJSString user, ToJSString password, MonadJSM m) =>
33 (ToJSString method, ToJSString url, ToJSString user, ToJSString password, MonadJSM m) =>
35 XMLHttpRequest -> method -> url -> Bool -> user -> password -> m ()
34 XMLHttpRequest -> method -> url -> Bool -> user -> password -> m ()
36−xmlHttpRequestOpen = open
35+xmlHttpRequestOpen request method url async user password = open request method url async (Just user) (Just password)
37
36
38convertException :: XHRError -> XhrException
37convertException :: XHRError -> XhrException
39convertException e = case e of
38convertException e = case e of
@@ -82,7 +81,7 @@ xmlHttpRequestAbort :: MonadJSM m => XMLHttpRequest -> m ()
82xmlHttpRequestAbort = abort
81xmlHttpRequestAbort = abort
83
82
84xmlHttpRequestGetAllResponseHeaders :: MonadJSM m => XMLHttpRequest -> m Text
83xmlHttpRequestGetAllResponseHeaders :: MonadJSM m => XMLHttpRequest -> m Text
85−xmlHttpRequestGetAllResponseHeaders self = fromMaybe "" <$> getAllResponseHeaders self
84+xmlHttpRequestGetAllResponseHeaders = getAllResponseHeaders
86
85
87xmlHttpRequestGetResponseHeader :: (ToJSString header, MonadJSM m)
86xmlHttpRequestGetResponseHeader :: (ToJSString header, MonadJSM m)
88 => XMLHttpRequest -> header -> m Text
87 => XMLHttpRequest -> header -> m Text
@@ -91,7 +90,7 @@ xmlHttpRequestGetResponseHeader self header = fromMaybe "" <$> getResponseHeader
91xmlHttpRequestOverrideMimeType :: (ToJSString override, MonadJSM m) => XMLHttpRequest -> override -> m ()
90xmlHttpRequestOverrideMimeType :: (ToJSString override, MonadJSM m) => XMLHttpRequest -> override -> m ()
92xmlHttpRequestOverrideMimeType = overrideMimeType
91xmlHttpRequestOverrideMimeType = overrideMimeType
93
92
94−xmlHttpRequestDispatchEvent :: (IsEvent evt, MonadJSM m) => XMLHttpRequest -> Maybe evt -> m Bool
93+xmlHttpRequestDispatchEvent :: (IsEvent evt, MonadJSM m) => XMLHttpRequest -> evt -> m Bool
95xmlHttpRequestDispatchEvent = dispatchEvent
94xmlHttpRequestDispatchEvent = dispatchEvent
96
95
97xmlHttpRequestOnabort :: XMLHttpRequest -> EventM XMLHttpRequest XMLHttpRequestProgressEvent () -> JSM (JSM ())
96xmlHttpRequestOnabort :: XMLHttpRequest -> EventM XMLHttpRequest XMLHttpRequestProgressEvent () -> JSM (JSM ())
@@ -134,7 +133,7 @@ xmlHttpRequestGetWithCredentials :: MonadJSM m => XMLHttpRequest -> m Bool
134xmlHttpRequestGetWithCredentials = getWithCredentials
133xmlHttpRequestGetWithCredentials = getWithCredentials
135
134
136xmlHttpRequestGetUpload :: MonadJSM m => XMLHttpRequest -> m (Maybe XMLHttpRequestUpload)
135xmlHttpRequestGetUpload :: MonadJSM m => XMLHttpRequest -> m (Maybe XMLHttpRequestUpload)
137−xmlHttpRequestGetUpload = getUpload
136+xmlHttpRequestGetUpload = fmap Just . getUpload
138
137
139xmlHttpRequestGetResponseText :: (FromJSString result, MonadJSM m) => XMLHttpRequest -> m (Maybe result)
138xmlHttpRequestGetResponseText :: (FromJSString result, MonadJSM m) => XMLHttpRequest -> m (Maybe result)
140xmlHttpRequestGetResponseText = getResponseText
139xmlHttpRequestGetResponseText = getResponseText
@@ -175,12 +174,10 @@ xmlHttpRequestGetResponse xhr = do
175 mr <- getResponse xhr
174 mr <- getResponse xhr
176 rt <- xmlHttpRequestGetResponseType xhr
175 rt <- xmlHttpRequestGetResponseType xhr
177 case rt of
176 case rt of
178− Just XhrResponseType_Blob -> fmap XhrResponseBody_Blob . join <$> mapM (castTo Blob) mr
177+ Just XhrResponseType_Blob -> fmap XhrResponseBody_Blob <$> castTo Blob mr
179 Just XhrResponseType_Text -> Just . XhrResponseBody_Text <$> xmlHttpRequestGetStatusText xhr
178 Just XhrResponseType_Text -> Just . XhrResponseBody_Text <$> xmlHttpRequestGetStatusText xhr
180 Just XhrResponseType_Default -> Just . XhrResponseBody_Text <$> xmlHttpRequestGetStatusText xhr
179 Just XhrResponseType_Default -> Just . XhrResponseBody_Text <$> xmlHttpRequestGetStatusText xhr
181− Just XhrResponseType_ArrayBuffer -> case fmap unGObject mr of
180+ Just XhrResponseType_ArrayBuffer -> do
182− Nothing -> return Nothing
183− Just ptr -> do
184− ab <- liftJSM $ mutableArrayBufferFromJSVal ptr
181+ ab <- liftJSM $ mutableArrayBufferFromJSVal mr
185 Just . XhrResponseBody_ArrayBuffer <$> bsFromMutableArrayBuffer ab
182 Just . XhrResponseBody_ArrayBuffer <$> bsFromMutableArrayBuffer ab
186 _ -> return Nothing
183 _ -> return Nothing