0

I'm trying to develope a chrome extension for the following task but get stuck: There is a Webpage that updates a Url aperiodically, and I want the extension to check for update regularly in the background and save new Url if updated. The problem is that the Url is generated by a remote javascript on that Webpage's domain in the form like:

<p> Here's the Url:  <script type="text/javascript" src="http://www.****.com/?***=***"></script> </p>

and the script is simply

document.write("the_Url")

I cannot run that javascript in background page due to chrome's security policy so I think I have to open that Webpage and get the Url somehow from there.

So in my background page, I periodically call this

chrome.tabs.create({url:"Webpage_url", active:focusing}, function(tab) {
    chrome.tabs.executeScript(tab.id, {file:"getUrl.js"});
});

and my getUrl.js is like:

$(document).ready(function(){
    var write = document.write;
    //overwrite document.write to save Url
    document.write = function(Url)
    {
       //code here to save Url, for debug I tried just
       console.log(Url);
    }
    //code here to parse html to get js_url: "http://www.****.com/?***=***", no id in original html, but definitely no problem here

    $.getScript(js_url).done(function (s, state)
        {
            //after js run, set document.write back
            document.write = write;
        });
});

I have to do it this way because I cannot get the javascript in plain text by jquery ajax, it gives me: No 'Access-Control-Allow-Origin' header is present.

However using above method I still get warning: "Failed to execute 'write' on 'Document': It isn't possible to write into a document from an asynchronously-loaded external script unless it is explicitly opened." It's like the overwrite of document.write doesn't work, but actually if I put a "document.write("something")" just above the $.getScript part, I can successfully save "something". So it seems like the overwrite just doesn't affect the remote script.

I even tried removing the "document.write = write" redefination but still the same warning.

Anyone knows why? Or any other walkaround to achieve the original task is fine. Thank you.

Z. Zhang
  • 13
  • 2
  • 1
    1. override document.write [in the page context](https://stackoverflow.com/a/9517879) 2. add `runAt: 'document_start` to executeScript params – wOxxOm Nov 21 '17 at 17:46
  • @wOxxOm It works! Thanks very much! I guess a short explanation is $.getScript will get the script and run it in the page context, not in content script's context, even if you call it in a content script. – Z. Zhang Nov 21 '17 at 22:09

0 Answers0