[pypy-svn] r34553 - in pypy/dist/pypy/translator/js/modules: . test

guido at codespeak.net guido at codespeak.net
Mon Nov 13 13:16:23 CET 2006


Author: guido
Date: Mon Nov 13 13:16:21 2006
New Revision: 34553

Modified:
   pypy/dist/pypy/translator/js/modules/dom.py
   pypy/dist/pypy/translator/js/modules/test/test_dom.py
Log:
Simplified inheritance, there's no distinction anymore between XML and HTML
nodes, and split tests up for translation testing (currently still broken).


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 13:16:21 2006
@@ -19,66 +19,8 @@
 from pypy.translator.stackless.test.test_transform import one
 from xml.dom import minidom
 
-# XML node (level 2 basically) implementation
-#   the following classes are mostly wrappers around minidom nodes that try to
-#   mimic HTML DOM behaviour by implementing browser API and changing the
-#   behaviour a bit
-
-class Node(BasicExternal):
-    """base class of all node types"""
-    
-    def __init__(self, node=None):
-        self._original = node
-    
-    def __getattr__(self, name):
-        """attribute access gets proxied to the contained minidom node
-
-            all returned minidom nodes are wrapped as Nodes
-        """
-        if (name not in self._fields and
-                (not hasattr(self, '_methods') or name not in self._methods)):
-            raise NameError, name
-        value = getattr(self._original, name)
-        return _wrap(value)
-
-    def __eq__(self, other):
-        original = getattr(other, '_original', other)
-        return original is self._original
-
-class Element(Node):
-    nodeType = 1
-
-class Attribute(Node):
-    nodeType = 2
-
-class Text(Node):
-    nodeType = 3
-
-class Document(Node):
-    nodeType = 9
-    
-    def __init__(self, docnode=None):
-        super(Document, self).__init__(docnode)
-        self._original = docnode
-
-    def createEvent(self, group=''):
-        """create an event
-
-            note that the group argument is ignored
-        """
-        if group in ('KeyboardEvent', 'KeyboardEvents'):
-            return KeyEvent()
-        elif group in ('MouseEvent', 'MouseEvents'):
-            return MouseEvent()
-        return Event()
-
-# the standard DOM stuff that doesn't directly deal with XML
-#   note that we're mimicking the standard (Mozilla) APIs, so things tested
-#   against this code may not work in Internet Explorer
-
-# XXX note that we store the events on the wrapped minidom node to avoid losing
-# them on re-wrapping
-class EventTarget(BasicExternal): # XXX mixin... is the super correct?!?
+# EventTarget is the base class for Nodes and Window
+class EventTarget(BasicExternal):
     def addEventListener(self, type, listener, useCapture):
         if not hasattr(self._original, '_events'):
             self._original._events = []
@@ -114,39 +56,36 @@
             raise ValueError('no registration for listener')
         self._original._events = filtered
 
-class Event(BasicExternal):
-    def initEvent(self, type, bubbles, cancelable):
-        self.type = type
-        self.cancelBubble = not bubbles
-        self.cancelable = cancelable
-        self.target = None
-        self.currentTarget = None
-        self.originalTarget = None
-        self._cancelled = False
-
-    def preventDefault(self):
-        if not self.cancelable:
-            raise TypeError('event can not be canceled')
-        self._cancelled = True
-
-    def stopPropagation(self):
-        self.cancelBubble = True
-
-class KeyEvent(Event):
-    pass
-
-class MouseEvent(Event):
-    pass
+# XML node (level 2 basically) implementation
+#   the following classes are mostly wrappers around minidom nodes that try to
+#   mimic HTML DOM behaviour by implementing browser API and changing the
+#   behaviour a bit
 
-class Style(BasicExternal):
+class Node(EventTarget):
+    """base class of all node types"""
+    
+    def __init__(self, node=None):
+        self._original = node
+    
     def __getattr__(self, name):
-        if name not in self._fields:
-            raise AttributeError, name
-        return None
+        """attribute access gets proxied to the contained minidom node
+
+            all returned minidom nodes are wrapped as Nodes
+        """
+        try:
+            return super(Node, self).__getattr__(name)
+        except AttributeError:
+            pass
+        if (name not in self._fields and
+                (not hasattr(self, '_methods') or name not in self._methods)):
+            raise NameError, name
+        value = getattr(self._original, name)
+        return _wrap(value)
 
-# HTML DOM
+    def __eq__(self, other):
+        original = getattr(other, '_original', other)
+        return original is self._original
 
-class HTMLNode(Node, EventTarget):
     def getElementsByTagName(self, name):
         name = name.lower()
         return self.__getattr__('getElementsByTagName')(name)
@@ -170,8 +109,8 @@
 
     id = property(_getId, _setId)
 
-class HTMLElement(HTMLNode, Element):
-    id = ''
+class Element(Node):
+    nodeType = 1
     style = None
 
     def __init__(self, node=None):
@@ -199,13 +138,72 @@
 
     innerHTML = property(_get_innerHTML, _set_innerHTML)
 
-class HTMLDocument(Document, HTMLNode):
+class Attribute(Node):
+    nodeType = 2
+
+class Text(Node):
+    nodeType = 3
+
+class Document(Node):
+    nodeType = 9
+    
+    def __init__(self, docnode=None):
+        super(Document, self).__init__(docnode)
+        self._original = docnode
+
+    def createEvent(self, group=''):
+        """create an event
+
+            note that the group argument is ignored
+        """
+        if group in ('KeyboardEvent', 'KeyboardEvents'):
+            return KeyEvent()
+        elif group in ('MouseEvent', 'MouseEvents'):
+            return MouseEvent()
+        return Event()
+
     def getElementById(self, id):
         nodes = self.getElementsByTagName('*')
         for node in nodes:
             if node.getAttribute('id') == id:
                 return node
 
+# the standard DOM stuff that doesn't directly deal with XML
+#   note that we're mimicking the standard (Mozilla) APIs, so things tested
+#   against this code may not work in Internet Explorer
+
+# XXX note that we store the events on the wrapped minidom node to avoid losing
+# them on re-wrapping
+class Event(BasicExternal):
+    def initEvent(self, type, bubbles, cancelable):
+        self.type = type
+        self.cancelBubble = not bubbles
+        self.cancelable = cancelable
+        self.target = None
+        self.currentTarget = None
+        self.originalTarget = None
+        self._cancelled = False
+
+    def preventDefault(self):
+        if not self.cancelable:
+            raise TypeError('event can not be canceled')
+        self._cancelled = True
+
+    def stopPropagation(self):
+        self.cancelBubble = True
+
+class KeyEvent(Event):
+    pass
+
+class MouseEvent(Event):
+    pass
+
+class Style(BasicExternal):
+    def __getattr__(self, name):
+        if name not in self._fields:
+            raise AttributeError, name
+        return None
+
 # non-DOM ('DOM level 0') stuff
 
 # Window is the main environment, the root node of the JS object tree
@@ -213,8 +211,9 @@
 class Window(EventTarget):
     def __init__(self, html=('<html><head><title>Untitled document</title>'
                              '</head><body></body></html>'), parent=None):
+        super(Window, self).__init__()
         self._html = html
-        self.document = HTMLDocument(minidom.parseString(html))
+        self.document = Document(minidom.parseString(html))
 
         # references to windows
         self.content = self
@@ -242,7 +241,7 @@
     def _setLocation(self, newloc):
         url = urllib.urlopen(newloc)
         html = url.read()
-        self.document = HTMLDocument(minidom.parseString(html))
+        self.document = Document(minidom.parseString(html))
     
     location = property(_getLocation, _setLocation)
 
@@ -261,15 +260,47 @@
 # a lot... isn't it possible to just use dom.window and dom.document instead?)
 
 def get_document():
-    return NonConstant(window.document)
+    return NonConstant(Window().document)
 
 def get_window():
-    return NonConstant(window)
+    return NonConstant(Window())
 
 # rtyper stuff
 
-# the Node base class contains just about all XML-related properties
-Node._fields = {
+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 = {
+    'addEventListener' : MethodDesc(["aa", lambda : None, True]),
+    'dispatchEvent' : MethodDesc(["aa"], True),
+    'removeEventListener' : MethodDesc(["aa", lambda : None, True]),
+}
+
+Node._fields = EventTarget._fields.copy()
+Node._fields.update({
     'childNodes' : [Element()],
     'firstChild' : Element(),
     'lastChild' : Element(),
@@ -283,51 +314,27 @@
     'ownerDocument' : Document(),
     'parentNode' : Element(),
     'prefix' : "aa",
-    'previousSibling' : Element(),
+    'previousSibling': Element(),
     'tagName' : "aa",
     'textContent' : "aa",
-}
+})
 
-Node._methods = {
+Node._methods = EventTarget._methods.copy()
+Node._methods.update({
     'appendChild' : MethodDesc([Element()]),
     'cloneNode' : MethodDesc([12], Element()),
-    'getElementsByTagName' : MethodDesc(["aa"], [Element(), Element()]),
+    '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({
-    'getAttribute' : MethodDesc(["aa"], "aa"),
-    'getAttributeNS' : MethodDesc(["aa", "aa"], "aa"),
-    'getAttributeNode' : MethodDesc(["aa"], Element()),
-    'getAttributeNodeNS' : MethodDesc(["aa", "aa"], Element()),
-    'hasAttribute' : MethodDesc(["aa"], True),
-    'hasAttributeNS' : MethodDesc(["aa", "aa"], True),
-    'hasAttributes' : MethodDesc([], True),
-    'removeAttribute' : MethodDesc(['aa']),
-    'removeAttributeNS' : MethodDesc(["aa", "aa"]),
-    'removeAttributeNode' : MethodDesc([Element()], "aa"),
-    'setAttribute' : MethodDesc(["aa", "aa"]),
-    'setAttributeNS' : MethodDesc(["aa", "aa", "aa"]),
-    'setAttributeNode' : MethodDesc([Element()], Element()),
-    'setAttributeNodeNS' : MethodDesc(["ns", Element()], Element()),
-})
-
-HTMLNode._fields = Node._fields.copy()
-HTMLNode._methods = Node._methods.copy()
-
-HTMLElement._fields = HTMLNode._fields.copy()
-HTMLElement._fields.update(Element._fields.copy())
-HTMLElement._fields.update({
     'className' : "aa",
     'clientHeight' : 12,
     'clientWidth' : 12,
@@ -346,14 +353,28 @@
     'scrollLeft' : 12,
     'scrollTop' : 12,
     'scrollWidth' : 12,
+    # HTML specific
     'style' : Style(),
     'tabIndex' : 12,
-    'value' : "aa", # XXX?
 })
 
-HTMLElement._methods = HTMLNode._methods.copy()
-HTMLElement._methods.update(Element._methods.copy())
-HTMLElement._methods.update({
+Element._methods = Node._methods.copy()
+Element._methods.update({
+    'getAttribute' : MethodDesc(["aa"], "aa"),
+    'getAttributeNS' : MethodDesc(["aa", "aa"], "aa"),
+    'getAttributeNode' : MethodDesc(["aa"], Element()),
+    'getAttributeNodeNS' : MethodDesc(["aa", "aa"], Element()),
+    'hasAttribute' : MethodDesc(["aa"], True),
+    'hasAttributeNS' : MethodDesc(["aa", "aa"], True),
+    'hasAttributes' : MethodDesc([], True),
+    'removeAttribute' : MethodDesc(['aa']),
+    'removeAttributeNS' : MethodDesc(["aa", "aa"]),
+    'removeAttributeNode' : MethodDesc([Element()], "aa"),
+    'setAttribute' : MethodDesc(["aa", "aa"]),
+    'setAttributeNS' : MethodDesc(["aa", "aa", "aa"]),
+    'setAttributeNode' : MethodDesc([Element()], Element()),
+    'setAttributeNodeNS' : MethodDesc(["ns", Element()], Element()),
+    # HTML specific
     'blur' : MethodDesc([]),
     'click' : MethodDesc([]),
     'focus' : MethodDesc([]),
@@ -368,24 +389,6 @@
     'doctype' : "aa",
     'documentElement' : Element(),
     'styleSheets' : [Style(), Style()],
-})
-
-Document._methods = Node._methods.copy()
-Document._methods.update({
-    'createAttribute' : MethodDesc(["aa"], Element()),
-    'createDocumentFragment' : MethodDesc([], Element()),
-    'createElement' : MethodDesc(["aa"], Element()),
-    'createElementNS' : MethodDesc(["aa", "aa"], Element()),
-    'createEvent' : MethodDesc(["aa"], Event()),
-    'createTextNode' : MethodDesc(["aa"], Element()),
-    #'createRange' : MethodDesc(["aa"], Range()) - don't know what to do here
-    'getElementById' : MethodDesc(["aa"], Element()),
-    'getElementsByName' : MethodDesc(["aa"], [Element(), Element()]),
-    'importNode' : MethodDesc([Element(), True], Element()),
-})
-
-HTMLDocument._fields = Document._fields.copy()
-HTMLDocument._fields.update({
     'alinkColor' : "aa",
     'bgColor' : "aa",
     'body' : Element(),
@@ -408,8 +411,18 @@
     'width' : 123,
 })
 
-HTMLDocument._methods = Document._methods.copy()
-HTMLDocument._methods.update({
+Document._methods = Node._methods.copy()
+Document._methods.update({
+    'createAttribute' : MethodDesc(["aa"], Element()),
+    'createDocumentFragment' : MethodDesc([], Element()),
+    'createElement' : MethodDesc(["aa"], Element()),
+    'createElementNS' : MethodDesc(["aa", "aa"], Element()),
+    'createEvent' : MethodDesc(["aa"], Event()),
+    'createTextNode' : MethodDesc(["aa"], Element()),
+    #'createRange' : MethodDesc(["aa"], Range()) - don't know what to do here
+    'getElementById' : MethodDesc(["aa"], Element()),
+    'getElementsByName' : MethodDesc(["aa"], [Element(), Element()]),
+    'importNode' : MethodDesc([Element(), True], Element()),
     'clear' : MethodDesc([]),
     'close' : MethodDesc([]),
     'open' : MethodDesc([]),
@@ -417,7 +430,8 @@
     'writeln' : MethodDesc(["aa"]),
 })
 
-Window._fields = {
+Window._fields = EventTarget._fields.copy()
+Window._fields.update({
     'content' : Window(),
     'closed' : True,
     # 'crypto' : Crypto() - not implemented in Gecko, leave alone
@@ -450,9 +464,10 @@
     'status' : "asd",
     'top' : Window(),
     'window' : Window(),
-}
+})
 
-Window._methods = {
+Window._methods = Node._methods.copy()
+Window._methods.update({
     'alert' : MethodDesc(["aa"]),
     'atob' : MethodDesc(["aa"], "aa"),
     'back' : MethodDesc([]),
@@ -468,7 +483,7 @@
     'getComputedStyle' : MethodDesc([Element(), "aa"], Style()),
     'home' : MethodDesc([]),
     'open' : MethodDesc(["aa", "aa"]),
-}
+})
 
 Style._fields = {
     'azimuth' : 'aa',
@@ -600,38 +615,6 @@
     'zIndex' : 'aa',
 }
 
-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 = {
-    'addEventListener' : MethodDesc(["aa", lambda : None, True]),
-    'dispatchEvent' : MethodDesc(["aa"], True),
-    'removeEventListener' : MethodDesc(["aa", lambda : None, True]),
-}
-
 Event._fields = {
     'bubbles': True,
     'cancelBubble': True,
@@ -680,10 +663,10 @@
         return _wrap(value)
 
 _typetoclass = {
-    1: HTMLElement,
+    1: Element,
     2: Attribute,
     3: Text,
-    9: HTMLDocument,
+    9: Document,
 }
 def _wrap(value):
     if isinstance(value, minidom.Node):
@@ -732,6 +715,4 @@
 
 # set the global 'window' instance to an empty HTML document, override using
 # dom.window = Window(html) (this will also set dom.document)
-window = Window()
-this = window
 

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 13:16:21 2006
@@ -8,6 +8,17 @@
 USE_PDB = False
 # XXX: How to get it from config.option???
 
+class handler:
+    called = False
+    event = dom.Event()
+    def __call__(self, e):
+        self.called = True
+        self.event = e
+        e.stopPropagation()
+
+def get_window():
+    return dom.get_window()
+
 def test_quote_html():
     assert dom._quote_html('foo&bar') == 'foo&amp;bar'
     assert dom._quote_html('foo"&bar') == 'foo&quot;&amp;bar'
@@ -26,68 +37,90 @@
     html = '<div>foo&amp;bar</div>'
     assert roundtrip(html) == html
 
-def init():
-    if TRANSLATING:
-        window = dom.get_window()
-    else:
-        window = dom.Window('<html><body>foo</body></html>')
+def code_init():
+    window = dom.get_window()
     nodeType = window.document.nodeType
     docel = window.document.documentElement.nodeName
-    somediv = window.document.getElementsByTagName('body')[0].childNodes[0]
+    children = len(window.document.documentElement.childNodes)
     
-    return nodeType, docel, somediv
-
+    return nodeType, docel, children
 
 def test_init():
-    nodeType, docel, somediv = init()
+    nodeType, docel, children = code_init()
     assert nodeType == 9
     assert docel == 'HTML'
-    # XXX gotta love the DOM API ;)
-    assert somediv.nodeValue == 'foo'
-    py.test.raises(py.std.xml.parsers.expat.ExpatError,
-                   'dom.Window("<html><body></html>")')
+    assert children == 2
 
-def test_build_init():
-    global TRANSLATING
-    TRANSLATING = True
-    assert rpython2javascript(sys.modules[__name__], ['init'], use_pdb=USE_PDB)
+def test_init_failing():
+    py.test.raises(py.std.xml.parsers.expat.ExpatError,
+                   'dom.Window(html="<html><body></html>")')
 
-def test_wrap():
-    window = dom.Window()
+def code_wrap():
+    window = get_window()
     document = window.document
     div = document.createElement('div')
+    document.documentElement.appendChild(div)
+    return document, div
+
+def test_wrap():
+    document, div = code_wrap()
     assert isinstance(div, dom.Element) # wrapped node
     assert div.nodeType == 1
-    document.documentElement.appendChild(div)
     assert document.documentElement.childNodes[-1]._original is div._original
 
-def test_node_eq():
-    window = dom.Window()
+def code_node_eq():
+    window = get_window()
     body = window.document.getElementsByTagName('body')[0]
-    ref = body.parentNode.lastChild
-    assert ref == body
-    ref = window.document.createElement('body')
-    assert ref != body
+    firstref = body.parentNode.lastChild
+    secondref = window.document.createElement('body')
+    return body, firstref, secondref
 
-def test_get_element_by_id():
-    window = dom.Window('<html><body><div id="foo" /></body></html>')
+def test_node_eq():
+    body, ref1, ref2 = code_node_eq()
+    assert ref1 == body
+    assert ref2 != body
+
+def code_get_element_by_id():
+    window = get_window()
+    document = window.document
+    div = document.createElement('div')
+    div.id = 'foo'
+    window.document.getElementsByTagName('body')[0].appendChild(div)
     div = window.document.getElementById('foo')
+    return div
+
+def test_get_element_by_id():
+    div = code_get_element_by_id()
     assert div.nodeName == 'DIV'
 
-def test_element_style():
-    window = dom.Window()
+def code_element_style():
+    window = get_window()
     document = window.document
     div = document.createElement('div')
-    assert div.style
-    assert not div.style.backgroundColor
     div.style.backgroundColor = 'green'
+    return div
+
+def test_element_style():
+    div = code_element_style()
+    assert div.style
+    assert not div.style.color
     assert div.style.backgroundColor == 'green'
     py.test.raises(AttributeError, 'div.style.nonExistent')
 
-def test_get_elements_by_tag_name():
-    window = dom.Window('<html><body><div>foo</div>'
-                    '<div>bar</div></body></html>')
+def code_get_elements_by_tag_name():
+    window = get_window()
     document = window.document
+    div1 = document.createElement('div')
+    div1.appendChild(document.createTextNode('foo'))
+    div2 = document.createElement('div')
+    div2.appendChild(document.createTextNode('bar'))
+    body = document.getElementsByTagName('body')[0]
+    body.appendChild(div1)
+    body.appendChild(div2)
+    return document
+
+def test_get_elements_by_tag_name():
+    document = code_get_elements_by_tag_name()
     divs = document.getElementsByTagName('div')
     assert len(divs) == 2
     divs = document.getElementsByTagName('DIV')
@@ -108,131 +141,177 @@
     assert window3.parent is window2
     assert window3.top is window
 
+def code_read_innerHTML():
+    window = get_window()
+    document = window.document
+    h1 = document.createElement('h1')
+    h1.appendChild(document.createTextNode('some document'))
+    p = document.createElement('p')
+    p.id = 'content'
+    p.appendChild(document.createTextNode('some content'))
+    body = document.getElementsByTagName('body')[0]
+    body.appendChild(h1)
+    body.appendChild(p)
+    return document.documentElement.innerHTML
+
 def test_read_innerHTML():
-    window = dom.Window('<html><body><h1>some document</h1>'
-                        '<p id="content">some content</p></body></html>')
+    html = code_read_innerHTML()
+    assert html == ('<head><title>Untitled document</title></head>'
+                    '<body><h1>some document</h1>'
+                    '<p id="content">some content</p></body>')
+
+def code_read_innerHTML_singletons():
+    window = get_window()
     document = window.document
-    nodeName = window.document.documentElement.nodeName
-    assert nodeName == 'HTML'
-    html = window.document.documentElement.innerHTML
-    assert html == ('<body><h1>some document</h1>'
-                '<p id="content">some content</p></body>')
+    head = document.getElementsByTagName('head')[0]
+    meta = document.createElement('meta')
+    meta.setAttribute('name', 'foo')
+    meta.setAttribute('content', 'bar')
+    head.appendChild(meta)
+    headhtml = window.document.getElementsByTagName('head')[0].innerHTML
+    return headhtml
 
 def test_read_innerHTML_singletons():
-    window = dom.Window('<html><head><meta name="foo" content="bar">'
-                        '</meta></head></html>')
-    metahtml = window.document.getElementsByTagName('head')[0].innerHTML
-    assert py.std.re.match('^<meta .* \/>$',
-                           '<meta name="foo" content="bar" />')
+    headhtml = code_read_innerHTML_singletons()
+    assert py.std.re.search('<meta [^>]*\/>', headhtml)
 
-def test_set_innerHTML():
-    window = dom.Window('<html><body>initial content</body></html>')
+def code_set_innerHTML():
+    window = get_window()
     body = window.document.getElementsByTagName('body')[0]
-    assert body.innerHTML == ''
     body.innerHTML = '<div>some content</div>'
+    return body
+
+def test_set_innerHTML():
+    body = code_set_innerHTML()
     assert body.innerHTML == '<div>some content</div>'
     assert body.childNodes[0].nodeName == 'DIV'
 
-def test_event_init():
-    window = dom.Window()
-    e = dom.Event()
+def code_event_init_1():
+    window = get_window()
+    e = window.document.createEvent()
     e.initEvent('click', True, True)
+    return window, e
+
+def code_event_init_2():
+    window, event = code_event_init_1()
+    body = window.document.getElementsByTagName('body')[0]
+    body.dispatchEvent(event)
+    return body, event
+
+def test_event_init():
+    window, e = code_event_init_1()
     assert e.cancelable == True
     assert e.target == None
-    body = window.document.getElementsByTagName('body')[0]
-    body.dispatchEvent(e)
+    body, e = code_event_init_2()
     assert e.target is body
 
-def test_event_handling():
-    class handler:
-        called = False
-        def __call__(self, e):
-            self.called = True
+def code_event_handling():
     h = handler()
-    window = dom.Window()
+    window = get_window()
     body = window.document.getElementsByTagName('body')[0]
     body.addEventListener('click', h, False)
-    e = dom.Event()
+    e = window.document.createEvent()
     e.initEvent('click', True, True)
     body.dispatchEvent(e)
+    return h
+
+def test_event_handling():
+    h = code_event_handling()
     assert h.called == True
 
-def test_event_bubbling():
-    class handler:
-        called = False
-        def __call__(self, e):
-            self.called = True
+def code_event_bubbling_1():
     h = handler()
-    window = dom.Window()
+    window = get_window()
     body = window.document.getElementsByTagName('body')[0]
     div = window.document.createElement('div')
     body.appendChild(div)
     body.addEventListener('click', h, False)
-    e = dom.Event()
+    e = window.document.createEvent()
     e.initEvent('click', False, True)
     div.dispatchEvent(e)
-    assert h.called == False
-    e = dom.Event()
+    return div, h
+
+def code_event_bubbling_2():
+    div, h = code_event_bubbling_1()
+    e = div.ownerDocument.createEvent()
     e.initEvent('click', True, True)
     div.dispatchEvent(e)
+    return h
+
+def test_event_bubbling():
+    div, h = code_event_bubbling_1()
+    assert not h.called
+    h = code_event_bubbling_2()
     assert h.called == True
 
-def test_remove_event_listener():
-    class handler:
-        called = False
-        def __call__(self, e):
-            self.called = True
-    window = dom.Window()
+def code_remove_event_listener():
+    window = get_window()
     body = window.document.getElementsByTagName('body')[0]
     div = window.document.createElement('div')
     body.appendChild(div)
-    py.test.raises(Exception, 'body.removeEventListener("click", h, False)')
     h = handler()
     body.addEventListener('click', h, False)
-    e = dom.Event()
+    e = window.document.createEvent()
     e.initEvent('click', True, True)
     body.dispatchEvent(e)
-    assert h.called == True
+    return body, h
+
+def code_remove_event_listener_2():
+    body, h = code_remove_event_listener()
     h.called = False
     body.removeEventListener('click', h, False)
-    e = dom.Event()
+    e = body.ownerDocument.createEvent()
     e.initEvent('click', True, True)
     body.dispatchEvent(e)
+    return h
+
+def test_remove_event_listener():
+    body, h = code_remove_event_listener()
+    assert h.called == True
+    h = code_remove_event_listener_2()
     assert h.called == False
 
-def test_event_vars():
-    class handler:
-        event = None # XXX annotator problem?
-        def __call__(self, e):
-            self.event = e
-            e.stopPropagation()
-    window = dom.Window()
+def code_event_vars():
+    window = get_window()
     body = window.document.getElementsByTagName('body')[0]
     div = window.document.createElement('div')
     body.appendChild(div)
     h = handler()
     body.addEventListener('click', h, False)
-    e = dom.Event()
+    e = window.document.createEvent()
     e.initEvent('click', True, True)
     div.dispatchEvent(e)
+    return body, div, h
+
+def test_event_vars():
+    body, div, h = code_event_vars()
     assert h.event.target == div
     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>')
+def code_class_name():
+    window = get_window()
+    document = window.document
+    body = document.getElementsByTagName('body')[0]
+    div = document.createElement('div')
+    div.appendChild(document.createTextNode('foo'))
+    div.setAttribute('class', 'foo')
+    body.appendChild(div)
     div = window.document.getElementsByTagName('div')[0]
+    return body, div
+
+def test_class_name():
+    body, div = code_class_name()
     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("Fails")
+    py.test.skip('Borken')
     for var in globals():
-        if var.startswith('test_') and var != 'test_build':
+        if var.startswith('code_'):
             # just build it
             rpython2javascript(sys.modules[__name__], [var])
 



More information about the Pypy-commit mailing list