<?xml version="1.0" encoding="UTF-8" standalone="yes" ?>
<!DOCTYPE bugzilla SYSTEM "https://bugs.webkit.org/page.cgi?id=bugzilla.dtd">

<bugzilla version="5.0.4.1"
          urlbase="https://bugs.webkit.org/"
          
          maintainer="admin@webkit.org"
>

    <bug>
          <bug_id>128538</bug_id>
          
          <creation_ts>2014-02-10 09:27:27 -0800</creation_ts>
          <short_desc>ContentData equals() methods are not inline-able</short_desc>
          <delta_ts>2014-02-12 04:40:43 -0800</delta_ts>
          <reporter_accessible>1</reporter_accessible>
          <cclist_accessible>1</cclist_accessible>
          <classification_id>1</classification_id>
          <classification>Unclassified</classification>
          <product>WebKit</product>
          <component>CSS</component>
          <version>528+ (Nightly build)</version>
          <rep_platform>Unspecified</rep_platform>
          <op_sys>Unspecified</op_sys>
          <bug_status>RESOLVED</bug_status>
          <resolution>FIXED</resolution>
          
          
          <bug_file_loc></bug_file_loc>
          <status_whiteboard></status_whiteboard>
          <keywords></keywords>
          <priority>P2</priority>
          <bug_severity>Normal</bug_severity>
          <target_milestone>---</target_milestone>
          
          
          <everconfirmed>1</everconfirmed>
          <reporter name="David Kilzer (:ddkilzer)">ddkilzer</reporter>
          <assigned_to name="David Kilzer (:ddkilzer)">ddkilzer</assigned_to>
          <cc>andersca</cc>
    
    <cc>ap</cc>
    
    <cc>benjamin</cc>
    
    <cc>commit-queue</cc>
    
    <cc>darin</cc>
    
    <cc>ddkilzer</cc>
    
    <cc>esprehn+autocc</cc>
    
    <cc>glenn</cc>
    
    <cc>kling</cc>
    
    <cc>koivisto</cc>
    
    <cc>kondapallykalyan</cc>
          

      

      

      

          <comment_sort_order>oldest_to_newest</comment_sort_order>  
          <long_desc isprivate="0" >
    <commentid>978916</commentid>
    <comment_count>0</comment_count>
    <who name="David Kilzer (:ddkilzer)">ddkilzer</who>
    <bug_when>2014-02-10 09:27:27 -0800</bug_when>
    <thetext>Per Darin Adler in Bug 128510 Comment #2:

(From update of attachment 223660 [details])
View in context: https://bugs.webkit.org/attachment.cgi?id=223660&amp;action=review

&gt; Source/WebCore/rendering/style/ContentData.h:105
&gt; +inline bool ImageContentData::equals(const ContentData&amp; data) const
&gt; +{
&gt; +    if (!data.isImage())
&gt; +        return false;
&gt; +    return *toImageContentData(data).image() == *image();
&gt; +}

I think we could move this to the .cpp file, because I think everyone calls it polymorphically and so nobody really inlines it.

I also think this could read nicely with &amp;&amp; rather than early return.

&gt; Source/WebCore/rendering/style/ContentData.h:135
&gt; +inline bool TextContentData::equals(const ContentData&amp; data) const
&gt; +{
&gt; +    if (!data.isText())
&gt; +        return false;
&gt; +    return toTextContentData(data).text() == text();
&gt; +}

Ditto.

&gt; Source/WebCore/rendering/style/ContentData.h:169
&gt; +inline bool CounterContentData::equals(const ContentData&amp; data) const
&gt; +{
&gt; +    if (!data.isCounter())
&gt; +        return false;
&gt; +    return *toCounterContentData(data).counter() == *counter();
&gt; +}

Again.

&gt; Source/WebCore/rendering/style/ContentData.h:199
&gt; +inline bool QuoteContentData::equals(const ContentData&amp; data) const
&gt; +{
&gt; +    if (!data.isQuote())
&gt; +        return false;
&gt; +    return toQuoteContentData(data).quote() == quote();
&gt; +}

Ditto.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>978921</commentid>
    <comment_count>1</comment_count>
    <who name="David Kilzer (:ddkilzer)">ddkilzer</who>
    <bug_when>2014-02-10 09:29:56 -0800</bug_when>
    <thetext>(In reply to comment #0)
&gt; Per Darin Adler in Bug 128510 Comment #2:
&gt; 
&gt; (From update of attachment 223660 [details] [details])
&gt; View in context: https://bugs.webkit.org/attachment.cgi?id=223660&amp;action=review
&gt; 
&gt; &gt; Source/WebCore/rendering/style/ContentData.h:105
&gt; &gt; +inline bool ImageContentData::equals(const ContentData&amp; data) const
&gt; &gt; +{
&gt; &gt; +    if (!data.isImage())
&gt; &gt; +        return false;
&gt; &gt; +    return *toImageContentData(data).image() == *image();
&gt; &gt; +}
&gt; 
&gt; I think we could move this to the .cpp file, because I think everyone calls it polymorphically and so nobody really inlines it.
&gt; 
&gt; I also think this could read nicely with &amp;&amp; rather than early return.

The only place the polymorphism (and the operator==() method) is used is in StyleRareNonInheritedData.cpp:

bool StyleRareNonInheritedData::contentDataEquivalent(const StyleRareNonInheritedData&amp; o) const
{
    ContentData* a = m_content.get();
    ContentData* b = o.m_content.get();

    while (a &amp;&amp; b &amp;&amp; *a == *b) { // operator==() used here.
        a = a-&gt;next();
        b = b-&gt;next();
    }

    return !a &amp;&amp; !b;
}

Is it worth leaving ContentData as an abstract base class for this one use?

An alternative approach would be to introduce a type enum for each subclass (a la CachedResource), which would let us devirtualize the type methods (isCounter, isImage, isQuote, isText), and implement the equals() methods as inline operator==() overloads instead of as pure virtual methods.

This is what the current operator==() method would look like with that change (plus individual operator==() methods for each specific type):

inline bool operator==(const ContentData&amp; a, const ContentData&amp; b)
{
    if (a.type() != b.type())
        return false;

    switch (a.type()) {
    case (ContentData::CounterType):
        return toCounterContentData(a) == toCounterContentData(b);
    case (ContentData::ImageType):
        return toImageContentData(a) == toImageContentData(b);
    case (ContentData::QuoteType):
        return toQuoteContentData(a) == toQuoteContentData(b);
    case (ContentData::TextType):
        return toTextContentData(a) == toTextContentData(b);
    }

    ASSERT_NOT_REACHED();
    return false;
}

Thoughts?</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>978963</commentid>
    <comment_count>2</comment_count>
      <attachid>223726</attachid>
    <who name="David Kilzer (:ddkilzer)">ddkilzer</who>
    <bug_when>2014-02-10 10:52:19 -0800</bug_when>
    <thetext>Created attachment 223726
Patch v1</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>979087</commentid>
    <comment_count>3</comment_count>
      <attachid>223726</attachid>
    <who name="Darin Adler">darin</who>
    <bug_when>2014-02-10 15:26:03 -0800</bug_when>
    <thetext>Comment on attachment 223726
Patch v1

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

&gt; Source/WebCore/rendering/style/ContentData.h:68
&gt; +    ContentData(Type type)

explicit

&gt; Source/WebCore/rendering/style/ContentData.h:160
&gt;      const CounterContent* counter() const { return m_counter.get(); }

Seems like this should return a reference rather than a pointer, unless it can be null.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>979742</commentid>
    <comment_count>4</comment_count>
    <who name="David Kilzer (:ddkilzer)">ddkilzer</who>
    <bug_when>2014-02-11 20:13:21 -0800</bug_when>
    <thetext>Committed r163936: &lt;http://trac.webkit.org/changeset/163936&gt;</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>979839</commentid>
    <comment_count>5</comment_count>
    <who name="David Kilzer (:ddkilzer)">ddkilzer</who>
    <bug_when>2014-02-12 04:40:43 -0800</bug_when>
    <thetext>(In reply to comment #3)
&gt; (From update of attachment 223726 [details])
&gt; &gt; Source/WebCore/rendering/style/ContentData.h:160
&gt; &gt;      const CounterContent* counter() const { return m_counter.get(); }
&gt; 
&gt; Seems like this should return a reference rather than a pointer, unless it can be null.

Filed Bug 128671.</thetext>
  </long_desc>
      
          <attachment
              isobsolete="0"
              ispatch="1"
              isprivate="0"
          >
            <attachid>223726</attachid>
            <date>2014-02-10 10:52:19 -0800</date>
            <delta_ts>2014-02-12 01:26:08 -0800</delta_ts>
            <desc>Patch v1</desc>
            <filename>bug-128538-20140210105218.patch</filename>
            <type>text/plain</type>
            <size>8871</size>
            <attacher name="David Kilzer (:ddkilzer)">ddkilzer</attacher>
            
              <data encoding="base64">U3VidmVyc2lvbiBSZXZpc2lvbjogMTYzNzcxCmRpZmYgLS1naXQgYS9Tb3VyY2UvV2ViQ29yZS9D
aGFuZ2VMb2cgYi9Tb3VyY2UvV2ViQ29yZS9DaGFuZ2VMb2cKaW5kZXggMzAyNTU5ZWI2NGEwMjc4
MWZlNjI0MmRmZTM2OGQ2MzJmYzU1MzFiZC4uNzc2MDY5NDNkODBkYjNjYWNkMTZmNzZhN2M3MTdk
NjJiOTI5ODVhOSAxMDA2NDQKLS0tIGEvU291cmNlL1dlYkNvcmUvQ2hhbmdlTG9nCisrKyBiL1Nv
dXJjZS9XZWJDb3JlL0NoYW5nZUxvZwpAQCAtMSw1ICsxLDI5IEBACiAyMDE0LTAyLTEwICBEYXZp
ZCBLaWx6ZXIgIDxkZGtpbHplckBhcHBsZS5jb20+CiAKKyAgICAgICAgQ29udGVudERhdGEgZXF1
YWxzKCkgbWV0aG9kcyBhcmUgbm90IGlubGluZS1hYmxlCisgICAgICAgIDxodHRwOi8vd2Via2l0
Lm9yZy9iLzEyODUzOD4KKworICAgICAgICBSZXZpZXdlZCBieSBOT0JPRFkgKE9PUFMhKS4KKwor
ICAgICAgICBHZXQgcmlkIG9mIHB1cmUgdmlydHVhbCBlcXVhbHMoKSBtZXRob2QgaW4gZmF2b3Ig
b2YKKyAgICAgICAgQ29udGVudERhdGE6OlR5cGUgZW51bSBmb3IgcnVudGltZSB0eXBlIGluZm9y
bWF0aW9uLgorICAgICAgICBUaGlzIGFsc28gbGV0cyB1cyBkZXZpcnR1YWxpemUgdGhlIGlzRm9v
KCkgbWV0aG9kcy4KKworICAgICAgICAqIHJlbmRlcmluZy9zdHlsZS9Db250ZW50RGF0YS5oOgor
ICAgICAgICAoV2ViQ29yZTo6Q29udGVudERhdGE6OnR5cGUpOiBBZGQuCisgICAgICAgIChXZWJD
b3JlOjpDb250ZW50RGF0YTo6aXNDb3VudGVyKTogRGV2aXJ0dWFsaXplLgorICAgICAgICAoV2Vi
Q29yZTo6Q29udGVudERhdGE6OmlzSW1hZ2UpOiBEZXZpcnR1YWxpemUuCisgICAgICAgIChXZWJD
b3JlOjpDb250ZW50RGF0YTo6aXNRdW90ZSk6IERldmlydHVhbGl6ZS4KKyAgICAgICAgKFdlYkNv
cmU6OkNvbnRlbnREYXRhOjppc1RleHQpOiBEZXZpcnR1YWxpemUuCisgICAgICAgIChXZWJDb3Jl
OjpDb250ZW50RGF0YTo6Q29udGVudERhdGEpOiBBZGQuICBJbmNsdWRlCisgICAgICAgIENvbnRl
bnREYXRhOjpUeXBlIHBhcmFtZXRlci4KKyAgICAgICAgKFdlYkNvcmU6Om9wZXJhdG9yPT0pOiBB
ZGQgb3ZlcmxvYWRlZCBtZXRob2RzIGZvciBlYWNoIHN1YmNsYXNzLgorICAgICAgICBTdG9wIHVz
aW5nIHB1cmUgdmlydHVhbCBlcXVhbHMoKSBtZXRob2QsIGNoZWNrIHR5cGUoKSwgYW5kIHVzZQor
ICAgICAgICBvdmVybG9hZGVkIHN1YmNsYXNzIG9wZXJhdG9yPT0oKSBtZXRob2RzLgorICAgICAg
ICAoV2ViQ29yZTo6b3BlcmF0b3IhPSk6IEFkZCBvdmVybG9hZGVkIG1ldGhvZHMgZm9yIGVhY2gg
c3ViY2xhc3MuCisKKzIwMTQtMDItMTAgIERhdmlkIEtpbHplciAgPGRka2lsemVyQGFwcGxlLmNv
bT4KKwogICAgICAgICBBZGQgdHlwZS1zYWZlIGNhc3RzIGZvciBDb250ZW50RGF0YSBzdWJjbGFz
c2VzCiAgICAgICAgIDxodHRwOi8vd2Via2l0Lm9yZy9iLzEyODUxMD4KIApkaWZmIC0tZ2l0IGEv
U291cmNlL1dlYkNvcmUvcmVuZGVyaW5nL3N0eWxlL0NvbnRlbnREYXRhLmggYi9Tb3VyY2UvV2Vi
Q29yZS9yZW5kZXJpbmcvc3R5bGUvQ29udGVudERhdGEuaAppbmRleCA3MGUyODI5NTUwNGU4ZDcw
Y2QwYjQ4ZDQxNWJmZGY5MzJmN2NhYzEwLi5iOGE3MGUzZWUwZmUxYTg1OWFlMmQ0NTdhNjVhMzdl
MjZkMjk1MWNmIDEwMDY0NAotLS0gYS9Tb3VyY2UvV2ViQ29yZS9yZW5kZXJpbmcvc3R5bGUvQ29u
dGVudERhdGEuaAorKysgYi9Tb3VyY2UvV2ViQ29yZS9yZW5kZXJpbmcvc3R5bGUvQ29udGVudERh
dGEuaApAQCAtMzksMTIgKzM5LDIwIEBAIGNsYXNzIFJlbmRlclN0eWxlOwogY2xhc3MgQ29udGVu
dERhdGEgewogICAgIFdURl9NQUtFX0ZBU1RfQUxMT0NBVEVEOwogcHVibGljOgorICAgIGVudW0g
VHlwZSB7CisgICAgICAgIENvdW50ZXJEYXRhVHlwZSwKKyAgICAgICAgSW1hZ2VEYXRhVHlwZSwK
KyAgICAgICAgUXVvdGVEYXRhVHlwZSwKKyAgICAgICAgVGV4dERhdGFUeXBlCisgICAgfTsKICAg
ICB2aXJ0dWFsIH5Db250ZW50RGF0YSgpIHsgfQogCi0gICAgdmlydHVhbCBib29sIGlzQ291bnRl
cigpIGNvbnN0IHsgcmV0dXJuIGZhbHNlOyB9Ci0gICAgdmlydHVhbCBib29sIGlzSW1hZ2UoKSBj
b25zdCB7IHJldHVybiBmYWxzZTsgfQotICAgIHZpcnR1YWwgYm9vbCBpc1F1b3RlKCkgY29uc3Qg
eyByZXR1cm4gZmFsc2U7IH0KLSAgICB2aXJ0dWFsIGJvb2wgaXNUZXh0KCkgY29uc3QgeyByZXR1
cm4gZmFsc2U7IH0KKyAgICBUeXBlIHR5cGUoKSBjb25zdCB7IHJldHVybiBtX3R5cGU7IH0KKwor
ICAgIGJvb2wgaXNDb3VudGVyKCkgY29uc3QgeyByZXR1cm4gdHlwZSgpID09IENvdW50ZXJEYXRh
VHlwZTsgfQorICAgIGJvb2wgaXNJbWFnZSgpIGNvbnN0IHsgcmV0dXJuIHR5cGUoKSA9PSBJbWFn
ZURhdGFUeXBlOyB9CisgICAgYm9vbCBpc1F1b3RlKCkgY29uc3QgeyByZXR1cm4gdHlwZSgpID09
IFF1b3RlRGF0YVR5cGU7IH0KKyAgICBib29sIGlzVGV4dCgpIGNvbnN0IHsgcmV0dXJuIHR5cGUo
KSA9PSBUZXh0RGF0YVR5cGU7IH0KIAogICAgIHZpcnR1YWwgUmVuZGVyUHRyPFJlbmRlck9iamVj
dD4gY3JlYXRlQ29udGVudFJlbmRlcmVyKERvY3VtZW50JiwgY29uc3QgUmVuZGVyU3R5bGUmKSBj
b25zdCA9IDA7CiAKQEAgLTU1LDE0ICs2MywxOSBAQCBwdWJsaWM6CiAKICAgICB2b2lkIHNldEFs
dFRleHQoY29uc3QgU3RyaW5nJiBhbHQpIHsgbV9hbHRUZXh0ID0gYWx0OyB9CiAgICAgY29uc3Qg
U3RyaW5nJiBhbHRUZXh0KCkgY29uc3QgeyByZXR1cm4gbV9hbHRUZXh0OyB9Ci0gICAgCi0gICAg
dmlydHVhbCBib29sIGVxdWFscyhjb25zdCBDb250ZW50RGF0YSYpIGNvbnN0ID0gMDsKKworcHJv
dGVjdGVkOgorICAgIENvbnRlbnREYXRhKFR5cGUgdHlwZSkKKyAgICAgICAgOiBtX3R5cGUodHlw
ZSkKKyAgICB7CisgICAgfQogCiBwcml2YXRlOgogICAgIHZpcnR1YWwgc3RkOjp1bmlxdWVfcHRy
PENvbnRlbnREYXRhPiBjbG9uZUludGVybmFsKCkgY29uc3QgPSAwOwogCiAgICAgc3RkOjp1bmlx
dWVfcHRyPENvbnRlbnREYXRhPiBtX25leHQ7CiAgICAgU3RyaW5nIG1fYWx0VGV4dDsKKyAgICBU
eXBlIG1fdHlwZTsKIH07CiAKICNkZWZpbmUgQ09OVEVOVF9EQVRBX1RZUEVfQ0FTVFMoVG9DbGFz
c05hbWUsIEZyb21DbGFzc05hbWUsIENvbnRlbnREYXRhTmFtZSkgXApAQCAtNzEsNyArODQsOCBA
QCBwcml2YXRlOgogY2xhc3MgSW1hZ2VDb250ZW50RGF0YSBmaW5hbCA6IHB1YmxpYyBDb250ZW50
RGF0YSB7CiBwdWJsaWM6CiAgICAgZXhwbGljaXQgSW1hZ2VDb250ZW50RGF0YShQYXNzUmVmUHRy
PFN0eWxlSW1hZ2U+IGltYWdlKQotICAgICAgICA6IG1faW1hZ2UoaW1hZ2UpCisgICAgICAgIDog
Q29udGVudERhdGEoSW1hZ2VEYXRhVHlwZSkKKyAgICAgICAgLCBtX2ltYWdlKGltYWdlKQogICAg
IHsKICAgICB9CiAKQEAgLTc5LDExICs5Myw4IEBAIHB1YmxpYzoKICAgICBTdHlsZUltYWdlKiBp
bWFnZSgpIHsgcmV0dXJuIG1faW1hZ2UuZ2V0KCk7IH0KICAgICB2b2lkIHNldEltYWdlKFBhc3NS
ZWZQdHI8U3R5bGVJbWFnZT4gaW1hZ2UpIHsgbV9pbWFnZSA9IGltYWdlOyB9CiAKLSAgICB2aXJ0
dWFsIGJvb2wgaXNJbWFnZSgpIGNvbnN0IG92ZXJyaWRlIHsgcmV0dXJuIHRydWU7IH0KICAgICB2
aXJ0dWFsIFJlbmRlclB0cjxSZW5kZXJPYmplY3Q+IGNyZWF0ZUNvbnRlbnRSZW5kZXJlcihEb2N1
bWVudCYsIGNvbnN0IFJlbmRlclN0eWxlJikgY29uc3Qgb3ZlcnJpZGU7CiAKLSAgICB2aXJ0dWFs
IGJvb2wgZXF1YWxzKGNvbnN0IENvbnRlbnREYXRhJikgY29uc3Qgb3ZlcnJpZGU7Ci0KIHByaXZh
dGU6CiAgICAgdmlydHVhbCBzdGQ6OnVuaXF1ZV9wdHI8Q29udGVudERhdGE+IGNsb25lSW50ZXJu
YWwoKSBjb25zdCBvdmVycmlkZQogICAgIHsKQEAgLTk3LDI4ICsxMDgsMjkgQEAgcHJpdmF0ZToK
IAogQ09OVEVOVF9EQVRBX1RZUEVfQ0FTVFMoSW1hZ2VDb250ZW50RGF0YSwgQ29udGVudERhdGEs
IEltYWdlKQogCi1pbmxpbmUgYm9vbCBJbWFnZUNvbnRlbnREYXRhOjplcXVhbHMoY29uc3QgQ29u
dGVudERhdGEmIGRhdGEpIGNvbnN0CitpbmxpbmUgYm9vbCBvcGVyYXRvcj09KGNvbnN0IEltYWdl
Q29udGVudERhdGEmIGEsIGNvbnN0IEltYWdlQ29udGVudERhdGEmIGIpCiB7Ci0gICAgaWYgKCFk
YXRhLmlzSW1hZ2UoKSkKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIHJldHVybiAqdG9JbWFn
ZUNvbnRlbnREYXRhKGRhdGEpLmltYWdlKCkgPT0gKmltYWdlKCk7CisgICAgcmV0dXJuICphLmlt
YWdlKCkgPT0gKmIuaW1hZ2UoKTsKK30KKworaW5saW5lIGJvb2wgb3BlcmF0b3IhPShjb25zdCBJ
bWFnZUNvbnRlbnREYXRhJiBhLCBjb25zdCBJbWFnZUNvbnRlbnREYXRhJiBiKQoreworICAgIHJl
dHVybiAhKGEgPT0gYik7CiB9CiAKIGNsYXNzIFRleHRDb250ZW50RGF0YSBmaW5hbCA6IHB1Ymxp
YyBDb250ZW50RGF0YSB7CiBwdWJsaWM6CiAgICAgZXhwbGljaXQgVGV4dENvbnRlbnREYXRhKGNv
bnN0IFN0cmluZyYgdGV4dCkKLSAgICAgICAgOiBtX3RleHQodGV4dCkKKyAgICAgICAgOiBDb250
ZW50RGF0YShUZXh0RGF0YVR5cGUpCisgICAgICAgICwgbV90ZXh0KHRleHQpCiAgICAgewogICAg
IH0KIAogICAgIGNvbnN0IFN0cmluZyYgdGV4dCgpIGNvbnN0IHsgcmV0dXJuIG1fdGV4dDsgfQog
ICAgIHZvaWQgc2V0VGV4dChjb25zdCBTdHJpbmcmIHRleHQpIHsgbV90ZXh0ID0gdGV4dDsgfQog
Ci0gICAgdmlydHVhbCBib29sIGlzVGV4dCgpIGNvbnN0IG92ZXJyaWRlIHsgcmV0dXJuIHRydWU7
IH0KICAgICB2aXJ0dWFsIFJlbmRlclB0cjxSZW5kZXJPYmplY3Q+IGNyZWF0ZUNvbnRlbnRSZW5k
ZXJlcihEb2N1bWVudCYsIGNvbnN0IFJlbmRlclN0eWxlJikgY29uc3Qgb3ZlcnJpZGU7CiAKLSAg
ICB2aXJ0dWFsIGJvb2wgZXF1YWxzKGNvbnN0IENvbnRlbnREYXRhJikgY29uc3Qgb3ZlcnJpZGU7
Ci0KIHByaXZhdGU6CiAgICAgdmlydHVhbCBzdGQ6OnVuaXF1ZV9wdHI8Q29udGVudERhdGE+IGNs
b25lSW50ZXJuYWwoKSBjb25zdCBvdmVycmlkZSB7IHJldHVybiBzdGQ6Om1ha2VfdW5pcXVlPFRl
eHRDb250ZW50RGF0YT4odGV4dCgpKTsgfQogCkBAIC0xMjcsMjQgKzEzOSwyNyBAQCBwcml2YXRl
OgogCiBDT05URU5UX0RBVEFfVFlQRV9DQVNUUyhUZXh0Q29udGVudERhdGEsIENvbnRlbnREYXRh
LCBUZXh0KQogCi1pbmxpbmUgYm9vbCBUZXh0Q29udGVudERhdGE6OmVxdWFscyhjb25zdCBDb250
ZW50RGF0YSYgZGF0YSkgY29uc3QKK2lubGluZSBib29sIG9wZXJhdG9yPT0oY29uc3QgVGV4dENv
bnRlbnREYXRhJiBhLCBjb25zdCBUZXh0Q29udGVudERhdGEmIGIpCiB7Ci0gICAgaWYgKCFkYXRh
LmlzVGV4dCgpKQotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgcmV0dXJuIHRvVGV4dENvbnRl
bnREYXRhKGRhdGEpLnRleHQoKSA9PSB0ZXh0KCk7CisgICAgcmV0dXJuIGEudGV4dCgpID09IGIu
dGV4dCgpOworfQorCitpbmxpbmUgYm9vbCBvcGVyYXRvciE9KGNvbnN0IFRleHRDb250ZW50RGF0
YSYgYSwgY29uc3QgVGV4dENvbnRlbnREYXRhJiBiKQoreworICAgIHJldHVybiAhKGEgPT0gYik7
CiB9CiAKIGNsYXNzIENvdW50ZXJDb250ZW50RGF0YSBmaW5hbCA6IHB1YmxpYyBDb250ZW50RGF0
YSB7CiBwdWJsaWM6CiAgICAgZXhwbGljaXQgQ291bnRlckNvbnRlbnREYXRhKHN0ZDo6dW5pcXVl
X3B0cjxDb3VudGVyQ29udGVudD4gY291bnRlcikKLSAgICAgICAgOiBtX2NvdW50ZXIoc3RkOjpt
b3ZlKGNvdW50ZXIpKQorICAgICAgICA6IENvbnRlbnREYXRhKENvdW50ZXJEYXRhVHlwZSkKKyAg
ICAgICAgLCBtX2NvdW50ZXIoc3RkOjptb3ZlKGNvdW50ZXIpKQogICAgIHsKICAgICB9CiAKICAg
ICBjb25zdCBDb3VudGVyQ29udGVudCogY291bnRlcigpIGNvbnN0IHsgcmV0dXJuIG1fY291bnRl
ci5nZXQoKTsgfQogICAgIHZvaWQgc2V0Q291bnRlcihzdGQ6OnVuaXF1ZV9wdHI8Q291bnRlckNv
bnRlbnQ+IGNvdW50ZXIpIHsgbV9jb3VudGVyID0gc3RkOjptb3ZlKGNvdW50ZXIpOyB9CiAKLSAg
ICB2aXJ0dWFsIGJvb2wgaXNDb3VudGVyKCkgY29uc3Qgb3ZlcnJpZGUgeyByZXR1cm4gdHJ1ZTsg
fQogICAgIHZpcnR1YWwgUmVuZGVyUHRyPFJlbmRlck9iamVjdD4gY3JlYXRlQ29udGVudFJlbmRl
cmVyKERvY3VtZW50JiwgY29uc3QgUmVuZGVyU3R5bGUmKSBjb25zdCBvdmVycmlkZTsKIAogcHJp
dmF0ZToKQEAgLTE1NCwzNSArMTY5LDM0IEBAIHByaXZhdGU6CiAgICAgICAgIHJldHVybiBzdGQ6
Om1ha2VfdW5pcXVlPENvdW50ZXJDb250ZW50RGF0YT4oc3RkOjptb3ZlKGNvdW50ZXJEYXRhKSk7
CiAgICAgfQogCi0gICAgdmlydHVhbCBib29sIGVxdWFscyhjb25zdCBDb250ZW50RGF0YSYpIGNv
bnN0IG92ZXJyaWRlOwotCiAgICAgc3RkOjp1bmlxdWVfcHRyPENvdW50ZXJDb250ZW50PiBtX2Nv
dW50ZXI7CiB9OwogCiBDT05URU5UX0RBVEFfVFlQRV9DQVNUUyhDb3VudGVyQ29udGVudERhdGEs
IENvbnRlbnREYXRhLCBDb3VudGVyKQogCi1pbmxpbmUgYm9vbCBDb3VudGVyQ29udGVudERhdGE6
OmVxdWFscyhjb25zdCBDb250ZW50RGF0YSYgZGF0YSkgY29uc3QKK2lubGluZSBib29sIG9wZXJh
dG9yPT0oY29uc3QgQ291bnRlckNvbnRlbnREYXRhJiBhLCBjb25zdCBDb3VudGVyQ29udGVudERh
dGEmIGIpCiB7Ci0gICAgaWYgKCFkYXRhLmlzQ291bnRlcigpKQotICAgICAgICByZXR1cm4gZmFs
c2U7Ci0gICAgcmV0dXJuICp0b0NvdW50ZXJDb250ZW50RGF0YShkYXRhKS5jb3VudGVyKCkgPT0g
KmNvdW50ZXIoKTsKKyAgICByZXR1cm4gKmEuY291bnRlcigpID09ICpiLmNvdW50ZXIoKTsKK30K
KworaW5saW5lIGJvb2wgb3BlcmF0b3IhPShjb25zdCBDb3VudGVyQ29udGVudERhdGEmIGEsIGNv
bnN0IENvdW50ZXJDb250ZW50RGF0YSYgYikKK3sKKyAgICByZXR1cm4gIShhID09IGIpOwogfQog
CiBjbGFzcyBRdW90ZUNvbnRlbnREYXRhIGZpbmFsIDogcHVibGljIENvbnRlbnREYXRhIHsKIHB1
YmxpYzoKICAgICBleHBsaWNpdCBRdW90ZUNvbnRlbnREYXRhKFF1b3RlVHlwZSBxdW90ZSkKLSAg
ICAgICAgOiBtX3F1b3RlKHF1b3RlKQorICAgICAgICA6IENvbnRlbnREYXRhKFF1b3RlRGF0YVR5
cGUpCisgICAgICAgICwgbV9xdW90ZShxdW90ZSkKICAgICB7CiAgICAgfQogCiAgICAgUXVvdGVU
eXBlIHF1b3RlKCkgY29uc3QgeyByZXR1cm4gbV9xdW90ZTsgfQogICAgIHZvaWQgc2V0UXVvdGUo
UXVvdGVUeXBlIHF1b3RlKSB7IG1fcXVvdGUgPSBxdW90ZTsgfQogCi0gICAgdmlydHVhbCBib29s
IGlzUXVvdGUoKSBjb25zdCBvdmVycmlkZSB7IHJldHVybiB0cnVlOyB9CiAgICAgdmlydHVhbCBS
ZW5kZXJQdHI8UmVuZGVyT2JqZWN0PiBjcmVhdGVDb250ZW50UmVuZGVyZXIoRG9jdW1lbnQmLCBj
b25zdCBSZW5kZXJTdHlsZSYpIGNvbnN0IG92ZXJyaWRlOwogCi0gICAgdmlydHVhbCBib29sIGVx
dWFscyhjb25zdCBDb250ZW50RGF0YSYpIGNvbnN0IG92ZXJyaWRlOwotCiBwcml2YXRlOgogICAg
IHZpcnR1YWwgc3RkOjp1bmlxdWVfcHRyPENvbnRlbnREYXRhPiBjbG9uZUludGVybmFsKCkgY29u
c3Qgb3ZlcnJpZGUgeyByZXR1cm4gc3RkOjptYWtlX3VuaXF1ZTxRdW90ZUNvbnRlbnREYXRhPihx
dW90ZSgpKTsgfQogCkBAIC0xOTEsMTYgKzIwNSwzNCBAQCBwcml2YXRlOgogCiBDT05URU5UX0RB
VEFfVFlQRV9DQVNUUyhRdW90ZUNvbnRlbnREYXRhLCBDb250ZW50RGF0YSwgUXVvdGUpCiAKLWlu
bGluZSBib29sIFF1b3RlQ29udGVudERhdGE6OmVxdWFscyhjb25zdCBDb250ZW50RGF0YSYgZGF0
YSkgY29uc3QKK2lubGluZSBib29sIG9wZXJhdG9yPT0oY29uc3QgUXVvdGVDb250ZW50RGF0YSYg
YSwgY29uc3QgUXVvdGVDb250ZW50RGF0YSYgYikKIHsKLSAgICBpZiAoIWRhdGEuaXNRdW90ZSgp
KQotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgcmV0dXJuIHRvUXVvdGVDb250ZW50RGF0YShk
YXRhKS5xdW90ZSgpID09IHF1b3RlKCk7CisgICAgcmV0dXJuIGEucXVvdGUoKSA9PSBiLnF1b3Rl
KCk7Cit9CisKK2lubGluZSBib29sIG9wZXJhdG9yIT0oY29uc3QgUXVvdGVDb250ZW50RGF0YSYg
YSwgY29uc3QgUXVvdGVDb250ZW50RGF0YSYgYikKK3sKKyAgICByZXR1cm4gIShhID09IGIpOwog
fQogCiBpbmxpbmUgYm9vbCBvcGVyYXRvcj09KGNvbnN0IENvbnRlbnREYXRhJiBhLCBjb25zdCBD
b250ZW50RGF0YSYgYikKIHsKLSAgICByZXR1cm4gYS5lcXVhbHMoYik7CisgICAgaWYgKGEudHlw
ZSgpICE9IGIudHlwZSgpKQorICAgICAgICByZXR1cm4gZmFsc2U7CisKKyAgICBzd2l0Y2ggKGEu
dHlwZSgpKSB7CisgICAgY2FzZSBDb250ZW50RGF0YTo6Q291bnRlckRhdGFUeXBlOgorICAgICAg
ICByZXR1cm4gdG9Db3VudGVyQ29udGVudERhdGEoYSkgPT0gdG9Db3VudGVyQ29udGVudERhdGEo
Yik7CisgICAgY2FzZSBDb250ZW50RGF0YTo6SW1hZ2VEYXRhVHlwZToKKyAgICAgICAgcmV0dXJu
IHRvSW1hZ2VDb250ZW50RGF0YShhKSA9PSB0b0ltYWdlQ29udGVudERhdGEoYik7CisgICAgY2Fz
ZSBDb250ZW50RGF0YTo6UXVvdGVEYXRhVHlwZToKKyAgICAgICAgcmV0dXJuIHRvUXVvdGVDb250
ZW50RGF0YShhKSA9PSB0b1F1b3RlQ29udGVudERhdGEoYik7CisgICAgY2FzZSBDb250ZW50RGF0
YTo6VGV4dERhdGFUeXBlOgorICAgICAgICByZXR1cm4gdG9UZXh0Q29udGVudERhdGEoYSkgPT0g
dG9UZXh0Q29udGVudERhdGEoYik7CisgICAgfQorCisgICAgQVNTRVJUX05PVF9SRUFDSEVEKCk7
CisgICAgcmV0dXJuIGZhbHNlOwogfQogCiBpbmxpbmUgYm9vbCBvcGVyYXRvciE9KGNvbnN0IENv
bnRlbnREYXRhJiBhLCBjb25zdCBDb250ZW50RGF0YSYgYikK
</data>
<flag name="review"
          id="247791"
          type_id="1"
          status="+"
          setter="darin"
    />
          </attachment>
      

    </bug>

</bugzilla>