summaryrefslogtreecommitdiffstats
path: root/testing/web-platform/tests/css/css-text/i18n/zh
diff options
context:
space:
mode:
authorDaniel Baumann <daniel.baumann@progress-linux.org>2024-04-07 09:22:09 +0000
committerDaniel Baumann <daniel.baumann@progress-linux.org>2024-04-07 09:22:09 +0000
commit43a97878ce14b72f0981164f87f2e35e14151312 (patch)
tree620249daf56c0258faa40cbdcf9cfba06de2a846 /testing/web-platform/tests/css/css-text/i18n/zh
parentInitial commit. (diff)
downloadfirefox-43a97878ce14b72f0981164f87f2e35e14151312.tar.xz
firefox-43a97878ce14b72f0981164f87f2e35e14151312.zip
Adding upstream version 110.0.1.upstream/110.0.1upstream
Signed-off-by: Daniel Baumann <daniel.baumann@progress-linux.org>
Diffstat (limited to 'testing/web-platform/tests/css/css-text/i18n/zh')
-rw-r--r--testing/web-platform/tests/css/css-text/i18n/zh/css-text-line-break-zh-cj-loose.html117
-rw-r--r--testing/web-platform/tests/css/css-text/i18n/zh/css-text-line-break-zh-cj-normal.html117
-rw-r--r--testing/web-platform/tests/css/css-text/i18n/zh/css-text-line-break-zh-cj-strict.html117
-rw-r--r--testing/web-platform/tests/css/css-text/i18n/zh/css-text-line-break-zh-cpm-loose.html76
-rw-r--r--testing/web-platform/tests/css/css-text/i18n/zh/css-text-line-break-zh-cpm-normal.html76
-rw-r--r--testing/web-platform/tests/css/css-text/i18n/zh/css-text-line-break-zh-cpm-strict.html76
-rw-r--r--testing/web-platform/tests/css/css-text/i18n/zh/css-text-line-break-zh-hyphens-loose.html68
-rw-r--r--testing/web-platform/tests/css/css-text/i18n/zh/css-text-line-break-zh-hyphens-normal.html68
-rw-r--r--testing/web-platform/tests/css/css-text/i18n/zh/css-text-line-break-zh-hyphens-strict.html68
-rw-r--r--testing/web-platform/tests/css/css-text/i18n/zh/css-text-line-break-zh-in-loose.html71
-rw-r--r--testing/web-platform/tests/css/css-text/i18n/zh/css-text-line-break-zh-in-normal.html71
-rw-r--r--testing/web-platform/tests/css/css-text/i18n/zh/css-text-line-break-zh-in-strict.html71
-rw-r--r--testing/web-platform/tests/css/css-text/i18n/zh/css-text-line-break-zh-iteration-loose.html72
-rw-r--r--testing/web-platform/tests/css/css-text/i18n/zh/css-text-line-break-zh-iteration-normal.html72
-rw-r--r--testing/web-platform/tests/css/css-text/i18n/zh/css-text-line-break-zh-iteration-strict.html72
-rw-r--r--testing/web-platform/tests/css/css-text/i18n/zh/css-text-line-break-zh-po-loose.html76
-rw-r--r--testing/web-platform/tests/css/css-text/i18n/zh/css-text-line-break-zh-po-normal.html76
-rw-r--r--testing/web-platform/tests/css/css-text/i18n/zh/css-text-line-break-zh-po-strict.html76
-rw-r--r--testing/web-platform/tests/css/css-text/i18n/zh/css-text-line-break-zh-pr-loose.html74
-rw-r--r--testing/web-platform/tests/css/css-text/i18n/zh/css-text-line-break-zh-pr-normal.html74
-rw-r--r--testing/web-platform/tests/css/css-text/i18n/zh/css-text-line-break-zh-pr-strict.html74
21 files changed, 1662 insertions, 0 deletions
diff --git a/testing/web-platform/tests/css/css-text/i18n/zh/css-text-line-break-zh-cj-loose.html b/testing/web-platform/tests/css/css-text/i18n/zh/css-text-line-break-zh-cj-loose.html
new file mode 100644
index 0000000000..2b65c2d838
--- /dev/null
+++ b/testing/web-platform/tests/css/css-text/i18n/zh/css-text-line-break-zh-cj-loose.html
@@ -0,0 +1,117 @@
+<!DOCTYPE html>
+<html lang="en" >
+<head>
+<meta charset="utf-8"/>
+<title>Line-break:loose, Conditional Japanese Starter (CJ) (zh)</title>
+<link rel="author" title="Richard Ishida" href="mailto:ishida@w3.org">
+<link rel="help" href="https://drafts.csswg.org/css-text-3/#line-break-property">
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<meta name="assert" content="The browser allows a conditional Japanese starter at the beginning of a line; the langauge being chinese makes no difference.">
+<style type="text/css">
+@font-face {
+ font-family: 'mplus-1p-regular';
+ src: url('/fonts/mplus-1p-regular.woff') format('woff');
+ }
+#wrapper { position: relative; }
+.test { color: red; }
+.test, .ref { font-size: 30px; font-family: mplus-1p-regular, sans-serif; width: 185px; padding: 0; border: 1px solid orange; line-height: 1em; }
+</style>
+<style>
+.test { line-break: loose; }
+</style>
+<script>
+var charlist = `3041 HIRAGANA LETTER SMALL A
+3043 HIRAGANA LETTER SMALL I
+3045 HIRAGANA LETTER SMALL U
+3047 HIRAGANA LETTER SMALL E
+3049 HIRAGANA LETTER SMALL O
+3063 HIRAGANA LETTER SMALL TU
+3083 HIRAGANA LETTER SMALL YA
+3085 HIRAGANA LETTER SMALL YU
+3087 HIRAGANA LETTER SMALL YO
+308E HIRAGANA LETTER SMALL WA
+3095 HIRAGANA LETTER SMALL KA
+3096 HIRAGANA LETTER SMALL KE
+30A1 KATAKANA LETTER SMALL A
+30A3 KATAKANA LETTER SMALL I
+30A5 KATAKANA LETTER SMALL U
+30A7 KATAKANA LETTER SMALL E
+30A9 KATAKANA LETTER SMALL O
+30C3 KATAKANA LETTER SMALL TU
+30E3 KATAKANA LETTER SMALL YA
+30E5 KATAKANA LETTER SMALL YU
+30E7 KATAKANA LETTER SMALL YO
+30EE KATAKANA LETTER SMALL WA
+30F5 KATAKANA LETTER SMALL KA
+30F6 KATAKANA LETTER SMALL KE
+30FC KATAKANA-HIRAGANA PROLONGED SOUND MARK
+31F0 KATAKANA LETTER SMALL KU
+31F1 KATAKANA LETTER SMALL SI
+31F2 KATAKANA LETTER SMALL SU
+31F3 KATAKANA LETTER SMALL TO
+31F4 KATAKANA LETTER SMALL NU
+31F5 KATAKANA LETTER SMALL HA
+31F6 KATAKANA LETTER SMALL HI
+31F7 KATAKANA LETTER SMALL HU
+31F8 KATAKANA LETTER SMALL HE
+31F9 KATAKANA LETTER SMALL HO
+31FA KATAKANA LETTER SMALL MU
+31FB KATAKANA LETTER SMALL RA
+31FC KATAKANA LETTER SMALL RI
+31FD KATAKANA LETTER SMALL RU
+31FE KATAKANA LETTER SMALL RE
+31FF KATAKANA LETTER SMALL RO
+FF67 HALFWIDTH KATAKANA LETTER SMALL A
+FF68 HALFWIDTH KATAKANA LETTER SMALL I
+FF69 HALFWIDTH KATAKANA LETTER SMALL U
+FF6A HALFWIDTH KATAKANA LETTER SMALL E
+FF6B HALFWIDTH KATAKANA LETTER SMALL O
+FF6C HALFWIDTH KATAKANA LETTER SMALL YA
+FF6D HALFWIDTH KATAKANA LETTER SMALL YU
+FF6E HALFWIDTH KATAKANA LETTER SMALL YO
+FF6F HALFWIDTH KATAKANA LETTER SMALL TU
+FF70 HALFWIDTH KATAKANA-HIRAGANA PROLONGED SOUND MARK`
+</script>
+</head>
+<body>
+<script>
+var lines = charlist.split('\n')
+var out = '<div id="log"></div>\n'
+for (var i=0;i<lines.length;i++) {
+ // get the data
+ var firstSpace = lines[i].indexOf(' ')
+ var hex = lines[i].substr(0,firstSpace)
+ var name = lines[i].substr(firstSpace)
+ // make a test
+ out += '<div class="wrapper"><div>'+hex+'</div>' +
+ '<div class="test" id="test'+i+'" lang="zh">文文文文文文&#x'+hex+';字<span id="testSpan'+i+'">字</span></div>' +
+ '<div class="ref" id="ref'+i+'" lang="zh">文文文文文文<br/>&#x'+hex+';字<span id="refSpan'+i+'">字</span></div>' +
+ '</div>'
+ }
+
+document.querySelector('body').innerHTML = out
+setup({explicit_done: true});
+
+document.fonts.ready.then(validate);
+
+function validate() {
+ for (i=0;i<lines.length;i++) {
+ test(function() {
+ assert_approx_equals(
+ document.getElementById('testSpan'+i).getBoundingClientRect().left,
+ document.getElementById('refSpan'+i).getBoundingClientRect().left, 1);
+ // Hide successful tests.
+ document.getElementById('test'+i).parentNode.style.display = 'none';
+ }, lines[i]+' may appear at line start if zh and loose');
+ }
+ done();
+}
+</script>
+<!--Notes:
+The test creates a box with room for 6 characters, causing wrapping to occur either between the 6th and the 7th character, or before the 6th if the breaks after the 6th or before the 7th are prohibited.
+
+It also creates the expected behaviour with a ref instance, using <br/>. Each line ends with a span. The test then checks whether the left edge of the span is in the same place in test and ref instance.
+-->
+</body>
+</html>
diff --git a/testing/web-platform/tests/css/css-text/i18n/zh/css-text-line-break-zh-cj-normal.html b/testing/web-platform/tests/css/css-text/i18n/zh/css-text-line-break-zh-cj-normal.html
new file mode 100644
index 0000000000..adda199da3
--- /dev/null
+++ b/testing/web-platform/tests/css/css-text/i18n/zh/css-text-line-break-zh-cj-normal.html
@@ -0,0 +1,117 @@
+<!DOCTYPE html>
+<html lang="en" >
+<head>
+<meta charset="utf-8"/>
+<title>Line-break:normal, Conditional Japanese Starter (CJ) (zh)</title>
+<link rel="author" title="Richard Ishida" href="mailto:ishida@w3.org">
+<link rel="help" href="https://drafts.csswg.org/css-text-3/#line-break-property">
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<meta name="assert" content="The browser allows a conditional Japanese starter at the beginning of a line; the langauge being chinese makes no difference.">
+<style type="text/css">
+@font-face {
+ font-family: 'mplus-1p-regular';
+ src: url('/fonts/mplus-1p-regular.woff') format('woff');
+ }
+#wrapper { position: relative; }
+.test { color: red; }
+.test, .ref { font-size: 30px; font-family: mplus-1p-regular, sans-serif; width: 185px; padding: 0; border: 1px solid orange; line-height: 1em; }
+</style>
+<style>
+.test { line-break: normal; }
+</style>
+<script>
+var charlist = `3041 HIRAGANA LETTER SMALL A
+3043 HIRAGANA LETTER SMALL I
+3045 HIRAGANA LETTER SMALL U
+3047 HIRAGANA LETTER SMALL E
+3049 HIRAGANA LETTER SMALL O
+3063 HIRAGANA LETTER SMALL TU
+3083 HIRAGANA LETTER SMALL YA
+3085 HIRAGANA LETTER SMALL YU
+3087 HIRAGANA LETTER SMALL YO
+308E HIRAGANA LETTER SMALL WA
+3095 HIRAGANA LETTER SMALL KA
+3096 HIRAGANA LETTER SMALL KE
+30A1 KATAKANA LETTER SMALL A
+30A3 KATAKANA LETTER SMALL I
+30A5 KATAKANA LETTER SMALL U
+30A7 KATAKANA LETTER SMALL E
+30A9 KATAKANA LETTER SMALL O
+30C3 KATAKANA LETTER SMALL TU
+30E3 KATAKANA LETTER SMALL YA
+30E5 KATAKANA LETTER SMALL YU
+30E7 KATAKANA LETTER SMALL YO
+30EE KATAKANA LETTER SMALL WA
+30F5 KATAKANA LETTER SMALL KA
+30F6 KATAKANA LETTER SMALL KE
+30FC KATAKANA-HIRAGANA PROLONGED SOUND MARK
+31F0 KATAKANA LETTER SMALL KU
+31F1 KATAKANA LETTER SMALL SI
+31F2 KATAKANA LETTER SMALL SU
+31F3 KATAKANA LETTER SMALL TO
+31F4 KATAKANA LETTER SMALL NU
+31F5 KATAKANA LETTER SMALL HA
+31F6 KATAKANA LETTER SMALL HI
+31F7 KATAKANA LETTER SMALL HU
+31F8 KATAKANA LETTER SMALL HE
+31F9 KATAKANA LETTER SMALL HO
+31FA KATAKANA LETTER SMALL MU
+31FB KATAKANA LETTER SMALL RA
+31FC KATAKANA LETTER SMALL RI
+31FD KATAKANA LETTER SMALL RU
+31FE KATAKANA LETTER SMALL RE
+31FF KATAKANA LETTER SMALL RO
+FF67 HALFWIDTH KATAKANA LETTER SMALL A
+FF68 HALFWIDTH KATAKANA LETTER SMALL I
+FF69 HALFWIDTH KATAKANA LETTER SMALL U
+FF6A HALFWIDTH KATAKANA LETTER SMALL E
+FF6B HALFWIDTH KATAKANA LETTER SMALL O
+FF6C HALFWIDTH KATAKANA LETTER SMALL YA
+FF6D HALFWIDTH KATAKANA LETTER SMALL YU
+FF6E HALFWIDTH KATAKANA LETTER SMALL YO
+FF6F HALFWIDTH KATAKANA LETTER SMALL TU
+FF70 HALFWIDTH KATAKANA-HIRAGANA PROLONGED SOUND MARK`
+</script>
+</head>
+<body>
+<script>
+var lines = charlist.split('\n')
+var out = '<div id="log"></div>\n'
+for (var i=0;i<lines.length;i++) {
+ // get the data
+ var firstSpace = lines[i].indexOf(' ')
+ var hex = lines[i].substr(0,firstSpace)
+ var name = lines[i].substr(firstSpace)
+ // make a test
+ out += '<div class="wrapper"><div>'+hex+'</div>' +
+ '<div class="test" id="test'+i+'" lang="zh">文文文文文文&#x'+hex+';字<span id="testSpan'+i+'">字</span></div>' +
+ '<div class="ref" id="ref'+i+'" lang="zh">文文文文文文<br/>&#x'+hex+';字<span id="refSpan'+i+'">字</span></div>' +
+ '</div>'
+ }
+
+document.querySelector('body').innerHTML = out
+setup({explicit_done: true});
+
+document.fonts.ready.then(validate);
+
+function validate() {
+ for (i=0;i<lines.length;i++) {
+ test(function() {
+ assert_approx_equals(
+ document.getElementById('testSpan'+i).getBoundingClientRect().left,
+ document.getElementById('refSpan'+i).getBoundingClientRect().left, 1);
+ // Hide successful tests.
+ document.getElementById('test'+i).parentNode.style.display = 'none';
+ }, lines[i]+' may appear at line start if zh and normal');
+ }
+ done();
+}
+</script>
+<!--Notes:
+The test creates a box with room for 6 characters, causing wrapping to occur either between the 6th and the 7th character, or before the 6th if the breaks after the 6th or before the 7th are prohibited.
+
+It also creates the expected behaviour with a ref instance, using <br/>. Each line ends with a span. The test then checks whether the left edge of the span is in the same place in test and ref instance.
+-->
+</body>
+</html>
diff --git a/testing/web-platform/tests/css/css-text/i18n/zh/css-text-line-break-zh-cj-strict.html b/testing/web-platform/tests/css/css-text/i18n/zh/css-text-line-break-zh-cj-strict.html
new file mode 100644
index 0000000000..bbae688d47
--- /dev/null
+++ b/testing/web-platform/tests/css/css-text/i18n/zh/css-text-line-break-zh-cj-strict.html
@@ -0,0 +1,117 @@
+<!DOCTYPE html>
+<html lang="en" >
+<head>
+<meta charset="utf-8"/>
+<title>line-break:strict, Conditional Japanese Starter (CJ) (zh)</title>
+<link rel="author" title="Richard Ishida" href="mailto:ishida@w3.org">
+<link rel="help" href="https://drafts.csswg.org/css-text-3/#line-break-property">
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<meta name="assert" content="With line-break:strict, a browser will NOT allow a conditional Japanese starter at the beginning of a line; the langauge being chinese makes no difference.">
+<style type="text/css">
+@font-face {
+ font-family: 'mplus-1p-regular';
+ src: url('/fonts/mplus-1p-regular.woff') format('woff');
+ }
+#wrapper { position: relative; }
+.test { color: red; }
+.test, .ref { font-size: 30px; font-family: mplus-1p-regular, sans-serif; width: 185px; padding: 0; border: 1px solid orange; line-height: 1em; }
+</style>
+<style>
+.test { line-break: strict; }
+</style>
+<script>
+var charlist = `3041 HIRAGANA LETTER SMALL A
+3043 HIRAGANA LETTER SMALL I
+3045 HIRAGANA LETTER SMALL U
+3047 HIRAGANA LETTER SMALL E
+3049 HIRAGANA LETTER SMALL O
+3063 HIRAGANA LETTER SMALL TU
+3083 HIRAGANA LETTER SMALL YA
+3085 HIRAGANA LETTER SMALL YU
+3087 HIRAGANA LETTER SMALL YO
+308E HIRAGANA LETTER SMALL WA
+3095 HIRAGANA LETTER SMALL KA
+3096 HIRAGANA LETTER SMALL KE
+30A1 KATAKANA LETTER SMALL A
+30A3 KATAKANA LETTER SMALL I
+30A5 KATAKANA LETTER SMALL U
+30A7 KATAKANA LETTER SMALL E
+30A9 KATAKANA LETTER SMALL O
+30C3 KATAKANA LETTER SMALL TU
+30E3 KATAKANA LETTER SMALL YA
+30E5 KATAKANA LETTER SMALL YU
+30E7 KATAKANA LETTER SMALL YO
+30EE KATAKANA LETTER SMALL WA
+30F5 KATAKANA LETTER SMALL KA
+30F6 KATAKANA LETTER SMALL KE
+30FC KATAKANA-HIRAGANA PROLONGED SOUND MARK
+31F0 KATAKANA LETTER SMALL KU
+31F1 KATAKANA LETTER SMALL SI
+31F2 KATAKANA LETTER SMALL SU
+31F3 KATAKANA LETTER SMALL TO
+31F4 KATAKANA LETTER SMALL NU
+31F5 KATAKANA LETTER SMALL HA
+31F6 KATAKANA LETTER SMALL HI
+31F7 KATAKANA LETTER SMALL HU
+31F8 KATAKANA LETTER SMALL HE
+31F9 KATAKANA LETTER SMALL HO
+31FA KATAKANA LETTER SMALL MU
+31FB KATAKANA LETTER SMALL RA
+31FC KATAKANA LETTER SMALL RI
+31FD KATAKANA LETTER SMALL RU
+31FE KATAKANA LETTER SMALL RE
+31FF KATAKANA LETTER SMALL RO
+FF67 HALFWIDTH KATAKANA LETTER SMALL A
+FF68 HALFWIDTH KATAKANA LETTER SMALL I
+FF69 HALFWIDTH KATAKANA LETTER SMALL U
+FF6A HALFWIDTH KATAKANA LETTER SMALL E
+FF6B HALFWIDTH KATAKANA LETTER SMALL O
+FF6C HALFWIDTH KATAKANA LETTER SMALL YA
+FF6D HALFWIDTH KATAKANA LETTER SMALL YU
+FF6E HALFWIDTH KATAKANA LETTER SMALL YO
+FF6F HALFWIDTH KATAKANA LETTER SMALL TU
+FF70 HALFWIDTH KATAKANA-HIRAGANA PROLONGED SOUND MARK`
+</script>
+</head>
+<body>
+<script>
+var lines = charlist.split('\n')
+var out = '<div id="log"></div>\n'
+for (var i=0;i<lines.length;i++) {
+ // get the data
+ var firstSpace = lines[i].indexOf(' ')
+ var hex = lines[i].substr(0,firstSpace)
+ var name = lines[i].substr(firstSpace)
+ // make a test
+ out += '<div class="wrapper"><div>'+hex+'</div>' +
+ '<div class="test" id="test'+i+'" lang="zh">文文文文文文&#x'+hex+';字<span id="testSpan'+i+'">字</span></div>' +
+ '<div class="ref" id="ref'+i+'" lang="zh">文文文文文<br/>文&#x'+hex+';字<span id="refSpan'+i+'">字</span></div>' +
+ '</div>'
+ }
+
+document.querySelector('body').innerHTML = out
+setup({explicit_done: true});
+
+document.fonts.ready.then(validate);
+
+function validate() {
+ for (i=0;i<lines.length;i++) {
+ test(function() {
+ assert_approx_equals(
+ document.getElementById('testSpan'+i).getBoundingClientRect().left,
+ document.getElementById('refSpan'+i).getBoundingClientRect().left, 1);
+ // Hide successful tests.
+ document.getElementById('test'+i).parentNode.style.display = 'none';
+ }, lines[i]+' may NOT appear at line start if zh and strict');
+ }
+ done();
+}
+</script>
+<!--Notes:
+The test creates a box with room for 6 characters, causing wrapping to occur either between the 6th and the 7th character, or before the 6th if the breaks after the 6th or before the 7th are prohibited.
+
+It also creates the expected behaviour with a ref instance, using <br/>. Each line ends with a span. The test then checks whether the left edge of the span is in the same place in test and ref instance.
+-->
+</body>
+</html>
diff --git a/testing/web-platform/tests/css/css-text/i18n/zh/css-text-line-break-zh-cpm-loose.html b/testing/web-platform/tests/css/css-text/i18n/zh/css-text-line-break-zh-cpm-loose.html
new file mode 100644
index 0000000000..38c207db0d
--- /dev/null
+++ b/testing/web-platform/tests/css/css-text/i18n/zh/css-text-line-break-zh-cpm-loose.html
@@ -0,0 +1,76 @@
+<!DOCTYPE html>
+<html lang="en" >
+<head>
+<meta charset="utf-8"/>
+<title>CSS text, linebreaks: centred punctuation (loose,zh)</title>
+<link rel="author" title="Richard Ishida" href="mailto:ishida@w3.org">
+<link rel="help" href="https://drafts.csswg.org/css-text-3/#line-break-property">
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<meta name="assert" content="When the language is Chinese, and line-break:loose, a browser allows a break before one of the centred punctuation characters listed.">
+<style type="text/css">
+@font-face {
+ font-family: 'mplus-1p-regular';
+ src: url('/fonts/mplus-1p-regular.woff') format('woff');
+ }
+#wrapper { position: relative; }
+.test { color: red; }
+.test, .ref { font-size: 30px; font-family: mplus-1p-regular, sans-serif; width: 185px; padding: 0; border: 1px solid orange; line-height: 1em; }
+</style>
+<style>
+.test { line-break: loose; }
+</style>
+<script>
+var charlist = `30FB KATAKANA MIDDLE DOT
+FF1A FULLWIDTH COLON
+FF1B FULLWIDTH SEMICOLON
+FF65 HALFWIDTH KATAKANA MIDDLE DOT
+203C DOUBLE EXCLAMATION MARK
+2047 DOUBLE QUESTION MARK
+2048 QUESTION EXCLAMATION MARK
+2049 EXCLAMATION QUESTION MARK
+FF01 FULLWIDTH EXCLAMATION MARK
+FF1F FULLWIDTH QUESTION MARK`
+</script>
+</head>
+<body>
+<script>
+var lines = charlist.split('\n')
+var out = '<div id="log"></div>\n'
+for (var i=0;i<lines.length;i++) {
+ // get the data
+ var firstSpace = lines[i].indexOf(' ')
+ var hex = lines[i].substr(0,firstSpace)
+ var name = lines[i].substr(firstSpace)
+ // make a test
+ out += '<div class="wrapper"><div>'+hex+'</div>' +
+ '<div class="test" id="test'+i+'" lang="zh">文文文文文文&#x'+hex+';字<span id="testSpan'+i+'">字</span></div>' +
+ '<div class="ref" id="ref'+i+'" lang="zh">文文文文文文<br/>&#x'+hex+';字<span id="refSpan'+i+'">字</span></div>' +
+ '</div>'
+ }
+
+document.querySelector('body').innerHTML = out
+setup({explicit_done: true});
+
+document.fonts.ready.then(validate);
+
+function validate() {
+ for (i=0;i<lines.length;i++) {
+ test(function() {
+ assert_approx_equals(
+ document.getElementById('testSpan'+i).getBoundingClientRect().left,
+ document.getElementById('refSpan'+i).getBoundingClientRect().left, 1);
+ // Hide successful tests.
+ document.getElementById('test'+i).parentNode.style.display = 'none';
+ }, lines[i]+' may appear at line start if zh and loose');
+ }
+ done();
+}
+</script>
+<!--Notes:
+The test creates a box with room for 6 characters, causing wrapping to occur either between the 6th and the 7th character, or before the 6th if the breaks after the 6th or before the 7th are prohibited.
+
+It also creates the expected behaviour with a ref instance, using <br/>. Each line ends with a span. The test then checks whether the left edge of the span is in the same place in test and ref instance.
+-->
+</body>
+</html>
diff --git a/testing/web-platform/tests/css/css-text/i18n/zh/css-text-line-break-zh-cpm-normal.html b/testing/web-platform/tests/css/css-text/i18n/zh/css-text-line-break-zh-cpm-normal.html
new file mode 100644
index 0000000000..edeb465b1e
--- /dev/null
+++ b/testing/web-platform/tests/css/css-text/i18n/zh/css-text-line-break-zh-cpm-normal.html
@@ -0,0 +1,76 @@
+<!DOCTYPE html>
+<html lang="en" >
+<head>
+<meta charset="utf-8"/>
+<title>CSS text, linebreaks: centred punctuation (normal,zh)</title>
+<link rel="author" title="Richard Ishida" href="mailto:ishida@w3.org">
+<link rel="help" href="https://drafts.csswg.org/css-text-3/#line-break-property">
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<meta name="assert" content="When the language is Chinese, and line-break:normal, a browser will NOT allow a break before one of the centred punctuation characters listed.">
+<style type="text/css">
+@font-face {
+ font-family: 'mplus-1p-regular';
+ src: url('/fonts/mplus-1p-regular.woff') format('woff');
+ }
+#wrapper { position: relative; }
+.test { color: red; }
+.test, .ref { font-size: 30px; font-family: mplus-1p-regular, sans-serif; width: 185px; padding: 0; border: 1px solid orange; line-height: 1em; }
+</style>
+<style>
+.test { line-break: normal; }
+</style>
+<script>
+var charlist = `30FB KATAKANA MIDDLE DOT
+FF1A FULLWIDTH COLON
+FF1B FULLWIDTH SEMICOLON
+FF65 HALFWIDTH KATAKANA MIDDLE DOT
+203C DOUBLE EXCLAMATION MARK
+2047 DOUBLE QUESTION MARK
+2048 QUESTION EXCLAMATION MARK
+2049 EXCLAMATION QUESTION MARK
+FF01 FULLWIDTH EXCLAMATION MARK
+FF1F FULLWIDTH QUESTION MARK`
+</script>
+</head>
+<body>
+<script>
+var lines = charlist.split('\n')
+var out = '<div id="log"></div>\n'
+for (var i=0;i<lines.length;i++) {
+ // get the data
+ var firstSpace = lines[i].indexOf(' ')
+ var hex = lines[i].substr(0,firstSpace)
+ var name = lines[i].substr(firstSpace)
+ // make a test
+ out += '<div class="wrapper"><div>'+hex+'</div>' +
+ '<div class="test" id="test'+i+'" lang="zh">文文文文文文&#x'+hex+';字<span id="testSpan'+i+'">字</span></div>' +
+ '<div class="ref" id="ref'+i+'" lang="zh">文文文文文<br/>文&#x'+hex+';字<span id="refSpan'+i+'">字</span></div>' +
+ '</div>'
+ }
+
+document.querySelector('body').innerHTML = out
+setup({explicit_done: true});
+
+document.fonts.ready.then(validate);
+
+function validate() {
+ for (i=0;i<lines.length;i++) {
+ test(function() {
+ assert_approx_equals(
+ document.getElementById('testSpan'+i).getBoundingClientRect().left,
+ document.getElementById('refSpan'+i).getBoundingClientRect().left, 1);
+ // Hide successful tests.
+ document.getElementById('test'+i).parentNode.style.display = 'none';
+ }, lines[i]+' may NOT appear at line start if zh and normal');
+ }
+ done();
+}
+</script>
+<!--Notes:
+The test creates a box with room for 6 characters, causing wrapping to occur either between the 6th and the 7th character, or before the 6th if the breaks after the 6th or before the 7th are prohibited.
+
+It also creates the expected behaviour with a ref instance, using <br/>. Each line ends with a span. The test then checks whether the left edge of the span is in the same place in test and ref instance.
+-->
+</body>
+</html>
diff --git a/testing/web-platform/tests/css/css-text/i18n/zh/css-text-line-break-zh-cpm-strict.html b/testing/web-platform/tests/css/css-text/i18n/zh/css-text-line-break-zh-cpm-strict.html
new file mode 100644
index 0000000000..235bd712d0
--- /dev/null
+++ b/testing/web-platform/tests/css/css-text/i18n/zh/css-text-line-break-zh-cpm-strict.html
@@ -0,0 +1,76 @@
+<!DOCTYPE html>
+<html lang="en" >
+<head>
+<meta charset="utf-8"/>
+<title>CSS text, linebreaks: centred punctuation (strict,zh)</title>
+<link rel="author" title="Richard Ishida" href="mailto:ishida@w3.org">
+<link rel="help" href="https://drafts.csswg.org/css-text-3/#line-break-property">
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<meta name="assert" content="When the language is Chinese, and line-break:strict, a browser will NOT allow a break before one of the centred punctuation characters listed.">
+<style type="text/css">
+@font-face {
+ font-family: 'mplus-1p-regular';
+ src: url('/fonts/mplus-1p-regular.woff') format('woff');
+ }
+#wrapper { position: relative; }
+.test { color: red; }
+.test, .ref { font-size: 30px; font-family: mplus-1p-regular, sans-serif; width: 185px; padding: 0; border: 1px solid orange; line-height: 1em; }
+</style>
+<style>
+.test { line-break: strict; }
+</style>
+<script>
+var charlist = `30FB KATAKANA MIDDLE DOT
+FF1A FULLWIDTH COLON
+FF1B FULLWIDTH SEMICOLON
+FF65 HALFWIDTH KATAKANA MIDDLE DOT
+203C DOUBLE EXCLAMATION MARK
+2047 DOUBLE QUESTION MARK
+2048 QUESTION EXCLAMATION MARK
+2049 EXCLAMATION QUESTION MARK
+FF01 FULLWIDTH EXCLAMATION MARK
+FF1F FULLWIDTH QUESTION MARK`
+</script>
+</head>
+<body>
+<script>
+var lines = charlist.split('\n')
+var out = '<div id="log"></div>\n'
+for (var i=0;i<lines.length;i++) {
+ // get the data
+ var firstSpace = lines[i].indexOf(' ')
+ var hex = lines[i].substr(0,firstSpace)
+ var name = lines[i].substr(firstSpace)
+ // make a test
+ out += '<div class="wrapper"><div>'+hex+'</div>' +
+ '<div class="test" id="test'+i+'" lang="zh">文文文文文文&#x'+hex+';字<span id="testSpan'+i+'">字</span></div>' +
+ '<div class="ref" id="ref'+i+'" lang="zh">文文文文文<br/>文&#x'+hex+';字<span id="refSpan'+i+'">字</span></div>' +
+ '</div>'
+ }
+
+document.querySelector('body').innerHTML = out
+setup({explicit_done: true});
+
+document.fonts.ready.then(validate);
+
+function validate() {
+ for (i=0;i<lines.length;i++) {
+ test(function() {
+ assert_approx_equals(
+ document.getElementById('testSpan'+i).getBoundingClientRect().left,
+ document.getElementById('refSpan'+i).getBoundingClientRect().left, 1);
+ // Hide successful tests.
+ document.getElementById('test'+i).parentNode.style.display = 'none';
+ }, lines[i]+' may NOT appear at line start if zh and strict');
+ }
+ done();
+}
+</script>
+<!--Notes:
+The test creates a box with room for 6 characters, causing wrapping to occur either between the 6th and the 7th character, or before the 6th if the breaks after the 6th or before the 7th are prohibited.
+
+It also creates the expected behaviour with a ref instance, using <br/>. Each line ends with a span. The test then checks whether the left edge of the span is in the same place in test and ref instance.
+-->
+</body>
+</html>
diff --git a/testing/web-platform/tests/css/css-text/i18n/zh/css-text-line-break-zh-hyphens-loose.html b/testing/web-platform/tests/css/css-text/i18n/zh/css-text-line-break-zh-hyphens-loose.html
new file mode 100644
index 0000000000..5d4ab12bc8
--- /dev/null
+++ b/testing/web-platform/tests/css/css-text/i18n/zh/css-text-line-break-zh-hyphens-loose.html
@@ -0,0 +1,68 @@
+<!DOCTYPE html>
+<html lang="en" >
+<head>
+<meta charset="utf-8"/>
+<title>CSS3 Text, linebreaks: hyphens (loose,zh)</title>
+<link rel="author" title="Richard Ishida" href="mailto:ishida@w3.org">
+<link rel="help" href="https://drafts.csswg.org/css-text-3/#line-break-property">
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<meta name="assert" content="When the language is Chinese, and line-break:loose, a browser allows a break before a hyphen-like CJK character.">
+<style type="text/css">
+@font-face {
+ font-family: 'mplus-1p-regular';
+ src: url('/fonts/mplus-1p-regular.woff') format('woff');
+ }
+#wrapper { position: relative; }
+.test { color: red; }
+.test, .ref { font-size: 30px; font-family: mplus-1p-regular, sans-serif; width: 185px; padding: 0; border: 1px solid orange; line-height: 1em; }
+</style>
+<style>
+.test { line-break: loose; }
+</style>
+<script>
+var charlist = `301C WAVE DASH
+30A0 KATAKANA-HIRAGANA DOUBLE HYPHEN`
+</script>
+</head>
+<body>
+<script>
+var lines = charlist.split('\n')
+var out = '<div id="log"></div>\n'
+for (var i=0;i<lines.length;i++) {
+ // get the data
+ var firstSpace = lines[i].indexOf(' ')
+ var hex = lines[i].substr(0,firstSpace)
+ var name = lines[i].substr(firstSpace)
+ // make a test
+ out += '<div class="wrapper"><div>'+hex+'</div>' +
+ '<div class="test" id="test'+i+'" lang="zh">文文文文文文&#x'+hex+';字<span id="testSpan'+i+'">字</span></div>' +
+ '<div class="ref" id="ref'+i+'" lang="zh">文文文文文文<br/>&#x'+hex+';字<span id="refSpan'+i+'">字</span></div>' +
+ '</div>'
+ }
+
+document.querySelector('body').innerHTML = out
+setup({explicit_done: true});
+
+document.fonts.ready.then(validate);
+
+function validate() {
+ for (i=0;i<lines.length;i++) {
+ test(function() {
+ assert_approx_equals(
+ document.getElementById('testSpan'+i).getBoundingClientRect().left,
+ document.getElementById('refSpan'+i).getBoundingClientRect().left, 1);
+ // Hide successful tests.
+ document.getElementById('test'+i).parentNode.style.display = 'none';
+ }, lines[i]+' may appear at line start if zh and loose');
+ }
+ done();
+}
+</script>
+<!--Notes:
+The test creates a box with room for 6 characters, causing wrapping to occur either between the 6th and the 7th character, or before the 6th if the breaks after the 6th or before the 7th are prohibited.
+
+It also creates the expected behaviour with a ref instance, using <br/>. Each line ends with a span. The test then checks whether the left edge of the span is in the same place in test and ref instance.
+-->
+</body>
+</html>
diff --git a/testing/web-platform/tests/css/css-text/i18n/zh/css-text-line-break-zh-hyphens-normal.html b/testing/web-platform/tests/css/css-text/i18n/zh/css-text-line-break-zh-hyphens-normal.html
new file mode 100644
index 0000000000..1a07353fce
--- /dev/null
+++ b/testing/web-platform/tests/css/css-text/i18n/zh/css-text-line-break-zh-hyphens-normal.html
@@ -0,0 +1,68 @@
+<!DOCTYPE html>
+<html lang="en" >
+<head>
+<meta charset="utf-8"/>
+<title>CSS3 Text, linebreaks: hyphens (normal,zh)</title>
+<link rel="author" title="Richard Ishida" href="mailto:ishida@w3.org">
+<link rel="help" href="https://drafts.csswg.org/css-text-3/#line-break-property">
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<meta name="assert" content="When the language is Chinese, and line-break:normal, a browser allows a break before a hyphen-like CJK character.">
+<style type="text/css">
+@font-face {
+ font-family: 'mplus-1p-regular';
+ src: url('/fonts/mplus-1p-regular.woff') format('woff');
+ }
+#wrapper { position: relative; }
+.test { color: red; }
+.test, .ref { font-size: 30px; font-family: mplus-1p-regular, sans-serif; width: 185px; padding: 0; border: 1px solid orange; line-height: 1em; }
+</style>
+<style>
+.test { line-break: normal; }
+</style>
+<script>
+var charlist = `301C WAVE DASH
+30A0 KATAKANA-HIRAGANA DOUBLE HYPHEN`
+</script>
+</head>
+<body>
+<script>
+var lines = charlist.split('\n')
+var out = '<div id="log"></div>\n'
+for (var i=0;i<lines.length;i++) {
+ // get the data
+ var firstSpace = lines[i].indexOf(' ')
+ var hex = lines[i].substr(0,firstSpace)
+ var name = lines[i].substr(firstSpace)
+ // make a test
+ out += '<div class="wrapper"><div>'+hex+'</div>' +
+ '<div class="test" id="test'+i+'" lang="zh">文文文文文文&#x'+hex+';字<span id="testSpan'+i+'">字</span></div>' +
+ '<div class="ref" id="ref'+i+'" lang="zh">文文文文文文<br/>&#x'+hex+';字<span id="refSpan'+i+'">字</span></div>' +
+ '</div>'
+ }
+
+document.querySelector('body').innerHTML = out
+setup({explicit_done: true});
+
+document.fonts.ready.then(validate);
+
+function validate() {
+ for (i=0;i<lines.length;i++) {
+ test(function() {
+ assert_approx_equals(
+ document.getElementById('testSpan'+i).getBoundingClientRect().left,
+ document.getElementById('refSpan'+i).getBoundingClientRect().left, 1);
+ // Hide successful tests.
+ document.getElementById('test'+i).parentNode.style.display = 'none';
+ }, lines[i]+' may appear at line start if zh and normal');
+ }
+ done();
+}
+</script>
+<!--Notes:
+The test creates a box with room for 6 characters, causing wrapping to occur either between the 6th and the 7th character, or before the 6th if the breaks after the 6th or before the 7th are prohibited.
+
+It also creates the expected behaviour with a ref instance, using <br/>. Each line ends with a span. The test then checks whether the left edge of the span is in the same place in test and ref instance.
+-->
+</body>
+</html>
diff --git a/testing/web-platform/tests/css/css-text/i18n/zh/css-text-line-break-zh-hyphens-strict.html b/testing/web-platform/tests/css/css-text/i18n/zh/css-text-line-break-zh-hyphens-strict.html
new file mode 100644
index 0000000000..8ac874e29c
--- /dev/null
+++ b/testing/web-platform/tests/css/css-text/i18n/zh/css-text-line-break-zh-hyphens-strict.html
@@ -0,0 +1,68 @@
+<!DOCTYPE html>
+<html lang="en" >
+<head>
+<meta charset="utf-8"/>
+<title>CSS3 Text, linebreaks: hyphens (strict,zh)</title>
+<link rel="author" title="Richard Ishida" href="mailto:ishida@w3.org">
+<link rel="help" href="https://drafts.csswg.org/css-text-3/#line-break-property">
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<meta name="assert" content="When the language is Chinese, and line-break:strict, a browser will NOT allow a break before a hyphen-like CJK character.">
+<style type="text/css">
+@font-face {
+ font-family: 'mplus-1p-regular';
+ src: url('/fonts/mplus-1p-regular.woff') format('woff');
+ }
+#wrapper { position: relative; }
+.test { color: red; }
+.test, .ref { font-size: 30px; font-family: mplus-1p-regular, sans-serif; width: 185px; padding: 0; border: 1px solid orange; line-height: 1em; }
+</style>
+<style>
+.test { line-break: strict; }
+</style>
+<script>
+var charlist = `301C WAVE DASH
+30A0 KATAKANA-HIRAGANA DOUBLE HYPHEN`
+</script>
+</head>
+<body>
+<script>
+var lines = charlist.split('\n')
+var out = '<div id="log"></div>\n'
+for (var i=0;i<lines.length;i++) {
+ // get the data
+ var firstSpace = lines[i].indexOf(' ')
+ var hex = lines[i].substr(0,firstSpace)
+ var name = lines[i].substr(firstSpace)
+ // make a test
+ out += '<div class="wrapper"><div>'+hex+'</div>' +
+ '<div class="test" id="test'+i+'" lang="zh">文文文文文文&#x'+hex+';字<span id="testSpan'+i+'">字</span></div>' +
+ '<div class="ref" id="ref'+i+'" lang="zh">文文文文文<br/>文&#x'+hex+';字<span id="refSpan'+i+'">字</span></div>' +
+ '</div>'
+ }
+
+document.querySelector('body').innerHTML = out
+setup({explicit_done: true});
+
+document.fonts.ready.then(validate);
+
+function validate() {
+ for (i=0;i<lines.length;i++) {
+ test(function() {
+ assert_approx_equals(
+ document.getElementById('testSpan'+i).getBoundingClientRect().left,
+ document.getElementById('refSpan'+i).getBoundingClientRect().left, 1);
+ // Hide successful tests.
+ document.getElementById('test'+i).parentNode.style.display = 'none';
+ }, lines[i]+' may NOT appear at line start if zh and strict');
+ }
+ done();
+}
+</script>
+<!--Notes:
+The test creates a box with room for 6 characters, causing wrapping to occur either between the 6th and the 7th character, or before the 6th if the breaks after the 6th or before the 7th are prohibited.
+
+It also creates the expected behaviour with a ref instance, using <br/>. Each line ends with a span. The test then checks whether the left edge of the span is in the same place in test and ref instance.
+-->
+</body>
+</html>
diff --git a/testing/web-platform/tests/css/css-text/i18n/zh/css-text-line-break-zh-in-loose.html b/testing/web-platform/tests/css/css-text/i18n/zh/css-text-line-break-zh-in-loose.html
new file mode 100644
index 0000000000..56fec0bd3e
--- /dev/null
+++ b/testing/web-platform/tests/css/css-text/i18n/zh/css-text-line-break-zh-in-loose.html
@@ -0,0 +1,71 @@
+<!DOCTYPE html>
+<html lang="en" >
+<head>
+<meta charset="utf-8"/>
+<title>CSS text, linebreaks: IN (loose,zh)</title>
+<link rel="author" title="Richard Ishida" href="mailto:ishida@w3.org">
+<link rel="help" href="https://drafts.csswg.org/css-text-3/#line-break-property">
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<meta name="assert" content="When the language is Chinese, and line-break:loose, a browser allows a break before an inseparable character.">
+<style type="text/css">
+@font-face {
+ font-family: 'mplus-1p-regular';
+ src: url('/fonts/mplus-1p-regular.woff') format('woff');
+ }
+#wrapper { position: relative; }
+.test { color: red; }
+.test, .ref { font-size: 30px; font-family: mplus-1p-regular, sans-serif; width: 185px; padding: 0; border: 1px solid orange; line-height: 1em; }
+</style>
+<style>
+.test { line-break: loose; }
+</style>
+<script>
+var charlist = `2024 ONE DOT LEADER
+2025 TWO DOT LEADER
+2026 HORIZONTAL ELLIPSIS
+22EF MIDLINE HORIZONTAL ELLIPSIS
+FE19 PRESENTATION FORM FOR VERTICAL HORIZONTAL ELLIPSIS`
+</script>
+</head>
+<body>
+<script>
+var lines = charlist.split('\n')
+var out = '<div id="log"></div>\n'
+for (var i=0;i<lines.length;i++) {
+ // get the data
+ var firstSpace = lines[i].indexOf(' ')
+ var hex = lines[i].substr(0,firstSpace)
+ var name = lines[i].substr(firstSpace)
+ // make a test
+ out += '<div class="wrapper"><div>'+hex+'</div>' +
+ '<div class="test" id="test'+i+'" lang="zh">文文文文文文&#x'+hex+';字<span id="testSpan'+i+'">字</span></div>' +
+ '<div class="ref" id="ref'+i+'" lang="zh">文文文文文文<br/>&#x'+hex+';字<span id="refSpan'+i+'">字</span></div>' +
+ '</div>'
+ }
+
+document.querySelector('body').innerHTML = out
+setup({explicit_done: true});
+
+document.fonts.ready.then(validate);
+
+function validate() {
+ for (i=0;i<lines.length;i++) {
+ test(function() {
+ assert_approx_equals(
+ document.getElementById('testSpan'+i).getBoundingClientRect().left,
+ document.getElementById('refSpan'+i).getBoundingClientRect().left, 1);
+ // Hide successful tests.
+ document.getElementById('test'+i).parentNode.style.display = 'none';
+ }, lines[i]+' may appear at line start if zh and loose');
+ }
+ done();
+}
+</script>
+<!--Notes:
+The test creates a box with room for 6 characters, causing wrapping to occur either between the 6th and the 7th character, or before the 6th if the breaks after the 6th or before the 7th are prohibited.
+
+It also creates the expected behaviour with a ref instance, using <br/>. Each line ends with a span. The test then checks whether the left edge of the span is in the same place in test and ref instance.
+-->
+</body>
+</html>
diff --git a/testing/web-platform/tests/css/css-text/i18n/zh/css-text-line-break-zh-in-normal.html b/testing/web-platform/tests/css/css-text/i18n/zh/css-text-line-break-zh-in-normal.html
new file mode 100644
index 0000000000..67d1668179
--- /dev/null
+++ b/testing/web-platform/tests/css/css-text/i18n/zh/css-text-line-break-zh-in-normal.html
@@ -0,0 +1,71 @@
+<!DOCTYPE html>
+<html lang="en" >
+<head>
+<meta charset="utf-8"/>
+<title>CSS text, linebreaks: IN (normal,zh)</title>
+<link rel="author" title="Richard Ishida" href="mailto:ishida@w3.org">
+<link rel="help" href="https://drafts.csswg.org/css-text-3/#line-break-property">
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<meta name="assert" content="When the language is Chinese, and line-break:normal, a browser will NOT allow a break before an inseparable character.">
+<style type="text/css">
+@font-face {
+ font-family: 'mplus-1p-regular';
+ src: url('/fonts/mplus-1p-regular.woff') format('woff');
+ }
+#wrapper { position: relative; }
+.test { color: red; }
+.test, .ref { font-size: 30px; font-family: mplus-1p-regular, sans-serif; width: 185px; padding: 0; border: 1px solid orange; line-height: 1em; }
+</style>
+<style>
+.test { line-break: normal; }
+</style>
+<script>
+var charlist = `2024 ONE DOT LEADER
+2025 TWO DOT LEADER
+2026 HORIZONTAL ELLIPSIS
+22EF MIDLINE HORIZONTAL ELLIPSIS
+FE19 PRESENTATION FORM FOR VERTICAL HORIZONTAL ELLIPSIS`
+</script>
+</head>
+<body>
+<script>
+var lines = charlist.split('\n')
+var out = '<div id="log"></div>\n'
+for (var i=0;i<lines.length;i++) {
+ // get the data
+ var firstSpace = lines[i].indexOf(' ')
+ var hex = lines[i].substr(0,firstSpace)
+ var name = lines[i].substr(firstSpace)
+ // make a test
+ out += '<div class="wrapper"><div>'+hex+'</div>' +
+ '<div class="test" id="test'+i+'" lang="zh">文文文文文文&#x'+hex+';字<span id="testSpan'+i+'">字</span></div>' +
+ '<div class="ref" id="ref'+i+'" lang="zh">文文文文文<br/>文&#x'+hex+';字<span id="refSpan'+i+'">字</span></div>' +
+ '</div>'
+ }
+
+document.querySelector('body').innerHTML = out
+setup({explicit_done: true});
+
+document.fonts.ready.then(validate);
+
+function validate() {
+ for (i=0;i<lines.length;i++) {
+ test(function() {
+ assert_approx_equals(
+ document.getElementById('testSpan'+i).getBoundingClientRect().left,
+ document.getElementById('refSpan'+i).getBoundingClientRect().left, 1);
+ // Hide successful tests.
+ document.getElementById('test'+i).parentNode.style.display = 'none';
+ }, lines[i]+' may NOT appear at line start if zh and normal');
+ }
+ done();
+}
+</script>
+<!--Notes:
+The test creates a box with room for 6 characters, causing wrapping to occur either between the 6th and the 7th character, or before the 6th if the breaks after the 6th or before the 7th are prohibited.
+
+It also creates the expected behaviour with a ref instance, using <br/>. Each line ends with a span. The test then checks whether the left edge of the span is in the same place in test and ref instance.
+-->
+</body>
+</html>
diff --git a/testing/web-platform/tests/css/css-text/i18n/zh/css-text-line-break-zh-in-strict.html b/testing/web-platform/tests/css/css-text/i18n/zh/css-text-line-break-zh-in-strict.html
new file mode 100644
index 0000000000..a03f8fec75
--- /dev/null
+++ b/testing/web-platform/tests/css/css-text/i18n/zh/css-text-line-break-zh-in-strict.html
@@ -0,0 +1,71 @@
+<!DOCTYPE html>
+<html lang="en" >
+<head>
+<meta charset="utf-8"/>
+<title>CSS text, linebreaks: IN (strict,zh)</title>
+<link rel="author" title="Richard Ishida" href="mailto:ishida@w3.org">
+<link rel="help" href="https://drafts.csswg.org/css-text-3/#line-break-property">
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<meta name="assert" content="When the language is Chinese, and line-break:strict, a browser will NOT allow a break before an inseparable character.">
+<style type="text/css">
+@font-face {
+ font-family: 'mplus-1p-regular';
+ src: url('/fonts/mplus-1p-regular.woff') format('woff');
+ }
+#wrapper { position: relative; }
+.test { color: red; }
+.test, .ref { font-size: 30px; font-family: mplus-1p-regular, sans-serif; width: 185px; padding: 0; border: 1px solid orange; line-height: 1em; }
+</style>
+<style>
+.test { line-break: strict; }
+</style>
+<script>
+var charlist = `2024 ONE DOT LEADER
+2025 TWO DOT LEADER
+2026 HORIZONTAL ELLIPSIS
+22EF MIDLINE HORIZONTAL ELLIPSIS
+FE19 PRESENTATION FORM FOR VERTICAL HORIZONTAL ELLIPSIS`
+</script>
+</head>
+<body>
+<script>
+var lines = charlist.split('\n')
+var out = '<div id="log"></div>\n'
+for (var i=0;i<lines.length;i++) {
+ // get the data
+ var firstSpace = lines[i].indexOf(' ')
+ var hex = lines[i].substr(0,firstSpace)
+ var name = lines[i].substr(firstSpace)
+ // make a test
+ out += '<div class="wrapper"><div>'+hex+'</div>' +
+ '<div class="test" id="test'+i+'" lang="zh">文文文文文文&#x'+hex+';字<span id="testSpan'+i+'">字</span></div>' +
+ '<div class="ref" id="ref'+i+'" lang="zh">文文文文文<br/>文&#x'+hex+';字<span id="refSpan'+i+'">字</span></div>' +
+ '</div>'
+ }
+
+document.querySelector('body').innerHTML = out
+setup({explicit_done: true});
+
+document.fonts.ready.then(validate);
+
+function validate() {
+ for (i=0;i<lines.length;i++) {
+ test(function() {
+ assert_approx_equals(
+ document.getElementById('testSpan'+i).getBoundingClientRect().left,
+ document.getElementById('refSpan'+i).getBoundingClientRect().left, 1);
+ // Hide successful tests.
+ document.getElementById('test'+i).parentNode.style.display = 'none';
+ }, lines[i]+' may NOT appear at line start if zh and strict');
+ }
+ done();
+}
+</script>
+<!--Notes:
+The test creates a box with room for 6 characters, causing wrapping to occur either between the 6th and the 7th character, or before the 6th if the breaks after the 6th or before the 7th are prohibited.
+
+It also creates the expected behaviour with a ref instance, using <br/>. Each line ends with a span. The test then checks whether the left edge of the span is in the same place in test and ref instance.
+-->
+</body>
+</html>
diff --git a/testing/web-platform/tests/css/css-text/i18n/zh/css-text-line-break-zh-iteration-loose.html b/testing/web-platform/tests/css/css-text/i18n/zh/css-text-line-break-zh-iteration-loose.html
new file mode 100644
index 0000000000..6ac29a1fb4
--- /dev/null
+++ b/testing/web-platform/tests/css/css-text/i18n/zh/css-text-line-break-zh-iteration-loose.html
@@ -0,0 +1,72 @@
+<!DOCTYPE html>
+<html lang="en" >
+<head>
+<meta charset="utf-8"/>
+<title>CSS text, linebreaks: iteration (loose,zh)</title>
+<link rel="author" title="Richard Ishida" href="mailto:ishida@w3.org">
+<link rel="help" href="https://drafts.csswg.org/css-text-3/#line-break-property">
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<meta name="assert" content="When the language is Chinese, and line-break:loose, a browser allows a break before an iteration mark.">
+<style type="text/css">
+@font-face {
+ font-family: 'mplus-1p-regular';
+ src: url('/fonts/mplus-1p-regular.woff') format('woff');
+ }
+#wrapper { position: relative; }
+.test { color: red; }
+.test, .ref { font-size: 30px; font-family: mplus-1p-regular, sans-serif; width: 185px; padding: 0; border: 1px solid orange; line-height: 1em; }
+</style>
+<style>
+.test { line-break: loose; }
+</style>
+<script>
+var charlist = `3005 IDEOGRAPHIC ITERATION MARK
+303B VERTICAL IDEOGRAPHIC ITERATION MARK
+309D HIRAGANA ITERATION MARK
+309E HIRAGANA VOICED ITERATION MARK
+30FD KATAKANA ITERATION MARK
+30FE KATAKANA VOICED ITERATION MARK`
+</script>
+</head>
+<body>
+<script>
+var lines = charlist.split('\n')
+var out = '<div id="log"></div>\n'
+for (var i=0;i<lines.length;i++) {
+ // get the data
+ var firstSpace = lines[i].indexOf(' ')
+ var hex = lines[i].substr(0,firstSpace)
+ var name = lines[i].substr(firstSpace)
+ // make a test
+ out += '<div class="wrapper"><div>'+hex+'</div>' +
+ '<div class="test" id="test'+i+'" lang="zh">文文文文文文&#x'+hex+';字<span id="testSpan'+i+'">字</span></div>' +
+ '<div class="ref" id="ref'+i+'" lang="zh">文文文文文文<br/>&#x'+hex+';字<span id="refSpan'+i+'">字</span></div>' +
+ '</div>'
+ }
+
+document.querySelector('body').innerHTML = out
+setup({explicit_done: true});
+
+document.fonts.ready.then(validate);
+
+function validate() {
+ for (i=0;i<lines.length;i++) {
+ test(function() {
+ assert_approx_equals(
+ document.getElementById('testSpan'+i).getBoundingClientRect().left,
+ document.getElementById('refSpan'+i).getBoundingClientRect().left, 1);
+ // Hide successful tests.
+ document.getElementById('test'+i).parentNode.style.display = 'none';
+ }, lines[i]+' may appear at line start if zh and loose');
+ }
+ done();
+}
+</script>
+<!--Notes:
+The test creates a box with room for 6 characters, causing wrapping to occur either between the 6th and the 7th character, or before the 6th if the breaks after the 6th or before the 7th are prohibited.
+
+It also creates the expected behaviour with a ref instance, using <br/>. Each line ends with a span. The test then checks whether the left edge of the span is in the same place in test and ref instance.
+-->
+</body>
+</html>
diff --git a/testing/web-platform/tests/css/css-text/i18n/zh/css-text-line-break-zh-iteration-normal.html b/testing/web-platform/tests/css/css-text/i18n/zh/css-text-line-break-zh-iteration-normal.html
new file mode 100644
index 0000000000..8f5276ac04
--- /dev/null
+++ b/testing/web-platform/tests/css/css-text/i18n/zh/css-text-line-break-zh-iteration-normal.html
@@ -0,0 +1,72 @@
+<!DOCTYPE html>
+<html lang="en" >
+<head>
+<meta charset="utf-8"/>
+<title>CSS text, linebreaks: iteration (normal,zh)</title>
+<link rel="author" title="Richard Ishida" href="mailto:ishida@w3.org">
+<link rel="help" href="https://drafts.csswg.org/css-text-3/#line-break-property">
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<meta name="assert" content="When the language is Chinese, and line-break:normal, a browser will NOT allow a break before an iteration mark.">
+<style type="text/css">
+@font-face {
+ font-family: 'mplus-1p-regular';
+ src: url('/fonts/mplus-1p-regular.woff') format('woff');
+ }
+#wrapper { position: relative; }
+.test { color: red; }
+.test, .ref { font-size: 30px; font-family: mplus-1p-regular, sans-serif; width: 185px; padding: 0; border: 1px solid orange; line-height: 1em; }
+</style>
+<style>
+.test { line-break: normal; }
+</style>
+<script>
+var charlist = `3005 IDEOGRAPHIC ITERATION MARK
+303B VERTICAL IDEOGRAPHIC ITERATION MARK
+309D HIRAGANA ITERATION MARK
+309E HIRAGANA VOICED ITERATION MARK
+30FD KATAKANA ITERATION MARK
+30FE KATAKANA VOICED ITERATION MARK`
+</script>
+</head>
+<body>
+<script>
+var lines = charlist.split('\n')
+var out = '<div id="log"></div>\n'
+for (var i=0;i<lines.length;i++) {
+ // get the data
+ var firstSpace = lines[i].indexOf(' ')
+ var hex = lines[i].substr(0,firstSpace)
+ var name = lines[i].substr(firstSpace)
+ // make a test
+ out += '<div class="wrapper"><div>'+hex+'</div>' +
+ '<div class="test" id="test'+i+'" lang="zh">文文文文文文&#x'+hex+';字<span id="testSpan'+i+'">字</span></div>' +
+ '<div class="ref" id="ref'+i+'" lang="zh">文文文文文<br/>文&#x'+hex+';字<span id="refSpan'+i+'">字</span></div>' +
+ '</div>'
+ }
+
+document.querySelector('body').innerHTML = out
+setup({explicit_done: true});
+
+document.fonts.ready.then(validate);
+
+function validate() {
+ for (i=0;i<lines.length;i++) {
+ test(function() {
+ assert_approx_equals(
+ document.getElementById('testSpan'+i).getBoundingClientRect().left,
+ document.getElementById('refSpan'+i).getBoundingClientRect().left, 1);
+ // Hide successful tests.
+ document.getElementById('test'+i).parentNode.style.display = 'none';
+ }, lines[i]+' may NOT appear at line start if zh and normal');
+ }
+ done();
+}
+</script>
+<!--Notes:
+The test creates a box with room for 6 characters, causing wrapping to occur either between the 6th and the 7th character, or before the 6th if the breaks after the 6th or before the 7th are prohibited.
+
+It also creates the expected behaviour with a ref instance, using <br/>. Each line ends with a span. The test then checks whether the left edge of the span is in the same place in test and ref instance.
+-->
+</body>
+</html>
diff --git a/testing/web-platform/tests/css/css-text/i18n/zh/css-text-line-break-zh-iteration-strict.html b/testing/web-platform/tests/css/css-text/i18n/zh/css-text-line-break-zh-iteration-strict.html
new file mode 100644
index 0000000000..678e43d767
--- /dev/null
+++ b/testing/web-platform/tests/css/css-text/i18n/zh/css-text-line-break-zh-iteration-strict.html
@@ -0,0 +1,72 @@
+<!DOCTYPE html>
+<html lang="en" >
+<head>
+<meta charset="utf-8"/>
+<title>CSS text, linebreaks: iteration (strict,zh)</title>
+<link rel="author" title="Richard Ishida" href="mailto:ishida@w3.org">
+<link rel="help" href="https://drafts.csswg.org/css-text-3/#line-break-property">
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<meta name="assert" content="When the language is Chinese, and line-break:strict, a browser will NOT allow a break before an iteration mark.">
+<style type="text/css">
+@font-face {
+ font-family: 'mplus-1p-regular';
+ src: url('/fonts/mplus-1p-regular.woff') format('woff');
+ }
+#wrapper { position: relative; }
+.test { color: red; }
+.test, .ref { font-size: 30px; font-family: mplus-1p-regular, sans-serif; width: 185px; padding: 0; border: 1px solid orange; line-height: 1em; }
+</style>
+<style>
+.test { line-break: strict; }
+</style>
+<script>
+var charlist = `3005 IDEOGRAPHIC ITERATION MARK
+303B VERTICAL IDEOGRAPHIC ITERATION MARK
+309D HIRAGANA ITERATION MARK
+309E HIRAGANA VOICED ITERATION MARK
+30FD KATAKANA ITERATION MARK
+30FE KATAKANA VOICED ITERATION MARK`
+</script>
+</head>
+<body>
+<script>
+var lines = charlist.split('\n')
+var out = '<div id="log"></div>\n'
+for (var i=0;i<lines.length;i++) {
+ // get the data
+ var firstSpace = lines[i].indexOf(' ')
+ var hex = lines[i].substr(0,firstSpace)
+ var name = lines[i].substr(firstSpace)
+ // make a test
+ out += '<div class="wrapper"><div>'+hex+'</div>' +
+ '<div class="test" id="test'+i+'" lang="zh">文文文文文文&#x'+hex+';字<span id="testSpan'+i+'">字</span></div>' +
+ '<div class="ref" id="ref'+i+'" lang="zh">文文文文文<br/>文&#x'+hex+';字<span id="refSpan'+i+'">字</span></div>' +
+ '</div>'
+ }
+
+document.querySelector('body').innerHTML = out
+setup({explicit_done: true});
+
+document.fonts.ready.then(validate);
+
+function validate() {
+ for (i=0;i<lines.length;i++) {
+ test(function() {
+ assert_approx_equals(
+ document.getElementById('testSpan'+i).getBoundingClientRect().left,
+ document.getElementById('refSpan'+i).getBoundingClientRect().left, 1);
+ // Hide successful tests.
+ document.getElementById('test'+i).parentNode.style.display = 'none';
+ }, lines[i]+' may NOT appear at line start if zh and strict');
+ }
+ done();
+}
+</script>
+<!--Notes:
+The test creates a box with room for 6 characters, causing wrapping to occur either between the 6th and the 7th character, or before the 6th if the breaks after the 6th or before the 7th are prohibited.
+
+It also creates the expected behaviour with a ref instance, using <br/>. Each line ends with a span. The test then checks whether the left edge of the span is in the same place in test and ref instance.
+-->
+</body>
+</html>
diff --git a/testing/web-platform/tests/css/css-text/i18n/zh/css-text-line-break-zh-po-loose.html b/testing/web-platform/tests/css/css-text/i18n/zh/css-text-line-break-zh-po-loose.html
new file mode 100644
index 0000000000..3bd1b2f6b6
--- /dev/null
+++ b/testing/web-platform/tests/css/css-text/i18n/zh/css-text-line-break-zh-po-loose.html
@@ -0,0 +1,76 @@
+<!DOCTYPE html>
+<html lang="en" >
+<head>
+<meta charset="utf-8"/>
+<title>CSS text, linebreaks: PO AFW (loose,zh)</title>
+<link rel="author" title="Richard Ishida" href="mailto:ishida@w3.org">
+<link rel="help" href="https://drafts.csswg.org/css-text-3/#line-break-property">
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<meta name="assert" content="When the language is Chinese, and line-break:loose, a browser allows a break before a PO character with East Asian Width of A, F, or W.">
+<style type="text/css">
+@font-face {
+ font-family: 'mplus-1p-regular';
+ src: url('/fonts/mplus-1p-regular.woff') format('woff');
+ }
+#wrapper { position: relative; }
+.test { color: red; }
+.test, .ref { font-size: 30px; font-family: mplus-1p-regular, sans-serif; width: 185px; padding: 0; border: 1px solid orange; line-height: 1em; }
+</style>
+<style>
+.test { line-break: loose; }
+</style>
+<script>
+var charlist = `00B0 DEGREE SIGN
+2030 PER MILLE SIGN
+2032 PRIME
+2033 DOUBLE PRIME
+2035 REVERSED PRIME
+2103 DEGREE CELSIUS
+2109 DEGREE FAHRENHEIT
+FE6A SMALL PERCENT SIGN
+FF05 FULLWIDTH PERCENT SIGN
+FFE0 FULLWIDTH CENT SIGN`
+</script>
+</head>
+<body>
+<script>
+var lines = charlist.split('\n')
+var out = '<div id="log"></div>\n'
+for (var i=0;i<lines.length;i++) {
+ // get the data
+ var firstSpace = lines[i].indexOf(' ')
+ var hex = lines[i].substr(0,firstSpace)
+ var name = lines[i].substr(firstSpace)
+ // make a test
+ out += '<div class="wrapper"><div>'+hex+'</div>' +
+ '<div class="test" id="test'+i+'" lang="zh">文文文文文文&#x'+hex+';字<span id="testSpan'+i+'">字</span></div>' +
+ '<div class="ref" id="ref'+i+'" lang="zh">文文文文文文<br/>&#x'+hex+';字<span id="refSpan'+i+'">字</span></div>' +
+ '</div>'
+ }
+
+document.querySelector('body').innerHTML = out
+setup({explicit_done: true});
+
+document.fonts.ready.then(validate);
+
+function validate() {
+ for (i=0;i<lines.length;i++) {
+ test(function() {
+ assert_approx_equals(
+ document.getElementById('testSpan'+i).getBoundingClientRect().left,
+ document.getElementById('refSpan'+i).getBoundingClientRect().left, 1);
+ // Hide successful tests.
+ document.getElementById('test'+i).parentNode.style.display = 'none';
+ }, lines[i]+' may appear at line start if zh and loose');
+ }
+ done();
+}
+</script>
+<!--Notes:
+The test creates a box with room for 6 characters, causing wrapping to occur either between the 6th and the 7th character, or before the 6th if the breaks after the 6th or before the 7th are prohibited.
+
+It also creates the expected behaviour with a ref instance, using <br/>. Each line ends with a span. The test then checks whether the left edge of the span is in the same place in test and ref instance.
+-->
+</body>
+</html>
diff --git a/testing/web-platform/tests/css/css-text/i18n/zh/css-text-line-break-zh-po-normal.html b/testing/web-platform/tests/css/css-text/i18n/zh/css-text-line-break-zh-po-normal.html
new file mode 100644
index 0000000000..76eed4b059
--- /dev/null
+++ b/testing/web-platform/tests/css/css-text/i18n/zh/css-text-line-break-zh-po-normal.html
@@ -0,0 +1,76 @@
+<!DOCTYPE html>
+<html lang="en" >
+<head>
+<meta charset="utf-8"/>
+<title>CSS text, linebreaks: PO AFW (normal,zh)</title>
+<link rel="author" title="Richard Ishida" href="mailto:ishida@w3.org">
+<link rel="help" href="https://drafts.csswg.org/css-text-3/#line-break-property">
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<meta name="assert" content="When the language is Chinese, and line-break:normal, a browser will NOT allow a break before a PO character with East Asian Width of A, F, or W.">
+<style type="text/css">
+@font-face {
+ font-family: 'mplus-1p-regular';
+ src: url('/fonts/mplus-1p-regular.woff') format('woff');
+ }
+#wrapper { position: relative; }
+.test { color: red; }
+.test, .ref { font-size: 30px; font-family: mplus-1p-regular, sans-serif; width: 185px; padding: 0; border: 1px solid orange; line-height: 1em; }
+</style>
+<style>
+.test { line-break: normal; }
+</style>
+<script>
+var charlist = `00B0 DEGREE SIGN
+2030 PER MILLE SIGN
+2032 PRIME
+2033 DOUBLE PRIME
+2035 REVERSED PRIME
+2103 DEGREE CELSIUS
+2109 DEGREE FAHRENHEIT
+FE6A SMALL PERCENT SIGN
+FF05 FULLWIDTH PERCENT SIGN
+FFE0 FULLWIDTH CENT SIGN`
+</script>
+</head>
+<body>
+<script>
+var lines = charlist.split('\n')
+var out = '<div id="log"></div>\n'
+for (var i=0;i<lines.length;i++) {
+ // get the data
+ var firstSpace = lines[i].indexOf(' ')
+ var hex = lines[i].substr(0,firstSpace)
+ var name = lines[i].substr(firstSpace)
+ // make a test
+ out += '<div class="wrapper"><div>'+hex+'</div>' +
+ '<div class="test" id="test'+i+'" lang="zh">文文文文文文&#x'+hex+';字<span id="testSpan'+i+'">字</span></div>' +
+ '<div class="ref" id="ref'+i+'" lang="zh">文文文文文<br/>文&#x'+hex+';字<span id="refSpan'+i+'">字</span></div>' +
+ '</div>'
+ }
+
+document.querySelector('body').innerHTML = out
+setup({explicit_done: true});
+
+document.fonts.ready.then(validate);
+
+function validate() {
+ for (i=0;i<lines.length;i++) {
+ test(function() {
+ assert_approx_equals(
+ document.getElementById('testSpan'+i).getBoundingClientRect().left,
+ document.getElementById('refSpan'+i).getBoundingClientRect().left, 1);
+ // Hide successful tests.
+ document.getElementById('test'+i).parentNode.style.display = 'none';
+ }, lines[i]+' may NOT appear at line start if zh and normal');
+ }
+ done();
+}
+</script>
+<!--Notes:
+The test creates a box with room for 6 characters, causing wrapping to occur either between the 6th and the 7th character, or before the 6th if the breaks after the 6th or before the 7th are prohibited.
+
+It also creates the expected behaviour with a ref instance, using <br/>. Each line ends with a span. The test then checks whether the left edge of the span is in the same place in test and ref instance.
+-->
+</body>
+</html>
diff --git a/testing/web-platform/tests/css/css-text/i18n/zh/css-text-line-break-zh-po-strict.html b/testing/web-platform/tests/css/css-text/i18n/zh/css-text-line-break-zh-po-strict.html
new file mode 100644
index 0000000000..991b9ffa6d
--- /dev/null
+++ b/testing/web-platform/tests/css/css-text/i18n/zh/css-text-line-break-zh-po-strict.html
@@ -0,0 +1,76 @@
+<!DOCTYPE html>
+<html lang="en" >
+<head>
+<meta charset="utf-8"/>
+<title>CSS text, linebreaks: PO AFW (strict,zh)</title>
+<link rel="author" title="Richard Ishida" href="mailto:ishida@w3.org">
+<link rel="help" href="https://drafts.csswg.org/css-text-3/#line-break-property">
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<meta name="assert" content="When the language is Chinese, and line-break:strict, a browser will NOT allow a break before a PO character with East Asian Width of A, F, or W.">
+<style type="text/css">
+@font-face {
+ font-family: 'mplus-1p-regular';
+ src: url('/fonts/mplus-1p-regular.woff') format('woff');
+ }
+#wrapper { position: relative; }
+.test { color: red; }
+.test, .ref { font-size: 30px; font-family: mplus-1p-regular, sans-serif; width: 185px; padding: 0; border: 1px solid orange; line-height: 1em; }
+</style>
+<style>
+.test { line-break: strict; }
+</style>
+<script>
+var charlist = `00B0 DEGREE SIGN
+2030 PER MILLE SIGN
+2032 PRIME
+2033 DOUBLE PRIME
+2035 REVERSED PRIME
+2103 DEGREE CELSIUS
+2109 DEGREE FAHRENHEIT
+FE6A SMALL PERCENT SIGN
+FF05 FULLWIDTH PERCENT SIGN
+FFE0 FULLWIDTH CENT SIGN`
+</script>
+</head>
+<body>
+<script>
+var lines = charlist.split('\n')
+var out = '<div id="log"></div>\n'
+for (var i=0;i<lines.length;i++) {
+ // get the data
+ var firstSpace = lines[i].indexOf(' ')
+ var hex = lines[i].substr(0,firstSpace)
+ var name = lines[i].substr(firstSpace)
+ // make a test
+ out += '<div class="wrapper"><div>'+hex+'</div>' +
+ '<div class="test" id="test'+i+'" lang="zh">文文文文文文&#x'+hex+';字<span id="testSpan'+i+'">字</span></div>' +
+ '<div class="ref" id="ref'+i+'" lang="zh">文文文文文<br/>文&#x'+hex+';字<span id="refSpan'+i+'">字</span></div>' +
+ '</div>'
+ }
+
+document.querySelector('body').innerHTML = out
+setup({explicit_done: true});
+
+document.fonts.ready.then(validate);
+
+function validate() {
+ for (i=0;i<lines.length;i++) {
+ test(function() {
+ assert_approx_equals(
+ document.getElementById('testSpan'+i).getBoundingClientRect().left,
+ document.getElementById('refSpan'+i).getBoundingClientRect().left, 1);
+ // Hide successful tests.
+ document.getElementById('test'+i).parentNode.style.display = 'none';
+ }, lines[i]+' may NOT appear at line start if zh and strict');
+ }
+ done();
+}
+</script>
+<!--Notes:
+The test creates a box with room for 6 characters, causing wrapping to occur either between the 6th and the 7th character, or before the 6th if the breaks after the 6th or before the 7th are prohibited.
+
+It also creates the expected behaviour with a ref instance, using <br/>. Each line ends with a span. The test then checks whether the left edge of the span is in the same place in test and ref instance.
+-->
+</body>
+</html>
diff --git a/testing/web-platform/tests/css/css-text/i18n/zh/css-text-line-break-zh-pr-loose.html b/testing/web-platform/tests/css/css-text/i18n/zh/css-text-line-break-zh-pr-loose.html
new file mode 100644
index 0000000000..e3b13e060c
--- /dev/null
+++ b/testing/web-platform/tests/css/css-text/i18n/zh/css-text-line-break-zh-pr-loose.html
@@ -0,0 +1,74 @@
+<!DOCTYPE html>
+<html lang="en" >
+<head>
+<meta charset="utf-8"/>
+<title>CSS text, linebreaks: PR AFW (loose,zh)</title>
+<link rel="author" title="Richard Ishida" href="mailto:ishida@w3.org">
+<link rel="help" href="https://drafts.csswg.org/css-text-3/#line-break-property">
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<meta name="assert" content="When the language is Chinese, and line-break:loose, a browser allows a break before a PR character with East Asian Width of A, F, or W.">
+<style type="text/css">
+@font-face {
+ font-family: 'mplus-1p-regular';
+ src: url('/fonts/mplus-1p-regular.woff') format('woff');
+ }
+#wrapper { position: relative; }
+.test { color: red; }
+.test, .ref { font-size: 30px; font-family: mplus-1p-regular, sans-serif; width: 185px; padding: 0; border: 1px solid orange; line-height: 1em; }
+</style>
+<style>
+.test { line-break: loose; }
+</style>
+<script>
+var charlist = `00B1 PLUS-MINUS SIGN
+20AC EURO SIGN
+2116 NUMERO SIGN
+FE69 SMALL DOLLAR SIGN
+FF04 FULLWIDTH DOLLAR SIGN
+FFE1 FULLWIDTH POUND SIGN
+FFE5 FULLWIDTH YEN SIGN
+FFE6 FULLWIDTH WON SIGN`
+</script>
+</head>
+<body>
+<script>
+var lines = charlist.split('\n')
+var out = '<div id="log"></div>\n'
+for (var i=0;i<lines.length;i++) {
+ // get the data
+ var firstSpace = lines[i].indexOf(' ')
+ var hex = lines[i].substr(0,firstSpace)
+ var name = lines[i].substr(firstSpace)
+ // make a test
+ out += '<div class="wrapper"><div>'+hex+'</div>' +
+ '<div class="test" id="test'+i+'" lang="zh">文文文文文文&#x'+hex+';字<span id="testSpan'+i+'">字</span></div>' +
+ '<div class="ref" id="ref'+i+'" lang="zh">文文文文文文<br/>&#x'+hex+';字<span id="refSpan'+i+'">字</span></div>' +
+ '</div>'
+ }
+
+document.querySelector('body').innerHTML = out
+setup({explicit_done: true});
+
+document.fonts.ready.then(validate);
+
+function validate() {
+ for (i=0;i<lines.length;i++) {
+ test(function() {
+ assert_approx_equals(
+ document.getElementById('testSpan'+i).getBoundingClientRect().left,
+ document.getElementById('refSpan'+i).getBoundingClientRect().left, 1);
+ // Hide successful tests.
+ document.getElementById('test'+i).parentNode.style.display = 'none';
+ }, lines[i]+' may appear at line start if zh and loose');
+ }
+ done();
+}
+</script>
+<!--Notes:
+The test creates a box with room for 6 characters, causing wrapping to occur either between the 6th and the 7th character, or before the 6th if the breaks after the 6th or before the 7th are prohibited.
+
+It also creates the expected behaviour with a ref instance, using <br/>. Each line ends with a span. The test then checks whether the left edge of the span is in the same place in test and ref instance.
+-->
+</body>
+</html>
diff --git a/testing/web-platform/tests/css/css-text/i18n/zh/css-text-line-break-zh-pr-normal.html b/testing/web-platform/tests/css/css-text/i18n/zh/css-text-line-break-zh-pr-normal.html
new file mode 100644
index 0000000000..954953cd41
--- /dev/null
+++ b/testing/web-platform/tests/css/css-text/i18n/zh/css-text-line-break-zh-pr-normal.html
@@ -0,0 +1,74 @@
+<!DOCTYPE html>
+<html lang="en" >
+<head>
+<meta charset="utf-8"/>
+<title>CSS text, linebreaks: PR AFW (normal,zh)</title>
+<link rel="author" title="Richard Ishida" href="mailto:ishida@w3.org">
+<link rel="help" href="https://drafts.csswg.org/css-text-3/#line-break-property">
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<meta name="assert" content="When the language is Chinese, and line-break:normal, a browser will NOT allow a break before a PR character with East Asian Width of A, F, or W.">
+<style type="text/css">
+@font-face {
+ font-family: 'mplus-1p-regular';
+ src: url('/fonts/mplus-1p-regular.woff') format('woff');
+ }
+#wrapper { position: relative; }
+.test { color: red; }
+.test, .ref { font-size: 30px; font-family: mplus-1p-regular, sans-serif; width: 185px; padding: 0; border: 1px solid orange; line-height: 1em; }
+</style>
+<style>
+.test { line-break: normal; }
+</style>
+<script>
+var charlist = `00B1 PLUS-MINUS SIGN
+20AC EURO SIGN
+2116 NUMERO SIGN
+FE69 SMALL DOLLAR SIGN
+FF04 FULLWIDTH DOLLAR SIGN
+FFE1 FULLWIDTH POUND SIGN
+FFE5 FULLWIDTH YEN SIGN
+FFE6 FULLWIDTH WON SIGN`
+</script>
+</head>
+<body>
+<script>
+var lines = charlist.split('\n')
+var out = '<div id="log"></div>\n'
+for (var i=0;i<lines.length;i++) {
+ // get the data
+ var firstSpace = lines[i].indexOf(' ')
+ var hex = lines[i].substr(0,firstSpace)
+ var name = lines[i].substr(firstSpace)
+ // make a test
+ out += '<div class="wrapper"><div>'+hex+'</div>' +
+ '<div class="test" id="test'+i+'" lang="zh">文文文文文文&#x'+hex+';字<span id="testSpan'+i+'">字</span></div>' +
+ '<div class="ref" id="ref'+i+'" lang="zh">文文文文文<br/>文&#x'+hex+';字<span id="refSpan'+i+'">字</span></div>' +
+ '</div>'
+ }
+
+document.querySelector('body').innerHTML = out
+setup({explicit_done: true});
+
+document.fonts.ready.then(validate);
+
+function validate() {
+ for (i=0;i<lines.length;i++) {
+ test(function() {
+ assert_approx_equals(
+ document.getElementById('testSpan'+i).getBoundingClientRect().left,
+ document.getElementById('refSpan'+i).getBoundingClientRect().left, 1);
+ // Hide successful tests.
+ document.getElementById('test'+i).parentNode.style.display = 'none';
+ }, lines[i]+' may NOT appear at line start if zh and normal');
+ }
+ done();
+}
+</script>
+<!--Notes:
+The test creates a box with room for 6 characters, causing wrapping to occur either between the 6th and the 7th character, or before the 6th if the breaks after the 6th or before the 7th are prohibited.
+
+It also creates the expected behaviour with a ref instance, using <br/>. Each line ends with a span. The test then checks whether the left edge of the span is in the same place in test and ref instance.
+-->
+</body>
+</html>
diff --git a/testing/web-platform/tests/css/css-text/i18n/zh/css-text-line-break-zh-pr-strict.html b/testing/web-platform/tests/css/css-text/i18n/zh/css-text-line-break-zh-pr-strict.html
new file mode 100644
index 0000000000..cefd42923a
--- /dev/null
+++ b/testing/web-platform/tests/css/css-text/i18n/zh/css-text-line-break-zh-pr-strict.html
@@ -0,0 +1,74 @@
+<!DOCTYPE html>
+<html lang="en" >
+<head>
+<meta charset="utf-8"/>
+<title>CSS text, linebreaks: PR AFW (strict,zh)</title>
+<link rel="author" title="Richard Ishida" href="mailto:ishida@w3.org">
+<link rel="help" href="https://drafts.csswg.org/css-text-3/#line-break-property">
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<meta name="assert" content="When the language is Chinese, and line-break:strict, a browser will NOT allow a break before a PR character with East Asian Width of A, F, or W.">
+<style type="text/css">
+@font-face {
+ font-family: 'mplus-1p-regular';
+ src: url('/fonts/mplus-1p-regular.woff') format('woff');
+ }
+#wrapper { position: relative; }
+.test { color: red; }
+.test, .ref { font-size: 30px; font-family: mplus-1p-regular, sans-serif; width: 185px; padding: 0; border: 1px solid orange; line-height: 1em; }
+</style>
+<style>
+.test { line-break: strict; }
+</style>
+<script>
+var charlist = `00B1 PLUS-MINUS SIGN
+20AC EURO SIGN
+2116 NUMERO SIGN
+FE69 SMALL DOLLAR SIGN
+FF04 FULLWIDTH DOLLAR SIGN
+FFE1 FULLWIDTH POUND SIGN
+FFE5 FULLWIDTH YEN SIGN
+FFE6 FULLWIDTH WON SIGN`
+</script>
+</head>
+<body>
+<script>
+var lines = charlist.split('\n')
+var out = '<div id="log"></div>\n'
+for (var i=0;i<lines.length;i++) {
+ // get the data
+ var firstSpace = lines[i].indexOf(' ')
+ var hex = lines[i].substr(0,firstSpace)
+ var name = lines[i].substr(firstSpace)
+ // make a test
+ out += '<div class="wrapper"><div>'+hex+'</div>' +
+ '<div class="test" id="test'+i+'" lang="zh">文文文文文文&#x'+hex+';字<span id="testSpan'+i+'">字</span></div>' +
+ '<div class="ref" id="ref'+i+'" lang="zh">文文文文文<br/>文&#x'+hex+';字<span id="refSpan'+i+'">字</span></div>' +
+ '</div>'
+ }
+
+document.querySelector('body').innerHTML = out
+setup({explicit_done: true});
+
+document.fonts.ready.then(validate);
+
+function validate() {
+ for (i=0;i<lines.length;i++) {
+ test(function() {
+ assert_approx_equals(
+ document.getElementById('testSpan'+i).getBoundingClientRect().left,
+ document.getElementById('refSpan'+i).getBoundingClientRect().left, 1);
+ // Hide successful tests.
+ document.getElementById('test'+i).parentNode.style.display = 'none';
+ }, lines[i]+' may NOT appear at line start if zh and strict');
+ }
+ done();
+}
+</script>
+<!--Notes:
+The test creates a box with room for 6 characters, causing wrapping to occur either between the 6th and the 7th character, or before the 6th if the breaks after the 6th or before the 7th are prohibited.
+
+It also creates the expected behaviour with a ref instance, using <br/>. Each line ends with a span. The test then checks whether the left edge of the span is in the same place in test and ref instance.
+-->
+</body>
+</html>