@@ -20,23 +20,26 @@ module Graphics.UI.Gtk.WebKit.JavaScriptCore.JSC.Object (
20 , objGetProperty
20 , objGetProperty
21 , objCallAsFunction
21 , objCallAsFunction
26 , function
26 , function
30import Graphics.UI.Gtk.WebKit.JavaScriptCore.JSBase
32import Graphics.UI.Gtk.WebKit.JavaScriptCore.JSBase
31 (JSStringRef, JSObjectRef, JSValueRefRef, JSValueRef, JSContextRef)
33 (JSStringRef, JSObjectRef, JSValueRefRef, JSValueRef, JSContextRef)
32import Foreign.C (CULong(..))
34import Foreign.C (CULong(..))
33import Graphics.UI.Gtk.WebKit.JavaScriptCore.JSObjectRef
35import Graphics.UI.Gtk.WebKit.JavaScriptCore.JSObjectRef
36+ (jsobjectcallasconstructor, jsobjectmakearray,
34− (jsobjectcallasfunction, jsobjectgetproperty, jsobjectsetproperty,
37+ jsobjectcallasfunction, jsobjectgetproperty, jsobjectsetproperty,
35 JSPropertyAttributes, JSObjectCallAsFunctionCallback,
38 JSPropertyAttributes, JSObjectCallAsFunctionCallback,
36 jsobjectmakefunctionwithcallback)
39 jsobjectmakefunctionwithcallback)
37import Graphics.UI.Gtk.WebKit.JavaScriptCore.JSC.Value
40import Graphics.UI.Gtk.WebKit.JavaScriptCore.JSC.Value
38 (valMakeUndefined, valToObject, MakeValueRef(..),
41 (valMakeUndefined, valToObject, MakeValueRef(..),
39− MakeStringRef(..))
42+ MakeStringRef(..), MakeArgRefs(..))
40import Graphics.UI.Gtk.WebKit.JavaScriptCore.JSC.Monad
43import Graphics.UI.Gtk.WebKit.JavaScriptCore.JSC.Monad
41 (rethrow, JSC)
44 (rethrow, JSC)
42import Control.Monad.Trans.Reader (runReaderT, ask)
45import Control.Monad.Trans.Reader (runReaderT, ask)
@@ -48,6 +51,60 @@ import qualified Data.Text as T (pack)
48import Foreign.Storable (Storable(..))
51import Foreign.Storable (Storable(..))
49import Graphics.UI.Gtk.WebKit.JavaScriptCore.JSValueRef
52import Graphics.UI.Gtk.WebKit.JavaScriptCore.JSValueRef
50 (jsvaluemakeundefined)
53 (jsvaluemakeundefined)
54+import Graphics.UI.Gtk.WebKit.JavaScriptCore.JSContextRef
55+ (jscontextgetglobalobject)
57+---- Object Referene ----
58+class MakeObjectRef this where
59+ makeObjectRef :: this -> JSC JSObjectRef
61+instance MakeObjectRef JSObjectRef where
62+ makeObjectRef = return
64+instance MakeObjectRef v => MakeObjectRef (JSC v) where
65+ makeObjectRef v = v >>= makeObjectRef
67+---- Property References ----
68+data JSPropRef = JSPropRef JSObjectRef JSStringRef
70+class MakePropRef this where
71+ makePropRef :: this -> JSC JSPropRef
73+instance MakePropRef JSPropRef where
74+ makePropRef (JSPropRef this name) = do
75+ rthis <- makeObjectRef this
76+ rname <- makeStringRef name
77+ return (JSPropRef rthis rname)
79+instance MakePropRef prop => MakePropRef (JSC prop) where
80+ makePropRef prop = prop >>= makePropRef
82+instance MakeObjectRef JSPropRef where
83+ makeObjectRef (JSPropRef this name) = rethrow $ objGetProperty this name
85+instance MakeValueRef JSPropRef where
86+ makeValueRef (JSPropRef this name) = rethrow $ objGetProperty this name
88+instance MakeArgRefs JSPropRef where
89+ makeArgRefs (JSPropRef this name) = do
90+ rarg <- rethrow $ objGetProperty this name
93+---- String global scope ----
94+instance MakePropRef String where
95+ makePropRef name = do
97+ rname <- makeStringRef name
98+ return (JSPropRef this rname)
100+instance MakeObjectRef String where
101+ makeObjectRef name = do
103+ rname <- makeStringRef name
104+ (rethrow $ objGetProperty this rname) >>= valToObject
106+global :: JSC JSObjectRef
107+global = ask >>= (liftIO . jscontextgetglobalobject)
52objSetProperty :: (MakeStringRef name, MakeValueRef val)
109objSetProperty :: (MakeStringRef name, MakeValueRef val)
53 => JSObjectRef
110 => JSObjectRef
@@ -72,34 +129,54 @@ objGetProperty this name exceptions = do
72 sName <- makeStringRef name
129 sName <- makeStringRef name
73 liftIO $ jsobjectgetproperty gctxt this sName exceptions
130 liftIO $ jsobjectgetproperty gctxt this sName exceptions
75−objCallAsFunction :: MakeValueRef arg
132+objCallAsFunction :: MakeArgRefs args
76 => JSObjectRef
133 => JSObjectRef
77 -> JSObjectRef
134 -> JSObjectRef
79 -> JSValueRefRef
136 -> JSValueRefRef
80 -> JSC JSValueRef
137 -> JSC JSValueRef
81objCallAsFunction function this args exceptions = do
138objCallAsFunction function this args exceptions = do
82 gctxt <- ask
139 gctxt <- ask
83− rargs <- mapM makeValueRef args
140+ rargs <- makeArgRefs args
84 liftIO $ withArrayLen rargs $ \ largs pargs ->
141 liftIO $ withArrayLen rargs $ \ largs pargs ->
85 jsobjectcallasfunction gctxt function this (fromIntegral largs) pargs exceptions
142 jsobjectcallasfunction gctxt function this (fromIntegral largs) pargs exceptions
87−this ! name = return (this, name)
144+objCallAsConstructor :: MakeArgRefs args
89−exp .! name2 = do
146+ -> args
90− (this1, name1) <- exp
147+ -> JSValueRefRef
91− this2 <- (rethrow $ objGetProperty this1 name1) >>= valToObject
148+ -> JSC JSValueRef
92− this2 ! name2
149+objCallAsConstructor function args exceptions = do
151+ rargs <- makeArgRefs args
152+ liftIO $ withArrayLen rargs $ \ largs pargs ->
153+ jsobjectcallasconstructor gctxt function (fromIntegral largs) pargs exceptions
155+(!) :: (MakeObjectRef this, MakeStringRef name) => this -> name -> JSC JSPropRef
157+ rthis <- makeObjectRef this
158+ rname <- makeStringRef name
159+ return (JSPropRef rthis rname)
161+(#) :: (MakePropRef prop, MakeArgRefs args)
162+ => prop -> args -> JSC JSValueRef
94−exp # args = do
163+prop # args = do
95− (this, name) <- exp
164+ (JSPropRef this name) <- makePropRef prop
96 f <- (rethrow $ objGetProperty this name) >>= valToObject
165 f <- (rethrow $ objGetProperty this name) >>= valToObject
97 rethrow $ objCallAsFunction f this args
166 rethrow $ objCallAsFunction f this args
168+(<#) :: (MakePropRef prop, MakeValueRef val)
169+ => prop -> val -> JSC ()
99−exp <# val = do
170+prop <# val = do
100− (this, name) <- exp
171+ (JSPropRef this name) <- makePropRef prop
101 rethrow $ objSetProperty this name val 0
172 rethrow $ objSetProperty this name val 0
174+new :: (MakeObjectRef constructor, MakeArgRefs args)
175+ => constructor -> args -> JSC JSValueRef
176+new constructor args = do
177+ f <- makeObjectRef constructor
178+ rethrow $ objCallAsConstructor f args
103type JSObjectCallAsFunctionCallback' =
180type JSObjectCallAsFunctionCallback' =
104 JSContextRef
181 JSContextRef
105 -> JSValueRef
182 -> JSValueRef
@@ -109,12 +186,14 @@ type JSObjectCallAsFunctionCallback' =
109 -> JSValueRefRef
186 -> JSValueRefRef
110 -> IO JSValueRef
187 -> IO JSValueRef
189+type JSCallAsFunction = JSValueRef -> JSValueRef -> [JSValueRef] -> JSC ()
112foreign import ccall "wrapper"
191foreign import ccall "wrapper"
113 mkJSObjectCallAsFunctionCallback :: JSObjectCallAsFunctionCallback' -> IO JSObjectCallAsFunctionCallback
192 mkJSObjectCallAsFunctionCallback :: JSObjectCallAsFunctionCallback' -> IO JSObjectCallAsFunctionCallback
115−function :: (MakeStringRef name, MakeValueRef result)
194+function :: MakeStringRef name
117− -> (JSValueRef -> JSValueRef -> [JSValueRef] -> JSC result)
196+ -> JSCallAsFunction
118 -> JSC JSObjectRef
197 -> JSC JSObjectRef
119function name f = do
198function name f = do
120 gctxt <- ask
199 gctxt <- ask
@@ -127,14 +206,50 @@ function name f = do
127 flip runReaderT ctx $ do
206 flip runReaderT ctx $ do
128 f fobj this args >>= makeValueRef
207 f fobj this args >>= makeValueRef
129 `E.catch` \(e :: SomeException) -> do
208 `E.catch` \(e :: SomeException) -> do
130− str <- runReaderT (makeValueRef $ show e) ctx
209+ str <- runReaderT (makeValueRef . T.pack $ show e) ctx
131 poke exception str
210 poke exception str
132 jsvaluemakeundefined ctx
211 jsvaluemakeundefined ctx
134−data JSCallAsFunction result = JSCallAsFunction (JSValueRef -> JSValueRef -> [JSValueRef] -> JSC result)
213+fun :: JSCallAsFunction -> JSCallAsFunction
216+instance MakeValueRef JSCallAsFunction where
217+ makeValueRef f = function (nullPtr::JSStringRef) f
219+instance MakeArgRefs JSCallAsFunction where
221+ rarg <- function (nullPtr::JSStringRef) f
224+makeArray :: MakeArgRefs args => args -> JSValueRefRef -> JSC JSObjectRef
225+makeArray args exceptions = do
227+ rargs <- makeArgRefs args
228+ liftIO $ withArrayLen rargs $ \ len ptr ->
229+ jsobjectmakearray gctxt (fromIntegral len) ptr exceptions
231+array :: MakeArgRefs args => args -> JSC JSValueRef
232+array = rethrow . makeArray
136−fun = JSCallAsFunction
138−instance MakeValueRef result => MakeValueRef (JSCallAsFunction result) where
139− makeValueRef (JSCallAsFunction f) = function (nullPtr::JSStringRef) f