นักพัฒนา Mozilla แก้ยาวนาน 5 ปี บั๊กน่ารำคาญลบ Amazon ออกจาก Top Sites ใน Firefox ไม่ได้
เจาะเบื้องหลังการแก้ปัญหาบั๊กเรื้อรังบน Firefox New Tab ที่ผู้ใช้ไม่สามารถลบเว็บไซต์อย่าง Amazon ออกจากรายการ Top Sites ได้สำเร็จ

ภาพประกอบจากคลังภาพสต็อก ไม่ใช่ภาพจากเหตุการณ์จริง
- สรุปเรื่องราวการแก้บั๊ก Firefox อายุ 5 ปี ในโครงการ Summer Bug Smash
- ปัญหาเกิดจาก URL ถูกเปลี่ยนเป็น search-shortcut ทำให้ลบออกจากประวัติการใช้งานไม่ได้
- วิศวกร Mozilla สองท่านคือ mak และ thecount ให้คำแนะนำและแนวทางแก้ไขจนสำเร็จ
- ทางแก้คือการเก็บค่า original_url ไว้เพื่อใช้อ้างอิงตอนลบข้อมูลจริง
บทความนี้เป็นส่วนหนึ่งของการส่งผลงานในโครงการ DEV's Summer Bug Smash ร่วมกับ Sentry โดยผู้เขียนซึ่งเป็นอาสาสมัคร Open-source ของ Mozilla ได้แชร์ประสบการณ์การตามล่าและแก้ไขบั๊กที่มีอายุยาวนานถึง 5 ปีเต็ม บนเว็บเบราว์เซอร์ Firefox หัวข้อรายงานบั๊กบน Bugzilla ใช้ชื่อว่า "Cannot remove amazon.com from top sites list" ซึ่งสะท้อนถึงความหงุดหงิดที่ผู้ใช้งานต้องเผชิญมาอย่างยาวนาน
ผู้ใช้งานรายนี้พบว่าไม่สามารถลบเว็บไซต์ amazon.com ออกจากส่วน Top Sites บนหน้า New Tab ของเบราว์เซอร์ Firefox ได้เลย ไม่ว่าจะพยายามคลิกขวาแล้วเลือก "Delete from History" หรือกดปุ่ม "Dismiss" สักกี่ครั้ง ไอคอนของ Amazon ก็ยังคงตั้งตระหง่านอยู่บนหน้าจอราวกับแขกไม่ได้รับเชิญที่ไม่ยอมกลับบ้าน โดยก่อนจะเข้าใจปัญหา เราต้องทำความเข้าใจองค์ประกอบหลักสามส่วนของ Firefox ได้แก่ Top Sites (ตารางทางลัดเว็บไซต์บนหน้า New Tab), New Tab Page (หน้าจอที่เปิดขึ้นมาใหม่), และ Places (ฐานข้อมูล SQLite ที่เก็บประวัติการท่องเว็บ)
ในกระบวนการทำงาน Firefox จะนำลิงก์ไปตรวจสอบกับรายการ search-shortcut sites ที่มีอยู่ในตัว เช่น Google, Amazon, Bing, DuckDuckGo, eBay, Twitter และ Wikipedia หากลิงก์ตรงกับรายชื่อเหล่านี้ Firefox จะทำการสลับ URL ของไทต์นั้นให้กลายเป็นเวอร์ชันที่ออกแบบมาเพื่อกระตุ้นการค้นหาบนเว็บไซต์นั้น แทนที่จะพาไปยังหน้าแรกที่คุณเข้าชมจริงๆ นั่นจึงเป็นสาเหตุที่ทำให้ URL เปลี่ยนไป และไม่ตรงกับ URL ดั้งเดิมในฐานข้อมูล Places อีกต่อไป
การทำงานของระบบ Top Sites ในเบราว์เซอร์สมัยใหม่มักมีความซับซ้อนมากกว่าแค่การแสดงผลประวัติการเข้าชมแบบตรงไปตรงมา การผสมผสานระหว่างประวัติผู้ใช้จริง เนื้อหาผู้สนับสนุน (spocs) และทางลัดการค้นหา (search-shortcuts) มักสร้างจุดบอดในแง่ของสถาปัตยกรรมซอฟต์แวร์ ซึ่งในกรณีของ Firefox การแปลง URL เบื้องหลังเพื่อรองรับฟีเจอร์การค้นหาโดยที่ไม่ได้เก็บรักษาร่องรอยของ URL ต้นทางไว้ ทำให้คำสั่งลบ (DELETE request) จากฝั่งผู้ใช้ไม่สามารถหาเป้าหมายเจอในฐานข้อมูลได้
ความพยายามครั้งแรกของผู้เขียนคือการบล็อก URL ทันทีเมื่อผู้ใช้คลิก "Delete History" เพื่อไม่ให้มันปรากฏขึ้นมาอีก แต่ mak ซึ่งเป็นวิศวกรของ Mozilla ได้คัดค้านแนวทางนี้ โดยชี้ให้เห็นว่าการบล็อกเว็บไซต์เงียบๆ พร้อมกับลบออกจาก Top Sites โดยไม่แจ้งให้ผู้ใช้ทราบล่วงหน้า อาจสร้างพฤติกรรมที่ไม่คาดคิด และเป็นการลดการควบคุมของผู้ใช้ลง แทนที่จะเพิ่มความโปร่งใส
ต่อมาผู้เขียนได้รับคำแนะนำครั้งสำคัญจากวิศวกรอีกท่านหนึ่งชื่อ thecount ซึ่งชี้เป้าให้ลองเพิ่มคำสั่ง console.log(link.url, searchProvider.url); ก่อนบรรทัดที่ 1093 ในไฟล์ NewTabUtils.sys.mjs บนซอร์สโค้ดของ Firefox ผลลัพธ์ที่ได้บนคอนโซลคือการแสดงผลลัพธ์ระหว่าง "https://www.amazon.com/" และ "https://amazon.com" ซึ่งทำให้เห็นชัดเจนว่า URL เกิดการเปลี่ยนแปลงและไม่ตรงกับค่าดั้งเดิมใน Places อีกต่อไป
แนวทางแก้ไขที่ถูกต้องจึงเป็นการนำแนวคิดจากสถาปัตยกรรมแบบ Full-stack MVC มาปรับใช้ โดยการบันทึก URL ดั้งเดิมเก็บไว้ในตัวแปร original_url ก่อนที่มันจะถูกสลับโดยระบบของ Firefox ดังนี้:
- เก็บค่า URL เดิมไว้ก่อนถูกสลับ:
link.original_url = link.url; - ตรวจสอบและใช้ค่า
original_urlเมื่อผู้ใช้ต้องการลบเว็บไซต์ออกจากระบบ - ทำให้ระบบฝั่งแบ็กเอนด์ (PlacesFeed.sys.mjs) ได้รับไอดีหรือพารามิเตอร์ที่ถูกต้องสำหรับการลบข้อมูลในฐานข้อมูล SQLite
ที่มา: Dev.to
พบข้อมูลผิดพลาดในบทความนี้? แจ้งปัญหาบทความนี้
ความคิดเห็น
แสดงความคิดเห็น