diff --git a/pywb/static/wombat.js b/pywb/static/wombat.js index ef256b2a..1e5f9f4b 100644 --- a/pywb/static/wombat.js +++ b/pywb/static/wombat.js @@ -1564,19 +1564,22 @@ var _WBWombat = function($wbwindow, wbinfo) { var fetch = true; var makeBlob = false; var rwURL; - if (!starts_with(workerUrl, 'blob:')) { + var isBlob = workerUrl.indexOf('blob:') === 0; + var isJSURL = false; + if (!isBlob) { if (starts_with(workerUrl, 'javascript:')) { // JS url, just strip javascript: fetch = false; + isJSURL = true; rwURL = workerUrl.replace('javascript:', ''); } else if (!starts_with(workerUrl, VALID_PREFIXES.concat('/')) && !starts_with(workerUrl, BAD_PREFIXES)) { // super relative url assets/js/xyz.js var rurl = resolve_rel_url(workerUrl, $wbwindow.document); - rwURL = rewrite_url(rurl, false, 'wkr_'); + rwURL = rewrite_url(rurl, false, 'wkr_', $wbwindow.document); } else { // just rewrite it - rwURL = rewrite_url(workerUrl, false, 'wkr_'); + rwURL = rewrite_url(workerUrl, false, 'wkr_', $wbwindow.document); } } else { // blob @@ -1597,10 +1600,19 @@ var _WBWombat = function($wbwindow, wbinfo) { } if (wbinfo.static_prefix || wbinfo.ww_rw_script) { + var originalURL; + if (isBlob || isJSURL) { + originalURL = $wbwindow.document.baseURI; + } else if (workerUrl.indexOf('/') === 0) { + // console.log(workerUrl); + originalURL = resolve_rel_url(extract_orig(workerUrl), $wbwindow.document); + } else { + originalURL = extract_orig(workerUrl); + } // if we are here we can must return blob so set makeBlob to true var ww_rw = wbinfo.ww_rw_script || wbinfo.static_prefix + "ww_rw.js"; var rw = "(function() { " + "self.importScripts('" + ww_rw + "');" + - "new WBWombat({'prefix': '" + wb_abs_prefix + 'wkr_' + "/'}); " + "})();"; + "new WBWombat({'prefix': '" + wb_abs_prefix + 'wkr_' + "/','originalURL':'"+originalURL+"'}); " + "})();"; workerCode = rw + workerCode; makeBlob = true; } diff --git a/pywb/static/ww_rw.js b/pywb/static/ww_rw.js index e9e36d08..08e1ef63 100644 --- a/pywb/static/ww_rw.js +++ b/pywb/static/ww_rw.js @@ -1,13 +1,24 @@ // pywb mini rewriter for injection into web worker scripts function WBWombat(info) { + function maybeResolveURL(origURL) { + try { + var resolved = new URL(origURL, info.originalURL); + return resolved.href; + } catch (e) { + return origURL; + } + } function rewrite_url(url) { + if (url.indexOf('blob:') === 0) return url; + if (url && info.originalURL && url.indexOf('/') === 0) { + url = maybeResolveURL(url); + } if (info.prefix) { return info.prefix + url; - } else { - return url; } + return url; } function init_ajax_rewrite() { @@ -35,8 +46,8 @@ function WBWombat(info) { function rewriteArgs(argsObj) { // recreate the original arguments object just with URLs rewritten - var newArgObj = {length: argsObj.length}; - for (var i = 0; i < argsObj.length; i++) { + var newArgObj = new Array(argsObj.length); + for (var i = 0; i < newArgObj.length; i++) { var arg = argsObj[i]; newArgObj[i] = rewrite_url(arg); } @@ -69,4 +80,3 @@ function WBWombat(info) { }; } } -