Alexandre Dieulot преди 5 години
родител
ревизия
a2ff4757a8
променени са 4 файла, в които са добавени 20 реда и са изтрити 3 реда
  1. 5 0
      instantpage.js
  2. 9 2
      test/app.js
  3. 1 0
      test/footer.html
  4. 5 1
      test/header.html

+ 5 - 0
instantpage.js

@@ -9,6 +9,7 @@ const isSupported = prefetcher.relList && prefetcher.relList.supports && prefetc
 const isDataSaverEnabled = navigator.connection && navigator.connection.saveData
 const allowQueryString = 'instantAllowQueryString' in document.body.dataset
 const allowExternalLinks = 'instantAllowExternalLinks' in document.body.dataset
+const useWhitelist = 'instantWhitelist' in document.body.dataset
 
 if (isSupported && !isDataSaverEnabled) {
   prefetcher.rel = 'prefetch'
@@ -90,6 +91,10 @@ function isPreloadable(linkElement) {
     return
   }
 
+  if (useWhitelist && !('instant' in linkElement.dataset)) {
+    return
+  }
+
   const preloadLocation = new URL(linkElement.href)
 
   if (!allowExternalLinks && preloadLocation.origin != location.origin && !('instant' in linkElement.dataset)) {

+ 9 - 2
test/app.js

@@ -14,6 +14,7 @@ if (isNaN(PORT)) {
 let DATA_INSTANT = 0
 let SLEEP_TIME = 200
 let CACHE_MAX_AGE = 0
+let USE_WHITELIST = 0
 
 function handleCookies(req) {
   const cookies = req.headers.cookie
@@ -33,6 +34,7 @@ function handleCookies(req) {
     DATA_INSTANT = cookieValueSplit[0]
     SLEEP_TIME = cookieValueSplit[1]
     CACHE_MAX_AGE = cookieValueSplit[2]
+    USE_WHITELIST = cookieValueSplit[3]
   })
 }
 
@@ -74,11 +76,15 @@ async function requestListener(req, res) {
     content += await fsPromises.readFile(path.resolve(__dirname, 'header.html'))
 
     if (!DATA_INSTANT) {
-      content = content.replace('<body>', '<body data-instant-allow-query-string data-instant-allow-external-links >')
+      content = content.replace('<body>', '<body data-instant-allow-query-string data-instant-allow-external-links>')
     }
-    dataInstantAttribute = DATA_INSTANT ? `data-instant` : ``
+    if (USE_WHITELIST) {
+      content = content.replace('<body', '<body data-instant-whitelist')
+    }
+    dataInstantAttribute = DATA_INSTANT || USE_WHITELIST ? `data-instant` : ``
 
     content = content.replace(':checked_aqsael', DATA_INSTANT ? 'checked' : '')
+    content = content.replace(':checked_whitelist', USE_WHITELIST ? 'checked' : '')
     content = content.replace(':value_sleep', `value="${SLEEP_TIME}"`)
     content = content.replace(':value_cacheAge', `value="${CACHE_MAX_AGE}"`)
 
@@ -93,6 +99,7 @@ async function requestListener(req, res) {
     content += `<a href="/${page}?${Math.random()}#anchor" ${dataInstantAttribute}><span>Other page anchor</span></a>`
     content += `<a href="${req.url}#anchor" id="anchor"><span>Same-page anchor</span></a>`
     content += `<a href="/${page}?${Math.random()}" data-no-instant><span>Manually blacklisted link</span></a>`
+    content += `<a href="/${page}?${Math.random()}"><span>Non-whitelisted link</span></a>`
     content += `<a href="https://www.google.com/" ${dataInstantAttribute}><span>External link</span></a>`
     content += `<a><span>&lt;a&gt; without <code>href</code></span></a>`
     content += `<a href="file:///C:/"><span>file: link</span></a>`

+ 1 - 0
test/footer.html

@@ -28,6 +28,7 @@ form.addEventListener('submit', (e) => {
     form.aqsael.checked ? 1 : 0,
     form.sleep.value,
     form.cacheAge.value,
+    form.whitelist.checked ? 1 : 0,
   ].join(',')
   document.cookie = `instantpage_test=${cookieValue}`
   location.reload()

+ 5 - 1
test/header.html

@@ -38,7 +38,7 @@ form label {
   padding: 5px;
 }
 
-@media (min-width: 900px) {
+@media (min-width: 1000px) {
   form label {
     display: inline-block;
     margin-right: 10px;
@@ -57,6 +57,10 @@ form input[type="number"] {
     Allow query string &amp; external links:
     <input name="aqsael" type="checkbox" :checked_aqsael>
   </label>
+  <label>
+    Use whitelist:
+    <input name="whitelist" type="checkbox" :checked_whitelist>
+  </label>
   <label>
     Sleep time:
     <input name="sleep" type="number" :value_sleep>