{"id":13507292,"url":"https://github.com/acvetkov/sinon-chrome","last_synced_at":"2025-12-17T13:51:47.860Z","repository":{"id":22877901,"uuid":"26225883","full_name":"acvetkov/sinon-chrome","owner":"acvetkov","description":"Testing chrome extensions with Node.js","archived":false,"fork":false,"pushed_at":"2021-07-12T14:06:30.000Z","size":1650,"stargazers_count":440,"open_issues_count":37,"forks_count":47,"subscribers_count":6,"default_branch":"master","last_synced_at":"2025-11-27T10:30:27.795Z","etag":null,"topics":["chrome","chrome-api","chrome-events","javascript","sinon-chrome"],"latest_commit_sha":null,"homepage":"","language":"JavaScript","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"isc","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/acvetkov.png","metadata":{"files":{"readme":"readme.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null}},"created_at":"2014-11-05T15:31:43.000Z","updated_at":"2025-11-02T20:47:34.000Z","dependencies_parsed_at":"2022-08-21T16:10:31.614Z","dependency_job_id":null,"html_url":"https://github.com/acvetkov/sinon-chrome","commit_stats":null,"previous_names":["vitalets/sinon-chrome"],"tags_count":25,"template":false,"template_full_name":null,"purl":"pkg:github/acvetkov/sinon-chrome","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/acvetkov%2Fsinon-chrome","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/acvetkov%2Fsinon-chrome/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/acvetkov%2Fsinon-chrome/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/acvetkov%2Fsinon-chrome/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/acvetkov","download_url":"https://codeload.github.com/acvetkov/sinon-chrome/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/acvetkov%2Fsinon-chrome/sbom","scorecard":{"id":164108,"data":{"date":"2025-08-11","repo":{"name":"github.com/acvetkov/sinon-chrome","commit":"49c1c0cd420dc903722fbca52478811e2aff75f7"},"scorecard":{"version":"v5.2.1-40-gf6ed084d","commit":"f6ed084d17c9236477efd66e5b258b9d4cc7b389"},"score":3.3,"checks":[{"name":"Code-Review","score":5,"reason":"Found 9/17 approved changesets -- score normalized to 5","details":null,"documentation":{"short":"Determines if the project requires human code review before pull requests (aka merge requests) are merged.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#code-review"}},{"name":"Token-Permissions","score":-1,"reason":"No tokens found","details":null,"documentation":{"short":"Determines if the project's workflows follow the principle of least privilege.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#token-permissions"}},{"name":"Dangerous-Workflow","score":-1,"reason":"no workflows found","details":null,"documentation":{"short":"Determines if the project's GitHub Action workflows avoid dangerous patterns.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#dangerous-workflow"}},{"name":"Packaging","score":-1,"reason":"packaging workflow not detected","details":["Warn: no GitHub/GitLab publishing workflow detected."],"documentation":{"short":"Determines if the project is published as a package that others can easily download, install, easily update, and uninstall.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#packaging"}},{"name":"Maintained","score":0,"reason":"0 commit(s) and 0 issue activity found in the last 90 days -- score normalized to 0","details":null,"documentation":{"short":"Determines if the project is \"actively maintained\".","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#maintained"}},{"name":"Binary-Artifacts","score":10,"reason":"no binaries found in the repo","details":null,"documentation":{"short":"Determines if the project has generated executable (binary) artifacts in the source repository.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#binary-artifacts"}},{"name":"Pinned-Dependencies","score":-1,"reason":"no dependencies found","details":null,"documentation":{"short":"Determines if the project has declared and pinned the dependencies of its build process.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#pinned-dependencies"}},{"name":"CII-Best-Practices","score":0,"reason":"no effort to earn an OpenSSF best practices badge detected","details":null,"documentation":{"short":"Determines if the project has an OpenSSF (formerly CII) Best Practices Badge.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#cii-best-practices"}},{"name":"Security-Policy","score":0,"reason":"security policy file not detected","details":["Warn: no security policy file detected","Warn: no security file to analyze","Warn: no security file to analyze","Warn: no security file to analyze"],"documentation":{"short":"Determines if the project has published a security policy.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#security-policy"}},{"name":"Vulnerabilities","score":10,"reason":"0 existing vulnerabilities detected","details":null,"documentation":{"short":"Determines if the project has open, known unfixed vulnerabilities.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#vulnerabilities"}},{"name":"Fuzzing","score":0,"reason":"project is not fuzzed","details":["Warn: no fuzzer integrations found"],"documentation":{"short":"Determines if the project uses fuzzing.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#fuzzing"}},{"name":"License","score":10,"reason":"license file detected","details":["Info: project has a license file: LICENSE:0","Info: FSF or OSI recognized license: ISC License: LICENSE:0"],"documentation":{"short":"Determines if the project has defined a license.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#license"}},{"name":"Branch-Protection","score":0,"reason":"branch protection not enabled on development/release branches","details":["Warn: branch protection not enabled for branch 'master'"],"documentation":{"short":"Determines if the default and release branches are protected with GitHub's branch protection settings.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#branch-protection"}},{"name":"Signed-Releases","score":0,"reason":"Project has not signed or included provenance with any releases.","details":["Warn: release artifact 2.3.2 not signed: https://api.github.com/repos/acvetkov/sinon-chrome/releases/10957358","Warn: release artifact v2.3.1 not signed: https://api.github.com/repos/acvetkov/sinon-chrome/releases/9937556","Warn: release artifact v2.2.4 not signed: https://api.github.com/repos/acvetkov/sinon-chrome/releases/9283557","Warn: release artifact v2.2.3 not signed: https://api.github.com/repos/acvetkov/sinon-chrome/releases/9273573","Warn: release artifact v2.2.2 not signed: https://api.github.com/repos/acvetkov/sinon-chrome/releases/9234577","Warn: release artifact 2.3.2 does not have provenance: https://api.github.com/repos/acvetkov/sinon-chrome/releases/10957358","Warn: release artifact v2.3.1 does not have provenance: https://api.github.com/repos/acvetkov/sinon-chrome/releases/9937556","Warn: release artifact v2.2.4 does not have provenance: https://api.github.com/repos/acvetkov/sinon-chrome/releases/9283557","Warn: release artifact v2.2.3 does not have provenance: https://api.github.com/repos/acvetkov/sinon-chrome/releases/9273573","Warn: release artifact v2.2.2 does not have provenance: https://api.github.com/repos/acvetkov/sinon-chrome/releases/9234577"],"documentation":{"short":"Determines if the project cryptographically signs release artifacts.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#signed-releases"}},{"name":"SAST","score":0,"reason":"SAST tool is not run on all commits -- score normalized to 0","details":["Warn: 0 commits out of 22 are checked with a SAST tool"],"documentation":{"short":"Determines if the project uses static code analysis.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#sast"}}]},"last_synced_at":"2025-08-16T14:21:26.042Z","repository_id":22877901,"created_at":"2025-08-16T14:21:26.043Z","updated_at":"2025-08-16T14:21:26.043Z"},"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":27783730,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","status":"online","status_checked_at":"2025-12-17T02:00:08.291Z","response_time":55,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["chrome","chrome-api","chrome-events","javascript","sinon-chrome"],"created_at":"2024-08-01T02:00:30.180Z","updated_at":"2025-12-17T13:51:47.838Z","avatar_url":"https://github.com/acvetkov.png","language":"JavaScript","funding_links":[],"categories":["Testing","How?","JavaScript","Tools"],"sub_categories":["CLI Tools","Testing"],"readme":"[![Build Status](https://travis-ci.org/acvetkov/sinon-chrome.svg?branch=master)](https://travis-ci.org/acvetkov/sinon-chrome)\n[![npm version](https://badge.fury.io/js/sinon-chrome.svg)](https://www.npmjs.com/package/sinon-chrome)\n\n# Sinon-chrome\n\nSinon-chrome is helper tool for unit-testing chromium and Firefox extensions and apps. It mocks all extensions api with sinon stubs that allows you to run tests in Node.js without actual browser.\n\n# Schema support\nAPI mocks are generated using official chromium extensions API (Firefox webextensions) schemas that ensures consistency with real API. Actual schemas are taken from Chrome 53 and Firefox 49.\n\n# How it works\n\nSinon-chrome mocks all chrome api, replaced methods by [sinon stubs](http://sinonjs.org/docs/#stubs) with some sugar.\nChrome events replaced by classes with same behavior, so you can test your event handlers with manual triggering chrome events.\nAll properties has values from chrome schema files.\n\n\n# Install\n\nWe recommend use `sinon-chrome` on Node.js platform.\n\n```\nnpm install sinon-chrome --save-dev\n```\n\nBut, if you want...\n\nYou can download `sinon-chrome` bundle from [release](https://github.com/acvetkov/sinon-chrome/releases) page and include it on your page\n\n```html\n\u003cscript src=\"/path/to/sinon-chrome.min.js\"\u003e\n```\n\nor\n\n```html\n\u003cscript src=\"/path/to/sinon-chrome-apps.min.js\"\u003e\n```\n\n# Usage\n\nFor mock extensions Api\n\n```js\nconst chrome = require('sinon-chrome');\n\n// or\n\nconst chrome = require('sinon-chrome/extensions');\n```\n\nFor mock apps Api\n\n```js\nconst chrome = require('sinon-chrome/apps'); // stable apps api\n```\n\n# Examples\n\nLet's write small navigation helper, which use chrome api methods.\n\n```js\nexport const navigationTarget = {\n    NEW_WINDOW: 'new-window',\n    NEW_TAB: 'new-tab',\n    CURRENT_TAB: 'current-tab',\n};\n\n/**\n * Navigate user\n * @param {String} url\n * @param {String} [target]\n * @returns {*}\n */\nexport function navigate(url, target = navigationTarget.NEW_TAB) {\n    switch (target) {\n        case navigationTarget.NEW_WINDOW:\n            return chrome.windows.create({url: url, focused: true, type: 'normal'});\n        case navigationTarget.CURRENT_TAB:\n            return chrome.tabs.update({url: url, active: true});\n        default:\n            return chrome.tabs.create({url: url, active: true});\n    }\n}\n```\n\nTest it\n\n```js\nimport chrome from '../src'; // from 'sinon-chrome'\nimport {assert} from 'chai';\nimport {navigate, navigationTarget} from './navigate';\n\ndescribe('navigate.js', function () {\n\n    const url = 'http://my-domain.com';\n\n    before(function () {\n        global.chrome = chrome;\n    });\n\n    it('should navigate to new window', function () {\n        assert.ok(chrome.windows.create.notCalled, 'windows.create should not be called');\n        navigate(url, navigationTarget.NEW_WINDOW);\n        assert.ok(chrome.windows.create.calledOnce, 'windows.create should be called');\n        assert.ok(\n            chrome.windows.create.withArgs({url, focused: true, type: 'normal'}).calledOnce,\n            'windows.create should be called with specified args'\n        );\n    });\n});\n```\n\nYou can run this example by command\n\n```\nnpm run test-navigate\n```\n\nMore tests in `examples` dir.\n\n\n## stubs api\n\nWith original sinon stubs [api](http://sinonjs.org/docs/#stubs) we add `flush` method, which reset stub behavior.\nSinon stub has same method `resetBehavior`, but it has some issues.\n\n**Example**\n\n```js\nchrome.cookie.getAll.withArgs({name: 'my_cookie'}).yields([1, 2]);\nchrome.cookie.getAll.withArgs({}).yields([3, 4]);\n\nchrome.cookie.getAll({}, list =\u003e console.log(list)); // [3, 4]\nchrome.cookie.getAll({name: 'my_cookie'}, list =\u003e console.log(list)); // [1, 2]\nchrome.cookie.getAll.flush();\nchrome.cookie.getAll({name: 'my_cookie'}, list =\u003e console.log(list)); // not called\nchrome.cookie.getAll({}, list =\u003e console.log(list)); // not called\n```\n\n### events\n\nLet's write module, which depends on chrome events\n\n```js\nexport default class EventsModule {\n    constructor() {\n        this.observe();\n    }\n\n    observe() {\n        chrome.tabs.onUpdated.addListener(tab =\u003e this.handleEvent(tab));\n    }\n\n    handleEvent(tab) {\n        chrome.runtime.sendMessage(tab.url);\n    }\n}\n```\n\nAnd test it\n\n```js\nimport chrome from '../src'; // from 'sinon-chrome'\nimport {assert} from 'chai';\nimport EventsModule from './events';\n\ndescribe('events.js', function () {\n\n    before(function () {\n        global.chrome = chrome;\n        this.events = new EventsModule();\n    });\n\n    beforeEach(function () {\n        chrome.runtime.sendMessage.flush();\n    });\n\n    it('should subscribe on chrome.tabs.onUpdated', function () {\n        assert.ok(chrome.tabs.onUpdated.addListener.calledOnce);\n    });\n\n    it('should send correct url on tabs updated event', function () {\n        assert.ok(chrome.runtime.sendMessage.notCalled);\n        chrome.tabs.onUpdated.dispatch({url: 'my-url'});\n        assert.ok(chrome.runtime.sendMessage.calledOnce);\n        assert.ok(chrome.runtime.sendMessage.withArgs('my-url').calledOnce);\n    });\n\n    after(function () {\n        chrome.flush();\n        delete global.chrome;\n    });\n});\n```\n\nYou can run this test via\n\n```\nnpm run test-events\n```\n\n### properties\n\nYou can set property values. `chrome.flush` reset properties to default values (`null` or specified by schema).\nLet's create module, which wraps chrome api with Promise. If `chrome.runtime.lastError` is set, promise will be rejected.\n\n```js\nexport const api = {\n    tabs: {\n        /**\n         * Wrapper for chrome.tabs.query\n         * @param {Object} criteria\n         * @returns {Promise}\n         */\n        query(criteria) {\n            return new Promise((resolve, reject) =\u003e {\n                chrome.tabs.query(criteria, tabs =\u003e {\n                    if (chrome.runtime.lastError) {\n                        reject(chrome.runtime.lastError);\n                    } else {\n                        resolve(tabs);\n                    }\n                });\n            });\n        }\n    }\n};\n```\n\nAnd our tests\n\n```js\nimport chrome from '../src'; // from 'sinon-chrome'\nimport chai from 'chai';\nimport {api} from './then-chrome';\nimport chaiAsPromised from 'chai-as-promised';\n\nchai.use(chaiAsPromised);\nconst assert = chai.assert;\n\ndescribe('then-chrome.js', function () {\n\n    before(function () {\n        global.chrome = chrome;\n    });\n\n    beforeEach(function () {\n        chrome.flush();\n    });\n\n    it('should reject promise', function () {\n        chrome.tabs.query.yields([1, 2]);\n        chrome.runtime.lastError = {message: 'Error'};\n        return assert.isRejected(api.tabs.query({}));\n    });\n\n    it('should resolve promise', function () {\n        chrome.runtime.lastError = null;\n        chrome.tabs.query.yields([1, 2]);\n        return assert.eventually.deepEqual(api.tabs.query({}), [1, 2]);\n    });\n\n    after(function () {\n        chrome.flush();\n        delete global.chrome;\n    });\n});\n```\n\nYou can run this test via\n\n```\nnpm run test-then\n```\n\n# Plugins\n\nSinon chrome module supports plugins, that emulates browser behavior.\nMore info on [example page](https://github.com/acvetkov/sinon-chrome/wiki/Cookie-plugin).\n\n- [Cookie plugin](https://github.com/acvetkov/sinon-chrome/wiki/Cookie-plugin)\n- [i18n plugin](https://github.com/acvetkov/sinon-chrome/tree/master/src/plugins/i18n)\n\n```js\nconst chrome = require('sinon-chrome/extensions');\nconst CookiePlugin = require('sinon-chrome/plugins').CookiePlugin;\n\nchrome.registerPlugin(new CookiePlugin());\n```\n\n## Extension namespaces\n\n* [chrome.alarms](https://developer.chrome.com/extensions/alarms)\n* [chrome.bookmarks](https://developer.chrome.com/extensions/bookmarks)\n* [chrome.browserAction](https://developer.chrome.com/extensions/browserAction)\n* [chrome.browsingData](https://developer.chrome.com/extensions/browsingData)\n* [chrome.commands](https://developer.chrome.com/extensions/commands)\n* [chrome.contentSettings](https://developer.chrome.com/extensions/contentSettings)\n* [chrome.contextMenus](https://developer.chrome.com/extensions/contextMenus)\n* [chrome.cookies](https://developer.chrome.com/extensions/cookies)\n* [chrome.debugger](https://developer.chrome.com/extensions/debugger)\n* [chrome.declarativeContent](https://developer.chrome.com/extensions/declarativeContent)\n* [chrome.desktopCapture](https://developer.chrome.com/extensions/desktopCapture)\n* [chrome.devtools](https://developer.chrome.com/extensions/devtools)\n* [chrome.dial](https://chromium.googlesource.com/chromium/src.git/+/master/chrome/common/extensions/api/dial.idl) (undocumented API for communication with DIAL-capable devices)\n* [chrome.downloads](https://developer.chrome.com/extensions/downloads)\n* [chrome.extension](https://developer.chrome.com/extensions/extension)\n* [chrome.extensionTypes](https://developer.chrome.com/extensions/extensionTypes)\n* [chrome.fontSettings](https://developer.chrome.com/extensions/fontSettings)\n* [chrome.gcm](https://developer.chrome.com/extensions/gcm)\n* [chrome.history](https://developer.chrome.com/extensions/history)\n* [chrome.i18n](https://developer.chrome.com/extensions/i18n)\n* [chrome.identity](https://developer.chrome.com/extensions/identity)\n* [chrome.idle](https://developer.chrome.com/extensions/idle)\n* [chrome.instanceID](https://developer.chrome.com/extensions/instanceID)\n* [chrome.management](https://developer.chrome.com/extensions/management)\n* [chrome.notifications](https://developer.chrome.com/extensions/notifications)\n* [chrome.omnibox](https://developer.chrome.com/extensions/omnibox)\n* [chrome.pageAction](https://developer.chrome.com/extensions/pageAction)\n* [chrome.pageCapture](https://developer.chrome.com/extensions/pageCapture)\n* [chrome.permissions](https://developer.chrome.com/extensions/permissions)\n* [chrome.power](https://developer.chrome.com/extensions/power)\n* [chrome.printerProvider](https://developer.chrome.com/extensions/printerProvider)\n* [chrome.privacy](https://developer.chrome.com/extensions/privacy)\n* [chrome.proxy](https://developer.chrome.com/extensions/proxy)\n* [chrome.runtime](https://developer.chrome.com/extensions/runtime)\n* [chrome.sessions](https://developer.chrome.com/extensions/sessions)\n* [chrome.storage](https://developer.chrome.com/extensions/storage)\n* [chrome.system](https://developer.chrome.com/extensions/system)\n* [chrome.tabCapture](https://developer.chrome.com/extensions/tabCapture)\n* [chrome.tabs](https://developer.chrome.com/extensions/tabs)\n* [chrome.topSites](https://developer.chrome.com/extensions/topSites)\n* [chrome.tts](https://developer.chrome.com/extensions/tts)\n* [chrome.ttsEngine](https://developer.chrome.com/extensions/ttsEngine)\n* [chrome.types](https://developer.chrome.com/extensions/types)\n* [chrome.webNavigation](https://developer.chrome.com/extensions/webNavigation)\n* [chrome.webRequest](https://developer.chrome.com/extensions/webRequest)\n* [chrome.webstore](https://developer.chrome.com/extensions/webstore)\n* [chrome.windows](https://developer.chrome.com/extensions/windows)\n\n## Apps namespaces\n\n* [chrome.alarms](https://developer.chrome.com/apps/alarms)\n* [chrome.app.runtime](https://developer.chrome.com/apps/app.runtime)\n* [chrome.app.window](https://developer.chrome.com/apps/app_window)\n* [chrome.bluetooth](https://developer.chrome.com/apps/bluetooth)\n* [chrome.bluetoothSocket](https://developer.chrome.com/apps/bluetoothSocket)\n* [chrome.browser](https://developer.chrome.com/apps/browser)\n* [chrome.commands](https://developer.chrome.com/apps/commands)\n* [chrome.contextMenus](https://developer.chrome.com/apps/contextMenus)\n* [chrome.events](https://developer.chrome.com/apps/events)\n* [chrome.extensionTypes](https://developer.chrome.com/apps/extensionTypes)\n* [chrome.fileSystem](https://developer.chrome.com/apps/fileSystem)\n* [chrome.gcm](https://developer.chrome.com/apps/gcm)\n* [chrome.hid](https://developer.chrome.com/apps/hid)\n* [chrome.i18n](https://developer.chrome.com/apps/i18n)\n* [chrome.identity](https://developer.chrome.com/apps/identity)\n* [chrome.idle](https://developer.chrome.com/apps/idle)\n* [chrome.instanceID](https://developer.chrome.com/apps/instanceID)\n* [chrome.mdns](https://developer.chrome.com/apps/mdns)\n* [chrome.mediaGalleries](https://developer.chrome.com/apps/mediaGalleries)\n* [chrome.notifications](https://developer.chrome.com/apps/notifications)\n* [chrome.permissions](https://developer.chrome.com/apps/permissions)\n* [chrome.power](https://developer.chrome.com/apps/power)\n* [chrome.printerProvider](https://developer.chrome.com/apps/printerProvider)\n* [chrome.runtime](https://developer.chrome.com/apps/runtime)\n* [chrome.serial](https://developer.chrome.com/apps/serial)\n* [chrome.socket](https://developer.chrome.com/apps/socket)\n* [chrome.sockets](https://developer.chrome.com/apps/sockets)\n* [chrome.storage](https://developer.chrome.com/apps/storage)\n* [chrome.syncFileSystem](https://developer.chrome.com/apps/syncFileSystem)\n* [chrome.system](https://developer.chrome.com/apps/system)\n* [chrome.tts](https://developer.chrome.com/apps/tts)\n* [chrome.types](https://developer.chrome.com/apps/types)\n* [chrome.usb](https://developer.chrome.com/apps/usb)\n* [chrome.accessibilityFeatures](https://developer.chrome.com/apps/accessibilityFeatures)\n* [chrome.bluetoothLowEnergy](https://developer.chrome.com/apps/bluetoothLowEnergy)\n* [chrome.documentScan](https://developer.chrome.com/apps/documentScan)\n* [chrome.fileSystemProvider](https://developer.chrome.com/apps/fileSystemProvider)\n* [chrome.vpnProvider](https://developer.chrome.com/apps/vpnProvider)\n* [chrome.wallpaper](https://developer.chrome.com/apps/wallpaper)\n\n## Webextensions API\n\n* [browser.alarms](https://developer.mozilla.org/en-US/Add-ons/WebExtensions/API/alarms)\n* [browser.cookies](https://developer.mozilla.org/en-US/Add-ons/WebExtensions/API/cookies)\n* [browser.downloads](https://developer.mozilla.org/en-US/Add-ons/WebExtensions/API/downloads)\n* [browser.events](https://developer.mozilla.org/en-US/Add-ons/WebExtensions/API/events)\n* [browser.manifest](https://developer.mozilla.org/en-US/Add-ons/WebExtensions/API/manifest)\n* [browser.extensionTypes](https://developer.mozilla.org/en-US/Add-ons/WebExtensions/API/extensionTypes)\n* [browser.extension](https://developer.mozilla.org/en-US/Add-ons/WebExtensions/API/extension)\n* [browser.i18n](https://developer.mozilla.org/en-US/Add-ons/WebExtensions/API/i18n)\n* [browser.idle](https://developer.mozilla.org/en-US/Add-ons/WebExtensions/API/idle)\n* [browser.management](https://developer.mozilla.org/en-US/Add-ons/WebExtensions/API/management)\n* [browser.notifications](https://developer.mozilla.org/en-US/Add-ons/WebExtensions/API/notifications)\n* [browser.runtime](https://developer.mozilla.org/en-US/Add-ons/WebExtensions/API/runtime)\n* [browser.storage](https://developer.mozilla.org/en-US/Add-ons/WebExtensions/API/storage)\n* [browser.test](https://developer.mozilla.org/en-US/Add-ons/WebExtensions/API/test)\n* [browser.webNavigation](https://developer.mozilla.org/en-US/Add-ons/WebExtensions/API/webNavigation)\n* [browser.webRequest](https://developer.mozilla.org/en-US/Add-ons/WebExtensions/API/webRequest)\n* [browser.bookmarks](https://developer.mozilla.org/en-US/Add-ons/WebExtensions/API/bookmarks)\n* [browser.browserAction](https://developer.mozilla.org/en-US/Add-ons/WebExtensions/API/browserAction)\n* [browser.commands](https://developer.mozilla.org/en-US/Add-ons/WebExtensions/API/commands)\n* [browser.contextMenusInternal](https://developer.mozilla.org/en-US/Add-ons/WebExtensions/API/contextMenusInternal)\n* [browser.contextMenus](https://developer.mozilla.org/en-US/Add-ons/WebExtensions/API/contextMenus)\n* [browser.history](https://developer.mozilla.org/en-US/Add-ons/WebExtensions/API/history)\n* [browser.pageAction](https://developer.mozilla.org/en-US/Add-ons/WebExtensions/API/pageAction)\n* [browser.tabs](https://developer.mozilla.org/en-US/Add-ons/WebExtensions/API/tabs)\n* [browser.windows](https://developer.mozilla.org/en-US/Add-ons/WebExtensions/API/windows)\n\n# Any questions?\n\nFeel free to [open issue](https://github.com/acvetkov/sinon-chrome/issues).\n\n# Useful resources\n[Awesome Browser Extensions And Apps](https://github.com/vitalets/awesome-browser-extensions-and-apps) - a curated list of awesome resources for building browser extensions and apps.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Facvetkov%2Fsinon-chrome","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Facvetkov%2Fsinon-chrome","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Facvetkov%2Fsinon-chrome/lists"}