[object Object]

← back to Dw Domain Launcher

add rel=noopener noreferrer to external target=_blank links

b9ce236eab389a9998bff9da4ddb142b67a9d125 · 2026-05-18 20:27:44 -0700 · SteveStudio2

Files touched

Diff

commit b9ce236eab389a9998bff9da4ddb142b67a9d125
Author: SteveStudio2 <steve@designerwallcoverings.com>
Date:   Mon May 18 20:27:44 2026 -0700

    add rel=noopener noreferrer to external target=_blank links
---
 public/index.html | 29 +++++++++++++++++++++--------
 1 file changed, 21 insertions(+), 8 deletions(-)

diff --git a/public/index.html b/public/index.html
index 18ef701..47830c4 100644
--- a/public/index.html
+++ b/public/index.html
@@ -121,8 +121,8 @@
   <div class="right">
     <button id="refreshGD" style="background:var(--accent);border:0;color:#0f0f10;font-weight:600">Refresh GoDaddy</button>
     <a class="dl" href="/api/export.csv" download>Download CSV</a>
-    <a class="dl" href="/api/delete-manifest" target="_blank">Delete manifest</a>
-    <a class="dl" href="/api/launch-manifest" target="_blank">Launch manifest</a>
+    <a class="dl" href="/api/delete-manifest" target="_blank" rel="noopener noreferrer">Delete manifest</a>
+    <a class="dl" href="/api/launch-manifest" target="_blank" rel="noopener noreferrer">Launch manifest</a>
   </div>
 </div>
 
@@ -229,9 +229,15 @@ function toast(msg) {
 }
 
 async function fetchCategories() {
-  const r = await fetch('/api/categories');
-  const j = await r.json();
-  CATEGORIES = j.categories;
+  try {
+    const r = await fetch('/api/categories');
+    if (!r.ok) throw new Error(`HTTP ${r.status}`);
+    const j = await r.json();
+    CATEGORIES = Array.isArray(j.categories) ? j.categories : [];
+  } catch (e) {
+    CATEGORIES = [];
+    toast('error loading categories');
+  }
   const opts = '<option value="">(no category)</option>' + CATEGORIES.map(c => `<option value="${c}">${c}</option>`).join('');
   $('#filterCategory').innerHTML = '<option value="">all categories</option><option value="(none)">(no category)</option>' +
     CATEGORIES.map(c => `<option value="${c}">${c}</option>`).join('');
@@ -239,8 +245,15 @@ async function fetchCategories() {
 }
 
 async function fetchAll() {
-  const r = await fetch('/api/domains');
-  DATA = await r.json();
+  try {
+    const r = await fetch('/api/domains');
+    if (!r.ok) throw new Error(`HTTP ${r.status}`);
+    DATA = await r.json();
+  } catch (e) {
+    $('#counts').textContent = 'error loading domains';
+    toast('error loading domains');
+    return;
+  }
   render();
 }
 
@@ -275,7 +288,7 @@ function render() {
     <tr data-domain="${r.domain}">
       <td><input type="checkbox" class="sel" data-domain="${r.domain}" ${SELECTED.has(r.domain)?'checked':''}></td>
       <td class="domain">
-        <a href="http://${r.domain}" target="_blank" rel="noopener">${r.domain}</a>
+        <a href="http://${r.domain}" target="_blank" rel="noopener noreferrer">${r.domain}</a>
       </td>
       <td>
         <select class="cat" data-domain="${r.domain}">

← 9e16b67 remove dead domains brazilliancewallpaper.com + dohngia.com  ·  back to Dw Domain Launcher  ·  Add per-site favicon (kills /favicon.ico 404) 6c28699 →