wiimart-extension/content.js
2025-07-04 13:34:40 -04:00

217 lines
8.5 KiB
JavaScript

// 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 <head>.");
return "Font loaded into <head>"; // 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 <head> via MutationObserver.");
return "Font loaded into <head> 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 <body> as a fallback.");
observer.disconnect(); // Stop observing if we fall back
return "Font loaded into <body> 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: <head> and <body> are not available.");
return "Failed to load font: <head> and <body> 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(); };
}
});