{"id":7664,"date":"2025-09-08T11:17:41","date_gmt":"2025-09-08T11:17:41","guid":{"rendered":"https:\/\/www.searchviu.com\/?page_id=7664"},"modified":"2025-09-08T15:30:26","modified_gmt":"2025-09-08T15:30:26","slug":"service-worker-test","status":"publish","type":"page","link":"https:\/\/www.searchviu.com\/en\/service-worker-test\/","title":{"rendered":"Service Worker test"},"content":{"rendered":"\t\t<div data-elementor-type=\"wp-page\" data-elementor-id=\"7664\" class=\"elementor elementor-7664\" data-elementor-post-type=\"page\">\n\t\t\t\t<div class=\"elementor-element elementor-element-7eafffd8 e-flex e-con-boxed e-con e-parent\" data-id=\"7eafffd8\" data-element_type=\"container\" data-e-type=\"container\" data-settings=\"{&quot;background_background&quot;:&quot;classic&quot;,&quot;ekit_has_onepagescroll_dot&quot;:&quot;yes&quot;}\">\n\t\t\t\t\t<div class=\"e-con-inner\">\n\t\t\t\t<div class=\"elementor-element elementor-element-3e12036c elementor-widget__width-initial elementor-widget elementor-widget-elementskit-heading\" data-id=\"3e12036c\" data-element_type=\"widget\" data-e-type=\"widget\" data-settings=\"{&quot;ekit_we_effect_on&quot;:&quot;none&quot;}\" data-widget_type=\"elementskit-heading.default\">\n\t\t\t\t\t<div class=\"ekit-wid-con\" ><div class=\"ekit-heading elementskit-section-title-wraper center   ekit_heading_tablet-   ekit_heading_mobile-\"><h2 class=\"ekit-heading--title elementskit-section-title \">Service Worker Test Page<\/h2>\t\t\t\t<div class='ekit-heading__description'>\n\t\t\t\t\t<p>Real-time Service Worker testing to ensure proper functionality for both users and search engine crawlers like Googlebot.<\/p>\n\t\t\t\t<\/div>\n\t\t\t<\/div><\/div>\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t<div class=\"elementor-element elementor-element-37e0f3c e-flex e-con-boxed e-con e-parent\" data-id=\"37e0f3c\" data-element_type=\"container\" data-e-type=\"container\" data-settings=\"{&quot;ekit_has_onepagescroll_dot&quot;:&quot;yes&quot;}\">\n\t\t\t\t\t<div class=\"e-con-inner\">\n\t\t\t\t<div class=\"elementor-element elementor-element-13bfc6e elementor-widget elementor-widget-html\" data-id=\"13bfc6e\" data-element_type=\"widget\" data-e-type=\"widget\" data-settings=\"{&quot;ekit_we_effect_on&quot;:&quot;none&quot;}\" data-widget_type=\"html.default\">\n\t\t\t\t\t <style>\n        * {\n            margin: 0;\n            padding: 0;\n            box-sizing: border-box;\n        }\n\n\n\n        .container {\n            max-width: 1200px;\n            margin: 0 auto;\n            padding: 20px;\n        }\n\n\n        h1 {\n            font-weight: 700;\n            font-size: 2.5em;\n            margin-bottom: 10px;\n        }\n\n        .brand {\n            color: #FFE62A;\n        }\n\n        .subtitle {\n            color: #8A8A8A;\n            font-weight: 400;\n        }\n\n        .test-section {\n            background: #FFFFFF;\n            border-radius: 8px;\n            padding: 30px;\n            margin-bottom: 20px;\n            box-shadow: 0 2px 4px rgba(0,0,0,0.1);\n            position: relative;\n            overflow: hidden;\n        }\n\n        .test-section.running::before {\n            content: \"\";\n            position: absolute;\n            top: 0;\n            left: -100%;\n            width: 100%;\n            height: 2px;\n            background: linear-gradient(90deg, transparent, #0B9D96, transparent);\n            animation: scanning 2s linear infinite;\n        }\n\n        @keyframes scanning {\n            0% { left: -100%; }\n            100% { left: 100%; }\n        }\n\n        h2 {\n            color: #131A2D;\n            font-weight: 600;\n            font-size: 1.8em;\n            margin-bottom: 15px;\n            border-left: 4px solid #0B9D96;\n            padding-left: 15px;\n        }\n\n        h3 {\n            color: #467487;\n            font-weight: 500;\n            font-size: 1.2em;\n            margin: 20px 0 10px 0;\n        }\n\n        .status {\n            padding: 10px 15px;\n            border-radius: 5px;\n            margin: 10px 0;\n            font-weight: 500;\n            display: flex;\n            align-items: center;\n            gap: 10px;\n            transition: all 0.3s ease;\n        }\n\n        .status.success {\n            background: #4CAF50;\n            color: #FFFFFF;\n        }\n\n        .status.error {\n            background: #F44336;\n            color: #FFFFFF;\n        }\n\n        .status.warning {\n            background: #FF9800;\n            color: #FFFFFF;\n        }\n\n        .status.info {\n            background: #2196F3;\n            color: #FFFFFF;\n        }\n\n        .status.disabled {\n            background: #9E9E9E;\n            color: #FFFFFF;\n            opacity: 0.8;\n        }\n\n        .status::before {\n            font-size: 1.2em;\n        }\n\n        .status.success::before {\n            content: \"\u2705\";\n        }\n\n        .status.error::before {\n            content: \"\u274c\";\n        }\n\n        .status.warning::before {\n            content: \"\u26a0\ufe0f\";\n        }\n\n        .status.info::before {\n            content: \"\u2139\ufe0f\";\n        }\n\n        .status.disabled::before {\n            content: \"\u2298\";\n        }\n\n        .explanation {\n            background: #F4F4F4;\n            padding: 20px;\n            border-radius: 5px;\n            margin: 15px 0;\n        }\n\n        .explanation h4 {\n            color: #131A2D;\n            font-weight: 600;\n            margin-bottom: 10px;\n        }\n\n        .explanation p {\n            color: #8A8A8A;\n            margin-bottom: 10px;\n        }\n\n        .test-result {\n            font-family: 'Courier New', monospace;\n            background: #131A2D;\n            color: #FFE62A;\n            padding: 15px;\n            border-radius: 5px;\n            margin: 10px 0;\n            overflow-x: auto;\n            white-space: pre-wrap;\n            word-wrap: break-word;\n            max-height: 300px;\n            overflow-y: auto;\n        }\n\n        .important {\n            color: #0B9D96;\n            font-weight: 600;\n        }\n\n        .sub-test {\n            margin-left: 20px;\n            padding: 8px 12px;\n            background: #F4F4F4;\n            border-left: 3px solid #0B9D96;\n            margin-top: 10px;\n            border-radius: 0 5px 5px 0;\n        }\n\n        .loading {\n            display: inline-block;\n            width: 20px;\n            height: 20px;\n            border: 3px solid #F4F4F4;\n            border-top: 3px solid #0B9D96;\n            border-radius: 50%;\n            animation: spin 1s linear infinite;\n            margin-left: 10px;\n        }\n\n        @keyframes spin {\n            0% { transform: rotate(0deg); }\n            100% { transform: rotate(360deg); }\n        }\n\n        .progress-bar {\n            width: 100%;\n            height: 30px;\n            background: #F4F4F4;\n            border-radius: 15px;\n            overflow: hidden;\n            margin: 20px 0;\n        }\n\n        .progress-fill {\n            height: 100%;\n            background: linear-gradient(90deg, #0B9D96, #FFE62A);\n            transition: width 0.5s ease;\n            display: flex;\n            align-items: center;\n            justify-content: center;\n            color: #131A2D;\n            font-weight: 600;\n        }\n\n        .cache-item {\n            background: #F4F4F4;\n            padding: 8px 12px;\n            border-radius: 4px;\n            margin: 5px 0;\n            display: flex;\n            justify-content: space-between;\n            align-items: center;\n        }\n\n        .cache-item code {\n            color: #0B9D96;\n            font-size: 0.9em;\n        }\n\n        .live-indicator {\n            display: inline-block;\n            width: 10px;\n            height: 10px;\n            background: #4CAF50;\n            border-radius: 50%;\n            animation: pulse 2s infinite;\n            margin-right: 5px;\n        }\n\n        @keyframes pulse {\n            0%, 100% { opacity: 1; }\n            50% { opacity: 0.5; }\n        }\n\n        .test-grid {\n            display: grid;\n            grid-template-columns: repeat(auto-fit, minmax(250px, 1fr));\n            gap: 15px;\n            margin: 20px 0;\n        }\n\n        .test-card {\n            background: #F4F4F4;\n            padding: 15px;\n            border-radius: 8px;\n            text-align: center;\n        }\n\n        .test-card .value {\n            font-size: 2em;\n            font-weight: 700;\n            color: #0B9D96;\n        }\n\n        .test-card .label {\n            color: #8A8A8A;\n            font-size: 0.9em;\n            margin-top: 5px;\n        }\n    <\/style>\n    <div class=\"container\">\n        <!-- Live Status -->\n        <div class=\"test-section\">\n            <h2><span class=\"live-indicator\"><\/span>Master Test Controller<\/h2>\n            <div id=\"live-status\" class=\"status info\">Initializing automatic test sequence...<\/div>\n            <div class=\"progress-bar\">\n                <div id=\"progress\" class=\"progress-fill\" style=\"width: 0%\">0%<\/div>\n            <\/div>\n            <div id=\"test-stats\" class=\"test-grid\" style=\"display: none;\">\n                <div class=\"test-card\">\n                    <div class=\"value\" id=\"stat-total\">0<\/div>\n                    <div class=\"label\">Total Tests<\/div>\n                <\/div>\n                <div class=\"test-card\">\n                    <div class=\"value\" id=\"stat-passed\" style=\"color: #4CAF50;\">0<\/div>\n                    <div class=\"label\">Passed<\/div>\n                <\/div>\n                <div class=\"test-card\">\n                    <div class=\"value\" id=\"stat-failed\" style=\"color: #F44336;\">0<\/div>\n                    <div class=\"label\">Failed<\/div>\n                <\/div>\n                <div class=\"test-card\">\n                    <div class=\"value\" id=\"stat-time\">0ms<\/div>\n                    <div class=\"label\">Total Time<\/div>\n                <\/div>\n            <\/div>\n        <\/div>\n\n        <!-- 1. Registration & Activation -->\n        <div id=\"section-registration\" class=\"test-section\">\n            <h2>1. Registration & Activation<\/h2>\n            <div id=\"registration-status\" class=\"status info\">Waiting to start...<\/div>\n            <div id=\"registration-substatus\" class=\"sub-test\" style=\"display:none;\"><\/div>\n            <div id=\"registration-details\" class=\"test-result\" style=\"display:none;\"><\/div>\n            \n            <div class=\"explanation\">\n                <h4>What we're testing:<\/h4>\n                <p>\u2022 Real Service Worker registration with proper scope<\/p>\n                <p>\u2022 Activation and claim of all clients<\/p>\n                <p>\u2022 Lifecycle event handling<\/p>\n                <p><span class=\"important\">Bot Impact:<\/span> Googlebot may register but not wait for activation<\/p>\n            <\/div>\n        <\/div>\n\n        <!-- 2. Cache Operations -->\n        <div id=\"section-cache\" class=\"test-section\">\n            <h2>2. Cache Storage Operations<\/h2>\n            <div id=\"cache-status\" class=\"status info\">Waiting to start...<\/div>\n            <div id=\"cache-write-status\" class=\"sub-test\" style=\"display:none;\"><\/div>\n            <div id=\"cache-read-status\" class=\"sub-test\" style=\"display:none;\"><\/div>\n            <div id=\"cache-delete-status\" class=\"sub-test\" style=\"display:none;\"><\/div>\n            <div id=\"cache-list\" style=\"margin: 15px 0;\"><\/div>\n            <div id=\"cache-details\" class=\"test-result\" style=\"display:none;\"><\/div>\n            \n            <div class=\"explanation\">\n                <h4>What we're testing:<\/h4>\n                <p>\u2022 Writing data to cache storage<\/p>\n                <p>\u2022 Reading cached data<\/p>\n                <p>\u2022 Cache persistence and management<\/p>\n                <p><span class=\"important\">Bot Impact:<\/span> Bots don't persist cache between crawls<\/p>\n            <\/div>\n        <\/div>\n\n        <!-- 3. Fetch Interception -->\n        <div id=\"section-fetch\" class=\"test-section\">\n            <h2>3. Network Request Interception<\/h2>\n            <div id=\"fetch-status\" class=\"status info\">Waiting to start...<\/div>\n            <div id=\"fetch-intercept-status\" class=\"sub-test\" style=\"display:none;\"><\/div>\n            <div id=\"fetch-offline-status\" class=\"sub-test\" style=\"display:none;\"><\/div>\n            <div id=\"fetch-modify-status\" class=\"sub-test\" style=\"display:none;\"><\/div>\n            <div id=\"fetch-details\" class=\"test-result\" style=\"display:none;\"><\/div>\n            \n            <div class=\"explanation\">\n                <h4>What we're testing:<\/h4>\n                <p>\u2022 Intercepting network requests<\/p>\n                <p>\u2022 Modifying responses on-the-fly<\/p>\n                <p>\u2022 Serving content from cache when offline<\/p>\n                <p><span class=\"important\">Bot Impact:<\/span> Critical for SEO - bots may not execute fetch handlers<\/p>\n            <\/div>\n        <\/div>\n\n        <!-- 4. PostMessage Communication -->\n        <div id=\"section-message\" class=\"test-section\">\n            <h2>4. Client-Worker Communication<\/h2>\n            <div id=\"message-status\" class=\"status info\">Waiting to start...<\/div>\n            <div id=\"message-ping-status\" class=\"sub-test\" style=\"display:none;\"><\/div>\n            <div id=\"message-broadcast-status\" class=\"sub-test\" style=\"display:none;\"><\/div>\n            <div id=\"message-details\" class=\"test-result\" style=\"display:none;\"><\/div>\n            \n            <div class=\"explanation\">\n                <h4>What we're testing:<\/h4>\n                <p>\u2022 Two-way communication between page and worker<\/p>\n                <p>\u2022 Message channel functionality<\/p>\n                <p>\u2022 Broadcasting to all clients<\/p>\n                <p><span class=\"important\">Bot Impact:<\/span> Bots typically don't use message channels<\/p>\n            <\/div>\n        <\/div>\n\n        <!-- 5. Background Sync -->\n        <div id=\"section-sync\" class=\"test-section\">\n            <h2>5. Background Sync & Push<\/h2>\n            <div id=\"sync-status\" class=\"status info\">Waiting to start...<\/div>\n            <div id=\"sync-register-status\" class=\"sub-test\" style=\"display:none;\"><\/div>\n            <div id=\"sync-push-status\" class=\"sub-test\" style=\"display:none;\"><\/div>\n            <div id=\"sync-details\" class=\"test-result\" style=\"display:none;\"><\/div>\n            \n            <div class=\"explanation\">\n                <h4>What we're testing:<\/h4>\n                <p>\u2022 Background sync registration<\/p>\n                <p>\u2022 Push notification capability<\/p>\n                <p>\u2022 Periodic background tasks<\/p>\n                <p><span class=\"important\">Bot Impact:<\/span> Not relevant for bots - they don't support background features<\/p>\n            <\/div>\n        <\/div>\n\n        <!-- 6. IndexedDB Access -->\n        <div id=\"section-idb\" class=\"test-section\">\n            <h2>6. IndexedDB Storage<\/h2>\n            <div id=\"idb-status\" class=\"status info\">Waiting to start...<\/div>\n            <div id=\"idb-write-status\" class=\"sub-test\" style=\"display:none;\"><\/div>\n            <div id=\"idb-worker-status\" class=\"sub-test\" style=\"display:none;\"><\/div>\n            <div id=\"idb-details\" class=\"test-result\" style=\"display:none;\"><\/div>\n            \n            <div class=\"explanation\">\n                <h4>What we're testing:<\/h4>\n                <p>\u2022 IndexedDB access from Service Worker<\/p>\n                <p>\u2022 Data persistence across sessions<\/p>\n                <p>\u2022 Complex data storage capabilities<\/p>\n                <p><span class=\"important\">Bot Impact:<\/span> Bots don't maintain IndexedDB state<\/p>\n            <\/div>\n        <\/div>\n\n        <!-- 7. Performance Metrics -->\n        <div id=\"section-performance\" class=\"test-section\">\n            <h2>7. Performance Impact<\/h2>\n            <div id=\"performance-status\" class=\"status info\">Waiting to start...<\/div>\n            <div id=\"performance-details\" class=\"test-result\" style=\"display:none;\"><\/div>\n            \n            <div class=\"explanation\">\n                <h4>What we're testing:<\/h4>\n                <p>\u2022 Service Worker overhead<\/p>\n                <p>\u2022 Cache performance vs network<\/p>\n                <p>\u2022 Registration timing<\/p>\n                <p><span class=\"important\">Bot Impact:<\/span> Performance metrics help understand bot crawl efficiency<\/p>\n            <\/div>\n        <\/div>\n\n        <!-- Bot Detection -->\n        <div id=\"section-bot\" class=\"test-section\">\n            <h2>8. User Agent Analysis<\/h2>\n            <div id=\"bot-status\" class=\"status info\">Analyzing user agent...<\/div>\n            <div id=\"bot-details\" class=\"test-result\" style=\"display:none;\"><\/div>\n        <\/div>\n\n        <!-- Summary -->\n        <div class=\"test-section\" style=\"border: 2px solid #0B9D96;\">\n            <h2 style=\"border-left-color: #0B9D96;\">Complete Test Summary<\/h2>\n            <div id=\"summary\" class=\"status info\">Tests will begin automatically...<\/div>\n            <div id=\"summary-details\" class=\"test-result\" style=\"display:none; margin-top: 20px;\"><\/div>\n            \n            <div class=\"explanation\" style=\"background: #F4F4F4; margin-top: 20px;\">\n                <h4>SEO Best Practices:<\/h4>\n                <p>\u2713 Always serve critical content server-side<\/p>\n                <p>\u2713 Use network-first strategy for content pages<\/p>\n                <p>\u2713 Implement proper fallbacks for bot traffic<\/p>\n                <p>\u2713 Test with Chrome DevTools in Googlebot mode<\/p>\n                <p>\u2713 Monitor Search Console for rendering issues<\/p>\n            <\/div>\n        <\/div>\n    <\/div>\n\n    <script>\n       \n        const swUrl = \"https:\/\/www.searchviu.com\/test-sw.js\"\n\n        \/\/ Global variables\n        let registration = null;\n        let testResults = {};\n        let progress = 0;\n        let isBot = false;\n        let testStartTime = null;\n        let totalTests = 0;\n        let passedTests = 0;\n        let failedTests = 0;\n\n        \/\/ Helper functions\n        function updateStatus(elementId, message, type = 'info') {\n            const element = document.getElementById(elementId);\n            if (element) {\n                element.textContent = message;\n                element.className = `status ${type}`;\n            }\n        }\n\n        function updateSubStatus(elementId, message, type = 'info') {\n            const element = document.getElementById(elementId);\n            if (element) {\n                element.textContent = message;\n                element.className = `sub-test ${type}`;\n                element.style.display = 'block';\n            }\n        }\n\n        function showDetails(elementId, content) {\n            const element = document.getElementById(elementId);\n            if (element) {\n                element.textContent = typeof content === 'object' ? JSON.stringify(content, null, 2) : content;\n                element.style.display = 'block';\n            }\n        }\n\n        function updateProgress(value) {\n            progress = Math.min(value, 100);\n            const progressBar = document.getElementById('progress');\n            if (progressBar) {\n                progressBar.style.width = `${progress}%`;\n                progressBar.textContent = `${progress}%`;\n            }\n        }\n\n        function setTestRunning(sectionId, isRunning) {\n            const section = document.getElementById(sectionId);\n            if (section) {\n                if (isRunning) {\n                    section.classList.add('running');\n                } else {\n                    section.classList.remove('running');\n                }\n            }\n        }\n\n        function updateStats() {\n            document.getElementById('test-stats').style.display = 'grid';\n            document.getElementById('stat-total').textContent = totalTests;\n            document.getElementById('stat-passed').textContent = passedTests;\n            document.getElementById('stat-failed').textContent = failedTests;\n            if (testStartTime) {\n                const elapsed = Date.now() - testStartTime;\n                document.getElementById('stat-time').textContent = `${elapsed}ms`;\n            }\n        }\n\n        function recordTest(name, success) {\n            totalTests++;\n            if (success) {\n                passedTests++;\n            } else {\n                failedTests++;\n            }\n            testResults[name] = success;\n            updateStats();\n        }\n\n        \/\/ Automatic test functions\n        async function detectBot() {\n            const ua = navigator.userAgent.toLowerCase();\n            const bots = ['googlebot', 'bingbot', 'slurp', 'duckduckbot', 'baiduspider', 'yandexbot', 'facebookexternalhit', 'twitterbot', 'linkedinbot', 'whatsapp', 'applebot'];\n            \n            isBot = bots.some(bot => ua.includes(bot));\n            const botName = bots.find(bot => ua.includes(bot)) || 'None';\n            \n            updateStatus('bot-status', \n                isBot ? `Bot detected: ${botName}` : 'Regular browser detected', \n                isBot ? 'warning' : 'success'\n            );\n            \n            showDetails('bot-details', {\n                userAgent: navigator.userAgent,\n                isBot: isBot,\n                botName: botName,\n                recommendation: isBot ? 'Ensure server-side rendering for all content' : 'Full Service Worker support available'\n            });\n            \n            return isBot;\n        }\n\n        async function testRegistration() {\n            setTestRunning('section-registration', true);\n            updateStatus('registration-status', 'Starting Service Worker registration...', 'info');\n            \n            try {\n                \/\/ Check if there's already a controller\n                if (navigator.serviceWorker.controller) {\n                    console.log('Page already controlled by Service Worker:', navigator.serviceWorker.controller.scriptURL);\n                }\n                \n                updateSubStatus('registration-substatus', 'Registering Service Worker...', 'info');\n                registration = await navigator.serviceWorker.register(swUrl, { scope: '\/' });\n                \n                \/\/ Wait for activation\n                await new Promise((resolve) => {\n                    if (registration.active) {\n                        resolve();\n                    } else if (registration.installing || registration.waiting) {\n                        const worker = registration.installing || registration.waiting;\n                        worker.addEventListener('statechange', function handler() {\n                            if (worker.state === 'activated') {\n                                worker.removeEventListener('statechange', handler);\n                                resolve();\n                            }\n                        });\n                    }\n                    setTimeout(resolve, 3000); \/\/ Timeout after 3 seconds\n                });\n\n                \/\/ Check if page is controlled\n                const isControlled = navigator.serviceWorker.controller !== null;\n                \n                updateStatus('registration-status', 'Service Worker registered and active!', 'success');\n                updateSubStatus('registration-substatus', '\u2713 Registration successful', 'success');\n                showDetails('registration-details', {\n                    scope: registration.scope,\n                    state: registration.active ? 'active' : 'pending',\n                    scriptURL: registration.active ? registration.active.scriptURL : 'N\/A',\n                    controlled: isControlled,\n                    controller: navigator.serviceWorker.controller ? navigator.serviceWorker.controller.scriptURL : 'None',\n                    updateViaCache: registration.updateViaCache,\n                    navigationPreload: registration.navigationPreload ? 'supported' : 'not supported',\n                    note: !isControlled ? 'Page not controlled yet. Refresh may be needed for full functionality.' : 'Page is controlled by Service Worker'\n                });\n                recordTest('registration', true);\n                setTestRunning('section-registration', false);\n                \n                \/\/ If not controlled, show warning\n                if (!isControlled) {\n                    console.warn('Service Worker registered but not controlling the page. Some tests may fail.');\n                }\n                \n                return true;\n            } catch (err) {\n                updateStatus('registration-status', `Registration failed: ${err.message}`, 'error');\n                updateSubStatus('registration-substatus', '\u2717 Registration error', 'error');\n                showDetails('registration-details', `Error Type: ${err.name}\\nMessage: ${err.message}\\nStack: ${err.stack}\\n\\nMake sure test-sw.js exists in the root directory.`);\n                recordTest('registration', false);\n                setTestRunning('section-registration', false);\n                return false;\n            }\n        }\n\n        async function testCacheOperations() {\n            setTestRunning('section-cache', true);\n            updateStatus('cache-status', 'Testing cache operations...', 'info');\n            \n            \/\/ Test cache write\n            updateSubStatus('cache-write-status', 'Writing to cache...', 'info');\n            try {\n                const cache = await caches.open('searchviu-test');\n                const testResponse = new Response(JSON.stringify({\n                    test: true,\n                    timestamp: Date.now(),\n                    message: 'Automatic test cache data'\n                }));\n                \n                await cache.put('\/auto-test-cache', testResponse);\n                updateSubStatus('cache-write-status', '\u2713 Cache write successful', 'success');\n                recordTest('cacheWrite', true);\n            } catch (err) {\n                updateSubStatus('cache-write-status', `\u2717 Cache write failed: ${err.message}`, 'error');\n                recordTest('cacheWrite', false);\n            }\n\n            \/\/ Test cache read\n            updateSubStatus('cache-read-status', 'Reading from cache...', 'info');\n            try {\n                const cache = await caches.open('searchviu-test');\n                const response = await cache.match('\/auto-test-cache');\n                \n                if (response) {\n                    const data = await response.json();\n                    updateSubStatus('cache-read-status', '\u2713 Cache read successful', 'success');\n                    showDetails('cache-details', data);\n                    recordTest('cacheRead', true);\n                } else {\n                    updateSubStatus('cache-read-status', '\u2717 No cached data found', 'error');\n                    recordTest('cacheRead', false);\n                }\n            } catch (err) {\n                updateSubStatus('cache-read-status', `\u2717 Cache read failed: ${err.message}`, 'error');\n                recordTest('cacheRead', false);\n            }\n\n            \/\/ List caches\n            try {\n                const cacheNames = await caches.keys();\n                const cacheList = document.getElementById('cache-list');\n                cacheList.innerHTML = '<h3>Active Caches:<\/h3>';\n                \n                for (const name of cacheNames) {\n                    const cache = await caches.open(name);\n                    const requests = await cache.keys();\n                    \n                    const item = document.createElement('div');\n                    item.className = 'cache-item';\n                    item.innerHTML = `\n                        <code>${name}<\/code>\n                        <span>${requests.length} items cached<\/span>\n                    `;\n                    cacheList.appendChild(item);\n                }\n            } catch (err) {\n                console.error('Failed to list caches:', err);\n            }\n\n            \/\/ Test cache delete\n            updateSubStatus('cache-delete-status', 'Testing cache cleanup...', 'info');\n            try {\n                await caches.delete('searchviu-test');\n                updateSubStatus('cache-delete-status', '\u2713 Cache cleanup successful', 'success');\n                recordTest('cacheDelete', true);\n            } catch (err) {\n                updateSubStatus('cache-delete-status', `\u2717 Cache cleanup failed: ${err.message}`, 'error');\n                recordTest('cacheDelete', false);\n            }\n\n            updateStatus('cache-status', isBot ? 'Cache tests complete (limited for bots)' : 'All cache operations tested', isBot ? 'warning' : 'success');\n            setTestRunning('section-cache', false);\n        }\n\n        async function testFetchInterception() {\n            setTestRunning('section-fetch', true);\n            updateStatus('fetch-status', 'Testing fetch interception...', 'info');\n            \n            \/\/ Test basic interception\n            updateSubStatus('fetch-intercept-status', 'Testing request interception...', 'info');\n            try {\n                const response = await fetch('\/api\/test-fetch');\n                const data = await response.json();\n                \n                if (data.intercepted) {\n                    updateSubStatus('fetch-intercept-status', '\u2713 Fetch successfully intercepted', 'success');\n                    recordTest('fetchInterception', true);\n                } else {\n                    updateSubStatus('fetch-intercept-status', '\u2717 Fetch not intercepted', 'error');\n                    recordTest('fetchInterception', false);\n                }\n            } catch (err) {\n                updateSubStatus('fetch-intercept-status', `\u2717 Interception failed: ${err.message}`, 'error');\n                recordTest('fetchInterception', false);\n            }\n\n            \/\/ Test offline response\n            updateSubStatus('fetch-offline-status', 'Testing offline response...', 'info');\n            try {\n                const response = await fetch('\/api\/test-offline');\n                const data = await response.json();\n                updateSubStatus('fetch-offline-status', '\u2713 Offline response working', 'success');\n                recordTest('offlineResponse', true);\n            } catch (err) {\n                updateSubStatus('fetch-offline-status', `\u2717 Offline response failed: ${err.message}`, 'error');\n                recordTest('offlineResponse', false);\n            }\n\n            \/\/ Test response modification\n            updateSubStatus('fetch-modify-status', 'Testing response modification...', 'info');\n            try {\n                const response = await fetch('\/api\/test-modified');\n                const data = await response.json();\n                \n                if (data.modified) {\n                    updateSubStatus('fetch-modify-status', '\u2713 Response modification working', 'success');\n                    showDetails('fetch-details', data);\n                    recordTest('responseModification', true);\n                } else {\n                    updateSubStatus('fetch-modify-status', '\u2717 Response not modified', 'error');\n                    recordTest('responseModification', false);\n                }\n            } catch (err) {\n                updateSubStatus('fetch-modify-status', `\u2717 Modification failed: ${err.message}`, 'error');\n                recordTest('responseModification', false);\n            }\n\n            updateStatus('fetch-status', 'All fetch tests completed', 'success');\n            setTestRunning('section-fetch', false);\n        }\n\n        async function testMessaging() {\n            setTestRunning('section-message', true);\n            updateStatus('message-status', 'Testing message passing...', 'info');\n            \n            if (!registration || !registration.active) {\n                updateStatus('message-status', 'Service Worker not active', 'error');\n                setTestRunning('section-message', false);\n                return;\n            }\n\n            \/\/ Test ping-pong\n            updateSubStatus('message-ping-status', 'Testing ping-pong communication...', 'info');\n            try {\n                await new Promise((resolve, reject) => {\n                    const messageChannel = new MessageChannel();\n                    const timeout = setTimeout(() => reject(new Error('Timeout')), 3000);\n                    \n                    messageChannel.port1.onmessage = (event) => {\n                        clearTimeout(timeout);\n                        if (event.data.type === 'PONG') {\n                            updateSubStatus('message-ping-status', '\u2713 Ping-pong successful', 'success');\n                            showDetails('message-details', event.data);\n                            recordTest('messaging', true);\n                            resolve();\n                        }\n                    };\n\n                    registration.active.postMessage(\n                        { type: 'PING' },\n                        [messageChannel.port2]\n                    );\n                });\n            } catch (err) {\n                updateSubStatus('message-ping-status', `\u2717 Ping-pong failed: ${err.message}`, 'error');\n                recordTest('messaging', false);\n            }\n\n            \/\/ Test broadcast\n            updateSubStatus('message-broadcast-status', 'Testing broadcast messaging...', 'info');\n            try {\n                await new Promise((resolve, reject) => {\n                    const timeout = setTimeout(() => reject(new Error('Timeout')), 3000);\n                    \n                    navigator.serviceWorker.addEventListener('message', function handler(event) {\n                        if (event.data.type === 'BROADCAST_MESSAGE') {\n                            clearTimeout(timeout);\n                            updateSubStatus('message-broadcast-status', '\u2713 Broadcast received', 'success');\n                            recordTest('broadcast', true);\n                            navigator.serviceWorker.removeEventListener('message', handler);\n                            resolve();\n                        }\n                    });\n\n                    const messageChannel = new MessageChannel();\n                    registration.active.postMessage(\n                        { type: 'BROADCAST', message: 'Automatic test broadcast' },\n                        [messageChannel.port2]\n                    );\n                });\n            } catch (err) {\n                updateSubStatus('message-broadcast-status', `\u2717 Broadcast failed: ${err.message}`, 'error');\n                recordTest('broadcast', false);\n            }\n\n            updateStatus('message-status', 'Message passing tests completed', 'success');\n            setTestRunning('section-message', false);\n        }\n\n        async function testBackgroundFeatures() {\n            setTestRunning('section-sync', true);\n            \n            if (isBot) {\n                updateStatus('sync-status', 'Background features not relevant for bots', 'disabled');\n                updateSubStatus('sync-register-status', '\u2298 Skipped - bot detected', 'disabled');\n                updateSubStatus('sync-push-status', '\u2298 Skipped - bot detected', 'disabled');\n                recordTest('backgroundSync', 'skipped');\n                recordTest('push', 'skipped');\n                setTestRunning('section-sync', false);\n                return;\n            }\n\n            updateStatus('sync-status', 'Testing background capabilities...', 'info');\n\n            \/\/ Test background sync\n            updateSubStatus('sync-register-status', 'Testing background sync...', 'info');\n            try {\n                if ('sync' in registration) {\n                    await registration.sync.register('test-sync');\n                    updateSubStatus('sync-register-status', '\u2713 Background sync registered', 'success');\n                    recordTest('backgroundSync', true);\n                } else {\n                    updateSubStatus('sync-register-status', '\u2717 Background sync not supported', 'error');\n                    recordTest('backgroundSync', false);\n                }\n            } catch (err) {\n                updateSubStatus('sync-register-status', `\u2717 Background sync failed: ${err.message}`, 'error');\n                recordTest('backgroundSync', false);\n            }\n\n            \/\/ Test push capability\n            updateSubStatus('sync-push-status', 'Testing push notifications...', 'info');\n            try {\n                if ('PushManager' in window) {\n                    \/\/ Don't actually request permission in automatic test\n                    updateSubStatus('sync-push-status', '\u2713 Push API available', 'success');\n                    recordTest('push', true);\n                } else {\n                    updateSubStatus('sync-push-status', '\u2717 Push API not supported', 'error');\n                    recordTest('push', false);\n                }\n            } catch (err) {\n                updateSubStatus('sync-push-status', `\u2717 Push test failed: ${err.message}`, 'error');\n                recordTest('push', false);\n            }\n\n            updateStatus('sync-status', 'Background feature tests completed', 'success');\n            setTestRunning('section-sync', false);\n        }\n\n        async function testIndexedDB() {\n            setTestRunning('section-idb', true);\n            updateStatus('idb-status', 'Testing IndexedDB...', 'info');\n            \n            \/\/ Test IDB from page\n            updateSubStatus('idb-write-status', 'Testing IndexedDB write\/read...', 'info');\n            try {\n                await new Promise((resolve, reject) => {\n                    const request = indexedDB.open('TestDB', 1);\n                    \n                    request.onupgradeneeded = (event) => {\n                        const db = event.target.result;\n                        if (!db.objectStoreNames.contains('testStore')) {\n                            db.createObjectStore('testStore', { keyPath: 'id' });\n                        }\n                    };\n\n                    request.onsuccess = (event) => {\n                        const db = event.target.result;\n                        const transaction = db.transaction(['testStore'], 'readwrite');\n                        const store = transaction.objectStore('testStore');\n                        \n                        store.put({ id: 1, data: 'Automatic test data', timestamp: Date.now() });\n                        \n                        const getRequest = store.get(1);\n                        getRequest.onsuccess = () => {\n                            updateSubStatus('idb-write-status', '\u2713 IndexedDB read\/write successful', 'success');\n                            showDetails('idb-details', getRequest.result);\n                            recordTest('indexedDB', true);\n                            resolve();\n                        };\n                        getRequest.onerror = () => {\n                            reject(new Error('IDB read failed'));\n                        };\n                    };\n\n                    request.onerror = () => {\n                        reject(new Error('IDB open failed'));\n                    };\n                });\n            } catch (err) {\n                updateSubStatus('idb-write-status', `\u2717 IndexedDB failed: ${err.message}`, 'error');\n                recordTest('indexedDB', false);\n            }\n\n            \/\/ Test IDB from worker\n            updateSubStatus('idb-worker-status', 'Testing worker IndexedDB access...', 'info');\n            if (registration && registration.active) {\n                try {\n                    await new Promise((resolve, reject) => {\n                        const messageChannel = new MessageChannel();\n                        const timeout = setTimeout(() => reject(new Error('Timeout')), 3000);\n                        \n                        messageChannel.port1.onmessage = (event) => {\n                            clearTimeout(timeout);\n                            if (event.data.type === 'IDB_RESULT') {\n                                updateSubStatus('idb-worker-status', \n                                    event.data.success ? '\u2713 Worker IDB access successful' : '\u2717 Worker IDB access failed',\n                                    event.data.success ? 'success' : 'error'\n                                );\n                                recordTest('workerIDB', event.data.success);\n                                resolve();\n                            }\n                        };\n\n                        registration.active.postMessage(\n                            { type: 'IDB_TEST' },\n                            [messageChannel.port2]\n                        );\n                    });\n                } catch (err) {\n                    updateSubStatus('idb-worker-status', `\u2717 Worker IDB test failed: ${err.message}`, 'error');\n                    recordTest('workerIDB', false);\n                }\n            } else {\n                updateSubStatus('idb-worker-status', '\u2298 Skipped - Service Worker not active', 'disabled');\n            }\n\n            updateStatus('idb-status', 'IndexedDB tests completed', 'success');\n            setTestRunning('section-idb', false);\n        }\n\n        async function measurePerformance() {\n            setTestRunning('section-performance', true);\n            updateStatus('performance-status', 'Measuring performance impact...', 'info');\n            \n            const metrics = {\n                fetchTime: 0,\n                cacheTime: 0,\n                registrationTime: 0\n            };\n\n            \/\/ Measure fetch time\n            const fetchStart = performance.now();\n            try {\n                await fetch('\/api\/test-fetch');\n                metrics.fetchTime = performance.now() - fetchStart;\n            } catch (err) {\n                metrics.fetchTime = -1;\n            }\n\n            \/\/ Measure cache time\n            const cacheStart = performance.now();\n            try {\n                const cache = await caches.open('perf-test');\n                await cache.put('\/perf', new Response('test'));\n                await cache.match('\/perf');\n                metrics.cacheTime = performance.now() - cacheStart;\n                await caches.delete('perf-test');\n            } catch (err) {\n                metrics.cacheTime = -1;\n            }\n\n            const verdict = metrics.fetchTime < 100 ? 'Excellent' : \n                          metrics.fetchTime < 300 ? 'Good' : \n                          'Needs optimization';\n\n            updateStatus('performance-status', `Performance measured: ${verdict}`, \n                        verdict === 'Excellent' ? 'success' : \n                        verdict === 'Good' ? 'warning' : 'error');\n            \n            showDetails('performance-details', {\n                ...metrics,\n                fetchTime: `${metrics.fetchTime.toFixed(2)}ms`,\n                cacheTime: `${metrics.cacheTime.toFixed(2)}ms`,\n                verdict: verdict,\n                recommendation: isBot ? 'Bot performance may vary' : 'Consider optimizing if times are high'\n            });\n\n            recordTest('performance', metrics.fetchTime > 0);\n            setTestRunning('section-performance', false);\n        }\n\n        function generateSummary() {\n            const summaryData = {\n                totalTests: totalTests,\n                passed: passedTests,\n                failed: failedTests,\n                successRate: totalTests > 0 ? `${Math.round((passedTests \/ totalTests) * 100)}%` : '0%',\n                executionTime: `${Date.now() - testStartTime}ms`,\n                isBot: isBot,\n                botImpact: isBot ? 'Limited functionality - ensure server-side rendering' : 'Full functionality available',\n                timestamp: new Date().toISOString(),\n                results: testResults,\n                recommendations: []\n            };\n\n            if (isBot) {\n                summaryData.recommendations.push('CRITICAL: Implement server-side rendering for all content');\n                summaryData.recommendations.push('Use network-first caching strategy');\n                summaryData.recommendations.push('Test with Google Search Console Mobile-Friendly Test');\n                summaryData.recommendations.push('Monitor Core Web Vitals in Search Console');\n            } else {\n                if (testResults.fetchInterception) {\n                    summaryData.recommendations.push('\u2713 Fetch interception working correctly');\n                }\n                if (testResults.cacheWrite && testResults.cacheRead) {\n                    summaryData.recommendations.push('\u2713 Cache operations functional');\n                }\n                if (testResults.messaging) {\n                    summaryData.recommendations.push('\u2713 Client-worker communication established');\n                }\n                if (!testResults.backgroundSync) {\n                    summaryData.recommendations.push('Consider implementing background sync for better UX');\n                }\n            }\n\n            updateStatus('summary', \n                `All tests completed: ${passedTests}\/${totalTests} passed (${summaryData.successRate})`,\n                passedTests === totalTests ? 'success' : \n                passedTests > totalTests\/2 ? 'warning' : 'error'\n            );\n            \n            showDetails('summary-details', summaryData);\n        }\n\n        \/\/ Main test runner\n        async function runAllTests() {\n            testStartTime = Date.now();\n            updateProgress(0);\n            updateStatus('live-status', '\ud83d\ude80 Starting automatic Service Worker test sequence...', 'info');\n\n            \/\/ Check Service Worker support\n            if (!('serviceWorker' in navigator)) {\n                updateStatus('live-status', 'Service Workers not supported in this browser!', 'error');\n                updateStatus('registration-status', 'Not supported', 'error');\n                updateStatus('cache-status', 'Not supported', 'error');\n                updateStatus('fetch-status', 'Not supported', 'error');\n                updateStatus('message-status', 'Not supported', 'error');\n                updateStatus('sync-status', 'Not supported', 'error');\n                updateStatus('idb-status', 'Not supported', 'error');\n                updateStatus('performance-status', 'Not supported', 'error');\n                updateStatus('summary', 'Tests aborted: Service Workers not supported', 'error');\n                return;\n            }\n\n            \/\/ Check if we need to reload for SW control\n            const needsReload = sessionStorage.getItem('sw-needs-reload');\n            \n            \/\/ Run tests sequentially\n            await detectBot();\n            updateProgress(10);\n\n            const registrationSuccess = await testRegistration();\n            updateProgress(20);\n\n            \/\/ CRITICAL: Check if page is controlled after registration\n            if (registrationSuccess && !navigator.serviceWorker.controller && !needsReload) {\n                updateStatus('live-status', '\u26a0\ufe0f Service Worker registered but not controlling. Reloading page...', 'warning');\n                sessionStorage.setItem('sw-needs-reload', 'true');\n                setTimeout(() => {\n                    window.location.reload();\n                }, 1000);\n                return; \/\/ Stop tests and wait for reload\n            }\n            \n            \/\/ Clear the reload flag if we're now controlled\n            if (navigator.serviceWorker.controller) {\n                sessionStorage.removeItem('sw-needs-reload');\n            }\n\n            if (registrationSuccess) {\n                await testCacheOperations();\n                updateProgress(35);\n\n                await testFetchInterception();\n                updateProgress(50);\n\n                await testMessaging();\n                updateProgress(65);\n\n                await testBackgroundFeatures();\n                updateProgress(75);\n\n                await testIndexedDB();\n                updateProgress(85);\n\n                await measurePerformance();\n                updateProgress(95);\n            } else {\n                \/\/ Skip dependent tests if registration failed\n                updateStatus('cache-status', 'Skipped - registration failed', 'disabled');\n                updateStatus('fetch-status', 'Skipped - registration failed', 'disabled');\n                updateStatus('message-status', 'Skipped - registration failed', 'disabled');\n                updateStatus('sync-status', 'Skipped - registration failed', 'disabled');\n                updateStatus('idb-status', 'Skipped - registration failed', 'disabled');\n                updateStatus('performance-status', 'Skipped - registration failed', 'disabled');\n            }\n\n            generateSummary();\n            updateProgress(100);\n            updateStatus('live-status', `\u2705 All tests completed in ${Date.now() - testStartTime}ms`, 'success');\n        }\n\n        \/\/ Start tests automatically when page loads\n        window.addEventListener('load', () => {\n            \/\/ Small delay to ensure page is fully rendered\n            setTimeout(() => {\n                runAllTests();\n            }, 500);\n        });\n\n        \/\/ Listen for Service Worker messages\n        if ('serviceWorker' in navigator) {\n            navigator.serviceWorker.addEventListener('message', (event) => {\n                console.log('Message from Service Worker:', event.data);\n            });\n        }\n    <\/script>\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t","protected":false},"excerpt":{"rendered":"<p>Service Worker Test Page Real-time Service Worker testing to ensure proper functionality for both users and search engine crawlers like Googlebot. Master Test Controller Initializing automatic test sequence&#8230; 0% 0 Total Tests 0 Passed 0 Failed 0ms Total Time 1. Registration &#038; Activation Waiting to start&#8230; What we&#8217;re testing: \u2022 Real Service Worker registration with [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"parent":0,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"elementor_header_footer","meta":{"_lmt_disableupdate":"","_lmt_disable":"","footnotes":""},"class_list":["post-7664","page","type-page","status-publish","hentry"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v28.5 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>Service Worker test - SEO Data Warehouse And Monitoring<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/www.searchviu.com\/en\/service-worker-test\/\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Service Worker test - SEO Data Warehouse And Monitoring\" \/>\n<meta property=\"og:description\" content=\"Service Worker Test Page Real-time Service Worker testing to ensure proper functionality for both users and search engine crawlers like Googlebot. Master Test Controller Initializing automatic test sequence&#8230; 0% 0 Total Tests 0 Passed 0 Failed 0ms Total Time 1. Registration &#038; Activation Waiting to start&#8230; What we&#8217;re testing: \u2022 Real Service Worker registration with [&hellip;]\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.searchviu.com\/en\/service-worker-test\/\" \/>\n<meta property=\"og:site_name\" content=\"SEO Data Warehouse And Monitoring\" \/>\n<meta property=\"article:modified_time\" content=\"2025-09-08T15:30:26+00:00\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:site\" content=\"@searchviu\" \/>\n<meta name=\"twitter:label1\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data1\" content=\"2 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/www.searchviu.com\\\/service-worker-test\\\/\",\"url\":\"https:\\\/\\\/www.searchviu.com\\\/service-worker-test\\\/\",\"name\":\"Service Worker test - SEO Data Warehouse And Monitoring\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/www.searchviu.com\\\/#website\"},\"datePublished\":\"2025-09-08T11:17:41+00:00\",\"dateModified\":\"2025-09-08T15:30:26+00:00\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/www.searchviu.com\\\/service-worker-test\\\/#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/www.searchviu.com\\\/service-worker-test\\\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/www.searchviu.com\\\/service-worker-test\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/www.searchviu.com\\\/en\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Service Worker test\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/www.searchviu.com\\\/#website\",\"url\":\"https:\\\/\\\/www.searchviu.com\\\/\",\"name\":\"SEO Data Warehouse And Monitoring\",\"description\":\"SEO Solutions For Teams And Agencies\",\"publisher\":{\"@id\":\"https:\\\/\\\/www.searchviu.com\\\/#organization\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\\\/\\\/www.searchviu.com\\\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"en-US\"},{\"@type\":\"Organization\",\"@id\":\"https:\\\/\\\/www.searchviu.com\\\/#organization\",\"name\":\"searchVIU\",\"url\":\"https:\\\/\\\/www.searchviu.com\\\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\\\/\\\/www.searchviu.com\\\/#\\\/schema\\\/logo\\\/image\\\/\",\"url\":\"https:\\\/\\\/www.searchviu.com\\\/wp-content\\\/uploads\\\/2023\\\/02\\\/d3babe41-searchviu-logo2x.png\",\"contentUrl\":\"https:\\\/\\\/www.searchviu.com\\\/wp-content\\\/uploads\\\/2023\\\/02\\\/d3babe41-searchviu-logo2x.png\",\"width\":340,\"height\":340,\"caption\":\"searchVIU\"},\"image\":{\"@id\":\"https:\\\/\\\/www.searchviu.com\\\/#\\\/schema\\\/logo\\\/image\\\/\"},\"sameAs\":[\"https:\\\/\\\/x.com\\\/searchviu\",\"https:\\\/\\\/www.linkedin.com\\\/company\\\/searchviu\\\/\"]}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"Service Worker test - SEO Data Warehouse And Monitoring","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/www.searchviu.com\/en\/service-worker-test\/","og_locale":"en_US","og_type":"article","og_title":"Service Worker test - SEO Data Warehouse And Monitoring","og_description":"Service Worker Test Page Real-time Service Worker testing to ensure proper functionality for both users and search engine crawlers like Googlebot. Master Test Controller Initializing automatic test sequence&#8230; 0% 0 Total Tests 0 Passed 0 Failed 0ms Total Time 1. Registration &#038; Activation Waiting to start&#8230; What we&#8217;re testing: \u2022 Real Service Worker registration with [&hellip;]","og_url":"https:\/\/www.searchviu.com\/en\/service-worker-test\/","og_site_name":"SEO Data Warehouse And Monitoring","article_modified_time":"2025-09-08T15:30:26+00:00","twitter_card":"summary_large_image","twitter_site":"@searchviu","twitter_misc":{"Est. reading time":"2 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"WebPage","@id":"https:\/\/www.searchviu.com\/service-worker-test\/","url":"https:\/\/www.searchviu.com\/service-worker-test\/","name":"Service Worker test - SEO Data Warehouse And Monitoring","isPartOf":{"@id":"https:\/\/www.searchviu.com\/#website"},"datePublished":"2025-09-08T11:17:41+00:00","dateModified":"2025-09-08T15:30:26+00:00","breadcrumb":{"@id":"https:\/\/www.searchviu.com\/service-worker-test\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.searchviu.com\/service-worker-test\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/www.searchviu.com\/service-worker-test\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/www.searchviu.com\/en\/"},{"@type":"ListItem","position":2,"name":"Service Worker test"}]},{"@type":"WebSite","@id":"https:\/\/www.searchviu.com\/#website","url":"https:\/\/www.searchviu.com\/","name":"SEO Data Warehouse And Monitoring","description":"SEO Solutions For Teams And Agencies","publisher":{"@id":"https:\/\/www.searchviu.com\/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/www.searchviu.com\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"en-US"},{"@type":"Organization","@id":"https:\/\/www.searchviu.com\/#organization","name":"searchVIU","url":"https:\/\/www.searchviu.com\/","logo":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/www.searchviu.com\/#\/schema\/logo\/image\/","url":"https:\/\/www.searchviu.com\/wp-content\/uploads\/2023\/02\/d3babe41-searchviu-logo2x.png","contentUrl":"https:\/\/www.searchviu.com\/wp-content\/uploads\/2023\/02\/d3babe41-searchviu-logo2x.png","width":340,"height":340,"caption":"searchVIU"},"image":{"@id":"https:\/\/www.searchviu.com\/#\/schema\/logo\/image\/"},"sameAs":["https:\/\/x.com\/searchviu","https:\/\/www.linkedin.com\/company\/searchviu\/"]}]}},"_links":{"self":[{"href":"https:\/\/www.searchviu.com\/en\/wp-json\/wp\/v2\/pages\/7664","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.searchviu.com\/en\/wp-json\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/www.searchviu.com\/en\/wp-json\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/www.searchviu.com\/en\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.searchviu.com\/en\/wp-json\/wp\/v2\/comments?post=7664"}],"version-history":[{"count":25,"href":"https:\/\/www.searchviu.com\/en\/wp-json\/wp\/v2\/pages\/7664\/revisions"}],"predecessor-version":[{"id":7696,"href":"https:\/\/www.searchviu.com\/en\/wp-json\/wp\/v2\/pages\/7664\/revisions\/7696"}],"wp:attachment":[{"href":"https:\/\/www.searchviu.com\/en\/wp-json\/wp\/v2\/media?parent=7664"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}