覆盖XMLHttpRequest的open / send方法

时间:2014-07-02 13:22:40

标签: javascript xmlhttprequest crossrider

我正在尝试捕获从Gmail发送的每个XHR请求,并在邮件正文中添加一个分类标签。我没有发送新的XHR请求。通过重写XMLHttpRequest的open / send函数,我的代码就像过滤所有XHR请求一样工作。我上周正在研究这个问题。请帮助我。

function sendEmail() {
    //alert("In sendEmail()");
    var overrideMethods = function() {
        //alert("In overrideMethods()");

        window.XMLHttpRequest.prototype._open = XMLHttpRequest.prototype.open;

        XMLHttpRequest.prototype.open = function (method, url, async, user, password) {
            this.openParams = {
                url: url
            };
            return window.XMLHttpRequest.prototype._open.apply(this, arguments);
        };

        window.XMLHttpRequest.prototype._send = XMLHttpRequest.prototype.send;

        window.XMLHttpRequest.prototype.send = function send() {
            var defered = false;
            var searchPattern = /(&selectedLable=|^selectedLable=)(.*?)&/;

            alert("In send()");
            if (typeof arguments[0] === "string" && arguments.length === 1) {
                var str = arguments[0];
                //alert("Inside of first if");
                //alert("str : " + str);
                if (this.openParams.url.match(/&act\=sm/) && str.match(/&bcc\=/) && str.match(searchPattern)) {
                    defered = true;

                    var sendData = (str.match(searchPattern) && str.match(searchPattern)[2]);
                    var tag = JSON.parse(decodeURIComponent(sendData)).tag;

                    alert("tag : " + tag);
                    /* Modify the POST url to reflect the tag */
                    str = str.replace(searchPattern, "");
                    str = str.replace(/&subject=/, "&subject=" + tag + ": ");
                    str = str.replace(/&body\=/, "&body=<br>" + tag.toLowerCase() + "<br>");

                    /* Capitalize the tag. */
                    arguments[0] = str + "&acn=!" + tag.charAt(0).toUpperCase() + tag.slice(1).toLowerCase();

                    window.XMLHttpRequest.prototype._send.apply(this, arguments);
                }
            } 

            if (!defered) { 
                window.XMLHttpRequest.prototype._send.apply(this, arguments);
            }
        };
    }
    window.location.href = 'javascript: (' + overrideMethods.toString().replace(/(\n|\ {2,})/gm, '') + ')();';
}

sendEmail();

我在堆栈溢出时发现了这个链接: Overriding XMLHttpRequest's send method

请注意我的方法适用于本机chrome扩展,但它不适用于crossrider扩展。

0 个答案:

没有答案