[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