diff --git a/yesod-core/ChangeLog.md b/yesod-core/ChangeLog.md index 2d1a6e75..3108ec47 100644 --- a/yesod-core/ChangeLog.md +++ b/yesod-core/ChangeLog.md @@ -1,5 +1,10 @@ # ChangeLog for yesod-core +## 1.6.16 + +* Add `jsAttributesHandler` to run arbitrary Handler code before building the + attributes map for the script tag generated by `widgetFile` [#1622](https://github.com/yesodweb/yesod/pull/1622) + ## 1.6.15 * Move `redirectToPost` JavaScript form submission from HTML element to diff --git a/yesod-core/src/Yesod/Core/Class/Yesod.hs b/yesod-core/src/Yesod/Core/Class/Yesod.hs index df8d195b..85a9d10c 100644 --- a/yesod-core/src/Yesod/Core/Class/Yesod.hs +++ b/yesod-core/src/Yesod/Core/Class/Yesod.hs @@ -249,6 +249,16 @@ class RenderRoute site => Yesod site where jsAttributes :: site -> [(Text, Text)] jsAttributes _ = [] + -- | Same as @jsAttributes@ but allows you to run arbitrary Handler code + -- + -- This is useful if you need to add a randomised nonce value to the script + -- tag generated by @widgetFile@. If this function is overridden then + -- @jsAttributes@ is ignored. + -- + -- @since 1.6.16 + jsAttributesHandler :: HandlerFor site [(Text, Text)] + jsAttributesHandler = jsAttributes <$> getYesod + -- | Create a session backend. Returning 'Nothing' disables -- sessions. If you'd like to change the way that the session -- cookies are created, take a look at @@ -520,7 +530,9 @@ defaultCsrfMiddleware = defaultCsrfSetCookieMiddleware . defaultCsrfCheckMiddlew widgetToPageContent :: Yesod site => WidgetFor site () -> HandlerFor site (PageContent (Route site)) -widgetToPageContent w = HandlerFor $ \hd -> do +widgetToPageContent w = do + jsAttrs <- jsAttributesHandler + HandlerFor $ \hd -> do master <- unHandlerFor getYesod hd ref <- newIORef mempty unWidgetFor w WidgetData @@ -564,7 +576,7 @@ widgetToPageContent w = HandlerFor $ \hd -> do ^{mkScriptTag s} $maybe j <- jscript $maybe s <- jsLoc -