[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&bar'
assert dom._quote_html('foo"&bar') == 'foo"&bar'
@@ -26,68 +37,90 @@
html = '<div>foo&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