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

wombat fixes: message listener fixes for multiple listeners

- don't reject multiple listeners
- create new WrappedListener() obj for each listener
- extract_orig() add current scheme if url starts with '//'
This commit is contained in:
Ilya Kreymer 2017-03-15 11:14:04 -07:00
parent 93f26452e5
commit 1344907032

View File

@ -18,7 +18,7 @@ This file is part of pywb, https://github.com/ikreymer/pywb
*/ */
//============================================ //============================================
// Wombat JS-Rewriting Library v2.21 // Wombat JS-Rewriting Library v2.25
//============================================ //============================================
@ -359,6 +359,10 @@ var _WBWombat = function($wbwindow, wbinfo) {
href = href.substr(wb_orig_origin.length); href = href.substr(wb_orig_origin.length);
} }
if (starts_with(href, REL_PREFIX)) {
href = wb_info.wombat_scheme + href;
}
return href; return href;
} }
@ -896,7 +900,7 @@ var _WBWombat = function($wbwindow, wbinfo) {
if (orig_getter) { if (orig_getter) {
var new_getter = function() { var new_getter = function() {
var res = orig_getter.call(this); var res = orig_getter.call(this);
return extract_orig(res, true); return extract_orig(res);
} }
def_prop(proto, prop, undefined, new_getter); def_prop(proto, prop, undefined, new_getter);
@ -1949,51 +1953,46 @@ var _WBWombat = function($wbwindow, wbinfo) {
$wbwindow.Window.prototype.postMessage = postmessage_rewritten; $wbwindow.Window.prototype.postMessage = postmessage_rewritten;
/* function WrappedListener(orig_listener, win) {
for (var i = 0; i < $wbwindow.frames.length; i++) {
try {
//init_postmessage_override($wbwindow.frames[i]);
$wbwindow.frames[i].postMessage = postmessage_rewritten;
} catch (e) {
console.log(e);
}
}
*/
function WrappedListener(event, orig_listener, win) {
var ne = event;
if (event.data.from && event.data.message) { function listen(event) {
var ne = event;
if (event.data.to_host != "*" && win.WB_wombat_location && event.data.to_host != win.WB_wombat_location.host) { if (event.data.from && event.data.message) {
console.log("Skipping " + win.WB_wombat_location.host + " not " + event.data.to_host);
return; if (event.data.to_host != "*" && win.WB_wombat_location && event.data.to_host != win.WB_wombat_location.host) {
console.log("Skipping " + win.WB_wombat_location.host + " not " + event.data.to_host);
return;
}
var source = event.source;
if (event.data.from_top) {
source = win.__WB_top_frame;
} else if (event.data.src_id && win.__WB_win_id && win.__WB_win_id[event.data.src_id]) {
source = win.__WB_win_id[event.data.src_id];
}
ne = new MessageEvent("message",
{"bubbles": event.bubbles,
"cancelable": event.cancelable,
"data": event.data.message,
"origin": event.data.from,
"lastEventId": event.lastEventId,
"source": source,
"ports": event.ports});
ne._target = event.target;
ne._srcElement = event.srcElement;
ne._currentTarget = event.currentTarget;
ne._eventPhase = event.eventPhase;
ne._path = event.path;
} }
var source = event.source; return orig_listener(ne);
if (event.data.from_top) {
source = win.__WB_top_frame;
} else if (event.data.src_id && win.__WB_win_id && win.__WB_win_id[event.data.src_id]) {
source = win.__WB_win_id[event.data.src_id];
}
ne = new MessageEvent("message",
{"bubbles": event.bubbles,
"cancelable": event.cancelable,
"data": event.data.message,
"origin": event.data.from,
"lastEventId": event.lastEventId,
"source": source,
"ports": event.ports});
ne._target = event.target;
ne._srcElement = event.srcElement;
ne._currentTarget = event.currentTarget;
ne._eventPhase = event.eventPhase;
ne._path = event.path;
} }
return orig_listener(ne); return {"listen": listen};
} }
var listen_map = {}; var listen_map = {};
@ -2006,18 +2005,17 @@ var _WBWombat = function($wbwindow, wbinfo) {
var addEventListener_rewritten = function(type, listener, useCapture) { var addEventListener_rewritten = function(type, listener, useCapture) {
if (type == "message") { if (type == "message") {
var win = this; var wrapped_listener = new WrappedListener(listener, this);
var wrapped_listener = function(event) { return WrappedListener(event, listener, win); }
if (listen_map[listener]) { //if (listen_map[listener]) {
//console.log("Listener Already Added"); //console.log("Listener Already Added");
//_orig_removeEventListener.call(this, type, listen_map[listener], useCapture); //_orig_removeEventListener.call(this, type, listen_map[listener], useCapture);
return; //return;
} //}
listen_map[listener] = wrapped_listener; listen_map[listener] = wrapped_listener;
return _orig_addEventListener.call(this, type, wrapped_listener, useCapture); return _orig_addEventListener.call(this, type, wrapped_listener.listen, useCapture);
} else { } else {
return _orig_addEventListener.call(this, type, listener, useCapture); return _orig_addEventListener.call(this, type, listener, useCapture);
} }
@ -2029,10 +2027,10 @@ var _WBWombat = function($wbwindow, wbinfo) {
var removeEventListener_rewritten = function(type, listener, useCapture) { var removeEventListener_rewritten = function(type, listener, useCapture) {
if (type == "message") { if (type == "message") {
var mapped = listen_map[listener]; var wrapped_listener = listen_map[listener];
if (mapped) { if (wrapped_listener) {
delete listen_map[listener]; delete listen_map[listener];
return _orig_removeEventListener.call(this, type, mapped, useCapture); return _orig_removeEventListener.call(this, type, wrapped_listener.listen, useCapture);
} }
} else { } else {
return _orig_removeEventListener.call(this, type, listener, useCapture); return _orig_removeEventListener.call(this, type, listener, useCapture);