Chrome 49 में API को बंद करना और हटाना

Chrome के लगभग हर वर्शन में, हमें प्रॉडक्ट, उसकी परफ़ॉर्मेंस, और वेब प्लैटफ़ॉर्म की क्षमताओं में कई अपडेट और सुधार देखने को मिलते हैं.

Chrome 49 में (बीटा वर्शन 2 फ़रवरी, 2016 को लॉन्च हुआ था. अनुमानित स्टेबल तारीख: मार्च 2016) Chrome में कई बदलाव किए गए हैं

getComputedStyle(e).cssX में "css" प्रीफ़िक्स का इस्तेमाल अब काम नहीं करता

संक्षेप में जानकारी: getComputedStyle(e) में "css" प्रीफ़िक्स का इस्तेमाल अब नहीं किया जा सकता, क्योंकि यह फ़ॉर्मल स्पेसिफ़िकेशन का हिस्सा नहीं था.

getComputedStyle एक बेहतरीन सुविधा है. यह डीओएम एलिमेंट की स्टाइल की सभी सीएसएस वैल्यू दिखाएगा. ये वैल्यू, रेंडरिंग इंजन ने कैलकुलेट की हैं. इसलिए, उदाहरण के लिए, getComputedStyle(_someElement_).height को चलाया जा सकता है. इससे 224.1 पिक्सल वैल्यू मिल सकती है, क्योंकि यह एलिमेंट की मौजूदा ऊंचाई है.

यह एपीआई काफ़ी काम का लगता है. हम क्या बदल रहे हैं?

Chrome के रेंडरिंग इंजन को Blink में बदलने से पहले, यह WebKit पर काम करता था. इसकी मदद से, किसी प्रॉपर्टी की शुरुआत में "css" प्रीफ़िक्स जोड़ा जा सकता था. उदाहरण के लिए, getComputedStyle(e).height के बजाय getComputedStyle(e).cssHeight. दोनों एक जैसा डेटा दिखाएंगे, क्योंकि वे एक ही वैल्यू पर मैप किए गए हैं. हालांकि, "css" प्रीफ़िक्स का इस्तेमाल स्टैंडर्ड के मुताबिक नहीं है. इसे बंद कर दिया गया है और हटा दिया गया है.

ध्यान दें - cssFloat एक स्टैंडर्ड प्रॉपर्टी है और इस सुविधा को बंद करने से इस पर कोई असर नहीं पड़ेगा.

Chrome 49 में इस तरह से किसी प्रॉपर्टी को ऐक्सेस करने पर, undefined दिखेगा. इसके बाद, आपको अपने कोड में बदलाव करना होगा.

initTouchEvent के इस्तेमाल की सुविधा अब काम नहीं करती

संक्षेप में जानकारी: initTouchEvent को इस्तेमाल करने की सुविधा अब काम नहीं करती. इसके बजाय, TouchEvent constructor का इस्तेमाल करें. इससे स्पेसिफ़िकेशन के मुताबिक काम करने की सुविधा बेहतर होगी. इसे Chrome 54 से पूरी तरह हटा दिया जाएगा.

Intent to Remove Chromestatus Tracker CRBug Issue

Chrome में लंबे समय से, initTouchEvent एपीआई का इस्तेमाल करके सिंथेटिक टच इवेंट बनाए जा सकते हैं. इनका इस्तेमाल अक्सर टच इवेंट को सिम्युलेट करने के लिए किया जाता है. ऐसा टेस्टिंग के लिए या आपकी साइट में कुछ यूज़र इंटरफ़ेस (यूआई) को अपने-आप चलाने के लिए किया जाता है. हमने Chrome 49 में इस एपीआई को बंद कर दिया है. साथ ही, हम यह चेतावनी दिखाएंगे. हमारा मकसद Chrome 53 में इसे पूरी तरह से हटाना है.

'TouchEvent.initTouchEvent' के इस्तेमाल पर रोक लगा दी गई है. इसे M53 में हटा दिया जाएगा. 
    यह सितंबर 2016 के आस-पास होगा. इसके बजाय, कृपया TouchEvent कंस्ट्रक्टर का इस्तेमाल करें.
'TouchEvent.initTouchEvent' को बंद कर दिया गया है. इसे M53 में हटा दिया जाएगा. यह सितंबर 2016 के आस-पास होगा. इसके बजाय, कृपया TouchEvent कंस्ट्रक्टर का इस्तेमाल करें. ज़्यादा जानकारी के लिए, https://www.chromestatus.com/features/5730982598541312 पर जाएं.

यह बदलाव क्यों फ़ायदेमंद है, इसकी कई वजहें हैं. यह Touch Events स्पेसिफ़िकेशन में भी नहीं है. Chrome में initTouchEvent को लागू करने का तरीका, Safari के initTouchEvent एपीआई के साथ काम नहीं करता था. साथ ही, यह Android पर Firefox से अलग था. आखिर में, TouchEvent कंस्ट्रक्टर का इस्तेमाल करना बहुत आसान है.

यह फ़ैसला लिया गया कि हम स्पेसिफ़िकेशन का पालन करेंगे. इसके बजाय, हम ऐसे एपीआई को बनाए रखेंगे जो न तो स्पेसिफ़ाइड है और न ही किसी अन्य लागू करने वाले के साथ काम करता है. इसलिए, हम सबसे पहले initTouchEvent फ़ंक्शन को बंद कर रहे हैं. इसके बाद, इसे हटा दिया जाएगा. साथ ही, डेवलपर को TouchEvent कंस्ट्रक्टर का इस्तेमाल करना होगा.

इस एपीआई का इस्तेमाल वेब पर किया जाता है. हालांकि, हमें पता है कि इसका इस्तेमाल कम साइटें करती हैं. इसलिए, हम इसे उतनी जल्दी नहीं हटा रहे हैं जितना हम आम तौर पर हटाते हैं. हमें लगता है कि कुछ साइटें, Chrome के सिग्नेचर के वर्शन को हैंडल नहीं कर पा रही हैं. इस वजह से, कुछ मामलों में इसका इस्तेमाल नहीं किया जा सका.

iOS और Android/Chrome में initTouchEvent API को लागू करने के तरीके में काफ़ी अंतर था. इसलिए, आपको अक्सर इस तरह का कोड इस्तेमाल करना पड़ता था. इसमें अक्सर Firefox को शामिल नहीं किया जाता था

    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);

पहली बात, यह सही नहीं है, क्योंकि यह User-Agent में "Android" की तलाश करता है. साथ ही, Android पर Chrome इससे मैच करेगा और इस डेप्रिकेशन को हिट करेगा. हालांकि, इसे अभी नहीं हटाया जा सकता, क्योंकि Android पर कुछ समय के लिए WebKit और Blink पर आधारित पुराने ब्राउज़र उपलब्ध रहेंगे. इसलिए, आपको पुराने एपीआई के साथ काम करना होगा.

वेब पर TouchEvents को सही तरीके से हैंडल करने के लिए, आपको अपने कोड में बदलाव करना होगा. इसके लिए, window ऑब्जेक्ट पर TouchEvent की मौजूदगी की जांच करके, Firefox, IE Edge, और Chrome के साथ काम करने वाला कोड इस्तेमाल करें. अगर इसकी "length" पॉज़िटिव है (इसका मतलब है कि यह एक ऐसा कंस्ट्रक्टर है जो एक आर्ग्युमेंट लेता है), तो आपको इसका इस्तेमाल करना चाहिए.

    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 के तरीकों में गड़बड़ी और सफलता के हैंडलर ज़रूरी हैं

संक्षेप में जानकारी: WebRTC RTCPeerConnection के createOffer() और createAnswer() तरीकों के लिए, अब गड़बड़ी हैंडलर के साथ-साथ सफलता हैंडलर की भी ज़रूरत होती है. पहले, इन तरीकों को सिर्फ़ एक सक्सेस हैंडलर के साथ कॉल किया जा सकता था. इस सुविधा का इस्तेमाल अब नहीं किया जा सकता.

Chrome 49 में, हमने एक चेतावनी भी जोड़ी है. यह चेतावनी तब दिखेगी, जब आपने गड़बड़ी हैंडल करने वाले फ़ंक्शन को उपलब्ध कराए बिना setLocalDescription() या setRemoteDescription() को कॉल किया हो. हम Chrome 50 में, इन तरीकों के लिए एरर हैंडलर आर्ग्युमेंट को ज़रूरी बनाने की उम्मीद करते हैं.

यह WebRTC स्पेसिफ़िकेशन के मुताबिक, इन तरीकों पर प्रॉमिस लागू करने के लिए ज़रूरी है.

यहां WebRTC के RTCPeerConnection डेमो का एक उदाहरण दिया गया है (main.js, लाइन 126):

    function onCreateOfferSuccess(desc) {
      pc1.setLocalDescription(desc, function() {
         onSetLocalSuccess(pc1);
      }, onSetSessionDescriptionError);
      pc2.setRemoteDescription(desc, function() {
        onSetRemoteSuccess(pc2);
      }, onSetSessionDescriptionError);
      pc2.createAnswer(onCreateAnswerSuccess, onCreateSessionDescriptionError);
    }

ध्यान दें कि setLocalDescription() और setRemoteDescription(), दोनों में हमेशा एक गड़बड़ी हैंडलर पैरामीटर होता है. इसलिए, सिर्फ़ उस पैरामीटर को तय करना एक सुरक्षित बदलाव है.

आम तौर पर, हम प्रोडक्शन WebRTC ऐप्लिकेशन के लिए, adapter.js का इस्तेमाल करने का सुझाव देते हैं. यह एक शिम है, जिसे WebRTC प्रोजेक्ट मैनेज करता है. इससे ऐप्लिकेशन को स्पेसिफ़िकेशन में होने वाले बदलावों और प्रीफ़िक्स में अंतर से सुरक्षित रखा जा सकता है.

Document.defaultCharset अब इस्तेमाल नहीं किया जा सकता

बहुत ज़्यादा शब्द हैं, पढ़ा नहीं गया: स्पेसिफ़िकेशन के मुताबिक काम करने के लिए, Document.defaultCharset को बंद कर दिया गया है.

Intent to Remove Chromestatus Tracker CRBug Issue

Document.defaultCharset एक ऐसी प्रॉपर्टी है जिसमें सिर्फ़ पढ़ने की अनुमति होती है. यह उपयोगकर्ता की क्षेत्रीय सेटिंग के आधार पर, उसके सिस्टम के डिफ़ॉल्ट वर्ण एन्कोडिंग को दिखाता है. इस वैल्यू को बनाए रखना फ़ायदेमंद नहीं है. ऐसा इसलिए, क्योंकि ब्राउज़र, एचटीटीपी रिस्पॉन्स में या पेज में एम्बेड किए गए मेटा टैग में मौजूद वर्ण एन्कोडिंग की जानकारी का इस्तेमाल करते हैं.

document.characterSet का इस्तेमाल करके, आपको HTTP हेडर में दी गई पहली वैल्यू मिलेगी. अगर यह मौजूद नहीं है, तो आपको <meta> एलिमेंट के charset एट्रिब्यूट में दी गई वैल्यू मिलेगी. उदाहरण के लिए, <meta charset="utf-8">. आखिर में, अगर इनमें से कोई भी वैल्यू उपलब्ध नहीं है, तो document.characterSet, उपयोगकर्ता की सिस्टम सेटिंग होगी.

Gecko इस प्रॉपर्टी के साथ काम नहीं करता है. साथ ही, इसे साफ़ तौर पर स्पेसिफ़ाई नहीं किया गया है. इसलिए, इस प्रॉपर्टी को Chrome 49 (जनवरी 2016 में बीटा वर्शन) में Blink से हटा दिया जाएगा. Chrome 50 में प्रॉपर्टी हटाने तक, आपको अपनी कंसोल में यह चेतावनी दिखेगी:

&#39;Document.defaultCharset&#39; के इस्तेमाल पर रोक लगा दी गई है. इसे M50 में हटा दिया जाएगा. यह बदलाव अप्रैल 2016 के आस-पास होगा.
'Document.defaultCharset' के इस्तेमाल पर रोक लगा दी गई है. इसे M50 में हटा दिया जाएगा. यह बदलाव अप्रैल 2016 के आस-पास होगा. ज़्यादा जानकारी के लिए, https://www.chromestatus.com/features/6217124578066432 पर जाएं.

इस बारे में ज़्यादा जानकारी के लिए, github पर जाएं https://github.com/whatwg/dom/issues/58

getStorageUpdates() हटाया गया

बहुत ज़्यादा शब्द हैं, पढ़ा नहीं गया: Navigator.getStorageUpdates() को हटा दिया गया है, क्योंकि अब यह Navigator spec में नहीं है.

Intent to Remove Chromestatus Tracker CRBug Issue

अगर इससे किसी पर असर पड़ता है, तो मैं अपनी टोपी खा लूंगा. getStorageUpdates() का इस्तेमाल वेब पर कभी-कभार ही किया जाता है.

HTML5 स्पेसिफ़िकेशन के (बहुत पुराने वर्शन) के मुताबिक:

यह काफ़ी अच्छा है, है न? इस स्पेसिफ़िकेशन में "whence" शब्द का भी इस्तेमाल किया गया है. यह इकलौता ऐसा शब्द है जिसका इस्तेमाल स्पेसिफ़िकेशन में किया गया है. स्पेक लेवल पर एक StorageMutex था, जो localStorage और कुकी जैसे स्टोरेज को ब्लॉक करने के ऐक्सेस को कंट्रोल करता था. यह एपीआई उस म्यूटेक्स को रिलीज़ करने में मदद करता था, ताकि अन्य स्क्रिप्ट इस StorageMutex से ब्लॉक न हों. हालांकि, इसे कभी लागू नहीं किया गया. यह IE या Gecko में काम नहीं करता. साथ ही, WebKit (और इस तरह Blink) के लागू करने से कोई फ़र्क़ नहीं पड़ा.

इसे काफ़ी समय पहले ही स्पेसिफ़िकेशन से हटा दिया गया था. साथ ही, इसे Blink से पूरी तरह से हटा दिया गया है. (यह लंबे समय से कोई कार्रवाई नहीं कर रहा था और कॉल किए जाने पर भी कुछ नहीं करता था).

अगर आपके पास ऐसा कोड था जो navigator.getStorageUpdates() को कॉल करता था, तो आपको इसे कॉल करने से पहले फ़ंक्शन की मौजूदगी की जांच करनी होगी.

Object.observe() अब काम नहीं करता

कम शब्दों में खास जानकारी: Object.observe() का इस्तेमाल अब नहीं किया जा सकता, क्योंकि यह अब स्टैंडर्डाइज़ेशन ट्रैक पर नहीं है. इसे आने वाले समय में हटा दिया जाएगा.

Intent to Remove Chromestatus Tracker CRBug Issue

नवंबर 2015 में यह एलान किया गया था कि Object.Observe को TC39 से हटाया जा रहा है. इसे Chrome 49 से हटा दिया गया है. अगर इसका इस्तेमाल किया जाता है, तो आपको कंसोल में यह चेतावनी दिखेगी:

&#39;Object.observe&#39; के इस्तेमाल पर रोक लगा दी गई है. इसे M50 में हटा दिया जाएगा. यह बदलाव अप्रैल 2016 के आस-पास होगा.
'Object.observe' को बंद कर दिया गया है. इसे M50 में हटा दिया जाएगा. यह बदलाव अप्रैल 2016 के आस-पास होगा. ज़्यादा जानकारी के लिए, https://www.chromestatus.com/features/6147094632988672 पर जाएं.

कई डेवलपर को यह एपीआई पसंद आया. अगर आपने इसका इस्तेमाल किया है और अब आपको इसे बंद करना है, तो MaxArt2501/object-observe जैसे पॉलीफ़िल या polymer/observe-js जैसी रैपर लाइब्रेरी का इस्तेमाल करें.