Некоторые знают, что я пишу
расширение для любимого Тостера.
В последней версии была добавлена возможность живого обновления ответов на вопрос. Но там есть
баг.
Вот я сейчас пытаюсь его устранить.
По моей задумке, после обновления 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 в репе. Я всю голову сломал.