[autofill in devtools] Creates a new class to handle form issues that are emitted to devtools. [chromium/src : main]

38 views
Skip to first unread message

Bruno Braga (Gerrit)

unread,
Jun 9, 2023, 11:34:41 AM6/9/23
to blink-re...@chromium.org, blink-...@chromium.org, browser-comp...@chromium.org, devtools-re...@chromium.org, gcasto+w...@chromium.org, vasilii+watchlis...@chromium.org, chromium...@chromium.org, Danil Somsikov, Florian Leimgruber, Christoph Schwering, Tricium

Attention is currently required from: Christoph Schwering, Florian Leimgruber.

View Change

17 comments:

  • File components/autofill/content/renderer/form_autofill_util.cc:

    • Patch Set #2, Line 735:

      PTAL. […]

      Done

    • Patch Set #2, Line 736: List

      https://developer.mozilla.org/en-US/docs/Web/Accessibility/ARIA/Attributes/aria-labelledby#values […]

      Done

    • Patch Set #2, Line 749: Maybe

      Do you mean the autocomplete issue? updated.

      Done

    • Patch Set #2, Line 762:

      base::ranges::any_of(
      GetWebElementsFromIdList(element.GetDocument(),
      arial_label_attribute),
      [](const WebElement& node) { return node.IsNull(); })

      I meant something like […]

      I see. Good point

    • Patch Set #2, Line 1545:

      base::flat_map<WebString, int> id_count;
      for (const WebFormControlElement& element : control_elements) {
      if (IsAutofillableElement(element) && !element.GetIdAttribute().IsEmpty()) {
      id_count[element.GetIdAttribute()]++;
      }
      }

      I think it is. I actually don't think it's more complex. […]

      Also updated the names in the new class to keep it consistent.

    • Patch Set #2, Line 1615: static base::NoDestructor<WebString> kName("name");

      NoDescrutor is needed because ~WebString() destructor is non-trivial because ~scoped_refptr() is non […]

      I updated the new class not to clash with your current CL, ptal.

    • Patch Set #2, Line 1624: violatingAttr

      I meant that "violating" isn't accurate. […]

      We can call it violating_attr_value. However a violating attribute means an attribute that does not exist? a typo?

      I think it is implicit in this case that we are talking about the value since we cannot even know if a literally violating attribute exists. I can rename the declarations in this file to be violating_attribute_value if you prefer.

    • Patch Set #2, Line 1899:

      element.GetDocument().GetFrame()->AddGenericIssue(
      blink::mojom::GenericIssueErrorType::
      kFormAutocompleteAttributeEmptyError,
      element.GetDevToolsNodeId(), WebString("autocomplete"));
      form_issues->emplace_back(
      GenericIssueErrorType::kFormAutocompleteAttributeEmptyError,
      element.GetDevToolsNodeId(), WebString("autocomplete"));

      Obsolete with recent recent refactor.

      Done

    • Patch Set #2, Line 1908: const WebInputElement input_element = element.DynamicTo<WebInputElement>();

      surprised lint does not catch this.

      Done

    • Patch Set #2, Line 2315: field->aria_label = GetAriaLabel(host.GetDocument(), host);

      This looks like it should be outside of the `if`.

      Done

  • File components/autofill/content/renderer/form_autofill_util.cc:

  • File components/autofill/content/renderer/form_autofill_util_browsertest.cc:

  • File components/autofill/content/renderer/form_cache.cc:

    • Patch Set #2, Line 181: std::vector<blink::WebAutofillClient::FormIssue> form_issues;

      As of now we need form_field_data which is inside the cache. […]

      Done

    • Patch Set #2, Line 186: &form_issues

      I added the array in the cache to make sure the tests would pass and ended up forgetting to delete. […]

      Done

  • File components/autofill/core/common/form_field_data.h:

    • Patch Set #8, Line 319: // Whether the label source `for` attribute linked to the elements name.

      Add a comment that this is not serialized.

      Done. When you say serialized do you mean to send it to the browser or is it actually stored somewhere?

    • Patch Set #8, Line 320: label_source_for_is_field_name

      I think given the gigantic size of a FormFieldData this is OK. […]

      This makes sense. Do we have a bug for this?

To view, visit change 4543002. To unsubscribe, or for help writing mail filters, visit settings.

Gerrit-MessageType: comment
Gerrit-Project: chromium/src
Gerrit-Branch: main
Gerrit-Change-Id: Id52ca7ed87755751281f9ba65ea3f62c9569e085
Gerrit-Change-Number: 4543002
Gerrit-PatchSet: 11
Gerrit-Owner: Bruno Braga <bruno...@google.com>
Gerrit-Reviewer: Christoph Schwering <schw...@google.com>
Gerrit-Reviewer: Florian Leimgruber <fleim...@google.com>
Gerrit-CC: Danil Somsikov <d...@chromium.org>
Gerrit-Attention: Florian Leimgruber <fleim...@google.com>
Gerrit-Attention: Christoph Schwering <schw...@google.com>
Gerrit-Comment-Date: Fri, 09 Jun 2023 15:34:33 +0000
Gerrit-HasComments: Yes
Gerrit-Has-Labels: No
Comment-In-Reply-To: Florian Leimgruber <fleim...@google.com>
Comment-In-Reply-To: Bruno Braga <bruno...@google.com>
Comment-In-Reply-To: Christoph Schwering <schw...@google.com>

Florian Leimgruber (Gerrit)

unread,
Jun 12, 2023, 8:28:55 AM6/12/23
to Bruno Braga, blink-re...@chromium.org, blink-...@chromium.org, browser-comp...@chromium.org, devtools-re...@chromium.org, gcasto+w...@chromium.org, vasilii+watchlis...@chromium.org, chromium...@chromium.org, Danil Somsikov, Christoph Schwering, Tricium

Attention is currently required from: Bruno Braga, Christoph Schwering.

View Change

9 comments:

  • File components/autofill/content/renderer/form_autofill_issues.h:

  • File components/autofill/content/renderer/form_autofill_issues.cc:

    • Patch Set #12, Line 1: // Copyright 2023 The Chromium Authors

      I suppose most of the implementation of this class is moved here from form_autofill_util? Is the implementation there kept so that issues are continued to be emitted once this CL lands?

      Are there any changes in this file that need to be properly reviewed?

  • File components/autofill/content/renderer/form_autofill_util.h:

  • File components/autofill/content/renderer/form_autofill_util.cc:

    • base::flat_map<WebString, int> id_count;
      for (const WebFormControlElement& element : control_elements) {
      if (IsAutofillableElement(element) && !element.GetIdAttribute().IsEmpty()) {
      id_count[element.GetIdAttribute()]++;
      }
      }

To view, visit change 4543002. To unsubscribe, or for help writing mail filters, visit settings.

Gerrit-MessageType: comment
Gerrit-Project: chromium/src
Gerrit-Branch: main
Gerrit-Change-Id: Id52ca7ed87755751281f9ba65ea3f62c9569e085
Gerrit-Change-Number: 4543002
Gerrit-PatchSet: 12
Gerrit-Owner: Bruno Braga <bruno...@google.com>
Gerrit-Reviewer: Christoph Schwering <schw...@google.com>
Gerrit-Reviewer: Florian Leimgruber <fleim...@google.com>
Gerrit-CC: Danil Somsikov <d...@chromium.org>
Gerrit-Attention: Bruno Braga <bruno...@google.com>
Gerrit-Attention: Christoph Schwering <schw...@google.com>
Gerrit-Comment-Date: Mon, 12 Jun 2023 12:28:42 +0000
Gerrit-HasComments: Yes
Gerrit-Has-Labels: No

Christoph Schwering (Gerrit)

unread,
Jun 14, 2023, 7:42:01 PM6/14/23
to Bruno Braga, blink-re...@chromium.org, blink-...@chromium.org, browser-comp...@chromium.org, devtools-re...@chromium.org, gcasto+w...@chromium.org, vasilii+watchlis...@chromium.org, chromium...@chromium.org, Danil Somsikov, Florian Leimgruber, Tricium

Attention is currently required from: Bruno Braga.

View Change

2 comments:

  • Patchset:

  • File components/autofill/core/common/form_field_data.h:

    • crbug.com/1345089 subsumes this

      (I don't remember writing this comment, but maybe it's useful.)

To view, visit change 4543002. To unsubscribe, or for help writing mail filters, visit settings.

Gerrit-MessageType: comment
Gerrit-Project: chromium/src
Gerrit-Branch: main
Gerrit-Change-Id: Id52ca7ed87755751281f9ba65ea3f62c9569e085
Gerrit-Change-Number: 4543002
Gerrit-PatchSet: 12
Gerrit-Owner: Bruno Braga <bruno...@google.com>
Gerrit-Reviewer: Christoph Schwering <schw...@google.com>
Gerrit-Reviewer: Florian Leimgruber <fleim...@google.com>
Gerrit-CC: Danil Somsikov <d...@chromium.org>
Gerrit-Attention: Bruno Braga <bruno...@google.com>
Gerrit-Comment-Date: Wed, 14 Jun 2023 23:41:51 +0000

Findit (Gerrit)

unread,
Jun 16, 2023, 8:05:07 AM6/16/23
to Bruno Braga, blink-re...@chromium.org, blink-...@chromium.org, browser-comp...@chromium.org, devtools-re...@chromium.org, gcasto+w...@chromium.org, vasilii+watchlis...@chromium.org, Chromium LUCI CQ, chromium...@chromium.org, Danil Somsikov, Florian Leimgruber, Christoph Schwering, Tricium

Attention is currently required from: Bruno Braga.

This change meets the code coverage requirements.

Patch set 17:Code-Coverage +1

View Change

    To view, visit change 4543002. To unsubscribe, or for help writing mail filters, visit settings.

    Gerrit-MessageType: comment
    Gerrit-Project: chromium/src
    Gerrit-Branch: main
    Gerrit-Change-Id: Id52ca7ed87755751281f9ba65ea3f62c9569e085
    Gerrit-Change-Number: 4543002
    Gerrit-PatchSet: 17
    Gerrit-Owner: Bruno Braga <bruno...@google.com>
    Gerrit-Reviewer: Bruno Braga <bruno...@google.com>
    Gerrit-Reviewer: Christoph Schwering <schw...@google.com>
    Gerrit-Reviewer: Findit <findit...@appspot.gserviceaccount.com>
    Gerrit-Reviewer: Florian Leimgruber <fleim...@google.com>
    Gerrit-CC: Danil Somsikov <d...@chromium.org>
    Gerrit-Attention: Bruno Braga <bruno...@google.com>
    Gerrit-Comment-Date: Fri, 16 Jun 2023 12:04:59 +0000
    Gerrit-HasComments: No
    Gerrit-Has-Labels: Yes

    Bruno Braga (Gerrit)

    unread,
    Jun 16, 2023, 8:07:32 AM6/16/23
    to blink-re...@chromium.org, blink-...@chromium.org, browser-comp...@chromium.org, devtools-re...@chromium.org, gcasto+w...@chromium.org, vasilii+watchlis...@chromium.org, Findit, Chromium LUCI CQ, chromium...@chromium.org, Danil Somsikov, Florian Leimgruber, Christoph Schwering, Tricium

    Attention is currently required from: Christoph Schwering, Florian Leimgruber.

    View Change

    9 comments:

    • File components/autofill/content/renderer/form_autofill_issues.h:

      • e.g. instead of i.e. […]

        Done

    • File components/autofill/content/renderer/form_autofill_issues.cc:

      • I suppose most of the implementation of this class is moved here from form_autofill_util? Is the imp […]

        Yes. I will start emitting the issues from this file on a follow up CL, eventually I will remove the emission from there (I will possibly have a flag). Added a todo.

        This files essentially copies the what we are doing inside form_autofill_util.cc, you can review code styling but the functionality is essentially the same.

    • File components/autofill/content/renderer/form_autofill_util.h:

      • Done

    • File components/autofill/content/renderer/form_autofill_util.cc:

      • Patch Set #2, Line 1545:

        base::flat_map<WebString, int> id_count;
        for (const WebFormControlElement& element : control_elements) {
        if (IsAutofillableElement(element) && !element.GetIdAttribute().IsEmpty()) {
        id_count[element.GetIdAttribute()]++;
        }
        }

      • You could also keep the second half of the implementation as-is and create the flat map using [MakeF […]

        From reading MakeFlatMap documentation and its usages it does not look like we can create a counter by key and only map 1:1.

    • File components/autofill/content/renderer/form_autofill_util.cc:

      • Patch Set #12, Line 1525: // Create copies of |elements| that can be modified

        Instead of copying all `elements`, you can just create a vector of element IDs and use that.

      • how? I need the frame and the node id to create the issue.

      • Patch Set #12, Line 1528:

          base::ranges::sort(elements_copies, {},
        &WebFormControlElement::GetIdAttribute);

        You're sorting an empty vector here.

      • Done

      • Patch Set #12, Line 1539:

            for (++it; it != elements.end() &&
        std::prev(it)->GetIdAttribute() == it->GetIdAttribute();
        ++it) {

      • This will not emit the issue for the last element in sorted order. E.g. […]

        It would not be emitted for the first one. This why I have the prev check. Unless I am missing something, you can see that the test is covering it.

      • I know, but it is necessary to get the nodeId. I think for a reader it makes sense to keep it consistent other than using prev in one place but not in the other. Removed and added a comment.

    • File components/autofill/core/common/form_field_data.h:

    To view, visit change 4543002. To unsubscribe, or for help writing mail filters, visit settings.

    Gerrit-MessageType: comment
    Gerrit-Project: chromium/src
    Gerrit-Branch: main
    Gerrit-Change-Id: Id52ca7ed87755751281f9ba65ea3f62c9569e085
    Gerrit-Change-Number: 4543002
    Gerrit-PatchSet: 17
    Gerrit-Owner: Bruno Braga <bruno...@google.com>
    Gerrit-Reviewer: Bruno Braga <bruno...@google.com>
    Gerrit-Reviewer: Christoph Schwering <schw...@google.com>
    Gerrit-Reviewer: Findit <findit...@appspot.gserviceaccount.com>
    Gerrit-Reviewer: Florian Leimgruber <fleim...@google.com>
    Gerrit-CC: Danil Somsikov <d...@chromium.org>
    Gerrit-Attention: Florian Leimgruber <fleim...@google.com>
    Gerrit-Attention: Christoph Schwering <schw...@google.com>
    Gerrit-Comment-Date: Fri, 16 Jun 2023 12:07:24 +0000
    Gerrit-HasComments: Yes
    Gerrit-Has-Labels: No
    Comment-In-Reply-To: Florian Leimgruber <fleim...@google.com>

    Florian Leimgruber (Gerrit)

    unread,
    Jun 20, 2023, 9:41:01 AM6/20/23
    to Bruno Braga, blink-re...@chromium.org, blink-...@chromium.org, browser-comp...@chromium.org, devtools-re...@chromium.org, gcasto+w...@chromium.org, vasilii+watchlis...@chromium.org, Findit, Chromium LUCI CQ, chromium...@chromium.org, Danil Somsikov, Christoph Schwering, Tricium

    Attention is currently required from: Bruno Braga, Christoph Schwering.

    View Change

    9 comments:

    • File components/autofill/content/renderer/form_autofill_issues.cc:

      • This files essentially copies the what we are doing inside form_autofill_util.cc, you can review code styling but the functionality is essentially the same.

        Given that the code already starts to diverge (see my comment in `MaybeEmitDuplicateIdForInputDevtoolsIssue()`), I wonder if we can avoid the duplication at all.

        Could we for example remove the code from form_autofill_util and just call the new functions in form_autofill_issues? The implementation in form_autofill_issues can then decide to either emit the issue directly if the `form_issues` parameter is null, or add it to the vector otherwise.

        More generally, to make the review easier, it would be nice to have one CL that removes the code into the file 1:1 and another CL that makes the actual changes. This CL does both, which makes it really hard for reviewers to spot the differences with a diff of +764. WDYT?

    • File components/autofill/content/renderer/form_autofill_util.cc:

      • Patch Set #2, Line 2788: if (base::FeatureList::IsEnabled(features::kAutofillEnableDevtoolsIssues)) {

        Obsolete with new refactor, but yes. That was the reason.

        Acknowledged

      • Patch Set #2, Line 1545:

        base::flat_map<WebString, int> id_count;
        for (const WebFormControlElement& element : control_elements) {
        if (IsAutofillableElement(element) && !element.GetIdAttribute().IsEmpty()) {
        id_count[element.GetIdAttribute()]++;
        }
        }

      • From reading MakeFlatMap documentation and its usages it does not look like we can create a counter […]

        Upps, that makes sense. Sorry

    • File components/autofill/content/renderer/form_autofill_util.cc:

      • how? I need the frame and the node id to create the issue.

        You're right, I misread the code.

      • Patch Set #12, Line 1539:

            for (++it; it != elements.end() &&
        std::prev(it)->GetIdAttribute() == it->GetIdAttribute();
        ++it) {

      • It would not be emitted for the first one. This why I have the prev check. […]

        The implementation in form_autofill_util and form_autofill_issues differs. In the latter file you've added this snippet inside the main loop:
        ```
        if (previous_element_not_added) {
        form_issues->emplace_back(
        GenericIssueErrorType::kFormDuplicateIdForInputError,
        prev(it)->GetDevToolsNodeId(), id_attr);
        }
        ```

        This ensures that you don't miss the first one. The code in form_autofill_util still has the bug.

      • I know, but it is necessary to get the nodeId. […]

        Acknowledged

    • File components/autofill/content/renderer/form_autofill_util.cc:

    To view, visit change 4543002. To unsubscribe, or for help writing mail filters, visit settings.

    Gerrit-MessageType: comment
    Gerrit-Project: chromium/src
    Gerrit-Branch: main
    Gerrit-Change-Id: Id52ca7ed87755751281f9ba65ea3f62c9569e085
    Gerrit-Change-Number: 4543002
    Gerrit-PatchSet: 17
    Gerrit-Owner: Bruno Braga <bruno...@google.com>
    Gerrit-Reviewer: Bruno Braga <bruno...@google.com>
    Gerrit-Reviewer: Christoph Schwering <schw...@google.com>
    Gerrit-Reviewer: Findit <findit...@appspot.gserviceaccount.com>
    Gerrit-Reviewer: Florian Leimgruber <fleim...@google.com>
    Gerrit-CC: Danil Somsikov <d...@chromium.org>
    Gerrit-Attention: Bruno Braga <bruno...@google.com>
    Gerrit-Attention: Christoph Schwering <schw...@google.com>
    Gerrit-Comment-Date: Tue, 20 Jun 2023 13:40:52 +0000

    Bruno Braga (Gerrit)

    unread,
    Jun 23, 2023, 6:12:30 AM6/23/23
    to blink-re...@chromium.org, blink-...@chromium.org, browser-comp...@chromium.org, devtools-re...@chromium.org, gcasto+w...@chromium.org, vasilii+watchlis...@chromium.org, Findit, Chromium LUCI CQ, chromium...@chromium.org, Danil Somsikov, Florian Leimgruber, Christoph Schwering, Tricium

    Attention is currently required from: Christoph Schwering, Florian Leimgruber.

    View Change

    4 comments:

    • File components/autofill/content/renderer/form_autofill_issues.cc:

      • > This files essentially copies the what we are doing inside form_autofill_util. […]

        Resolved offline. Chained the suggestion approach n a follow up cl.

    • File components/autofill/content/renderer/form_autofill_util.cc:

      •     for (++it; it != elements.end() &&
        std::prev(it)->GetIdAttribute() == it->GetIdAttribute();
        ++it) {

      • The implementation in form_autofill_util and form_autofill_issues differs. […]

        we are not pushing to an array in there, we are always emitting the prev issue, so there is no bug (the issue is deduped on the devtools side). Updated this test as well for clarity

    • File components/autofill/content/renderer/form_autofill_util.cc:

      • Patch Set #17, Line 1528: WebVector<WebFormControlElement> elements_copies;

        nit: Maybe rename, since this is not really a copy, but only the autofillable elements with an ID.

      • Done

      • Done

    To view, visit change 4543002. To unsubscribe, or for help writing mail filters, visit settings.

    Gerrit-MessageType: comment
    Gerrit-Project: chromium/src
    Gerrit-Branch: main
    Gerrit-Change-Id: Id52ca7ed87755751281f9ba65ea3f62c9569e085
    Gerrit-Change-Number: 4543002
    Gerrit-PatchSet: 20
    Gerrit-Owner: Bruno Braga <bruno...@google.com>
    Gerrit-Reviewer: Bruno Braga <bruno...@google.com>
    Gerrit-Reviewer: Christoph Schwering <schw...@google.com>
    Gerrit-Reviewer: Findit <findit...@appspot.gserviceaccount.com>
    Gerrit-Reviewer: Florian Leimgruber <fleim...@google.com>
    Gerrit-CC: Danil Somsikov <d...@chromium.org>
    Gerrit-Attention: Florian Leimgruber <fleim...@google.com>
    Gerrit-Attention: Christoph Schwering <schw...@google.com>
    Gerrit-Comment-Date: Fri, 23 Jun 2023 10:12:20 +0000

    Florian Leimgruber (Gerrit)

    unread,
    Jun 27, 2023, 4:58:05 AM6/27/23
    to Bruno Braga, blink-re...@chromium.org, blink-...@chromium.org, browser-comp...@chromium.org, devtools-re...@chromium.org, gcasto+w...@chromium.org, vasilii+watchlis...@chromium.org, Findit, Chromium LUCI CQ, chromium...@chromium.org, Danil Somsikov, Christoph Schwering, Tricium

    Attention is currently required from: Bruno Braga, Christoph Schwering.

    View Change

    21 comments:

    • Commit Message:

      • Patch Set #20, Line 7:

        [autofill in devtools] Creates a new class to handle form issues that are emitted to devtools.

        next step: Either inside form cache or the agent (TBD) we will call the methods inside form_autofill_issues.h to create the vector of FormIssues. This will only be done in the case where devtools is open only.

        notes:

        1. I removed the frame from FormIssue because it turns out we do not use it.
        2. I made GetAutocompleteAttribute, HasAutocompleteAttribute and GetWebElementsFromIdList public so that they can be reused inside the new class.
        2. I refactored some parts of the existing code. With the refactor that came from the initial review, things changes quite a bit. However there were still comments regarding the existing code, I addressed them as well. I can break into another CL if you prefer.

        nit: The CL has changed quite a bit since the original description. Could you update it, stating that/why the current implementation is duplicated? And please mention which parts are new and which aren't.

    • File components/autofill/content/renderer/form_autofill_issues.h:

      • Patch Set #20, Line 20:

        emit devtools
        // issues for them

        Should this rather read "add them to `form_issues`"?

      • Patch Set #20, Line 22:

        void GetFormIssues(
        const blink::WebFormElement& form_element,
        std::vector<blink::WebAutofillClient::FormIssue>* form_issues);

        // Same as above, however instead of receiving a form, it received a list of
        // control elements that were found outside a form tag.
        void GetFormIssuesFromUnownedControlElements(
        const std::vector<blink::WebFormControlElement>& unowned_control_elements,
        std::vector<blink::WebAutofillClient::FormIssue>* form_issues);

        The implementation of `GetFormIssues()` basically just calls `GetFormIssuesFromUnownedControlElements(form_element.GetFormControlElements(), form_issues)`. Should we just have a single function?
        ```
        GetFormIssues(
        const std::vector<blink::WebFormControlElement>& control_elements,
        std::vector<blink::WebAutofillClient::FormIssue>* form_issues)
        ```
    • File components/autofill/content/renderer/form_autofill_issues.cc:

      • Resolved offline. Chained the suggestion approach n a follow up cl.

        Acknowledged

    • File components/autofill/content/renderer/form_autofill_issues.cc:

      • Patch Set #20, Line 126:

        // Realistically devtools already dedupes issues. However we make sure not
        // to push the same one here for readability.
        bool previous_element_not_added =
        form_issues->empty() ||
        (form_issues->back().issue_type ==
        GenericIssueErrorType::kFormDuplicateIdForInputError &&
        form_issues->back().violating_node != prev(it)->GetDevToolsNodeId());


      • if (previous_element_not_added) {
        form_issues->emplace_back(
        GenericIssueErrorType::kFormDuplicateIdForInputError,
        prev(it)->GetDevToolsNodeId(), id_attr);
        }

    • File components/autofill/content/renderer/form_autofill_issues_browsertest.cc:

      • Patch Set #20, Line 26: bool formIssuesContainIssue(

        nit:

        • Upper case F.
        • Maybe "ContainsIssueType" instead of "ContainsIssue"
        • Comment explaining what `violating_attr` does.
      • Patch Set #20, Line 30:

          for (const blink::WebAutofillClient::FormIssue& form_issue : form_issues) {
        if (form_issue.issue_type == expected_issue) {
        return violating_attr.empty()
        ? true
        : violating_attr == form_issue.violating_node_attribute.Utf8();
        }
        }
        return false;

        nit: Use base::ranges::find. Something like this should work
        ```
        if (auto it = base::ranges::find(form_issues, expected_issue, [](auto issue) {
        return issue.issue_type;
        }); it != form_issues.end()) {
        return ...
        }
        return false
        ```
      • Patch Set #20, Line 45: WebFormElement WebFormElementFromHTML(const char* html) {

        nit: Maybe make ID of the form element a parameter (with default value). Then it's obvious from the interface what the function does.

      • Patch Set #20, Line 56:

              "<form id='target'>"
        " <input />"
        " <label> A label</label>"
        "</form>";

        Nits for the HTML code here and below:
        - You can use raw string literals like this:
        ```
        constexpr char kHTML[] = R"(
        <form>
        <input>
        </form>
        )";
        ```
        - You don't need quotes when the attribute value doesn't contain spaces. E.g. `id=target` works. If you want to keep the quotes, please be consistent (here you use single quotes. The next test uses double quotes).
        - `<input>` instead of `<input />`.
      • Patch Set #20, Line 81:

          int duplicated_ids_issue_count = 0;
        for (const blink::WebAutofillClient::FormIssue& form_issue : form_issues) {
        if (form_issue.issue_type ==
        GenericIssueErrorType::kFormDuplicateIdForInputError &&
        form_issue.violating_node_attribute.Utf8() == "id") {
        duplicated_ids_issue_count++;
        }
        }

        Simplify using `base::ranges::count()` (similar to my suggestion for `formIssuesContainIssue()`)

      • Patch Set #20, Line 197:

         std::vector<FormFieldData> fields;
        for (size_t i = 0; i < 3; ++i) {
        FormFieldData expected;
        expected.id_attribute = u"id_" + base::NumberToString16(i);
        expected.name_attribute = u"name_" + base::NumberToString16(i);
        expected.assigned_label_source = AssignedLabelSource::kName;
        fields.push_back(expected);
        }

        Can you declare these as <input>s in the HTML and then extract them from the loaded DOM? Same below.

    • File components/autofill/content/renderer/form_autofill_util.h:

      • Patch Set #20, Line 414: bool HasAutocompleteAttribute(const blink::WebElement& element);

        nit: This function has a one line implementation. Do we really need to expose it through the header? Maybe it's simpler to just duplicate this line in the form issues file.

    • File components/autofill/content/renderer/form_autofill_util.cc:

      • Patch Set #12, Line 1539:

            for (++it; it != elements.end() &&
        std::prev(it)->GetIdAttribute() == it->GetIdAttribute();
        ++it) {

      • we are not pushing to an array in there, we are always emitting the prev issue, so there is no bug ( […]

        Ack. Please add a comment stating that DevTools does the dedup for us.

    • File components/autofill/content/renderer/form_autofill_util.cc:

      • Patch Set #20, Line 1578:

          auto it = elements_with_id_attr.begin();
        while ((it = base::ranges::adjacent_find(
        it, elements_with_id_attr.end(), {},
        &WebFormControlElement::GetIdAttribute)) !=
        elements_with_id_attr.end()) {
        for (++it; it != elements_with_id_attr.end() &&


      • std::prev(it)->GetIdAttribute() == it->GetIdAttribute();
        ++it) {

      • I think you can merge both loops into a single loop like this:
        ```
        for (auto it = elements_with_id_attr.begin();
        (it = base::ranges::adjacent_find(
        it, elements_with_id_attr.end(), {},
        &WebFormControlElement::GetIdAttribute)) !=
        elements_with_id_attr.end(); it++) {
        // emit issues for it and it+1
        }
        ```

    To view, visit change 4543002. To unsubscribe, or for help writing mail filters, visit settings.

    Gerrit-MessageType: comment
    Gerrit-Project: chromium/src
    Gerrit-Branch: main
    Gerrit-Change-Id: Id52ca7ed87755751281f9ba65ea3f62c9569e085
    Gerrit-Change-Number: 4543002
    Gerrit-PatchSet: 20
    Gerrit-Owner: Bruno Braga <bruno...@google.com>
    Gerrit-Reviewer: Bruno Braga <bruno...@google.com>
    Gerrit-Reviewer: Christoph Schwering <schw...@google.com>
    Gerrit-Reviewer: Findit <findit...@appspot.gserviceaccount.com>
    Gerrit-Reviewer: Florian Leimgruber <fleim...@google.com>
    Gerrit-CC: Danil Somsikov <d...@chromium.org>
    Gerrit-Attention: Bruno Braga <bruno...@google.com>
    Gerrit-Attention: Christoph Schwering <schw...@google.com>
    Gerrit-Comment-Date: Tue, 27 Jun 2023 08:57:56 +0000

    Christoph Schwering (Gerrit)

    unread,
    Jun 27, 2023, 5:07:02 AM6/27/23
    to Bruno Braga, blink-re...@chromium.org, blink-...@chromium.org, browser-comp...@chromium.org, devtools-re...@chromium.org, gcasto+w...@chromium.org, vasilii+watchlis...@chromium.org, Findit, Chromium LUCI CQ, chromium...@chromium.org, Danil Somsikov, Florian Leimgruber, Tricium

    Attention is currently required from: Bruno Braga.

    View Change

    7 comments:

      • while ((it = base::ranges::adjacent_find(
        it, elements_with_id_attr.end(), {},
        &WebFormControlElement::GetIdAttribute)) !=
        elements_with_id_attr.end()) {
        for (++it; it != elements_with_id_attr.end() &&
        std::prev(it)->GetIdAttribute() == it->GetIdAttribute();
        ++it) {

      •       // Please note that all elements are pointing to the same document.
        // Therefore we can it simply use `it` and not `prev`.
        it->GetDocument().GetFrame()->AddGenericIssue(


      • GenericIssueErrorType::kFormDuplicateIdForInputError,
        prev(it)->GetDevToolsNodeId(), id_attr);

      •       it->GetDocument().GetFrame()->AddGenericIssue(
        GenericIssueErrorType::kFormDuplicateIdForInputError,
        it->GetDevToolsNodeId(), id_attr);
        }
        }

        I think the inner loop is worth eliminating.

        If there are three consecutive fields with the IDs, this emits (1), (2), (2), (3), doesn't it? Removing the `for (...)` entirely wouldn't change anything, right?

    To view, visit change 4543002. To unsubscribe, or for help writing mail filters, visit settings.

    Gerrit-MessageType: comment
    Gerrit-Project: chromium/src
    Gerrit-Branch: main
    Gerrit-Change-Id: Id52ca7ed87755751281f9ba65ea3f62c9569e085
    Gerrit-Change-Number: 4543002
    Gerrit-PatchSet: 20
    Gerrit-Owner: Bruno Braga <bruno...@google.com>
    Gerrit-Reviewer: Bruno Braga <bruno...@google.com>
    Gerrit-Reviewer: Christoph Schwering <schw...@google.com>
    Gerrit-Reviewer: Findit <findit...@appspot.gserviceaccount.com>
    Gerrit-Reviewer: Florian Leimgruber <fleim...@google.com>
    Gerrit-CC: Danil Somsikov <d...@chromium.org>
    Gerrit-Attention: Bruno Braga <bruno...@google.com>
    Gerrit-Comment-Date: Tue, 27 Jun 2023 09:06:53 +0000
    Gerrit-HasComments: Yes
    Gerrit-Has-Labels: No

    Bruno Braga (Gerrit)

    unread,
    Jul 4, 2023, 5:53:41 AM7/4/23
    to blink-re...@chromium.org, blink-...@chromium.org, browser-comp...@chromium.org, devtools-re...@chromium.org, gcasto+w...@chromium.org, vasilii+watchlis...@chromium.org

    Attention is currently required from: Bruno Braga.

    Bruno Braga uploaded patch set #22 to this change.

    View Change

    [autofill in devtools] Creates a new class to handle form issues that are emitted to devtools.

    This class has the following behaviour right now:

    1. It handles the exact same issues form_utils handles today, therefore does not add any new user visible behaviour.
    3. Appends issues to a provided vector if the array is not null.
    3. If the vector is null it simply emits the issues.

    next steps:
    1. Remove the implementation from form_utils. We will call the methods introduced in this class with a nullptr vector so that issues are directly emitted and there is no behaviour change.
    2. Once we create the new devtools event that will receive the array of issues, default to always pushing issues to the array.


    notes:

    1. I removed the frame from FormIssue because it turns out we do not use it.


    Bug: 1399414
    Change-Id: Id52ca7ed87755751281f9ba65ea3f62c9569e085
    ---
    M components/BUILD.gn
    M components/autofill/content/renderer/BUILD.gn
    M components/autofill/content/renderer/autofill_agent.cc
    A components/autofill/content/renderer/form_autofill_issues.cc
    A components/autofill/content/renderer/form_autofill_issues.h
    A components/autofill/content/renderer/form_autofill_issues_browsertest.cc
    M components/autofill/content/renderer/form_autofill_util.cc
    M components/autofill/content/renderer/form_autofill_util.h
    M components/autofill/content/renderer/form_autofill_util_browsertest.cc
    M components/autofill/content/renderer/html_based_username_detector_browsertest.cc
    M components/autofill/content/renderer/password_autofill_agent.cc
    M components/autofill/content/renderer/password_form_conversion_utils.cc
    M components/autofill/core/common/form_field_data.h
    M third_party/blink/public/web/web_autofill_client.h
    M third_party/blink/renderer/core/inspector/inspector_audits_agent.cc
    15 files changed, 754 insertions(+), 113 deletions(-)

    To view, visit change 4543002. To unsubscribe, or for help writing mail filters, visit settings.

    Gerrit-MessageType: newpatchset
    Gerrit-Project: chromium/src
    Gerrit-Branch: main
    Gerrit-Change-Id: Id52ca7ed87755751281f9ba65ea3f62c9569e085
    Gerrit-Change-Number: 4543002
    Gerrit-PatchSet: 22

    Bruno Braga (Gerrit)

    unread,
    Jul 4, 2023, 6:47:15 AM7/4/23
    to blink-re...@chromium.org, blink-...@chromium.org, browser-comp...@chromium.org, devtools-re...@chromium.org, gcasto+w...@chromium.org, vasilii+watchlis...@chromium.org, Findit, Chromium LUCI CQ, chromium...@chromium.org, Danil Somsikov, Florian Leimgruber, Christoph Schwering, Tricium

    Attention is currently required from: Christoph Schwering, Florian Leimgruber.

    View Change

    28 comments:

    • Commit Message:

      • [autofill in devtools] Creates a new class to handle form issues that are emitted to devtools.

      • next step: Either inside form cache or the agent (TBD) we will call the methods inside form_autofill_issues.h to create the vector of FormIssues. This will only be done in the case where devtools is open only.

      • notes:

        1. I removed the frame from FormIssue because it turns out we do not use it.

      • 2. I made GetAutocompleteAttribute, HasAutocompleteAttribute and GetWebElementsFromIdList public so that they can be reused inside the new class.
        2. I refactored some parts of the existing code. With the refactor that came from the initial review, things changes quite a bit. However there were still comments regarding the existing code, I addressed them as well. I can break into another CL if you prefer.

      • nit: The CL has changed quite a bit since the original description. […]

        Done

    • File components/autofill/content/renderer/form_autofill_issues.h:

      • Done

      • emit devtools
        // issues for them

      • Should this rather read "add them to `form_issues`"?

      • Yeah. Also mentioned that we are emitting in case form_issues is null

      • For now yes. The chained CL will actually use it.

      • Patch Set #20, Line 24: std::vector<blink::WebAutofillClient::FormIssue>*

        Do we need an out parameter here and elsewhere? What does "Get" mean in this context? go/totw/176

      • It will append form_issues (get them) to the parameter provided, as the documentation states. It is better to have it as a param because we will want to use this class 3 times.

        1. For each form in the page.
        2. For elements that are not part of a form
        3. After extraction to look for incorrect label usages.

        If we make it return an array we will have to be always merging it to an existing one in the caller.

      • void GetFormIssues(


      • const blink::WebFormElement& form_element,
        std::vector<blink::WebAutofillClient::FormIssue>* form_issues);

        // Same as above, however instead of receiving a form, it received a list of
        // control elements that were found outside a form tag.
        void GetFormIssuesFromUnownedControlElements(
        const std::vector<blink::WebFormControlElement>& unowned_control_elements,
        std::vector<blink::WebAutofillClient::FormIssue>* form_issues);

      • The implementation of `GetFormIssues()` basically just calls `GetFormIssuesFromUnownedControlElement […]

        Done

    • File components/autofill/content/renderer/form_autofill_issues.cc:

      • // Realistically devtools already dedupes issues. However we make sure not
        // to push the same one here for readability.
        bool previous_element_not_added =
        form_issues->empty() ||
        (form_issues->back().issue_type ==
        GenericIssueErrorType::kFormDuplicateIdForInputError &&
        form_issues->back().violating_node != prev(it)->GetDevToolsNodeId());
        if (previous_element_not_added) {
        form_issues->emplace_back(

      •             GenericIssueErrorType::kFormDuplicateIdForInputError,
        prev(it)->GetDevToolsNodeId(), id_attr);
        }

      • I think it suffices to do this once before the inner for loop?

        Done

      • This is inconsistent across this file. […]

        Done

      • Patch Set #20, Line 234: !label.CorrespondingControl().IsNull()

        Since the `label` is one of the parameters, I think we should get rid of this third parameter.

      • Done

      • Patch Set #20, Line 272: WebElementCollection labels = document.GetElementsByHTMLTagName(label_attr);

        nit: Move this down to where it's actually used.

      • Done

      • I think you should check that the `label_source` is `kFor`. […]

        Done

      • This comment doesn't make any sense here, `root` is not in the scope :) (and the feature was launche […]

        Done

      • No, the phrasing was confusing. It is actually kFormLabelForNameError

    • File components/autofill/content/renderer/form_autofill_issues_browsertest.cc:

      • nit: […]

        Done

      • Patch Set #20, Line 30:

          for (const blink::WebAutofillClient::FormIssue& form_issue : form_issues) {
        if (form_issue.issue_type == expected_issue) {
        return violating_attr.empty()
        ? true
        : violating_attr == form_issue.violating_node_attribute.Utf8();
        }
        }
        return false;

      • nit: Use base::ranges::find. Something like this should work […]

        Thanks for the suggestion but I do not see how this is making the code more readable? It looks like a different way of writing the same thing with some more boilerplate.

      • nit: Maybe make ID of the form element a parameter (with default value). […]

        Done

      • Nits for the HTML code here and below: […]

        Done

      • Patch Set #20, Line 81:

          int duplicated_ids_issue_count = 0;
        for (const blink::WebAutofillClient::FormIssue& form_issue : form_issues) {
        if (form_issue.issue_type ==
        GenericIssueErrorType::kFormDuplicateIdForInputError &&
        form_issue.violating_node_attribute.Utf8() == "id") {
        duplicated_ids_issue_count++;
        }
        }

        Simplify using `base::ranges::count()` (similar to my suggestion for `formIssuesContainIssue()`)

      • Done

      • Patch Set #20, Line 197:

         std::vector<FormFieldData> fields;
        for (size_t i = 0; i < 3; ++i) {
        FormFieldData expected;
        expected.id_attribute = u"id_" + base::NumberToString16(i);
        expected.name_attribute = u"name_" + base::NumberToString16(i);
        expected.assigned_label_source = AssignedLabelSource::kName;
        fields.push_back(expected);
        }

        Can you declare these as <input>s in the HTML and then extract them from the loaded DOM? Same below.

      • Done

    • File components/autofill/content/renderer/form_autofill_util.h:

      • nit: This function has a one line implementation. […]

        Done

    • File components/autofill/content/renderer/form_autofill_util.cc:

      •     for (++it; it != elements.end() &&


      • std::prev(it)->GetIdAttribute() == it->GetIdAttribute();
        ++it) {

      • Ack. Please add a comment stating that DevTools does the dedup for us.

        Done

    • File components/autofill/content/renderer/form_autofill_util.cc:

      • There's a word missing

      • Done

    • File components/autofill/content/renderer/form_autofill_util.cc:


      • while ((it = base::ranges::adjacent_find(
        it, elements_with_id_attr.end(), {},
        &WebFormControlElement::GetIdAttribute)) !=
        elements_with_id_attr.end()) {
        for (++it; it != elements_with_id_attr.end() &&
        std::prev(it)->GetIdAttribute() == it->GetIdAttribute();
        ++it) {

      • I think you can merge both loops into a single loop like this: […]

        Done

      • Done

      • Done

      • Patch Set #20, Line 1579:

        while ((it = base::ranges::adjacent_find(
        it, elements_with_id_attr.end(), {},
        &WebFormControlElement::GetIdAttribute)) !=
        elements_with_id_attr.end()) {
        for (++it; it != elements_with_id_attr.end() &&
        std::prev(it)->GetIdAttribute() == it->GetIdAttribute();
        ++it) {
        // Please note that all elements are pointing to the same document.
        // Therefore we can it simply use `it` and not `prev`.
        it->GetDocument().GetFrame()->AddGenericIssue(
        GenericIssueErrorType::kFormDuplicateIdForInputError,
        prev(it)->GetDevToolsNodeId(), id_attr);

        it->GetDocument().GetFrame()->AddGenericIssue(
        GenericIssueErrorType::kFormDuplicateIdForInputError,
        it->GetDevToolsNodeId(), id_attr);
        }
        }

      • I think the inner loop is worth eliminating. […]

        Done

    To view, visit change 4543002. To unsubscribe, or for help writing mail filters, visit settings.

    Gerrit-MessageType: comment
    Gerrit-Project: chromium/src
    Gerrit-Branch: main
    Gerrit-Change-Id: Id52ca7ed87755751281f9ba65ea3f62c9569e085
    Gerrit-Change-Number: 4543002
    Gerrit-PatchSet: 23
    Gerrit-Owner: Bruno Braga <bruno...@google.com>
    Gerrit-Reviewer: Bruno Braga <bruno...@google.com>
    Gerrit-Reviewer: Christoph Schwering <schw...@google.com>
    Gerrit-Reviewer: Findit <findit...@appspot.gserviceaccount.com>
    Gerrit-Reviewer: Florian Leimgruber <fleim...@google.com>
    Gerrit-CC: Danil Somsikov <d...@chromium.org>
    Gerrit-Attention: Florian Leimgruber <fleim...@google.com>
    Gerrit-Attention: Christoph Schwering <schw...@google.com>
    Gerrit-Comment-Date: Tue, 04 Jul 2023 10:47:04 +0000
    Gerrit-HasComments: Yes
    Gerrit-Has-Labels: No
    Comment-In-Reply-To: Florian Leimgruber <fleim...@google.com>
    Comment-In-Reply-To: Bruno Braga <bruno...@google.com>
    Comment-In-Reply-To: Christoph Schwering <schw...@google.com>

    Christoph Schwering (Gerrit)

    unread,
    Jul 4, 2023, 7:41:16 AM7/4/23
    to Bruno Braga, blink-re...@chromium.org, blink-...@chromium.org, browser-comp...@chromium.org, devtools-re...@chromium.org, gcasto+w...@chromium.org, vasilii+watchlis...@chromium.org, Findit, Chromium LUCI CQ, chromium...@chromium.org, Danil Somsikov, Florian Leimgruber, Tricium

    Attention is currently required from: Bruno Braga, Florian Leimgruber.

    View Change

    2 comments:

      •   for (const blink::WebAutofillClient::FormIssue& form_issue : form_issues) {
        if (form_issue.issue_type == expected_issue) {
        return violating_attr.empty()
        ? true
        : violating_attr == form_issue.violating_node_attribute.Utf8();
        }
        }
        return false;

      • Thanks for the suggestion but I do not see how this is making the code more readable? It looks like […]

        IMO the short answer is "because it makes the code more declarative".
        https://www.youtube.com/watch?v=W2tWOdzgXHA is on this specific topic (though it predates C++20).

        This particular function is just an instance of `base::ranges::any_of()`:
        ```
        return base::ranges::any_of(form_issues, [&](const auto& form_issue) {
        return form_issue.issue_type == expected_issue &&
        (violating_attr.empty() ||
        violating_attr == form_issue.violating_node_attribute.Utf8());
        });
        ```

    To view, visit change 4543002. To unsubscribe, or for help writing mail filters, visit settings.

    Gerrit-MessageType: comment
    Gerrit-Project: chromium/src
    Gerrit-Branch: main
    Gerrit-Change-Id: Id52ca7ed87755751281f9ba65ea3f62c9569e085
    Gerrit-Change-Number: 4543002
    Gerrit-PatchSet: 23
    Gerrit-Owner: Bruno Braga <bruno...@google.com>
    Gerrit-Reviewer: Bruno Braga <bruno...@google.com>
    Gerrit-Reviewer: Christoph Schwering <schw...@google.com>
    Gerrit-Reviewer: Findit <findit...@appspot.gserviceaccount.com>
    Gerrit-Reviewer: Florian Leimgruber <fleim...@google.com>
    Gerrit-CC: Danil Somsikov <d...@chromium.org>
    Gerrit-Attention: Florian Leimgruber <fleim...@google.com>
    Gerrit-Attention: Bruno Braga <bruno...@google.com>
    Gerrit-Comment-Date: Tue, 04 Jul 2023 11:41:06 +0000

    Bruno Braga (Gerrit)

    unread,
    Jul 4, 2023, 8:14:27 AM7/4/23
    to blink-re...@chromium.org, blink-...@chromium.org, browser-comp...@chromium.org, devtools-re...@chromium.org, gcasto+w...@chromium.org, vasilii+watchlis...@chromium.org, Findit, Chromium LUCI CQ, chromium...@chromium.org, Danil Somsikov, Florian Leimgruber, Christoph Schwering, Tricium

    Attention is currently required from: Christoph Schwering, Florian Leimgruber.

    View Change

    1 comment:

    • File components/autofill/content/renderer/form_autofill_issues_browsertest.cc:

      • Patch Set #20, Line 30:

          for (const blink::WebAutofillClient::FormIssue& form_issue : form_issues) {
        if (form_issue.issue_type == expected_issue) {
        return violating_attr.empty()
        ? true
        : violating_attr == form_issue.violating_node_attribute.Utf8();
        }
        }
        return false;

      • IMO the short answer is "because it makes the code more declarative". […]

        Well, indeed I agree that in this case base::any_of does make it simpler.

    To view, visit change 4543002. To unsubscribe, or for help writing mail filters, visit settings.

    Gerrit-MessageType: comment
    Gerrit-Project: chromium/src
    Gerrit-Branch: main
    Gerrit-Change-Id: Id52ca7ed87755751281f9ba65ea3f62c9569e085
    Gerrit-Change-Number: 4543002
    Gerrit-PatchSet: 23
    Gerrit-Owner: Bruno Braga <bruno...@google.com>
    Gerrit-Reviewer: Bruno Braga <bruno...@google.com>
    Gerrit-Reviewer: Christoph Schwering <schw...@google.com>
    Gerrit-Reviewer: Findit <findit...@appspot.gserviceaccount.com>
    Gerrit-Reviewer: Florian Leimgruber <fleim...@google.com>
    Gerrit-CC: Danil Somsikov <d...@chromium.org>
    Gerrit-Attention: Florian Leimgruber <fleim...@google.com>
    Gerrit-Attention: Christoph Schwering <schw...@google.com>
    Gerrit-Comment-Date: Tue, 04 Jul 2023 12:14:18 +0000
    Gerrit-HasComments: Yes
    Gerrit-Has-Labels: No
    Comment-In-Reply-To: Florian Leimgruber <fleim...@google.com>
    Comment-In-Reply-To: Bruno Braga <bruno...@google.com>
    Comment-In-Reply-To: Christoph Schwering <schw...@google.com>

    Florian Leimgruber (Gerrit)

    unread,
    Jul 5, 2023, 5:09:53 AM7/5/23
    to Bruno Braga, blink-re...@chromium.org, blink-...@chromium.org, browser-comp...@chromium.org, devtools-re...@chromium.org, gcasto+w...@chromium.org, vasilii+watchlis...@chromium.org, Findit, Chromium LUCI CQ, chromium...@chromium.org, Danil Somsikov, Christoph Schwering, Tricium

    Attention is currently required from: Bruno Braga, Christoph Schwering.

    View Change

    11 comments:

    • Commit Message:

      • Patch Set #23, Line 16: 1. Remove the implementation from form_utils. We will call the methods introduced in this class with a nullptr vector so that issues are directly emitted and there is no behaviour change.

        Remind me, what was the reason for doing this in a separate CL? It seems like it would be easier to remove it immediately. Could you mention that in the description (I remember you told me offline, but unfortunately I forgot. Sorry)

    • Patchset:

    • File components/autofill/content/renderer/form_autofill_issues.h:

      • Patch Set #23, Line 27:

        This needs to
        // be called after label extraction.

        Can we CHECK that, e.g. using something like this at the beginning of the function?
        ```
        CHECK(base::ranges::all_of(fields, [](const FormFieldData& field) {
        return field.label_source != LabelSource::kUnknown;
        }));
        ```
        (Or perhaps DCHECK, since this is rather expensive)
    • File components/autofill/content/renderer/form_autofill_issues.cc:

      •         (form_issues->back().issue_type ==
        GenericIssueErrorType::kFormDuplicateIdForInputError &&

      •          form_issues->back().violating_node != it->GetDevToolsNodeId())

        Shouldn't this be
        ```
        (form_issues->back().issue_type !=
        GenericIssueErrorType::kFormDuplicateIdForInputError ||
        form_issues->back().violating_node != it->GetDevToolsNodeId())
        ```
        (i.e. it was not already added if the previous issue wasn't a duplicate ID - or if it was, but for a different field)

        Given the apparent complexity introduced by this check, and the fact that "Realistically devtools already dedupes issues" - should we just get rid of the check?

      • Patch Set #23, Line 135:

            if (next(it) != elements_with_id_attr.end() &&
        next(it)->GetIdAttribute() == it->GetIdAttribute()) {

        Like in form_autofill_util.cc, this is guaranteed to be true.

      • Patch Set #23, Line 216: const WebString for_attr = GetWebString<kFor>();

        This is unused

    • File components/autofill/content/renderer/form_autofill_issues_browsertest.cc:

      • Patch Set #23, Line 60: <form id=target>

        optional nit here and below: Newline, so the <form> open and closing tag have the same indentation?

    • File components/autofill/content/renderer/form_autofill_util.cc:

    To view, visit change 4543002. To unsubscribe, or for help writing mail filters, visit settings.

    Gerrit-MessageType: comment
    Gerrit-Project: chromium/src
    Gerrit-Branch: main
    Gerrit-Change-Id: Id52ca7ed87755751281f9ba65ea3f62c9569e085
    Gerrit-Change-Number: 4543002
    Gerrit-PatchSet: 23
    Gerrit-Owner: Bruno Braga <bruno...@google.com>
    Gerrit-Reviewer: Bruno Braga <bruno...@google.com>
    Gerrit-Reviewer: Christoph Schwering <schw...@google.com>
    Gerrit-Reviewer: Findit <findit...@appspot.gserviceaccount.com>
    Gerrit-Reviewer: Florian Leimgruber <fleim...@google.com>
    Gerrit-CC: Danil Somsikov <d...@chromium.org>
    Gerrit-Attention: Bruno Braga <bruno...@google.com>
    Gerrit-Attention: Christoph Schwering <schw...@google.com>
    Gerrit-Comment-Date: Wed, 05 Jul 2023 09:09:44 +0000
    Gerrit-HasComments: Yes
    Gerrit-Has-Labels: No

    Bruno Braga (Gerrit)

    unread,
    Aug 7, 2023, 8:42:52 AM8/7/23
    to blink-re...@chromium.org, blink-...@chromium.org, browser-comp...@chromium.org, devtools-re...@chromium.org, gcasto+w...@chromium.org, vasilii+watchlis...@chromium.org, Findit, Chromium LUCI CQ, chromium...@chromium.org, Danil Somsikov, Florian Leimgruber, Christoph Schwering, Tricium

    Attention is currently required from: Christoph Schwering, Florian Leimgruber.

    View Change

    12 comments:

    • Commit Message:

      • Patch Set #23, Line 16: 1. Remove the implementation from form_utils. We will call the methods introduced in this class with a nullptr vector so that issues are directly emitted and there is no behaviour change.

      • Remind me, what was the reason for doing this in a separate CL? It seems like it would be easier to […]

        Just to keep things separate and make this CL a bit shorter i.e fist move then delete, specially because this CL got quite large. The remove will have to come with an update in form_cache to start using this method, so I prefer to have a specific CL for that. That being said I see your point specially because this CL is keeping form_utils in sync.

    • File components/autofill/content/renderer/form_autofill_issues.h:

      • Can we CHECK that, e.g. using something like this at the beginning of the function? […]

        Done, please note that I had to update some tests.

        also, can label_source really not be unknown tho, is that a guarantee?

    • File components/autofill/content/renderer/form_autofill_issues.cc:

      • I think the current element has never been added already. […]

        resolved offline, the current element can be added more than once.

      • Patch Set #23, Line 127:

                (form_issues->back().issue_type ==
        GenericIssueErrorType::kFormDuplicateIdForInputError &&
        form_issues->back().violating_node != it->GetDevToolsNodeId())

      • Shouldn't this be […]

        Resolved offline.

        the code snipped makes sense, however we are not removing the check to make sure the array itself does not have duplicates. If we allow duplicated here we would have to dedupe inside devtools. I am removing the comment for clarity.

      • Patch Set #23, Line 135:

            if (next(it) != elements_with_id_attr.end() &&
        next(it)->GetIdAttribute() == it->GetIdAttribute()) {

        Like in form_autofill_util.cc, this is guaranteed to be true.

      • Done

      • Done

    • File components/autofill/content/renderer/form_autofill_issues_browsertest.cc:

      • Patch Set #20, Line 30:

          for (const blink::WebAutofillClient::FormIssue& form_issue : form_issues) {
        if (form_issue.issue_type == expected_issue) {
        return violating_attr.empty()
        ? true
        : violating_attr == form_issue.violating_node_attribute.Utf8();
        }
        }
        return false;

      • Well, indeed I agree that in this case base::any_of does make it simpler.

        Thanks for the suggestion.

    • File components/autofill/content/renderer/form_autofill_issues_browsertest.cc:

      • Patch Set #23, Line 60: <form id=target>

        optional nit here and below: Newline, so the <form> open and closing tag have the same indentation?

      • base::flat_map<WebString, int> id_count;
        for (const WebFormControlElement& element : control_elements) {
        if (IsAutofillableElement(element) && !element.GetIdAttribute().IsEmpty()) {
        id_count[element.GetIdAttribute()]++;
        }
        }

      • Upps, that makes sense. […]

        Done

    • File components/autofill/content/renderer/form_autofill_util.cc:

      • nit: New code should prefer backticks \`\` instead of pipes || - [style guide](https://google. […]

        Done

      • Patch Set #23, Line 1569: next(it)->GetDevToolsNodeId(), id_attr);

        (just curious) Why does `next()` compile? I thought specifying the `std` namespace was required.

      • this is a fair point. I am not sure either, I can try to find out and update here for learning.

    To view, visit change 4543002. To unsubscribe, or for help writing mail filters, visit settings.

    Gerrit-MessageType: comment
    Gerrit-Project: chromium/src
    Gerrit-Branch: main
    Gerrit-Change-Id: Id52ca7ed87755751281f9ba65ea3f62c9569e085
    Gerrit-Change-Number: 4543002
    Gerrit-PatchSet: 24
    Gerrit-Owner: Bruno Braga <bruno...@google.com>
    Gerrit-Reviewer: Bruno Braga <bruno...@google.com>
    Gerrit-Reviewer: Christoph Schwering <schw...@google.com>
    Gerrit-Reviewer: Findit <findit...@appspot.gserviceaccount.com>
    Gerrit-Reviewer: Florian Leimgruber <fleim...@google.com>
    Gerrit-CC: Danil Somsikov <d...@chromium.org>
    Gerrit-Attention: Florian Leimgruber <fleim...@google.com>
    Gerrit-Attention: Christoph Schwering <schw...@google.com>
    Gerrit-Comment-Date: Mon, 07 Aug 2023 12:42:41 +0000
    Gerrit-HasComments: Yes
    Gerrit-Has-Labels: No

    Florian Leimgruber (Gerrit)

    unread,
    Aug 8, 2023, 5:35:58 AM8/8/23
    to Bruno Braga, blink-re...@chromium.org, blink-...@chromium.org, browser-comp...@chromium.org, devtools-re...@chromium.org, gcasto+w...@chromium.org, vasilii+watchlis...@chromium.org, Findit, Chromium LUCI CQ, chromium...@chromium.org, Danil Somsikov, Christoph Schwering, Tricium

    Attention is currently required from: Bruno Braga, Christoph Schwering.

    Patch set 25:Code-Review +1

    View Change

    7 comments:

    • Patchset:

      • Patch Set #25:

        I haven't taken a super detailed look, but given all the revisions this went through and the fact that it mostly just moves code, it LGTM now.

    • File components/autofill/content/renderer/form_autofill_issues.h:

      • resolved offline, the current element can be added more than once.

        Acknowledged

      • Patch Set #23, Line 127:

                (form_issues->back().issue_type ==
        GenericIssueErrorType::kFormDuplicateIdForInputError &&
        form_issues->back().violating_node != it->GetDevToolsNodeId())

      • Resolved offline. […]

        Acknowledged

    • File components/autofill/content/renderer/form_autofill_issues_browsertest.cc:

      • Patch Set #20, Line 30:

          for (const blink::WebAutofillClient::FormIssue& form_issue : form_issues) {
        if (form_issue.issue_type == expected_issue) {
        return violating_attr.empty()
        ? true
        : violating_attr == form_issue.violating_node_attribute.Utf8();
        }
        }
        return false;

      • Thanks for the suggestion.

        Acknowledged

    • File components/autofill/content/renderer/form_autofill_util.cc:

      • Patch Set #25, Line 1567: Please note that All

        Remove "Please note that" or use a lower case a for "All".
        Perhaps also note that you're relying on the DevTools-side deduplication here.

    To view, visit change 4543002. To unsubscribe, or for help writing mail filters, visit settings.

    Gerrit-MessageType: comment
    Gerrit-Project: chromium/src
    Gerrit-Branch: main
    Gerrit-Change-Id: Id52ca7ed87755751281f9ba65ea3f62c9569e085
    Gerrit-Change-Number: 4543002
    Gerrit-PatchSet: 25
    Gerrit-Owner: Bruno Braga <bruno...@google.com>
    Gerrit-Reviewer: Bruno Braga <bruno...@google.com>
    Gerrit-Reviewer: Christoph Schwering <schw...@google.com>
    Gerrit-Reviewer: Findit <findit...@appspot.gserviceaccount.com>
    Gerrit-Reviewer: Florian Leimgruber <fleim...@google.com>
    Gerrit-CC: Danil Somsikov <d...@chromium.org>
    Gerrit-Attention: Bruno Braga <bruno...@google.com>
    Gerrit-Attention: Christoph Schwering <schw...@google.com>
    Gerrit-Comment-Date: Tue, 08 Aug 2023 09:35:45 +0000
    Gerrit-HasComments: Yes
    Gerrit-Has-Labels: Yes

    Findit (Gerrit)

    unread,
    Aug 8, 2023, 6:45:47 AM8/8/23
    to Bruno Braga, blink-re...@chromium.org, blink-...@chromium.org, browser-comp...@chromium.org, devtools-re...@chromium.org, gcasto+w...@chromium.org, vasilii+watchlis...@chromium.org, Florian Leimgruber, Chromium LUCI CQ, chromium...@chromium.org, Danil Somsikov, Christoph Schwering, Tricium

    Attention is currently required from: Bruno Braga, Christoph Schwering.

    This change meets the code coverage requirements.

    Patch set 26:Code-Coverage +1

    View Change

      To view, visit change 4543002. To unsubscribe, or for help writing mail filters, visit settings.

      Gerrit-MessageType: comment
      Gerrit-Project: chromium/src
      Gerrit-Branch: main
      Gerrit-Change-Id: Id52ca7ed87755751281f9ba65ea3f62c9569e085
      Gerrit-Change-Number: 4543002
      Gerrit-PatchSet: 26
      Gerrit-Owner: Bruno Braga <bruno...@google.com>
      Gerrit-Reviewer: Bruno Braga <bruno...@google.com>
      Gerrit-Reviewer: Christoph Schwering <schw...@google.com>
      Gerrit-Reviewer: Findit <findit...@appspot.gserviceaccount.com>
      Gerrit-Reviewer: Florian Leimgruber <fleim...@google.com>
      Gerrit-CC: Danil Somsikov <d...@chromium.org>
      Gerrit-Attention: Bruno Braga <bruno...@google.com>
      Gerrit-Attention: Christoph Schwering <schw...@google.com>
      Gerrit-Comment-Date: Tue, 08 Aug 2023 10:45:34 +0000
      Gerrit-HasComments: No
      Gerrit-Has-Labels: Yes

      Bruno Braga (Gerrit)

      unread,
      Aug 11, 2023, 7:52:31 AM8/11/23
      to Mike West, blink-re...@chromium.org, blink-...@chromium.org, browser-comp...@chromium.org, devtools-re...@chromium.org, gcasto+w...@chromium.org, vasilii+watchlis...@chromium.org, Florian Leimgruber, findit...@appspot.gserviceaccount.com, Christoph Schwering

      Attention is currently required from: Christoph Schwering, Mike West.

      Bruno Braga would like Mike West to review this change.

      View Change

      [autofill in devtools] Creates a new class to handle form issues that are emitted to devtools.

      This class has the following behaviour right now:

      1. It handles the exact same issues form_utils handles today, therefore does not add any new user visible behaviour.
      3. Appends issues to a provided vector if the array is not null.
      3. If the vector is null it simply emits the issues.

      next steps:
      1. Remove the implementation from form_utils. We will call the methods introduced in this class with a nullptr vector so that issues are directly emitted and there is no behaviour change.
      2. Once we create the new devtools event that will receive the array of issues, default to always pushing issues to the array.

      notes:

      1. I removed the frame from FormIssue because it turns out we do not use it.


      Bug: 1399414
      Change-Id: Id52ca7ed87755751281f9ba65ea3f62c9569e085
      ---
      M components/BUILD.gn
      M components/autofill/content/renderer/BUILD.gn
      M components/autofill/content/renderer/autofill_agent.cc
      A components/autofill/content/renderer/form_autofill_issues.cc
      A components/autofill/content/renderer/form_autofill_issues.h
      A components/autofill/content/renderer/form_autofill_issues_browsertest.cc
      M components/autofill/content/renderer/form_autofill_util.cc
      M components/autofill/content/renderer/form_autofill_util.h
      M components/autofill/content/renderer/form_autofill_util_browsertest.cc
      M components/autofill/content/renderer/html_based_username_detector_browsertest.cc
      M components/autofill/content/renderer/password_autofill_agent.cc
      M components/autofill/content/renderer/password_form_conversion_utils.cc
      M components/autofill/core/common/form_field_data.h
      M third_party/blink/public/web/web_autofill_client.h
      M third_party/blink/renderer/core/inspector/inspector_audits_agent.cc
      15 files changed, 745 insertions(+), 116 deletions(-)


      To view, visit change 4543002. To unsubscribe, or for help writing mail filters, visit settings.

      Gerrit-MessageType: newchange
      Gerrit-Project: chromium/src
      Gerrit-Branch: main
      Gerrit-Change-Id: Id52ca7ed87755751281f9ba65ea3f62c9569e085
      Gerrit-Change-Number: 4543002
      Gerrit-PatchSet: 26
      Gerrit-Owner: Bruno Braga <bruno...@google.com>
      Gerrit-Reviewer: Bruno Braga <bruno...@google.com>
      Gerrit-Reviewer: Christoph Schwering <schw...@google.com>
      Gerrit-Reviewer: Florian Leimgruber <fleim...@google.com>
      Gerrit-Reviewer: Mike West <mk...@chromium.org>
      Gerrit-CC: Danil Somsikov <d...@chromium.org>
      Gerrit-Attention: Christoph Schwering <schw...@google.com>
      Gerrit-Attention: Mike West <mk...@chromium.org>

      Bruno Braga (Gerrit)

      unread,
      Aug 11, 2023, 7:52:36 AM8/11/23
      to blink-re...@chromium.org, blink-...@chromium.org, browser-comp...@chromium.org, devtools-re...@chromium.org, gcasto+w...@chromium.org, vasilii+watchlis...@chromium.org, Mike West, Florian Leimgruber, findit...@appspot.gserviceaccount.com, Chromium LUCI CQ, chromium...@chromium.org, Danil Somsikov, Christoph Schwering, Tricium

      Attention is currently required from: Christoph Schwering, Mike West.

      View Change

      2 comments:

      • File components/autofill/content/renderer/form_autofill_issues.h:

        • Oh, you're right - kUnknown actually represents "we didn't find a label". […]

          Done

      • File components/autofill/content/renderer/form_autofill_util.cc:

        • Remove "Please note that" or use a lower case a for "All". […]

          Done

      To view, visit change 4543002. To unsubscribe, or for help writing mail filters, visit settings.

      Gerrit-MessageType: comment
      Gerrit-Project: chromium/src
      Gerrit-Branch: main
      Gerrit-Change-Id: Id52ca7ed87755751281f9ba65ea3f62c9569e085
      Gerrit-Change-Number: 4543002
      Gerrit-PatchSet: 26
      Gerrit-Owner: Bruno Braga <bruno...@google.com>
      Gerrit-Reviewer: Bruno Braga <bruno...@google.com>
      Gerrit-Reviewer: Christoph Schwering <schw...@google.com>
      Gerrit-Reviewer: Florian Leimgruber <fleim...@google.com>
      Gerrit-Reviewer: Mike West <mk...@chromium.org>
      Gerrit-CC: Danil Somsikov <d...@chromium.org>
      Gerrit-Attention: Christoph Schwering <schw...@google.com>
      Gerrit-Attention: Mike West <mk...@chromium.org>
      Gerrit-Comment-Date: Fri, 11 Aug 2023 11:52:26 +0000
      Gerrit-HasComments: Yes
      Gerrit-Has-Labels: No

      Bruno Braga (Gerrit)

      unread,
      Aug 11, 2023, 7:53:05 AM8/11/23
      to Danil Somsikov, blink-re...@chromium.org, blink-...@chromium.org, browser-comp...@chromium.org, devtools-re...@chromium.org, gcasto+w...@chromium.org, vasilii+watchlis...@chromium.org, Mike West, Florian Leimgruber, findit...@appspot.gserviceaccount.com, Christoph Schwering

      Attention is currently required from: Christoph Schwering, Danil Somsikov, Mike West.

      Bruno Braga would like Danil Somsikov to review this change.

      To view, visit change 4543002. To unsubscribe, or for help writing mail filters, visit settings.

      Gerrit-MessageType: newchange
      Gerrit-Project: chromium/src
      Gerrit-Branch: main
      Gerrit-Change-Id: Id52ca7ed87755751281f9ba65ea3f62c9569e085
      Gerrit-Change-Number: 4543002
      Gerrit-PatchSet: 26
      Gerrit-Owner: Bruno Braga <bruno...@google.com>
      Gerrit-Reviewer: Bruno Braga <bruno...@google.com>
      Gerrit-Reviewer: Christoph Schwering <schw...@google.com>
      Gerrit-Reviewer: Danil Somsikov <d...@chromium.org>
      Gerrit-Reviewer: Florian Leimgruber <fleim...@google.com>
      Gerrit-Reviewer: Mike West <mk...@chromium.org>
      Gerrit-Attention: Danil Somsikov <d...@chromium.org>

      Bruno Braga (Gerrit)

      unread,
      Aug 11, 2023, 7:53:43 AM8/11/23
      to Danil Somsikov, blink-re...@chromium.org, blink-...@chromium.org, browser-comp...@chromium.org, devtools-re...@chromium.org, gcasto+w...@chromium.org, vasilii+watchlis...@chromium.org, Mike West, Florian Leimgruber, findit...@appspot.gserviceaccount.com, Christoph Schwering

      Attention is currently required from: Christoph Schwering, Mike West.

      Bruno Braga removed Danil Somsikov from this change.

      Gerrit-Reviewer: Florian Leimgruber <fleim...@google.com>
      Gerrit-Reviewer: Mike West <mk...@chromium.org>

      Christoph Schwering (Gerrit)

      unread,
      Aug 13, 2023, 9:43:41 PM8/13/23
      to Bruno Braga, blink-re...@chromium.org, blink-...@chromium.org, browser-comp...@chromium.org, devtools-re...@chromium.org, gcasto+w...@chromium.org, vasilii+watchlis...@chromium.org, Mike West, Florian Leimgruber, findit...@appspot.gserviceaccount.com, Chromium LUCI CQ, chromium...@chromium.org, Tricium

      Attention is currently required from: Bruno Braga, Florian Leimgruber, Mike West.

      View Change

      21 comments:

      • Commit Message:

        • Patch Set #26, Line 7: new class

          Does it introduce a new class?

        • Patch Set #26, Line 11: 1. It handles the exact same issues form_utils handles today, therefore does not add any new user visible behaviour.

          nit: wrap at 72 as per https://chromium.googlesource.com/chromium/src/+/master/docs/contributing.md#Uploading-a-change-for-review

        • Patch Set #26, Line 12: vector if the array is not null.

          That's hard to understand without knowing the CL.

          Edit after the review: I still don't understand it :-). I guess by "array is not null" you mean that the vector isn't nullptr? That's obvious thought because otherwise we'd crash, right? I think a the description should be more high-level to make it more accessible.

        • Patch Set #26, Line 13: 3. If the vector is null it simply emits the issues.

          I forgot, what's the difference between the two and what's the reason for the vector again?

          IIRC we had some discussions in the context of this CL about minimizing the overhead for users who don't have DevTools open. I don't recall our conclusion but I also don't see this addressed in the CL (perhaps because I don't find where the new code is called). Could you remind me? :-)

        • Patch Set #26, Line 13: If the vector is null it simply emits the issues

          I can't find this in the CL. The new code from components/autofill/content/renderer/form_autofill_issues.{h,cc} isn't called anywhere yet, is it?

      • File components/autofill/content/renderer/form_autofill_issues.cc:

        • Patch Set #26, Line 55: std::vector<blink::WebAutofillClient::FormIssue>*

          Taking go/totw/176's "avoid whenever possible" literally, I guess the recommended approach is to take a vector by value or rvalue reference and to return it, and call it with `std::move()` where appropriate.

        • Patch Set #26, Line 153: const WebInputElement input_element = element.DynamicTo<WebInputElement>();

          I meant to comment about the surrounding whitespace w.r.t. go/c-style#Vertical_Whitespace, but the variable actually seems to be unused, so it's just an uncontroversial "Remove" :-)

      • File components/autofill/content/renderer/form_autofill_util.cc:

        • Patch Set #2, Line 1615: static base::NoDestructor<WebString> kName("name");

          I updated the new class not to clash with your current CL, ptal.

          Done

        • Patch Set #2, Line 1624: violatingAttr

          We can call it violating_attr_value. […]

          My point wasn't about "attribute" vs "attribute value". I meant they're not *violating* anything.

          The two things that come to my mind what they could be violating are the HTML spec and the autocomplete attribute's grammar. But they're even matching the latter, and there's a good chance they're conforming with the former because all it [says](https://html.spec.whatwg.org/multipage/dom.html#global-attributes:the-id-attribute-2) is that an `id` attribute value must not contain spaces.

      • File components/autofill/content/renderer/form_autofill_util.cc:

        • this is a fair point. I am not sure either, I can try to find out and update here for learning.

        • // Create copies of `elements` with ids that can be modified

        •   WebVector<WebFormControlElement> elements_with_id_attr;
          elements_with_id_attr.reserve(elements.size());
          for (const auto& element : elements) {
          if (form_util::IsAutofillableElement(element) &&
          !element.GetIdAttribute().IsEmpty()) {
          elements_with_id_attr.push_back(element);
          }
          }

          nit: instead pass `elements` by value and do `base::EraseIf(elements, base::not_fn(&IsAutofillableElement))`?

        • Patch Set #26, Line 1567: Please note that all

          I guess this is personal taste, but I think the short version "All" is more common for such a comment. From a quick look at the codebase we seem to use "please" when we're afraid that somebody would break something (as in "please read the documentation" or "please don't use this function").

        • Patch Set #26, Line 1618: violatingAttr

          `snake_case`

        • Patch Set #26, Line 1867: KEEP_WHITESPACE

          I assume this doesn't have an effect because the separators are whitespace, correct?

        • Patch Set #26, Line 2908: ll

          typo: labelled_

      • File components/autofill/core/common/form_field_data.h:

      To view, visit change 4543002. To unsubscribe, or for help writing mail filters, visit settings.

      Gerrit-MessageType: comment
      Gerrit-Project: chromium/src
      Gerrit-Branch: main
      Gerrit-Change-Id: Id52ca7ed87755751281f9ba65ea3f62c9569e085
      Gerrit-Change-Number: 4543002
      Gerrit-PatchSet: 26
      Gerrit-Owner: Bruno Braga <bruno...@google.com>
      Gerrit-Reviewer: Bruno Braga <bruno...@google.com>
      Gerrit-Reviewer: Christoph Schwering <schw...@google.com>
      Gerrit-Reviewer: Florian Leimgruber <fleim...@google.com>
      Gerrit-Reviewer: Mike West <mk...@chromium.org>
      Gerrit-Attention: Florian Leimgruber <fleim...@google.com>
      Gerrit-Attention: Bruno Braga <bruno...@google.com>
      Gerrit-Attention: Mike West <mk...@chromium.org>
      Gerrit-Comment-Date: Mon, 14 Aug 2023 01:43:31 +0000
      Gerrit-HasComments: Yes
      Gerrit-Has-Labels: No
      Comment-In-Reply-To: Florian Leimgruber <fleim...@google.com>
      Comment-In-Reply-To: Bruno Braga <bruno...@google.com>
      Comment-In-Reply-To: Christoph Schwering <schw...@google.com>
      Reply all
      Reply to author
      Forward
      0 new messages