อัปเดตรหัส

การอัปเดตที่ไม่เกี่ยวข้องกับปัญหาอื่นๆ

นี่เป็นส่วนที่ 1 จาก 3 ส่วนที่อธิบายการเปลี่ยนแปลงที่จําเป็นสําหรับโค้ดที่ไม่ได้เป็นส่วนหนึ่งของ Service Worker ของส่วนขยาย ส่วนนี้ใช้สำหรับการเปลี่ยนแปลงโค้ดที่จำเป็นซึ่งไม่เกี่ยวข้องกับปัญหาอื่นๆ ส่วนถัดไป 2 ส่วนจะกล่าวถึงการแทนที่การบล็อกคำขอเว็บและการปรับปรุงความปลอดภัย

แทนที่ tabs.executeScript() ด้วย scripting.executeScript()

ในไฟล์ Manifest V3 นั้น executeScript() จะย้ายจาก API ของ tabs ไปยัง API ของ scripting ซึ่งต้องมีการเปลี่ยนสิทธิ์ในไฟล์ Manifest นอกเหนือจากการเปลี่ยนแปลงโค้ดจริง

สำหรับเมธอด executeScript() คุณต้องมีสิ่งต่อไปนี้

  • สิทธิ์ "scripting"
  • สิทธิ์ของโฮสต์หรือสิทธิ์ "activeTab"

เมธอด scripting.executeScript() จะคล้ายกับเมธอดใน tabs.executeScript() ซึ่งมีความแตกต่างอยู่เล็กน้อย

  • ขณะที่วิธีการแบบเก่าจะรับไฟล์ได้เพียงไฟล์เดียว แต่วิธีการแบบใหม่จะรับอาร์เรย์ของไฟล์ได้
  • นอกจากนี้ คุณยังส่งออบเจ็กต์ ScriptInjection แทน InjectDetails ด้วย ทั้ง 2 รูปแบบนี้มีความแตกต่างกันหลายด้าน ตัวอย่างเช่น ตอนนี้ระบบจะส่งต่อ tabId ในฐานะสมาชิกของ ScriptInjection.target แทนที่จะเป็นอาร์กิวเมนต์ Method

ตัวอย่างแสดงวิธีดำเนินการ

ไฟล์ Manifest V2
async function getCurrentTab() {/* ... */}
let tab = await getCurrentTab();

chrome.tabs.executeScript(
  tab.id,
  {
    file: 'content-script.js'
  }
);

ในไฟล์สคริปต์พื้นหลัง

ไฟล์ Manifest V3
async function getCurrentTab()
let tab = await getCurrentTab();

chrome.scripting.executeScript({
  target: {tabId: tab.id},
  files: ['content-script.js']
});

ใน Service Worker ของส่วนขยาย

แทนที่ Tab.insertCSS() และ tabs.removeCSS() ด้วย Scripting.insertCSS() และเข้าร่วม Scripting.removeCSS()

ในไฟล์ Manifest V3 นั้น insertCSS() และ removeCSS() จะย้ายจาก tabs API ไปยัง scripting API โดยต้องเปลี่ยนแปลงสิทธิ์ในไฟล์ Manifest เพิ่มเติมจากการเปลี่ยนแปลงโค้ด ดังนี้

  • สิทธิ์ "scripting"
  • สิทธิ์ของโฮสต์หรือสิทธิ์ "activeTab"

ฟังก์ชันใน scripting API จะคล้ายกับฟังก์ชันใน tabs แต่ก็มีความแตกต่างอยู่บ้าง

  • เมื่อเรียกใช้เมธอดเหล่านี้ คุณจะส่งออบเจ็กต์ CSSInjection แทน InjectDetails
  • ขณะนี้ tabId ถูกส่งผ่านในฐานะสมาชิกของ CSSInjection.target แทนที่จะเป็นอาร์กิวเมนต์ Method

ตัวอย่างแสดงวิธีดำเนินการนี้สำหรับ insertCSS() ขั้นตอนสำหรับ removeCSS() จะเหมือนกัน

Manifest V2
chrome.tabs.insertCSS(tabId, injectDetails, () => {
  // callback code
});

ในไฟล์สคริปต์พื้นหลัง

ไฟล์ Manifest V3
const insertPromise = await chrome.scripting.insertCSS({
  files: ["style.css"],
  target: { tabId: tab.id }
});
// Remaining code. 

ในโปรแกรมทำงานของบริการส่วนขยาย

แทนที่การดําเนินการของเบราว์เซอร์และการดําเนินการของหน้าเว็บด้วย "การดําเนินการ"

การทำงานของเบราว์เซอร์และการทำงานของหน้าเว็บเป็นแนวคิดที่แยกจากกันในไฟล์ Manifest V2 แม้ว่าช่องเหล่านี้จะเริ่มต้นด้วยบทบาทที่แตกต่างกัน แต่ความแตกต่างระหว่างช่องก็ลดลงเมื่อเวลาผ่านไป ในไฟล์ Manifest V3 แนวคิดเหล่านี้จะรวมอยู่ใน Action API ซึ่งจะต้องมีการเปลี่ยนแปลง manifest.json และโค้ดส่วนขยายที่แตกต่างจากที่คุณใส่ไว้ในสคริปต์เบื้องหลังของ Manifest V2

การทำงานในไฟล์ Manifest V3 คล้ายกับการทำงานของเบราว์เซอร์มากที่สุด แต่ API ของ action ไม่มี hide() และ show() เหมือนกับ pageAction หากยังคงต้องการการดำเนินการเกี่ยวกับหน้าเว็บ คุณสามารถเลียนแบบโดยใช้เนื้อหาประกาศ หรือเรียกใช้ enable() หรือ disable() ด้วยรหัสแท็บ

แทนที่ "browser_action" และ "page_action" ด้วย "action"

ในช่อง manifest.json ให้แทนที่ช่อง "browser_action" และ "page_action" ด้วยช่อง "action" ดูข้อมูลในช่อง "action" จากข้อมูลอ้างอิง

ไฟล์ Manifest V2
{
  ...
  "page_action": { ... },
  "browser_action": {
    "default_popup": "popup.html"
   }
  ...
}
Manifest V3
{
  ...
  "action": {
    "default_popup": "popup.html"
  }

  ...
}

แทนที่ browserAction และ pageAction API ด้วย Action API

ที่ไฟล์ Manifest V2 ของคุณใช้ API ของ browserAction และ pageAction ตอนนี้คุณควรใช้ API ของ action

ไฟล์ Manifest V2
chrome.browserAction.onClicked.addListener(tab => { ... });
chrome.pageAction.onClicked.addListener(tab => { ... });
Manifest V3
chrome.action.onClicked.addListener(tab => { ... });

แทนที่ Callback ด้วยสัญญา

ในไฟล์ Manifest V3 เมธอด API ส่วนขยายจำนวนมากให้คำสัญญา Promise คือพร็อกซีหรือตัวยึดตําแหน่งสำหรับค่าที่ส่งคืนโดยเมธอดแบบแอซิงโครนัส หากไม่เคยใช้ Promises มาก่อน ให้อ่านข้อมูลเกี่ยวกับ Promises ใน MDN หน้านี้จะอธิบายข้อมูลที่จำเป็นในการใช้ WebAssembly ในส่วนขยาย Chrome

วิธีการหลายวิธีจะยังคงรองรับการเรียกกลับหลังจากเพิ่มการรองรับ Promise แล้ว เพื่อรักษาความเข้ากันได้แบบย้อนหลัง โปรดทราบว่าคุณใช้ทั้ง 2 รูปแบบในการเรียกใช้ฟังก์ชันเดียวกันไม่ได้ หากคุณส่งผ่าน Callback ฟังก์ชันจะไม่แสดงผลการสัญญา และหากต้องการให้คำมั่นสัญญาก็จะไม่ผ่าน Callback ฟีเจอร์บางอย่างของ API เช่น Listener เหตุการณ์ จะยังคงต้องมีการเรียกกลับ หากต้องการตรวจสอบว่าเมธอดรองรับ Promise หรือไม่ ให้มองหาป้ายกํากับ "Promise" ในข้อมูลอ้างอิง API ของเมธอดนั้น

หากต้องการแปลงการเรียกกลับเป็นสัญญา ให้นำการเรียกกลับออกและจัดการสัญญาที่ส่งกลับมา ตัวอย่างด้านล่างมาจากตัวอย่างสิทธิ์ที่ไม่บังคับ โดยเฉพาะ newtab.js เวอร์ชัน Callback จะแสดงลักษณะของการเรียกไปยัง request() เมื่อมีการเรียกกลับ โปรดทราบว่าเวอร์ชัน Promise สามารถเขียนใหม่โดยใช้ async และ await

การติดต่อกลับ
chrome.permissions.request(newPerms, (granted) => {
  if (granted) {
    console.log('granted');
  } else {
    console.log('not granted');
  }
});
สัญญา
const newPerms = { permissions: ['topSites'] };
chrome.permissions.request(newPerms)
.then((granted) => {
  if (granted) {
    console.log('granted');
  } else {
    console.log('not granted');
  }
});

แทนที่ฟังก์ชันที่คาดว่าจะมีบริบทพื้นหลังในไฟล์ Manifest V2

บริบทของส่วนขยายอื่นๆ จะโต้ตอบกับโปรแกรมทำงานของบริการส่วนขยายได้โดยใช้การส่งข้อความเท่านั้น คุณจึงต้องแทนที่การเรียกใช้ที่คาดหวังบริบทเบื้องหลัง โดยเฉพาะการเรียกใช้ต่อไปนี้

  • chrome.runtime.getBackgroundPage()
  • chrome.extension.getBackgroundPage()
  • chrome.extension.getExtensionTabs()

สคริปต์ส่วนขยายควรใช้การส่งข้อความเพื่อสื่อสารระหว่าง Service Worker กับส่วนอื่นๆ ของส่วนขยาย ในตอนนี้ คุณสามารถทำได้โดยใช้ sendMessage() และใช้งาน chrome.runtime.onMessage ในโปรแกรมทำงานของบริการส่วนขยายของคุณ ในระยะยาว คุณควรวางแผนแทนที่การเรียกเหล่านี้ด้วย postMessage() และเครื่องจัดการเหตุการณ์ข้อความของโปรแกรมทำงานของบริการ

แทนที่ API ที่ไม่รองรับ

วิธีการและพร็อพเพอร์ตี้ที่ระบุไว้ด้านล่างต้องเปลี่ยนแปลงในไฟล์ Manifest V3

เมธอดหรือพร็อพเพอร์ตี้ Manifest V2 แทนที่ด้วย
chrome.extension.connect() chrome.runtime.connect()
chrome.extension.connectNative() chrome.runtime.connectNative()
chrome.extension.getExtensionTabs() chrome.extension.getViews()
chrome.extension.getURL() chrome.runtime.getURL()
chrome.extension.lastError ในกรณีที่เมธอดจะแสดงคำสัญญา ให้ใช้ promise.catch()
chrome.extension.onConnect chrome.runtime.onConnect
chrome.extension.onConnectExternal chrome.runtime.onConnectExternal
chrome.extension.onMessage chrome.runtime.onMessage
chrome.extension.onRequest chrome.runtime.onMessage
chrome.extension.onRequestExternal chrome.runtime.onMessageExternal
chrome.extension.sendMessage() chrome.runtime.sendMessage()
chrome.extension.sendNativeMessage() chrome.runtime.sendNativeMessage()
chrome.extension.sendRequest() chrome.runtime.sendMessage()
chrome.runtime.onSuspend (สคริปต์พื้นหลัง) ไม่รองรับใน WOrker ของบริการส่วนขยาย ให้ใช้เหตุการณ์เอกสาร beforeunload แทน
chrome.tabs.getAllInWindow() chrome.tabs.query()
chrome.tabs.getSelected() chrome.tabs.query()
chrome.tabs.onActiveChanged chrome.tabs.onActivated
chrome.tabs.onHighlightChanged chrome.tabs.onHighlighted
chrome.tabs.onSelectionChanged chrome.tabs.onActivated
chrome.tabs.sendRequest() chrome.runtime.sendMessage()
chrome.tabs.Tab.selected chrome.tabs.Tab.highlighted