on master help sign in
Use ghcjs-base types `JSVal` and `Object`

The should make it easier to interop with other ghcjs libraries. * `JSValueRef` and `JSVal` are now the same type. * `JSObjectRef` is now for webkit only and Object is used instead. Since the webkit definition of `JSObjectRef` actually the same type as `JSValueRef`. * `Object` is defined for webkit in a way that is compatible with the ghcjs-base definition of `Object`.

commita657c4c66136b405446367db26161ae165e65200 authorHamish Mackenzie <Hamish.K.Mackenzie@googlemail.com> dateMon 26 Oct 2015, 00:17 (11 years ago) parenta6484f2
14 files changed+293−263
jsaddle.cabal+6−5 src/Language/Javascript/JSaddle.hs+2−2 src/Language/Javascript/JSaddle/Arguments.hs+7 src/Language/Javascript/JSaddle/Classes.hs+7−13 src/Language/Javascript/JSaddle/Evaluate.hs+12−18 src/Language/Javascript/JSaddle/Exception.hs+2−1 src/Language/Javascript/JSaddle/Monad.hs+10−7 src/Language/Javascript/JSaddle/Object.hs+123−106 src/Language/Javascript/JSaddle/PropRef.hs+3−10 src/Language/Javascript/JSaddle/Properties.hs+34−19 src/Language/Javascript/JSaddle/String.hs+5 src/Language/Javascript/JSaddle/Types.hs+16−31 src/Language/Javascript/JSaddle/Value.hs+65−50 tests/TestJSaddle.hs+1−1
jsaddle.cabal+6−5
@@ -1,5 +1,5 @@
11name: jsaddle
2−version: 0.2.2.0
2+version: 0.3.0.0
33cabal-version: >=1.10
44license: MIT
55license-file: LICENSE
@@ -44,7 +44,7 @@ library
4444 build-depends: webkit >=0.13.0.0 && <0.15,
4545 webkit-javascriptcore >=0.13.0.0 && <0.14
4646
47− build-depends: template-haskell -any, base <5, lens >=3.8.5 && <4.13,
47+ build-depends: template-haskell -any, base <5, lens >=3.8.5 && <4.14,
4848 text >=0.11.2.3 && <1.3, transformers >=0.3.0.0 && <0.5
4949
5050 exposed-modules: Language.Javascript.JSaddle
@@ -59,12 +59,13 @@ library
5959 default-language: Haskell2010
6060 hs-source-dirs: src
6161 other-modules: Language.Javascript.JSaddle.PropRef
62+ ghc-options: -ferror-spans
6263
6364test-suite test-tool
64− if flag(jsffi)
65− buildable: False
66− else
65+ if !impl(ghcjs) || flag(webkit)
6766 buildable: True
67+ else
68+ buildable: False
6869
6970 if impl(ghcjs) && flag(jsffi)
7071 cpp-options: -DUSE_JAVASCRIPTFFI
src/Language/Javascript/JSaddle.hs+2−2
@@ -18,11 +18,11 @@ module Language.Javascript.JSaddle (
1818 -- with JavaScript the EDSL has
1919 --
2020 -- * /Weakish typing/ - type classes are used to convert to JSValueRef
21− -- and JSObjectRef types
21+ -- and Object types
2222 --
2323 -- * /Strict evaluation/ - function in the 'JSM' monad can be passed in
2424 -- place of a value and will evaluated and converted to JSValueRef or
25− -- JSObjectRef and then passed on to JavaScript
25+ -- Object and then passed on to JavaScript
2626 --
2727 -- JSaddle should be used to write wrappers for JavaScript libraries that provide
2828 -- more type safety.
src/Language/Javascript/JSaddle/Arguments.hs+7
@@ -22,15 +22,18 @@ import Language.Javascript.JSaddle.Monad (JSM)
2222
2323instance MakeArgRefs arg => MakeArgRefs (JSM arg) where
2424 makeArgRefs arg = arg >>= makeArgRefs
25+ {-# INLINE makeArgRefs #-}
2526
2627instance MakeValueRef arg => MakeArgRefs [arg] where
2728 makeArgRefs = mapM makeValueRef
29+ {-# INLINE makeArgRefs #-}
2830
2931instance (MakeValueRef arg1, MakeValueRef arg2) => MakeArgRefs (arg1, arg2) where
3032 makeArgRefs (arg1, arg2) = do
3133 rarg1 <- makeValueRef arg1
3234 rarg2 <- makeValueRef arg2
3335 return [rarg1, rarg2]
36+ {-# INLINE makeArgRefs #-}
3437
3538instance (MakeValueRef arg1, MakeValueRef arg2, MakeValueRef arg3) => MakeArgRefs (arg1, arg2, arg3) where
3639 makeArgRefs (arg1, arg2, arg3) = do
@@ -38,6 +41,7 @@ instance (MakeValueRef arg1, MakeValueRef arg2, MakeValueRef arg3) => MakeArgRef
3841 rarg2 <- makeValueRef arg2
3942 rarg3 <- makeValueRef arg3
4043 return [rarg1, rarg2, rarg3]
44+ {-# INLINE makeArgRefs #-}
4145
4246instance (MakeValueRef arg1, MakeValueRef arg2, MakeValueRef arg3, MakeValueRef arg4) => MakeArgRefs (arg1, arg2, arg3, arg4) where
4347 makeArgRefs (arg1, arg2, arg3, arg4) = do
@@ -46,6 +50,7 @@ instance (MakeValueRef arg1, MakeValueRef arg2, MakeValueRef arg3, MakeValueRef
4650 rarg3 <- makeValueRef arg3
4751 rarg4 <- makeValueRef arg4
4852 return [rarg1, rarg2, rarg3, rarg4]
53+ {-# INLINE makeArgRefs #-}
4954
5055instance (MakeValueRef arg1, MakeValueRef arg2, MakeValueRef arg3, MakeValueRef arg4, MakeValueRef arg5) => MakeArgRefs (arg1, arg2, arg3, arg4, arg5) where
5156 makeArgRefs (arg1, arg2, arg3, arg4, arg5) = do
@@ -55,6 +60,7 @@ instance (MakeValueRef arg1, MakeValueRef arg2, MakeValueRef arg3, MakeValueRef
5560 rarg4 <- makeValueRef arg4
5661 rarg5 <- makeValueRef arg5
5762 return [rarg1, rarg2, rarg3, rarg4, rarg5]
63+ {-# INLINE makeArgRefs #-}
5864
5965
6066instance (MakeValueRef arg1, MakeValueRef arg2, MakeValueRef arg3, MakeValueRef arg4, MakeValueRef arg5, MakeValueRef arg6) => MakeArgRefs (arg1, arg2, arg3, arg4, arg5, arg6) where
@@ -66,4 +72,5 @@ instance (MakeValueRef arg1, MakeValueRef arg2, MakeValueRef arg3, MakeValueRef
6672 rarg5 <- makeValueRef arg5
6773 rarg6 <- makeValueRef arg6
6874 return [rarg1, rarg2, rarg3, rarg4, rarg5, rarg6]
75+ {-# INLINE makeArgRefs #-}
6976
src/Language/Javascript/JSaddle/Classes.hs+7−13
@@ -17,16 +17,15 @@ module Language.Javascript.JSaddle.Classes (
1717 MakeValueRef(..)
1818 , MakeStringRef(..)
1919 , MakeArgRefs(..)
20− , MakeObjectRef(..)
20+ , MakeObject(..)
2121 , MakePropRef(..)
2222) where
2323
2424import Control.Monad.IO.Class (MonadIO)
2525import Language.Javascript.JSaddle.Types
26− (JSObjectRef, JSStringRef, JSValueRef, castRef)
26+ (Object(..), JSStringRef, JSValueRef)
2727import Language.Javascript.JSaddle.Monad (JSM)
2828import Language.Javascript.JSaddle.PropRef (JSPropRef)
29−import GHCJS.Types (JSRef(..))
3029
3130-- | Anything that can be used to make a JavaScript value reference
3231class MakeValueRef a where
@@ -42,18 +41,13 @@ class MakeArgRefs this where
4241 makeArgRefs :: this -> JSM [JSValueRef]
4342
4443-- | Anything that can be used to make a JavaScript object reference
45−class MakeObjectRef this where
46− makeObjectRef :: this -> JSM JSObjectRef
44+class MakeObject this where
45+ makeObject :: this -> JSM Object
4746
4847-- | Anything that can be used to make a JavaScript property reference
4948class MakePropRef this where
5049 makePropRef :: this -> JSM JSPropRef
5150
52−
53−instance MakeObjectRef JSValueRef where
54− makeObjectRef = return . castRef
55−
56−instance MakeObjectRef JSRef where
57− makeObjectRef = return . castRef
58−
59−
51+instance MakeValueRef Object where
52+ makeValueRef (Object r) = return r
53+ {-# INLINE makeValueRef #-}
src/Language/Javascript/JSaddle/Evaluate.hs+12−18
@@ -24,12 +24,11 @@ module Language.Javascript.JSaddle.Evaluate (
2424import Control.Monad.Trans.Reader (ask)
2525import Control.Monad.IO.Class (MonadIO(..))
2626import Language.Javascript.JSaddle.Types
27− (JSStringRef, JSValueRef, JSObjectRef,
28− JSValueRefRef, castRef)
27+ (JSStringRef, JSValueRef, Object(..),
28+ JSValueRefRef)
2929#if (defined(ghcjs_HOST_OS) && defined(USE_JAVASCRIPTFFI)) || !defined(USE_WEBKIT)
3030import GHCJS.Types (nullRef)
31−import GHCJS.Prim (JSRef)
32−import Data.JSString (JSString)
31+import GHCJS.Marshal.Pure (pFromJSVal)
3332#else
3433import Graphics.UI.Gtk.WebKit.JavaScriptCore.JSBase
3534 (jsevaluatescript)
@@ -39,19 +38,15 @@ import Language.Javascript.JSaddle.Exception (rethrow)
3938import Language.Javascript.JSaddle.Value ()
4039import Language.Javascript.JSaddle.Object ()
4140import Language.Javascript.JSaddle.Classes
42− (MakeObjectRef(..), MakeStringRef(..))
41+ (MakeObject(..), MakeStringRef(..))
4342import Language.Javascript.JSaddle.Monad (JSM)
4443
45−
46−foreign import javascript unsafe
47− "$r = $1" jsRefToJSSTring :: JSRef -> JSString
48−
4944-- | Evaluates a script (like eval in java script). Unlike 'eval' this function lets you
5045-- specify a source URL and starting line number for beter error information.
5146--
5247-- >>> testJSaddle $ (evaluateScript "\n\n{" global "FileName" 53 >>= valToText) `catch` \(JSException e) -> array (e,e!"sourceURL", e!"line") >>= valToText
5348-- SyntaxError: Expected token '}',FileName,55
54−evaluateScript :: (MakeStringRef script, MakeObjectRef this, MakeStringRef url)
49+evaluateScript :: (MakeStringRef script, MakeObject this, MakeStringRef url)
5550 => script -- ^ JavaScript to evaluate
5651 -> this
5752 -> url
@@ -59,13 +54,15 @@ evaluateScript :: (MakeStringRef script, MakeObjectRef this, MakeStringRef url)
5954 -> JSM JSValueRef
6055#if defined(ghcjs_HOST_OS) && defined(USE_JAVASCRIPTFFI)
6156evaluateScript script this url line = liftIO $ js_eval (makeStringRef script)
57+{-# INLINE evaluateScript #-}
6258foreign import javascript unsafe "$r = eval($1);"
6359 js_eval :: JSStringRef -> IO JSValueRef
6460#elif defined(USE_WEBKIT)
6561evaluateScript script this url line = do
6662 gctxt <- ask
67− thisr <- makeObjectRef this
63+ (Object thisr) <- makeObject this
6864 rethrow $ liftIO . jsevaluatescript gctxt (makeStringRef script) thisr (makeStringRef url) line
65+{-# INLINE evaluateScript #-}
6966#else
7067evaluateScript = undefined
7168#endif
@@ -78,12 +75,9 @@ eval :: MakeStringRef script
7875 => script -- ^ JavaScript to evaluate
7976 -> JSM JSValueRef
8077#if (defined(ghcjs_HOST_OS) && defined(USE_JAVASCRIPTFFI)) || !defined(USE_WEBKIT)
81−eval script = evaluateScript script (castRef nullRef::JSObjectRef) (jsRefToJSSTring nullRef::JSStringRef) 1
78+eval script = evaluateScript script (Object nullRef) (pFromJSVal nullRef::JSStringRef) 1
79+{-# INLINE eval #-}
8280#else
83−eval script = evaluateScript script (castRef nullPtr::JSObjectRef) (jsRefToJSSTring nullPtr::JSStringRef) 1
81+eval script = evaluateScript script (Object nullPtr) (nullPtr::JSStringRef) 1
82+{-# INLINE eval #-}
8483#endif
85−
86−
87−
88−instance MakeObjectRef String where
89− makeObjectRef = makeObjectRef . eval
src/Language/Javascript/JSaddle/Exception.hs+2−1
@@ -24,8 +24,9 @@ import Language.Javascript.JSaddle.Monad (catchval, JSM)
2424import Control.Monad.IO.Class (MonadIO(..))
2525import Data.Text (Text)
2626
27−data JSException = JSException JSValueRef deriving (Show, Typeable)
27+newtype JSException = JSException JSValueRef deriving (Typeable)
2828
29+instance Show JSException where show _ = "JSException"
2930instance E.Exception JSException
3031
3132-- | Catch JavaScript exceptions and rethrow Haskell ones
src/Language/Javascript/JSaddle/Monad.hs+10−7
@@ -25,15 +25,14 @@ module Language.Javascript.JSaddle.Monad (
2525 , catch
2626) where
2727
28−import Prelude hiding (catch)
28+import Prelude hiding (catch, read)
2929import Control.Monad.Trans.Reader (runReaderT, ask, ReaderT(..))
3030import Language.Javascript.JSaddle.Types
31− (JSValueRefRef, JSValueRef, JSContextRef, JSValueRef(..))
31+ (JSValueRefRef(..), JSValueRef(..), JSContextRef)
3232import Control.Monad.IO.Class (MonadIO(..))
3333#if (defined(ghcjs_HOST_OS) && defined(USE_JAVASCRIPTFFI)) || !defined(USE_WEBKIT)
3434import GHCJS.Types (isUndefined, isNull)
35−--import GHCJS.Foreign (newArray, indexArray)
36−import qualified JavaScript.Array as Array
35+import qualified JavaScript.Array as Array (create, read)
3736#else
3837import Foreign (nullPtr, alloca)
3938import Foreign.Storable (Storable(..))
@@ -45,6 +44,7 @@ import Graphics.UI.Gtk.WebKit.JavaScriptCore.WebFrame
4544 (webFrameGetGlobalContext)
4645#endif
4746import qualified Control.Exception as E (Exception, catch)
47+import Control.Monad (void)
4848
4949-- | The @JSM@ monad keeps track of the JavaScript context.
5050--
@@ -65,6 +65,7 @@ catch :: (MonadIO m, E.Exception e)
6565t `catch` c = do
6666 r <- ask
6767 liftIO (runReaderT t r `E.catch` \e -> runReaderT (c e) r)
68+{-# INLINE catch #-}
6869
6970-- | Handle JavaScriptCore functions that take a JSValueRefRef in order
7071-- to throw exceptions.
@@ -73,10 +74,10 @@ catchval f catcher = do
7374#if (defined(ghcjs_HOST_OS) && defined(USE_JAVASCRIPTFFI)) || !defined(USE_WEBKIT)
7475 pexc <- liftIO Array.create
7576 result <- f pexc
76− exc <- liftIO $ (Array.! 0) <$> Array.freeze pexc
77+ exc <- liftIO $ Array.read 0 pexc
7778 if isUndefined exc || isNull exc
7879 then return result
79− else catcher (JSValueRef exc)
80+ else catcher exc
8081#else
8182 gctxt <- ask
8283 liftIO . alloca $ \pexc -> flip runReaderT gctxt $ do
@@ -97,5 +98,7 @@ runJSaddle webView f = do
9798 gctxt <- webViewGetMainFrame webView >>= webFrameGetGlobalContext
9899 runReaderT f gctxt
99100#endif
101+{-# INLINE runJSaddle #-}
100102
101−runJSaddle_ w f = runJSaddle w f >> return ()
103+runJSaddle_ w f = void $ runJSaddle w f
104+{-# INLINE runJSaddle_ #-}
src/Language/Javascript/JSaddle/Object.hs+123−106
@@ -20,8 +20,8 @@
2020-----------------------------------------------------------------------------
2121
2222module Language.Javascript.JSaddle.Object (
23− JSObjectRef
24− , MakeObjectRef(..)
23+ Object
24+ , MakeObject(..)
2525
2626 -- * Property lookup
2727 , (!)
@@ -76,21 +76,20 @@ module Language.Javascript.JSaddle.Object (
7676
7777import Prelude hiding ((!!))
7878import Language.Javascript.JSaddle.Types
79− (JSPropertyNameArrayRef, JSStringRef, JSObjectRef, JSValueRefRef,
80− JSValueRef, JSContextRef, Index, castRef)
79+ (JSPropertyNameArrayRef, JSStringRef, Object(..), JSValueRefRef,
80+ JSValueRef, JSContextRef, Index)
8181import Foreign.C.Types (CSize(..), CULong(..), CUInt(..), CULLong(..))
8282#if (defined(ghcjs_HOST_OS) && defined(USE_JAVASCRIPTFFI)) || !defined(USE_WEBKIT)
83−import GHCJS.Types (nullRef)
84−import qualified JavaScript.Object.Internal as Object
85−import JavaScript.Object.Internal (Object(Object))
86−import GHCJS.Foreign.Callback (syncCallback2, OnBlocked(ThrowWouldBlock))
87−--import GHCJS.Foreign (newObj, toArray, fromArray, syncCallback2, ForeignRetention(..))
83+import GHCJS.Types (nullRef, jsval)
84+import GHCJS.Foreign.Callback (syncCallback2, OnBlocked(..), Callback)
85+import GHCJS.Marshal.Pure (pFromJSVal)
86+import JavaScript.Array (JSArray)
87+import qualified JavaScript.Array as Array (toListIO, fromListIO)
88+import JavaScript.Array.Internal (SomeJSArray(..))
89+import qualified JavaScript.Object as Object (create)
8890import Control.Monad (liftM)
8991import Control.Applicative ((<$>))
90−import qualified JavaScript.Array as Array
91−import JavaScript.Array (JSArray)
92−import GHCJS.Prim (JSRef)
93−import Data.JSString (JSString)
92+import Data.Coerce (coerce)
9493#else
9594import Graphics.UI.Gtk.WebKit.JavaScriptCore.JSObjectRef
9695 (jsobjectmake, jspropertynamearraygetnameatindex,
@@ -112,7 +111,7 @@ import Language.Javascript.JSaddle.Value
112111import Language.Javascript.JSaddle.PropRef (JSPropRef(..))
113112import Language.Javascript.JSaddle.Classes
114113 (MakeValueRef(..), MakeStringRef(..), MakeArgRefs(..), MakePropRef(..),
115− MakeObjectRef(..))
114+ MakeObject(..))
116115import Language.Javascript.JSaddle.Monad
117116 (JSM)
118117import Control.Monad.Trans.Reader (runReaderT, ask)
@@ -126,23 +125,16 @@ import Control.Lens
126125 (IndexPreservingGetter, to, (^.))
127126import Language.Javascript.JSaddle.String (textToStr)
128127
129−objectToRef (Object r) = r
130−
131−foreign import javascript unsafe
132− "$r = $1" jsRefToJSSTring :: JSRef -> JSString
133−
134−foreign import javascript unsafe
135− "$r = $1" getJSArrayRef :: JSArray -> JSRef
136−
128+-- | If we already have a Object we are fine
129+instance MakeObject Object where
130+ makeObject = return
131+ {-# INLINE makeObject #-}
137132
138−-- | If we already have a JSObjectRef we are fine
139−instance MakeObjectRef JSObjectRef where
140− makeObjectRef = return
141−
142−-- | JSObjectRef can be made by evaluating a function in 'JSM' as long
143−-- as it returns something we can make into a JSObjectRef.
144−instance MakeObjectRef v => MakeObjectRef (JSM v) where
145− makeObjectRef v = v >>= makeObjectRef
133+-- | Object can be made by evaluating a function in 'JSM' as long
134+-- as it returns something we can make into a Object.
135+instance MakeObject v => MakeObject (JSM v) where
136+ makeObject v = v >>= makeObject
137+ {-# INLINE makeObject #-}
146138
147139-- | Lookup a property based on its name. This function just constructs a JSPropRef
148140-- the lookup is delayed until we use the JSPropRef. This makes it a bit lazy compared
@@ -151,15 +143,16 @@ instance MakeObjectRef v => MakeObjectRef (JSM v) where
151143-- >>> testJSaddle $ eval "'Hello World'.length"
152144-- >>> testJSaddle $ val "Hello World" ! "length"
153145-- 11
154−(!) :: (MakeObjectRef this, MakeStringRef name)
146+(!) :: (MakeObject this, MakeStringRef name)
155147 => this -- ^ Object to look on
156148 -> name -- ^ Name of the property to find
157149 -> JSM JSPropRef -- ^ Property reference
158150this ! name = do
159− rthis <- makeObjectRef this
151+ rthis <- makeObject this
160152 return (JSPropRef rthis rname)
161153 where
162154 rname = makeStringRef name
155+{-# INLINE (!) #-}
163156
164157-- | Lookup a property based on its index. This function just constructs a JSPropRef
165158-- the lookup is delayed until we use the JSPropRef. This makes it a bit lazy compared
@@ -168,13 +161,14 @@ this ! name = do
168161-- >>> testJSaddle $ eval "'Hello World'[6]"
169162-- >>> testJSaddle $ val "Hello World" !! 6
170163-- W
171−(!!) :: (MakeObjectRef this)
164+(!!) :: (MakeObject this)
172165 => this -- ^ Object to look on
173166 -> Index -- ^ Index of the property to lookup
174167 -> JSM JSPropRef -- ^ Property reference
175168this !! index = do
176− rthis <- makeObjectRef this
169+ rthis <- makeObject this
177170 return (JSPropIndexRef rthis index)
171+{-# INLINE (!!) #-}
178172
179173-- | Makes a getter for a particular property name.
180174--
@@ -183,13 +177,14 @@ this !! index = do
183177-- >>> testJSaddle $ eval "'Hello World'.length"
184178-- >>> testJSaddle $ val "Hello World" ^. js "length"
185179-- 11
186−js :: (MakeObjectRef s, MakeStringRef name)
180+js :: (MakeObject s, MakeStringRef name)
187181 => name -- ^ Name of the property to find
188182 -> IndexPreservingGetter s (JSM JSPropRef)
189183js name = to (!name)
184+{-# INLINE js #-}
190185
191186-- | Java script function applications have this type
192−type JSF = MakeObjectRef o => IndexPreservingGetter o (JSM JSValueRef)
187+type JSF = forall o . MakeObject o => IndexPreservingGetter o (JSM JSValueRef)
193188
194189-- | Handy way to call a function
195190--
@@ -201,6 +196,7 @@ jsf :: (MakeStringRef name, MakeArgRefs args) => name -> args -> JSF
201196jsf name args = function . to (# args)
202197 where
203198 function = js name
199+{-# INLINE jsf #-}
204200
205201-- | Handy way to call a function that expects no arguments
206202--
@@ -210,6 +206,7 @@ jsf name args = function . to (# args)
210206-- hello world
211207js0 :: (MakeStringRef name) => name -> JSF
212208js0 name = jsf name ()
209+{-# INLINE js0 #-}
213210
214211-- | Handy way to call a function that expects one argument
215212--
@@ -219,27 +216,32 @@ js0 name = jsf name ()
219216-- 6
220217js1 :: (MakeStringRef name, MakeValueRef a0) => name -> a0 -> JSF
221218js1 name a0 = jsf name [a0]
219+{-# INLINE js1 #-}
222220
223221-- | Handy way to call a function that expects two arguments
224222js2 :: (MakeStringRef name, MakeValueRef a0, MakeValueRef a1) => name -> a0 -> a1 -> JSF
225223js2 name a0 a1 = jsf name (a0, a1)
224+{-# INLINE js2 #-}
226225
227226-- | Handy way to call a function that expects three arguments
228227js3 :: (MakeStringRef name, MakeValueRef a0, MakeValueRef a1, MakeValueRef a2)
229228 => name -> a0 -> a1 -> a2 -> JSF
230229js3 name a0 a1 a2 = jsf name (a0, a1, a2)
230+{-# INLINE js3 #-}
231231
232232-- | Handy way to call a function that expects four arguments
233233js4 :: (MakeStringRef name, MakeValueRef a0, MakeValueRef a1, MakeValueRef a2,
234234 MakeValueRef a3)
235235 => name -> a0 -> a1 -> a2 -> a3 -> JSF
236236js4 name a0 a1 a2 a3 = jsf name (a0, a1, a2, a3)
237+{-# INLINE js4 #-}
237238
238239-- | Handy way to call a function that expects five arguments
239240js5 :: (MakeStringRef name, MakeValueRef a0, MakeValueRef a1, MakeValueRef a2,
240241 MakeValueRef a3, MakeValueRef a4)
241242 => name -> a0 -> a1 -> a2 -> a3 -> a4 -> JSF
242243js5 name a0 a1 a2 a3 a4 = jsf name (a0, a1, a2, a3, a4)
244+{-# INLINE js5 #-}
243245
244246
245247-- | Handy way to get and hold onto a reference top level javascript
@@ -249,6 +251,7 @@ js5 name a0 a1 a2 a3 a4 = jsf name (a0, a1, a2, a3, a4)
249251-- 11
250252jsg :: MakeStringRef a => a -> JSM JSPropRef
251253jsg name = global ! name
254+{-# INLINE jsg #-}
252255
253256-- | Call a JavaScript function
254257--
@@ -261,7 +264,9 @@ infixr 2 #
261264prop # args = do
262265 rprop <- makePropRef prop
263266 (this, f) <- objGetProperty' rprop
264− rethrow $ objCallAsFunction (castRef f) this args
267+ f' <- valToObject f
268+ rethrow $ objCallAsFunction f' this args
269+{-# INLINE (#) #-}
265270
266271-- | Call a JavaScript function
267272--
@@ -277,6 +282,7 @@ prop <# val = do
277282 p <- makePropRef prop
278283 objSetProperty p val
279284 return p
285+{-# INLINE (<#) #-}
280286
281287-- | Use this to create a new JavaScript object
282288--
@@ -285,39 +291,42 @@ prop <# val = do
285291--
286292-- >>> testJSaddle $ new "Date" (2013, 1, 1)
287293-- Fri Feb 01 2013 00:00:00 GMT+1300 (NZDT)
288−new :: (MakeObjectRef constructor, MakeArgRefs args)
294+new :: (MakeObject constructor, MakeArgRefs args)
289295 => constructor
290296 -> args
291297 -> JSM JSValueRef
292298new constructor args = do
293− f <- makeObjectRef constructor
299+ f <- makeObject constructor
294300 rethrow $ objCallAsConstructor f args
301+{-# INLINE new #-}
295302
296303-- | Call function with a given @this@. In most cases you should use '#'.
297304--
298305-- >>> testJSaddle $ eval "(function(){return this;}).apply('Hello', [])"
299306-- >>> testJSaddle $ do { test <- eval "(function(){return this;})"; call test (val "Hello") () }
300307-- Hello
301−call :: (MakeObjectRef function, MakeObjectRef this, MakeArgRefs args)
308+call :: (MakeObject function, MakeObject this, MakeArgRefs args)
302309 => function -> this -> args -> JSM JSValueRef
303310call function this args = do
304− rfunction <- makeObjectRef function
305− rthis <- makeObjectRef this
311+ rfunction <- makeObject function
312+ rthis <- makeObject this
306313 rethrow $ objCallAsFunction rfunction rthis args
314+{-# INLINE call #-}
307315
308316-- | Make an empty object using the default constuctor
309317--
310318-- >>> testJSaddle $ eval "var a = {}; a.x = 'Hello'; a.x"
311319-- >>> testJSaddle $ do { a <- obj; a ^. js "x" <# "Hello"; a ^. js "x" }
312320-- Hello
313−obj :: JSM JSObjectRef
321+obj :: JSM Object
314322#if (defined(ghcjs_HOST_OS) && defined(USE_JAVASCRIPTFFI)) || !defined(USE_WEBKIT)
315−obj = liftIO (castRef . objectToRef <$> Object.create)
323+obj = liftIO Object.create
316324#else
317325obj = do
318326 gctxt <- ask
319− liftIO $ jsobjectmake gctxt nullPtr nullPtr
327+ liftIO $ Object <$> jsobjectmake gctxt nullPtr nullPtr
320328#endif
329+{-# INLINE obj #-}
321330
322331-- | Type used for Haskell functions called from JavaScript.
323332type JSCallAsFunction = JSValueRef -- ^ Function object
@@ -338,81 +347,79 @@ type JSCallAsFunction = JSValueRef -- ^ Function object
338347-- undefined
339348fun :: JSCallAsFunction -> JSCallAsFunction
340349fun = id
350+{-# INLINE fun #-}
341351
342352#if (!defined(ghcjs_HOST_OS) || !defined(USE_JAVASCRIPTFFI)) && defined(USE_WEBKIT)
343353foreign import ccall "wrapper"
344354 mkJSObjectCallAsFunctionCallback :: JSObjectCallAsFunctionCallback' -> IO JSObjectCallAsFunctionCallback
345355#endif
346356
347−fromArray :: JSArray -> IO [JSStringRef]
348−fromArray a = fmap jsRefToJSSTring <$> Array.toListIO a
349−toArray :: [JSValueRef] -> IO JSArray
350−toArray a = Array.fromListIO (fmap castRef a)
351−
352357-- ^ Make a JavaScript function object that wraps a Haskell function.
353358function :: MakeStringRef name
354359 => name -- ^ Name of the function
355360 -> JSCallAsFunction -- ^ Haskell function to call
356− -> JSM JSObjectRef -- ^ Returns a JavaScript function object that will
361+ -> JSM Object -- ^ Returns a JavaScript function object that will
357362 -- call the Haskell one when it is called
358−-- #if defined(ghcjs_HOST_OS) && defined(USE_JAVASCRIPTFFI)
359−-- function name f = liftIO $ do
360−-- callback <- syncCallback2 ThrowWouldBlock True $ \this args -> do
361−-- rargs <- fromArray args
362−-- runReaderT (f this this rargs) () -- TODO pass function object through
363−-- makeFunctionWithCallback (makeStringRef name) callback
364−-- foreign import javascript unsafe "$r = function () { $2(this, arguments); }"
365−-- makeFunctionWithCallback :: JSStringRef -> JSFun (JSValueRef -> JSValueRefRef -> IO ()) -> IO JSObjectRef
366−-- #elif defined(USE_WEBKIT)
367−-- function name f = do
368−-- gctxt <- ask
369−-- callback <- liftIO $ mkJSObjectCallAsFunctionCallback wrap
370−-- liftIO $ jsobjectmakefunctionwithcallback gctxt (makeStringRef name) callback
371−-- where
372−-- wrap ctx fobj this argc argv exception = do
373−-- args <- peekArray (fromIntegral argc) argv
374−-- (`runReaderT` ctx) $
375−-- f fobj this args >>= makeValueRef
376−-- `E.catch` \(e :: SomeException) -> do
377−-- str <- runReaderT (makeValueRef . T.pack $ show e) ctx
378−-- poke exception str
379−-- jsvaluemakeundefined ctx
380−-- #else
381−-- function = undefined
382−-- #endif
383−
384−function = undefined
363+#if defined(ghcjs_HOST_OS) && defined(USE_JAVASCRIPTFFI)
364+function name f = liftIO $ do
365+ callback <- syncCallback2 ContinueAsync $ \this args -> do
366+ rargs <- Array.toListIO (coerce args)
367+ runReaderT (f this this rargs) () -- TODO pass function object through
368+ makeFunctionWithCallback (makeStringRef name) callback
369+foreign import javascript unsafe "$r = function () { $2(this, arguments); }"
370+ makeFunctionWithCallback :: JSStringRef -> Callback (JSValueRef -> JSValueRef -> IO ()) -> IO Object
371+#elif defined(USE_WEBKIT)
372+function name f = do
373+ gctxt <- ask
374+ callback <- liftIO $ mkJSObjectCallAsFunctionCallback wrap
375+ liftIO $ Object <$> jsobjectmakefunctionwithcallback gctxt (makeStringRef name) callback
376+ where
377+ wrap ctx fobj this argc argv exception = do
378+ args <- peekArray (fromIntegral argc) argv
379+ (`runReaderT` ctx) $
380+ f fobj this args >>= makeValueRef
381+ `E.catch` \(e :: SomeException) -> do
382+ str <- runReaderT (makeValueRef . T.pack $ show e) ctx
383+ poke exception str
384+ jsvaluemakeundefined ctx
385+#else
386+function = undefined
387+#endif
385388
386389-- | A callback to Haskell can be used as a JavaScript value. This will create
387390-- an anonymous JavaScript function object. Use 'function' to create one with
388391-- a name.
389392instance MakeValueRef JSCallAsFunction where
390393#if (defined(ghcjs_HOST_OS) && defined(USE_JAVASCRIPTFFI)) || !defined(USE_WEBKIT)
391− makeValueRef a = castRef <$> function (jsRefToJSSTring nullRef :: JSStringRef) a
394+ makeValueRef f = jsval <$> function (pFromJSVal nullRef :: JSStringRef) f
392395#else
393− makeValueRef a = castRef <$> function (jsRefToJSSTring nullPtr :: JSStringRef) a
396+ makeValueRef f = function (nullPtr :: JSStringRef) f >>= makeValueRef
394397#endif
398+ {-# INLINE makeValueRef #-}
395399
396400instance MakeArgRefs JSCallAsFunction where
397401 makeArgRefs f = do
398402#if (defined(ghcjs_HOST_OS) && defined(USE_JAVASCRIPTFFI)) || !defined(USE_WEBKIT)
399− rarg <- function (jsRefToJSSTring nullRef :: JSStringRef) f
403+ rarg <- jsval <$> function (pFromJSVal nullRef :: JSStringRef) f
400404#else
401− rarg <- function (jsRefToJSSTring nullPtr :: JSStringRef) f
405+ rarg <- function (nullPtr:: JSStringRef) f >>= makeValueRef
402406#endif
403− return [castRef rarg]
407+ return [rarg]
408+ {-# INLINE makeArgRefs #-}
404409
405−makeArray :: MakeArgRefs args => args -> JSValueRefRef -> JSM JSObjectRef
410+makeArray :: MakeArgRefs args => args -> JSValueRefRef -> JSM Object
406411#if (defined(ghcjs_HOST_OS) && defined(USE_JAVASCRIPTFFI)) || !defined(USE_WEBKIT)
407−--makeArray args exceptions = makeArgRefs args >>= liftIO . toArray
408−makeArray args exceptions = makeArgRefs args >>= liftM (castRef . getJSArrayRef) . liftIO . toArray
412+makeArray args exceptions = do
413+ rargs <- makeArgRefs args
414+ liftIO $ Object . jsval <$> Array.fromListIO rargs
409415#else
410416makeArray args exceptions = do
411417 gctxt <- ask
412418 rargs <- makeArgRefs args
413419 liftIO $ withArrayLen rargs $ \ len ptr ->
414− jsobjectmakearray gctxt (fromIntegral len) ptr exceptions
420+ Object <$> jsobjectmakearray gctxt (fromIntegral len) ptr exceptions
415421#endif
422+{-# INLINE makeArray #-}
416423
417424-- | Make an JavaScript array from a list of values
418425--
@@ -422,79 +429,89 @@ makeArray args exceptions = do
422429-- >>> testJSaddle $ eval "['Hello', null, undefined, true, 1]"
423430-- >>> testJSaddle $ array ("Hello", JSNull, (), True, 1.0::Double)
424431-- Hello,,,true,1
425−array :: MakeArgRefs args => args -> JSM JSObjectRef
432+array :: MakeArgRefs args => args -> JSM Object
426433array = rethrow . makeArray
427434
428435-- | JavaScript's global object
429−global :: JSM JSObjectRef
436+global :: JSM Object
430437#if defined(ghcjs_HOST_OS) && defined(USE_JAVASCRIPTFFI)
431438global = liftIO js_window
439+{-# INLINE global #-}
432440foreign import javascript unsafe "$r = window"
433− js_window :: IO JSObjectRef
441+ js_window :: IO Object
434442#elif defined(USE_WEBKIT)
435−global = ask >>= (liftIO . jscontextgetglobalobject)
443+global = ask >>= (liftIO . fmap Object . jscontextgetglobalobject)
444+{-# INLINE global #-}
436445#else
437446global = undefined
438447#endif
439448
440449-- | Get an array containing the property names present on a given object
441450#if (!defined(ghcjs_HOST_OS) || !defined(USE_JAVASCRIPTFFI)) && defined(USE_WEBKIT)
442−copyPropertyNames :: MakeObjectRef this => this -> JSM JSPropertyNameArrayRef
451+copyPropertyNames :: MakeObject this => this -> JSM JSPropertyNameArrayRef
443452copyPropertyNames this = do
444453 gctxt <- ask
445− rthis <- makeObjectRef this
454+ Object rthis <- makeObject this
446455 liftIO $ jsobjectcopypropertynames gctxt rthis
456+{-# INLINE copyPropertyNames #-}
447457
448458-- | Get the number of names in a property name array
449459propertyNamesCount :: MonadIO m => JSPropertyNameArrayRef -> m CSize
450460propertyNamesCount names = liftIO $ jspropertynamearraygetcount names
461+{-# INLINE propertyNamesCount #-}
451462
452463-- | Get a name out of a property name array
453464propertyNamesAt :: MonadIO m => JSPropertyNameArrayRef -> CSize -> m JSStringRef
454465propertyNamesAt names index = liftIO $ jspropertynamearraygetnameatindex names index
466+{-# INLINE propertyNamesAt #-}
455467
456468-- | Convert property array to a list
457469propertyNamesList :: MonadIO m => JSPropertyNameArrayRef -> m [JSStringRef]
458470propertyNamesList names = do
459471 count <- propertyNamesCount names
460472 mapM (propertyNamesAt names) $ enumFromTo 0 (count - 1)
473+{-# INLINE propertyNamesList #-}
461474#endif
462475
463476-- | Get a list containing the property names present on a given object
464−propertyNames :: MakeObjectRef this => this -> JSM [JSStringRef]
477+propertyNames :: MakeObject this => this -> JSM [JSStringRef]
465478#if defined(ghcjs_HOST_OS) && defined(USE_JAVASCRIPTFFI)
466−propertyNames this = makeObjectRef this >>= liftIO . js_propertyNames >>= liftIO . fromArray
479+propertyNames this = makeObject this >>= liftIO . js_propertyNames >>= liftIO . (fmap (map pFromJSVal)) . Array.toListIO
480+{-# INLINE propertyNames #-}
467481foreign import javascript unsafe "$r = []; h$forIn($1, function(n){$r.push(n);})"
468− js_propertyNames :: JSObjectRef -> IO JSArray
482+ js_propertyNames :: Object -> IO JSArray
469483#elif defined(USE_WEBKIT)
470484propertyNames this = copyPropertyNames this >>= propertyNamesList
485+{-# INLINE propertyNames #-}
471486#else
472487propertyNames = undefined
473488#endif
474489
475490-- | Get a list containing references to all the properties present on a given object
476−properties :: MakeObjectRef this => this -> JSM [JSPropRef]
491+properties :: MakeObject this => this -> JSM [JSPropRef]
477492properties this = propertyNames this >>= mapM (this !)
478493
479494-- | Call a JavaScript object as function. Consider using '#'.
480495objCallAsFunction :: MakeArgRefs args
481− => JSObjectRef
482− -> JSObjectRef
496+ => Object
497+ -> Object
483498 -> args
484499 -> JSValueRefRef
485500 -> JSM JSValueRef
486501#if defined(ghcjs_HOST_OS) && defined(USE_JAVASCRIPTFFI)
487502objCallAsFunction function this args exceptions = do
488− rargs <- (makeArgRefs args >>= liftIO . toArray) >>= (liftIO . Array.thaw)
503+ rargs <- makeArgRefs args >>= liftIO . Array.fromListIO
489504 liftIO $ js_apply function this rargs exceptions
505+{-# INLINE objCallAsFunction #-}
490506foreign import javascript unsafe "try { $r = $1.apply($2, $3) } catch(e) { $4[0] = e }"
491− js_apply :: JSObjectRef -> JSObjectRef -> JSValueRefRef -> JSValueRefRef -> IO JSValueRef
507+ js_apply :: Object -> Object -> JSValueRefRef -> JSValueRefRef -> IO JSValueRef
492508#elif defined(USE_WEBKIT)
493−objCallAsFunction function this args exceptions = do
509+objCallAsFunction (Object function) (Object this) args exceptions = do
494510 gctxt <- ask
495511 rargs <- makeArgRefs args
496512 liftIO $ withArrayLen rargs $ \ largs pargs ->
497513 jsobjectcallasfunction gctxt function this (fromIntegral largs) pargs exceptions
514+{-# INLINE objCallAsFunction #-}
498515#else
499516objCallAsFunction = undefined
500517#endif
@@ -504,13 +521,13 @@ objCallAsFunction = undefined
504521-- If you pass more than 7 arguments to a constructor for a built in
505522-- JavaScript type (like Date) then this function will fail.
506523objCallAsConstructor :: MakeArgRefs args
507− => JSObjectRef
524+ => Object
508525 -> args
509526 -> JSValueRefRef
510527 -> JSM JSValueRef
511528#if defined(ghcjs_HOST_OS) && defined(USE_JAVASCRIPTFFI)
512529objCallAsConstructor function args exceptions = do
513− rargs <- (makeArgRefs args >>= liftIO . toArray) >>= (liftIO . Array.thaw)
530+ rargs <- makeArgRefs args >>= liftIO . Array.fromListIO
514531 liftIO $ js_new function rargs exceptions
515532foreign import javascript unsafe "\
516533 try {\
@@ -539,9 +556,9 @@ foreign import javascript unsafe "\
539556 catch(e) {\
540557 $3[0] = e;\
541558 }"
542− js_new :: JSObjectRef -> JSValueRefRef -> JSValueRefRef -> IO JSValueRef
559+ js_new :: Object -> JSValueRefRef -> JSValueRefRef -> IO JSValueRef
543560#elif defined(USE_WEBKIT)
544−objCallAsConstructor function args exceptions = do
561+objCallAsConstructor (Object function) args exceptions = do
545562 gctxt <- ask
546563 rargs <- makeArgRefs args
547564 liftIO $ withArrayLen rargs $ \ largs pargs ->
src/Language/Javascript/JSaddle/PropRef.hs+3−10
@@ -1,6 +1,3 @@
1−{-# LANGUAGE LambdaCase #-}
2−{-# LANGUAGE MultiParamTypeClasses #-}
3−
41-----------------------------------------------------------------------------
52--
63-- Module : Language.Javascript.JSaddle.PropRef
@@ -18,15 +15,11 @@ module Language.Javascript.JSaddle.PropRef (
1815) where
1916
2017import Language.Javascript.JSaddle.Types
21− (JSStringRef, JSObjectRef, Index, RefCast(..))
22−import GHCJS.Types (JSRef)
23−
24−--foreign import javascript unsafe "$1[$2]"
25−-- getChild :: JSRef -> JSRef -> IO JSRef
18+ (JSStringRef, Object, Index)
2619
2720-- | A reference to a property.
2821-- Implemented as a reference to an object and something to find the property.
29−data JSPropRef = JSPropRef JSObjectRef JSStringRef -- ^ Object and property name.
30− | JSPropIndexRef JSObjectRef Index -- ^ Object and property index.
22+data JSPropRef = JSPropRef Object JSStringRef -- ^ Object and property name.
23+ | JSPropIndexRef Object Index -- ^ Object and property index.
3124
3225
src/Language/Javascript/JSaddle/Properties.hs+34−19
@@ -39,12 +39,12 @@ module Language.Javascript.JSaddle.Properties (
3939import Control.Applicative ((<$>))
4040import Language.Javascript.JSaddle.PropRef (JSPropRef(..))
4141import Language.Javascript.JSaddle.Classes
42− (MakePropRef(..), MakeObjectRef(..), MakeValueRef(..),
42+ (MakePropRef(..), MakeObject(..), MakeValueRef(..),
4343 MakeArgRefs(..), MakeStringRef(..))
4444import Language.Javascript.JSaddle.Monad (JSM)
4545import Language.Javascript.JSaddle.Types
46− (JSValueRefRef, JSObjectRef, JSPropertyAttributes,
47− Index(..), JSStringRef, castRef)
46+ (JSValueRefRef, Object(..), JSPropertyAttributes,
47+ Index(..), JSStringRef)
4848#if (defined(ghcjs_HOST_OS) && defined(USE_JAVASCRIPTFFI)) || !defined(USE_WEBKIT)
4949#else
5050import Graphics.UI.Gtk.WebKit.JavaScriptCore.JSObjectRef
@@ -62,57 +62,66 @@ import Language.Javascript.JSaddle.String ()
6262-- | If we already have a JSPropRef we are fine
6363instance MakePropRef JSPropRef where
6464 makePropRef = return
65+ {-# INLINE makePropRef #-}
6566
6667-- | JSPropRef can be made by evaluating a function in 'JSM' as long
6768-- as it returns something we can make into a JSPropRef.
6869instance MakePropRef prop => MakePropRef (JSM prop) where
6970 makePropRef prop = prop >>= makePropRef
71+ {-# INLINE makePropRef #-}
7072
7173-- | We can use a property as an object.
72−instance MakeObjectRef JSPropRef where
73− makeObjectRef a = castRef <$> objGetProperty a
74+instance MakeObject JSPropRef where
75+ makeObject prop = Object <$> objGetProperty prop
76+ {-# INLINE makeObject #-}
7477
7578-- | We can use a property as a value.
7679instance MakeValueRef JSPropRef where
7780 makeValueRef = objGetProperty
81+ {-# INLINE makeValueRef #-}
7882
7983-- | We can pass a property as the only paramter to a function.
8084instance MakeArgRefs JSPropRef where
8185 makeArgRefs p = do
8286 rarg <- objGetProperty p
8387 return [rarg]
88+ {-# INLINE makeArgRefs #-}
8489
8590-- | Get a property value given the object and the name of the property.
8691objGetPropertyByName :: MakeStringRef name
87− => JSObjectRef -- ^ object to find the property on.
92+ => Object -- ^ object to find the property on.
8893 -> name -- ^ name of the property.
8994 -> JSValueRefRef -- ^ exception if one is raised.
9095 -> JSM JSValueRef -- ^ returns the property value.
9196#if defined(ghcjs_HOST_OS) && defined(USE_JAVASCRIPTFFI)
9297objGetPropertyByName this name = liftIO . js_tryGetProp (makeStringRef name) this
98+{-# INLINE objGetPropertyByName #-}
9399foreign import javascript unsafe "try { $r=$2[$1] } catch(e) { $3[0] = e }"
94− js_tryGetProp :: JSStringRef -> JSObjectRef -> JSValueRefRef -> IO JSValueRef
100+ js_tryGetProp :: JSStringRef -> Object -> JSValueRefRef -> IO JSValueRef
95101#elif defined(USE_WEBKIT)
96−objGetPropertyByName this name exceptions = do
102+objGetPropertyByName (Object this) name exceptions = do
97103 gctxt <- ask
98104 liftIO $ jsobjectgetproperty gctxt this (makeStringRef name) exceptions
105+{-# INLINE objGetPropertyByName #-}
99106#else
100107objGetPropertyByName = undefined
101108#endif
102109
103110-- | Get a property value given the object and the index of the property.
104−objGetPropertyAtIndex :: JSObjectRef -- ^ object to find the property on.
111+objGetPropertyAtIndex :: Object -- ^ object to find the property on.
105112 -> Index -- ^ index of the property.
106113 -> JSValueRefRef -- ^ exception if one is raised.
107114 -> JSM JSValueRef -- ^ returns the property value.
108115#if defined(ghcjs_HOST_OS) && defined(USE_JAVASCRIPTFFI)
109116objGetPropertyAtIndex this index = liftIO . js_tryIndex index this
117+{-# INLINE objGetPropertyAtIndex #-}
110118foreign import javascript unsafe "try { $r=$2[$1] } catch(e) { $3[0] = e }"
111− js_tryIndex :: Index -> JSObjectRef -> JSValueRefRef -> IO JSValueRef
119+ js_tryIndex :: Index -> Object -> JSValueRefRef -> IO JSValueRef
112120#elif defined(USE_WEBKIT)
113−objGetPropertyAtIndex this index exceptions = do
121+objGetPropertyAtIndex (Object this) index exceptions = do
114122 gctxt <- ask
115123 liftIO $ jsobjectgetpropertyatindex gctxt this index exceptions
124+{-# INLINE objGetPropertyAtIndex #-}
116125#else
117126objGetPropertyAtIndex = undefined
118127#endif
@@ -124,22 +133,23 @@ objGetProperty (JSPropRef this name ) =
124133 rethrow $ objGetPropertyByName this name
125134objGetProperty (JSPropIndexRef this index) =
126135 rethrow $ objGetPropertyAtIndex this index
136+{-# INLINE objGetProperty #-}
127137
128138-- | This version of 'objGetProperty' is handy when you also need to perform.
129139-- another operation on the object the property is on.
130140objGetProperty' :: JSPropRef -- ^ property reference.
131− -> JSM (JSObjectRef, JSValueRef) -- ^ returns the object and property value.
141+ -> JSM (Object, JSValueRef) -- ^ returns the object and property value.
132142objGetProperty' (JSPropRef this name) = do
133143 p <- rethrow $ objGetPropertyByName this name
134144 return (this, p)
135145objGetProperty' (JSPropIndexRef this index) = do
136146 p <- rethrow $ objGetPropertyAtIndex this index
137147 return (this, p)
138−
148+{-# INLINE objGetProperty' #-}
139149
140150-- | Set a property value given the object and the name of the property.
141151objSetPropertyByName :: (MakeStringRef name, MakeValueRef val)
142− => JSObjectRef -- ^ object to set the property on.
152+ => Object -- ^ object to set the property on.
143153 -> name -- ^ name of the property.
144154 -> val -- ^ new value to set the property to.
145155 -> JSPropertyAttributes -- ^ property attributes to give the property.
@@ -149,20 +159,22 @@ objSetPropertyByName :: (MakeStringRef name, MakeValueRef val)
149159objSetPropertyByName this name val attributes exceptions = do
150160 vref <- makeValueRef val
151161 liftIO $ js_trySetProp (makeStringRef name) this vref exceptions
162+{-# INLINE objSetPropertyByName #-}
152163foreign import javascript unsafe "try { $2[$1]=$3 } catch(e) { $4[0] = e }"
153− js_trySetProp :: JSStringRef -> JSObjectRef -> JSValueRef -> JSValueRefRef -> IO ()
164+ js_trySetProp :: JSStringRef -> Object -> JSValueRef -> JSValueRefRef -> IO ()
154165#elif defined(USE_WEBKIT)
155−objSetPropertyByName this name val attributes exceptions = do
166+objSetPropertyByName (Object this) name val attributes exceptions = do
156167 gctxt <- ask
157168 vref <- makeValueRef val
158169 liftIO $ jsobjectsetproperty gctxt this (makeStringRef name) vref attributes exceptions
170+{-# INLINE objSetPropertyByName #-}
159171#else
160172objSetPropertyByName = undefined
161173#endif
162174
163175-- | Set a property value given the object and the index of the property.
164176objSetPropertyAtIndex :: (MakeValueRef val)
165− => JSObjectRef -- ^ object to find property on.
177+ => Object -- ^ object to find property on.
166178 -> Index -- ^ index of the property.
167179 -> val -- ^ new value to set the property to.
168180 -> JSValueRefRef -- ^ exception if one is raised.
@@ -171,13 +183,15 @@ objSetPropertyAtIndex :: (MakeValueRef val)
171183objSetPropertyAtIndex this index val exceptions = do
172184 vref <- makeValueRef val
173185 liftIO $ js_trySetAtIndex index this vref exceptions
186+{-# INLINE objSetPropertyAtIndex #-}
174187foreign import javascript unsafe "try { $2[$1]=$3 } catch(e) { $4[0] = e }"
175− js_trySetAtIndex :: Index -> JSObjectRef -> JSValueRef -> JSValueRefRef -> IO ()
188+ js_trySetAtIndex :: Index -> Object -> JSValueRef -> JSValueRefRef -> IO ()
176189#elif defined(USE_WEBKIT)
177−objSetPropertyAtIndex this index val exceptions = do
190+objSetPropertyAtIndex (Object this) index val exceptions = do
178191 gctxt <- ask
179192 vref <- makeValueRef val
180193 liftIO $ jsobjectsetpropertyatindex gctxt this index vref exceptions
194+{-# INLINE objSetPropertyAtIndex #-}
181195#else
182196objSetPropertyAtIndex = undefined
183197#endif
@@ -189,6 +203,7 @@ objSetProperty :: (MakeValueRef val)
189203 -> JSM ()
190204objSetProperty (JSPropRef this name ) val = rethrow $ objSetPropertyByName this name val 0
191205objSetProperty (JSPropIndexRef this index) val = rethrow $ objSetPropertyAtIndex this index val
206+{-# INLINE objSetProperty #-}
192207
193208
194209
src/Language/Javascript/JSaddle/String.hs+5
@@ -42,12 +42,15 @@ import System.IO.Unsafe (unsafePerformIO)
4242-- | If we already have a JSStringRef we are fine
4343instance MakeStringRef JSStringRef where
4444 makeStringRef = id
45+ {-# INLINE makeStringRef #-}
4546
4647instance MakeStringRef Text where
4748 makeStringRef = textToStr
49+ {-# INLINE makeStringRef #-}
4850
4951instance MakeStringRef String where
5052 makeStringRef = textToStr . T.pack
53+ {-# INLINE makeStringRef #-}
5154
5255-- | Convert a JavaScript string to a Haskell 'Text'
5356strToText :: MonadIO m => JSStringRef -> m Text
@@ -59,6 +62,7 @@ strToText jsstring = liftIO $ do
5962 p <- jsstringgetcharactersptr jsstring
6063 T.fromPtr (castPtr p) (fromIntegral l)
6164#endif
65+{-# INLINE strToText #-}
6266
6367-- | Convert a Haskell 'Text' to a JavaScript string
6468textToStr :: Text -> JSStringRef
@@ -69,6 +73,7 @@ textToStr text = unsafePerformIO $
6973 useAsPtr text $ \p l ->
7074 jsstringcreatewithcharacters (castPtr p) (fromIntegral l)
7175#endif
76+{-# INLINE textToStr #-}
7277
7378
7479
src/Language/Javascript/JSaddle/Types.hs+16−31
@@ -1,6 +1,5 @@
1−{-# LANGUAGE FlexibleInstances #-}
21{-# LANGUAGE CPP #-}
3−{-# LANGUAGE MultiParamTypeClasses #-}
2+{-# LANGUAGE FlexibleInstances #-}
43-----------------------------------------------------------------------------
54--
65-- Module : Language.Javascript.JSaddle.Properties
@@ -13,11 +12,21 @@
1312--
1413-----------------------------------------------------------------------------
1514
16−module Language.Javascript.JSaddle.Types where
15+module Language.Javascript.JSaddle.Types (
16+ JSValueRef(..)
17+ , JSValueRefRef(..)
18+ , Object(..)
19+ , JSPropertyNameArrayRef(..)
20+ , JSPropertyAttributes(..)
21+ , JSContextRef(..)
22+ , JSStringRef(..)
23+ , Index(..)
24+) where
1725
1826#if (defined(ghcjs_HOST_OS) && defined(USE_JAVASCRIPTFFI)) || !defined(USE_WEBKIT)
1927import GHCJS.Types
20−import JavaScript.Array
28+import JavaScript.Object.Internal (Object(..))
29+import JavaScript.Array (MutableJSArray)
2130import Data.Word (Word(..))
2231#else
2332import Graphics.UI.Gtk.WebKit.JavaScriptCore.JSBase
@@ -28,38 +37,14 @@ import Foreign.C (CUInt(..))
2837#endif
2938
3039#if (defined(ghcjs_HOST_OS) && defined(USE_JAVASCRIPTFFI)) || !defined(USE_WEBKIT)
31−--data ValueOrObject
32−--data Object
33−--data PropertyNameArray
34−newtype JSValueRef = JSValueRef { fromJSValueRef :: JSRef }
35−newtype JSObjectRef = JSObjectRef { fromJSObjectRef :: JSRef }
36−newtype JSPropertyNameArrayRef = JSPropertyNameArrayRef { fromJSPropertyNameArrayRef :: JSRef }
37−
38−instance Show JSValueRef where show _ = "JSValueRef"
39−instance Show JSObjectRef where show _ = "JSObjectRef"
40−instance Show JSPropertyNameArrayRef where show _ = "JSPropertyNameArrayRef"
41−--type JSValueRef = JSRef ValueOrObject
42−--type JSValueRefRef = JSArray ValueOrObject
40+type JSValueRef = JSVal
4341type JSValueRefRef = MutableJSArray
44−--type JSObjectRef = JSRef ValueOrObject
45−--type JSPropertyNameArrayRef = JSRef PropertyNameArray
42+newtype JSPropertyNameArrayRef = JSPropertyNameArrayRef { unJSPropertyNameArrayRef :: JSVal }
4643type JSPropertyAttributes = Word
4744type JSContextRef = ()
4845type JSStringRef = JSString
4946type Index = Int
50−
51−class RefCast a b where castRef :: a -> b
52−instance RefCast JSValueRef JSRef where castRef = fromJSValueRef
53−instance RefCast JSValueRef JSObjectRef where castRef = JSObjectRef . castRef
54−instance RefCast JSRef JSValueRef where castRef = JSValueRef
55−instance RefCast JSObjectRef JSValueRef where castRef = JSValueRef . castRef
56−instance RefCast JSObjectRef JSRef where castRef = fromJSObjectRef
57−instance RefCast JSRef JSObjectRef where castRef = JSObjectRef
58−
59−
60−instance Eq JSObjectRef
61−--instance Show (JSRef ValueOrObject)
62−--instance Eq (JSRef ValueOrObject)
6347#else
6448type Index = CUInt
49+newtype Object = Object JSObjectRef
6550#endif
src/Language/Javascript/JSaddle/Value.hs+65−50
@@ -65,15 +65,13 @@ module Language.Javascript.JSaddle.Value (
6565
6666import Prelude hiding (catch)
6767import Language.Javascript.JSaddle.Types
68− (JSValueRefRef, JSObjectRef, JSStringRef, JSValueRef(..), castRef)
68+ (JSValueRefRef, Object(..), JSStringRef, JSValueRef(..))
6969#if (defined(ghcjs_HOST_OS) && defined(USE_JAVASCRIPTFFI)) || !defined(USE_WEBKIT)
70−import GHCJS.Types (JSRef(..))
71−import GHCJS.Foreign (fromJSBool, toJSBool, jsNull, jsUndefined)
72−import GHCJS.Marshal (toJSRef)
73−import Data.JSString.Text (textFromJSString, textToJSString)
74−import qualified Data.JSString as JS
75−import GHCJS.Marshal.Pure (PToJSRef(..))
76−
70+import GHCJS.Types (JSVal(..))
71+import GHCJS.Foreign (toJSBool, isTruthy, jsNull, jsUndefined)
72+import GHCJS.Marshal (toJSVal)
73+import GHCJS.Marshal.Pure (pToJSVal)
74+import Data.JSString.Text (textToJSString)
7775#else
7876import Graphics.UI.Gtk.WebKit.JavaScriptCore.JSValueRef
7977 (jsvaluecreatejsonstring, JSType(..), jsvaluegettype,
@@ -94,15 +92,12 @@ import Control.Applicative ((<$>))
9492import Data.Text (Text)
9593import qualified Data.Text as T (pack)
9694import Language.Javascript.JSaddle.Classes
97− (MakeObjectRef(..), MakeStringRef(..), MakeValueRef(..),
95+ (MakeObject(..), MakeStringRef(..), MakeValueRef(..),
9896 MakeArgRefs(..))
9997import Language.Javascript.JSaddle.String (strToText, textToStr)
10098import Language.Javascript.JSaddle.Arguments ()
10199import Data.Word (Word)
102100
103−foreign import javascript unsafe
104− "$r = $1" getJSStrRef :: JS.JSString -> JSRef
105−
106101data JSNull = JSNull -- ^ Type that represents a value that can only be null.
107102 -- Haskell of course has no null so we are adding this type.
108103type JSUndefined = () -- ^ A type that can only be undefined in JavaScript. Using ()
@@ -119,8 +114,8 @@ data JSValue = ValNull -- ^ null
119114 | ValBool JSBool -- ^ true or false
120115 | ValNumber JSNumber -- ^ a number
121116 | ValString JSString -- ^ a string
122− | ValObject JSObjectRef -- ^ an object
123− deriving(Show, Eq)
117+ | ValObject Object -- ^ an object
118+-- deriving(Show, Eq)
124119
125120-- | Given a JavaScript value get its boolean value.
126121-- All values in JavaScript convert to bool.
@@ -143,13 +138,14 @@ data JSValue = ValNull -- ^ null
143138-- true
144139valToBool :: MakeValueRef val => val -> JSM JSBool
145140#if (defined(ghcjs_HOST_OS) && defined(USE_JAVASCRIPTFFI)) || !defined(USE_WEBKIT)
146−valToBool val = fromJSBool . castRef <$> makeValueRef val
141+valToBool val = isTruthy <$> makeValueRef val
147142#else
148143valToBool val = do
149144 gctxt <- ask
150145 rval <- makeValueRef val
151146 liftIO $ jsvaluetoboolean gctxt rval
152147#endif
148+{-# INLINE valToBool #-}
153149
154150-- | Given a JavaScript value get its numeric value.
155151-- May throw JSException.
@@ -172,13 +168,15 @@ valToBool val = do
172168-- 1.0
173169valToNumber :: MakeValueRef val => val -> JSM JSNumber
174170#if defined(ghcjs_HOST_OS) && defined(USE_JAVASCRIPTFFI)
175−valToNumber val = jsrefToNumber . castRef <$> makeValueRef val
176−foreign import javascript unsafe "$r = Number($1);" jsrefToNumber :: JSRef -> Double
171+valToNumber val = jsrefToNumber <$> makeValueRef val
172+{-# INLINE valToNumber #-}
173+foreign import javascript unsafe "$r = Number($1);" jsrefToNumber :: JSVal -> Double
177174#elif defined(USE_WEBKIT)
178175valToNumber val = do
179176 gctxt <- ask
180177 rval <- makeValueRef val
181178 rethrow $ liftIO . jsvaluetonumber gctxt rval
179+{-# INLINE valToNumber #-}
182180#else
183181valToNumber = undefined
184182#endif
@@ -204,13 +202,15 @@ valToNumber = undefined
204202-- 1
205203valToStr :: MakeValueRef val => val -> JSM JSStringRef
206204#if defined(ghcjs_HOST_OS) && defined(USE_JAVASCRIPTFFI)
207−valToStr val = jsrefToString . castRef <$> makeValueRef val
208−foreign import javascript unsafe "$r = $1.toString();" jsrefToString :: JSRef -> JSStringRef
205+valToStr val = jsrefToString <$> makeValueRef val
206+{-# INLINE valToStr #-}
207+foreign import javascript unsafe "$r = $1.toString();" jsrefToString :: JSVal -> JSStringRef
209208#elif defined(USE_WEBKIT)
210209valToStr val = do
211210 gctxt <- ask
212211 rval <- makeValueRef val
213212 rethrow $ liftIO . jsvaluetostringcopy gctxt rval
213+{-# INLINE valToStr #-}
214214#else
215215valToStr = undefined
216216#endif
@@ -236,6 +236,7 @@ valToStr = undefined
236236-- "1"
237237valToText :: MakeValueRef val => val -> JSM Text
238238valToText jsvar = valToStr jsvar >>= strToText
239+{-# INLINE valToText #-}
239240
240241-- | Given a JavaScript value get a JSON string value.
241242-- May throw JSException.
@@ -260,13 +261,15 @@ valToText jsvar = valToStr jsvar >>= strToText
260261-- {}
261262valToJSON :: MakeValueRef val => Word -> val -> JSM JSStringRef
262263#if defined(ghcjs_HOST_OS) && defined(USE_JAVASCRIPTFFI)
263−valToJSON indent val = jsrefToJSON . castRef <$> makeValueRef val
264−foreign import javascript unsafe "$r = JSON.stringify($1);" jsrefToJSON :: JSRef -> JSStringRef
264+valToJSON indent val = jsrefToJSON <$> makeValueRef val
265+{-# INLINE valToJSON #-}
266+foreign import javascript unsafe "$r = JSON.stringify($1);" jsrefToJSON :: JSVal -> JSStringRef
265267#elif defined(USE_WEBKIT)
266268valToJSON indent val = do
267269 gctxt <- ask
268270 rval <- makeValueRef val
269271 rethrow $ liftIO . jsvaluecreatejsonstring gctxt rval (fromIntegral indent)
272+{-# INLINE valToJSON #-}
270273#else
271274valToJSON = undefined
272275#endif
@@ -290,64 +293,74 @@ valToJSON = undefined
290293--
291294-- >>> testJSaddle $ valToObject "1"
292295-- 1
293−valToObject :: MakeValueRef val => val -> JSM JSObjectRef
296+valToObject :: MakeValueRef val => val -> JSM Object
297+valToObject val = Object <$>
294298#if (defined(ghcjs_HOST_OS) && defined(USE_JAVASCRIPTFFI)) || !defined(USE_WEBKIT)
295−valToObject val = castRef <$> makeValueRef val
299+ makeValueRef val
296300#else
297−valToObject val = do
298− gctxt <- ask
301+ do gctxt <- ask
299302 rval <- makeValueRef val
300303 rethrow $ liftIO . jsvaluetoobject gctxt rval
301304#endif
305+{-# INLINE valToObject #-}
302306
303307-- | Convert to a JavaScript value (just an alias for 'makeValueRef')
304308val :: MakeValueRef value
305309 => value -- ^ value to convert to a JavaScript value
306310 -> JSM JSValueRef
307311val = makeValueRef
312+{-# INLINE val #-}
308313
309314-- | If we already have a JSValueRef we are fine
310315instance MakeValueRef JSValueRef where
311316 makeValueRef = return
317+ {-# INLINE makeValueRef #-}
312318
313319-- | A single JSValueRef can be used as the argument list
314320instance MakeArgRefs JSValueRef where
315321 makeArgRefs arg = return [arg]
322+ {-# INLINE makeArgRefs #-}
316323
317324-- | JSValueRef can be made by evaluating a function in 'JSM' as long
318325-- as it returns something we can make into a JSValueRef.
319326instance MakeValueRef v => MakeValueRef (JSM v) where
320327 makeValueRef v = v >>= makeValueRef
328+ {-# INLINE makeValueRef #-}
321329
322330----------- null ---------------
323331-- | Make a @null@ JavaScript value
324332valMakeNull :: JSM JSValueRef
325333#if (defined(ghcjs_HOST_OS) && defined(USE_JAVASCRIPTFFI)) || !defined(USE_WEBKIT)
326−valMakeNull = return $ JSValueRef jsNull
334+valMakeNull = return jsNull
327335#else
328336valMakeNull = ask >>= (liftIO . jsvaluemakenull)
329337#endif
338+{-# INLINE valMakeNull #-}
330339
331340-- | Makes a @null@ JavaScript value
332341instance MakeValueRef JSNull where
333342 makeValueRef = const valMakeNull
343+ {-# INLINE makeValueRef #-}
334344
335345-- | Makes an argument list with just a single @null@ JavaScript value
336346instance MakeArgRefs JSNull where
337347 makeArgRefs _ = valMakeNull >>= (\ref -> return [ref])
348+ {-# INLINE makeArgRefs #-}
338349
339350----------- undefined ---------------
340351-- | Make an @undefined@ JavaScript value
341352valMakeUndefined :: JSM JSValueRef
342353#if (defined(ghcjs_HOST_OS) && defined(USE_JAVASCRIPTFFI)) || !defined(USE_WEBKIT)
343−valMakeUndefined = return $ JSValueRef jsUndefined
354+valMakeUndefined = return jsUndefined
344355#else
345356valMakeUndefined = ask >>= (liftIO . jsvaluemakeundefined)
346357#endif
358+{-# INLINE valMakeUndefined #-}
347359
348360-- | Makes an @undefined@ JavaScript value
349361instance MakeValueRef JSUndefined where
350362 makeValueRef = const valMakeUndefined
363+ {-# INLINE makeValueRef #-}
351364
352365--We can't allow this if JSUndefined is () as () is no args not "(null)".
353366--Use [()] instead.
@@ -357,67 +370,78 @@ instance MakeValueRef JSUndefined where
357370-- | This allows us to pass no arguments easily (altenative would be to use @[]::[JSValueRef]@).
358371instance MakeArgRefs () where
359372 makeArgRefs _ = return []
373+ {-# INLINE makeArgRefs #-}
360374
361375----------- booleans ---------------
362376-- | Make a JavaScript boolean value
363377valMakeBool :: JSBool -> JSM JSValueRef
364378#if (defined(ghcjs_HOST_OS) && defined(USE_JAVASCRIPTFFI)) || !defined(USE_WEBKIT)
365−valMakeBool b = return . castRef $ toJSBool b
379+valMakeBool b = return $ toJSBool b
366380#else
367381valMakeBool b = do
368382 gctxt <- ask
369383 liftIO $ jsvaluemakeboolean gctxt b
370384#endif
385+{-# INLINE valMakeBool #-}
371386
372387-- | Make a JavaScript boolean value
373388instance MakeValueRef Bool where
374389 makeValueRef = valMakeBool
390+ {-# INLINE makeValueRef #-}
375391
376392-- | Makes an argument list with just a single JavaScript boolean value
377393instance MakeArgRefs Bool where
378394 makeArgRefs b = valMakeBool b >>= (\ref -> return [ref])
395+ {-# INLINE makeArgRefs #-}
379396
380397----------- numbers ---------------
381398-- | Make a JavaScript number
382399valMakeNumber :: JSNumber -> JSM JSValueRef
383400#if (defined(ghcjs_HOST_OS) && defined(USE_JAVASCRIPTFFI)) || !defined(USE_WEBKIT)
384−valMakeNumber n = liftIO $ castRef <$> toJSRef n
401+valMakeNumber n = liftIO $ toJSVal n
385402#else
386403valMakeNumber n = do
387404 gctxt <- ask
388405 liftIO $ jsvaluemakenumber gctxt n
389406#endif
407+{-# INLINE valMakeNumber #-}
390408
391409-- | Makes a JavaScript number
392410instance MakeValueRef Double where
393411 makeValueRef = valMakeNumber
412+ {-# INLINE makeValueRef #-}
394413
395414-- | Makes an argument list with just a single JavaScript number
396415instance MakeArgRefs Double where
397416 makeArgRefs n = valMakeNumber n >>= (\ref -> return [ref])
417+ {-# INLINE makeArgRefs #-}
398418
399419----------- numbers ---------------
400420-- | Make a JavaScript string
401421valMakeString :: Text -> JSM JSValueRef
402422#if (defined(ghcjs_HOST_OS) && defined(USE_JAVASCRIPTFFI)) || !defined(USE_WEBKIT)
403−valMakeString = return . castRef . getJSStrRef . textToJSString
423+valMakeString = return . pToJSVal . textToJSString
404424#else
405425valMakeString text = do
406426 gctxt <- ask
407427 liftIO $ jsvaluemakestring gctxt (textToStr text)
408428#endif
429+{-# INLINE valMakeString #-}
409430
410431-- | Makes a JavaScript string
411432instance MakeValueRef Text where
412433 makeValueRef = valMakeString
434+ {-# INLINE makeValueRef #-}
413435
414436-- | Makes an argument list with just a single JavaScript string
415437instance MakeArgRefs Text where
416438 makeArgRefs t = valMakeString t >>= (\ref -> return [ref])
439+ {-# INLINE makeArgRefs #-}
417440
418441-- | Makes a JavaScript string
419442instance MakeValueRef String where
420443 makeValueRef = valMakeString . T.pack
444+ {-# INLINE makeValueRef #-}
421445
422446-- | Derefernce a value reference.
423447--
@@ -488,33 +512,24 @@ deRefVal = undefined
488512valMakeRef :: JSValue -> JSM JSValueRef
489513valMakeRef val =
490514 case val of
491− ValNull -> valMakeNull
492− ValUndefined -> valMakeUndefined
493− ValBool b -> valMakeBool b
494− ValNumber n -> valMakeNumber n
495− ValString s -> valMakeString s
496− ValObject o -> return $ castRef o
515+ ValNull -> valMakeNull
516+ ValUndefined -> valMakeUndefined
517+ ValBool b -> valMakeBool b
518+ ValNumber n -> valMakeNumber n
519+ ValString s -> valMakeString s
520+ ValObject (Object o) -> return o
497521
498522-- | Makes a JavaScript value from a 'JSValue' ADT.
499523instance MakeValueRef JSValue where
500524 makeValueRef = valMakeRef
501−
502−instance MakeValueRef JSRef where
503− makeValueRef = return . castRef
504−
505−instance MakeValueRef Int where
506− makeValueRef = return . castRef . pToJSRef
507−
508−instance MakeValueRef Float where
509− makeValueRef = return . castRef . pToJSRef
510−
525+ {-# INLINE makeValueRef #-}
511526
512527-- | Makes an argument list with just a single JavaScript value from a 'JSValue' ADT.
513528instance MakeArgRefs JSValue where
514529 makeArgRefs v = valMakeRef v >>= (\ref -> return [ref])
530+ {-# INLINE makeArgRefs #-}
515531
516−instance MakeObjectRef JSNull where
517− makeObjectRef = const (castRef <$> valMakeNull)
518−
519−
532+--instance MakeObjectRef JSNull where
533+-- makeObjectRef _ = Object <$> valMakeNull
534+-- {-# INLINE makeObjectRef #-}
520535
tests/TestJSaddle.hs+1−1
@@ -91,7 +91,7 @@ testJSaddle' showWindow f = do
9191 mainQuit
9292 debugLog "put done"
9393 putMVar done ()
94− return True
94+ return ()
9595 debugLog "get context"
9696 jsContext <- webViewGetMainFrame webView >>= webFrameGetGlobalContext
9797 debugLog "put initial state"