การเลิกใช้งานและการนำ API ออกใน Chrome 50

Chrome เกือบทุกเวอร์ชันมีการอัปเดตและการปรับปรุงผลิตภัณฑ์ ประสิทธิภาพ และความสามารถของแพลตฟอร์มเว็บเป็นจำนวนมาก

ใน Chrome 50 (วันที่เบต้าโดยประมาณ: 10 ถึง 17 มีนาคม) มีการเปลี่ยนแปลงหลายอย่างใน Chrome รายการนี้อาจมีการเปลี่ยนแปลงได้ทุกเมื่อ

เลิกใช้งาน AppCache ในบริบทที่ไม่ปลอดภัย

สรุป: เราจะเลิกใช้งาน AppCache ในต้นทางที่ไม่ปลอดภัยเพื่อขัดขวาง Cross-site Scripting เราคาดว่าใน Chrome 52 ฟีเจอร์นี้จะใช้ได้กับต้นทางที่แสดงเนื้อหาผ่าน HTTPS เท่านั้น

ตั้งใจที่จะนำออก | Chromestatus เครื่องมือติดตาม | ข้อบกพร่องของ Chromium

AppCache คือฟีเจอร์ที่อนุญาตให้เข้าถึงแหล่งที่มาแบบออฟไลน์และถาวร ซึ่งเป็นการยกระดับสิทธิ์ที่มีประสิทธิภาพสำหรับการโจมตีแบบ Cross-Site Scripting การดำเนินการนี้เป็นส่วนหนึ่งของความพยายามที่ยิ่งใหญ่กว่าในการนำฟีเจอร์ที่มีประสิทธิภาพออกจากต้นทางที่ไม่ปลอดภัย

Chrome กำลังนำเวกเตอร์การโจมตีนี้ออกโดยอนุญาตให้ใช้ผ่าน HTTPS เท่านั้น เราจะเลิกใช้งานการรองรับ HTTP ใน Chrome 50 และคาดว่าจะนําการรองรับดังกล่าวออกทั้งหมดใน Chrome 52

นำ Document.defaultCharset ออกแล้ว

สรุปสั้นๆ: document.defaultCharset ถูกนำออกเพื่อปรับปรุงการปฏิบัติตามข้อกำหนด

Intent to Remove | Chromestatus Tracker | CRBug Issue

document.defaultCharset ซึ่งเลิกใช้งานใน Chrome 49 เป็นพร็อพเพอร์ตี้แบบอ่านอย่างเดียวที่แสดงผลการเข้ารหัสอักขระเริ่มต้นของระบบของผู้ใช้ตามการตั้งค่าภูมิภาค เราไม่พบว่าการคงค่านี้ไว้มีประโยชน์เนื่องจากวิธีที่เบราว์เซอร์ใช้ข้อมูลการเข้ารหัสอักขระในการตอบกลับ HTTP หรือในเมตาแท็กที่ฝังอยู่ในหน้า

แต่ให้ใช้ document.characterSet เพื่อรับค่าแรกที่ระบุในส่วนหัว HTTP แทน หากไม่มีค่าดังกล่าว คุณจะได้รับค่าที่ระบุไว้ในแอตทริบิวต์ charset ขององค์ประกอบ <meta> (เช่น <meta charset="utf-8">) สุดท้าย หากไม่มีค่าใดเลย ระบบจะใช้ document.characterSet เป็นการตั้งค่าระบบของผู้ใช้

คุณสามารถอ่านการพูดคุยเพิ่มเติมเกี่ยวกับเหตุผลที่ไม่ระบุข้อกำหนดนี้ในปัญหา github นี้

สรุป: นำการรองรับค่า subresource สำหรับแอตทริบิวต์ rel ของ HTMLLinkElement ออก

Intent to Remove | Chromestatus Tracker | ข้อบกพร่องของ Chromium

เจตนาของแอตทริบิวต์ subresource ใน <link> คือเพื่อโหลดทรัพยากรล่วงหน้าในช่วงเวลาที่เบราว์เซอร์ไม่ได้ใช้งาน หลังจากเบราว์เซอร์ดาวน์โหลดหน้าเว็บแล้ว ก็จะดาวน์โหลดทรัพยากรอื่นๆ เช่น หน้าอื่นๆ ล่วงหน้าได้ เพื่อที่เมื่อผู้ใช้ขอ เบราว์เซอร์จะดึงข้อมูลเหล่านั้นจากแคชของเบราว์เซอร์ได้

แอตทริบิวต์ subresource มีปัญหาหลายอย่าง ประการแรกคือไม่เคยทำงานตามที่ตั้งใจไว้ ทรัพยากรที่อ้างอิงได้รับการดาวน์โหลดโดยมีลําดับความสําคัญต่ำ ไม่เคยมีการใช้แอตทริบิวต์นี้ในเบราว์เซอร์อื่นนอกเหนือจาก Chrome การติดตั้งใช้งาน Chrome มีข้อบกพร่องที่ทำให้มีการดาวน์โหลดทรัพยากร 2 ครั้ง

นักพัฒนาแอปที่ต้องการปรับปรุงประสบการณ์ของผู้ใช้ผ่านการโหลดเนื้อหาล่วงหน้ามีตัวเลือกมากมาย ซึ่งตัวเลือกที่ปรับแต่งได้มากที่สุดคือการสร้าง Service Worker เพื่อใช้ประโยชน์จากการแคชล่วงหน้าและ Caches API โซลูชันเพิ่มเติมรวมถึงค่าอื่นๆ สำหรับแอตทริบิวต์ rel ซึ่งรวมถึง preconnect, prefetch, preload, prerender ตัวเลือกเหล่านี้บางอย่างเป็นตัวเลือกทดลองและอาจไม่รองรับในวงกว้าง

นำ TLS เวอร์ชันสำรองที่ไม่ปลอดภัยออก

สรุป: นำกลไกการบังคับให้เซิร์ฟเวอร์แสดงผลข้อมูลโดยใช้ TLS เวอร์ชันที่มีความปลอดภัยน้อยหรือไม่ปลอดภัยออก

Intent to Remove | Chromestatus Tracker | ข้อบกพร่องของ Chromium

Transport Layer Security (TLS) รองรับกลไกในการเจรจาเวอร์ชัน ซึ่งช่วยให้สามารถเปิดตัว TLS เวอร์ชันใหม่ได้โดยไม่ทำให้ใช้งานร่วมกันไม่ได้ เซิร์ฟเวอร์บางเครื่องติดตั้งใช้งานในลักษณะที่เบราว์เซอร์ต้องใช้ปลายทางที่ไม่ปลอดภัยเป็นทางเลือกสำรอง ด้วยเหตุนี้ ผู้โจมตีจึงสามารถบังคับให้เว็บไซต์ทุกแห่ง (ไม่ใช่แค่เว็บไซต์ที่กำหนดค่าไม่ถูกต้อง) เจรจาต่อรองเพื่อใช้ TLS เวอร์ชันที่อ่อนแอลง

เว็บไซต์ที่ได้รับผลกระทบจะเชื่อมต่อกับ ERR_SSL_FALLBACK_BEYOND_MINIMUM_VERSION ไม่ได้ ผู้ดูแลระบบควรตรวจสอบว่าซอฟต์แวร์เซิร์ฟเวอร์เป็นเวอร์ชันล่าสุด หากยังคงไม่ได้รับการแก้ไข โปรดติดต่อผู้ให้บริการซอฟต์แวร์เซิร์ฟเวอร์เพื่อดูว่ามีวิธีแก้ไขหรือไม่

นำ KeyboardEvent.prototype.keyLocation ออก

สรุป: นำชื่อแทนที่ไม่จำเป็นสำหรับแอตทริบิวต์ Keyboard.prototype.location ออก

Intent to Remove | Chromestatus Tracker | ข้อบกพร่องของ Chromium

แอตทริบิวต์นี้เป็นเพียงชื่อแทนของแอตทริบิวต์ Keyboard.prototype.location ซึ่งช่วยให้คีย์ต่างๆ ที่อยู่หลายแห่งบนแป้นพิมพ์ชัดเจนได้ ตัวอย่างเช่น แอตทริบิวต์ทั้ง 2 รายการช่วยให้นักพัฒนาแอปแยกความแตกต่างระหว่างแป้น Enter 2 ตัวในแป้นพิมพ์แบบขยายได้

แฮนเดิลข้อผิดพลาดและการดำเนินการที่สำเร็จซึ่งต้องใช้ในเมธอด RTCPeerConnection

สรุป: ตอนนี้เมธอด WebRTC RTCPeerConnection createOffer() และ createAnswer()ต้องใช้ตัวแฮนเดิลข้อผิดพลาดและตัวแฮนเดิลสำเร็จ ก่อนหน้านี้ คุณสามารถเรียกใช้เมธอดเหล่านี้ได้ด้วยตัวแฮนเดิลเฉพาะในกรณีที่สำเร็จเท่านั้น การใช้งานดังกล่าวเลิกใช้งานแล้ว

Intent to Remove | Chromestatus Tracker | ข้อบกพร่องของ Chromium

ใน 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() ต่างก็มีตัวแฮนเดิลข้อผิดพลาด เบราว์เซอร์รุ่นเก่าที่คาดหวังเฉพาะตัวแฮนเดิลสําเร็จจะละเว้นอาร์กิวเมนต์ตัวแฮนเดิลข้อผิดพลาดหากมี การเรียกใช้โค้ดนี้ในเบราว์เซอร์รุ่นเก่าจะไม่ทำให้เกิดข้อยกเว้น

โดยทั่วไปแล้ว เราขอแนะนำให้คุณใช้ adapter.js ซึ่งเป็นชิมที่ได้รับการดูแลโดยโปรเจ็กต์ WebRTC สำหรับแอปพลิเคชัน WebRTC เวอร์ชันที่ใช้งานจริง เพื่อปกป้องแอปจากการเปลี่ยนแปลงข้อกำหนดและความแตกต่างของคำนำหน้า

ระบบไม่รองรับ XMLHttpRequestProgressEvent อีกต่อไป

สรุป: ระบบจะนำอินเทอร์เฟซ XMLHttpRequestProgressEvent ออกพร้อมกับแอตทริบิวต์ position และ totalSize

Intent to Remove | Chromestatus Tracker | ข้อบกพร่องของ Chromium

เหตุการณ์นี้มีไว้เพื่อรองรับพร็อพเพอร์ตี้ความเข้ากันได้ของ Gecko position และ totalSize การรองรับทั้ง 3 รายการถูกยกเลิกใน Mozilla 22 และฟังก์ชันการทำงานดังกล่าวถูกแทนที่ด้วย ProgressEvent ไปนานแล้ว

     var progressBar = document.getElementById("p"),
          client = new XMLHttpRequest()
      client.open("GET", "magical-unicorns")
      client.onprogress = function(pe) {
        if(pe.lengthComputable) {
          progressBar.max = pe.total
          progressBar.value = pe.loaded
        }
      }

นำส่วนขยายสื่อที่เข้ารหัสที่มีคำนำหน้าออก

สรุป: เราได้นําส่วนขยายสื่อที่เข้ารหัสซึ่งมีคํานําหน้าออกแล้ว แทนที่ด้วยส่วนขยายที่ไม่มีคํานําหน้าซึ่งอิงตามข้อกําหนด

ตั้งใจที่จะนำออก | Chromestatus เครื่องมือติดตาม | ข้อบกพร่องของ Chromium

ใน Chrome 42 เราได้ส่งส่วนขยายสื่อที่เข้ารหัสตามข้อมูลจำเพาะที่ไม่มีคำนำหน้า API นี้ใช้เพื่อสำรวจ เลือก และโต้ตอบกับระบบการจัดการสิทธิ์ดิจิทัลเพื่อใช้ร่วมกับ HTMLMediaElement

เหตุการณ์นั้นเกิดขึ้นเกือบ 1 ปีที่แล้ว และเนื่องจากเวอร์ชันที่ไม่มีคำต่อท้ายมีความสามารถมากกว่าเวอร์ชันที่มีคำต่อท้าย เราจึงถึงเวลานำเวอร์ชันที่มีคำต่อท้ายของ API ออก

นำการรองรับพร็อพเพอร์ตี้ SVGElement.offset ออก

สรุป: เราได้ยกเลิกพร็อพเพอร์ตี้ออฟเซตสำหรับ SVGElement และใช้พร็อพเพอร์ตี้ที่รองรับในวงกว้างมากขึ้นใน HTMLElement

ตั้งใจที่จะนำออก | Chromestatus เครื่องมือติดตาม | ข้อบกพร่องของ Chromium

ทั้ง HTMLElement และ SVGElement รองรับพร็อพเพอร์ตี้ออฟเซตมานานแล้ว แต่ Gecko และ Edge รองรับเฉพาะใน HTMLElement เราเลิกใช้งานพร็อพเพอร์ตี้เหล่านี้ใน Chrome 48 เพื่อปรับปรุงความสอดคล้องกันระหว่างเบราว์เซอร์ และตอนนี้ก็กําลังนําออก

แม้ว่าพร็อพเพอร์ตี้ที่เทียบเท่าจะเป็นส่วนหนึ่งของ HTMLElement แต่นักพัฒนาแอปที่กำลังมองหาทางเลือกอื่นก็สามารถใช้ getBoundingClientRect() ได้เช่นกัน