1
0
mirror of https://github.com/webrecorder/pywb.git synced 2025-03-24 06:59:52 +01:00

wombat: add extra mutation observer for any nodes added

This commit is contained in:
Ilya Kreymer 2015-05-13 23:37:04 -07:00
parent 1b9ef4e325
commit fd4a0cc9b1

View File

@ -1,5 +1,5 @@
/* /*
Copyright(c) 2013-2014 Ilya Kreymer. Released under the GNU General Public License. Copyright(c) 2013-2015 Ilya Kreymer. Released under the GNU General Public License.
This file is part of pywb, https://github.com/ikreymer/pywb This file is part of pywb, https://github.com/ikreymer/pywb
@ -18,7 +18,7 @@ This file is part of pywb, https://github.com/ikreymer/pywb
*/ */
//============================================ //============================================
// Wombat JS-Rewriting Library v2.2 // Wombat JS-Rewriting Library v2.3
//============================================ //============================================
_WBWombat = (function() { _WBWombat = (function() {
@ -712,7 +712,6 @@ _WBWombat = (function() {
var curr = r.target.getAttribute(r.attributeName); var curr = r.target.getAttribute(r.attributeName);
var new_url = rewrite_url(curr); var new_url = rewrite_url(curr);
if (curr != new_url) { if (curr != new_url) {
console.log("REWRITE " + r.attributeName);
r.target._orig_setAttribute(r.attributeName, new_url); r.target._orig_setAttribute(r.attributeName, new_url);
} }
} }
@ -729,6 +728,32 @@ _WBWombat = (function() {
} }
//============================================
function init_node_insert_obs()
{
if (!window.MutationObserver) {
return;
}
var m = new MutationObserver(function(records, observer)
{
for (var i = 0; i < records.length; i++) {
var r = records[i];
if (r.type == "childList") {
for (var j = 0; j < r.addedNodes.length; j++) {
rewrite_attr(r.addedNodes[j], "href", rewrite_url);
rewrite_attr(r.addedNodes[j], "src", rewrite_url);
}
}
}
});
m.observe(document.documentElement, {
childList: true,
subtree: true,
});
}
//============================================ //============================================
function rewrite_attr(elem, name, func) { function rewrite_attr(elem, name, func) {
if (!elem || !elem.getAttribute) { if (!elem || !elem.getAttribute) {
@ -749,11 +774,15 @@ _WBWombat = (function() {
return; return;
} }
var new_value = value;
if (func) { if (func) {
value = func(value); new_value = func(value);
} }
elem._orig_setAttribute(name, value); if (value != new_value) {
elem._orig_setAttribute(name, new_value);
}
} }
//============================================ //============================================
@ -842,6 +871,7 @@ _WBWombat = (function() {
created.contentWindow.WB_wombat_location = created.contentWindow.location; created.contentWindow.WB_wombat_location = created.contentWindow.location;
} }
override_attr(created, "src"); override_attr(created, "src");
} else if (created.tagName && equals_any(created.tagName, SRC_TAGS)) { } else if (created.tagName && equals_any(created.tagName, SRC_TAGS)) {
override_attr(created, "src"); override_attr(created, "src");
@ -1141,6 +1171,11 @@ _WBWombat = (function() {
Element.prototype._orig_setAttribute = Element.prototype.setAttribute; Element.prototype._orig_setAttribute = Element.prototype.setAttribute;
} }
// Node insert observer
if (!wb_opts.skip_node_obs) {
init_node_insert_obs();
}
// ensure namespace urls are NOT rewritten // ensure namespace urls are NOT rewritten
init_createElementNS_fix(); init_createElementNS_fix();