[text-spacing-trim] Support quotation marks

Quotation marks are one of the code point that are most
complicated, because of the Unicode unification unified Latin
curly quotes and CJK fullwidth quotes.

This patch detects if the font has:
* Whether fullwidth glyphs or not.
* Whether they're open/close glyphs or not.
and apply open/close types if both are true. Otherwise they
are narrow open/close.

They're commonly used in Chinese, and that Chinese fonts often
assign fullwidth glyphs, while most Japanese fonts prioritize
the Latin usage and thus assign Latin proportional glyphs.

In vertical flow, some Chinese fonts assign bracket glyphs,
so that it preserves semantics rather than glyph shapes.
Japanese glyphs are most diverged, there are too many
variations. Adobe's Japanese convention uses the OpenType
`fwid` feature to switch between Japanese and Latin glyphs,
and that the behavior of the vertical upright glyph without
the `fwid` is undefined. Other vendors take other approaches.

Bug: 1463891
Change-Id: Ie9dee55ff8f9fbd35e72288db7c3c37fc668b531
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/4938492
Reviewed-by: Lingqi Chi <lingqi@chromium.org>
Commit-Queue: Koji Ishii <kojii@chromium.org>
Cr-Commit-Position: refs/heads/main@{#1212282}
diff --git a/css/css-text/text-spacing-trim/support/variant-class.js b/css/css-text/text-spacing-trim/support/variant-class.js
index d1ca547..28cf85f 100644
--- a/css/css-text/text-spacing-trim/support/variant-class.js
+++ b/css/css-text/text-spacing-trim/support/variant-class.js
@@ -10,4 +10,8 @@
                          .flatMap(value => value.split(','));
     document.documentElement.classList.add(...values);
   }
+  const lang = params.get('lang');
+  if (lang) {
+    document.documentElement.lang = lang;
+  }
 }
diff --git a/css/css-text/text-spacing-trim/text-spacing-trim-quote-001-ref.html b/css/css-text/text-spacing-trim/text-spacing-trim-quote-001-ref.html
new file mode 100644
index 0000000..47f953c
--- /dev/null
+++ b/css/css-text/text-spacing-trim/text-spacing-trim-quote-001-ref.html
@@ -0,0 +1,38 @@
+<!DOCTYPE html>
+<meta charset="utf-8">
+<script src="support/variant-class.js"></script>
+<style>
+@font-face {
+  font-family: halt-font;
+  src: url('/fonts/noto/cjk/NotoSansCJKjp-Regular-subset-halt.otf');
+}
+#container {
+  font-family: halt-font;
+  font-size: 20px;
+  text-spacing-trim: space-all;
+}
+.vrl {
+  writing-mode: vertical-rl;
+  text-orientation: upright;
+}
+halt {
+  font-feature-settings: 'halt' 1, 'vhal' 1;
+}
+if-zh { display: none; }
+:root:lang(zh-hans), :root:lang(zh-hant) {
+  if-ja { display: none; }
+  if-zh { display: block; }
+}
+</style>
+<div id="container">
+  <div>国)<halt>‘(</halt>国</div>
+  <div>国)<halt>“(</halt>国</div>
+  <if-ja>
+    <div>国<halt>)</halt>’(国</div>
+    <div>国<halt>)</halt>”(国</div>
+  </if-ja>
+  <if-zh>
+    <div>国<halt>)</halt>’<halt>(</halt>国</div>
+    <div>国<halt>)</halt>”<halt>(</halt>国</div>
+  </if-zh>
+</div>
diff --git a/css/css-text/text-spacing-trim/text-spacing-trim-quote-001.html b/css/css-text/text-spacing-trim/text-spacing-trim-quote-001.html
new file mode 100644
index 0000000..a8bc462
--- /dev/null
+++ b/css/css-text/text-spacing-trim/text-spacing-trim-quote-001.html
@@ -0,0 +1,41 @@
+<!DOCTYPE html>
+<meta charset="utf-8">
+<link rel="help" href="https://drafts.csswg.org/css-text-4/#text-spacing-trim-property">
+<link rel="match" href="text-spacing-trim-quote-001-ref.html">
+<meta name="variant" content="?class=halt,htb&lang=ja">
+<meta name="variant" content="?class=halt,htb&lang=zh-hans">
+<meta name="variant" content="?class=halt,htb&lang=zh-hant">
+<meta name="variant" content="?class=halt,vrl&lang=zh-hans">
+<meta name="variant" content="?class=halt,vrl&lang=zh-hant">
+<meta name="variant" content="?class=chws,htb&lang=zh-hans">
+<meta name="variant" content="?class=chws,htb&lang=zh-hant">
+<meta name="variant" content="?class=chws,vrl&lang=zh-hans">
+<meta name="variant" content="?class=chws,vrl&lang=zh-hant">
+<script src="support/variant-class.js"></script>
+<style>
+@font-face {
+  font-family: halt-font;
+  src: url('/fonts/noto/cjk/NotoSansCJKjp-Regular-subset-halt.otf');
+}
+@font-face {
+  font-family: chws-font;
+  src: url('/fonts/noto/cjk/NotoSansCJKjp-Regular-subset-chws.otf');
+}
+#container {
+  font-family: halt-font;
+  font-size: 20px;
+}
+.chws #container {
+  font-family: chws-font;
+}
+.vrl {
+  writing-mode: vertical-rl;
+  text-orientation: upright;
+}
+</style>
+<div id="container">
+  <div>国)‘(国</div>
+  <div>国)“(国</div>
+  <div>国)’(国</div>
+  <div>国)”(国</div>
+</div>