envjs 0.1.0
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/README +113 -0
- data/bin/envjsrb +239 -0
- data/bin/jquery-1.2.6-test.js +33 -0
- data/bin/jquery-1.3.1-test.js +33 -0
- data/bin/jquery-1.3.2-test.js +106 -0
- data/bin/prototype-1.6.0.3-test.js +82 -0
- data/bin/prototype_1.6.0.3_tmpl.txt +27 -0
- data/bin/test-jquery.sh +58 -0
- data/bin/test-prototype.sh +54 -0
- data/bin/tidy +0 -0
- data/lib/envjs/env.js +21549 -0
- data/lib/envjs/net/cgi.rb +94 -0
- data/lib/envjs/net/file.rb +75 -0
- data/lib/envjs/net.rb +3 -0
- data/lib/envjs/options.rb +11 -0
- data/lib/envjs/runtime.rb +280 -0
- data/lib/envjs/tempfile.rb +24 -0
- data/lib/envjs.rb +23 -0
- data/test/call-load-test.js +15 -0
- data/test/debug.js +53 -0
- data/test/firebug/errorIcon.png +0 -0
- data/test/firebug/firebug.css +209 -0
- data/test/firebug/firebug.html +23 -0
- data/test/firebug/firebug.js +672 -0
- data/test/firebug/firebugx.js +10 -0
- data/test/firebug/infoIcon.png +0 -0
- data/test/firebug/warningIcon.png +0 -0
- data/test/fixtures/html/events.html +171 -0
- data/test/fixtures/html/iframe1.html +46 -0
- data/test/fixtures/html/iframe1a.html +46 -0
- data/test/fixtures/html/iframe2.html +45 -0
- data/test/fixtures/html/iframe3.html +28 -0
- data/test/fixtures/html/iframeN.html +57 -0
- data/test/fixtures/html/malformed.html +181 -0
- data/test/fixtures/html/scope.html +81 -0
- data/test/fixtures/html/trivial.html +19 -0
- data/test/fixtures/html/with_js.html +26 -0
- data/test/fixtures/images/icon-blue.png +0 -0
- data/test/fixtures/js/external_script.js +1 -0
- data/test/fixtures/js/script.js +1 -0
- data/test/fixtures/js/script_error.js +2 -0
- data/test/html/events.html +171 -0
- data/test/html/iframe1.html +46 -0
- data/test/html/iframe1a.html +46 -0
- data/test/html/iframe2.html +45 -0
- data/test/html/iframe3.html +30 -0
- data/test/html/iframeN.html +57 -0
- data/test/html/malformed.html +181 -0
- data/test/html/scope.html +87 -0
- data/test/html/script.js +1 -0
- data/test/html/trivial.html +19 -0
- data/test/html/with_js.html +26 -0
- data/test/index.html +328 -0
- data/test/java-prototype.js +9 -0
- data/test/primary-tests.js +24 -0
- data/test/prototype-test.js +13 -0
- data/test/qunit/qunit/qunit.css +17 -0
- data/test/qunit/qunit/qunit.js +997 -0
- data/test/qunit.js +61 -0
- data/test/specs/dist/env.spec.js +1534 -0
- data/test/specs/envjs.spec.css +46 -0
- data/test/specs/parser/html.js +31 -0
- data/test/specs/parser/spec.html +40 -0
- data/test/specs/parser/xml.js +31 -0
- data/test/specs/qunit.bdd.js +210 -0
- data/test/specs/qunit.css +17 -0
- data/test/specs/qunit.js +997 -0
- data/test/specs/template/spec-0.js +31 -0
- data/test/specs/template/spec-1.js +31 -0
- data/test/specs/template/spec.html +40 -0
- data/test/specs/window/css.js +23 -0
- data/test/specs/window/dialog.js +25 -0
- data/test/specs/window/document.js +23 -0
- data/test/specs/window/event.js +25 -0
- data/test/specs/window/history.js +34 -0
- data/test/specs/window/location.js +34 -0
- data/test/specs/window/navigator.js +71 -0
- data/test/specs/window/screen.js +42 -0
- data/test/specs/window/spec.html +48 -0
- data/test/specs/window/timer.js +26 -0
- data/test/specs/window/window.js +53 -0
- data/test/specs/xhr/spec.html +47 -0
- data/test/specs/xhr/xhr.js +31 -0
- data/test/test.js +10 -0
- data/test/unit/dom.js +44 -0
- data/test/unit/elementmembers.js +60 -0
- data/test/unit/events.js +195 -0
- data/test/unit/fixtures/external_script.js +1 -0
- data/test/unit/iframe.js +234 -0
- data/test/unit/multi-window.js +212 -0
- data/test/unit/nu.validator.js +34 -0
- data/test/unit/onload.js +90 -0
- data/test/unit/parser.js +121 -0
- data/test/unit/prototypecompat.js +22 -0
- data/test/unit/proxy.js +6 -0
- data/test/unit/scope.js +209 -0
- data/test/unit/timer.js +115 -0
- data/test/unit/window.js +41 -0
- data/test/vendor/jQuery/README +2 -0
- data/test/vendor/prototype-1.6.0.3.js +4320 -0
- metadata +164 -0
@@ -0,0 +1,60 @@
|
|
1
|
+
module("elementmembers");
|
2
|
+
|
3
|
+
// We ought to have test coverage for all members of all DOM objects, but
|
4
|
+
// until then, add test cases here for members as they are created
|
5
|
+
|
6
|
+
test("attributes common to all HTML elements", function() {
|
7
|
+
expect(4);
|
8
|
+
|
9
|
+
// tests for .innerText
|
10
|
+
var mtch = document.getElementById('dl').innerText.match(
|
11
|
+
/^\s+See this blog entry for more information.\s+Here are/);
|
12
|
+
try{ ok(mtch && mtch.length > 0,
|
13
|
+
"dl.innerText returns the correct content");
|
14
|
+
}catch(e){print(e);}
|
15
|
+
|
16
|
+
mtch = document.getElementById('sndp').innerText.match(/^Everything insid/);
|
17
|
+
try{ ok(mtch && mtch.length > 0,
|
18
|
+
"p.innerText returns the correct content");
|
19
|
+
}catch(e){print(e);}
|
20
|
+
|
21
|
+
try{ ok(document.getElementById('sndp').innerText = "test text" || true,
|
22
|
+
"p.innerText= operates without exception");
|
23
|
+
}catch(e){print(e);}
|
24
|
+
|
25
|
+
try{ ok(document.getElementById('sndp').innerText == "test text",
|
26
|
+
"p.innerText= changes content of element");
|
27
|
+
}catch(e){print(e);}
|
28
|
+
});
|
29
|
+
|
30
|
+
test("select element", function() {
|
31
|
+
expect(14);
|
32
|
+
|
33
|
+
var select = document.getElementById('select1');
|
34
|
+
equals("select-one", select.type, "Select field's type is select-one by default");
|
35
|
+
|
36
|
+
select = document.getElementById('test_value');
|
37
|
+
equals("optionvalue", select.value, "Select field returns its selected option's value as its value");
|
38
|
+
|
39
|
+
// if option2 is selected, unselect option1 (and update select.value)
|
40
|
+
select = document.getElementById('test_selecting');
|
41
|
+
select.options[2].selected = true;
|
42
|
+
ok(select.options[2].selected, "Select's option should be selected");
|
43
|
+
ok(!select.options[1].selected, "Previously selected option should be automatically unselected");
|
44
|
+
equals("2", select.value, "Select's value should be updated");
|
45
|
+
|
46
|
+
// if option2 is unselected, then select first option on the list (and update select.value)
|
47
|
+
select.options[2].selected = false;
|
48
|
+
ok(!select.options[2].selected, "Select's option should be unselected");
|
49
|
+
ok(!select.options[1].selected, "Previously selected option should stay unselected");
|
50
|
+
ok(select.options[0].selected, "First option in the select should be selected");
|
51
|
+
equals("0", select.value, "Select's value should be updated");
|
52
|
+
|
53
|
+
// update select's value and options when selectedIndex is changed
|
54
|
+
equals(0, select.selectedIndex, "Select's selectedIndex should return the index of selected option");
|
55
|
+
select.selectedIndex = 2;
|
56
|
+
equals(2, select.selectedIndex, "Select's selectedIndex should be updated");
|
57
|
+
equals("2", select.value, "Changing selectedIndex should update select's value");
|
58
|
+
ok(!select.options[0].selected, "Changing selectedIndex should unselect currently selected option");
|
59
|
+
ok(select.options[2].selected, "Changing selectedIndex should select option at given index");
|
60
|
+
});
|
data/test/unit/events.js
ADDED
@@ -0,0 +1,195 @@
|
|
1
|
+
/*
|
2
|
+
* This file is a component of env.js,
|
3
|
+
* http://github.com/gleneivey/env-js/commits/master/README
|
4
|
+
* a Pure JavaScript Browser Environment
|
5
|
+
* Copyright 2009 John Resig, licensed under the MIT License
|
6
|
+
* http://www.opensource.org/licenses/mit-license.php
|
7
|
+
*/
|
8
|
+
|
9
|
+
|
10
|
+
module("events");
|
11
|
+
|
12
|
+
// This file is for tests of general event dispatching, propagation, and
|
13
|
+
// handling functionality. In keeping with the general non-exhaustive
|
14
|
+
// approach of env.js's unit tests, each behavior is checked for one
|
15
|
+
// relevant type of event in one relevant context (page structure, etc.).
|
16
|
+
|
17
|
+
// These tests rely on the content of ../html/events.html and of the
|
18
|
+
// <iframe id='eventsFrame'> tag in ../index.html.
|
19
|
+
|
20
|
+
// These tests are order-dependent. If you alter the order or add new tests
|
21
|
+
// in the middle, the expected values of eventFrameLoaded and
|
22
|
+
// eventFrameClicked may well change (perhaps requiring extra parameters
|
23
|
+
// to the *Checks convenience functions).
|
24
|
+
|
25
|
+
|
26
|
+
var __click__ = function(element){
|
27
|
+
var event = new Event({
|
28
|
+
target:element,
|
29
|
+
currentTarget:element
|
30
|
+
});
|
31
|
+
event.initEvent("click");
|
32
|
+
element.dispatchEvent(event);
|
33
|
+
}
|
34
|
+
|
35
|
+
function loadChecks(tag, loadCount, imgCount, unloadCount){
|
36
|
+
expect(5);
|
37
|
+
|
38
|
+
var eCounters = window.top.eCounters;
|
39
|
+
try{ ok( eCounters["window onload"] == loadCount &&
|
40
|
+
eCounters["body onload"] == loadCount,
|
41
|
+
tag + ": Onload Events recorded");
|
42
|
+
}catch(e){print(e);}
|
43
|
+
|
44
|
+
try{ ok( eCounters["img onload"] == imgCount,
|
45
|
+
tag + ": Img-tag onload event(s) recorded separately");
|
46
|
+
}catch(e){print(e);}
|
47
|
+
|
48
|
+
try{ ok( eCounters["window onunload"] == unloadCount &&
|
49
|
+
eCounters["body onunload"] == unloadCount,
|
50
|
+
tag + ": Onunload events recorded");
|
51
|
+
}catch(e){print(e);}
|
52
|
+
|
53
|
+
try{ ok( eCounters["body onclick"] == 0 &&
|
54
|
+
eCounters["h1 onclick"] == 0 &&
|
55
|
+
eCounters["h2 onclick"] == 0 &&
|
56
|
+
eCounters["div onclick"] == 0 &&
|
57
|
+
eCounters["table onclick"] == 0 &&
|
58
|
+
eCounters["tbody onclick"] == 0 &&
|
59
|
+
eCounters["tr onclick"] == 0 &&
|
60
|
+
eCounters["td onclick"] == 0 &&
|
61
|
+
eCounters["ul onclick"] == 0 &&
|
62
|
+
eCounters["li onclick"] == 0 &&
|
63
|
+
eCounters["p onclick"] == 0 &&
|
64
|
+
eCounters["b onclick"] == 0 &&
|
65
|
+
eCounters["i onclick"] == 0 &&
|
66
|
+
eCounters["a onclick"] == 0 &&
|
67
|
+
eCounters["img onclick"] == 0,
|
68
|
+
tag + ": Onload events recorded once.");
|
69
|
+
}catch(e){print(e);}
|
70
|
+
|
71
|
+
try{ ok( eventFrameLoaded == loadCount && eventFrameClicked == 0,
|
72
|
+
tag + ": " + loadCount + " iframe events recorded on page load.");
|
73
|
+
}catch(e){print(e);}
|
74
|
+
}
|
75
|
+
|
76
|
+
|
77
|
+
test("Check that events do/don't occur on document load", function() {
|
78
|
+
// eCounters already initialized by code in ../html/events.html
|
79
|
+
loadChecks("Load", 1, 1, 0);
|
80
|
+
});
|
81
|
+
|
82
|
+
test("Check that events do/don't occur on manual iframe reload", function() {
|
83
|
+
document.getElementById('eventsFrame').src = "html/events.html";
|
84
|
+
loadChecks("Reload", 2, 2, 1);
|
85
|
+
});
|
86
|
+
|
87
|
+
test("Check that an event which should NOT bubble actually does not",
|
88
|
+
function() {
|
89
|
+
var img = document.getElementById('eventsFrame').contentDocument.
|
90
|
+
getElementById('theIMG').src = "missing.png";
|
91
|
+
loadChecks("Img Load", 2, 3, 1);
|
92
|
+
|
93
|
+
// note: if img-onload had bubbled up, previous tests probably would
|
94
|
+
// have failed (too large body-onload counts), too. So this test
|
95
|
+
// just ensures that operation is correct even when only part of
|
96
|
+
// page is reloading.
|
97
|
+
});
|
98
|
+
|
99
|
+
|
100
|
+
|
101
|
+
function clickChecks(tag, upperCount, lowerCount){
|
102
|
+
expect(5);
|
103
|
+
|
104
|
+
var eCounters = window.top.eCounters;
|
105
|
+
try{ ok( eCounters["window onload"] == 0 &&
|
106
|
+
eCounters["window onunload"] == 0 &&
|
107
|
+
eCounters["body onload"] == 0 &&
|
108
|
+
eCounters["body onunload"] == 0 &&
|
109
|
+
eCounters["img onload"] == 0,
|
110
|
+
tag + ": Onload events not triggered by click");
|
111
|
+
}catch(e){print(e);}
|
112
|
+
|
113
|
+
var special = (upperCount == lowerCount) ? "" : " not";
|
114
|
+
try{ ok( eCounters["ul onclick"] == lowerCount &&
|
115
|
+
eCounters["li onclick"] == lowerCount &&
|
116
|
+
eCounters["p onclick"] == lowerCount &&
|
117
|
+
eCounters["b onclick"] == lowerCount &&
|
118
|
+
eCounters["i onclick"] == lowerCount &&
|
119
|
+
eCounters["a onclick"] == lowerCount &&
|
120
|
+
eCounters["img onclick"] == lowerCount,
|
121
|
+
tag + ": Click event did" + special + " bubble through inner elements");
|
122
|
+
}catch(e){print(e);}
|
123
|
+
|
124
|
+
try{ ok( eCounters["body onclick"] == upperCount &&
|
125
|
+
eCounters["div onclick"] == upperCount &&
|
126
|
+
eCounters["table onclick"] == upperCount &&
|
127
|
+
eCounters["tbody onclick"] == upperCount &&
|
128
|
+
eCounters["tr onclick"] == upperCount &&
|
129
|
+
eCounters["td onclick"] == upperCount,
|
130
|
+
tag + ": Click event bubbled through outer elements");
|
131
|
+
}catch(e){print(e);}
|
132
|
+
|
133
|
+
try{ ok( eCounters["h1 onclick"] == 0 &&
|
134
|
+
eCounters["h2 onclick"] == 0,
|
135
|
+
tag + ": No click events for Hx elements");
|
136
|
+
}catch(e){print(e);}
|
137
|
+
|
138
|
+
|
139
|
+
try{ ok( eventFrameLoaded == 2 && eventFrameClicked == 0,
|
140
|
+
tag + ": Iframe event counts unchanged");
|
141
|
+
}catch(e){print(e);}
|
142
|
+
}
|
143
|
+
|
144
|
+
test("Check that an event which should bubble actually does", function() {
|
145
|
+
// clear in-iframe event counters to zero
|
146
|
+
window.top.eCounters = {};
|
147
|
+
fWin = document.getElementById('eventsFrame').contentWindow;
|
148
|
+
fWin.initECounters(window.top.eCounters);
|
149
|
+
|
150
|
+
// simulate a "click" user action
|
151
|
+
var img = document.getElementById('eventsFrame').contentDocument.
|
152
|
+
getElementById('theIMG');
|
153
|
+
__click__(img);
|
154
|
+
|
155
|
+
clickChecks("Click img", 1, 1);
|
156
|
+
});
|
157
|
+
|
158
|
+
test("Bubbling event ONLY bubbles 'up'", function() {
|
159
|
+
// simulate a "click" user action
|
160
|
+
var td = document.getElementById('eventsFrame').contentDocument.
|
161
|
+
getElementById('theTD');
|
162
|
+
__click__(td);
|
163
|
+
|
164
|
+
clickChecks("Click td", 2, 1);
|
165
|
+
});
|
166
|
+
|
167
|
+
|
168
|
+
test("Check that events can be set with addEventListener(), and bubble",
|
169
|
+
function() {
|
170
|
+
expect(4);
|
171
|
+
|
172
|
+
var img = document.getElementById('eventsFrame').contentDocument.
|
173
|
+
getElementById('theIMG');
|
174
|
+
|
175
|
+
// add handlers
|
176
|
+
addHdlr = function(id) {
|
177
|
+
var elem = document.getElementById('eventsFrame').contentDocument.
|
178
|
+
getElementById(id).addEventListener('click', function(event){
|
179
|
+
try{
|
180
|
+
ok( event.target === img && ( ( this === window ) || ( this.window === window ) ),
|
181
|
+
"Scope: 'this' refers to the window '" + window + "'");
|
182
|
+
}catch(e){print(e);}
|
183
|
+
});
|
184
|
+
};
|
185
|
+
|
186
|
+
// a few objects that the <img 'theImG'>.click event will bubble up through
|
187
|
+
addHdlr("theIMG");
|
188
|
+
addHdlr("theA");
|
189
|
+
addHdlr("theP");
|
190
|
+
addHdlr("theLI");
|
191
|
+
|
192
|
+
// simulate user action
|
193
|
+
__click__(img);
|
194
|
+
});
|
195
|
+
|
@@ -0,0 +1 @@
|
|
1
|
+
var $$$$$ = "12345";
|
data/test/unit/iframe.js
ADDED
@@ -0,0 +1,234 @@
|
|
1
|
+
/*
|
2
|
+
* This file is a component of env.js,
|
3
|
+
* http://github.com/gleneivey/env-js/commits/master/README
|
4
|
+
* a Pure JavaScript Browser Environment
|
5
|
+
* Copyright 2009 John Resig, licensed under the MIT License
|
6
|
+
* http://www.opensource.org/licenses/mit-license.php
|
7
|
+
*/
|
8
|
+
|
9
|
+
|
10
|
+
module("iframe");
|
11
|
+
|
12
|
+
|
13
|
+
// In general, the tests here use the files ../html/iframe*.html
|
14
|
+
// I've tried to keep all of the id attributes and text fragments in these
|
15
|
+
// files unique from each other and from the content of index.html
|
16
|
+
// to ensure that we can correctly identify which file has loaded into
|
17
|
+
// which frame/window. When making modifications/additions, paying
|
18
|
+
// attention to uniqueness is recommended.
|
19
|
+
|
20
|
+
|
21
|
+
// all tests to next comment rely on content of ../html/iframe1.html and
|
22
|
+
// ../html/iframe1a.html
|
23
|
+
|
24
|
+
// iframe1 and iframe1a are identical in structure (so we can use the
|
25
|
+
// same assertions against both), but different in content text (so
|
26
|
+
// that we can tell which one is currently loaded). So, create an
|
27
|
+
// object (associative array) that is specific to the content of each.
|
28
|
+
contentOfIframe1 = {
|
29
|
+
url : "html/iframe1.html",
|
30
|
+
titleRE : /IFRAME/,
|
31
|
+
elementId : 'anElementWithText',
|
32
|
+
elementRE : /content of a paragraph/
|
33
|
+
};
|
34
|
+
contentOfIframe1a = {
|
35
|
+
url : "html/iframe1a.html",
|
36
|
+
titleRE : /iframe1a.html/,
|
37
|
+
elementId : 'anotherElementWithText',
|
38
|
+
elementRE : /block-quote element/
|
39
|
+
};
|
40
|
+
|
41
|
+
var accessChecksForIframe1 = function(flag, iframe, contentOf) {
|
42
|
+
expect(6);
|
43
|
+
|
44
|
+
try{ok (iframe.src == contentOf.url,
|
45
|
+
flag + ": Initial iframe src matches test page source");
|
46
|
+
}catch(e){print(e);}
|
47
|
+
|
48
|
+
var idoc = iframe.contentDocument;
|
49
|
+
var mtch = idoc.title.match(contentOf.titleRE);
|
50
|
+
try{ok (mtch && mtch.length > 0,
|
51
|
+
flag + ": Can get 'document' object from test iframe");
|
52
|
+
}catch(e){print(e);}
|
53
|
+
|
54
|
+
var para = idoc.getElementById(contentOf.elementId);
|
55
|
+
mtch = para.innerHTML.match(contentOf.elementRE);
|
56
|
+
try{ok (mtch && mtch.length > 0,
|
57
|
+
flag + ": Can get text from element in an iframe");
|
58
|
+
}catch(e){print(e);}
|
59
|
+
|
60
|
+
try{ok (idoc.parentWindow == iframe.contentWindow,
|
61
|
+
flag + ": doc's .parentWindow points to iframe's .contentWindow");
|
62
|
+
}catch(e){print(e);}
|
63
|
+
|
64
|
+
try{ok (idoc.parentWindow.parent == window,
|
65
|
+
flag + ": Can follow chain from iframe's doc to containing window");
|
66
|
+
}catch(e){print(e);}
|
67
|
+
|
68
|
+
try{ok (iframe.contentWindow.top == window,
|
69
|
+
flag + ": '.top' from iframe does point to top window");
|
70
|
+
}catch(e){print(e);}
|
71
|
+
};
|
72
|
+
|
73
|
+
test("IFRAMEs load with accessible content", function() {
|
74
|
+
var iframe = document.getElementById('loadediframe');
|
75
|
+
// iframe1.html loaded via src= attribute when index.html was parsed
|
76
|
+
accessChecksForIframe1("1", iframe, contentOfIframe1);
|
77
|
+
});
|
78
|
+
|
79
|
+
|
80
|
+
test("IFRAMEs still load when .src is set after the page is parsed",function() {
|
81
|
+
var iframe = document.getElementById('emptyiframe');
|
82
|
+
iframe.src = "html/iframe1.html";
|
83
|
+
accessChecksForIframe1("2", iframe, contentOfIframe1);
|
84
|
+
});
|
85
|
+
|
86
|
+
test("IFRAMEs reload with accessible content", function() {
|
87
|
+
var iframe = document.getElementById('loadediframe');
|
88
|
+
iframe.src = "html/iframe1a.html";
|
89
|
+
accessChecksForIframe1("3", iframe, contentOfIframe1a);
|
90
|
+
});
|
91
|
+
|
92
|
+
|
93
|
+
// this test relies on iframe3.html, iframe2.html, and iframeN.html
|
94
|
+
test("IFRAMEs can be nested, created dynamically", function() {
|
95
|
+
var startingDepth = 3;
|
96
|
+
var endingDepth = 7;
|
97
|
+
expect(5 + (10*((endingDepth - startingDepth)+1)));
|
98
|
+
|
99
|
+
// manually load iframe3.html
|
100
|
+
var firstIframe = document.getElementById('emptyiframe');
|
101
|
+
firstIframe.src = "html/iframe3.html";
|
102
|
+
|
103
|
+
// iframe3.html contains a static <iframe> element that loads iframe2.html,
|
104
|
+
// so at this point, we should have both loaded, with the structure that
|
105
|
+
// index.html --contains--> iframe3.html --contains--> iframe2.html
|
106
|
+
// w/ id's = emptyiframe nested1Level
|
107
|
+
|
108
|
+
|
109
|
+
|
110
|
+
////////////////////////////////////////
|
111
|
+
// first, verify that we've got the structure we expect:
|
112
|
+
var mtch = firstIframe.contentDocument.title.match(/nested-IFRAME/);
|
113
|
+
try{ok (mtch && mtch.length > 0,
|
114
|
+
"top-level IFRAME reloaded from correct source");
|
115
|
+
}catch(e){print(e);}
|
116
|
+
|
117
|
+
var secondIframe = firstIframe.contentDocument.
|
118
|
+
getElementById('nested1Level');
|
119
|
+
mtch = secondIframe.contentDocument.title.match(/IFRAME loading/);
|
120
|
+
try{ok (mtch && mtch.length > 0,
|
121
|
+
"can access content of an IFRAME nested in another");
|
122
|
+
}catch(e){print(e);}
|
123
|
+
|
124
|
+
try{ok (secondIframe.contentDocument.parentWindow.parent.parent == window,
|
125
|
+
"can follow path from nested IFRAME to root window");
|
126
|
+
}catch(e){print(e);}
|
127
|
+
|
128
|
+
try{ok (secondIframe.contentWindow.parent.parent == window,
|
129
|
+
"also path through .contentWindow to root window");
|
130
|
+
}catch(e){print(e);}
|
131
|
+
|
132
|
+
try{ok (secondIframe.contentWindow.top == window,
|
133
|
+
"nested IFRAME has correct .top");
|
134
|
+
}catch(e){print(e);}
|
135
|
+
|
136
|
+
|
137
|
+
////////////////////////////////////////
|
138
|
+
// OK, now we'll programatically extend the nesting depth from 2 to many
|
139
|
+
window.numberNestedIframeLoads = 0;
|
140
|
+
window.winLoadCount = 0;
|
141
|
+
window.bodyLoadCount = 0;
|
142
|
+
window.frameLoadCount = 0;
|
143
|
+
for (var c = startingDepth, bottomIframe = secondIframe; c <= endingDepth;
|
144
|
+
c++){
|
145
|
+
|
146
|
+
// add a new iframe within the current leaf iframe
|
147
|
+
var newIframe = bottomIframe.contentDocument.createElement("iframe");
|
148
|
+
newIframe.setAttribute("id", "iframe_of_depth_" + c);
|
149
|
+
newIframe.setAttribute("onload", "iframeOnloadHandler();");
|
150
|
+
var bottomBody = bottomIframe.contentDocument.
|
151
|
+
getElementsByTagName('body')[0];
|
152
|
+
|
153
|
+
bottomBody.appendChild(newIframe);
|
154
|
+
newIframe.src = "html/iframeN.html";
|
155
|
+
bottomIframe = newIframe;
|
156
|
+
|
157
|
+
|
158
|
+
|
159
|
+
////////////////////////////////////////
|
160
|
+
// verify contents of just-loaded iframe
|
161
|
+
mtch = bottomIframe.contentDocument.getElementById('nestingLevel').
|
162
|
+
innerHTML.match(/[0-9]+/);
|
163
|
+
try{ok (mtch && mtch.length > 0 && parseInt(mtch[0]) == c,
|
164
|
+
"nested " + c + " levels: can access content");
|
165
|
+
}catch(e){print(e);}
|
166
|
+
|
167
|
+
for (var aWindow = bottomIframe.contentWindow, cn = c; cn > 0; cn--)
|
168
|
+
aWindow = aWindow.parent;
|
169
|
+
try{ok (aWindow == window,
|
170
|
+
"nested " + c + " levels: can follow path to root window");
|
171
|
+
}catch(e){print(e);}
|
172
|
+
|
173
|
+
try{ok (bottomIframe.contentWindow.top == window,
|
174
|
+
"nested " + c + " levels: IFRAME has correct .top");
|
175
|
+
}catch(e){print(e);}
|
176
|
+
|
177
|
+
|
178
|
+
|
179
|
+
////////////////////////////////////////
|
180
|
+
// verify events related to iframe load:
|
181
|
+
// iframe.onload (container); window.onload and body.onload (contained)
|
182
|
+
var num = (c - startingDepth) + 1;
|
183
|
+
try{ok (num == window.numberNestedIframeLoads,
|
184
|
+
"nested " + c + " levels: event <script> executed");
|
185
|
+
}catch(e){print(e);}
|
186
|
+
|
187
|
+
try{ok (num == window.winLoadCount,
|
188
|
+
"nested " + c + " levels: window-onload handler executed");
|
189
|
+
}catch(e){print(e);}
|
190
|
+
try{ok (num == window.bodyLoadCount,
|
191
|
+
"nested " + c + " levels: body-onload handler executed");
|
192
|
+
}catch(e){print(e);}
|
193
|
+
try{ok (num == window.frameLoadCount,
|
194
|
+
"nested " + c + " levels: iframe-onload handler executed");
|
195
|
+
}catch(e){print(e);}
|
196
|
+
|
197
|
+
mtch = bottomIframe.contentWindow.parent.document.
|
198
|
+
getElementById("pCreatedIframeOnload" + num).innerHTML.
|
199
|
+
match(/para iframe onload ([0-9]+)/);
|
200
|
+
try{ok (mtch && mtch.length > 0 && parseInt(mtch[1]) == num,
|
201
|
+
"nested " + c + " levels: confirmed iframe-onload");
|
202
|
+
}catch(e){print(e);}
|
203
|
+
mtch = bottomIframe.contentDocument.
|
204
|
+
getElementById("pCreatedWindowOnload" + num).innerHTML.
|
205
|
+
match(/para window onload ([0-9]+)/);
|
206
|
+
try{ok (mtch && mtch.length > 0 && parseInt(mtch[1]) == num,
|
207
|
+
"nested " + c + " levels: confirmed window-onload");
|
208
|
+
}catch(e){print(e);}
|
209
|
+
mtch = bottomIframe.contentDocument.
|
210
|
+
getElementById("pCreatedBodyOnload" + num).innerHTML.
|
211
|
+
match(/para body onload ([0-9]+)/);
|
212
|
+
try{ok (mtch && mtch.length > 0 && parseInt(mtch[1]) == num,
|
213
|
+
"nested " + c + " levels: confirmed body-onload");
|
214
|
+
}catch(e){print(e);}
|
215
|
+
}
|
216
|
+
});
|
217
|
+
|
218
|
+
|
219
|
+
// all tests to next comment rely on content of ../html/iframe2.html
|
220
|
+
test("IFRAMEs reload on assignment to 'src'", function() {
|
221
|
+
expect(2);
|
222
|
+
|
223
|
+
var iframe = document.getElementById('loadediframe');
|
224
|
+
iframe.src = "html/iframe2.html";
|
225
|
+
try{ok (iframe.src == "html/iframe2.html",
|
226
|
+
"iframe.src matches value assigned");
|
227
|
+
}catch(e){print(e);}
|
228
|
+
|
229
|
+
var para = iframe.contentDocument.getElementById('aParaInAnIframe');
|
230
|
+
var mtch = para.innerHTML.match(/short paragraph/);
|
231
|
+
try{ok (mtch && mtch.length > 0,
|
232
|
+
"IFRAME reloaded from correct source");
|
233
|
+
}catch(e){print(e);}
|
234
|
+
});
|