「Widget:Custom map」の版間の差分

提供:メタファー リファンタジオ 攻略Wiki
移動先:案内検索
編集の要約なし
編集の要約なし
27行目: 27行目:


///////////////
///////////////
// APIリクエストをトラッキングするデバッグ関数
// Wikiのクロスサイト影響をデバッグするためのツール
window.debugAPIRequests = function() {
window.debugWikiURLSwitching = function() {
     console.group('=== API Request Tracking ===');
     console.group('=== Wiki URL Switching Debug ===');
      
      
     // オリジナルのjQuery ajaxメソッドを保存
     // 現在のWikiコンテキストを保存
    const currentWikiContext = {
        baseURL: API_BASE_URL,
        path: window.location.pathname,
        timestamp: new Date().toISOString()
    };
   
    // ローカルストレージのWiki関連データを確認
    console.log('LocalStorage Wiki Data:');
    Object.keys(localStorage).forEach(key => {
        if (key.includes('wiki') || key.includes('map') ||
            key.includes('rs2r') || key.includes('mario') ||
            key.includes('zelda') || key.includes('leaflet')) {
            console.log(`${key}:`, localStorage.getItem(key));
        }
    });
 
    // セッションストレージも確認
    console.log('\nSessionStorage Wiki Data:');
    Object.keys(sessionStorage).forEach(key => {
        if (key.includes('wiki') || key.includes('map') ||
            key.includes('rs2r') || key.includes('mario') ||
            key.includes('zelda') || key.includes('leaflet')) {
            console.log(`${key}:`, sessionStorage.getItem(key));
        }
    });
 
    // グローバル変数のチェック
    console.log('\nGlobal Variables Check:');
    const relevantGlobals = ['API_BASE_URL', 'map', 'drawnItems', 'L'];
    relevantGlobals.forEach(varName => {
        if (window[varName]) {
            console.log(`${varName} exists:`, {
                type: typeof window[varName],
                value: varName === 'API_BASE_URL' ? window[varName] : '[Object]'
            });
        }
    });
 
    // Cookieもチェック
    console.log('\nRelevant Cookies:');
    document.cookie.split(';').forEach(cookie => {
        if (cookie.includes('wiki') || cookie.includes('map') ||
            cookie.includes('rs2r') || cookie.includes('mario') ||
            cookie.includes('zelda')) {
            console.log('Cookie:', cookie.trim());
        }
    });
 
    // APIリクエストの監視を強化
     const originalAjax = $.ajax;
     const originalAjax = $.ajax;
   
    // ajaxリクエストをインターセプト
     $.ajax = function(settings) {
     $.ajax = function(settings) {
         const requestUrl = settings.url || '';
        // URLの変更を検出
         const requestData = settings.data || {};
         const originalUrl = settings.url;
         const knownWikis = [
            'rs2r',
            'mario_luigi_brothership',
            'zelda_eow',
            'metaphor_refantazio'
        ];
          
          
         console.group(`API Request to: ${requestUrl}`);
         // 意図しないWikiへのURLスイッチを検出
         console.log('Request details:', {
         const detectedWiki = knownWikis.find(wiki =>
             fullUrl: requestUrl,
             settings.url.includes(wiki) && !API_BASE_URL.includes(wiki)
            baseUrl: API_BASE_URL,
         );
            matchesBaseUrl: requestUrl.startsWith(API_BASE_URL),
            method: settings.type || 'GET',
            data: requestData
         });
          
          
         // URLの構成要素を分析
         if (detectedWiki) {
        try {
             console.warn('URL Switch Detected!', {
            const url = new URL(requestUrl);
                 intendedWiki: API_BASE_URL.split('/').pop(),
             console.log('URL analysis:', {
                 detectedWiki: detectedWiki,
                 protocol: url.protocol,
                 originalUrl: originalUrl,
                hostname: url.hostname,
                 stack: new Error().stack
                 pathname: url.pathname,
                search: url.search,
                 expectedHostname: new URL(API_BASE_URL).hostname,
                 hostnameMatches: url.hostname === new URL(API_BASE_URL).hostname
             });
             });
        } catch (e) {
            console.error('URL parsing error:', e);
         }
         }
       
 
        // スタックトレースを取得して呼び出し元を特定
         return originalAjax.apply(this, arguments);
        const stack = new Error().stack;
        console.log('Called from:', stack);
       
        // リクエストの実行と結果のログ
         return originalAjax.apply(this, arguments)
            .then(function(response) {
                console.log('Response received:', {
                    status: 'success',
                    dataType: typeof response,
                    hasData: !!response
                });
                console.groupEnd();
                return response;
            })
            .catch(function(error) {
                console.error('Request failed:', {
                    status: error.status,
                    statusText: error.statusText,
                    responseText: error.responseText
                });
                console.groupEnd();
                throw error;
            });
     };
     };
   
 
     // XMLHttpRequestもモニタリング
     // Leafletマップのクリーンアップ状態を確認
     const originalXHR = window.XMLHttpRequest;
     console.log('\nLeaflet State Check:');
     window.XMLHttpRequest = function() {
     if (window.map) {
         const xhr = new originalXHR();
         console.log('Map instance exists');
         const originalOpen = xhr.open;
         console.log('Drawn items count:', drawnItems?.getLayers().length || 0);
          
          
         xhr.open = function(method, url) {
         // マップのイベントリスナーを確認
            console.group(`XMLHttpRequest to: ${url}`);
        const mapEvents = map._events;
            console.log('XHR details:', {
        console.log('Map event listeners:', Object.keys(mapEvents));
                method: method,
    }
                url: url,
 
                matchesBaseUrl: url.startsWith(API_BASE_URL)
    // 前回のマップ情報が残っていないか確認
            });
    if (window.previousMapState) {
            console.log('Called from:', new Error().stack);
        console.warn('Previous map state detected:', window.previousMapState);
            console.groupEnd();
    }
           
 
            return originalOpen.apply(this, arguments);
    // クリーンアップ関数の提供
        };
    window.cleanupMapState = function() {
        console.group('Cleaning up map state');
          
          
         return xhr;
         // マップインスタンスのクリーンアップ
    };
        if (window.map) {
   
             map.remove();
    // API_BASE_URLの変更を監視
             window.map = null;
    let originalAPIBaseURL = API_BASE_URL;
    Object.defineProperty(window, 'API_BASE_URL', {
        get: function() {
            return originalAPIBaseURL;
        },
        set: function(newValue) {
             console.warn('API_BASE_URL modification detected:', {
                oldValue: originalAPIBaseURL,
                newValue: newValue,
                stack: new Error().stack
            });
             originalAPIBaseURL = newValue;
         }
         }
    });
       
   
        // drawnItemsのクリーンアップ
    // グローバル変数の監視
         if (window.drawnItems) {
    console.log('Current global state:', {
            drawnItems.clearLayers();
         API_BASE_URL: window.API_BASE_URL,
             window.drawnItems = null;
        definedInWindow: 'API_BASE_URL' in window,
        configurable: Object.getOwnPropertyDescriptor(window, 'API_BASE_URL')?.configurable,
        enumerable: Object.getOwnPropertyDescriptor(window, 'API_BASE_URL')?.enumerable
    });
   
    // APIリクエストのベースURLが変更される可能性のある箇所を検索
    console.log('Searching for potential URL modifications...');
    const scripts = document.getElementsByTagName('script');
    for (let script of scripts) {
        if (script.src) {
             console.log('External script:', script.src);
         }
         }
    }
       
   
        // Leaflet関連のグローバル変数をクリーンアップ
    console.log('Debug tools installed. Monitoring API requests...');
        ['editControl', 'drawControl', 'iconDefinitions'].forEach(varName => {
    console.groupEnd();
            if (window[varName]) {
};
                window[varName] = null;
 
             }
// リクエストURLの分析ヘルパー
window.analyzeRequestURL = function(url) {
    console.group('URL Analysis');
    try {
        const parsedUrl = new URL(url);
        console.log('URL components:', {
             full: url,
            protocol: parsedUrl.protocol,
            hostname: parsedUrl.hostname,
            pathname: parsedUrl.pathname,
            search: parsedUrl.search,
            expectedHostname: new URL(API_BASE_URL).hostname,
            isMatch: parsedUrl.hostname === new URL(API_BASE_URL).hostname
         });
         });
          
          
         // ドメインの比較
         // ローカルストレージの特定のアイテムをクリア
         if (parsedUrl.hostname !== new URL(API_BASE_URL).hostname) {
         Object.keys(localStorage).forEach(key => {
             console.warn('Domain mismatch detected!');
             if (key.includes('map') || key.includes('leaflet')) {
            console.log('Expected:', new URL(API_BASE_URL).hostname);
                localStorage.removeItem(key);
            console.log('Actual:', parsedUrl.hostname);
            }
         }
         });
          
          
    } catch (e) {
        console.log('Map state cleaned up');
         console.error('URL parsing failed:', e);
         console.groupEnd();
     }
     };
 
    console.log('\nDebug tools installed. Use cleanupMapState() to reset map state.');
     console.groupEnd();
     console.groupEnd();
};
};


// 現在のページコンテキストの分析
// URLの履歴を追跡
window.analyzePageContext = function() {
window.trackURLHistory = function() {
     console.group('Page Context Analysis');
     const urlHistory = sessionStorage.getItem('urlHistory') ?
    console.log('Document location:', {
        JSON.parse(sessionStorage.getItem('urlHistory')) : [];
        href: document.location.href,
   
         protocol: document.location.protocol,
    urlHistory.push({
         hostname: document.location.hostname,
         timestamp: new Date().toISOString(),
         pathname: document.location.pathname
         url: window.location.href,
         apiBaseUrl: API_BASE_URL
     });
     });
     console.log('Base URL elements:', {
      
         baseHref: document.querySelector('base')?.href,
    // 最新の10件のみ保持
        baseURI: document.baseURI,
    if (urlHistory.length > 10) {
        documentURI: document.documentURI
         urlHistory.shift();
     });
    }
     console.log('MediaWiki specific:', {
      
        wgServer: window.mw?.config?.get('wgServer'),
     sessionStorage.setItem('urlHistory', JSON.stringify(urlHistory));
        wgScriptPath: window.mw?.config?.get('wgScriptPath'),
   
         wgArticlePath: window.mw?.config?.get('wgArticlePath')
    console.group('URL History');
    urlHistory.forEach((entry, index) => {
         console.log(`${index + 1}:`, entry);
     });
     });
     console.groupEnd();
     console.groupEnd();

2024年11月10日 (日) 13:00時点における版