diff --git a/components/reading_list/core/BUILD.gn b/components/reading_list/core/BUILD.gn
index f45b10c..52dbc373 100644
--- a/components/reading_list/core/BUILD.gn
+++ b/components/reading_list/core/BUILD.gn
@@ -2,22 +2,12 @@
 # Use of this source code is governed by a BSD-style license that can be
 # found in the LICENSE file.
 
-import("//build/buildflag_header.gni")
-import("//components/reading_list/core/reading_list.gni")
-
 source_set("core") {
   sources = [
     "reading_list_switches.cc",
     "reading_list_switches.h",
   ]
   deps = [
-    ":reading_list_enable_flags",
     "//base",
   ]
 }
-
-buildflag_header("reading_list_enable_flags") {
-  header = "reading_list_enable_flags.h"
-  _enabled = is_ios && enable_reading_list
-  flags = [ "ENABLE_READING_LIST=$_enabled" ]
-}
diff --git a/components/reading_list/core/reading_list.gni b/components/reading_list/core/reading_list.gni
deleted file mode 100644
index 26c4e1e..0000000
--- a/components/reading_list/core/reading_list.gni
+++ /dev/null
@@ -1,9 +0,0 @@
-# Copyright 2016 The Chromium Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-
-declare_args() {
-  # Controls whether reading list support is active or not. Currently only
-  # supported on iOS (on other platforms, the feature is always disabled).
-  enable_reading_list = true
-}
diff --git a/components/reading_list/core/reading_list_switches.cc b/components/reading_list/core/reading_list_switches.cc
index d6aba34..4fa0804 100644
--- a/components/reading_list/core/reading_list_switches.cc
+++ b/components/reading_list/core/reading_list_switches.cc
@@ -6,12 +6,23 @@
 
 #include "build/build_config.h"
 #include "base/command_line.h"
-#include "components/reading_list/core/reading_list_enable_flags.h"
 
 namespace reading_list {
 namespace switches {
+// Enables the reading list.
+const char kEnableReadingList[] = "enable-reading-list";
+
+// Disables the reading list.
+const char kDisableReadingList[] = "disable-reading-list";
+
 bool IsReadingListEnabled() {
-  return BUILDFLAG(ENABLE_READING_LIST);
+  // Reading list is only enabled on iOS.
+#if defined(OS_IOS)
+  if (base::CommandLine::ForCurrentProcess()->HasSwitch(kEnableReadingList)) {
+    return true;
+  }
+#endif
+  return false;
 }
 }  // namespace switches
 }  // namespace reading_list
diff --git a/components/reading_list/core/reading_list_switches.h b/components/reading_list/core/reading_list_switches.h
index c99231c..e9790fc 100644
--- a/components/reading_list/core/reading_list_switches.h
+++ b/components/reading_list/core/reading_list_switches.h
@@ -7,6 +7,9 @@
 
 namespace reading_list {
 namespace switches {
+extern const char kEnableReadingList[];
+extern const char kDisableReadingList[];
+
 // Whether Reading List is enabled on this device.
 bool IsReadingListEnabled();
 }  // namespace switches
diff --git a/components/reading_list/ios/reading_list_model_storage.h b/components/reading_list/ios/reading_list_model_storage.h
index a2ed7cc4..422abf04 100644
--- a/components/reading_list/ios/reading_list_model_storage.h
+++ b/components/reading_list/ios/reading_list_model_storage.h
@@ -7,6 +7,7 @@
 
 #include <vector>
 
+#include "base/macros.h"
 #include "components/reading_list/ios/reading_list_entry.h"
 
 class ReadingListModel;
@@ -22,6 +23,9 @@
  public:
   class ScopedBatchUpdate;
 
+  ReadingListModelStorage() {}
+  virtual ~ReadingListModelStorage() {}
+
   // Sets the model the Storage is backing.
   // This will trigger store initalization and load persistent entries.
   virtual void SetReadingListModel(ReadingListModel* model,
@@ -48,8 +52,15 @@
 
   class ScopedBatchUpdate {
    public:
+    ScopedBatchUpdate() {}
     virtual ~ScopedBatchUpdate() {}
+
+   private:
+    DISALLOW_COPY_AND_ASSIGN(ScopedBatchUpdate);
   };
+
+ private:
+  DISALLOW_COPY_AND_ASSIGN(ReadingListModelStorage);
 };
 
 #endif  // COMPONENTS_READING_LIST_IOS_READING_LIST_MODEL_STORAGE_H_
diff --git a/components/reading_list/ios/reading_list_store_delegate.h b/components/reading_list/ios/reading_list_store_delegate.h
index ff4b14b..a50e6d6b6 100644
--- a/components/reading_list/ios/reading_list_store_delegate.h
+++ b/components/reading_list/ios/reading_list_store_delegate.h
@@ -7,13 +7,20 @@
 
 #include <map>
 
+#include "base/macros.h"
+
 class ReadingListEntry;
 
 // The delegate to handle callbacks from the ReadingListStore.
 class ReadingListStoreDelegate {
  public:
+  ReadingListStoreDelegate() {}
+  virtual ~ReadingListStoreDelegate() {}
+
   using ReadingListEntries = std::map<GURL, ReadingListEntry>;
-  // These three mathods handle callbacks from a ReadingListStore.
+  // These three methods handle callbacks from a ReadingListStore.
+  // This method is called when the local store is loaded. |entries| contains
+  // the ReadingListEntry present on the device before sync starts.
   virtual void StoreLoaded(std::unique_ptr<ReadingListEntries> entries) = 0;
   // Handle sync events.
   // Called to add a new entry to the model.
@@ -29,6 +36,8 @@
 
   // Called to remove an entry to the model.
   virtual void SyncRemoveEntry(const GURL& url) = 0;
+ private:
+  DISALLOW_COPY_AND_ASSIGN(ReadingListStoreDelegate);
 };
 
 #endif  // COMPONENTS_READING_LIST_IOS_READING_LIST_STORE_DELEGATE_H_
diff --git a/ios/chrome/browser/about_flags.mm b/ios/chrome/browser/about_flags.mm
index 493734a..eb01c74f 100644
--- a/ios/chrome/browser/about_flags.mm
+++ b/ios/chrome/browser/about_flags.mm
@@ -234,6 +234,13 @@
     command_line->AppendSwitch(switches::kDisablePaymentRequest);
   }
 
+  // Populate command line flags from Reading List.
+  if ([defaults boolForKey:@"EnableReadingList"]) {
+    command_line->AppendSwitch(reading_list::switches::kEnableReadingList);
+  } else {
+    command_line->AppendSwitch(reading_list::switches::kDisableReadingList);
+  }
+
   // Populate command line flag for Spotlight Actions.
   if ([defaults boolForKey:@"DisableSpotlightActions"]) {
     command_line->AppendSwitch(switches::kDisableSpotlightActions);
diff --git a/ios/chrome/browser/sync/ios_chrome_profile_sync_service_factory_unittest.cc b/ios/chrome/browser/sync/ios_chrome_profile_sync_service_factory_unittest.cc
index 07bed71..6bb725a 100644
--- a/ios/chrome/browser/sync/ios_chrome_profile_sync_service_factory_unittest.cc
+++ b/ios/chrome/browser/sync/ios_chrome_profile_sync_service_factory_unittest.cc
@@ -45,7 +45,6 @@
     datatypes.push_back(syncer::PASSWORDS);
     datatypes.push_back(syncer::PREFERENCES);
     datatypes.push_back(syncer::PRIORITY_PREFERENCES);
-    datatypes.push_back(syncer::READING_LIST);
     datatypes.push_back(syncer::SESSIONS);
     datatypes.push_back(syncer::PROXY_TABS);
     datatypes.push_back(syncer::TYPED_URLS);
diff --git a/third_party/WebKit/LayoutTests/fast/lists/list-marker-before-float-nested-rtl.html b/third_party/WebKit/LayoutTests/fast/lists/list-marker-before-float-nested-rtl.html
new file mode 100644
index 0000000..b48ff0c
--- /dev/null
+++ b/third_party/WebKit/LayoutTests/fast/lists/list-marker-before-float-nested-rtl.html
@@ -0,0 +1,14 @@
+<!DOCTYPE html>
+<p>crbug.com/548616: List markers shouldn't shift to avoid floats that come after them on a line.</p>
+<ol dir=rtl>
+  <li>
+    <img width=20 height=20 style="float: right; background-color:black;">
+    <li>
+      <img width=20 height=20 style="float: right; background-color:black;">
+    </li>
+  </li>
+  <li>
+    <img width=20 height=20 style="float: right; background-color:black;">
+  </li>
+</ol>
+
diff --git a/third_party/WebKit/LayoutTests/fast/lists/list-marker-before-float-nested.html b/third_party/WebKit/LayoutTests/fast/lists/list-marker-before-float-nested.html
new file mode 100644
index 0000000..1345c3ed
--- /dev/null
+++ b/third_party/WebKit/LayoutTests/fast/lists/list-marker-before-float-nested.html
@@ -0,0 +1,14 @@
+<!DOCTYPE html>
+<p>crbug.com/548616: List markers shouldn't shift to avoid floats that come after them on a line.</p>
+<ol>
+  <li>
+    <img width=20 height=20 style="float: left; background-color:black;">
+    <li>
+      <img width=20 height=20 style="float: left; background-color:black;">
+    </li>
+  </li>
+  <li>
+    <img width=20 height=20 style="float: left; background-color:black;">
+  </li>
+</ol>
+
diff --git a/third_party/WebKit/LayoutTests/fast/lists/list-marker-before-float-rtl.html b/third_party/WebKit/LayoutTests/fast/lists/list-marker-before-float-rtl.html
new file mode 100644
index 0000000..7de36198
--- /dev/null
+++ b/third_party/WebKit/LayoutTests/fast/lists/list-marker-before-float-rtl.html
@@ -0,0 +1,8 @@
+<!DOCTYPE html>
+<p>crbug.com/548616: List markers shouldn't shift to avoid floats that come after them on a line.</p>
+<ol dir=rtl>
+  <li>
+    <img width=20 height=20 style="float: right; background-color:black;">
+  </li>
+</ol>
+
diff --git a/third_party/WebKit/LayoutTests/fast/lists/list-marker-before-float.html b/third_party/WebKit/LayoutTests/fast/lists/list-marker-before-float.html
new file mode 100644
index 0000000..315a479
--- /dev/null
+++ b/third_party/WebKit/LayoutTests/fast/lists/list-marker-before-float.html
@@ -0,0 +1,8 @@
+<!DOCTYPE html>
+<p>crbug.com/548616: List markers shouldn't shift to avoid floats that come after them on a line.</p>
+<ol>
+  <li>
+    <img width=20 height=20 style="float: left; background-color:black;">
+  </li>
+</ol>
+
diff --git a/third_party/WebKit/LayoutTests/paint/invalidation/caret-contenteditable-content-after.html b/third_party/WebKit/LayoutTests/paint/invalidation/caret-contenteditable-content-after.html
new file mode 100644
index 0000000..cfe97b1
--- /dev/null
+++ b/third_party/WebKit/LayoutTests/paint/invalidation/caret-contenteditable-content-after.html
@@ -0,0 +1,21 @@
+<!DOCTYPE html>
+<script src="resources/text-based-repaint.js"></script>
+<script>
+function repaintTest() {
+  editor.focus();
+  if (!window.eventSender)
+    return;
+  eventSender.keyDown('a');
+  eventSender.keyDown('b');
+  eventSender.keyDown('c');
+}
+onload = runRepaintAndPixelTest;
+</script>
+<style>
+#editor:after {
+  content:"x";
+}
+</style>
+Test passes if caret is visible after the 'c' but before the 'x'.<br>
+To reproduce manually, type 'abc'.
+<div id="editor" contenteditable="true"></div>
diff --git a/third_party/WebKit/LayoutTests/platform/linux/fast/lists/list-marker-before-float-expected.png b/third_party/WebKit/LayoutTests/platform/linux/fast/lists/list-marker-before-float-expected.png
new file mode 100644
index 0000000..beb9d13
--- /dev/null
+++ b/third_party/WebKit/LayoutTests/platform/linux/fast/lists/list-marker-before-float-expected.png
Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/linux/fast/lists/list-marker-before-float-expected.txt b/third_party/WebKit/LayoutTests/platform/linux/fast/lists/list-marker-before-float-expected.txt
new file mode 100644
index 0000000..87f446f
--- /dev/null
+++ b/third_party/WebKit/LayoutTests/platform/linux/fast/lists/list-marker-before-float-expected.txt
@@ -0,0 +1,12 @@
+layer at (0,0) size 800x600
+  LayoutView at (0,0) size 800x600
+layer at (0,0) size 800x88
+  LayoutBlockFlow {HTML} at (0,0) size 800x88
+    LayoutBlockFlow {BODY} at (8,16) size 784x56
+      LayoutBlockFlow {P} at (0,0) size 784x20
+        LayoutText {#text} at (0,0) size 557x19
+          text run at (0,0) width 557: "crbug.com/548616: List markers shouldn't shift to avoid floats that come after them on a line."
+      LayoutBlockFlow {OL} at (0,36) size 784x20
+        LayoutListItem {LI} at (40,0) size 744x20
+          LayoutListMarker (anonymous) at (-16,0) size 16x19: "1"
+          LayoutImage (floating) {IMG} at (0,0) size 20x20 [bgcolor=#000000]
diff --git a/third_party/WebKit/LayoutTests/platform/linux/fast/lists/list-marker-before-float-nested-expected.png b/third_party/WebKit/LayoutTests/platform/linux/fast/lists/list-marker-before-float-nested-expected.png
new file mode 100644
index 0000000..902e515c
--- /dev/null
+++ b/third_party/WebKit/LayoutTests/platform/linux/fast/lists/list-marker-before-float-nested-expected.png
Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/linux/fast/lists/list-marker-before-float-nested-expected.txt b/third_party/WebKit/LayoutTests/platform/linux/fast/lists/list-marker-before-float-nested-expected.txt
new file mode 100644
index 0000000..aeb3a12
--- /dev/null
+++ b/third_party/WebKit/LayoutTests/platform/linux/fast/lists/list-marker-before-float-nested-expected.txt
@@ -0,0 +1,18 @@
+layer at (0,0) size 800x600
+  LayoutView at (0,0) size 800x600
+layer at (0,0) size 800x128
+  LayoutBlockFlow {HTML} at (0,0) size 800x128
+    LayoutBlockFlow {BODY} at (8,16) size 784x96
+      LayoutBlockFlow {P} at (0,0) size 784x20
+        LayoutText {#text} at (0,0) size 557x19
+          text run at (0,0) width 557: "crbug.com/548616: List markers shouldn't shift to avoid floats that come after them on a line."
+      LayoutBlockFlow {OL} at (0,36) size 784x60
+        LayoutListItem {LI} at (40,0) size 744x20
+          LayoutListMarker (anonymous) at (-16,0) size 16x19: "1"
+          LayoutImage (floating) {IMG} at (0,0) size 20x20 [bgcolor=#000000]
+        LayoutListItem {LI} at (40,20) size 744x20
+          LayoutListMarker (anonymous) at (-16,0) size 16x19: "2"
+          LayoutImage (floating) {IMG} at (0,0) size 20x20 [bgcolor=#000000]
+        LayoutListItem {LI} at (40,40) size 744x20
+          LayoutListMarker (anonymous) at (-16,0) size 16x19: "3"
+          LayoutImage (floating) {IMG} at (0,0) size 20x20 [bgcolor=#000000]
diff --git a/third_party/WebKit/LayoutTests/platform/linux/fast/lists/list-marker-before-float-nested-rtl-expected.png b/third_party/WebKit/LayoutTests/platform/linux/fast/lists/list-marker-before-float-nested-rtl-expected.png
new file mode 100644
index 0000000..082f531
--- /dev/null
+++ b/third_party/WebKit/LayoutTests/platform/linux/fast/lists/list-marker-before-float-nested-rtl-expected.png
Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/linux/fast/lists/list-marker-before-float-nested-rtl-expected.txt b/third_party/WebKit/LayoutTests/platform/linux/fast/lists/list-marker-before-float-nested-rtl-expected.txt
new file mode 100644
index 0000000..24e5bde
--- /dev/null
+++ b/third_party/WebKit/LayoutTests/platform/linux/fast/lists/list-marker-before-float-nested-rtl-expected.txt
@@ -0,0 +1,18 @@
+layer at (0,0) size 800x600
+  LayoutView at (0,0) size 800x600
+layer at (0,0) size 800x128
+  LayoutBlockFlow {HTML} at (0,0) size 800x128
+    LayoutBlockFlow {BODY} at (8,16) size 784x96
+      LayoutBlockFlow {P} at (0,0) size 784x20
+        LayoutText {#text} at (0,0) size 557x19
+          text run at (0,0) width 557: "crbug.com/548616: List markers shouldn't shift to avoid floats that come after them on a line."
+      LayoutBlockFlow {OL} at (0,36) size 784x60
+        LayoutListItem {LI} at (0,0) size 744x20
+          LayoutListMarker (anonymous) at (744,0) size 16x19: "1"
+          LayoutImage (floating) {IMG} at (724,0) size 20x20 [bgcolor=#000000]
+        LayoutListItem {LI} at (0,20) size 744x20
+          LayoutListMarker (anonymous) at (744,0) size 16x19: "2"
+          LayoutImage (floating) {IMG} at (724,0) size 20x20 [bgcolor=#000000]
+        LayoutListItem {LI} at (0,40) size 744x20
+          LayoutListMarker (anonymous) at (744,0) size 16x19: "3"
+          LayoutImage (floating) {IMG} at (724,0) size 20x20 [bgcolor=#000000]
diff --git a/third_party/WebKit/LayoutTests/platform/linux/fast/lists/list-marker-before-float-rtl-expected.png b/third_party/WebKit/LayoutTests/platform/linux/fast/lists/list-marker-before-float-rtl-expected.png
new file mode 100644
index 0000000..a667d38
--- /dev/null
+++ b/third_party/WebKit/LayoutTests/platform/linux/fast/lists/list-marker-before-float-rtl-expected.png
Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/linux/fast/lists/list-marker-before-float-rtl-expected.txt b/third_party/WebKit/LayoutTests/platform/linux/fast/lists/list-marker-before-float-rtl-expected.txt
new file mode 100644
index 0000000..a7a7e615
--- /dev/null
+++ b/third_party/WebKit/LayoutTests/platform/linux/fast/lists/list-marker-before-float-rtl-expected.txt
@@ -0,0 +1,12 @@
+layer at (0,0) size 800x600
+  LayoutView at (0,0) size 800x600
+layer at (0,0) size 800x88
+  LayoutBlockFlow {HTML} at (0,0) size 800x88
+    LayoutBlockFlow {BODY} at (8,16) size 784x56
+      LayoutBlockFlow {P} at (0,0) size 784x20
+        LayoutText {#text} at (0,0) size 557x19
+          text run at (0,0) width 557: "crbug.com/548616: List markers shouldn't shift to avoid floats that come after them on a line."
+      LayoutBlockFlow {OL} at (0,36) size 784x20
+        LayoutListItem {LI} at (0,0) size 744x20
+          LayoutListMarker (anonymous) at (744,0) size 16x19: "1"
+          LayoutImage (floating) {IMG} at (724,0) size 20x20 [bgcolor=#000000]
diff --git a/third_party/WebKit/LayoutTests/platform/linux/paint/invalidation/caret-contenteditable-content-after-expected.png b/third_party/WebKit/LayoutTests/platform/linux/paint/invalidation/caret-contenteditable-content-after-expected.png
new file mode 100644
index 0000000..396492f
--- /dev/null
+++ b/third_party/WebKit/LayoutTests/platform/linux/paint/invalidation/caret-contenteditable-content-after-expected.png
Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/linux/paint/invalidation/caret-contenteditable-content-after-expected.txt b/third_party/WebKit/LayoutTests/platform/linux/paint/invalidation/caret-contenteditable-content-after-expected.txt
new file mode 100644
index 0000000..3369299
--- /dev/null
+++ b/third_party/WebKit/LayoutTests/platform/linux/paint/invalidation/caret-contenteditable-content-after-expected.txt
@@ -0,0 +1,295 @@
+{
+  "layers": [
+    {
+      "name": "LayoutView #document",
+      "bounds": [800, 600],
+      "contentsOpaque": true,
+      "drawsContent": true,
+      "paintInvalidations": [
+        {
+          "object": "LayoutBlockFlow DIV id='editor'",
+          "rect": [7, 47, 786, 22],
+          "reason": "style change"
+        },
+        {
+          "object": "LayoutBlockFlow DIV id='editor'",
+          "rect": [7, 47, 786, 22],
+          "reason": "forced by layout"
+        },
+        {
+          "object": "LayoutBlockFlow DIV id='editor'",
+          "rect": [7, 47, 786, 22],
+          "reason": "forced by layout"
+        },
+        {
+          "object": "LayoutBlockFlow DIV id='editor'",
+          "rect": [7, 47, 786, 22],
+          "reason": "forced by layout"
+        },
+        {
+          "object": "LayoutText #text",
+          "rect": [8, 48, 22, 19],
+          "reason": "full"
+        },
+        {
+          "object": "LayoutText #text",
+          "rect": [8, 48, 15, 19],
+          "reason": "full"
+        },
+        {
+          "object": "LayoutTextFragment (anonymous)",
+          "rect": [30, 48, 7, 19],
+          "reason": "forced by layout"
+        },
+        {
+          "object": "LayoutTextFragment (anonymous)",
+          "rect": [23, 48, 7, 19],
+          "reason": "forced by layout"
+        },
+        {
+          "object": "LayoutTextFragment (anonymous)",
+          "rect": [23, 48, 7, 19],
+          "reason": "forced by layout"
+        },
+        {
+          "object": "LayoutTextFragment (anonymous)",
+          "rect": [15, 48, 7, 19],
+          "reason": "forced by layout"
+        },
+        {
+          "object": "LayoutTextFragment (anonymous)",
+          "rect": [15, 48, 7, 19],
+          "reason": "forced by layout"
+        },
+        {
+          "object": "LayoutText #text",
+          "rect": [8, 48, 7, 19],
+          "reason": "layoutObject insertion"
+        },
+        {
+          "object": "LayoutTextFragment (anonymous)",
+          "rect": [8, 48, 7, 19],
+          "reason": "forced by layout"
+        },
+        {
+          "object": "LayoutBlockFlow DIV id='editor'",
+          "rect": [7, 47, 3, 22],
+          "reason": "invalidate paint rectangle"
+        },
+        {
+          "object": "LayoutBlockFlow DIV id='editor'",
+          "rect": [7, 47, 3, 22],
+          "reason": "invalidate paint rectangle"
+        },
+        {
+          "object": "LayoutBlockFlow DIV id='editor'",
+          "rect": [7, 47, 3, 22],
+          "reason": "invalidate paint rectangle"
+        },
+        {
+          "object": "LayoutBlockFlow DIV id='editor'",
+          "rect": [7, 47, 3, 22],
+          "reason": "invalidate paint rectangle"
+        },
+        {
+          "object": "LayoutText #text",
+          "rect": [29, 47, 3, 21],
+          "reason": "invalidate paint rectangle"
+        },
+        {
+          "object": "LayoutText #text",
+          "rect": [29, 47, 3, 21],
+          "reason": "invalidate paint rectangle"
+        },
+        {
+          "object": "LayoutText #text",
+          "rect": [29, 47, 3, 21],
+          "reason": "invalidate paint rectangle"
+        },
+        {
+          "object": "LayoutText #text",
+          "rect": [22, 47, 3, 21],
+          "reason": "invalidate paint rectangle"
+        },
+        {
+          "object": "LayoutText #text",
+          "rect": [22, 47, 3, 21],
+          "reason": "invalidate paint rectangle"
+        },
+        {
+          "object": "LayoutText #text",
+          "rect": [22, 47, 3, 21],
+          "reason": "invalidate paint rectangle"
+        },
+        {
+          "object": "LayoutText #text",
+          "rect": [22, 47, 3, 21],
+          "reason": "invalidate paint rectangle"
+        },
+        {
+          "object": "LayoutText #text",
+          "rect": [14, 47, 3, 21],
+          "reason": "invalidate paint rectangle"
+        },
+        {
+          "object": "LayoutText #text",
+          "rect": [14, 47, 3, 21],
+          "reason": "invalidate paint rectangle"
+        },
+        {
+          "object": "LayoutText #text",
+          "rect": [14, 47, 3, 21],
+          "reason": "invalidate paint rectangle"
+        },
+        {
+          "object": "LayoutText #text",
+          "rect": [14, 47, 3, 21],
+          "reason": "invalidate paint rectangle"
+        }
+      ]
+    }
+  ],
+  "objectPaintInvalidations": [
+    {
+      "object": "Caret",
+      "reason": "invalidate paint rectangle"
+    },
+    {
+      "object": "LayoutBlockFlow DIV id='editor'",
+      "reason": "style change"
+    },
+    {
+      "object": "RootInlineBox",
+      "reason": "style change"
+    },
+    {
+      "object": "Caret",
+      "reason": "invalidate paint rectangle"
+    },
+    {
+      "object": "Caret",
+      "reason": "invalidate paint rectangle"
+    },
+    {
+      "object": "Caret",
+      "reason": "invalidate paint rectangle"
+    },
+    {
+      "object": "Caret",
+      "reason": "invalidate paint rectangle"
+    },
+    {
+      "object": "LayoutBlockFlow DIV id='editor'",
+      "reason": "forced by layout"
+    },
+    {
+      "object": "RootInlineBox",
+      "reason": "forced by layout"
+    },
+    {
+      "object": "Caret",
+      "reason": "invalidate paint rectangle"
+    },
+    {
+      "object": "Caret",
+      "reason": "invalidate paint rectangle"
+    },
+    {
+      "object": "LayoutText #text",
+      "reason": "layoutObject insertion"
+    },
+    {
+      "object": "InlineTextBox 'a'",
+      "reason": "layoutObject insertion"
+    },
+    {
+      "object": "LayoutTextFragment (anonymous)",
+      "reason": "forced by layout"
+    },
+    {
+      "object": "InlineTextBox 'x'",
+      "reason": "forced by layout"
+    },
+    {
+      "object": "Caret",
+      "reason": "invalidate paint rectangle"
+    },
+    {
+      "object": "Caret",
+      "reason": "invalidate paint rectangle"
+    },
+    {
+      "object": "LayoutBlockFlow DIV id='editor'",
+      "reason": "forced by layout"
+    },
+    {
+      "object": "RootInlineBox",
+      "reason": "forced by layout"
+    },
+    {
+      "object": "Caret",
+      "reason": "invalidate paint rectangle"
+    },
+    {
+      "object": "Caret",
+      "reason": "invalidate paint rectangle"
+    },
+    {
+      "object": "LayoutText #text",
+      "reason": "full"
+    },
+    {
+      "object": "InlineTextBox 'ab'",
+      "reason": "full"
+    },
+    {
+      "object": "LayoutTextFragment (anonymous)",
+      "reason": "forced by layout"
+    },
+    {
+      "object": "InlineTextBox 'x'",
+      "reason": "forced by layout"
+    },
+    {
+      "object": "Caret",
+      "reason": "invalidate paint rectangle"
+    },
+    {
+      "object": "Caret",
+      "reason": "invalidate paint rectangle"
+    },
+    {
+      "object": "LayoutBlockFlow DIV id='editor'",
+      "reason": "forced by layout"
+    },
+    {
+      "object": "RootInlineBox",
+      "reason": "forced by layout"
+    },
+    {
+      "object": "Caret",
+      "reason": "invalidate paint rectangle"
+    },
+    {
+      "object": "Caret",
+      "reason": "invalidate paint rectangle"
+    },
+    {
+      "object": "LayoutText #text",
+      "reason": "full"
+    },
+    {
+      "object": "InlineTextBox 'abc'",
+      "reason": "full"
+    },
+    {
+      "object": "LayoutTextFragment (anonymous)",
+      "reason": "forced by layout"
+    },
+    {
+      "object": "InlineTextBox 'x'",
+      "reason": "forced by layout"
+    }
+  ]
+}
+
diff --git a/third_party/WebKit/LayoutTests/platform/linux/virtual/spinvalidation/paint/invalidation/caret-contenteditable-content-after-expected.png b/third_party/WebKit/LayoutTests/platform/linux/virtual/spinvalidation/paint/invalidation/caret-contenteditable-content-after-expected.png
new file mode 100644
index 0000000..396492f
--- /dev/null
+++ b/third_party/WebKit/LayoutTests/platform/linux/virtual/spinvalidation/paint/invalidation/caret-contenteditable-content-after-expected.png
Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/linux/virtual/spinvalidation/paint/invalidation/caret-contenteditable-content-after-expected.txt b/third_party/WebKit/LayoutTests/platform/linux/virtual/spinvalidation/paint/invalidation/caret-contenteditable-content-after-expected.txt
new file mode 100644
index 0000000..3369299
--- /dev/null
+++ b/third_party/WebKit/LayoutTests/platform/linux/virtual/spinvalidation/paint/invalidation/caret-contenteditable-content-after-expected.txt
@@ -0,0 +1,295 @@
+{
+  "layers": [
+    {
+      "name": "LayoutView #document",
+      "bounds": [800, 600],
+      "contentsOpaque": true,
+      "drawsContent": true,
+      "paintInvalidations": [
+        {
+          "object": "LayoutBlockFlow DIV id='editor'",
+          "rect": [7, 47, 786, 22],
+          "reason": "style change"
+        },
+        {
+          "object": "LayoutBlockFlow DIV id='editor'",
+          "rect": [7, 47, 786, 22],
+          "reason": "forced by layout"
+        },
+        {
+          "object": "LayoutBlockFlow DIV id='editor'",
+          "rect": [7, 47, 786, 22],
+          "reason": "forced by layout"
+        },
+        {
+          "object": "LayoutBlockFlow DIV id='editor'",
+          "rect": [7, 47, 786, 22],
+          "reason": "forced by layout"
+        },
+        {
+          "object": "LayoutText #text",
+          "rect": [8, 48, 22, 19],
+          "reason": "full"
+        },
+        {
+          "object": "LayoutText #text",
+          "rect": [8, 48, 15, 19],
+          "reason": "full"
+        },
+        {
+          "object": "LayoutTextFragment (anonymous)",
+          "rect": [30, 48, 7, 19],
+          "reason": "forced by layout"
+        },
+        {
+          "object": "LayoutTextFragment (anonymous)",
+          "rect": [23, 48, 7, 19],
+          "reason": "forced by layout"
+        },
+        {
+          "object": "LayoutTextFragment (anonymous)",
+          "rect": [23, 48, 7, 19],
+          "reason": "forced by layout"
+        },
+        {
+          "object": "LayoutTextFragment (anonymous)",
+          "rect": [15, 48, 7, 19],
+          "reason": "forced by layout"
+        },
+        {
+          "object": "LayoutTextFragment (anonymous)",
+          "rect": [15, 48, 7, 19],
+          "reason": "forced by layout"
+        },
+        {
+          "object": "LayoutText #text",
+          "rect": [8, 48, 7, 19],
+          "reason": "layoutObject insertion"
+        },
+        {
+          "object": "LayoutTextFragment (anonymous)",
+          "rect": [8, 48, 7, 19],
+          "reason": "forced by layout"
+        },
+        {
+          "object": "LayoutBlockFlow DIV id='editor'",
+          "rect": [7, 47, 3, 22],
+          "reason": "invalidate paint rectangle"
+        },
+        {
+          "object": "LayoutBlockFlow DIV id='editor'",
+          "rect": [7, 47, 3, 22],
+          "reason": "invalidate paint rectangle"
+        },
+        {
+          "object": "LayoutBlockFlow DIV id='editor'",
+          "rect": [7, 47, 3, 22],
+          "reason": "invalidate paint rectangle"
+        },
+        {
+          "object": "LayoutBlockFlow DIV id='editor'",
+          "rect": [7, 47, 3, 22],
+          "reason": "invalidate paint rectangle"
+        },
+        {
+          "object": "LayoutText #text",
+          "rect": [29, 47, 3, 21],
+          "reason": "invalidate paint rectangle"
+        },
+        {
+          "object": "LayoutText #text",
+          "rect": [29, 47, 3, 21],
+          "reason": "invalidate paint rectangle"
+        },
+        {
+          "object": "LayoutText #text",
+          "rect": [29, 47, 3, 21],
+          "reason": "invalidate paint rectangle"
+        },
+        {
+          "object": "LayoutText #text",
+          "rect": [22, 47, 3, 21],
+          "reason": "invalidate paint rectangle"
+        },
+        {
+          "object": "LayoutText #text",
+          "rect": [22, 47, 3, 21],
+          "reason": "invalidate paint rectangle"
+        },
+        {
+          "object": "LayoutText #text",
+          "rect": [22, 47, 3, 21],
+          "reason": "invalidate paint rectangle"
+        },
+        {
+          "object": "LayoutText #text",
+          "rect": [22, 47, 3, 21],
+          "reason": "invalidate paint rectangle"
+        },
+        {
+          "object": "LayoutText #text",
+          "rect": [14, 47, 3, 21],
+          "reason": "invalidate paint rectangle"
+        },
+        {
+          "object": "LayoutText #text",
+          "rect": [14, 47, 3, 21],
+          "reason": "invalidate paint rectangle"
+        },
+        {
+          "object": "LayoutText #text",
+          "rect": [14, 47, 3, 21],
+          "reason": "invalidate paint rectangle"
+        },
+        {
+          "object": "LayoutText #text",
+          "rect": [14, 47, 3, 21],
+          "reason": "invalidate paint rectangle"
+        }
+      ]
+    }
+  ],
+  "objectPaintInvalidations": [
+    {
+      "object": "Caret",
+      "reason": "invalidate paint rectangle"
+    },
+    {
+      "object": "LayoutBlockFlow DIV id='editor'",
+      "reason": "style change"
+    },
+    {
+      "object": "RootInlineBox",
+      "reason": "style change"
+    },
+    {
+      "object": "Caret",
+      "reason": "invalidate paint rectangle"
+    },
+    {
+      "object": "Caret",
+      "reason": "invalidate paint rectangle"
+    },
+    {
+      "object": "Caret",
+      "reason": "invalidate paint rectangle"
+    },
+    {
+      "object": "Caret",
+      "reason": "invalidate paint rectangle"
+    },
+    {
+      "object": "LayoutBlockFlow DIV id='editor'",
+      "reason": "forced by layout"
+    },
+    {
+      "object": "RootInlineBox",
+      "reason": "forced by layout"
+    },
+    {
+      "object": "Caret",
+      "reason": "invalidate paint rectangle"
+    },
+    {
+      "object": "Caret",
+      "reason": "invalidate paint rectangle"
+    },
+    {
+      "object": "LayoutText #text",
+      "reason": "layoutObject insertion"
+    },
+    {
+      "object": "InlineTextBox 'a'",
+      "reason": "layoutObject insertion"
+    },
+    {
+      "object": "LayoutTextFragment (anonymous)",
+      "reason": "forced by layout"
+    },
+    {
+      "object": "InlineTextBox 'x'",
+      "reason": "forced by layout"
+    },
+    {
+      "object": "Caret",
+      "reason": "invalidate paint rectangle"
+    },
+    {
+      "object": "Caret",
+      "reason": "invalidate paint rectangle"
+    },
+    {
+      "object": "LayoutBlockFlow DIV id='editor'",
+      "reason": "forced by layout"
+    },
+    {
+      "object": "RootInlineBox",
+      "reason": "forced by layout"
+    },
+    {
+      "object": "Caret",
+      "reason": "invalidate paint rectangle"
+    },
+    {
+      "object": "Caret",
+      "reason": "invalidate paint rectangle"
+    },
+    {
+      "object": "LayoutText #text",
+      "reason": "full"
+    },
+    {
+      "object": "InlineTextBox 'ab'",
+      "reason": "full"
+    },
+    {
+      "object": "LayoutTextFragment (anonymous)",
+      "reason": "forced by layout"
+    },
+    {
+      "object": "InlineTextBox 'x'",
+      "reason": "forced by layout"
+    },
+    {
+      "object": "Caret",
+      "reason": "invalidate paint rectangle"
+    },
+    {
+      "object": "Caret",
+      "reason": "invalidate paint rectangle"
+    },
+    {
+      "object": "LayoutBlockFlow DIV id='editor'",
+      "reason": "forced by layout"
+    },
+    {
+      "object": "RootInlineBox",
+      "reason": "forced by layout"
+    },
+    {
+      "object": "Caret",
+      "reason": "invalidate paint rectangle"
+    },
+    {
+      "object": "Caret",
+      "reason": "invalidate paint rectangle"
+    },
+    {
+      "object": "LayoutText #text",
+      "reason": "full"
+    },
+    {
+      "object": "InlineTextBox 'abc'",
+      "reason": "full"
+    },
+    {
+      "object": "LayoutTextFragment (anonymous)",
+      "reason": "forced by layout"
+    },
+    {
+      "object": "InlineTextBox 'x'",
+      "reason": "forced by layout"
+    }
+  ]
+}
+
diff --git a/third_party/WebKit/LayoutTests/platform/mac/fast/lists/list-marker-before-float-expected.png b/third_party/WebKit/LayoutTests/platform/mac/fast/lists/list-marker-before-float-expected.png
new file mode 100644
index 0000000..0ff5de8
--- /dev/null
+++ b/third_party/WebKit/LayoutTests/platform/mac/fast/lists/list-marker-before-float-expected.png
Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac/fast/lists/list-marker-before-float-expected.txt b/third_party/WebKit/LayoutTests/platform/mac/fast/lists/list-marker-before-float-expected.txt
new file mode 100644
index 0000000..ad462ac
--- /dev/null
+++ b/third_party/WebKit/LayoutTests/platform/mac/fast/lists/list-marker-before-float-expected.txt
@@ -0,0 +1,12 @@
+layer at (0,0) size 800x600
+  LayoutView at (0,0) size 800x600
+layer at (0,0) size 800x84
+  LayoutBlockFlow {HTML} at (0,0) size 800x84
+    LayoutBlockFlow {BODY} at (8,16) size 784x52
+      LayoutBlockFlow {P} at (0,0) size 784x18
+        LayoutText {#text} at (0,0) size 598x18
+          text run at (0,0) width 598: "crbug.com/548616: List markers shouldn't shift to avoid floats that come after them on a line."
+      LayoutBlockFlow {OL} at (0,34) size 784x18
+        LayoutListItem {LI} at (40,0) size 744x18
+          LayoutListMarker (anonymous) at (-16,0) size 16x18: "1"
+          LayoutImage (floating) {IMG} at (0,0) size 20x20 [bgcolor=#000000]
diff --git a/third_party/WebKit/LayoutTests/platform/mac/fast/lists/list-marker-before-float-nested-expected.png b/third_party/WebKit/LayoutTests/platform/mac/fast/lists/list-marker-before-float-nested-expected.png
new file mode 100644
index 0000000..0a81773
--- /dev/null
+++ b/third_party/WebKit/LayoutTests/platform/mac/fast/lists/list-marker-before-float-nested-expected.png
Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac/fast/lists/list-marker-before-float-nested-expected.txt b/third_party/WebKit/LayoutTests/platform/mac/fast/lists/list-marker-before-float-nested-expected.txt
new file mode 100644
index 0000000..f7a6af1
--- /dev/null
+++ b/third_party/WebKit/LayoutTests/platform/mac/fast/lists/list-marker-before-float-nested-expected.txt
@@ -0,0 +1,18 @@
+layer at (0,0) size 800x600
+  LayoutView at (0,0) size 800x600
+layer at (0,0) size 800x120
+  LayoutBlockFlow {HTML} at (0,0) size 800x120
+    LayoutBlockFlow {BODY} at (8,16) size 784x88
+      LayoutBlockFlow {P} at (0,0) size 784x18
+        LayoutText {#text} at (0,0) size 598x18
+          text run at (0,0) width 598: "crbug.com/548616: List markers shouldn't shift to avoid floats that come after them on a line."
+      LayoutBlockFlow {OL} at (0,34) size 784x54
+        LayoutListItem {LI} at (40,0) size 744x18
+          LayoutListMarker (anonymous) at (-16,0) size 16x18: "1"
+          LayoutImage (floating) {IMG} at (0,0) size 20x20 [bgcolor=#000000]
+        LayoutListItem {LI} at (40,18) size 744x18
+          LayoutListMarker (anonymous) at (4,0) size 16x18: "2"
+          LayoutImage (floating) {IMG} at (20,0) size 20x20 [bgcolor=#000000]
+        LayoutListItem {LI} at (40,36) size 744x18
+          LayoutListMarker (anonymous) at (24,0) size 16x18: "3"
+          LayoutImage (floating) {IMG} at (40,0) size 20x20 [bgcolor=#000000]
diff --git a/third_party/WebKit/LayoutTests/platform/mac/fast/lists/list-marker-before-float-nested-rtl-expected.png b/third_party/WebKit/LayoutTests/platform/mac/fast/lists/list-marker-before-float-nested-rtl-expected.png
new file mode 100644
index 0000000..6d40a81e
--- /dev/null
+++ b/third_party/WebKit/LayoutTests/platform/mac/fast/lists/list-marker-before-float-nested-rtl-expected.png
Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac/fast/lists/list-marker-before-float-nested-rtl-expected.txt b/third_party/WebKit/LayoutTests/platform/mac/fast/lists/list-marker-before-float-nested-rtl-expected.txt
new file mode 100644
index 0000000..afb82001
--- /dev/null
+++ b/third_party/WebKit/LayoutTests/platform/mac/fast/lists/list-marker-before-float-nested-rtl-expected.txt
@@ -0,0 +1,18 @@
+layer at (0,0) size 800x600
+  LayoutView at (0,0) size 800x600
+layer at (0,0) size 800x120
+  LayoutBlockFlow {HTML} at (0,0) size 800x120
+    LayoutBlockFlow {BODY} at (8,16) size 784x88
+      LayoutBlockFlow {P} at (0,0) size 784x18
+        LayoutText {#text} at (0,0) size 598x18
+          text run at (0,0) width 598: "crbug.com/548616: List markers shouldn't shift to avoid floats that come after them on a line."
+      LayoutBlockFlow {OL} at (0,34) size 784x54
+        LayoutListItem {LI} at (0,0) size 744x18
+          LayoutListMarker (anonymous) at (744,0) size 16x18: "1"
+          LayoutImage (floating) {IMG} at (724,0) size 20x20 [bgcolor=#000000]
+        LayoutListItem {LI} at (0,18) size 744x18
+          LayoutListMarker (anonymous) at (724,0) size 16x18: "2"
+          LayoutImage (floating) {IMG} at (704,0) size 20x20 [bgcolor=#000000]
+        LayoutListItem {LI} at (0,36) size 744x18
+          LayoutListMarker (anonymous) at (704,0) size 16x18: "3"
+          LayoutImage (floating) {IMG} at (684,0) size 20x20 [bgcolor=#000000]
diff --git a/third_party/WebKit/LayoutTests/platform/mac/fast/lists/list-marker-before-float-rtl-expected.png b/third_party/WebKit/LayoutTests/platform/mac/fast/lists/list-marker-before-float-rtl-expected.png
new file mode 100644
index 0000000..6bf476d8
--- /dev/null
+++ b/third_party/WebKit/LayoutTests/platform/mac/fast/lists/list-marker-before-float-rtl-expected.png
Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac/fast/lists/list-marker-before-float-rtl-expected.txt b/third_party/WebKit/LayoutTests/platform/mac/fast/lists/list-marker-before-float-rtl-expected.txt
new file mode 100644
index 0000000..d1830e4e
--- /dev/null
+++ b/third_party/WebKit/LayoutTests/platform/mac/fast/lists/list-marker-before-float-rtl-expected.txt
@@ -0,0 +1,12 @@
+layer at (0,0) size 800x600
+  LayoutView at (0,0) size 800x600
+layer at (0,0) size 800x84
+  LayoutBlockFlow {HTML} at (0,0) size 800x84
+    LayoutBlockFlow {BODY} at (8,16) size 784x52
+      LayoutBlockFlow {P} at (0,0) size 784x18
+        LayoutText {#text} at (0,0) size 598x18
+          text run at (0,0) width 598: "crbug.com/548616: List markers shouldn't shift to avoid floats that come after them on a line."
+      LayoutBlockFlow {OL} at (0,34) size 784x18
+        LayoutListItem {LI} at (0,0) size 744x18
+          LayoutListMarker (anonymous) at (744,0) size 16x18: "1"
+          LayoutImage (floating) {IMG} at (724,0) size 20x20 [bgcolor=#000000]
diff --git a/third_party/WebKit/LayoutTests/platform/mac/paint/invalidation/caret-contenteditable-content-after-expected.png b/third_party/WebKit/LayoutTests/platform/mac/paint/invalidation/caret-contenteditable-content-after-expected.png
new file mode 100644
index 0000000..da56c30
--- /dev/null
+++ b/third_party/WebKit/LayoutTests/platform/mac/paint/invalidation/caret-contenteditable-content-after-expected.png
Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac/paint/invalidation/caret-contenteditable-content-after-expected.txt b/third_party/WebKit/LayoutTests/platform/mac/paint/invalidation/caret-contenteditable-content-after-expected.txt
new file mode 100644
index 0000000..b99edf5
--- /dev/null
+++ b/third_party/WebKit/LayoutTests/platform/mac/paint/invalidation/caret-contenteditable-content-after-expected.txt
@@ -0,0 +1,295 @@
+{
+  "layers": [
+    {
+      "name": "LayoutView #document",
+      "bounds": [800, 600],
+      "contentsOpaque": true,
+      "drawsContent": true,
+      "paintInvalidations": [
+        {
+          "object": "LayoutBlockFlow DIV id='editor'",
+          "rect": [3, 39, 794, 28],
+          "reason": "style change"
+        },
+        {
+          "object": "LayoutBlockFlow DIV id='editor'",
+          "rect": [3, 39, 794, 28],
+          "reason": "forced by layout"
+        },
+        {
+          "object": "LayoutBlockFlow DIV id='editor'",
+          "rect": [3, 39, 794, 28],
+          "reason": "forced by layout"
+        },
+        {
+          "object": "LayoutBlockFlow DIV id='editor'",
+          "rect": [3, 39, 794, 28],
+          "reason": "forced by layout"
+        },
+        {
+          "object": "LayoutText #text",
+          "rect": [8, 44, 23, 18],
+          "reason": "full"
+        },
+        {
+          "object": "LayoutText #text",
+          "rect": [8, 44, 16, 18],
+          "reason": "full"
+        },
+        {
+          "object": "LayoutTextFragment (anonymous)",
+          "rect": [30, 44, 9, 18],
+          "reason": "forced by layout"
+        },
+        {
+          "object": "LayoutTextFragment (anonymous)",
+          "rect": [23, 44, 9, 18],
+          "reason": "forced by layout"
+        },
+        {
+          "object": "LayoutTextFragment (anonymous)",
+          "rect": [23, 44, 9, 18],
+          "reason": "forced by layout"
+        },
+        {
+          "object": "LayoutTextFragment (anonymous)",
+          "rect": [15, 44, 9, 18],
+          "reason": "forced by layout"
+        },
+        {
+          "object": "LayoutTextFragment (anonymous)",
+          "rect": [15, 44, 9, 18],
+          "reason": "forced by layout"
+        },
+        {
+          "object": "LayoutText #text",
+          "rect": [8, 44, 8, 18],
+          "reason": "layoutObject insertion"
+        },
+        {
+          "object": "LayoutTextFragment (anonymous)",
+          "rect": [8, 44, 8, 18],
+          "reason": "forced by layout"
+        },
+        {
+          "object": "LayoutText #text",
+          "rect": [29, 43, 3, 20],
+          "reason": "invalidate paint rectangle"
+        },
+        {
+          "object": "LayoutText #text",
+          "rect": [29, 43, 3, 20],
+          "reason": "invalidate paint rectangle"
+        },
+        {
+          "object": "LayoutText #text",
+          "rect": [29, 43, 3, 20],
+          "reason": "invalidate paint rectangle"
+        },
+        {
+          "object": "LayoutText #text",
+          "rect": [22, 43, 3, 20],
+          "reason": "invalidate paint rectangle"
+        },
+        {
+          "object": "LayoutText #text",
+          "rect": [22, 43, 3, 20],
+          "reason": "invalidate paint rectangle"
+        },
+        {
+          "object": "LayoutText #text",
+          "rect": [22, 43, 3, 20],
+          "reason": "invalidate paint rectangle"
+        },
+        {
+          "object": "LayoutText #text",
+          "rect": [22, 43, 3, 20],
+          "reason": "invalidate paint rectangle"
+        },
+        {
+          "object": "LayoutText #text",
+          "rect": [14, 43, 3, 20],
+          "reason": "invalidate paint rectangle"
+        },
+        {
+          "object": "LayoutText #text",
+          "rect": [14, 43, 3, 20],
+          "reason": "invalidate paint rectangle"
+        },
+        {
+          "object": "LayoutText #text",
+          "rect": [14, 43, 3, 20],
+          "reason": "invalidate paint rectangle"
+        },
+        {
+          "object": "LayoutText #text",
+          "rect": [14, 43, 3, 20],
+          "reason": "invalidate paint rectangle"
+        },
+        {
+          "object": "LayoutBlockFlow DIV id='editor'",
+          "rect": [7, 43, 3, 20],
+          "reason": "invalidate paint rectangle"
+        },
+        {
+          "object": "LayoutBlockFlow DIV id='editor'",
+          "rect": [7, 43, 3, 20],
+          "reason": "invalidate paint rectangle"
+        },
+        {
+          "object": "LayoutBlockFlow DIV id='editor'",
+          "rect": [7, 43, 3, 20],
+          "reason": "invalidate paint rectangle"
+        },
+        {
+          "object": "LayoutBlockFlow DIV id='editor'",
+          "rect": [7, 43, 3, 20],
+          "reason": "invalidate paint rectangle"
+        }
+      ]
+    }
+  ],
+  "objectPaintInvalidations": [
+    {
+      "object": "Caret",
+      "reason": "invalidate paint rectangle"
+    },
+    {
+      "object": "LayoutBlockFlow DIV id='editor'",
+      "reason": "style change"
+    },
+    {
+      "object": "RootInlineBox",
+      "reason": "style change"
+    },
+    {
+      "object": "Caret",
+      "reason": "invalidate paint rectangle"
+    },
+    {
+      "object": "Caret",
+      "reason": "invalidate paint rectangle"
+    },
+    {
+      "object": "Caret",
+      "reason": "invalidate paint rectangle"
+    },
+    {
+      "object": "Caret",
+      "reason": "invalidate paint rectangle"
+    },
+    {
+      "object": "LayoutBlockFlow DIV id='editor'",
+      "reason": "forced by layout"
+    },
+    {
+      "object": "RootInlineBox",
+      "reason": "forced by layout"
+    },
+    {
+      "object": "Caret",
+      "reason": "invalidate paint rectangle"
+    },
+    {
+      "object": "Caret",
+      "reason": "invalidate paint rectangle"
+    },
+    {
+      "object": "LayoutText #text",
+      "reason": "layoutObject insertion"
+    },
+    {
+      "object": "InlineTextBox 'a'",
+      "reason": "layoutObject insertion"
+    },
+    {
+      "object": "LayoutTextFragment (anonymous)",
+      "reason": "forced by layout"
+    },
+    {
+      "object": "InlineTextBox 'x'",
+      "reason": "forced by layout"
+    },
+    {
+      "object": "Caret",
+      "reason": "invalidate paint rectangle"
+    },
+    {
+      "object": "Caret",
+      "reason": "invalidate paint rectangle"
+    },
+    {
+      "object": "LayoutBlockFlow DIV id='editor'",
+      "reason": "forced by layout"
+    },
+    {
+      "object": "RootInlineBox",
+      "reason": "forced by layout"
+    },
+    {
+      "object": "Caret",
+      "reason": "invalidate paint rectangle"
+    },
+    {
+      "object": "Caret",
+      "reason": "invalidate paint rectangle"
+    },
+    {
+      "object": "LayoutText #text",
+      "reason": "full"
+    },
+    {
+      "object": "InlineTextBox 'ab'",
+      "reason": "full"
+    },
+    {
+      "object": "LayoutTextFragment (anonymous)",
+      "reason": "forced by layout"
+    },
+    {
+      "object": "InlineTextBox 'x'",
+      "reason": "forced by layout"
+    },
+    {
+      "object": "Caret",
+      "reason": "invalidate paint rectangle"
+    },
+    {
+      "object": "Caret",
+      "reason": "invalidate paint rectangle"
+    },
+    {
+      "object": "LayoutBlockFlow DIV id='editor'",
+      "reason": "forced by layout"
+    },
+    {
+      "object": "RootInlineBox",
+      "reason": "forced by layout"
+    },
+    {
+      "object": "Caret",
+      "reason": "invalidate paint rectangle"
+    },
+    {
+      "object": "Caret",
+      "reason": "invalidate paint rectangle"
+    },
+    {
+      "object": "LayoutText #text",
+      "reason": "full"
+    },
+    {
+      "object": "InlineTextBox 'abc'",
+      "reason": "full"
+    },
+    {
+      "object": "LayoutTextFragment (anonymous)",
+      "reason": "forced by layout"
+    },
+    {
+      "object": "InlineTextBox 'x'",
+      "reason": "forced by layout"
+    }
+  ]
+}
+
diff --git a/third_party/WebKit/LayoutTests/platform/mac/virtual/spinvalidation/paint/invalidation/caret-contenteditable-content-after-expected.png b/third_party/WebKit/LayoutTests/platform/mac/virtual/spinvalidation/paint/invalidation/caret-contenteditable-content-after-expected.png
new file mode 100644
index 0000000..da56c30
--- /dev/null
+++ b/third_party/WebKit/LayoutTests/platform/mac/virtual/spinvalidation/paint/invalidation/caret-contenteditable-content-after-expected.png
Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac/virtual/spinvalidation/paint/invalidation/caret-contenteditable-content-after-expected.txt b/third_party/WebKit/LayoutTests/platform/mac/virtual/spinvalidation/paint/invalidation/caret-contenteditable-content-after-expected.txt
new file mode 100644
index 0000000..b99edf5
--- /dev/null
+++ b/third_party/WebKit/LayoutTests/platform/mac/virtual/spinvalidation/paint/invalidation/caret-contenteditable-content-after-expected.txt
@@ -0,0 +1,295 @@
+{
+  "layers": [
+    {
+      "name": "LayoutView #document",
+      "bounds": [800, 600],
+      "contentsOpaque": true,
+      "drawsContent": true,
+      "paintInvalidations": [
+        {
+          "object": "LayoutBlockFlow DIV id='editor'",
+          "rect": [3, 39, 794, 28],
+          "reason": "style change"
+        },
+        {
+          "object": "LayoutBlockFlow DIV id='editor'",
+          "rect": [3, 39, 794, 28],
+          "reason": "forced by layout"
+        },
+        {
+          "object": "LayoutBlockFlow DIV id='editor'",
+          "rect": [3, 39, 794, 28],
+          "reason": "forced by layout"
+        },
+        {
+          "object": "LayoutBlockFlow DIV id='editor'",
+          "rect": [3, 39, 794, 28],
+          "reason": "forced by layout"
+        },
+        {
+          "object": "LayoutText #text",
+          "rect": [8, 44, 23, 18],
+          "reason": "full"
+        },
+        {
+          "object": "LayoutText #text",
+          "rect": [8, 44, 16, 18],
+          "reason": "full"
+        },
+        {
+          "object": "LayoutTextFragment (anonymous)",
+          "rect": [30, 44, 9, 18],
+          "reason": "forced by layout"
+        },
+        {
+          "object": "LayoutTextFragment (anonymous)",
+          "rect": [23, 44, 9, 18],
+          "reason": "forced by layout"
+        },
+        {
+          "object": "LayoutTextFragment (anonymous)",
+          "rect": [23, 44, 9, 18],
+          "reason": "forced by layout"
+        },
+        {
+          "object": "LayoutTextFragment (anonymous)",
+          "rect": [15, 44, 9, 18],
+          "reason": "forced by layout"
+        },
+        {
+          "object": "LayoutTextFragment (anonymous)",
+          "rect": [15, 44, 9, 18],
+          "reason": "forced by layout"
+        },
+        {
+          "object": "LayoutText #text",
+          "rect": [8, 44, 8, 18],
+          "reason": "layoutObject insertion"
+        },
+        {
+          "object": "LayoutTextFragment (anonymous)",
+          "rect": [8, 44, 8, 18],
+          "reason": "forced by layout"
+        },
+        {
+          "object": "LayoutText #text",
+          "rect": [29, 43, 3, 20],
+          "reason": "invalidate paint rectangle"
+        },
+        {
+          "object": "LayoutText #text",
+          "rect": [29, 43, 3, 20],
+          "reason": "invalidate paint rectangle"
+        },
+        {
+          "object": "LayoutText #text",
+          "rect": [29, 43, 3, 20],
+          "reason": "invalidate paint rectangle"
+        },
+        {
+          "object": "LayoutText #text",
+          "rect": [22, 43, 3, 20],
+          "reason": "invalidate paint rectangle"
+        },
+        {
+          "object": "LayoutText #text",
+          "rect": [22, 43, 3, 20],
+          "reason": "invalidate paint rectangle"
+        },
+        {
+          "object": "LayoutText #text",
+          "rect": [22, 43, 3, 20],
+          "reason": "invalidate paint rectangle"
+        },
+        {
+          "object": "LayoutText #text",
+          "rect": [22, 43, 3, 20],
+          "reason": "invalidate paint rectangle"
+        },
+        {
+          "object": "LayoutText #text",
+          "rect": [14, 43, 3, 20],
+          "reason": "invalidate paint rectangle"
+        },
+        {
+          "object": "LayoutText #text",
+          "rect": [14, 43, 3, 20],
+          "reason": "invalidate paint rectangle"
+        },
+        {
+          "object": "LayoutText #text",
+          "rect": [14, 43, 3, 20],
+          "reason": "invalidate paint rectangle"
+        },
+        {
+          "object": "LayoutText #text",
+          "rect": [14, 43, 3, 20],
+          "reason": "invalidate paint rectangle"
+        },
+        {
+          "object": "LayoutBlockFlow DIV id='editor'",
+          "rect": [7, 43, 3, 20],
+          "reason": "invalidate paint rectangle"
+        },
+        {
+          "object": "LayoutBlockFlow DIV id='editor'",
+          "rect": [7, 43, 3, 20],
+          "reason": "invalidate paint rectangle"
+        },
+        {
+          "object": "LayoutBlockFlow DIV id='editor'",
+          "rect": [7, 43, 3, 20],
+          "reason": "invalidate paint rectangle"
+        },
+        {
+          "object": "LayoutBlockFlow DIV id='editor'",
+          "rect": [7, 43, 3, 20],
+          "reason": "invalidate paint rectangle"
+        }
+      ]
+    }
+  ],
+  "objectPaintInvalidations": [
+    {
+      "object": "Caret",
+      "reason": "invalidate paint rectangle"
+    },
+    {
+      "object": "LayoutBlockFlow DIV id='editor'",
+      "reason": "style change"
+    },
+    {
+      "object": "RootInlineBox",
+      "reason": "style change"
+    },
+    {
+      "object": "Caret",
+      "reason": "invalidate paint rectangle"
+    },
+    {
+      "object": "Caret",
+      "reason": "invalidate paint rectangle"
+    },
+    {
+      "object": "Caret",
+      "reason": "invalidate paint rectangle"
+    },
+    {
+      "object": "Caret",
+      "reason": "invalidate paint rectangle"
+    },
+    {
+      "object": "LayoutBlockFlow DIV id='editor'",
+      "reason": "forced by layout"
+    },
+    {
+      "object": "RootInlineBox",
+      "reason": "forced by layout"
+    },
+    {
+      "object": "Caret",
+      "reason": "invalidate paint rectangle"
+    },
+    {
+      "object": "Caret",
+      "reason": "invalidate paint rectangle"
+    },
+    {
+      "object": "LayoutText #text",
+      "reason": "layoutObject insertion"
+    },
+    {
+      "object": "InlineTextBox 'a'",
+      "reason": "layoutObject insertion"
+    },
+    {
+      "object": "LayoutTextFragment (anonymous)",
+      "reason": "forced by layout"
+    },
+    {
+      "object": "InlineTextBox 'x'",
+      "reason": "forced by layout"
+    },
+    {
+      "object": "Caret",
+      "reason": "invalidate paint rectangle"
+    },
+    {
+      "object": "Caret",
+      "reason": "invalidate paint rectangle"
+    },
+    {
+      "object": "LayoutBlockFlow DIV id='editor'",
+      "reason": "forced by layout"
+    },
+    {
+      "object": "RootInlineBox",
+      "reason": "forced by layout"
+    },
+    {
+      "object": "Caret",
+      "reason": "invalidate paint rectangle"
+    },
+    {
+      "object": "Caret",
+      "reason": "invalidate paint rectangle"
+    },
+    {
+      "object": "LayoutText #text",
+      "reason": "full"
+    },
+    {
+      "object": "InlineTextBox 'ab'",
+      "reason": "full"
+    },
+    {
+      "object": "LayoutTextFragment (anonymous)",
+      "reason": "forced by layout"
+    },
+    {
+      "object": "InlineTextBox 'x'",
+      "reason": "forced by layout"
+    },
+    {
+      "object": "Caret",
+      "reason": "invalidate paint rectangle"
+    },
+    {
+      "object": "Caret",
+      "reason": "invalidate paint rectangle"
+    },
+    {
+      "object": "LayoutBlockFlow DIV id='editor'",
+      "reason": "forced by layout"
+    },
+    {
+      "object": "RootInlineBox",
+      "reason": "forced by layout"
+    },
+    {
+      "object": "Caret",
+      "reason": "invalidate paint rectangle"
+    },
+    {
+      "object": "Caret",
+      "reason": "invalidate paint rectangle"
+    },
+    {
+      "object": "LayoutText #text",
+      "reason": "full"
+    },
+    {
+      "object": "InlineTextBox 'abc'",
+      "reason": "full"
+    },
+    {
+      "object": "LayoutTextFragment (anonymous)",
+      "reason": "forced by layout"
+    },
+    {
+      "object": "InlineTextBox 'x'",
+      "reason": "forced by layout"
+    }
+  ]
+}
+
diff --git a/third_party/WebKit/LayoutTests/platform/win/fast/lists/list-marker-before-float-expected.png b/third_party/WebKit/LayoutTests/platform/win/fast/lists/list-marker-before-float-expected.png
new file mode 100644
index 0000000..3fc92bd9
--- /dev/null
+++ b/third_party/WebKit/LayoutTests/platform/win/fast/lists/list-marker-before-float-expected.png
Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/win/fast/lists/list-marker-before-float-expected.txt b/third_party/WebKit/LayoutTests/platform/win/fast/lists/list-marker-before-float-expected.txt
new file mode 100644
index 0000000..833fcd3
--- /dev/null
+++ b/third_party/WebKit/LayoutTests/platform/win/fast/lists/list-marker-before-float-expected.txt
@@ -0,0 +1,12 @@
+layer at (0,0) size 800x600
+  LayoutView at (0,0) size 800x600
+layer at (0,0) size 800x84
+  LayoutBlockFlow {HTML} at (0,0) size 800x84
+    LayoutBlockFlow {BODY} at (8,16) size 784x52
+      LayoutBlockFlow {P} at (0,0) size 784x18
+        LayoutText {#text} at (0,0) size 599x17
+          text run at (0,0) width 599: "crbug.com/548616: List markers shouldn't shift to avoid floats that come after them on a line."
+      LayoutBlockFlow {OL} at (0,34) size 784x18
+        LayoutListItem {LI} at (40,0) size 744x18
+          LayoutListMarker (anonymous) at (-16,0) size 16x17: "1"
+          LayoutImage (floating) {IMG} at (0,0) size 20x20 [bgcolor=#000000]
diff --git a/third_party/WebKit/LayoutTests/platform/win/fast/lists/list-marker-before-float-nested-expected.png b/third_party/WebKit/LayoutTests/platform/win/fast/lists/list-marker-before-float-nested-expected.png
new file mode 100644
index 0000000..6595519
--- /dev/null
+++ b/third_party/WebKit/LayoutTests/platform/win/fast/lists/list-marker-before-float-nested-expected.png
Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/win/fast/lists/list-marker-before-float-nested-expected.txt b/third_party/WebKit/LayoutTests/platform/win/fast/lists/list-marker-before-float-nested-expected.txt
new file mode 100644
index 0000000..10b119f
--- /dev/null
+++ b/third_party/WebKit/LayoutTests/platform/win/fast/lists/list-marker-before-float-nested-expected.txt
@@ -0,0 +1,18 @@
+layer at (0,0) size 800x600
+  LayoutView at (0,0) size 800x600
+layer at (0,0) size 800x120
+  LayoutBlockFlow {HTML} at (0,0) size 800x120
+    LayoutBlockFlow {BODY} at (8,16) size 784x88
+      LayoutBlockFlow {P} at (0,0) size 784x18
+        LayoutText {#text} at (0,0) size 599x17
+          text run at (0,0) width 599: "crbug.com/548616: List markers shouldn't shift to avoid floats that come after them on a line."
+      LayoutBlockFlow {OL} at (0,34) size 784x54
+        LayoutListItem {LI} at (40,0) size 744x18
+          LayoutListMarker (anonymous) at (-16,0) size 16x17: "1"
+          LayoutImage (floating) {IMG} at (0,0) size 20x20 [bgcolor=#000000]
+        LayoutListItem {LI} at (40,18) size 744x18
+          LayoutListMarker (anonymous) at (4,0) size 16x17: "2"
+          LayoutImage (floating) {IMG} at (20,0) size 20x20 [bgcolor=#000000]
+        LayoutListItem {LI} at (40,36) size 744x18
+          LayoutListMarker (anonymous) at (24,0) size 16x17: "3"
+          LayoutImage (floating) {IMG} at (40,0) size 20x20 [bgcolor=#000000]
diff --git a/third_party/WebKit/LayoutTests/platform/win/fast/lists/list-marker-before-float-nested-rtl-expected.png b/third_party/WebKit/LayoutTests/platform/win/fast/lists/list-marker-before-float-nested-rtl-expected.png
new file mode 100644
index 0000000..375b8975
--- /dev/null
+++ b/third_party/WebKit/LayoutTests/platform/win/fast/lists/list-marker-before-float-nested-rtl-expected.png
Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/win/fast/lists/list-marker-before-float-nested-rtl-expected.txt b/third_party/WebKit/LayoutTests/platform/win/fast/lists/list-marker-before-float-nested-rtl-expected.txt
new file mode 100644
index 0000000..1b85d28
--- /dev/null
+++ b/third_party/WebKit/LayoutTests/platform/win/fast/lists/list-marker-before-float-nested-rtl-expected.txt
@@ -0,0 +1,18 @@
+layer at (0,0) size 800x600
+  LayoutView at (0,0) size 800x600
+layer at (0,0) size 800x120
+  LayoutBlockFlow {HTML} at (0,0) size 800x120
+    LayoutBlockFlow {BODY} at (8,16) size 784x88
+      LayoutBlockFlow {P} at (0,0) size 784x18
+        LayoutText {#text} at (0,0) size 599x17
+          text run at (0,0) width 599: "crbug.com/548616: List markers shouldn't shift to avoid floats that come after them on a line."
+      LayoutBlockFlow {OL} at (0,34) size 784x54
+        LayoutListItem {LI} at (0,0) size 744x18
+          LayoutListMarker (anonymous) at (744,0) size 16x17: "1"
+          LayoutImage (floating) {IMG} at (724,0) size 20x20 [bgcolor=#000000]
+        LayoutListItem {LI} at (0,18) size 744x18
+          LayoutListMarker (anonymous) at (724,0) size 16x17: "2"
+          LayoutImage (floating) {IMG} at (704,0) size 20x20 [bgcolor=#000000]
+        LayoutListItem {LI} at (0,36) size 744x18
+          LayoutListMarker (anonymous) at (704,0) size 16x17: "3"
+          LayoutImage (floating) {IMG} at (684,0) size 20x20 [bgcolor=#000000]
diff --git a/third_party/WebKit/LayoutTests/platform/win/fast/lists/list-marker-before-float-rtl-expected.png b/third_party/WebKit/LayoutTests/platform/win/fast/lists/list-marker-before-float-rtl-expected.png
new file mode 100644
index 0000000..45c2108
--- /dev/null
+++ b/third_party/WebKit/LayoutTests/platform/win/fast/lists/list-marker-before-float-rtl-expected.png
Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/win/fast/lists/list-marker-before-float-rtl-expected.txt b/third_party/WebKit/LayoutTests/platform/win/fast/lists/list-marker-before-float-rtl-expected.txt
new file mode 100644
index 0000000..4141faaf
--- /dev/null
+++ b/third_party/WebKit/LayoutTests/platform/win/fast/lists/list-marker-before-float-rtl-expected.txt
@@ -0,0 +1,12 @@
+layer at (0,0) size 800x600
+  LayoutView at (0,0) size 800x600
+layer at (0,0) size 800x84
+  LayoutBlockFlow {HTML} at (0,0) size 800x84
+    LayoutBlockFlow {BODY} at (8,16) size 784x52
+      LayoutBlockFlow {P} at (0,0) size 784x18
+        LayoutText {#text} at (0,0) size 599x17
+          text run at (0,0) width 599: "crbug.com/548616: List markers shouldn't shift to avoid floats that come after them on a line."
+      LayoutBlockFlow {OL} at (0,34) size 784x18
+        LayoutListItem {LI} at (0,0) size 744x18
+          LayoutListMarker (anonymous) at (744,0) size 16x17: "1"
+          LayoutImage (floating) {IMG} at (724,0) size 20x20 [bgcolor=#000000]
diff --git a/third_party/WebKit/LayoutTests/platform/win/paint/invalidation/caret-contenteditable-content-after-expected.png b/third_party/WebKit/LayoutTests/platform/win/paint/invalidation/caret-contenteditable-content-after-expected.png
new file mode 100644
index 0000000..43d8207
--- /dev/null
+++ b/third_party/WebKit/LayoutTests/platform/win/paint/invalidation/caret-contenteditable-content-after-expected.png
Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/win/paint/invalidation/caret-contenteditable-content-after-expected.txt b/third_party/WebKit/LayoutTests/platform/win/paint/invalidation/caret-contenteditable-content-after-expected.txt
new file mode 100644
index 0000000..82c392c4
--- /dev/null
+++ b/third_party/WebKit/LayoutTests/platform/win/paint/invalidation/caret-contenteditable-content-after-expected.txt
@@ -0,0 +1,295 @@
+{
+  "layers": [
+    {
+      "name": "LayoutView #document",
+      "bounds": [800, 600],
+      "contentsOpaque": true,
+      "drawsContent": true,
+      "paintInvalidations": [
+        {
+          "object": "LayoutBlockFlow DIV id='editor'",
+          "rect": [7, 43, 786, 20],
+          "reason": "style change"
+        },
+        {
+          "object": "LayoutBlockFlow DIV id='editor'",
+          "rect": [7, 43, 786, 20],
+          "reason": "forced by layout"
+        },
+        {
+          "object": "LayoutBlockFlow DIV id='editor'",
+          "rect": [7, 43, 786, 20],
+          "reason": "forced by layout"
+        },
+        {
+          "object": "LayoutBlockFlow DIV id='editor'",
+          "rect": [7, 43, 786, 20],
+          "reason": "forced by layout"
+        },
+        {
+          "object": "LayoutText #text",
+          "rect": [8, 44, 23, 17],
+          "reason": "full"
+        },
+        {
+          "object": "LayoutText #text",
+          "rect": [8, 44, 16, 17],
+          "reason": "full"
+        },
+        {
+          "object": "LayoutTextFragment (anonymous)",
+          "rect": [30, 44, 9, 17],
+          "reason": "forced by layout"
+        },
+        {
+          "object": "LayoutTextFragment (anonymous)",
+          "rect": [23, 44, 9, 17],
+          "reason": "forced by layout"
+        },
+        {
+          "object": "LayoutTextFragment (anonymous)",
+          "rect": [23, 44, 9, 17],
+          "reason": "forced by layout"
+        },
+        {
+          "object": "LayoutTextFragment (anonymous)",
+          "rect": [15, 44, 9, 17],
+          "reason": "forced by layout"
+        },
+        {
+          "object": "LayoutTextFragment (anonymous)",
+          "rect": [15, 44, 9, 17],
+          "reason": "forced by layout"
+        },
+        {
+          "object": "LayoutText #text",
+          "rect": [8, 44, 8, 17],
+          "reason": "layoutObject insertion"
+        },
+        {
+          "object": "LayoutTextFragment (anonymous)",
+          "rect": [8, 44, 8, 17],
+          "reason": "forced by layout"
+        },
+        {
+          "object": "LayoutBlockFlow DIV id='editor'",
+          "rect": [7, 43, 3, 20],
+          "reason": "invalidate paint rectangle"
+        },
+        {
+          "object": "LayoutBlockFlow DIV id='editor'",
+          "rect": [7, 43, 3, 20],
+          "reason": "invalidate paint rectangle"
+        },
+        {
+          "object": "LayoutBlockFlow DIV id='editor'",
+          "rect": [7, 43, 3, 20],
+          "reason": "invalidate paint rectangle"
+        },
+        {
+          "object": "LayoutBlockFlow DIV id='editor'",
+          "rect": [7, 43, 3, 20],
+          "reason": "invalidate paint rectangle"
+        },
+        {
+          "object": "LayoutText #text",
+          "rect": [29, 43, 3, 19],
+          "reason": "invalidate paint rectangle"
+        },
+        {
+          "object": "LayoutText #text",
+          "rect": [29, 43, 3, 19],
+          "reason": "invalidate paint rectangle"
+        },
+        {
+          "object": "LayoutText #text",
+          "rect": [29, 43, 3, 19],
+          "reason": "invalidate paint rectangle"
+        },
+        {
+          "object": "LayoutText #text",
+          "rect": [22, 43, 3, 19],
+          "reason": "invalidate paint rectangle"
+        },
+        {
+          "object": "LayoutText #text",
+          "rect": [22, 43, 3, 19],
+          "reason": "invalidate paint rectangle"
+        },
+        {
+          "object": "LayoutText #text",
+          "rect": [22, 43, 3, 19],
+          "reason": "invalidate paint rectangle"
+        },
+        {
+          "object": "LayoutText #text",
+          "rect": [22, 43, 3, 19],
+          "reason": "invalidate paint rectangle"
+        },
+        {
+          "object": "LayoutText #text",
+          "rect": [14, 43, 3, 19],
+          "reason": "invalidate paint rectangle"
+        },
+        {
+          "object": "LayoutText #text",
+          "rect": [14, 43, 3, 19],
+          "reason": "invalidate paint rectangle"
+        },
+        {
+          "object": "LayoutText #text",
+          "rect": [14, 43, 3, 19],
+          "reason": "invalidate paint rectangle"
+        },
+        {
+          "object": "LayoutText #text",
+          "rect": [14, 43, 3, 19],
+          "reason": "invalidate paint rectangle"
+        }
+      ]
+    }
+  ],
+  "objectPaintInvalidations": [
+    {
+      "object": "Caret",
+      "reason": "invalidate paint rectangle"
+    },
+    {
+      "object": "LayoutBlockFlow DIV id='editor'",
+      "reason": "style change"
+    },
+    {
+      "object": "RootInlineBox",
+      "reason": "style change"
+    },
+    {
+      "object": "Caret",
+      "reason": "invalidate paint rectangle"
+    },
+    {
+      "object": "Caret",
+      "reason": "invalidate paint rectangle"
+    },
+    {
+      "object": "Caret",
+      "reason": "invalidate paint rectangle"
+    },
+    {
+      "object": "Caret",
+      "reason": "invalidate paint rectangle"
+    },
+    {
+      "object": "LayoutBlockFlow DIV id='editor'",
+      "reason": "forced by layout"
+    },
+    {
+      "object": "RootInlineBox",
+      "reason": "forced by layout"
+    },
+    {
+      "object": "Caret",
+      "reason": "invalidate paint rectangle"
+    },
+    {
+      "object": "Caret",
+      "reason": "invalidate paint rectangle"
+    },
+    {
+      "object": "LayoutText #text",
+      "reason": "layoutObject insertion"
+    },
+    {
+      "object": "InlineTextBox 'a'",
+      "reason": "layoutObject insertion"
+    },
+    {
+      "object": "LayoutTextFragment (anonymous)",
+      "reason": "forced by layout"
+    },
+    {
+      "object": "InlineTextBox 'x'",
+      "reason": "forced by layout"
+    },
+    {
+      "object": "Caret",
+      "reason": "invalidate paint rectangle"
+    },
+    {
+      "object": "Caret",
+      "reason": "invalidate paint rectangle"
+    },
+    {
+      "object": "LayoutBlockFlow DIV id='editor'",
+      "reason": "forced by layout"
+    },
+    {
+      "object": "RootInlineBox",
+      "reason": "forced by layout"
+    },
+    {
+      "object": "Caret",
+      "reason": "invalidate paint rectangle"
+    },
+    {
+      "object": "Caret",
+      "reason": "invalidate paint rectangle"
+    },
+    {
+      "object": "LayoutText #text",
+      "reason": "full"
+    },
+    {
+      "object": "InlineTextBox 'ab'",
+      "reason": "full"
+    },
+    {
+      "object": "LayoutTextFragment (anonymous)",
+      "reason": "forced by layout"
+    },
+    {
+      "object": "InlineTextBox 'x'",
+      "reason": "forced by layout"
+    },
+    {
+      "object": "Caret",
+      "reason": "invalidate paint rectangle"
+    },
+    {
+      "object": "Caret",
+      "reason": "invalidate paint rectangle"
+    },
+    {
+      "object": "LayoutBlockFlow DIV id='editor'",
+      "reason": "forced by layout"
+    },
+    {
+      "object": "RootInlineBox",
+      "reason": "forced by layout"
+    },
+    {
+      "object": "Caret",
+      "reason": "invalidate paint rectangle"
+    },
+    {
+      "object": "Caret",
+      "reason": "invalidate paint rectangle"
+    },
+    {
+      "object": "LayoutText #text",
+      "reason": "full"
+    },
+    {
+      "object": "InlineTextBox 'abc'",
+      "reason": "full"
+    },
+    {
+      "object": "LayoutTextFragment (anonymous)",
+      "reason": "forced by layout"
+    },
+    {
+      "object": "InlineTextBox 'x'",
+      "reason": "forced by layout"
+    }
+  ]
+}
+
diff --git a/third_party/WebKit/LayoutTests/platform/win/virtual/spinvalidation/paint/invalidation/caret-contenteditable-content-after-expected.png b/third_party/WebKit/LayoutTests/platform/win/virtual/spinvalidation/paint/invalidation/caret-contenteditable-content-after-expected.png
new file mode 100644
index 0000000..43d8207
--- /dev/null
+++ b/third_party/WebKit/LayoutTests/platform/win/virtual/spinvalidation/paint/invalidation/caret-contenteditable-content-after-expected.png
Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/win/virtual/spinvalidation/paint/invalidation/caret-contenteditable-content-after-expected.txt b/third_party/WebKit/LayoutTests/platform/win/virtual/spinvalidation/paint/invalidation/caret-contenteditable-content-after-expected.txt
new file mode 100644
index 0000000..82c392c4
--- /dev/null
+++ b/third_party/WebKit/LayoutTests/platform/win/virtual/spinvalidation/paint/invalidation/caret-contenteditable-content-after-expected.txt
@@ -0,0 +1,295 @@
+{
+  "layers": [
+    {
+      "name": "LayoutView #document",
+      "bounds": [800, 600],
+      "contentsOpaque": true,
+      "drawsContent": true,
+      "paintInvalidations": [
+        {
+          "object": "LayoutBlockFlow DIV id='editor'",
+          "rect": [7, 43, 786, 20],
+          "reason": "style change"
+        },
+        {
+          "object": "LayoutBlockFlow DIV id='editor'",
+          "rect": [7, 43, 786, 20],
+          "reason": "forced by layout"
+        },
+        {
+          "object": "LayoutBlockFlow DIV id='editor'",
+          "rect": [7, 43, 786, 20],
+          "reason": "forced by layout"
+        },
+        {
+          "object": "LayoutBlockFlow DIV id='editor'",
+          "rect": [7, 43, 786, 20],
+          "reason": "forced by layout"
+        },
+        {
+          "object": "LayoutText #text",
+          "rect": [8, 44, 23, 17],
+          "reason": "full"
+        },
+        {
+          "object": "LayoutText #text",
+          "rect": [8, 44, 16, 17],
+          "reason": "full"
+        },
+        {
+          "object": "LayoutTextFragment (anonymous)",
+          "rect": [30, 44, 9, 17],
+          "reason": "forced by layout"
+        },
+        {
+          "object": "LayoutTextFragment (anonymous)",
+          "rect": [23, 44, 9, 17],
+          "reason": "forced by layout"
+        },
+        {
+          "object": "LayoutTextFragment (anonymous)",
+          "rect": [23, 44, 9, 17],
+          "reason": "forced by layout"
+        },
+        {
+          "object": "LayoutTextFragment (anonymous)",
+          "rect": [15, 44, 9, 17],
+          "reason": "forced by layout"
+        },
+        {
+          "object": "LayoutTextFragment (anonymous)",
+          "rect": [15, 44, 9, 17],
+          "reason": "forced by layout"
+        },
+        {
+          "object": "LayoutText #text",
+          "rect": [8, 44, 8, 17],
+          "reason": "layoutObject insertion"
+        },
+        {
+          "object": "LayoutTextFragment (anonymous)",
+          "rect": [8, 44, 8, 17],
+          "reason": "forced by layout"
+        },
+        {
+          "object": "LayoutBlockFlow DIV id='editor'",
+          "rect": [7, 43, 3, 20],
+          "reason": "invalidate paint rectangle"
+        },
+        {
+          "object": "LayoutBlockFlow DIV id='editor'",
+          "rect": [7, 43, 3, 20],
+          "reason": "invalidate paint rectangle"
+        },
+        {
+          "object": "LayoutBlockFlow DIV id='editor'",
+          "rect": [7, 43, 3, 20],
+          "reason": "invalidate paint rectangle"
+        },
+        {
+          "object": "LayoutBlockFlow DIV id='editor'",
+          "rect": [7, 43, 3, 20],
+          "reason": "invalidate paint rectangle"
+        },
+        {
+          "object": "LayoutText #text",
+          "rect": [29, 43, 3, 19],
+          "reason": "invalidate paint rectangle"
+        },
+        {
+          "object": "LayoutText #text",
+          "rect": [29, 43, 3, 19],
+          "reason": "invalidate paint rectangle"
+        },
+        {
+          "object": "LayoutText #text",
+          "rect": [29, 43, 3, 19],
+          "reason": "invalidate paint rectangle"
+        },
+        {
+          "object": "LayoutText #text",
+          "rect": [22, 43, 3, 19],
+          "reason": "invalidate paint rectangle"
+        },
+        {
+          "object": "LayoutText #text",
+          "rect": [22, 43, 3, 19],
+          "reason": "invalidate paint rectangle"
+        },
+        {
+          "object": "LayoutText #text",
+          "rect": [22, 43, 3, 19],
+          "reason": "invalidate paint rectangle"
+        },
+        {
+          "object": "LayoutText #text",
+          "rect": [22, 43, 3, 19],
+          "reason": "invalidate paint rectangle"
+        },
+        {
+          "object": "LayoutText #text",
+          "rect": [14, 43, 3, 19],
+          "reason": "invalidate paint rectangle"
+        },
+        {
+          "object": "LayoutText #text",
+          "rect": [14, 43, 3, 19],
+          "reason": "invalidate paint rectangle"
+        },
+        {
+          "object": "LayoutText #text",
+          "rect": [14, 43, 3, 19],
+          "reason": "invalidate paint rectangle"
+        },
+        {
+          "object": "LayoutText #text",
+          "rect": [14, 43, 3, 19],
+          "reason": "invalidate paint rectangle"
+        }
+      ]
+    }
+  ],
+  "objectPaintInvalidations": [
+    {
+      "object": "Caret",
+      "reason": "invalidate paint rectangle"
+    },
+    {
+      "object": "LayoutBlockFlow DIV id='editor'",
+      "reason": "style change"
+    },
+    {
+      "object": "RootInlineBox",
+      "reason": "style change"
+    },
+    {
+      "object": "Caret",
+      "reason": "invalidate paint rectangle"
+    },
+    {
+      "object": "Caret",
+      "reason": "invalidate paint rectangle"
+    },
+    {
+      "object": "Caret",
+      "reason": "invalidate paint rectangle"
+    },
+    {
+      "object": "Caret",
+      "reason": "invalidate paint rectangle"
+    },
+    {
+      "object": "LayoutBlockFlow DIV id='editor'",
+      "reason": "forced by layout"
+    },
+    {
+      "object": "RootInlineBox",
+      "reason": "forced by layout"
+    },
+    {
+      "object": "Caret",
+      "reason": "invalidate paint rectangle"
+    },
+    {
+      "object": "Caret",
+      "reason": "invalidate paint rectangle"
+    },
+    {
+      "object": "LayoutText #text",
+      "reason": "layoutObject insertion"
+    },
+    {
+      "object": "InlineTextBox 'a'",
+      "reason": "layoutObject insertion"
+    },
+    {
+      "object": "LayoutTextFragment (anonymous)",
+      "reason": "forced by layout"
+    },
+    {
+      "object": "InlineTextBox 'x'",
+      "reason": "forced by layout"
+    },
+    {
+      "object": "Caret",
+      "reason": "invalidate paint rectangle"
+    },
+    {
+      "object": "Caret",
+      "reason": "invalidate paint rectangle"
+    },
+    {
+      "object": "LayoutBlockFlow DIV id='editor'",
+      "reason": "forced by layout"
+    },
+    {
+      "object": "RootInlineBox",
+      "reason": "forced by layout"
+    },
+    {
+      "object": "Caret",
+      "reason": "invalidate paint rectangle"
+    },
+    {
+      "object": "Caret",
+      "reason": "invalidate paint rectangle"
+    },
+    {
+      "object": "LayoutText #text",
+      "reason": "full"
+    },
+    {
+      "object": "InlineTextBox 'ab'",
+      "reason": "full"
+    },
+    {
+      "object": "LayoutTextFragment (anonymous)",
+      "reason": "forced by layout"
+    },
+    {
+      "object": "InlineTextBox 'x'",
+      "reason": "forced by layout"
+    },
+    {
+      "object": "Caret",
+      "reason": "invalidate paint rectangle"
+    },
+    {
+      "object": "Caret",
+      "reason": "invalidate paint rectangle"
+    },
+    {
+      "object": "LayoutBlockFlow DIV id='editor'",
+      "reason": "forced by layout"
+    },
+    {
+      "object": "RootInlineBox",
+      "reason": "forced by layout"
+    },
+    {
+      "object": "Caret",
+      "reason": "invalidate paint rectangle"
+    },
+    {
+      "object": "Caret",
+      "reason": "invalidate paint rectangle"
+    },
+    {
+      "object": "LayoutText #text",
+      "reason": "full"
+    },
+    {
+      "object": "InlineTextBox 'abc'",
+      "reason": "full"
+    },
+    {
+      "object": "LayoutTextFragment (anonymous)",
+      "reason": "forced by layout"
+    },
+    {
+      "object": "InlineTextBox 'x'",
+      "reason": "forced by layout"
+    }
+  ]
+}
+
diff --git a/third_party/WebKit/Source/core/editing/FrameCaret.cpp b/third_party/WebKit/Source/core/editing/FrameCaret.cpp
index 1246270..1a65d87 100644
--- a/third_party/WebKit/Source/core/editing/FrameCaret.cpp
+++ b/third_party/WebKit/Source/core/editing/FrameCaret.cpp
@@ -187,11 +187,12 @@
       m_caretVisibility == m_previousCaretVisibility)
     return;
 
-  if (m_previousCaretNode && shouldRepaintCaret(*m_previousCaretAnchorNode)) {
+  if (m_previousCaretAnchorNode &&
+      shouldRepaintCaret(*m_previousCaretAnchorNode)) {
     invalidateLocalCaretRect(m_previousCaretAnchorNode.get(),
                              m_previousCaretRect);
   }
-  if (newNode && shouldRepaintCaret(*newAnchorNode))
+  if (newAnchorNode && shouldRepaintCaret(*newAnchorNode))
     invalidateLocalCaretRect(newAnchorNode, newRect);
   m_previousCaretNode = newNode;
   m_previousCaretAnchorNode = newAnchorNode;
diff --git a/third_party/WebKit/Source/core/layout/LayoutListItem.cpp b/third_party/WebKit/Source/core/layout/LayoutListItem.cpp
index 82abb454..56b4c6d1 100644
--- a/third_party/WebKit/Source/core/layout/LayoutListItem.cpp
+++ b/third_party/WebKit/Source/core/layout/LayoutListItem.cpp
@@ -358,10 +358,7 @@
     // pretty wrong (https://crbug.com/554160).
     // FIXME: Need to account for relative positioning in the layout overflow.
     if (style()->isLeftToRightDirection()) {
-      LayoutUnit leftLineOffset = logicalLeftOffsetForLine(
-          blockOffset, logicalLeftOffsetForLine(blockOffset, DoNotIndentText),
-          DoNotIndentText);
-      markerLogicalLeft = leftLineOffset - lineOffset - paddingStart() -
+      markerLogicalLeft = m_marker->lineOffset() - lineOffset - paddingStart() -
                           borderStart() + m_marker->marginStart();
       m_marker->inlineBoxWrapper()->moveInInlineDirection(markerLogicalLeft -
                                                           markerOldLogicalLeft);
@@ -393,10 +390,7 @@
           hitSelfPaintingLayer = true;
       }
     } else {
-      LayoutUnit rightLineOffset = logicalRightOffsetForLine(
-          blockOffset, logicalRightOffsetForLine(blockOffset, DoNotIndentText),
-          DoNotIndentText);
-      markerLogicalLeft = rightLineOffset - lineOffset + paddingStart() +
+      markerLogicalLeft = m_marker->lineOffset() - lineOffset + paddingStart() +
                           borderStart() + m_marker->marginEnd();
       m_marker->inlineBoxWrapper()->moveInInlineDirection(markerLogicalLeft -
                                                           markerOldLogicalLeft);
diff --git a/third_party/WebKit/Source/core/layout/LayoutListMarker.cpp b/third_party/WebKit/Source/core/layout/LayoutListMarker.cpp
index 806cda7..934d02d 100644
--- a/third_party/WebKit/Source/core/layout/LayoutListMarker.cpp
+++ b/third_party/WebKit/Source/core/layout/LayoutListMarker.cpp
@@ -43,7 +43,7 @@
 const int cUAMarkerMarginEm = 1;
 
 LayoutListMarker::LayoutListMarker(LayoutListItem* item)
-    : LayoutBox(nullptr), m_listItem(item) {
+    : LayoutBox(nullptr), m_listItem(item), m_lineOffset() {
   setInline(true);
   setIsAtomicInlineLevel(true);
 }
@@ -139,6 +139,17 @@
   ASSERT(needsLayout());
   LayoutAnalyzer::Scope analyzer(*this);
 
+  LayoutUnit blockOffset;
+  for (LayoutBox* o = parentBox(); o && o != listItem(); o = o->parentBox()) {
+    blockOffset += o->logicalTop();
+  }
+  if (listItem()->style()->isLeftToRightDirection()) {
+    m_lineOffset = listItem()->logicalLeftOffsetForLine(
+        blockOffset, DoNotIndentText, LayoutUnit());
+  } else {
+    m_lineOffset = listItem()->logicalRightOffsetForLine(
+        blockOffset, DoNotIndentText, LayoutUnit());
+  }
   if (isImage()) {
     updateMarginsAndContent();
     LayoutSize imageSize(imageBulletSize());
diff --git a/third_party/WebKit/Source/core/layout/LayoutListMarker.h b/third_party/WebKit/Source/core/layout/LayoutListMarker.h
index fe87edde..47057d9 100644
--- a/third_party/WebKit/Source/core/layout/LayoutListMarker.h
+++ b/third_party/WebKit/Source/core/layout/LayoutListMarker.h
@@ -62,6 +62,8 @@
 
   const char* name() const override { return "LayoutListMarker"; }
 
+  LayoutUnit lineOffset() const { return m_lineOffset; }
+
  protected:
   void willBeDestroyed() override;
 
@@ -112,6 +114,7 @@
   String m_text;
   Persistent<StyleImage> m_image;
   LayoutListItem* m_listItem;
+  LayoutUnit m_lineOffset;
 };
 
 DEFINE_LAYOUT_OBJECT_TYPE_CASTS(LayoutListMarker, isListMarker());
diff --git a/third_party/WebKit/Source/core/layout/svg/LayoutSVGResourceMarker.cpp b/third_party/WebKit/Source/core/layout/svg/LayoutSVGResourceMarker.cpp
index e092528..b31411281 100644
--- a/third_party/WebKit/Source/core/layout/svg/LayoutSVGResourceMarker.cpp
+++ b/third_party/WebKit/Source/core/layout/svg/LayoutSVGResourceMarker.cpp
@@ -73,8 +73,7 @@
 }
 
 AffineTransform LayoutSVGResourceMarker::localToSVGParentTransform() const {
-  return AffineTransform::translation(m_viewport.x(), m_viewport.y()) *
-         viewportTransform();
+  return viewportTransform();
 }
 
 FloatPoint LayoutSVGResourceMarker::referencePoint() const {
@@ -117,8 +116,8 @@
   transform.rotate(orientType() == SVGMarkerOrientAngle ? angle() : autoAngle);
   transform.scale(markerScale);
 
-  // The 'origin' coordinate maps to SVGs refX/refY, given in coordinates
-  // relative to the viewport established by the marker.
+  // The reference point (refX, refY) is in the coordinate space of the marker's
+  // contents so we include the value in each marker's transform.
   FloatPoint mappedReferencePoint =
       viewportTransform().mapPoint(referencePoint());
   transform.translate(-mappedReferencePoint.x(), -mappedReferencePoint.y());
@@ -138,8 +137,8 @@
   SVGMarkerElement* marker = toSVGMarkerElement(element());
   ASSERT(marker);
 
-  return marker->viewBoxToViewTransform(m_viewport.width(),
-                                        m_viewport.height());
+  return marker->viewBoxToViewTransform(m_viewportSize.width(),
+                                        m_viewportSize.height());
 }
 
 void LayoutSVGResourceMarker::calcViewport() {
@@ -150,9 +149,9 @@
   ASSERT(marker);
 
   SVGLengthContext lengthContext(marker);
-  float w = marker->markerWidth()->currentValue()->value(lengthContext);
-  float h = marker->markerHeight()->currentValue()->value(lengthContext);
-  m_viewport = FloatRect(0, 0, w, h);
+  float width = marker->markerWidth()->currentValue()->value(lengthContext);
+  float height = marker->markerHeight()->currentValue()->value(lengthContext);
+  m_viewportSize = FloatSize(width, height);
 }
 
 SVGTransformChange LayoutSVGResourceMarker::calculateLocalTransform() {
diff --git a/third_party/WebKit/Source/core/layout/svg/LayoutSVGResourceMarker.h b/third_party/WebKit/Source/core/layout/svg/LayoutSVGResourceMarker.h
index 3c6bb3fe..63fe310 100644
--- a/third_party/WebKit/Source/core/layout/svg/LayoutSVGResourceMarker.h
+++ b/third_party/WebKit/Source/core/layout/svg/LayoutSVGResourceMarker.h
@@ -54,7 +54,9 @@
   SVGMarkerUnitsType markerUnits() const;
   SVGMarkerOrientType orientType() const;
 
-  const FloatRect& viewport() const { return m_viewport; }
+  // The viewport origin is (0,0) and not the reference point because each
+  // marker instance includes the reference in markerTransformation().
+  FloatRect viewport() const { return FloatRect(FloatPoint(), m_viewportSize); }
 
   static const LayoutSVGResourceType s_resourceType = MarkerResourceType;
   LayoutSVGResourceType resourceType() const override { return s_resourceType; }
@@ -66,7 +68,7 @@
 
   AffineTransform viewportTransform() const;
 
-  FloatRect m_viewport;
+  FloatSize m_viewportSize;
 };
 
 DEFINE_LAYOUT_SVG_RESOURCE_TYPE_CASTS(LayoutSVGResourceMarker,