P1b-P1d: Missing API Surfaces — caches, clipboard, dataLayer, sendBeacon Verbesserung #81

Closed
opened 2026-06-18 17:17:56 +00:00 by Artur · 1 comment
Owner

P1b-P1d: Missing API Surfaces (Small APIs)

Priority: MEDIUM
Betrifft: wasmbyexample.dev (caches), web.dev (clipboard), alle GTM-Seiten (dataLayer)
Aufwand: ~3h total

Übersicht

Drei kleine API-Lücken die auf verschiedenen Sites auftreten.

P1b: navigator.clipboard

navigator.clipboard = navigator.clipboard || {
  writeText: async (text) => undefined,
  readText: async () => '',
  read: async () => [],
  write: async () => undefined,
};

P1c: window.caches (CacheStorage)

window.caches = new Proxy({}, {
  get(_target, prop) {
    if (prop === 'open') return async (name) => createNoopCache(name);
    if (prop === 'match') return async (request) => undefined;
    if (prop === 'has') return async (name) => false;
    if (prop === 'keys') return async () => [];
    if (prop === 'delete') return async (name) => true;
    return undefined;
  }
});

P1d: window.dataLayer default

if (!window.dataLayer) window.dataLayer = [];
// Google Tag Manager erwartet dataLayer.push()

Akzeptanzkriterien

  • navigator.clipboard.writeText('text') resolved ohne Error
  • window.caches.open('v1') returned ein Cache-ähnliches Objekt
  • window.dataLayer existiert und .push() funktioniert
  • Unit-Tests für alle drei

Betroffene Dateien

Datei Änderung
src/fakes/apis.ts oder src/pages/page.ts caches, clipboard, dataLayer
tests/unit/sprint17-missing-apis.test.ts 5+ Tests
## P1b-P1d: Missing API Surfaces (Small APIs) **Priority:** MEDIUM **Betrifft:** wasmbyexample.dev (caches), web.dev (clipboard), alle GTM-Seiten (dataLayer) **Aufwand:** ~3h total ### Übersicht Drei kleine API-Lücken die auf verschiedenen Sites auftreten. ### P1b: `navigator.clipboard` ```typescript navigator.clipboard = navigator.clipboard || { writeText: async (text) => undefined, readText: async () => '', read: async () => [], write: async () => undefined, }; ``` ### P1c: `window.caches` (CacheStorage) ```typescript window.caches = new Proxy({}, { get(_target, prop) { if (prop === 'open') return async (name) => createNoopCache(name); if (prop === 'match') return async (request) => undefined; if (prop === 'has') return async (name) => false; if (prop === 'keys') return async () => []; if (prop === 'delete') return async (name) => true; return undefined; } }); ``` ### P1d: `window.dataLayer` default ```typescript if (!window.dataLayer) window.dataLayer = []; // Google Tag Manager erwartet dataLayer.push() ``` ### Akzeptanzkriterien - [ ] `navigator.clipboard.writeText('text')` resolved ohne Error - [ ] `window.caches.open('v1')` returned ein Cache-ähnliches Objekt - [ ] `window.dataLayer` existiert und `.push()` funktioniert - [ ] Unit-Tests für alle drei ### Betroffene Dateien | Datei | Änderung | |-------|----------| | `src/fakes/apis.ts` oder `src/pages/page.ts` | caches, clipboard, dataLayer | | `tests/unit/sprint17-missing-apis.test.ts` | 5+ Tests |
Artur closed this issue 2026-06-18 17:27:09 +00:00
Author
Owner

Bereits implementiert — Alle Small APIs vorhanden

API Fundort Status
window.caches page.ts:262-274 Noop CacheStorage
window.dataLayer page.ts:276-279 Default []
navigator.clipboard navigator.ts:306 writeText/readText
navigator.sendBeacon beacon.ts + navigator.ts:364 Instrumentiert
ResizeObserver observers/resize-observer.ts Fake (viewport-groesse)

Status: Geschlossen

✅ **Bereits implementiert** — Alle Small APIs vorhanden | API | Fundort | Status | |-----|---------|--------| | `window.caches` | `page.ts:262-274` | ✅ Noop CacheStorage | | `window.dataLayer` | `page.ts:276-279` | ✅ Default `[]` | | `navigator.clipboard` | `navigator.ts:306` | ✅ `writeText/readText` | | `navigator.sendBeacon` | `beacon.ts` + `navigator.ts:364` | ✅ Instrumentiert | | `ResizeObserver` | `observers/resize-observer.ts` | ✅ Fake (viewport-groesse) | **Status:** Geschlossen
Sign in to join this conversation.
No milestone
No project
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set.

Reference
glow-all/true-headless-browser#81
No description provided.