Firefox/Kinto: Difference between revisions

From MozillaWiki
Jump to navigation Jump to search
(fixed formatting)
(Add details about implementation)
Line 1: Line 1:
= Kinto Integration in Firefox =
= Kinto Integration in Firefox =


== Key features ==
= Key features =


* Data synchronization
* Diff-based data synchronization
* Data integrity/signing
* Data integrity/signing
* Offline persistence
* Offline persistence
* Admin panel UI
* Admin panel UI


== Use Cases ==
= Use Cases =


* Certificates blocklist (OneCRL)
* Certificates blocklist (OneCRL) ''(contact: mgoodwin)''
* Addons/Plugins/Gfx [[Blocklisting]]
* Addons/Plugins/Gfx [[Blocklisting]] ''(contact: leplatrem)''
* <code>storage.sync</code> API ([[WebExtensions]])
* <code>storage.sync</code> API ([[WebExtensions]]) ''(contact: tarek)''
* Fennec assets catalog ''(contact: Sebastian Kaspari)''
* Password manager recipes ''(contact: MattN)''
 
Feel free to come and discuss on <code>#storage</code> :)
 
= Usage =
 
Leveraging the [https://github.com/Kinto/kinto-client Kinto HTTP client] in Gecko looks like this:
 
<pre>
const { KintoHttpClient } = Cu.import("resource://services-common/kinto-http-client.js");
 
const client = new KintoHttpClient("https://kinto.dev.mozaws.net/v1");
client.bucket("a-bucket").collection("a-collection")
  .listRecords()
  .then(result => ...);
</pre>
 
As for the [https://github.com/Kinto/kinto.js Kinto offline-first client], it is like:
 
<pre>
const { loadKinto } = Cu.import("resource://services-common/kinto-offline-client.js");
 
const KintoOfflineClient = loadKinto();
 
const client = new KintoOfflineClient({
  adapter: Kinto.adapters.FirefoxAdapter,
  remote: "https://kinto.dev.mozaws.net/v1",
  bucket: "a-bucket"
});
 
const collection = db.collection("a-collection");
 
try {
  yield collection.db.open();
  // Fetch changes from server.
  yield collection.sync();
  // Read local collection of records.
  const records = yield collection.list();
} finally {
  yield collection.db.close();
}
</pre>
 
 
= Specifications =
 
Currently, the instance of Kinto used by Firefox clients is hosted at https://firefox.settings.services.mozilla.com/v1/
 
== Blocklists ==
 
The goal is to replace the current system based on a single XML file downloaded everyday by several Kinto collections.
 
* The bucket is '''blocklists'''
* The collection for OneCRL entries is '''certificates''' https://firefox.settings.services.mozilla.com/v1/buckets/blocklists/collections/certificates/records
* The collection for Add-ons entries is '''addons''' https://firefox.settings.services.mozilla.com/v1/buckets/blocklists/collections/certificates/records
* The collection for Plugins entries is '''plugins''' https://firefox.settings.services.mozilla.com/v1/buckets/blocklists/collections/certificates/records
* The collection for Gfx entries is '''gfx''' https://firefox.settings.services.mozilla.com/v1/buckets/blocklists/collections/certificates/records
 
See https://bugzilla.mozilla.org/show_bug.cgi?id=1197707
 
== Fennec assets catalog ==
 
The goal is to remove the static assets (fonts, hyphenation dicts, etc.) from the distribution package and download them asynchronously using an online Kinto catalog.
 
* The bucket is '''fennec'''
* The collection is '''catalog'''
 
See https://bugzilla.mozilla.org/show_bug.cgi?id=1201059
 
 
= Contribute =


== Upgrade client libraries ==
== Upgrade client libraries ==
Line 74: Line 146:
<pre>
<pre>
$ ./mach xpcshell-test services/common/tests/unit/*into*
$ ./mach xpcshell-test services/common/tests/unit/*into*
</pre>
==== Gfx blocklist tests ====
The Gfx test suite requires the debug mode to be enabled. Add this to <code>mozconfig</code> file, rebuild and run the tests:
<pre>
ac_add_options --enable-debug
</pre>
==== Debug content signature ====
You can get tests (or Firefox) to give you more information on what the content signature verifier is doing by setting the NSPR_LOG_MODULES environment variable. For example:
<pre>
EXPORT NSPR_LOG_MODULES=ContentSignatureVerifier:5,CSTrustDomain:5
</pre>
</pre>


Line 153: Line 241:


* https://reviewboard.mozilla.org/r/45445/
* https://reviewboard.mozilla.org/r/45445/
= Tips for Testing =
You can get tests (or Firefox) to give you more information on what the content signature verifier is doing by setting the NSPR_LOG_MODULES environment variable. For example:
<pre>
EXPORT NSPR_LOG_MODULES=ContentSignatureVerifier:5,CSTrustDomain:5
</pre>

Revision as of 10:22, 28 April 2016

Kinto Integration in Firefox

Key features

  • Diff-based data synchronization
  • Data integrity/signing
  • Offline persistence
  • Admin panel UI

Use Cases

  • Certificates blocklist (OneCRL) (contact: mgoodwin)
  • Addons/Plugins/Gfx Blocklisting (contact: leplatrem)
  • storage.sync API (WebExtensions) (contact: tarek)
  • Fennec assets catalog (contact: Sebastian Kaspari)
  • Password manager recipes (contact: MattN)

Feel free to come and discuss on #storage :)

Usage

Leveraging the Kinto HTTP client in Gecko looks like this:

const { KintoHttpClient } = Cu.import("resource://services-common/kinto-http-client.js");

const client = new KintoHttpClient("https://kinto.dev.mozaws.net/v1");
client.bucket("a-bucket").collection("a-collection")
  .listRecords()
  .then(result => ...);

As for the Kinto offline-first client, it is like:

const { loadKinto } = Cu.import("resource://services-common/kinto-offline-client.js");

const KintoOfflineClient = loadKinto();

const client = new KintoOfflineClient({
  adapter: Kinto.adapters.FirefoxAdapter,
  remote: "https://kinto.dev.mozaws.net/v1",
  bucket: "a-bucket"
});

const collection = db.collection("a-collection");

try {
  yield collection.db.open();
  // Fetch changes from server.
  yield collection.sync();
  // Read local collection of records.
  const records = yield collection.list();
} finally {
  yield collection.db.close();
}


Specifications

Currently, the instance of Kinto used by Firefox clients is hosted at https://firefox.settings.services.mozilla.com/v1/

Blocklists

The goal is to replace the current system based on a single XML file downloaded everyday by several Kinto collections.

See https://bugzilla.mozilla.org/show_bug.cgi?id=1197707

Fennec assets catalog

The goal is to remove the static assets (fonts, hyphenation dicts, etc.) from the distribution package and download them asynchronously using an online Kinto catalog.

  • The bucket is fennec
  • The collection is catalog

See https://bugzilla.mozilla.org/show_bug.cgi?id=1201059


Contribute

Upgrade client libraries

Two client libraries are embedded in Firefox:

  • Kinto/kinto-client.js: for direct interactions with the Kinto HTTP API
  • Kinto/kinto.js: for offline persistence in internal SQLite

Generate bundles

The Kinto client libraries are developed independently on Github:

  • kinto-client is the HTTP client for the Kinto REST API;
  • kinto.js is the offline-first client for Kinto.

With the help of Babel and browsersify, a bundle is generated for Firefox with the minimum transpilation possible (eg. CommonJS require, ES7 decorators).

kinto.js

From the kinto.js repo, generate the moz-kinto-offline-client.js file:

$ npm run dist-fx

And overwrite it in the Firefox code base:

$ cp dist/moz-kinto-offline-client.js ../mozilla-central/services/common/kinto-offline-client.js

kinto-client.js

From the kinto-client.js repo, generate the moz-kinto-http-client.js file:

$ npm run dist-fx

And overwrite it in the Firefox code base:

$ cp dist/moz-kinto-http-client.js ../mozilla-central/services/common/kinto-http-client.js

Run the tests

First, follow the instructions to build Firefox.

For JavaScript updates only, have a look at Artifacts Builds, trading bandwidth for compilation time.

$ ./mach build faster
$ ./mach xpcshell-test services/common/tests/unit/test_kinto.js
$ ./mach xpcshell-test services/common/tests/unit/test_storage_adapter.js

Or all tests related to Kinto:

$ ./mach xpcshell-test services/common/tests/unit/*into*

Gfx blocklist tests

The Gfx test suite requires the debug mode to be enabled. Add this to mozconfig file, rebuild and run the tests:

ac_add_options --enable-debug

Debug content signature

You can get tests (or Firefox) to give you more information on what the content signature verifier is doing by setting the NSPR_LOG_MODULES environment variable. For example:

EXPORT NSPR_LOG_MODULES=ContentSignatureVerifier:5,CSTrustDomain:5

TDD mode

Using inotify, we will detect a file change in the dist/ folder and run a series of commands to execute the tests automatically.

First, install inotify-tools:

sudo apt-get install inotify-tools

Then start an infinite loop with inotify-wait:

while true; do
    # Wait for a change
    inotifywait -q -e create,modify,delete -r ~/Code/Mozilla/kinto.js/dist
    # Execute these commands
    cp ~/Code/Mozilla/kinto.js/dist/moz-kinto-offline-client.js services/common/kinto-offline-client.js
    ./mach xpcshell-test services/common/tests/unit/test_storage_adapter.js
    ./mach xpcshell-test services/common/tests/unit/test_kinto.js          
done

Source: Antoine Cezar

Submit patch

> Patch are contributed to kinto.js and kinto-client.js, which are first released on NPM.

DO NOT land files that are not tagged officially on upstream repositories.

Become a contributor

Configure SSH key for hg:

Host hg.mozilla.org
  User user@server.com
  IdentityFile ~/.ssh/contrib_moz

Run integration tests: «Try»

See https://wiki.mozilla.org/ReleaseEngineering/TryServer

Or use a gecko-dev fork from Github, and with install moz git tools

git push-to-try -t --rev master..HEAD ~/hg/mozilla-central/ -b do -p linux,linux64,macosx64,win32,win64 -u xpcshell -t none

Submit for review

See http://mozilla-version-control-tools.readthedocs.org

# Commit with link to Bugzilla
hg commit -m "Bug XXXXX - Upgrade <lib> to X.Y.Z"

# Submit to MozReview
hg push review

# Keep a bookmark of your branch to address review.
hg bookmark bug-XXXXX

# Go back to «master»
hg update central

Examples: