diff --git a/fpdfsdk/pwl/BUILD.gn b/fpdfsdk/pwl/BUILD.gn
index 6921b27..7390119 100644
--- a/fpdfsdk/pwl/BUILD.gn
+++ b/fpdfsdk/pwl/BUILD.gn
@@ -29,6 +29,8 @@
     "cpwl_list_box.h",
     "cpwl_list_ctrl.cpp",
     "cpwl_list_ctrl.h",
+    "cpwl_sbbutton.cpp",
+    "cpwl_sbbutton.h",
     "cpwl_scroll_bar.cpp",
     "cpwl_scroll_bar.h",
     "cpwl_special_button.cpp",
diff --git a/fpdfsdk/pwl/cpwl_sbbutton.cpp b/fpdfsdk/pwl/cpwl_sbbutton.cpp
new file mode 100644
index 0000000..4605c33
--- /dev/null
+++ b/fpdfsdk/pwl/cpwl_sbbutton.cpp
@@ -0,0 +1,147 @@
+// Copyright 2021 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#include "fpdfsdk/pwl/cpwl_sbbutton.h"
+
+#include <utility>
+#include <vector>
+
+#include "core/fxge/cfx_renderdevice.h"
+#include "third_party/base/stl_util.h"
+
+CPWL_SBButton::CPWL_SBButton(
+    const CreateParams& cp,
+    std::unique_ptr<IPWL_SystemHandler::PerWindowData> pAttachedData,
+    PWL_SBBUTTON_TYPE eButtonType)
+    : CPWL_Wnd(cp, std::move(pAttachedData)), m_eSBButtonType(eButtonType) {
+  GetCreationParams()->eCursorType = FXCT_ARROW;
+}
+
+CPWL_SBButton::~CPWL_SBButton() = default;
+
+void CPWL_SBButton::DrawThisAppearance(CFX_RenderDevice* pDevice,
+                                       const CFX_Matrix& mtUser2Device) {
+  if (!IsVisible())
+    return;
+
+  CFX_FloatRect rectWnd = GetWindowRect();
+  if (rectWnd.IsEmpty())
+    return;
+
+  CFX_PointF ptCenter = GetCenterPoint();
+  int32_t nTransparency = GetTransparency();
+
+  // draw border
+  pDevice->DrawStrokeRect(mtUser2Device, rectWnd,
+                          ArgbEncode(nTransparency, 100, 100, 100), 0.0f);
+  pDevice->DrawStrokeRect(mtUser2Device, rectWnd.GetDeflated(0.5f, 0.5f),
+                          ArgbEncode(nTransparency, 255, 255, 255), 1.0f);
+
+  if (m_eSBButtonType != PSBT_POS) {
+    // draw background
+    pDevice->DrawShadow(mtUser2Device, true, false,
+                        rectWnd.GetDeflated(1.0f, 1.0f), nTransparency, 80,
+                        220);
+    // draw arrow
+    if (rectWnd.top - rectWnd.bottom > 6.0f) {
+      float fX = rectWnd.left + 1.5f;
+      float fY = rectWnd.bottom;
+      std::vector<CFX_PointF> pts;
+      static constexpr float kOffsetsX[] = {2.5f, 2.5f, 4.5f, 6.5f,
+                                            6.5f, 4.5f, 2.5f};
+      static constexpr float kOffsetsY[] = {5.0f, 6.0f, 4.0f, 6.0f,
+                                            5.0f, 3.0f, 5.0f};
+      static constexpr float kOffsetsMinY[] = {4.0f, 3.0f, 5.0f, 3.0f,
+                                               4.0f, 6.0f, 4.0f};
+      static_assert(pdfium::size(kOffsetsX) == pdfium::size(kOffsetsY),
+                    "Wrong offset count");
+      static_assert(pdfium::size(kOffsetsX) == pdfium::size(kOffsetsMinY),
+                    "Wrong offset count");
+      const float* pOffsetsY =
+          m_eSBButtonType == PSBT_MIN ? kOffsetsMinY : kOffsetsY;
+      for (size_t i = 0; i < pdfium::size(kOffsetsX); ++i)
+        pts.push_back(CFX_PointF(fX + kOffsetsX[i], fY + pOffsetsY[i]));
+      pDevice->DrawFillArea(mtUser2Device, pts,
+                            ArgbEncode(nTransparency, 255, 255, 255));
+    }
+    return;
+  }
+
+  // draw shadow effect
+  CFX_PointF ptTop = CFX_PointF(rectWnd.left, rectWnd.top - 1.0f);
+  CFX_PointF ptBottom = CFX_PointF(rectWnd.left, rectWnd.bottom + 1.0f);
+
+  ptTop.x += 1.5f;
+  ptBottom.x += 1.5f;
+
+  const FX_COLORREF refs[] = {ArgbEncode(nTransparency, 210, 210, 210),
+                              ArgbEncode(nTransparency, 220, 220, 220),
+                              ArgbEncode(nTransparency, 240, 240, 240),
+                              ArgbEncode(nTransparency, 240, 240, 240),
+                              ArgbEncode(nTransparency, 210, 210, 210),
+                              ArgbEncode(nTransparency, 180, 180, 180),
+                              ArgbEncode(nTransparency, 150, 150, 150),
+                              ArgbEncode(nTransparency, 150, 150, 150),
+                              ArgbEncode(nTransparency, 180, 180, 180),
+                              ArgbEncode(nTransparency, 210, 210, 210)};
+  for (FX_COLORREF ref : refs) {
+    pDevice->DrawStrokeLine(&mtUser2Device, ptTop, ptBottom, ref, 1.0f);
+
+    ptTop.x += 1.0f;
+    ptBottom.x += 1.0f;
+  }
+
+  // draw friction
+  if (rectWnd.Height() <= 8.0f)
+    return;
+
+  FX_COLORREF crStroke = ArgbEncode(nTransparency, 120, 120, 120);
+  float nFrictionWidth = 5.0f;
+  float nFrictionHeight = 5.5f;
+  CFX_PointF ptLeft = CFX_PointF(ptCenter.x - nFrictionWidth / 2.0f,
+                                 ptCenter.y - nFrictionHeight / 2.0f + 0.5f);
+  CFX_PointF ptRight = CFX_PointF(ptCenter.x + nFrictionWidth / 2.0f,
+                                  ptCenter.y - nFrictionHeight / 2.0f + 0.5f);
+
+  for (size_t i = 0; i < 3; ++i) {
+    pDevice->DrawStrokeLine(&mtUser2Device, ptLeft, ptRight, crStroke, 1.0f);
+    ptLeft.y += 2.0f;
+    ptRight.y += 2.0f;
+  }
+}
+
+bool CPWL_SBButton::OnLButtonDown(uint32_t nFlag, const CFX_PointF& point) {
+  CPWL_Wnd::OnLButtonDown(nFlag, point);
+
+  if (CPWL_Wnd* pParent = GetParentWindow())
+    pParent->NotifyLButtonDown(this, point);
+
+  m_bMouseDown = true;
+  SetCapture();
+
+  return true;
+}
+
+bool CPWL_SBButton::OnLButtonUp(uint32_t nFlag, const CFX_PointF& point) {
+  CPWL_Wnd::OnLButtonUp(nFlag, point);
+
+  if (CPWL_Wnd* pParent = GetParentWindow())
+    pParent->NotifyLButtonUp(this, point);
+
+  m_bMouseDown = false;
+  ReleaseCapture();
+
+  return true;
+}
+
+bool CPWL_SBButton::OnMouseMove(uint32_t nFlag, const CFX_PointF& point) {
+  CPWL_Wnd::OnMouseMove(nFlag, point);
+
+  if (CPWL_Wnd* pParent = GetParentWindow())
+    pParent->NotifyMouseMove(this, point);
+
+  return true;
+}
diff --git a/fpdfsdk/pwl/cpwl_sbbutton.h b/fpdfsdk/pwl/cpwl_sbbutton.h
new file mode 100644
index 0000000..03e2d23
--- /dev/null
+++ b/fpdfsdk/pwl/cpwl_sbbutton.h
@@ -0,0 +1,37 @@
+// Copyright 2021 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#ifndef FPDFSDK_PWL_CPWL_SBBUTTON_H_
+#define FPDFSDK_PWL_CPWL_SBBUTTON_H_
+
+#include <memory>
+
+#include "fpdfsdk/pwl/cpwl_wnd.h"
+#include "fpdfsdk/pwl/ipwl_systemhandler.h"
+
+enum PWL_SBBUTTON_TYPE { PSBT_MIN, PSBT_MAX, PSBT_POS };
+
+class CPWL_SBButton final : public CPWL_Wnd {
+ public:
+  CPWL_SBButton(
+      const CreateParams& cp,
+      std::unique_ptr<IPWL_SystemHandler::PerWindowData> pAttachedData,
+      PWL_SBBUTTON_TYPE eButtonType);
+  ~CPWL_SBButton() override;
+
+  // CPWL_Wnd
+  void DrawThisAppearance(CFX_RenderDevice* pDevice,
+                          const CFX_Matrix& mtUser2Device) override;
+  bool OnLButtonDown(uint32_t nFlag, const CFX_PointF& point) override;
+  bool OnLButtonUp(uint32_t nFlag, const CFX_PointF& point) override;
+  bool OnMouseMove(uint32_t nFlag, const CFX_PointF& point) override;
+
+ private:
+  PWL_SBBUTTON_TYPE m_eSBButtonType;
+  bool m_bMouseDown = false;
+};
+
+#endif  // FPDFSDK_PWL_CPWL_SBBUTTON_H_
diff --git a/fpdfsdk/pwl/cpwl_scroll_bar.cpp b/fpdfsdk/pwl/cpwl_scroll_bar.cpp
index dd11c96..31744ec 100644
--- a/fpdfsdk/pwl/cpwl_scroll_bar.cpp
+++ b/fpdfsdk/pwl/cpwl_scroll_bar.cpp
@@ -9,14 +9,12 @@
 #include <algorithm>
 #include <sstream>
 #include <utility>
-#include <vector>
 
 #include "core/fxge/cfx_fillrenderoptions.h"
 #include "core/fxge/cfx_pathdata.h"
 #include "core/fxge/cfx_renderdevice.h"
 #include "fpdfsdk/pwl/cpwl_wnd.h"
 #include "third_party/base/check.h"
-#include "third_party/base/stl_util.h"
 
 namespace {
 
@@ -105,140 +103,6 @@
     SetPos(ScrollRange.fMin);
 }
 
-CPWL_SBButton::CPWL_SBButton(
-    const CreateParams& cp,
-    std::unique_ptr<IPWL_SystemHandler::PerWindowData> pAttachedData,
-    PWL_SBBUTTON_TYPE eButtonType)
-    : CPWL_Wnd(cp, std::move(pAttachedData)), m_eSBButtonType(eButtonType) {
-  GetCreationParams()->eCursorType = FXCT_ARROW;
-}
-
-CPWL_SBButton::~CPWL_SBButton() = default;
-
-void CPWL_SBButton::DrawThisAppearance(CFX_RenderDevice* pDevice,
-                                       const CFX_Matrix& mtUser2Device) {
-  if (!IsVisible())
-    return;
-
-  CFX_FloatRect rectWnd = GetWindowRect();
-  if (rectWnd.IsEmpty())
-    return;
-
-  CFX_PointF ptCenter = GetCenterPoint();
-  int32_t nTransparency = GetTransparency();
-
-  // draw border
-  pDevice->DrawStrokeRect(mtUser2Device, rectWnd,
-                          ArgbEncode(nTransparency, 100, 100, 100), 0.0f);
-  pDevice->DrawStrokeRect(mtUser2Device, rectWnd.GetDeflated(0.5f, 0.5f),
-                          ArgbEncode(nTransparency, 255, 255, 255), 1.0f);
-
-  if (m_eSBButtonType != PSBT_POS) {
-    // draw background
-    pDevice->DrawShadow(mtUser2Device, true, false,
-                        rectWnd.GetDeflated(1.0f, 1.0f), nTransparency, 80,
-                        220);
-    // draw arrow
-    if (rectWnd.top - rectWnd.bottom > 6.0f) {
-      float fX = rectWnd.left + 1.5f;
-      float fY = rectWnd.bottom;
-      std::vector<CFX_PointF> pts;
-      static constexpr float kOffsetsX[] = {2.5f, 2.5f, 4.5f, 6.5f,
-                                            6.5f, 4.5f, 2.5f};
-      static constexpr float kOffsetsY[] = {5.0f, 6.0f, 4.0f, 6.0f,
-                                            5.0f, 3.0f, 5.0f};
-      static constexpr float kOffsetsMinY[] = {4.0f, 3.0f, 5.0f, 3.0f,
-                                               4.0f, 6.0f, 4.0f};
-      static_assert(pdfium::size(kOffsetsX) == pdfium::size(kOffsetsY),
-                    "Wrong offset count");
-      static_assert(pdfium::size(kOffsetsX) == pdfium::size(kOffsetsMinY),
-                    "Wrong offset count");
-      const float* pOffsetsY =
-          m_eSBButtonType == PSBT_MIN ? kOffsetsMinY : kOffsetsY;
-      for (size_t i = 0; i < pdfium::size(kOffsetsX); ++i)
-        pts.push_back(CFX_PointF(fX + kOffsetsX[i], fY + pOffsetsY[i]));
-      pDevice->DrawFillArea(mtUser2Device, pts,
-                            ArgbEncode(nTransparency, 255, 255, 255));
-    }
-    return;
-  }
-
-  // draw shadow effect
-  CFX_PointF ptTop = CFX_PointF(rectWnd.left, rectWnd.top - 1.0f);
-  CFX_PointF ptBottom = CFX_PointF(rectWnd.left, rectWnd.bottom + 1.0f);
-
-  ptTop.x += 1.5f;
-  ptBottom.x += 1.5f;
-
-  const FX_COLORREF refs[] = {ArgbEncode(nTransparency, 210, 210, 210),
-                              ArgbEncode(nTransparency, 220, 220, 220),
-                              ArgbEncode(nTransparency, 240, 240, 240),
-                              ArgbEncode(nTransparency, 240, 240, 240),
-                              ArgbEncode(nTransparency, 210, 210, 210),
-                              ArgbEncode(nTransparency, 180, 180, 180),
-                              ArgbEncode(nTransparency, 150, 150, 150),
-                              ArgbEncode(nTransparency, 150, 150, 150),
-                              ArgbEncode(nTransparency, 180, 180, 180),
-                              ArgbEncode(nTransparency, 210, 210, 210)};
-  for (FX_COLORREF ref : refs) {
-    pDevice->DrawStrokeLine(&mtUser2Device, ptTop, ptBottom, ref, 1.0f);
-
-    ptTop.x += 1.0f;
-    ptBottom.x += 1.0f;
-  }
-
-  // draw friction
-  if (rectWnd.Height() <= 8.0f)
-    return;
-
-  FX_COLORREF crStroke = ArgbEncode(nTransparency, 120, 120, 120);
-  float nFrictionWidth = 5.0f;
-  float nFrictionHeight = 5.5f;
-  CFX_PointF ptLeft = CFX_PointF(ptCenter.x - nFrictionWidth / 2.0f,
-                                 ptCenter.y - nFrictionHeight / 2.0f + 0.5f);
-  CFX_PointF ptRight = CFX_PointF(ptCenter.x + nFrictionWidth / 2.0f,
-                                  ptCenter.y - nFrictionHeight / 2.0f + 0.5f);
-
-  for (size_t i = 0; i < 3; ++i) {
-    pDevice->DrawStrokeLine(&mtUser2Device, ptLeft, ptRight, crStroke, 1.0f);
-    ptLeft.y += 2.0f;
-    ptRight.y += 2.0f;
-  }
-}
-
-bool CPWL_SBButton::OnLButtonDown(uint32_t nFlag, const CFX_PointF& point) {
-  CPWL_Wnd::OnLButtonDown(nFlag, point);
-
-  if (CPWL_Wnd* pParent = GetParentWindow())
-    pParent->NotifyLButtonDown(this, point);
-
-  m_bMouseDown = true;
-  SetCapture();
-
-  return true;
-}
-
-bool CPWL_SBButton::OnLButtonUp(uint32_t nFlag, const CFX_PointF& point) {
-  CPWL_Wnd::OnLButtonUp(nFlag, point);
-
-  if (CPWL_Wnd* pParent = GetParentWindow())
-    pParent->NotifyLButtonUp(this, point);
-
-  m_bMouseDown = false;
-  ReleaseCapture();
-
-  return true;
-}
-
-bool CPWL_SBButton::OnMouseMove(uint32_t nFlag, const CFX_PointF& point) {
-  CPWL_Wnd::OnMouseMove(nFlag, point);
-
-  if (CPWL_Wnd* pParent = GetParentWindow())
-    pParent->NotifyMouseMove(this, point);
-
-  return true;
-}
-
 CPWL_ScrollBar::CPWL_ScrollBar(
     const CreateParams& cp,
     std::unique_ptr<IPWL_SystemHandler::PerWindowData> pAttachedData)
diff --git a/fpdfsdk/pwl/cpwl_scroll_bar.h b/fpdfsdk/pwl/cpwl_scroll_bar.h
index a9595af..805df52 100644
--- a/fpdfsdk/pwl/cpwl_scroll_bar.h
+++ b/fpdfsdk/pwl/cpwl_scroll_bar.h
@@ -11,6 +11,7 @@
 
 #include "core/fxcrt/cfx_timer.h"
 #include "core/fxcrt/unowned_ptr.h"
+#include "fpdfsdk/pwl/cpwl_sbbutton.h"
 #include "fpdfsdk/pwl/cpwl_wnd.h"
 
 struct PWL_SCROLL_INFO {
@@ -38,28 +39,6 @@
   float fSmallStep;
 };
 
-enum PWL_SBBUTTON_TYPE { PSBT_MIN, PSBT_MAX, PSBT_POS };
-
-class CPWL_SBButton final : public CPWL_Wnd {
- public:
-  CPWL_SBButton(
-      const CreateParams& cp,
-      std::unique_ptr<IPWL_SystemHandler::PerWindowData> pAttachedData,
-      PWL_SBBUTTON_TYPE eButtonType);
-  ~CPWL_SBButton() override;
-
-  // CPWL_Wnd
-  void DrawThisAppearance(CFX_RenderDevice* pDevice,
-                          const CFX_Matrix& mtUser2Device) override;
-  bool OnLButtonDown(uint32_t nFlag, const CFX_PointF& point) override;
-  bool OnLButtonUp(uint32_t nFlag, const CFX_PointF& point) override;
-  bool OnMouseMove(uint32_t nFlag, const CFX_PointF& point) override;
-
- private:
-  PWL_SBBUTTON_TYPE m_eSBButtonType;
-  bool m_bMouseDown = false;
-};
-
 struct PWL_FLOATRANGE {
  public:
   PWL_FLOATRANGE() = default;
