الوصف
يمكنك استخدام واجهة برمجة التطبيقات chrome.storage
لتخزين بيانات المستخدمين واستردادها وتتبُّعها.
الأذونات
storage
لاستخدام واجهة برمجة التطبيقات Storage، يجب الإفصاح عن إذن "storage"
في الإضافة.
البيان. على سبيل المثال:
{
"name": "My extension",
...
"permissions": [
"storage"
],
...
}
المفاهيم والاستخدام
توفّر واجهة برمجة التطبيقات Storage API طريقة خاصة بالإضافة للاحتفاظ ببيانات المستخدم وحالته. وهي تشبه واجهات برمجة التطبيقات للتخزين في النظام الأساسي للويب (IndexedDB ومساحة التخزين)، ولكن تم تصميمه لتلبية احتياجات التخزين للإضافات. في ما يلي بعض الميزات الأساسية:
- يمكن لجميع سياقات الإضافات، بما في ذلك مشغّل خدمات الإضافات والنصوص البرمجية للمحتوى الوصول إلى واجهة برمجة التطبيقات Storage.
- وتُخزَّن قيم JSON القابلة للتسلسل كخصائص كائن.
- إنّ واجهة برمجة التطبيقات Storage غير متزامنة مع عمليات القراءة والكتابة المجمّعة.
- وحتى إذا محا المستخدم ذاكرة التخزين المؤقت وسجل التصفح، تظل البيانات محفوظة.
- وتظل الإعدادات المخزنة حتى عند استخدام تقسيم التصفح المتخفي.
- تتضمن مساحة تخزين مُدارة حصرية للقراءة فقط لسياسات المؤسسة.
هل يمكن للإضافات استخدام واجهات برمجة تطبيقات التخزين على الويب؟
مع أنّ الإضافات يمكن أن تستخدم واجهة Storage
(يمكن الوصول إليها من خلال window.localStorage
) في بعض السياقات (النافذة المنبثقة وصفحات HTML الأخرى)، لا ننصح باستخدامها للأسباب التالية:
- لا يمكن لمشغّلي خدمات الإضافات استخدام Web Storage API.
- تشارك النصوص البرمجية للمحتوى مساحة التخزين مع صفحة المضيف.
- تُفقد البيانات المحفوظة باستخدام Web Storage API عندما يمحو المستخدم سجلّ التصفُّح.
لنقل البيانات من واجهات برمجة التطبيقات لتخزين الويب إلى واجهات برمجة تطبيقات تخزين الإضافات من مشغّل خدمات، اتّبِع الخطوات التالية:
- إعداد صفحة HTML للمستند خارج الشاشة وملف البرنامج النصي. يجب أن يحتوي ملف النص البرمجي على سلسلة إجراءات إحالات ناجحة ومعالج
onMessage
. - في مشغّل خدمات الإضافات، ابحث عن بياناتك في "
chrome.storage
". - إذا لم يتم العثور على بياناتك، اتّصِل بالرقم
createDocument()
. - بعد حلّ وعود الإحالة التي تم إرجاعها، اتصِل بالرقم
sendMessage()
لبدء سلسلة إجراءات الإحالات الناجحة. - داخل معالِج
onMessage
للمستند خارج الشاشة، يمكنك طلب سلسلة إجراءات الإحالات الناجحة.
هناك أيضًا بعض الفروق الطفيفة في آلية عمل واجهات برمجة تطبيقات تخزين الويب في الإضافات. يمكنك الاطّلاع على مزيد من المعلومات في مقالة التخزين وملفات تعريف الارتباط.
مناطق التخزين
يتم تقسيم واجهة برمجة التطبيقات Storage API إلى مناطق التخزين التالية:
storage.local
- يتم تخزين البيانات محليًا ومحوها عند إزالة الإضافة. يبلغ الحد الأقصى المسموح به لمساحة التخزين 10 ميغابايت (5 ميغابايت في الإصدار 113 من Chrome والإصدارات الأقدم)، ولكن يمكن زيادته من خلال طلب إذن
"unlimitedStorage"
. وننصح باستخدامstorage.local
لتخزين كميات أكبر من البيانات. storage.managed
- مساحة التخزين المُدارة هي مساحة تخزين للقراءة فقط للإضافات المثبَّتة بموجب السياسات، ويديرها مشرفو النظام باستخدام مخطط يحدِّد المطوّر وسياسات المؤسسة. تشبه السياسات الخيارات ولكن يتم ضبطها من قِبل مشرف النظام بدلاً من المستخدم، ما يسمح بإجراء عملية ضبط مُسبَق للإضافة لجميع مستخدمي المؤسسة. للحصول على معلومات عن السياسات، يُرجى الاطّلاع على مستندات للمشرفين. للتعرُّف على مزيد من المعلومات حول مساحة التخزين في "
managed
"، يُرجى الاطّلاع على بيان مساحات التخزين. storage.session
- يحتفظ بالبيانات في الذاكرة طوال مدة جلسة المتصفّح. ولا يتم عرضه تلقائيًا للنصوص البرمجية للمحتوى، ولكن يمكن تغيير هذا السلوك من خلال ضبط
chrome.storage.session.setAccessLevel()
. الحد الأقصى المسموح به لمساحة التخزين هو 10 ميغابايت (1 ميغابايت في الإصدار 111 من Chrome والإصدارات الأقدم). تُعد واجهةstorage.session
واحدة من واجهات برمجة التطبيقات التي ننصح بها للعاملين. storage.sync
- في حال تفعيل المزامنة، تتم مزامنة البيانات مع أي متصفِّح Chrome سجّل المستخدم الدخول إليه. وإذا تم إيقافها، تعمل مثل
storage.local
. يخزِّن Chrome البيانات محليًا عند عدم اتصال المتصفّح ويستأنف المزامنة عند اتصاله بالإنترنت مرة أخرى. يبلغ الحدّ الأقصى للحصّة المحدّدة حوالي 100 كيلوبايت، أي 8 كيلوبايت لكل عنصر. ننصحك باستخدام ميزة "storage.sync
" للاحتفاظ بإعدادات المستخدم في جميع المتصفّحات التي تمت مزامنتها. إذا كنت تستخدم بيانات المستخدمين الحساسة، استخدِمstorage.session
بدلاً من ذلك.
حدود التخزين والتقييد
تفرض خدمة Storage API قيود الاستخدام التالية:
- غالبًا ما تأتي تكاليف الأداء مع تخزين البيانات، وتتضمّن واجهة برمجة التطبيقات حصصًا للتخزين. ننصحك بتوخي الحذر بشأن البيانات التي تخزنها حتى لا تفقد إمكانية تخزين البيانات.
- قد يستغرق اكتمال مساحة التخزين بعض الوقت. تأكد من هيكلة التعليمة البرمجية لحساب هذا الوقت.
للحصول على تفاصيل عن قيود منطقة التخزين وما يحدث عند تجاوزها، يُرجى الاطّلاع على معلومات الحصة المسموح بها لكل من 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);
});
أمثلة
توضّح النماذج التالية السمات local
وsync
session
مساحة تخزين:
بالتوقيت المحلي
chrome.storage.local.set({ key: value }).then(() => {
console.log("Value is set");
});
chrome.storage.local.get(["key"]).then((result) => {
console.log("Value is " + result.key);
});
مزامنة
chrome.storage.sync.set({ key: value }).then(() => {
console.log("Value is set");
});
chrome.storage.sync.get(["key"]).then((result) => {
console.log("Value is " + result.key);
});
الجلسة
chrome.storage.session.set({ key: value }).then(() => {
console.log("Value was set");
});
chrome.storage.session.get(["key"]).then((result) => {
console.log("Value is " + result.key);
});
لمشاهدة العروض التوضيحية الأخرى لواجهة Storage API، استكشِف أيًا من النماذج التالية:
الأنواع
AccessLevel
مستوى الوصول إلى مساحة التخزين
Enum
"TRUSTED_CONTEXTS"
تحديد السياقات التي تنشأ من الإضافة نفسها.
"TRUSTED_AND_UNTRUSTED_CONTEXTS"
تحديد السياقات التي تنشأ من خارج الإضافة.
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<object>
الإصدار 88 من Chrome أو الإصدارات الأحدثتتوفّر الوعود في الإصدار Manifest V3 والإصدارات الأحدث، ولكن يتم توفير معاودة الاتصال. التوافق مع الأنظمة القديمة. لا يمكنك استخدام كلتيهما في نفس استدعاء الدالة. تشير رسالة الأشكال البيانية يتم حل الوعد بنفس النوع الذي يتم إرساله إلى معاودة الاتصال.
-
-
getBytesInUse
فراغ
وعودالحصول على مقدار المساحة (بالبايت) الذي يستخدمه عنصر أو أكثر.
تبدو دالة
getBytesInUse
كما يلي:(keys?: string | string[], callback?: function) => {...}
-
مفاتيح
string | string[] اختيارية
مفتاح واحد أو قائمة مفاتيح لمعرفة إجمالي الاستخدام. ستعرض القائمة الفارغة القيمة 0. عليك اجتياز
null
للحصول على إجمالي استخدام كل مساحة التخزين. -
رد الاتصال
الدالة اختيارية
تظهر المَعلمة
callback
على النحو التالي:(bytesInUse: number) => void
-
bytesInUse
الرقم
مقدار المساحة المستخدمة في مساحة التخزين بالبايت.
-
-
returns
Promise<number>
الإصدار 88 من Chrome أو الإصدارات الأحدثتتوفّر الوعود في الإصدار Manifest V3 والإصدارات الأحدث، ولكن يتم توفير معاودة الاتصال. التوافق مع الأنظمة القديمة. لا يمكنك استخدام كلتيهما في نفس استدعاء الدالة. تشير رسالة الأشكال البيانية يتم حل الوعد بنفس النوع الذي يتم إرساله إلى معاودة الاتصال.
-
-
الحصول على مفاتيح
فراغ
وعود في انتظار المراجعةالحصول على جميع المفاتيح من مساحة التخزين
تبدو دالة
getKeys
كما يلي:(callback?: function) => {...}
-
رد الاتصال
الدالة اختيارية
تظهر المَعلمة
callback
على النحو التالي:(keys: string[]) => void
-
مفاتيح
سلسلة[]
مصفوفة تتضمّن مفاتيح تتم قراءتها من مساحة التخزين
-
-
returns
Promise<string[]>
تتوفّر الوعود في الإصدار 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
يتم تخزين العناصر في مساحة تخزين 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
سلسلة
-