| Index: xfa/fwl/core/cfwl_edit.cpp
 | 
| diff --git a/xfa/fwl/core/cfwl_edit.cpp b/xfa/fwl/core/cfwl_edit.cpp
 | 
| index a2fee2a4e13a2b10d00bf4d5f68685425d959d37..c5c69a3a9482df7866e16699f0d11a53438313b6 100644
 | 
| --- a/xfa/fwl/core/cfwl_edit.cpp
 | 
| +++ b/xfa/fwl/core/cfwl_edit.cpp
 | 
| @@ -113,7 +113,7 @@ void CFWL_Edit::GetWidgetRect(CFX_RectF& rect, bool bAutoSize) {
 | 
|  
 | 
|    int32_t iTextLen = m_EdtEngine.GetTextLength();
 | 
|    if (iTextLen > 0) {
 | 
| -    CFX_WideString wsText = m_EdtEngine.GetText(0);
 | 
| +    CFX_WideString wsText = m_EdtEngine.GetText(0, -1);
 | 
|      CFX_SizeF sz = CalcTextSize(
 | 
|          wsText, m_pProperties->m_pThemeProvider,
 | 
|          !!(m_pProperties->m_dwStyleExes & FWL_STYLEEXT_EDT_MultiLine));
 | 
| @@ -297,23 +297,23 @@ int32_t CFWL_Edit::GetTextLength() const {
 | 
|    return m_EdtEngine.GetTextLength();
 | 
|  }
 | 
|  
 | 
| -CFX_WideString CFWL_Edit::GetText(int32_t nStart, int32_t nCount) const {
 | 
| -  return m_EdtEngine.GetText(nStart, nCount);
 | 
| +CFX_WideString CFWL_Edit::GetText() const {
 | 
| +  return m_EdtEngine.GetText(0, -1);
 | 
|  }
 | 
|  
 | 
|  void CFWL_Edit::ClearText() {
 | 
|    m_EdtEngine.ClearText();
 | 
|  }
 | 
|  
 | 
| -void CFWL_Edit::AddSelRange(int32_t nStart, int32_t nCount) {
 | 
| -  m_EdtEngine.AddSelRange(nStart, nCount);
 | 
| +void CFWL_Edit::AddSelRange(int32_t nStart) {
 | 
| +  m_EdtEngine.AddSelRange(nStart, -1);
 | 
|  }
 | 
|  
 | 
|  int32_t CFWL_Edit::CountSelRanges() const {
 | 
|    return m_EdtEngine.CountSelRanges();
 | 
|  }
 | 
|  
 | 
| -int32_t CFWL_Edit::GetSelRange(int32_t nIndex, int32_t& nStart) const {
 | 
| +int32_t CFWL_Edit::GetSelRange(int32_t nIndex, int32_t* nStart) const {
 | 
|    return m_EdtEngine.GetSelRange(nIndex, nStart);
 | 
|  }
 | 
|  
 | 
| @@ -340,13 +340,11 @@ bool CFWL_Edit::Copy(CFX_WideString& wsCopy) {
 | 
|      return false;
 | 
|  
 | 
|    wsCopy.clear();
 | 
| -  CFX_WideString wsTemp;
 | 
| -  int32_t nStart, nLength;
 | 
| +  int32_t nStart;
 | 
| +  int32_t nLength;
 | 
|    for (int32_t i = 0; i < nCount; i++) {
 | 
| -    nLength = m_EdtEngine.GetSelRange(i, nStart);
 | 
| -    wsTemp = m_EdtEngine.GetText(nStart, nLength);
 | 
| -    wsCopy += wsTemp;
 | 
| -    wsTemp.clear();
 | 
| +    nLength = m_EdtEngine.GetSelRange(i, &nStart);
 | 
| +    wsCopy += m_EdtEngine.GetText(nStart, nLength);
 | 
|    }
 | 
|    return true;
 | 
|  }
 | 
| @@ -360,7 +358,7 @@ bool CFWL_Edit::Cut(CFX_WideString& wsCut) {
 | 
|    CFX_WideString wsTemp;
 | 
|    int32_t nStart, nLength;
 | 
|    for (int32_t i = 0; i < nCount; i++) {
 | 
| -    nLength = m_EdtEngine.GetSelRange(i, nStart);
 | 
| +    nLength = m_EdtEngine.GetSelRange(i, &nStart);
 | 
|      wsTemp = m_EdtEngine.GetText(nStart, nLength);
 | 
|      wsCut += wsTemp;
 | 
|      wsTemp.clear();
 | 
| @@ -416,9 +414,7 @@ void CFWL_Edit::SetOuter(CFWL_Widget* pOuter) {
 | 
|    m_pOuter = pOuter;
 | 
|  }
 | 
|  
 | 
| -void CFWL_Edit::On_CaretChanged(CFDE_TxtEdtEngine* pEdit,
 | 
| -                                int32_t nPage,
 | 
| -                                bool bVisible) {
 | 
| +void CFWL_Edit::OnCaretChanged() {
 | 
|    if (m_rtEngine.IsEmpty())
 | 
|      return;
 | 
|    if ((m_pProperties->m_dwStates & FWL_WGTSTATE_Focused) == 0)
 | 
| @@ -443,8 +439,7 @@ void CFWL_Edit::On_CaretChanged(CFDE_TxtEdtEngine* pEdit,
 | 
|    }
 | 
|  }
 | 
|  
 | 
| -void CFWL_Edit::On_TextChanged(CFDE_TxtEdtEngine* pEdit,
 | 
| -                               FDE_TXTEDT_TEXTCHANGE_INFO& ChangeInfo) {
 | 
| +void CFWL_Edit::OnTextChanged(const FDE_TXTEDT_TEXTCHANGE_INFO& ChangeInfo) {
 | 
|    if (m_pProperties->m_dwStyleExes & FWL_STYLEEXT_EDT_VAlignMask)
 | 
|      UpdateVAlignment();
 | 
|  
 | 
| @@ -459,15 +454,13 @@ void CFWL_Edit::On_TextChanged(CFDE_TxtEdtEngine* pEdit,
 | 
|    Repaint(&rtTemp);
 | 
|  }
 | 
|  
 | 
| -void CFWL_Edit::On_SelChanged(CFDE_TxtEdtEngine* pEdit) {
 | 
| +void CFWL_Edit::OnSelChanged() {
 | 
|    CFX_RectF rtTemp;
 | 
|    GetClientRect(rtTemp);
 | 
|    Repaint(&rtTemp);
 | 
|  }
 | 
|  
 | 
| -bool CFWL_Edit::On_PageLoad(CFDE_TxtEdtEngine* pEdit,
 | 
| -                            int32_t nPageIndex,
 | 
| -                            int32_t nPurpose) {
 | 
| +bool CFWL_Edit::OnPageLoad(int32_t nPageIndex) {
 | 
|    IFDE_TxtEdtPage* pPage = m_EdtEngine.GetPage(nPageIndex);
 | 
|    if (!pPage)
 | 
|      return false;
 | 
| @@ -476,9 +469,7 @@ bool CFWL_Edit::On_PageLoad(CFDE_TxtEdtEngine* pEdit,
 | 
|    return true;
 | 
|  }
 | 
|  
 | 
| -bool CFWL_Edit::On_PageUnload(CFDE_TxtEdtEngine* pEdit,
 | 
| -                              int32_t nPageIndex,
 | 
| -                              int32_t nPurpose) {
 | 
| +bool CFWL_Edit::OnPageUnload(int32_t nPageIndex) {
 | 
|    IFDE_TxtEdtPage* pPage = m_EdtEngine.GetPage(nPageIndex);
 | 
|    if (!pPage)
 | 
|      return false;
 | 
| @@ -487,12 +478,11 @@ bool CFWL_Edit::On_PageUnload(CFDE_TxtEdtEngine* pEdit,
 | 
|    return true;
 | 
|  }
 | 
|  
 | 
| -void CFWL_Edit::On_AddDoRecord(CFDE_TxtEdtEngine* pEdit,
 | 
| -                               IFDE_TxtEdtDoRecord* pRecord) {
 | 
| -  AddDoRecord(pRecord);
 | 
| +void CFWL_Edit::OnAddDoRecord(std::unique_ptr<IFDE_TxtEdtDoRecord> pRecord) {
 | 
| +  AddDoRecord(std::move(pRecord));
 | 
|  }
 | 
|  
 | 
| -bool CFWL_Edit::On_Validate(CFDE_TxtEdtEngine* pEdit, CFX_WideString& wsText) {
 | 
| +bool CFWL_Edit::OnValidate(const CFX_WideString& wsText) {
 | 
|    CFWL_Widget* pDst = GetOuter();
 | 
|    if (!pDst)
 | 
|      pDst = this;
 | 
| @@ -583,7 +573,7 @@ void CFWL_Edit::DrawContent(CFX_Graphics* pGraphics,
 | 
|      CFX_RectFArray rectArr;
 | 
|      int32_t i = 0;
 | 
|      for (i = 0; i < nSelCount; i++) {
 | 
| -      nCharCount = m_EdtEngine.GetSelRange(i, nCharStart);
 | 
| +      nCharCount = m_EdtEngine.GetSelRange(i, &nCharStart);
 | 
|        int32_t nCharEnd = nCharStart + nCharCount - 1;
 | 
|        if (nCharEnd < nPageCharStart || nCharStart > nPageCharEnd)
 | 
|          continue;
 | 
| @@ -991,7 +981,7 @@ bool CFWL_Edit::IsContentHeightOverflow() {
 | 
|    return pPage->GetContentsBox().height > m_rtEngine.height + 1.0f;
 | 
|  }
 | 
|  
 | 
| -int32_t CFWL_Edit::AddDoRecord(IFDE_TxtEdtDoRecord* pRecord) {
 | 
| +int32_t CFWL_Edit::AddDoRecord(std::unique_ptr<IFDE_TxtEdtDoRecord> pRecord) {
 | 
|    int32_t nCount = pdfium::CollectionSize<int32_t>(m_DoRecords);
 | 
|    if (m_iCurRecord == nCount - 1) {
 | 
|      if (nCount == m_iMaxRecord) {
 | 
| @@ -1003,7 +993,7 @@ int32_t CFWL_Edit::AddDoRecord(IFDE_TxtEdtDoRecord* pRecord) {
 | 
|                        m_DoRecords.end());
 | 
|    }
 | 
|  
 | 
| -  m_DoRecords.push_back(std::unique_ptr<IFDE_TxtEdtDoRecord>(pRecord));
 | 
| +  m_DoRecords.push_back(std::move(pRecord));
 | 
|    m_iCurRecord = pdfium::CollectionSize<int32_t>(m_DoRecords) - 1;
 | 
|    return m_iCurRecord;
 | 
|  }
 | 
| @@ -1039,7 +1029,7 @@ void CFWL_Edit::Layout() {
 | 
|    bool bShowVertScrollbar = IsShowScrollBar(true);
 | 
|    bool bShowHorzScrollbar = IsShowScrollBar(false);
 | 
|    if (bShowVertScrollbar) {
 | 
| -    InitScrollBar();
 | 
| +    InitVerticalScrollBar();
 | 
|  
 | 
|      CFX_RectF rtVertScr;
 | 
|      if (m_pProperties->m_dwStyleExes & FWL_STYLEEXT_EDT_OuterScrollbar) {
 | 
| @@ -1061,7 +1051,7 @@ void CFWL_Edit::Layout() {
 | 
|    }
 | 
|  
 | 
|    if (bShowHorzScrollbar) {
 | 
| -    InitScrollBar(false);
 | 
| +    InitHorizontalScrollBar();
 | 
|  
 | 
|      CFX_RectF rtHoriScr;
 | 
|      if (m_pProperties->m_dwStyleExes & FWL_STYLEEXT_EDT_OuterScrollbar) {
 | 
| @@ -1096,7 +1086,7 @@ void CFWL_Edit::LayoutScrollBar() {
 | 
|        pfWidth = static_cast<FX_FLOAT*>(
 | 
|            GetThemeCapacity(CFWL_WidgetCapacity::ScrollBarWidth));
 | 
|        FX_FLOAT fWidth = pfWidth ? *pfWidth : 0;
 | 
| -      InitScrollBar();
 | 
| +      InitVerticalScrollBar();
 | 
|        CFX_RectF rtVertScr;
 | 
|        if (m_pProperties->m_dwStyleExes & FWL_STYLEEXT_EDT_OuterScrollbar) {
 | 
|          rtVertScr.Set(m_rtClient.right() + kEditMargin, m_rtClient.top, fWidth,
 | 
| @@ -1123,7 +1113,7 @@ void CFWL_Edit::LayoutScrollBar() {
 | 
|        }
 | 
|  
 | 
|        FX_FLOAT fWidth = pfWidth ? *pfWidth : 0;
 | 
| -      InitScrollBar(false);
 | 
| +      InitHorizontalScrollBar();
 | 
|        CFX_RectF rtHoriScr;
 | 
|        if (m_pProperties->m_dwStyleExes & FWL_STYLEEXT_EDT_OuterScrollbar) {
 | 
|          rtHoriScr.Set(m_rtClient.left, m_rtClient.bottom() + kEditMargin,
 | 
| @@ -1150,21 +1140,30 @@ void CFWL_Edit::DeviceToEngine(CFX_PointF& pt) {
 | 
|    pt.y += m_fScrollOffsetY - m_rtEngine.top - m_fVAlignOffset;
 | 
|  }
 | 
|  
 | 
| -void CFWL_Edit::InitScrollBar(bool bVert) {
 | 
| -  if ((bVert && m_pVertScrollBar) || (!bVert && m_pHorzScrollBar))
 | 
| +void CFWL_Edit::InitVerticalScrollBar() {
 | 
| +  if (m_pVertScrollBar)
 | 
|      return;
 | 
|  
 | 
|    auto prop = pdfium::MakeUnique<CFWL_WidgetProperties>();
 | 
| -  prop->m_dwStyleExes = bVert ? FWL_STYLEEXT_SCB_Vert : FWL_STYLEEXT_SCB_Horz;
 | 
| +  prop->m_dwStyleExes = FWL_STYLEEXT_SCB_Vert;
 | 
|    prop->m_dwStates = FWL_WGTSTATE_Disabled | FWL_WGTSTATE_Invisible;
 | 
|    prop->m_pParent = this;
 | 
|    prop->m_pThemeProvider = m_pProperties->m_pThemeProvider;
 | 
| +  m_pVertScrollBar =
 | 
| +      pdfium::MakeUnique<CFWL_ScrollBar>(m_pOwnerApp, std::move(prop), this);
 | 
| +}
 | 
|  
 | 
| -  CFWL_ScrollBar* sb = new CFWL_ScrollBar(m_pOwnerApp, std::move(prop), this);
 | 
| -  if (bVert)
 | 
| -    m_pVertScrollBar.reset(sb);
 | 
| -  else
 | 
| -    m_pHorzScrollBar.reset(sb);
 | 
| +void CFWL_Edit::InitHorizontalScrollBar() {
 | 
| +  if (m_pHorzScrollBar)
 | 
| +    return;
 | 
| +
 | 
| +  auto prop = pdfium::MakeUnique<CFWL_WidgetProperties>();
 | 
| +  prop->m_dwStyleExes = FWL_STYLEEXT_SCB_Horz;
 | 
| +  prop->m_dwStates = FWL_WGTSTATE_Disabled | FWL_WGTSTATE_Invisible;
 | 
| +  prop->m_pParent = this;
 | 
| +  prop->m_pThemeProvider = m_pProperties->m_pThemeProvider;
 | 
| +  m_pHorzScrollBar =
 | 
| +      pdfium::MakeUnique<CFWL_ScrollBar>(m_pOwnerApp, std::move(prop), this);
 | 
|  }
 | 
|  
 | 
|  void CFWL_Edit::ShowCaret(CFX_RectF* pRect) {
 | 
| @@ -1232,7 +1231,7 @@ bool CFWL_Edit::ValidateNumberChar(FX_WCHAR cNum) {
 | 
|    if (!m_bSetRange)
 | 
|      return true;
 | 
|  
 | 
| -  CFX_WideString wsText = m_EdtEngine.GetText(0);
 | 
| +  CFX_WideString wsText = m_EdtEngine.GetText(0, -1);
 | 
|    if (wsText.IsEmpty()) {
 | 
|      if (cNum == L'0')
 | 
|        return false;
 | 
| 
 |