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

โจ เมดเลย์
โจ้ เมดเลย์

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

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

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

TL;DR: เราจะเลิกใช้งาน AppCache บนต้นทางที่ไม่ปลอดภัยเพื่อขัดขวางการเขียนสคริปต์ข้ามเว็บไซต์ เราคาดว่าใน Chrome 52 จะใช้งานได้ในต้นทางที่แสดงเนื้อหาผ่าน HTTPS เท่านั้น

เจตนาเพื่อนำออก | ตัวติดตาม Chromestatus | ข้อบกพร่อง Chromium

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

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

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

TL;DR: มีการนำ document.defaultCharset ออกเพื่อปรับปรุงการปฏิบัติตามข้อกำหนด

ความตั้งใจที่จะนำออก | ตัวติดตาม Chromestatus | ปัญหา CRBug

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

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

คุณสามารถอ่านเหตุผลอื่นๆ ที่ไม่ควรระบุเรื่องนี้ ในปัญหา GitHub นี้

TL;DR: ยกเลิกการรองรับค่า subresource สำหรับแอตทริบิวต์ rel ของ HTMLLinkElement

เจตนาเพื่อนำออก | ตัวติดตาม Chromestatus | ข้อบกพร่อง Chromium

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

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

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

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

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

เจตนาเพื่อนำออก | ตัวติดตาม Chromestatus | ข้อบกพร่อง Chromium

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

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

นำ KeyboardEvent.prototype.keyLocation ออก

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

เจตนาเพื่อนำออก | ตัวติดตาม Chromestatus | ข้อบกพร่อง Chromium

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

ต้องมีเครื่องจัดการข้อผิดพลาดและความสำเร็จในเมธอด RTCPeerConnection

TL;DR: ตอนนี้ เมธอด RTCPeerConnection ของ WebRTCcreateOffer() และ createAnswer() ต้องใช้ตัวแฮนเดิลข้อผิดพลาดและตัวแฮนเดิลวัดความสำเร็จ ก่อนหน้านี้เราเรียกวิธีการเหล่านี้โดยใช้เครื่องจัดการความสำเร็จเท่านั้น เราจะเลิกใช้งานการใช้งานดังกล่าว

เจตนาเพื่อนำออก | ตัวติดตาม Chromestatus | ข้อบกพร่อง Chromium

ใน Chrome 49 เราได้เพิ่มคำเตือนหากคุณเรียกใช้ setLocalDescription() หรือ setRemoteDescription() โดยไม่ได้ใส่เครื่องจัดการข้อผิดพลาด อาร์กิวเมนต์ตัวแฮนเดิลข้อผิดพลาดเป็นสิ่งที่จำเป็นต้องมีตั้งแต่ Chrome 50

ซึ่งเป็นส่วนหนึ่งของการล้างวิธีการให้คำมั่นสัญญาในวิธีการเหล่านี้ตามที่ข้อกำหนดของ WebRTC กำหนด

นี่คือตัวอย่างจากการสาธิต RTCPeerConnection ของ WebRTC (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 ซึ่งเป็น Shim ที่ดูแลโดยโปรเจ็กต์ WebRTC เพื่อปกป้องแอปจากการเปลี่ยนแปลงข้อมูลจำเพาะและความแตกต่างของคำนำหน้า

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

TL;DR: ระบบจะนำอินเทอร์เฟซ XMLHttpRequestProgressEvent ออก รวมถึงแอตทริบิวต์ position และ totalSize

เจตนาเพื่อนำออก | ตัวติดตาม Chromestatus | ข้อบกพร่อง Chromium

เหตุการณ์นี้มีไว้เพื่อรองรับพร็อพเพอร์ตี้ความเข้ากันได้ของ Gecko position และ totalSize Mozilla 22 มีการรองรับทั้ง 3 รายการไม่ได้ และ 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
        }
      }

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

TL;DR: เรานําส่วนขยายสื่อที่เข้ารหัสที่มีคํานําหน้าออกแล้วเพื่อแทนที่ส่วนขยายสื่อที่เข้ารหัสตามข้อกําหนดและไม่มีคํานําหน้า

เจตนาเพื่อนำออก | ตัวติดตาม Chromestatus | ข้อบกพร่อง Chromium

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

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

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

TL;DR: เลิกใช้พร็อพเพอร์ตี้ออฟเซ็ตสำหรับ SVGElement เพื่อใช้พร็อพเพอร์ตี้ที่รองรับอย่างกว้างขวางมากขึ้นใน HTMLElement

เจตนาเพื่อนำออก | ตัวติดตาม Chromestatus | ข้อบกพร่อง Chromium

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

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