tabs.executeScript() not injecting script in content page of extension

I am just starting to learn how to create my own addon in firefox. I'm using webExtensions, although I'm finding it hard to get comprehensive documentation (I think because it's still a new implementation?). The code all seems to work fine, and it completes an 'onExecuted' function after the executeScript call. But my injected script (output.js) doesn't seem to fire. After running the code I get the following error in the javascript console: "No matching message handler". I wasn't sure whether the injected script is supposed to be a self contained js file, or if it is just a collection of js commands. I tried the latter too (just a simple message box), and that didn't work either.

I should add that I've got noscript addon, so have tried this with "allow scripts globally" and it still gives the same error.
Cheers for any help.

edit: I tried replacing the

file: "popup/output.js",

in the executeScript method with

code: 'alert("hello");',

and it still didn't work.

Information moved from Answer posted by OP:

Bump. I tried this code out on another box with ff50.something (beta channel), and the injection doesn't even make 'onExecuted'. But it doesn't throw any errors. Basically the popup works, and then nothing happens after that.

Problem "executeScript does not inject script"

You can only inject code into pages whose URL can be expressed using a
match pattern: meaning, its scheme must be one of "http", "https",
"file", "ftp". This means that you can't inject code into any of the
browser's built-in pages, such as about:debugging, about:addons, or
the page that opens when you open a new empty tab.

So, you cannot use tabs.executeScript() to inject scripts into content loaded from your own extensions. The example works when I replace loading a page from the extension with loading a page from the web:

When you want to execute code in the page loaded from your extension, there are two possibilities:

Execute the JavaScript directly by loading a script file in your content page

If you need to pass parameters to the script inside the loaded content page, you can send messages between the script that opens the tab and the script inside the opened tab. See chapter "Communicating with background scripts" on Content Scripts documentation.

Problem "JavaScript code in popup is not executed"

On your friend's setup you run into a different problem: By default, you are not allowed to use inline scripts in content pages in web extensions in Firefox. You should see that in the browser console you get the error

Content Security Policy: The page's settings blocked the loading of a
resource at self

So, instead of using an inline "onclick" with the save button, assign the onclick event dynamically from your JavaScript script. How to change the popup.html: