summaryrefslogtreecommitdiff
path: root/docs/architecture.md
blob: c45d355bf33f310cf627773906e714b4a26b3994 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
LibNSLayout Architecture
========================

`LibNSLayout` is a library for performing layout on a Document Object Model
for HTML.  Its purpose is to allow client applications to provide DOM
information and convert that into a render list, which can be displayed
by the client.

Dependencies
------------

Clients of `LibNSLayout` must use the following additional libraries, because
their types are used in the `LibNSLayout` interface:

*   `LibDOM` is used to provide the DOM interface.
*   `LibCSS` is used to provide the CSS handling.
*   `LibWapcaplet` is used for interned strings.

Interface
---------

The devision of responsibilities between `LibNSLayout` and its clients are
as follows:

### Client

*   Fetching the document to be displayed.
*   Creating a CSS selection context (with default user-agent, and user CSS).
*   Generating DOM.
*   Creating a `LibNSLayout` layout for the document, passing the DOM document,
    CSS selection context, and appropriate CSS media descriptor.
*   Listening to DOM changes.
    *   Fetching resources needed by DOM.
        *   CSS (STYLE elements, and LINK elements):
            *   Parsing the CSS.
            *   Updating CSS selection context as stylesheets are fetched,
                and notifying `LibNSLayout`.
        *   JavaScript (SCRIPT elements, and LINK elements)
            *   Executing JavaScript.
        *   Favicons (LINK elements.)
        *   Images, Frames, Iframes.
    *   Notifying `LibNSLayout` of DOM changes.
*   Performing resource fetches on behalf of LibNSLayout.
    *   (Such as when LibNSLayout requires a background image or web font for
        an element due to CSS.)
*   Asking `LibNSLayout` to perform layout.
    *   Displaying the returned render list.
*   Asking `LibNSLayout` for layout info (e.g. due to JavaScript.)
*   Passing mouse actions to `LibNSLayout`.
*   Passing keyboard input to `LibNSLayout`.
*   Measuring text???

### `LibNSlayout`

*   Creates a layout object that's opaque to the client, and returns its
    handle.
*   Performs CSS selection as appropriate when DOM changes.
*   Asking client to fetch a resource that's needed for a computed style.
*   Performs layout (if required) when asked by client and returns render list.
*   Performs layout (if required) when asked by client for layout info.