1
0
mirror of https://github.com/webrecorder/pywb.git synced 2025-03-15 00:03:28 +01:00

client-side rewrite:

- rewrite Audio() constructor
- unrewrite innerHTML, outerHTML accessors
- rewrite DocumentFragments
rules: add rules for readspeaker
This commit is contained in:
Ilya Kreymer 2017-11-21 08:02:50 -08:00
parent 970d0199c7
commit 1bb1a32ee1
2 changed files with 74 additions and 35 deletions

View File

@ -242,6 +242,15 @@ rules:
replace: '"WB_wombat_location"'
# readspeaker
#=================================================================
- url_prefix: 'com,readspeaker,app)/enterprise/iframeproxy'
fuzzy_lookup:
- readid
- audioformat
# medium
#=================================================================

View File

@ -18,7 +18,7 @@ This file is part of pywb, https://github.com/ikreymer/pywb
*/
//============================================
// Wombat JS-Rewriting Library v2.51
// Wombat JS-Rewriting Library v2.52
//============================================
@ -80,6 +80,8 @@ var _WBWombat = function($wbwindow, wbinfo) {
var wb_info;
var wb_unrewrite_rx;
var wb_wombat_updating = false;
// custom options
@ -1203,6 +1205,24 @@ var _WBWombat = function($wbwindow, wbinfo) {
Object.defineProperty($wbwindow.Date.prototype, "constructor", {value: $wbwindow.Date});
}
//============================================
function init_audio_override() {
if (!$wbwindow.Audio) {
return;
}
var orig_audio = $wbwindow.Audio;
$wbwindow.Audio = (function (Audio) {
return function (url) {
return new Audio(rewrite_url(url));
}
})($wbwindow.Audio);
$wbwindow.Audio.prototype = orig_audio.prototype;
Object.defineProperty($wbwindow.Audio.prototype, "constructor", {value: $wbwindow.Audio});
}
//============================================
function init_web_worker_override() {
if (!$wbwindow.Worker) {
@ -1531,24 +1551,8 @@ var _WBWombat = function($wbwindow, wbinfo) {
var template = inner_doc.head.children[0];
function recurse_rewrite(curr) {
var changed = false;
var children = curr && (curr.children || curr.childNodes);
if (children) {
for (var i = 0; i < children.length; i++) {
if (children[i].nodeType == Node.ELEMENT_NODE) {
changed = rewrite_elem(children[i]) || changed;
changed = recurse_rewrite(children[i]) || changed;
}
}
}
return changed;
}
function get_new_html() {
template._no_rewrite = true;
var new_html = template.innerHTML;
if (check_end_tag) {
@ -1567,7 +1571,7 @@ var _WBWombat = function($wbwindow, wbinfo) {
return new_html;
}
if (recurse_rewrite(template.content)) {
if (recurse_rewrite_elem(template.content)) {
string = get_new_html();
}
@ -1593,9 +1597,13 @@ var _WBWombat = function($wbwindow, wbinfo) {
// if original had <html> tag, add full document HTML
if (string && string.indexOf("<html") >= 0) {
inner_doc.documentElement._no_rewrite = true;
new_html = inner_doc.documentElement.outerHTML;
} else {
// otherwise, just add contents of head and body
inner_doc.head._no_rewrite = true;
inner_doc.body._no_rewrite = true;
new_html = inner_doc.head.innerHTML;
new_html += inner_doc.body.innerHTML;
@ -1848,7 +1856,7 @@ var _WBWombat = function($wbwindow, wbinfo) {
//============================================
function override_html_assign(elemtype, prop) {
function override_html_assign(elemtype, prop, rewrite_getter) {
if (!$wbwindow.DOMParser ||
!elemtype ||
!elemtype.prototype) {
@ -1877,7 +1885,15 @@ var _WBWombat = function($wbwindow, wbinfo) {
orig_setter.call(this, res);
}
def_prop(obj, prop, setter, orig_getter);
var getter = function() {
res = orig_getter.call(this);
if (!this._no_rewrite) {
res = res.replace(wb_unrewrite_rx, "");
}
return res;
}
def_prop(obj, prop, setter, rewrite_getter ? getter : orig_getter);
}
@ -1998,21 +2014,25 @@ var _WBWombat = function($wbwindow, wbinfo) {
}
}
//============================================
/* function rewrite_children(child) {
var desc;
function recurse_rewrite_elem(curr) {
var changed = false;
if (child.querySelectorAll) {
desc = child.querySelectorAll("[href], [src]");
}
var children = curr && (curr.children || curr.childNodes);
if (desc) {
for (var i = 0; i < desc.length; i++) {
rewrite_elem(desc[i]);
if (children) {
for (var i = 0; i < children.length; i++) {
if (children[i].nodeType == Node.ELEMENT_NODE) {
changed = rewrite_elem(children[i]) || changed;
changed = recurse_rewrite_elem(children[i]) || changed;
}
}
}
return changed;
}
*/
//============================================
function init_dom_override() {
@ -2033,6 +2053,8 @@ var _WBWombat = function($wbwindow, wbinfo) {
if (this.tagName == "STYLE") {
child.textContent = rewrite_style(child.textContent);
}
} else if (child.nodeType == Node.DOCUMENT_FRAGMENT_NODE) {
recurse_rewrite_elem(child);
}
}
@ -3048,12 +3070,17 @@ var _WBWombat = function($wbwindow, wbinfo) {
if (!wb_is_proxy) {
init_wombat_top($wbwindow);
if (wb_replay_prefix && wb_replay_prefix.indexOf($wbwindow.__WB_replay_top.location.origin) == 0) {
wb_rel_prefix = wb_replay_prefix.substring($wbwindow.__WB_replay_top.location.origin.length);
var wb_origin = $wbwindow.__WB_replay_top.location.origin;
if (wb_replay_prefix && wb_replay_prefix.indexOf(wb_origin) == 0) {
wb_rel_prefix = wb_replay_prefix.substring(wb_origin.length);
} else {
wb_rel_prefix = wb_replay_prefix;
}
var rx = "(" + wb_origin + ")?" + wb_rel_prefix + "[^/]+/";
wb_unrewrite_rx = new RegExp(rx, "g");
// History
init_history_overrides();
@ -3079,14 +3106,17 @@ var _WBWombat = function($wbwindow, wbinfo) {
init_fetch_rewrite();
init_request_override();
// Audio
init_audio_override();
// Worker override (experimental)
init_web_worker_override();
init_service_worker_override();
// innerHTML can be overriden on prototype!
override_html_assign($wbwindow.HTMLElement, "innerHTML");
override_html_assign($wbwindow.HTMLElement, "outerHTML");
override_html_assign($wbwindow.HTMLIFrameElement, "srcdoc");
override_html_assign($wbwindow.HTMLElement, "innerHTML", true);
override_html_assign($wbwindow.HTMLElement, "outerHTML", true);
override_html_assign($wbwindow.HTMLIFrameElement, "srcdoc", true);
override_html_assign($wbwindow.HTMLStyleElement, "textContent");
// Document.URL override