on develop help sign in
Fix prerender for immediate mode

We were trying to do hydration stuff in immediate mode which meant prerender_ wouldn't return. Some tests were broken due to this, they are now fixed. There's also a regression test for prerender not returning in immediate mode.

commitd7f72a1cef616cf611024e412cfaf72d611dd1eb authorTom Smalley <tfsmalley@gmail.com> dateTue 18 Dec 2018, 17:43 (8 years ago) parentd694699
2 files changed+39−11
reflex-dom-core/src/Reflex/Dom/Prerender.hs+7−4 reflex-dom-core/test/hydration.hs+32−7
reflex-dom-core/src/Reflex/Dom/Prerender.hs+7−4
@@ -117,11 +117,14 @@ instance (Adjustable t m, PrerenderBaseConstraints t m, ReflexHost t) => Prerend
117117 , _immediateDomBuilderEnv_unreadyChildren = unreadyChildren
118118 , _immediateDomBuilderEnv_commitAction = pure ()
119119 }
120− (b', trigger) <- newTriggerEvent
121− addHydrationStep $ do
122− liftIO . trigger <=< lift $ runImmediateDomBuilderT (runPostBuildT client $ void b') immediateEnv events
123− insertBefore df =<< deleteToPrerenderEnd
124120 ((a, b0), _) <- lift $ runHydrationDomBuilderT server env events
121+ (b', trigger) <- newTriggerEvent
122+ getHydrationMode >>= \case
123+ HydrationMode_Immediate -> do
124+ liftIO . trigger <=< lift $ runImmediateDomBuilderT (runPostBuildT client $ void b') immediateEnv events
125+ HydrationMode_Hydrating -> addHydrationStep $ do
126+ liftIO . trigger <=< lift $ runImmediateDomBuilderT (runPostBuildT client $ void b') immediateEnv events
127+ insertBefore df =<< deleteToPrerenderEnd
125128 (,) (Just a) <$> holdDyn b0 b'
126129
127130instance SupportsStaticDomBuilder t m => Prerender t (StaticDomBuilderT t m) where
reflex-dom-core/test/hydration.hs+32−7
@@ -852,17 +852,15 @@ tests wdConfig caps _selenium = do
852852 it "postBuild works in replaced widget" $ runWD $ do
853853 replaceChan <- liftIO newChan
854854 pbLock <- liftIO newEmptyMVar
855− let check = do
856− liftIO $ do
857− writeChan replaceChan ()
858− takeMVar pbLock
855+ let check = liftIO $ do
856+ writeChan replaceChan ()
857+ takeMVar pbLock
859858 testWidget (pure ()) check $ void $ do
860859 replace <- triggerEventWithChan replaceChan
861860 runWithReplace (pure ()) $ ffor replace $ \() -> do
862861 pb <- getPostBuild
863862 performEvent_ $ liftIO (putMVar pbLock ()) <$ pb
864−
865− it "can be nested in event widget" $ runWD $ do -- Test is broken, I think
863+ it "can be nested in event widget" $ runWD $ do
866864 replaceChan1 :: Chan Text <- liftIO newChan
867865 replaceChan2 :: Chan Text <- liftIO newChan
868866 lock :: MVar () <- liftIO newEmptyMVar
@@ -888,7 +886,33 @@ tests wdConfig caps _selenium = do
888886 [ el "span" . text <$> replace2
889887 , el "div" (text "pb") <$ pb
890888 ]
891−
889+ it "prerender works in replaced widget" $ runWD $ do
890+ replaceChan <- liftIO newChan
891+ lock :: MVar () <- liftIO newEmptyMVar
892+ pbLock :: MVar () <- liftIO newEmptyMVar
893+ let check = do
894+ liftIO $ do
895+ writeChan replaceChan ()
896+ takeMVar lock
897+ takeMVar pbLock
898+ testWidget (pure ()) check $ void $ do
899+ replace <- triggerEventWithChan replaceChan
900+ runWithReplace (pure ()) $ ffor replace $ \() -> do
901+ prerender_ (pure ()) $ do
902+ liftIO $ putMVar lock ()
903+ pb <- getPostBuild
904+ performEvent_ $ liftIO (putMVar pbLock ()) <$ pb
905+ it "prerender returns in immediate mode" $ runWD $ do
906+ replaceChan <- liftIO newChan
907+ pbLock <- liftIO newEmptyMVar
908+ let check = liftIO $ do
909+ writeChan replaceChan ()
910+ takeMVar pbLock
911+ testWidget (pure ()) check $ void $ do
912+ replace <- triggerEventWithChan replaceChan
913+ runWithReplace (pure ()) $ ffor replace $ \() -> do
914+ prerender_ (pure ()) (pure ())
915+ liftIO $ putMVar pbLock ()
892916 it "works in immediate mode (RHS of prerender)" $ runWD $ do
893917 replaceChan :: Chan Text <- liftIO newChan
894918 let check = do
@@ -1257,6 +1281,7 @@ withSeleniumServer f = do
12571281triggerEventWithChan :: (Reflex t, TriggerEvent t m, Prerender t m) => Chan a -> m (Event t a)
12581282triggerEventWithChan chan = do
12591283 (e, trigger) <- newTriggerEvent
1284+ -- In prerender because we only want to do this on the client
12601285 prerender_ (pure ()) $ void $ liftIO $ forkIO $ forever $ trigger =<< readChan chan
12611286 pure e
12621287