[pypy-svn] r34545 - in pypy/dist/pypy/translator/js/modules: . test
guido at codespeak.net
guido at codespeak.net
Mon Nov 13 10:23:32 CET 2006
Author: guido
Date: Mon Nov 13 10:23:30 2006
New Revision: 34545
Modified:
pypy/dist/pypy/translator/js/modules/dom.py
pypy/dist/pypy/translator/js/modules/test/test_dom.py
Log:
Added proper support for window.location, HTMLNode.className and HTMLNode.id.
Modified: pypy/dist/pypy/translator/js/modules/dom.py
==============================================================================
--- pypy/dist/pypy/translator/js/modules/dom.py (original)
+++ pypy/dist/pypy/translator/js/modules/dom.py Mon Nov 13 10:23:30 2006
@@ -151,20 +151,31 @@
name = name.lower()
return self.__getattr__('getElementsByTagName')(name)
- def __str__(self):
+ def __repr__(self):
return '<%s %s>' % (self.__class__.__name__, self.nodeName)
+ def _getClassName(self):
+ return self.getAttribute('class')
+
+ def _setClassName(self, name):
+ self.setAttribute('class', name)
+
+ className = property(_getClassName, _setClassName)
+
+ def _getId(self):
+ return self.getAttribute('id')
+
+ def _setId(self, id):
+ self.setAttribute('id', id)
+
+ id = property(_getId, _setId)
+
class HTMLElement(HTMLNode, Element):
id = ''
style = None
def __init__(self, node=None):
super(Element, self).__init__(node)
- if node is not None:
- self._init(node)
-
- def _init(self, node):
- self.id = node.getAttribute('id')
self.style = Style()
def _nodeName(self):
@@ -199,14 +210,11 @@
# Window is the main environment, the root node of the JS object tree
-class Window(BasicExternal):
+class Window(EventTarget):
def __init__(self, html=('<html><head><title>Untitled document</title>'
- '</head><body></body></html>'), parent=None,
- emit_events=False):
- global document
+ '</head><body></body></html>'), parent=None):
self._html = html
- self._emit_events = emit_events
- self.document = document = HTMLDocument(minidom.parseString(html))
+ self.document = HTMLDocument(minidom.parseString(html))
# references to windows
self.content = self
@@ -221,12 +229,23 @@
# other properties
self.closed = True
- if self._emit_events:
- _emit_event(self, 'onload')
+ self._location = 'about:blank'
+
+ self._original = self # for EventTarget interface (XXX a bit nasty)
def __getattr__(self, name):
return globals()[name]
+ def _getLocation(self):
+ return self._location
+
+ def _setLocation(self, newloc):
+ url = urllib.urlopen(newloc)
+ html = url.read()
+ self.document = HTMLDocument(minidom.parseString(html))
+
+ location = property(_getLocation, _setLocation)
+
def setTimeout(func, delay):
# scheduler call, but we don't want to mess with threads right now
if one():
@@ -242,7 +261,7 @@
# a lot... isn't it possible to just use dom.window and dom.document instead?)
def get_document():
- return NonConstant(document)
+ return NonConstant(window.document)
def get_window():
return NonConstant(window)
@@ -251,7 +270,6 @@
# the Node base class contains just about all XML-related properties
Node._fields = {
- 'attributes' : [Attribute()],
'childNodes' : [Element()],
'firstChild' : Element(),
'lastChild' : Element(),
@@ -276,11 +294,15 @@
'getElementsByTagName' : MethodDesc(["aa"], [Element(), Element()]),
'hasChildNodes' : MethodDesc([], True),
'insertBefore' : MethodDesc([Element(), Element()], Element()),
+ 'normalize' : MethodDesc([]),
'removeChild' : MethodDesc([Element()], Element()),
'replaceChild' : MethodDesc([Element(), Element()], Element()),
}
Element._fields = Node._fields.copy()
+Element._fields.update({
+ 'attributes' : [Attribute()],
+})
Element._methods = Node._methods.copy()
Element._methods.update({
@@ -335,7 +357,6 @@
'blur' : MethodDesc([]),
'click' : MethodDesc([]),
'focus' : MethodDesc([]),
- 'normalize' : MethodDesc([]),
'scrollIntoView' : MethodDesc([12]),
'supports' : MethodDesc(["aa", 1.0]),
})
@@ -343,7 +364,7 @@
Document._fields = Node._fields.copy()
Document._fields.update({
'characterSet' : "aa",
- 'contentWindow' : Window(),
+ # 'contentWindow' : Window(), XXX doesn't exist, only on iframe
'doctype' : "aa",
'documentElement' : Element(),
'styleSheets' : [Style(), Style()],
@@ -351,8 +372,6 @@
Document._methods = Node._methods.copy()
Document._methods.update({
- 'clear' : MethodDesc([]),
- 'close' : MethodDesc([]),
'createAttribute' : MethodDesc(["aa"], Element()),
'createDocumentFragment' : MethodDesc([], Element()),
'createElement' : MethodDesc(["aa"], Element()),
@@ -363,9 +382,6 @@
'getElementById' : MethodDesc(["aa"], Element()),
'getElementsByName' : MethodDesc(["aa"], [Element(), Element()]),
'importNode' : MethodDesc([Element(), True], Element()),
- 'open' : MethodDesc([]),
- 'write' : MethodDesc(["aa"]),
- 'writeln' : MethodDesc(["aa"]),
})
HTMLDocument._fields = Document._fields.copy()
@@ -393,11 +409,18 @@
})
HTMLDocument._methods = Document._methods.copy()
+HTMLDocument._methods.update({
+ 'clear' : MethodDesc([]),
+ 'close' : MethodDesc([]),
+ 'open' : MethodDesc([]),
+ 'write' : MethodDesc(["aa"]),
+ 'writeln' : MethodDesc(["aa"]),
+})
Window._fields = {
'content' : Window(),
'closed' : True,
- #'crypto' : Crypto() - not implemented in Gecko, leave alone
+ # 'crypto' : Crypto() - not implemented in Gecko, leave alone
'defaultStatus' : "aa",
'document' : Document(),
# 'frameElement' : - leave alone
@@ -445,28 +468,6 @@
'getComputedStyle' : MethodDesc([Element(), "aa"], Style()),
'home' : MethodDesc([]),
'open' : MethodDesc(["aa", "aa"]),
- 'onabort' : MethodDesc([Event()]),
- 'onblur' : MethodDesc([Event()]),
- 'onchange' : MethodDesc([Event()]),
- 'onclick' : MethodDesc([MouseEvent()]),
- 'onclose' : MethodDesc([MouseEvent()]),
- 'ondragdrop' : MethodDesc([MouseEvent()]),
- 'onerror' : MethodDesc([MouseEvent()]),
- 'onfocus' : MethodDesc([Event()]),
- 'onkeydown' : MethodDesc([KeyEvent()]),
- 'onkeypress' : MethodDesc([KeyEvent()]),
- 'onkeyup' : MethodDesc([KeyEvent()]),
- 'onload' : MethodDesc([KeyEvent()]),
- 'onmousedown' : MethodDesc([MouseEvent()]),
- 'onmousemove' : MethodDesc([MouseEvent()]),
- 'onmouseup' : MethodDesc([MouseEvent()]),
- 'onmouseover' : MethodDesc([MouseEvent()]),
- 'onmouseup' : MethodDesc([MouseEvent()]),
- 'onresize' : MethodDesc([MouseEvent()]),
- 'onscroll' : MethodDesc([MouseEvent()]),
- 'onselect' : MethodDesc([MouseEvent()]),
- 'onsubmit' : MethodDesc([MouseEvent()]),
- 'onunload' : MethodDesc([Event()]),
}
Style._fields = {
@@ -600,19 +601,29 @@
}
EventTarget._fields = {
+ 'onabort' : MethodDesc([Event()]),
'onblur' : MethodDesc([Event()]),
+ 'onchange' : MethodDesc([Event()]),
'onclick' : MethodDesc([MouseEvent()]),
+ 'onclose' : MethodDesc([MouseEvent()]),
'ondblclick' : MethodDesc([MouseEvent()]),
+ 'ondragdrop' : MethodDesc([MouseEvent()]),
+ 'onerror' : MethodDesc([MouseEvent()]),
'onfocus' : MethodDesc([Event()]),
'onkeydown' : MethodDesc([KeyEvent()]),
'onkeypress' : MethodDesc([KeyEvent()]),
'onkeyup' : MethodDesc([KeyEvent()]),
+ 'onload' : MethodDesc([KeyEvent()]),
'onmousedown' : MethodDesc([MouseEvent()]),
'onmousemove' : MethodDesc([MouseEvent()]),
'onmouseup' : MethodDesc([MouseEvent()]),
'onmouseover' : MethodDesc([MouseEvent()]),
'onmouseup' : MethodDesc([MouseEvent()]),
'onresize' : MethodDesc([Event()]),
+ 'onscroll' : MethodDesc([MouseEvent()]),
+ 'onselect' : MethodDesc([MouseEvent()]),
+ 'onsubmit' : MethodDesc([MouseEvent()]),
+ 'onunload' : MethodDesc([Event()]),
}
EventTarget._methods = {
Modified: pypy/dist/pypy/translator/js/modules/test/test_dom.py
==============================================================================
--- pypy/dist/pypy/translator/js/modules/test/test_dom.py (original)
+++ pypy/dist/pypy/translator/js/modules/test/test_dom.py Mon Nov 13 10:23:30 2006
@@ -44,6 +44,14 @@
document.documentElement.appendChild(div)
assert document.documentElement.childNodes[-1]._original is div._original
+def test_node_eq():
+ window = dom.Window()
+ body = window.document.getElementsByTagName('body')[0]
+ ref = body.parentNode.lastChild
+ assert ref == body
+ ref = window.document.createElement('body')
+ assert ref != body
+
def test_get_element_by_id():
window = dom.Window('<html><body><div id="foo" /></body></html>')
div = window.document.getElementById('foo')
@@ -194,8 +202,17 @@
assert h.event.originalTarget == div
assert h.event.currentTarget == body
+def test_class_name():
+ window = dom.Window('<html><body><div class="foo">foo</div></body></html>')
+ div = window.document.getElementsByTagName('div')[0]
+ assert div.className == 'foo'
+ body = div.parentNode
+ assert not body.className
+ div.className = 'bar'
+ assert div.className == 'bar'
+ assert body.innerHTML == '<div class="bar">foo</div>'
+
def test_build():
- py.test.skip("Not implemented yet")
for var in globals():
if var.startswith('test_') and var != 'test_build':
# just build it
More information about the Pypy-commit
mailing list