Don't do whitespace re-attachment for ::first-letter.

If we have a white-space node before the text node with the first
letter, we would try to re-attach the white-space node with an incorrect
previous in-flow LayoutObject because we attach the ::first-letter after
all children have been attached, not where the ::first-letter would end
up in the layout tree.

We don't need to re-attach whitespace after ::first-letter because:

* We always create a remaining LayoutTextFragment for the text node
  which contains the first formatted letter. Wether the remaining text
  consists of white-space or is even empty.

* If the LayoutObject sibling following first-letter+remaining-text
  consists of white-space, it would have gotten a LayoutObject when
  attaching the LayoutText for the text node where the first-letter
  comes from.

That is, we will always have a LayoutObject for a white-space LayoutText
sibling of a first-letter LayoutObject.

Split out a separate method for ::first-letter for less complexity and
cost with which WhitespaceAttacher to use.

Bug: 876150
Change-Id: Ib1f34f0ba596d5fa5f1c7fcbd7c75550dd4f9d12
Reviewed-on: https://chromium-review.googlesource.com/1183231
Reviewed-by: Xiaocheng Hu <xiaochengh@chromium.org>
Commit-Queue: Rune Lillesveen <futhark@chromium.org>
Cr-Commit-Position: refs/heads/master@{#584866}
diff --git a/css/css-pseudo/first-letter-and-whitespace-ref.html b/css/css-pseudo/first-letter-and-whitespace-ref.html
new file mode 100644
index 0000000..d193306
--- /dev/null
+++ b/css/css-pseudo/first-letter-and-whitespace-ref.html
@@ -0,0 +1,11 @@
+<!doctype html>
+<meta charset="utf-8">
+<title>CSS Reference File</title>
+<link rel="author" title="Rune Lillesveen" href="mailto:futhark@chromium.org">
+<p>Pass if no space between "A", space between "B".</p>
+<div><span style="float:left">A</span>A</div>
+<div><span style="float:left">A</span>A</div>
+<div>B B</div>
+<div>B B</div>
+<div>AAB B</div>
+<div>AAB B</div>
diff --git a/css/css-pseudo/first-letter-and-whitespace.html b/css/css-pseudo/first-letter-and-whitespace.html
new file mode 100644
index 0000000..a10612a
--- /dev/null
+++ b/css/css-pseudo/first-letter-and-whitespace.html
@@ -0,0 +1,31 @@
+<!doctype html>
+<meta charset="utf-8">
+<title>CSS Test: White-spaces around floated ::first-letter</title>
+<link rel="author" title="Rune Lillesveen" href="mailto:futhark@chromium.org">
+<link rel="match" href="first-letter-and-whitespace-ref.html">
+<link rel="help" href="https://drafts.csswg.org/css-pseudo-4/#first-letter-styling">
+<meta name="assert" content="Test checks that white-spaces are correctly rendered for floated ::first-letter changes">
+<style>
+  div::first-letter {
+    color: black;
+  }
+  .floatLetter::first-letter {
+    float: left;
+  }
+</style>
+<p>Pass if no space between "A", space between "B".</p>
+<div id="t1"> <!---->AA</div>
+<div id="t2"> <!---->A<!----> <!---->A</div>
+<div id="t3" class="floatLetter">  <!---->B<!----> <!---->B</div>
+<div id="t4" class="floatLetter">  <!---->B <!---->B</div>
+<div id="t5" class="floatLetter">  <!---->AAB<!----> <!---->B</div>
+<div id="t6" class="floatLetter">  <!---->AAB<!----> B</div>
+<script>
+  document.body.offsetTop;
+  t1.className = "floatLetter";
+  t2.className = "floatLetter";
+  t3.className = "";
+  t4.className = "";
+  t5.className = "";
+  t6.className = "";
+</script>