chrome.scripting (original) (raw)

الوصف

استخدِم واجهة برمجة التطبيقات chrome.scripting لتنفيذ نص برمجي في سياقات مختلفة.

الأذونات

scripting

مدى التوفّر

‫Chrome 88 والإصدارات الأحدثMV3+

البيان

لاستخدام واجهة برمجة التطبيقات chrome.scripting، يجب تضمين الإذن "scripting" في ملف البيان بالإضافة إلى أذونات المضيف للصفحات التي سيتم إدراج النصوص البرمجية فيها. استخدِم المفتاح "host_permissions" أو الإذن "activeTab" الذي يمنح أذونات مضيف مؤقتة. يستخدم المثال التالي إذن activeTab.

{
  "name": "Scripting Extension",
  "manifest_version": 3,
  "permissions": ["scripting", "activeTab"],
  ...
}

المفاهيم والاستخدام

يمكنك استخدام واجهة برمجة التطبيقات chrome.scripting لإدخال JavaScript وCSS في المواقع الإلكترونية. وهذا يشبه ما يمكنك تنفيذه باستخدام برامج نصية خاصة بالمحتوى. ولكن باستخدام مساحة الاسم chrome.scripting، يمكن للإضافات اتخاذ قرارات في وقت التشغيل.

الاستهدافات المتداخلة

يمكنك استخدام المَعلمة target لتحديد عنصر مستهدَف يتم إدراج JavaScript أو CSS فيه.

الحقل المطلوب الوحيد هو tabId. سيتم تلقائيًا تنفيذ عملية الإدخال في الإطار الرئيسي لعلامة التبويب المحدّدة.

function getTabId() { ... }

chrome.scripting
    .executeScript({
      target : {tabId : getTabId()},
      files : [ "script.js" ],
    })
    .then(() => console.log("script injected"));

للتشغيل في جميع إطارات علامة التبويب المحدّدة، يمكنك ضبط قيمة allFrames المنطقية على true.

function getTabId() { ... }

chrome.scripting
    .executeScript({
      target : {tabId : getTabId(), allFrames : true},
      files : [ "script.js" ],
    })
    .then(() => console.log("script injected in all frames"));

يمكنك أيضًا إدخال محتوى في إطارات محدّدة من علامة تبويب من خلال تحديد أرقام تعريف الإطارات الفردية. لمزيد من المعلومات حول أرقام تعريف الإطارات، يُرجى الاطّلاع على chrome.webNavigationواجهة برمجة التطبيقات.

function getTabId() { ... }

chrome.scripting
    .executeScript({
      target : {tabId : getTabId(), frameIds : [ frameId1, frameId2 ]},
      files : [ "script.js" ],
    })
    .then(() => console.log("script injected on target frames"));

الرمز المُدخَل

يمكن للإضافات تحديد الرمز البرمجي الذي سيتم إدراجه إما من خلال ملف خارجي أو متغيّر وقت التشغيل.

الملفات

يتم تحديد الملفات كسلاسل تمثّل مسارات ذات صلة بالدليل الجذري للإضافة. سيؤدي الرمز التالي إلى إدراج الملف script.js في الإطار الرئيسي لعلامة التبويب.

function getTabId() { ... }

chrome.scripting
    .executeScript({
      target : {tabId : getTabId()},
      files : [ "script.js" ],
    })
    .then(() => console.log("injected script file"));

دوال وقت التشغيل

عند إدخال JavaScript باستخدام scripting.executeScript()، يمكنك تحديد دالة سيتم تنفيذها بدلاً من ملف. يجب أن تكون هذه الدالة متغيّر دالة متاحًا لسياق الإضافة الحالي.

function getTabId() { ... }
function getTitle() { return document.title; }

chrome.scripting
    .executeScript({
      target : {tabId : getTabId()},
      func : getTitle,
    })
    .then(() => console.log("injected a function"));
function getTabId() { ... }
function getUserColor() { ... }

function changeBackgroundColor() {
  document.body.style.backgroundColor = getUserColor();
}

chrome.scripting
    .executeScript({
      target : {tabId : getTabId()},
      func : changeBackgroundColor,
    })
    .then(() => console.log("injected a function"));

يمكنك حلّ هذه المشكلة باستخدام الموقع args:

function getTabId() { ... }
function getUserColor() { ... }
function changeBackgroundColor(backgroundColor) {
  document.body.style.backgroundColor = backgroundColor;
}

chrome.scripting
    .executeScript({
      target : {tabId : getTabId()},
      func : changeBackgroundColor,
      args : [ getUserColor() ],
    })
    .then(() => console.log("injected a function"));

سلاسل وقت التشغيل

في حال إدراج CSS ضمن صفحة، يمكنك أيضًا تحديد سلسلة لاستخدامها في السمة css. لا يتوفّر هذا الخيار إلا لـ scripting.insertCSS()، ولا يمكنك تنفيذ سلسلة باستخدام scripting.executeScript().

function getTabId() { ... }
const css = "body { background-color: red; }";

chrome.scripting
    .insertCSS({
      target : {tabId : getTabId()},
      css : css,
    })
    .then(() => console.log("CSS injected"));

التعامل مع النتائج

يتم تمرير نتائج تنفيذ JavaScript إلى الإضافة. يتم تضمين نتيجة واحدة لكل إطار. يُضمَن أن يكون الإطار الرئيسي هو الفهرس الأول في المصفوفة الناتجة، أما جميع الإطارات الأخرى، فيتم ترتيبها بشكل غير محدد.

function getTabId() { ... }
function getTitle() { return document.title; }

chrome.scripting
    .executeScript({
      target : {tabId : getTabId(), allFrames : true},
      func : getTitle,
    })
    .then(injectionResults => {
      for (const {frameId, result} of injectionResults) {
        console.log(`Frame ${frameId} result:`, result);
      }
    });

لا تعرض scripting.insertCSS() أي نتائج.

الوعود

إذا كانت القيمة الناتجة عن تنفيذ البرنامج النصي عبارة عن وعد، سينتظر Chrome إلى أن يتم تنفيذ الوعد ويعرض القيمة الناتجة.

function getTabId() { ... }
async function addIframe() {
  const iframe = document.createElement("iframe");
  const loadComplete =
      new Promise(resolve => iframe.addEventListener("load", resolve));
  iframe.src = "https://example.com";
  document.body.appendChild(iframe);
  await loadComplete;
  return iframe.contentWindow.document.title;
}

chrome.scripting
    .executeScript({
      target : {tabId : getTabId(), allFrames : true},
      func : addIframe,
    })
    .then(injectionResults => {
      for (const frameResult of injectionResults) {
        const {frameId, result} = frameResult;
        console.log(`Frame ${frameId} result:`, result);
      }
    });

أمثلة

إلغاء تسجيل جميع نصوص المحتوى البرمجية الديناميكية

تحتوي المقتطفة التالية على دالة تلغي تسجيل جميع النصوص البرمجية الخاصة بالمحتوى الديناميكي التي سبق أن سجّلتها الإضافة.

async function unregisterAllDynamicContentScripts() {
  try {
    const scripts = await chrome.scripting.getRegisteredContentScripts();
    const scriptIds = scripts.map(script => script.id);
    return chrome.scripting.unregisterContentScripts({ ids: scriptIds });
  } catch (error) {
    const message = [
      "An unexpected error occurred while",
      "unregistering dynamic content scripts.",
    ].join(" ");
    throw new Error(message, {cause : error});
  }
}

لتجربة واجهة برمجة التطبيقات chrome.scripting، ثبِّت نموذج البرمجة من مستودع نماذج إضافات Chrome.

الأنواع

ContentScriptFilter

الإصدار 96 من Chrome والإصدارات الأحدث

الخصائص

CSSInjection

الخصائص

ExecutionWorld

الإصدار 95 من Chrome والإصدارات الأحدث

بيئة JavaScript التي سيتم تنفيذ النص البرمجي فيها

Enum

‫"ISOLATED"
تحدّد هذه السمة البيئة المعزولة، وهي بيئة التنفيذ الفريدة لهذه الإضافة.

"MAIN"
تحدّد هذه السمة العالم الرئيسي لنموذج المستند (DOM)، وهو بيئة التنفيذ المشترَكة مع JavaScript في الصفحة المضيفة.

InjectionResult

الخصائص

InjectionTarget

الخصائص

RegisteredContentScript

الإصدار 96 من Chrome والإصدارات الأحدث

الخصائص

ScriptInjection

الخصائص

StyleOrigin

تمثّل هذه السمة مصدر تغيير النمط. يمكنك الاطّلاع على مصادر الأنماط للحصول على مزيد من المعلومات.

Enum

الطُرق

executeScript()

chrome.scripting.executeScript(
  injection: ScriptInjection,
): Promise<InjectionResult[]>

يتيح هذا الإذن إدخال نص برمجي في سياق مستهدف. سيتم تشغيل النص البرمجي تلقائيًا في document_idle، أو فورًا إذا تم تحميل الصفحة من قبل. في حال ضبط السمة injectImmediately، سيتم إدراج النص البرمجي بدون انتظار، حتى إذا لم ينتهِ تحميل الصفحة. إذا تم تقييم النص البرمجي على أنّه وعد، سينتظر المتصفّح إلى أن يتم تنفيذ الوعد ويعرض القيمة الناتجة.

المعلمات

المرتجعات

getRegisteredContentScripts()

الإصدار 96 من Chrome والإصدارات الأحدث

chrome.scripting.getRegisteredContentScripts(
  filter?: ContentScriptFilter,
): Promise<RegisteredContentScript[]>

تعرض هذه الطريقة جميع نصوص المحتوى البرمجية المسجّلة ديناميكيًا لهذه الإضافة والتي تتطابق مع الفلتر المحدّد.

المعلمات

المرتجعات

insertCSS()

chrome.scripting.insertCSS(
  injection: CSSInjection,
): Promise

تُدرِج ورقة أنماط CSS في سياق مستهدَف. في حال تحديد إطارات متعدّدة، يتم تجاهل عمليات الإدخال غير الناجحة.

المعلمات

المرتجعات

registerContentScripts()

الإصدار 96 من Chrome والإصدارات الأحدث

chrome.scripting.registerContentScripts(
  scripts: RegisteredContentScript[],
): Promise

تسجّل هذه السمة نصًا برمجيًا واحدًا أو أكثر للمحتوى الخاص بهذه الإضافة.

المعلمات

المرتجعات

removeCSS()

Chrome 90 والإصدارات الأحدث

chrome.scripting.removeCSS(
  injection: CSSInjection,
): Promise

تزيل هذه الدالة ورقة أنماط CSS سبق أن أدرجتها هذه الإضافة من سياق مستهدف.

المعلمات

المرتجعات

unregisterContentScripts()

الإصدار 96 من Chrome والإصدارات الأحدث

chrome.scripting.unregisterContentScripts(
  filter?: ContentScriptFilter,
): Promise

لإلغاء تسجيل نصوص المحتوى البرمجية لهذه الإضافة

المعلمات

المرتجعات

updateContentScripts()

الإصدار 96 من Chrome والإصدارات الأحدث

chrome.scripting.updateContentScripts(
  scripts: RegisteredContentScript[],
): Promise

تعدّل هذه السمة نصًا برمجيًا واحدًا أو أكثر من نصوص المحتوى البرمجية لهذه الإضافة.

المعلمات

المرتجعات