Class('Scope.Provider', {
have : {
scope : null
},
methods : {
setup : function (callback) {
throw "Abstract method `setup` of Scope.Provider called"
},
cleanup : function () {
throw "Abstract method `cleanup` of Scope.Provider called"
},
runCode : function (text, callback) {
throw "Abstract method `runCode` of Scope.Provider called"
},
runScript : function (url, callback) {
throw "Abstract method `runScript` of Scope.Provider called"
}
}
});
Role('Scope.Provider.Role.WithDOM', {
requires : [ 'getDocument' ],
have : {
parentWindow : null
},
after : {
initialize : function () {
this.parentWindow = this.parentWindow || window
}
},
methods : {
runCode : function (text, callback) {
this.getDocument().body.appendChild(this.createScriptTag(text))
callback()
},
runScript : function (url, callback) {
this.getDocument().body.appendChild(this.createScriptTag(null, url, callback))
},
createScriptTag : function (text, url, callback) {
var node = this.getDocument().createElement("script")
node.setAttribute("type", "text/javascript")
if (url) node.setAttribute("src", url)
if (text) node.text = text
if (callback) node.onload = node.onreadystatechange = function() {
if (!node.readyState || node.readyState == "loaded" || node.readyState == "complete" || node.readyState == 4 && node.status == 200)
//surely for IE6..
setTimeout(callback, 1)
}
return node
}
}
})
/**
Name
====
Scope.Provider.Role.WithDOM - role for scope provider, which uses `script` tag for running the code.
SYNOPSIS
========
Class('Scope.Provider.IFrame', {
isa : Scope.Provider,
does : Scope.Provider.Role.WithDOM,
...
})
DESCRIPTION
===========
`Scope.Provider.Role.WithDOM` requires the implementation of the `getDocument` method, which should return the
document into which the `script` tags will be created.
In return, this role provides the implementation of `runCode` and `runScript`.
GETTING HELP
============
This extension is supported via github issues tracker: <http://github.com/SamuraiJack/Scope-Provider/issues>
For general Joose questions you can also visit [#joose](http://webchat.freenode.net/?randomnick=1&channels=joose&prompt=1)
on irc.freenode.org or the forum at: <http://joose.it/forum>
SEE ALSO
========
Web page of this module: <http://github.com/SamuraiJack/Scope-Provider/>
General documentation for Joose: <http://openjsan.org/go/?l=Joose>
BUGS
====
All complex software has bugs lurking in it, and this module is no exception.
Please report any bugs through the web interface at <http://github.com/SamuraiJack/Scope-Provider/issues>
AUTHORS
=======
Nickolay Platonov <nplatonov@cpan.org>
COPYRIGHT AND LICENSE
=====================
This software is Copyright (c) 2010 by Nickolay Platonov <nplatonov@cpan.org>.
This is free software, licensed under:
The GNU Lesser General Public License, Version 3, June 2007
*/;
Class('Scope.Provider.IFrame', {
isa : Scope.Provider,
does : Scope.Provider.Role.WithDOM,
have : {
sourceURL : '/jsan/Scope/Provider/static/stub.html',
iframe : null
},
methods : {
getDocument : function () {
return this.iframe.contentWindow.document
},
setup : function (callback) {
var me = this
var doc = this.parentWindow.document
var iframe = this.iframe = doc.createElement('iframe')
var subCallback = function () {
callback(me)
}
if (iframe.attachEvent)
iframe.attachEvent('onload', subCallback)
else
iframe.onload = subCallback
iframe.src = this.sourceURL
doc.body.appendChild(iframe)
this.scope = iframe.contentWindow
},
cleanup : function () {
var iframe = this.iframe
iframe.onload = null
this.parentWindow.document.body.removeChild(iframe)
}
}
})
/**
Name
====
Scope.Provider.IFrame - scope provider, which uses the iframe.
SYNOPSIS
========
var provider = new Scope.Provider.IFrame()
provider.setup(function () {
if (provider.scope.SOME_GLOBAL == 'some_value') {
...
}
provider.runCode(text, callback)
...
provider.runScript(url, callback)
...
provider.cleanup()
})
DESCRIPTION
===========
`Scope.Provider.IFrame` is an implementation of the scope provider, which uses the iframe,
to create a new scope.
ISA
===
[Scope.Provider](../Provider.html)
DOES
====
[Scope.Provider.Role.WithDOM](Role/WithDOM.html)
GETTING HELP
============
This extension is supported via github issues tracker: <http://github.com/SamuraiJack/Scope-Provider/issues>
For general Joose questions you can also visit [#joose](http://webchat.freenode.net/?randomnick=1&channels=joose&prompt=1)
on irc.freenode.org or the forum at: <http://joose.it/forum>
SEE ALSO
========
Web page of this module: <http://github.com/SamuraiJack/Scope-Provider/>
General documentation for Joose: <http://openjsan.org/go/?l=Joose>
BUGS
====
All complex software has bugs lurking in it, and this module is no exception.
Please report any bugs through the web interface at <http://github.com/SamuraiJack/Scope-Provider/issues>
AUTHORS
=======
Nickolay Platonov <nplatonov@cpan.org>
COPYRIGHT AND LICENSE
=====================
This software is Copyright (c) 2010 by Nickolay Platonov <nplatonov@cpan.org>.
This is free software, licensed under:
The GNU Lesser General Public License, Version 3, June 2007
*/;
Class('Scope.Provider.Window', {
isa : Scope.Provider,
does : Scope.Provider.Role.WithDOM,
have : {
popupWindow : null,
sourceURL : '/jsan/Scope/Provider/static/stubwindow.html'
},
methods : {
setup : function (callback) {
var me = this
var popup = this.scope = this.popupWindow = this.parentWindow.open(src, '_blank')
var subCallback = function () {
callback(me)
}
if (!popup) {
alert('Please enable popups for the host with this test suite running')
throw 'Please enable popups for the host with this test suite running'
}
popup.onload = subCallback
},
getDocument : function () {
return this.popup.document
},
cleanup : function () {
this.popupWindow.onload = null
this.popupWindow.close()
}
}
})
/**
Name
====
Scope.Provider.Window - scope provider, which uses the popup browser window.
SYNOPSIS
========
var provider = new Scope.Provider.Window()
provider.setup(function () {
if (provider.scope.SOME_GLOBAL == 'some_value') {
...
}
provider.runCode(text, callback)
...
provider.runScript(url, callback)
...
provider.cleanup()
})
DESCRIPTION
===========
`Scope.Provider.Window` is an implementation of the scope provider, which uses the popup browser window,
to create a new scope.
ISA
===
[Scope.Provider](../Provider.html)
DOES
====
[Scope.Provider.Role.WithDOM](Role/WithDOM.html)
GETTING HELP
============
This extension is supported via github issues tracker: <http://github.com/SamuraiJack/Scope-Provider/issues>
For general Joose questions you can also visit [#joose](http://webchat.freenode.net/?randomnick=1&channels=joose&prompt=1)
on irc.freenode.org or the forum at: <http://joose.it/forum>
SEE ALSO
========
Web page of this module: <http://github.com/SamuraiJack/Scope-Provider/>
General documentation for Joose: <http://openjsan.org/go/?l=Joose>
BUGS
====
All complex software has bugs lurking in it, and this module is no exception.
Please report any bugs through the web interface at <http://github.com/SamuraiJack/Scope-Provider/issues>
AUTHORS
=======
Nickolay Platonov <nplatonov@cpan.org>
COPYRIGHT AND LICENSE
=====================
This software is Copyright (c) 2010 by Nickolay Platonov <nplatonov@cpan.org>.
This is free software, licensed under:
The GNU Lesser General Public License, Version 3, June 2007
*/;
Class('Scope.Provider.NodeJS', {
isa : Scope.Provider,
have : {
runner : null
},
methods : {
setup : function (callback) {
var Script = process.binding('evals').Script
var runnerSource = function (code) {
return (function () { return eval(code) })()
}
var runner = this.runner = Script.runInNewContext('__RUNNER__ = ' + runnerSource.toString(), {})
var scope = this.scope = runner('this')
Joose.O.extend(scope, {
process : process,
require : require,
global : scope,
setTimeout : setTimeout,
clearTimeout : clearTimeout,
setInterval : setInterval,
clearInterval : clearInterval
})
callback(this)
},
runCode : function (text, callback) {
this.runner(text)
callback()
},
runScript : function (url, callback) {
var content = require('fs').readFileSync(url, 'utf8')
this.runCode(content, callback)
},
cleanup : function () {
}
}
})
/**
Name
====
Scope.Provider.NodeJS - scope provider, which uses the `Script.runInNewContext` call of the NodeJS.
SYNOPSIS
========
var provider = new Scope.Provider.NodeJS()
provider.setup(function () {
if (provider.scope.SOME_GLOBAL == 'some_value') {
...
}
provider.runCode(text, callback)
...
provider.runScript(url, callback)
...
provider.cleanup()
})
DESCRIPTION
===========
`Scope.Provider.NodeJS` is an implementation of the scope provider,
which uses the `Script.runInNewContext` call of the NodeJS platform.
ISA
===
[Scope.Provider](../Provider.html)
GETTING HELP
============
This extension is supported via github issues tracker: <http://github.com/SamuraiJack/Scope-Provider/issues>
For general Joose questions you can also visit [#joose](http://webchat.freenode.net/?randomnick=1&channels=joose&prompt=1)
on irc.freenode.org or the forum at: <http://joose.it/forum>
SEE ALSO
========
Web page of this module: <http://github.com/SamuraiJack/Scope-Provider/>
General documentation for Joose: <http://openjsan.org/go/?l=Joose>
BUGS
====
All complex software has bugs lurking in it, and this module is no exception.
Please report any bugs through the web interface at <http://github.com/SamuraiJack/Scope-Provider/issues>
AUTHORS
=======
Nickolay Platonov <nplatonov@cpan.org>
COPYRIGHT AND LICENSE
=====================
This software is Copyright (c) 2010 by Nickolay Platonov <nplatonov@cpan.org>.
This is free software, licensed under:
The GNU Lesser General Public License, Version 3, June 2007
*/;