mirror of
https://github.com/webrecorder/pywb.git
synced 2025-03-24 06:59:52 +01:00
wombat update:
- support scheme-relative (//) urls - override dom manipulation (appendChild, insertBefore, replaceChild) - disable Worker() interface for now
This commit is contained in:
parent
2a318527df
commit
c23dd7bda4
@ -52,25 +52,49 @@ WB_wombat_init = (function() {
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
function starts_with(string, prefix) {
|
||||||
|
if (string.indexOf(prefix) == 0) {
|
||||||
|
return prefix;
|
||||||
|
} else {
|
||||||
|
return undefined;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
//============================================
|
//============================================
|
||||||
|
/* function rewrite_url_debug(url) {
|
||||||
|
rewritten = rewrite_url_(url);
|
||||||
|
if (url != rewritten) {
|
||||||
|
console.log('REWRITE: ' + url + ' -> ' + rewritten);
|
||||||
|
} else {
|
||||||
|
console.log('NOT REWRITTEN ' + url);
|
||||||
|
}
|
||||||
|
return rewritten;
|
||||||
|
}
|
||||||
|
*/
|
||||||
function rewrite_url(url) {
|
function rewrite_url(url) {
|
||||||
var http_prefix = "http://";
|
var http_prefix = "http://";
|
||||||
var https_prefix = "https://";
|
var https_prefix = "https://";
|
||||||
|
var rel_prefix = "//";
|
||||||
|
|
||||||
// If not dealing with a string, just return it
|
// If not dealing with a string, just return it
|
||||||
if (!url || (typeof url) != "string") {
|
if (!url || (typeof url) != "string") {
|
||||||
return url;
|
return url;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// ignore anchors
|
||||||
|
if (starts_with(url, "#")) {
|
||||||
|
return url;
|
||||||
|
}
|
||||||
|
|
||||||
// If starts with prefix, no rewriting needed
|
// If starts with prefix, no rewriting needed
|
||||||
// Only check replay prefix (no date) as date may be different for each
|
// Only check replay prefix (no date) as date may be different for each
|
||||||
// capture
|
// capture
|
||||||
if (url.indexOf(wb_replay_prefix) == 0) {
|
if (starts_with(url, wb_replay_prefix)) {
|
||||||
return url;
|
return url;
|
||||||
}
|
}
|
||||||
|
|
||||||
// If server relative url, add prefix and original host
|
// If server relative url, add prefix and original host
|
||||||
if (url.charAt(0) == "/") {
|
if (url.charAt(0) == "/" && !starts_with(url, rel_prefix)) {
|
||||||
|
|
||||||
// Already a relative url, don't make any changes!
|
// Already a relative url, don't make any changes!
|
||||||
if (url.indexOf(wb_capture_date_part) >= 0) {
|
if (url.indexOf(wb_capture_date_part) >= 0) {
|
||||||
@ -81,13 +105,21 @@ WB_wombat_init = (function() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// If full url starting with http://, add prefix
|
// If full url starting with http://, add prefix
|
||||||
if (url.indexOf(http_prefix) == 0 || url.indexOf(https_prefix) == 0) {
|
|
||||||
|
var prefix = starts_with(url, http_prefix) ||
|
||||||
|
starts_with(url, https_prefix) ||
|
||||||
|
starts_with(url, rel_prefix);
|
||||||
|
|
||||||
|
if (prefix) {
|
||||||
|
if (starts_with(url, prefix + window.location.host + '/')) {
|
||||||
|
return url;
|
||||||
|
}
|
||||||
return wb_replay_date_prefix + url;
|
return wb_replay_date_prefix + url;
|
||||||
}
|
}
|
||||||
|
|
||||||
// May or may not be a hostname, call function to determine
|
// May or may not be a hostname, call function to determine
|
||||||
// If it is, add the prefix and make sure port is removed
|
// If it is, add the prefix and make sure port is removed
|
||||||
if (is_host_url(url)) {
|
if (is_host_url(url) && !starts_with(url, window.location.host + '/')) {
|
||||||
return wb_replay_date_prefix + http_prefix + url;
|
return wb_replay_date_prefix + http_prefix + url;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -252,12 +284,73 @@ WB_wombat_init = (function() {
|
|||||||
|
|
||||||
function open_rewritten(method, url, async, user, password) {
|
function open_rewritten(method, url, async, user, password) {
|
||||||
url = rewrite_url(url);
|
url = rewrite_url(url);
|
||||||
|
|
||||||
|
// defaults to true
|
||||||
|
if (async != false) {
|
||||||
|
async = true;
|
||||||
|
}
|
||||||
|
|
||||||
return orig.call(this, method, url, async, user, password);
|
return orig.call(this, method, url, async, user, password);
|
||||||
}
|
}
|
||||||
|
|
||||||
window.XMLHttpRequest.prototype.open = open_rewritten;
|
window.XMLHttpRequest.prototype.open = open_rewritten;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
function init_worker_override() {
|
||||||
|
if (!window.Worker) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
// for now, disabling workers until override of worker content can be supported
|
||||||
|
// hopefully, pages depending on workers will have a fallback
|
||||||
|
window.Worker = undefined;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
function rewrite_attr(elem, name) {
|
||||||
|
if (!elem || !elem.getAttribute) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
value = elem.getAttribute(name);
|
||||||
|
|
||||||
|
if (!value) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (starts_with(value, "javascript:")) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
orig_value = value;
|
||||||
|
value = rewrite_url(value);
|
||||||
|
|
||||||
|
elem.setAttribute(name, value);
|
||||||
|
}
|
||||||
|
|
||||||
|
function init_dom_override() {
|
||||||
|
if (!Element ||
|
||||||
|
!Element.prototype) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
function replace_dom_func(funcname) {
|
||||||
|
|
||||||
|
var orig = Element.prototype[funcname];
|
||||||
|
|
||||||
|
Element.prototype[funcname] = function() {
|
||||||
|
rewrite_attr(arguments[0], "src");
|
||||||
|
rewrite_attr(arguments[0], "href");
|
||||||
|
|
||||||
|
return orig.apply(this, arguments);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
replace_dom_func("appendChild");
|
||||||
|
replace_dom_func("insertBefore");
|
||||||
|
replace_dom_func("replaceChild");
|
||||||
|
}
|
||||||
|
|
||||||
//============================================
|
//============================================
|
||||||
function wombat_init(replay_prefix, capture_date, orig_host, timestamp) {
|
function wombat_init(replay_prefix, capture_date, orig_host, timestamp) {
|
||||||
wb_replay_prefix = replay_prefix;
|
wb_replay_prefix = replay_prefix;
|
||||||
@ -287,6 +380,10 @@ WB_wombat_init = (function() {
|
|||||||
|
|
||||||
// Ajax
|
// Ajax
|
||||||
init_ajax_rewrite();
|
init_ajax_rewrite();
|
||||||
|
init_worker_override();
|
||||||
|
|
||||||
|
// DOM
|
||||||
|
init_dom_override();
|
||||||
|
|
||||||
// Random
|
// Random
|
||||||
init_seeded_random(timestamp);
|
init_seeded_random(timestamp);
|
||||||
|
Loading…
x
Reference in New Issue
Block a user