197 lines
6.9 KiB
HTML
197 lines
6.9 KiB
HTML
<!DOCTYPE html>
|
|
<html lang="en">
|
|
<head>
|
|
<meta charset="UTF-8">
|
|
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
|
<title>Favicon Debug Tool</title>
|
|
<style>
|
|
body {
|
|
font-family: Arial, sans-serif;
|
|
max-width: 1200px;
|
|
margin: 0 auto;
|
|
padding: 20px;
|
|
}
|
|
.bookmark-debug {
|
|
display: flex;
|
|
align-items: center;
|
|
gap: 15px;
|
|
padding: 10px;
|
|
border: 1px solid #ddd;
|
|
border-radius: 5px;
|
|
margin-bottom: 10px;
|
|
}
|
|
.favicon-test {
|
|
width: 16px;
|
|
height: 16px;
|
|
border: 1px solid #ccc;
|
|
flex-shrink: 0;
|
|
}
|
|
.bookmark-info {
|
|
flex: 1;
|
|
}
|
|
.bookmark-title {
|
|
font-weight: bold;
|
|
margin-bottom: 5px;
|
|
}
|
|
.favicon-data {
|
|
font-size: 12px;
|
|
color: #666;
|
|
word-break: break-all;
|
|
}
|
|
.status {
|
|
padding: 2px 6px;
|
|
border-radius: 3px;
|
|
font-size: 11px;
|
|
font-weight: bold;
|
|
}
|
|
.status.has-icon {
|
|
background: #d4edda;
|
|
color: #155724;
|
|
}
|
|
.status.no-icon {
|
|
background: #f8d7da;
|
|
color: #721c24;
|
|
}
|
|
.status.error {
|
|
background: #fff3cd;
|
|
color: #856404;
|
|
}
|
|
.summary {
|
|
background: #f8f9fa;
|
|
padding: 15px;
|
|
border-radius: 5px;
|
|
margin-bottom: 20px;
|
|
}
|
|
button {
|
|
padding: 10px 20px;
|
|
background: #007bff;
|
|
color: white;
|
|
border: none;
|
|
border-radius: 4px;
|
|
cursor: pointer;
|
|
margin-bottom: 20px;
|
|
}
|
|
button:hover {
|
|
background: #0056b3;
|
|
}
|
|
</style>
|
|
</head>
|
|
<body>
|
|
<h1>Favicon Debug Tool</h1>
|
|
<p>This tool will analyze the favicon data in your bookmarks to help identify why some favicons aren't showing.</p>
|
|
|
|
<button onclick="analyzeBookmarks()">Analyze Bookmarks</button>
|
|
|
|
<div id="summary" class="summary" style="display: none;">
|
|
<h3>Summary</h3>
|
|
<div id="summaryContent"></div>
|
|
</div>
|
|
|
|
<div id="results"></div>
|
|
|
|
<script>
|
|
function analyzeBookmarks() {
|
|
const stored = localStorage.getItem('bookmarks');
|
|
const resultsDiv = document.getElementById('results');
|
|
const summaryDiv = document.getElementById('summary');
|
|
const summaryContent = document.getElementById('summaryContent');
|
|
|
|
if (!stored) {
|
|
resultsDiv.innerHTML = '<p>No bookmarks found in localStorage.</p>';
|
|
return;
|
|
}
|
|
|
|
let bookmarks;
|
|
try {
|
|
bookmarks = JSON.parse(stored);
|
|
} catch (error) {
|
|
resultsDiv.innerHTML = '<p>Error parsing bookmark data: ' + error.message + '</p>';
|
|
return;
|
|
}
|
|
|
|
let hasIcon = 0;
|
|
let noIcon = 0;
|
|
let errorIcon = 0;
|
|
let dataUrls = 0;
|
|
let httpUrls = 0;
|
|
|
|
resultsDiv.innerHTML = '';
|
|
|
|
bookmarks.forEach((bookmark, index) => {
|
|
const debugDiv = document.createElement('div');
|
|
debugDiv.className = 'bookmark-debug';
|
|
|
|
const favicon = document.createElement('img');
|
|
favicon.className = 'favicon-test';
|
|
favicon.alt = 'Favicon';
|
|
|
|
const infoDiv = document.createElement('div');
|
|
infoDiv.className = 'bookmark-info';
|
|
|
|
const titleDiv = document.createElement('div');
|
|
titleDiv.className = 'bookmark-title';
|
|
titleDiv.textContent = bookmark.title || 'Untitled';
|
|
|
|
const statusSpan = document.createElement('span');
|
|
statusSpan.className = 'status';
|
|
|
|
const dataDiv = document.createElement('div');
|
|
dataDiv.className = 'favicon-data';
|
|
|
|
if (bookmark.icon && bookmark.icon.trim() !== '') {
|
|
hasIcon++;
|
|
statusSpan.textContent = 'HAS ICON';
|
|
statusSpan.classList.add('has-icon');
|
|
|
|
if (bookmark.icon.startsWith('data:')) {
|
|
dataUrls++;
|
|
dataDiv.textContent = `Data URL (${bookmark.icon.length} chars): ${bookmark.icon.substring(0, 100)}...`;
|
|
} else {
|
|
httpUrls++;
|
|
dataDiv.textContent = `URL: ${bookmark.icon}`;
|
|
}
|
|
|
|
favicon.src = bookmark.icon;
|
|
|
|
favicon.onerror = function() {
|
|
statusSpan.textContent = 'ICON ERROR';
|
|
statusSpan.className = 'status error';
|
|
errorIcon++;
|
|
hasIcon--;
|
|
dataDiv.textContent += ' [FAILED TO LOAD]';
|
|
};
|
|
|
|
} else {
|
|
noIcon++;
|
|
statusSpan.textContent = 'NO ICON';
|
|
statusSpan.classList.add('no-icon');
|
|
dataDiv.textContent = 'No favicon data found';
|
|
|
|
// Use default icon
|
|
favicon.src = 'data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAxNiAxNiI+PHBhdGggZmlsbD0iIzk5OSIgZD0iTTggMEMzLjYgMCAwIDMuNiAwIDhzMy42IDggOCA4IDgtMy42IDgtOC0zLjYtOC04LTh6bTAgMTRjLTMuMyAwLTYtMi3LTYtNnMyLjctNiA2LTYgNiAyLjcgNiA2LTIuNyA2LTYgNnoiLz48L3N2Zz4=';
|
|
}
|
|
|
|
infoDiv.appendChild(titleDiv);
|
|
infoDiv.appendChild(statusSpan);
|
|
infoDiv.appendChild(dataDiv);
|
|
|
|
debugDiv.appendChild(favicon);
|
|
debugDiv.appendChild(infoDiv);
|
|
|
|
resultsDiv.appendChild(debugDiv);
|
|
});
|
|
|
|
// Show summary
|
|
summaryContent.innerHTML = `
|
|
<strong>Total Bookmarks:</strong> ${bookmarks.length}<br>
|
|
<strong>With Favicons:</strong> ${hasIcon} (${Math.round(hasIcon/bookmarks.length*100)}%)<br>
|
|
<strong>Without Favicons:</strong> ${noIcon} (${Math.round(noIcon/bookmarks.length*100)}%)<br>
|
|
<strong>Failed to Load:</strong> ${errorIcon} (${Math.round(errorIcon/bookmarks.length*100)}%)<br>
|
|
<strong>Data URLs:</strong> ${dataUrls}<br>
|
|
<strong>HTTP URLs:</strong> ${httpUrls}
|
|
`;
|
|
summaryDiv.style.display = 'block';
|
|
}
|
|
</script>
|
|
</body>
|
|
</html> |