envjs 0.3.7 → 0.3.8
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/CHANGELOG.rdoc +13 -0
- data/Manifest.txt +1 -0
- data/lib/envjs.rb +1 -1
- data/lib/envjs/env.js +21 -470
- data/lib/envjs/static.js +505 -9
- data/src/css/properties.js +3 -3
- data/src/dom/document.js +474 -4
- data/src/dom/implementation.js +1 -463
- data/src/html/cookie.js +3 -1
- data/src/html/element.js +2 -0
- data/src/html/form.js +1 -1
- data/src/platform/johnson.js +1 -1
- data/src/window/event.js +5 -1
- data/src/window/location.js +5 -4
- data/src/window/xhr.js +9 -1
- data/src/xpath/implementation.js +22 -0
- data/test/primary-tests.js +1 -0
- data/test/unit/form.js +40 -0
- metadata +5 -4
data/src/html/cookie.js
CHANGED
@@ -82,10 +82,12 @@ get cookie(c){
|
|
82
82
|
//case we must check our current location.protocol to make sure it's
|
83
83
|
//https:
|
84
84
|
var allcookies = [], i;
|
85
|
-
|
85
|
+
return cookieString.call(this, $cookies.temporary) +
|
86
|
+
cookieString.call(this, $cookies.persistent);
|
86
87
|
}});
|
87
88
|
|
88
89
|
var cookieString = function(cookies) {
|
90
|
+
var $w = this._parentWindow;
|
89
91
|
var cookieString = "";
|
90
92
|
for (var i in cookies) {
|
91
93
|
// check if the cookie is in the current domain (if domain is set)
|
data/src/html/element.js
CHANGED
@@ -109,6 +109,7 @@ __extend__(HTMLElement.prototype, {
|
|
109
109
|
},
|
110
110
|
offsetLeft: 0,
|
111
111
|
offsetRight: 0,
|
112
|
+
offsetTop: 0,
|
112
113
|
get offsetParent(){
|
113
114
|
/* TODO */
|
114
115
|
return;
|
@@ -117,6 +118,7 @@ __extend__(HTMLElement.prototype, {
|
|
117
118
|
/* TODO */
|
118
119
|
return;
|
119
120
|
},
|
121
|
+
scrollTop: 0,
|
120
122
|
scrollHeight: 0,
|
121
123
|
scrollWidth: 0,
|
122
124
|
scrollLeft: 0,
|
data/src/html/form.js
CHANGED
@@ -456,7 +456,7 @@ var __param__= function( array, boundary ) {
|
|
456
456
|
array[i].value.push(content);
|
457
457
|
array[i].value = array[i].value.join("\r\n");
|
458
458
|
}
|
459
|
-
serialized.push('Content-Disposition: form-data; name="'+array[i].name+'"'+fn+'\r\n');
|
459
|
+
serialized.push('Content-Disposition: form-data; name="'+array[i].name+'"'+fn+'\r\n\r\n');
|
460
460
|
serialized.push(array[i].value);
|
461
461
|
serialized.push( "\r\n" );
|
462
462
|
}
|
data/src/platform/johnson.js
CHANGED
data/src/window/event.js
CHANGED
@@ -34,6 +34,9 @@ function __removeEventListener__(target, type, fn){
|
|
34
34
|
target.uuid = $events.length;
|
35
35
|
$events[target.uuid] = {};
|
36
36
|
}
|
37
|
+
if (!$events[target.uiid]) {
|
38
|
+
return;
|
39
|
+
}
|
37
40
|
if ( !$events[target.uuid][type] ){
|
38
41
|
$events[target.uuid][type] = [];
|
39
42
|
}
|
@@ -98,7 +101,8 @@ function __dispatchEvent__(target, event, bubbles){
|
|
98
101
|
var skip = false;
|
99
102
|
|
100
103
|
if (url[0] === "#") {
|
101
|
-
|
104
|
+
window.location.hash = url;
|
105
|
+
// print("return anchor only: "+window.location);
|
102
106
|
skip = true;
|
103
107
|
}
|
104
108
|
|
data/src/window/location.js
CHANGED
@@ -10,11 +10,12 @@ $env.__url = function(url){
|
|
10
10
|
};
|
11
11
|
|
12
12
|
$w.__defineSetter__("location", function(url){
|
13
|
-
if (
|
14
|
-
|
15
|
-
// print("return anchor only");
|
13
|
+
if (url[0] === "#") {
|
14
|
+
window.location.hash = url;
|
15
|
+
// print("return anchor only: "+window.location.href);
|
16
16
|
return;
|
17
|
-
|
17
|
+
}
|
18
|
+
if (false) {
|
18
19
|
var now = window.location.href.replace(/^file:\/\//,"").replace(/#.*/,"");
|
19
20
|
var to = $master.first_script_window && $master.first_script_window.location.href;
|
20
21
|
// var to = $env.location(url,window.location.href != "about:blank" ? window.location.href: undefined);
|
data/src/window/xhr.js
CHANGED
@@ -41,12 +41,20 @@ XMLHttpRequest.prototype = {
|
|
41
41
|
}else{
|
42
42
|
try {
|
43
43
|
$debug("parsing response text into xml document");
|
44
|
-
responseXML = $domparser.parseFromString(_this.responseText+"");
|
44
|
+
/* responseXML = $domparser.parseFromString(_this.responseText+""); */
|
45
|
+
responseXML =
|
46
|
+
document.implementation.createDocument().
|
47
|
+
loadXML(_this.responseText+"");
|
45
48
|
return responseXML;
|
46
49
|
} catch(e) {
|
47
50
|
$error('response XML does not apear to be well formed xml', e);
|
51
|
+
/*
|
48
52
|
responseXML = $domparser.parseFromString("<html>"+
|
49
53
|
"<head/><body><p> parse error </p></body></html>");
|
54
|
+
*/
|
55
|
+
responseXML =
|
56
|
+
document.implementation.createDocument().
|
57
|
+
loadXML("<html><head/><body><p> parse error </p></body></html>");
|
50
58
|
return responseXML;
|
51
59
|
}
|
52
60
|
}
|
data/src/xpath/implementation.js
CHANGED
@@ -671,6 +671,7 @@ function TokenExpr(m) {
|
|
671
671
|
}
|
672
672
|
|
673
673
|
TokenExpr.prototype.evaluate = function() {
|
674
|
+
// print("0 "+arguments.callee+" "+this.value);
|
674
675
|
return new StringValue(this.value);
|
675
676
|
};
|
676
677
|
|
@@ -961,12 +962,14 @@ function NodeTestAny() {
|
|
961
962
|
}
|
962
963
|
|
963
964
|
NodeTestAny.prototype.evaluate = function(ctx) {
|
965
|
+
// print("0 "+arguments.callee);
|
964
966
|
return this.value;
|
965
967
|
};
|
966
968
|
|
967
969
|
function NodeTestElementOrAttribute() {}
|
968
970
|
|
969
971
|
NodeTestElementOrAttribute.prototype.evaluate = function(ctx) {
|
972
|
+
// print("0 "+arguments.callee);
|
970
973
|
return new BooleanValue(
|
971
974
|
ctx.node.nodeType == DOMNode.ELEMENT_NODE ||
|
972
975
|
ctx.node.nodeType == DOMNode.ATTRIBUTE_NODE);
|
@@ -975,12 +978,14 @@ NodeTestElementOrAttribute.prototype.evaluate = function(ctx) {
|
|
975
978
|
function NodeTestText() {}
|
976
979
|
|
977
980
|
NodeTestText.prototype.evaluate = function(ctx) {
|
981
|
+
// print("0 "+arguments.callee);
|
978
982
|
return new BooleanValue(ctx.node.nodeType == DOMNode.TEXT_NODE);
|
979
983
|
}
|
980
984
|
|
981
985
|
function NodeTestComment() {}
|
982
986
|
|
983
987
|
NodeTestComment.prototype.evaluate = function(ctx) {
|
988
|
+
// print("0 "+arguments.callee);
|
984
989
|
return new BooleanValue(ctx.node.nodeType == DOMNode.COMMENT_NODE);
|
985
990
|
}
|
986
991
|
|
@@ -989,6 +994,7 @@ function NodeTestPI(target) {
|
|
989
994
|
}
|
990
995
|
|
991
996
|
NodeTestPI.prototype.evaluate = function(ctx) {
|
997
|
+
// print("0 "+arguments.callee);
|
992
998
|
return new
|
993
999
|
BooleanValue(ctx.node.nodeType == DOMNode.PROCESSING_INSTRUCTION_NODE &&
|
994
1000
|
(!this.target || ctx.node.nodeName == this.target));
|
@@ -1000,6 +1006,7 @@ function NodeTestNC(nsprefix) {
|
|
1000
1006
|
}
|
1001
1007
|
|
1002
1008
|
NodeTestNC.prototype.evaluate = function(ctx) {
|
1009
|
+
// print("0 "+arguments.callee);
|
1003
1010
|
var n = ctx.node;
|
1004
1011
|
return new BooleanValue(this.regex.match(n.nodeName));
|
1005
1012
|
}
|
@@ -1010,6 +1017,7 @@ function NodeTestName(name) {
|
|
1010
1017
|
}
|
1011
1018
|
|
1012
1019
|
NodeTestName.prototype.evaluate = function(ctx) {
|
1020
|
+
// print("0 !!! "+arguments.callee);
|
1013
1021
|
var n = ctx.node;
|
1014
1022
|
if (ctx.caseInsensitive || n instanceof HTMLElement) {
|
1015
1023
|
if (n.nodeName.length != this.name.length) return new BooleanValue(false);
|
@@ -1024,6 +1032,7 @@ function PredicateExpr(expr) {
|
|
1024
1032
|
}
|
1025
1033
|
|
1026
1034
|
PredicateExpr.prototype.evaluate = function(ctx) {
|
1035
|
+
// print("0 "+arguments.callee);
|
1027
1036
|
var v = this.expr.evaluate(ctx);
|
1028
1037
|
if (v.type == 'number') {
|
1029
1038
|
// NOTE(mesch): Internally, position is represented starting with
|
@@ -1045,9 +1054,11 @@ FunctionCallExpr.prototype.appendArg = function(arg) {
|
|
1045
1054
|
};
|
1046
1055
|
|
1047
1056
|
FunctionCallExpr.prototype.evaluate = function(ctx) {
|
1057
|
+
// print("0 "+arguments.callee+" "+this.name.value);
|
1048
1058
|
var fn = '' + this.name.value;
|
1049
1059
|
var f = this.xpathfunctions[fn];
|
1050
1060
|
if (f) {
|
1061
|
+
// print("1 "+f);
|
1051
1062
|
return f.call(this, ctx);
|
1052
1063
|
} else {
|
1053
1064
|
xpathLog('XPath NO SUCH FUNCTION ' + fn);
|
@@ -1121,6 +1132,9 @@ FunctionCallExpr.prototype.xpathfunctions = {
|
|
1121
1132
|
if (n.length == 0) {
|
1122
1133
|
return new StringValue('');
|
1123
1134
|
} else {
|
1135
|
+
if (ctx.caseInsensitive || n[0] instanceof HTMLElement) {
|
1136
|
+
return new StringValue(n[0].nodeName.toLowerCase());
|
1137
|
+
}
|
1124
1138
|
return new StringValue(n[0].nodeName);
|
1125
1139
|
}
|
1126
1140
|
},
|
@@ -1398,6 +1412,7 @@ function UnionExpr(expr1, expr2) {
|
|
1398
1412
|
}
|
1399
1413
|
|
1400
1414
|
UnionExpr.prototype.evaluate = function(ctx) {
|
1415
|
+
// print("0 "+arguments.callee);
|
1401
1416
|
var nodes1 = this.expr1.evaluate(ctx).nodeSetValue();
|
1402
1417
|
var nodes2 = this.expr2.evaluate(ctx).nodeSetValue();
|
1403
1418
|
var I1 = nodes1.length;
|
@@ -1423,6 +1438,7 @@ function PathExpr(filter, rel) {
|
|
1423
1438
|
}
|
1424
1439
|
|
1425
1440
|
PathExpr.prototype.evaluate = function(ctx) {
|
1441
|
+
// print("0 "+arguments.callee);
|
1426
1442
|
var nodes = this.filter.evaluate(ctx).nodeSetValue();
|
1427
1443
|
var nodes1 = [];
|
1428
1444
|
if (ctx.returnOnFirstMatch) {
|
@@ -1451,6 +1467,7 @@ function FilterExpr(expr, predicate) {
|
|
1451
1467
|
}
|
1452
1468
|
|
1453
1469
|
FilterExpr.prototype.evaluate = function(ctx) {
|
1470
|
+
// print("0 "+arguments.callee);
|
1454
1471
|
// the filter expression should be evaluated in its entirety with no
|
1455
1472
|
// optimization, as we can't backtrack to it after having moved on to
|
1456
1473
|
// evaluating the relative location path. See the testReturnOnFirstMatch
|
@@ -1479,6 +1496,7 @@ function UnaryMinusExpr(expr) {
|
|
1479
1496
|
}
|
1480
1497
|
|
1481
1498
|
UnaryMinusExpr.prototype.evaluate = function(ctx) {
|
1499
|
+
// print("0 "+arguments.callee);
|
1482
1500
|
return new NumberValue(-this.expr.evaluate(ctx).numberValue());
|
1483
1501
|
};
|
1484
1502
|
|
@@ -1489,6 +1507,7 @@ function BinaryExpr(expr1, op, expr2) {
|
|
1489
1507
|
}
|
1490
1508
|
|
1491
1509
|
BinaryExpr.prototype.evaluate = function(ctx) {
|
1510
|
+
// print("0 "+arguments.callee);
|
1492
1511
|
var ret;
|
1493
1512
|
switch (this.op.value) {
|
1494
1513
|
case 'or':
|
@@ -1653,6 +1672,7 @@ function LiteralExpr(value) {
|
|
1653
1672
|
}
|
1654
1673
|
|
1655
1674
|
LiteralExpr.prototype.evaluate = function(ctx) {
|
1675
|
+
// print("0 "+arguments.callee+" "+this.value);
|
1656
1676
|
return new StringValue(this.value);
|
1657
1677
|
};
|
1658
1678
|
|
@@ -1661,6 +1681,7 @@ function NumberExpr(value) {
|
|
1661
1681
|
}
|
1662
1682
|
|
1663
1683
|
NumberExpr.prototype.evaluate = function(ctx) {
|
1684
|
+
// print("0 "+arguments.callee);
|
1664
1685
|
return new NumberValue(this.value);
|
1665
1686
|
};
|
1666
1687
|
|
@@ -1669,6 +1690,7 @@ function VariableExpr(name) {
|
|
1669
1690
|
}
|
1670
1691
|
|
1671
1692
|
VariableExpr.prototype.evaluate = function(ctx) {
|
1693
|
+
// print("0 "+arguments.callee);
|
1672
1694
|
return ctx.getVariable(this.name);
|
1673
1695
|
}
|
1674
1696
|
|
data/test/primary-tests.js
CHANGED
data/test/unit/form.js
ADDED
@@ -0,0 +1,40 @@
|
|
1
|
+
module("form");
|
2
|
+
|
3
|
+
test("__param__ without a boundary should do query string style uri encoding", function() {
|
4
|
+
serialized_params = $master.static.__param__([{ name: 'username', value: 'jresig' }, { name: 'password', value: 'letmein' }]);
|
5
|
+
ok((serialized_params == 'username=jresig&password=letmein'), 'params should be key=value and joined by &');
|
6
|
+
});
|
7
|
+
|
8
|
+
test("__param__ without a boundary should escape spaces in values as + not %20", function() {
|
9
|
+
serialized_params = $master.static.__param__([{ name: 'username', value: 'jresig' }, { name: 'password', value: 'let me in' }]);
|
10
|
+
ok((serialized_params == 'username=jresig&password=let+me+in'), 'params should have spaces escaped as + not %20');
|
11
|
+
});
|
12
|
+
|
13
|
+
test("__param__ with a boundary should start with a -- then the boundary and a \\r\\n newline", function() {
|
14
|
+
serialized_params = $master.static.__param__([{ name: 'username', value: 'jresig' }, { name: 'password', value: 'letmein' }], '--aboundary');
|
15
|
+
ok(serialized_params.match(/^----aboundary\r\n/), 'params should start with a -- then the boundary and \\r\\n');
|
16
|
+
});
|
17
|
+
|
18
|
+
test("__param__ with a boundary should end with the boundary then -- and a \\r\\n newline", function() {
|
19
|
+
serialized_params = $master.static.__param__([{ name: 'username', value: 'jresig' }, { name: 'password', value: 'letmein' }], '--aboundary');
|
20
|
+
ok(serialized_params.match(/--aboundary--\r\n$/), 'params should end with the boundary then -- and \\r\\n');
|
21
|
+
});
|
22
|
+
|
23
|
+
test("__param__ with a boundary should render each key and value with a header, two \\r\\n newlines and the value", function() {
|
24
|
+
serialized_params = $master.static.__param__([{ name: 'username', value: 'jresig' }, { name: 'password', value: 'letmein' }], '--aboundary');
|
25
|
+
ok(serialized_params.match(/Content-Disposition: form-data; name="username"\r\n\r\njresig\r\n/), 'username not properly encoded');
|
26
|
+
ok(serialized_params.match(/Content-Disposition: form-data; name="password"\r\n\r\nletmein\r\n/), 'password not properly encoded');
|
27
|
+
});
|
28
|
+
|
29
|
+
test("__param__ with a boundary should separate each key-value with --, the boundary and a \\r\\n newline", function() {
|
30
|
+
serialized_params = $master.static.__param__([{ name: 'username', value: 'jresig' }, { name: 'password', value: 'letmein' }], '--aboundary');
|
31
|
+
ok(serialized_params.match(/jresig\r\n----aboundary\r\nContent-Disposition: form-data; name="password"/), 'username and password not properly separated');
|
32
|
+
});
|
33
|
+
|
34
|
+
test("__param__ with a boundary should not render spaces in data as + or %20", function() {
|
35
|
+
serialized_params = $master.static.__param__([{ name: 'username', value: 'jresig' }, { name: 'password', value: 'let me in' }], '--aboundary');
|
36
|
+
ok(!serialized_params.match(/let+me+in/), 'spaces incorrectly encoded as +');
|
37
|
+
ok(!serialized_params.match(/let%20me%20in/), 'spaces incorrectly encoded as %20');
|
38
|
+
ok(serialized_params.match(/let me in/), 'spaces not left as spaces');
|
39
|
+
});
|
40
|
+
|
metadata
CHANGED
@@ -1,13 +1,13 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: envjs
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
hash:
|
4
|
+
hash: 3
|
5
5
|
prerelease: false
|
6
6
|
segments:
|
7
7
|
- 0
|
8
8
|
- 3
|
9
|
-
-
|
10
|
-
version: 0.3.
|
9
|
+
- 8
|
10
|
+
version: 0.3.8
|
11
11
|
platform: ruby
|
12
12
|
authors:
|
13
13
|
- John Resig
|
@@ -17,7 +17,7 @@ autorequire:
|
|
17
17
|
bindir: bin
|
18
18
|
cert_chain: []
|
19
19
|
|
20
|
-
date: 2010-
|
20
|
+
date: 2010-09-14 00:00:00 -07:00
|
21
21
|
default_executable:
|
22
22
|
dependencies:
|
23
23
|
- !ruby/object:Gem::Dependency
|
@@ -357,6 +357,7 @@ files:
|
|
357
357
|
- test/unit/elementmembers.js
|
358
358
|
- test/unit/events.js
|
359
359
|
- test/unit/fixtures/external_script.js
|
360
|
+
- test/unit/form.js
|
360
361
|
- test/unit/iframe.js
|
361
362
|
- test/unit/insertion.js
|
362
363
|
- test/unit/multi-window.js
|