findReferences(thing)
Walk the entire heap, looking for references to |thing|, and return a
"references object" describing what we found.
Each property of the references object describes one kind of reference. The
property's name is the label supplied to MarkObject, JS_CALL_TRACER, or what
have you, prefixed with "edge: " to avoid collisions with system properties
(like "toString" and "__proto__"). The property's value is an array of things
that refer to |thing| via that kind of reference. Ordinary references from
one object to another are named after the property name (with the "edge: "
prefix).
Garbage collection roots appear as references from 'null'. We use the name
given to the root (with the "edge: " prefix) as the name of the reference.
Note that the references object does record references from objects that are
only reachable via |thing| itself, not just the references reachable
themselves from roots that keep |thing| from being collected. (We could make
this distinction if it is useful.)
If any references are found by the conservative scanner, the references
object will have a property named "edge: machine stack"; the referrers will
be 'null', because they are roots.
js> var o = { x: { y: { z: {} } }}
js> findReferences(o.x.y.z)
({'edge: z':[{z:{}}], 'edge: machine stack':[null, null, null, null, null]})
js> o = { get x() { return 42 } }
({get x () {return 42;}})
js> findReferences(Object.getOwnPropertyDescriptor(o, 'x').get)
({'edge: shape; x getter':[{get x () {return 42;}}],
'edge: constructor':[{}],
'edge: machine stack':[null, null, null, null, null],
'edge: get':[{configurable:true,
enumerable:true,
get:#1=(function () {return 42;}),
set:(void 0)}]})
js> findReferences(Math.atan2)
({'edge: atan2':[Math], 'edge: machine stack':[null, null, null, null, null]})
js> findReferences(o)
({'edge: o':[{o:{get x () {return 42;}}}], 'edge: machine stack':[null, null, null, null, null]})
js>
We add a baseline field to nsInlineFrame and modify
nsLineLayout::BeginSpan to take a pointer to a baseline to update. This
also means that nsFirstLetterFrame no longer needs to update its own
baseline, and instead should just pass its own field along.
Originally, this reftest only failed on Windows (see bug 585684).
However, upon making standards mode compliant with CSS2.1, the bug
described in 585684 spread to all platforms, indicating it was actually
a layout bug and not d2d per se. This patch makes the anonymous div
inside textareas and text inputs inline-blocks so that they ignore
decorations defined on ancestors.
It would appear that shadows were expected to render above underlines,
violating the CSS3 spec for text-shadow
(http://dev.w3.org/csswg/css3-text/#text-shadow). The text-overflow
reftest relied on our previous standards-mode decoration implementation,
which drew strikethroughs after drawing the contents of the box,
regardless of whether there was any text; the reference thus no longer
needs to artificially introduce the decoration.
Make the quirks mode text-decoration + text-shadow code draw the
decorations for shadows that do not have a specified color using
the same color used for the un-shadowed decorations, which matches
standards mode behavior. (The color of unspecified-color shadows
is explicitly undefined in the specification.)
This code will (in a later patch on this bug) be used for both
quirks and standards modes.
Quirks-mode code draws text, and then all decorations. We need to instead draw
underlines, then overlines, -then- text, then line-throughs, as per CSS 2.1.
This involves refactoring nsTextFrame::PaintTextDecorations and
nsTextFrame::DrawText by merging them together, and also updating some
of their callers.
Rendering text decorations far away from the frame's baseline seems to
sometimes introduce rounding issues. This patch addresses that by
avoiding snapped-baseline weirdness and using a different argument to
nsTextFrame::PaintTextDecorations in some computations that didn't
really need to use the snapped baseline anyway.