WEB / WEB-10.05
Browsing contexts, workers ve service workers
Window, iframe ve worker aynı execution veya storage sahibi değildir. Mesaj, controller ve offline response sınırlarını izle.
1. Core · Mekanizma
Hareket olmadan bütün senaryoları oku
Array clone
- Input hazır
Window sum-a işi için [2,3] array’ini hazırlar; worker henüz message almamıştır.
- Window / Duru
- [2,3]; DOM pending
- Dedicated Worker
- No input
- Service Worker
- Unused
- Cache Storage
- Unused
- Origin
- No exchange
- Clone queue
postMessage structured clone’u queue’ya koyar; parent array ownership’i ve değerleri korunur.
- Window / Duru
- [2,3]; clone queued
- Dedicated Worker
- No input yet
- Service Worker
- Unused
- Cache Storage
- Unused
- Origin
- No exchange
- Worker arrival
Worker MessageEvent ayrı [2,3] kopyasını alır; bu HTTP request veya DOM erişimi değildir.
- Window / Duru
- [2,3]; result pending
- Dedicated Worker
- Copied [2,3] received
- Service Worker
- Unused
- Cache Storage
- Unused
- Origin
- No exchange
- Local sum
Worker sum=5 hesaplar ve yalnız kendi kopyasının ilk elemanını 99 yapar.
- Window / Duru
- [2,3]; result pending
- Dedicated Worker
- sum5; copy[99,3]
- Service Worker
- Unused
- Cache Storage
- Unused
- Origin
- No exchange
- Result arrival
Window, sum-a işi için sum=5 result message’ını alır; parent’ın [2,3] array’i hâlâ değişmemiştir.
- Window / Duru
- [2,3]; sum5 received
- Dedicated Worker
- copy[99,3]
- Service Worker
- Unused
- Cache Storage
- Unused
- Origin
- No exchange
- DOM owner window
Window jobRef ve result type’ını kontrol ederek benign DOM text’ini 5 olarak günceller.
- Window / Duru
- [2,3]; DOM=5
- Dedicated Worker
- copy[99,3]; no DOM
- Service Worker
- Unused
- Cache Storage
- Unused
- Origin
- No exchange
Buffer transfer
- Buffer hazır
Window iki byte [2,3] içeren ArrayBuffer’ı sum-b job’ına bağlar; senderLength=2’dir.
- Window / Duru
- buffer length2
- Dedicated Worker
- No buffer
- Service Worker
- Unused
- Cache Storage
- Unused
- Origin
- No exchange
- Ownership bırak
Başarılı postMessage transfer’ı buffer’ı sender’da detach eder; receiver arrival henüz modellenmez.
- Window / Duru
- buffer length0; detached
- Dedicated Worker
- No buffer yet
- Service Worker
- Unused
- Cache Storage
- Unused
- Origin
- No exchange
- Buffer arrival
Worker MessageEvent buffer ownership’ini ve iki byte’ı alır; sender yeniden kullanamaz.
- Window / Duru
- buffer length0
- Dedicated Worker
- buffer length2; bytes[2,3]
- Service Worker
- Unused
- Cache Storage
- Unused
- Origin
- No exchange
- Local sum
Worker, receiver buffer’ından sum=5 üretir; window document’i worker global’inde bulunmaz.
- Window / Duru
- buffer length0
- Dedicated Worker
- sum5; buffer length2
- Service Worker
- Unused
- Cache Storage
- Unused
- Origin
- No exchange
- Result arrival
Window sum-b=5 mesajını alır; result mesajı original buffer ownership’ini geri taşımaz.
- Window / Duru
- buffer length0; sum5 received
- Dedicated Worker
- buffer length2
- Service Worker
- Unused
- Cache Storage
- Unused
- Origin
- No exchange
- Local presentation
Window kendi DOM’unu günceller; sender buffer detached ve length=0 olarak kalır.
- Window / Duru
- DOM=5; buffer length0
- Dedicated Worker
- buffer length2; no DOM
- Service Worker
- Unused
- Cache Storage
- Unused
- Origin
- No exchange
Offline cache hit
- Active ≠ controller
İlk registration’ın active olduğu verilmiştir; buna rağmen ilk açık document için controller=null’dır.
- Window / Duru
- controller=null
- Dedicated Worker
- Unused
- Service Worker
- Active; first client uncontrolled
- Cache Storage
- Seed Offline note present
- Origin
- Online not used
- New client control
Normal reload sonrası yeni scope içi client controlled olur; navigation exchange bu fixture’da omitted’dır.
- Window / Duru
- controller present; offline selected
- Dedicated Worker
- Unused
- Service Worker
- Active; client controlled
- Cache Storage
- Seed Offline note present
- Origin
- Offline; unreachable
- FetchEvent arrival
Client’in /learn/offline.txt seçimi Service Worker’a local FetchEvent olarak ulaşır, origin wire değildir.
- Window / Duru
- Fetch pending
- Dedicated Worker
- Unused
- Service Worker
- FetchEvent /learn/offline.txt received
- Cache Storage
- Seed Offline note present
- Origin
- Offline; unreachable
- Local cache match
Cache API lookup explicit entry ile eşleşir; HTTP network request veya freshness check uydurulmaz.
- Window / Duru
- Fetch pending
- Dedicated Worker
- Unused
- Service Worker
- Waiting local lookup
- Cache Storage
- Matched Offline note response
- Origin
- Offline; unreachable
- Local response
Service Worker, stored response’u kullanır; status=200 ve body=Offline note ile respondWith sonucunu hazırlar.
- Window / Duru
- Fetch pending
- Dedicated Worker
- Unused
- Service Worker
- Response200 Offline note ready
- Cache Storage
- Entry retained
- Origin
- Offline; unreachable
- Client response
Local Service Worker response client’e ulaşır; origin bu offline hit’i almamıştır.
- Window / Duru
- Response200; body Offline note
- Dedicated Worker
- Unused
- Service Worker
- Response delivered locally
- Cache Storage
- Entry retained
- Origin
- No origin arrival
- Coverage sonucu
Window content’i gösterir; yalnız bu matched public path’in offline sonucu doğrulanmıştır.
- Window / Duru
- DOM Offline note
- Dedicated Worker
- Unused
- Service Worker
- Controlled handler completed
- Cache Storage
- Entry retained
- Origin
- No origin arrival
Offline cache miss
- Controlled client
Supplied client controlled ve network offline’dır; missing path için entry bulunmaz.
- Window / Duru
- GET missing ready
- Dedicated Worker
- Unused
- Service Worker
- Active controller
- Cache Storage
- No missing entry
- Origin
- Offline; unreachable
- FetchEvent arrival
Missing path local FetchEvent’i Service Worker’a ulaşır; henüz response yoktur.
- Window / Duru
- Fetch pending
- Dedicated Worker
- Unused
- Service Worker
- FetchEvent missing received
- Cache Storage
- No missing entry
- Origin
- Offline; unreachable
- Local cache miss
Cache API lookup match bulamaz; kayıtlı worker olmak entry varlığı garantisi değildir.
- Window / Duru
- Fetch pending
- Dedicated Worker
- Unused
- Service Worker
- Waiting local lookup
- Cache Storage
- Match absent
- Origin
- Offline; unreachable
- Fallback failure
Selected network fallback offline olduğu için network error üretir; origin arrival yoktur.
- Window / Duru
- Fetch pending
- Dedicated Worker
- Unused
- Service Worker
- Fallback network error
- Cache Storage
- Entry still absent
- Origin
- Not reached
- Client rejection
Local Fetch operation TypeError ile reject olur; bu, status 404 taşıyan HTTP response değildir.
- Window / Duru
- Fetch rejected-TypeError
- Dedicated Worker
- Unused
- Service Worker
- No successful response
- Cache Storage
- Entry absent
- Origin
- Not reached
- Offline sınırı
Window unavailable sonucu gösterir; bütün URL’lerin offline çalıştığı iddiası çıkmaz.
- Window / Duru
- Unavailable shown
- Dedicated Worker
- Unused
- Service Worker
- Handler coverage bounded
- Cache Storage
- Entry absent
- Origin
- Not reached
ROLLER · STATE · VERİ AKIŞI
Iframe yeni document context’i açar
Top-level tab ile içindeki iframe farklı document’lar barındırır. HTML Standard navigable’ı tab/window/iframe gibi kullanıcıya dönük gezinme yapısıyla; browsing context’i WindowProxy çevresinde document sequence’i ile anlatır. Bunları işletim sistemindeki process sayısıyla bire bir eşitleme. Bir iframe parent DOM’a eklenen sıradan subtree değildir: child document kendi URL’si, global Window’u ve loading yaşam döngüsüyle gelir.
Aynı origin olan seçilmiş parent/frame örneğinde child document’e erişim mümkün olabilir; farklı origin için bu erişim sınırlandırılır. WindowProxy elde edilmiş olması bütün child DOM’un okunabileceği anlamına gelmez. Navigation child document’i değiştirebilir, daha önce tutulan document referansı aktif child state’i temsil etmeyebilir. Frame’i incelerken hangi document, origin ve navigation gözlendiğini birlikte kaydet.
Context’ler arasında message taşımak, sender’ı application identity yapmak değildir. Beklenen origin, source window ve message schema application contract’ının parçalarıdır; domain adı veya message içindeki role metni server permission yerine geçmez. Buradaki somut örnek yalnız aynı origin parent/frame ayrımını gözler; cross-origin policy bypass veya process isolation deneyi değildir.
Worker computation, window presentation
Dedicated Worker ayrı WorkerGlobalScope üzerinde çalışır; doğrudan window veya document DOM’u yoktur. Bu “ağa veya storage’a erişemez” demek değildir: worker türüne ve API’ye göre Fetch ve IndexedDB gibi yetenekler bulunabilir. Window iş yükünü mesajla verir, worker sonuç döndürür, DOM update’ini window gerçekleştirir. Bu ownership ayrımı responsiveness sağlar; her işin paralel zamanda bitmesini veya security isolation’ın tüm biçimlerini garanti etmez.
Plain object ve array message’ında structured clone kullanılır: [2,3] değerlerini alan worker kendi kopyasını [99,3] yaparken parent’ın [2,3] değeri değişmez. Bütün JavaScript değerleri serializable değildir. Transfer list’teki ArrayBuffer ise farklıdır: başarılı postMessage transfer’ında sender buffer detached olur, byteLength 0 görünür; receiver iki byte’ı kullanabilir. Buffer message’ın içinde de bulunmalıdır; transfer list tek başına payload’ı göndermez. TypedArray view yerine onun buffer’ının ownership’i aktarılır.
SharedArrayBuffer üzerinden izin verilen shared memory, bu sıradan clone/ArrayBuffer-transfer örneklerinden farklıdır ve ayrı isolation koşulları taşır. Artifact shared memory kullanmaz. Worker’dan gelen sum=5 sonucunu application, jobRef ve beklenen type ile eşleştirir; computation sonucu server authorization kararının kanıtı değildir. Mesaj queue’su ile HTTP exchange aynı taşıma modeli değildir.
Registration, control ve offline coverage
Service Worker registration belirli origin/storage key ve scope URL’si altında script’i kaydeder. API secure context gerektirir; yerel trustworthy localhost eğitim fixture’ı normal HTTPS yayınını ölçmez. register() fulfillment, installing/waiting/active state ve mevcut document’in controller’ı aynı gözlem değildir. ready matching registration’da active worker bulunduğunu anlatır; controller mevcut client’in worker’ını veya null değerini verir.
İlk register eden açık document, worker activate olsa bile varsayılan akışta uncontrolled kalabilir; sonraki normal navigation/reload scope içindeki yeni client’i controlled yapar. Bu örnek clients.claim veya skipWaiting kullanmaz. Update’te yeni installed worker, eski active worker’ın client’leri sürdükçe waiting kalabilir. Service Worker sürekli çalışan background thread sayılmamalıdır; browser onu durdurup event için yeniden başlatabilir. waitUntil uygun event’in async işini yaşam döngüsüne bağlar, sonsuz global memory garantisi vermez.
Cache API, HTTP cache’ten ayrı application-managed Request/Response storage’dır; window’da da kullanılabilir. Entries otomatik HTTP freshness/expiry kurallarıyla yenilenmez; Cache API HTTP cache headers’ini bu amaçla uygulamaz. Browser quota veya eviction yüzünden veri kalkabilir. Offline success ancak controlled client, uygun handler ve gerçekten saklanmış eşleşen response ile mümkündür. /learn/offline.txt için explicit seed hit verir; /learn/missing.txt offline miss + network failure üretir. “SW var, bütün site offline” sonucu çıkarma.
2. Red · Güven ve etki
Hareket olmadan bütün senaryoları oku
Clone/transfer
- Copied input parent state’inden ayrıldı
sum-a için parentBefore [2,3], worker copy başlangıcı aynı değerlerdir. Worker [99,3] mutation’ından sonra parentAfter [2,3] kalır. Shared memory olmayan clone’da receiver mutation’ı sender mutation’ı değildir.
- Context/message ledger
- Clone: worker[99,3] / parent[2,3]
- Ownership/schema gate
- Ownership gate bekliyor
- Document/data boundary
- Outcome yok
- Result schema ve job correlation ayrı gate oldu
sum 5 ve jobRef sum-a normal result fields’idir. Message’ta gelen role veya jobRef kendi başına trusted state değildir. Window expected schema ve job correlation’ı kontrol edip DOM update kararını kendi alır.
- Context/message ledger
- Clone: worker[99,3] / parent[2,3]
- Ownership/schema gate
- Expected jobRef/sum required / DOM owner window
- Document/data boundary
- Outcome yok
- Worker global document authority taşımadı
documentAvailable ve windowAvailable false’tur. Worker’ın ayrı global’i application permission değildir. Aynı-origin iframe örneğinde de parent ve frame farklı document’lerdir; origin ilişkisi tenant grant’i üretmez.
- Context/message ledger
- Clone: worker[99,3] / parent[2,3]
- Ownership/schema gate
- Expected jobRef/sum required / DOM owner window
- Document/data boundary
- Worker has no document/window / authority separate
- Transfer branch buffer lifecycle’ıyla seçildi
sum-b bufferHex 0203 taşır. Sender before byteLength 2, after post byteLength 0 ve receiver byteLength 2 olur. Bu transferred ArrayBuffer detachment’ı clone’daki bağımsız array mutation’ından farklıdır.
- Context/message ledger
- Transfer: sender2→0 / receiver2
- Ownership/schema gate
- Expected jobRef/sum required / DOM owner window
- Document/data boundary
- Worker has no document/window / authority separate
- Detached buffer reusable kabul edilmedi
Sender detached buffer’ı eski iki byte’lık state’iyle yeniden kullanamaz. Ownership lifecycle açık tutulmazsa sonraki computation yanlış state varsayar. Transfer bütün object türlerini taşıyan genel kural değildir; bu case ArrayBuffer’dır.
- Context/message ledger
- Transfer: sender2→0 / receiver2
- Ownership/schema gate
- Detached sender / receiver owns two bytes
- Document/data boundary
- Worker has no document/window / authority separate
- Context ownership protected data garantisi olmadı
Sum fixture harmless bounded data taşır. Job correlation ve ownership correctness, gerçek tenant/object policy veya multi-worker concurrency’yi kanıtlamaz. DOM update window’da kalır; business permission application’ın ayrı sınırıdır.
- Context/message ledger
- Transfer: sender2→0 / receiver2
- Ownership/schema gate
- Detached sender / receiver owns two bytes
- Document/data boundary
- Ownership scoped / application permissions separate
Controller/cache
- Registration active ile client controller ayrıldı
registerResolved ve activePresent true iken firstClientController null’dır. Normal reload sonrası controlled true olur; clientsClaim ve skipWaiting kullanılmaz. Active registration bütün existing documents’in controller’ı demek değildir.
- Context/message ledger
- Active registration / initial controller null
- Ownership/schema gate
- Ownership gate bekliyor
- Document/data boundary
- Outcome yok
- Scope offline coverage’a eşitlenmedi
Script /learn/worker.js, scope /learn/’dir. Controlled client olması handler’ın bütün URL’leri veya entries’i offline sağladığını göstermez. Cache plan explicit /learn/offline.txt public seed path’ini tanımlar.
- Context/message ledger
- Active registration / initial controller null
- Ownership/schema gate
- Controlled scope / explicit seed path only
- Document/data boundary
- Outcome yok
- Cached response yeni origin permission sayılmadı
Offline hit Offline note ve status 200 verir. Origin o anda yeni authorization yapmış değildir. Bu public entry identity/session data taşımaz; personalized state retention ve invalidation başka contract gerektirir.
- Context/message ledger
- Active registration / initial controller null
- Ownership/schema gate
- Controlled scope / explicit seed path only
- Document/data boundary
- Public cached200 / no fresh origin authz claim
- Normal miss farklı availability sonucu üretti
Offline /learn/missing.txt için entryPresent false, fetchOutcome rejected-TypeError ve originReached false’tur. Bu normal miss worker compromise veya origin outage ölçümü değildir. Offline garanti entry ve fallback coverage ister.
- Context/message ledger
- Offline miss / TypeError / origin not reached
- Ownership/schema gate
- Controlled scope / explicit seed path only
- Document/data boundary
- Public cached200 / no fresh origin authz claim
- Cache API HTTP freshness engine sayılmadı
cacheAPIHonorsHTTPFreshness false’tur. Cache API entry’lerinin match/retention behavior’ı application planına bağlıdır; HTTP cache directive’leri otomatik aynı engine’i çalıştırmaz. Update waiting veya eviction bu fixture’da ölçülmez.
- Context/message ledger
- Offline miss / TypeError / origin not reached
- Ownership/schema gate
- Explicit Cache API plan / HTTP freshness separate
- Document/data boundary
- Public cached200 / no fresh origin authz claim
- Control handler ve lifecycle scope’unda kaldı
Controller, matched entry, seçilmiş response ve fallback outcome ayrı tutulur. Registration active label’ı availability veya protected user state assurance değildir. Gerçek update/eviction/runtime için scoped observations gerekir.
- Context/message ledger
- Offline miss / TypeError / origin not reached
- Ownership/schema gate
- Explicit Cache API plan / HTTP freshness separate
- Document/data boundary
- Check controller/entry/fallback; authz independent
VARSAYIM · SINIR · KONTROL
Context’leri tek authority gibi okumak
Iframe’in origin’i veya Worker’ın ayrı global’i application permission değildir. Aynı origin child DOM erişimi seçilmiş örneğin browser kuralıdır; tenant, user ve object yetkisini server belirler. Message içinde gelen jobRef veya role alanını kontrolsüz trusted state saymak, transport ile karar sahibini birbirine karıştırır. Etki uygulamanın bu bilgiyi nasıl kullandığına bağlıdır; sıradan sum hesaplaması tek başına güvenlik açığı göstermez.
Clone ile transfer ayrımını kaçırmak da failure condition yaratır. Parent detached buffer’ı yeniden kullanılabilir sanırsa sonraki computation fail olabilir; shared memory olmayan array clone’da worker mutation’ı parent mutation gibi yorumlanırsa yanlış state teşhisi konur. Kontrol message schema, job correlation ve ownership lifecycle’ını açık tutmaktır. Window DOM owner olarak kalır; worker response yalnız beklenen bounded data’yı taşır.
Cached response’un sınırını koru
Bir controlled client’in cached response alması origin’in o anda yeni permission check yaptığını kanıtlamaz. Personalized state’i yanlış lifecycle ile tutmak eski UI veya gereksiz veri kalıcılığı yaratabilir; etki cache planı, principal ve invalidation’a bağlıdır. Bu ders public Offline note saklar, identity/session verisi saklamaz. Handler coverage ve entry freshness application’ın açık kararları olmalıdır.
Active registration’ı bütün mevcut document’lerin controller’ı veya bütün URL’lerin offline garantisi saymak availability riskidir. Cache miss branch’inde network yokken Fetch reject olur; bunun worker compromise olduğunu varsayma. Varsayılan update waiting’i de broken network diye teşhis etme. Scope, controller, matched entry ve fallback sonucu ayrı kaydedildiğinde gözlem kararın sınırını korur.
3. Blue · Güvenli geliştirme ve savunma
Hareket olmadan bütün senaryoları oku
Ownership review
- İki iframe document’i title’larıyla ayrıldı
Clone/transfer defterinde Window gönderim anındaki input ve sender length’i, Worker kendi kopyası/receiver length’i ve sum sonucunu, Window da alınan jobRef sonrası DOM güncellemesini sahiplenir. Bunlar local MessageEvent sınırlarıdır, HTTP hop’ları değildir. Offline dalındaki Cache Storage hit’i origin event’i üretmez; entry yokken offline miss de origin’e ulaşmış request kanıtı vermez. Parent note ile Frame note farklı documents’tir; sameOriginSupplied true’dur. Parent URL ve frame URL ayrı tutulur. Bu origin observation’ından OS process allocation veya cross-origin access sonucu çıkarılmaz.
- Context observations
- Parent note ≠ Frame note / two documents
- Ownership/coverage review
- Ownership gate bekliyor
- Evidence verdict
- Outcome yok
- Clone mutation parent invariant’ıyla karşılaştırıldı
Worker copy [99,3] olurken parentAfter [2,3] korunur. Result sum 5 original input computation’ıdır. Before input, computed result ve later mutation farklı checkpoints’tir; sum’u mutated input’tan tekrar türetmek yanlış evidence olur.
- Context observations
- Parent note ≠ Frame note / two documents
- Ownership/coverage review
- Computed sum5 / worker later mutates / parent unchanged
- Evidence verdict
- Outcome yok
- Transfer before/after values ayrı yazıldı
sum-b senderBefore 2, senderAfterPost 0 ve receiverLength 2 verir. Receiver content 0203 ile sum 5 kurulur. Sender ve receiver byteLength’lerini tek shared buffer state’i diye birleştirmek detachment’ı gizler.
- Context observations
- Sender before2 / after0 / receiver2
- Ownership/coverage review
- Computed sum5 / worker later mutates / parent unchanged
- Evidence verdict
- Outcome yok
- Transfer oracle positive control ile sınandı
Normal XML senderLength 0 ve senderReusable false verir; count sıfırdır. Positive XML aynı detached sender’ı reusable true gösterir ve count bir olur. Bu observations standard log schema’sı veya real worker trace’i değildir.
- Context observations
- Sender before2 / after0 / receiver2
- Ownership/coverage review
- Normal detached nonreusable / positive inconsistency
- Evidence verdict
- Outcome yok
- Missing observation no-detachment claim’i olmadı
Sender length veya result jobRef observation’ı yoksa normal fixture değerleri kopyalanmaz. Ownership/result verdict UNKNOWN kalabilir. Shared memory, retry ve multi-worker concurrency ayrı contracts ve evidence ister.
- Context observations
- Sender before2 / after0 / receiver2
- Ownership/coverage review
- Normal detached nonreusable / positive inconsistency
- Evidence verdict
- UNKNOWN without sender/job-result coverage
- Regression minimal message scope’unda kaldı
JobRef, input/result schema, sender/receiver lengths ve current document association birlikte kontrol edilir. Full private data veya credential gerekmez. DOM update’in owner’ı window’dur; worker result’unu authorization verdict’i diye sunma.
- Context observations
- Sender before2 / after0 / receiver2
- Ownership/coverage review
- Normal detached nonreusable / positive inconsistency
- Evidence verdict
- Recheck job/schema/length/document association
Offline coverage
- Script, scope ve controller farklı fields oldu
Clone/transfer defterinde Window gönderim anındaki input ve sender length’i, Worker kendi kopyası/receiver length’i ve sum sonucunu, Window da alınan jobRef sonrası DOM güncellemesini sahiplenir. Bunlar local MessageEvent sınırlarıdır, HTTP hop’ları değildir. Offline dalındaki Cache Storage hit’i origin event’i üretmez; entry yokken offline miss de origin’e ulaşmış request kanıtı vermez. Registration scope /learn/ ve scriptURL /learn/worker.js’tir. İlk controller null, normal reload sonrası controlled true’dur. Registration Promise resolved sonucu gerçek current control evidence ile eşitlenmez.
- Context observations
- Scope/script known / controller state separate
- Ownership/coverage review
- Ownership gate bekliyor
- Evidence verdict
- Outcome yok
- Entry presence offline hit’in predicate’i olarak incelendi
Cache name atlas-public-v1, seed /learn/offline.txt ve Offline note content’i explicit’tir. Controlled offline hit entryPresent true ile status 200 verir. Sadece scope eşleşmesi seed’in mevcut olduğunu kanıtlamaz.
- Context observations
- Scope/script known / controller state separate
- Ownership/coverage review
- Explicit public entry / offline200 Offline note
- Evidence verdict
- Outcome yok
- Offline miss normal negative control oldu
Missing path için entryPresent false ve rejected-TypeError gözlenir; originReached false kalır. Aynı handler’ın hit ve miss outcomes’ı farklıdır. Network unavailable ile stored entry missing iki ayrı conditions olarak korunur.
- Context observations
- Missing entry + offline → rejected-TypeError
- Ownership/coverage review
- Explicit public entry / offline200 Offline note
- Evidence verdict
- Outcome yok
- HTTP cache ile Cache Storage evidence karışmadı
cacheAPIHonorsHTTPFreshness false’tur. Request.cache behavior HTTP cache’e aittir; explicit Cache API plan başka path seçebilir. Storage entry varlığı origin’in güncel response veya permission verdiğini göstermez.
- Context observations
- Missing entry + offline → rejected-TypeError
- Ownership/coverage review
- Cache API plan ≠ HTTP cache freshness
- Evidence verdict
- Outcome yok
- Coverage bütün offline availability iddiası olmadı
Bu public seed için expected hit ve seçilmiş miss bilinir. Update waiting, eviction, arbitrary URLs veya gerçek offline platform behavior ölçülmez. Her controlled client için offline garanti ilan etmek bu limited coverage’ı aşar.
- Context observations
- Missing entry + offline → rejected-TypeError
- Ownership/coverage review
- Cache API plan ≠ HTTP cache freshness
- Evidence verdict
- Seed hit/miss scoped / all-URL offline unknown
- Tekrarlanabilir review lifecycle temizliğini dikkate aldı
Gerçek local denemede önceki registration/cache sonucu yeni observation’ı etkileyebilir; cleanup ve scope kaydı gerekir. Bu inert .example URLs çalıştırılmaz. Yeni browser/runtime claim’i kendi evidence’ı ile ilişkilendirilmelidir.
- Context observations
- Missing entry + offline → rejected-TypeError
- Ownership/coverage review
- Cache API plan ≠ HTTP cache freshness
- Evidence verdict
- Record scope and cleanup for actual local experiments
UYGULAMA · GÜVENLİK KONTROLÜ · DOĞRULAMA
Document ve message sahipliğini kaydet
Clone/transfer defterinde Window gönderim anındaki input ve sender length’i, Worker kendi kopyası/receiver length’i ve sum sonucunu, Window da alınan jobRef sonrası DOM güncellemesini sahiplenir. Bunlar local MessageEvent sınırlarıdır, HTTP hop’ları değildir. Offline dalındaki Cache Storage hit’i origin event’i üretmez; entry yokken offline miss de origin’e ulaşmış request kanıtı vermez. Parent URL ile iframe URL’sini, selected origin ilişkisini ve aktif document’leri önce ayır. Aynı origin fixture’da parent title Parent note, frame title Frame note ve iki document identity’si farklıdır. Bu gözlem browser policy sınırında kalır; OS process mapping veya cross-origin erişim claim’i eklenmez. Navigation sonrası eski referansı current state diye raporlama.
Worker job’ı için sender input [2,3], copied receiver input, worker’ın [99,3] mutation’ı ve parent’ın değişmeyen input’unu yan yana tut. Transfer branch’inde senderBefore=2, senderAfterPost=0, receiverLength=2 ayrı lifecycle ölçümleridir. Result schema jobRef/sum doğrulanır; DOM update window’da yapılır. Shared memory, retry ve birden çok worker concurrency’si ayrı sözleşme ister.
Offline planını explicit coverage ile doğrula
Registration script ve scope’u kaydet; register resolved, ready active ve controller değerini ayrı gözle. İlk document uncontrolled ve reload sonrası controlled sonuçları, clients.claim/skipWaiting kullanılmayan temiz profile fixture’ında beklenen akıştır. Update waiting veya eviction gerçek ortamda başka dallar açar; bu küçük örnek bunların native ölçümünü yaptığını iddia etmez.
Cache Storage altında public seed path’in ve content’in gerçekten bulunduğunu doğrula; offline seçimini bundan sonra uygula. Hit response200/body Offline note ile miss rejected result aynı handler’ın iki farklı sonucudur. Offline branch’te origin’e ulaşılmış request olmadığına dikkat et. Cache API content’ini HTTP cache freshness header’ından yönetildi diye etiketleme. Local deneme sonunda registration ve cache’i temizle; böylece sonraki gözlem önceki worker veya stored entry’den etkilenmez.
ŞİMDİ VAKAYA UYGULA
Worker ownership ve service worker offline response hangi farklı evidence ister?
Worker clone’ı değiştirse parent [2,3] kalır; ArrayBuffer transfer’inde sender length 0 olur. Service worker active registration’ı ilk client’i hemen controlled yapmaz. Public Offline note seed’i offline HIT verirken missing entry TypeError ile biter.
Vakadaki response receipt, parsing, callback ve görünür DOM sonucunu sıraya koy. Eski başlığın kalmasını bu dersteki browser state ayrımlarıyla açıklamayı dene.
Bağlı vaka dosyasını aç ↗ÖRNEĞİ BİRLİKTE OKUYALIM
Context ve response ownership defteri
Bir alan seç; hangi sonucu desteklediğini ve nerede yetersiz kaldığını incele.
Ham kaydı ve alan açıklamalarını oku
{
"iframe": {
"parentPath": "/learn/main",
"framePath": "/learn/frame",
"parentTitle": "Parent note",
"frameTitle": "Frame note",
"differentDocuments": true,
"sameOriginSupplied": true
},
"workerClone": {
"jobRef": "sum-a",
"parentBefore": [
2,
3
],
"workerAfter": [
99,
3
],
"parentAfter": [
2,
3
],
"sum": 5,
"documentAvailable": false,
"windowAvailable": false
},
"workerTransfer": {
"jobRef": "sum-b",
"bufferHex": "0203",
"senderBeforeByteLength": 2,
"senderAfterPostByteLength": 0,
"receiverByteLength": 2,
"sum": 5
},
"registration": {
"scriptURL": "https://learn.atlas.example/learn/worker.js",
"scope": "https://learn.atlas.example/learn/",
"registerResolved": true,
"activePresent": true,
"firstClientController": null,
"afterNormalReloadControlled": true,
"clientsClaimUsed": false,
"skipWaitingUsed": false,
"newUpdateMayWaitForOldClients": true
},
"cachePlan": {
"name": "atlas-public-v1",
"explicitSeedPath": "/learn/offline.txt",
"seedContent": "Offline note",
"cacheAPIHonorsHTTPFreshness": false,
"hit": {
"controlledClientSupplied": true,
"online": false,
"entryPresent": true,
"status": 200,
"body": "Offline note"
},
"miss": {
"path": "/learn/missing.txt",
"controlledClientSupplied": true,
"online": false,
"entryPresent": false,
"fetchOutcome": "rejected-TypeError",
"originReached": false
}
},
"selector": {
"language": "XPath",
"xml": "<observations><transfer senderLength=\"0\" receiverLength=\"2\" senderReusable=\"false\"/></observations>",
"xpath": "count(/observations/transfer[@senderLength=\"0\" and @senderReusable=\"true\"])",
"expected": 0,
"positiveFixtureXml": "<observations><transfer senderLength=\"0\" receiverLength=\"2\" senderReusable=\"true\"/></observations>",
"positiveExpected": 1,
"scope": "Only authored protocol-decision observations, not product log field names or a live HTTP capture.",
"missingFieldBehavior": "Missing observation is insufficient evidence; zero matches is not proof of correct runtime behavior."
}
}- iframe
- Ayrı document’lar; yalnız aynı origin erişimi supplied.
- workerClone / workerTransfer
- Kopya mutation ile detached buffer ownership’i farklıdır.
- registration
- Active registration ve current controller farklı gözlemler.
- cachePlan
- Explicit public entry; hit ve offline miss ayrıdır.
Inert authored ledger; .example URL’leri çalıştırılmaz. Native localhost ayrı fixture’dır; update waiting/eviction/SAB runtime ölçülmez.
İki yanlış kanı
Worker message parent object’ini her zaman paylaşır.
Plain array clone kopyadır; transfer edilen ArrayBuffer detached olur. Shared memory farklı koşullara bağlıdır.
Service Worker active ise bütün site offline çalışır.
Controller, handler coverage ve saklanmış entry gerekir; offline cache miss Fetch rejection’a gidebilir.
SIRA SENDE
Bu hikâyeyi sen çöz.
Sonucu tahmin et, kanıtın sınırını bul ve nedenini kendi cümlenle anlat.
Worker cloned array’ini [99, 3] yaptı. Parent array ne olur?
- Parent da [99, 3] olur; worker aynı referansı kullanır.
- Parent [2, 3] kalır; worker’ın kopyası değişmiştir.
Gerekçeli cevabı oku
Parent [2, 3] kalır; worker’ın kopyası değişmiştir. — workerClone.parentAfter=[2, 3], ayrı ownership’i gösterir. Worker window/document’a erişmez.
Registration promise resolve oldu; activePresent=true. İlk client kesin controlled mı?
Dersten seçilen artifact alanları; öğretim örneği
- registration.registerResolved
- true
- registration.activePresent
- true
- registration.firstClientController
- null
- registration.afterNormalReloadControlled
- true
- Hayır. firstClientController=null; bu örnekte reload sonrası controlled.
- Evet. Register promise her page’i anında controlled yapar.
Gerekçeli cevabı oku
Hayır. firstClientController=null; bu örnekte reload sonrası controlled. — clientsClaim kullanılmaz. Active registration, ilk document’ın controller’ı olmakla eşdeğer değildir.
Offline Cache API hit 200 neden origin’den fresh response alındığı kanıtı değildir? Buffer transfer ile clone farkını da açıkla.
Gerekçeli cevabı oku
Controlled client, önceden saklanan entry’den offline body alır. Cache API otomatik HTTP freshness uygulamaz; origin round trip veya server authorization ölçümü yoktur. Transfer branch’inde sender buffer detached olur ve byteLength=0 kalır; receiver 2 byte taşır. Clone branch’inde parent array korunur. İki işlem aynı ownership modelini kullanmaz.
□ Cache API object’ini origin freshness kanıtı saymadım.
□ Clone ve transfer ownership farkını açıkladım.
Uygulama konsolunu aç · request / response / browser
Request, URL, cookie ve DOM örneklerini ayrıca aç
Kaynaklar ve kapsam
- WHATWG HTML — Document sequences7.3.1 Navigables · 7.3.1.3 Child navigables
- WHATWG HTML — Web workers10.2.1.1 The WorkerGlobalScope common interface · 10.2.6.3 Dedicated workers and the Worker interface
- WHATWG HTML — Structured data2.7.1 Serializable objects · 2.7.7 StructuredSerializeWithTransfer · 2.7.8 StructuredDeserializeWithTransfer
- W3C — Service Workers2.1 Service Worker · 2.3 Service Worker Registration · 3.4.1 controller · 3.4.2 ready · 3.4.3 register(scriptURL, options) · 4.4 ExtendableEvent · 4.6 FetchEvent · 5.4 Cache · 2.1.1 Lifetime · 4.4.1 event.waitUntil(f) · 6.1 Secure Context
- MDN — Using Web WorkersWeb Workers API · Dedicated workers · Transferring data to and from workers: further details
- MDN — Worker: postMessage()Parameters · Transfer Example
- MDN — Using Service WorkersThe premise of service workers · Updating your service worker
- MDN — CacheCache · Methods