DXR is a code search and navigation tool aimed at making sense of large projects. It supports full-text and regex searches as well as structural queries.

Mercurial (7b5b4eed4707)

VCS Links

Line Code
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
# 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)
    properties.sort(key=order_key)

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

    output.write("};\n")