Update index.html
Browse files- index.html +54 -25
index.html
CHANGED
@@ -931,7 +931,6 @@ document.addEventListener('DOMContentLoaded', function() {
|
|
931 |
window.alert(`${message}\n\nエラー詳細: ${error.message}`);
|
932 |
}
|
933 |
|
934 |
-
// サービスワーカー登録関数
|
935 |
async function registerServiceWorker() {
|
936 |
const statusElement = document.getElementById('sw-status');
|
937 |
const registerBtn = document.getElementById('sw-register-btn');
|
@@ -955,15 +954,14 @@ async function registerServiceWorker() {
|
|
955 |
'sw-t-soprano': document.getElementById('sw-t-soprano').checked,
|
956 |
'sw-t-alto': document.getElementById('sw-t-alto').checked,
|
957 |
'sw-t-tenor': document.getElementById('sw-t-tenor').checked,
|
958 |
-
'sw-t-combined': document.getElementById('sw-t-combined').checked
|
|
|
|
|
959 |
};
|
960 |
|
961 |
// チェックされたファイルを収集
|
962 |
const filesToCache = [];
|
963 |
|
964 |
-
// index.htmlは常に含める
|
965 |
-
filesToCache.push('/index.html');
|
966 |
-
|
967 |
// 通常のメディアファイル
|
968 |
if (checkboxStates['sw-video']) filesToCache.push('/v.mp4');
|
969 |
if (checkboxStates['sw-piano']) filesToCache.push('/p.mp3');
|
@@ -986,41 +984,49 @@ async function registerServiceWorker() {
|
|
986 |
// Service Workerを登録
|
987 |
const registration = await navigator.serviceWorker.register('/service-worker.js');
|
988 |
|
989 |
-
// 進捗表示用のタイマー
|
990 |
-
let progress = 0;
|
991 |
-
const progressInterval = setInterval(() => {
|
992 |
-
progress += 5;
|
993 |
-
if (progress < 100) {
|
994 |
-
statusElement.textContent = `サービスワーカーを登録中... ${progress}%`;
|
995 |
-
}
|
996 |
-
}, 300);
|
997 |
-
|
998 |
// Service Workerがアクティブになるのを待つ
|
999 |
-
await new Promise(resolve => {
|
1000 |
if (registration.active) {
|
1001 |
resolve();
|
1002 |
} else {
|
1003 |
-
registration.
|
1004 |
-
|
1005 |
-
|
1006 |
-
if (
|
1007 |
resolve();
|
|
|
|
|
1008 |
}
|
1009 |
});
|
1010 |
-
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1011 |
}
|
1012 |
});
|
1013 |
|
1014 |
-
|
1015 |
-
|
1016 |
-
// Service Workerにキャッシュするファイルを送信
|
1017 |
registration.active.postMessage({
|
1018 |
type: 'CACHE_FILES',
|
1019 |
files: filesToCache,
|
1020 |
checkboxStates: checkboxStates
|
1021 |
});
|
1022 |
|
1023 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
1024 |
registerBtn.disabled = false;
|
1025 |
} catch (error) {
|
1026 |
console.error('Service Worker登録エラー:', error);
|
@@ -1028,7 +1034,30 @@ async function registerServiceWorker() {
|
|
1028 |
registerBtn.disabled = false;
|
1029 |
}
|
1030 |
}
|
1031 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1032 |
async function restoreCheckboxStates() {
|
1033 |
try {
|
1034 |
const cache = await caches.open('settings-cache');
|
|
|
931 |
window.alert(`${message}\n\nエラー詳細: ${error.message}`);
|
932 |
}
|
933 |
|
|
|
934 |
async function registerServiceWorker() {
|
935 |
const statusElement = document.getElementById('sw-status');
|
936 |
const registerBtn = document.getElementById('sw-register-btn');
|
|
|
954 |
'sw-t-soprano': document.getElementById('sw-t-soprano').checked,
|
955 |
'sw-t-alto': document.getElementById('sw-t-alto').checked,
|
956 |
'sw-t-tenor': document.getElementById('sw-t-tenor').checked,
|
957 |
+
'sw-t-combined': document.getElementById('sw-t-combined').checked,
|
958 |
+
'sw-index': document.getElementById('sw-index').checked,
|
959 |
+
'sw-root': document.getElementById('sw-root').checked
|
960 |
};
|
961 |
|
962 |
// チェックされたファイルを収集
|
963 |
const filesToCache = [];
|
964 |
|
|
|
|
|
|
|
965 |
// 通常のメディアファイル
|
966 |
if (checkboxStates['sw-video']) filesToCache.push('/v.mp4');
|
967 |
if (checkboxStates['sw-piano']) filesToCache.push('/p.mp3');
|
|
|
984 |
// Service Workerを登録
|
985 |
const registration = await navigator.serviceWorker.register('/service-worker.js');
|
986 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
987 |
// Service Workerがアクティブになるのを待つ
|
988 |
+
await new Promise((resolve, reject) => {
|
989 |
if (registration.active) {
|
990 |
resolve();
|
991 |
} else {
|
992 |
+
const worker = registration.installing || registration.waiting;
|
993 |
+
if (worker) {
|
994 |
+
worker.addEventListener('statechange', () => {
|
995 |
+
if (worker.state === 'activated') {
|
996 |
resolve();
|
997 |
+
} else if (worker.state === 'rejected') {
|
998 |
+
reject(new Error('Service Workerの登録が拒否されました'));
|
999 |
}
|
1000 |
});
|
1001 |
+
} else {
|
1002 |
+
registration.addEventListener('updatefound', () => {
|
1003 |
+
const newWorker = registration.installing;
|
1004 |
+
newWorker.addEventListener('statechange', () => {
|
1005 |
+
if (newWorker.state === 'activated') {
|
1006 |
+
resolve();
|
1007 |
+
} else if (newWorker.state === 'rejected') {
|
1008 |
+
reject(new Error('Service Workerの登録が拒否されました'));
|
1009 |
+
}
|
1010 |
+
});
|
1011 |
+
});
|
1012 |
+
}
|
1013 |
}
|
1014 |
});
|
1015 |
|
1016 |
+
// キャッシュするファイルをService Workerに送信
|
|
|
|
|
1017 |
registration.active.postMessage({
|
1018 |
type: 'CACHE_FILES',
|
1019 |
files: filesToCache,
|
1020 |
checkboxStates: checkboxStates
|
1021 |
});
|
1022 |
|
1023 |
+
// キャッシュが完了するのを待つ
|
1024 |
+
statusElement.textContent = "ファイルをキャッシュ中...";
|
1025 |
+
|
1026 |
+
// キャッシュが完了したか確認する
|
1027 |
+
await verifyCache(filesToCache);
|
1028 |
+
|
1029 |
+
statusElement.textContent = "サービスワーカーが正常に登録され、ファイルがキャッシュされました";
|
1030 |
registerBtn.disabled = false;
|
1031 |
} catch (error) {
|
1032 |
console.error('Service Worker登録エラー:', error);
|
|
|
1034 |
registerBtn.disabled = false;
|
1035 |
}
|
1036 |
}
|
1037 |
+
async function verifyCache(filesToCache) {
|
1038 |
+
const maxAttempts = 10;
|
1039 |
+
const delay = 500; // 500msごとに確認
|
1040 |
+
|
1041 |
+
for (let attempt = 1; attempt <= maxAttempts; attempt++) {
|
1042 |
+
const cache = await caches.open('media-player-cache-v1');
|
1043 |
+
const cachedRequests = await cache.keys();
|
1044 |
+
const cachedUrls = cachedRequests.map(request => request.url.replace(location.origin, ''));
|
1045 |
+
|
1046 |
+
// ��べてのファイルがキャッシュされているか確認
|
1047 |
+
const allCached = filesToCache.every(file => cachedUrls.includes(file));
|
1048 |
+
|
1049 |
+
if (allCached) {
|
1050 |
+
return true;
|
1051 |
+
}
|
1052 |
+
|
1053 |
+
// 最後の試行でなければ待機
|
1054 |
+
if (attempt < maxAttempts) {
|
1055 |
+
await new Promise(resolve => setTimeout(resolve, delay));
|
1056 |
+
}
|
1057 |
+
}
|
1058 |
+
|
1059 |
+
throw new Error('キャッシュが完了しませんでした');
|
1060 |
+
}
|
1061 |
async function restoreCheckboxStates() {
|
1062 |
try {
|
1063 |
const cache = await caches.open('settings-cache');
|