使用JavaScript擦除/重置DOM和全局变量

时间:2017-01-23 18:06:45

标签: javascript html5 google-chrome-extension webview electron

我正在编写一个电子应用程序,但这是一个关于JavaScript / HTML5的问题。我想在webview中加载本地内容,然后从其中的特定远程资源打开iframe。不幸的是,由于X-FRAME options,我无法做到。所以我来了一个解决方法。我们的想法是加载远程内容,擦除dom并使用自定义文件协议注入我自己的本地内容以嵌入本地资源。

基本上我想完全删除所有内容,无论加载到webview中的是什么。我用document.write()删除了dom部分。但是,如何取消设置该页面可能设置的所有变量?或者我可以首先阻止文档被写入?或者,有什么更好,更少的hacky方式来做我想做的事情?这是我当前删除dom的代码:

它从preload脚本开始运行,之前是其他任何东西:

(function() {

var originalProperties =  Object.getOwnPropertyNames(window); //global variables, before dom is loaded

var injectDOM = function() {

    document.removeEventListener('DOMContentLoaded', injectDOM);

    //trying to erase global variables set by remote resource, if any. Is there a better way?

    var newProperties = Object.getOwnPropertyNames(window);

    var difference = newProperties.filter(x => originalProperties.indexOf(x) == -1);

    for (i = 0; i < newVariables.length; i++) {

        if (window.hasOwnProperty(newVariables[i])) {
            window[newVariables[i]] = null;
            delete window[newVariables[i]]
            //some variables still stay, delete return false, however they are nulled
            //but is there a better way to do that and what about possible attached event listeners?
        }

    }

    var html = '';

    html += '<!-- automagically injected-->';
    html += '<!DOCTYPE html>';
    html += '<html>';
    html += '<head>';
    //html += '<script>alert("test");</script>';
    html += '</head>';
    html += '<body>';
    html += 'hello world';
    html += '</body>';
    html += '</html'>;

    document.write(html);

}

document.addEventListener('DOMContentLoaded', injectDOM);

我还尝试在加载dom之前和之后比较Object.getOwnPropertyNames(window),但有些东西告诉我它不是最好的方法。

更新:我设法通过@ wOxxOm的帮助更加优雅地解决问题。我在最初的github问题https://github.com/electron/electron/issues/5036

中发布了我的解决方案

0 个答案:

没有答案