بهروزرسانیهایی که به مشکلات دیگر مربوط نیستند
این اولین بخش از سه بخشی است که تغییرات لازم برای کدی را که بخشی از کارگر سرویس افزونه نیست شرح میدهد. این بخش برای تغییرات کد الزامی است که به مشکلات دیگر مربوط نیست. دو بخش بعدی به جایگزینی درخواستهای وب مسدودکننده و بهبود امنیت میپردازند.
tabs.executeScript() را با scripting.executeScript() جایگزین کنید
در «مانیفست نسخه ۳»، executeScript() از میانای برنامهسازی کاربردی tabs به میانای برنامهسازی کاربردی scripting منتقل میشود. این کار علاوهبر تغییرات کد واقعی، به تغییراتی در اجازههای فایل مانیفست نیاز دارد.
برای روش executeScript() به این موارد نیاز دارید:
- اجازه
"scripting". - اجازههای میزبان یا اجازه
"activeTab".
روش scripting.executeScript() مشابه نحوه عملکرد آن با tabs.executeScript() است. چند تفاوت وجود دارد.
- درحالیکه روش قدیمی فقط میتوانست یک فایل را دریافت کند، روش جدید میتواند آرایهای از فایلها را دریافت کند.
- همچنین بهجای
InjectDetails، شیءScriptInjectionرا ارسال میکنید. تفاوتهای متعددی بین این دو وجود دارد. برای مثال،tabIdاکنون بهعنوان عضوی ازScriptInjection.targetارسال میشود، نه بهعنوان آرگومان متد.
این مثال نحوه انجام این کار را نشان میدهد.
async function getCurrentTab() {/* ... */} let tab = await getCurrentTab(); browser.tabs.executeScript( tab.id, { file: 'content-script.js' } );
در فایل اسکریپت پسزمینه.
async function getCurrentTab() let tab = await getCurrentTab(); browser.scripting.executeScript({ target: {tabId: tab.id}, files: ['content-script.js'] });
در کارگر سرویس افزونه.
tabs.insertCSS() و tabs.removeCSS() را با scripting.insertCSS() و scripting.removeCSS() جایگزین کنید
در Manifest V3، insertCSS() و removeCSS() از tabs API به scripting API منتقل میشوند. این کار علاوهبر تغییرات کد، مستلزم تغییراتی در اجازههای فایل مانیفست است:
- اجازه
"scripting". - اجازههای میزبان یا اجازه
"activeTab".
عملکردهای scripting API مشابه عملکردهای tabs است. چند تفاوت وجود دارد.
- هنگام فراخوانی این روشها، بهجای
InjectDetails، شیءCSSInjectionرا ارسال میکنید. - اکنون
tabIdبهعنوان عضوی ازCSSInjection.targetبهجای آرگومان روش ارسال میشود.
این مثال نشان میدهد که چگونه این کار را برای insertCSS() انجام دهید. روال removeCSS() هم همینطور است.
browser.tabs.insertCSS(tabId, injectDetails, () => { // callback code });
در فایل اسکریپت پسزمینه.
const insertPromise = await browser.scripting.insertCSS({ files: ["style.css"], target: { tabId: tab.id } }); // Remaining code.
در کارگر سرویس افزونه.
جایگزین کردن «کنشهای مرورگر» و «کنشهای صفحه» با «کنشها»
کنشهای مرورگر و کنشهای صفحه در Manifest V2 مفاهیم جداگانهای بودند. اگرچه آنها با نقشهای متمایز شروع کردند، اما تفاوتهای بین آنها با گذشت زمان کاهش یافت. در «مانیفست نسخه ۳»، این مفاهیم در میانای برنامهسازی کاربردی کنش ادغام شدهاند. این کار مستلزم تغییراتی در manifest.json و کد افزونه است که با آنچه در اسکریپت پسزمینه «مانیفست نسخه ۲» قرار میدادید متفاوت است.
کنشها در Manifest V3 بیشترین شباهت را به کنشهای مرورگر دارند؛ بااینحال، action API برخلاف pageAction، hide() و show() را ارائه نمیدهد. اگر هنوز به کنشهای صفحه نیاز دارید، میتوانید آنها را بااستفاده از محتوای اعلانی شبیهسازی کنید یا enable() یا disable() را با شناسه برگه فراخوانی کنید.
«browser_action» و «page_action» را با «action» جایگزین کنید
در manifest.json، فیلدهای "browser_action" و "page_action" را با فیلد "action" جایگزین کنید. برای اطلاعات مربوط به فیلد "action"، به مرجع مراجعه کنید.
{ ... "page_action": { ... }, "browser_action": { "default_popup": "popup.html" } ... }
{ ... "action": { "default_popup": "popup.html" } ... }
جایگزین کردن میاناهای برنامهسازی کاربردی browserAction و pageAction با میانای برنامهسازی کاربردی action
جایی که Manifest V2 شما از میاناهای برنامهسازی کاربردی browserAction و pageAction استفاده میکرد، اکنون باید از میانای برنامهسازی کاربردی action استفاده کنید.
browser.browserAction.onClicked.addListener(tab => { ... }); browser.pageAction.onClicked.addListener(tab => { ... });
browser.action.onClicked.addListener(tab => { ... });
جایگزین کردن فراخوانیهای برگشتی با وعدهها
در «مانیفست نسخه ۳»، بسیاری از روشهای میانای برنامهسازی کاربردی افزونه، وعده برمیگردانند. Promise یک پراکسی یا جایبان برای مقداری است که توسط یک روش ناهمگام برگردانده میشود. اگر هرگز از Promises استفاده نکردهاید، میتوانید درباره آنها در MDN بخوانید. این صفحه توضیح میدهد که برای استفاده از آنها در افزونه Chrome چه چیزهایی را باید بدانید.
برای سازگاری با نسخه قدیمی، بسیاریاز روشها پساز اضافه شدن پشتیبانی از Promise، همچنان از Callback پشتیبانی میکنند. توجه داشته باشید که نمیتوانید از هر دو در یک فراخوانی تابع استفاده کنید. اگر یک فراخوانی را ارسال کنید، تابع یک وعده را برنمیگرداند و اگر میخواهید یک وعده برگردانده شود، فراخوانی را ارسال نکنید. برخیاز ویژگیهای میانای برنامهسازی کاربردی، مثل شنوندگان رویداد، همچنان به فراخوانیهای برگشتی نیاز خواهند داشت. برای بررسی اینکه آیا روشی از Promise پشتیبانی میکند یا نه، برچسب «Promise» را در مرجع میانای برنامهسازی کاربردی آن جستجو کنید.
برای تبدیل از callback به promise، callback را بردارید و promise برگرداندهشده را مدیریت کنید. نمونه زیر از نمونه اجازههای اختیاری، بهطور خاص newtab.js، گرفته شده است. نسخه تماس برگشتی نشان میدهد که تماس نمونه با request() با تماس برگشتی چگونه خواهد بود. توجه داشته باشید که نسخه promise را میتوان با async و await بازنویسی کرد.
browser.permissions.request(newPerms, (granted) => { if (granted) { console.log('granted'); } else { console.log('not granted'); } });
const newPerms = { permissions: ['topSites'] }; browser.permissions.request(newPerms) .then((granted) => { if (granted) { console.log('granted'); } else { console.log('not granted'); } });
جایگزین کردن توابعی که انتظار بافت پسزمینه Manifest V2 را دارند
سایر زمینههای افزونه فقط میتوانند بااستفاده از انتقال پیام با کارگران سرویس افزونه تعامل داشته باشند. درنتیجه، باید فراخوانیهایی را که انتظار بافت پسزمینه دارند جایگزین کنید، بهویژه:
browser.runtime.getBackgroundPage()browser.extension.getBackgroundPage()browser.extension.getExtensionTabs()
اسکریپتهای افزونه شما باید از ارسال پیام برای برقراری ارتباط بین یک کارگر سرویس و سایر بخشهای افزونه شما استفاده کنند. درحالحاضر این کار را میتوان بااستفاده از sendMessage() و پیادهسازی browser.runtime.onMessage در کارگر سرویس افزونه انجام داد. در بلندمدت، باید برای جایگزین کردن این فراخوانیها با postMessage() و گرداننده رویداد پیام سرویسورکر برنامهریزی کنید.
جایگزین کردن میاناهای برنامهسازی کاربردی پشتیبانینشده
روشها و ویژگیهای فهرستشده در زیر باید در «مانیفست نسخه ۳» تغییر کنند.
| روش یا ویژگی Manifest V2 | جایگزینی با |
|---|---|
browser.extension.connect() |
browser.runtime.connect() |
browser.extension.connectNative() |
browser.runtime.connectNative() |
browser.extension.getExtensionTabs() |
browser.extension.getViews() |
browser.extension.getURL() |
browser.runtime.getURL() |
browser.extension.lastError |
جایی که روشها وعدهها را برمیگردانند، از promise.catch() استفاده کنید |
browser.extension.onConnect |
browser.runtime.onConnect |
browser.extension.onConnectExternal |
browser.runtime.onConnectExternal |
browser.extension.onMessage |
browser.runtime.onMessage |
browser.extension.onRequest |
browser.runtime.onMessage |
browser.extension.onRequestExternal |
browser.runtime.onMessageExternal |
browser.extension.sendMessage() |
browser.runtime.sendMessage() |
browser.extension.sendNativeMessage() |
browser.runtime.sendNativeMessage() |
browser.extension.sendRequest() |
browser.runtime.sendMessage() |
browser.runtime.onSuspend (اسکریپتهای پسزمینه) |
در کارگران سرویس افزونه پشتیبانی نمیشود. درعوض از رویداد سند beforeunload استفاده کنید. |
browser.tabs.getAllInWindow() |
browser.tabs.query() |
browser.tabs.getSelected() |
browser.tabs.query() |
browser.tabs.onActiveChanged |
browser.tabs.onActivated |
browser.tabs.onHighlightChanged |
browser.tabs.onHighlighted |
browser.tabs.onSelectionChanged |
browser.tabs.onActivated |
browser.tabs.sendRequest() |
browser.runtime.sendMessage() |
browser.tabs.Tab.selected |
browser.tabs.Tab.highlighted |