browser.userScripts

شرح

از userScripts API برای اجرای اسکریپت‌های کاربر در بافت «اسکریپت‌های کاربر» استفاده کنید.

اجازه‌ها

userScripts

برای استفاده از User Scripts API، browser.userScripts، اجازه "userScripts" را به manifest.json خود و "host_permissions" را برای سایت‌هایی که می‌خواهید اسکریپت‌ها را در آن‌ها اجرا کنید اضافه کنید.

{
  "name": "User script test extension",
  "manifest_version": 3,
  "minimum_chrome_version": "120",
  "permissions": [
    "userScripts"
  ],
  "host_permissions": [
    "*://example.com/*"
  ]
}

دردسترس بودن

Chrome 120+ browser.* از Chrome 148 MV3+

مفاهیم و کاربرد

اسکریپت کاربر تکه‌کدی است که به صفحه وب تزریق می‌شود تا ظاهر یا رفتار آن را تغییر دهد. برخلاف دیگر ویژگی‌های افزونه، مثل اسکریپت‌های محتوا و browser.scripting API، با User Scripts API می‌توانید کد دلخواه اجرا کنید. این میانای برنامه‌سازی کاربردی برای افزونه‌هایی لازم است که اسکریپت‌های ارائه‌شده توسط کاربر را اجرا می‌کنند و نمی‌توانند به‌عنوان بخشی از بسته افزونه شما ارسال شوند.

فعال کردن استفاده از میانای برنامه‌سازی کاربردی userScripts

پس‌از اینکه افزونه شما اجازه استفاده از userScripts API را دریافت کرد، کاربران باید کلید خاصی را فعال کنند تا به افزونه شما اجازه دهند از API استفاده کند. کلید خاص موردنیاز و رفتار API درصورت غیرفعال بودن، بسته به نسخه Chrome متفاوت است.

از بررسی زیر برای تعیین اینکه کاربر کدام کلید را باید فعال کند استفاده کنید، برای مثال، درطول آماده‌سازی کاربر جدید:

let version = Number(navigator.userAgent.match(/(Chrome|Chromium)\/([0-9]+)/)?.[2]);
if (version >= 138) {
  // Allow User Scripts toggle will be used.
} else {
  // Developer mode toggle will be used.
}

بخش‌های زیر کلیدهای مختلف و نحوه فعال کردن آن‌ها را شرح می‌دهد.

نسخه‌های Chrome قبل‌از ۱۳۸ (کلید حالت توسعه‌دهنده)

به‌عنوان توسعه‌دهنده افزونه، ازقبل «حالت توسعه‌دهنده» را در نسخه نصب‌شده Chrome خود فعال کرده‌اید. کاربرانتان نیز باید «حالت توسعه‌دهنده» را فعال کنند.

می‌توانید دستورالعمل‌های زیر را کپی کنید و در اسناد افزونه‌تان برای کاربران جای‌گذاری کنید

  1. با وارد کردن chrome://extensions در برگه جدید، به صفحه «افزونه‌ها» بروید. (طبق طراحی، نشانی‌های وب chrome:// قابل‌پیوند نیستند.)
  2. با کلیک کردن روی کلید کنار حالت توسعه‌دهنده، «حالت توسعه‌دهنده» را فعال کنید.

    صفحه «افزونه‌های Chrome» با کلید «حالت توسعه‌دهنده» برجسته‌شده

    صفحه افزونه‌ها (chrome://extensions)

Chrome نسخه ۱۳۸ و جدیدتر (کلید «مجاز کردن دستورگان کاربر»)

کلید روشن/خاموش مجاز کردن اسکریپت‌های کاربر در صفحه جزئیات هر افزونه (برای مثال، chrome://extensions/?id=YOUR_EXTENSION_ID) قرار دارد.

می‌توانید دستورالعمل‌های زیر را کپی و در مستندات افزونه‌تان برای کاربران جای‌گذاری کنید:

  1. با وارد کردن chrome://extensions در برگه جدید، به صفحه «افزونه‌ها» بروید. (طبق طراحی، نشانی‌های وب chrome:// قابل‌پیوند نیستند.)
  2. روی دکمه «جزئیات» در کارت افزونه کلیک کنید تا اطلاعات دقیق درباره افزونه را مشاهده کنید.
  3. روی کلید کنار مجاز کردن دستورگان کاربر کلیک کنید.
کلید روشن/خاموش «مجاز کردن دستورگان کاربر» در صفحه جزئیات افزونه
کلید روشن/خاموش «مجاز کردن دستورگان کاربر» (chrome://extensions/?id=abc...)

بررسی دردسترس بودن میانای برنامه‌سازی کاربردی

توصیه می‌کنیم برای تعیین اینکه userScripts API فعال است یا نه، بررسی زیر را انجام دهید، چون این بررسی در همه نسخه‌های Chrome کار می‌کند. این بررسی تلاش می‌کند روش browser.userScripts() را فراخوانی کند که همیشه باید درصورت دردسترس بودن API موفق شود. اگر این فراخوانی خطایی ایجاد کند، میانای برنامه‌سازی کاربردی دردسترس نیست:

function isUserScriptsAvailable() {
  try {
    // Method call which throws if API permission or toggle is not enabled.
    browser.userScripts.getScripts();
    return true;
  } catch {
    // Not available.
    return false;
  }
}

کار در دنیاهای مجزا

هر دو اسکریپت کاربر و محتوا می‌توانند در دنیای ایزوله یا در دنیای اصلی اجرا شوند. دنیای ایزوله محیط اجرایی است که برای صفحه میزبان یا افزونه‌های دیگر قابل‌دسترسی نیست. این به اسکریپت کاربر اجازه می‌دهد محیط جاوا اسکریپت خود را بدون تأثیر بر صفحه میزبان یا اسکریپت‌های کاربر و محتوای افزونه‌های دیگر تغییر دهد. برعکس، اسکریپت‌های کاربر (و اسکریپت‌های محتوا) برای صفحه میزبان یا اسکریپت‌های کاربر و محتوای افزونه‌های دیگر قابل‌مشاهده نیستند. دستورگان‌هایی که در دنیای اصلی اجرا می‌شوند برای صفحه‌های میزبان و سایر افزونه‌ها دردسترس هستند و برای صفحه‌های میزبان و سایر افزونه‌ها قابل‌مشاهده‌اند. برای انتخاب جهان، هنگام تماس با userScripts.register()، "USER_SCRIPT" یا "MAIN" را وارد کنید.

برای پیکربندی خط‌مشی امنیتی محتوا برای دنیای USER_SCRIPT، userScripts.configureWorld() را فراخوانی کنید:

browser.userScripts.configureWorld({
  csp: "script-src 'self'"
});

پیام‌رسانی

مانند اسکریپت‌های محتوا و اسناد خارج از صفحه، اسکریپت‌های کاربر بااستفاده از پیام‌رسانی با بخش‌های دیگر افزونه ارتباط برقرار می‌کنند (به این معنی که می‌توانند runtime.sendMessage() و runtime.connect() را مانند هر بخش دیگری از افزونه فراخوانی کنند). بااین‌حال، این رویدادها بااستفاده از کنترل‌کننده‌های رویداد اختصاصی دریافت می‌شوند (یعنی از onMessage یا onConnect استفاده نمی‌کنند). این کنترل‌کننده‌ها runtime.onUserScriptMessage و runtime.onUserScriptConnect نامیده می‌شوند. گرداننده‌های اختصاصی شناسایی پیام‌های دریافتی از اسکریپت‌های کاربر را که زمینه‌ای با اعتماد کمتر است آسان‌تر می‌کند.

قبل‌از ارسال پیام، باید configureWorld() را با آرگومان messaging تنظیم‌شده روی true فراخوانی کنید. توجه داشته باشید که هر دو متغیر مستقل csp و messaging را می‌توان هم‌زمان ارسال کرد.

browser.userScripts.configureWorld({
  messaging: true
});

به‌روزرسانی‌های افزونه

وقتی افزونه‌ای به‌روز می‌شود، اسکریپت‌های کاربر پاک می‌شود. می‌توانید آن‌ها را با اجرای کد در گرداننده رویداد runtime.onInstalled در کارگر سرویس افزونه دوباره اضافه کنید. فقط به "update" دلیل ارسال‌شده به فراخوان رویداد پاسخ دهید.

مثال

این مثال از نمونه userScript در مخزن نمونه‌های ما است.

ثبت کردن دستورگان

مثال زیر یک فراخوانی پایه به register() را نشان می‌دهد. آرگومان اول آرایه‌ای از اشیا است که اسکریپت‌های ثبت‌شدنی را تعریف می‌کند. گزینه‌های بیشتری نسبت به آنچه در اینجا نشان داده شده است وجود دارد.

browser.userScripts.register([{
  id: 'test',
  matches: ['*://*/*'],
  js: [{code: 'alert("Hi!")'}]
}]);

انواع

ExecutionWorld

دنیای جاوا اسکریپت برای اجرای اسکریپت کاربر در آن.

شمارشی

«MAIN»
محیط اجرای DOM را مشخص می‌کند که محیط اجرای مشترک با جاوا اسکریپت صفحه میزبان است.

"USER_SCRIPT"
محیط اجرایی را که مختص اسکریپت‌های کاربر است و از CSP صفحه معاف است مشخص می‌کند.

InjectionResult

Chrome نسخه ۱۳۵ و بالاتر browser.* ‎ از Chrome نسخه ۱۴۸

مشخصات

  • documentId

    رشته

    سند مرتبط با تزریق.

  • خطا

    رشته اختیاری

    خطا، درصورت وجود. error و result به‌صورت متقابل انحصاری‌اند.

  • frameId

    شماره

    قاب مرتبط با تزریق.

  • نتیجه

    هر اختیاری

    نتیجه اجرای متن.

InjectionTarget

Chrome نسخه ۱۳۵ و بالاتر browser.* ‎ از Chrome نسخه ۱۴۸

مشخصات

  • allFrames

    بولی اختیاری

    آیا اسکریپت باید به همه قاب‌های درون برگه تزریق شود یا نه. پیش‌فرض: نادرست. اگر frameIds مشخص شده باشد، این نباید درست باشد.

  • documentIds

    رشته[] اختیاری

    شناسه‌های documentIds خاص برای تزریق به آن. اگر frameIds تنظیم شده باشد، این مورد نباید تنظیم شود.

  • frameIds

    number[] اختیاری

    شناسه‌های قاب‌های خاصی که باید به آن‌ها تزریق شود.

  • tabId

    شماره

    شناسه برگه‌ای که باید تزریق در آن انجام شود.

RegisteredUserScript

مشخصات

  • allFrames

    بولی اختیاری

    اگر درست باشد، به همه قاب‌ها تزریق می‌شود، حتی اگر قاب بالاترین قاب در برگه نباشد. هر قاب به‌طور مستقل ازنظر الزامات نشانی وب بررسی می‌شود؛ اگر الزامات نشانی وب برآورده نشود، به قاب‌های فرزند تزریق نخواهد شد. به‌طور پیش‌فرض روی false تنظیم شده است، یعنی فقط قاب بالایی مطابقت داده می‌شود.

  • excludeGlobs

    رشته[] اختیاری

    الگوهای عام را برای صفحه‌هایی که این اسکریپت کاربر در آن‌ها تزریق نخواهد شد مشخص می‌کند.

  • excludeMatches

    رشته[] اختیاری

    صفحه‌هایی را که این اسکریپت کاربر درغیراین‌صورت به آن‌ها تزریق می‌شد مستثنی می‌کند. برای جزئیات بیشتر درباره نحو این رشته‌ها، الگوهای مطابقت را ببینید.

  • id

    رشته

    شناسه اسکریپت کاربر مشخص‌شده در فراخوانی میانای برنامه‌سازی کاربردی. این ویژگی نباید با «_» شروع شود زیرا به‌عنوان پیشوند برای شناسه‌های تولیدشده اسکریپت رزرو شده است.

  • includeGlobs

    رشته[] اختیاری

    الگوهای عام را برای صفحه‌هایی که این اسکریپت کاربر در آن‌ها تزریق خواهد شد مشخص می‌کند.

  • js

    ScriptSource[] اختیاری

    فهرست اشیای ScriptSource که منابع دستورگان را برای تزریق به صفحه‌های منطبق تعریف می‌کند. این ویژگی باید برای ${ref:register} مشخص شود و وقتی مشخص شد، باید آرایه‌ای غیرخالی باشد.

  • انطباق‌ها

    رشته[] اختیاری

    مشخص می‌کند این اسکریپت کاربر به کدام صفحه‌ها تزریق خواهد شد. برای جزئیات بیشتر درباره نحو این رشته‌ها، الگوهای مطابقت را ببینید. این ویژگی باید برای ${ref:register} مشخص شود.

  • runAt

    RunAt اختیاری

    مشخص می‌کند چه زمانی فایل‌های جاوا اسکریپت به صفحه وب تزریق می‌شوند. مقدار پیش‌فرض و ترجیحی document_idle است.

  • جهان

    ExecutionWorld اختیاری

    محیط اجرای جاوا اسکریپت برای اجرای دستورگان. پیش‌فرض `USER_SCRIPT` است.

  • worldId

    رشته اختیاری

    ‫Chrome نسخه ۱۳۳ و بالاتر browser.* ‎ از Chrome نسخه ۱۴۸

    شناسه جهان اسکریپت کاربر را برای اجرا در آن مشخص می‌کند. اگر حذف شود، اسکریپت در دنیای اسکریپت کاربر پیش‌فرض اجرا خواهد شد. فقط درصورتی معتبر است که world حذف شده باشد یا USER_SCRIPT باشد. مقادیری که با زیرخط (_) شروع می‌شوند رزرو شده‌اند.

ScriptSource

مشخصات

  • کد

    رشته اختیاری

    رشته‌ای که حاوی کد جاوا اسکریپت برای تزریق است. دقیقاً یکی از file یا code باید مشخص شود.

  • فایل

    رشته اختیاری

    مسیر فایل جاوا اسکریپت برای تزریق نسبت به دایرکتوری ریشه افزونه. دقیقاً یکی از file یا code باید مشخص شود.

UserScriptFilter

مشخصات

  • شناسه‌ها

    رشته[] اختیاری

    getScripts فقط اسکریپت‌هایی را برمی‌گرداند که شناسه‌هایشان در این فهرست مشخص شده است.

UserScriptInjection

Chrome نسخه ۱۳۵ و بالاتر browser.* ‎ از Chrome نسخه ۱۴۸

مشخصات

  • injectImmediately

    بولی اختیاری

    آیا تزریق باید در اسرع وقت در هدف راه‌اندازی شود یا نه. توجه داشته باشید که این تضمین نمی‌کند که تزریق قبل‌از بار شدن صفحه انجام شود، زیرا ممکن است صفحه تا زمانی که اسکریپت به هدف برسد بار شده باشد.

  • فهرست اشیای ScriptSource که منابع دستورگان را برای تزریق به هدف تعریف می‌کند.

  • جزئیاتی که هدف تزریق اسکریپت را مشخص می‌کند.

  • جهان

    ExecutionWorld اختیاری

    «جهان» جاوا اسکریپت برای اجرای دستورگان در آن. پیش‌فرض USER_SCRIPT است.

  • worldId

    رشته اختیاری

    شناسه جهان اسکریپت کاربر را برای اجرا در آن مشخص می‌کند. اگر حذف شود، اسکریپت در دنیای اسکریپت کاربر پیش‌فرض اجرا خواهد شد. فقط درصورتی معتبر است که world حذف شده باشد یا USER_SCRIPT باشد. مقادیری که با زیرخط (_) شروع می‌شوند رزرو شده‌اند.

WorldProperties

مشخصات

  • csp

    رشته اختیاری

    ‫world csp را مشخص می‌کند. پیش‌فرض `ISOLATED` world csp است.

  • پیام‌رسانی

    بولی اختیاری

    مشخص می‌کند که آیا میاناهای برنامه‌سازی کاربردی پیام‌رسانی درمعرض دید قرار گرفته‌اند یا نه. پیش‌فرض false است.

  • worldId

    رشته اختیاری

    ‫Chrome نسخه ۱۳۳ و بالاتر browser.* ‎ از Chrome نسخه ۱۴۸

    شناسه دنیای اسکریپت کاربر خاص را برای به‌روزرسانی مشخص می‌کند. اگر ارائه نشود، ویژگی‌های دنیای اسکریپت کاربر پیش‌فرض را به‌روز می‌کند. مقادیری که با زیرخط (_) شروع می‌شوند رزرو شده‌اند.

روش‌ها

configureWorld()

browser.userScripts.configureWorld(
  properties: WorldProperties,
)
: Promise<void>

محیط اجرای `USER_SCRIPT` را پیکربندی می‌کند.

پارامترها

  • اقامتگاه‌ها

    حاوی پیکربندی دنیای دستورگان کاربر است.

بازگشتی‌ها

  • Promise<void>

    Promise که پس‌از پیکربندی جهان حل می‌شود.

execute()

Chrome نسخه ۱۳۵ و بالاتر browser.* ‎ از Chrome نسخه ۱۴۸
browser.userScripts.execute(
  injection: UserScriptInjection,
)
: Promise<InjectionResult[]>

اسکریپتی را به بافت هدف تزریق می‌کند. به‌طور پیش‌فرض، اسکریپت در document_idle اجرا می‌شود، یا اگر صفحه قبلاً بار شده باشد، فوراً اجرا می‌شود. اگر ویژگی injectImmediately تنظیم شده باشد، تزریق اسکریپت بدون انتظار انجام می‌شود، حتی اگر بار کردن صفحه تمام نشده باشد. اگر اسکریپت به یک promise ارزیابی شود، مرورگر منتظر می‌ماند تا promise حل‌وفصل شود و مقدار حاصل را برمی‌گرداند.

پارامترها

بازگشتی‌ها

getScripts()

browser.userScripts.getScripts(
  filter?: UserScriptFilter,
)
: Promise<RegisteredUserScript[]>

همه اسکریپت‌های کاربر ثبت‌شده به‌صورت پویا را برای این افزونه برمی‌گرداند.

پارامترها

  • فیلتر کردن

    UserScriptFilter اختیاری

    اگر مشخص شده باشد، این روش فقط اسکریپت‌های کاربری را که با آن مطابقت دارد برمی‌گرداند.

بازگشتی‌ها

  • قولی که با دستورگان ثبت‌شده حل می‌شود. اگر خطایی رخ دهد، وعده رد خواهد شد.

getWorldConfigurations()

‫Chrome نسخه ۱۳۳ و بالاتر browser.* ‎ از Chrome نسخه ۱۴۸
browser.userScripts.getWorldConfigurations(): Promise<WorldProperties[]>

همه پیکربندی‌های ثبت‌شده جهان را بازیابی می‌کند.

بازگشتی‌ها

  • Promise<WorldProperties[]>

    Promise که با پیکربندی‌های ثبت‌شده جهان حل می‌شود.

register()

browser.userScripts.register(
  scripts: RegisteredUserScript[],
)
: Promise<void>

یک یا چند اسکریپت کاربر را برای این افزونه ثبت می‌کند.

پارامترها

  • متن‌ها

    حاوی فهرستی از اسکریپت‌های کاربر برای ثبت است.

بازگشتی‌ها

  • Promise<void>

    Promise که پس‌از ثبت کامل اسکریپت‌ها حل می‌شود. اگر خطایی رخ دهد، وعده رد خواهد شد.

resetWorldConfiguration()

‫Chrome نسخه ۱۳۳ و بالاتر browser.* ‎ از Chrome نسخه ۱۴۸
browser.userScripts.resetWorldConfiguration(
  worldId?: string,
)
: Promise<void>

پیکربندی را برای دنیای دستورگان کاربر بازنشانی می‌کند. هر اسکریپتی که با شناسه مشخص‌شده به جهان تزریق شود، از پیکربندی پیش‌فرض جهان استفاده خواهد کرد.

پارامترها

  • worldId

    رشته اختیاری

    شناسه دنیای دستورگان کاربر برای بازنشانی. اگر حذف شود، پیکربندی دنیای پیش‌فرض را بازنشانی می‌کند.

بازگشتی‌ها

  • Promise<void>

    Promise که وقتی پیکربندی بازنشانی می‌شود، حل می‌شود.

unregister()

browser.userScripts.unregister(
  filter?: UserScriptFilter,
)
: Promise<void>

ثبت همه اسکریپت‌های کاربر ثبت‌شده به‌صورت پویا را برای این افزونه لغو می‌کند.

پارامترها

  • فیلتر کردن

    UserScriptFilter اختیاری

    اگر مشخص شده باشد، این روش فقط ثبت‌نام اسکریپت‌های کاربری را که با آن مطابقت دارند لغو می‌کند.

بازگشتی‌ها

  • Promise<void>

    Promise that resolves once scripts have been fully unregistered. اگر خطایی رخ دهد، وعده رد خواهد شد.

update()

browser.userScripts.update(
  scripts: RegisteredUserScript[],
)
: Promise<void>

یک یا چند اسکریپت کاربر را برای این افزونه به‌روز می‌کند.

پارامترها

  • متن‌ها

    حاوی فهرستی از اسکریپت‌های کاربر برای به‌روزرسانی است. یک ویژگی فقط برای اسکریپت موجود به‌روزرسانی می‌شود اگر در این شیء مشخص شده باشد. اگر درطول تجزیه اسکریپت/اعتبارسنجی فایل خطایی رخ دهد، یا اگر شناسه‌های مشخص‌شده با اسکریپت کاملاً ثبت‌شده مطابقت نداشته باشند، هیچ اسکریپتی به‌روز نمی‌شود.

بازگشتی‌ها

  • Promise<void>

    Promise که پس‌از به‌روزرسانی کامل اسکریپت‌ها حل می‌شود. اگر خطایی رخ دهد، وعده رد خواهد شد.