AIR'de JavaScript

Flash Player 9 ve üstü, Adobe AIR 1.0 ve üstü

AIR, ortak JavaScript nesnelerinin tipik davranışında birçok değişiklik yapar. Bu değişikliklerin birçoğu AIR'de güvenli uygulamaların yazılmasını kolaylaştırmak için yapılır. Aynı zamanda, davranıştaki bu farklılıklar, bazı ortak JavaScript kodlama desenlerinin ve bu desenleri kullanan mevcut web uygulamalarının her zaman AIR'de beklendiği gibi çalıştırılamayabileceği anlamına gelir. Bu tür sorunların düzeltilmesiyle ilgili bilgi için bkz. Güvenlikle ilişkili JavaScript hatalarını önleme.

HTML Sanal Alanları

AIR içeriği kaynağına bağlı olarak, ayrı sanal alanlara yerleştirir. Sanal alan kuralları, Adobe Flash Player tarafından uygulanan sanal alan kurallarının yanı sıra, çoğu web tarayıcısı tarafından uygulanan aynı kaynak ilkesiyle tutarlıdır. Ayrıca AIR, uygulama içeriğini dahil etmek ve korumak için yeni bir uygulama sanal alan türü sağlar. AIR uygulamalarını geliştirirken karşılaşabileceğiniz sanal alan türleriyle ilgili daha fazla bilgi için, bkz. Güvenlik sanal alanları.

Çalışma zamanı ortamına ve AIR API'lerine erişim yalnızca uygulama sanal alanının içinden HTML ve JavaScript'in çalıştırılmasıyla mümkündür. Ancak aynı zamanda çeşitli biçimlerdeki dinamik JavaScript değerlendirmesi ve çalışması, güvenlik nedenleriyle büyük ölçüde uygulama sanal alanıyla sınırlıdır. Bu kısıtlamalar, uygulamanız doğrudan bir sunucudan bilgi yüklese de yüklemese de geçerlidir. (Hatta dosya içeriği, yapıştırılan dizeler ve doğrudan kullanıcı girişi güvenilmez olabilir.)

Bir sayfadaki içeriğin kaynağı, gönderildiği sanal alanı belirler. Yalnızca uygulama dizininden yüklenen içerik (app: URL şeması tarafından başvurulan yükleme dizini) uygulama sanal alanına yerleştirilir. Dosya sisteminden yüklenen içerik local-with-filesystem veya local-trusted sanal alanına yerleştirilir, böylece yerel dosya sistemindeki içeriğe erişimine ve bu içerikle etkileşimine izin verilir, ancak uzak içeriğe erişimine izin verilmez. Ağdan yüklenen içerik, kaynak etki alanına karşılık gelen uzak bir sanal alana yerleştirilir.

Bir uygulama sayfasının uzak sanal alandaki içerikle serbestçe etkileşmesini sağlamak için, sayfa, uzak içerikle aynı etki alanına eşlenebilir. Örneğin bir Internet hizmetinden eşleme verileri görüntüleyen bir uygulama yazarsanız, uygulamanızın hizmetten içerik yükleyen ve görüntüleyen sayfası hizmet etki alanına eşlenebilir. Sayfaları uzak sanal alana ve etki alanına eşleme nitelikleri, kare ve iframe HTML öğelerine eklenen yeni niteliklerdir.

Uygulama dışı bir sanal alandaki içeriğin AIR özelliklerini güvenli bir şekilde kullanmasını sağlamak için, üst sanal alan köprüsü kurabilirsiniz. Uygulama içeriğinin yöntemleri güvenli bir şekilde çağırmasını ve diğer sanal alanlardaki içeriğin özelliklerine erişmesini sağlamak için, alt sanal alan köprüsü kurabilirsiniz. Güvenli burada uzak içeriğin açık olmayan nesnelere, özelliklere veya yöntemlere yanlışlıkla başvuru alamaması anlamına gelir. Yalnızca basit veri türleri, işlevler ve adsız nesneler köprüden geçirilebilir. Ancak yine de tehlikeli olabilecek işlevleri açmaktan kaçınmalısınız. Örneğin, bir kullanıcının sisteminde bulunan dosyaları okumayı ve dosyalara yazmayı sağlayan bir arabirimi açtıysanız, uzak içeriğe, kullanıcılarınıza önemli zararlar verebileceği bir yöntem sağlıyor olabilirsiniz.

JavaScript eval() işlevi

Sayfa, yükleme işlemini bitirdiğinde, eval() işlevinin kullanımı uygulama sanal alanıyla sınırlanır. Bazı kullanımlara izin verilir ve böylece JSON biçimli veriler güvenli bir şekilde ayrıştırılabilir, ancak çalıştırılabilir bir ifadeyle sonuçlanan herhangi bir değerlendirme hatayla sonuçlanır. Farklı sanal alanlardaki içerik için kod kısıtlamaları, eval() işlevinin izin verilen kullanımlarını açıklar.

İşlev yapıcıları

Uygulama sanal alanında, bir sayfa yükleme işlemini bitirmeden önce işlev yapıcıları kullanılabilir. Tüm sayfa load olayı işleyicileri bittikten sonra, yeni işlevler oluşturulamaz.

Harici komut dosyalarını yükleme

Uygulama sanal alanındaki HTML sayfaları, JavaScript dosyalarını uygulama dizininin dışından yüklemek için script etiketini kullanamaz. Uygulamanızdaki bir sayfaya uygulama dizininin dışından bir komut dosyası yüklenmesi için,, sayfa uygulama dışı bir sanal alana eşlenmelidir.

XMLHttpRequest nesnesi

AIR, uygulamaların veri istekleri gerçekleştirebilmek için kullanabileceği bir XMLHttpRequest (XHR) nesnesi sağlar. Aşağıdaki örnek basit bir veri isteğini gösterir:

xmlhttp = new XMLHttpRequest(); 
xmlhttp.open("GET", "http:/www.example.com/file.data", true); 
xmlhttp.onreadystatechange = function() { 
    if (xmlhttp.readyState == 4) { 
        //do something with data... 
    } 
} 
xmlhttp.send(null); 

Bir tarayıcıya karşılık AIR, uygulama sanal alanında çalışan içeriğin herhangi bir etki alanından veri isteğinde bulunmasına olanak tanır. Bir JSON dizesi içeren XHR'nin sonucu, sonuç çalıştırılabilir kod içermediği sürece veri nesneleri olarak değerlendirilebilir. XHR sonucunda çalıştırılabilir ifadeler mevcutsa, bir hata verilir ve değerlendirme denemesi başarısız olur.

Uzak kaynaklardaki kodun yanlışlıkla dahil edilmesini engellemek için bu işlem sayfa, yükleme işlemini bitirmeden önce yapılırsa senkronize XHR'ler boş bir sonuç döndürür. Senkronize olmayan XHR'ler her zaman bir sayfa yüklendikten sonra geri döner.

Varsayılan olarak AIR, uygulama dışı sanal alanlardaki etki alanları arası XMLHttpRequest öğelerini engeller. Uygulama sanal alanındaki bir üst pencere, uygulama dışı sanal alanda içeriğe sahip olan bir alt karedeki etki alanları arası isteklere, AIR tarafından eklenen bir nitelik olan allowCrossDomainXHR öğesini içeriğe sahip olan kare veya iframe öğesini true olarak ayarlayarak izin vermeyi seçebilir:

<iframe id="mashup" 
    src="http://www.example.com/map.html" 
    allowCrossDomainXHR="true" 
</iframe>
Not: Uygun olduğunda, AIR URLStream sınıfı da veri yüklemek için kullanılabilir.

Bir XMLHttpRequest öğesini uzak sanal alana eşlenmiş uygulama içeriğine sahip olan frame veya iframe'den uzak bir sunucuya gönderirseniz, eşleme URL'sinin XHR'de kullanılan sunucu adresini maskelemediğinden emin olun. Örneğin example.com etki alanı için uygulama içeriğini uzak bir sanal alana eşleyen aşağıdaki iframe tanımını göz önünde bulundurun:

<iframe id="mashup" 
    src="http://www.example.com/map.html" 
    documentRoot="app:/sandbox/" 
    sandboxRoot="http://www.example.com/" 
    allowCrossDomainXHR="true" 
</iframe>

sandboxRoot niteliği www.example.com adresinin kök URL'sini yeniden eşlediği için, tüm istekler uzak sunucudan değil, uygulama dizininden yüklenir. Sayfa gezinmesinden veya XMLHttpRequest öğesinden türetilen istekler yeniden eşlenir.

Uzak sunucunuza yapılan veri isteklerini yanlışlıkla engellemeyi önlemek için, sandboxRoot öğesini köke değil, uzak URL'nin alt dizinine eşleyin. Dizinin mevcut olması gerekmez. Örneğin, uygulama dizini yerine uzak sunucudan yükleme yapabilmek için www.example.com adresine yapılan veri isteklerine izin vermek üzere, önceki iframe'i şu şekilde değiştirin:

<iframe id="mashup" 
    src="http://www.example.com/map.html" 
    documentRoot="app:/sandbox/" 
    sandboxRoot="http://www.example.com/air/" 
    allowCrossDomainXHR="true" 
</iframe>

Bu durumda yalnızca air alt dizinindeki içerik yerel olarak yüklenir.

Sanal alan eşlemesiyle ilgili daha fazla bilgi için, bkz. HTML kare ve iframe öğeleri ve Adobe AIR'de HTML güvenliği.

Tanımlama Bilgileri

AIR uygulamalarında yalnızca uzak sanal alanlardaki içerik (http: ve https: kaynaklarından yüklenen), tanımlama bilgilerini kullanabilir (document.cookie özelliği). Uygulama sanal alanında, kalıcı verileri saklamak için başka yollar da mevcuttur, bunlara EncryptedLocalStore, SharedObject ve FileStream sınıfları dahildir.

Clipboard nesnesi

WebKit Clipboard API'si şu olaylarla yürütülür: copy, cut ve paste. Bu olaylarda geçen olay nesnesi clipboardData özelliğiyle panoya erişim sağlar. Pano verilerini okumak veya bu verileri yazmak için aşağıdaki clipboardData nesnesi yöntemlerini kullanın:

Yöntem

Açıklama

clearData(mimeType)

Pano verilerini temizler. mimeType parametresini temizlenecek verilerin MIME türüne ayarlayın.

getData(mimeType)

Pano verilerini alır. Bu yöntem yalnızca paste olayının işleyicisinde çağrılabilir. mimeType parametresini geri döndürülecek verilerin MIME türüne ayarlayın.

setData(mimeType, data)

Verileri panoya kopyalar. mimeType parametresini verilerin MIME türüne ayarlayın.

Uygulama sanal alanının dışındaki JavaScript kodu panoya yalnızca bu olayları kullanarak erişebilir. Ancak uygulama sanal alanındaki içerik, AIR Clipboard sınıfını kullanarak sistem panosuna doğrudan erişebilir. Örneğin panodaki metin biçimi verilerini almak için aşağıdaki ifadeyi kullanabilirsiniz:

var clipping = air.Clipboard.generalClipboard.getData("text/plain", 
                                air.ClipboardTransferMode.ORIGINAL_ONLY);

Geçerli veri MIME türleri şunlardır:

MIME türü

Değer

Metin

"text/plain"

HTML

"text/html"

URL

"text/uri-list"

Nokta Esaslı

"image/x-vnd.adobe.air.bitmap"

Dosya listesi

"application/x-vnd.adobe.air.file-list"

Önemli: Yalnızca uygulama sanal alanındaki içerik panoda bulunan dosya verilerine erişebilir. Uygulama dışı içerik panodaki bir file nesnesine erişme girişiminde bulunursa, bir güvenlik hatası verilir.

Panoyu kullanmayla ilgili daha fazla bilgi için bkz. Kopyalama ve yapıştırma ve Using the Pasteboard from JavaScript (Apple Geliştirici Merkezi) (JavaScript'te Yapıştırma Alanı'nı Kullanma).

Sürükle ve Bırak

HTML'e doğru veya HTML'den sürükle ve bırak hareketleri şu DOM olaylarını üretir: dragstart, drag, dragend, dragenter, dragover, dragleave ve drop. Bu olaylarda geçen olay nesnesi, dataTransfer özelliğiyle sürüklenen verilere erişim sağlar. dataTransfer özelliği, bir clipboard olayıyla ilişkilendirilen clipboardData nesnesiyle aynı yöntemleri sağlayan bir nesneye başvurur. Örneğin bir drop olayından metin biçimi verileri almak için şu işlevi kullanabilirsiniz:

function onDrop(dragEvent){ 
    return dragEvent.dataTransfer.getData("text/plain",  
            air.ClipboardTransferMode.ORIGINAL_ONLY); 
}

dataTransfer nesnesinin sahip olduğu önemli üyeler şunlardır:

Üye

Açıklama

clearData(mimeType)

Verileri temizler. mimeType parametresini temizlenecek veri temsilinin MIME türüne ayarlayın.

getData(mimeType)

Sürüklenen verileri alır. Bu yöntem yalnızca drop olayının işleyicisinde çağrılabilir. mimeType parametresini alınacak verilerin MIME türüne ayarlayın.

setData(mimeType, data)

Sürüklenecek verileri ayarlayın. mimeType parametresini verilerin MIME türüne ayarlayın.

türler

Şu anda dataTransfer nesnesinde kullanılabilir olan tüm veri temsillerinin MIME türlerini içeren dizeler dizisi.

effectsAllowed

Sürüklenen verilerin kopyalanabileceğini, taşınabileceğini, verilere bağ verilebileceğini veya bunların bir kombinasyonunun uygulanabileceğini belirtir. effectsAllowed özelliğini, dragstart olayının işleyicisinde ayarlayın.

dropEffect

İzin verilerin bırakma efektlerinden hangilerinin sürükleme hedefi tarafından desteklendiğini belirtir. dropEffect özelliğini dragEnter olayının işleyicisinde ayarlayın. Sürükleme sırasında imleç, kullanıcının fareyi bırakması durumunda hangi efektin oluşacağını göstermek için değişir. dropEffect belirtilmezse, effectsAllowed özellik efekti seçilir. Kopyala efektinin taşı efektine göre önceliği, taşı efektinin de bağ ver efektine göre önceliği vardır. Kullanıcı klavyeyi kullanarak varsayılan önceliği değiştirebilir.

AIR uygulamasına sürükle ve bırak eylemine yönelik destek eklemeyle ilgili daha fazla bilgi için bkz. AIR uygulamasında taşıma ve bırakma ve Using the Drag-and-Drop from JavaScript (Apple Geliştirici Merkezi) (JavaScript'te Sürükleme ve Bırakmayı Kullanma).

innerHTML ve outerHTML özellikleri

AIR, uygulama sanal alanında çalışan içerik için innerHTML ve outerHTML özelliklerinin kullanılmasına yönelik güvenlik kısıtlamaları getirir. load olayı işleyicilerinin çalıştırılması sırasında ve sayfa load olayından önce, innerHTML ve outerHTML özelliklerinin kullanımında hiçbir kısıtlama yoktur. Ancak sayfa yüklendikten sonra, innerHTML veya outerHTML özelliklerini yalnızca belgeye statik içerik eklemek için kullanabilirsiniz. Çalıştırılabilir kod olarak değerlendirilen innerHTML veya outerHTML özelliklerine atanan bir dizede bulunan herhangi bir ifade yok sayılır. Örneğin bir olay geri çağırma niteliğini öğe tanımına dahil ederseniz, olay dinleyicisi eklenmez. Benzer şekilde, gömülü <script> etiketleri de değerlendirilmez. Daha fazla bilgi için, bkz. Adobe AIR'de HTML güvenliği.

Document.write() ve Document.writeln() yöntemleri

Sayfanın load olayından önce uygulama sanal alanında write() ve writeln() yöntemlerinin kullanımı kısıtlı değildir. Ancak sayfa yüklendikten sonra, bu yöntemlerden birini çağırmak sayfayı temizlemez veya yeni bir sayfa oluşturmaz. Birçok web tarayıcısında olduğu gibi, bir sayfa yüklenmesini bitirdikten sonra uygulama dışı sanal alanda document.write() veya writeln() yöntemini çağırmak geçerli sayfayı temizler ve yeni, boş bir sayfa açar.

Document.designMode özelliği

Belgedeki tüm öğelerin düzenlenebilir olması için document.designMode özelliğini on olan bir değere ayarlayın. Yerleşik düzenleyici desteği metin düzenleme, kopyalama, yapıştırma ve sürükleyip bırakmayı içerir. designMode özelliğinin on olarak ayarlanması, body öğesinin contentEditable özelliğinin true olarak ayarlanmasına eşdeğerdir. Bir belgenin hangi bölümlerinin düzenlenebilir olacağını tanımlamak için çoğu HTML öğesinde contentEditable özelliğini kullanabilirsiniz. Ek bilgi için bkz. HTML contentEditable niteliği.

unload olayları (body ve frameset nesneleri için)

Bir pencerenin üst düzey frameset veya body etiketinde (uygulamanın ana penceresi de dahil olmak üzere), kapanan pencereye (veya uygulamaya) yanıt vermek için unload olayını kullanmayın. Bunun yerine NativeApplication nesnesinin exiting olayını kullanın (uygulamanın ne zaman kapandığını saptamak için). Veya NativeWindow nesnesinin closing olayını kullanın (pencerenin ne zaman kapandığını saptamak için). Örneğin aşağıdaki JavaScript kodu, kullanıcı uygulamayı kapattığında ("Goodbye.") mesajını görüntüler:

var app = air.NativeApplication.nativeApplication; 
app.addEventListener(air.Event.EXITING, closeHandler); 
function closeHandler(event) 
{ 
    alert("Goodbye."); 
}

Ancak komut dosyaları, bir karenin, iframe'in veya üst düzey pencere içeriğinin gezinmesi sonucu oluşan unload olayına başarılı bir şekilde yanıt verebilir.

Not: Adobe AIR'in gelecek sürümlerinde bu sınırlamalar kaldırılabilir.

JavaScript Window nesnesi

Window nesnesi, JavaScript çalışma bağlamında global nesne olarak kalır. AIR, uygulama sanal alanında, önemli ana bilgisayar nesnelerinin yanı sıra yerleşik AIR sınıflarına erişim sağlamak için JavaScript Window nesnesine yeni özellikler ekler. Ayrıca, bazı yöntemler ve özellikler, uygulama sanal alanının içinde bulunup bulunmamalarına bağlı olarak farklı davranışlar gösterir.

Window.runtime özelliği
runtime özelliği, yerleşik runtime sınıflarını uygulama sanal alanının içinden başlatmanızı ve kullanmanızı sağlar. Bu sınıflar AIR ve Flash Player API'lerini içerir. (Ancak örneğin Flex çerçevesini içermez.) Örneğin aşağıdaki ifade bir AIR file nesnesi oluşturur:
var preferencesFile = new window.runtime.flash.filesystem.File();

AIR SDK'de sağlanan AIRAliases.js dosyası, bu gibi başvuruları kısaltmanızı sağlayan başka ad tanımları içerir. Örneğin AIRAliases.js bir sayfaya içe aktarıldığında, aşağıdaki ifade kullanılarak bir File nesnesi oluşturulabilir:

var preferencesFile = new air.File();

window.runtime özelliği, yalnızca uygulama sanal alanındaki içerik ve frame veya iframe'ler içeren bir sayfanın üst belgesi için tanımlanır.

Bkz. AIRAliases.js dosyasını kullanma.

Window.nativeWindow özelliği
nativeWindow özelliği, alttaki yerel window nesnesine bir başvuru sağlar. Bu özellik sayesinde ekran konumu, boyutu ve görünürlüğü gibi window işlevlerini ve özelliklerini komut dosyasına yazabilir ve kapatma, yeniden boyutlandırma ve taşıma gibi window olaylarını işleyebilirsiniz. Örneğin aşağıdaki ifade pencereyi kapatır:
window.nativeWindow.close();
Not: NativeWindow nesnesi tarafından sağlanan pencere kontrol özellikleri, JavaScript Window nesnesi tarafından sağlanan özelliklerle örtüşür. Bu gibi durumlarda en uygun bulduğunuz yöntemi kullanabilirsiniz.

window.nativeWindow özelliği, yalnızca uygulama sanal alanındaki içerik ve kareler veya iframe'ler içeren bir sayfanın üst belgesi için tanımlanır.

Window.htmlLoader özelliği
htmlLoader özelliği, HTML içeriğine sahip olan AIR HTMLLoader nesnesine bir başvuru sağlar. Bu özellik sayesinde, HTML ortamının görünümünü ve davranışını komut dosyasına yazabilirsiniz. Örneğin kontrolün varsayılan, beyaz bir arka plan boyayıp boyamadığını belirlemek için htmlLoader.paintsDefaultBackground özelliğini kullanabilirsiniz:
window.htmlLoader.paintsDefaultBackground = false;
Not: HTMLLoader nesnesi window özelliğine sahiptir, bu özellik, sahip olduğu HTML içeriğinin JavaScript Window nesnesine başvurur. Bu özelliği, içeriğe sahip olan HTMLLoader nesnesine bir başvuru yoluyla JavaScript ortamına erişmek için kullanabilirsiniz.

window.htmlLoader özelliği, yalnızca uygulama sanal alanındaki içerik ve kareler veya iframe'ler içeren bir sayfanın üst belgesi için tanımlanır.

Window.parentSandboxBridge ve Window.childSandboxBridge özellikleri
parentSandboxBridge ve childSandboxBridge özellikleri sayesinde, üst ve alt kareler arasında bir arabirim tanımlayabilirsiniz. Daha fazla bilgi için bkz. Farklı güvenlik sanal alanlarında çapraz komut dosyası içeriği.

Window.setTimeout() ve Window.setInterval() işlevleri
AIR, setTimeout() ve setInterval() işlevlerinin uygulama sanal alanında kullanılmasına yönelik güvenlik kısıtlamaları getirir. setTimeout() veya setInterval() işlevlerini çağırırken bir dize olarak çalıştırılacak kodu tanımlayamazsınız. Bir işlev başvurusu kullanmanız gerekir. Daha fazla bilgi için bkz. setTimeout() ve setInterval().

Window.open() işlevi
open() yöntemi uygulama dışı bir sanal alanda çalışan bir kod tarafından çağrıldığında, yalnızca kullanıcı etkileşiminin (fareyi tıklatma veya tuşabasma gibi) bir sonucu olarak çağrılırsa bir pencere açar. Ayrıca, uygulama başlığı pencere başlığına önek olarak getirilir (pencerelerin uzak içerik tarafından açılmasını engellemek için ). Daha fazla bilgi için bkz.JavaScript window.open() yönteminin çağrılmasına ilişkin kısıtlamalar.

air.NativeApplication nesnesi

NativeApplication nesnesi uygulama durumu hakkında bilgi sağlar, uygulama düzeyi birçok önemli olayı gönderir ve uygulama davranışının kontrol edilmesine yönelik faydalı işlevler sağlar. NativeApplication nesnesinin tek bir örneği otomatik olarak oluşturulur ve bu özelliğe sınıf tanımlı NativeApplication.nativeApplication özelliği yardımıyla erişilebilir.

Nesneye JavaScript kodundan erişmek için şunu kullanabilirsiniz:

var app = window.runtime.flash.desktop.NativeApplication.nativeApplication;

Veya AIRAliases.js komut dosyası içe aktarılmışsa, daha kısa biçimini kullanabilirsiniz:

var app = air.NativeApplication.nativeApplication;

NativeApplication nesnesine yalnızca uygulama sanal alanından erişilebilir. NativeApplication nesnesiyle daha fazla bilgi için bkz. AIR çalışma zamanı ve işletim sistemi bilgileriyle çalışma.

JavaScript URL şeması

Bir JavaScript URL şemasında tanımlanan kodu çalıştırma, (href="javascript:alert('Test')" gibi) uygulama sanal alanının içinde engellenmiştir. Hata verilmez.