Hacker DirectoryHacker Directory
Öğrenmeye devam et
ENHTML kaydet ↓

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.

CORE · RED · BLUE · ARTIFACT · PRACTICE

1. Core · Mekanizma

Hareket olmadan bütün senaryoları oku

Array clone

  1. 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
  2. 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
  3. 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
  4. 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
  5. 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
  6. 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

  1. 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
  2. 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
  3. 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
  4. 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
  5. 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
  6. 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

  1. 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
  2. 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
  3. 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
  4. 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
  5. 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
  6. 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
  7. 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

  1. 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
  2. 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
  3. 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
  4. 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
  5. 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
  6. 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

  1. 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
  2. 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
  3. 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
  4. 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
  5. 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
  6. 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

  1. 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
  2. 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
  3. 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
  4. 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
  5. 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
  6. 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

  1. İ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
  2. 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
  3. 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
  4. 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
  5. 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
  6. 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

  1. 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
  2. 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
  3. 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
  4. 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
  5. 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
  6. 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?

  1. Parent da [99, 3] olur; worker aynı referansı kullanır.
  2. 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
  1. Hayır. firstClientController=null; bu örnekte reload sonrası controlled.
  2. 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