Chrome'un neredeyse her sürümünde üründe, performansında ve web platformunun özelliklerinde önemli sayıda güncelleme ve iyileştirme yapıyoruz.
Chrome 49'da (Beta 2 Şubat 2016) (Tahmini kararlı sürüm tarihi: Mart 2016) Chrome'da bir dizi değişiklik yapıldı.
getComputedStyle(e).cssX içinde "css" önekini kullanma desteği sonlandırıldı
Özet: getComputedStyle(e) içinde "css" önekinin kullanımı, resmi spesifikasyonun bir parçası olmadığı için kullanımdan kaldırıldı.
- Kaldırma Amacı (Intent to Remove)
- Chromestatus Tracker
- CRBug Sorunu
getComputedStyle, harika bir küçük işlevdir. DOM öğesinin stillerinin oluşturma motoru tarafından hesaplanan tüm CSS değerlerini döndürür. Örneğin, getComputedStyle(_someElement_).height komutunu çalıştırdığınızda öğenin şu anda görüntülendiği yükseklik 224,1 piksel olduğundan bu değer döndürülebilir.
Oldukça kullanışlı bir API gibi görünüyor. Peki neleri değiştiriyoruz?
Chrome'un oluşturma motoru Blink'e geçmeden önce WebKit tarafından destekleniyordu ve bu sayede bir özelliğin başına "css" ön ekini ekleyebiliyordunuz. Örneğin, getComputedStyle(e).height yerine getComputedStyle(e).cssHeight.
Her ikisi de aynı temel değerlerle eşlendiğinden aynı verileri döndürür. Ancak "css" önekini kullanmak standart dışıdır, kullanımdan kaldırılmıştır ve kaldırılmıştır.
Not: cssFloat, standart bir özelliktir ve bu kullanımdan kaldırma işleminden etkilenmez.
Chrome 49'da bir mülke bu şekilde erişirseniz undefined döndürülür ve kodunuzu düzeltmeniz gerekir.
initTouchEvent kullanımı kullanımdan kaldırıldı
Özet:
initTouchEvent
yerine TouchEvent
constructor kullanılması tercih edilerek kullanımdan kaldırıldı. Bu değişiklik, spesifikasyonlara uygunluğu artırmak için yapıldı ve Chrome 54'te tamamen kaldırılacak.
Kaldırma Amacı Chromestatus Tracker CRBug Sorunu
Uzun süredir Chrome'da initTouchEvent API'sini kullanarak sentetik dokunma etkinlikleri oluşturabiliyorsunuz. Bunlar, dokunma etkinliklerini test etmek veya sitenizdeki bazı kullanıcı arayüzlerini otomatikleştirmek için sıkça kullanılıyor. Chrome 49'da bu API'nin desteğini sonlandırdık ve Chrome 53'te tamamen kaldırmak amacıyla aşağıdaki uyarıyı göstereceğiz.
Bu değişikliğin iyi olmasının çeşitli nedenleri vardır.
Ayrıca, Touch Events spesifikasyonunda da yer almaz. Chrome'un initTouchEvent uygulaması, Safari'nin initTouchEvent API'siyle hiç uyumlu değildi ve Android'deki Firefox'tan farklıydı. Son olarak, TouchEvent oluşturucunun
kullanımı çok daha kolay.
Ne spesifikasyona uygun olan ne de diğer tek uygulamayla uyumlu olan bir API'yi korumak yerine spesifikasyona uymayı hedeflemeye karar verildi.
Bu nedenle, önce initTouchEvent işlevinin desteğini sonlandırıp ardından kaldırıyoruz ve geliştiricilerin TouchEvent oluşturucusunu kullanmasını zorunlu kılıyoruz.
Bu API, web'de kullanılıyor ancak nispeten az sayıda site tarafından kullanıldığını biliyoruz. Bu nedenle, normalde yapabileceğimiz kadar hızlı bir şekilde kaldırmıyoruz. Ancak, sitelerin Chrome'un imza sürümünü işlememesi nedeniyle kullanımın bir kısmının bozulduğunu düşünüyoruz.
initTouchEvent API'sinin iOS ve Android/Chrome uygulamaları çok farklı olduğundan genellikle şu türden bir kod kullanılırdı (Firefox sık sık unutulurdu).
var event = document.createEvent('TouchEvent');
if(ua === 'Android') {
event.initTouchEvent(touchItem, touchItem, touchItem, "touchstart", window,
300, 300, 200, 200, false, false, false, false);
} else {
event.initTouchEvent("touchstart", false, false, window, 0, 300, 300, 200,
200, false, false, false, false, touches, targetTouches, changedTouches, 0, 0);
}
document.body.dispatchEvent(touchEvent);
Öncelikle, bu durum kötüdür. Çünkü User-Agent'ta "Android" aranır ve Android'de Chrome bu kullanımdan kaldırma işlemiyle eşleşir ve bu işlemi tetikler. Ancak, Android'de bir süre daha WebKit ve eski Blink tabanlı tarayıcılar olacağından ve eski API'yi desteklemeniz gerekeceğinden henüz kaldırılamaz.
Web'de TouchEvents öğesini doğru şekilde işlemek için kodunuzu değiştirerek window nesnesinde TouchEvent öğesinin varlığını kontrol edip Firefox, IE Edge ve Chrome'u destekleyecek şekilde düzenlemeniz gerekir. TouchEvent öğesinin pozitif bir "uzunluğu" varsa (bir bağımsız değişken alan bir oluşturucu olduğunu gösterir) bu öğeyi kullanmanız gerekir.
if('TouchEvent' in window && TouchEvent.length > 0) {
var touch = new Touch({
identifier: 42,
target: document.body,
clientX: 200,
clientY: 200,
screenX: 300,
screenY: 300,
pageX: 200,
pageY: 200,
radiusX: 5,
radiusY: 5
});
event = new TouchEvent("touchstart", {
cancelable: true,
bubbles: true,
touches: [touch],
targetTouches: [touch],
changedTouches: [touch]
});
}
else {
event = document.createEvent('TouchEvent');
if(ua === 'Android') {
event.initTouchEvent(touchItem, touchItem, touchItem, "touchstart", window,
300, 300, 200, 200, false, false, false, false);
} else {
event.initTouchEvent("touchstart", false, false, window, 0, 300, 300, 200,
200, false, false, false, false, touches, targetTouches,
changedTouches, 0, 0);
}
}
document.body.dispatchEvent(touchEvent);
RTCPeerConnection yöntemlerinde hata ve başarı işleyicileri gerekir
Özet: WebRTC
RTCPeerConnection yöntemleri createOffer()
ve createAnswer()
artık bir hata işleyicinin yanı sıra bir başarı işleyici de gerektiriyor. Daha önce bu yöntemleri yalnızca bir başarı işleyicisiyle çağırmak mümkündü. Bu kullanım kullanımdan kaldırılmıştır.
Chrome 49'da, hata işleyici sağlamadan
setLocalDescription()
veya setRemoteDescription()
çağırırsanız uyarı da ekledik. Chrome 50'de bu yöntemler için hata işleyici bağımsız değişkeninin zorunlu olmasını bekliyoruz.
Bu, WebRTC spesifikasyonunun gerektirdiği gibi, bu yöntemlerde sözlerin kullanıma sunulmasının önünü açma sürecinin bir parçasıdır.
WebRTC RTCPeerConnection demosundan (main.js, 126. satır) bir örnek:
function onCreateOfferSuccess(desc) {
pc1.setLocalDescription(desc, function() {
onSetLocalSuccess(pc1);
}, onSetSessionDescriptionError);
pc2.setRemoteDescription(desc, function() {
onSetRemoteSuccess(pc2);
}, onSetSessionDescriptionError);
pc2.createAnswer(onCreateAnswerSuccess, onCreateSessionDescriptionError);
}
Hem setLocalDescription() hem de setRemoteDescription() her zaman bir hata işleyici parametresine sahip olduğundan bu parametreyi belirtmenin güvenli bir değişiklik olduğunu unutmayın.
Genel olarak, üretim WebRTC uygulamaları için uygulamaları spesifikasyon değişikliklerinden ve önek farklılıklarından korumak amacıyla WebRTC projesi tarafından desteklenen bir ara katman olan adapter.js kullanmanızı öneririz.
Document.defaultCharset desteği sonlandırıldı
Özet: Document.defaultCharset, spesifikasyon uygunluğunu artırmak için kullanımdan kaldırıldı.
Kaldırma Amacı Chromestatus Tracker CRBug Sorunu
Document.defaultCharset, kullanıcının bölgesel ayarlarına göre sisteminin varsayılan karakter kodlamasını döndüren salt okunur bir özelliktir. Tarayıcıların, HTTP yanıtındaki veya sayfaya yerleştirilmiş meta etiketindeki karakter kodlama bilgilerini kullanma şekli nedeniyle bu değeri korumanın faydalı olmadığı tespit edilmiştir.
document.characterSet'i kullanarak HTTP üstbilgisinde belirtilen ilk değeri elde edersiniz. Bu değer mevcut değilse <meta> öğesinin charset özelliğinde (örneğin, <meta charset="utf-8">) belirtilen değeri alırsınız. Son olarak, bunların hiçbiri mevcut değilse document.characterSet, kullanıcının sistem ayarı olur.
Gecko bu özelliği desteklemediği ve özellik düzgün bir şekilde belirtilmediği için bu özellik, Chrome 49'da (Ocak 2016'da Beta sürümü) Blink'te kullanımdan kaldırılacaktır. Mülk Chrome 50'de kaldırılana kadar konsolunuzda aşağıdaki uyarı gösterilir:
Bunu belirtmemenin nedenleri hakkında daha fazla bilgiyi github'da bulabilirsiniz. https://github.com/whatwg/dom/issues/58
getStorageUpdates() kaldırıldı
TL;DR: Navigator.getStorageUpdates(), artık Navigator spesifikasyonunda yer almadığı için kaldırıldı.
Kaldırma Amacı Chromestatus Tracker CRBug Sorunu
Bu durum birini etkilerse şapkamı yerim. getStorageUpdates(), web'de neredeyse hiç kullanılmamıştır.
HTML5 spesifikasyonunun (çok eski sürümü) şu şekilde alıntılanır:
Kulağa hoş geliyor, değil mi? Spesifikasyonda "whence" (nereden) kelimesi bile kullanılıyor (bu kelime, spesifikasyonda yalnızca bir kez geçiyor). Spesifikasyon düzeyinde, localStorage ve çerezler gibi engelleme depolama alanına erişimi kontrol eden bir StorageMutex vardı. Bu API, diğer komut dosyalarının bu StorageMutex tarafından engellenmemesi için bu mutex'in serbest bırakılmasına yardımcı olurdu. Ancak bu özellik hiçbir zaman uygulanmadı, IE veya Gecko'da desteklenmiyor ve WebKit'in (dolayısıyla Blink'in) uygulaması hiçbir işlem yapmıyor.
Bir süredir spesifikasyonlardan kaldırılmış ve Blink'ten tamamen kaldırılmıştır (en uzun süre boyunca hiçbir işlem yapmamış ve çağrılsa bile hiçbir şey yapmamıştır).
navigator.getStorageUpdates() işlevini çağıran bir kodunuz varsa bu işlevi çağırmadan önce işlevin mevcut olup olmadığını kontrol etmeniz gerekir.
Object.observe() desteği sonlandırıldı
Özet: Object.observe(), artık standardizasyon sürecinde olmadığı için desteği sonlandırıldı ve gelecekteki bir sürümde kaldırılacak.
Kaldırma Amacı Chromestatus Tracker CRBug Sorunu
Kasım 2015'te Object.Observe'nın TC39'dan çekildiği duyuruldu. Chrome 49'dan itibaren kullanımdan kaldırıldı. Bu özelliği kullanmaya çalışırsanız konsolda aşağıdaki uyarıyı görürsünüz:
Birçok geliştirici bu API'yi beğendi. Bu API ile denemeler yaptıysanız ve şimdi geçiş yolu arıyorsanız MaxArt2501/object-observe gibi bir polyfill veya polymer/observe-js gibi bir sarmalayıcı kitaplık kullanabilirsiniz.