Search code examples
javascriptsafari-extensionxmlhttprequest

Coding with XMLHttpRequest for Safari Extension


In my extension, I create Access Level as "All" as well as I add whitelists as http://*/* too for every domain.

And I have following code in my JS file (which run as end script):

var feedbackmsg = "message goes here";  
var xmlhttp = new XMLHttpRequest();

xmlhttp.open('POST', 'http://mysitename.com/feedback.php', true);
xmlhttp.onreadystatechange = handleServerResponse;
xmlhttp.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
xmlhttp.send("html=" + feedbackmsg);

function handleServerResponse() {    
    if (xmlhttp.readyState == 4) {
        alert(xmlhttp.getAllResponseHeaders());
        if (xmlhttp.status == 200) {
            alert("send");
        } else {
            alert("error");
        }
    } 
}

Whenever I run it, I am getting no header respond in alert box as well as error alert message. How can I resolve the problem?


Solution

  • Whether or not it's an extension, XMLHttpRequest (if injected into a page) isn't allowed to access anything outside the page's current domain, I think. The console just says that the request was cancelled. At least, that was the case for me when I tested it just now. (I didn't have any urls in the whitelist or blacklist when I tested, but the Access option was set to "all".)

    You can try going to the same domain as the one you want to "call" with the XHR object in your code, and see if it succeeds then. If it does, you'll know it's because the domain of the page and the XHR request must match.

    However, it appears you can do cross-site ajax request from the extension's global page (oddly enough). At least it seemed to work for me just now. That's actually a little scary (I'd prefer it to be more difficult to call up a random server from an extension) but it worked.

    Don't know if that helps you out, though.