Extensions are made of different, but cohesive, components. Components can include background scripts, content scripts, an options page, UI elements and various logic files. Extension components are created with web development technologies: HTML, CSS, and JavaScript.
اکستنشنها از کامپوننتهای متفاوت اما منسجم تشکیل میشوند. کامپوننتها میتوانند شامل اسکریپتهای پسزمینه، اسکریپتهای محتوا، برگههای تنظیمات، المنتهای UI و فایلهای مختلف مربوط به منطق اکستنشن باشند. کامپوننتهای اکستنشن با تکنولوژیهای توسعهی وب ساخته میشوند: HTML و CSS و JS.
دو سناریو را در نظر بگیریم:
در سناریوی اول، حجم مرورگرها سرسامآور میشود و حافظهی کامپیوتر را صدها برابر آنچه در Memeها میبینیم، حیف و میل میکنند. در سناریوی دوم، حجم مرورگرها پایین میآید و هر کاربری تنها قابلیتهای اضافی که نیاز دارد را نصب میکند و دیگر فلان اکستنشن که متن صفحات را به زبان هندی ترجمه میکند سربار حافظهی اصلی و جانبی آنها نخواهد شد. کدامیک عاقلانهتر است؟ همهی صداها میگویند: دو! دو! دو!
در این مقاله، اکستنشن کوچکی برای مرورگرهای خانوادهی Chromium مینویسیم (من از Brave استفاده میکنم، گوگلکروم شیطان است) و از دور با ساختار یک اکستنشن آشنا میشویم.
حتی اکستنشنهای فایرفاکس هم یک فایل manifest.json دارند که اطلاعات اکستنشن از آنجا خوانده میشود. ما هم از این فایل شروع میکنیم:
{ "manifest_version": 3, "name": "ext-tut", "description": "This is just for learning purposes", "version": "1.0.0", "icons": { "48": "icon48.png", "128": "icon128.png" } }
از نسخهی مانیفست چشمپوشی کنید. در خط بعدی نام، توضیح و نسخهی اکستنشن را تعیین کردهایم و بعد آیکون اکستنشن را در دو سایز اضافه کردهایم. توجه داشته باشید که آیکونها باید در دایرکتوری جاری قرار گرفته باشند. فایل را سیو کرده و اکستنشن را به مرورگر اضافه میکنیم:
این اکستنشن، بیمصرفترین اکستنشن موجود در جهان است، زیرا هیچ قابلیتی را به مرورگر اضافه نمیکند و تنها آیکونی با نقاشی افتضاح من دارد! حالا مگر چه قابلیتی قرار است به مرورگر اضافه شود؟ Shareکردن در توئیتر!
اکستنشنها میتوانند به شیوههای مختلفی کار کنند؛ میتوانند به Eventهای مرورگر گوش کنند (Background scripts) یا اینکه در محتوای صفحاتی که باز میشوند، فراخوانی شوند (Content scripts) و هر کدام از اینها بسته به موقعیت و نیازمندی ما اضافه میشود. مثلاً ما به Content script نیاز داریم تا محتوایی را از داخل صفحه به توئیتر بفرستیم، زیرا Content scriptها قادر به خواندن و دستکاری DOM هستند.
برای این کار، باید کد خود را به اکستنشن معرفی کنیم، پس در فایل manifest.json خواهیم داشت:
"content_scripts": [ { "matches": [ "<all_urls>" ], "js": [ "main.js" ] } ]
فیلد matches تعیین میکند که این Content script در چه آدرسی عمل کند. فرض کنید که میخواهیم اکستنشنی بنویسیم که گزینهی دانلود را به انتهای پادکستهای گوگل اضافه کند، پس نیازی نداریم که اسکریپتمان در هر صفحهای لود شود و چنین چیزی خواهیم داشت:
"https://podcasts.google.com/*"
ما میخواهیم اسکریپتمان در هر صفحهی فراخوانی شود، پس <all_urls> چارهی کار است. در ادامه هم فایل main.js را معرفی کردهایم، پس فایلی با همین نام در پوشهی جاری بسازید. برای جلوگیری از کثیفکاری (ویرگول چرا Syntax highlighter ندارد؟) کدهای جاوااسکریپت را به صورت تصویر میگذارم (با تشکر از کربن):
اگر کمی جاوااسکریپت بلد باشید، میبینید که کار راحتی است! در بخش A دکمهای ساختهایم، به آن استایل و غیره دادهایم و به body اضافه کردهایم. در بخش B یک رویداد (Event) اضافه کردهایم که هر وقت متنی در داخل صفحه انتخاب شود، عمل میکند (این تکه را از این جواب گرفتهام) و متن انتخابشده را داخل document.highlighted میریزد. بعد در بخش C کدی نوشتهام که چک میکند که آیا طول متن انتخابشده از صفر بیشتر است یا نه (چیزی انتخاب شده یا نه؟!)، و بر اساس آن دکمهی Share را نشان میدهد یا مخفی میکند. ببینیم چه شد:
نکتهی کنکوری: لازم نیست که بعد از هر تغییری اکستنشن را حذف و اضافه کنید. در تصویر اول (بخش اکستنشنها) آیکون Refresh را میبینید که با کلیک روی آن، مرورگر به صورت خودجوش اکستنشن را آپدیت میکند.
تا این قسمت از مقاله کاری کردهایم که هر وقت قسمتی از متن Highlight شد، دکمهی شیر در پایین صفحه نمایش داده شود. مرحلهی بعد این است که اگر روی دکمه کلیک کردیم، متن انتخابی در توئیتر به اشتراک گذاشته شود:
document.getElementById('share-button').addEventListener('click', () => { window.open(`https://twitter.com/intent/tweet?text=${document.highlighted}`) })
حالا با کلیک روی دکمهی Share، پنجرهی اشتراکگذاری توئیتر باز میشود که نشان میدهد راه را درست رفتهایم:
در مرحلهی قبل موفق شدیم قسمتی از متن را انتخاب کنیم و با دکمهی Share در توئیتر به اشتراک بگذاریم. این خوب است، ولی کافی نیست. میتوانیم دکمهای در بالای مرورگر داشته باشیم که با آن آدرس صفحهی فعلی را هم در توئیتر به اشتراک بگذاریم. ابتدا کد زیر را به فایل manifest.json اضافه میکنیم:
"action": { "default_popup": "popup.html" }, "permissions": [ "tabs" ]
در قسمت اول، یک popup داریم که محتوای فایل popup.html را نشان میدهد و قسمت دوم هم permission است که مجوزهای خاصی را از مرورگر دریافت میکند. از آنجا که قصد داریم به URL تبها دسترسی داشته باشیم، باید مجوز tabs را از مرورگر بگیریم. محتوای فایلهای popup.html و popup.js را به ترتیب میبینید:
<!DOCTYPE html> <html> <body> <button id="share-url">Share</button> <script src="popup.js"> </body> </html>
document.getElementById('share-url').addEventListener('click', async () => { chrome.tabs.query({'active': true, 'lastFocusedWindow': true}, function (tabs) { window.open(`https://twitter.com/intent/tweet?url=${tabs[0].url}`) }) })
اتفاق عجیبی نیفتاده است! در صورت کلیک روی دکمهی Share، از اولین تبی که متد query برمیگرداند (که همان تب فعال و فعلی است) به پراپرتی url دسترسی پیدا کردهایم و تقریباً همان کار قبلی را انجام دادهایم.
تمام شد! ☺️
این مقاله تنها به شکل سطحی و مقدماتی به موضوع پرداخته است و هنوز مباحث بسیاری زیادی برای یادگیری باقی مانده است. شما میتوانید از قابلیتهای مختلف مرورگر بعد از اضافهکردن permissionشان استفاده کنید و ایدههای مختلفی را درون مرورگر بیاورید.
هرگز از مستندات غافل نشوید:
https://developer.chrome.com/docs/extensions/
اکستنشن اِشتب که قبلا نوشته بودم را بررسی کنید و در صورت تمایل روی ⭐️ کلیک کنید: