summaryrefslogtreecommitdiffstats
path: root/layout/style/GenerateComputedDOMStyleGenerated.py
blob: d298600fb40f12b3bdc319d37631a56a62ffc209 (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
61
62
63
64
65
# This Source Code Form is subject to the terms of the Mozilla Public
# License, v. 2.0. If a copy of the MPL was not distributed with this file,
# You can obtain one at http://mozilla.org/MPL/2.0/.

import runpy


def generate(output, dataFile):
    output.write(
        """/* THIS IS AN AUTOGENERATED FILE.  DO NOT EDIT */

/* processed file that defines entries for nsComputedDOMStyle, designed
   to be #included in nsComputedDOMStyle.cpp */

static constexpr Entry kEntries[] = {
"""
    )

    def exposed_on_getcs(p):
        return "ExposedOnGetCS" in p.flags

    def order_key(p):
        # Put prefixed properties after normal properties.
        # The spec is unclear about this, and Blink doesn't have any sensible
        # order at all, so it probably doesn't matter a lot. But originally
        # Gecko put then later so we do so as well. See w3c/csswg-drafts#2827.
        order = p.name.startswith("-")
        return (order, p.name)

    def has_cpp_getter(p):
        if "SerializedByServo" in p.flags:
            return False
        if p.type() == "longhand" and "IsLogical" in p.flags:
            return False
        return True

    # Some special cases we may get rid of later. See bug 1471423.
    def method(p):
        if p.id.startswith("margin_"):
            return "{}Width".format(p.method)
        if p.id.startswith("_moz_"):
            method = p.method[3:]
        else:
            method = p.method
        if p.id.startswith("_moz_outline_radius_"):
            method = method.replace("left", "Left")
            method = method.replace("right", "Right")
        return method

    def getter_entry(p):
        if has_cpp_getter(p):
            return "DoGet" + method(p)
        # Put a dummy getter here instead of nullptr because MSVC seems
        # to have bug which ruins the table when we put nullptr for
        # pointer-to-member-function. See bug 1471426.
        return "DummyGetter"

    properties = runpy.run_path(dataFile)["data"]
    properties = filter(exposed_on_getcs, properties)

    TEMPLATE = "  {{ eCSSProperty_{}, &nsComputedDOMStyle::{} }},\n"
    for p in sorted(properties, key=order_key):
        output.write(TEMPLATE.format(p.id, getter_entry(p)))

    output.write("};\n")