RESOLVED FIXED Bug 137918
Use references instead of pointers in EditingStyle
https://bugs.webkit.org/show_bug.cgi?id=137918
Summary Use references instead of pointers in EditingStyle
Tibor Mészáros
Reported 2014-10-21 05:01:34 PDT
As Darin Adler suggested: "Good idea for future refactoring. Both arguments to this function template should be references." Reference url: https://bugs.webkit.org/show_bug.cgi?id=133796#c20
Attachments
Patch (24.17 KB, patch)
2014-10-21 05:16 PDT, Tibor Mészáros
no flags
Patch (28.02 KB, patch)
2014-11-06 08:21 PST, Tibor Mészáros
cdumez: review-
cdumez: commit-queue-
Patch v2 (19.39 KB, patch)
2014-11-11 04:06 PST, Tibor Mészáros
no flags
Patch v3 (20.71 KB, patch)
2014-11-11 04:09 PST, Tibor Mészáros
cdumez: review+
cdumez: commit-queue-
Patch v4 (20.66 KB, patch)
2014-11-13 07:38 PST, Tibor Mészáros
no flags
Patch v5 (20.66 KB, patch)
2014-11-14 04:44 PST, Tibor Mészáros
darin: review+
Patch v6 (20.69 KB, patch)
2014-11-25 06:46 PST, Tibor Mészáros
no flags
Tibor Mészáros
Comment 1 2014-10-21 05:16:48 PDT
Darin Adler
Comment 2 2014-10-21 15:51:12 PDT
Comment on attachment 240197 [details] Patch View in context: https://bugs.webkit.org/attachment.cgi?id=240197&action=review Looks good. > Source/WebCore/editing/EditingStyle.cpp:648 > template<typename T> > TriState EditingStyle::triStateOfStyle(T* styleToCompare, ShouldIgnoreTextOnlyProperties shouldIgnoreTextOnlyProperties) const Seems like T* needs to change to T& here too, in a subsequent patch. > Source/WebCore/editing/EditingStyle.cpp:851 > + return getPropertiesNotIn(*m_mutableStyle.get(), computedStyle)->isEmpty(); No need for ".get()" here or in the many other places that do *x.get().
Tibor Mészáros
Comment 3 2014-11-06 08:21:41 PST
Created attachment 241109 [details] Patch Updated patch
Chris Dumez
Comment 4 2014-11-06 10:04:57 PST
Comment on attachment 241109 [details] Patch View in context: https://bugs.webkit.org/attachment.cgi?id=241109&action=review r- because at least one of the dereference does not seem safe. > Source/WebCore/editing/EditingStyle.cpp:54 > +#include <stdio.h> Why? > Source/WebCore/editing/EditingStyle.cpp:136 > + return propertyCSSValue; return propertyCSSValue.release(); > Source/WebCore/editing/EditingStyle.cpp:137 > + return PassRefPtr<CSSValue>(); We usually just return nullptr; as this is shorter. > Source/WebCore/editing/EditingStyle.cpp:344 > + m_mutableStyle = style.mutableCopy(); Can this be moved to the initializer list now? > Source/WebCore/editing/ReplaceSelectionCommand.cpp:489 > + RefPtr<EditingStyle> newInlineStyle = EditingStyle::create(*inlineStyle); Why is this safe? There is a null check right after... > Source/WebCore/editing/ReplaceSelectionCommand.cpp:791 > + RefPtr<EditingStyle> style = EditingStyle::create(*wrappingStyleSpan->inlineStyle()); Why is this safe?
Chris Dumez
Comment 5 2014-11-06 10:11:27 PST
Comment on attachment 241109 [details] Patch View in context: https://bugs.webkit.org/attachment.cgi?id=241109&action=review > Source/WebCore/editing/EditingStyle.cpp:673 > + return triStateOfStyle(*EditingStyle::styleAtSelectionStart(selection)); EditingStyle::styleAtSelectionStart() can return null, why is it safe?
Tibor Mészáros
Comment 6 2014-11-11 04:06:22 PST
Created attachment 241349 [details] Patch v2 Almost all of the suggested change has been taken, but some not: > Source/WebCore/editing/EditingStyle.cpp:344 > + m_mutableStyle = style.mutableCopy(); Can this be moved to the initializer list now? No, it could not be moved to initializer list, because style could be nullptr. > Source/WebCore/editing/ReplaceSelectionCommand.cpp:489 > + RefPtr<EditingStyle> newInlineStyle = EditingStyle::create(*inlineStyle); Why is this safe? There is a null check right after... This change has been removed from the patch. > Source/WebCore/editing/ReplaceSelectionCommand.cpp:791 > + RefPtr<EditingStyle> style = EditingStyle::create(*wrappingStyleSpan->inlineStyle()); Why is this safe? This change has been removed too.
Tibor Mészáros
Comment 7 2014-11-11 04:09:28 PST
Created attachment 241350 [details] Patch v3 The changelog is missing from the previous patch.
Chris Dumez
Comment 8 2014-11-11 09:34:05 PST
Comment on attachment 241350 [details] Patch v3 View in context: https://bugs.webkit.org/attachment.cgi?id=241350&action=review r=me with one fix before landing. > Source/WebCore/editing/EditingStyle.cpp:1520 > + if (!is<CSSPrimitiveValue>(&fontWeight)) No, this is wrong. You will do an unnecessary null check. Just use if (!is<CSSPrimitiveValue>(fontWeight))
Darin Adler
Comment 9 2014-11-11 09:35:34 PST
Comment on attachment 241350 [details] Patch v3 View in context: https://bugs.webkit.org/attachment.cgi?id=241350&action=review > Source/WebCore/editing/EditingStyle.cpp:135 > + if (RefPtr<CSSValue> propertyCSSValue = style.getPropertyCSSValue(propertyID)) > + return propertyCSSValue.release(); > + return 0; There is no reason for this if statement. Just: return style.getPropertyCSSValue(propertyID); Also, please use nullptr, not 0, in the future. >> Source/WebCore/editing/EditingStyle.cpp:1520 >> - if (!is<CSSPrimitiveValue>(fontWeight)) >> + if (!is<CSSPrimitiveValue>(&fontWeight)) > > No, this is wrong. You will do an unnecessary null check. Just use if (!is<CSSPrimitiveValue>(fontWeight)) There is no need for this change. The is template should work on references as well as pointers.
Darin Adler
Comment 10 2014-11-11 09:36:00 PST
Comment on attachment 241350 [details] Patch v3 View in context: https://bugs.webkit.org/attachment.cgi?id=241350&action=review >>> Source/WebCore/editing/EditingStyle.cpp:1520 >>> + if (!is<CSSPrimitiveValue>(&fontWeight)) >> >> No, this is wrong. You will do an unnecessary null check. Just use if (!is<CSSPrimitiveValue>(fontWeight)) > > There is no need for this change. The is template should work on references as well as pointers. Oops, my comment was not a response to Chris’s comment. In fact I was trying to say the same thing he was!
Csaba Osztrogonác
Comment 11 2014-11-13 07:12:32 PST
Comment on attachment 241350 [details] Patch v3 View in context: https://bugs.webkit.org/attachment.cgi?id=241350&action=review > Source/WebCore/editing/EditingStyle.cpp:1550 > - return fontWeightIsBold(extractPropertyValue(style, CSSPropertyFontWeight).get()); > + return fontWeightIsBold(*extractPropertyValue(style, CSSPropertyFontWeight).get()); It isn't safe, extractPropertyValue() can return with nullptr. In this case you should return false.
Tibor Mészáros
Comment 12 2014-11-13 07:38:44 PST
Created attachment 241485 [details] Patch v4 I have updated the patch. The problem with it: + if (!is<CSSPrimitiveValue>(&fontWeight)) was that Csaba said, so I fixed the code as He suggested.
Tibor Mészáros
Comment 13 2014-11-13 08:02:42 PST
(In reply to comment #9) > Comment on attachment 241350 [details] > Patch v3 > > View in context: > https://bugs.webkit.org/attachment.cgi?id=241350&action=review > > > Source/WebCore/editing/EditingStyle.cpp:135 > > + if (RefPtr<CSSValue> propertyCSSValue = style.getPropertyCSSValue(propertyID)) > > + return propertyCSSValue.release(); > > + return 0; > > There is no reason for this if statement. Just: > > return style.getPropertyCSSValue(propertyID); > > Also, please use nullptr, not 0, in the future. Ok, I will use nullptr instead of 0, in the future. > > >> Source/WebCore/editing/EditingStyle.cpp:1520 > >> - if (!is<CSSPrimitiveValue>(fontWeight)) > >> + if (!is<CSSPrimitiveValue>(&fontWeight)) > > > > No, this is wrong. You will do an unnecessary null check. Just use if (!is<CSSPrimitiveValue>(fontWeight)) > > There is no need for this change. The is template should work on references > as well as pointers. I have updated this part of the code, as Chris, Csaba and You suggested.
Csaba Osztrogonác
Comment 14 2014-11-13 08:08:52 PST
Comment on attachment 241485 [details] Patch v4 View in context: https://bugs.webkit.org/attachment.cgi?id=241485&action=review > Source/WebCore/editing/EditingStyle.cpp:1163 > + Please remove this empty line before landing.
Darin Adler
Comment 15 2014-11-13 20:30:04 PST
Comment on attachment 241485 [details] Patch v4 View in context: https://bugs.webkit.org/attachment.cgi?id=241485&action=review > Source/WebCore/editing/EditingStyle.cpp:1548 > + RefPtr<CSSValue> fontWeight = extractPropertyValue(style, CSSPropertyFontWeight).get(); There is no need for the ".get()" here.
Tibor Mészáros
Comment 16 2014-11-14 04:44:12 PST
Created attachment 241580 [details] Patch v5 The new line, and the .get() has been removed.
Darin Adler
Comment 17 2014-11-14 17:22:34 PST
Comment on attachment 241580 [details] Patch v5 View in context: https://bugs.webkit.org/attachment.cgi?id=241580&action=review r=me as long as you can give a satisfactory answer to all the questions about how we know various pointers are non-null > Source/WebCore/editing/EditingStyle.cpp:651 > + RefPtr<MutableStyleProperties> difference = getPropertiesNotIn(*m_mutableStyle, styleToCompare); What guarantees that m_mutableStyle is non-null here? > Source/WebCore/editing/EditingStyle.cpp:1412 > + extractTextStyles(document, *mutableStyle, computedStyle.useFixedFontDefaultSize()); What guarantees that mutableStyle is non-null here? Can getPropertiesNotIn ever return null? > Source/WebCore/editing/EditingStyle.cpp:1548 > + return fontWeight ? fontWeightIsBold(*fontWeight) : false; Forgot to mention this last time. I think this is even nicer with &&: return fontWeight && fontWeightIsBold(*fontWeight); > Source/WebCore/editing/EditingStyle.cpp:1559 > + diffTextDecorations(*mutableStyle, CSSPropertyTextDecoration, baseTextDecorationsInEffect.get()); What guarantees mutableStyle is not null? Can EditingStyle::style ever return null?
Csaba Osztrogonác
Comment 18 2014-11-14 18:03:43 PST
Comment on attachment 241580 [details] Patch v5 View in context: https://bugs.webkit.org/attachment.cgi?id=241580&action=review >> Source/WebCore/editing/EditingStyle.cpp:1559 >> + diffTextDecorations(*mutableStyle, CSSPropertyTextDecoration, baseTextDecorationsInEffect.get()); > > What guarantees mutableStyle is not null? Can EditingStyle::style ever return null? Theoretically (without knowing the exact logic) it can, it simply returns m_mutableStyle.get(). But assuming if it can return nullptr, it isn't safe before this change, because diffTextDecorations() uses it without nullptr check: RefPtr<CSSValue> textDecoration = style->getPropertyCSSValue(propertID); ( http://trac.webkit.org/browser/trunk/Source/WebCore/editing/EditingStyle.cpp#L1502 )
Csaba Osztrogonác
Comment 19 2014-11-17 06:37:03 PST
(In reply to https://bugs.webkit.org/show_bug.cgi?id=133796#c20) > >> 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. The original idea was to refactor the code to use references instead of pointers for the arguments of extractPropertiesNotIn(...): https://trac.webkit.org/browser/trunk/Source/WebCore/editing/EditingStyle.cpp?rev=175067#L1553 But I think this patch tries to do too much thing at once. I tried to review it in details and find how to address the issues that Darin noticed, but it is to find the proper fix or answer quickly. So I suggest splitting up this patch to smaller pieces. The original idea can be a good starting point. Converting the second argument (baseStyle) from pointer to reference seems to be easy and safe at all. But I'm not sure if it is possible to do the same with the first argument (styleWithRedundantProperties), because extractPropertiesNotIn(...) is called from getPropertiesNotIn(...) directly and getPropertiesNotIn(...) is called from many places - most of them seems to be safe (null pointer checked), except one call: https://trac.webkit.org/browser/trunk/Source/WebCore/editing/EditingStyle.cpp?rev=175067#L651 Maybe it can be fixed with a null pointer check, but I have no idea what return value should triStateOfStyle() have if m_mutableStyle is null. Darin, Ryosuke? Maybe you have any idea for this issue.
Tibor Mészáros
Comment 20 2014-11-25 06:46:27 PST
Created attachment 242194 [details] Patch v6 updated patch
Tibor Mészáros
Comment 21 2014-11-25 06:57:47 PST
Comment on attachment 241580 [details] Patch v5 View in context: https://bugs.webkit.org/attachment.cgi?id=241580&action=review >> Source/WebCore/editing/EditingStyle.cpp:651 >> + RefPtr<MutableStyleProperties> difference = getPropertiesNotIn(*m_mutableStyle, styleToCompare); > > What guarantees that m_mutableStyle is non-null here? Good point, I added a nullptr check to guarantee that m_mutableStyle isn't nullptr. This case was previously handled by if(difference->isEmpty()) check below. >> Source/WebCore/editing/EditingStyle.cpp:1412 >> + extractTextStyles(document, *mutableStyle, computedStyle.useFixedFontDefaultSize()); > > What guarantees that mutableStyle is non-null here? Can getPropertiesNotIn ever return null? mutableStyle is the return value of getPropertiesNotIn(*style->style(), computedStyle). getPropertiesNotIn() simply pass through the return value of extractPropertiesNotIn(), which can't be nullptr. >> Source/WebCore/editing/EditingStyle.cpp:1548 >> + return fontWeight ? fontWeightIsBold(*fontWeight) : false; > > Forgot to mention this last time. I think this is even nicer with &&: > > return fontWeight && fontWeightIsBold(*fontWeight); Thanks, I fixed it too. >>> Source/WebCore/editing/EditingStyle.cpp:1559 >>> + diffTextDecorations(*mutableStyle, CSSPropertyTextDecoration, baseTextDecorationsInEffect.get()); >> >> What guarantees mutableStyle is not null? Can EditingStyle::style ever return null? > > Theoretically (without knowing the exact logic) it can, it simply returns m_mutableStyle.get(). > > But assuming if it can return nullptr, it isn't safe before this change, because diffTextDecorations() > uses it without nullptr check: RefPtr<CSSValue> textDecoration = style->getPropertyCSSValue(propertID); > ( http://trac.webkit.org/browser/trunk/Source/WebCore/editing/EditingStyle.cpp#L1502 ) Result is copied from the non null styleWithRedundantProperties, which guarantees that result->style() alias mutableStyle is non nullptr.
Csaba Osztrogonác
Comment 22 2014-12-02 09:14:14 PST
(In reply to comment #21) > Comment on attachment 241580 [details] > Patch v5 ... The answers convinced me, I can't find any other issue. Darin, do you agree if it is ready for landing now?
WebKit Commit Bot
Comment 23 2014-12-02 09:58:52 PST
Comment on attachment 242194 [details] Patch v6 Clearing flags on attachment: 242194 Committed r176668: <http://trac.webkit.org/changeset/176668>
WebKit Commit Bot
Comment 24 2014-12-02 09:58:58 PST
All reviewed patches have been landed. Closing bug.
Note You need to log in before you can comment on or make changes to this bug.