WEB / WEB-11.03
iframe isolation ve postMessage
Atlas, cross-origin readonly preview widget’iyle dar bir message contract kullanır. Window reference, delivery ve application acceptance farklı adımlardır.
1. Core · Mekanizma
Hareket olmadan bütün senaryoları oku
Doğru reply
- Document’ler hazır
Atlas parent ve preview-one listener’ları hazırdır; parent tx-current için reply bekler. Cross-origin document’ler doğrudan DOM paylaşmaz. Henüz get-title message hazırlanmış veya teslim edilmiş değildir.
- Atlas · parent
- Listeners ready; tx-current pending
- Preview · iframe
- Listeners ready; readonly title
- Readonly request hazır
Parent exact preview targetOrigin ve selected WindowProxy ile get-title request’ini task queue’ya hazırlar.
- Atlas · parent
- get-title queued; no delivery proof
- Preview · iframe
- Listeners ready; readonly title
- Preview event aldı
Selected task target origin’i eşleşti ve preview message event aldı; application validation hâlâ pending.
- Atlas · parent
- get-title queued; no delivery proof
- Preview · iframe
- Request event received; gates pending
- Preview kabul gate’i
Preview parent origin/source ile readonly request schema ve transaction koşullarını değerlendirdi; DOM paylaşımı yoktur.
- Atlas · parent
- get-title queued; no delivery proof
- Preview · iframe
- Request accepted; readonly title selected
- Reply task hazır
Preview selected title-result reply’sini hazırladı; origin doğru olsa da response transaction ve instance parent’ta ayrıca denetlenir.
- Atlas · parent
- get-title queued; no delivery proof
- Preview · iframe
- Reply queued; tx-current/preview-one
- Parent event aldı
Reply message event parent’a ulaştı; origin/source/schema/transaction kabulü receipt sonrası local gate’te yapılır.
- Atlas · parent
- Reply event received; acceptance pending
- Preview · iframe
- Reply queued; tx-current/preview-one
- Parent kabul gate’i
Parent selected reply koşullarını birlikte kontrol etti; normal reply kabul edildi.
- Atlas · parent
- Reply accepted; no display update yet
- Preview · iframe
- Reply queued; tx-current/preview-one
- Display binding
Selected text-only display Atlas Notları alias’ına bağlandı; model gerçek DOM, message API veya HTTP çalıştırmaz.
- Atlas · parent
- Declared text binding: Atlas Notları
- Preview · iframe
- Reply queued; tx-current/preview-one
Eski transaction
- Document’ler hazır
Atlas parent tx-current için reply bekler ve preview-one listener’ı hazırdır. Bu dal daha sonra tx-old reply’sini seçer; doğru origin teslimi, eski transaction’ın kabul edileceğini baştan göstermez.
- Atlas · parent
- Listeners ready; tx-current pending
- Preview · iframe
- Listeners ready; readonly title
- Readonly request hazır
Parent exact preview targetOrigin ve selected WindowProxy ile get-title request’ini task queue’ya hazırlar.
- Atlas · parent
- get-title queued; no delivery proof
- Preview · iframe
- Listeners ready; readonly title
- Preview event aldı
Selected task target origin’i eşleşti ve preview message event aldı; application validation hâlâ pending.
- Atlas · parent
- get-title queued; no delivery proof
- Preview · iframe
- Request event received; gates pending
- Preview kabul gate’i
Preview parent origin/source ile readonly request schema ve transaction koşullarını değerlendirdi; DOM paylaşımı yoktur.
- Atlas · parent
- get-title queued; no delivery proof
- Preview · iframe
- Request accepted; readonly title selected
- Reply task hazır
Preview selected title-result reply’sini hazırladı; origin doğru olsa da response transaction ve instance parent’ta ayrıca denetlenir.
- Atlas · parent
- get-title queued; no delivery proof
- Preview · iframe
- Reply queued; tx-old
- Parent event aldı
Reply message event parent’a ulaştı; origin/source/schema/transaction kabulü receipt sonrası local gate’te yapılır.
- Atlas · parent
- Reply event received; acceptance pending
- Preview · iframe
- Reply queued; tx-old
- Parent kabul gate’i
Parent selected reply koşullarını birlikte kontrol etti; reply context uyuşmadığı için reddedildi.
- Atlas · parent
- Reply denied; display unchanged
- Preview · iframe
- Reply queued; tx-old
- Display binding
Parent reply event’ini aldı, fakat tx-old beklenen tx-current ile eşleşmedi. Display binding yapılmadı. Message receipt transaction kabulü değildir; burada gerçek DOM veya HTTP çalışmaz.
- Atlas · parent
- No display binding; rejected reply
- Preview · iframe
- Reply queued; tx-old
Başka instance
- Document’ler hazır
Atlas’ın iki preview’u aynı origin’dedir. Request preview-two’ya gider ama pending context preview-one bekler.
- Atlas · parent
- Beklenen preview-one; tx-current
- Preview · iframe
- Current preview-two; aynı origin
- Readonly request hazır
Parent exact preview targetOrigin ve selected WindowProxy ile get-title request’ini task queue’ya hazırlar.
- Atlas · parent
- get-title queued; no delivery proof
- Preview · iframe
- Current preview-two; aynı origin
- Preview event aldı
Selected task target origin’i eşleşti ve preview message event aldı; application validation hâlâ pending.
- Atlas · parent
- get-title queued; no delivery proof
- Preview · iframe
- Request event received; gates pending
- Preview kabul gate’i
Preview parent origin/source ile readonly request schema ve transaction koşullarını değerlendirdi; DOM paylaşımı yoktur.
- Atlas · parent
- get-title queued; no delivery proof
- Preview · iframe
- Request accepted; readonly title selected
- Reply task hazır
Preview selected title-result reply’sini hazırladı; origin doğru olsa da response transaction ve instance parent’ta ayrıca denetlenir.
- Atlas · parent
- get-title queued; no delivery proof
- Preview · iframe
- Reply queued; preview-two
- Parent event aldı
Reply message event parent’a ulaştı; origin/source/schema/transaction kabulü receipt sonrası local gate’te yapılır.
- Atlas · parent
- Reply event received; acceptance pending
- Preview · iframe
- Reply queued; preview-two
- Parent kabul gate’i
Parent selected reply koşullarını birlikte kontrol etti; reply context uyuşmadığı için reddedildi.
- Atlas · parent
- Reply denied; display unchanged
- Preview · iframe
- Reply queued; preview-two
- Display binding
Reply’nin origin’i ve tx-current doğru olsa da source preview-two, beklenen preview-one değildir. Parent kabulü reddeder ve display binding yapılmaz; aynı origin aynı Window instance’ı demek değildir.
- Atlas · parent
- No display binding; rejected reply
- Preview · iframe
- Reply queued; preview-two
Frame değişti
- Yeni receiver context
Preview’ın mevcut document origin’i preview-v2.example.org’dur; Atlas parent eski exact target preview.example.org’u kullanır. Browser-local task bu iki origin’i daha sonra karşılaştırır; sender henüz teslim veya ret bilgisi almış değildir.
- Atlas · parent
- Exact target preview.example.org
- Preview · iframe
- Current document preview-v2.example.org
- Request queue
Parent normal readonly request’i exact eski target ile queue eder; çağrı dönüşü delivery acknowledgment değildir.
- Atlas · parent
- Request queued; no acknowledgment
- Preview · iframe
- Current document preview-v2.example.org
- Local target gate
Browser-local task gate current receiver document origin’i exact target ile karşılaştırır; uyuşmadığı için event oluşturmaz.
- Atlas · parent
- Request queued; no acknowledgment
- Preview · iframe
- Target mismatch; zero message events
- Reply yok
Örnekte message event sayısı sıfırdır. Sender’ın bu kararı gerçek postMessage API’sinden öğrendiği varsayılmaz.
- Atlas · parent
- No reply observed; no display update
- Preview · iframe
- Target mismatch; zero message events
ROLLER · STATE · VERİ AKIŞI
iframe görmek document’ini okumak değildir
Atlas parent’ı, preview.example.org document’ini iframe içinde gösterir. Normal cross-origin durumda parent contentWindow üzerinden bir WindowProxy reference elde edebilir; bu reference preview DOM’una genel erişim vermez. postMessage gibi sınırlı yüzeyler kullanılabilirken direct document okuması origin gate’ine bağlıdır. Aynı-origin iframe daha fazla script erişimi paylaşır; iframe etiketi tek başına her içeriği güçlü izolasyona sokmaz. Browser process seçimi de bu DOM boundary’nin görsel kutusuyla eş anlamlı değildir.
Sandbox ayrı capability sınırları ekler. Sandboxed origin flag açıkken HTTP URL aynı olsa bile document opaque origin taşır; script flag’i script çalışmasını ayrıca etkiler. allow-same-origin başka origin’i parent ile aynı yapmaz, origin sandbox restriction’ını kaldırıp document’in olağan origin bağlamını korur. Bu ders normal tuple-origin preview messaging’i seçer; opaque sandbox’a confidential message göndermek için wildcard’ı öneren bir çözüm sunmaz. Sandbox ve framing policy’nin gerçek uygulanması ayrı browser testidir.
Mesaj sözleşmesi transport değildir
Parent yalnız get-title v1 request’i gönderir: transactionAlias=tx-current ve bookAlias=atlas-notlari. postMessage data’yı structured serialization ile diğer context’e taşır ve task queue üzerinden message event oluşturur; HTTP packet veya doğrudan DOM paylaşımı değildir. Seçili exact targetOrigin=https://preview.example.org, task çalışırken receiver document origin’iyle eşleşmelidir. WindowProxy navigation sonrası başka document’i temsil edebilir. Gönderme çağrısının dönmesi, message event’in oluştuğu veya receiver’ın request’i kabul ettiği anlamına gelmez.
Preview, event.origin’ın beklenen parent origin’le, event.source’un beklenen parent WindowProxy’yle, data’nın readonly schema’yla ve transaction’ın pending context’le eşleştiğini kontrol eder. Reply title-result biçimindedir. Parent bu response’u alırken preview origin’ini ve WindowProxy’sini, ardından shape ve current transaction’ı denetler. event.origin, sender’ın çağrı anındaki origin’idir; receiver origin’i veya source window’un sonraki navigation sonucu değildir. Reply hedefi, önce doğrulanmış context’ten seçilmelidir.
Structured clone data’nın business anlamını doğrulamaz. Bu fixture MessagePort veya transferable nesne taşımaz; ports=[] açıkça seçilir. MessageChannel daha sonra kurulursa port possession ve lifecycle için ayrı capability sözleşmesi gerekir; window message’ın origin/source kontrolleri her port event’ine aynen kopyalanmaz. Birden fazla request ve asynchronous iş reply sırasını değiştirebilir; transaction binding “ilk reply benimdir” varsayımını önler. Tam task scheduler veya port transferi bu modelde çalıştırılmaz.
2. Red · Güven ve etki
Hareket olmadan bütün senaryoları oku
Eski reply
- Bekleyen işi tanı
Parent tx-current ve preview-one için title-result bekliyor. Event kaydının origin’i doğru olsa bile hangi işin ve hangi pencerenin sonucunu taşıdığını ayrıca belirlemeliyiz.
- Preview reply kaydı
- tx-current / preview-one
- Parent kabul kuralı
- Henüz değerlendirilmedi
- Başlık bağlama sonucu
- Henüz değerlendirilmedi
- Eski transaction
Stale-reply kaydı tx-old ve Earlier Atlas title taşıyor. Origin ile source doğru kalırken transaction uyuşmuyor; title-result olması tek başına kabul için yeterli değil.
- Preview reply kaydı
- tx-current / preview-one
- Parent kabul kuralı
- tx-old ≠ tx-current / reject
- Başlık bağlama sonucu
- Henüz değerlendirilmedi
- Başlığı koru
Parent eski reply’yi kabul etmiyor. Event’in bulunması bir application acknowledgment değildir; eski kitap başlığı current request’in display binding’ine alınmıyor.
- Preview reply kaydı
- tx-current / preview-one
- Parent kabul kuralı
- tx-old ≠ tx-current / reject
- Başlık bağlama sonucu
- Current title unchanged
- İkinci pencere
Instance-mismatch aynı preview origin’inden geliyor, fakat sourceWindow preview-two. Pending iş preview-one’a bağlı; origin eşitliği iki WindowProxy’yi tek pencereye dönüştürmüyor.
- Preview reply kaydı
- Same origin / preview-two
- Parent kabul kuralı
- tx-old ≠ tx-current / reject
- Başlık bağlama sonucu
- Current title unchanged
- Birlikte doğrula
Origin, source, type, v, transactionAlias, bookAlias ve title türü birlikte doğrulanıyor. Bu readonly sözleşme text sonucu seçiyor; API kullanıcı yetkisi veya DOM render başarısı vermiyor.
- Preview reply kaydı
- Same origin / preview-two
- Parent kabul kuralı
- Origin + source + shape + transaction
- Başlık bağlama sonucu
- Current title unchanged
- Yanlış bağlamayı durdur
Yanlış instance ile eski transaction ayrı reddetme nedenleri. İkisinde de current başlık korunuyor; kabul edilen normal reply yalnız kendisine bağlı readonly işin sonucunu güncelleyebilir.
- Preview reply kaydı
- Same origin / preview-two
- Parent kabul kuralı
- Origin + source + shape + transaction
- Başlık bağlama sonucu
- Rejected replies / no title update
Delivery sınırı
- Exact hedefi kaydet
Request için targetOrigin https://preview.example.org. Bu değer caller’ın amaçladığı destination origin’i daraltır; postMessage çağrısının dönmesi receiver’ın mesajı kabul ettiğini söylemez.
- Preview reply kaydı
- targetOrigin = preview origin
- Parent kabul kuralı
- Henüz değerlendirilmedi
- Başlık bağlama sonucu
- Henüz değerlendirilmedi
- Navigation farkı
Frame-navigation satırında destination https://preview-v2.example.org olur. Delivery gate task sırasında current Document origin’ini değerlendirir ve exact hedefle uyuşmayan event’i teslim etmez.
- Preview reply kaydı
- targetOrigin = preview origin
- Parent kabul kuralı
- Destination changed / delivered false
- Başlık bağlama sonucu
- Henüz değerlendirilmedi
- Olmayan event’i sayma
Bu branch için parent acceptance veya preview handler başarısı kaydı üretilemiyor. Çizimdeki karar sender’ın gerçek API’den otomatik bir delivery acknowledgment aldığı anlamına gelmiyor.
- Preview reply kaydı
- targetOrigin = preview origin
- Parent kabul kuralı
- Destination changed / delivered false
- Başlık bağlama sonucu
- No request event / acceptance absent
- Reference izin değildir
Cross-origin iframe için WindowProxy reference var, directDomReadable false. Mesaj gönderebilecek bir reference’ın elde olması preview Document’ının DOM’unu okuma izni sağlamıyor.
- Preview reply kaydı
- WindowProxy available / DOM unreadable
- Parent kabul kuralı
- Destination changed / delivered false
- Başlık bağlama sonucu
- No request event / acceptance absent
- Lifecycle bağını koru
Pending iş instance ve transaction’a bağlı kalıyor. Listener’ların hazır olduğu başlangıç kabul ediliyor; navigation, timeout veya listener race’in gerçek browser davranışı burada ölçülmüyor.
- Preview reply kaydı
- WindowProxy available / DOM unreadable
- Parent kabul kuralı
- Instance-bound pending work
- Başlık bağlama sonucu
- No request event / acceptance absent
- İki aşamalı sınır
Exact destination gate ile application acceptance aynı kontrol değil. İlki event’in ulaşmasını daraltır, ikincisi ulaşan readonly sonucun doğru işe ait olup olmadığını değerlendirir.
- Preview reply kaydı
- WindowProxy available / DOM unreadable
- Parent kabul kuralı
- Instance-bound pending work
- Başlık bağlama sonucu
- Delivery ≠ application acceptance
VARSAYIM · SINIR · KONTROL
Origin tek başına hangi reply’yi seçer?
Atlas iki preview instance’ını aynı origin’den açmış olabilir. Instance-mismatch branch’inde reply origin’i doğrudur fakat source alias preview-two, pending request’in beklediği preview-one değildir. Parent onu kabul etmez. Bu normal widget wiring hatasıdır; başka hedefe müdahale veya payload değildir. Expected origin’in doğru olması hangi window ve hangi transaction’ın sonuç verdiğini tek başına belirlemez. Yanlış kabul edilirse etki bu readonly örnekte yanlış kitap başlığının gösterilmesidir; daha güçlü message action’ları kendi authorization sınırını ister.
Stale-reply branch’inde normal preview current request’i alır, ancak selected stale result tx-old etiketiyle döner. Parent current transaction’ıyla uyuşmadığı için title’ı güncellemez. Event delivery önce, application validation sonra görünür. Bir response’un message event olarak gelmesi schema veya transaction açısından kabul edildiği anlamına gelmez. Frame navigation branch’inde ise exact target gate uyuşmadığından hiç request event’i oluşmaz; sender otomatik delivery acknowledgment almış sayılmaz.
Opaque identity ve message şekli
Serialized null’un bütün opaque sender’ları aynı trusted widget yaptığı düşüncesi burada da yanlış olur. Schema’daki type/v/transaction/book alanları mesajın izin verilen readonly işini daraltır; data’yı HTML veya executable text gibi ele almak bu sözleşmenin dışındadır. Bu ders no-eval ve text-only result profili seçer, gerçek renderer çalıştırmaz. Kontrol etkisi, event acceptance ve selected display binding arasında tutulur; origin check’in API kullanıcı/tenant yetkisi verdiği iddia edilmez.
3. Blue · Güvenli geliştirme ve savunma
Hareket olmadan bütün senaryoları oku
Reply kontrolleri
- Normal reply kaydı
Bu artifact Window message teslim koşullarını ve receiver kabul kararlarını ayrı defterlerde tutar. deliveryCases browser-local task’in event üretip üretmediğini, replyCases parent’ın origin/source/type/transaction karşılaştırmasını öngörür. Bunlar gerçek postMessage veya HTTP kayıtları değildir; event receipt kabul ve display binding’den önce gelir. frame-navigation’da preview event oluşmaz; stale-reply ve instance-mismatch ise parent event’ine ulaşır, sonra reddedilir. Normal reply, preview origin’i ve preview-one source’u ile tx-current taşıyor. type title-result, v 1 ve bookAlias atlas-notlari; title string olarak Atlas Notları.
- Event ledger
- Normal / tx-current / title string
- Correlation review
- Henüz değerlendirilmedi
- Kabul kanıtı
- Henüz değerlendirilmedi
- Olumlu kontrol
Tüm kabul koşulları normal satırda geçiyor. Bu olumlu kontrol, daha sonra reddedilen sonuçların yalnız bozuk test altyapısından kaynaklanmadığını model düzeyinde karşılaştırmaya yarıyor.
- Event ledger
- Normal / tx-current / title string
- Correlation review
- Normal accepted true
- Kabul kanıtı
- Henüz değerlendirilmedi
- Olumsuzları ayır
Stale-reply transaction’dan, instance-mismatch source’dan, shape-mismatch title 17 türünden ve origin-mismatch origin’den reddediliyor. Her neden aynı üst başlıkta kaybolmadan kaydediliyor.
- Event ledger
- Normal / tx-current / title string
- Correlation review
- Normal accepted true
- Kabul kanıtı
- Four independent rejection reasons
- Delivery kaydını ayır
Normal delivery true, frame-navigation delivery false. Reply rejection ile hiç request event’i oluşmaması farklı aşamalardır; parent’ta boş reply listesi hangisinin yaşandığını tek başına açıklamaz.
- Event ledger
- Delivery normal true / navigation false
- Correlation review
- Normal accepted true
- Kabul kanıtı
- Four independent rejection reasons
- Dar correlation
Expected source alias ve pending transaction birlikte tutuluyor. Event origin string’i pencere identity’sinin yerine geçmiyor; text sonucu kabulü server action yetkisiyle de birleştirilmiyor.
- Event ledger
- Delivery normal true / navigation false
- Correlation review
- Origin/source/transaction scopes retained
- Kabul kanıtı
- Four independent rejection reasons
- Regression sınırı
Kabul matrisi normal ve ayrı olumsuz kontrolleri karşılaştırıyor. Gerçek iframe, clone, port transferi ve DOM render bu kayıttan doğrulanmış sayılmaz; bu sonuç yalnız message contract kararını açıklar.
- Event ledger
- Delivery normal true / navigation false
- Correlation review
- Origin/source/transaction scopes retained
- Kabul kanıtı
- Finite contract verified / browser unmeasured
Event boşluğu
- Boş reply görünümü
Bu artifact Window message teslim koşullarını ve receiver kabul kararlarını ayrı defterlerde tutar. deliveryCases browser-local task’in event üretip üretmediğini, replyCases parent’ın origin/source/type/transaction karşılaştırmasını öngörür. Bunlar gerçek postMessage veya HTTP kayıtları değildir; event receipt kabul ve display binding’den önce gelir. frame-navigation’da preview event oluşmaz; stale-reply ve instance-mismatch ise parent event’ine ulaşır, sonra reddedilir. İnceleyenin elinde reply event kaydı yok. Bu yokluk, frame navigation ile delivery engeli, listener hazırlığı veya başka bir lifecycle durumunu tek başına seçtirmiyor.
- Event ledger
- Reply observation missing
- Correlation review
- Henüz değerlendirilmedi
- Kabul kanıtı
- Henüz değerlendirilmedi
- Bekleneni kopyalama
Normal request ve response örneği tx-current için beklenen sözleşmeyi gösteriyor. Eksik trace’e normal origin/source/title alanları eklemek, gözlenmeyen bir acceptance sonucunu uydurur.
- Event ledger
- Reply observation missing
- Correlation review
- Expected contract ≠ missing event
- Kabul kanıtı
- Henüz değerlendirilmedi
- Belirsiz sonucu koru
Event yokken title-result kabul edildi veya reddedildi diyemiyoruz. Current display’in değişmemesi de delivery kararını tek başına kanıtlamaz; farklı aşamalar aynı görünür sonuca ulaşabilir.
- Event ledger
- Reply observation missing
- Correlation review
- Expected contract ≠ missing event
- Kabul kanıtı
- Delivery/acceptance UNKNOWN
- Gerekli bağlamı seç
Hedef origin’in task anındaki bağlamı, ilgili window instance’ı ve pending transaction kaydı gerekli. Gerçek ürün ölçümünde listener hazırlığı ve lifecycle zamanı da aynı işe bağlanmalı.
- Event ledger
- Needed: destination/instance/transaction
- Correlation review
- Expected contract ≠ missing event
- Kabul kanıtı
- Delivery/acceptance UNKNOWN
- Model sınırını oku
Bu örneğin listenersReady true başlangıcı gerçek gecikme ölçümü değildir. HTTP kaydı da postMessage event’inin yerine geçmez; message delivery browser içindeki başka bir mekanizma.
- Event ledger
- Needed: destination/instance/transaction
- Correlation review
- Ready assumption / no HTTP evidence
- Kabul kanıtı
- Delivery/acceptance UNKNOWN
- Yeni kanıtın sorusu
Yeni inceleme delivery, event receipt ve application acceptance’ı ayrı yanıtlamalı. Bu eksik kayıt için sonuç UNKNOWN kalıyor; normal fixture başlığı boşluğa yerleştirilmiyor.
- Event ledger
- Needed: destination/instance/transaction
- Correlation review
- Ready assumption / no HTTP evidence
- Kabul kanıtı
- Collect scoped event/acceptance evidence
UYGULAMA · GÜVENLİK KONTROLÜ · DOĞRULAMA
Dar, instance’a bağlı mesaj kabulü
Bu artifact Window message teslim koşullarını ve receiver kabul kararlarını ayrı defterlerde tutar. deliveryCases browser-local task’in event üretip üretmediğini, replyCases parent’ın origin/source/type/transaction karşılaştırmasını öngörür. Bunlar gerçek postMessage veya HTTP kayıtları değildir; event receipt kabul ve display binding’den önce gelir. frame-navigation’da preview event oluşmaz; stale-reply ve instance-mismatch ise parent event’ine ulaşır, sonra reddedilir. Atlas expected origin’i configuration’dan, expected WindowProxy’yi açtığı selected iframe instance’ından alır. Sender exact targetOrigin kullanır; receiver origin, source ve schema’yı birlikte doğrular. Message source identity’si bir origin string’ine çevrilmez; aynı origin’deki iki window birbirinden ayrıdır. Type yalnız get-title/title-result, version yalnız 1, transaction yalnız pending tx-current, book yalnız selected readonly alias olur. Bilinmeyen type veya ek field sessizce güçlü action’a dönüşmez; selected schema’da reject edilir.
Regression normal result’i olumlu kontrol olarak kullanır; stale transaction, wrong instance, wrong shape ve current destination origin değişimini ayrı olumsuz kontrollerle sınar. Scene normal request event’ini preview’de pending bırakır, local acceptance sonrasında reply hazırlar, parent’ta response receipt ve validation’ı ayırır. Başlık ancak tüm selected reply gate’leri geçince display binding’e alınır. Dropped destination branch’i transfer çizmez; browser-local task gate’ini göstermesi sender’ın bu kararı gerçek API’den öğrendiği iddiası değildir.
Readiness ve lifecycle sınırı
Recipient readiness ve lifecycle de contract’ın parçasıdır. Listener hazırlanmış olmalı; iframe navigation document bağlamını değiştirirse pending işlemler ilgili instance için iptal edilmeli veya yeniden başlatılmalıdır. Model başlangıçta documents/listeners-ready varsayar. Bu varsayım gerçek browser timeout, WindowProxy navigation veya port transfer sonucu değildir; production lifecycle için bu olayların aynı instance ile ilişkilendirilmesi gerekir.
ŞİMDİ VAKAYA UYGULA
Mesajın gelmesi başlığı güncellemek için yeterli mi?
Atlas, preview-one penceresinden tx-current için Atlas Notları başlığını bekliyor. Aynı origin’den gelen tx-old yanıtı veya preview-two penceresinin sonucu bu işi tamamlamıyor. Frame başka origin’e taşındığında ise exact targetOrigin, request event’inin oluşmasını engelleyebiliyor.
Vakadaki browser policy hangi ilişkiyi kontrol ediyor? Response exposure, destination veya framing kararını server’ın object permission kararıyla karıştırmadan açıkla.
Bağlı vaka dosyasını aç ↗ÖRNEĞİ BİRLİKTE OKUYALIM
Readonly preview message sözleşmesi
Bir alan seç; hangi sonucu desteklediğini ve nerede yetersiz kaldığını incele.
Ham kaydı ve alan açıklamalarını oku
{
"profile": {
"parentOrigin": "https://atlas.example.org",
"previewOrigin": "https://preview.example.org",
"expectedParentWindow": "parent-one",
"expectedPreviewWindow": "preview-one",
"listenersReady": true,
"currentTransaction": "tx-current",
"exactTarget": true,
"actualBrowser": false,
"actualDOM": false,
"actualPostMessage": false,
"portTransfer": false,
"scriptEvaluation": false
},
"iframe": {
"normalCrossOrigin": true,
"directDomReadable": false,
"windowProxyReferenceAvailable": true,
"sandboxOriginProfile": "not selected for messaging; opaque distinction taught separately",
"sameOriginWouldNotBeIsolatedByElementAlone": true
},
"request": {
"type": "get-title",
"v": 1,
"transactionAlias": "tx-current",
"bookAlias": "atlas-notlari"
},
"response": {
"type": "title-result",
"v": 1,
"transactionAlias": "tx-current",
"bookAlias": "atlas-notlari",
"title": "Atlas Notları"
},
"deliveryCases": [
{
"case": "normal",
"targetOrigin": "https://preview.example.org",
"currentDestinationOrigin": "https://preview.example.org",
"expectedDelivered": true
},
{
"case": "frame-navigation",
"targetOrigin": "https://preview.example.org",
"currentDestinationOrigin": "https://preview-v2.example.org",
"expectedDelivered": false
}
],
"replyCases": [
{
"case": "normal",
"origin": "https://preview.example.org",
"sourceWindow": "preview-one",
"data": {
"type": "title-result",
"v": 1,
"transactionAlias": "tx-current",
"bookAlias": "atlas-notlari",
"title": "Atlas Notları"
},
"ports": [],
"expected": true
},
{
"case": "stale-reply",
"origin": "https://preview.example.org",
"sourceWindow": "preview-one",
"data": {
"type": "title-result",
"v": 1,
"transactionAlias": "tx-old",
"bookAlias": "atlas-notlari",
"title": "Earlier Atlas title"
},
"ports": [],
"expected": false
},
{
"case": "instance-mismatch",
"origin": "https://preview.example.org",
"sourceWindow": "preview-two",
"data": {
"type": "title-result",
"v": 1,
"transactionAlias": "tx-current",
"bookAlias": "atlas-notlari",
"title": "Atlas Notları"
},
"ports": [],
"expected": false
},
{
"case": "shape-mismatch",
"origin": "https://preview.example.org",
"sourceWindow": "preview-one",
"data": {
"type": "title-result",
"v": 1,
"transactionAlias": "tx-current",
"bookAlias": "atlas-notlari",
"title": 17
},
"ports": [],
"expected": false
},
{
"case": "origin-mismatch",
"origin": "https://preview-v2.example.org",
"sourceWindow": "preview-one",
"data": {
"type": "title-result",
"v": 1,
"transactionAlias": "tx-current",
"bookAlias": "atlas-notlari",
"title": "Atlas Notları"
},
"ports": [],
"expected": false
}
],
"deliverySemantics": {
"callReturnIsAcknowledgement": false,
"originCapturedAtSenderCall": true,
"sourceIsWindowProxy": true,
"receiverCurrentDocumentOriginCheckedAtTask": true,
"applicationValidationAfterEvent": true,
"httpTraffic": false
},
"omitted": [
"actual iframe creation/navigation/sandbox",
"full structured clone",
"browser event loop and listener races",
"MessageChannel/MessagePort transfer",
"timeouts and multiple asynchronous replies",
"API authorization and DOM rendering"
]
}- iframe
- WindowProxy reference DOM izni değildir; sandbox ayrı sınırlardır.
- request
- Exact readonly message schema ve pending transaction.
- deliveryCases
- Task anında receiver origin’e bağlı delivery gate.
- replyCases
- Receiver origin/source/schema/transaction conjunction.
- deliverySemantics
- API call dönüşü, event receipt ve acceptance ayrı.
Window/source kimlikleri alias’tır; events inert JSON’dur. Browser, actual postMessage, HTTP, DOM, clone veya port transferi çalıştırılmaz.
İki yanlış kanı
contentWindow varsa iframe DOM’u okunabilir.
Cross-origin WindowProxy sınırlı yüzey verir; direct DOM access ayrı origin gate’ine bağlıdır.
event.origin doğruysa reply kabul edilir.
Selected window source, readonly schema ve current transaction da eşleşmelidir.
SIRA SENDE
Bu hikâyeyi sen çöz.
Sonucu tahmin et, kanıtın sınırını bul ve nedenini kendi cümlenle anlat.
Reply doğru origin ve source’dan geliyor, fakat tx-old taşıyor. Güncel title sonucu olarak kabul edilir mi?
- Hayır. Eski reply güncel transaction’a ait değil.
- Evet. Doğru origin’den gelen bütün eski reply’lar günceldir.
Gerekçeli cevabı oku
Hayır. Eski reply güncel transaction’a ait değil. — Güncel transaction tx-current. Aynı Window ve origin’den gelse de tx-old bu işlemin sonucu değildir.
Frame preview-v2’ye navigate oldu; targetOrigin hâlâ preview. postMessage çağrısının dönmesi delivery ACK’i midir?
Dersten seçilen artifact alanları; öğretim örneği
- deliveryCases[1]
- {"case":"frame-navigation","targetOrigin":"https://preview.example.org","currentDestinationOrigin":"https://preview-v2.example.org","expectedDelivered":false}
- deliverySemantics.callReturnIsAcknowledgement
- false
- Evet. WindowProxy aynıysa origin değişimi önemsizdir.
- Hayır. expectedDelivered=false; çağrının dönmesi ACK değildir.
Gerekçeli cevabı oku
Hayır. expectedDelivered=false; çağrının dönmesi ACK değildir. — Exact target origin eşleşmesi yoksa delivery gerçekleşmez. postMessage return değeri application acknowledgement değildir.
Origin doğru, fakat sourceWindow=preview-two olan reply neden reddedilir? Message biçimi ve title type kontrolünü de açıkla.
Gerekçeli cevabı oku
Beklenen WindowProxy preview-one instance’ına aittir. preview-two aynı origin’de olsa da bu konuşmanın tarafı değildir. data type, version, book, transaction ve title alanının string olması da doğrulanmalıdır. Message’ın kabul edilmesi tek başına API resource izni veya DOM rendering kanıtı değildir.
□ Origin ile beklenen source instance’ını ayırdım.
□ Message biçimi ve transaction kontrollerini korudum.
Uygulama konsolunu aç · request / response / browser
Request, URL, cookie ve DOM örneklerini ayrıca aç
Kaynaklar ve kapsam
- WHATWG HTML — Cross-document messaging§9.3.2.1 Authors: expected origin, expected format, targetOrigin · §9.3.3 Posting messages: structured serialization, queued task, target origin check, event source/origin/data/ports · §9.4 Channel messaging: separate messaging surface
- MDN — Window.postMessage()Parameters: targetOrigin, transfer; Return value · The dispatched event: origin, source, data · Security concerns; Notes
- WHATWG HTML — Origins and sandboxing§7.1.1 Origins: tuple/opaque, serialization, same-origin equality · §7.1.1.1 Sites; §7.1.1.2 Relaxing the same-origin restriction · §7.1.5 Sandboxing: sandboxed origin and scripts flags
- MDN — Same-origin policyDefinition of an origin; Inherited origins; File origins · Cross-origin network access: writes, embeds, reads · Cross-origin script API access: Window and Location · Cross-origin data storage access