Lecture 18
Agenda
- Finishing / reviewing Round 3 proposals
- Discussing Chrome databases
- Page clipper IndexedDB activity
Storage Options in Chrome Extensions
Chrome extensions have access to three main types of storage mechanisms.
Each is suited to different use cases and has different permissions and limitations.
1. chrome.storage API
The official Chrome extension storage API.
Options:
-
chrome.storage.local- ✅ Stores data locally
- ✅ Asynchronous
- ❌ Not synced across devices
- 💾 Great for most general use cases
-
chrome.storage.sync- ✅ Syncs across devices (Google account)
- ⚠️ Limited to 100KB total, 8KB per item
- 🔄 Great for preferences/settings
-
chrome.storage.session(Manifest V3 only)- 🧪 Lives only while the extension is running
- ❌ Not persistent
- ✅ Asynchronous
- 🧠 Good for temporary, in-memory state
2. localStorage
- 🧱 Part of the Web Storage API
- ❌ Synchronous (can block)
- 💾 5MB quota
- 🔒 Tied to extension origin
- ⚠️ Not recommended for performance-critical apps
3. IndexedDB
- 💡 Full-featured client-side DB
- ✅ Asynchronous
- 💾 Stores complex objects & blobs
- 📊 Excellent for structured data, querying, and large datasets
- 🧠 Best for serious data needs
Finer points
Some of the details that might be confusing
Sync vs Async, Permissions, and Origins
🧠 Sync vs Async
-
Synchronous (sync):
- Blocking operations (e.g.,
localStorage) - Slows down performance, avoid in critical paths
- Blocking operations (e.g.,
-
Asynchronous (async):
- Non-blocking (e.g.,
chrome.storage,IndexedDB) - Uses callbacks or promises
- ✅ Recommended for all real-world use
- Non-blocking (e.g.,
🔐 Permissions in manifest.json
| Storage Type | Required Permission |
|---|---|
chrome.storage.* |
"storage" |
localStorage |
❌ No special permission |
IndexedDB |
❌ No special permission |
✅
chrome.storageneeds the"storage"permission in your manifest.
🌐 What is an "origin"?
-
An origin is the combination of:
protocol + domain + port- Example:
https://example.comis one originhttp://example.comis a different origin
-
In Chrome extensions:
- Your extension has its own origin, like
chrome-extension://<extension-id> -
localStorageandIndexedDBare scoped to your extension’s origin
- Your extension has its own origin, like
⚠️ Extensions cannot access webpage storage unless explicitly allowed.
Choosing your DB
in Chrome Extensions
Storage Comparison Table
| Storage | Max Size | Sync? | Async? | Recommended Use |
|---|---|---|---|---|
chrome.storage.local |
~5MB+ | ❌ | ✅ | General storage |
chrome.storage.sync |
100KB | ✅ | ✅ | User preferences |
chrome.storage.session |
Session | ❌ | ✅ | Temporary runtime state |
localStorage |
5MB | ❌ | ❌ | Quick hacks or legacy fallback |
| IndexedDB | Large | ❌ | ✅ | Large/structured data |
Which One Should You Use?
- 🔹 Use
chrome.storage.localfor most simple needs - 🔹 Use
chrome.storage.syncfor synced preferences/settings - 🔹 Use
chrome.storage.sessionfor transient states - 🔹 Use IndexedDB when you need power or scale
- 🔹 Avoid
localStorageunless you really know what you're doing

Challenge: What is the difference between the behavior or chrome.storage vs IndexedDB for JSON data?
Try storing the value { "key": 1 } ...
Lecture 18
By Jérémie Lumbroso