Расширение Chrome для сбора статистики по использованию localStorage

Работая над расширением для Chrome Local Storage Explorer решил параллельно собрать статистику о хранимых типах данных в localStorage и sessionStorage.

А именно: как часто веб-разработчики используют локальное хранилище для размещения JSON-объектов.

Подразумевается, что информация будет собираться моим браузером на каждом посещенном сайте, в фоне.

Полагаю, информации с пары-сотен доменов будет достаточно.

Быстрее всего выполнить задачу можно написав еще одно простое расширение.

Компоненты расширения

manifest.json

{
  "manifest_version": 2,
  "name": "Collector",
  "version": "1.0.0",
  "content_scripts": [
    {
      "matches": [ "<all_urls>" ],
      "js": [ "content-script.js" ],
      "run_at": "document_idle",
      "all_frames": true
    }
  ],
  "background": {
    "scripts": [ "background.js" ]
  }
}

Согласно манифесту – content-script запускается на каждом табе (<all_urls>) и в каждом фрейме ("all_frames": true).

content-script.js

function processStorage() {
    let lsKeys = Object.keys(localStorage);
    let ssKeys = Object.keys(sessionStorage);
    let report = {
        host: location.hostname,
        storage: []
    };

    lsKeys.forEach(key => {
        report.storage.push({
            type: 'ls',
            key: key,
            json: isJSON(localStorage[key])
        });
    });

    ssKeys.forEach(key => {
        report.storage.push({
            type: 'ss',
            key: key,
            json: isJSON(sessionStorage[key])
        });
    });

    chrome.runtime.sendMessage(report);

    function isJSON(str) {
        try {
            let possibleJSON = JSON.parse(str);

            if (possibleJSON === null) {
                return false;
            }

            return typeof possibleJSON === 'object' 
            && (Object.keys(possibleJSON).length !== 0 
               || possibleJSON.length !== 0);
        } catch (e) {
            return false
        }
    }
}

// Задержка перед запуском обеспечит время 
// для скриптов сайта на внесения изменений в хранилище
setTimeout(processStorage, 500);

Полученную со страницы информацию контент-скрипт отправляет в фоновый процесс (background.js) используя chrome.runtime.sendMessage.

Бэкграунд-скрипт слушает поступающие сообщения и сохраняет отчеты в localStorage.

background.js

chrome.runtime.onMessage.addListener(function (message, sender) {
    if (sender.tab) {
        if (message.host && message.storage && message.storage.length) {
            saveReport(message);
        }
    }
});

function saveReport(message) {
    if (!localStorage.getItem(message.host)) {
        localStorage.setItem(message.host, JSON.stringify(message.storage));

        // Разноцветное консольное сообщение
        const count = message.storage.length;
        console.info(`%cSaved %c${count} %cobjects for %c${message.host}`,
            'color:white',
            'color:#1b1',
            'color:white',
            'color:#bb1');
    }
}

Расширение названо Collector. Оно не опубликовано в следствии простоты и специфичности задачи.