annotate pydershell/pydershell.py @ 28:f974d4a80473 default tip

Some fixes.
author Atul Varma <varmaa@toolness.com>
date Tue, 08 Sep 2009 15:27:02 -0700
parents 7f12db104246
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
10
fb25af17bae6 Added pydershell.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1 import sys
fb25af17bae6 Added pydershell.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2 import time
fb25af17bae6 Added pydershell.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
3 import threading
fb25af17bae6 Added pydershell.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
4 import traceback
12
f024e41d0fb9 More refactoring, a bit more documentation.
Atul Varma <varmaa@toolness.com>
parents: 11
diff changeset
5 import weakref
21
1950b0b5bcd8 It's now possible to expose python class instances to JS, if they're declared the right way (for security purposes).
Atul Varma <varmaa@toolness.com>
parents: 20
diff changeset
6 import types
12
f024e41d0fb9 More refactoring, a bit more documentation.
Atul Varma <varmaa@toolness.com>
parents: 11
diff changeset
7
10
fb25af17bae6 Added pydershell.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
8 import pydermonkey
fb25af17bae6 Added pydershell.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
9
12
f024e41d0fb9 More refactoring, a bit more documentation.
Atul Varma <varmaa@toolness.com>
parents: 11
diff changeset
10 class ContextWatchdogThread(threading.Thread):
f024e41d0fb9 More refactoring, a bit more documentation.
Atul Varma <varmaa@toolness.com>
parents: 11
diff changeset
11 """
f024e41d0fb9 More refactoring, a bit more documentation.
Atul Varma <varmaa@toolness.com>
parents: 11
diff changeset
12 Watches active JS contexts and triggers their operation callbacks
f024e41d0fb9 More refactoring, a bit more documentation.
Atul Varma <varmaa@toolness.com>
parents: 11
diff changeset
13 at a regular interval.
f024e41d0fb9 More refactoring, a bit more documentation.
Atul Varma <varmaa@toolness.com>
parents: 11
diff changeset
14 """
f024e41d0fb9 More refactoring, a bit more documentation.
Atul Varma <varmaa@toolness.com>
parents: 11
diff changeset
15
23
35ab0ad3c294 Added more docs.
Atul Varma <varmaa@toolness.com>
parents: 22
diff changeset
16 # Default interval, in seconds, that the operation callbacks are
35ab0ad3c294 Added more docs.
Atul Varma <varmaa@toolness.com>
parents: 22
diff changeset
17 # triggered at.
13
2a3313bfe574 Minor refactoring.
Atul Varma <varmaa@toolness.com>
parents: 12
diff changeset
18 DEFAULT_INTERVAL = 0.25
2a3313bfe574 Minor refactoring.
Atul Varma <varmaa@toolness.com>
parents: 12
diff changeset
19
2a3313bfe574 Minor refactoring.
Atul Varma <varmaa@toolness.com>
parents: 12
diff changeset
20 def __init__(self, interval=DEFAULT_INTERVAL):
12
f024e41d0fb9 More refactoring, a bit more documentation.
Atul Varma <varmaa@toolness.com>
parents: 11
diff changeset
21 threading.Thread.__init__(self)
f024e41d0fb9 More refactoring, a bit more documentation.
Atul Varma <varmaa@toolness.com>
parents: 11
diff changeset
22 self._lock = threading.Lock()
f024e41d0fb9 More refactoring, a bit more documentation.
Atul Varma <varmaa@toolness.com>
parents: 11
diff changeset
23 self._stop = threading.Event()
f024e41d0fb9 More refactoring, a bit more documentation.
Atul Varma <varmaa@toolness.com>
parents: 11
diff changeset
24 self._contexts = []
f024e41d0fb9 More refactoring, a bit more documentation.
Atul Varma <varmaa@toolness.com>
parents: 11
diff changeset
25 self.interval = interval
f024e41d0fb9 More refactoring, a bit more documentation.
Atul Varma <varmaa@toolness.com>
parents: 11
diff changeset
26 self.setDaemon(True)
f024e41d0fb9 More refactoring, a bit more documentation.
Atul Varma <varmaa@toolness.com>
parents: 11
diff changeset
27
f024e41d0fb9 More refactoring, a bit more documentation.
Atul Varma <varmaa@toolness.com>
parents: 11
diff changeset
28 def add_context(self, cx):
f024e41d0fb9 More refactoring, a bit more documentation.
Atul Varma <varmaa@toolness.com>
parents: 11
diff changeset
29 self._lock.acquire()
f024e41d0fb9 More refactoring, a bit more documentation.
Atul Varma <varmaa@toolness.com>
parents: 11
diff changeset
30 try:
f024e41d0fb9 More refactoring, a bit more documentation.
Atul Varma <varmaa@toolness.com>
parents: 11
diff changeset
31 self._contexts.append(weakref.ref(cx))
f024e41d0fb9 More refactoring, a bit more documentation.
Atul Varma <varmaa@toolness.com>
parents: 11
diff changeset
32 finally:
f024e41d0fb9 More refactoring, a bit more documentation.
Atul Varma <varmaa@toolness.com>
parents: 11
diff changeset
33 self._lock.release()
f024e41d0fb9 More refactoring, a bit more documentation.
Atul Varma <varmaa@toolness.com>
parents: 11
diff changeset
34
f024e41d0fb9 More refactoring, a bit more documentation.
Atul Varma <varmaa@toolness.com>
parents: 11
diff changeset
35 def join(self):
f024e41d0fb9 More refactoring, a bit more documentation.
Atul Varma <varmaa@toolness.com>
parents: 11
diff changeset
36 self._stop.set()
f024e41d0fb9 More refactoring, a bit more documentation.
Atul Varma <varmaa@toolness.com>
parents: 11
diff changeset
37 threading.Thread.join(self)
f024e41d0fb9 More refactoring, a bit more documentation.
Atul Varma <varmaa@toolness.com>
parents: 11
diff changeset
38
f024e41d0fb9 More refactoring, a bit more documentation.
Atul Varma <varmaa@toolness.com>
parents: 11
diff changeset
39 def run(self):
f024e41d0fb9 More refactoring, a bit more documentation.
Atul Varma <varmaa@toolness.com>
parents: 11
diff changeset
40 while not self._stop.isSet():
f024e41d0fb9 More refactoring, a bit more documentation.
Atul Varma <varmaa@toolness.com>
parents: 11
diff changeset
41 time.sleep(self.interval)
f024e41d0fb9 More refactoring, a bit more documentation.
Atul Varma <varmaa@toolness.com>
parents: 11
diff changeset
42 new_list = []
f024e41d0fb9 More refactoring, a bit more documentation.
Atul Varma <varmaa@toolness.com>
parents: 11
diff changeset
43 self._lock.acquire()
f024e41d0fb9 More refactoring, a bit more documentation.
Atul Varma <varmaa@toolness.com>
parents: 11
diff changeset
44 try:
f024e41d0fb9 More refactoring, a bit more documentation.
Atul Varma <varmaa@toolness.com>
parents: 11
diff changeset
45 for weakcx in self._contexts:
f024e41d0fb9 More refactoring, a bit more documentation.
Atul Varma <varmaa@toolness.com>
parents: 11
diff changeset
46 cx = weakcx()
f024e41d0fb9 More refactoring, a bit more documentation.
Atul Varma <varmaa@toolness.com>
parents: 11
diff changeset
47 if cx:
f024e41d0fb9 More refactoring, a bit more documentation.
Atul Varma <varmaa@toolness.com>
parents: 11
diff changeset
48 new_list.append(weakcx)
f024e41d0fb9 More refactoring, a bit more documentation.
Atul Varma <varmaa@toolness.com>
parents: 11
diff changeset
49 cx.trigger_operation_callback()
f024e41d0fb9 More refactoring, a bit more documentation.
Atul Varma <varmaa@toolness.com>
parents: 11
diff changeset
50 self._contexts = new_list
f024e41d0fb9 More refactoring, a bit more documentation.
Atul Varma <varmaa@toolness.com>
parents: 11
diff changeset
51 finally:
f024e41d0fb9 More refactoring, a bit more documentation.
Atul Varma <varmaa@toolness.com>
parents: 11
diff changeset
52 self._lock.release()
f024e41d0fb9 More refactoring, a bit more documentation.
Atul Varma <varmaa@toolness.com>
parents: 11
diff changeset
53
f024e41d0fb9 More refactoring, a bit more documentation.
Atul Varma <varmaa@toolness.com>
parents: 11
diff changeset
54 # Create a global watchdog.
f024e41d0fb9 More refactoring, a bit more documentation.
Atul Varma <varmaa@toolness.com>
parents: 11
diff changeset
55 watchdog = ContextWatchdogThread()
f024e41d0fb9 More refactoring, a bit more documentation.
Atul Varma <varmaa@toolness.com>
parents: 11
diff changeset
56 watchdog.start()
f024e41d0fb9 More refactoring, a bit more documentation.
Atul Varma <varmaa@toolness.com>
parents: 11
diff changeset
57
11
74f27983a350 Added more to pydershell.
Atul Varma <varmaa@toolness.com>
parents: 10
diff changeset
58 class InternalError(BaseException):
12
f024e41d0fb9 More refactoring, a bit more documentation.
Atul Varma <varmaa@toolness.com>
parents: 11
diff changeset
59 """
f024e41d0fb9 More refactoring, a bit more documentation.
Atul Varma <varmaa@toolness.com>
parents: 11
diff changeset
60 Represents an error in a JS-wrapped Python function that wasn't
f024e41d0fb9 More refactoring, a bit more documentation.
Atul Varma <varmaa@toolness.com>
parents: 11
diff changeset
61 expected to happen; because it's derived from BaseException, it
f024e41d0fb9 More refactoring, a bit more documentation.
Atul Varma <varmaa@toolness.com>
parents: 11
diff changeset
62 unrolls the whole JS/Python stack so that the error can be
f024e41d0fb9 More refactoring, a bit more documentation.
Atul Varma <varmaa@toolness.com>
parents: 11
diff changeset
63 reported to the outermost calling code.
f024e41d0fb9 More refactoring, a bit more documentation.
Atul Varma <varmaa@toolness.com>
parents: 11
diff changeset
64 """
f024e41d0fb9 More refactoring, a bit more documentation.
Atul Varma <varmaa@toolness.com>
parents: 11
diff changeset
65
11
74f27983a350 Added more to pydershell.
Atul Varma <varmaa@toolness.com>
parents: 10
diff changeset
66 def __init__(self):
74f27983a350 Added more to pydershell.
Atul Varma <varmaa@toolness.com>
parents: 10
diff changeset
67 BaseException.__init__(self)
74f27983a350 Added more to pydershell.
Atul Varma <varmaa@toolness.com>
parents: 10
diff changeset
68 self.exc_info = sys.exc_info()
74f27983a350 Added more to pydershell.
Atul Varma <varmaa@toolness.com>
parents: 10
diff changeset
69
17
1d62177c5c27 Added a safe js object wrapper.
Atul Varma <varmaa@toolness.com>
parents: 16
diff changeset
70 class SafeJsObjectWrapper(object):
1d62177c5c27 Added a safe js object wrapper.
Atul Varma <varmaa@toolness.com>
parents: 16
diff changeset
71 """
1d62177c5c27 Added a safe js object wrapper.
Atul Varma <varmaa@toolness.com>
parents: 16
diff changeset
72 Securely wraps a JS object to behave like any normal Python object.
1d62177c5c27 Added a safe js object wrapper.
Atul Varma <varmaa@toolness.com>
parents: 16
diff changeset
73 """
1d62177c5c27 Added a safe js object wrapper.
Atul Varma <varmaa@toolness.com>
parents: 16
diff changeset
74
19
057260102960 Made wrapping of python objects much nicer.
Atul Varma <varmaa@toolness.com>
parents: 18
diff changeset
75 __slots__ = ['_jsobject', '_sandbox', '_this']
17
1d62177c5c27 Added a safe js object wrapper.
Atul Varma <varmaa@toolness.com>
parents: 16
diff changeset
76
19
057260102960 Made wrapping of python objects much nicer.
Atul Varma <varmaa@toolness.com>
parents: 18
diff changeset
77 def __init__(self, sandbox, jsobject, this):
17
1d62177c5c27 Added a safe js object wrapper.
Atul Varma <varmaa@toolness.com>
parents: 16
diff changeset
78 if not isinstance(jsobject, pydermonkey.Object):
1d62177c5c27 Added a safe js object wrapper.
Atul Varma <varmaa@toolness.com>
parents: 16
diff changeset
79 raise TypeError("Cannot wrap '%s' object" %
1d62177c5c27 Added a safe js object wrapper.
Atul Varma <varmaa@toolness.com>
parents: 16
diff changeset
80 type(jsobject).__name__)
19
057260102960 Made wrapping of python objects much nicer.
Atul Varma <varmaa@toolness.com>
parents: 18
diff changeset
81 object.__setattr__(self, '_sandbox', sandbox)
17
1d62177c5c27 Added a safe js object wrapper.
Atul Varma <varmaa@toolness.com>
parents: 16
diff changeset
82 object.__setattr__(self, '_jsobject', jsobject)
1d62177c5c27 Added a safe js object wrapper.
Atul Varma <varmaa@toolness.com>
parents: 16
diff changeset
83 object.__setattr__(self, '_this', this)
1d62177c5c27 Added a safe js object wrapper.
Atul Varma <varmaa@toolness.com>
parents: 16
diff changeset
84
19
057260102960 Made wrapping of python objects much nicer.
Atul Varma <varmaa@toolness.com>
parents: 18
diff changeset
85 @property
057260102960 Made wrapping of python objects much nicer.
Atul Varma <varmaa@toolness.com>
parents: 18
diff changeset
86 def wrapped_jsobject(self):
057260102960 Made wrapping of python objects much nicer.
Atul Varma <varmaa@toolness.com>
parents: 18
diff changeset
87 return self._jsobject
17
1d62177c5c27 Added a safe js object wrapper.
Atul Varma <varmaa@toolness.com>
parents: 16
diff changeset
88
18
69e5523ebdc6 Separated out SafeJsObjectWrapper into itself and a new subclass, SafeJsFunctionWrapper, so that callable() works properly on instances.
Atul Varma <varmaa@toolness.com>
parents: 17
diff changeset
89 def _wrap_to_python(self, jsvalue):
19
057260102960 Made wrapping of python objects much nicer.
Atul Varma <varmaa@toolness.com>
parents: 18
diff changeset
90 return self._sandbox.wrap_jsobject(jsvalue, self._jsobject)
18
69e5523ebdc6 Separated out SafeJsObjectWrapper into itself and a new subclass, SafeJsFunctionWrapper, so that callable() works properly on instances.
Atul Varma <varmaa@toolness.com>
parents: 17
diff changeset
91
69e5523ebdc6 Separated out SafeJsObjectWrapper into itself and a new subclass, SafeJsFunctionWrapper, so that callable() works properly on instances.
Atul Varma <varmaa@toolness.com>
parents: 17
diff changeset
92 def _wrap_to_js(self, value):
19
057260102960 Made wrapping of python objects much nicer.
Atul Varma <varmaa@toolness.com>
parents: 18
diff changeset
93 return self._sandbox.wrap_pyobject(value)
17
1d62177c5c27 Added a safe js object wrapper.
Atul Varma <varmaa@toolness.com>
parents: 16
diff changeset
94
1d62177c5c27 Added a safe js object wrapper.
Atul Varma <varmaa@toolness.com>
parents: 16
diff changeset
95 def __eq__(self, other):
1d62177c5c27 Added a safe js object wrapper.
Atul Varma <varmaa@toolness.com>
parents: 16
diff changeset
96 if isinstance(other, SafeJsObjectWrapper):
1d62177c5c27 Added a safe js object wrapper.
Atul Varma <varmaa@toolness.com>
parents: 16
diff changeset
97 return self._jsobject == other._jsobject
1d62177c5c27 Added a safe js object wrapper.
Atul Varma <varmaa@toolness.com>
parents: 16
diff changeset
98 else:
1d62177c5c27 Added a safe js object wrapper.
Atul Varma <varmaa@toolness.com>
parents: 16
diff changeset
99 return False
1d62177c5c27 Added a safe js object wrapper.
Atul Varma <varmaa@toolness.com>
parents: 16
diff changeset
100
1d62177c5c27 Added a safe js object wrapper.
Atul Varma <varmaa@toolness.com>
parents: 16
diff changeset
101 def __str__(self):
1d62177c5c27 Added a safe js object wrapper.
Atul Varma <varmaa@toolness.com>
parents: 16
diff changeset
102 return self.toString()
1d62177c5c27 Added a safe js object wrapper.
Atul Varma <varmaa@toolness.com>
parents: 16
diff changeset
103
1d62177c5c27 Added a safe js object wrapper.
Atul Varma <varmaa@toolness.com>
parents: 16
diff changeset
104 def __unicode__(self):
1d62177c5c27 Added a safe js object wrapper.
Atul Varma <varmaa@toolness.com>
parents: 16
diff changeset
105 return self.toString()
1d62177c5c27 Added a safe js object wrapper.
Atul Varma <varmaa@toolness.com>
parents: 16
diff changeset
106
1d62177c5c27 Added a safe js object wrapper.
Atul Varma <varmaa@toolness.com>
parents: 16
diff changeset
107 def __setitem__(self, item, value):
1d62177c5c27 Added a safe js object wrapper.
Atul Varma <varmaa@toolness.com>
parents: 16
diff changeset
108 self.__setattr__(item, value)
1d62177c5c27 Added a safe js object wrapper.
Atul Varma <varmaa@toolness.com>
parents: 16
diff changeset
109
1d62177c5c27 Added a safe js object wrapper.
Atul Varma <varmaa@toolness.com>
parents: 16
diff changeset
110 def __setattr__(self, name, value):
19
057260102960 Made wrapping of python objects much nicer.
Atul Varma <varmaa@toolness.com>
parents: 18
diff changeset
111 cx = self._sandbox.cx
17
1d62177c5c27 Added a safe js object wrapper.
Atul Varma <varmaa@toolness.com>
parents: 16
diff changeset
112 jsobject = self._jsobject
1d62177c5c27 Added a safe js object wrapper.
Atul Varma <varmaa@toolness.com>
parents: 16
diff changeset
113
1d62177c5c27 Added a safe js object wrapper.
Atul Varma <varmaa@toolness.com>
parents: 16
diff changeset
114 cx.define_property(jsobject, name,
18
69e5523ebdc6 Separated out SafeJsObjectWrapper into itself and a new subclass, SafeJsFunctionWrapper, so that callable() works properly on instances.
Atul Varma <varmaa@toolness.com>
parents: 17
diff changeset
115 self._wrap_to_js(value))
17
1d62177c5c27 Added a safe js object wrapper.
Atul Varma <varmaa@toolness.com>
parents: 16
diff changeset
116
1d62177c5c27 Added a safe js object wrapper.
Atul Varma <varmaa@toolness.com>
parents: 16
diff changeset
117 def __getitem__(self, item):
1d62177c5c27 Added a safe js object wrapper.
Atul Varma <varmaa@toolness.com>
parents: 16
diff changeset
118 return self.__getattr__(item)
1d62177c5c27 Added a safe js object wrapper.
Atul Varma <varmaa@toolness.com>
parents: 16
diff changeset
119
1d62177c5c27 Added a safe js object wrapper.
Atul Varma <varmaa@toolness.com>
parents: 16
diff changeset
120 def __getattr__(self, name):
19
057260102960 Made wrapping of python objects much nicer.
Atul Varma <varmaa@toolness.com>
parents: 18
diff changeset
121 cx = self._sandbox.cx
17
1d62177c5c27 Added a safe js object wrapper.
Atul Varma <varmaa@toolness.com>
parents: 16
diff changeset
122 jsobject = self._jsobject
1d62177c5c27 Added a safe js object wrapper.
Atul Varma <varmaa@toolness.com>
parents: 16
diff changeset
123
18
69e5523ebdc6 Separated out SafeJsObjectWrapper into itself and a new subclass, SafeJsFunctionWrapper, so that callable() works properly on instances.
Atul Varma <varmaa@toolness.com>
parents: 17
diff changeset
124 return self._wrap_to_python(cx.get_property(jsobject, name))
17
1d62177c5c27 Added a safe js object wrapper.
Atul Varma <varmaa@toolness.com>
parents: 16
diff changeset
125
1d62177c5c27 Added a safe js object wrapper.
Atul Varma <varmaa@toolness.com>
parents: 16
diff changeset
126 def __contains__(self, item):
19
057260102960 Made wrapping of python objects much nicer.
Atul Varma <varmaa@toolness.com>
parents: 18
diff changeset
127 cx = self._sandbox.cx
17
1d62177c5c27 Added a safe js object wrapper.
Atul Varma <varmaa@toolness.com>
parents: 16
diff changeset
128 jsobject = self._jsobject
1d62177c5c27 Added a safe js object wrapper.
Atul Varma <varmaa@toolness.com>
parents: 16
diff changeset
129
1d62177c5c27 Added a safe js object wrapper.
Atul Varma <varmaa@toolness.com>
parents: 16
diff changeset
130 return cx.has_property(jsobject, item)
1d62177c5c27 Added a safe js object wrapper.
Atul Varma <varmaa@toolness.com>
parents: 16
diff changeset
131
1d62177c5c27 Added a safe js object wrapper.
Atul Varma <varmaa@toolness.com>
parents: 16
diff changeset
132 def __iter__(self):
19
057260102960 Made wrapping of python objects much nicer.
Atul Varma <varmaa@toolness.com>
parents: 18
diff changeset
133 cx = self._sandbox.cx
17
1d62177c5c27 Added a safe js object wrapper.
Atul Varma <varmaa@toolness.com>
parents: 16
diff changeset
134 jsobject = self._jsobject
1d62177c5c27 Added a safe js object wrapper.
Atul Varma <varmaa@toolness.com>
parents: 16
diff changeset
135
1d62177c5c27 Added a safe js object wrapper.
Atul Varma <varmaa@toolness.com>
parents: 16
diff changeset
136 properties = cx.enumerate(jsobject)
1d62177c5c27 Added a safe js object wrapper.
Atul Varma <varmaa@toolness.com>
parents: 16
diff changeset
137 for property in properties:
1d62177c5c27 Added a safe js object wrapper.
Atul Varma <varmaa@toolness.com>
parents: 16
diff changeset
138 yield property
1d62177c5c27 Added a safe js object wrapper.
Atul Varma <varmaa@toolness.com>
parents: 16
diff changeset
139
18
69e5523ebdc6 Separated out SafeJsObjectWrapper into itself and a new subclass, SafeJsFunctionWrapper, so that callable() works properly on instances.
Atul Varma <varmaa@toolness.com>
parents: 17
diff changeset
140 class SafeJsFunctionWrapper(SafeJsObjectWrapper):
69e5523ebdc6 Separated out SafeJsObjectWrapper into itself and a new subclass, SafeJsFunctionWrapper, so that callable() works properly on instances.
Atul Varma <varmaa@toolness.com>
parents: 17
diff changeset
141 """
69e5523ebdc6 Separated out SafeJsObjectWrapper into itself and a new subclass, SafeJsFunctionWrapper, so that callable() works properly on instances.
Atul Varma <varmaa@toolness.com>
parents: 17
diff changeset
142 Securely wraps a JS function to behave like any normal Python object.
69e5523ebdc6 Separated out SafeJsObjectWrapper into itself and a new subclass, SafeJsFunctionWrapper, so that callable() works properly on instances.
Atul Varma <varmaa@toolness.com>
parents: 17
diff changeset
143 """
69e5523ebdc6 Separated out SafeJsObjectWrapper into itself and a new subclass, SafeJsFunctionWrapper, so that callable() works properly on instances.
Atul Varma <varmaa@toolness.com>
parents: 17
diff changeset
144
19
057260102960 Made wrapping of python objects much nicer.
Atul Varma <varmaa@toolness.com>
parents: 18
diff changeset
145 def __init__(self, sandbox, jsfunction, this):
18
69e5523ebdc6 Separated out SafeJsObjectWrapper into itself and a new subclass, SafeJsFunctionWrapper, so that callable() works properly on instances.
Atul Varma <varmaa@toolness.com>
parents: 17
diff changeset
146 if not isinstance(jsfunction, pydermonkey.Function):
69e5523ebdc6 Separated out SafeJsObjectWrapper into itself and a new subclass, SafeJsFunctionWrapper, so that callable() works properly on instances.
Atul Varma <varmaa@toolness.com>
parents: 17
diff changeset
147 raise TypeError("Cannot wrap '%s' object" %
69e5523ebdc6 Separated out SafeJsObjectWrapper into itself and a new subclass, SafeJsFunctionWrapper, so that callable() works properly on instances.
Atul Varma <varmaa@toolness.com>
parents: 17
diff changeset
148 type(jsobject).__name__)
19
057260102960 Made wrapping of python objects much nicer.
Atul Varma <varmaa@toolness.com>
parents: 18
diff changeset
149 SafeJsObjectWrapper.__init__(self, sandbox, jsfunction, this)
18
69e5523ebdc6 Separated out SafeJsObjectWrapper into itself and a new subclass, SafeJsFunctionWrapper, so that callable() works properly on instances.
Atul Varma <varmaa@toolness.com>
parents: 17
diff changeset
150
69e5523ebdc6 Separated out SafeJsObjectWrapper into itself and a new subclass, SafeJsFunctionWrapper, so that callable() works properly on instances.
Atul Varma <varmaa@toolness.com>
parents: 17
diff changeset
151 def __call__(self, *args):
19
057260102960 Made wrapping of python objects much nicer.
Atul Varma <varmaa@toolness.com>
parents: 18
diff changeset
152 cx = self._sandbox.cx
18
69e5523ebdc6 Separated out SafeJsObjectWrapper into itself and a new subclass, SafeJsFunctionWrapper, so that callable() works properly on instances.
Atul Varma <varmaa@toolness.com>
parents: 17
diff changeset
153 jsobject = self._jsobject
69e5523ebdc6 Separated out SafeJsObjectWrapper into itself and a new subclass, SafeJsFunctionWrapper, so that callable() works properly on instances.
Atul Varma <varmaa@toolness.com>
parents: 17
diff changeset
154 this = self._this
69e5523ebdc6 Separated out SafeJsObjectWrapper into itself and a new subclass, SafeJsFunctionWrapper, so that callable() works properly on instances.
Atul Varma <varmaa@toolness.com>
parents: 17
diff changeset
155
19
057260102960 Made wrapping of python objects much nicer.
Atul Varma <varmaa@toolness.com>
parents: 18
diff changeset
156 arglist = []
057260102960 Made wrapping of python objects much nicer.
Atul Varma <varmaa@toolness.com>
parents: 18
diff changeset
157 for arg in args:
057260102960 Made wrapping of python objects much nicer.
Atul Varma <varmaa@toolness.com>
parents: 18
diff changeset
158 arglist.append(self._wrap_to_js(arg))
12
f024e41d0fb9 More refactoring, a bit more documentation.
Atul Varma <varmaa@toolness.com>
parents: 11
diff changeset
159
19
057260102960 Made wrapping of python objects much nicer.
Atul Varma <varmaa@toolness.com>
parents: 18
diff changeset
160 obj = cx.call_function(this, jsobject, tuple(arglist))
057260102960 Made wrapping of python objects much nicer.
Atul Varma <varmaa@toolness.com>
parents: 18
diff changeset
161 return self._wrap_to_python(obj)
11
74f27983a350 Added more to pydershell.
Atul Varma <varmaa@toolness.com>
parents: 10
diff changeset
162
12
f024e41d0fb9 More refactoring, a bit more documentation.
Atul Varma <varmaa@toolness.com>
parents: 11
diff changeset
163 def format_stack(js_stack):
f024e41d0fb9 More refactoring, a bit more documentation.
Atul Varma <varmaa@toolness.com>
parents: 11
diff changeset
164 """
f024e41d0fb9 More refactoring, a bit more documentation.
Atul Varma <varmaa@toolness.com>
parents: 11
diff changeset
165 Returns a formatted Python-esque stack traceback of the given
f024e41d0fb9 More refactoring, a bit more documentation.
Atul Varma <varmaa@toolness.com>
parents: 11
diff changeset
166 JS stack.
f024e41d0fb9 More refactoring, a bit more documentation.
Atul Varma <varmaa@toolness.com>
parents: 11
diff changeset
167 """
10
fb25af17bae6 Added pydershell.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
168
12
f024e41d0fb9 More refactoring, a bit more documentation.
Atul Varma <varmaa@toolness.com>
parents: 11
diff changeset
169 STACK_LINE =" File \"%(filename)s\", line %(lineno)d, in %(name)s"
10
fb25af17bae6 Added pydershell.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
170
fb25af17bae6 Added pydershell.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
171 lines = []
fb25af17bae6 Added pydershell.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
172 while js_stack:
12
f024e41d0fb9 More refactoring, a bit more documentation.
Atul Varma <varmaa@toolness.com>
parents: 11
diff changeset
173 script = js_stack['script']
f024e41d0fb9 More refactoring, a bit more documentation.
Atul Varma <varmaa@toolness.com>
parents: 11
diff changeset
174 function = js_stack['function']
f024e41d0fb9 More refactoring, a bit more documentation.
Atul Varma <varmaa@toolness.com>
parents: 11
diff changeset
175 if script:
f024e41d0fb9 More refactoring, a bit more documentation.
Atul Varma <varmaa@toolness.com>
parents: 11
diff changeset
176 frameinfo = dict(filename = script.filename,
16
a78570a423ea Show code excerpts in js stack tracebacks
Atul Varma <varmaa@toolness.com>
parents: 15
diff changeset
177 lineno = js_stack['lineno'],
a78570a423ea Show code excerpts in js stack tracebacks
Atul Varma <varmaa@toolness.com>
parents: 15
diff changeset
178 name = '<module>')
12
f024e41d0fb9 More refactoring, a bit more documentation.
Atul Varma <varmaa@toolness.com>
parents: 11
diff changeset
179 elif function and not function.is_python:
f024e41d0fb9 More refactoring, a bit more documentation.
Atul Varma <varmaa@toolness.com>
parents: 11
diff changeset
180 frameinfo = dict(filename = function.filename,
16
a78570a423ea Show code excerpts in js stack tracebacks
Atul Varma <varmaa@toolness.com>
parents: 15
diff changeset
181 lineno = js_stack['lineno'],
a78570a423ea Show code excerpts in js stack tracebacks
Atul Varma <varmaa@toolness.com>
parents: 15
diff changeset
182 name = function.name)
10
fb25af17bae6 Added pydershell.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
183 else:
12
f024e41d0fb9 More refactoring, a bit more documentation.
Atul Varma <varmaa@toolness.com>
parents: 11
diff changeset
184 frameinfo = None
f024e41d0fb9 More refactoring, a bit more documentation.
Atul Varma <varmaa@toolness.com>
parents: 11
diff changeset
185 if frameinfo:
f024e41d0fb9 More refactoring, a bit more documentation.
Atul Varma <varmaa@toolness.com>
parents: 11
diff changeset
186 lines.insert(0, STACK_LINE % frameinfo)
16
a78570a423ea Show code excerpts in js stack tracebacks
Atul Varma <varmaa@toolness.com>
parents: 15
diff changeset
187 try:
a78570a423ea Show code excerpts in js stack tracebacks
Atul Varma <varmaa@toolness.com>
parents: 15
diff changeset
188 filelines = open(frameinfo['filename']).readlines()
a78570a423ea Show code excerpts in js stack tracebacks
Atul Varma <varmaa@toolness.com>
parents: 15
diff changeset
189 line = filelines[frameinfo['lineno'] - 1].strip()
a78570a423ea Show code excerpts in js stack tracebacks
Atul Varma <varmaa@toolness.com>
parents: 15
diff changeset
190 lines.insert(1, " %s" % line)
a78570a423ea Show code excerpts in js stack tracebacks
Atul Varma <varmaa@toolness.com>
parents: 15
diff changeset
191 except Exception:
a78570a423ea Show code excerpts in js stack tracebacks
Atul Varma <varmaa@toolness.com>
parents: 15
diff changeset
192 pass
10
fb25af17bae6 Added pydershell.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
193 js_stack = js_stack['caller']
fb25af17bae6 Added pydershell.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
194 lines.insert(0, "Traceback (most recent call last):")
fb25af17bae6 Added pydershell.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
195 return '\n'.join(lines)
fb25af17bae6 Added pydershell.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
196
24
dace90a7f5e3 Added a 'jsexposed' decorator and, for security purposes, required that __jsexposed__ be True on all callables passed into JS-land as well.
Atul Varma <varmaa@toolness.com>
parents: 23
diff changeset
197 def jsexposed(name=None, on=None):
dace90a7f5e3 Added a 'jsexposed' decorator and, for security purposes, required that __jsexposed__ be True on all callables passed into JS-land as well.
Atul Varma <varmaa@toolness.com>
parents: 23
diff changeset
198 """
dace90a7f5e3 Added a 'jsexposed' decorator and, for security purposes, required that __jsexposed__ be True on all callables passed into JS-land as well.
Atul Varma <varmaa@toolness.com>
parents: 23
diff changeset
199 Decorator used to expose the decorated function or method to
dace90a7f5e3 Added a 'jsexposed' decorator and, for security purposes, required that __jsexposed__ be True on all callables passed into JS-land as well.
Atul Varma <varmaa@toolness.com>
parents: 23
diff changeset
200 untrusted JS.
dace90a7f5e3 Added a 'jsexposed' decorator and, for security purposes, required that __jsexposed__ be True on all callables passed into JS-land as well.
Atul Varma <varmaa@toolness.com>
parents: 23
diff changeset
201
dace90a7f5e3 Added a 'jsexposed' decorator and, for security purposes, required that __jsexposed__ be True on all callables passed into JS-land as well.
Atul Varma <varmaa@toolness.com>
parents: 23
diff changeset
202 'name' is an optional alternative name for the function.
dace90a7f5e3 Added a 'jsexposed' decorator and, for security purposes, required that __jsexposed__ be True on all callables passed into JS-land as well.
Atul Varma <varmaa@toolness.com>
parents: 23
diff changeset
203
dace90a7f5e3 Added a 'jsexposed' decorator and, for security purposes, required that __jsexposed__ be True on all callables passed into JS-land as well.
Atul Varma <varmaa@toolness.com>
parents: 23
diff changeset
204 'on' is an optional SafeJsObjectWrapper that the function can be
dace90a7f5e3 Added a 'jsexposed' decorator and, for security purposes, required that __jsexposed__ be True on all callables passed into JS-land as well.
Atul Varma <varmaa@toolness.com>
parents: 23
diff changeset
205 automatically attached as a property to.
dace90a7f5e3 Added a 'jsexposed' decorator and, for security purposes, required that __jsexposed__ be True on all callables passed into JS-land as well.
Atul Varma <varmaa@toolness.com>
parents: 23
diff changeset
206 """
dace90a7f5e3 Added a 'jsexposed' decorator and, for security purposes, required that __jsexposed__ be True on all callables passed into JS-land as well.
Atul Varma <varmaa@toolness.com>
parents: 23
diff changeset
207
dace90a7f5e3 Added a 'jsexposed' decorator and, for security purposes, required that __jsexposed__ be True on all callables passed into JS-land as well.
Atul Varma <varmaa@toolness.com>
parents: 23
diff changeset
208 if callable(name):
dace90a7f5e3 Added a 'jsexposed' decorator and, for security purposes, required that __jsexposed__ be True on all callables passed into JS-land as well.
Atul Varma <varmaa@toolness.com>
parents: 23
diff changeset
209 func = name
dace90a7f5e3 Added a 'jsexposed' decorator and, for security purposes, required that __jsexposed__ be True on all callables passed into JS-land as well.
Atul Varma <varmaa@toolness.com>
parents: 23
diff changeset
210 func.__jsexposed__ = True
dace90a7f5e3 Added a 'jsexposed' decorator and, for security purposes, required that __jsexposed__ be True on all callables passed into JS-land as well.
Atul Varma <varmaa@toolness.com>
parents: 23
diff changeset
211 return func
dace90a7f5e3 Added a 'jsexposed' decorator and, for security purposes, required that __jsexposed__ be True on all callables passed into JS-land as well.
Atul Varma <varmaa@toolness.com>
parents: 23
diff changeset
212
dace90a7f5e3 Added a 'jsexposed' decorator and, for security purposes, required that __jsexposed__ be True on all callables passed into JS-land as well.
Atul Varma <varmaa@toolness.com>
parents: 23
diff changeset
213 def make_exposed(func):
dace90a7f5e3 Added a 'jsexposed' decorator and, for security purposes, required that __jsexposed__ be True on all callables passed into JS-land as well.
Atul Varma <varmaa@toolness.com>
parents: 23
diff changeset
214 if name:
dace90a7f5e3 Added a 'jsexposed' decorator and, for security purposes, required that __jsexposed__ be True on all callables passed into JS-land as well.
Atul Varma <varmaa@toolness.com>
parents: 23
diff changeset
215 func.__name__ = name
dace90a7f5e3 Added a 'jsexposed' decorator and, for security purposes, required that __jsexposed__ be True on all callables passed into JS-land as well.
Atul Varma <varmaa@toolness.com>
parents: 23
diff changeset
216 func.__jsexposed__ = True
dace90a7f5e3 Added a 'jsexposed' decorator and, for security purposes, required that __jsexposed__ be True on all callables passed into JS-land as well.
Atul Varma <varmaa@toolness.com>
parents: 23
diff changeset
217 if on:
dace90a7f5e3 Added a 'jsexposed' decorator and, for security purposes, required that __jsexposed__ be True on all callables passed into JS-land as well.
Atul Varma <varmaa@toolness.com>
parents: 23
diff changeset
218 on[func.__name__] = func
dace90a7f5e3 Added a 'jsexposed' decorator and, for security purposes, required that __jsexposed__ be True on all callables passed into JS-land as well.
Atul Varma <varmaa@toolness.com>
parents: 23
diff changeset
219 return func
dace90a7f5e3 Added a 'jsexposed' decorator and, for security purposes, required that __jsexposed__ be True on all callables passed into JS-land as well.
Atul Varma <varmaa@toolness.com>
parents: 23
diff changeset
220 return make_exposed
dace90a7f5e3 Added a 'jsexposed' decorator and, for security purposes, required that __jsexposed__ be True on all callables passed into JS-land as well.
Atul Varma <varmaa@toolness.com>
parents: 23
diff changeset
221
21
1950b0b5bcd8 It's now possible to expose python class instances to JS, if they're declared the right way (for security purposes).
Atul Varma <varmaa@toolness.com>
parents: 20
diff changeset
222 class JsExposedObject(object):
1950b0b5bcd8 It's now possible to expose python class instances to JS, if they're declared the right way (for security purposes).
Atul Varma <varmaa@toolness.com>
parents: 20
diff changeset
223 """
1950b0b5bcd8 It's now possible to expose python class instances to JS, if they're declared the right way (for security purposes).
Atul Varma <varmaa@toolness.com>
parents: 20
diff changeset
224 Trivial base/mixin class for any Python classes that choose to
1950b0b5bcd8 It's now possible to expose python class instances to JS, if they're declared the right way (for security purposes).
Atul Varma <varmaa@toolness.com>
parents: 20
diff changeset
225 expose themselves to JS code.
1950b0b5bcd8 It's now possible to expose python class instances to JS, if they're declared the right way (for security purposes).
Atul Varma <varmaa@toolness.com>
parents: 20
diff changeset
226 """
1950b0b5bcd8 It's now possible to expose python class instances to JS, if they're declared the right way (for security purposes).
Atul Varma <varmaa@toolness.com>
parents: 20
diff changeset
227
1950b0b5bcd8 It's now possible to expose python class instances to JS, if they're declared the right way (for security purposes).
Atul Varma <varmaa@toolness.com>
parents: 20
diff changeset
228 pass
1950b0b5bcd8 It's now possible to expose python class instances to JS, if they're declared the right way (for security purposes).
Atul Varma <varmaa@toolness.com>
parents: 20
diff changeset
229
1950b0b5bcd8 It's now possible to expose python class instances to JS, if they're declared the right way (for security purposes).
Atul Varma <varmaa@toolness.com>
parents: 20
diff changeset
230 class JsSandbox(object):
12
f024e41d0fb9 More refactoring, a bit more documentation.
Atul Varma <varmaa@toolness.com>
parents: 11
diff changeset
231 """
19
057260102960 Made wrapping of python objects much nicer.
Atul Varma <varmaa@toolness.com>
parents: 18
diff changeset
232 A JS runtime and associated functionality capable of securely
057260102960 Made wrapping of python objects much nicer.
Atul Varma <varmaa@toolness.com>
parents: 18
diff changeset
233 loading and executing scripts.
12
f024e41d0fb9 More refactoring, a bit more documentation.
Atul Varma <varmaa@toolness.com>
parents: 11
diff changeset
234 """
f024e41d0fb9 More refactoring, a bit more documentation.
Atul Varma <varmaa@toolness.com>
parents: 11
diff changeset
235
f024e41d0fb9 More refactoring, a bit more documentation.
Atul Varma <varmaa@toolness.com>
parents: 11
diff changeset
236 def __init__(self, watchdog=watchdog):
f024e41d0fb9 More refactoring, a bit more documentation.
Atul Varma <varmaa@toolness.com>
parents: 11
diff changeset
237 rt = pydermonkey.Runtime()
f024e41d0fb9 More refactoring, a bit more documentation.
Atul Varma <varmaa@toolness.com>
parents: 11
diff changeset
238 cx = rt.new_context()
19
057260102960 Made wrapping of python objects much nicer.
Atul Varma <varmaa@toolness.com>
parents: 18
diff changeset
239 root = cx.new_object()
057260102960 Made wrapping of python objects much nicer.
Atul Varma <varmaa@toolness.com>
parents: 18
diff changeset
240 cx.init_standard_classes(root)
12
f024e41d0fb9 More refactoring, a bit more documentation.
Atul Varma <varmaa@toolness.com>
parents: 11
diff changeset
241
f024e41d0fb9 More refactoring, a bit more documentation.
Atul Varma <varmaa@toolness.com>
parents: 11
diff changeset
242 cx.set_operation_callback(self._opcb)
f024e41d0fb9 More refactoring, a bit more documentation.
Atul Varma <varmaa@toolness.com>
parents: 11
diff changeset
243 cx.set_throw_hook(self._throwhook)
f024e41d0fb9 More refactoring, a bit more documentation.
Atul Varma <varmaa@toolness.com>
parents: 11
diff changeset
244 watchdog.add_context(cx)
f024e41d0fb9 More refactoring, a bit more documentation.
Atul Varma <varmaa@toolness.com>
parents: 11
diff changeset
245
f024e41d0fb9 More refactoring, a bit more documentation.
Atul Varma <varmaa@toolness.com>
parents: 11
diff changeset
246 self.rt = rt
f024e41d0fb9 More refactoring, a bit more documentation.
Atul Varma <varmaa@toolness.com>
parents: 11
diff changeset
247 self.cx = cx
f024e41d0fb9 More refactoring, a bit more documentation.
Atul Varma <varmaa@toolness.com>
parents: 11
diff changeset
248 self.curr_exc = None
f024e41d0fb9 More refactoring, a bit more documentation.
Atul Varma <varmaa@toolness.com>
parents: 11
diff changeset
249 self.py_stack = None
f024e41d0fb9 More refactoring, a bit more documentation.
Atul Varma <varmaa@toolness.com>
parents: 11
diff changeset
250 self.js_stack = None
19
057260102960 Made wrapping of python objects much nicer.
Atul Varma <varmaa@toolness.com>
parents: 18
diff changeset
251 self.__py_to_js = {}
21
1950b0b5bcd8 It's now possible to expose python class instances to JS, if they're declared the right way (for security purposes).
Atul Varma <varmaa@toolness.com>
parents: 20
diff changeset
252 self.__type_protos = {}
19
057260102960 Made wrapping of python objects much nicer.
Atul Varma <varmaa@toolness.com>
parents: 18
diff changeset
253 self.root = self.wrap_jsobject(root, root)
057260102960 Made wrapping of python objects much nicer.
Atul Varma <varmaa@toolness.com>
parents: 18
diff changeset
254
057260102960 Made wrapping of python objects much nicer.
Atul Varma <varmaa@toolness.com>
parents: 18
diff changeset
255 def finish(self):
23
35ab0ad3c294 Added more docs.
Atul Varma <varmaa@toolness.com>
parents: 22
diff changeset
256 """
35ab0ad3c294 Added more docs.
Atul Varma <varmaa@toolness.com>
parents: 22
diff changeset
257 Cleans up all resources used by the sandbox, breaking any reference
35ab0ad3c294 Added more docs.
Atul Varma <varmaa@toolness.com>
parents: 22
diff changeset
258 cycles created due to issue #2 in pydermonkey:
35ab0ad3c294 Added more docs.
Atul Varma <varmaa@toolness.com>
parents: 22
diff changeset
259
35ab0ad3c294 Added more docs.
Atul Varma <varmaa@toolness.com>
parents: 22
diff changeset
260 http://code.google.com/p/pydermonkey/issues/detail?id=2
35ab0ad3c294 Added more docs.
Atul Varma <varmaa@toolness.com>
parents: 22
diff changeset
261 """
35ab0ad3c294 Added more docs.
Atul Varma <varmaa@toolness.com>
parents: 22
diff changeset
262
19
057260102960 Made wrapping of python objects much nicer.
Atul Varma <varmaa@toolness.com>
parents: 18
diff changeset
263 for jsobj in self.__py_to_js.values():
057260102960 Made wrapping of python objects much nicer.
Atul Varma <varmaa@toolness.com>
parents: 18
diff changeset
264 self.cx.clear_object_private(jsobj)
057260102960 Made wrapping of python objects much nicer.
Atul Varma <varmaa@toolness.com>
parents: 18
diff changeset
265 del self.__py_to_js
21
1950b0b5bcd8 It's now possible to expose python class instances to JS, if they're declared the right way (for security purposes).
Atul Varma <varmaa@toolness.com>
parents: 20
diff changeset
266 del self.__type_protos
19
057260102960 Made wrapping of python objects much nicer.
Atul Varma <varmaa@toolness.com>
parents: 18
diff changeset
267 del self.curr_exc
057260102960 Made wrapping of python objects much nicer.
Atul Varma <varmaa@toolness.com>
parents: 18
diff changeset
268 del self.py_stack
057260102960 Made wrapping of python objects much nicer.
Atul Varma <varmaa@toolness.com>
parents: 18
diff changeset
269 del self.js_stack
057260102960 Made wrapping of python objects much nicer.
Atul Varma <varmaa@toolness.com>
parents: 18
diff changeset
270 del self.cx
057260102960 Made wrapping of python objects much nicer.
Atul Varma <varmaa@toolness.com>
parents: 18
diff changeset
271 del self.rt
12
f024e41d0fb9 More refactoring, a bit more documentation.
Atul Varma <varmaa@toolness.com>
parents: 11
diff changeset
272
f024e41d0fb9 More refactoring, a bit more documentation.
Atul Varma <varmaa@toolness.com>
parents: 11
diff changeset
273 def _opcb(self, cx):
f024e41d0fb9 More refactoring, a bit more documentation.
Atul Varma <varmaa@toolness.com>
parents: 11
diff changeset
274 # Don't do anything; if a keyboard interrupt was triggered,
f024e41d0fb9 More refactoring, a bit more documentation.
Atul Varma <varmaa@toolness.com>
parents: 11
diff changeset
275 # it'll get raised here automatically.
f024e41d0fb9 More refactoring, a bit more documentation.
Atul Varma <varmaa@toolness.com>
parents: 11
diff changeset
276 pass
f024e41d0fb9 More refactoring, a bit more documentation.
Atul Varma <varmaa@toolness.com>
parents: 11
diff changeset
277
f024e41d0fb9 More refactoring, a bit more documentation.
Atul Varma <varmaa@toolness.com>
parents: 11
diff changeset
278 def _throwhook(self, cx):
f024e41d0fb9 More refactoring, a bit more documentation.
Atul Varma <varmaa@toolness.com>
parents: 11
diff changeset
279 curr_exc = cx.get_pending_exception()
f024e41d0fb9 More refactoring, a bit more documentation.
Atul Varma <varmaa@toolness.com>
parents: 11
diff changeset
280 if self.curr_exc != curr_exc:
f024e41d0fb9 More refactoring, a bit more documentation.
Atul Varma <varmaa@toolness.com>
parents: 11
diff changeset
281 self.curr_exc = curr_exc
f024e41d0fb9 More refactoring, a bit more documentation.
Atul Varma <varmaa@toolness.com>
parents: 11
diff changeset
282 self.py_stack = traceback.extract_stack()
f024e41d0fb9 More refactoring, a bit more documentation.
Atul Varma <varmaa@toolness.com>
parents: 11
diff changeset
283 self.js_stack = cx.get_stack()
f024e41d0fb9 More refactoring, a bit more documentation.
Atul Varma <varmaa@toolness.com>
parents: 11
diff changeset
284
21
1950b0b5bcd8 It's now possible to expose python class instances to JS, if they're declared the right way (for security purposes).
Atul Varma <varmaa@toolness.com>
parents: 20
diff changeset
285 def __wrap_pycallable(self, func, pyproto=None):
19
057260102960 Made wrapping of python objects much nicer.
Atul Varma <varmaa@toolness.com>
parents: 18
diff changeset
286 if func in self.__py_to_js:
057260102960 Made wrapping of python objects much nicer.
Atul Varma <varmaa@toolness.com>
parents: 18
diff changeset
287 return self.__py_to_js[func]
057260102960 Made wrapping of python objects much nicer.
Atul Varma <varmaa@toolness.com>
parents: 18
diff changeset
288
057260102960 Made wrapping of python objects much nicer.
Atul Varma <varmaa@toolness.com>
parents: 18
diff changeset
289 if hasattr(func, '__name__'):
057260102960 Made wrapping of python objects much nicer.
Atul Varma <varmaa@toolness.com>
parents: 18
diff changeset
290 name = func.__name__
057260102960 Made wrapping of python objects much nicer.
Atul Varma <varmaa@toolness.com>
parents: 18
diff changeset
291 else:
057260102960 Made wrapping of python objects much nicer.
Atul Varma <varmaa@toolness.com>
parents: 18
diff changeset
292 name = ""
057260102960 Made wrapping of python objects much nicer.
Atul Varma <varmaa@toolness.com>
parents: 18
diff changeset
293
21
1950b0b5bcd8 It's now possible to expose python class instances to JS, if they're declared the right way (for security purposes).
Atul Varma <varmaa@toolness.com>
parents: 20
diff changeset
294 if pyproto:
1950b0b5bcd8 It's now possible to expose python class instances to JS, if they're declared the right way (for security purposes).
Atul Varma <varmaa@toolness.com>
parents: 20
diff changeset
295 def wrapper(func_cx, this, args):
1950b0b5bcd8 It's now possible to expose python class instances to JS, if they're declared the right way (for security purposes).
Atul Varma <varmaa@toolness.com>
parents: 20
diff changeset
296 try:
1950b0b5bcd8 It's now possible to expose python class instances to JS, if they're declared the right way (for security purposes).
Atul Varma <varmaa@toolness.com>
parents: 20
diff changeset
297 arglist = []
1950b0b5bcd8 It's now possible to expose python class instances to JS, if they're declared the right way (for security purposes).
Atul Varma <varmaa@toolness.com>
parents: 20
diff changeset
298 for arg in args:
1950b0b5bcd8 It's now possible to expose python class instances to JS, if they're declared the right way (for security purposes).
Atul Varma <varmaa@toolness.com>
parents: 20
diff changeset
299 arglist.append(self.wrap_jsobject(arg))
1950b0b5bcd8 It's now possible to expose python class instances to JS, if they're declared the right way (for security purposes).
Atul Varma <varmaa@toolness.com>
parents: 20
diff changeset
300 instance = func_cx.get_object_private(this)
1950b0b5bcd8 It's now possible to expose python class instances to JS, if they're declared the right way (for security purposes).
Atul Varma <varmaa@toolness.com>
parents: 20
diff changeset
301 if instance is None or not isinstance(instance, pyproto):
1950b0b5bcd8 It's now possible to expose python class instances to JS, if they're declared the right way (for security purposes).
Atul Varma <varmaa@toolness.com>
parents: 20
diff changeset
302 raise pydermonkey.error("Method type mismatch")
1950b0b5bcd8 It's now possible to expose python class instances to JS, if they're declared the right way (for security purposes).
Atul Varma <varmaa@toolness.com>
parents: 20
diff changeset
303
1950b0b5bcd8 It's now possible to expose python class instances to JS, if they're declared the right way (for security purposes).
Atul Varma <varmaa@toolness.com>
parents: 20
diff changeset
304 # TODO: Fill in extra required params with
1950b0b5bcd8 It's now possible to expose python class instances to JS, if they're declared the right way (for security purposes).
Atul Varma <varmaa@toolness.com>
parents: 20
diff changeset
305 # pymonkey.undefined? or automatically throw an
1950b0b5bcd8 It's now possible to expose python class instances to JS, if they're declared the right way (for security purposes).
Atul Varma <varmaa@toolness.com>
parents: 20
diff changeset
306 # exception to calling js code?
1950b0b5bcd8 It's now possible to expose python class instances to JS, if they're declared the right way (for security purposes).
Atul Varma <varmaa@toolness.com>
parents: 20
diff changeset
307 return self.wrap_pyobject(func(instance, *arglist))
1950b0b5bcd8 It's now possible to expose python class instances to JS, if they're declared the right way (for security purposes).
Atul Varma <varmaa@toolness.com>
parents: 20
diff changeset
308 except pydermonkey.error:
1950b0b5bcd8 It's now possible to expose python class instances to JS, if they're declared the right way (for security purposes).
Atul Varma <varmaa@toolness.com>
parents: 20
diff changeset
309 raise
1950b0b5bcd8 It's now possible to expose python class instances to JS, if they're declared the right way (for security purposes).
Atul Varma <varmaa@toolness.com>
parents: 20
diff changeset
310 except Exception:
1950b0b5bcd8 It's now possible to expose python class instances to JS, if they're declared the right way (for security purposes).
Atul Varma <varmaa@toolness.com>
parents: 20
diff changeset
311 raise InternalError()
1950b0b5bcd8 It's now possible to expose python class instances to JS, if they're declared the right way (for security purposes).
Atul Varma <varmaa@toolness.com>
parents: 20
diff changeset
312 else:
1950b0b5bcd8 It's now possible to expose python class instances to JS, if they're declared the right way (for security purposes).
Atul Varma <varmaa@toolness.com>
parents: 20
diff changeset
313 def wrapper(func_cx, this, args):
1950b0b5bcd8 It's now possible to expose python class instances to JS, if they're declared the right way (for security purposes).
Atul Varma <varmaa@toolness.com>
parents: 20
diff changeset
314 try:
1950b0b5bcd8 It's now possible to expose python class instances to JS, if they're declared the right way (for security purposes).
Atul Varma <varmaa@toolness.com>
parents: 20
diff changeset
315 arglist = []
1950b0b5bcd8 It's now possible to expose python class instances to JS, if they're declared the right way (for security purposes).
Atul Varma <varmaa@toolness.com>
parents: 20
diff changeset
316 for arg in args:
1950b0b5bcd8 It's now possible to expose python class instances to JS, if they're declared the right way (for security purposes).
Atul Varma <varmaa@toolness.com>
parents: 20
diff changeset
317 arglist.append(self.wrap_jsobject(arg))
1950b0b5bcd8 It's now possible to expose python class instances to JS, if they're declared the right way (for security purposes).
Atul Varma <varmaa@toolness.com>
parents: 20
diff changeset
318
1950b0b5bcd8 It's now possible to expose python class instances to JS, if they're declared the right way (for security purposes).
Atul Varma <varmaa@toolness.com>
parents: 20
diff changeset
319 # TODO: Fill in extra required params with
1950b0b5bcd8 It's now possible to expose python class instances to JS, if they're declared the right way (for security purposes).
Atul Varma <varmaa@toolness.com>
parents: 20
diff changeset
320 # pymonkey.undefined? or automatically throw an
1950b0b5bcd8 It's now possible to expose python class instances to JS, if they're declared the right way (for security purposes).
Atul Varma <varmaa@toolness.com>
parents: 20
diff changeset
321 # exception to calling js code?
1950b0b5bcd8 It's now possible to expose python class instances to JS, if they're declared the right way (for security purposes).
Atul Varma <varmaa@toolness.com>
parents: 20
diff changeset
322 return self.wrap_pyobject(func(*arglist))
1950b0b5bcd8 It's now possible to expose python class instances to JS, if they're declared the right way (for security purposes).
Atul Varma <varmaa@toolness.com>
parents: 20
diff changeset
323 except pydermonkey.error:
1950b0b5bcd8 It's now possible to expose python class instances to JS, if they're declared the right way (for security purposes).
Atul Varma <varmaa@toolness.com>
parents: 20
diff changeset
324 raise
1950b0b5bcd8 It's now possible to expose python class instances to JS, if they're declared the right way (for security purposes).
Atul Varma <varmaa@toolness.com>
parents: 20
diff changeset
325 except Exception:
1950b0b5bcd8 It's now possible to expose python class instances to JS, if they're declared the right way (for security purposes).
Atul Varma <varmaa@toolness.com>
parents: 20
diff changeset
326 raise InternalError()
19
057260102960 Made wrapping of python objects much nicer.
Atul Varma <varmaa@toolness.com>
parents: 18
diff changeset
327 wrapper.wrapped_pyobject = func
057260102960 Made wrapping of python objects much nicer.
Atul Varma <varmaa@toolness.com>
parents: 18
diff changeset
328 wrapper.__name__ = name
057260102960 Made wrapping of python objects much nicer.
Atul Varma <varmaa@toolness.com>
parents: 18
diff changeset
329
057260102960 Made wrapping of python objects much nicer.
Atul Varma <varmaa@toolness.com>
parents: 18
diff changeset
330 jsfunc = self.cx.new_function(wrapper, name)
057260102960 Made wrapping of python objects much nicer.
Atul Varma <varmaa@toolness.com>
parents: 18
diff changeset
331 self.__py_to_js[func] = jsfunc
057260102960 Made wrapping of python objects much nicer.
Atul Varma <varmaa@toolness.com>
parents: 18
diff changeset
332
057260102960 Made wrapping of python objects much nicer.
Atul Varma <varmaa@toolness.com>
parents: 18
diff changeset
333 return jsfunc
057260102960 Made wrapping of python objects much nicer.
Atul Varma <varmaa@toolness.com>
parents: 18
diff changeset
334
21
1950b0b5bcd8 It's now possible to expose python class instances to JS, if they're declared the right way (for security purposes).
Atul Varma <varmaa@toolness.com>
parents: 20
diff changeset
335 def __wrap_pyinstance(self, value):
1950b0b5bcd8 It's now possible to expose python class instances to JS, if they're declared the right way (for security purposes).
Atul Varma <varmaa@toolness.com>
parents: 20
diff changeset
336 pyproto = type(value)
1950b0b5bcd8 It's now possible to expose python class instances to JS, if they're declared the right way (for security purposes).
Atul Varma <varmaa@toolness.com>
parents: 20
diff changeset
337 if pyproto not in self.__type_protos:
1950b0b5bcd8 It's now possible to expose python class instances to JS, if they're declared the right way (for security purposes).
Atul Varma <varmaa@toolness.com>
parents: 20
diff changeset
338 jsproto = self.cx.new_object()
26
b7037cd0f375 Added support for exposing object properties to JS.
Atul Varma <varmaa@toolness.com>
parents: 24
diff changeset
339 if hasattr(pyproto, '__jsprops__'):
b7037cd0f375 Added support for exposing object properties to JS.
Atul Varma <varmaa@toolness.com>
parents: 24
diff changeset
340 define_getter = self.cx.get_property(jsproto,
b7037cd0f375 Added support for exposing object properties to JS.
Atul Varma <varmaa@toolness.com>
parents: 24
diff changeset
341 '__defineGetter__')
b7037cd0f375 Added support for exposing object properties to JS.
Atul Varma <varmaa@toolness.com>
parents: 24
diff changeset
342 define_setter = self.cx.get_property(jsproto,
b7037cd0f375 Added support for exposing object properties to JS.
Atul Varma <varmaa@toolness.com>
parents: 24
diff changeset
343 '__defineSetter__')
b7037cd0f375 Added support for exposing object properties to JS.
Atul Varma <varmaa@toolness.com>
parents: 24
diff changeset
344 for name in pyproto.__jsprops__:
b7037cd0f375 Added support for exposing object properties to JS.
Atul Varma <varmaa@toolness.com>
parents: 24
diff changeset
345 prop = getattr(pyproto, name)
b7037cd0f375 Added support for exposing object properties to JS.
Atul Varma <varmaa@toolness.com>
parents: 24
diff changeset
346 if not type(prop) == property:
b7037cd0f375 Added support for exposing object properties to JS.
Atul Varma <varmaa@toolness.com>
parents: 24
diff changeset
347 raise TypeError("Expected attribute '%s' to "
b7037cd0f375 Added support for exposing object properties to JS.
Atul Varma <varmaa@toolness.com>
parents: 24
diff changeset
348 "be a property" % name)
b7037cd0f375 Added support for exposing object properties to JS.
Atul Varma <varmaa@toolness.com>
parents: 24
diff changeset
349 getter = None
b7037cd0f375 Added support for exposing object properties to JS.
Atul Varma <varmaa@toolness.com>
parents: 24
diff changeset
350 setter = None
b7037cd0f375 Added support for exposing object properties to JS.
Atul Varma <varmaa@toolness.com>
parents: 24
diff changeset
351 if prop.fget:
b7037cd0f375 Added support for exposing object properties to JS.
Atul Varma <varmaa@toolness.com>
parents: 24
diff changeset
352 getter = self.__wrap_pycallable(prop.fget,
b7037cd0f375 Added support for exposing object properties to JS.
Atul Varma <varmaa@toolness.com>
parents: 24
diff changeset
353 pyproto)
b7037cd0f375 Added support for exposing object properties to JS.
Atul Varma <varmaa@toolness.com>
parents: 24
diff changeset
354 if prop.fset:
b7037cd0f375 Added support for exposing object properties to JS.
Atul Varma <varmaa@toolness.com>
parents: 24
diff changeset
355 setter = self.__wrap_pycallable(prop.fset,
b7037cd0f375 Added support for exposing object properties to JS.
Atul Varma <varmaa@toolness.com>
parents: 24
diff changeset
356 pyproto)
b7037cd0f375 Added support for exposing object properties to JS.
Atul Varma <varmaa@toolness.com>
parents: 24
diff changeset
357 if getter:
b7037cd0f375 Added support for exposing object properties to JS.
Atul Varma <varmaa@toolness.com>
parents: 24
diff changeset
358 self.cx.call_function(jsproto,
b7037cd0f375 Added support for exposing object properties to JS.
Atul Varma <varmaa@toolness.com>
parents: 24
diff changeset
359 define_getter,
b7037cd0f375 Added support for exposing object properties to JS.
Atul Varma <varmaa@toolness.com>
parents: 24
diff changeset
360 (name, getter))
b7037cd0f375 Added support for exposing object properties to JS.
Atul Varma <varmaa@toolness.com>
parents: 24
diff changeset
361 if setter:
b7037cd0f375 Added support for exposing object properties to JS.
Atul Varma <varmaa@toolness.com>
parents: 24
diff changeset
362 self.cx.call_function(jsproto,
b7037cd0f375 Added support for exposing object properties to JS.
Atul Varma <varmaa@toolness.com>
parents: 24
diff changeset
363 define_setter,
b7037cd0f375 Added support for exposing object properties to JS.
Atul Varma <varmaa@toolness.com>
parents: 24
diff changeset
364 (name, setter,))
21
1950b0b5bcd8 It's now possible to expose python class instances to JS, if they're declared the right way (for security purposes).
Atul Varma <varmaa@toolness.com>
parents: 20
diff changeset
365 for name in dir(pyproto):
1950b0b5bcd8 It's now possible to expose python class instances to JS, if they're declared the right way (for security purposes).
Atul Varma <varmaa@toolness.com>
parents: 20
diff changeset
366 attr = getattr(pyproto, name)
1950b0b5bcd8 It's now possible to expose python class instances to JS, if they're declared the right way (for security purposes).
Atul Varma <varmaa@toolness.com>
parents: 20
diff changeset
367 if (isinstance(attr, types.UnboundMethodType) and
1950b0b5bcd8 It's now possible to expose python class instances to JS, if they're declared the right way (for security purposes).
Atul Varma <varmaa@toolness.com>
parents: 20
diff changeset
368 hasattr(attr, '__jsexposed__') and
1950b0b5bcd8 It's now possible to expose python class instances to JS, if they're declared the right way (for security purposes).
Atul Varma <varmaa@toolness.com>
parents: 20
diff changeset
369 attr.__jsexposed__):
1950b0b5bcd8 It's now possible to expose python class instances to JS, if they're declared the right way (for security purposes).
Atul Varma <varmaa@toolness.com>
parents: 20
diff changeset
370 jsmethod = self.__wrap_pycallable(attr, pyproto)
1950b0b5bcd8 It's now possible to expose python class instances to JS, if they're declared the right way (for security purposes).
Atul Varma <varmaa@toolness.com>
parents: 20
diff changeset
371 self.cx.define_property(jsproto, name, jsmethod)
1950b0b5bcd8 It's now possible to expose python class instances to JS, if they're declared the right way (for security purposes).
Atul Varma <varmaa@toolness.com>
parents: 20
diff changeset
372 self.__type_protos[pyproto] = jsproto
1950b0b5bcd8 It's now possible to expose python class instances to JS, if they're declared the right way (for security purposes).
Atul Varma <varmaa@toolness.com>
parents: 20
diff changeset
373 return self.cx.new_object(value, self.__type_protos[pyproto])
1950b0b5bcd8 It's now possible to expose python class instances to JS, if they're declared the right way (for security purposes).
Atul Varma <varmaa@toolness.com>
parents: 20
diff changeset
374
19
057260102960 Made wrapping of python objects much nicer.
Atul Varma <varmaa@toolness.com>
parents: 18
diff changeset
375 def wrap_pyobject(self, value):
23
35ab0ad3c294 Added more docs.
Atul Varma <varmaa@toolness.com>
parents: 22
diff changeset
376 """
35ab0ad3c294 Added more docs.
Atul Varma <varmaa@toolness.com>
parents: 22
diff changeset
377 Wraps the given Python object for export to untrusted JS.
35ab0ad3c294 Added more docs.
Atul Varma <varmaa@toolness.com>
parents: 22
diff changeset
378
35ab0ad3c294 Added more docs.
Atul Varma <varmaa@toolness.com>
parents: 22
diff changeset
379 If the Python object isn't of a type that can be exposed to JS,
35ab0ad3c294 Added more docs.
Atul Varma <varmaa@toolness.com>
parents: 22
diff changeset
380 a TypeError is raised.
35ab0ad3c294 Added more docs.
Atul Varma <varmaa@toolness.com>
parents: 22
diff changeset
381 """
35ab0ad3c294 Added more docs.
Atul Varma <varmaa@toolness.com>
parents: 22
diff changeset
382
21
1950b0b5bcd8 It's now possible to expose python class instances to JS, if they're declared the right way (for security purposes).
Atul Varma <varmaa@toolness.com>
parents: 20
diff changeset
383 if (isinstance(value, (int, basestring, float, bool)) or
1950b0b5bcd8 It's now possible to expose python class instances to JS, if they're declared the right way (for security purposes).
Atul Varma <varmaa@toolness.com>
parents: 20
diff changeset
384 value is pydermonkey.undefined or
1950b0b5bcd8 It's now possible to expose python class instances to JS, if they're declared the right way (for security purposes).
Atul Varma <varmaa@toolness.com>
parents: 20
diff changeset
385 value is None):
1950b0b5bcd8 It's now possible to expose python class instances to JS, if they're declared the right way (for security purposes).
Atul Varma <varmaa@toolness.com>
parents: 20
diff changeset
386 return value
19
057260102960 Made wrapping of python objects much nicer.
Atul Varma <varmaa@toolness.com>
parents: 18
diff changeset
387 if isinstance(value, SafeJsObjectWrapper):
057260102960 Made wrapping of python objects much nicer.
Atul Varma <varmaa@toolness.com>
parents: 18
diff changeset
388 # It's already wrapped, just unwrap it.
057260102960 Made wrapping of python objects much nicer.
Atul Varma <varmaa@toolness.com>
parents: 18
diff changeset
389 return value.wrapped_jsobject
057260102960 Made wrapping of python objects much nicer.
Atul Varma <varmaa@toolness.com>
parents: 18
diff changeset
390 elif callable(value):
24
dace90a7f5e3 Added a 'jsexposed' decorator and, for security purposes, required that __jsexposed__ be True on all callables passed into JS-land as well.
Atul Varma <varmaa@toolness.com>
parents: 23
diff changeset
391 if not (hasattr(value, '__jsexposed__') and
dace90a7f5e3 Added a 'jsexposed' decorator and, for security purposes, required that __jsexposed__ be True on all callables passed into JS-land as well.
Atul Varma <varmaa@toolness.com>
parents: 23
diff changeset
392 value.__jsexposed__):
dace90a7f5e3 Added a 'jsexposed' decorator and, for security purposes, required that __jsexposed__ be True on all callables passed into JS-land as well.
Atul Varma <varmaa@toolness.com>
parents: 23
diff changeset
393 raise ValueError("Callable isn't configured for exposure "
dace90a7f5e3 Added a 'jsexposed' decorator and, for security purposes, required that __jsexposed__ be True on all callables passed into JS-land as well.
Atul Varma <varmaa@toolness.com>
parents: 23
diff changeset
394 "to untrusted JS code")
19
057260102960 Made wrapping of python objects much nicer.
Atul Varma <varmaa@toolness.com>
parents: 18
diff changeset
395 return self.__wrap_pycallable(value)
21
1950b0b5bcd8 It's now possible to expose python class instances to JS, if they're declared the right way (for security purposes).
Atul Varma <varmaa@toolness.com>
parents: 20
diff changeset
396 elif isinstance(value, JsExposedObject):
1950b0b5bcd8 It's now possible to expose python class instances to JS, if they're declared the right way (for security purposes).
Atul Varma <varmaa@toolness.com>
parents: 20
diff changeset
397 return self.__wrap_pyinstance(value)
19
057260102960 Made wrapping of python objects much nicer.
Atul Varma <varmaa@toolness.com>
parents: 18
diff changeset
398 else:
28
f974d4a80473 Some fixes.
Atul Varma <varmaa@toolness.com>
parents: 27
diff changeset
399 raise TypeError("Can't expose objects of type '%s' to JS." %
21
1950b0b5bcd8 It's now possible to expose python class instances to JS, if they're declared the right way (for security purposes).
Atul Varma <varmaa@toolness.com>
parents: 20
diff changeset
400 type(value).__name__)
19
057260102960 Made wrapping of python objects much nicer.
Atul Varma <varmaa@toolness.com>
parents: 18
diff changeset
401
057260102960 Made wrapping of python objects much nicer.
Atul Varma <varmaa@toolness.com>
parents: 18
diff changeset
402 def wrap_jsobject(self, jsvalue, this=None):
23
35ab0ad3c294 Added more docs.
Atul Varma <varmaa@toolness.com>
parents: 22
diff changeset
403 """
35ab0ad3c294 Added more docs.
Atul Varma <varmaa@toolness.com>
parents: 22
diff changeset
404 Wraps the given pydermonkey.Object for import to trusted
35ab0ad3c294 Added more docs.
Atul Varma <varmaa@toolness.com>
parents: 22
diff changeset
405 Python code. If the type is just a primitive, it's simply
35ab0ad3c294 Added more docs.
Atul Varma <varmaa@toolness.com>
parents: 22
diff changeset
406 returned, since no wrapping is needed.
35ab0ad3c294 Added more docs.
Atul Varma <varmaa@toolness.com>
parents: 22
diff changeset
407 """
35ab0ad3c294 Added more docs.
Atul Varma <varmaa@toolness.com>
parents: 22
diff changeset
408
19
057260102960 Made wrapping of python objects much nicer.
Atul Varma <varmaa@toolness.com>
parents: 18
diff changeset
409 if this is None:
057260102960 Made wrapping of python objects much nicer.
Atul Varma <varmaa@toolness.com>
parents: 18
diff changeset
410 this = self.root.wrapped_jsobject
057260102960 Made wrapping of python objects much nicer.
Atul Varma <varmaa@toolness.com>
parents: 18
diff changeset
411 if isinstance(jsvalue, pydermonkey.Function):
057260102960 Made wrapping of python objects much nicer.
Atul Varma <varmaa@toolness.com>
parents: 18
diff changeset
412 if jsvalue.is_python:
057260102960 Made wrapping of python objects much nicer.
Atul Varma <varmaa@toolness.com>
parents: 18
diff changeset
413 # It's a Python function, just unwrap it.
057260102960 Made wrapping of python objects much nicer.
Atul Varma <varmaa@toolness.com>
parents: 18
diff changeset
414 return self.cx.get_object_private(jsvalue).wrapped_pyobject
057260102960 Made wrapping of python objects much nicer.
Atul Varma <varmaa@toolness.com>
parents: 18
diff changeset
415 return SafeJsFunctionWrapper(self, jsvalue, this)
057260102960 Made wrapping of python objects much nicer.
Atul Varma <varmaa@toolness.com>
parents: 18
diff changeset
416 elif isinstance(jsvalue, pydermonkey.Object):
21
1950b0b5bcd8 It's now possible to expose python class instances to JS, if they're declared the right way (for security purposes).
Atul Varma <varmaa@toolness.com>
parents: 20
diff changeset
417 # It's a wrapped Python object instance, just unwrap it.
1950b0b5bcd8 It's now possible to expose python class instances to JS, if they're declared the right way (for security purposes).
Atul Varma <varmaa@toolness.com>
parents: 20
diff changeset
418 instance = self.cx.get_object_private(jsvalue)
1950b0b5bcd8 It's now possible to expose python class instances to JS, if they're declared the right way (for security purposes).
Atul Varma <varmaa@toolness.com>
parents: 20
diff changeset
419 if instance:
1950b0b5bcd8 It's now possible to expose python class instances to JS, if they're declared the right way (for security purposes).
Atul Varma <varmaa@toolness.com>
parents: 20
diff changeset
420 if not isinstance(instance, JsExposedObject):
1950b0b5bcd8 It's now possible to expose python class instances to JS, if they're declared the right way (for security purposes).
Atul Varma <varmaa@toolness.com>
parents: 20
diff changeset
421 raise AssertionError("Object private is not of type "
1950b0b5bcd8 It's now possible to expose python class instances to JS, if they're declared the right way (for security purposes).
Atul Varma <varmaa@toolness.com>
parents: 20
diff changeset
422 "JsExposedObject")
1950b0b5bcd8 It's now possible to expose python class instances to JS, if they're declared the right way (for security purposes).
Atul Varma <varmaa@toolness.com>
parents: 20
diff changeset
423 return instance
1950b0b5bcd8 It's now possible to expose python class instances to JS, if they're declared the right way (for security purposes).
Atul Varma <varmaa@toolness.com>
parents: 20
diff changeset
424 else:
1950b0b5bcd8 It's now possible to expose python class instances to JS, if they're declared the right way (for security purposes).
Atul Varma <varmaa@toolness.com>
parents: 20
diff changeset
425 return SafeJsObjectWrapper(self, jsvalue, this)
19
057260102960 Made wrapping of python objects much nicer.
Atul Varma <varmaa@toolness.com>
parents: 18
diff changeset
426 else:
057260102960 Made wrapping of python objects much nicer.
Atul Varma <varmaa@toolness.com>
parents: 18
diff changeset
427 # It's a primitive value.
057260102960 Made wrapping of python objects much nicer.
Atul Varma <varmaa@toolness.com>
parents: 18
diff changeset
428 return jsvalue
057260102960 Made wrapping of python objects much nicer.
Atul Varma <varmaa@toolness.com>
parents: 18
diff changeset
429
27
7f12db104246 Added evaluate, new_array, and new_object functions to JsSandbox class.
Atul Varma <varmaa@toolness.com>
parents: 26
diff changeset
430 def new_array(self, *contents):
7f12db104246 Added evaluate, new_array, and new_object functions to JsSandbox class.
Atul Varma <varmaa@toolness.com>
parents: 26
diff changeset
431 array = self.wrap_jsobject(self.cx.new_array_object())
7f12db104246 Added evaluate, new_array, and new_object functions to JsSandbox class.
Atul Varma <varmaa@toolness.com>
parents: 26
diff changeset
432 for item in contents:
28
f974d4a80473 Some fixes.
Atul Varma <varmaa@toolness.com>
parents: 27
diff changeset
433 array.push(item)
27
7f12db104246 Added evaluate, new_array, and new_object functions to JsSandbox class.
Atul Varma <varmaa@toolness.com>
parents: 26
diff changeset
434 return array
7f12db104246 Added evaluate, new_array, and new_object functions to JsSandbox class.
Atul Varma <varmaa@toolness.com>
parents: 26
diff changeset
435
7f12db104246 Added evaluate, new_array, and new_object functions to JsSandbox class.
Atul Varma <varmaa@toolness.com>
parents: 26
diff changeset
436 def new_object(self, **contents):
7f12db104246 Added evaluate, new_array, and new_object functions to JsSandbox class.
Atul Varma <varmaa@toolness.com>
parents: 26
diff changeset
437 obj = self.wrap_jsobject(self.cx.new_object())
7f12db104246 Added evaluate, new_array, and new_object functions to JsSandbox class.
Atul Varma <varmaa@toolness.com>
parents: 26
diff changeset
438 for name in contents:
28
f974d4a80473 Some fixes.
Atul Varma <varmaa@toolness.com>
parents: 27
diff changeset
439 obj[name] = contents[name]
f974d4a80473 Some fixes.
Atul Varma <varmaa@toolness.com>
parents: 27
diff changeset
440 return obj
27
7f12db104246 Added evaluate, new_array, and new_object functions to JsSandbox class.
Atul Varma <varmaa@toolness.com>
parents: 26
diff changeset
441
7f12db104246 Added evaluate, new_array, and new_object functions to JsSandbox class.
Atul Varma <varmaa@toolness.com>
parents: 26
diff changeset
442 def evaluate(self, code, filename='<string>', lineno=1):
7f12db104246 Added evaluate, new_array, and new_object functions to JsSandbox class.
Atul Varma <varmaa@toolness.com>
parents: 26
diff changeset
443 retval = self.cx.evaluate_script(self.root.wrapped_jsobject,
7f12db104246 Added evaluate, new_array, and new_object functions to JsSandbox class.
Atul Varma <varmaa@toolness.com>
parents: 26
diff changeset
444 code, filename, lineno)
7f12db104246 Added evaluate, new_array, and new_object functions to JsSandbox class.
Atul Varma <varmaa@toolness.com>
parents: 26
diff changeset
445 return self.wrap_jsobject(retval)
7f12db104246 Added evaluate, new_array, and new_object functions to JsSandbox class.
Atul Varma <varmaa@toolness.com>
parents: 26
diff changeset
446
28
f974d4a80473 Some fixes.
Atul Varma <varmaa@toolness.com>
parents: 27
diff changeset
447 def run_script(self, filename, callback=None):
23
35ab0ad3c294 Added more docs.
Atul Varma <varmaa@toolness.com>
parents: 22
diff changeset
448 """
35ab0ad3c294 Added more docs.
Atul Varma <varmaa@toolness.com>
parents: 22
diff changeset
449 Runs the given JS script, returning 0 on success, -1 on failure.
35ab0ad3c294 Added more docs.
Atul Varma <varmaa@toolness.com>
parents: 22
diff changeset
450 """
35ab0ad3c294 Added more docs.
Atul Varma <varmaa@toolness.com>
parents: 22
diff changeset
451
20
8dd18f864351 pydershell now exits with a nonzero return code if the script it calls throws an exception.
Atul Varma <varmaa@toolness.com>
parents: 19
diff changeset
452 retval = -1
12
f024e41d0fb9 More refactoring, a bit more documentation.
Atul Varma <varmaa@toolness.com>
parents: 11
diff changeset
453 contents = open(filename).read()
f024e41d0fb9 More refactoring, a bit more documentation.
Atul Varma <varmaa@toolness.com>
parents: 11
diff changeset
454 cx = self.cx
f024e41d0fb9 More refactoring, a bit more documentation.
Atul Varma <varmaa@toolness.com>
parents: 11
diff changeset
455 try:
28
f974d4a80473 Some fixes.
Atul Varma <varmaa@toolness.com>
parents: 27
diff changeset
456 result = cx.evaluate_script(self.root.wrapped_jsobject,
f974d4a80473 Some fixes.
Atul Varma <varmaa@toolness.com>
parents: 27
diff changeset
457 contents, filename, 1)
f974d4a80473 Some fixes.
Atul Varma <varmaa@toolness.com>
parents: 27
diff changeset
458 if callback:
f974d4a80473 Some fixes.
Atul Varma <varmaa@toolness.com>
parents: 27
diff changeset
459 callback(self.wrap_jsobject(result))
20
8dd18f864351 pydershell now exits with a nonzero return code if the script it calls throws an exception.
Atul Varma <varmaa@toolness.com>
parents: 19
diff changeset
460 retval = 0
12
f024e41d0fb9 More refactoring, a bit more documentation.
Atul Varma <varmaa@toolness.com>
parents: 11
diff changeset
461 except pydermonkey.error, e:
f024e41d0fb9 More refactoring, a bit more documentation.
Atul Varma <varmaa@toolness.com>
parents: 11
diff changeset
462 print format_stack(self.js_stack)
f024e41d0fb9 More refactoring, a bit more documentation.
Atul Varma <varmaa@toolness.com>
parents: 11
diff changeset
463 print e.args[1]
f024e41d0fb9 More refactoring, a bit more documentation.
Atul Varma <varmaa@toolness.com>
parents: 11
diff changeset
464 except InternalError, e:
f024e41d0fb9 More refactoring, a bit more documentation.
Atul Varma <varmaa@toolness.com>
parents: 11
diff changeset
465 print "An internal error occurred."
f024e41d0fb9 More refactoring, a bit more documentation.
Atul Varma <varmaa@toolness.com>
parents: 11
diff changeset
466 traceback.print_tb(e.exc_info[2])
f024e41d0fb9 More refactoring, a bit more documentation.
Atul Varma <varmaa@toolness.com>
parents: 11
diff changeset
467 print e.exc_info[1]
20
8dd18f864351 pydershell now exits with a nonzero return code if the script it calls throws an exception.
Atul Varma <varmaa@toolness.com>
parents: 19
diff changeset
468 return retval