| Index: xfa/fwl/core/ifwl_widget.cpp | 
| diff --git a/xfa/fwl/core/ifwl_widget.cpp b/xfa/fwl/core/ifwl_widget.cpp | 
| index c9decffe246050d15c027f370b3de6ac4038ef13..b885210015f2cebcaf1fdabcb8b644fa76769ccd 100644 | 
| --- a/xfa/fwl/core/ifwl_widget.cpp | 
| +++ b/xfa/fwl/core/ifwl_widget.cpp | 
| @@ -61,17 +61,18 @@ bool IFWL_Widget::IsInstance(const CFX_WideStringC& wsClass) const { | 
| } | 
|  | 
| void IFWL_Widget::GetWidgetRect(CFX_RectF& rect, bool bAutoSize) { | 
| -  if (bAutoSize) { | 
| -    if (HasEdge()) { | 
| -      FX_FLOAT fEdge = GetEdgeWidth(); | 
| -      rect.Inflate(fEdge, fEdge); | 
| -    } | 
| -    if (HasBorder()) { | 
| -      FX_FLOAT fBorder = GetBorderSize(); | 
| -      rect.Inflate(fBorder, fBorder); | 
| -    } | 
| -  } else { | 
| +  if (!bAutoSize) { | 
| rect = m_pProperties->m_rtWidget; | 
| +    return; | 
| +  } | 
| + | 
| +  if (HasEdge()) { | 
| +    FX_FLOAT fEdge = GetEdgeWidth(); | 
| +    rect.Inflate(fEdge, fEdge); | 
| +  } | 
| +  if (HasBorder()) { | 
| +    FX_FLOAT fBorder = GetBorderSize(); | 
| +    rect.Inflate(fBorder, fBorder); | 
| } | 
| } | 
|  | 
| @@ -233,31 +234,32 @@ void IFWL_Widget::TransformTo(IFWL_Widget* pWidget, | 
| void IFWL_Widget::GetMatrix(CFX_Matrix& matrix, bool bGlobal) { | 
| if (!m_pProperties) | 
| return; | 
| -  if (bGlobal) { | 
| -    IFWL_Widget* parent = GetParent(); | 
| -    CFX_ArrayTemplate<IFWL_Widget*> parents; | 
| -    while (parent) { | 
| -      parents.Add(parent); | 
| -      parent = parent->GetParent(); | 
| -    } | 
| -    matrix.SetIdentity(); | 
| -    CFX_Matrix ctmOnParent; | 
| -    CFX_RectF rect; | 
| -    int32_t count = parents.GetSize(); | 
| -    for (int32_t i = count - 2; i >= 0; i--) { | 
| -      parent = parents.GetAt(i); | 
| -      parent->GetMatrix(ctmOnParent, false); | 
| -      parent->GetWidgetRect(rect); | 
| -      matrix.Concat(ctmOnParent, true); | 
| -      matrix.Translate(rect.left, rect.top, true); | 
| -    } | 
| -    CFX_Matrix m; | 
| -    m.SetIdentity(); | 
| -    matrix.Concat(m, true); | 
| -    parents.RemoveAll(); | 
| -  } else { | 
| +  if (!bGlobal) { | 
| matrix.SetIdentity(); | 
| +    return; | 
| +  } | 
| + | 
| +  IFWL_Widget* parent = GetParent(); | 
| +  CFX_ArrayTemplate<IFWL_Widget*> parents; | 
| +  while (parent) { | 
| +    parents.Add(parent); | 
| +    parent = parent->GetParent(); | 
| +  } | 
| +  matrix.SetIdentity(); | 
| +  CFX_Matrix ctmOnParent; | 
| +  CFX_RectF rect; | 
| +  int32_t count = parents.GetSize(); | 
| +  for (int32_t i = count - 2; i >= 0; i--) { | 
| +    parent = parents.GetAt(i); | 
| +    parent->GetMatrix(ctmOnParent, false); | 
| +    parent->GetWidgetRect(rect); | 
| +    matrix.Concat(ctmOnParent, true); | 
| +    matrix.Translate(rect.left, rect.top, true); | 
| } | 
| +  CFX_Matrix m; | 
| +  m.SetIdentity(); | 
| +  matrix.Concat(m, true); | 
| +  parents.RemoveAll(); | 
| } | 
|  | 
| void IFWL_Widget::DrawWidget(CFX_Graphics* pGraphics, | 
| @@ -317,15 +319,16 @@ void* IFWL_Widget::GetThemeCapacity(CFWL_WidgetCapacity dwCapacity) { | 
| IFWL_ThemeProvider* pTheme = GetAvailableTheme(); | 
| if (!pTheme) | 
| return nullptr; | 
| + | 
| CFWL_ThemePart part; | 
| part.m_pWidget = this; | 
| return pTheme->GetCapacity(&part, dwCapacity); | 
| } | 
|  | 
| IFWL_ThemeProvider* IFWL_Widget::GetAvailableTheme() { | 
| -  if (m_pProperties->m_pThemeProvider) { | 
| +  if (m_pProperties->m_pThemeProvider) | 
| return m_pProperties->m_pThemeProvider; | 
| -  } | 
| + | 
| IFWL_Widget* pUp = this; | 
| do { | 
| pUp = (pUp->GetStyles() & FWL_WGTSTYLE_Popup) | 
| @@ -344,9 +347,9 @@ IFWL_Widget* IFWL_Widget::GetRootOuter() { | 
| IFWL_Widget* pRet = m_pOuter; | 
| if (!pRet) | 
| return nullptr; | 
| -  while (IFWL_Widget* pOuter = pRet->GetOuter()) { | 
| + | 
| +  while (IFWL_Widget* pOuter = pRet->GetOuter()) | 
| pRet = pOuter; | 
| -  } | 
| return pRet; | 
| } | 
|  | 
| @@ -400,17 +403,17 @@ void IFWL_Widget::SetFocus(bool bFocus) { | 
| return; | 
|  | 
| IFWL_Widget* curFocus = pDriver->GetFocus(); | 
| -  if (bFocus && curFocus != this) { | 
| +  if (bFocus && curFocus != this) | 
| pDriver->SetFocus(this); | 
| -  } else if (!bFocus && curFocus == this) { | 
| +  else if (!bFocus && curFocus == this) | 
| pDriver->SetFocus(nullptr); | 
| -  } | 
| } | 
|  | 
| void IFWL_Widget::SetGrab(bool bSet) { | 
| const IFWL_App* pApp = GetOwnerApp(); | 
| if (!pApp) | 
| return; | 
| + | 
| CFWL_NoteDriver* pDriver = | 
| static_cast<CFWL_NoteDriver*>(pApp->GetNoteDriver()); | 
| pDriver->SetGrab(this, bSet); | 
| @@ -479,19 +482,19 @@ bool IFWL_Widget::GetPopupPosComboBox(FX_FLOAT fMinHeight, | 
| FX_FLOAT fy = 0; | 
|  | 
| FX_FLOAT fPopHeight = rtPopup.height; | 
| -  if (rtPopup.height > fMaxHeight) { | 
| +  if (rtPopup.height > fMaxHeight) | 
| fPopHeight = fMaxHeight; | 
| -  } else if (rtPopup.height < fMinHeight) { | 
| +  else if (rtPopup.height < fMinHeight) | 
| fPopHeight = fMinHeight; | 
| -  } | 
| + | 
| FX_FLOAT fWidth = std::max(rtAnchor.width, rtPopup.width); | 
| FX_FLOAT fBottom = rtAnchor.bottom() + fPopHeight; | 
| TransformTo(nullptr, fx, fy); | 
| -  if (fBottom + fy > 0.0f) { | 
| +  if (fBottom + fy > 0.0f) | 
| rtPopup.Set(rtAnchor.left, rtAnchor.top - fPopHeight, fWidth, fPopHeight); | 
| -  } else { | 
| +  else | 
| rtPopup.Set(rtAnchor.left, rtAnchor.bottom(), fWidth, fPopHeight); | 
| -  } | 
| + | 
| rtPopup.Offset(fx, fy); | 
| return true; | 
| } | 
| @@ -543,6 +546,7 @@ void IFWL_Widget::UnregisterEventTarget() { | 
| void IFWL_Widget::DispatchKeyEvent(CFWL_MsgKey* pNote) { | 
| if (!pNote) | 
| return; | 
| + | 
| CFWL_EvtKey* pEvent = new CFWL_EvtKey; | 
| pEvent->m_pSrcTarget = this; | 
| pEvent->m_dwCmd = pNote->m_dwCmd; | 
| @@ -560,6 +564,7 @@ void IFWL_Widget::DispatchEvent(CFWL_Event* pEvent) { | 
| const IFWL_App* pApp = GetOwnerApp(); | 
| if (!pApp) | 
| return; | 
| + | 
| CFWL_NoteDriver* pNoteDriver = pApp->GetNoteDriver(); | 
| if (!pNoteDriver) | 
| return; | 
| @@ -587,9 +592,8 @@ void IFWL_Widget::DrawBackground(CFX_Graphics* pGraphics, | 
| param.m_pWidget = this; | 
| param.m_iPart = iPartBk; | 
| param.m_pGraphics = pGraphics; | 
| -  if (pMatrix) { | 
| +  if (pMatrix) | 
| param.m_matrix.Concat(*pMatrix, true); | 
| -  } | 
| param.m_rtPart = rtRelative; | 
| pTheme->DrawBackground(¶m); | 
| } | 
| @@ -604,9 +608,8 @@ void IFWL_Widget::DrawBorder(CFX_Graphics* pGraphics, | 
| param.m_pWidget = this; | 
| param.m_iPart = iPartBorder; | 
| param.m_pGraphics = pGraphics; | 
| -  if (pMatrix) { | 
| +  if (pMatrix) | 
| param.m_matrix.Concat(*pMatrix, true); | 
| -  } | 
| param.m_rtPart = rtRelative; | 
| pTheme->DrawBackground(¶m); | 
| } | 
| @@ -621,9 +624,8 @@ void IFWL_Widget::DrawEdge(CFX_Graphics* pGraphics, | 
| param.m_pWidget = this; | 
| param.m_iPart = iPartEdge; | 
| param.m_pGraphics = pGraphics; | 
| -  if (pMatrix) { | 
| +  if (pMatrix) | 
| param.m_matrix.Concat(*pMatrix, true); | 
| -  } | 
| param.m_rtPart = rtEdge; | 
| pTheme->DrawBackground(¶m); | 
| } | 
|  |