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

client-side rewrite fixes:

- override Function.apply() to de-proxy thisArg and all params before calling native functions (may make per-function overrides unnecessary)
- ensure init_top_frame_notify() is called on $wbwindow object not window
This commit is contained in:
Ilya Kreymer 2018-02-05 09:38:48 -08:00
parent 728d9b3ca1
commit 448fb2cf1e

View File

@ -2393,6 +2393,36 @@ var _WBWombat = function($wbwindow, wbinfo) {
prototype[method] = deproxy;
}
//============================================
function override_apply_func($wbwindow) {
if ($wbwindow.Function.prototype.__WB_orig_apply) {
return;
}
var orig_func_to_string = Function.prototype.toString;
var orig_apply = $wbwindow.Function.prototype.apply;
$wbwindow.Function.prototype.__WB_orig_apply = orig_apply;
function deproxy(obj, args) {
if (orig_func_to_string.call(this).indexOf("[native code]") >= 0) {
if (args) {
for (var i = 0; i < args.length; i++) {
args[i] = proxy_to_obj(args[i]);
}
}
obj = proxy_to_obj(obj);
}
return this.__WB_orig_apply(obj, args);
}
$wbwindow.Function.prototype.apply = deproxy;
orig_func_to_string.apply = orig_apply;
}
//============================================
function init_open_override()
{
@ -3153,6 +3183,8 @@ var _WBWombat = function($wbwindow, wbinfo) {
override_func_this_proxy_to_obj($wbwindow.EventTarget, "addEventListener");
override_func_this_proxy_to_obj($wbwindow.EventTarget, "removeEventListener");
override_apply_func($wbwindow);
override_frames_access($wbwindow);
// setAttribute
@ -3231,55 +3263,55 @@ var _WBWombat = function($wbwindow, wbinfo) {
}
if (wbinfo.is_framed && wbinfo.mod != "bn_") {
init_frame_notify();
init_top_frame_notify(wbinfo);
}
return obj;
}
function init_frame_notify() {
function init_top_frame_notify(wbinfo) {
function notify_top(event) {
if (!window.__WB_top_frame) {
var hash = window.location.hash;
if (!$wbwindow.__WB_top_frame) {
var hash = $wbwindow.location.hash;
//var loc = window.location.href.replace(window.location.hash, "");
//loc = decodeURI(loc);
//if (wbinfo.top_url && (loc != decodeURI(wbinfo.top_url))) {
// Auto-redirect to top frame
window.location.replace(wbinfo.top_url + hash);
$wbwindow.location.replace(wbinfo.top_url + hash);
//}
return;
}
if (!window.WB_wombat_location) {
if (!$wbwindow.WB_wombat_location) {
return;
}
if (typeof(window.WB_wombat_location.href) != "string") {
if (typeof($wbwindow.WB_wombat_location.href) != "string") {
return;
}
var message = {
"url": window.WB_wombat_location.href,
"url": $wbwindow.WB_wombat_location.href,
"ts": wbinfo.timestamp,
"request_ts": wbinfo.request_ts,
"is_live": wbinfo.is_live,
"title": document ? document.title : "",
"readyState": document.readyState,
"title": $wbwindow.document ? $wbwindow.document.title : "",
"readyState": $wbwindow.document.readyState,
"wb_type": "load"
}
window.__WB_top_frame.postMessage(message, wbinfo.top_host);
$wbwindow.__WB_top_frame.postMessage(message, wbinfo.top_host);
}
if (document.readyState == "complete") {
if ($wbwindow.document.readyState == "complete") {
notify_top();
} else if (window.addEventListener) {
document.addEventListener("readystatechange", notify_top);
} else if (window.attachEvent) {
document.attachEvent("onreadystatechange", notify_top);
} else if ($wbwindow.addEventListener) {
$wbwindow.document.addEventListener("readystatechange", notify_top);
} else if ($wbwindow.attachEvent) {
$wbwindow.document.attachEvent("onreadystatechange", notify_top);
}
}