Bug 133796 - ASSERT_NOT_REACHED() in WebCore::fontWeightIsBold
Summary: ASSERT_NOT_REACHED() in WebCore::fontWeightIsBold
Status: NEW
Alias: None
Product: WebKit
Classification: Unclassified
Component: HTML Editing (show other bugs)
Version: 528+ (Nightly build)
Hardware: Unspecified Unspecified
: P2 Normal
Assignee: Nobody
URL:
Keywords: BlinkMergeCandidate, InRadar
Depends on:
Blocks: 116980
  Show dependency treegraph
 
Reported: 2014-06-12 07:20 PDT by Tibor Mészáros
Modified: 2019-05-30 09:26 PDT (History)
7 users (show)

See Also:


Attachments
Patch (5.50 KB, patch)
2014-06-12 07:28 PDT, Tibor Mészáros
buildbot: commit-queue-
Details | Formatted Diff | Diff
Archive of layout-test-results from webkit-ews-06 for mac-mountainlion (516.81 KB, application/zip)
2014-06-12 08:53 PDT, Build Bot
no flags Details
Archive of layout-test-results from webkit-ews-08 for mac-mountainlion (515.66 KB, application/zip)
2014-06-12 09:55 PDT, Build Bot
no flags Details
Archive of layout-test-results from webkit-ews-15 for mac-mountainlion-wk2 (544.49 KB, application/zip)
2014-06-13 01:57 PDT, Build Bot
no flags Details
Patch v2 (16.33 KB, patch)
2014-07-15 04:09 PDT, Tibor Mészáros
buildbot: commit-queue-
Details | Formatted Diff | Diff
Archive of layout-test-results from webkit-ews-14 for mac-mountainlion-wk2 (484.25 KB, application/zip)
2014-07-15 05:04 PDT, Build Bot
no flags Details
Archive of layout-test-results from webkit-ews-03 for mac-mountainlion (511.93 KB, application/zip)
2014-07-15 05:38 PDT, Build Bot
no flags Details
Archive of layout-test-results from webkit-ews-02 for mac-mountainlion (565.07 KB, application/zip)
2014-07-15 05:46 PDT, Build Bot
no flags Details
Patch v3 (16.33 KB, patch)
2014-07-15 07:11 PDT, Tibor Mészáros
darin: review-
darin: commit-queue-
Details | Formatted Diff | Diff

Note You need to log in before you can comment on or make changes to this bug.
Description Tibor Mészáros 2014-06-12 07:20:11 PDT
ASSERT_NOT_REACHED() in WebCore::fontWeightIsBold in WebCore::fontWeightIsBold(WebCore::CSSValue*) (Source/WebCore/editing/EditingStyle.cpp)
GIT rev.: 17538480d681894206b58ad8a613fa83bc726cbe
Debug EWebLauncher
Comment 1 Tibor Mészáros 2014-06-12 07:28:04 PDT
Created attachment 232953 [details]
Patch

The patch was tested with the two new test, and it works.
Comment 2 Build Bot 2014-06-12 08:53:39 PDT
Comment on attachment 232953 [details]
Patch

Attachment 232953 [details] did not pass mac-ews (mac):
Output: http://webkit-queues.appspot.com/results/5003576082432000

New failing tests:
editing/undo/remove-css-property-and-remove-style.html
css1/font_properties/font_weight_bolder.html
css1/font_properties/font_weight_lighter.html
editing/style/push-down-inline-styles.html
Comment 3 Build Bot 2014-06-12 08:53:42 PDT
Created attachment 232955 [details]
Archive of layout-test-results from webkit-ews-06 for mac-mountainlion

The attached test failures were seen while running run-webkit-tests on the mac-ews.
Bot: webkit-ews-06  Port: mac-mountainlion  Platform: Mac OS X 10.8.5
Comment 4 Build Bot 2014-06-12 09:55:23 PDT
Comment on attachment 232953 [details]
Patch

Attachment 232953 [details] did not pass mac-ews (mac):
Output: http://webkit-queues.appspot.com/results/6266763410931712

New failing tests:
editing/undo/remove-css-property-and-remove-style.html
css1/font_properties/font_weight_bolder.html
css1/font_properties/font_weight_lighter.html
editing/style/push-down-inline-styles.html
Comment 5 Build Bot 2014-06-12 09:55:26 PDT
Created attachment 232960 [details]
Archive of layout-test-results from webkit-ews-08 for mac-mountainlion

The attached test failures were seen while running run-webkit-tests on the mac-ews.
Bot: webkit-ews-08  Port: mac-mountainlion  Platform: Mac OS X 10.8.5
Comment 6 zalan 2014-06-12 13:08:38 PDT
Comment on attachment 232953 [details]
Patch

View in context: https://bugs.webkit.org/attachment.cgi?id=232953&action=review

> Source/WebCore/editing/EditingStyle.cpp:1516
>  static bool fontWeightIsBold(CSSValue* fontWeight)

This should take CSSValue&.

> Source/WebCore/editing/EditingStyle.cpp:1551
> +static bool fontWeightNeedsResolving(CSSValue* fontWeight)

This should take CSSValue& too.

> Source/WebCore/editing/EditingStyle.cpp:1574
> +    if (RefPtr<CSSValue> baseFontWeight = extractPropertyValue(baseStyle, CSSPropertyFontWeight)) {
> +        if (RefPtr<CSSValue> fontWeight = mutableStyle->getPropertyCSSValue(CSSPropertyFontWeight)) {
> +            if (!fontWeightNeedsResolving(fontWeight.get()) && (fontWeightIsBold(fontWeight.get()) == fontWeightIsBold(baseFontWeight.get())))

I can't comment on the correctness of this, but surely you could shave off at least one level of nesting here.
Comment 7 Ryosuke Niwa 2014-06-12 13:15:16 PDT
Comment on attachment 232953 [details]
Patch

View in context: https://bugs.webkit.org/attachment.cgi?id=232953&action=review

> Source/WebCore/editing/EditingStyle.cpp:1556
> +    return !(value == CSSValueLighter || value == CSSValueBolder);

I'd prefer putting CSSValueLighter and CSSValueBolder into fontWeightIsBold instead for now.
It would be incorrect in the case where lighter still results in bolded text or bolder resulting in "light" text
but that's probably better than not handling them correctly at all.
Comment 8 Build Bot 2014-06-13 01:57:37 PDT
Comment on attachment 232953 [details]
Patch

Attachment 232953 [details] did not pass mac-wk2-ews (mac-wk2):
Output: http://webkit-queues.appspot.com/results/6309241711230976

New failing tests:
editing/undo/remove-css-property-and-remove-style.html
css1/font_properties/font_weight_bolder.html
css1/font_properties/font_weight_lighter.html
editing/style/push-down-inline-styles.html
Comment 9 Build Bot 2014-06-13 01:57:42 PDT
Created attachment 233035 [details]
Archive of layout-test-results from webkit-ews-15 for mac-mountainlion-wk2

The attached test failures were seen while running run-webkit-tests on the mac-wk2-ews.
Bot: webkit-ews-15  Port: mac-mountainlion-wk2  Platform: Mac OS X 10.8.5
Comment 10 Tibor Mészáros 2014-07-15 04:09:24 PDT
Created attachment 234912 [details]
Patch v2

    Source/WebCore/editing/EditingStyle.cpp:1516
    static bool fontWeightIsBold(CSSValue* fontWeight)

Is now CSSValue&.

    Source/WebCore/editing/EditingStyle.cpp:1551
    +static bool fontWeightNeedsResolving(CSSValue* fontWeight)

Is now CSSValue&.

    Source/WebCore/editing/EditingStyle.cpp:1574
    + if (RefPtr<CSSValue> baseFontWeight = extractPropertyValue(baseStyle, CSSPropertyFontWeight)) {
    + if (RefPtr<CSSValue> fontWeight = mutableStyle->getPropertyCSSValue(CSSPropertyFontWeight)) {
    + if (!fontWeightNeedsResolving(fontWeight.get()) && (fontWeightIsBold(fontWeight.get()) fontWeightIsBold(baseFontWeight.get())))

Merged the upper three "If" into one

    Source/WebCore/editing/EditingStyle.cpp:1556
    + return !(value CSSValueLighter || value == CSSValueBolder);

I had put CSSValueLighter and CSSValueBolder into fontWeightIsBold. It will be correct in the case where lighter still results in bolded text or bolder resulting in "light" text.
Comment 11 Build Bot 2014-07-15 05:04:12 PDT
Comment on attachment 234912 [details]
Patch v2

Attachment 234912 [details] did not pass mac-wk2-ews (mac-wk2):
Output: http://webkit-queues.appspot.com/results/5523394724364288

New failing tests:
css1/font_properties/font_weight_bolder.html
Comment 12 Build Bot 2014-07-15 05:04:17 PDT
Created attachment 234914 [details]
Archive of layout-test-results from webkit-ews-14 for mac-mountainlion-wk2

The attached test failures were seen while running run-webkit-tests on the mac-wk2-ews.
Bot: webkit-ews-14  Port: mac-mountainlion-wk2  Platform: Mac OS X 10.8.5
Comment 13 Build Bot 2014-07-15 05:38:25 PDT
Comment on attachment 234912 [details]
Patch v2

Attachment 234912 [details] did not pass mac-ews (mac):
Output: http://webkit-queues.appspot.com/results/6531884183977984

New failing tests:
css1/font_properties/font_weight_bolder.html
Comment 14 Build Bot 2014-07-15 05:38:30 PDT
Created attachment 234916 [details]
Archive of layout-test-results from webkit-ews-03 for mac-mountainlion

The attached test failures were seen while running run-webkit-tests on the mac-ews.
Bot: webkit-ews-03  Port: mac-mountainlion  Platform: Mac OS X 10.8.5
Comment 15 Build Bot 2014-07-15 05:46:20 PDT
Comment on attachment 234912 [details]
Patch v2

Attachment 234912 [details] did not pass mac-ews (mac):
Output: http://webkit-queues.appspot.com/results/6507261136470016

New failing tests:
css1/font_properties/font_weight_bolder.html
Comment 16 Build Bot 2014-07-15 05:46:24 PDT
Created attachment 234917 [details]
Archive of layout-test-results from webkit-ews-02 for mac-mountainlion

The attached test failures were seen while running run-webkit-tests on the mac-ews.
Bot: webkit-ews-02  Port: mac-mountainlion  Platform: Mac OS X 10.8.5
Comment 17 Tibor Mészáros 2014-07-15 07:11:54 PDT
Created attachment 234923 [details]
Patch v3

The test expectation has been fixed.
Comment 18 Myles C. Maxfield 2014-07-15 09:50:32 PDT
Comment on attachment 234923 [details]
Patch v3

View in context: https://bugs.webkit.org/attachment.cgi?id=234923&action=review

> Source/WebCore/editing/EditingStyle.cpp:1557
> +    ASSERT(baseStyle);

If you're going to ASSERT this, why not make it a reference?
Comment 19 Myles C. Maxfield 2014-07-15 09:52:01 PDT
Comment on attachment 234923 [details]
Patch v3

View in context: https://bugs.webkit.org/attachment.cgi?id=234923&action=review

> Source/WebCore/editing/EditingStyle.cpp:1533
> +        case CSSValueLighter:

This doesn't seem to conceptually make sense... "Lighter" means bold?
Comment 20 Darin Adler 2014-07-16 10:59:43 PDT
Comment on attachment 234923 [details]
Patch v3

View in context: https://bugs.webkit.org/attachment.cgi?id=234923&action=review

Patch is well meaning but wrong.

The real problem is far away from this code, and quieting the assertion here is not a real fix.

> LayoutTests/ChangeLog:12
> +        * css1/font_properties/font_weight_bolder.html: Added.
> +        * css1/font_properties/font_weight_lighter.html: Added.

Test cases should be reference tests.

I think it’s really strange to have these tests in the css1 directory. These are editing tests and belong in the editing directory.

In a CSS test directory (not this css1 one) we could have tests to make sure that bolder and lighter are rejected as keyword values during the CSS parsing process. Only a few special paths in editing code should parse in a mode that allows these values.

> LayoutTests/css1/font_properties/font_weight_bolder.html:4
> +        font-weight:bolder;

We should not allow this syntax in a style sheet. The “bolder” and “lighter” values are a special CSS hack for editing, and it’s an error to allow a style rule to actually contain that value. The real fix would be to find a way to address that issue.

> LayoutTests/css1/font_properties/font_weight_bolder.html:12
> +               <animatemotion onload='document.execCommand("selectall")'></animatemotion>

Why on earth does this test case include SVG? Is that needed to reproduce the bug or just a strange choice we are making?

>> Source/WebCore/editing/EditingStyle.cpp:1533
>> +        case CSSValueLighter:
> 
> This doesn't seem to conceptually make sense... "Lighter" means bold?

Myles is absolutely right. It’s wrong to say that bolder and lighter are bold weights. The current behavior of this function where it asserts in that case is correct.

To correctly deal with the values “bolder” and “lighter”, they need to never be considered the same as existing style; a correct fix would always skip the removeProperty call when the mutable style’s property was bolder or lighter, and continue to assert if the other style contains bolder or lighter. See below.

>> Source/WebCore/editing/EditingStyle.cpp:1557
>> +    ASSERT(baseStyle);
> 
> If you're going to ASSERT this, why not make it a reference?

Good idea for future refactoring. Both arguments to this function template should be references.

> Source/WebCore/editing/EditingStyle.cpp:1572
> +    if ((baseFontWeight = extractPropertyValue(baseStyle, CSSPropertyFontWeight))
> +        && (fontWeight = mutableStyle->getPropertyCSSValue(CSSPropertyFontWeight))
> +        && (fontWeightIsBold(*fontWeight) == fontWeightIsBold(*baseFontWeight))) {
> +            mutableStyle->removeProperty(CSSPropertyFontWeight);
> +    }

If fontWeight is bolder or lighter, then we should skip removeProperty regardless of the value of baseFontWeight. That needs to be done here; I don’t see a way to correctly encapsulate it in the fontWeightIsBold helper function.

If the font weight is the minimum the we could remove “lighter”, and if the font weight is the maximum we could remove “bolder”. That would be nice to get right, but it’s an edge case that I don’t think is critical.

I’d like to see test cases covering this behavior, including the edge cases.

If baseFontWeight is bolder or lighter, then the bug has already happened. Such styles should never be allowed in CSS styles on actual elements. Those values are a hack to be used inside the editing machinery and in API not exposed to JavaScript. If JavaScript can ever see those values, then we have a bug.

The refactoring to use references instead of pointers we are doing here messes up the logic here and makes this function harder to read. We should think about how to handle that, and why boldness is different from the other properties below in this respect. I suspect that refactoring is not really part of this bug fix and we should consider doing it separately.
Comment 21 Darin Adler 2014-07-16 11:01:40 PDT
There are really two different bugs here.

One bug is that the CSS machinery is allowing these invalid values (bolder and lighter) to become property values on actual elements and in actual stylesheets. That should be fixed by rejecting these values the same way we’d reject any other illegal keywords.

A second possible bug is that the editing code may not handle lighter and bolder correctly in the process of doing editing operations.

Both would result in hitting this assertion.

The existing patch is not the correct fix for either of these problems.
Comment 22 Ryosuke Niwa 2014-07-16 12:18:02 PDT
Comment on attachment 234923 [details]
Patch v3

View in context: https://bugs.webkit.org/attachment.cgi?id=234923&action=review

>> LayoutTests/ChangeLog:12
>> +        * css1/font_properties/font_weight_lighter.html: Added.
> 
> Test cases should be reference tests.
> 
> I think it’s really strange to have these tests in the css1 directory. These are editing tests and belong in the editing directory.
> 
> In a CSS test directory (not this css1 one) we could have tests to make sure that bolder and lighter are rejected as keyword values during the CSS parsing process. Only a few special paths in editing code should parse in a mode that allows these values.

bolder and lighter are real CSS2.1 values:
http://www.w3.org/TR/CSS21/fonts.html#font-boldness

>> Source/WebCore/editing/EditingStyle.cpp:1572
>> +    }
> 
> If fontWeight is bolder or lighter, then we should skip removeProperty regardless of the value of baseFontWeight. That needs to be done here; I don’t see a way to correctly encapsulate it in the fontWeightIsBold helper function.
> 
> If the font weight is the minimum the we could remove “lighter”, and if the font weight is the maximum we could remove “bolder”. That would be nice to get right, but it’s an edge case that I don’t think is critical.
> 
> I’d like to see test cases covering this behavior, including the edge cases.
> 
> If baseFontWeight is bolder or lighter, then the bug has already happened. Such styles should never be allowed in CSS styles on actual elements. Those values are a hack to be used inside the editing machinery and in API not exposed to JavaScript. If JavaScript can ever see those values, then we have a bug.
> 
> The refactoring to use references instead of pointers we are doing here messes up the logic here and makes this function harder to read. We should think about how to handle that, and why boldness is different from the other properties below in this respect. I suspect that refactoring is not really part of this bug fix and we should consider doing it separately.

lighter and bolder are valid CSS values.  They bolden & lighten text weight relative to the inherited font weight.
I do agree that one correct approach is avoid removing font-weight property when those values are used.

Alternatively, we can also try to resolve the computed font weight by pluming values from render style but that's going to be a lot of work.
Comment 23 Darin Adler 2014-07-16 17:47:43 PDT
OK, sorry I got that wrong about bolder and lighter being a special editing hack.

The rest of my comments are still relevant. I think we should be able to fix this by treating bolder and lighter as “never to be removed”. Treating them as “bold” is not what we want. We need test cases that cover this behavior, not just test cases that check if there is a crash or not.
Comment 24 Brent Fulgham 2018-02-15 11:02:46 PST
<rdar://problem/37505183>
Comment 25 Brent Fulgham 2019-05-30 09:26:30 PDT
This is actually:

<rdar://problem/27711671>