Closed Bug 1583031 Opened 6 years ago Closed 5 years ago

Sticky nesting goes wrong in servo/components/style/values/generics/border.rs and breaks scrolling, makes document not scrollable.

Categories

(Webtools :: Searchfox, defect, P1)

defect

Tracking

(Not tracked)

RESOLVED FIXED

People

(Reporter: emilio, Assigned: asuth)

References

(Regression, )

Details

If you go to https://searchfox.org/mozilla-central/source/servo/components/style/values/generics/border.rs you'll find that the page is not scrollable.

This is because of too many closing </div> tags, which I believe come from our sticky nesting code.

I believe this is a regression from bug 1556234.

Regressed by: 1556234

The page isn't scrollable in Chrome either so I'm not sure the above analysis is correct.
If I remove height:100%; overflow:hiddenon the <body> element then the page is scrollable, so it seems more like a CSS mistake to me...

(In reply to Mats Palmgren (:mats) from comment #3)

The page isn't scrollable in Chrome either so I'm not sure the above analysis is correct.
If I remove height:100%; overflow:hiddenon the <body> element then the page is scrollable, so it seems more like a CSS mistake to me...

The body is not supposed to be scrollable, <div id="scrolling"> is what's supposed to be scrollable, but it was closed eagerly so it was zero-height.

Ah, I see. It'd be great if someone could fix that typo soon-ish since this is rather crippling...

Severity: normal → critical
Priority: -- → P1

It's not only a typo, the sticky nesting code receives the opening / closing tag stuff from the indexer... Andrew, you're mast familiar with the nesting code than me, is there any chance you could take a look?

Otherwise let me know and I'll poke at it.

Flags: needinfo?(bugmail)

Disclaimer: This isn't happening for me on https://searchfox.org/mozilla-central/source/servo/components/style/values/generics/border.rs with the footer identifying the indexer run of "This page was generated by Searchfox 2019-9-24 10:36." I see 2 commits dated "2019-09-23" however. Maybe https://hg.mozilla.org/mozilla-central/rev/9e3056eb1c86f768f8932bd71628185e4e00e15a#l2.12 was the code that made things unhappy?

That said, I see the logic error and the underlying problem. The problem is caused by having 2 tokens on a line that both attempt to start nesting. My original patch logic had at least intended to only allow us to start a single nest per line, which is arguably the only sane thing to do for position:sticky. But in a refactoring I think I over-cleaned-up and made it so we can push more than one entry onto the nesting_stack which will indeed lead to math issues. https://github.com/mozsearch/mozsearch/blob/master/tools/src/format.rs#L177 needs to be guarded so that we don't re-enter the branch if starts_nest is already true. We only want the first thing causing us to nest a line to win.

Assignee: nobody → bugmail
Status: NEW → ASSIGNED
Flags: needinfo?(bugmail)

Okay, so there was indeed a guard like I thought (a_start != top.nesting_range.start_lineno), but that assumes that the start range of the nesting range is on the same line as the triggering token itself. This constraint no longer holds in the way the code intended it to. I evolved the concept of nestingRange to try and refer directly to the {}'s of the code block for super-cool highlighting purposes, with the presumption that the sticky line would be the line that has the token with the nestingRange on it and its enclosing div would run until the line before the closing brace.

This implies a constraint that the token with the nestingContext must precede the start of the nesting context. A pragmatic relaxation of this based on existing indexer limitations is that we may only have line-level information, so the constraint instead becomes that the nestingContext must not start on a line preceding the initiating token. (I think the indexer would need to perform some type of magic normalization for something like a "do-while" loop where the interesting condition expression lives after the code block. position:sticky can't just magically handle that.)

So that broken logic really didn't like this broken data that I fished out of an older webserver's indexing run:

{"loc":"00168:11-30","source":1,"syntax":"","pretty":"struct style::values::generics::border::GenericBorderRadius","sym":"style::values::generics::border::GenericBorderRadius","nestingRange":"157:4-177:19"}
{"loc":"00168:11-30","source":1,"syntax":"","pretty":"struct style::values::generics::border::GenericBorderRadius","sym":"style::values::generics::border::GenericBorderRadius","nestingRange":"168:11-177:19"}

The source as understood by that indexing run corresponds to:

#[derive( // 153
    Animate,
    Clone,
    ComputeSquaredDistance,
    Copy, // 157: FIRST NESTING VALUE STARTS HERE?!
    Debug,
    MallocSizeOf,
    PartialEq,
    SpecifiedValueInfo,
    ToAnimatedValue,
    ToComputedValue,
    ToResolvedValue,
    ToShmem,
)]
#[repr(C)]
pub struct GenericBorderRadius<LengthPercentage> { // 168
    /// The top left radius.
    #[shmem(field_bound)]
    pub top_left: GenericBorderCornerRadius<LengthPercentage>,
    /// The top right radius.
    pub top_right: GenericBorderCornerRadius<LengthPercentage>,
    /// The bottom right radius.
    pub bottom_right: GenericBorderCornerRadius<LengthPercentage>,
    /// The bottom left radius.
    pub bottom_left: GenericBorderCornerRadius<LengthPercentage>, // 177
}

Note that the line 157 thing is nonsensical. I started to try and dig into the save-analysis json files (there were 2 libs that seemed to include a "border.rs" file?) yesterday but had to break for dinner and unfortunately didn't get back to it before today's indexer run clobbered the precious save-analysis data. It's possible platform merging or the multiple libs that might contain the file complicated things.

This isn't the first time the rust save-analysis data has betrayed us in terms of positions being gibberish. See https://bugzilla.mozilla.org/show_bug.cgi?id=1562879#c13 for another sad time.

My tentative gameplan here is:

  • Ignore nestingContext information that appears invalid. It might make sense to do this during read_analysis, noting that it will lead to the data being dropped on merges so we would just expect not to see the bad data in analysis/ anymore.
  • Adjust the guard to operate on the token start rather than the nesting range start.
  • Make the starts_nest logic more paranoid.

For bug 1586619 (servo/components/style/values/specified/text.rs) the problem is similar again but happens multiple times in the file:

{"loc":"00171:11-23","source":1,"syntax":"","pretty":"struct style::values::specified::text::TextOverflow","sym":"style::values::specified::text::TextOverflow","nestingRange":"136:9-173:13"}
{"loc":"00171:11-23","source":1,"syntax":"","pretty":"struct style::values::specified::text::TextOverflow","sym":"style::values::specified::text::TextOverflow","nestingRange":"171:11-175:14"}

{"loc":"00474:9-26","source":1,"syntax":"","pretty":"enum style::values::specified::text::TextTransformCase","sym":"style::values::specified::text::TextTransformCase","nestingRange":"367:11-482:14"}
{"loc":"00474:9-26","source":1,"syntax":"","pretty":"enum style::values::specified::text::TextTransformCase","sym":"style::values::specified::text::TextTransformCase","nestingRange":"474:9-482:14"}

{"loc":"00955:9-18","source":1,"syntax":"","pretty":"enum style::values::specified::text::WordBreak","sym":"style::values::specified::text::WordBreak","nestingRange":"852:11-964:13"}
{"loc":"00955:9-18","source":1,"syntax":"","pretty":"enum style::values::specified::text::WordBreak","sym":"style::values::specified::text::WordBreak","nestingRange":"955:9-964:13"}

The save-analysis for all 4 platforms all seems correct for the first case above (TextOverflow):

        {
            "kind": "Struct",
            "id": {
                "krate": 0,
                "index": 56063
            },
            "span": {
                "file_name": "servo/components/style/values/specified/text.rs",
                "byte_start": 2073113,
                "byte_end": 2073125,
                "line_start": 171,
                "line_end": 171,
                "column_start": 12,
                "column_end": 24
            },
            "name": "TextOverflow",
            "qualname": "::values::specified::text::TextOverflow",
            "value": "TextOverflow { first, second }",
            "parent": null,
            "children": [
                {
                    "krate": 0,
                    "index": 56064
                },
                {
                    "krate": 0,
                    "index": 56065
                }
            ],
            "decl_id": null,
            "docs": " text-overflow. Specifies rendering when inline content overflows its line box edge.\n",
            "sig": null,
            "attributes": [
                {
                    "value": "structural_match",
                    "span": {
                        "file_name": "servo/components/style/values/specified/text.rs",
                        "byte_start": 2073102,
                        "byte_end": 2073372,
                        "line_start": 171,
                        "line_end": 176,
                        "column_start": 1,
                        "column_end": 2
                    }
                }
            ]
        },
        {
            "kind": "Field",
            "id": {
                "krate": 0,
                "index": 56064
            },
            "span": {
                "file_name": "servo/components/style/values/specified/text.rs",
                "byte_start": 2073238,
                "byte_end": 2073243,
                "line_start": 173,
                "line_end": 173,
                "column_start": 9,
                "column_end": 14
            },
            "name": "first",
            "qualname": "::values::specified::text::TextOverflow::first",
            "value": "values::specified::text::TextOverflowSide",
            "parent": {
                "krate": 0,
                "index": 56063
            },
            "children": [],
            "decl_id": null,
            "docs": " First value. Applies to end line box edge if no second is supplied; line-left edge otherwise.\n",
            "sig": null,
            "attributes": []
        },
        {
            "kind": "Field",
            "id": {
                "krate": 0,
                "index": 56065
            },
            "span": {
                "file_name": "servo/components/style/values/specified/text.rs",
                "byte_start": 2073337,
                "byte_end": 2073343,
                "line_start": 175,
                "line_end": 175,
                "column_start": 9,
                "column_end": 15
            },
            "name": "second",
            "qualname": "::values::specified::text::TextOverflow::second",
            "value": "std::option::Option<values::specified::text::TextOverflowSide>",
            "parent": {
                "krate": 0,
                "index": 56063
            },
            "children": [],
            "decl_id": null,
            "docs": " Second value. Applies to the line-right edge if supplied.\n",
            "sig": null,
            "attributes": []
        },

However, it appears that a similarly named definition is somehow colliding. This appears to be the definition whose span is getting erroneously unified:

        {
            "kind": "Enum",
            "id": {
                "krate": 0,
                "index": 56030
            },
            "span": {
                "file_name": "servo/components/style/values/specified/text.rs",
                "byte_start": 2071795,
                "byte_end": 2071811,
                "line_start": 136,
                "line_end": 136,
                "column_start": 10,
                "column_end": 26
            },
            "name": "TextOverflowSide",
            "qualname": "::values::specified::text::TextOverflowSide",
            "value": "TextOverflowSide::{Clip, Ellipsis, String}",
            "parent": null,
            "children": [
                {
                    "krate": 0,
                    "index": 56031
                },
                {
                    "krate": 0,
                    "index": 56033
                },
                {
                    "krate": 0,
                    "index": 56035
                }
            ],
            "decl_id": null,
            "docs": " A generic value for the `text-overflow` property.\n",
            "sig": null,
            "attributes": [
                {
                    "value": "repr(C, u8)",
                    "span": {
                        "file_name": "servo/components/style/values/specified/text.rs",
                        "byte_start": 2071771,
                        "byte_end": 2071785,
                        "line_start": 135,
                        "line_end": 135,
                        "column_start": 1,
                        "column_end": 15
                    }
                },
                {
                    "value": "structural_match",
                    "span": {
                        "file_name": "servo/components/style/values/specified/text.rs",
                        "byte_start": 2071786,
                        "byte_end": 2072025,
                        "line_start": 136,
                        "line_end": 143,
                        "column_start": 1,
                        "column_end": 2
                    }
                }
            ]
        },

And the problem is similar in the second case. The correct symbol "::values::specified::text::TextTransformCase" is apparently colliding with "::values::specified::text::TextTransform".

The problem appears to be the Defs map created by rust-indexer can experience collisions as it's run over all platforms at the same time. Confusingly, I could not reproduce when run just against our objdir/PLATFORM/ dirs, I also had to include a objdir/testing/geckodriver/PLATFORM/ and a rustlib/PLATFORM/analysis.

Running with debug logging like so: RUST_LOG=debug ~/mozsearch/tools/target/release/rust-indexer ~/index/mozilla-central/gecko-dev ~/index/mozilla-central/analysis ~/index/mozilla-central/objdir ~/index/mozilla-central/rustlib/src/rust/src ~/index/mozilla-central/objdir/x86_64-unknown-linux-gnu/debug/deps/save-analysis ~/index/mozilla-central/objdir/x86_64-apple-darwin/debug/deps/save-analysis ~/index/mozilla-central/objdir/x86_64-pc-windows-msvc/debug/deps/save-analysis ~/index/mozilla-central/objdir/thumbv7neon-linux-androideabi/debug/deps/save-analysis ~/index/mozilla-central/objdir/testing/geckodriver/x86_64-unknown-linux-gnu/debug/deps/save-analysis ~/index/mozilla-central/rustlib/x86_64-unknown-linux-gnu/analysis

Here's what's going on:

Here is the first TextOverflow def being added to the Defs map from the first servo save-analysis:

DEBUG 2019-10-14T20:35:08Z: rust_indexer: Indexing def: DefId(GlobalCrateId { name: "style", disambiguator: (5848791475604674575, 408823606405095592) }, 56063) -> Def { kind: Struct, id: Id { krate: 0, index: 56063 }, span: SpanData { file_name: "servo/components/style/values/specified/text.rs", byte_start: 2073113, byte_end: 2073125, line_start: Row(171, PhantomData), line_end: Row(171, PhantomData), column_start: Column(12, PhantomData), column_end: Column(24, PhantomData) }, name: "TextOverflow", qualname: "style::values::specified::text::TextOverflow", value: "TextOverflow { first, second }", parent: None, children: [Id { krate: 0, index: 56064 }, Id { krate: 0, index: 56065 }], decl_id: None, docs: " text-overflow. Specifies rendering when inline content overflows its line box edge.\n", sig: None, attributes: [Attribute { value: "structural_match", span: SpanData { file_name: "servo/components/style/values/specified/text.rs", byte_start: 2073102, byte_end: 2073372, line_start: Row(171, PhantomData), line_end: Row(176, PhantomData), column_start: Column(1, PhantomData), column_end: Column(2, PhantomData) } }] }

And here's the TextOverflowSide that eventually ends up colliding being added in, from the first servo save-analysis:

DEBUG 2019-10-14T20:35:08Z: rust_indexer: Indexing def: DefId(GlobalCrateId { name: "style", disambiguator: (5848791475604674575, 408823606405095592) }, 56030) -> Def { kind: Enum, id: Id { krate: 0, index: 56030 }, span: SpanData { file_name: "servo/components/style/values/specified/text.rs", byte_start: 2071795, byte_end: 2071811, line_start: Row(136, PhantomData), line_end: Row(136, PhantomData), column_start: Column(10, PhantomData), column_end: Column(26, PhantomData) }, name: "TextOverflowSide", qualname: "style::values::specified::text::TextOverflowSide", value: "TextOverflowSide::{Clip, Ellipsis, String}", parent: None, children: [Id { krate: 0, index: 56031 }, Id { krate: 0, index: 56033 }, Id { krate: 0, index: 56035 }], decl_id: None, docs: " A generic value for the text-overflow property.\n", sig: None, attributes: [Attribute { value: "repr(C, u8)", span: SpanData { file_name: "servo/components/style/values/specified/text.rs", byte_start: 2071771, byte_end: 2071785, line_start: Row(135, PhantomData), line_end: Row(135, PhantomData), column_start: Column(1, PhantomData), column_end: Column(15, PhantomData) } }, Attribute { value: "structural_match", span: SpanData { file_name: "servo/components/style/values/specified/text.rs", byte_start: 2071786, byte_end: 2072025, line_start: Row(136, PhantomData), line_end: Row(143, PhantomData), column_start: Column(1, PhantomData), column_end: Column(2, PhantomData) } }] }

The number to look at is the 56030.

Now here's the second save-analysis's TextOverflow:

DEBUG 2019-10-14T20:35:15Z: rust_indexer: Indexing def: DefId(GlobalCrateId { name: "style", disambiguator: (5848791475604674575, 408823606405095592) }, 56028) -> Def { kind: Struct, id: Id { krate: 0, index: 56028 }, span: SpanData { file_name: "servo/components/style/values/specified/text.rs", byte_start: 2073113, byte_end: 2073125, line_start: Row(171, PhantomData), line_end: Row(171, PhantomData), column_start: Column(12, PhantomData), column_end: Column(24, PhantomData) }, name: "TextOverflow", qualname: "style::values::specified::text::TextOverflow", value: "TextOverflow { first, second }", parent: None, children: [Id { krate: 0, index: 56029 }, Id { krate: 0, index: 56030 }], decl_id: None, docs: " text-overflow. Specifies rendering when inline content overflows its line box edge.\n", sig: None, attributes: [Attribute { value: "structural_match", span: SpanData { file_name: "servo/components/style/values/specified/text.rs", byte_start: 2073102, byte_end: 2073372, line_start: Row(171, PhantomData), line_end: Row(176, PhantomData), column_start: Column(1, PhantomData), column_end: Column(2, PhantomData) } }] }

Note that it:

  • Has exactly the same disambiguator from the first save-analysis file processed.
  • Has a child of 56030.

We can see debug log complaining about this when it gets to the 56030. Here it is saying it wants to index 56030

DEBUG 2019-10-14T20:35:15Z: rust_indexer: Indexing def: DefId(GlobalCrateId { name: "style", disambiguator: (5848791475604674575, 408823606405095592) }, 56030) -> Def { kind: Field, id: Id { krate: 0, index: 56030 }, span: SpanData { file_name: "servo/components/style/values/specified/text.rs", byte_start: 2073337, byte_end: 2073343, line_start: Row(175, PhantomData), line_end: Row(175, PhantomData), column_start: Column(9, PhantomData), column_end: Column(15, PhantomData) }, name: "second", qualname: "style::values::specified::text::TextOverflow::second", value: "std::option::Option<values::specified::text::TextOverflowSide>", parent: Some(Id { krate: 0, index: 56028 }), children: [], decl_id: None, docs: " Second value. Applies to the line-right edge if supplied.\n", sig: None, attributes: [] }

And the next line is the dupe being logged:

DEBUG 2019-10-14T20:35:15Z: rust_indexer: Found a definition with the same ID twice? Def { kind: Enum, id: Id { krate: 0, index: 56030 }, span: SpanData { file_name: "servo/components/style/values/specified/text.rs", byte_start: 2071795, byte_end: 2071811, line_start: Row(136, PhantomData), line_end: Row(136, PhantomData), column_start: Column(10, PhantomData), column_end: Column(26, PhantomData) }, name: "TextOverflowSide", qualname: "style::values::specified::text::TextOverflowSide", value: "TextOverflowSide::{Clip, Ellipsis, String}", parent: None, children: [Id { krate: 0, index: 56031 }, Id { krate: 0, index: 56033 }, Id { krate: 0, index: 56035 }], decl_id: None, docs: " A generic value for the text-overflow property.\n", sig: None, attributes: [Attribute { value: "repr(C, u8)", span: SpanData { file_name: "servo/components/style/values/specified/text.rs", byte_start: 2071771, byte_end: 2071785, line_start: Row(135, PhantomData), line_end: Row(135, PhantomData), column_start: Column(1, PhantomData), column_end: Column(15, PhantomData) } }, Attribute { value: "structural_match", span: SpanData { file_name: "servo/components/style/values/specified/text.rs", byte_start: 2071786, byte_end: 2072025, line_start: Row(136, PhantomData), line_end: Row(143, PhantomData), column_start: Column(1, PhantomData), column_end: Column(2, PhantomData) } }] }, Def { kind: Field, id: Id { krate: 0, index: 56030 }, span: SpanData { file_name: "servo/components/style/values/specified/text.rs", byte_start: 2073337, byte_end: 2073343, line_start: Row(175, PhantomData), line_end: Row(175, PhantomData), column_start: Column(9, PhantomData), column_end: Column(15, PhantomData) }, name: "second", qualname: "::values::specified::text::TextOverflow::second", value: "std::option::Option<values::specified::text::TextOverflowSide>", parent: Some(Id { krate: 0, index: 56028 }), children: [], decl_id: None, docs: " Second value. Applies to the line-right edge if supplied.\n", sig: None, attributes: [] }

And note that only 2 of the 4 save-analysis files have the same disambiguators. These are the 4 passes for the TextOverflow symbol:

DEBUG 2019-10-14T20:35:08Z: rust_indexer: Indexing def: DefId(GlobalCrateId { name: "style", disambiguator: (5848791475604674575, 408823606405095592) }, 56063) -> Def { kind: Struct, id: Id { krate: 0, index: 56063 }, span: SpanData { file_name: "servo/components/style/values/specified/text.rs", byte_start: 2073113, byte_end: 2073125, line_start: Row(171, PhantomData), line_end: Row(171, PhantomData), column_start: Column(12, PhantomData), column_end: Column(24, PhantomData) }, name: "TextOverflow", qualname: "style::values::specified::text::TextOverflow", value: "TextOverflow { first, second }", parent: None, children: [Id { krate: 0, index: 56064 }, Id { krate: 0, index: 56065 }], decl_id: None, docs: " text-overflow. Specifies rendering when inline content overflows its line box edge.\n", sig: None, attributes: [Attribute { value: "structural_match", span: SpanData { file_name: "servo/components/style/values/specified/text.rs", byte_start: 2073102, byte_end: 2073372, line_start: Row(171, PhantomData), line_end: Row(176, PhantomData), column_start: Column(1, PhantomData), column_end: Column(2, PhantomData) } }] }

DEBUG 2019-10-14T20:35:15Z: rust_indexer: Indexing def: DefId(GlobalCrateId { name: "style", disambiguator: (5848791475604674575, 408823606405095592) }, 56028) -> Def { kind: Struct, id: Id { krate: 0, index: 56028 }, span: SpanData { file_name: "servo/components/style/values/specified/text.rs", byte_start: 2073113, byte_end: 2073125, line_start: Row(171, PhantomData), line_end: Row(171, PhantomData), column_start: Column(12, PhantomData), column_end: Column(24, PhantomData) }, name: "TextOverflow", qualname: "style::values::specified::text::TextOverflow", value: "TextOverflow { first, second }", parent: None, children: [Id { krate: 0, index: 56029 }, Id { krate: 0, index: 56030 }], decl_id: None, docs: " text-overflow. Specifies rendering when inline content overflows its line box edge.\n", sig: None, attributes: [Attribute { value: "structural_match", span: SpanData { file_name: "servo/components/style/values/specified/text.rs", byte_start: 2073102, byte_end: 2073372, line_start: Row(171, PhantomData), line_end: Row(176, PhantomData), column_start: Column(1, PhantomData), column_end: Column(2, PhantomData) } }] }

DEBUG 2019-10-14T20:35:20Z: rust_indexer: Indexing def: DefId(GlobalCrateId { name: "style", disambiguator: (988834827071791058, 13408486560327807875) }, 55974) -> Def { kind: Struct, id: Id { krate: 0, index: 55974 }, span: SpanData { file_name: "servo\components\style\values\specified\text.rs", byte_start: 2073113, byte_end: 2073125, line_start: Row(171, PhantomData), line_end: Row(171, PhantomData), column_start: Column(12, PhantomData), column_end: Column(24, PhantomData) }, name: "TextOverflow", qualname: "style::values::specified::text::TextOverflow", value: "TextOverflow { first, second }", parent: None, children: [Id { krate: 0, index: 55975 }, Id { krate: 0, index: 55976 }], decl_id: None, docs: " text-overflow. Specifies rendering when inline content overflows its line box edge.\n", sig: None, attributes: [Attribute { value: "structural_match", span: SpanData { file_name: "servo\components\style\values\specified\text.rs", byte_start: 2073102, byte_end: 2073372, line_start: Row(171, PhantomData), line_end: Row(176, PhantomData), column_start: Column(1, PhantomData), column_end: Column(2, PhantomData) } }] }

DEBUG 2019-10-14T20:35:24Z: rust_indexer: Indexing def: DefId(GlobalCrateId { name: "style", disambiguator: (873712610437892590, 463794332490312197) }, 56079) -> Def { kind: Struct, id: Id { krate: 0, index: 56079 }, span: SpanData { file_name: "servo/components/style/values/specified/text.rs", byte_start: 2073113, byte_end: 2073125, line_start: Row(171, PhantomData), line_end: Row(171, PhantomData), column_start: Column(12, PhantomData), column_end: Column(24, PhantomData) }, name: "TextOverflow", qualname: "style::values::specified::text::TextOverflow", value: "TextOverflow { first, second }", parent: None, children: [Id { krate: 0, index: 56080 }, Id { krate: 0, index: 56081 }], decl_id: None, docs: " text-overflow. Specifies rendering when inline content overflows its line box edge.\n", sig: None, attributes: [Attribute { value: "structural_match", span: SpanData { file_name: "servo/components/style/values/specified/text.rs", byte_start: 2073102, byte_end: 2073372, line_start: Row(171, PhantomData), line_end: Row(176, PhantomData), column_start: Column(1, PhantomData), column_end: Column(2, PhantomData) } }] }

My naive first thought would be that it might be best for us to run rust-analyze.sh once per platform outputting to the per-platform analysis directories and then run a merge on those instead of trying to process all 4 platforms in a single invocation. This would be more consistent with our longer term plan to stop using save-analysis and instead do things more like the clang plugin. It also would help make investigating rust failures more straightforward.

Through some trial and error with bash scripting[1], pull requests up at https://github.com/mozsearch/mozsearch/pull/251 and https://github.com/mozsearch/mozsearch-mozilla/pull/59 which are the comment 14 solution.

I still plan to prepare a later patch for bullets 2 and 3 at the bottom of comment 8, but I wanted to make sure the rust analysis correctness issues were sorted out first. I'd like to apologize to those rust-focused searchfox users who were impacted by this for an extended period of time as I tried to dig in.

1: I find myself almost wishing we were using make, which is never a good sign.

Summary: Sticky nesting goes wrong in servo/components/style/values/generics/border.rs → Sticky nesting goes wrong in servo/components/style/values/generics/border.rs and breaks scrolling, makes document not scrollable.

The landing seems to have worked. The known failures were corrected last night by an out-of-cycle manual index triggering, and then today's normal post-nightly run seems to also have run successfully. If anyone is aware of any other reproductions of scrolling breakage, please chime in here. I'll try and prepare the final fixes over the weekend and will leave the bug open until those fixes land.

Disclaimer: Note that there's something weird and different going on with tokenizing in bug 1588908. Please report pages that aren't getting syntax highlighted there.

I'm going to mark this fixed because a fix landed on the bug there hasn't been a recurrence that has necessitated the additional guards I was thinking of. (And we don't have the test fixture infrastructure that I'd want, and that should really be its own bug, etc.)

Status: ASSIGNED → RESOLVED
Closed: 5 years ago
Resolution: --- → FIXED
You need to log in before you can comment on or make changes to this bug.