apply: ensure style elements follow <body>
This commit is contained in:
		
							parent
							
								
									f80f5612d6
								
							
						
					
					
						commit
						93fdd787d4
					
				| 
						 | 
					@ -12,7 +12,7 @@ var styleElements = new Map();
 | 
				
			||||||
var disabledElements = new Map();
 | 
					var disabledElements = new Map();
 | 
				
			||||||
var retiredStyleTimers = new Map();
 | 
					var retiredStyleTimers = new Map();
 | 
				
			||||||
var docRewriteObserver;
 | 
					var docRewriteObserver;
 | 
				
			||||||
var docHeadObserver;
 | 
					var docRootObserver;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
requestStyles();
 | 
					requestStyles();
 | 
				
			||||||
chrome.runtime.onMessage.addListener(applyOnMessage);
 | 
					chrome.runtime.onMessage.addListener(applyOnMessage);
 | 
				
			||||||
| 
						 | 
					@ -203,6 +203,7 @@ function applyStyles(styles) {
 | 
				
			||||||
    applySections(id, styles[id]);
 | 
					    applySections(id, styles[id]);
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
  initDocRewriteObserver();
 | 
					  initDocRewriteObserver();
 | 
				
			||||||
 | 
					  initDocRootObserver();
 | 
				
			||||||
  if (retiredStyleTimers.size) {
 | 
					  if (retiredStyleTimers.size) {
 | 
				
			||||||
    setTimeout(() => {
 | 
					    setTimeout(() => {
 | 
				
			||||||
      for (const [id, timer] of retiredStyleTimers.entries()) {
 | 
					      for (const [id, timer] of retiredStyleTimers.entries()) {
 | 
				
			||||||
| 
						 | 
					@ -211,17 +212,6 @@ function applyStyles(styles) {
 | 
				
			||||||
      }
 | 
					      }
 | 
				
			||||||
    });
 | 
					    });
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
  if (styleElements.size && !document.head && !docHeadObserver) {
 | 
					 | 
				
			||||||
    // HEAD is not yet present so we'll wait for it and move the style elements
 | 
					 | 
				
			||||||
    docHeadObserver = new MutationObserver(() => {
 | 
					 | 
				
			||||||
      docHeadObserver.disconnect();
 | 
					 | 
				
			||||||
      docHeadObserver = null;
 | 
					 | 
				
			||||||
      for (const el of styleElements.values()) {
 | 
					 | 
				
			||||||
        ROOT.insertBefore(el, document.body);
 | 
					 | 
				
			||||||
      }
 | 
					 | 
				
			||||||
    });
 | 
					 | 
				
			||||||
    docHeadObserver.observe(ROOT, {childList: true});
 | 
					 | 
				
			||||||
  }
 | 
					 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -310,6 +300,36 @@ function initDocRewriteObserver() {
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					function initDocRootObserver() {
 | 
				
			||||||
 | 
					  if (!styleElements.size || document.body || docRootObserver) {
 | 
				
			||||||
 | 
					    return;
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					  // wait for BODY and move all style elements after it
 | 
				
			||||||
 | 
					  docRootObserver = new MutationObserver(() => {
 | 
				
			||||||
 | 
					    let expectedPrevSibling = document.body || document.head;
 | 
				
			||||||
 | 
					    if (!expectedPrevSibling) {
 | 
				
			||||||
 | 
					      return;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    docRootObserver.disconnect();
 | 
				
			||||||
 | 
					    for (const el of styleElements.values()) {
 | 
				
			||||||
 | 
					      if (el.previousElementSibling !== expectedPrevSibling) {
 | 
				
			||||||
 | 
					        ROOT.insertBefore(el, expectedPrevSibling.nextSibling);
 | 
				
			||||||
 | 
					        expectedPrevSibling = el;
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    if (document.body) {
 | 
				
			||||||
 | 
					      docRootObserver = null;
 | 
				
			||||||
 | 
					    } else {
 | 
				
			||||||
 | 
					      docRootObserver.connect();
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					  });
 | 
				
			||||||
 | 
					  docRootObserver.connect = () => {
 | 
				
			||||||
 | 
					    docRootObserver.observe(ROOT, {childList: true});
 | 
				
			||||||
 | 
					  };
 | 
				
			||||||
 | 
					  docRootObserver.connect();
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
function orphanCheck() {
 | 
					function orphanCheck() {
 | 
				
			||||||
  const port = chrome.runtime.connect();
 | 
					  const port = chrome.runtime.connect();
 | 
				
			||||||
  if (port) {
 | 
					  if (port) {
 | 
				
			||||||
| 
						 | 
					@ -319,9 +339,7 @@ function orphanCheck() {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  // we're orphaned due to an extension update
 | 
					  // we're orphaned due to an extension update
 | 
				
			||||||
  // we can detach the mutation observer
 | 
					  // we can detach the mutation observer
 | 
				
			||||||
  if (docRewriteObserver) {
 | 
					  [docRewriteObserver, docRootObserver].forEach(ob => ob && ob.disconnect());
 | 
				
			||||||
    docRewriteObserver.disconnect();
 | 
					 | 
				
			||||||
  }
 | 
					 | 
				
			||||||
  // we can detach event listeners
 | 
					  // we can detach event listeners
 | 
				
			||||||
  window.removeEventListener(chrome.runtime.id, orphanCheck, true);
 | 
					  window.removeEventListener(chrome.runtime.id, orphanCheck, true);
 | 
				
			||||||
  // we can't detach chrome.runtime.onMessage because it's no longer connected internally
 | 
					  // we can't detach chrome.runtime.onMessage because it's no longer connected internally
 | 
				
			||||||
| 
						 | 
					@ -334,6 +352,7 @@ function orphanCheck() {
 | 
				
			||||||
    'applyStyleState',
 | 
					    'applyStyleState',
 | 
				
			||||||
    'doDisableAll',
 | 
					    'doDisableAll',
 | 
				
			||||||
    'initDocRewriteObserver',
 | 
					    'initDocRewriteObserver',
 | 
				
			||||||
 | 
					    'initDocRootObserver',
 | 
				
			||||||
    'orphanCheck',
 | 
					    'orphanCheck',
 | 
				
			||||||
    'removeStyle',
 | 
					    'removeStyle',
 | 
				
			||||||
    'replaceAll',
 | 
					    'replaceAll',
 | 
				
			||||||
| 
						 | 
					@ -344,5 +363,6 @@ function orphanCheck() {
 | 
				
			||||||
    'retiredStyleTimers',
 | 
					    'retiredStyleTimers',
 | 
				
			||||||
    'styleElements',
 | 
					    'styleElements',
 | 
				
			||||||
    'docRewriteObserver',
 | 
					    'docRewriteObserver',
 | 
				
			||||||
 | 
					    'docRootObserver',
 | 
				
			||||||
  ].forEach(fn => (window[fn] = null));
 | 
					  ].forEach(fn => (window[fn] = null));
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
		Reference in New Issue
	
	Block a user