@@ -112,8 +112,8 @@ import Graphics.UI.Gtk.WebKit.JavaScriptCore.JSObjectRef
112 jspropertynamearraygetcount, jsobjectcopypropertynames,
112 jspropertynamearraygetcount, jsobjectcopypropertynames,
113 jsobjectcallasconstructor, jsobjectmakearray,
113 jsobjectcallasconstructor, jsobjectmakearray,
114 jsobjectcallasfunction,
114 jsobjectcallasfunction,
115− JSObjectCallAsFunctionCallback,
115+ JSObjectCallAsFunctionCallback, mkJSObjectCallAsFunctionCallback,
116− jsobjectmakefunctionwithcallback, JSObjectCallAsFunctionCallback')
116+ jsobjectmakefunctionwithcallback)
117import Graphics.UI.Gtk.WebKit.JavaScriptCore.JSValueRef
117import Graphics.UI.Gtk.WebKit.JavaScriptCore.JSValueRef
118 (jsvaluemakeundefined)
118 (jsvaluemakeundefined)
119import Graphics.UI.Gtk.WebKit.JavaScriptCore.JSContextRef
119import Graphics.UI.Gtk.WebKit.JavaScriptCore.JSContextRef
@@ -121,8 +121,8 @@ import Graphics.UI.Gtk.WebKit.JavaScriptCore.JSContextRef
121import Foreign (peekArray, nullPtr, withArrayLen)
121import Foreign (peekArray, nullPtr, withArrayLen)
122import Foreign.Ptr (freeHaskellFunPtr)
122import Foreign.Ptr (freeHaskellFunPtr)
123import Language.Javascript.JSaddle.Native
123import Language.Javascript.JSaddle.Native
124− (makeNewJSVal, wrapJSString, withJSVals, withObject, withJSString,
124+ (makeNewJSString, makeNewJSVal, wrapJSString, withJSVals,
125− withToJSVal)
125+ withObject, withJSString, withToJSVal)
126import System.IO.Unsafe (unsafePerformIO)
126import System.IO.Unsafe (unsafePerformIO)
127import Foreign.ForeignPtr (newForeignPtr_)
127import Foreign.ForeignPtr (newForeignPtr_)
@@ -147,8 +147,9 @@ import Data.Text (Text)
148-- >>> import Language.Javascript.JSaddle.Test (testJSaddle)
148-- >>> import Language.Javascript.JSaddle.Test (testJSaddle)
149-- >>> import Language.Javascript.JSaddle.Evaluate (eval)
149-- >>> import Language.Javascript.JSaddle.Evaluate (eval)
150−-- >>> import Language.Javascript.JSaddle.Value (val)
150+-- >>> import Language.Javascript.JSaddle.Value (val, valToText, JSNull(..))
151-- >>> import Control.Lens.Operators ((^.))
151-- >>> import Control.Lens.Operators ((^.))
152+-- >>> import qualified Data.Text as T (unpack)
153-- | Object can be made by evaluating a fnction in 'JSM' as long
154-- | Object can be made by evaluating a fnction in 'JSM' as long
154-- as it returns something we can make into a Object.
155-- as it returns something we can make into a Object.
@@ -159,6 +160,7 @@ instance MakeObject v => MakeObject (JSM v) where
159-- | Lookup a property based on its name.
160-- | Lookup a property based on its name.
161-- >>> testJSaddle $ eval "'Hello World'.length"
162-- >>> testJSaddle $ eval "'Hello World'.length"
162-- >>> testJSaddle $ val "Hello World" ! "length"
164-- >>> testJSaddle $ val "Hello World" ! "length"
164(!) :: (MakeObject this, ToJSString name)
166(!) :: (MakeObject this, ToJSString name)
@@ -175,6 +177,7 @@ this ! name = do
175-- | Lookup a property based on its index.
177-- | Lookup a property based on its index.
177-- >>> testJSaddle $ eval "'Hello World'[6]"
179-- >>> testJSaddle $ eval "'Hello World'[6]"
178-- >>> testJSaddle $ val "Hello World" !! 6
181-- >>> testJSaddle $ val "Hello World" !! 6
180(!!) :: (MakeObject this)
183(!!) :: (MakeObject this)
@@ -191,6 +194,7 @@ this !! index = do
191-- > js name = to (!name)
194-- > js name = to (!name)
193-- >>> testJSaddle $ eval "'Hello World'.length"
196-- >>> testJSaddle $ eval "'Hello World'.length"
194-- >>> testJSaddle $ val "Hello World" ^. js "length"
198-- >>> testJSaddle $ val "Hello World" ^. js "length"
196js :: (MakeObject s, ToJSString name)
200js :: (MakeObject s, ToJSString name)
@@ -204,6 +208,7 @@ js name = to (!name)
204-- > jss name = to (<#name)
208-- > jss name = to (<#name)
206-- >>> testJSaddle $ eval "'Hello World'.length"
210-- >>> testJSaddle $ eval "'Hello World'.length"
207-- >>> testJSaddle $ val "Hello World" ^. js "length"
212-- >>> testJSaddle $ val "Hello World" ^. js "length"
209jss :: (ToJSString name, ToJSVal val)
214jss :: (ToJSString name, ToJSVal val)
@@ -275,8 +280,13 @@ js5 name a0 a1 a2 a3 a4 = jsf name (a0, a1, a2, a3, a4)
275-- | Handy way to get and hold onto a reference top level javascript
280-- | Handy way to get and hold onto a reference top level javascript
277-- >>> testJSaddle $ eval "w = console; w.log('Hello World')"
282-- >>> testJSaddle $ eval "w = console; w.log('Hello World')"
283+-- ** Message: console message: @1: Hello World
278−-- >>> testJSaddle $ do w <- jsg "console"; w ^. js "log" # ["Hello World"]
286+-- >>> testJSaddle $ do w <- jsg "console"; w ^. js1 "log" "Hello World"
279−-- 11
287+-- ** Message: console message: [native code] @0: Hello World
280jsg :: ToJSString a => a -> JSM JSVal
290jsg :: ToJSString a => a -> JSM JSVal
281jsg name = global ! name
291jsg name = global ! name
282{-# INLINE jsg #-}
292{-# INLINE jsg #-}
@@ -285,9 +295,10 @@ jsg name = global ! name
286-- > jsgf name = jsg name . to (# args)
296-- > jsgf name = jsg name . to (# args)
288−-- >>> testJSaddle $ eval "globalFunc = function(x) {x.length}"
298+-- >>> testJSaddle $ eval "globalFunc = function (x) {return x.length;}"
299+-- function (x) {return x.length;}
289-- >>> testJSaddle $ jsgf "globalFunc" ["World"]
300-- >>> testJSaddle $ jsgf "globalFunc" ["World"]
291jsgf :: (ToJSString name, MakeArgs args) => name -> args -> JSM JSVal
302jsgf :: (ToJSString name, MakeArgs args) => name -> args -> JSM JSVal
292jsgf name = global # name
303jsgf name = global # name
293{-# INLINE jsgf #-}
304{-# INLINE jsgf #-}
@@ -297,7 +308,7 @@ jsgf name = global # name
297-- > jsg0 name = jsgf name ()
308-- > jsg0 name = jsgf name ()
299-- >>> testJSaddle $ jsg0 "globalFunc"
310-- >>> testJSaddle $ jsg0 "globalFunc"
300−-- hello world
311+-- TypeError: undefined is not an object (evaluating 'x.length')
301jsg0 :: (ToJSString name) => name -> JSM JSVal
312jsg0 :: (ToJSString name) => name -> JSM JSVal
302jsg0 name = jsgf name ()
313jsg0 name = jsgf name ()
303{-# INLINE jsg0 #-}
314{-# INLINE jsg0 #-}
@@ -307,7 +318,7 @@ jsg0 name = jsgf name ()
307-- > jsg1 name a0 = jsgf name [a0]
318-- > jsg1 name a0 = jsgf name [a0]
309-- >>> testJSaddle $ jsg1 "globalFunc" "World"
320-- >>> testJSaddle $ jsg1 "globalFunc" "World"
311jsg1 :: (ToJSString name, ToJSVal a0) => name -> a0 -> JSM JSVal
322jsg1 :: (ToJSString name, ToJSVal a0) => name -> a0 -> JSM JSVal
312jsg1 name a0 = jsgf name [a0]
323jsg1 name a0 = jsgf name [a0]
313{-# INLINE jsg1 #-}
324{-# INLINE jsg1 #-}
@@ -340,6 +351,7 @@ jsg5 name a0 a1 a2 a3 a4 = jsgf name (a0, a1, a2, a3, a4)
340-- | Call a JavaScript function
351-- | Call a JavaScript function
342-- >>> testJSaddle $ eval "'Hello World'.indexOf('World')"
353-- >>> testJSaddle $ eval "'Hello World'.indexOf('World')"
343-- >>> testJSaddle $ val "Hello World" # "indexOf" $ ["World"]
355-- >>> testJSaddle $ val "Hello World" # "indexOf" $ ["World"]
345infixr 2 #
357infixr 2 #
@@ -354,8 +366,10 @@ infixr 2 #
355-- | Call a JavaScript function
367-- | Call a JavaScript function
357−-- >>> testJSaddle $ eval "something[6]('World')"
369+-- >>> testJSaddle $ eval "something = {}; something[6]=function (x) {return x.length;}; something[6]('World')"
358−-- >>> testJSaddle $ val something ## 6 ["World"]
371+-- >>> testJSaddle $ jsg "something" ## 6 $ ["World"]
359infixr 2 ##
373infixr 2 ##
360(##) :: (MakeObject this, MakeArgs args)
374(##) :: (MakeObject this, MakeArgs args)
361 => this -> Index -> args -> JSM JSVal
375 => this -> Index -> args -> JSM JSVal
@@ -369,7 +383,8 @@ infixr 2 ##
369-- | Set a JavaScript property
383-- | Set a JavaScript property
371-- >>> testJSaddle $ eval "var j = {}; j.x = 1; j.x"
385-- >>> testJSaddle $ eval "var j = {}; j.x = 1; j.x"
372−-- >>> testJSaddle $ do {j <- eval "({})"; j <# "x" 1; j!"x"}
387+-- >>> testJSaddle $ do {j <- obj; (j <# "x") 1; j!"x"}
374infixr 1 <#
389infixr 1 <#
375(<#) :: (MakeObject this, ToJSString name, ToJSVal val)
390(<#) :: (MakeObject this, ToJSString name, ToJSVal val)
@@ -385,7 +400,8 @@ infixr 1 <#
385-- | Set a JavaScript property
400-- | Set a JavaScript property
387-- >>> testJSaddle $ eval "var j = {}; j[6] = 1; j[6]"
402-- >>> testJSaddle $ eval "var j = {}; j[6] = 1; j[6]"
388−-- >>> testJSaddle $ do {j <- eval "({})"; j <## 6 1; j!!6}
404+-- >>> testJSaddle $ do {j <- obj; (j <## 6) 1; j!!6}
390infixr 1 <##
406infixr 1 <##
391(<##) :: (MakeObject this, ToJSVal val)
407(<##) :: (MakeObject this, ToJSVal val)
@@ -417,6 +433,7 @@ new constructor args = do
417-- | Call function with a given @this@. In most cases you should use '#'.
433-- | Call function with a given @this@. In most cases you should use '#'.
419-- >>> testJSaddle $ eval "(function(){return this;}).apply('Hello', [])"
435-- >>> testJSaddle $ eval "(function(){return this;}).apply('Hello', [])"
420-- >>> testJSaddle $ do { test <- eval "(function(){return this;})"; call test (val "Hello") () }
437-- >>> testJSaddle $ do { test <- eval "(function(){return this;})"; call test (val "Hello") () }
422call :: (MakeObject f, MakeObject this, MakeArgs args)
439call :: (MakeObject f, MakeObject this, MakeArgs args)
@@ -430,7 +447,8 @@ call f this args = do
430-- | Make an empty object using the default constuctor
447-- | Make an empty object using the default constuctor
432-- >>> testJSaddle $ eval "var a = {}; a.x = 'Hello'; a.x"
449-- >>> testJSaddle $ eval "var a = {}; a.x = 'Hello'; a.x"
433−-- >>> testJSaddle $ do { a <- obj; a ^. js "x" <# "Hello"; a ^. js "x" }
451+-- >>> testJSaddle $ do { a <- obj; (a <# "x") "Hello"; a ^. js "x" }
435obj :: JSM Object
453obj :: JSM Object
436#ifdef ghcjs_HOST_OS
454#ifdef ghcjs_HOST_OS
@@ -456,6 +474,9 @@ type JSCallAsFunction = JSVal -- ^ Function object
456-- a to a JavaScipt one.
474-- a to a JavaScipt one.
458-- >>> testJSaddle $ eval "(function(f) {f('Hello');})(function (a) {console.log(a)})"
476-- >>> testJSaddle $ eval "(function(f) {f('Hello');})(function (a) {console.log(a)})"
477+-- ** Message: console message: @1: Hello
459-- >>> testJSaddle $ call (eval "(function(f) {f('Hello');})") global [fun $ \ _ _ args -> valToText (head args) >>= (liftIO . putStrLn . T.unpack) ]
480-- >>> testJSaddle $ call (eval "(function(f) {f('Hello');})") global [fun $ \ _ _ args -> valToText (head args) >>= (liftIO . putStrLn . T.unpack) ]
461-- undefined
482-- undefined
@@ -463,11 +484,6 @@ fun :: JSCallAsFunction -> JSCallAsFunction
464{-# INLINE fun #-}
485{-# INLINE fun #-}
466−#if !defined(ghcjs_HOST_OS)
467−foreign import ccall "wrapper"
468− mkJSObjectCallAsFunctionCallback :: JSObjectCallAsFunctionCallback' -> IO JSObjectCallAsFunctionCallback
471#ifdef ghcjs_HOST_OS
487#ifdef ghcjs_HOST_OS
472type HaskellCallback = Callback (JSVal -> JSVal -> IO ())
488type HaskellCallback = Callback (JSVal -> JSVal -> IO ())
@@ -557,9 +573,11 @@ makeArray args exceptions = do
557-- | Make an JavaScript array from a list of values
573-- | Make an JavaScript array from a list of values
559-- >>> testJSaddle $ eval "['Hello', 'World'][1]"
575-- >>> testJSaddle $ eval "['Hello', 'World'][1]"
560-- >>> testJSaddle $ array ["Hello", "World"] !! 1
577-- >>> testJSaddle $ array ["Hello", "World"] !! 1
562-- >>> testJSaddle $ eval "['Hello', null, undefined, true, 1]"
579-- >>> testJSaddle $ eval "['Hello', null, undefined, true, 1]"
563-- >>> testJSaddle $ array ("Hello", JSNull, (), True, 1.0::Double)
581-- >>> testJSaddle $ array ("Hello", JSNull, (), True, 1.0::Double)
564-- Hello,,,true,1
582-- Hello,,,true,1
565array :: MakeArgs args => args -> JSM Object
583array :: MakeArgs args => args -> JSM Object
@@ -634,7 +652,7 @@ propertyNamesCount names = liftIO $ jspropertynamearraygetcount names
635-- | Get a name out of a property name array
653-- | Get a name out of a property name array
636propertyNamesAt :: MonadIO m => JSPropertyNameArray -> CSize -> m JSString
654propertyNamesAt :: MonadIO m => JSPropertyNameArray -> CSize -> m JSString
637−propertyNamesAt names index = liftIO $ jspropertynamearraygetnameatindex names index >>= wrapJSString
655+propertyNamesAt names index = liftIO $ jspropertynamearraygetnameatindex names index >>= makeNewJSString
638{-# INLINE propertyNamesAt #-}
656{-# INLINE propertyNamesAt #-}
640-- | Convert property array to a list
658-- | Convert property array to a list