Skip to content

Commit

Permalink
Started working on upgrade to JSDOM 0.2.3 and HTML 5 0.3.0.
Browse files Browse the repository at this point in the history
  • Loading branch information
assaf committed Aug 23, 2011
1 parent 0a5d6c7 commit f230c4d
Show file tree
Hide file tree
Showing 12 changed files with 47 additions and 338 deletions.
3 changes: 0 additions & 3 deletions .gitmodules

This file was deleted.

5 changes: 1 addition & 4 deletions Cakefile
Expand Up @@ -65,10 +65,7 @@ task "install", "Install Zombie in your local repository", ->

build = (callback)->
log "Compiling CoffeeScript to JavaScript ...", green
exec "rm -rf lib && coffee -c -l -b -o lib src", (err, stdout)->
onerror err
log "Compiling native extension ...", green
exec "node-waf configure build", callback
exec "rm -rf lib && coffee -c -l -b -o lib src", callback
task "build", "Compile CoffeeScript to JavaScript", -> build onerror

task "watch", "Continously compile CoffeeScript to JavaScript", ->
Expand Down
7 changes: 3 additions & 4 deletions package.json
Expand Up @@ -31,15 +31,14 @@
"wscript"
],
"scripts": {
"install": "node-waf clean || true; node-waf configure build",
"test": "node-waf configure build && vows --spec"
"test": "vows --spec"
},
"engines": {
"node": ">= 0.4.0"
},
"dependencies": {
"html5": "~0.2.16",
"jsdom": "~0.1.23",
"html5": "~0.3.0",
"jsdom": "~0.2.3",
"mime": "~1.2.2",
"websocket-client": "~1.0.0"
},
Expand Down
6 changes: 4 additions & 2 deletions spec/browser-spec.coffee
Expand Up @@ -61,7 +61,7 @@ brains.get "/app.js", (req, res)-> res.send """
document.title = "Signed up";
});
});
$(function() { Sammy("#main").run("#/") });
$(function() { Sammy("#main").run("#/"); });
"""

brains.get "/dead", (req, res)-> res.send """
Expand Down Expand Up @@ -99,6 +99,7 @@ brains.get "/iframe", (req, res)-> res.send """
"""

vows.describe("Browser").addBatch(

"open page":
zombie.wants "http://localhost:3003/scripted"
"should create HTML document": (browser)-> assert.instanceOf browser.document, jsdom.dom.level3.html.HTMLDocument
Expand Down Expand Up @@ -132,7 +133,8 @@ vows.describe("Browser").addBatch(
"should include status code in error": (args)-> assert.equal args[0].response.statusCode, 404
"empty page":
zombie.wants "http://localhost:3003/empty"
"should load document": (browser)-> assert.ok browser.body
"should load document": (browser)->
assert.ok browser.body

"event emitter":
"successful":
Expand Down
4 changes: 2 additions & 2 deletions spec/helpers.coffee
Expand Up @@ -58,10 +58,10 @@ brains.ready = (callback)->
zombie.wants = (url, context)->
topic = context.topic
context.topic = ->
new zombie.Browser().wants url, (err, browser)=>
new zombie.Browser().wants url, {}, (err, browser)=>
if topic
try
value = topic.call this, browser
value = topic.call(this, browser)
@callback null, value if value
catch err
@callback err
Expand Down
32 changes: 19 additions & 13 deletions src/zombie/browser.coffee
Expand Up @@ -7,8 +7,6 @@ require "./forms"
require "./xpath"
History = require("./history").History
EventLoop = require("./eventloop").EventLoop
#require.paths.push "../../build/default"
WindowContext = require("../../build/default/window_context").WindowContext


# Use the browser to open up new windows and load documents.
Expand All @@ -24,6 +22,12 @@ class Browser extends require("events").EventEmitter
ws = require("./websocket").use(this)
resources = require("./resources")

# Make sure we don't blow up Node when we get a JS error, but dump error to
# console. Ignore if there's any other error handler.
@on "error", (err)->
if @listeners("error").length == 1
console.error err


# Options
# -------
Expand Down Expand Up @@ -93,14 +97,15 @@ class Browser extends require("events").EventEmitter
history = features.history || new History(this)

# Add context for evaluating scripts.
#context = new WindowContext(jsdom.createWindow(html))
#newWindow = context.global
#newWindow._evaluate = (code, filename)-> context.evaluate(code, filename)
#newWindow._evaluate "this.window = this"
newWindow = jsdom.createWindow()

newWindow = jsdom.createWindow(html)
context = new WindowContext(newWindow)
newWindow._evaluate = (code, filename)-> context.evaluate(code, filename)
# Evaulate in context of window. This can be called with a script (String)
# or a function.
newWindow._evaluate = (code, filename)->
if typeof code == "string" || code instanceof String
newWindow.run code, filename
else
code.call newWindow

# Switch to the newly created window if it's interactive.
# Examples of non-interactive windows are frames.
Expand Down Expand Up @@ -132,10 +137,11 @@ class Browser extends require("events").EventEmitter
img.width = width
img.height = height
img
newWindow.console = console

# Default onerror handler.
newWindow.onerror = (event)=> @emit "error", event.error || new Error("Error loading script")

newWindow.onerror = (event)=>
@emit "error", event.error || new Error("Error loading script")
return newWindow


Expand Down Expand Up @@ -176,8 +182,8 @@ class Browser extends require("events").EventEmitter
@removeListener "error", onerror
@removeListener "done", ondone
callback null, this
@on "error", onerror
@on "done", ondone
@once "error", onerror
@once "done", ondone
window._eventloop.wait window, terminate
return

Expand Down
10 changes: 2 additions & 8 deletions src/zombie/eventloop.coffee
Expand Up @@ -19,10 +19,7 @@ class EventLoop
try
window._evaluate fn
catch error
evt = window.document.createEvent("HTMLEvents")
evt.initEvent "error", true, false
evt.error = error
window.dispatchEvent evt
window.document.trigger "error", "Timeout: #{error.message}", error
finally
delete timers[handle]
handle = ++lastHandle
Expand All @@ -41,10 +38,7 @@ class EventLoop
try
window._evaluate fn
catch error
evt = window.document.createEvent("HTMLEvents")
evt.initEvent "error", true, false
evt.error = error
window.dispatchEvent evt
window.document.trigger "error", "Interval: #{error.message}", error
finally
timer.when = window.browser.clock + delay
handle = ++lastHandle
Expand Down
24 changes: 12 additions & 12 deletions src/zombie/history.coffee
Expand Up @@ -66,36 +66,36 @@ class History
# point on the browser sees a new document, client register event
# handler for DOMContentLoaded/error.
options =
url: URL.format(url)
deferClose: false
parser: require("html5").HTML5
features:
QuerySelector: true
MutationEvents: "2.0"
ProcessExternalResources: []
FetchExternalResources: []
FetchExternalResources: ["css", "frame"]
parser: require("html5").HTML5
url: URL.format(url)
if browser.runScripts
options.features.ProcessExternalResources.push "script"
options.features.FetchExternalResources.push "script"
options.features.FetchExternalResources.push "iframe"
document = jsdom.jsdom(false, jsdom.level3, options)
document.fixQueue()
document = jsdom.jsdom(null, jsdom.dom.level3.core, options)
browser.window.document = document
document.window = document.parentWindow = browser.window
document.fixQueue()

headers = if headers then JSON.parse(JSON.stringify(headers)) else {}
referer = stack[index-1]?.url
headers["referer"] = referer.href if referer?
browser.window.resources.request method, url, data, headers, (error, response)=>
if error
event = document.createEvent("HTMLEvents")
event.initEvent "error", true, false
document.dispatchEvent event
document.write "<html><body>#{error}</body></html>"
document.close()
document.trigger "error", "Loading resource: #{error.message}", error
browser.emit "error", error
else
browser.response = [response.statusCode, response.headers, response.body]
stack[index].update response.url
body = if response.body.trim() == "" then "<html></html>" else response.body
document.open()
document.write body
html = if response.body.trim() == "" then "<html><body></body></html>" else response.body
document.write html
document.close()
if document.documentElement
browser.emit "loaded", browser
Expand Down
16 changes: 3 additions & 13 deletions src/zombie/jsdom_patches.coffee
Expand Up @@ -48,19 +48,7 @@ core.resourceLoader.load = (element, href, callback)->
# Scripts
# -------

core.languageProcessors =
javascript: (element, code, filename)->
document = element.ownerDocument
window = document.parentWindow
window.browser.log -> "Running script from #{filename}" if filename
try
window._evaluate code, filename
catch error
event = document.createEvent("HTMLEvents")
event.initEvent "error", true, false
event.error = error
window.dispatchEvent event

###
# DOMCharacterDataModified event fired when text is added to a
# TextNode. This is a crappy implementation, a good one would old and
# new values in the event.
Expand Down Expand Up @@ -99,6 +87,8 @@ core.Document.prototype._elementBuilders["iframe"] = (doc, s)->
iframe.window.parent = window
return iframe
###
#

# Queue
# -----
Expand Down

0 comments on commit f230c4d

Please sign in to comment.