Add more window globals and shims in task shell

This allows jQuery to be successfully loaded from a web worker
since it does not have a document or window object by default.

Previously it would log about missing methods and properties.

Closes #228
This commit is contained in:
Kevin Sawicki 2013-02-04 11:41:51 -08:00
parent 0bb0863b61
commit cd07ec841d
4 changed files with 48 additions and 4 deletions

View File

@ -0,0 +1,4 @@
module.exports =
load: ->
$ = require 'jquery'
callTaskMethod('loaded', $?)

View File

@ -0,0 +1,23 @@
Task = require 'task'
describe "Task shell", ->
describe "populating the window with fake properties", ->
describe "when jQuery is loaded in a web worker", ->
it "doesn't log to the console", ->
spyOn(console, 'log')
spyOn(console, 'error')
spyOn(console, 'warn')
class JQueryTask extends Task
constructor: -> super('fixtures/jquery-task-handler.coffee')
started: -> @callWorkerMethod('load')
loaded: (@jqueryLoaded) ->
task = new JQueryTask()
task.start()
waitsFor "web worker to start and jquery to be required", 5000, ->
task.jqueryLoaded
runs ->
expect(task.jqueryLoaded).toBeTruthy()
expect(console.log).not.toHaveBeenCalled()
expect(console.error).not.toHaveBeenCalled()
expect(console.warn).not.toHaveBeenCalled()

View File

@ -12,6 +12,19 @@ self.console =
log: -> callTaskMethod 'log', arguments...
error: -> callTaskMethod 'error', arguments...
window.document =
createElement: ->
setAttribute: ->
getElementsByTagName: -> []
appendChild: ->
documentElement:
insertBefore: ->
removeChild: ->
getElementById: -> {}
createComment: -> {}
createDocumentFragment: -> {}
self.document = window.document
# `callTaskMethod` can be used to invoke method's on the parent `Task` object
# back in the window thread.
self.callTaskMethod = (method, args...) ->
@ -19,9 +32,10 @@ self.callTaskMethod = (method, args...) ->
# The worker's initial handler replaces itself when `start` is invoked
self.handler =
start: ({resourcePath, requirePath, handlerPath}) ->
self.resourcePath = resourcePath
window.resourcePath = resourcePath
start: ({resourcePath, globals, requirePath, handlerPath}) ->
for key, value of globals
self[key] = value
window[key] = value
importScripts(requirePath)
require 'config'
self.handler = require(handlerPath)

View File

@ -17,7 +17,10 @@ class Task
startWorker: ->
@callWorkerMethod 'start'
resourcePath: window.resourcePath
globals:
resourcePath: window.resourcePath
navigator:
userAgent: navigator.userAgent
requirePath: require.getPath('require')
handlerPath: @path