gabrielg-xultestrunner 0.2.5 → 0.2.6
Sign up to get free protection for your applications and to get access to all the features.
- data/README +1 -1
- data/Rakefile +2 -0
- data/VERSION +1 -1
- data/xulapp/application.ini +2 -2
- data/xulapp/chrome/content/vendor/xpcomcore/README +31 -0
- data/xulapp/chrome/content/vendor/xpcomcore/Rakefile +7 -0
- data/xulapp/chrome/content/vendor/xpcomcore/bootstrap.js +108 -0
- data/xulapp/chrome/content/vendor/xpcomcore/lib/kernel.js +77 -0
- data/xulapp/chrome/content/vendor/xpcomcore/lib/loader.js +16 -0
- data/xulapp/chrome/content/vendor/xpcomcore/test/kernel_test.js +7 -0
- data/xultestrunner.gemspec +8 -2
- metadata +10 -3
data/README
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
XULTestRunner
|
2
2
|
=============
|
3
3
|
|
4
|
-
This is a XUL based test runner for running the quasi-scriptaculous-unittest.js-based tests that Conflagration and WaterTower use.
|
4
|
+
This is a XUL based test runner for running the quasi-scriptaculous-unittest.js-based tests that Conflagration and WaterTower and XPCOMCore use.
|
5
5
|
|
6
6
|
Yes, it is a XUL app in a RubyGem, yes I am in touch with this.
|
7
7
|
|
data/Rakefile
CHANGED
@@ -11,6 +11,8 @@ begin
|
|
11
11
|
s.homepage = "http://github.com/gabrielg/xultestrunner"
|
12
12
|
s.description = "XUL based test runner for running your JS unit tests."
|
13
13
|
s.authors = ["Gabriel Gironda"]
|
14
|
+
# FIXME - weird hack around jeweler ignoring the submoduled in xpcomcore.
|
15
|
+
s.files = (s.files + FileList["xulapp/chrome/content/vendor/**/*"]).uniq
|
14
16
|
end
|
15
17
|
|
16
18
|
application_ini_path = (Pathname(__FILE__).parent + "xulapp/application.ini").expand_path
|
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
0.2.
|
1
|
+
0.2.6
|
data/xulapp/application.ini
CHANGED
@@ -0,0 +1,31 @@
|
|
1
|
+
XPCOMCore
|
2
|
+
=========
|
3
|
+
|
4
|
+
A standard library like Ruby's, only for JavaScript (with XPCOM access).
|
5
|
+
|
6
|
+
Installation
|
7
|
+
============
|
8
|
+
|
9
|
+
Check out / submodule in / whatever the code to a place of your choosing. Then load it from an XPCOM component like so:
|
10
|
+
|
11
|
+
COMPONENTS = [];
|
12
|
+
var loader = Components.classes["@mozilla.org/moz/jssubscript-loader;1"].getService(Components.interfaces.mozIJSSubScriptLoader);
|
13
|
+
// We use the /app resource here because of yet another weird firefox issue where the /xultestrunner resource
|
14
|
+
// isn't working as the XPCOM component gets registered.
|
15
|
+
loader.loadSubScript("resource://app/chrome/content/vendor/xpcomcore/bootstrap.js");
|
16
|
+
loader.loadSubScript("resource://xpcomcore/loader.js");
|
17
|
+
|
18
|
+
Make sure that if you're registering your own component, you add it to the COMPONENTS array and build NSGetModule that way, kind of like so:
|
19
|
+
|
20
|
+
COMPONENTS.push(MYXPCOMComponent);
|
21
|
+
NSGetModule = function(compMgr, fileSpec) {
|
22
|
+
return XPCOMUtils.generateModule(COMPONENTS);
|
23
|
+
};
|
24
|
+
|
25
|
+
Then, whenever you want to make use of XPCOMCore (say, from a XUL window), load the resource in like so:
|
26
|
+
|
27
|
+
<script type="text/javascript" src="resource://xpcomcore/loader.js" />
|
28
|
+
|
29
|
+
Then you'll have access to methods such as load() and require() and whatever else is defined in Kernel.
|
30
|
+
|
31
|
+
- Gabriel Gironda
|
@@ -0,0 +1,108 @@
|
|
1
|
+
(function(backStage) {
|
2
|
+
if (typeof(COMPONENTS) == 'undefined') {
|
3
|
+
throw("Please define a COMPONENTS array before loading XPCOMCore.");
|
4
|
+
};
|
5
|
+
|
6
|
+
var requiredMinGeckoVersion = '1.9.0'; // RequiredMinGeckoVersion - Do not remove this comment.
|
7
|
+
var xpcomCoreVersion = '0.1.0'; // XPCOMCoreVersion - Do not remove this comment.
|
8
|
+
|
9
|
+
var checkGeckoVersion = function() {
|
10
|
+
var versionComparator = Components.classes["@mozilla.org/xpcom/version-comparator;1"].getService(Components.interfaces.nsIVersionComparator);
|
11
|
+
var appInfo = Components.classes["@mozilla.org/xre/app-info;1"].getService(Components.interfaces.nsIXULAppInfo);
|
12
|
+
if (versionComparator.compare(appInfo.platformVersion, requiredMinGeckoVersion) < 0) {
|
13
|
+
throw("Gecko version '" + appInfo.platformVersion + "' is unable to use XPCOMCore.");
|
14
|
+
}
|
15
|
+
};
|
16
|
+
|
17
|
+
var setupXPCOMCore = function() {
|
18
|
+
Components.utils.import("resource://gre/modules/XPCOMUtils.jsm");
|
19
|
+
|
20
|
+
var ioService = Components.classes["@mozilla.org/network/io-service;1"].getService(Components.interfaces.nsIIOService);
|
21
|
+
var resProt = ioService.getProtocolHandler("resource").QueryInterface(Components.interfaces.nsIResProtocolHandler);
|
22
|
+
// FIXME IN GENERAL - refactor all this shit code
|
23
|
+
|
24
|
+
var ourFileURIString = function() {
|
25
|
+
// FIXME - Great. All this is a dance around the fact line #289 of mozJSSubScriptLoader.cpp in mozilla 1.9.1
|
26
|
+
// thinks that the best way to delimit script files is with a fucking ASCII arrow YOU FUCKS
|
27
|
+
var thisFile = (new Error).stack.split("\n")[2].split("@")[1].split(" -> ").slice(-1)[0].split(/:[0-9]/)[0];
|
28
|
+
return thisFile;
|
29
|
+
};
|
30
|
+
|
31
|
+
var ourFileURI = function() {
|
32
|
+
return ioService.newURI(ourFileURIString(), null, null).QueryInterface(Components.interfaces.nsIURL);
|
33
|
+
};
|
34
|
+
|
35
|
+
// FIXME - hilariously non-cross-platform
|
36
|
+
var ourLibDir = function() {
|
37
|
+
var fileURI = ourFileURI();
|
38
|
+
if (fileURI.scheme == "resource") {
|
39
|
+
var thisDir = ioService.newURI(resProt.resolveURI(fileURI), null, null).QueryInterface(Components.interfaces.nsIURL).directory;
|
40
|
+
} else {
|
41
|
+
// Assumes we're a file:// URI
|
42
|
+
var thisDir = fileURI.directory;
|
43
|
+
}
|
44
|
+
return thisDir + "lib/";
|
45
|
+
};
|
46
|
+
|
47
|
+
// FIXME - hilariously non-cross-platform
|
48
|
+
var setupResourceSubstition = function() {
|
49
|
+
resProt.setSubstitution("xpcomcore", ioService.newURI("file://" + ourLibDir(), null, null));
|
50
|
+
};
|
51
|
+
|
52
|
+
setupResourceSubstition();
|
53
|
+
var libDirectory = ourLibDir();
|
54
|
+
|
55
|
+
// Private XPCOMCoreMCP method. This is the jank that finally sets up our resouce substition
|
56
|
+
// and loads Kernel methods into the given scope and .
|
57
|
+
var loadKernel = function(scope) {
|
58
|
+
|
59
|
+
// Copy properties from Kernel to the scope as getters as part of the kernel loading
|
60
|
+
// TODO - skip non-function properties
|
61
|
+
for (p in scope.Kernel) {
|
62
|
+
scope.__defineGetter__(p, function() { return scope.Kernel[p] });
|
63
|
+
}
|
64
|
+
};
|
65
|
+
|
66
|
+
// XPCOMCoreMCP is a singleton
|
67
|
+
var xpcomCoreInstance = null;
|
68
|
+
var XPCOMCoreMCP = function() {
|
69
|
+
if (xpcomCoreInstance) { return xpcomCoreInstance; }
|
70
|
+
xpcomCoreInstance = this.wrappedJSObject = this;
|
71
|
+
|
72
|
+
};
|
73
|
+
|
74
|
+
XPCOMCoreMCP.prototype = {
|
75
|
+
classDescription: "XPCOMCore Core Object",
|
76
|
+
contractID: "@conflagrationjs.org/xpcomcore/core;1",
|
77
|
+
classID: Components.ID("{f562f600-9c25-11de-8a39-0800200c9a66}"),
|
78
|
+
QueryInterface: XPCOMUtils.generateQI(),
|
79
|
+
_xpcom_categories: [{category: "JavaScript global property", entry: "XPCOMCoreMCP"}],
|
80
|
+
|
81
|
+
get version() { return new String(xpcomCoreVersion); },
|
82
|
+
get libRoot() { return new String(libDirectory); },
|
83
|
+
|
84
|
+
loadInto: function(loadScope) {
|
85
|
+
if (!loadScope || loadScope.XPCOMCoreLoaded) {
|
86
|
+
return false;
|
87
|
+
} else {
|
88
|
+
loadKernel(loadScope);
|
89
|
+
loadScope.XPCOMCoreLoaded = true;
|
90
|
+
return true;
|
91
|
+
}
|
92
|
+
}
|
93
|
+
};
|
94
|
+
|
95
|
+
backStage.XPCOMCoreMCP = XPCOMCoreMCP;
|
96
|
+
// Make sure we actually register the component or everything blows up
|
97
|
+
COMPONENTS.push(XPCOMCoreMCP);
|
98
|
+
|
99
|
+
};
|
100
|
+
|
101
|
+
try {
|
102
|
+
checkGeckoVersion();
|
103
|
+
setupXPCOMCore();
|
104
|
+
} catch (e) {
|
105
|
+
dump("Couldn't register XPCOMCore: " + e + "\n");
|
106
|
+
}
|
107
|
+
|
108
|
+
})(this);
|
@@ -0,0 +1,77 @@
|
|
1
|
+
// Convenience shortcuts
|
2
|
+
const Cc = Components.classes;
|
3
|
+
const Ci = Components.interfaces;
|
4
|
+
const Cr = Components.results;
|
5
|
+
const Cu = Components.utils;
|
6
|
+
|
7
|
+
// Taking some inspiration from Ruby here...
|
8
|
+
const $LOAD_PATH = [XPCOMCore.libRoot];
|
9
|
+
const $LOADED_FEATURES = ["kernel.js"];
|
10
|
+
|
11
|
+
const $FILE = function() {
|
12
|
+
var ioService = Cc["@mozilla.org/network/io-service;1"].getService(Ci.nsIIOService);
|
13
|
+
var thisFile = (new Error).stack.split("\n")[2].split("@")[1].split(" -> ").slice(-1)[0].split(/:[0-9]/)[0];
|
14
|
+
var thisFileURI = ioService.newURI(thisFile, null, null);
|
15
|
+
|
16
|
+
if (thisFileURI.scheme == "resource") {
|
17
|
+
var resProt = ioService.getProtocolHandler("resource").QueryInterface(Components.interfaces.nsIResProtocolHandler);
|
18
|
+
return ioService.newURI(resProt.resolveURI(thisFileURI), null, null).QueryInterface(Ci.nsIURL).path;
|
19
|
+
} else if (thisFileURI.scheme == "file") {
|
20
|
+
return thisFileURI.QueryInterface(Ci.nsIURL).path;
|
21
|
+
} else {
|
22
|
+
// FIXME - throw an appropriate exception here.
|
23
|
+
return null;
|
24
|
+
}
|
25
|
+
}
|
26
|
+
|
27
|
+
// FIXME - better exceptions.
|
28
|
+
const LoadError = {name: "LoadError", message: "Could not load file"};
|
29
|
+
|
30
|
+
const Kernel = {
|
31
|
+
|
32
|
+
print: function(str) {
|
33
|
+
dump(str);
|
34
|
+
},
|
35
|
+
|
36
|
+
puts: function(str) {
|
37
|
+
print(str + "\n");
|
38
|
+
},
|
39
|
+
|
40
|
+
load: function(featurePath) {
|
41
|
+
var loader = Cc["@mozilla.org/moz/jssubscript-loader;1"].getService(Ci.mozIJSSubScriptLoader);
|
42
|
+
var foundFile = null;
|
43
|
+
// FIXME - so this is kinda shitty. We have an empty entry here so we default to just trying to load
|
44
|
+
// from an absolute path
|
45
|
+
var loadPath = $LOAD_PATH.concat([""]);
|
46
|
+
var loadPathLength = loadPath.length;
|
47
|
+
// FIXME - mozilla bug here. if i use foreach on array it ignores the granted security privileges
|
48
|
+
for (var i = 0; i < loadPathLength; i++) {
|
49
|
+
var potentialFile = Cc["@mozilla.org/file/local;1"].createInstance(Ci.nsILocalFile);
|
50
|
+
potentialFile.initWithPath(loadPath[i] + "/" + featurePath);
|
51
|
+
if (potentialFile.exists()) {
|
52
|
+
foundFile = potentialFile;
|
53
|
+
break;
|
54
|
+
}
|
55
|
+
};
|
56
|
+
if (foundFile) {
|
57
|
+
foundFile.normalize();
|
58
|
+
loader.loadSubScript("file://" + encodeURI(foundFile.path));
|
59
|
+
$LOADED_FEATURES.push(featurePath)
|
60
|
+
} else {
|
61
|
+
throw(LoadError);
|
62
|
+
}
|
63
|
+
},
|
64
|
+
|
65
|
+
require: function(feature) {
|
66
|
+
var jsFeature = feature + ".js";
|
67
|
+
if ($LOADED_FEATURES.indexOf(jsFeature) == -1) {
|
68
|
+
load(jsFeature);
|
69
|
+
return true;
|
70
|
+
} else {
|
71
|
+
return false;
|
72
|
+
}
|
73
|
+
}
|
74
|
+
}
|
75
|
+
|
76
|
+
// FIXME - i just puked in my mouth a little.
|
77
|
+
for (p in Kernel) { eval('var ' + p + ' = Kernel[p];'); }
|
@@ -0,0 +1,16 @@
|
|
1
|
+
// FIXME - If we're still backstage, load differently. Need a better way to check for being backstage.
|
2
|
+
// FIXME - wow, this is all so seedy.
|
3
|
+
var _coreObj = null;
|
4
|
+
if (this.toString() == "[object BackstagePass]" && typeof(XPCOMCore) == 'undefined') {
|
5
|
+
_coreObj = new this.XPCOMCoreMCP();
|
6
|
+
} else if (this.XPCOMCoreMCP && typeof(XPCOMCore) == 'undefined') {
|
7
|
+
var privileges = 'UniversalXPConnect UniversalBrowserRead UniversalBrowserWrite ' +
|
8
|
+
'UniversalPreferencesRead UniversalPreferencesWrite CapabilityPreferencesAccess UniversalFileRead';
|
9
|
+
netscape.security.PrivilegeManager.enablePrivilege(privileges);
|
10
|
+
_coreObj = this.XPCOMCoreMCP.wrappedJSObject;
|
11
|
+
};
|
12
|
+
|
13
|
+
const XPCOMCore = _coreObj;
|
14
|
+
|
15
|
+
var loader = Components.classes["@mozilla.org/moz/jssubscript-loader;1"].getService(Components.interfaces.mozIJSSubScriptLoader);
|
16
|
+
loader.loadSubScript("resource://xpcomcore/kernel.js");
|
data/xultestrunner.gemspec
CHANGED
@@ -5,11 +5,11 @@
|
|
5
5
|
|
6
6
|
Gem::Specification.new do |s|
|
7
7
|
s.name = %q{xultestrunner}
|
8
|
-
s.version = "0.2.
|
8
|
+
s.version = "0.2.6"
|
9
9
|
|
10
10
|
s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
|
11
11
|
s.authors = ["Gabriel Gironda"]
|
12
|
-
s.date = %q{2009-09-
|
12
|
+
s.date = %q{2009-09-10}
|
13
13
|
s.default_executable = %q{xultest}
|
14
14
|
s.description = %q{XUL based test runner for running your JS unit tests.}
|
15
15
|
s.email = %q{contact@gironda.org}
|
@@ -38,6 +38,12 @@ Gem::Specification.new do |s|
|
|
38
38
|
"xulapp/chrome/content/vendor/scriptaculous/LICENSE",
|
39
39
|
"xulapp/chrome/content/vendor/scriptaculous/test.css",
|
40
40
|
"xulapp/chrome/content/vendor/scriptaculous/unittest.js",
|
41
|
+
"xulapp/chrome/content/vendor/xpcomcore/README",
|
42
|
+
"xulapp/chrome/content/vendor/xpcomcore/Rakefile",
|
43
|
+
"xulapp/chrome/content/vendor/xpcomcore/bootstrap.js",
|
44
|
+
"xulapp/chrome/content/vendor/xpcomcore/lib/kernel.js",
|
45
|
+
"xulapp/chrome/content/vendor/xpcomcore/lib/loader.js",
|
46
|
+
"xulapp/chrome/content/vendor/xpcomcore/test/kernel_test.js",
|
41
47
|
"xulapp/components/bootstrap.js",
|
42
48
|
"xulapp/defaults/preferences/prefs.js",
|
43
49
|
"xultestrunner.gemspec"
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: gabrielg-xultestrunner
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.2.
|
4
|
+
version: 0.2.6
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Gabriel Gironda
|
@@ -9,7 +9,7 @@ autorequire:
|
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
11
|
|
12
|
-
date: 2009-09-
|
12
|
+
date: 2009-09-10 00:00:00 -07:00
|
13
13
|
default_executable: xultest
|
14
14
|
dependencies: []
|
15
15
|
|
@@ -42,11 +42,18 @@ files:
|
|
42
42
|
- xulapp/chrome/content/vendor/scriptaculous/LICENSE
|
43
43
|
- xulapp/chrome/content/vendor/scriptaculous/test.css
|
44
44
|
- xulapp/chrome/content/vendor/scriptaculous/unittest.js
|
45
|
+
- xulapp/chrome/content/vendor/xpcomcore/README
|
46
|
+
- xulapp/chrome/content/vendor/xpcomcore/Rakefile
|
47
|
+
- xulapp/chrome/content/vendor/xpcomcore/bootstrap.js
|
48
|
+
- xulapp/chrome/content/vendor/xpcomcore/lib/kernel.js
|
49
|
+
- xulapp/chrome/content/vendor/xpcomcore/lib/loader.js
|
50
|
+
- xulapp/chrome/content/vendor/xpcomcore/test/kernel_test.js
|
45
51
|
- xulapp/components/bootstrap.js
|
46
52
|
- xulapp/defaults/preferences/prefs.js
|
47
53
|
- xultestrunner.gemspec
|
48
54
|
has_rdoc: false
|
49
55
|
homepage: http://github.com/gabrielg/xultestrunner
|
56
|
+
licenses:
|
50
57
|
post_install_message:
|
51
58
|
rdoc_options:
|
52
59
|
- --charset=UTF-8
|
@@ -67,7 +74,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
67
74
|
requirements: []
|
68
75
|
|
69
76
|
rubyforge_project:
|
70
|
-
rubygems_version: 1.
|
77
|
+
rubygems_version: 1.3.5
|
71
78
|
signing_key:
|
72
79
|
specification_version: 3
|
73
80
|
summary: XUL based test runner for running your JS unit tests.
|