WebKit export of https://bugs.webkit.org/show_bug.cgi?id=223113
diff --git a/css/selectors/focus-visible-001.html b/css/selectors/focus-visible-001.html
index d580b07..a087eda 100644
--- a/css/selectors/focus-visible-001.html
+++ b/css/selectors/focus-visible-001.html
@@ -39,10 +39,14 @@
   <div id="el" tabindex="0">Focus me.</div>
   <script>
     async_test(function(t) {
-      el.addEventListener("focus", t.step_func(function() {
+      el.addEventListener("focus", t.step_func_done(function() {
         assert_equals(getComputedStyle(el).outlineColor, "rgb(0, 128, 0)", `outlineColor for ${el.tagName}#${el.id} should be green`);
         assert_not_equals(getComputedStyle(el).backgroundColor, "rgb(255, 0, 0)", `backgroundColor for ${el.tagName}#${el.id} should NOT be red`);
-        t.done();
+
+        let focusVisiblePseudoAll = document.querySelectorAll(':focus-visible');
+        assert_equals(focusVisiblePseudoAll.length, 1, "Only 1 element matches ':focus-visible'");
+        let focusVisiblePseudo = document.querySelector(':focus-visible');
+        assert_equals(el, focusVisiblePseudo, "${el.tagName}#${el.id} matches ':focus-visible'");
       }));
       const tab_key = '\ue004';
       test_driver.send_keys(el, tab_key)
diff --git a/css/selectors/focus-visible-019.html b/css/selectors/focus-visible-019.html
new file mode 100644
index 0000000..05163cc
--- /dev/null
+++ b/css/selectors/focus-visible-019.html
@@ -0,0 +1,64 @@
+<!DOCTYPE html>
+<meta charset="utf-8" />
+<title>CSS Test (Selectors): Script focus on keyboard event handler matches :focus-visible</title>
+<link rel="author" title="Manuel Rego Casasnovas" href="mailto:rego@igalia.com">
+<link rel="help" href="https://drafts.csswg.org/selectors-4/#the-focus-visible-pseudo" />
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="/resources/testdriver.js"></script>
+<script src="/resources/testdriver-actions.js"></script>
+<script src="/resources/testdriver-vendor.js"></script>
+<script src="/css/support/parsing-testcommon.js"></script>
+<style>
+  #warning {
+    display: none;
+    background: red;
+  }
+
+  @supports not (selector(:focus-visible)) {
+    #instructions {
+      display: none;
+    }
+
+    #warning {
+      display: block;
+    }
+  }
+
+  :focus-visible {
+    outline: green solid 5px;
+  }
+
+  :focus:not(:focus-visible) {
+    outline: 0;
+    background-color: red;
+  }
+</style>
+
+<p>This test checks that changing focus via script on keyboard event handler matches <code>:focus-visible</code>.</p>
+<ol id="instructions">
+  <li>Type any letter with the keyboard without having done anything before.</li>
+  <li>If the element that says "Focused" has a red background, then the test result is FAILURE. If the element has a green outline, then the test result is SUCCESS.</li>
+</ol>
+<p id="warning">Your user-agent does not support <code>:focus-visible</code> pseudo-class, please SKIP this test.</p>
+<div id="target" tabindex="0">Focused.</div>
+<script>
+  // Check that :focus-visible is supported.
+  test_valid_selector(':focus-visible');
+
+  document.addEventListener("keydown", () => {
+    target.focus();
+  });
+
+  async_test(function(t) {
+    test_driver.send_keys(document.body, "a").then(t.step_func_done(function() {
+      assert_equals(getComputedStyle(target).outlineColor, "rgb(0, 128, 0)", `outlineColor for ${target.tagName}#${target.id} should be green`);
+      assert_not_equals(getComputedStyle(target).backgroundColor, "rgb(255, 0, 0)", `backgroundColor for ${target.tagName}#${target.id} should NOT be red`);
+
+      let focusVisiblePseudoAll = document.querySelectorAll(':focus-visible');
+      assert_equals(focusVisiblePseudoAll.length, 1, "Only 1 element matches ':focus-visible'");
+      let focusVisiblePseudo = document.querySelector(':focus-visible');
+      assert_equals(target, focusVisiblePseudo, "${target.tagName}#${target.id} matches ':focus-visible'");
+    }));
+  }, "Focus via script on keyboard event handler matches ':focus-visible'");
+</script>