|
1 .. _webidl: |
|
2 |
|
3 ====== |
|
4 WebIDL |
|
5 ====== |
|
6 |
|
7 WebIDL describes interfaces web browsers are supposed to implement. |
|
8 |
|
9 The interaction between WebIDL and the build system is somewhat complex. |
|
10 This document will attempt to explain how it all works. |
|
11 |
|
12 Overview |
|
13 ======== |
|
14 |
|
15 ``.webidl`` files throughout the tree define interfaces the browser |
|
16 implements. Since Gecko/Firefox is implemented in C++, there is a |
|
17 mechanism to convert these interfaces and associated metadata to |
|
18 C++ code. That's where the build system comes into play. |
|
19 |
|
20 All the code for interacting with ``.webidl`` files lives under |
|
21 ``dom/bindings``. There is code in the build system to deal with |
|
22 WebIDLs explicitly. |
|
23 |
|
24 WebIDL source file flavors |
|
25 ========================== |
|
26 |
|
27 Not all ``.webidl`` files are created equal! There are several flavors, |
|
28 each represented by a separate symbol from :ref:`mozbuild_symbols`. |
|
29 |
|
30 WEBIDL_FILES |
|
31 Refers to regular/static ``.webidl`` files. Most WebIDL interfaces |
|
32 are defined this way. |
|
33 |
|
34 GENERATED_EVENTS_WEBIDL_FILES |
|
35 In addition to generating a binding, these ``.webidl`` files also |
|
36 generate a source file implementing the event object in C++ |
|
37 |
|
38 PREPROCESSED_WEBIDL_FILES |
|
39 The ``.webidl`` files are generated by preprocessing an input file. |
|
40 They otherwise behave like *WEBIDL_FILES*. |
|
41 |
|
42 TEST_WEBIDL_FILES |
|
43 Like *WEBIDL_FILES* but the interfaces are for testing only and |
|
44 aren't shipped with the browser. |
|
45 |
|
46 PREPROCESSED_TEST_WEBIDL_FILES |
|
47 Like *TEST_WEBIDL_FILES* except the ``.webidl`` is obtained via |
|
48 preprocessing, much like *PREPROCESSED_WEBIDL_FILES*. |
|
49 |
|
50 GENERATED_WEBIDL_FILES |
|
51 The ``.webidl`` for these is obtained through an *external* |
|
52 mechanism. Typically there are custom build rules for producing these |
|
53 files. |
|
54 |
|
55 Producing C++ code |
|
56 ================== |
|
57 |
|
58 The most complicated part about WebIDLs is the process by which |
|
59 ``.webidl`` files are converted into C++. |
|
60 |
|
61 This process is handled by code in the :py:mod:`mozwebidlcodegen` |
|
62 package. :py:class:`mozwebidlcodegen.WebIDLCodegenManager` is |
|
63 specifically where you want to look for how code generation is |
|
64 performed. This includes complex dependency management. |
|
65 |
|
66 Requirements |
|
67 ============ |
|
68 |
|
69 This section aims to document the build and developer workflow requirements |
|
70 for WebIDL. |
|
71 |
|
72 Parser unit tests |
|
73 There are parser tests provided by ``dom/bindings/parser/runtests.py`` |
|
74 that should run as part of ``make check``. There must be a mechanism |
|
75 to run the tests in *human* mode so they output friendly error |
|
76 messages. |
|
77 |
|
78 The current mechanism for this is ``mach webidl-parser-test``. |
|
79 |
|
80 Mochitests |
|
81 There are various mochitests under ``dom/bindings/test``. They should |
|
82 be runnable through the standard mechanisms. |
|
83 |
|
84 Working with test interfaces |
|
85 ``TestExampleGenBinding.cpp`` calls into methods from the |
|
86 ``TestExampleInterface`` and ``TestExampleProxyInterface`` interfaces. |
|
87 These interfaces need to be generated as part of the build. These |
|
88 interfaces should not be exported or packaged. |
|
89 |
|
90 There is a ``compiletests`` make target in ``dom/bindings`` that |
|
91 isn't part of the build that facilitates turnkey code generation |
|
92 and test file compilation. |
|
93 |
|
94 Minimal rebuilds |
|
95 Reprocessing every output for every change is expensive. So we don't |
|
96 inconvenience people changing ``.webidl`` files, the build system |
|
97 should only perform a minimal rebuild when sources change. |
|
98 |
|
99 This logic is mostly all handled in |
|
100 :py:class:`mozwebidlcodegen.WebIDLCodegenManager`. The unit tests for |
|
101 that Python code should adequately test typical rebuild scenarios. |
|
102 |
|
103 Bug 940469 tracks making the existing implementation better. |
|
104 |
|
105 Explicit method for performing codegen |
|
106 There needs to be an explicit method for invoking code generation. |
|
107 It needs to cover regular and test files. |
|
108 |
|
109 This is implemented via ``make export`` in ``dom/bindings``. |
|
110 |
|
111 No-op binding generation should be fast |
|
112 So developers touching ``.webidl`` files are not inconvenienced, |
|
113 no-op binding generation should be fast. Watch out for the build system |
|
114 processing large dependency files it doesn't need in order to perform |
|
115 code generation. |
|
116 |
|
117 Ability to generate example files |
|
118 *Any* interface can have example ``.h``/``.cpp`` files generated. |
|
119 There must be a mechanism to facilitate this. |
|
120 |
|
121 This is currently facilitated through ``mach webidl-example``. e.g. |
|
122 ``mach webidl-example HTMLStyleElement``. |