Skip to content

Commit

Permalink
W3C DOM code refactoring
Browse files Browse the repository at this point in the history
  • Loading branch information
buffer committed Aug 10, 2011
1 parent 76bbca2 commit 871d130
Show file tree
Hide file tree
Showing 90 changed files with 4,781 additions and 2,100 deletions.
36 changes: 25 additions & 11 deletions src/DOM/DFT.py
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,7 @@
# MA 02111-1307 USA

import os
import w3c
import W3C.w3c as w3c
import hashlib
import logging
import Window
Expand Down Expand Up @@ -63,16 +63,17 @@ def fix(self, script):
def handle_onload(self):
try:
body = self.window.doc.body
if body and body.tag.has_key('onload'):
self.window.evalScript(self.fix(body.tag['onload']), tag = body.tag.contents[-1])
except:
pass
body = self.window.doc.getElementsByTagName('body')[0]

if body and body.tag.has_key('onload'):
self.window.evalScript(self.fix(body.tag['onload']), tag = body.tag.contents[-1])

if hasattr(self.window, 'onload'):
self.window.evalScript(self.fix(self.window.onload))

def handle_onclick(self):
inputs = self.window._findAll('input')
inputs = self.window._findAll(('input', 'a'))
for input in inputs:
for k, v in input.attrs:
if k in ('onclick', ):
Expand Down Expand Up @@ -163,7 +164,11 @@ def handle_applet(self, applet):
if not archive:
return

response, content = self.window._navigator.fetch(archive)
try:
response, content = self.window._navigator.fetch(archive)
except:
return

self.log.warning('Saving applet %s' % (archive, ))
with open(archive, 'wb') as fd:
fd.write(content)
Expand Down Expand Up @@ -219,17 +224,26 @@ def handle_frame(self, frame):
def handle_iframe(self, iframe):
self.handle_frame(iframe)

def handle_body(self, body):
pass

def run(self):
self.log.warning(self.window.doc)
self.log.debug(self.window.doc)

soup = self.window.doc.doc

# Dirty hack
for p in soup.findAll('object'):
self.handle_object(p)

for child in soup.recursiveChildGenerator():
name = getattr(child, "name", None)
if name is not None:
handler = getattr(self, "handle_%s" % (name, ), None)
if handler:
handler(child)
if name is None or name in ('object', ):
continue

handler = getattr(self, "handle_%s" % (name, ), None)
if handler:
handler(child)

self.handle_onload()
self.handle_onclick()
88 changes: 88 additions & 0 deletions src/DOM/W3C/Attr.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,88 @@
#!/usr/bin/env python
from __future__ import with_statement

import sys, re, string

from HTML import BeautifulSoup
import PyV8

from DOMException import DOMException
from Node import Node

class Attr(Node):
_value = ""

def __init__(self, parent, attr):
self.parent = parent
self.attr = attr

self._value = self.getValue()

def __repr__(self):
return "<Attr object %s%s at 0x%08X>" % ("%s." % self.parent.tagName if self.parent else "", self.attr, id(self))

def __eq__(self, other):
return hasattr(other, "parent") and self.parent == other.parent and \
hasattr(other, "attr") and self.attr == other.attr

@property
def nodeType(self):
return Node.ATTRIBUTE_NODE

@property
def nodeName(self):
return self.attr

def getNodeValue(self):
return self.getValue()

def setNodeValue(self, value):
return self.setValue(value)

nodeValue = property(getNodeValue, setNodeValue)

@property
def childNodes(self):
from NodeList import NodeList

return NodeList(self.parent.doc, [])

@property
def parentNode(self):
return self.parent

# Introduced in DOM Level 2
@property
def ownerElement(self):
if self.parent:
if self.parent.nodeType == Node.ELEMENT_NODE:
return self.parent

return None

@property
def ownerDocument(self):
return self.parent.doc

@property
def name(self):
return self.attr

def specified(self):
return self.parent.has_key(self.attr)

def getValue(self):
if self.parent:
if self.parent.tag.has_key(self.attr):
return self.parent.tag[self.attr]

return self._value

def setValue(self, value):
self._value = value

if self.parent:
self.parent.tag[self.attr] = value

value = property(getValue, setValue)

16 changes: 16 additions & 0 deletions src/DOM/W3C/CDATASection.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
from __future__ import with_statement

import sys, re, string

from DOMException import DOMException
from Text import Text


class CDATASection(Text):
def __repr__(self):
return "<CDATA '%s' at 0x%08X>" % (self.tag, id(self))

@property
def nodeName(self):
return "#cdata-section"

45 changes: 45 additions & 0 deletions src/DOM/W3C/CharacterData.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,45 @@
#!/usr/bin/env python
from __future__ import with_statement

import sys, re, string
import PyV8

from DOMException import DOMException
from Node import Node

class CharacterData(Node):
def __init__(self, doc, tag):
Node.__init__(self, doc)

self.tag = tag

def __str__(self):
return str(self.tag)

def getData(self):
return unicode(self.tag)

def setData(self, data):
raise DOMException(DOMException.NO_MODIFICATION_ALLOWED_ERR)

data = property(getData, setData)

@property
def length(self):
return len(self.tag)

def substringData(self, offset, count):
return self.tag[offset:offset+count]

def appendData(self, arg):
raise DOMException(DOMException.NO_MODIFICATION_ALLOWED_ERR)

def insertData(self, offset, arg):
raise DOMException(DOMException.NO_MODIFICATION_ALLOWED_ERR)

def deleteData(self, offset, count):
raise DOMException(DOMException.NO_MODIFICATION_ALLOWED_ERR)

def replaceData(self, offset, count, arg):
raise DOMException(DOMException.NO_MODIFICATION_ALLOWED_ERR)

12 changes: 12 additions & 0 deletions src/DOM/W3C/Comment.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
#!/usr/bin/env python
from __future__ import with_statement

from DOMException import DOMException
from CharacterData import CharacterData


class Comment(CharacterData):
@property
def nodeName(self):
return "#comment"

29 changes: 29 additions & 0 deletions src/DOM/W3C/DOMException.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
#!/usr/bin/env python
from __future__ import with_statement

import sys
import PyV8

class DOMException(RuntimeError, PyV8.JSClass):
def __init__(self, code):
self.code = code

# ExceptionCode
INDEX_SIZE_ERR = 1 # If index or size is negative, or greater than the allowed value
DOMSTRING_SIZE_ERR = 2 # If the specified range of text does not fit into a DOMString
HIERARCHY_REQUEST_ERR = 3 # If any node is inserted somewhere it doesn't belong
WRONG_DOCUMENT_ERR = 4 # If a node is used in a different document than the one that created it (that doesn't support it)
INVALID_CHARACTER_ERR = 5 # If an invalid or illegal character is specified, such as in a name.
NO_DATA_ALLOWED_ERR = 6 # If data is specified for a node which does not support data
NO_MODIFICATION_ALLOWED_ERR = 7 # If an attempt is made to modify an object where modifications are not allowed
NOT_FOUND_ERR = 8 # If an attempt is made to reference a node in a context where it does not exist
NOT_SUPPORTED_ERR = 9 # If the implementation does not support the type of object requested
INUSE_ATTRIBUTE_ERR = 10 # If an attempt is made to add an attribute that is already in use elsewhere

# Introduced in Level 2
INVALID_STATE_ERR = 11 # If an attempt is made to use an object that is not, or is no longer, usable
SYNTAX_ERR = 12 # If an invalid or illegal string is specified
INVALID_MODIFICATION_ERR = 13 # If an attempt is made to modify the type of the underlying object
NAMESPACE_ERR = 14 # If an attempt is made to create or change an object in a way which is incorrect with regards to namespaces
INVALID_ACCESS_ERR = 15 # If a parameter or an operation is not supported by the underlying object

Loading

0 comments on commit 871d130

Please sign in to comment.