## ADDED Requirements ### Requirement: NetworkMonitor MUST assert absence of missing assets `NetworkMonitor` (returned by `attachNetworkMonitor(page)`) SHALL expose `assertNoMissingAssets()` that fails when any 404 was observed for an `image`, `font`, `script`, or `stylesheet` resource type. The monitor SHALL also expose `allow404(predicate: (entry) => boolean)` to opt-out specific URLs from this assertion. Other 404s (e.g. for `xhr`/`fetch` resource types) are NOT subject to this assertion and remain governed by `assertNoFailures()`. #### Scenario: Missing image fails the assertion - **WHEN** the page references `` and the request returns 404 - **AND** `monitor.assertNoMissingAssets()` is called - **THEN** the call throws `MissingAssetError` with `code === "TESTING_E2E.NETWORK.MISSING_ASSET"` and `context.url` containing `/missing.png` #### Scenario: Allow-listed 404 does not fail - **WHEN** `monitor.allow404((e) => e.url.endsWith("/beacon.gif"))` is called before navigation - **AND** `/beacon.gif` returns 404 - **AND** `monitor.assertNoMissingAssets()` is called - **THEN** the call returns without throwing #### Scenario: Non-asset 404 does not fail this assertion - **WHEN** an `xhr` request to `/api/foo` returns 404 - **AND** `monitor.assertNoMissingAssets()` is called - **THEN** the call returns without throwing (the failure is reported by `assertNoFailures()` instead) ### Requirement: NetworkMonitor MUST assert absence of mixed content `NetworkMonitor` SHALL expose `assertNoMixedContent()` that fails when the page is loaded over `https://` AND any subresource was fetched over `http://`, OR when the browser reports a mixed-content blocking event. The assertion is a no-op when the page is loaded over `http://`. #### Scenario: HTTP subresource on HTTPS page fails - **WHEN** the page is `https://example.test/` - **AND** it includes `