Skip to content
This repository was archived by the owner on Apr 22, 2020. It is now read-only.

Commit 251b599

Browse files
fixed autoloader code that waited until all language modules loaded to prettify code.
1 parent e96dfeb commit 251b599

File tree

2 files changed

+98
-42
lines changed

2 files changed

+98
-42
lines changed

js-modules/run_prettify.js

Lines changed: 49 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -58,9 +58,10 @@
5858
"use strict";
5959

6060
var win = window;
61+
var setTimeout = win.setTimeout;
6162
var doc = document;
6263
var root = doc.documentElement;
63-
var head = doc.getElementsByTagName('head')[0] || doc.documentElement;
64+
var head = doc['head'] || doc.getElementsByTagName("head")[0] || root;
6465

6566
// From http://javascript.nwbox.com/ContentLoaded/contentloaded.js
6667
// Author: Diego Perini (diego.perini at gmail.com)
@@ -69,11 +70,12 @@
6970
// License: MIT
7071
// Version: 1.2
7172
function contentLoaded(callback) {
73+
var addEventListener = doc['addEventListener'];
7274
var done = false, top = true,
73-
add = doc.addEventListener ? 'addEventListener' : 'attachEvent',
74-
rem = doc.addEventListener ? 'removeEventListener' : 'detachEvent',
75-
pre = doc.addEventListener ? '' : 'on',
76-
75+
add = addEventListener ? 'addEventListener' : 'attachEvent',
76+
rem = addEventListener ? 'removeEventListener' : 'detachEvent',
77+
pre = addEventListener ? '' : 'on',
78+
7779
init = function(e) {
7880
if (e.type == 'readystatechange' && doc.readyState != 'complete') {
7981
return;
@@ -169,14 +171,45 @@
169171
var LOADER_BASE_URL =
170172
'https://google-code-prettify.googlecode.com/svn/loader';
171173

172-
for (var i = 0, n = langs.length; i < n; ++i) {
173-
var script = doc.createElement('script');
174+
for (var i = 0, n = langs.length; i < n; ++i) (function (lang) {
175+
var script = doc.createElement("script");
176+
177+
// Excerpted from jQuery.ajaxTransport("script") to fire events when
178+
// a script is finished loading.
179+
// Attach handlers for each script
180+
script.onload = script.onerror = script.onreadystatechange = function () {
181+
if (script && (
182+
!script.readyState || /loaded|complete/.test(script.readyState))) {
183+
// Handle memory leak in IE
184+
script.onerror = script.onload = script.onreadystatechange = null;
185+
186+
--pendingLanguages;
187+
checkPendingLanguages();
188+
189+
// Remove the script
190+
if (script.parentNode) {
191+
script.parentNode.removeChild(script);
192+
}
193+
194+
script = null;
195+
}
196+
};
197+
174198
script.type = 'text/javascript';
175199
script.src = LOADER_BASE_URL
176200
+ '/lang-' + encodeURIComponent(langs[i]) + '.js';
177-
head.appendChild(script);
201+
202+
// Circumvent IE6 bugs with base elements (#2709 and #4378) by prepending
203+
head.insertBefore(script, head.firstChild);
204+
})(langs[i]);
205+
206+
var pendingLanguages = langs.length;
207+
function checkPendingLanguages() {
208+
if (!pendingLanguages) {
209+
setTimeout(onLangsLoaded, 0);
210+
}
178211
}
179-
212+
180213
var skinUrls = [];
181214
for (var i = 0, n = skins.length; i < n; ++i) {
182215
skinUrls.push(LOADER_BASE_URL
@@ -190,12 +223,11 @@
190223
return prettyPrint;
191224
})();
192225

193-
if (autorun) {
194-
// If this script is deferred or async and the document is already
195-
// loaded we need to wait for language handlers to load before performing
196-
// any autorun.
197-
var OWN_NAMESPACE = 'code_google_com_googleprettify';
198-
(win[OWN_NAMESPACE] || (win[OWN_NAMESPACE] = {}))['run'] = function () {
226+
// If this script is deferred or async and the document is already
227+
// loaded we need to wait for language handlers to load before performing
228+
// any autorun.
229+
function onLangsLoaded() {
230+
if (autorun) {
199231
contentLoaded(
200232
function () {
201233
var n = callbacks.length;
@@ -211,12 +243,8 @@
211243
} : void 0;
212244
prettyPrint(callback);
213245
});
214-
};
215-
216-
var endScript = doc.createElement('script');
217-
endScript.type = 'text/javascript';
218-
endScript.appendChild(doc.createTextNode(OWN_NAMESPACE + '.run()'));
219-
(doc.body || doc.documentElement).appendChild(endScript);
246+
}
220247
}
248+
checkPendingLanguages();
221249

222250
}());

src/run_prettify.js

Lines changed: 49 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -62,9 +62,10 @@ var IN_GLOBAL_SCOPE = false;
6262
"use strict";
6363

6464
var win = window;
65+
var setTimeout = win.setTimeout;
6566
var doc = document;
6667
var root = doc.documentElement;
67-
var head = doc.getElementsByTagName('head')[0] || doc.documentElement;
68+
var head = doc['head'] || doc.getElementsByTagName("head")[0] || root;
6869

6970
// From http://javascript.nwbox.com/ContentLoaded/contentloaded.js
7071
// Author: Diego Perini (diego.perini at gmail.com)
@@ -73,11 +74,12 @@ var IN_GLOBAL_SCOPE = false;
7374
// License: MIT
7475
// Version: 1.2
7576
function contentLoaded(callback) {
77+
var addEventListener = doc['addEventListener'];
7678
var done = false, top = true,
77-
add = doc.addEventListener ? 'addEventListener' : 'attachEvent',
78-
rem = doc.addEventListener ? 'removeEventListener' : 'detachEvent',
79-
pre = doc.addEventListener ? '' : 'on',
80-
79+
add = addEventListener ? 'addEventListener' : 'attachEvent',
80+
rem = addEventListener ? 'removeEventListener' : 'detachEvent',
81+
pre = addEventListener ? '' : 'on',
82+
8183
init = function(e) {
8284
if (e.type == 'readystatechange' && doc.readyState != 'complete') {
8385
return;
@@ -173,14 +175,45 @@ var IN_GLOBAL_SCOPE = false;
173175
var LOADER_BASE_URL =
174176
'https://google-code-prettify.googlecode.com/svn/loader';
175177

176-
for (var i = 0, n = langs.length; i < n; ++i) {
177-
var script = doc.createElement('script');
178+
for (var i = 0, n = langs.length; i < n; ++i) (function (lang) {
179+
var script = doc.createElement("script");
180+
181+
// Excerpted from jQuery.ajaxTransport("script") to fire events when
182+
// a script is finished loading.
183+
// Attach handlers for each script
184+
script.onload = script.onerror = script.onreadystatechange = function () {
185+
if (script && (
186+
!script.readyState || /loaded|complete/.test(script.readyState))) {
187+
// Handle memory leak in IE
188+
script.onerror = script.onload = script.onreadystatechange = null;
189+
190+
--pendingLanguages;
191+
checkPendingLanguages();
192+
193+
// Remove the script
194+
if (script.parentNode) {
195+
script.parentNode.removeChild(script);
196+
}
197+
198+
script = null;
199+
}
200+
};
201+
178202
script.type = 'text/javascript';
179203
script.src = LOADER_BASE_URL
180204
+ '/lang-' + encodeURIComponent(langs[i]) + '.js';
181-
head.appendChild(script);
205+
206+
// Circumvent IE6 bugs with base elements (#2709 and #4378) by prepending
207+
head.insertBefore(script, head.firstChild);
208+
})(langs[i]);
209+
210+
var pendingLanguages = langs.length;
211+
function checkPendingLanguages() {
212+
if (!pendingLanguages) {
213+
setTimeout(onLangsLoaded, 0);
214+
}
182215
}
183-
216+
184217
var skinUrls = [];
185218
for (var i = 0, n = skins.length; i < n; ++i) {
186219
skinUrls.push(LOADER_BASE_URL
@@ -1833,12 +1866,11 @@ var IN_GLOBAL_SCOPE = false;
18331866
return prettyPrint;
18341867
})();
18351868

1836-
if (autorun) {
1837-
// If this script is deferred or async and the document is already
1838-
// loaded we need to wait for language handlers to load before performing
1839-
// any autorun.
1840-
var OWN_NAMESPACE = 'code_google_com_googleprettify';
1841-
(win[OWN_NAMESPACE] || (win[OWN_NAMESPACE] = {}))['run'] = function () {
1869+
// If this script is deferred or async and the document is already
1870+
// loaded we need to wait for language handlers to load before performing
1871+
// any autorun.
1872+
function onLangsLoaded() {
1873+
if (autorun) {
18421874
contentLoaded(
18431875
function () {
18441876
var n = callbacks.length;
@@ -1854,12 +1886,8 @@ var IN_GLOBAL_SCOPE = false;
18541886
} : void 0;
18551887
prettyPrint(callback);
18561888
});
1857-
};
1858-
1859-
var endScript = doc.createElement('script');
1860-
endScript.type = 'text/javascript';
1861-
endScript.appendChild(doc.createTextNode(OWN_NAMESPACE + '.run()'));
1862-
(doc.body || doc.documentElement).appendChild(endScript);
1889+
}
18631890
}
1891+
checkPendingLanguages();
18641892

18651893
}());

0 commit comments

Comments
 (0)