소스 검색

Fix auto scroll on initial page load

simov 2 년 전
부모
커밋
4039d3de72
1개의 변경된 파일74개의 추가작업 그리고 67개의 파일을 삭제
  1. 74 67
      content/scroll.js

+ 74 - 67
content/scroll.js

@@ -1,65 +1,74 @@
 
 var scroll = (() => {
-  function race (done) {
-    Promise.race([
-      Promise.all([
-        new Promise((resolve) => {
-          var images = Array.from(document.querySelectorAll('img'))
-          if (!images.length) {
+  function onload (done) {
+    Promise.all([
+      new Promise((resolve) => {
+        var timeout = setInterval(() => {
+          if (document.styleSheets.length) {
+            clearInterval(timeout)
             resolve()
           }
-          else {
-            var loaded = 0
-            images.forEach((img) => {
-              img.addEventListener('load', () => {
-                if (++loaded === images.length) {
-                  resolve()
-                }
-              }, {once: true})
-            })
-          }
-        }),
-        new Promise((resolve) => {
-          var code = Array.from(document.querySelectorAll('code[class^=language-]'))
-          if (!state.content.syntax || !code.length) {
-            resolve()
-          }
-          else {
-            setTimeout(() => resolve(), 40)
-          }
-        }),
-        new Promise((resolve) => {
-          var diagrams = Array.from(document.querySelectorAll('code.mermaid'))
-          if (!state.content.mermaid || !diagrams.length) {
-            resolve()
-          }
-          else {
-            var timeout = setInterval(() => {
-              var svg = Array.from(document.querySelectorAll('code.mermaid svg'))
-              if (diagrams.length === svg.length) {
-                clearInterval(timeout)
-                resolve()
-              }
-            }, 50)
-          }
-        }),
-        new Promise((resolve) => {
-          if (!state.content.mathjax) {
-            resolve()
-          }
-          else {
-            var timeout = setInterval(() => {
-              if (mj.loaded) {
-                clearInterval(timeout)
-                resolve()
-              }
-            }, 50)
-          }
-        })
-      ]),
-      new Promise((resolve) => setTimeout(resolve, 500))
-    ])
-    .then(done)
+        }, 0)
+      }),
+      new Promise((resolve) => {
+        var images = Array.from(document.querySelectorAll('img'))
+        if (!images.length) {
+          resolve()
+        }
+        else {
+          Promise.race([
+            new Promise((resolve) => {
+              var loaded = 0
+              images.forEach((img) => {
+                img.addEventListener('load', () => {
+                  if (++loaded === images.length) {
+                    resolve()
+                  }
+                }, {once: true})
+              })
+            }),
+            new Promise((resolve) => setTimeout(resolve, 500))
+          ]).then(resolve)
+        }
+      }),
+      new Promise((resolve) => {
+        var code = Array.from(document.querySelectorAll('code[class^=language-]'))
+        if (!state.content.syntax || !code.length) {
+          resolve()
+        }
+        else {
+          setTimeout(() => resolve(), 40)
+        }
+      }),
+      new Promise((resolve) => {
+        var diagrams = Array.from(document.querySelectorAll('code.mermaid'))
+        if (!state.content.mermaid || !diagrams.length) {
+          resolve()
+        }
+        else {
+          var timeout = setInterval(() => {
+            var svg = Array.from(document.querySelectorAll('code.mermaid svg'))
+            if (diagrams.length === svg.length) {
+              clearInterval(timeout)
+              resolve()
+            }
+          }, 50)
+        }
+      }),
+      new Promise((resolve) => {
+        if (!state.content.mathjax) {
+          resolve()
+        }
+        else {
+          var timeout = setInterval(() => {
+            if (mj.loaded) {
+              clearInterval(timeout)
+              resolve()
+            }
+          }, 50)
+        }
+      })
+    ]).then(done)
   }
   function listen (container, done) {
     var listener = /html|body/i.test(container.nodeName) ? window : container
@@ -86,20 +95,18 @@ var scroll = (() => {
   }
   function set (container, prefix) {
     var key = prefix + location.origin + location.pathname
-    try {
-      listen(container, () => {
+    listen(container, () => {
+      try {
         localStorage.setItem(key, container.scrollTop)
-      })
-    }
-    catch (err) {
-      listen(container, () => {
+      }
+      catch (err) {
         chrome.storage.local.set({[key]: container.scrollTop})
-      })
-    }
+      }
+    })
   }
   var listening = false
   return (update) => {
-    race(() => {
+    onload(() => {
       var container = ((html = $('html')) => (
         html.scrollTop = 1,
         html.scrollTop ? (html.scrollTop = 0, html) : $('body')