@@ -46,6 +46,7 @@ import qualified GHCJS.DOM.Element as Element
4646import qualified GHCJS.DOM.Event as Event
4747import GHCJS.DOM.EventM (EventM, event, on)
4848import qualified GHCJS.DOM.EventM as DOM
49+import qualified GHCJS.DOM.FileList as FileList
4950import qualified GHCJS.DOM.HTMLInputElement as Input
5051import qualified GHCJS.DOM.HTMLSelectElement as Select
5152import qualified GHCJS.DOM.HTMLTextAreaElement as TextArea
@@ -201,6 +202,7 @@ instance DomSpace GhcjsDomSpace where
201202 type EventSpec GhcjsDomSpace = GhcjsEventSpec
202203 type RawTextNode GhcjsDomSpace = DOM.Text
203204 type RawElement GhcjsDomSpace = DOM.HTMLElement
205+ type RawFile GhcjsDomSpace = DOM.File
204206 type RawInputElement GhcjsDomSpace = DOM.HTMLInputElement
205207 type RawTextAreaElement GhcjsDomSpace = DOM.HTMLTextAreaElement
206208 type RawSelectElement GhcjsDomSpace = DOM.HTMLSelectElement
@@ -288,6 +290,10 @@ instance SupportsImmediateDomBuilder t m => DomBuilder t (ImmediateDomBuilderT t
288290 [ False <$ Reflex.select (_element_events e) (WrapArg Blur)
289291 , True <$ Reflex.select (_element_events e) (WrapArg Focus)
290292 ]
293+ files <- holdDyn mempty <=< wrapDomEvent domInputElement (`on` Element.change) $ do
294+ mfiles <- Input.getFiles domInputElement
295+ let getMyFiles xs = fmap catMaybes . mapM (FileList.item xs) . flip take [0..] . fromIntegral =<< FileList.getLength xs
296+ maybe (return []) getMyFiles mfiles
291297 return $ InputElement
292298 { _inputElement_value = v
293299 , _inputElement_checked = uniqDyn c
@@ -296,6 +302,7 @@ instance SupportsImmediateDomBuilder t m => DomBuilder t (ImmediateDomBuilderT t
296302 , _inputElement_hasFocus = hasFocus
297303 , _inputElement_element = e
298304 , _inputElement_raw = domInputElement
305+ , _inputElement_files = files
299306 }
300307 {-# INLINABLE textAreaElement #-}
301308 textAreaElement cfg = do --TODO