| LEFT | RIGHT | 
| (no file at all) |  | 
|   1 Adblock Plus core |   1 Adblock Plus core | 
|   2 ================= |   2 ================= | 
|   3  |   3  | 
|   4 This repository contains the generic Adblock Plus code that's shared between |   4 This repository contains the generic Adblock Plus code that's shared between | 
|   5 platforms. This repository is not designed to be used directly, but instead to |   5 platforms. This repository is not designed to be used directly, but instead to | 
|   6 serve as a dependency for `adblockplus`, `adblockpluschrome` and |   6 serve as a dependency for `adblockplus`, `adblockpluschrome` and | 
|   7 `libadblockplus`. |   7 `libadblockplus`. | 
|   8  |   8  | 
 |   9 Compiling C++ code | 
 |  10 ------------------ | 
 |  11  | 
 |  12 ### Purpose | 
 |  13  | 
 |  14 In order to improve performance and memory usage, some of the code (located | 
 |  15 inside the `compiled` directory) is written in C++ and compiled to JavaScript | 
 |  16 via Empscripten. | 
 |  17  | 
 |  18 ### Requirements | 
 |  19  | 
 |  20 * [Emscripten 1.35.0](https://github.com/kripken/emscripten) | 
 |  21 * [Python 2.7](https://www.python.org) | 
 |  22 * [Node.js 6 or higher](https://nodejs.org/en/) | 
 |  23  | 
 |  24 ### Running Emscripten | 
 |  25  | 
 |  26 *Note*: The `compile` script will likely be replaced by a more elaborate | 
 |  27 solution later. | 
 |  28  | 
 |  29 Before you start make sure to edit the `compile` script and make sure that | 
 |  30 `EMSCRIPTEN_PATH` constant at the top of it points to your Emscripten install. | 
 |  31 After that run the following command: | 
 |  32  | 
 |  33     python compile | 
 |  34  | 
 |  35 This will produce a `lib/compiled.js` exporting the classes defined in C++ code. | 
 |  36  | 
 |  37 ### Technical details | 
 |  38  | 
 |  39 Compilation is currently a two-step process. In the first step, | 
 |  40 `compiled/bindings.cpp` (definitions of classes to be exported) is compiled into | 
 |  41 `compiled/bindings.cpp.js` with `PRINT_BINDINGS` symbol defined. This | 
 |  42 application is then executed via Node.js and will print JavaScript wrappers for | 
 |  43 the C++ classes to `compiled/bindings.js`. | 
 |  44  | 
 |  45 In the next step all the C++ files in `compiled` directory are compiled, | 
 |  46 including `compiled/bindings.cpp` - without `PRINT_BINDINGS` symbol the | 
 |  47 `EMSCRIPTEN_BINDINGS` macro in this file will ignore its contents but rather | 
 |  48 emit some functions necessary for the JavaScript bindings to work. The | 
 |  49 `compiled/bindings.js` file is added to the end of Emscripten output. | 
 |  50  | 
 |  51 The binding generation approach is heavily inspired by | 
 |  52 [embind](http://kripken.github.io/emscripten-site/docs/porting/connecting_cpp_an
    d_javascript/embind.html). | 
 |  53 However, embind doesn't use a separate build step to produce the bindings, the | 
 |  54 bindings are rather generated dynamically at run time. As a side-effect, it | 
 |  55 increases the build size considerably and also imposes a significant performance | 
 |  56 penalty. Also, generating JavaScript code dynamically is discouraged for browser | 
 |  57 extensions. | 
 |  58  | 
 |  59 *Note*: The tricky part when generating JavaScript bindings is determining the | 
 |  60 mangled names of C++ methods. In order to do that, `compiled/bindings.cpp.js` | 
 |  61 will call these methods with invalid parameters and make them crash. The | 
 |  62 resulting `abort()` call is then caught by JavaScript code that reads out the | 
 |  63 method name from the stack. With this approach relying on some Emscripten | 
 |  64 internals, we have to require a specific Emscripten version. | 
 |  65  | 
|   9 Running the unit tests |  66 Running the unit tests | 
|  10 ---------------------- |  67 ---------------------- | 
|  11  |  68  | 
|  12 *Note*: The unit test suite isn't complete yet, it is in the process of being |  69 You first need to run `npm install` in the repository directory in order to | 
|  13 migrated from the |  70 install the required dependencies. After that you can run `npm test` which will | 
|  14 [adblockplustests repository](https://hg.adblockplus.org/adblockplustests/). |  71 execute all tests in the `test` directory of the repository. You can also | 
|  15  |  72 specify specific test files on the command line, e.g. | 
|  16 In order to run the unit test suite you need a reasonably recent |  73 `npm test test/synchronizer.js`. | 
|  17 [Node.js version](https://nodejs.org/). Once Node.js is installed please run |  | 
|  18 `npm install` in the repository directory in order to install the required |  | 
|  19 dependencies. After that you can run `npm test` which will execute all tests |  | 
|  20 in the `test` directory of the repository. |  | 
| LEFT | RIGHT |