Cache processing of all Tweet timeline item handling

This commit is contained in:
Jonny Buchanan 2025-06-14 15:41:08 +10:00
parent 33fb01ff22
commit c6ce159f34
2 changed files with 21 additions and 11 deletions

View File

@ -2782,7 +2782,7 @@ async function observeDesktopModalTimeline($popup) {
function observeModalTimelineItems($timeline) { function observeModalTimelineItems($timeline) {
let seen = new Map() let seen = new Map()
observeElement($timeline, () => { observeElement($timeline, () => {
onIndividualTweetTimelineChange($timeline, {observers: modalObservers, seen}) onIndividualTweetTimelineChange($timeline, seen, {observers: modalObservers})
}, { }, {
name: 'modal timeline', name: 'modal timeline',
observers: modalObservers, observers: modalObservers,
@ -2796,7 +2796,7 @@ async function observeDesktopModalTimeline($popup) {
log('modal timeline replaced') log('modal timeline replaced')
seen = new Map() seen = new Map()
observeElement($newTimeline, () => { observeElement($newTimeline, () => {
onIndividualTweetTimelineChange($newTimeline, {observers: modalObservers, seen}) onIndividualTweetTimelineChange($newTimeline, seen, {observers: modalObservers})
}, { }, {
name: 'modal timeline', name: 'modal timeline',
observers: modalObservers, observers: modalObservers,
@ -3101,7 +3101,7 @@ async function observeIndividualTweetTimeline(page) {
function observeTimelineItems($timeline) { function observeTimelineItems($timeline) {
let seen = new WeakMap() let seen = new WeakMap()
observeElement($timeline, () => { observeElement($timeline, () => {
onIndividualTweetTimelineChange($timeline, {observers: pageObservers, seen}) onIndividualTweetTimelineChange($timeline, seen, {observers: pageObservers})
}, { }, {
leading: true, leading: true,
name: 'individual tweet timeline', name: 'individual tweet timeline',
@ -3335,8 +3335,9 @@ async function observeTimeline(page, options = {}) {
* @param {HTMLElement} $timeline * @param {HTMLElement} $timeline
*/ */
function observeTimelineItems($timeline) { function observeTimelineItems($timeline) {
let seen = new WeakMap()
observeElement($timeline, () => { observeElement($timeline, () => {
onTimelineChange($timeline, page, options) onTimelineChange($timeline, page, seen, options)
}, { }, {
leading: true, leading: true,
name: 'timeline', name: 'timeline',
@ -3353,8 +3354,9 @@ async function observeTimeline(page, options = {}) {
let $newTimeline = $addedNode let $newTimeline = $addedNode
log('tab changed') log('tab changed')
onTabChanged?.() onTabChanged?.()
seen = new WeakMap()
observeElement($newTimeline, () => { observeElement($newTimeline, () => {
onTimelineChange($newTimeline, page, options) onTimelineChange($newTimeline, page, seen, options)
}, { }, {
leading: true, leading: true,
name: 'timeline', name: 'timeline',
@ -5242,12 +5244,12 @@ function isReplyToPreviousTweet($tweet) {
/** /**
* @param {HTMLElement} $timeline * @param {HTMLElement} $timeline
* @param {WeakMap<Element, import("./types").SeenTweetDetails>} seen
* @param {import("./types").IndividualTweetTimelineOptions} options * @param {import("./types").IndividualTweetTimelineOptions} options
*/ */
function onIndividualTweetTimelineChange($timeline, options) { function onIndividualTweetTimelineChange($timeline, seen, options) {
let startTime = Date.now() let startTime = Date.now()
let {seen} = options
let itemTypes = {} let itemTypes = {}
let hiddenItemCount = 0 let hiddenItemCount = 0
let hiddenItemTypes = {} let hiddenItemTypes = {}
@ -5535,9 +5537,10 @@ function onPopup($popup) {
/** /**
* @param {HTMLElement} $timeline * @param {HTMLElement} $timeline
* @param {string} page * @param {string} page
* @param {WeakMap<Element, import("./types").SeenTweetDetails>} seen
* @param {import("./types").TimelineOptions?} options * @param {import("./types").TimelineOptions?} options
*/ */
function onTimelineChange($timeline, page, options = {}) { function onTimelineChange($timeline, page, seen, options = {}) {
let startTime = Date.now() let startTime = Date.now()
let {classifyTweets = true, hideHeadings = true, isUserTimeline = false} = options let {classifyTweets = true, hideHeadings = true, isUserTimeline = false} = options
@ -5559,6 +5562,7 @@ function onTimelineChange($timeline, page, options = {}) {
let itemTypes = {} let itemTypes = {}
let hiddenItemCount = 0 let hiddenItemCount = 0
let hiddenItemTypes = {} let hiddenItemTypes = {}
let processedCount = 0
/** @type {?boolean} */ /** @type {?boolean} */
let hidPreviousItem = null let hidPreviousItem = null
@ -5566,6 +5570,11 @@ function onTimelineChange($timeline, page, options = {}) {
let changes = [] let changes = []
for (let $item of $timeline.children) { for (let $item of $timeline.children) {
if (seen.has($item)) {
hidPreviousItem = seen.get($item).hidden
continue
}
/** @type {?import("./types").TimelineItemType} */ /** @type {?import("./types").TimelineItemType} */
let itemType = null let itemType = null
/** @type {?boolean} */ /** @type {?boolean} */
@ -5693,6 +5702,8 @@ function onTimelineChange($timeline, page, options = {}) {
} }
hidPreviousItem = hideItem hidPreviousItem = hideItem
seen.set($item, {itemType, hidden: hideItem})
processedCount++
} }
for (let change of changes) { for (let change of changes) {
@ -5701,7 +5712,7 @@ function onTimelineChange($timeline, page, options = {}) {
if (debug && debugLogTimelineStats) { if (debug && debugLogTimelineStats) {
log( log(
`processed ${$timeline.children.length} timeline item${s($timeline.children.length)} in ${Date.now() - startTime}ms`, `processed ${processedCount} new timeline item${s(processedCount)} in ${Date.now() - startTime}ms`,
itemTypes, `hid ${hiddenItemCount}`, hiddenItemTypes itemTypes, `hid ${hiddenItemCount}`, hiddenItemTypes
) )
} }

3
types.d.ts vendored
View File

@ -214,10 +214,9 @@ export type TimelineOptions = {
export type IndividualTweetTimelineOptions = { export type IndividualTweetTimelineOptions = {
observers: Map<string, Disconnectable> observers: Map<string, Disconnectable>
seen: WeakMap<Element, IndividualTweetDetails>
} }
export type IndividualTweetDetails = { export type SeenTweetDetails = {
itemType: TimelineItemType, itemType: TimelineItemType,
hidden: boolean | null, hidden: boolean | null,
} }