diff --git a/pywb/rewrite/content_rewriter.py b/pywb/rewrite/content_rewriter.py index 6c917698..680db354 100644 --- a/pywb/rewrite/content_rewriter.py +++ b/pywb/rewrite/content_rewriter.py @@ -233,7 +233,7 @@ class StreamingRewriter(object): def rewrite(self, string): return string - def rewrite_complete(self, string): + def rewrite_complete(self, string, **kwargs): return self.first_buff + self.rewrite(string) + self.final_read() def final_read(self): diff --git a/pywb/rewrite/html_rewriter.py b/pywb/rewrite/html_rewriter.py index 6c6d0513..d92e2ef9 100644 --- a/pywb/rewrite/html_rewriter.py +++ b/pywb/rewrite/html_rewriter.py @@ -248,12 +248,13 @@ class HTMLRewriterMixin(StreamingRewriter): else: return '' - def _rewrite_script(self, script_content, ensure_window=False): + def _rewrite_script(self, script_content, inline_attr=False): if not script_content: return '' - content = self.js_rewriter.rewrite_complete(script_content) - if ensure_window: + content = self.js_rewriter.rewrite_complete(script_content, + inline_attr=inline_attr) + if inline_attr: content = self.ADD_WINDOW.sub('window.\\1', content) return content diff --git a/pywb/rewrite/regex_rewriters.py b/pywb/rewrite/regex_rewriters.py index cfb7b1db..1630c5cc 100644 --- a/pywb/rewrite/regex_rewriters.py +++ b/pywb/rewrite/regex_rewriters.py @@ -162,7 +162,7 @@ class JSWombatProxyRewriterMixin(object): local_init_func = '\nvar {0} = function(name) {{\ return (self._wb_wombat && self._wb_wombat.local_init &&\ - self._wb_wombat.local_init(name)) || self[name]; }}\n\ + self._wb_wombat.local_init(name)) || self[name]; }};\n\ if (!self.__WB_pmw) {{ self.__WB_pmw = function(obj) {{ return obj; }} }}\n\ {{\n' @@ -191,7 +191,7 @@ if (!self.__WB_pmw) {{ self.__WB_pmw = function(obj) {{ return obj; }} }}\n\ rules = rules + [ (r'(?<=\.)postMessage\b\(', self.add_prefix('__WB_pmw(self).'), 0), - #(r'Function\(["\']return this["\']\)', self.fixed(func_rw), 0), + (r'(?>> parse('Text') Text +# parse attr with js proxy, wrap script, prepend WB_wombat_ for location assignment +>>> parse('', js_proxy=True) + + +# parse attr with js proxy, wrap script, no WB_wombat_ needed +>>> parse('', js_proxy=True) + + +# parse attr with js proxy, no rewrite needed +>>> parse('', js_proxy=True) + @@ -321,6 +332,7 @@ r""" from pywb.rewrite.url_rewriter import UrlRewriter from pywb.rewrite.html_rewriter import HTMLRewriter +from pywb.rewrite.regex_rewriters import JSWombatProxyRewriter import pprint import six @@ -341,11 +353,23 @@ urlrewriter_pencode = new_rewriter(rewrite_opts=dict(punycode_links=True)) no_base_canon_rewriter = new_rewriter(rewrite_opts=dict(rewrite_rel_canon=False, rewrite_base=False)) -def parse(data, head_insert=None, urlrewriter=urlrewriter, parse_comments=False): +def parse(data, head_insert=None, urlrewriter=urlrewriter, parse_comments=False, + js_proxy=False): + + if js_proxy: + js_rewriter_class = JSWombatProxyRewriter + else: + js_rewriter_class = None + parser = HTMLRewriter(urlrewriter, head_insert=head_insert, url=ORIGINAL_URL, + js_rewriter_class=js_rewriter_class, parse_comments=parse_comments) + if js_proxy: + parser.js_rewriter.first_buff = '{ ' + parser.js_rewriter.last_buff = ' }' + if six.PY2 and isinstance(data, six.text_type): data = data.encode('utf-8') diff --git a/pywb/static/wombat.js b/pywb/static/wombat.js index 7391ac0f..fffd4a9a 100644 --- a/pywb/static/wombat.js +++ b/pywb/static/wombat.js @@ -1308,6 +1308,12 @@ var _WBWombat = function($wbwindow, wbinfo) { return false; } + var text = elem.textContent.trim(); + + if (!text || text.indexOf("<") == 0) { + return false; + } + var override_props = ["window", "self", "document", @@ -1317,6 +1323,19 @@ var _WBWombat = function($wbwindow, wbinfo) { "frames", "opener"]; + var contains_props = false; + + for (var i = 0; i < override_props.length; i++) { + if (text.indexOf(override_props[i]) >= 0) { + contains_props = true; + break; + } + } + + if (!contains_props) { + return false; + } + var insert_str = 'var _____WB$wombat$assign$function_____ = function(name) {return (self._wb_wombat && self._wb_wombat.local_init && self._wb_wombat.local_init(name)) || self[name]; }\n' + 'if (!self.__WB_pmw) { self.__WB_pmw = function(obj) { return obj; } }\n' + @@ -1324,7 +1343,7 @@ var _WBWombat = function($wbwindow, wbinfo) { var prop; - for (var i = 0; i < override_props.length; i++) { + for (i = 0; i < override_props.length; i++) { prop = override_props[i]; insert_str += 'let ' + prop + ' = _____WB$wombat$assign$function_____("' + prop + '");\n'; }