นักพัฒนาแอปจะใช้สิทธิ์ API และไฟล์ Manifest ของ chrome.offscreen
ได้ตั้งแต่ Chrome 109 เป็นต้นไปเพื่อแทนที่ฟังก์ชันการทำงานในการเปลี่ยนจากหน้าเว็บเบื้องหลังไปเป็นโปรแกรมทำงานของบริการส่วนขยาย การขอสิทธิ์นี้ช่วยให้สร้างเอกสารนอกหน้าจอเพื่อใช้ DOM API ได้โดยไม่ต้องเปิดหน้าต่างหรือแท็บใหม่จนรบกวนประสบการณ์ของผู้ใช้ ตอนนี้ chrome.offscreen
API พร้อมใช้งานแล้วในส่วนขยาย Chrome
ใน Chromium ส่วนขยายไฟล์ Manifest V3 ทำงานแบบ Service Worker แต่ Service Worker ไม่ได้ให้การสนับสนุน API และกลไกเดียวกันกับที่หน้าเว็บซึ่งอิงเอกสารทั้งหมด (ซึ่งรวมถึงหน้าพื้นหลังและหน้าเหตุการณ์) ทำ นอกจากนี้ การใช้สคริปต์เนื้อหาเพื่อเข้าถึง DOM API ในหน้าเว็บจะทำให้ส่วนขยายไม่ต้องเสียเวลากับนโยบายรักษาความปลอดภัยเนื้อหาที่ต่างกันแบบหน้าต่อหน้า เพื่อช่วยแก้ปัญหานี้ เราจึงขอแนะนำเอกสารนอกหน้าจอเพื่อรองรับฟีเจอร์และ API ที่เกี่ยวข้องกับ DOM โดยอนุญาตให้ส่วนขยายที่ใช้ไฟล์ Manifest V3 เปิดเอกสารนอกหน้าจอน้อยที่สุด กำหนดขอบเขต และไม่ได้รับอนุญาตที่ค่อนข้างไม่ได้รับอนุญาตในระหว่างรันไทม์ผ่าน API เฉพาะ
ข้อมูลฟีเจอร์
เนื่องจากเอกสารนอกหน้าจอได้รับการออกแบบมาโดยเฉพาะเพื่อจัดการกรณีการใช้งานที่โปรแกรมทำงานของบริการไม่รองรับ (เช่น การเล่นเสียง) อายุการใช้งานของหน้านี้ และสิทธิ์ที่จะได้รับจะแยกจากสิทธิ์ของโปรแกรมทำงานของบริการส่วนขยาย
หน้านี้จะมีกลไกตลอดอายุการใช้งานคล้ายกับหน้าเหตุการณ์ในไฟล์ Manifest V2 นั่นคือจะยุบลงเมื่อหยุดดำเนินการ นอกจากนี้ User Agent อาจระบุข้อจำกัดเพิ่มเติมเกี่ยวกับอายุการใช้งานโดยให้เฉพาะตามวัตถุประสงค์ที่ระบุไว้
เอกสารนอกหน้าจอออกแบบมาเพื่อเติมเต็มช่องว่างจาก API ที่เข้าถึงได้ด้วย DOM API เท่านั้น ด้วยเหตุนี้ คุณจึงไม่จำเป็นต้องแสดง API ส่วนขยายในบริบทนี้โดยตรง เพื่อลดโอกาสที่ส่วนขยายที่ใช้เป็น "การแทนที่หน้าพื้นหลัง" จะมีเฉพาะ chrome.runtime
Messaging API เท่านั้นที่แสดงให้เห็นเอกสารนอกหน้าจอ (นักพัฒนาแอปอาจใช้การรับส่งข้อความบนเว็บโดยการอ้างสิทธิ์เอกสารนอกหน้าจอเป็นไคลเอ็นต์ผ่าน Service Worker)
เนื่องจากกรณีการใช้งานบาง (โดยเฉพาะการดึงข้อมูลเว็บไซต์) จําเป็นต้องเข้าถึงเฟรมแบบข้ามต้นทาง เราจึงอนุญาตให้เอกสารเหล่านี้ฝังเฟรมข้ามต้นทางตามกฎเดียวกับที่หน้าส่วนขยายมีอยู่ในปัจจุบัน ในเอกสารนอกหน้าจอ สคริปต์เนื้อหาที่ส่วนขยายระบุจะสามารถทำงานในเฟรมเหล่านี้เพื่อคัดลอกเนื้อหาที่จำเป็น เช่นเดียวกับที่ทำกับหน้าเว็บปกติ
เหตุผลและวัตถุประสงค์
การสร้างเอกสารนอกหน้าจอต้องระบุเหตุผลและเหตุผลเพิ่มเติม เหตุผลเหล่านี้แสดงอยู่ในเอกสารอ้างอิง API และสามารถจัดการอายุการใช้งานของเอกสารในรูปแบบที่แตกต่างกันไป เช่น ขณะนี้เอกสารที่เปิดเพื่อเล่นเสียงมีกฎที่มีผลกับอายุการใช้งานแตกต่างจากเอกสารที่เปิดสำหรับการจัดการคลิปบอร์ด คุณสามารถเพิ่มรายละเอียดเกี่ยวกับวัตถุประสงค์ของเอกสารนอกหน้าจอในเหตุผลรองรับ ซึ่งเป็นสตริงที่นักพัฒนาแอปเขียนขึ้น ไม่ใช่พารามิเตอร์ที่มีเอฟเฟกต์กับเอกสาร เราอาจเพิ่มเหตุผลอื่นๆ ลงใน API ในอนาคตเมื่อนักพัฒนาแอปแชร์ความคิดเห็นและกรณีการใช้งาน
มุ่งสู่อนาคต
เพื่อความสะดวกในการใช้งาน API เวอร์ชันแรกจะสนับสนุนเพียง 1 หน้าต่อส่วนขยาย 1 หน้าต่อโปรไฟล์เท่านั้น ในเวอร์ชันต่อๆ ไป เราอาจผ่อนปรนเพื่อให้รองรับหลายหน้า ในปัจจุบัน หากส่วนขยายทำงานในโหมดแยกโดยมีโปรไฟล์ที่ไม่ระบุตัวตนที่ใช้งานอยู่ ทั้งโปรไฟล์ปกติและโปรไฟล์ที่ไม่ระบุตัวตนจะมีเอกสารนอกหน้าจอได้ 1 ฉบับ นอกจากนี้ยังมีแผนที่จะให้ฟังก์ชันการทำงาน DOM ของผู้ปฏิบัติงานส่วนขยายในภายหลังด้วย คุณสามารถ "รองรับอนาคต" ของส่วนขยายได้ด้วยการจับคู่ฟังก์ชันที่ใช้ API นอกหน้าจอกับฟังก์ชันที่มีความคิดเห็นที่เทียบเท่าในโปรแกรมทำงานของบริการเพื่อทำการสลับในภายหลัง
// Solution 1 - Service workers cannot directly interact with
// the system clipboard. To work around this, we'll create an offscreen
// document and pass the data we want to write to the clipboard.
async function addToClipboard(value) {
await chrome.offscreen.createDocument({
url: 'offscreen.html',
reasons: [chrome.offscreen.Reason.CLIPBOARD],
justification: 'Write text to the clipboard.',
});
}
// Solution 2 – Once extension service workers can use the Clipboard API,
// replace the offscreen document based implementation with something like this
async function addToClipboardV2(value) {
navigator.clipboard.writeText(value);
}
นอกจากนี้ เมื่อเพิ่มฟังก์ชัน DOM และ API ลงในโปรแกรมทำงานของบริการ ระบบจะเพิ่มหรือลดรายการเหตุผลในการสร้างเอกสารโดยขึ้นอยู่กับสถานะปัจจุบันของ Service Worker และเหตุผลในการใช้เอกสารนอกหน้าจอ
บทสรุป
เอกสารนอกหน้าจอช่วยให้ใช้งานส่วนขยายที่ต้องมีการเข้าถึงการโต้ตอบ DOM หรือหน้าต่างที่ไม่สามารถทำได้ในโปรแกรมทำงานของบริการในปัจจุบัน นอกจากนี้ยังเป็นวิธีที่ยืดหยุ่น ซึ่งสามารถเพิ่ม Use Case ใหม่ๆ และนำ Use Case ที่แก้ไขในอนาคตออกได้ ส่วนขยายควรใช้ API เอกสารนอกหน้าจอที่เสนอสำหรับกรณีการใช้งานเฉพาะ และบริบทหลักของส่วนขยายควรยังคงเป็น Service Worker ที่ระบุไว้ในไฟล์ Manifest เอกสารนอกหน้าจอไม่ควรเป็นที่สำหรับจัดเก็บตรรกะของส่วนขยายหลัก เนื่องจากมีการเข้าถึง API ที่จำกัด อายุการใช้งานของเอกสารนอกหน้าจอจะไม่ขึ้นอยู่กับโปรแกรมทำงานของบริการที่สร้างเอกสารนั้น เราจะกล่าวถึงข้อควรพิจารณาเกี่ยวกับอายุการใช้งานของ Service Worker และกรณีการใช้งานที่เกี่ยวข้องกับอายุการใช้งานของ Service Worker ในส่วนขยายในบล็อกโพสต์แยกต่างหาก เหตุผลในการใช้เอกสารนอกหน้าจอจะมีความผันผวนเมื่อเวลาผ่านไปเนื่องจากมีการเพิ่มฟีเจอร์และ API ให้กับโปรแกรมทำงานของบริการเอง เราอยากรับฟังความคิดเห็นของนักพัฒนาซอฟต์แวร์เมื่อมีความคืบหน้าเช่นนี้