This skill should be used when working on Chrome extension permissions or Chrome Web Store compliance. Trigger when: declaring extension permissions, "manifest permissions", "activeTab vs tabs", "optional_permissions", "host_permissions", "Chrome Web Store rejection", "permission minimization", "over-permissioning", "CWS review", "Purple Potassium", "extension permission audit", "narrowest permission", "permission warnings", "chrome.permissions.request", "permission justification".
Scanned 9/12/2026
Install to Claude Code
npx -y skills add aibot88/sec_skill_store --skill chrome-ext-permissions --agent claude-codeInstalls into .claude/skills of the current project.
Are you the author of Chrome Ext Permissions?
Add the live security badge to your README — it updates automatically with every re-scan.
[](https://www.skillsdirectory.com/skills/aibot88-chrome-ext-permissions)More formats (shields.io, HTML) on the badges page.
---
name: chrome-ext-permissions
description: >
This skill should be used when working on Chrome extension permissions or Chrome Web Store
compliance. Trigger when: declaring extension permissions, "manifest permissions", "activeTab
vs tabs", "optional_permissions", "host_permissions", "Chrome Web Store rejection",
"permission minimization", "over-permissioning", "CWS review", "Purple Potassium",
"extension permission audit", "narrowest permission", "permission warnings",
"chrome.permissions.request", "permission justification".
---
# Chrome Extension Permissions
The principle of least privilege governs all permission decisions. Request only what the extension actively uses today — never future-proof permissions. Approximately 70% of submitted extensions over-request permissions. Over-permissioning triggers CWS rejections, alarming install warnings, and longer review cycles.
## Permission Decision Rules
### activeTab vs. tabs vs. host_permissions
| Need | Use | Why |
|------|-----|-----|
| Temporary access after user click | `activeTab` | No install warning, minimal scope |
| Read URL/title of tabs without host access | `tabs` | Required for `tab.url`, `tab.title`, `tab.favIconUrl` |
| Persistent access to specific sites | `host_permissions: ["https://example.com/*"]` | Narrow host pattern |
| Access to all sites | `host_permissions: ["<all_urls>"]` | **Last resort** — triggers 3x rejection rate |
`activeTab` grants temporary access to the currently focused tab only after the user explicitly invokes the extension. It requires no install warning. Always prefer it over broad alternatives.
### Common Permission Misconceptions
| Misconception | Reality |
|---------------|---------|
| "Need `tabs` to use `chrome.tabs` API" | Most `chrome.tabs` methods work without the permission |
| "Need `storage` for localStorage" | `storage` is only for `chrome.storage` API, not web storage |
| "Need `cookies` for `document.cookie`" | `cookies` permission is only for `chrome.cookies` API |
| "Need `<all_urls>` to work on any site" | `activeTab` + user action covers most use cases |
## Optional Permissions
Move non-core features to optional permissions. Request at runtime when the feature is activated:
```typescript
// Request permission when user enables a feature
async function enableAdvancedFeature() {
const granted = await chrome.permissions.request({
permissions: ['bookmarks'],
origins: ['https://api.example.com/*'],
});
if (granted) {
// Permission granted — enable feature
} else {
// Permission denied — show explanation
}
}
```
Benefits:
- Reduces alarming install warnings
- Gives users informed control
- Accelerates CWS review
- Permissions can be revoked when feature is disabled
## Host Permission Patterns
Declare in `host_permissions` array (MV3), not in `permissions`:
```json
{
"host_permissions": [
"https://api.example.com/*",
"https://cdn.example.com/*"
]
}
```
**Rules:**
- Use exact domains, not wildcards
- Prefer `https://` over `*://`
- Never use `<all_urls>` unless absolutely required
- Move non-essential hosts to `optional_host_permissions`
## Pre-Release Permission Audit
Before every CWS submission:
1. Grep codebase for every `chrome.*` API call — verify each has a matching permission
2. Remove any declared permission not backed by a code path
3. Replace broad permissions with narrower alternatives where possible
4. Test packed `.crx` build to verify exact install warning dialogs
5. Prepare a short video demonstrating how each sensitive permission is used
6. Write clear cause-and-effect justifications for the CWS privacy tab
## CWS Rejection Codes for Permissions
| Code | Name | Trigger |
|------|------|---------|
| Purple Potassium | Excessive Permissions | Unused or overly broad permissions |
| Purple Lithium | User Data Privacy | Missing privacy policy, insecure data handling |
| Purple Copper | Data Transmission | Sensitive data via HTTP or in URL params |
**Warning:** Adding permissions that trigger install warnings will temporarily disable the extension for existing users until they accept the new terms.
## Additional Resources
### Reference Files
- **`references/permission-guide.md`** — Detailed permission-by-permission reference and narrowing strategies
- **`references/cws-rejection-codes.md`** — Complete CWS rejection code taxonomy with prevention strategies
Is this your skill, or is something wrong with this listing? Request removal or report an issue. Author removals are honored within 72 hours.
No comments yet. Be the first to comment!