@@ -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 File
4950import qualified GHCJS.DOM.HTMLInputElement as Input
5051import qualified GHCJS.DOM.HTMLSelectElement as Select
5152import qualified GHCJS.DOM.HTMLTextAreaElement as TextArea
@@ -288,6 +289,12 @@ instance SupportsImmediateDomBuilder t m => DomBuilder t (ImmediateDomBuilderT t
288289 [ False <$ Reflex.select (_element_events e) (WrapArg Blur)
289290 , True <$ Reflex.select (_element_events e) (WrapArg Focus)
290291 ]
292+ files <- wrapDomEvent domInputElement (`on` Element.change) $ do
293+ -- TODO emit files only for `file` input type
294+ -- ghcjs-dom > 0.3 exposes Input.getType
295+ mfiles <- Input.getFiles domInputElement
296+ let getMyFiles xs = fmap catMaybes . mapM (File.item xs) . flip take [0..] . fromIntegral =<< File.getLength xs
297+ maybe (return []) getMyFiles mfiles
291298 return $ InputElement
292299 { _inputElement_value = v
293300 , _inputElement_checked = uniqDyn c
@@ -296,6 +303,7 @@ instance SupportsImmediateDomBuilder t m => DomBuilder t (ImmediateDomBuilderT t
296303 , _inputElement_hasFocus = hasFocus
297304 , _inputElement_element = e
298305 , _inputElement_raw = domInputElement
306+ , _inputElement_files = files
299307 }
300308 {-# INLINABLE textAreaElement #-}
301309 textAreaElement cfg = do --TODO