Расширение OverridePages

Расширение OverridePages переопределяет новую вкладку (Рисунок 4-2). Обратите внимание на подсказку, которая появляется при загрузке данного расширения (Рисунок 4-1). Это браузер Chrome спрашивает подтверждение на переопределение страницы.

Подключаемый сценарий myNewTab_1.js (Листинг 4-5, 4-6) создает список из закладок браузера, которые добавляются в <ul id="list"></ul> список HTML-страницы указанной в листинге 4-4.

Рисунок 4-4. Страница настроек в стиле Google Chrome

Рисунок 4-4. Страница настроек в стиле Google Chrome.
Листинг 4-5. Chapter4/OverridePages/myNewTab_1.js
//region {переменные и функции}
var folders = [];
var listName = "list";
var host = "developer.chrome.com";
var itemBorderRightStyle = "5px solid #666";
var itemBoxShadowStyle = "0px 0px 2px #333";
var itemBackgroundColor = "#ccc";
var storageKey = "APPEND_MATCHING_ONLY";
function appendItem(listElement,nodeURL,nodeParentTitle) {
    var li = document.createElement("li");
    var a = document.createElement("a");
    a.href = nodeURL;
    a.innerText = nodeURL + " (" + nodeParentTitle + ")";
    li.appendChild(a);
    if(nodeURL.indexOf(host) != -1) {
        li.style.borderRight = itemBorderRightStyle;
        li.style.boxShadow = itemBoxShadowStyle;
        li.style.backgroundColor = itemBackgroundColor;
    }
    listElement.appendChild(li);
}
function appendMatchingItem(listElement,nodeURL,nodeParentTitle) {
    if(nodeURL.indexOf(host) != -1) appendItem(listElement,nodeURL,nodeParentTitle);
}
function populateList(listElement) {
    folders.forEach(function(folder) {
        folder.children.forEach(function(bookmarkTreeNode) {
            appendItem(listElement,bookmarkTreeNode.url,folder.title);
        });
    });
}
function populateListV2(listElement) {
    chrome.storage.sync.get(storageKey,function(items) {
        if(!chrome.runtime.lastError && items[storageKey]) {
            olders.forEach(function(folder) {
                folder.children.forEach(function(bookmarkTreeNode) {
                    if(bookmarkTreeNode.url)
                        appendMatchingItem(listElement,bookmarkTreeNode.url,folder.title);
                    });
                });
        } else {
            folders.forEach(function(folder) {
                folder.children.forEach(function(bookmarkTreeNode) {
                    if(bookmarkTreeNode.url)
                        appendItem(listElement,bookmarkTreeNode.url,folder.title);
                });
            });
        }
    });
}
//end-region

Для отображения закладок на новой вкладке используется API chrome.bookmarks. Чтобы получить дерево закладок используется метод chrome.bookmarks.getTree, а для работы с элементами используется объект bookmarks.BookmarkTreeNode.

В листинге 4-6 для доступа к вложенным закладкам используется свойство children.length. Все полученные закладки сохраняются в массив folder.

В листинге 4-5 показаны функции populateList и populateListV2, которые на основе folder создают список закладок для добавления в HTML переопределяемой страницы.

Рисунок 4-5. Страница настроек: вывод логов в консоль

Рисунок 4-5. Страница настроек: вывод логов в консоль.

Расширение OverridePages содержит страницу настроек, где можно указать выводить на новой вкладке все закладки или закладки с определённым хостом.

Для сохранения настроек используется chrome.storage API, а именно метод chrome.storage.sync.set (Листинг 4-3), который сохраняет выбранный ответ да или нет (Рисунок 4-4). Результат работы сохранения показан на рисунке 4-5. Ключ элементу хранения объявлен в листинг 4-3 и 4-5 таким образом: var storageKey = "APPEND_MATCHING_ONLY";

Для получения сохранённой записи в функции populateListV2 вызывается метод chrome.storage.sync.get. Если не возникло ошибок и значение в хранилище равно true вызывается функция appendMatchingItem, а в противном случае вызовется функция appendItem. Отличие данных функций заключается в том, что первая проверяет соответствует ли URL закладки хосту developer.chrome.com. Результат работы расширения показан на рисунке 4-6.

Листинг 4-6. Chapter4/OverridePages/myNewTab_1.js
//region {вычисления}
document.addEventListener("DOMContentLoaded",function(dcle) {
    var listElement = document.getElementById(listName);
    chrome.bookmarks.getTree(function(bookmarkTreeAsArray) {
        var bookmarkTree = bookmarkTreeAsArray[0];
        if(bookmarkTree.children) {
            bookmarkTree.children.forEach(function(node) {
                if(node.children.length > 0) folders.push(node);
            });
        }
        //populateList(listElement);
        populateListV2(listElement);
    });
});
//end-region

Рисунок 4-6. Новая вкладка с закладками

Рисунок 4-6. Новая вкладка с закладками.

results matching ""

    No results matching ""