// content.js // Log that the content script is running console.log("Content script is running."); let fontLoaded = false; function loadFont() { const fontUrl = chrome.runtime.getURL("fonts/fot_rodin_pro_m.ttf"); const style = document.createElement('style'); style.textContent = ` @font-face { font-family: 'Wii NTLG PGothic JPN Regular'; src: url('${fontUrl}') format('truetype'); } body { font-family: 'Wii NTLG PGothic JPN Regular', sans-serif !important; } * { font-family: 'Wii NTLG PGothic JPN Regular', sans-serif !important; } #text03-01 { display: flex; /* Enable flexbox */ justify-content: center; /* Center horizontally */ align-items: center; /* Center vertically */ height: 100vh; /* Full height of the viewport */ width: 100%; /* Full width */ } #text05-01 { display: flex; /* Enable flexbox */ justify-content: center; /* Center horizontally */ align-items: center; /* Center vertically */ height: 100vh; /* Full height of the viewport */ width: 100%; /* Full width */ } #text06-01 { display: flex; /* Enable flexbox */ justify-content: center; /* Center horizontally */ align-items: center; /* Center vertically */ height: 100vh; /* Full height of the viewport */ width: 100%; /* Full width */ } .buttonTextBlackM { font-size: 24px; /* Adjust font size as needed */ color: black; /* Set text color */ text-align: center; /* Center text within the div */ } `; // Try to append to the head first const head = document.head || document.getElementsByTagName('head')[0]; if (head) { head.appendChild(style); console.log("Font loaded into ."); return "Font loaded into "; // Return success message } // If head is not available, use MutationObserver to wait for it const observer = new MutationObserver(() => { const head = document.head || document.getElementsByTagName('head')[0]; if (head) { head.appendChild(style); observer.disconnect(); // Stop observing once the style is added console.log("Font loaded into via MutationObserver."); return "Font loaded into via MutationObserver"; // Return success message } }); // Start observing the document for changes observer.observe(document, { childList: true, subtree: true }); // Fallback: If the head is still not available, append to the body const fallbackTimeout = setTimeout(() => { if (!document.head || !document.head.contains(style)) { document.body.appendChild(style); console.log("Font loaded into as a fallback."); observer.disconnect(); // Stop observing if we fall back return "Font loaded into as a fallback"; // Return success message } }, 1000); // Wait for 1 second before falling back // Check if the observer is still active after 2 seconds setTimeout(() => { // If the font is still not loaded, log an error if (!document.head || !document.body.contains(style)) { console.error("Failed to load font: and are not available."); return "Failed to load font: and are not available."; // Return error message } observer.disconnect(); // Clear the observer clearTimeout(fallbackTimeout); // Clear the timeout }, 2000); // Check again after 2 seconds return "Font loading initiated"; // Return initial status } // Check the font state on page load function checkFontState() { chrome.storage.local.get(['fontDisabled'], function(result) { if (!result.fontDisabled) { return loadFont(); } else { return "disabled"; } }); } // Define the relative paths to your sound files within the extension const soundFilePaths = [ '', // Index 0 (unused) 'audio/1.wav', 'audio/2.wav', 'audio/3.wav', 'audio/4.wav', 'audio/5.wav', 'audio/6.wav', 'audio/7.wav' ]; // Define the path for the BGM file const bgmFilePath = 'audio/bgm.wav'; // <--- NEW BGM PATH const generatedSoundUrls = soundFilePaths.map(path => path ? browser.runtime.getURL(path) : ''); const generatedBgmUrl = browser.runtime.getURL(bgmFilePath); // Function to load class definitions based on the browser const loadClassDefinitions = async () => { let classDefinitionsUrl; const userAgent = navigator.userAgent.toLowerCase(); if (userAgent.includes("chrome")) { classDefinitionsUrl = chrome.runtime.getURL('classDefinitions.js'); } else if (userAgent.includes("firefox")) { classDefinitionsUrl = browser.runtime.getURL('classDefinitions.js'); } else { console.warn("Unsupported browser. Class definitions will not be loaded."); return; } try { const response = await fetch(classDefinitionsUrl); if (!response.ok) { throw new Error(`HTTP error! status: ${response.status}`); } const classDefinitionsText = await response.text(); // Get the current BGM enabled state from storage // Use browser.storage.local for Firefox compatibility const storageResult = await browser.storage.local.get(['bgmEnabled']); const bgmInitiallyEnabled = storageResult.bgmEnabled === true; // Default to false if not set const script = document.createElement('script'); script.setAttribute('type', 'text/javascript'); // PREPEND the sound URLs, BGM URL, and BGM enabled state as global variables script.textContent = ` (function() { window._wiiShopSoundUrls_ = ${JSON.stringify(generatedSoundUrls)}; window._wiiShopBgmUrl_ = ${JSON.stringify(generatedBgmUrl)}; window._wiiShopBgmInitiallyEnabled_ = ${JSON.stringify(bgmInitiallyEnabled)}; // <--- PASS BGM STATE })(); ` + classDefinitionsText; document.documentElement.insertBefore(script, document.documentElement.firstChild); script.onload = function() { this.remove(); // Clean up the global variables after classDefinitions.js has used them delete window._wiiShopSoundUrls_; delete window._wiiShopBgmUrl_; delete window._wiiShopBgmInitiallyEnabled_; // <--- CLEAN UP BGM STATE }; } catch (error) { console.error("Failed to load class definitions:", error); } }; // Load the class definitions loadClassDefinitions(); // Load the existing trace and points from localStorage const result = checkFontState(); console.log(result); browser.runtime.onMessage.addListener((request, sender, sendResponse) => { if (request.action === "toggleBGM") { // Here, you'd typically want to call a function on the page // to control the BGM. Since wiiSound is defined in classDefinitions.js, // which runs in the page's context, you need to use a custom event // or directly call window.wiiSound if it's already available. // For simplicity, let's assume classDefinitions.js has exposed a way to call it. // Or, we could just re-inject a small script to call it. const controlScript = document.createElement('script'); controlScript.textContent = ` (function() { if (window.wiiSound && typeof window.wiiSound.currentBgmAudio !== 'undefined') { if (window.wiiSound.currentBgmAudio) { window.wiiSound.currentBgmAudio.pause(); window.wiiSound.currentBgmAudio.currentTime = 0; } if (${request.enabled}) { // Re-instantiate wiiSound to get the latest instance, // then call playBGM(). This ensures the method exists. new window.wiiSound().playBGM(); } } })(); `; document.documentElement.appendChild(controlScript); controlScript.onload = function() { this.remove(); }; } });