[text-spacing-trim] Stop assuming offset 0 is safe-to-break

This patch stops `ShapeResult` to assume the offset 0 is
always safe-to-break.

It was an micro-optimization in the legacy engine, where the
first glyph of an output from HarfBuzz is safe-to-break.

NG shapes across elements and splits a `ShapeResult` into
multiple `ShapeResult`s. In that case, the first glyph of a
`ShapeResult` may not be safe-to-break.

Two relevant fixes:
* Fix `HanKerning` didn't add a synthesized unsafe-t-break for
  the first glyph because it wasn't used.
* Fix how `AddUnsafeToBreak` computes run-local offset when
  the start index isn't 0.

Fixed: 326903564
Change-Id: I66578f6a270a771c3cd974442e1c332a64d9a910
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/5334684
Auto-Submit: Koji Ishii <kojii@chromium.org>
Reviewed-by: Kent Tamura <tkent@chromium.org>
Commit-Queue: Kent Tamura <tkent@chromium.org>
Cr-Commit-Position: refs/heads/main@{#1267637}
diff --git a/css/css-text/text-spacing-trim/text-spacing-trim-span-001-ref.html b/css/css-text/text-spacing-trim/text-spacing-trim-span-001-ref.html
new file mode 100644
index 0000000..072fd1e
--- /dev/null
+++ b/css/css-text/text-spacing-trim/text-spacing-trim-span-001-ref.html
@@ -0,0 +1,31 @@
+<!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;
+  inline-size: 4em;
+  text-spacing-trim: space-all;
+}
+.vrl {
+  writing-mode: vertical-rl;
+}
+halt {
+  font-feature-settings: 'halt' 1, 'vhal' 1;
+}
+.trim-start {
+  ps, ls { font-feature-settings: 'halt' 1, 'vhal' 1; }
+}
+.space-first {
+  ls { font-feature-settings: 'halt' 1, 'vhal' 1; }
+}
+</style>
+<div id="container">
+  <div>国)<halt>(国</halt></div>
+  <div>国国国)<ls>(国</ls></div>
+</div>
diff --git a/css/css-text/text-spacing-trim/text-spacing-trim-span-001.html b/css/css-text/text-spacing-trim/text-spacing-trim-span-001.html
new file mode 100644
index 0000000..623abbf
--- /dev/null
+++ b/css/css-text/text-spacing-trim/text-spacing-trim-span-001.html
@@ -0,0 +1,48 @@
+<!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-span-001-ref.html">
+<meta name="variant" content="?class=halt,htb">
+<meta name="variant" content="?class=chws,htb">
+<meta name="variant" content="?class=halt,vrl">
+<meta name="variant" content="?class=chws,vrl">
+<meta name="variant" content="?class=space-first,halt,htb">
+<meta name="variant" content="?class=space-first,chws,htb">
+<meta name="variant" content="?class=space-first,halt,vrl">
+<meta name="variant" content="?class=space-first,chws,vrl">
+<meta name="variant" content="?class=trim-start,halt,htb">
+<meta name="variant" content="?class=trim-start,chws,htb">
+<meta name="variant" content="?class=trim-start,halt,vrl">
+<meta name="variant" content="?class=trim-start,chws,vrl">
+<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;
+  inline-size: 4em;
+}
+.chws #container {
+  font-family: chws-font;
+}
+.vrl {
+  writing-mode: vertical-rl;
+}
+.trim-start {
+  text-spacing-trim: trim-start;
+}
+.space-first {
+  text-spacing-trim: space-first;
+}
+</style>
+<div id="container">
+  <div>国)<span>(国</span></div>
+  <div>国国国)<span>(国</span></div>
+</div>