Safer DOM Style Injection
// v49.0.50 - Handles document-start timing issues
const appendStyle = () => {
const target = document.head || document.documentElement;
if (target) {
target.appendChild(style);
} else {
requestAnimationFrame(appendStyle); // Retry if DOM not ready
}
};
v49.0.49 could fail silently if the DOM wasn't ready at document-start.
More Robust XHR Mocking
Uses getters instead of direct property assignment (more reliable)
Properly implements getAllResponseHeaders() and getResponseHeader()
Dispatches all required events: readystatechange, load, AND loadend
Calls both event dispatchers and callback functions (onload, onreadystatechange, etc.)
Memory Leak Prevention
// v49.0.50 - Stops polling after goal achieved or 5 minutes
let qualityAchieved = false;
let checkCount = 0;
const maxCheckCount = 150;
// ... clears interval when done
v49.0.49's setInterval runs forever, wasting CPU cycles.
Better Error Handling
// v49.0.50 - Graceful fallback for defineProperty
try {
return originDefineProperty.call(this, obj, prop, descriptor);
} catch(e) {
console.warn('B站助手: defineProperty failed for', prop);
return obj;
}
Longer Cookie Validity
v49.0.50: max-age=31536000 (1 year)
v49.0.49: max-age=864000 (10 days)
Cleanup on Page Unload
win.addEventListener('beforeunload', () => {
if (intervalId) clearInterval(intervalId);
});