คำอธิบาย
ใช้ chrome.devtools.inspectedWindow API เพื่อโต้ตอบกับหน้าต่างที่ตรวจสอบ เช่น รับรหัสแท็บสำหรับหน้าที่ตรวจสอบ ประเมินโค้ดในบริบทของหน้าต่างที่ตรวจสอบ โหลดหน้าเว็บซ้ำ หรือรับรายการทรัพยากรภายในหน้าเว็บ
ดูข้อมูลเบื้องต้นเกี่ยวกับการใช้ Developer Tools API ได้ที่สรุป DevTools API
พร็อพเพอร์ตี้ tabId จะระบุตัวระบุแท็บที่คุณใช้กับการเรียก chrome.tabs.*
API ได้ อย่างไรก็ตาม โปรดทราบว่าระบบไม่ได้แสดง chrome.tabs.* API ในหน้าส่วนขยายของเครื่องมือสำหรับนักพัฒนาเว็บเนื่องจากข้อควรพิจารณาด้านความปลอดภัย คุณจะต้องส่งรหัสแท็บไปยังหน้าพื้นหลังและเรียกใช้ฟังก์ชัน chrome.tabs.* API จากที่นั่น
คุณอาจใช้วิธี reload เพื่อโหลดหน้าที่ตรวจสอบซ้ำ นอกจากนี้ ผู้เรียกยังระบุการลบล้างสำหรับสตริง User Agent, สคริปต์ที่จะแทรกเมื่อโหลดหน้าเว็บ หรือตัวเลือกในการบังคับให้โหลดทรัพยากรที่แคชไว้ซ้ำได้
ใช้การเรียก getResources และเหตุการณ์ onResourceContent เพื่อรับรายการทรัพยากร (เอกสาร สไตล์ชีต สคริปต์ รูปภาพ ฯลฯ) ภายในหน้าที่ตรวจสอบ คุณอาจใช้เมธอด getContent และ
setContent ของคลาส Resource พร้อมกับเหตุการณ์ onResourceContentCommitted เพื่อรองรับการแก้ไขเนื้อหาทรัพยากร เช่น โดยเอดิเตอร์ภายนอก
ไฟล์ Manifest
เรียกใช้โค้ดในหน้าต่างที่ตรวจสอบ
เมธอด eval ช่วยให้ส่วนขยายสามารถเรียกใช้โค้ด JavaScript ในบริบทของหน้าที่ตรวจสอบ เมธอดนี้มีประสิทธิภาพเมื่อใช้ในบริบทที่เหมาะสมและเป็นอันตรายเมื่อใช้ไม่เหมาะสม ใช้เมธอด tabs.executeScript เว้นแต่ว่าคุณต้องการฟังก์ชันการทำงานเฉพาะ
ที่เมธอด eval มีให้
ความแตกต่างหลักระหว่างเมธอด eval กับ tabs.executeScript มีดังนี้
- เมธอด
evalไม่ได้ใช้โลกที่แยกจากกันสำหรับโค้ดที่กำลังประเมิน ดังนั้นโค้ดจึงเข้าถึงสถานะ JavaScript ของหน้าต่างที่ตรวจสอบได้ ใช้วิธีนี้เมื่อจำเป็นต้องเข้าถึงสถานะ JavaScript ของหน้าที่ตรวจสอบ - บริบทการดำเนินการของโค้ดที่กำลังประเมินรวมถึง DevTools Console API
ตัวอย่างเช่น โค้ดสามารถใช้
inspectและ$0ได้ - โค้ดที่ประเมินอาจแสดงผลค่าที่ส่งผ่านไปยัง Callback ของส่วนขยาย ค่าที่แสดงผลต้องเป็นออบเจ็กต์ JSON ที่ถูกต้อง (อาจมีเฉพาะประเภท JavaScript ดั้งเดิมและการอ้างอิงแบบไม่เป็นวงจรไปยังออบเจ็กต์ JSON อื่นๆ) โปรดใช้ความระมัดระวังเป็นพิเศษขณะประมวลผลข้อมูลที่ได้รับจากหน้าที่ตรวจสอบ เนื่องจากบริบทการดำเนินการจะควบคุมโดยหน้าที่ตรวจสอบเป็นหลัก หน้าเว็บที่เป็นอันตรายอาจส่งผลต่อข้อมูลที่แสดงผลไปยังส่วนขยายได้
โปรดทราบว่าหน้าเว็บสามารถมีบริบทการดำเนินการ JavaScript ที่แตกต่างกันหลายบริบท แต่ละเฟรมจะมีบริบทของตัวเอง รวมถึงบริบทเพิ่มเติมสำหรับส่วนขยายแต่ละรายการที่มีการเรียกใช้สคริปต์เนื้อหาในเฟรมนั้น
โดยค่าเริ่มต้น เมธอด eval จะดำเนินการในบริบทของเฟรมหลักของหน้าที่ตรวจสอบ
เมธอด eval รับอาร์กิวเมนต์ที่ 2 ที่ไม่บังคับ ซึ่งคุณใช้เพื่อระบุบริบทที่จะประเมินโค้ดได้ ออบเจ็กต์ options นี้สามารถมีคีย์อย่างน้อย 1 รายการต่อไปนี้
frameURL- ใช้เพื่อระบุเฟรมอื่นที่ไม่ใช่เฟรมหลักของหน้าที่ตรวจสอบ
contextSecurityOrigin- ใช้เพื่อเลือกบริบทภายในเฟรมที่ระบุตามต้นทางเว็บ
useContentScriptContext- หากเป็น "จริง" ให้เรียกใช้สคริปต์ในบริบทเดียวกับสคริปต์เนื้อหาของส่วนขยาย (เทียบเท่ากับการระบุต้นทางเว็บของส่วนขยายเองเป็นต้นทางความปลอดภัยของบริบท) ซึ่งสามารถใช้เพื่อแลกเปลี่ยนข้อมูลกับสคริปต์เนื้อหาได้
ตัวอย่าง
โค้ดต่อไปนี้จะตรวจสอบเวอร์ชันของ jQuery ที่หน้าที่ตรวจสอบใช้
chrome.devtools.inspectedWindow.eval(
"jQuery.fn.jquery",
function(result, isException) {
if (isException) {
console.log("the page is not using jQuery");
} else {
console.log("The page is using jQuery v" + result);
}
}
);
หากต้องการลองใช้ API นี้ ให้ติดตั้งตัวอย่าง API ของเครื่องมือสำหรับนักพัฒนาเว็บจากที่เก็บ chrome-extension-samples
ประเภท
Resource
ทรัพยากรภายในหน้าที่ตรวจสอบ เช่น เอกสาร สคริปต์ หรือรูปภาพ
พร็อพเพอร์ตี้
-
URL
สตริง
URL ของทรัพยากร
-
getContent
void
รับเนื้อหาของทรัพยากร
ฟังก์ชัน
getContentมีลักษณะดังนี้() => {...}-
returns
Promise<object>
Chrome 151+ฟังก์ชันที่รับเนื้อหาทรัพยากรเมื่อคำขอเสร็จสมบูรณ์
-
-
setContent
void
ตั้งค่าเนื้อหาของทรัพยากร
ฟังก์ชัน
setContentมีลักษณะดังนี้(content: string, commit: boolean) => {...}
-
เนื้อหา
สตริง
เนื้อหาใหม่ของทรัพยากร ปัจจุบันรองรับเฉพาะทรัพยากรประเภทข้อความ
-
คอมมิต
บูลีน
เป็น "จริง" หากผู้ใช้แก้ไขทรัพยากรเสร็จแล้ว และควรบันทึกเนื้อหาใหม่ของทรัพยากรไว้ เป็น "เท็จ" หากเป็นการเปลี่ยนแปลงเล็กน้อยที่ส่งระหว่างที่ผู้ใช้กำลังแก้ไขทรัพยากร
-
returns
Promise<object>
Chrome 151+ฟังก์ชันที่เรียกใช้เมื่อคำขอเสร็จสมบูรณ์
-
พร็อพเพอร์ตี้
tabId
รหัสของแท็บที่กำลังตรวจสอบ คุณอาจใช้รหัสนี้กับ chrome.tabs.* API
ประเภท
ตัวเลข
เมธอด
eval()
chrome.devtools.inspectedWindow.eval(
expression: string,
options?: object,
): Promise<object>
ประเมินนิพจน์ JavaScript ในบริบทของเฟรมหลักของหน้าที่ตรวจสอบ นิพจน์ต้องประเมินเป็นออบเจ็กต์ที่สอดคล้องกับ JSON ไม่เช่นนั้นระบบจะแสดงข้อยกเว้น ฟังก์ชัน eval สามารถรายงานข้อผิดพลาดฝั่งเครื่องมือสำหรับนักพัฒนาเว็บหรือข้อยกเว้น JavaScript ที่เกิดขึ้นระหว่างการประเมิน ไม่ว่าในกรณีใดก็ตาม พารามิเตอร์ result ของ Callback จะเป็น undefined ในกรณีที่เกิดข้อผิดพลาดฝั่งเครื่องมือสำหรับนักพัฒนาเว็บ พารามิเตอร์ isException จะไม่ใช่ค่าว่างและมี isError ตั้งค่าเป็น "จริง" และ code ตั้งค่าเป็นรหัสข้อผิดพลาด ในกรณีที่เกิดข้อผิดพลาด JavaScript ระบบจะตั้งค่า isException เป็น "จริง" และตั้งค่า value เป็นค่าสตริงของออบเจ็กต์ที่แสดง
พารามิเตอร์
-
นิพจน์
สตริง
นิพจน์ที่จะประเมิน
-
ตัวเลือก
ออบเจ็กต์ (ไม่บังคับ)
พารามิเตอร์ตัวเลือกสามารถมีตัวเลือกอย่างน้อย 1 รายการ
-
frameURL
สตริง ไม่บังคับ
หากระบุไว้ ระบบจะประเมินนิพจน์ใน iframe ที่มี URL ตรงกับ URL ที่ระบุ โดยค่าเริ่มต้น ระบบจะประเมินนิพจน์ในเฟรมบนสุดของหน้าที่ตรวจสอบ
-
scriptExecutionContext
สตริง ไม่บังคับ
Chrome 107+ประเมินนิพจน์ในบริบทของสคริปต์เนื้อหาของส่วนขยายที่ตรงกับต้นทางที่ระบุ หากระบุไว้ scriptExecutionContext จะลบล้างการตั้งค่า "จริง" ใน useContentScriptContext
-
useContentScriptContext
บูลีน ไม่บังคับ
ประเมินนิพจน์ในบริบทของสคริปต์เนื้อหาของส่วนขยายที่เรียกใช้ โดยมีเงื่อนไขว่าได้แทรกสคริปต์เนื้อหาลงในหน้าที่ตรวจสอบแล้ว หากยังไม่ได้แทรก ระบบจะไม่ประเมินนิพจน์และจะเรียกใช้ Callback โดยตั้งค่าพารามิเตอร์ข้อยกเว้นเป็นออบเจ็กต์ที่มีช่อง
isErrorตั้งค่าเป็น "จริง" และช่องcodeตั้งค่าเป็นE_NOTFOUND
-
returns
-
Promise<object>
Chrome 151+ฟังก์ชันที่เรียกใช้เมื่อการประเมินเสร็จสมบูรณ์
getResources()
chrome.devtools.inspectedWindow.getResources(): Promise<Resource[]>
ดึงข้อมูลรายการทรัพยากรจากหน้าที่ตรวจสอบ
returns
-
Promise<Resource[]>
Chrome 151+ฟังก์ชันที่รับรายการทรัพยากรเมื่อคำขอเสร็จสมบูรณ์
reload()
chrome.devtools.inspectedWindow.reload(
reloadOptions?: object,
): void
โหลดหน้าที่ตรวจสอบซ้ำ
พารามิเตอร์
-
reloadOptions
ออบเจ็กต์ (ไม่บังคับ)
-
ignoreCache
บูลีน ไม่บังคับ
เมื่อเป็น "จริง" ตัวโหลดจะข้ามแคชสำหรับทรัพยากรทั้งหมดของหน้าที่ตรวจสอบซึ่งโหลดก่อนที่จะมีการทริกเกอร์เหตุการณ์
loadผลลัพธ์จะคล้ายกับการกด Ctrl+Shift+R ในหน้าต่างที่ตรวจสอบหรือภายในหน้าต่างเครื่องมือสำหรับนักพัฒนาเว็บ -
injectedScript
สตริง ไม่บังคับ
หากระบุไว้ ระบบจะแทรกสคริปต์ลงในทุกเฟรมของหน้าที่ตรวจสอบทันทีที่โหลด ก่อนสคริปต์ใดๆ ของเฟรม ระบบจะไม่แทรกสคริปต์หลังจากการโหลดซ้ำในภายหลัง เช่น หากผู้ใช้กด Ctrl+R
-
userAgent
สตริง ไม่บังคับ
หากระบุไว้ สตริงจะลบล้างค่าของส่วนหัว HTTP
User-Agentที่ส่งขณะโหลดทรัพยากรของหน้าที่ตรวจสอบ นอกจากนี้ สตริงยังลบล้างค่าของพร็อพเพอร์ตี้navigator.userAgentที่แสดงผลไปยังสคริปต์ใดๆ ที่ทำงานภายในหน้าที่ตรวจสอบด้วย
-
กิจกรรม
onResourceAdded
chrome.devtools.inspectedWindow.onResourceAdded.addListener(
callback: function,
)
ทริกเกอร์เมื่อมีการเพิ่มทรัพยากรใหม่ลงในหน้าที่ตรวจสอบ
พารามิเตอร์
-
callback
ฟังก์ชัน
พารามิเตอร์
callbackมีลักษณะดังนี้:(resource: Resource) => void
-
ทรัพยากร
-
onResourceContentCommitted
chrome.devtools.inspectedWindow.onResourceContentCommitted.addListener(
callback: function,
)
ทริกเกอร์เมื่อมีการคอมมิตการแก้ไขใหม่ของทรัพยากร (เช่น ผู้ใช้บันทึกทรัพยากรเวอร์ชันที่แก้ไขในเครื่องมือสำหรับนักพัฒนาเว็บ)