diff --git a/core/fxcodec/gif/cfx_gifcontext.cpp b/core/fxcodec/gif/cfx_gifcontext.cpp
index 8f48cfd..c1467ae 100644
--- a/core/fxcodec/gif/cfx_gifcontext.cpp
+++ b/core/fxcodec/gif/cfx_gifcontext.cpp
@@ -78,7 +78,7 @@
         return CFX_GifDecodeStatus::Success;
       case GIF_D_STATUS_SIG: {
         uint8_t signature;
-        if (!ReadData(&signature, sizeof(signature)))
+        if (!ReadAllOrNone(&signature, sizeof(signature)))
           return CFX_GifDecodeStatus::Unfinished;
 
         switch (signature) {
@@ -103,7 +103,7 @@
       }
       case GIF_D_STATUS_EXT: {
         uint8_t extension;
-        if (!ReadData(&extension, sizeof(extension)))
+        if (!ReadAllOrNone(&extension, sizeof(extension)))
           return CFX_GifDecodeStatus::Unfinished;
 
         switch (extension) {
@@ -137,7 +137,7 @@
         uint8_t img_data_size;
         size_t read_marker = input_buffer_->GetPosition();
 
-        if (!ReadData(&img_data_size, sizeof(img_data_size)))
+        if (!ReadAllOrNone(&img_data_size, sizeof(img_data_size)))
           return CFX_GifDecodeStatus::Unfinished;
 
         while (img_data_size != GIF_BLOCK_TERMINAL) {
@@ -151,7 +151,7 @@
           // ScanForTerminalMarker() cannot be used here.
           SaveDecodingStatus(GIF_D_STATUS_IMG_DATA);
           read_marker = input_buffer_->GetPosition();
-          if (!ReadData(&img_data_size, sizeof(img_data_size)))
+          if (!ReadAllOrNone(&img_data_size, sizeof(img_data_size)))
             return CFX_GifDecodeStatus::Unfinished;
         }
 
@@ -236,12 +236,12 @@
   size_t read_marker = input_buffer_->GetPosition();
 
   if (decode_status_ == GIF_D_STATUS_IMG_DATA) {
-    if (!ReadData(&img_data_size, sizeof(img_data_size)))
+    if (!ReadAllOrNone(&img_data_size, sizeof(img_data_size)))
       return CFX_GifDecodeStatus::Unfinished;
 
     if (img_data_size != GIF_BLOCK_TERMINAL) {
       img_data.resize(img_data_size);
-      if (!ReadData(img_data.data(), img_data_size)) {
+      if (!ReadAllOrNone(img_data.data(), img_data_size)) {
         input_buffer_->Seek(read_marker);
         return CFX_GifDecodeStatus::Unfinished;
       }
@@ -276,12 +276,12 @@
 
         if (ret == CFX_GifDecodeStatus::Unfinished) {
           read_marker = input_buffer_->GetPosition();
-          if (!ReadData(&img_data_size, sizeof(img_data_size)))
+          if (!ReadAllOrNone(&img_data_size, sizeof(img_data_size)))
             return CFX_GifDecodeStatus::Unfinished;
 
           if (img_data_size != GIF_BLOCK_TERMINAL) {
             img_data.resize(img_data_size);
-            if (!ReadData(img_data.data(), img_data_size)) {
+            if (!ReadAllOrNone(img_data.data(), img_data_size)) {
               input_buffer_->Seek(read_marker);
               return CFX_GifDecodeStatus::Unfinished;
             }
@@ -353,7 +353,7 @@
   return input_buffer_->GetSize() - input_buffer_->GetPosition();
 }
 
-bool CFX_GifContext::ReadData(uint8_t* dest, uint32_t size) {
+bool CFX_GifContext::ReadAllOrNone(uint8_t* dest, uint32_t size) {
   if (!input_buffer_ || !dest)
     return false;
 
@@ -369,7 +369,7 @@
 
 CFX_GifDecodeStatus CFX_GifContext::ReadGifSignature() {
   CFX_GifHeader header;
-  if (!ReadData(reinterpret_cast<uint8_t*>(&header), 6))
+  if (!ReadAllOrNone(reinterpret_cast<uint8_t*>(&header), 6))
     return CFX_GifDecodeStatus::Unfinished;
 
   if (strncmp(header.signature, kGifSignature87, 6) != 0 &&
@@ -384,7 +384,7 @@
   CFX_GifLocalScreenDescriptor lsd;
   size_t read_marker = input_buffer_->GetPosition();
 
-  if (!ReadData(reinterpret_cast<uint8_t*>(&lsd), sizeof(lsd)))
+  if (!ReadAllOrNone(reinterpret_cast<uint8_t*>(&lsd), sizeof(lsd)))
     return CFX_GifDecodeStatus::Unfinished;
 
   if (lsd.global_flags.global_pal) {
@@ -395,7 +395,8 @@
 
     uint32_t palette_size = palette_count * sizeof(CFX_GifPalette);
     std::vector<CFX_GifPalette> palette(palette_count);
-    if (!ReadData(reinterpret_cast<uint8_t*>(palette.data()), palette_size)) {
+    if (!ReadAllOrNone(reinterpret_cast<uint8_t*>(palette.data()),
+                       palette_size)) {
       // Roll back the read for the LSD
       input_buffer_->Seek(read_marker);
       return CFX_GifDecodeStatus::Unfinished;
@@ -433,7 +434,7 @@
     }
     case GIF_D_STATUS_EXT_PTE: {
       CFX_GifPlainTextExtension gif_pte;
-      if (!ReadData(reinterpret_cast<uint8_t*>(&gif_pte), sizeof(gif_pte)))
+      if (!ReadAllOrNone(reinterpret_cast<uint8_t*>(&gif_pte), sizeof(gif_pte)))
         return CFX_GifDecodeStatus::Unfinished;
 
       graphic_control_extension_ = nullptr;
@@ -445,7 +446,7 @@
     }
     case GIF_D_STATUS_EXT_GCE: {
       CFX_GifGraphicControlExtension gif_gce;
-      if (!ReadData(reinterpret_cast<uint8_t*>(&gif_gce), sizeof(gif_gce)))
+      if (!ReadAllOrNone(reinterpret_cast<uint8_t*>(&gif_gce), sizeof(gif_gce)))
         return CFX_GifDecodeStatus::Unfinished;
 
       if (!graphic_control_extension_.get())
@@ -478,7 +479,7 @@
 
   size_t read_marker = input_buffer_->GetPosition();
   CFX_CFX_GifImageInfo img_info;
-  if (!ReadData(reinterpret_cast<uint8_t*>(&img_info), sizeof(img_info)))
+  if (!ReadAllOrNone(reinterpret_cast<uint8_t*>(&img_info), sizeof(img_info)))
     return CFX_GifDecodeStatus::Unfinished;
 
   auto gif_image = pdfium::MakeUnique<CFX_GifImage>();
@@ -500,8 +501,8 @@
     gif_image->local_pallette_exp = gif_img_info_lf->pal_bits;
     uint32_t loc_pal_count = unsigned(2 << gif_img_info_lf->pal_bits);
     std::vector<CFX_GifPalette> loc_pal(loc_pal_count);
-    if (!ReadData(reinterpret_cast<uint8_t*>(loc_pal.data()),
-                  loc_pal_count * sizeof(CFX_GifPalette))) {
+    if (!ReadAllOrNone(reinterpret_cast<uint8_t*>(loc_pal.data()),
+                       loc_pal_count * sizeof(CFX_GifPalette))) {
       input_buffer_->Seek(read_marker);
       return CFX_GifDecodeStatus::Unfinished;
     }
@@ -510,7 +511,7 @@
   }
 
   uint8_t code_size;
-  if (!ReadData(&code_size, sizeof(code_size))) {
+  if (!ReadAllOrNone(&code_size, sizeof(code_size))) {
     input_buffer_->Seek(read_marker);
     return CFX_GifDecodeStatus::Unfinished;
   }
@@ -546,12 +547,12 @@
 bool CFX_GifContext::ScanForTerminalMarker() {
   uint8_t data_size;
 
-  if (!ReadData(&data_size, sizeof(data_size)))
+  if (!ReadAllOrNone(&data_size, sizeof(data_size)))
     return false;
 
   while (data_size != GIF_BLOCK_TERMINAL) {
     if (!input_buffer_->Seek(input_buffer_->GetPosition() + data_size) ||
-        !ReadData(&data_size, sizeof(data_size))) {
+        !ReadAllOrNone(&data_size, sizeof(data_size))) {
       return false;
     }
   }
diff --git a/core/fxcodec/gif/cfx_gifcontext.h b/core/fxcodec/gif/cfx_gifcontext.h
index 9cc7da9..5eae516 100644
--- a/core/fxcodec/gif/cfx_gifcontext.h
+++ b/core/fxcodec/gif/cfx_gifcontext.h
@@ -64,7 +64,7 @@
   uint8_t img_pass_num_;
 
  protected:
-  bool ReadData(uint8_t* dest, uint32_t size);
+  bool ReadAllOrNone(uint8_t* dest, uint32_t size);
   CFX_GifDecodeStatus ReadGifSignature();
   CFX_GifDecodeStatus ReadLogicalScreenDescriptor();
 
diff --git a/core/fxcodec/gif/cfx_gifcontext_unittest.cpp b/core/fxcodec/gif/cfx_gifcontext_unittest.cpp
index 25f12b2..b9805ef 100644
--- a/core/fxcodec/gif/cfx_gifcontext_unittest.cpp
+++ b/core/fxcodec/gif/cfx_gifcontext_unittest.cpp
@@ -14,7 +14,7 @@
       : CFX_GifContext(gif_module, delegate) {}
   ~CFX_GifContextForTest() override {}
 
-  using CFX_GifContext::ReadData;
+  using CFX_GifContext::ReadAllOrNone;
   using CFX_GifContext::ReadGifSignature;
   using CFX_GifContext::ReadLogicalScreenDescriptor;
 
@@ -54,7 +54,7 @@
   }
 }
 
-TEST(CFX_GifContext, ReadData) {
+TEST(CFX_GifContext, ReadAllOrNone) {
   std::vector<uint8_t> dest_buffer;
   uint8_t src_buffer[] = {0x00, 0x01, 0x02, 0x03, 0x04,
                           0x05, 0x06, 0x07, 0x08, 0x09};
@@ -63,33 +63,33 @@
     CFX_GifContextForTest context(nullptr, nullptr);
 
     context.SetInputBuffer({nullptr, 0});
-    EXPECT_FALSE(context.ReadData(nullptr, 0));
-    EXPECT_FALSE(context.ReadData(nullptr, 10));
+    EXPECT_FALSE(context.ReadAllOrNone(nullptr, 0));
+    EXPECT_FALSE(context.ReadAllOrNone(nullptr, 10));
 
-    EXPECT_FALSE(context.ReadData(dest_buffer.data(), 0));
-    EXPECT_FALSE(context.ReadData(dest_buffer.data(), 10));
+    EXPECT_FALSE(context.ReadAllOrNone(dest_buffer.data(), 0));
+    EXPECT_FALSE(context.ReadAllOrNone(dest_buffer.data(), 10));
 
     context.SetInputBuffer({src_buffer, 0});
     dest_buffer.resize(sizeof(src_buffer));
-    EXPECT_FALSE(context.ReadData(dest_buffer.data(), sizeof(src_buffer)));
+    EXPECT_FALSE(context.ReadAllOrNone(dest_buffer.data(), sizeof(src_buffer)));
 
     context.SetInputBuffer({src_buffer, 1});
-    EXPECT_FALSE(context.ReadData(dest_buffer.data(), sizeof(src_buffer)));
+    EXPECT_FALSE(context.ReadAllOrNone(dest_buffer.data(), sizeof(src_buffer)));
     EXPECT_EQ(0u, context.InputBuffer()->GetPosition());
-    EXPECT_FALSE(context.ReadData(nullptr, sizeof(src_buffer)));
-    EXPECT_FALSE(context.ReadData(nullptr, 1));
-    EXPECT_TRUE(context.ReadData(dest_buffer.data(), 1));
+    EXPECT_FALSE(context.ReadAllOrNone(nullptr, sizeof(src_buffer)));
+    EXPECT_FALSE(context.ReadAllOrNone(nullptr, 1));
+    EXPECT_TRUE(context.ReadAllOrNone(dest_buffer.data(), 1));
     EXPECT_EQ(src_buffer[0], dest_buffer[0]);
 
     context.SetInputBuffer(src_buffer);
-    EXPECT_FALSE(context.ReadData(nullptr, sizeof(src_buffer)));
-    EXPECT_TRUE(context.ReadData(dest_buffer.data(), sizeof(src_buffer)));
+    EXPECT_FALSE(context.ReadAllOrNone(nullptr, sizeof(src_buffer)));
+    EXPECT_TRUE(context.ReadAllOrNone(dest_buffer.data(), sizeof(src_buffer)));
     for (size_t i = 0; i < sizeof(src_buffer); i++)
       EXPECT_EQ(src_buffer[i], dest_buffer[i]);
 
     context.SetInputBuffer(src_buffer);
     for (size_t i = 0; i < sizeof(src_buffer); i++) {
-      EXPECT_TRUE(context.ReadData(dest_buffer.data(), 1));
+      EXPECT_TRUE(context.ReadAllOrNone(dest_buffer.data(), 1));
       EXPECT_EQ(src_buffer[i], dest_buffer[0]);
     }
   }
