Commit 0faffd28 authored by Stefy Spora's avatar Stefy Spora

Fix MetaMask detection and improve error handling

- Fix unsafe window.web3.currentProvider access causing TypeError
- Add proper null checks for window.web3.currentProvider access
- Improve MetaMask detection timing with retry mechanism
- Add MutationObserver to watch for MetaMask injection
- Enhance error handling and logging for MetaMask detection
- Confirm MetaMask detection correctly checks active tab's window object
- Remove backup files from repository
parent e799d616
...@@ -492,7 +492,9 @@ ...@@ -492,7 +492,9 @@
// Check for MetaMask specifically // Check for MetaMask specifically
if (window['ethereum']) { if (window['ethereum']) {
ethereumProvider = window['ethereum']; ethereumProvider = window['ethereum'];
} else if (window['web3'] && window['web3'].currentProvider) { } else if (window['web3'] &&
window['web3'] !== null &&
typeof window['web3'].currentProvider !== 'undefined') {
ethereumProvider = window['web3'].currentProvider; ethereumProvider = window['web3'].currentProvider;
} }
} }
......
...@@ -22,29 +22,162 @@ ...@@ -22,29 +22,162 @@
(function() { (function() {
'use strict'; 'use strict';
// Function to check if MetaMask is available let metamaskDetected = false;
let metamaskProvider = null;
let detectionAttempts = 0;
const maxAttempts = 10;
const checkInterval = 500; // Check every 500ms
// Function to check if MetaMask is available with retry mechanism
function isMetaMaskAvailable() { function isMetaMaskAvailable() {
const available = typeof window.ethereum !== 'undefined' || // First check if we already detected it
(typeof window.web3 !== 'undefined' && typeof window.web3.currentProvider !== 'undefined'); if (metamaskDetected) {
console.log('MetaMask detector: MetaMask available:', available); console.log('MetaMask detector: MetaMask already detected');
return available; return true;
}
// Check current state with proper null checks
const ethereumAvailable = typeof window.ethereum !== 'undefined';
const web3Available = typeof window.web3 !== 'undefined' &&
window.web3 !== null &&
typeof window.web3.currentProvider !== 'undefined';
const available = ethereumAvailable || web3Available;
if (available) {
metamaskDetected = true;
// Set provider with proper null checks
if (ethereumAvailable) {
metamaskProvider = window.ethereum;
} else if (web3Available) {
metamaskProvider = window.web3.currentProvider;
}
console.log('MetaMask detector: MetaMask detected on attempt', detectionAttempts);
return true;
}
// If not available and we haven't exceeded max attempts, schedule another check
if (detectionAttempts < maxAttempts) {
detectionAttempts++;
console.log('MetaMask detector: MetaMask not found, attempt', detectionAttempts, 'of', maxAttempts);
setTimeout(() => isMetaMaskAvailable(), checkInterval);
} else {
console.log('MetaMask detector: MetaMask not detected after', maxAttempts, 'attempts');
}
return false;
} }
// Function to get MetaMask provider // Function to get MetaMask provider
function getMetaMaskProvider() { function getMetaMaskProvider() {
const provider = window.ethereum || window.web3.currentProvider; if (metamaskProvider) {
return metamaskProvider;
}
// Try to get it directly with proper null checks
let provider = null;
if (typeof window.ethereum !== 'undefined') {
provider = window.ethereum;
} else if (typeof window.web3 !== 'undefined' &&
window.web3 !== null &&
typeof window.web3.currentProvider !== 'undefined') {
provider = window.web3.currentProvider;
}
if (provider) {
metamaskProvider = provider;
}
console.log('MetaMask detector: Provider found:', !!provider); console.log('MetaMask detector: Provider found:', !!provider);
return provider; return provider;
} }
// Set up MutationObserver to watch for MetaMask injection
function setupMetaMaskWatcher() {
const observer = new MutationObserver((mutations) => {
// Check if ethereum was added to window
if (typeof window.ethereum !== 'undefined' && !metamaskDetected) {
console.log('MetaMask detector: ethereum object detected via MutationObserver');
metamaskDetected = true;
metamaskProvider = window.ethereum;
}
// Check if web3 was added to window with proper null checks
if (typeof window.web3 !== 'undefined' &&
window.web3 !== null &&
typeof window.web3.currentProvider !== 'undefined' &&
!metamaskDetected) {
console.log('MetaMask detector: web3 object detected via MutationObserver');
metamaskDetected = true;
metamaskProvider = window.web3.currentProvider;
}
});
// Start observing
observer.observe(document, {
childList: true,
subtree: true
});
console.log('MetaMask detector: MutationObserver set up to watch for MetaMask injection');
}
// Initialize detection
function initializeDetection() {
console.log('MetaMask detector: Initializing detection...');
// Start immediate check
isMetaMaskAvailable();
// Set up watcher for dynamic injection
setupMetaMaskWatcher();
// Also listen for ethereum#initialized event (MetaMask specific)
if (typeof window.ethereum !== 'undefined') {
window.ethereum.on('connect', () => {
console.log('MetaMask detector: ethereum connect event received');
metamaskDetected = true;
metamaskProvider = window.ethereum;
});
}
}
// Initialize on page load
if (document.readyState === 'loading') {
document.addEventListener('DOMContentLoaded', initializeDetection);
} else {
initializeDetection();
}
// Listen for messages from popup // Listen for messages from popup
chrome.runtime.onMessage.addListener((request, sender, sendResponse) => { chrome.runtime.onMessage.addListener((request, sender, sendResponse) => {
console.log('MetaMask detector: Received message:', request.action); console.log('MetaMask detector: Received message:', request.action, 'from:', sender);
if (request.action === 'ping') {
console.log('MetaMask detector: Received ping, responding...');
sendResponse({ pong: true, source: 'metamask-detector' });
} else if (request.action === 'checkMetaMask') {
console.log('MetaMask detector: Processing checkMetaMask request');
if (request.action === 'checkMetaMask') { // Immediate check for already detected MetaMask
if (metamaskDetected && metamaskProvider) {
console.log('MetaMask detector: MetaMask already detected, responding immediately');
const response = {
available: true,
provider: true,
source: 'metamask-detector'
};
sendResponse(response);
return;
}
// Force a fresh check
const available = isMetaMaskAvailable();
const response = { const response = {
available: isMetaMaskAvailable(), available: available,
provider: getMetaMaskProvider() ? true : false provider: getMetaMaskProvider() ? true : false,
source: 'metamask-detector'
}; };
console.log('MetaMask detector: Sending response:', response); console.log('MetaMask detector: Sending response:', response);
sendResponse(response); sendResponse(response);
...@@ -72,6 +205,10 @@ ...@@ -72,6 +205,10 @@
const ethereumProvider = getMetaMaskProvider(); const ethereumProvider = getMetaMaskProvider();
if (!ethereumProvider) {
return { success: false, message: 'MetaMask provider not available.' };
}
// Request account access // Request account access
let accounts; let accounts;
try { try {
......
This diff is collapsed.
This diff is collapsed.
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment