Merge pull request #131 from tophf/no-flicker-on-update
Avoid flicker when updating applied styles
This commit is contained in:
commit
de7d51ed7c
60
apply.js
60
apply.js
|
@ -1,6 +1,7 @@
|
|||
var g_disableAll = false;
|
||||
var g_styleElements = {};
|
||||
var iframeObserver;
|
||||
var retiredStyleIds = [];
|
||||
|
||||
initObserver();
|
||||
requestStyles();
|
||||
|
@ -28,8 +29,13 @@ chrome.extension.onMessage.addListener(function(request, sender, sendResponse) {
|
|||
removeStyle(request.id, document);
|
||||
break;
|
||||
case "styleUpdated":
|
||||
removeStyle(request.style.id, document);
|
||||
//fallthrough
|
||||
if (request.style.enabled == "true") {
|
||||
retireStyle(request.style.id);
|
||||
// fallthrough to "styleAdded"
|
||||
} else {
|
||||
removeStyle(request.style.id, document);
|
||||
break;
|
||||
}
|
||||
case "styleAdded":
|
||||
if (request.style.enabled == "true") {
|
||||
chrome.extension.sendMessage({method: "getStyles", matchUrl: location.href, enabled: true, id: request.style.id, asHash: true}, applyStyles);
|
||||
|
@ -92,6 +98,27 @@ function removeStyle(id, doc) {
|
|||
});
|
||||
}
|
||||
|
||||
// to avoid page flicker when the style is updated
|
||||
// instead of removing it immediately we rename its ID and queue it
|
||||
// to be deleted in applyStyles after a new version is fetched and applied
|
||||
function retireStyle(id, doc) {
|
||||
var deadID = "ghost-" + id;
|
||||
if (!doc) {
|
||||
doc = document;
|
||||
retiredStyleIds.push(deadID);
|
||||
delete g_styleElements["stylish-" + id];
|
||||
// in case something went wrong and new style was never applied
|
||||
setTimeout(removeStyle.bind(null, deadID, doc), 1000);
|
||||
}
|
||||
var e = doc.getElementById("stylish-" + id);
|
||||
if (e) {
|
||||
e.id = "stylish-" + deadID;
|
||||
}
|
||||
getDynamicIFrames(doc).forEach(function(iframe) {
|
||||
retireStyle(id, iframe.contentDocument);
|
||||
});
|
||||
}
|
||||
|
||||
function applyStyles(styleHash) {
|
||||
if (!styleHash) { // Chrome is starting up
|
||||
requestStyles();
|
||||
|
@ -112,6 +139,14 @@ function applyStyles(styleHash) {
|
|||
});
|
||||
iframeObserver.start();
|
||||
}
|
||||
|
||||
if (retiredStyleIds.length) {
|
||||
setTimeout(function() {
|
||||
while (retiredStyleIds.length) {
|
||||
removeStyle(retiredStyleIds.shift(), document);
|
||||
}
|
||||
}, 0);
|
||||
}
|
||||
}
|
||||
|
||||
function applySections(styleId, sections) {
|
||||
|
@ -194,17 +229,22 @@ function addStyleToIFrameSrcDoc(iframe, styleElement) {
|
|||
setTimeout(addStyleElement.bind(null, styleElement, iframe.contentDocument), 100);
|
||||
}
|
||||
|
||||
function replaceAll(newStyles, doc) {
|
||||
Array.prototype.forEach.call(doc.querySelectorAll("STYLE.stylish"), function(style) {
|
||||
style.remove();
|
||||
});
|
||||
if (doc == document) {
|
||||
g_styleElements = {};
|
||||
applyStyles(newStyles);
|
||||
function replaceAll(newStyles, doc, pass2) {
|
||||
var oldStyles = [].slice.call(doc.querySelectorAll("STYLE.stylish" + (pass2 ? "[id$='-ghost']" : "")));
|
||||
if (!pass2) {
|
||||
oldStyles.forEach(function(style) { style.id += "-ghost"; });
|
||||
}
|
||||
getDynamicIFrames(doc).forEach(function(iframe) {
|
||||
replaceAll(newStyles, iframe.contentDocument);
|
||||
replaceAll(newStyles, iframe.contentDocument, pass2);
|
||||
});
|
||||
if (doc == document && !pass2) {
|
||||
g_styleElements = {};
|
||||
applyStyles(newStyles);
|
||||
replaceAll(newStyles, doc, true);
|
||||
}
|
||||
if (pass2) {
|
||||
oldStyles.forEach(function(style) { style.remove(); });
|
||||
}
|
||||
}
|
||||
|
||||
// Observe dynamic IFRAMEs being added
|
||||
|
|
Loading…
Reference in New Issue
Block a user