chrome.storage

الوصف

يمكنك استخدام واجهة برمجة التطبيقات chrome.storage لتخزين بيانات المستخدمين واستردادها وتتبُّعها.

الأذونات

storage

نظرة عامة

توفّر واجهة برمجة التطبيقات Storage API طريقة خاصة بالإضافة للاحتفاظ ببيانات المستخدم وحالته. وهي تشبه واجهات برمجة التطبيقات للتخزين في النظام الأساسي للويب (IndexedDB ومساحة التخزين)، ولكن تم تصميمه لتلبية احتياجات التخزين للإضافات. في ما يلي بعض الميزات الأساسية:

  • يمكن لجميع سياقات الإضافات، بما في ذلك مشغّل خدمات الإضافات والنصوص البرمجية للمحتوى الوصول إلى واجهة برمجة التطبيقات Storage.
  • وتُخزَّن قيم JSON القابلة للتسلسل كخصائص كائن.
  • إنّ واجهة برمجة التطبيقات Storage غير متزامنة مع عمليات القراءة والكتابة المجمّعة.
  • وحتى إذا محا المستخدم ذاكرة التخزين المؤقت وسجل التصفح، تظل البيانات محفوظة.
  • وتظل الإعدادات المخزنة حتى عند استخدام تقسيم التصفح المتخفي.
  • تتضمن مساحة تخزين مُدارة حصرية للقراءة فقط لسياسات المؤسسة.

مع أنّ الإضافات يمكنها استخدام واجهة [Storage][mdn-storage] (يمكن الوصول إليها من خلال window.localStorage) في بعض السياقات (النافذة المنبثقة وصفحات HTML الأخرى)، لا يُنصح باستخدامها للأسباب التالية:

  • يتعذّر على مشغّل الخدمات التابع للإضافة الوصول إلى Storage.
  • تشارك النصوص البرمجية للمحتوى مساحة التخزين مع صفحة المضيف.
  • لا يتم فقدان البيانات المحفوظة باستخدام واجهة Storage عندما يمحو المستخدم سجلّ التصفُّح.

لنقل البيانات من واجهات برمجة التطبيقات لتخزين الويب إلى واجهات برمجة تطبيقات تخزين الإضافات من مشغّل خدمات، اتّبِع الخطوات التالية:

  1. يمكنك إنشاء مستند خارج الشاشة باستخدام سلسلة إجراءات الإحالات الناجحة ومعالج [onMessage][on-message].
  2. يمكنك إضافة سلسلة إجراءات إحالات ناجحة إلى مستند خارج الشاشة.
  3. في مشغّل خدمات الإضافات، تحقَّق من "chrome.storage" بحثًا عن بياناتك.
  4. في حال لم يتم العثور على بياناتك، يمكنك [إنشاء][create-offscreen] مستند خارج الشاشة والاتصال بالرقم [sendMessage()][send-message] لبدء سلسلة إجراءات الإحالات الناجحة.
  5. داخل معالِج onMessage للمستند خارج الشاشة، يمكنك طلب سلسلة إجراءات الإحالات الناجحة.

هناك أيضًا بعض الفروق الطفيفة في آلية عمل واجهات برمجة تطبيقات تخزين الويب في الإضافات. يمكنك الاطّلاع على مزيد من المعلومات في مقالة [التخزين وملفات تعريف الارتباط][storage-and-cookies].

مناطق التخزين

يتم تقسيم واجهة برمجة التطبيقات Storage API إلى المجموعات الأربع التالية ("مناطق التخزين"):

storage.local
يتم تخزين البيانات محليًا، ويتم محوها عند إزالة الإضافة. يبلغ الحدّ الأقصى للحصة 10 ميغابايت تقريبًا، ولكن يمكن زيادته من خلال طلب إذن "unlimitedStorage". يمكنك استخدامه لتخزين كميات أكبر من البيانات.
storage.sync
في حال تفعيل المزامنة، تتم مزامنة البيانات مع أي متصفِّح Chrome سجّل المستخدم الدخول إليه. وإذا تم إيقافها، تعمل مثل storage.local. يخزِّن Chrome البيانات محليًا عند عدم اتصال المتصفّح ويستأنف المزامنة عند اتصاله بالإنترنت مرة أخرى. يبلغ الحدّ الأقصى للحصّة المحدّدة حوالي 100 كيلوبايت، أي 8 كيلوبايت لكل عنصر. يمكنك استخدامها للاحتفاظ بإعدادات المستخدم في جميع المتصفّحات التي تمت مزامنتها.
storage.session
يحتفظ بالبيانات في الذاكرة طوال مدة جلسة المتصفّح. ولا يتم عرضه تلقائيًا للنصوص البرمجية للمحتوى، ولكن يمكن تغيير هذا السلوك من خلال ضبط chrome.storage.session.setAccessLevel(). يبلغ الحد الأقصى للحصة المخصّصة لك 10 ميغابايت تقريبًا. ويمكنك استخدامه لتخزين المتغيّرات العمومية على مستوى عمليات تشغيل مشغّل الخدمات.
storage.managed
يمكن للمشرفين استخدام مخطط وسياسات المؤسسة لضبط إعدادات الإضافة الداعمة في بيئة مُدارة. مساحة التخزين هذه للقراءة فقط.

البيان

لاستخدام واجهة برمجة التطبيقات Storage، يجب الإفصاح عن إذن "storage" في الإضافة. البيان. على سبيل المثال:

{
  "name": "My extension",
  ...
  "permissions": [
    "storage"
  ],
  ...
}

الاستخدام

توضّح النماذج التالية السمات local وsync session مساحة تخزين:

storage.local

chrome.storage.local.set({ key: value }).then(() => {
  console.log("Value is set");
});

chrome.storage.local.get(["key"]).then((result) => {
  console.log("Value currently is " + result.key);
});

storage.sync

chrome.storage.sync.set({ key: value }).then(() => {
  console.log("Value is set");
});

chrome.storage.sync.get(["key"]).then((result) => {
  console.log("Value currently is " + result.key);
});

storage.session

chrome.storage.session.set({ key: value }).then(() => {
  console.log("Value was set");
});

chrome.storage.session.get(["key"]).then((result) => {
  console.log("Value currently is " + result.key);
});

للتعرُّف على مزيد من المعلومات حول مساحة التخزين في "managed"، يمكنك الاطّلاع على بيان مساحات التخزين.

حدود التخزين والتقييد

لا تفكر في الإضافة إلى واجهة برمجة تطبيقات التخزين على أنها وضع الأشياء في شاحنة كبيرة. فكر في الإضافة إلى التخزين مثل وضع شيء ما في ممر. قد يحتوي الممر على مواد بالفعل، ممتلئًا. افترض دائمًا وجود تأخير بين وقت الإضافة إلى سعة التخزين ووقت الإضافة تسجيل البيانات.

للحصول على تفاصيل عن حدود منطقة التخزين وما يحدث عند تجاوزها، يُرجى الاطّلاع على معلومات الحصة المسموح بها لكل من sync وlocal وsession.

حالات الاستخدام

توضّح الأقسام التالية حالات الاستخدام الشائعة لواجهة Storage API.

استجابة متزامنة لتعديلات مساحة التخزين

لتتبُّع التغييرات التي تم إجراؤها على مساحة التخزين، يمكنك إضافة أداة استماع إلى الحدث onChanged. وعند حدوث أي تغيير في مساحة التخزين، يتم تنشيط هذا الحدث. يرصد الرمز النموذجي هذه التغييرات:

background.js:

chrome.storage.onChanged.addListener((changes, namespace) => {
  for (let [key, { oldValue, newValue }] of Object.entries(changes)) {
    console.log(
      `Storage key "${key}" in namespace "${namespace}" changed.`,
      `Old value was "${oldValue}", new value is "${newValue}".`
    );
  }
});

يمكننا نقل هذه الفكرة إلى أبعد من ذلك. في هذا المثال، لدينا صفحة خيارات تسمح للمستخدم بتفعيل "وضع تصحيح الأخطاء" (عملية التنفيذ غير معروضة هنا). تحفظ صفحة الخيارات الإعدادات الجديدة فورًا في storage.sync، ويستخدم عامل الخدمة storage.onChanged لتطبيق الإعداد في أقرب وقت ممكن.

options.html:

<!-- type="module" allows you to use top level await -->
<script defer src="options.js" type="module"></script>
<form id="optionsForm">
  <label for="debug">
    <input type="checkbox" name="debug" id="debug">
    Enable debug mode
  </label>
</form>

options.js:

// In-page cache of the user's options
const options = {};
const optionsForm = document.getElementById("optionsForm");

// Immediately persist options changes
optionsForm.debug.addEventListener("change", (event) => {
  options.debug = event.target.checked;
  chrome.storage.sync.set({ options });
});

// Initialize the form with the user's option settings
const data = await chrome.storage.sync.get("options");
Object.assign(options, data.options);
optionsForm.debug.checked = Boolean(options.debug);

background.js:

function setDebugMode() { /* ... */ }

// Watch for changes to the user's options & apply them
chrome.storage.onChanged.addListener((changes, area) => {
  if (area === 'sync' && changes.options?.newValue) {
    const debugMode = Boolean(changes.options.newValue.debug);
    console.log('enable debug mode?', debugMode);
    setDebugMode(debugMode);
  }
});

التحميل المُسبق غير المتزامن من مساحة التخزين

بما أنّ مشغّلي الخدمات لا يستخدمون أجهزة دائمًا، تحتاج أحيانًا الإضافات المستنِدة إلى إصدار Manifest V3 إلى تحميل البيانات من مساحة التخزين بشكل غير متزامن قبل تنفيذ معالِجات الأحداث للقيام بذلك، يستخدم المقتطف التالي معالج أحداث action.onClicked غير متزامن ينتظر storageCache. عالميًا قبل تنفيذ منطقه.

background.js:

// Where we will expose all the data we retrieve from storage.sync.
const storageCache = { count: 0 };
// Asynchronously retrieve data from storage.sync, then cache it.
const initStorageCache = chrome.storage.sync.get().then((items) => {
  // Copy the data retrieved from storage into storageCache.
  Object.assign(storageCache, items);
});

chrome.action.onClicked.addListener(async (tab) => {
  try {
    await initStorageCache;
  } catch (e) {
    // Handle error that occurred during storage initialization.
  }

  // Normal action handler logic.
  storageCache.count++;
  storageCache.lastTabId = tab.id;
  chrome.storage.sync.set(storageCache);
});

أمثلة على الإضافات

لمشاهدة العروض التوضيحية الأخرى لواجهة Storage API، يمكنك الاطّلاع على أي من الأمثلة التالية:

الأنواع

AccessLevel

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

مستوى الوصول إلى مساحة التخزين

Enum

"TRUSTED_CONTEXTS"
تحديد السياقات التي تنشأ من الإضافة نفسها.

&quot;TRUSTED_AND_UNTRUSTED_CONTEXTS&quot;
تحديد السياقات التي تنشأ من خارج الإضافة.

StorageArea

أماكن إقامة

  • onChanged

    الحدث <functionuffful>

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

    يتم الإطلاق عند تغيير عنصر واحد أو أكثر.

    تبدو دالة onChanged.addListener كما يلي:

    (callback: function) => {...}

    • رد الاتصال

      دالة

      تظهر المَعلمة callback على النحو التالي:

      (changes: object) => void

      • التغييرات

        كائن

  • محو

    فراغ

    وعود

    إزالة كل الملفات من مساحة التخزين

    تبدو دالة clear كما يلي:

    (callback?: function) => {...}

    • رد الاتصال

      الدالة اختيارية

      تظهر المَعلمة callback على النحو التالي:

      () => void

    • returns

      وعود <باطلة>

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

      لا تتوفّر الوعود إلا مع إصدار Manifest V3 والإصدارات الأحدث، وتحتاج الأنظمة الأساسية الأخرى إلى استخدام عمليات معاودة الاتصال.

  • الحصول على

    فراغ

    وعود

    يحصل على عنصر واحد أو أكثر من مساحة التخزين.

    تبدو دالة get كما يلي:

    (keys?: string | string[] | object, callback?: function) => {...}

    • مفاتيح

      string | string[] | الكائن اختياري

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

    • رد الاتصال

      الدالة اختيارية

      تظهر المَعلمة callback على النحو التالي:

      (items: object) => void

      • items

        كائن

        كائن يحتوي على عناصر في تعيينات المفتاح/القيمة.

    • returns

      Promise&lt;object&gt;

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

      لا تتوفّر الوعود إلا مع إصدار Manifest V3 والإصدارات الأحدث، وتحتاج الأنظمة الأساسية الأخرى إلى استخدام عمليات معاودة الاتصال.

  • getBytesInUse

    فراغ

    وعود

    الحصول على مقدار المساحة (بالبايت) الذي يستخدمه عنصر أو أكثر.

    تبدو دالة getBytesInUse كما يلي:

    (keys?: string | string[], callback?: function) => {...}

    • مفاتيح

      string | string[] اختيارية

      مفتاح واحد أو قائمة مفاتيح لمعرفة إجمالي الاستخدام. ستعرض القائمة الفارغة القيمة 0. عليك اجتياز null للحصول على إجمالي استخدام كل مساحة التخزين.

    • رد الاتصال

      الدالة اختيارية

      تظهر المَعلمة callback على النحو التالي:

      (bytesInUse: number) => void

      • bytesInUse

        الرقم

        مقدار المساحة المستخدمة في مساحة التخزين بالبايت.

    • returns

      Promise&lt;number&gt;

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

      لا تتوفّر الوعود إلا مع إصدار Manifest V3 والإصدارات الأحدث، وتحتاج الأنظمة الأساسية الأخرى إلى استخدام عمليات معاودة الاتصال.

  • الحصول على مفاتيح

    فراغ

    وعود في انتظار المراجعة

    الحصول على جميع المفاتيح من مساحة التخزين

    تبدو دالة getKeys كما يلي:

    (callback?: function) => {...}

    • رد الاتصال

      الدالة اختيارية

      تظهر المَعلمة callback على النحو التالي:

      (keys: string[]) => void

      • مفاتيح

        سلسلة[]

        مصفوفة تتضمّن مفاتيح تتم قراءتها من مساحة التخزين

    • returns

      Promise&lt;string[]&gt;

      لا تتوفّر الوعود إلا مع إصدار Manifest V3 والإصدارات الأحدث، وتحتاج الأنظمة الأساسية الأخرى إلى استخدام عمليات معاودة الاتصال.

  • إزالة

    فراغ

    وعود

    يؤدي هذا الإجراء إلى إزالة عنصر واحد أو أكثر من مساحة التخزين.

    تبدو دالة remove كما يلي:

    (keys: string | string[], callback?: function) => {...}

    • مفاتيح

      string | سلسلة[]

      مفتاح فردي أو قائمة مفاتيح للعناصر المطلوب إزالتها.

    • رد الاتصال

      الدالة اختيارية

      تظهر المَعلمة callback على النحو التالي:

      () => void

    • returns

      وعود <باطلة>

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

      لا تتوفّر الوعود إلا مع إصدار Manifest V3 والإصدارات الأحدث، وتحتاج الأنظمة الأساسية الأخرى إلى استخدام عمليات معاودة الاتصال.

  • محدّدة

    فراغ

    وعود

    لضبط عناصر متعدّدة.

    تبدو دالة set كما يلي:

    (items: object, callback?: function) => {...}

    • items

      كائن

      كائن يتيح لكل زوج مفتاح/قيمة لتعديل مساحة التخزين باستخدامه. لن تتأثر أي أزواج مفاتيح/قيم أخرى في مساحة التخزين.

      سيتم ترتيب القيم الأساسية مثل الأرقام بشكل تسلسلي كما هو متوقع. إنّ القيم التي تتضمّن typeof "object" و"function" سيتم عادةً ترتيبها على شكل {}، باستثناء Array (التتتابع على النحو المتوقع) وDate وRegex (تسلسل باستخدام تمثيل String).

    • رد الاتصال

      الدالة اختيارية

      تظهر المَعلمة callback على النحو التالي:

      () => void

    • returns

      وعود <باطلة>

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

      لا تتوفّر الوعود إلا مع إصدار Manifest V3 والإصدارات الأحدث، وتحتاج الأنظمة الأساسية الأخرى إلى استخدام عمليات معاودة الاتصال.

  • setAccessLevel

    فراغ

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

    لضبط مستوى الوصول المطلوب لمنطقة التخزين. وستكون الإعدادات التلقائية هي السياقات الموثوق بها فقط.

    تبدو دالة setAccessLevel كما يلي:

    (accessOptions: object, callback?: function) => {...}

    • accessOptions

      كائن

      • accessLevel

        مستوى الوصول إلى مساحة التخزين.

    • رد الاتصال

      الدالة اختيارية

      تظهر المَعلمة callback على النحو التالي:

      () => void

    • returns

      وعود <باطلة>

      لا تتوفّر الوعود إلا مع إصدار Manifest V3 والإصدارات الأحدث، وتحتاج الأنظمة الأساسية الأخرى إلى استخدام عمليات معاودة الاتصال.

StorageChange

أماكن إقامة

  • newValue

    أي خيار اختياري

    القيمة الجديدة للعنصر، إذا كانت هناك قيمة جديدة.

  • oldValue

    أي خيار اختياري

    القيمة القديمة للعنصر، إذا كانت هناك قيمة قديمة.

أماكن إقامة

local

وتكون العناصر في مساحة تخزين "local" محلية لكل جهاز.

النوع

StorageArea و كائن

أماكن إقامة

  • QUOTA_BYTES

    10485760

    الحد الأقصى لمقدار البيانات (بالبايت) التي يمكن تخزينها في مساحة التخزين المحلية، وفقًا لقياس سلسلة JSON لكل قيمة بالإضافة إلى طول كل مفتاح. سيتم تجاهل هذه القيمة إذا كانت الإضافة تمتلك إذن unlimitedStorage. أمّا التعديلات التي ستؤدي إلى تجاوز هذا الحدّ، فسيتم تلقائيًا ضبطها على runtime.lastError عند استخدام معاودة الاتصال، أو ضبط وعود مرفوضة في حال استخدام "غير متزامن/انتظار".

managed

يتم ضبط العناصر في مساحة تخزين managed من خلال سياسة مؤسسة ضبطها مشرف النطاق، وتكون متاحة للقراءة فقط في الإضافة. تؤدي محاولة تعديل مساحة الاسم هذه إلى حدوث خطأ. للحصول على معلومات حول ضبط سياسة، يُرجى الاطّلاع على بيان مناطق التخزين.

النوع

session

الإصدار 102 من Chrome أو الإصدارات الأحدث MV3+

يتم تخزين العناصر في مساحة تخزين session في الذاكرة ولن يتم الاحتفاظ بها على القرص.

النوع

StorageArea و كائن

أماكن إقامة

  • QUOTA_BYTES

    10485760

    يشير ذلك المصطلح إلى الحد الأقصى لحجم البيانات (بالبايت) التي يمكن تخزينها في الذاكرة من خلال تقدير استخدام الذاكرة المخصّصة ديناميكيًا لكل قيمة ومفتاح. أمّا التعديلات التي تؤدي إلى تجاوز هذا الحدّ، فستتعذّر فورًا ويتم ضبط runtime.lastError عند استخدام معاودة الاتصال أو عند رفض وعود.

sync

تتم مزامنة العناصر في مساحة تخزين "sync" باستخدام "مزامنة Chrome".

النوع

StorageArea و كائن

أماكن إقامة

  • MAX_ITEMS

    512

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

  • MAX_SUSTAINED_WRITE_OPERATIONS_PER_MINUTE

    1000000

    متوقّفة نهائيًا

    لم تعد واجهة برمجة التطبيقات Storage.sync API تفرض حصة عمليات كتابة مستدامة.

  • MAX_WRITE_OPERATIONS_PER_HOUR

    1800

    الحد الأقصى لعدد العمليات set أو remove أو clear التي يمكن إجراؤها كل ساعة. وهو 1 كل ثانيتين، وهو حد أدنى من حد عمليات الكتابة في الدقيقة على المدى القصير.

    أمّا التعديلات التي تؤدي إلى تجاوز هذا الحدّ، فستتعذّر فورًا ويتم ضبط runtime.lastError عند استخدام معاودة الاتصال أو عند رفض وعود.

  • MAX_WRITE_OPERATIONS_PER_MINUTE

    120

    الحد الأقصى لعدد العمليات set أو remove أو clear التي يمكن إجراؤها كل دقيقة. وهي تبلغ 2 في الثانية، مما يوفر سرعة معالجة أعلى من عمليات الكتابة في الساعة خلال فترة زمنية أقصر.

    أمّا التعديلات التي تؤدي إلى تجاوز هذا الحدّ، فستتعذّر فورًا ويتم ضبط runtime.lastError عند استخدام معاودة الاتصال أو عند رفض وعود.

  • QUOTA_BYTES

    102400

    الحد الأقصى لإجمالي حجم البيانات (بالبايت) التي يمكن تخزينها في مساحة تخزين المزامنة، كما يتم قياسه من خلال سلسلة JSON لكل قيمة بالإضافة إلى طول كل مفتاح. أمّا التعديلات التي تؤدي إلى تجاوز هذا الحدّ، فستتعذّر فورًا ويتم ضبط runtime.lastError عند استخدام معاودة الاتصال أو عند رفض وعود.

  • QUOTA_BYTES_PER_ITEM

    8192

    الحد الأقصى للحجم (بالبايت) لكل عنصر فردي في مساحة تخزين المزامنة، ويتم قياسه من خلال سلسلة JSON لقيمته بالإضافة إلى طول المفتاح. لن يتم على الفور التحديثات التي تحتوي على عناصر يزيد حجمها عن هذا الحدّ وسيتم ضبط runtime.lastError عند استخدام معاودة الاتصال أو عند رفض وعود.

فعاليات

onChanged

chrome.storage.onChanged.addListener(
  callback: function,
)

يتم الإطلاق عند تغيير عنصر واحد أو أكثر.

المعلمات

  • رد الاتصال

    دالة

    تظهر المَعلمة callback على النحو التالي:

    (changes: object, areaName: string) => void

    • التغييرات

      كائن

    • areaName

      سلسلة