spanification: Add RWBuffer::ROIter::operator*

Similar to the one on ROBuffer::Iter. Convert callers. Fold the separate
data() and size() accessors into the dereference operator. Do the same
on ROBuffer::Iter.

Bug: 351564777
Change-Id: I23b7b0efcf0e54ec055ccb72ef6c794be649569e
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/6074672
Commit-Queue: Kent Tamura <tkent@chromium.org>
Auto-Submit: Fredrik Söderquist <fs@opera.com>
Reviewed-by: Kent Tamura <tkent@chromium.org>
Cr-Commit-Position: refs/heads/main@{#1392575}
diff --git a/third_party/blink/renderer/platform/graphics/parkable_image.cc b/third_party/blink/renderer/platform/graphics/parkable_image.cc
index ed20b3712..ae8cefd 100644
--- a/third_party/blink/renderer/platform/graphics/parkable_image.cc
+++ b/third_party/blink/renderer/platform/graphics/parkable_image.cc
@@ -74,7 +74,8 @@
   auto ro_buffer = rw_buffer->MakeROBufferSnapshot();
   ROBuffer::Iter iter(ro_buffer);
   do {
-    ASAN_POISON_MEMORY_REGION(iter.data(), iter.size());
+    auto data = *iter;
+    ASAN_POISON_MEMORY_REGION(data.data(), data.size());
   } while (iter.Next());
 #endif
 }
@@ -87,7 +88,8 @@
   auto ro_buffer = rw_buffer->MakeROBufferSnapshot();
   ROBuffer::Iter iter(ro_buffer);
   do {
-    ASAN_UNPOISON_MEMORY_REGION(iter.data(), iter.size());
+    auto data = *iter;
+    ASAN_UNPOISON_MEMORY_REGION(data.data(), data.size());
   } while (iter.Next());
 #endif
 }
@@ -157,8 +159,9 @@
     // longer limetime than the SkData.
     parkable_image_->AddRef();
     parkable_image_->LockData();
+    auto data = *iter;
     return SkData::MakeWithProc(
-        iter.data(), available_,
+        data.data(), data.size(),
         [](const void* ptr, void* context) -> void {
           auto* parkable_image = static_cast<ParkableImage*>(context);
           {
@@ -221,7 +224,7 @@
   scoped_refptr<SharedBuffer> shared_buffer = SharedBuffer::Create();
   ROBuffer::Iter it(ro_buffer.get());
   do {
-    shared_buffer->Append(it.data(), it.size());
+    shared_buffer->Append(*it);
   } while (it.Next());
 
   return shared_buffer;
diff --git a/third_party/blink/renderer/platform/graphics/parkable_image_test.cc b/third_party/blink/renderer/platform/graphics/parkable_image_test.cc
index 54839ae..7d3c45d 100644
--- a/third_party/blink/renderer/platform/graphics/parkable_image_test.cc
+++ b/third_party/blink/renderer/platform/graphics/parkable_image_test.cc
@@ -112,10 +112,11 @@
     return pi->impl_->is_frozen();
   }
 
-  scoped_refptr<ParkableImage> MakeParkableImageForTesting(base::span<const char> buffer) {
+  scoped_refptr<ParkableImage> MakeParkableImageForTesting(
+      base::span<const uint8_t> buffer) {
     auto pi = ParkableImage::Create();
 
-    pi->Append(WTF::SharedBuffer::Create(buffer.data(), buffer.size()).get(), 0);
+    pi->Append(WTF::SharedBuffer::Create(buffer).get(), 0);
 
     return pi;
   }
@@ -123,7 +124,7 @@
   // Checks content matches the ParkableImage returned from
   // |MakeParkableImageForTesting|.
   static bool IsSameContent(scoped_refptr<ParkableImage> pi,
-                            base::span<const char> buffer) {
+                            base::span<const uint8_t> buffer) {
     if (pi->size() != buffer.size()) {
       return false;
     }
@@ -133,13 +134,14 @@
 
     auto ro_buffer = pi->impl_->rw_buffer_->MakeROBufferSnapshot();
     ROBuffer::Iter iter(ro_buffer.get());
-    const char* cur = buffer.data();
     do {
-      if (memcmp(iter.data(), cur, iter.size()) != 0) {
+      auto iter_data = *iter;
+      auto [buffer_slice, rest] = buffer.split_at(iter_data.size());
+      if (iter_data != buffer_slice) {
         pi->UnlockData();
         return false;
       }
-      cur += iter.size();
+      buffer = rest;
     } while (iter.Next());
 
     pi->UnlockData();
@@ -287,13 +289,13 @@
 // Tests that |Append|ing to a ParkableImage correctly adds data to it.
 TEST_F(ParkableImageTest, Append) {
   const size_t kDataSize = 3.5 * 4096;
-  auto data = base::HeapArray<char>::Uninit(kDataSize);
+  auto data = base::HeapArray<uint8_t>::Uninit(kDataSize);
   PrepareReferenceData(data);
 
   auto pi = ParkableImage::Create();
   ASSERT_EQ(pi->size(), 0u);  // Should be empty when created.
 
-  pi->Append(WTF::SharedBuffer::Create(data.data(), data.size()).get(), 0);
+  pi->Append(WTF::SharedBuffer::Create(data).get(), 0);
 
   EXPECT_TRUE(IsSameContent(pi, data));
 }
@@ -301,13 +303,13 @@
 // Tests that multiple |Append|s correctly add data to the end of ParkableImage.
 TEST_F(ParkableImageTest, AppendMultiple) {
   const size_t kDataSize = 3.5 * 4096;
-  auto data = base::HeapArray<char>::Uninit(kDataSize);
+  auto data = base::HeapArray<uint8_t>::Uninit(kDataSize);
   PrepareReferenceData(data);
 
   auto pi = ParkableImage::Create();
   ASSERT_EQ(pi->size(), 0u);  // Should be empty when created.
 
-  auto sb = WTF::SharedBuffer::Create(data.data(), data.size());
+  auto sb = WTF::SharedBuffer::Create(data);
   ASSERT_EQ(sb->size(), kDataSize);
 
   pi->Append(sb.get(), 0);
@@ -325,7 +327,7 @@
 // Tests that we can read/write to disk correctly, preserving the data.
 TEST_F(ParkableImageTest, ParkAndUnpark) {
   const size_t kDataSize = 3.5 * 4096;
-  auto data = base::HeapArray<char>::Uninit(kDataSize);
+  auto data = base::HeapArray<uint8_t>::Uninit(kDataSize);
   PrepareReferenceData(data);
 
   // We have no images currently.
@@ -369,7 +371,7 @@
 // Tests that trying to park multiple times doesn't add any extra tasks.
 TEST_F(ParkableImageTest, ParkTwiceAndUnpark) {
   const size_t kDataSize = 3.5 * 4096;
-  auto data = base::HeapArray<char>::Uninit(kDataSize);
+  auto data = base::HeapArray<uint8_t>::Uninit(kDataSize);
   PrepareReferenceData(data);
 
   // We have no images currently.
@@ -409,7 +411,7 @@
 // disk the first time.
 TEST_F(ParkableImageTest, ParkAndUnparkSync) {
   const size_t kDataSize = 3.5 * 4096;
-  auto data = base::HeapArray<char>::Uninit(kDataSize);
+  auto data = base::HeapArray<uint8_t>::Uninit(kDataSize);
   PrepareReferenceData(data);
 
   // We have no images currently.
@@ -480,7 +482,7 @@
 // discarding the data.
 TEST_F(ParkableImageTest, ParkAndUnparkAborted) {
   const size_t kDataSize = 3.5 * 4096;
-  auto data = base::HeapArray<char>::Uninit(kDataSize);
+  auto data = base::HeapArray<uint8_t>::Uninit(kDataSize);
   PrepareReferenceData(data);
 
   // We have no images currently.
@@ -554,7 +556,7 @@
 // Tests that a frozen image will be written to disk by the manager.
 TEST_F(ParkableImageTest, ManagerSimple) {
   const size_t kDataSize = 3.5 * 4096;
-  auto data = base::HeapArray<char>::Uninit(kDataSize);
+  auto data = base::HeapArray<uint8_t>::Uninit(kDataSize);
   PrepareReferenceData(data);
 
   auto& manager = ParkableImageManager::Instance();
@@ -591,7 +593,7 @@
 // Tests that a small image is not kept in the manager.
 TEST_F(ParkableImageTest, ManagerSmall) {
   const size_t kDataSize = ParkableImageImpl::kMinSizeToPark - 10;
-  auto data = base::HeapArray<char>::Uninit(kDataSize);
+  auto data = base::HeapArray<uint8_t>::Uninit(kDataSize);
   PrepareReferenceData(data);
 
   auto& manager = ParkableImageManager::Instance();
@@ -620,7 +622,7 @@
 // created at once.
 TEST_F(ParkableImageTest, ManagerTwo) {
   const size_t kDataSize = 3.5 * 4096;
-  auto data = base::HeapArray<char>::Uninit(kDataSize);
+  auto data = base::HeapArray<uint8_t>::Uninit(kDataSize);
   PrepareReferenceData(data);
 
   auto& manager = ParkableImageManager::Instance();
@@ -657,7 +659,7 @@
 // Test that a non-frozen image will not be written to disk.
 TEST_F(ParkableImageTest, ManagerNonFrozen) {
   const size_t kDataSize = 3.5 * 4096;
-  auto data = base::HeapArray<char>::Uninit(kDataSize);
+  auto data = base::HeapArray<uint8_t>::Uninit(kDataSize);
   PrepareReferenceData(data);
 
   auto& manager = ParkableImageManager::Instance();
@@ -687,7 +689,7 @@
 // effect.
 TEST_F(ParkableImageNoParkingTest, Unpark) {
   const size_t kDataSize = 3.5 * 4096;
-  auto data = base::HeapArray<char>::Uninit(kDataSize);
+  auto data = base::HeapArray<uint8_t>::Uninit(kDataSize);
   PrepareReferenceData(data);
 
   auto pi = MakeParkableImageForTesting(data);
@@ -710,7 +712,7 @@
 // minutes.
 TEST_F(ParkableImageTest, ManagerStatistics5min) {
   const size_t kDataSize = 3.5 * 4096;
-  auto data = base::HeapArray<char>::Uninit(kDataSize);
+  auto data = base::HeapArray<uint8_t>::Uninit(kDataSize);
   PrepareReferenceData(data);
 
   auto pi = MakeParkableImageForTesting(data);
@@ -738,7 +740,7 @@
 // recorded in this case, since no reads/writes will happen.
 TEST_F(ParkableImageNoParkingTest, ManagerStatistics5min) {
   const size_t kDataSize = 3.5 * 4096;
-  auto data = base::HeapArray<char>::Uninit(kDataSize);
+  auto data = base::HeapArray<uint8_t>::Uninit(kDataSize);
   PrepareReferenceData(data);
 
   auto pi = MakeParkableImageForTesting(data);
@@ -763,7 +765,7 @@
 // disabled.
 TEST_F(ParkableImageNoParkingTest, ManagerSimple) {
   const size_t kDataSize = 3.5 * 4096;
-  auto data = base::HeapArray<char>::Uninit(kDataSize);
+  auto data = base::HeapArray<uint8_t>::Uninit(kDataSize);
   PrepareReferenceData(data);
 
   auto pi = MakeParkableImageForTesting(data);
@@ -794,7 +796,7 @@
 // Test a locked image will not be written to disk.
 TEST_F(ParkableImageTest, ManagerNotUnlocked) {
   const size_t kDataSize = 3.5 * 4096;
-  auto data = base::HeapArray<char>::Uninit(kDataSize);
+  auto data = base::HeapArray<uint8_t>::Uninit(kDataSize);
   PrepareReferenceData(data);
 
   auto& manager = ParkableImageManager::Instance();
@@ -821,7 +823,7 @@
 // unfrozen ParkableImages.
 TEST_F(ParkableImageTest, ManagerRescheduleUnfrozen) {
   const size_t kDataSize = 3.5 * 4096;
-  auto data = base::HeapArray<char>::Uninit(kDataSize);
+  auto data = base::HeapArray<uint8_t>::Uninit(kDataSize);
   PrepareReferenceData(data);
 
   auto& manager = ParkableImageManager::Instance();
@@ -863,7 +865,7 @@
 // inefficient, but the safest way to do it.
 TEST_F(ParkableImageTest, DestroyOnSeparateThread) {
   const size_t kDataSize = 3.5 * 4096;
-  auto data = base::HeapArray<char>::Uninit(kDataSize);
+  auto data = base::HeapArray<uint8_t>::Uninit(kDataSize);
   PrepareReferenceData(data);
 
   auto& manager = ParkableImageManager::Instance();
@@ -911,7 +913,7 @@
   set_may_write(false);
 
   const size_t kDataSize = 3.5 * 4096;
-  auto data = base::HeapArray<char>::Uninit(kDataSize);
+  auto data = base::HeapArray<uint8_t>::Uninit(kDataSize);
   PrepareReferenceData(data);
 
   EXPECT_EQ(0u, manager.Size());
@@ -933,7 +935,7 @@
 // Test that we park only after 30 seconds, not immediately after freezing.
 TEST_F(ParkableImageDelayedTest, Simple) {
   const size_t kDataSize = 3.5 * 4096;
-  auto data = base::HeapArray<char>::Uninit(kDataSize);
+  auto data = base::HeapArray<uint8_t>::Uninit(kDataSize);
   PrepareReferenceData(data);
 
   auto& manager = ParkableImageManager::Instance();
@@ -967,7 +969,7 @@
 // immediately after freezing.
 TEST_F(ParkableImageDelayedTest, Read) {
   const size_t kDataSize = 3.5 * 4096;
-  auto data = base::HeapArray<char>::Uninit(kDataSize);
+  auto data = base::HeapArray<uint8_t>::Uninit(kDataSize);
   PrepareReferenceData(data);
 
   auto& manager = ParkableImageManager::Instance();
@@ -1003,7 +1005,7 @@
 // parking/unparking.
 TEST_F(ParkableImageDelayedTest, ParkAndUnpark) {
   const size_t kDataSize = 3.5 * 4096;
-  auto data = base::HeapArray<char>::Uninit(kDataSize);
+  auto data = base::HeapArray<uint8_t>::Uninit(kDataSize);
   PrepareReferenceData(data);
 
   // We have no images currently.
@@ -1042,7 +1044,7 @@
 TEST_F(ParkableImageWithLimitedDiskCapacityTest, ParkWithLimitedDiskCapacity) {
   constexpr size_t kMB = 1024 * 1024;
   constexpr size_t kDataSize = kMB;
-  auto data = base::HeapArray<char>::Uninit(kDataSize);
+  auto data = base::HeapArray<uint8_t>::Uninit(kDataSize);
   PrepareReferenceData(data);
 
   auto pi = MakeParkableImageForTesting(data);
diff --git a/third_party/blink/renderer/platform/image-decoders/image_decoder_test_helpers.h b/third_party/blink/renderer/platform/image-decoders/image_decoder_test_helpers.h
index aa094c4..9a831a5 100644
--- a/third_party/blink/renderer/platform/image-decoders/image_decoder_test_helpers.h
+++ b/third_party/blink/renderer/platform/image-decoders/image_decoder_test_helpers.h
@@ -33,6 +33,10 @@
   }
 }
 
+inline void PrepareReferenceData(base::span<uint8_t> buffer) {
+  PrepareReferenceData(base::as_writable_chars(buffer));
+}
+
 Vector<char> ReadFile(StringView file_name);
 Vector<char> ReadFile(const char* dir, const char* file_name);
 
diff --git a/third_party/blink/renderer/platform/image-decoders/rw_buffer.cc b/third_party/blink/renderer/platform/image-decoders/rw_buffer.cc
index 73f6634..bd80def 100644
--- a/third_party/blink/renderer/platform/image-decoders/rw_buffer.cc
+++ b/third_party/blink/renderer/platform/image-decoders/rw_buffer.cc
@@ -112,8 +112,7 @@
       // `buffer_` has a `raw_ptr` that needs to be destroyed to
       // properly lower the refcount.
       block_.~BufferBlock();
-      WTF::Partitions::BufferFree(
-          reinterpret_cast<void*>(const_cast<RWBuffer::BufferHead*>(this)));
+      WTF::Partitions::BufferFree(const_cast<RWBuffer::BufferHead*>(this));
       while (block) {
         RWBuffer::BufferBlock* next = block->next_;
         block->~BufferBlock();
@@ -144,27 +143,24 @@
   }
 };
 
-size_t RWBuffer::ROIter::size() const {
-  if (!block_) {
-    return 0;
-  }
-
-  return std::min(block_->capacity_, remaining_);
-}
-
 RWBuffer::ROIter::ROIter(RWBuffer* rw_buffer, size_t available)
     : rw_buffer_(rw_buffer), remaining_(available) {
   DCHECK(rw_buffer_);
   block_ = &rw_buffer_->head_->block_;
 }
 
-const uint8_t* RWBuffer::ROIter::data() const {
-  return remaining_ ? block_->startData() : nullptr;
+base::span<const uint8_t> RWBuffer::ROIter::operator*() const {
+  if (!remaining_) {
+    return {};
+  }
+  DCHECK(block_);
+  return base::span(block_->startData(),
+                    std::min(block_->capacity_, remaining_));
 }
 
 bool RWBuffer::ROIter::Next() {
   if (remaining_) {
-    size_t current_size = size();
+    const size_t current_size = std::min(block_->capacity_, remaining_);
     DCHECK_LE(current_size, remaining_);
     remaining_ -= current_size;
     if (remaining_ == 0) {
@@ -225,24 +221,19 @@
   }
 }
 
-const uint8_t* ROBuffer::Iter::data() const {
-  return remaining_ ? block_->startData() : nullptr;
-}
-
-size_t ROBuffer::Iter::size() const {
-  if (!block_) {
-    return 0;
-  }
-  return std::min(block_->capacity_, remaining_);
-}
-
 base::span<const uint8_t> ROBuffer::Iter::operator*() const {
-  return base::span(data(), size());
+  if (!remaining_) {
+    return {};
+  }
+  DCHECK(block_);
+  return base::span(block_->startData(),
+                    std::min(block_->capacity_, remaining_));
 }
 
 bool ROBuffer::Iter::Next() {
   if (remaining_) {
-    remaining_ -= size();
+    const size_t current_size = std::min(block_->capacity_, remaining_);
+    remaining_ -= current_size;
     if (buffer_->tail_ == block_) {
       // There are more blocks, but buffer_ does not know about them.
       DCHECK_EQ(0u, remaining_);
diff --git a/third_party/blink/renderer/platform/image-decoders/rw_buffer.h b/third_party/blink/renderer/platform/image-decoders/rw_buffer.h
index 41ad4c9..c6e3c56 100644
--- a/third_party/blink/renderer/platform/image-decoders/rw_buffer.h
+++ b/third_party/blink/renderer/platform/image-decoders/rw_buffer.h
@@ -28,8 +28,10 @@
   class PLATFORM_EXPORT ROIter {
    public:
     explicit ROIter(RWBuffer*, size_t);
-    size_t size() const;
-    const uint8_t* data() const;
+
+    // Returns a span of the current continuous block of memory. The span will
+    // be empty if the iterator is exhausted.
+    base::span<const uint8_t> operator*() const;
     // Checks whether there is another block available and advances the iterator
     // if there is.
     bool Next();
@@ -39,7 +41,7 @@
 
    private:
     raw_ptr<const RWBuffer> rw_buffer_;
-    raw_ptr<RWBuffer::BufferBlock> block_;
+    raw_ptr<const RWBuffer::BufferBlock> block_;
     size_t remaining_;
   };
 
@@ -104,18 +106,9 @@
     void Reset(const ROBuffer*);
 
     /**
-     * Return the current continuous block of memory, or nullptr if the
-     * iterator is exhausted
+     * Returns a span of the current continuous block of memory. The span will
+     * be empty if the iterator is exhausted.
      */
-    const uint8_t* data() const;
-
-    /**
-     * Returns the number of bytes in the current contiguous block of memory,
-     * or 0 if the iterator is exhausted.
-     */
-    size_t size() const;
-
-    // Returns a span with data() and size().
     base::span<const uint8_t> operator*() const;
 
     /**
diff --git a/third_party/blink/renderer/platform/image-decoders/rw_buffer_test.cc b/third_party/blink/renderer/platform/image-decoders/rw_buffer_test.cc
index cced9fbf..d0f368c3 100644
--- a/third_party/blink/renderer/platform/image-decoders/rw_buffer_test.cc
+++ b/third_party/blink/renderer/platform/image-decoders/rw_buffer_test.cc
@@ -29,18 +29,20 @@
 
 // reader should contains an integral number of copies of gABC.
 void check_alphabet_buffer(const ROBuffer* reader) {
-  size_t size = reader->size();
+  const size_t size = reader->size();
   ASSERT_EQ(size % 26, 0u);
 
   std::vector<char> storage(size);
+  auto dest = base::as_writable_byte_span(storage);
+
   ROBuffer::Iter iter(reader);
-  size_t offset = 0;
   do {
-    ASSERT_LE(offset + iter.size(), size);
-    memcpy(storage.data() + offset, iter.data(), iter.size());
-    offset += iter.size();
+    auto src = *iter;
+    ASSERT_LE(src.size(), dest.size());
+    dest.copy_prefix_from(src);
+    dest = dest.subspan(src.size());
   } while (iter.Next());
-  ASSERT_EQ(offset, size);
+  ASSERT_TRUE(dest.empty());
   check_abcs(storage.data(), size);
 }
 
@@ -128,12 +130,12 @@
 
   scoped_refptr<ROBuffer> roBuffer(buffer.MakeROBufferSnapshot());
   ROBuffer::Iter iter(roBuffer.get());
-  EXPECT_TRUE(iter.data());
-  EXPECT_EQ(iter.size(), 26u);
+  EXPECT_TRUE((*iter).data());
+  EXPECT_EQ((*iter).size(), 26u);
 
   // There is only one block in this buffer.
   EXPECT_TRUE(!iter.Next());
-  EXPECT_EQ(0u, iter.size());
+  EXPECT_TRUE((*iter).empty());
 }
 
 // Tests that operations (including the destructor) are safe on an RWBuffer
@@ -147,8 +149,8 @@
   if (roBuffer) {
     EXPECT_EQ(roBuffer->size(), 0u);
     ROBuffer::Iter iter(roBuffer.get());
-    EXPECT_EQ(iter.size(), 0u);
-    EXPECT_TRUE(!iter.data());
+    EXPECT_TRUE((*iter).empty());
+    EXPECT_TRUE(!(*iter).data());
     EXPECT_TRUE(!iter.Next());
   }
 }
@@ -204,7 +206,7 @@
 
   scoped_refptr<ROBuffer> roBuffer = buffer.MakeROBufferSnapshot();
   ROBuffer::Iter iter(roBuffer.get());
-  EXPECT_EQ(0, memcmp(iter.data(), gABC, 20U));
+  EXPECT_EQ(*iter, base::span_from_cstring(gABC).first(20U));
 }
 
 TEST(RWBufferTest, FunctionConstructorLarge) {
diff --git a/third_party/blink/renderer/platform/image-decoders/segment_reader.cc b/third_party/blink/renderer/platform/image-decoders/segment_reader.cc
index 70f0aa3..669e2cd9 100644
--- a/third_party/blink/renderer/platform/image-decoders/segment_reader.cc
+++ b/third_party/blink/renderer/platform/image-decoders/segment_reader.cc
@@ -26,20 +26,23 @@
 base::span<const uint8_t> BufferGetSomeData(Iter& iter,
                                             size_t& position_of_block,
                                             size_t position) {
-  for (size_t size_of_block = iter.size(); size_of_block != 0;
-       position_of_block += size_of_block, size_of_block = iter.size()) {
+  auto current_span = *iter;
+  for (size_t size_of_block = current_span.size(); size_of_block != 0;
+       position_of_block += size_of_block,
+              size_of_block = current_span.size()) {
     DCHECK_LE(position_of_block, position);
 
     if (position_of_block + size_of_block > position) {
       // |position| is in this block.
       const size_t position_in_block = position - position_of_block;
-      return base::span(iter.data(), iter.size()).subspan(position_in_block);
+      return current_span.subspan(position_in_block);
     }
 
     // Move to next block.
     if (!iter.Next()) {
       break;
     }
+    current_span = *iter;
   }
   return {};
 }
@@ -47,11 +50,12 @@
 template <class Iter>
 sk_sp<SkData> BufferCopyAsSkData(Iter iter, size_t available) {
   sk_sp<SkData> data = SkData::MakeUninitialized(available);
-  char* dst = static_cast<char*>(data->writable_data());
+  auto dst =
+      base::span(static_cast<uint8_t*>(data->writable_data()), available);
   do {
-    size_t size = iter.size();
-    memcpy(dst, iter.data(), size);
-    dst += size;
+    auto src = *iter;
+    dst.copy_prefix_from(src);
+    dst = dst.subspan(src.size());
   } while (iter.Next());
   return data;
 }
@@ -188,7 +192,7 @@
 
   auto data = BufferGetSomeData(iter_, position_of_block_, position);
 
-  if (!iter_.data()) {
+  if ((*iter_).empty()) {
     // Reset to the beginning, so future calls can succeed.
     iter_.Reset(ro_buffer_.get());
     position_of_block_ = 0;
@@ -214,7 +218,8 @@
   if (!multiple_blocks) {
     // Contiguous data. No need to copy.
     ro_buffer_->AddRef();
-    return SkData::MakeWithProc(iter.data(), iter.size(), &UnrefROBuffer,
+    auto data = *iter;
+    return SkData::MakeWithProc(data.data(), data.size(), &UnrefROBuffer,
                                 ro_buffer_.get());
   }