Kobi
Kobi

Reputation: 137997

How to get selected text using the Firefox Add-On SDK?

I'm trying to create a Firefox add-on using the online Add-On SDK.

I'm starting with something simple - I want to add a toolbar button that reads the current selected text.

The documentation for the Selection object makes this looks simple enough:

var selection = require("selection");
if (selection.text)
  console.log(selection.text);

This doesn't seem to work for me, I just get null.

Here's my complete code:

var selection = require("selection");

require("widget").Widget({
    id: "widgetID1",
    label: "Test Mozilla Widget",
    contentURL: "http://www.mozilla.org/favicon.ico",
    onClick: function(event) {
        console.log('selection.text = ' + selection.text);
    }
});

I've also tried to create the selection object inside the onClick even, with the same effect.
I am able to use the select event to get notified on new selections, so I guess I can use that instead (and keep the value), but I wonder why the above code isn't working... What am I doing wrong?

Upvotes: 3

Views: 1879

Answers (2)

Srijan Choudhary
Srijan Choudhary

Reputation: 480

The selection variable as defined will only have the selected text as long as it is in focus. Clicking on the widget icon takes focus away from the selected text, so it sees no text selected.

Thats why it works when used inside the listener function.

To confirm this, I tried logging its value when a toolbar button is pressed (using the toolbarbutton module), and it works. Pressing a toolbar button (presumably) does not steal focus.

Here's the code, and you can test it online too:

var selection = require("selection");

var tbb = require("toolbarbutton").ToolbarButton({
    id: "test",
    label: "test",
    image: "http://www.mozilla.org/favicon.ico",
    onCommand: function(event) {
      console.log('selection = ' + JSON.stringify(selection)); // works!
    }
});

Upvotes: 8

Kobi
Kobi

Reputation: 137997

Here is a solution using the select event:

var selection = require("selection");

var selectedText = '';

function selectionChanged(event){
    //todo: check for selection.isContiguous
    selectedText = selection.text;
}

selection.on('select', selectionChanged);

require("widget").Widget({
    id: "widgetID1",
    label: "Test Mozilla Widget",
    contentURL: "http://www.mozilla.org/favicon.ico",
    onClick: function(event) {
        console.log('Selection: ' + selectedText);
    }
});

Upvotes: 2

Related Questions