### Testing Steps Run each case with fresh app data so daily pixel deduplication does not hide results. In Xcode’s console, filter by `PixelKit` Category. #### Healthy navigation 1. Open a web page. 2. Wait at least 5 seconds → no `debug_web_extension_cpm_*` pixel is sent. 3. Open **Debug → Web Extensions → Simulate CPM Messaging Breakage (On)**. 4. Open New Tab, Settings, Bookmarks (internal pages), validate no `debug_web_extension_cpm_*` pixel is sent #### Failure, stuck, and recovery 1. Open **Debug → Web Extensions → Simulate CPM Messaging Breakage (On)**. 2. Load a web page and wait 5 seconds → `debug_web_extension_cpm_initialization_failed_after_other` is sent; no `stuck` pixel is sent. 3. Navigate to another HTTP(S) page and wait 5 seconds → `debug_web_extension_cpm_messaging_stuck_other` is sent. 4. Select **Simulate CPM Messaging Breakage (Off)**. 5. Reload the page → `debug_web_extension_cpm_messaging_recovered_without_extension_reload` is sent. 6. Navigate again → no additional CPM failure or recovery pixel is sent. #### Session restoration 1. Open a web page, e.g. https://privacy-test-pages.site/features/autoconsent/banner.html 2. Duplicate the tab twice (3 tabs are open) 3. Open Settings → General, activate Reopen all windows and tabs from last session 4. Restart the browser 5. Open **Debug → Web Extensions → Simulate CPM Messaging Breakage (On)** 6. Switch to another tab 7. wait 5 seconds → `debug_web_extension_cpm_initialization_failed_after_session_restoration` is sent 8. Switch to the remaining restored tab 9. wait 5 seconds → `debug_web_extension_cpm_initialization_failed_after_session_restoration` is **skipped** (as it‘s daily): no `debug_web_extension_cpm_messaging_stuck…` is sent 10. Reload the tab or navigate somewhere else 11. wait 5 seconds → `debug_web_extension_cpm_initialization_failed_after_other` is sent; `debug_web_extension_cpm_messaging_stuck_session_restoration` is sent #### Concurrent navigations 1. Select **Simulate CPM Messaging Breakage (On)**. 2. Load HTTP(S) pages in two tabs before either 4-second timeout expires. 3. Wait 5 seconds → initialization failures are observed, but no `debug_web_extension_cpm_messaging_stuck_*` pixel is sent. 4. Start another navigation after those failures and wait 5 seconds → `debug_web_extension_cpm_messaging_stuck_other` is sent. #### Extension reload 1. Start with **Simulate CPM Messaging Breakage (Off)** and use the Fire button to trigger extension reloading. 2. After data clearing completes, select **Simulate CPM Messaging Breakage (On)**. 3. Load a web page and wait 5 seconds → these pixels are sent: - `debug_web_extension_cpm_initialization_failed_after_extension_reload` - `debug_web_extension_cpm_messaging_extension_reload_failed` 4. Navigate again and wait 5 seconds → `debug_web_extension_cpm_messaging_stuck_extension_reload` is sent. 5. Select **Simulate CPM Messaging Breakage (Off)** and reload → `debug_web_extension_cpm_messaging_recovered_after_extension_reload` is sent.