webextension-polyfill/CONTRIBUTING.md

3.9 KiB

Hi! Thanks for your interest in helping to make the "cross-browser extension" developers life easier by contributing to the webextension-polyfill library.

This document provides some additional information that you may find useful while looking at how to apply changes to this library and submit them for review.

Table of contents

Building

To build, assuming you've already installed node >= 6 and npm, simply run:

git clone https://github.com/mozilla/webextension-polyfill.git

cd webextension-polyfill

npm install

npm run test

This will install all the npm dependencies and build both non-minified and minified versions of the final library, and output them to dist/browser-polyfill.js and dist/browser-polyfill.min.js, respectively, and finally execute the unit tests on the generated dist files.

Test Suites

This project provides two test suites:

  • unit tests (which only require Node.js to run)
  • module bundlers smoke tests (which requires also browserify and webpack to be installed globally)
  • integration tests (which requires also a stable version of Chrome and Firefox)

Unit Tests

The unit tests run in Node.js with Mocha, and use jsdom and Sinon to mock a browser-like environment for testing the library.

The unit tests are located in the "test/" directory and they have to be named "test/test-*.js".

npm run test run all the unit tests on the non-minified version of the library, whereas npm run test-minified can be used to run the unit tests on the minified version.

Optionally code coverage data can be collected and reported while running the unit tests, by running npm run test-coverage.

Module Bundler smoketests

The shell script test/run-module-bundlers-smoketests.sh runs browserify and webpack, to verify that the most commonly used module bundlers are not raising any unexpected error while building a bundle that requires this library.

Integration Tests

This repository also includes a small set of integration tests, located at "test/integration/". The integration tests use selenium-webdriver to run a set of test extensions (located at "test/fixtures/") on real browsers, currently Chrome (as the browser officially supported by this library) and Firefox (to compare the polyfilled APIs with the ones natively provided on Firefox).

The shell script test/run-browsers-smoketests.sh (executed by the CI service on every pull request) runs this test suite on both the browsers.

To run the integration tests on a single browser:

TEST_BROWSER_TYPE=chrome npm run test-integration

or

TEST_BROWSER_TYPE=firefox npm run test-integration

These tests emit their results using the TAP protocol. To get a nicer output on the console you may want to pipe the results to tap-nirvana, e.g.

TEST_BROWSER_TYPE=chrome npm run test-integration | ./node_modules/.bin/tap-nirvana

Writing commit messages

The subject of the pull requests and commit messages must adhere to the Angular style of semantic messages. This allows us to auto-generate a changelog without too much noise in it. Additionally, write the commit message in past tense so it will read naturally as a historic changelog.

Examples:

  • feat: Added newAmazingAPI namespace to the metadata
  • fix: newAmazingAPI.create should reject on errors
  • docs: Improved contributor docs
  • style: Added no-console linting, cleaned up code
  • refactor: Split out myHelperFunction
  • perf: Changed myHelperFunction to be 2x faster
  • test: Added more tests for newAmazingAPI
  • chore: Upgraded yargs to 3.x.x

If you want to use scopes then it would look more like: test(integration): Added test extension for newAmazingAPI.