Search code examples
google-chromegoogle-chrome-extension

Chrome extension options.js notify content_script.js of settings change


What is the proper way to notify my content_script.js of a settings change?

When I write my setting to localStorage I want to do a sendMessage/sendRequest to the content script so it can apply them accordingly.

I would have to have to do options.js > background.js > content_script.js

Thoughts?

options.js

$('#add-filter-button')
    .button()
    .click(function(event) {
        event.preventDefault();
        var userFilters = new Array();
        var newFilter = $('#add-filter').val();
        if (newFilter !== undefined && newFilter.length > 0) {
            $('#filters-box').append(new Option(newFilter, newFilter));
            $('#add-filter').val('');
            $('#filters-box option').each(function() {
                userFilters.push( $(this).text() );
            });
            localStorage['userFilters'] = JSON.stringify(userFilters);
            chrome.storage.sync.set({'userFilters': userFilters});
        }
    });

content.js

chrome.storage.onChanged.addListener(function(changes, namespace) {
    for (key in changes) {
        var storageChange = changes[key];
        console.log('Storage key "%s" in namespace "%s" changed. ' +
            'Old value was "%s", new value is "%s".',
            key,
            namespace,
            storageChange.oldValue,
            storageChange.newValue);
        }
});

Solution

  • Use chrome.storage API https://developer.chrome.com/docs/extensions/reference/storage/#event-onChanged

    It has an event onChanged

    For example:

    settings.js

    chrome.storage.local.set({'value': theValue});
    

    content.js

    chrome.storage.onChanged.addListener(function(changes, namespace) {
      for (key in changes) {
        var storageChange = changes[key];
        console.log('Storage key "%s" in namespace "%s" changed. ' +
                    'Old value was "%s", new value is "%s".',
                    key,
                    namespace,
                    storageChange.oldValue,
                    storageChange.newValue);
      }
    });