5

I'm trying to execute custom JS code from a Firefox extension using:

function executeJS(document, script) {
    var script = document.createElement('script');
    script.setAttribute('type', 'text/javascript');
    script.appendChild(document.createTextNode(script));
    document.getElementsByTagName('head')[0].appendChild(script);
}

The method call looks like:

executeJS(content.document, "$('#" + this.id + "').jixedbar({showOnTop:true});");

And this is the result that I get:

<script type="text/javascript">
    [object XPCNativeWrapper [object HTMLScriptElement]]
</script>

What's wrong with my code? What's the proper way of execution arbitrary JS script from Firefox extension?

1 Answer 1

3

I'm not sure about FF extensions, but in "normal" JS-land, there's no need for the createTextNode business. Outside of FF extensions, you can use Node.textContent — though maybe it's different with the XPCNativeWrapper types.

script.textContent = 'var foo = 1; alert(foo);'

I think the main problem, however, is that you've also got a variable and a parameter both named script. Try this:

function executeJS(document, scriptContent) {
    var script = document.createElement('script');
    script.appendChild(document.createTextNode(scriptContent));
    document.head.appendChild(script);
}

The type attribute really is not necessary, BTW.


I just came across this page, which looks like it could be what you're looking for:

const XUL = Namespace("xul", "http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul");

function injectScript(name) {
    // Get the current filename
    let file = Components.stack.filename;
    // Strip off any prefixes added by the sub-script loader
    // and the trailing filename
    let directory = file.replace(/.* -> |[^\/]+$/g, "");

    // Create the script node
    let script = document.createElementNS(XUL, "script");
    script.setAttribute("type", "application/javascript;version=1.8");
    script.setAttribute("src", directory + name);

    // Inject it into the top-level element of the document
    document.documentElement.appendChild(script);
}

// Inject the script
injectScript("script.js");
Sign up to request clarification or add additional context in comments.

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.