| Index: components/test_runner/web_ax_object_proxy.cc | 
| diff --git a/components/test_runner/web_ax_object_proxy.cc b/components/test_runner/web_ax_object_proxy.cc | 
| index a2728a98ba25fefe2342170342191ac6a29491c6..21174b3a31457eaffb78b10b71541ee4093709cd 100644 | 
| --- a/components/test_runner/web_ax_object_proxy.cc | 
| +++ b/components/test_runner/web_ax_object_proxy.cc | 
| @@ -512,6 +512,41 @@ class AttributesCollector { | 
| DISALLOW_COPY_AND_ASSIGN(AttributesCollector); | 
| }; | 
|  | 
| +class SparseAttributeAdapter : public blink::WebAXSparseAttributeClient { | 
| + public: | 
| +  SparseAttributeAdapter() {} | 
| +  ~SparseAttributeAdapter() override {} | 
| + | 
| +  std::map<blink::WebAXBoolAttribute, bool> bool_attributes; | 
| +  std::map<blink::WebAXStringAttribute, blink::WebString> string_attributes; | 
| +  std::map<blink::WebAXObjectAttribute, blink::WebAXObject> object_attributes; | 
| +  std::map<blink::WebAXObjectVectorAttribute, | 
| +           blink::WebVector<blink::WebAXObject>> | 
| +      object_vector_attributes; | 
| + | 
| + private: | 
| +  void addBoolAttribute(blink::WebAXBoolAttribute attribute, | 
| +                        bool value) override { | 
| +    bool_attributes[attribute] = value; | 
| +  } | 
| + | 
| +  void addStringAttribute(blink::WebAXStringAttribute attribute, | 
| +                          const blink::WebString& value) override { | 
| +    string_attributes[attribute] = value; | 
| +  } | 
| + | 
| +  void addObjectAttribute(blink::WebAXObjectAttribute attribute, | 
| +                          const blink::WebAXObject& value) override { | 
| +    object_attributes[attribute] = value; | 
| +  } | 
| + | 
| +  void addObjectVectorAttribute( | 
| +      blink::WebAXObjectVectorAttribute attribute, | 
| +      const blink::WebVector<blink::WebAXObject>& value) override { | 
| +    object_vector_attributes[attribute] = value; | 
| +  } | 
| +}; | 
| + | 
| }  // namespace | 
|  | 
| gin::WrapperInfo WebAXObjectProxy::kWrapperInfo = { | 
| @@ -1100,11 +1135,13 @@ bool WebAXObjectProxy::IsButtonStateMixed() { | 
| } | 
|  | 
| v8::Local<v8::Object> WebAXObjectProxy::AriaControlsElementAtIndex( | 
| -                                                                unsigned index) | 
| -{ | 
| +    unsigned index) { | 
| accessibility_object_.updateLayoutAndCheckValidity(); | 
| -  blink::WebVector<blink::WebAXObject> elements; | 
| -  accessibility_object_.ariaControls(elements); | 
| +  SparseAttributeAdapter attribute_adapter; | 
| +  accessibility_object_.getSparseAXAttributes(attribute_adapter); | 
| +  blink::WebVector<blink::WebAXObject> elements = | 
| +      attribute_adapter.object_vector_attributes | 
| +          [blink::WebAXObjectVectorAttribute::AriaControls]; | 
| size_t elementCount = elements.size(); | 
| if (index >= elementCount) | 
| return v8::Local<v8::Object>(); | 
| @@ -1113,11 +1150,13 @@ v8::Local<v8::Object> WebAXObjectProxy::AriaControlsElementAtIndex( | 
| } | 
|  | 
| v8::Local<v8::Object> WebAXObjectProxy::AriaFlowToElementAtIndex( | 
| -                                                                unsigned index) | 
| -{ | 
| +    unsigned index) { | 
| accessibility_object_.updateLayoutAndCheckValidity(); | 
| -  blink::WebVector<blink::WebAXObject> elements; | 
| -  accessibility_object_.ariaFlowTo(elements); | 
| +  SparseAttributeAdapter attribute_adapter; | 
| +  accessibility_object_.getSparseAXAttributes(attribute_adapter); | 
| +  blink::WebVector<blink::WebAXObject> elements = | 
| +      attribute_adapter.object_vector_attributes | 
| +          [blink::WebAXObjectVectorAttribute::AriaFlowTo]; | 
| size_t elementCount = elements.size(); | 
| if (index >= elementCount) | 
| return v8::Local<v8::Object>(); | 
|  |