<?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>235384</bug_id>
          
          <creation_ts>2022-01-19 14:35:29 -0800</creation_ts>
          <short_desc>AXIsolatedTree::updateChildren childrenIDs and children local variables could get out of sync</short_desc>
          <delta_ts>2022-01-20 13:04:00 -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>Accessibility</component>
          <version>WebKit Nightly Build</version>
          <rep_platform>All</rep_platform>
          <op_sys>All</op_sys>
          <bug_status>RESOLVED</bug_status>
          <resolution>FIXED</resolution>
          
          
          <bug_file_loc></bug_file_loc>
          <status_whiteboard></status_whiteboard>
          <keywords>InRadar</keywords>
          <priority>P2</priority>
          <bug_severity>Normal</bug_severity>
          <target_milestone>---</target_milestone>
          
          
          <everconfirmed>1</everconfirmed>
          <reporter name="Tyler Wilcock">tyler_w</reporter>
          <assigned_to name="Tyler Wilcock">tyler_w</assigned_to>
          <cc>aboxhall</cc>
    
    <cc>andresg_22</cc>
    
    <cc>apinheiro</cc>
    
    <cc>cfleizach</cc>
    
    <cc>darin</cc>
    
    <cc>dmazzoni</cc>
    
    <cc>ews-watchlist</cc>
    
    <cc>jcraig</cc>
    
    <cc>jdiggs</cc>
    
    <cc>samuel_white</cc>
    
    <cc>webkit-bug-importer</cc>
          

      

      

      

          <comment_sort_order>oldest_to_newest</comment_sort_order>  
          <long_desc isprivate="0" >
    <commentid>1832236</commentid>
    <comment_count>0</comment_count>
    <who name="Tyler Wilcock">tyler_w</who>
    <bug_when>2022-01-19 14:35:29 -0800</bug_when>
    <thetext>In AXIsolatedTree::updateChildren, we have this:

const auto&amp; axChildren = axAncestor-&gt;children();
auto axChildrenIDs = axAncestor-&gt;childrenIDs();

Because the current version of AXCoreObject::childrenIDs always updates the underlying children if necessary, these two variables could get out of sync if childrenIDs actually performs an update after we already got children().</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1832237</commentid>
    <comment_count>1</comment_count>
    <who name="Radar WebKit Bug Importer">webkit-bug-importer</who>
    <bug_when>2022-01-19 14:35:46 -0800</bug_when>
    <thetext>&lt;rdar://problem/87791765&gt;</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1832240</commentid>
    <comment_count>2</comment_count>
      <attachid>449519</attachid>
    <who name="Tyler Wilcock">tyler_w</who>
    <bug_when>2022-01-19 14:42:45 -0800</bug_when>
    <thetext>Created attachment 449519
Patch</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1832492</commentid>
    <comment_count>3</comment_count>
    <who name="Andres Gonzalez">andresg_22</who>
    <bug_when>2022-01-20 10:57:12 -0800</bug_when>
    <thetext>(In reply to Tyler Wilcock from comment #2)
&gt; Created attachment 449519 [details]
&gt; Patch

No need to add a bool param to ChildrenIDs since it is never used with value true. Keeping it simple, we can say that childrenIDs returns the IDs of the current children.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1832498</commentid>
    <comment_count>4</comment_count>
    <who name="Tyler Wilcock">tyler_w</who>
    <bug_when>2022-01-20 11:09:00 -0800</bug_when>
    <thetext>(In reply to Andres Gonzalez from comment #3)
&gt; (In reply to Tyler Wilcock from comment #2)
&gt; &gt; Created attachment 449519 [details]
&gt; &gt; Patch
&gt; 
&gt; No need to add a bool param to ChildrenIDs since it is never used with value
&gt; true. Keeping it simple, we can say that childrenIDs returns the IDs of the
&gt; current children.
Well, it&apos;s used in places outside this patch in ways that do expect childrenIDs to update if necessary. For example, this:

void AXIsolatedTree::updateNode(AXCoreObject&amp; axObject)
{
    ...truncated...
    auto newObject = AXIsolatedObject::create(axObject, this, parentID);
    newObject-&gt;m_childrenIDs = axObject.childrenIDs();
    ...truncated...
}

I did try to make childrenIDs be non-updating always, but that causes ~10 additional ITM failures. So I opted to give childrenIDs() the same bool API that children() has and fix the definitely wrong usage of it in AXIsolatedTree::updateChildren.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1832499</commentid>
    <comment_count>5</comment_count>
    <who name="Andres Gonzalez">andresg_22</who>
    <bug_when>2022-01-20 11:14:50 -0800</bug_when>
    <thetext>(In reply to Tyler Wilcock from comment #4)
&gt; (In reply to Andres Gonzalez from comment #3)
&gt; &gt; (In reply to Tyler Wilcock from comment #2)
&gt; &gt; &gt; Created attachment 449519 [details]
&gt; &gt; &gt; Patch
&gt; &gt; 
&gt; &gt; No need to add a bool param to ChildrenIDs since it is never used with value
&gt; &gt; true. Keeping it simple, we can say that childrenIDs returns the IDs of the
&gt; &gt; current children.
&gt; Well, it&apos;s used in places outside this patch in ways that do expect
&gt; childrenIDs to update if necessary. For example, this:
&gt; 
&gt; void AXIsolatedTree::updateNode(AXCoreObject&amp; axObject)
&gt; {
&gt;     ...truncated...
&gt;     auto newObject = AXIsolatedObject::create(axObject, this, parentID);
&gt;     newObject-&gt;m_childrenIDs = axObject.childrenIDs();
&gt;     ...truncated...
&gt; }
&gt; 
&gt; I did try to make childrenIDs be non-updating always, but that causes ~10
&gt; additional ITM failures. So I opted to give childrenIDs() the same bool API
&gt; that children() has and fix the definitely wrong usage of it in
&gt; AXIsolatedTree::updateChildren.

OK, thanks.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1832507</commentid>
    <comment_count>6</comment_count>
    <who name="Tyler Wilcock">tyler_w</who>
    <bug_when>2022-01-20 11:18:17 -0800</bug_when>
    <thetext>Thank you both for the review!</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1832519</commentid>
    <comment_count>7</comment_count>
    <who name="EWS">ews-feeder</who>
    <bug_when>2022-01-20 12:03:48 -0800</bug_when>
    <thetext>Committed r288313 (246229@main): &lt;https://commits.webkit.org/246229@main&gt;

All reviewed patches have been landed. Closing bug and clearing flags on attachment 449519.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1832541</commentid>
    <comment_count>8</comment_count>
      <attachid>449519</attachid>
    <who name="Darin Adler">darin</who>
    <bug_when>2022-01-20 13:04:00 -0800</bug_when>
    <thetext>Comment on attachment 449519
Patch

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

&gt; Source/WebCore/accessibility/AccessibilityObjectInterface.h:1612
&gt; +    auto&amp; kids = children(updateChildrenIfNecessary);

It’s more elegant to use Vector::map instead of a loop and easier to get the vector size allocation right; something to consider in future.

&gt; Source/WebCore/accessibility/AccessibilityObjectInterface.h:1614
&gt; +    childrenIDs.reserveCapacity(kids.size());

This should use reserveInitialCapacity, slightly more efficient.

&gt; Source/WebCore/accessibility/AccessibilityObjectInterface.h:1615
&gt; +    for (const auto&amp; child : kids)

This can just use auto&amp;, no need for the const.

&gt; Source/WebCore/accessibility/AccessibilityObjectInterface.h:1616
&gt;          childrenIDs.append(child-&gt;objectID());

This can use the slightly more efficient uncheckedAppend because of the reserveCapacity above.</thetext>
  </long_desc>
      
          <attachment
              isobsolete="0"
              ispatch="1"
              isprivate="0"
          >
            <attachid>449519</attachid>
            <date>2022-01-19 14:42:45 -0800</date>
            <delta_ts>2022-01-20 12:03:50 -0800</delta_ts>
            <desc>Patch</desc>
            <filename>bug-235384-20220119164244.patch</filename>
            <type>text/plain</type>
            <size>4225</size>
            <attacher name="Tyler Wilcock">tyler_w</attacher>
            
              <data encoding="base64">U3VidmVyc2lvbiBSZXZpc2lvbjogMjg4MjE2CmRpZmYgLS1naXQgYS9Tb3VyY2UvV2ViQ29yZS9D
aGFuZ2VMb2cgYi9Tb3VyY2UvV2ViQ29yZS9DaGFuZ2VMb2cKaW5kZXggNTA5ZWRmYzI4YjZmZDUy
MTg5OGQ4YjdjMDRlZTY2ZmY3OTMzYzM5YS4uNmQyNDM1MDIzODZiNjJhM2JjOTEzNjMyNmJhOTkw
YmYxZTAzZTZjOSAxMDA2NDQKLS0tIGEvU291cmNlL1dlYkNvcmUvQ2hhbmdlTG9nCisrKyBiL1Nv
dXJjZS9XZWJDb3JlL0NoYW5nZUxvZwpAQCAtMSwzICsxLDMwIEBACisyMDIyLTAxLTE5ICBUeWxl
ciBXaWxjb2NrICA8dHlsZXJfd0BhcHBsZS5jb20+CisKKyAgICAgICAgQVhJc29sYXRlZFRyZWU6
OnVwZGF0ZUNoaWxkcmVuIGNoaWxkcmVuSURzIGFuZCBjaGlsZHJlbiBsb2NhbCB2YXJpYWJsZXMg
Y291bGQgZ2V0IG91dCBvZiBzeW5jCisgICAgICAgIGh0dHBzOi8vYnVncy53ZWJraXQub3JnL3No
b3dfYnVnLmNnaT9pZD0yMzUzODQKKworICAgICAgICBSZXZpZXdlZCBieSBOT0JPRFkgKE9PUFMh
KS4KKworICAgICAgICBJbiBBWElzb2xhdGVkVHJlZTo6dXBkYXRlQ2hpbGRyZW4sIHdlIGhhdmUg
dGhpczoKKworICAgICAgICBjb25zdCBhdXRvJiBheENoaWxkcmVuID0gYXhBbmNlc3Rvci0+Y2hp
bGRyZW4oKTsKKyAgICAgICAgYXV0byBheENoaWxkcmVuSURzID0gYXhBbmNlc3Rvci0+Y2hpbGRy
ZW5JRHMoKTsKKworICAgICAgICBCZWNhdXNlIHRoZSBjdXJyZW50IHZlcnNpb24gb2YgQVhDb3Jl
T2JqZWN0OjpjaGlsZHJlbklEcworICAgICAgICBhbHdheXMgdXBkYXRlcyB0aGUgdW5kZXJseWlu
ZyBjaGlsZHJlbiBpZiBuZWNlc3NhcnksIHRoZXNlCisgICAgICAgIHR3byB2YXJpYWJsZXMgY291
bGQgZ2V0IG91dCBvZiBzeW5jIGlmIGNoaWxkcmVuSURzIGFjdHVhbGx5CisgICAgICAgIHBlcmZv
cm1zIGFuIHVwZGF0ZSBhZnRlciB3ZSBhbHJlYWR5IGdvdCBjaGlsZHJlbigpLgorCisgICAgICAg
IFRoaXMgcGF0Y2ggY2hhbmdlcyBjaGlsZHJlbklEcyB0byBoYXZlIHRoZSBzYW1lIGludGVyZmFj
ZSBhcworICAgICAgICBjaGlsZHJlbigpIGJ5IGFkZGluZyBhIGBib29sIHVwZGF0ZUNoaWxkcmVu
SWZOZWNlc3NhcnlgIHBhcmFtZXRlciwKKyAgICAgICAgYW5kIHVzaW5nIGNoaWxkcmVuSURzKGZh
bHNlKSBpbiB0aGUgYWJvdmUgbWV0aG9kLgorCisgICAgICAgICogYWNjZXNzaWJpbGl0eS9BY2Nl
c3NpYmlsaXR5T2JqZWN0SW50ZXJmYWNlLmg6CisgICAgICAgIChXZWJDb3JlOjpBWENvcmVPYmpl
Y3Q6OmNoaWxkcmVuSURzKToKKyAgICAgICAgQWRkIHVwZGF0ZUNoaWxkcmVuSWZOZWNlc3Nhcnkg
cGFyYW1ldGVyIHRvIG1hdGNoIEFYQ29yZU9iamVjdDo6Y2hpbGRyZW4oYm9vbCkuCisgICAgICAg
ICogYWNjZXNzaWJpbGl0eS9pc29sYXRlZHRyZWUvQVhJc29sYXRlZFRyZWUuY3BwOgorICAgICAg
ICAoV2ViQ29yZTo6QVhJc29sYXRlZFRyZWU6OnVwZGF0ZUNoaWxkcmVuKToKKwogMjAyMi0wMS0x
OSAgUm9iIEJ1aXMgIDxyYnVpc0BpZ2FsaWEuY29tPgogCiAgICAgICAgIE51bGwgY2hlY2sgbV9w
cm9ncmVzc1RyYWNrZXIgaW4gY2xlYXJQcm92aXNpb25hbExvYWQKZGlmZiAtLWdpdCBhL1NvdXJj
ZS9XZWJDb3JlL2FjY2Vzc2liaWxpdHkvQWNjZXNzaWJpbGl0eU9iamVjdEludGVyZmFjZS5oIGIv
U291cmNlL1dlYkNvcmUvYWNjZXNzaWJpbGl0eS9BY2Nlc3NpYmlsaXR5T2JqZWN0SW50ZXJmYWNl
LmgKaW5kZXggZDcwNjI0MjU1NjdiZjM1YzA0MjhiN2Q0N2FmNDJjODJhOTQxMDlmMy4uNDUwZTkw
NDlmZTc4ODRlYmQ4MWMwMTA4YTdiNDIzMzQ4ODJkMGY4OCAxMDA2NDQKLS0tIGEvU291cmNlL1dl
YkNvcmUvYWNjZXNzaWJpbGl0eS9BY2Nlc3NpYmlsaXR5T2JqZWN0SW50ZXJmYWNlLmgKKysrIGIv
U291cmNlL1dlYkNvcmUvYWNjZXNzaWJpbGl0eS9BY2Nlc3NpYmlsaXR5T2JqZWN0SW50ZXJmYWNl
LmgKQEAgLTEyNzIsNyArMTI3Miw3IEBAIHB1YmxpYzoKICAgICB2aXJ0dWFsIHZvaWQgYWRkQ2hp
bGRyZW4oKSA9IDA7CiAgICAgdmlydHVhbCB2b2lkIGFkZENoaWxkKEFYQ29yZU9iamVjdCosIERl
c2NlbmRJZklnbm9yZWQgPSBEZXNjZW5kSWZJZ25vcmVkOjpZZXMpID0gMDsKICAgICB2aXJ0dWFs
IHZvaWQgaW5zZXJ0Q2hpbGQoQVhDb3JlT2JqZWN0KiwgdW5zaWduZWQsIERlc2NlbmRJZklnbm9y
ZWQgPSBEZXNjZW5kSWZJZ25vcmVkOjpZZXMpID0gMDsKLSAgICBWZWN0b3I8QVhJRD4gY2hpbGRy
ZW5JRHMoKTsKKyAgICBWZWN0b3I8QVhJRD4gY2hpbGRyZW5JRHMoYm9vbCB1cGRhdGVDaGlsZHJl
bklmTmVjZXNzYXJ5ID0gdHJ1ZSk7CiAKICAgICB2aXJ0dWFsIGJvb2wgY2FuSGF2ZUNoaWxkcmVu
KCkgY29uc3QgPSAwOwogICAgIHZpcnR1YWwgdm9pZCB1cGRhdGVDaGlsZHJlbklmTmVjZXNzYXJ5
KCkgPSAwOwpAQCAtMTYwNywxMCArMTYwNywxMiBAQCBpbmxpbmUgdm9pZCBBWENvcmVPYmplY3Q6
OmRldGFjaFdyYXBwZXIoQWNjZXNzaWJpbGl0eURldGFjaG1lbnRUeXBlIGRldGFjaG1lbnRUeQog
fQogI2VuZGlmCiAKLWlubGluZSBWZWN0b3I8QVhJRD4gQVhDb3JlT2JqZWN0OjpjaGlsZHJlbklE
cygpCitpbmxpbmUgVmVjdG9yPEFYSUQ+IEFYQ29yZU9iamVjdDo6Y2hpbGRyZW5JRHMoYm9vbCB1
cGRhdGVDaGlsZHJlbklmTmVjZXNzYXJ5KQogeworICAgIGF1dG8mIGtpZHMgPSBjaGlsZHJlbih1
cGRhdGVDaGlsZHJlbklmTmVjZXNzYXJ5KTsKICAgICBWZWN0b3I8QVhJRD4gY2hpbGRyZW5JRHM7
Ci0gICAgZm9yIChjb25zdCBhdXRvJiBjaGlsZCA6IGNoaWxkcmVuKCkpCisgICAgY2hpbGRyZW5J
RHMucmVzZXJ2ZUNhcGFjaXR5KGtpZHMuc2l6ZSgpKTsKKyAgICBmb3IgKGNvbnN0IGF1dG8mIGNo
aWxkIDoga2lkcykKICAgICAgICAgY2hpbGRyZW5JRHMuYXBwZW5kKGNoaWxkLT5vYmplY3RJRCgp
KTsKICAgICByZXR1cm4gY2hpbGRyZW5JRHM7CiB9CmRpZmYgLS1naXQgYS9Tb3VyY2UvV2ViQ29y
ZS9hY2Nlc3NpYmlsaXR5L2lzb2xhdGVkdHJlZS9BWElzb2xhdGVkVHJlZS5jcHAgYi9Tb3VyY2Uv
V2ViQ29yZS9hY2Nlc3NpYmlsaXR5L2lzb2xhdGVkdHJlZS9BWElzb2xhdGVkVHJlZS5jcHAKaW5k
ZXggYzY3MWY3MWVkYjdmN2I5ZDNlNTZmNjU3Mzg5NjIwYTc3MjUxY2FmYS4uMzczZTc5YzVjZmM4
ODA1YTRmOGY3YzNjMzBlZGQxYWEwNzE1OWFlMSAxMDA2NDQKLS0tIGEvU291cmNlL1dlYkNvcmUv
YWNjZXNzaWJpbGl0eS9pc29sYXRlZHRyZWUvQVhJc29sYXRlZFRyZWUuY3BwCisrKyBiL1NvdXJj
ZS9XZWJDb3JlL2FjY2Vzc2liaWxpdHkvaXNvbGF0ZWR0cmVlL0FYSXNvbGF0ZWRUcmVlLmNwcApA
QCAtMzQxLDE1ICszNDEsMTYgQEAgdm9pZCBBWElzb2xhdGVkVHJlZTo6dXBkYXRlQ2hpbGRyZW4o
QVhDb3JlT2JqZWN0JiBheE9iamVjdCkKICAgICBhdXRvIHJlbW92YWxzID0gaXRlcmF0b3ItPnZh
bHVlOwogCiAgICAgY29uc3QgYXV0byYgYXhDaGlsZHJlbiA9IGF4QW5jZXN0b3ItPmNoaWxkcmVu
KCk7Ci0gICAgYXV0byBheENoaWxkcmVuSURzID0gYXhBbmNlc3Rvci0+Y2hpbGRyZW5JRHMoKTsK
KyAgICBhdXRvIGF4Q2hpbGRyZW5JRHMgPSBheEFuY2VzdG9yLT5jaGlsZHJlbklEcyhmYWxzZSk7
CiAKICAgICBib29sIHVwZGF0ZWRDaGlsZCA9IGZhbHNlOyAvLyBTZXQgdG8gdHJ1ZSBpZiBhdCBs
ZWFzdCBvbmUgY2hpbGQncyBzdWJ0cmVlIGlzIHVwZGF0ZWQuCiAgICAgZm9yIChzaXplX3QgaSA9
IDA7IGkgPCBheENoaWxkcmVuLnNpemUoKSAmJiBpIDwgYXhDaGlsZHJlbklEcy5zaXplKCk7ICsr
aSkgeworICAgICAgICBBU1NFUlQoYXhDaGlsZHJlbltpXS0+b2JqZWN0SUQoKSA9PSBheENoaWxk
cmVuSURzW2ldKTsKKyAgICAgICAgQVNTRVJUKGF4Q2hpbGRyZW5JRHNbaV0uaXNWYWxpZCgpKTsK
ICAgICAgICAgc2l6ZV90IGluZGV4ID0gcmVtb3ZhbHMuZmluZChheENoaWxkcmVuSURzW2ldKTsK
ICAgICAgICAgaWYgKGluZGV4ICE9IG5vdEZvdW5kKQogICAgICAgICAgICAgcmVtb3ZhbHMucmVt
b3ZlKGluZGV4KTsKICAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICBBU1NFUlQoYXhDaGlsZHJl
bltpXS0+b2JqZWN0SUQoKSA9PSBheENoaWxkcmVuSURzW2ldKTsKICAgICAgICAgICAgIC8vIFRo
aXMgaXMgYSBuZXcgY2hpbGQsIGFkZCBpdCB0byB0aGUgdHJlZS4KICAgICAgICAgICAgIEFYTE9H
KCJBZGRpbmcgYSBuZXcgY2hpbGQgZm9yOiIpOwogICAgICAgICAgICAgQVhMT0coYXhDaGlsZHJl
bltpXSk7Cg==
</data>

          </attachment>
      

    </bug>

</bugzilla>