Задать вопрос
yarkov
@yarkov
Помог ответ? Отметь решением.

Куда течет память?

Некоторые знают, что я пишу расширение для любимого Тостера.
В последней версии была добавлена возможность живого обновления ответов на вопрос. Но там есть баг.
Вот я сейчас пытаюсь его устранить.
По моей задумке, после обновления DOM, надо инициировать функцию подсветки (подсмотрено в исходниках Тостера). Ну не дергать же setInterval-ом? Решено использовать MutationObserver.
Ниже рабочий код скрипта, который подключается к странице, если мы находимся на странице вопроса.
if ( window.location.pathname.startsWith( '/q/' ) ) {
    const listeners = [];
    const MutationObserver = window.MutationObserver || window.WebKitMutationObserver;
    let observer;

    const checkSelector = ( selector, fn ) => {
        const elements = document.querySelectorAll( selector );
        for ( let i = 0; i < elements.length; i++ ) {
            const element = elements[ i ];
            if ( !element.ready ) {
                element.ready = true;
                fn.call( element, element );
            }
        }
    };

    const checkListeners = () => {
        for ( let i = 0; i < listeners.length; i++ ) {
            const listener = listeners[ i ];
            checkSelector( listener.selector, listener.fn );
        }
    };

    const ready = ( selector, fn ) => {
        listeners.push( {
            selector: selector,
            fn: fn
        } );
        if ( !observer ) {
            observer = new MutationObserver( checkListeners );
            observer.observe( document.documentElement, {
                childList: true,
                subtree: true
            } );
        }
        checkSelector( selector, fn );
    };

    ready( '#question_show code', ( element ) => {
        if ( window.hljs ) {
            window.hljs.highlightBlock( element );
        }
    } );
}

Внимание! Сам вопрос: куда, нахрен, утекает память?
Если в Chrome нажать Shift+Esc, то видим потребляемую вкладками память. Так вот если активировать опцию живого обновления ответов, то память течет примерно со скоростью 1Мб в 2-3 секунды.
Если этот скрипт не подключать, то подсветка сбивается, но и память не течет.

P.S. Я в отчаянии...
P.P.S. Посмотрите, пожалуйста, ветку dev в репе. Я всю голову сломал.
  • Вопрос задан
  • 271 просмотр
Подписаться 2 Оценить Комментировать
Пригласить эксперта
Ответы на вопрос 1
Может дело в fn.call(element, element)? Попробуйте call(null, element), вам контекст не нужен же
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы