[go: up one dir, main page]

Autofill: Do not infer labels from divs with autofillable fields.

The label finding algorithm looks at previous divs to see if they contain text, and uses that text as the label. While this works for many webpages, not all webpages are structured this way. For a given field, when the neighbor divs contain input fields, they are likely not to be the label text.

BUG=454366

Review URL: https://codereview.chromium.org/906443002

Cr-Commit-Position: refs/heads/master@{#315688}
(cherry picked from commit 7db655c1268cca8f2e06eedb2e3ed7a0d01a9aeb)

Review URL: https://codereview.chromium.org/929393002

Cr-Commit-Position: refs/branch-heads/2272@{#310}
Cr-Branched-From: 827a380cfdb31aa54c8d56e63ce2c3fd8c3ba4d4-refs/heads/master@{#310958}
diff --git a/chrome/test/data/autofill/heuristics/input/bug_454366.html b/chrome/test/data/autofill/heuristics/input/bug_454366.html
new file mode 100644
index 0000000..6ebcd47
--- /dev/null
+++ b/chrome/test/data/autofill/heuristics/input/bug_454366.html
@@ -0,0 +1,81 @@
+<html>
+<head></head>
+<body>
+  <input type="text name="hist_state" id="hist_state" style="display: none;">
+  <div class="g-h-f-ci g-h-f-Au">
+    <div class="g-h-f-Qm" title="Browse people" guidedhelpid="shareboxpeoplepickericon" tabindex="0" style="-webkit-user-select: none;"></div>
+    <div class="g-h-f-vc g-h-f-k" style="">
+      <div class="g-h-f-vc-B b-K b-K-Xb URaP8">
+        <div class="Dp">
+          <div role="button" aria-label="Posting options" tabindex="0" class="CC tm d-k-l d-r-c" aria-expanded="false" aria-haspopup="true" style="-webkit-user-select: none;">
+            <div class="d-k-l d-r-c-sa-z">
+              <div class="d-k-l d-r-c-aa-z">
+                <div class="d-k-l d-r-c-ha"></div>
+                <div class="d-k-l d-r-c-Qa">&nbsp;</div>
+              </div>
+            </div>
+          </div>
+          <div class="DC zo" style="display: none;"></div>
+          <div class="yo" style="display: none;"></div>
+          <div class="lt"></div>
+          <div class="EC"></div>
+          <div class="d-r d-r-ih cw" role="menu" aria-haspopup="true" style="display: none; -webkit-user-select: none;">
+            <div class="d-A osa Nq" role="menuitem" id=":4j" style="-webkit-user-select: none;">
+              <div class="d-A-B" style="-webkit-user-select: none;">
+                <div style="-webkit-user-select: none;">Disable comments</div>
+              </div>
+            </div>
+            <div class="d-A osa Qq" role="menuitem" id=":4k" style="-webkit-user-select: none;">
+              <div class="d-A-B" style="-webkit-user-select: none;">
+                <div style="-webkit-user-select: none;">Enable Comments</div>
+              </div>
+            </div>
+            <div class="d-A osa Rq" role="menuitem" id=":4l" style="-webkit-user-select: none;">
+              <div class="d-A-B" style="-webkit-user-select: none;">
+                <div style="-webkit-user-select: none;">Disable reshares</div>
+              </div>
+            </div>
+            <div class="d-A osa Sq" role="menuitem" id=":4m" style="-webkit-user-select: none;">
+              <div class="d-A-B" style="-webkit-user-select: none;">
+                <div style="-webkit-user-select: none;">Enable reshares</div>
+              </div>
+            </div>
+            <div class="d-A osa Oq" role="menuitem" id=":4n" style="-webkit-user-select: none;">
+              <div class="d-A-B" style="-webkit-user-select: none;">
+                <div style="-webkit-user-select: none;">Keep within <b style="-webkit-user-select: none;">Google.com</b>
+                </div>
+              </div>
+            </div>
+            <div class="d-A osa Pq" role="menuitem" id=":4o" style="-webkit-user-select: none;">
+              <div class="d-A-B" style="-webkit-user-select: none;"></div>
+            </div>
+          </div>
+        </div>
+        <span role="list" aria-atomic="true" aria-live="assertive" aria-relevant="all"></span>
+        <span class="g-h-f-N"><span class="g-h-f-N-Rm" id="sbda">+ Add names, circles, or email addresses</span>
+          <input type="text" class="g-h-f-N-N" id="sbdp" value="" placeholder="+ Add names, circles, or email addresses" aria-label="Add names, circles, or email addresses" tabindex="0" aria-haspopup="false" role="combobox" aria-autocomplete="list">
+        </span>
+      </div>
+      <div class="g-h-f-V-nb" style="display: none;">
+        <div class="g-h-f-V-bd"></div>
+        <div class="d-r-Gk g-h-f-V b-K b-K-Xb URaP8 g-h-f-V-Lb" role="listbox" id=":4v" style="opacity: 0; -webkit-user-select: none; display: none;">
+          <div class="d-A" id=":4w" role="option" style="-webkit-user-select: none;">
+            <div class="d-A-B" style="-webkit-user-select: none;">
+              <span class="g-h-f-m-Ed-wc-E g-h-f-m" style="-webkit-user-select: none;"></span> <span class="g-h-f-za-B" style="-webkit-user-select: none;">Your circles</span>
+            </div>
+          </div>
+          <div class="d-A" id=":4y" role="option" style="-webkit-user-select: none;">
+            <div class="d-A-B" style="-webkit-user-select: none;">
+              <span class="g-h-f-m-de-E g-h-f-m" style="-webkit-user-select: none;"></span> <span class="g-h-f-za-B" style="-webkit-user-select: none;">Extended circles</span>
+            </div>
+          </div>
+          <div class="d-cm" style="-webkit-user-select: none;"></div>
+        </div>
+      </div>
+    </div>
+    <div class="g-h-f-CJ" style="display: none;">
+      <input type="text" class="g-h-f-iK">
+    </div>
+  </div>
+</body>
+</html>
diff --git a/chrome/test/data/autofill/heuristics/output/bug_454366.out b/chrome/test/data/autofill/heuristics/output/bug_454366.out
new file mode 100644
index 0000000..8d7d1985
--- /dev/null
+++ b/chrome/test/data/autofill/heuristics/output/bug_454366.out
@@ -0,0 +1,3 @@
+UNKNOWN_TYPE | hist_state |  |  | hist_state_1-default
+UNKNOWN_TYPE | sbdp | + Add names, circles, or email addresses |  | hist_state_1-default
+UNKNOWN_TYPE |  |  |  | hist_state_1-default
diff --git a/components/autofill/content/renderer/form_autofill_util.cc b/components/autofill/content/renderer/form_autofill_util.cc
index 66e8c927..5c7e2c5 100644
--- a/components/autofill/content/renderer/form_autofill_util.cc
+++ b/components/autofill/content/renderer/form_autofill_util.cc
@@ -416,8 +416,18 @@
   CR_DEFINE_STATIC_LOCAL(WebString, kFieldSet, ("fieldset"));
   while (inferred_label.empty() && !node.isNull()) {
     if (HasTagName(node, kDiv)) {
-      looking_for_parent = false;
       inferred_label = FindChildText(node);
+      // Avoid sibling DIVs that contain autofillable fields.
+      if (!looking_for_parent && !inferred_label.empty()) {
+        CR_DEFINE_STATIC_LOCAL(WebString, kSelector,
+                               ("input, select, textarea"));
+        blink::WebExceptionCode ec = 0;
+        WebElement result_element = node.querySelector(kSelector, ec);
+        if (!result_element.isNull())
+          inferred_label.clear();
+      }
+
+      looking_for_parent = false;
     } else if (looking_for_parent &&
                (HasTagName(node, kTable) || HasTagName(node, kFieldSet))) {
       // If the element is in a table or fieldset, its label most likely is too.
@@ -429,10 +439,7 @@
       looking_for_parent = true;
     }
 
-    if (looking_for_parent)
-      node = node.parentNode();
-    else
-      node = node.previousSibling();
+    node = looking_for_parent ? node.parentNode() : node.previousSibling();
   }
 
   return inferred_label;