Remove IXFA_* interfaces.

This CL removes the IXFA_* interfaces which are:
 - Implemented once.
 - Not implemented by an fpdfsdk class.

This requires making a few classes visible to fpdfsdk so we can have the
correct instances available instead of the IXFA types.

Review URL: https://codereview.chromium.org/1846993002
diff --git a/xfa/include/fxfa/fxfa.h b/xfa/include/fxfa/fxfa.h
index c55ddf2..624502a 100644
--- a/xfa/include/fxfa/fxfa.h
+++ b/xfa/include/fxfa/fxfa.h
@@ -14,40 +14,17 @@
 
 class CFX_Graphics;
 class CPDF_Document;
+class CXFA_FFPageView;
 class CXFA_Node;
 class CXFA_NodeList;
 class CXFA_WidgetAcc;
 class IFWL_AdapterTimerMgr;
 class IFX_Font;
-class IXFA_App;
 class IXFA_AppProvider;
-class IXFA_ChecksumContext;
-class IXFA_DocHandler;
 class IXFA_DocProvider;
-class IXFA_DocView;
-class IXFA_FontMgr;
-class IXFA_MenuHandler;
-class IXFA_PageView;
 class IXFA_WidgetAccIterator;
-class IXFA_WidgetHandler;
 class IXFA_WidgetIterator;
 
-class IXFA_Doc {
- public:
-  virtual ~IXFA_Doc() {}
-
- protected:
-  IXFA_Doc() {}
-};
-
-class IXFA_Widget {
- public:
-  virtual ~IXFA_Widget() {}
-
- protected:
-  IXFA_Widget() {}
-};
-
 #define XFA_MBICON_Error 0
 #define XFA_MBICON_Warning 1
 #define XFA_MBICON_Question 2
@@ -288,62 +265,7 @@
                                  FX_BOOL bOpen = TRUE) = 0;
   virtual IFWL_AdapterTimerMgr* GetTimerMgr() = 0;
 };
-class IXFA_FontMgr {
- public:
-  static IXFA_FontMgr* CreateDefault();
-  virtual ~IXFA_FontMgr();
 
-  virtual IFX_Font* GetFont(IXFA_Doc* hDoc,
-                            const CFX_WideStringC& wsFontFamily,
-                            uint32_t dwFontStyles,
-                            uint16_t wCodePage = 0xFFFF) = 0;
-  virtual IFX_Font* GetDefaultFont(IXFA_Doc* hDoc,
-                                   const CFX_WideStringC& wsFontFamily,
-                                   uint32_t dwFontStyles,
-                                   uint16_t wCodePage = 0xFFFF) = 0;
-};
-class IXFA_App {
- public:
-  static IXFA_App* Create(IXFA_AppProvider* pProvider);
-  virtual ~IXFA_App();
-
-  virtual IXFA_DocHandler* GetDocHandler() = 0;
-  virtual IXFA_Doc* CreateDoc(IXFA_DocProvider* pProvider,
-                              IFX_FileRead* pStream,
-                              FX_BOOL bTakeOverFile = TRUE) = 0;
-  virtual IXFA_Doc* CreateDoc(IXFA_DocProvider* pProvider,
-                              CPDF_Document* pPDFDoc) = 0;
-  virtual IXFA_AppProvider* GetAppProvider() = 0;
-  virtual void SetDefaultFontMgr(IXFA_FontMgr* pFontMgr) = 0;
-  virtual IXFA_MenuHandler* GetMenuHandler() = 0;
-};
-class IXFA_MenuHandler {
- public:
-  virtual ~IXFA_MenuHandler() {}
-
-  virtual FX_BOOL CanCopy(IXFA_Widget* hWidget) = 0;
-  virtual FX_BOOL CanCut(IXFA_Widget* hWidget) = 0;
-  virtual FX_BOOL CanPaste(IXFA_Widget* hWidget) = 0;
-  virtual FX_BOOL CanSelectAll(IXFA_Widget* hWidget) = 0;
-  virtual FX_BOOL CanDelete(IXFA_Widget* hWidget) = 0;
-  virtual FX_BOOL CanDeSelect(IXFA_Widget* hWidget) = 0;
-  virtual FX_BOOL Copy(IXFA_Widget* hWidget, CFX_WideString& wsText) = 0;
-  virtual FX_BOOL Cut(IXFA_Widget* hWidget, CFX_WideString& wsText) = 0;
-  virtual FX_BOOL Paste(IXFA_Widget* hWidget, const CFX_WideString& wsText) = 0;
-  virtual FX_BOOL SelectAll(IXFA_Widget* hWidget) = 0;
-  virtual FX_BOOL Delete(IXFA_Widget* hWidget) = 0;
-  virtual FX_BOOL DeSelect(IXFA_Widget* hWidget) = 0;
-  virtual FX_BOOL CanUndo(IXFA_Widget* hWidget) = 0;
-  virtual FX_BOOL CanRedo(IXFA_Widget* hWidget) = 0;
-  virtual FX_BOOL Undo(IXFA_Widget* hWidget) = 0;
-  virtual FX_BOOL Redo(IXFA_Widget* hWidget) = 0;
-  virtual FX_BOOL GetSuggestWords(IXFA_Widget* hWidget,
-                                  CFX_PointF pointf,
-                                  std::vector<CFX_ByteString>& sSuggest) = 0;
-  virtual FX_BOOL ReplaceSpellCheckWord(IXFA_Widget* hWidget,
-                                        CFX_PointF pointf,
-                                        const CFX_ByteStringC& bsReplace) = 0;
-};
 #define XFA_INVALIDATE_AllPages 0x00000000
 #define XFA_INVALIDATE_CurrentPage 0x00000001
 #define XFA_PRINTOPT_ShowDialog 0x00000001
@@ -365,65 +287,65 @@
  public:
   virtual ~IXFA_DocProvider() {}
 
-  virtual void SetChangeMark(IXFA_Doc* hDoc) = 0;
-  virtual void InvalidateRect(IXFA_PageView* pPageView,
+  virtual void SetChangeMark(CXFA_FFDoc* hDoc) = 0;
+  virtual void InvalidateRect(CXFA_FFPageView* pPageView,
                               const CFX_RectF& rt,
                               uint32_t dwFlags = 0) = 0;
-  virtual void DisplayCaret(IXFA_Widget* hWidget,
+  virtual void DisplayCaret(CXFA_FFWidget* hWidget,
                             FX_BOOL bVisible,
                             const CFX_RectF* pRtAnchor) = 0;
-  virtual FX_BOOL GetPopupPos(IXFA_Widget* hWidget,
+  virtual FX_BOOL GetPopupPos(CXFA_FFWidget* hWidget,
                               FX_FLOAT fMinPopup,
                               FX_FLOAT fMaxPopup,
                               const CFX_RectF& rtAnchor,
                               CFX_RectF& rtPopup) = 0;
-  virtual FX_BOOL PopupMenu(IXFA_Widget* hWidget,
+  virtual FX_BOOL PopupMenu(CXFA_FFWidget* hWidget,
                             CFX_PointF ptPopup,
                             const CFX_RectF* pRectExclude = NULL) = 0;
-  virtual void PageViewEvent(IXFA_PageView* pPageView, uint32_t dwFlags) = 0;
-  virtual void WidgetEvent(IXFA_Widget* hWidget,
+  virtual void PageViewEvent(CXFA_FFPageView* pPageView, uint32_t dwFlags) = 0;
+  virtual void WidgetEvent(CXFA_FFWidget* hWidget,
                            CXFA_WidgetAcc* pWidgetData,
                            uint32_t dwEvent,
                            void* pParam = NULL,
                            void* pAdditional = NULL) = 0;
-  virtual FX_BOOL RenderCustomWidget(IXFA_Widget* hWidget,
+  virtual FX_BOOL RenderCustomWidget(CXFA_FFWidget* hWidget,
                                      CFX_Graphics* pGS,
                                      CFX_Matrix* pMatrix,
                                      const CFX_RectF& rtUI) {
     return FALSE;
   }
-  virtual int32_t CountPages(IXFA_Doc* hDoc) = 0;
-  virtual int32_t GetCurrentPage(IXFA_Doc* hDoc) = 0;
-  virtual void SetCurrentPage(IXFA_Doc* hDoc, int32_t iCurPage) = 0;
-  virtual FX_BOOL IsCalculationsEnabled(IXFA_Doc* hDoc) = 0;
-  virtual void SetCalculationsEnabled(IXFA_Doc* hDoc, FX_BOOL bEnabled) = 0;
-  virtual void GetTitle(IXFA_Doc* hDoc, CFX_WideString& wsTitle) = 0;
-  virtual void SetTitle(IXFA_Doc* hDoc, const CFX_WideStringC& wsTitle) = 0;
-  virtual void ExportData(IXFA_Doc* hDoc,
+  virtual int32_t CountPages(CXFA_FFDoc* hDoc) = 0;
+  virtual int32_t GetCurrentPage(CXFA_FFDoc* hDoc) = 0;
+  virtual void SetCurrentPage(CXFA_FFDoc* hDoc, int32_t iCurPage) = 0;
+  virtual FX_BOOL IsCalculationsEnabled(CXFA_FFDoc* hDoc) = 0;
+  virtual void SetCalculationsEnabled(CXFA_FFDoc* hDoc, FX_BOOL bEnabled) = 0;
+  virtual void GetTitle(CXFA_FFDoc* hDoc, CFX_WideString& wsTitle) = 0;
+  virtual void SetTitle(CXFA_FFDoc* hDoc, const CFX_WideStringC& wsTitle) = 0;
+  virtual void ExportData(CXFA_FFDoc* hDoc,
                           const CFX_WideStringC& wsFilePath,
                           FX_BOOL bXDP = TRUE) = 0;
-  virtual void ImportData(IXFA_Doc* hDoc,
+  virtual void ImportData(CXFA_FFDoc* hDoc,
                           const CFX_WideStringC& wsFilePath) = 0;
-  virtual void GotoURL(IXFA_Doc* hDoc,
+  virtual void GotoURL(CXFA_FFDoc* hDoc,
                        const CFX_WideStringC& bsURL,
                        FX_BOOL bAppend = TRUE) = 0;
-  virtual FX_BOOL IsValidationsEnabled(IXFA_Doc* hDoc) = 0;
-  virtual void SetValidationsEnabled(IXFA_Doc* hDoc, FX_BOOL bEnabled) = 0;
-  virtual void SetFocusWidget(IXFA_Doc* hDoc, IXFA_Widget* hWidget) = 0;
-  virtual void Print(IXFA_Doc* hDoc,
+  virtual FX_BOOL IsValidationsEnabled(CXFA_FFDoc* hDoc) = 0;
+  virtual void SetValidationsEnabled(CXFA_FFDoc* hDoc, FX_BOOL bEnabled) = 0;
+  virtual void SetFocusWidget(CXFA_FFDoc* hDoc, CXFA_FFWidget* hWidget) = 0;
+  virtual void Print(CXFA_FFDoc* hDoc,
                      int32_t nStartPage,
                      int32_t nEndPage,
                      uint32_t dwOptions) = 0;
-  virtual int32_t AbsPageCountInBatch(IXFA_Doc* hDoc) = 0;
-  virtual int32_t AbsPageInBatch(IXFA_Doc* hDoc, IXFA_Widget* hWidget) = 0;
-  virtual int32_t SheetCountInBatch(IXFA_Doc* hDoc) = 0;
-  virtual int32_t SheetInBatch(IXFA_Doc* hDoc, IXFA_Widget* hWidget) = 0;
-  virtual int32_t Verify(IXFA_Doc* hDoc,
+  virtual int32_t AbsPageCountInBatch(CXFA_FFDoc* hDoc) = 0;
+  virtual int32_t AbsPageInBatch(CXFA_FFDoc* hDoc, CXFA_FFWidget* hWidget) = 0;
+  virtual int32_t SheetCountInBatch(CXFA_FFDoc* hDoc) = 0;
+  virtual int32_t SheetInBatch(CXFA_FFDoc* hDoc, CXFA_FFWidget* hWidget) = 0;
+  virtual int32_t Verify(CXFA_FFDoc* hDoc,
                          CXFA_Node* pSigNode,
                          FX_BOOL bUsed = TRUE) {
     return 0;
   }
-  virtual FX_BOOL Sign(IXFA_Doc* hDoc,
+  virtual FX_BOOL Sign(CXFA_FFDoc* hDoc,
                        CXFA_NodeList* pNodeList,
                        const CFX_WideStringC& wsExpression,
                        const CFX_WideStringC& wsXMLIdent,
@@ -431,33 +353,33 @@
                        FX_BOOL bUsed = TRUE) {
     return 0;
   }
-  virtual CXFA_NodeList* Enumerate(IXFA_Doc* hDoc) { return 0; }
-  virtual FX_BOOL Clear(IXFA_Doc* hDoc,
+  virtual CXFA_NodeList* Enumerate(CXFA_FFDoc* hDoc) { return 0; }
+  virtual FX_BOOL Clear(CXFA_FFDoc* hDoc,
                         CXFA_Node* pSigNode,
                         FX_BOOL bCleared = TRUE) {
     return 0;
   }
-  virtual void GetURL(IXFA_Doc* hDoc, CFX_WideString& wsDocURL) = 0;
-  virtual FX_ARGB GetHighlightColor(IXFA_Doc* hDoc) = 0;
+  virtual void GetURL(CXFA_FFDoc* hDoc, CFX_WideString& wsDocURL) = 0;
+  virtual FX_ARGB GetHighlightColor(CXFA_FFDoc* hDoc) = 0;
 
-  virtual FX_BOOL SubmitData(IXFA_Doc* hDoc, CXFA_Submit submit) = 0;
-  virtual FX_BOOL CheckWord(IXFA_Doc* hDoc, const CFX_ByteStringC& sWord) = 0;
-  virtual FX_BOOL GetSuggestWords(IXFA_Doc* hDoc,
+  virtual FX_BOOL SubmitData(CXFA_FFDoc* hDoc, CXFA_Submit submit) = 0;
+  virtual FX_BOOL CheckWord(CXFA_FFDoc* hDoc, const CFX_ByteStringC& sWord) = 0;
+  virtual FX_BOOL GetSuggestWords(CXFA_FFDoc* hDoc,
                                   const CFX_ByteStringC& sWord,
                                   std::vector<CFX_ByteString>& sSuggest) = 0;
-  virtual FX_BOOL GetPDFScriptObject(IXFA_Doc* hDoc,
+  virtual FX_BOOL GetPDFScriptObject(CXFA_FFDoc* hDoc,
                                      const CFX_ByteStringC& utf8Name,
                                      FXJSE_HVALUE hValue) = 0;
-  virtual FX_BOOL GetGlobalProperty(IXFA_Doc* hDoc,
+  virtual FX_BOOL GetGlobalProperty(CXFA_FFDoc* hDoc,
                                     const CFX_ByteStringC& szPropName,
                                     FXJSE_HVALUE hValue) = 0;
-  virtual FX_BOOL SetGlobalProperty(IXFA_Doc* hDoc,
+  virtual FX_BOOL SetGlobalProperty(CXFA_FFDoc* hDoc,
                                     const CFX_ByteStringC& szPropName,
                                     FXJSE_HVALUE hValue) = 0;
-  virtual CPDF_Document* OpenPDF(IXFA_Doc* hDoc,
+  virtual CPDF_Document* OpenPDF(CXFA_FFDoc* hDoc,
                                  IFX_FileRead* pFile,
                                  FX_BOOL bTakeOverFile) = 0;
-  virtual IFX_FileRead* OpenLinkedFile(IXFA_Doc* hDoc,
+  virtual IFX_FileRead* OpenLinkedFile(CXFA_FFDoc* hDoc,
                                        const CFX_WideString& wsLink) = 0;
 };
 #define XFA_DOCVIEW_View 0x00000000
@@ -471,43 +393,7 @@
 #define XFA_PARSESTATUS_SyntaxErr -1
 #define XFA_PARSESTATUS_Ready 0
 #define XFA_PARSESTATUS_Done 100
-class IXFA_DocHandler {
- public:
-  virtual ~IXFA_DocHandler() {}
 
-  virtual void ReleaseDoc(IXFA_Doc* hDoc) = 0;
-  virtual IXFA_DocProvider* GetDocProvider(IXFA_Doc* hDoc) = 0;
-
-  virtual uint32_t GetDocType(IXFA_Doc* hDoc) = 0;
-  virtual int32_t StartLoad(IXFA_Doc* hDoc) = 0;
-  virtual int32_t DoLoad(IXFA_Doc* hDoc, IFX_Pause* pPause = NULL) = 0;
-  virtual void StopLoad(IXFA_Doc* hDoc) = 0;
-
-  virtual IXFA_DocView* CreateDocView(IXFA_Doc* hDoc, uint32_t dwView = 0) = 0;
-
-  virtual int32_t CountPackages(IXFA_Doc* hDoc) = 0;
-  virtual void GetPackageName(IXFA_Doc* hDoc,
-                              int32_t iPackage,
-                              CFX_WideStringC& wsPackage) = 0;
-
-  virtual FX_BOOL SavePackage(IXFA_Doc* hDoc,
-                              const CFX_WideStringC& wsPackage,
-                              IFX_FileWrite* pFile,
-                              IXFA_ChecksumContext* pCSContext = NULL) = 0;
-  virtual FX_BOOL CloseDoc(IXFA_Doc* hDoc) = 0;
-
-  virtual FX_BOOL ImportData(IXFA_Doc* hDoc,
-                             IFX_FileRead* pStream,
-                             FX_BOOL bXDP = TRUE) = 0;
-  virtual void SetJSERuntime(IXFA_Doc* hDoc, FXJSE_HRUNTIME hRuntime) = 0;
-  virtual FXJSE_HVALUE GetXFAScriptObject(IXFA_Doc* hDoc) = 0;
-  virtual XFA_ATTRIBUTEENUM GetRestoreState(IXFA_Doc* hDoc) = 0;
-  virtual FX_BOOL RunDocScript(IXFA_Doc* hDoc,
-                               XFA_SCRIPTTYPE eScriptType,
-                               const CFX_WideStringC& wsScript,
-                               FXJSE_HVALUE hRetValue,
-                               FXJSE_HVALUE hThisObject) = 0;
-};
 enum XFA_EVENTTYPE {
   XFA_EVENT_Click,
   XFA_EVENT_Change,
@@ -601,32 +487,7 @@
 enum XFA_WIDGETORDER {
   XFA_WIDGETORDER_PreOrder,
 };
-class IXFA_DocView {
- public:
-  virtual ~IXFA_DocView() {}
 
-  virtual IXFA_Doc* GetDoc() = 0;
-  virtual int32_t StartLayout(int32_t iStartPage = 0) = 0;
-  virtual int32_t DoLayout(IFX_Pause* pPause = NULL) = 0;
-  virtual void StopLayout() = 0;
-
-  virtual int32_t GetLayoutStatus() = 0;
-  virtual void UpdateDocView() = 0;
-  virtual int32_t CountPageViews() = 0;
-  virtual IXFA_PageView* GetPageView(int32_t nIndex) = 0;
-  virtual IXFA_Widget* GetWidgetByName(const CFX_WideStringC& wsName) = 0;
-  virtual CXFA_WidgetAcc* GetWidgetAccByName(const CFX_WideStringC& wsName) = 0;
-  virtual void ResetWidgetData(CXFA_WidgetAcc* pWidgetAcc = NULL) = 0;
-  virtual int32_t ProcessWidgetEvent(CXFA_EventParam* pParam,
-                                     CXFA_WidgetAcc* pWidgetAcc = NULL) = 0;
-  virtual IXFA_WidgetHandler* GetWidgetHandler() = 0;
-  virtual IXFA_WidgetIterator* CreateWidgetIterator() = 0;
-  virtual IXFA_WidgetAccIterator* CreateWidgetAccIterator(
-      XFA_WIDGETORDER eOrder = XFA_WIDGETORDER_PreOrder) = 0;
-  virtual IXFA_Widget* GetFocusWidget() = 0;
-  virtual void KillFocus() = 0;
-  virtual FX_BOOL SetFocus(IXFA_Widget* hWidget) = 0;
-};
 #define XFA_TRAVERSEWAY_Tranvalse 0x0001
 #define XFA_TRAVERSEWAY_Form 0x0002
 #define XFA_WIDGETFILTER_Visible 0x0001
@@ -634,27 +495,7 @@
 #define XFA_WIDGETFILTER_Printable 0x0020
 #define XFA_WIDGETFILTER_Field 0x0100
 #define XFA_WIDGETFILTER_AllType 0x0F00
-class IXFA_PageView {
- public:
-  virtual ~IXFA_PageView() {}
 
-  virtual IXFA_DocView* GetDocView() = 0;
-  virtual int32_t GetPageViewIndex() = 0;
-  virtual void GetPageViewRect(CFX_RectF& rtPage) = 0;
-
-  virtual void GetDisplayMatrix(CFX_Matrix& mt,
-                                const CFX_Rect& rtDisp,
-                                int32_t iRotate) = 0;
-
-  virtual int32_t LoadPageView(IFX_Pause* pPause = NULL) = 0;
-  virtual void UnloadPageView() = 0;
-  virtual IXFA_Widget* GetWidgetByPos(FX_FLOAT fx, FX_FLOAT fy) = 0;
-  virtual IXFA_WidgetIterator* CreateWidgetIterator(
-      uint32_t dwTraverseWay = XFA_TRAVERSEWAY_Form,
-      uint32_t dwWidgetFilter = XFA_WIDGETFILTER_Visible |
-                                XFA_WIDGETFILTER_Viewable |
-                                XFA_WIDGETFILTER_AllType) = 0;
-};
 class CXFA_RenderOptions {
  public:
   CXFA_RenderOptions() : m_bPrint(FALSE), m_bHighlight(TRUE) {}
@@ -665,20 +506,7 @@
 #define XFA_RENDERSTATUS_ToBeContinued 2
 #define XFA_RENDERSTATUS_Done 3
 #define XFA_RENDERSTATUS_Failed -1
-class IXFA_RenderContext {
- public:
-  virtual void Release() = 0;
-  virtual int32_t StartRender(IXFA_PageView* pPageView,
-                              CFX_Graphics* pGS,
-                              const CFX_Matrix& pMatrix,
-                              const CXFA_RenderOptions& options) = 0;
-  virtual int32_t DoRender(IFX_Pause* pPause = NULL) = 0;
-  virtual void StopRender() = 0;
 
- protected:
-  ~IXFA_RenderContext() {}
-};
-IXFA_RenderContext* XFA_RenderContext_Create();
 enum XFA_WIDGETTYPE {
   XFA_WIDGETTYPE_Barcode,
   XFA_WIDGETTYPE_PushButton,
@@ -708,139 +536,20 @@
 #define XFA_WIDGETSTATUS_Viewable 0x00000010
 #define XFA_WIDGETSTATUS_Printable 0x00000020
 #define XFA_WIDGETSTATUS_Focused 0x00000100
-class IXFA_WidgetHandler {
- public:
-  virtual ~IXFA_WidgetHandler() {}
 
-  virtual IXFA_Widget* CreateWidget(IXFA_Widget* hParent,
-                                    XFA_WIDGETTYPE eType,
-                                    IXFA_Widget* hBefore = NULL) = 0;
-  virtual IXFA_PageView* GetPageView(IXFA_Widget* hWidget) = 0;
-  virtual void GetRect(IXFA_Widget* hWidget, CFX_RectF& rt) = 0;
-  virtual uint32_t GetStatus(IXFA_Widget* hWidget) = 0;
-  virtual FX_BOOL GetBBox(IXFA_Widget* hWidget,
-                          CFX_RectF& rtBox,
-                          uint32_t dwStatus,
-                          FX_BOOL bDrawFocus = FALSE) = 0;
-  virtual CXFA_WidgetAcc* GetDataAcc(IXFA_Widget* hWidget) = 0;
-
-  virtual void GetName(IXFA_Widget* hWidget,
-                       CFX_WideString& wsName,
-                       int32_t iNameType = 0) = 0;
-  virtual FX_BOOL GetToolTip(IXFA_Widget* hWidget,
-                             CFX_WideString& wsToolTip) = 0;
-  virtual void SetPrivateData(IXFA_Widget* hWidget,
-                              void* module_id,
-                              void* pData,
-                              PD_CALLBACK_FREEDATA callback) = 0;
-  virtual void* GetPrivateData(IXFA_Widget* hWidget, void* module_id) = 0;
-  virtual FX_BOOL OnMouseEnter(IXFA_Widget* hWidget) = 0;
-  virtual FX_BOOL OnMouseExit(IXFA_Widget* hWidget) = 0;
-  virtual FX_BOOL OnLButtonDown(IXFA_Widget* hWidget,
-                                uint32_t dwFlags,
-                                FX_FLOAT fx,
-                                FX_FLOAT fy) = 0;
-  virtual FX_BOOL OnLButtonUp(IXFA_Widget* hWidget,
-                              uint32_t dwFlags,
-                              FX_FLOAT fx,
-                              FX_FLOAT fy) = 0;
-  virtual FX_BOOL OnLButtonDblClk(IXFA_Widget* hWidget,
-                                  uint32_t dwFlags,
-                                  FX_FLOAT fx,
-                                  FX_FLOAT fy) = 0;
-  virtual FX_BOOL OnMouseMove(IXFA_Widget* hWidget,
-                              uint32_t dwFlags,
-                              FX_FLOAT fx,
-                              FX_FLOAT fy) = 0;
-  virtual FX_BOOL OnMouseWheel(IXFA_Widget* hWidget,
-                               uint32_t dwFlags,
-                               int16_t zDelta,
-                               FX_FLOAT fx,
-                               FX_FLOAT fy) = 0;
-  virtual FX_BOOL OnRButtonDown(IXFA_Widget* hWidget,
-                                uint32_t dwFlags,
-                                FX_FLOAT fx,
-                                FX_FLOAT fy) = 0;
-  virtual FX_BOOL OnRButtonUp(IXFA_Widget* hWidget,
-                              uint32_t dwFlags,
-                              FX_FLOAT fx,
-                              FX_FLOAT fy) = 0;
-  virtual FX_BOOL OnRButtonDblClk(IXFA_Widget* hWidget,
-                                  uint32_t dwFlags,
-                                  FX_FLOAT fx,
-                                  FX_FLOAT fy) = 0;
-
-  virtual FX_BOOL OnKeyDown(IXFA_Widget* hWidget,
-                            uint32_t dwKeyCode,
-                            uint32_t dwFlags) = 0;
-  virtual FX_BOOL OnKeyUp(IXFA_Widget* hWidget,
-                          uint32_t dwKeyCode,
-                          uint32_t dwFlags) = 0;
-  virtual FX_BOOL OnChar(IXFA_Widget* hWidget,
-                         uint32_t dwChar,
-                         uint32_t dwFlags) = 0;
-  virtual uint32_t OnHitTest(IXFA_Widget* hWidget,
-                             FX_FLOAT fx,
-                             FX_FLOAT fy) = 0;
-  virtual FX_BOOL OnSetCursor(IXFA_Widget* hWidget,
-                              FX_FLOAT fx,
-                              FX_FLOAT fy) = 0;
-
-  virtual void RenderWidget(IXFA_Widget* hWidget,
-                            CFX_Graphics* pGS,
-                            CFX_Matrix* pMatrix = NULL,
-                            FX_BOOL bHighlight = FALSE) = 0;
-  virtual FX_BOOL HasEvent(CXFA_WidgetAcc* pWidgetAcc,
-                           XFA_EVENTTYPE eEventType) = 0;
-  virtual int32_t ProcessEvent(CXFA_WidgetAcc* pWidgetAcc,
-                               CXFA_EventParam* pParam) = 0;
-};
 class IXFA_WidgetIterator {
  public:
   virtual void Release() = 0;
   virtual void Reset() = 0;
-  virtual IXFA_Widget* MoveToFirst() = 0;
-  virtual IXFA_Widget* MoveToLast() = 0;
-  virtual IXFA_Widget* MoveToNext() = 0;
-  virtual IXFA_Widget* MoveToPrevious() = 0;
-  virtual IXFA_Widget* GetCurrentWidget() = 0;
-  virtual FX_BOOL SetCurrentWidget(IXFA_Widget* hWidget) = 0;
+  virtual CXFA_FFWidget* MoveToFirst() = 0;
+  virtual CXFA_FFWidget* MoveToLast() = 0;
+  virtual CXFA_FFWidget* MoveToNext() = 0;
+  virtual CXFA_FFWidget* MoveToPrevious() = 0;
+  virtual CXFA_FFWidget* GetCurrentWidget() = 0;
+  virtual FX_BOOL SetCurrentWidget(CXFA_FFWidget* hWidget) = 0;
 
  protected:
   ~IXFA_WidgetIterator() {}
 };
-class IXFA_WidgetAccIterator {
- public:
-  virtual void Release() = 0;
-  virtual void Reset() = 0;
-  virtual CXFA_WidgetAcc* MoveToFirst() = 0;
-  virtual CXFA_WidgetAcc* MoveToLast() = 0;
-  virtual CXFA_WidgetAcc* MoveToNext() = 0;
-  virtual CXFA_WidgetAcc* MoveToPrevious() = 0;
-  virtual CXFA_WidgetAcc* GetCurrentWidgetAcc() = 0;
-  virtual FX_BOOL SetCurrentWidgetAcc(CXFA_WidgetAcc* hWidget) = 0;
-  virtual void SkipTree() = 0;
-
- protected:
-  ~IXFA_WidgetAccIterator() {}
-};
-IXFA_WidgetAccIterator* XFA_WidgetAccIterator_Create(
-    CXFA_WidgetAcc* pTravelRoot,
-    XFA_WIDGETORDER eOrder = XFA_WIDGETORDER_PreOrder);
-class IXFA_ChecksumContext {
- public:
-  virtual void Release() = 0;
-
-  virtual FX_BOOL StartChecksum() = 0;
-  virtual FX_BOOL UpdateChecksum(IFX_FileRead* pSrcFile,
-                                 FX_FILESIZE offset = 0,
-                                 size_t size = 0) = 0;
-  virtual void FinishChecksum() = 0;
-  virtual void GetChecksum(CFX_ByteString& bsChecksum) = 0;
-
- protected:
-  ~IXFA_ChecksumContext() {}
-};
-IXFA_ChecksumContext* XFA_Checksum_Create();
 
 #endif  // XFA_INCLUDE_FXFA_FXFA_H_
diff --git a/xfa/include/fxfa/xfa_checksum.h b/xfa/include/fxfa/xfa_checksum.h
new file mode 100644
index 0000000..3ca79ef
--- /dev/null
+++ b/xfa/include/fxfa/xfa_checksum.h
@@ -0,0 +1,74 @@
+// Copyright 2014 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 XFA_INCLUDE_FXFA_XFA_CHECKSUM_H_
+#define XFA_INCLUDE_FXFA_XFA_CHECKSUM_H_
+
+#include "xfa/fgas/xml/fgas_sax.h"
+#include "xfa/include/fxfa/fxfa.h"
+
+class CXFA_SAXReaderHandler;
+class CXFA_ChecksumContext;
+
+class CXFA_SAXContext {
+ public:
+  CXFA_SAXContext() : m_eNode(FX_SAXNODE_Unknown) {}
+  CFX_ByteTextBuf m_TextBuf;
+  CFX_ByteString m_bsTagName;
+  FX_SAXNODE m_eNode;
+};
+class CXFA_SAXReaderHandler : public IFX_SAXReaderHandler {
+ public:
+  CXFA_SAXReaderHandler(CXFA_ChecksumContext* pContext);
+  virtual ~CXFA_SAXReaderHandler();
+  virtual void* OnTagEnter(const CFX_ByteStringC& bsTagName,
+                           FX_SAXNODE eType,
+                           uint32_t dwStartPos);
+  virtual void OnTagAttribute(void* pTag,
+                              const CFX_ByteStringC& bsAttri,
+                              const CFX_ByteStringC& bsValue);
+  virtual void OnTagBreak(void* pTag);
+  virtual void OnTagData(void* pTag,
+                         FX_SAXNODE eType,
+                         const CFX_ByteStringC& bsData,
+                         uint32_t dwStartPos);
+  virtual void OnTagClose(void* pTag, uint32_t dwEndPos);
+  virtual void OnTagEnd(void* pTag,
+                        const CFX_ByteStringC& bsTagName,
+                        uint32_t dwEndPos);
+
+  virtual void OnTargetData(void* pTag,
+                            FX_SAXNODE eType,
+                            const CFX_ByteStringC& bsData,
+                            uint32_t dwStartPos);
+
+ protected:
+  void UpdateChecksum(FX_BOOL bCheckSpace);
+  CXFA_ChecksumContext* m_pContext;
+  CXFA_SAXContext m_SAXContext;
+};
+
+class CXFA_ChecksumContext {
+ public:
+  CXFA_ChecksumContext();
+  ~CXFA_ChecksumContext();
+
+  void Release() { delete this; }
+  FX_BOOL StartChecksum();
+  FX_BOOL UpdateChecksum(IFX_FileRead* pSrcFile,
+                         FX_FILESIZE offset = 0,
+                         size_t size = 0);
+  void FinishChecksum();
+  void GetChecksum(CFX_ByteString& bsChecksum);
+  void Update(const CFX_ByteStringC& bsText);
+
+ protected:
+  IFX_SAXReader* m_pSAXReader;
+  uint8_t* m_pByteContext;
+  CFX_ByteString m_bsChecksum;
+};
+
+#endif  // XFA_INCLUDE_FXFA_XFA_CHECKSUM_H_
diff --git a/xfa/include/fxfa/xfa_ffapp.h b/xfa/include/fxfa/xfa_ffapp.h
new file mode 100644
index 0000000..c3bae48
--- /dev/null
+++ b/xfa/include/fxfa/xfa_ffapp.h
@@ -0,0 +1,81 @@
+// Copyright 2014 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 XFA_INCLUDE_FXFA_XFA_FFAPP_H_
+#define XFA_INCLUDE_FXFA_XFA_FFAPP_H_
+
+#include "core/fpdfapi/fpdf_parser/include/cpdf_stream.h"
+#include "core/fpdfapi/fpdf_parser/include/cpdf_stream_acc.h"
+#include "xfa/fgas/font/fgas_font.h"
+#include "xfa/fwl/core/fwl_sdadapterimp.h"
+#include "xfa/fwl/core/ifwl_adapternative.h"
+#include "xfa/fwl/core/ifwl_app.h"
+#include "xfa/include/fxfa/fxfa.h"
+
+class CXFA_DefFontMgr;
+class CXFA_FWLAdapterWidgetMgr;
+class CXFA_FWLTheme;
+class CXFA_FFDocHandler;
+class CXFA_FFMenuHandler;
+class CXFA_FontMgr;
+
+class CXFA_FileRead : public IFX_FileRead {
+ public:
+  explicit CXFA_FileRead(const CFX_ArrayTemplate<CPDF_Stream*>& streams);
+
+  virtual FX_FILESIZE GetSize();
+  virtual FX_BOOL ReadBlock(void* buffer, FX_FILESIZE offset, size_t size);
+
+  virtual void Release() { delete this; }
+
+ protected:
+  CFX_ObjectArray<CPDF_StreamAcc> m_Data;
+};
+
+class CXFA_FFApp : public IFWL_AdapterNative {
+ public:
+  CXFA_FFApp(IXFA_AppProvider* pProvider);
+  ~CXFA_FFApp() override;
+
+  CXFA_FFDocHandler* GetDocHandler();
+  CXFA_FFDoc* CreateDoc(IXFA_DocProvider* pProvider,
+                        IFX_FileRead* pStream,
+                        FX_BOOL bTakeOverFile);
+  CXFA_FFDoc* CreateDoc(IXFA_DocProvider* pProvider, CPDF_Document* pPDFDoc);
+  IXFA_AppProvider* GetAppProvider() { return m_pProvider; }
+  void SetDefaultFontMgr(CXFA_DefFontMgr* pFontMgr);
+  CXFA_FFMenuHandler* GetMenuHandler();
+
+  // IFWL_AdapterNative:
+  IFWL_AdapterWidgetMgr* GetWidgetMgr(
+      IFWL_WidgetMgrDelegate* pDelegate) override;
+  IFWL_AdapterThreadMgr* GetThreadMgr() override;
+  IFWL_AdapterTimerMgr* GetTimerMgr() override;
+
+  CXFA_FontMgr* GetXFAFontMgr();
+  IFX_FontMgr* GetFDEFontMgr();
+  CXFA_FWLTheme* GetFWLTheme();
+  IFWL_WidgetMgrDelegate* GetWidgetMgrDelegate() {
+    return m_pWidgetMgrDelegate;
+  }
+
+ protected:
+  CXFA_FFDocHandler* m_pDocHandler;
+  IFWL_App* m_pFWLApp;
+  CXFA_FWLTheme* m_pFWLTheme;
+  IXFA_AppProvider* m_pProvider;
+  CXFA_FontMgr* m_pFontMgr;
+#if _FXM_PLATFORM_ != _FXM_PLATFORM_WINDOWS_
+  IFX_FontSourceEnum* m_pFontSource;
+#endif
+  CXFA_FWLAdapterWidgetMgr* m_pAdapterWidgetMgr;
+  IFWL_WidgetMgrDelegate* m_pWidgetMgrDelegate;
+  IFX_FontMgr* m_pFDEFontMgr;
+  CXFA_FFMenuHandler* m_pMenuHandler;
+  CFWL_SDAdapterThreadMgr* m_pAdapterThreadMgr;
+};
+
+#endif  // XFA_INCLUDE_FXFA_XFA_FFAPP_H_
diff --git a/xfa/include/fxfa/xfa_ffdoc.h b/xfa/include/fxfa/xfa_ffdoc.h
new file mode 100644
index 0000000..ebae04b
--- /dev/null
+++ b/xfa/include/fxfa/xfa_ffdoc.h
@@ -0,0 +1,65 @@
+// Copyright 2014 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 XFA_INCLUDE_FXFA_XFA_FFDOC_H_
+#define XFA_INCLUDE_FXFA_XFA_FFDOC_H_
+
+#include "xfa/fxfa/parser/xfa_document.h"
+#include "xfa/include/fxfa/fxfa.h"
+
+class CXFA_ChecksumContext;
+class CXFA_FFApp;
+class CXFA_FFNotify;
+class CXFA_FFDocView;
+
+struct FX_IMAGEDIB_AND_DPI {
+  CFX_DIBSource* pDibSource;
+  int32_t iImageXDpi;
+  int32_t iImageYDpi;
+};
+
+class CXFA_FFDoc {
+ public:
+  CXFA_FFDoc(CXFA_FFApp* pApp, IXFA_DocProvider* pDocProvider);
+  ~CXFA_FFDoc();
+  IXFA_DocProvider* GetDocProvider() { return m_pDocProvider; }
+  uint32_t GetDocType();
+  int32_t StartLoad();
+  int32_t DoLoad(IFX_Pause* pPause = NULL);
+  void StopLoad();
+  CXFA_FFDocView* CreateDocView(uint32_t dwView = 0);
+  FX_BOOL OpenDoc(IFX_FileRead* pStream, FX_BOOL bTakeOverFile);
+  FX_BOOL OpenDoc(CPDF_Document* pPDFDoc);
+  FX_BOOL CloseDoc();
+  void SetDocType(uint32_t dwType);
+  CXFA_Document* GetXFADoc() { return m_pDocument; }
+  CXFA_FFApp* GetApp() { return m_pApp; }
+  CXFA_FFDocView* GetDocView(CXFA_LayoutProcessor* pLayout);
+  CXFA_FFDocView* GetDocView();
+  CPDF_Document* GetPDFDoc();
+  CFX_DIBitmap* GetPDFNamedImage(const CFX_WideStringC& wsName,
+                                 int32_t& iImageXDpi,
+                                 int32_t& iImageYDpi);
+  CFDE_XMLElement* GetPackageData(const CFX_WideStringC& wsPackage);
+  FX_BOOL SavePackage(const CFX_WideStringC& wsPackage,
+                      IFX_FileWrite* pFile,
+                      CXFA_ChecksumContext* pCSContext = NULL);
+  FX_BOOL ImportData(IFX_FileRead* pStream, FX_BOOL bXDP = TRUE);
+
+ protected:
+  IXFA_DocProvider* m_pDocProvider;
+  CXFA_Document* m_pDocument;
+  IFX_FileRead* m_pStream;
+  CXFA_FFApp* m_pApp;
+  CXFA_FFNotify* m_pNotify;
+  CPDF_Document* m_pPDFDoc;
+  CFX_MapPtrToPtr m_mapNamedImages;
+  CFX_MapPtrToPtr m_mapTypeToDocView;
+  uint32_t m_dwDocType;
+  FX_BOOL m_bOwnStream;
+};
+
+#endif  // XFA_INCLUDE_FXFA_XFA_FFDOC_H_
diff --git a/xfa/include/fxfa/xfa_ffdochandler.h b/xfa/include/fxfa/xfa_ffdochandler.h
new file mode 100644
index 0000000..7eaa20b
--- /dev/null
+++ b/xfa/include/fxfa/xfa_ffdochandler.h
@@ -0,0 +1,53 @@
+// Copyright 2014 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 XFA_INCLUDE_FXFA_XFA_FFDOCHANDLER_H_
+#define XFA_INCLUDE_FXFA_XFA_FFDOCHANDLER_H_
+
+#include "xfa/include/fxfa/fxfa.h"
+
+class CXFA_ChecksumContext;
+
+class CXFA_FFDocHandler {
+ public:
+  CXFA_FFDocHandler();
+  ~CXFA_FFDocHandler();
+
+  void ReleaseDoc(CXFA_FFDoc* hDoc);
+  IXFA_DocProvider* GetDocProvider(CXFA_FFDoc* hDoc);
+  uint32_t GetDocType(CXFA_FFDoc* hDoc);
+  int32_t StartLoad(CXFA_FFDoc* hDoc);
+  int32_t DoLoad(CXFA_FFDoc* hDoc, IFX_Pause* pPause = NULL);
+  void StopLoad(CXFA_FFDoc* hDoc);
+
+  CXFA_FFDocView* CreateDocView(CXFA_FFDoc* hDoc, uint32_t dwView = 0);
+  int32_t CountPackages(CXFA_FFDoc* hDoc);
+  void GetPackageName(CXFA_FFDoc* hDoc,
+                      int32_t iPackage,
+                      CFX_WideStringC& wsPackage);
+  CFDE_XMLElement* GetPackageData(CXFA_FFDoc* hDoc,
+                                  const CFX_WideStringC& wsPackage);
+  FX_BOOL SavePackage(CXFA_FFDoc* hDoc,
+                      const CFX_WideStringC& wsPackage,
+                      IFX_FileWrite* pFile,
+                      CXFA_ChecksumContext* pCSContext = NULL);
+  FX_BOOL CloseDoc(CXFA_FFDoc* hDoc);
+  FX_BOOL ImportData(CXFA_FFDoc* hDoc,
+                     IFX_FileRead* pStream,
+                     FX_BOOL bXDP = TRUE);
+  void SetJSERuntime(CXFA_FFDoc* hDoc, FXJSE_HRUNTIME hRuntime);
+  FXJSE_HVALUE GetXFAScriptObject(CXFA_FFDoc* hDoc);
+  XFA_ATTRIBUTEENUM GetRestoreState(CXFA_FFDoc* hDoc);
+  FX_BOOL RunDocScript(CXFA_FFDoc* hDoc,
+                       XFA_SCRIPTTYPE eScriptType,
+                       const CFX_WideStringC& wsScript,
+                       FXJSE_HVALUE hRetValue,
+                       FXJSE_HVALUE hThisObject);
+
+ protected:
+};
+
+#endif  // XFA_INCLUDE_FXFA_XFA_FFDOCHANDLER_H_
diff --git a/xfa/include/fxfa/xfa_ffdocview.h b/xfa/include/fxfa/xfa_ffdocview.h
new file mode 100644
index 0000000..e8a29111
--- /dev/null
+++ b/xfa/include/fxfa/xfa_ffdocview.h
@@ -0,0 +1,172 @@
+// Copyright 2014 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 XFA_INCLUDE_FXFA_XFA_FFDOCVIEW_H_
+#define XFA_INCLUDE_FXFA_XFA_FFDOCVIEW_H_
+
+#include "xfa/include/fxfa/xfa_ffdoc.h"
+
+class CXFA_FFWidgetHandler;
+class CXFA_FFDoc;
+class CXFA_FFWidget;
+class CXFA_WidgetAccIterator;
+
+extern const XFA_ATTRIBUTEENUM gs_EventActivity[];
+enum XFA_DOCVIEW_LAYOUTSTATUS {
+  XFA_DOCVIEW_LAYOUTSTATUS_None,
+  XFA_DOCVIEW_LAYOUTSTATUS_Start,
+  XFA_DOCVIEW_LAYOUTSTATUS_FormInitialize,
+  XFA_DOCVIEW_LAYOUTSTATUS_FormInitCalculate,
+  XFA_DOCVIEW_LAYOUTSTATUS_FormInitValidate,
+  XFA_DOCVIEW_LAYOUTSTATUS_FormFormReady,
+  XFA_DOCVIEW_LAYOUTSTATUS_Doing,
+  XFA_DOCVIEW_LAYOUTSTATUS_PagesetInitialize,
+  XFA_DOCVIEW_LAYOUTSTATUS_PagesetInitCalculate,
+  XFA_DOCVIEW_LAYOUTSTATUS_PagesetInitValidate,
+  XFA_DOCVIEW_LAYOUTSTATUS_PagesetFormReady,
+  XFA_DOCVIEW_LAYOUTSTATUS_LayoutReady,
+  XFA_DOCVIEW_LAYOUTSTATUS_DocReady,
+  XFA_DOCVIEW_LAYOUTSTATUS_End
+};
+class CXFA_FFDocView {
+ public:
+  CXFA_FFDocView(CXFA_FFDoc* pDoc);
+  ~CXFA_FFDocView();
+
+  CXFA_FFDoc* GetDoc() { return m_pDoc; }
+  int32_t StartLayout(int32_t iStartPage = 0);
+  int32_t DoLayout(IFX_Pause* pPause = NULL);
+  void StopLayout();
+  int32_t GetLayoutStatus();
+  void UpdateDocView();
+  int32_t CountPageViews();
+  CXFA_FFPageView* GetPageView(int32_t nIndex);
+
+  void ResetWidgetData(CXFA_WidgetAcc* pWidgetAcc = NULL);
+  int32_t ProcessWidgetEvent(CXFA_EventParam* pParam,
+                             CXFA_WidgetAcc* pWidgetAcc = NULL);
+  CXFA_FFWidgetHandler* GetWidgetHandler();
+  IXFA_WidgetIterator* CreateWidgetIterator();
+  CXFA_WidgetAccIterator* CreateWidgetAccIterator(
+      XFA_WIDGETORDER eOrder = XFA_WIDGETORDER_PreOrder);
+  CXFA_FFWidget* GetFocusWidget();
+  void KillFocus();
+  FX_BOOL SetFocus(CXFA_FFWidget* hWidget);
+  CXFA_FFWidget* GetWidgetByName(const CFX_WideStringC& wsName,
+                                 CXFA_FFWidget* pRefWidget = NULL);
+  CXFA_WidgetAcc* GetWidgetAccByName(const CFX_WideStringC& wsName,
+                                     CXFA_WidgetAcc* pRefWidgetAcc = NULL);
+  CXFA_LayoutProcessor* GetXFALayout() const;
+  void OnPageEvent(CXFA_ContainerLayoutItem* pSender,
+                   XFA_PAGEEVENT eEvent,
+                   int32_t iPageIndex);
+  void LockUpdate();
+  void UnlockUpdate();
+  FX_BOOL IsUpdateLocked();
+  void ClearInvalidateList();
+  void AddInvalidateRect(CXFA_FFWidget* pWidget, const CFX_RectF& rtInvalidate);
+  void AddInvalidateRect(CXFA_FFPageView* pPageView,
+                         const CFX_RectF& rtInvalidate);
+  void RunInvalidate();
+  void RunDocClose();
+  void DestroyDocView();
+
+  FX_BOOL InitValidate(CXFA_Node* pNode);
+  FX_BOOL RunValidate();
+
+  void SetChangeMark();
+
+  void AddValidateWidget(CXFA_WidgetAcc* pWidget);
+  void AddCalculateNodeNotify(CXFA_Node* pNodeChange);
+  void AddCalculateWidgetAcc(CXFA_WidgetAcc* pWidgetAcc);
+  int32_t RunCalculateWidgets();
+  FX_BOOL IsStaticNotify();
+  FX_BOOL RunLayout();
+  void RunSubformIndexChange();
+  void AddNewFormNode(CXFA_Node* pNode);
+  void AddIndexChangedSubform(CXFA_Node* pNode);
+  CXFA_WidgetAcc* GetFocusWidgetAcc();
+  void SetFocusWidgetAcc(CXFA_WidgetAcc* pWidgetAcc);
+  void DeleteLayoutItem(CXFA_FFWidget* pWidget);
+  int32_t ExecEventActivityByDeepFirst(CXFA_Node* pFormNode,
+                                       XFA_EVENTTYPE eEventType,
+                                       FX_BOOL bIsFormReady = FALSE,
+                                       FX_BOOL bRecursive = TRUE,
+                                       CXFA_Node* pExclude = NULL);
+  FX_BOOL m_bLayoutEvent;
+  CFX_WideStringArray m_arrNullTestMsg;
+  CXFA_FFWidget* m_pListFocusWidget;
+  FX_BOOL m_bInLayoutStatus;
+
+ protected:
+  FX_BOOL RunEventLayoutReady();
+  void RunBindItems();
+  FX_BOOL InitCalculate(CXFA_Node* pNode);
+  void InitLayout(CXFA_Node* pNode);
+  void RunCalculateRecursive(int32_t& iIndex);
+  void ShowNullTestMsg();
+  FX_BOOL ResetSingleWidgetAccData(CXFA_WidgetAcc* pWidgetAcc);
+  CXFA_Node* GetRootSubform();
+
+  CXFA_FFDoc* m_pDoc;
+  CXFA_FFWidgetHandler* m_pWidgetHandler;
+  CXFA_LayoutProcessor* m_pXFADocLayout;
+  CXFA_WidgetAcc* m_pFocusAcc;
+  CXFA_FFWidget* m_pFocusWidget;
+  CXFA_FFWidget* m_pOldFocusWidget;
+  CFX_MapPtrToPtr m_mapPageInvalidate;
+  CFX_PtrArray m_ValidateAccs;
+  CFX_PtrArray m_bindItems;
+  CFX_PtrArray m_CalculateAccs;
+
+  CFX_PtrArray m_NewAddedNodes;
+  CFX_PtrArray m_IndexChangedSubforms;
+  XFA_DOCVIEW_LAYOUTSTATUS m_iStatus;
+  int32_t m_iLock;
+  friend class CXFA_FFNotify;
+};
+class CXFA_FFDocWidgetIterator : public IXFA_WidgetIterator {
+ public:
+  CXFA_FFDocWidgetIterator(CXFA_FFDocView* pDocView, CXFA_Node* pTravelRoot);
+  virtual ~CXFA_FFDocWidgetIterator();
+
+  virtual void Release() { delete this; }
+
+  virtual void Reset();
+  virtual CXFA_FFWidget* MoveToFirst();
+  virtual CXFA_FFWidget* MoveToLast();
+  virtual CXFA_FFWidget* MoveToNext();
+  virtual CXFA_FFWidget* MoveToPrevious();
+  virtual CXFA_FFWidget* GetCurrentWidget();
+  virtual FX_BOOL SetCurrentWidget(CXFA_FFWidget* hWidget);
+
+ protected:
+  CXFA_ContainerIterator m_ContentIterator;
+  CXFA_FFDocView* m_pDocView;
+  CXFA_FFWidget* m_pCurWidget;
+};
+class CXFA_WidgetAccIterator {
+ public:
+  CXFA_WidgetAccIterator(CXFA_FFDocView* pDocView, CXFA_Node* pTravelRoot);
+  ~CXFA_WidgetAccIterator();
+
+  void Release() { delete this; }
+  void Reset();
+  CXFA_WidgetAcc* MoveToFirst();
+  CXFA_WidgetAcc* MoveToLast();
+  CXFA_WidgetAcc* MoveToNext();
+  CXFA_WidgetAcc* MoveToPrevious();
+  CXFA_WidgetAcc* GetCurrentWidgetAcc();
+  FX_BOOL SetCurrentWidgetAcc(CXFA_WidgetAcc* hWidget);
+  void SkipTree();
+
+ protected:
+  CXFA_ContainerIterator m_ContentIterator;
+  CXFA_FFDocView* m_pDocView;
+  CXFA_WidgetAcc* m_pCurWidgetAcc;
+};
+
+#endif  // XFA_INCLUDE_FXFA_XFA_FFDOCVIEW_H_
diff --git a/xfa/include/fxfa/xfa_ffpageview.h b/xfa/include/fxfa/xfa_ffpageview.h
new file mode 100644
index 0000000..cce1cc1
--- /dev/null
+++ b/xfa/include/fxfa/xfa_ffpageview.h
@@ -0,0 +1,113 @@
+// Copyright 2014 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 XFA_INCLUDE_FXFA_XFA_FFPAGEVIEW_H_
+#define XFA_INCLUDE_FXFA_XFA_FFPAGEVIEW_H_
+
+#include "xfa/fxfa/parser/xfa_doclayout.h"
+
+class CXFA_FFWidget;
+class CXFA_FFDocView;
+class CXFA_FFPageView : public CXFA_ContainerLayoutItem {
+ public:
+  CXFA_FFPageView(CXFA_FFDocView* pDocView, CXFA_Node* pPageArea);
+  ~CXFA_FFPageView() override;
+
+  CXFA_FFDocView* GetDocView();
+  int32_t GetPageViewIndex();
+  void GetPageViewRect(CFX_RectF& rtPage);
+  void GetDisplayMatrix(CFX_Matrix& mt,
+                        const CFX_Rect& rtDisp,
+                        int32_t iRotate);
+  int32_t LoadPageView(IFX_Pause* pPause = NULL);
+  void UnloadPageView();
+  CXFA_FFWidget* GetWidgetByPos(FX_FLOAT fx, FX_FLOAT fy);
+  IXFA_WidgetIterator* CreateWidgetIterator(
+      uint32_t dwTraverseWay = XFA_TRAVERSEWAY_Form,
+      uint32_t dwWidgetFilter = XFA_WIDGETFILTER_Visible |
+                                XFA_WIDGETFILTER_Viewable |
+                                XFA_WIDGETFILTER_AllType);
+
+  FX_BOOL IsPageViewLoaded();
+
+ protected:
+  CXFA_FFDocView* m_pDocView;
+  FX_BOOL m_bLoaded;
+};
+typedef CXFA_NodeIteratorTemplate<CXFA_LayoutItem,
+                                  CXFA_TraverseStrategy_LayoutItem>
+    CXFA_LayoutItemIterator;
+class CXFA_FFPageWidgetIterator : public IXFA_WidgetIterator {
+ public:
+  CXFA_FFPageWidgetIterator(CXFA_FFPageView* pPageView, uint32_t dwFilter);
+  virtual ~CXFA_FFPageWidgetIterator();
+
+  void Release() override { delete this; }
+
+  void Reset() override;
+  CXFA_FFWidget* MoveToFirst() override;
+  CXFA_FFWidget* MoveToLast() override;
+  CXFA_FFWidget* MoveToNext() override;
+  CXFA_FFWidget* MoveToPrevious() override;
+  CXFA_FFWidget* GetCurrentWidget() override;
+  FX_BOOL SetCurrentWidget(CXFA_FFWidget* hWidget) override;
+
+ protected:
+  CXFA_FFWidget* GetWidget(CXFA_LayoutItem* pLayoutItem);
+
+  CXFA_FFPageView* m_pPageView;
+  CXFA_FFWidget* m_hCurWidget;
+  uint32_t m_dwFilter;
+  FX_BOOL m_bIgnorerelevant;
+  CXFA_LayoutItemIterator m_sIterator;
+};
+typedef CFX_ArrayTemplate<CXFA_FFWidget*> CXFA_WidgetArray;
+class CXFA_TabParam {
+ public:
+  CXFA_TabParam() : m_pWidget(NULL) {}
+  ~CXFA_TabParam() {}
+
+  CXFA_FFWidget* m_pWidget;
+  CXFA_WidgetArray m_Children;
+};
+class CXFA_FFTabOrderPageWidgetIterator : public IXFA_WidgetIterator {
+ public:
+  CXFA_FFTabOrderPageWidgetIterator(CXFA_FFPageView* pPageView,
+                                    uint32_t dwFilter);
+  virtual ~CXFA_FFTabOrderPageWidgetIterator();
+
+  void Release() override;
+
+  void Reset() override;
+  CXFA_FFWidget* MoveToFirst() override;
+  CXFA_FFWidget* MoveToLast() override;
+  CXFA_FFWidget* MoveToNext() override;
+  CXFA_FFWidget* MoveToPrevious() override;
+  CXFA_FFWidget* GetCurrentWidget() override;
+  FX_BOOL SetCurrentWidget(CXFA_FFWidget* hWidget) override;
+
+ protected:
+  CXFA_FFWidget* GetTraverseWidget(CXFA_FFWidget* pWidget);
+  CXFA_FFWidget* FindWidgetByName(const CFX_WideStringC& wsWidgetName,
+                                  CXFA_FFWidget* pRefWidget);
+  void CreateTabOrderWidgetArray();
+  void CreateSpaceOrderWidgetArray(CXFA_WidgetArray& WidgetArray);
+  CXFA_FFWidget* GetWidget(CXFA_LayoutItem* pLayoutItem);
+  void OrderContainer(CXFA_LayoutItemIterator* sIterator,
+                      CXFA_LayoutItem* pContainerItem,
+                      CXFA_TabParam* pContainer,
+                      FX_BOOL& bCurrentItem,
+                      FX_BOOL& bContentArea,
+                      FX_BOOL bMarsterPage = FALSE);
+
+  CXFA_WidgetArray m_TabOrderWidgetArray;
+  CXFA_FFPageView* m_pPageView;
+  uint32_t m_dwFilter;
+  int32_t m_iCurWidget;
+  FX_BOOL m_bIgnorerelevant;
+};
+
+#endif  // XFA_INCLUDE_FXFA_XFA_FFPAGEVIEW_H_
diff --git a/xfa/include/fxfa/xfa_ffwidgethandler.h b/xfa/include/fxfa/xfa_ffwidgethandler.h
new file mode 100644
index 0000000..28c6b4b
--- /dev/null
+++ b/xfa/include/fxfa/xfa_ffwidgethandler.h
@@ -0,0 +1,171 @@
+// Copyright 2014 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 XFA_INCLUDE_FXFA_XFA_FFWIDGETHANDLER_H_
+#define XFA_INCLUDE_FXFA_XFA_FFWIDGETHANDLER_H_
+
+#include <vector>
+
+#include "xfa/fxfa/parser/xfa_document.h"
+#include "xfa/include/fxfa/fxfa.h"
+
+class CXFA_FFDocView;
+
+class CXFA_FFWidgetHandler {
+ public:
+  CXFA_FFWidgetHandler(CXFA_FFDocView* pDocView);
+  ~CXFA_FFWidgetHandler();
+  CXFA_FFWidget* CreateWidget(CXFA_FFWidget* hParent,
+                              XFA_WIDGETTYPE eType,
+                              CXFA_FFWidget* hBefore = NULL);
+  CXFA_FFPageView* GetPageView(CXFA_FFWidget* hWidget);
+  void GetRect(CXFA_FFWidget* hWidget, CFX_RectF& rt);
+  uint32_t GetStatus(CXFA_FFWidget* hWidget);
+  FX_BOOL GetBBox(CXFA_FFWidget* hWidget,
+                  CFX_RectF& rtBox,
+                  uint32_t dwStatus,
+                  FX_BOOL bDrawFocus = FALSE);
+  CXFA_WidgetAcc* GetDataAcc(CXFA_FFWidget* hWidget);
+  void GetName(CXFA_FFWidget* hWidget,
+               CFX_WideString& wsName,
+               int32_t iNameType = 0);
+  FX_BOOL GetToolTip(CXFA_FFWidget* hWidget, CFX_WideString& wsToolTip);
+  void SetPrivateData(CXFA_FFWidget* hWidget,
+                      void* module_id,
+                      void* pData,
+                      PD_CALLBACK_FREEDATA callback);
+  void* GetPrivateData(CXFA_FFWidget* hWidget, void* module_id);
+  FX_BOOL OnMouseEnter(CXFA_FFWidget* hWidget);
+  FX_BOOL OnMouseExit(CXFA_FFWidget* hWidget);
+  FX_BOOL OnLButtonDown(CXFA_FFWidget* hWidget,
+                        uint32_t dwFlags,
+                        FX_FLOAT fx,
+                        FX_FLOAT fy);
+  FX_BOOL OnLButtonUp(CXFA_FFWidget* hWidget,
+                      uint32_t dwFlags,
+                      FX_FLOAT fx,
+                      FX_FLOAT fy);
+  FX_BOOL OnLButtonDblClk(CXFA_FFWidget* hWidget,
+                          uint32_t dwFlags,
+                          FX_FLOAT fx,
+                          FX_FLOAT fy);
+  FX_BOOL OnMouseMove(CXFA_FFWidget* hWidget,
+                      uint32_t dwFlags,
+                      FX_FLOAT fx,
+                      FX_FLOAT fy);
+  FX_BOOL OnMouseWheel(CXFA_FFWidget* hWidget,
+                       uint32_t dwFlags,
+                       int16_t zDelta,
+                       FX_FLOAT fx,
+                       FX_FLOAT fy);
+  FX_BOOL OnRButtonDown(CXFA_FFWidget* hWidget,
+                        uint32_t dwFlags,
+                        FX_FLOAT fx,
+                        FX_FLOAT fy);
+  FX_BOOL OnRButtonUp(CXFA_FFWidget* hWidget,
+                      uint32_t dwFlags,
+                      FX_FLOAT fx,
+                      FX_FLOAT fy);
+  FX_BOOL OnRButtonDblClk(CXFA_FFWidget* hWidget,
+                          uint32_t dwFlags,
+                          FX_FLOAT fx,
+                          FX_FLOAT fy);
+
+  FX_BOOL OnKeyDown(CXFA_FFWidget* hWidget,
+                    uint32_t dwKeyCode,
+                    uint32_t dwFlags);
+  FX_BOOL OnKeyUp(CXFA_FFWidget* hWidget, uint32_t dwKeyCode, uint32_t dwFlags);
+  FX_BOOL OnChar(CXFA_FFWidget* hWidget, uint32_t dwChar, uint32_t dwFlags);
+  uint32_t OnHitTest(CXFA_FFWidget* hWidget, FX_FLOAT fx, FX_FLOAT fy);
+  FX_BOOL OnSetCursor(CXFA_FFWidget* hWidget, FX_FLOAT fx, FX_FLOAT fy);
+  void RenderWidget(CXFA_FFWidget* hWidget,
+                    CFX_Graphics* pGS,
+                    CFX_Matrix* pMatrix = NULL,
+                    FX_BOOL bHighlight = FALSE);
+  FX_BOOL HasEvent(CXFA_WidgetAcc* pWidgetAcc, XFA_EVENTTYPE eEventType);
+  int32_t ProcessEvent(CXFA_WidgetAcc* pWidgetAcc, CXFA_EventParam* pParam);
+
+ protected:
+  CXFA_Node* CreateWidgetFormItem(XFA_WIDGETTYPE eType,
+                                  CXFA_Node* pParent,
+                                  CXFA_Node* pBefore) const;
+
+  CXFA_Node* CreatePushButton(CXFA_Node* pParent, CXFA_Node* pBefore) const;
+  CXFA_Node* CreateCheckButton(CXFA_Node* pParent, CXFA_Node* pBefore) const;
+  CXFA_Node* CreateExclGroup(CXFA_Node* pParent, CXFA_Node* pBefore) const;
+  CXFA_Node* CreateRadioButton(CXFA_Node* pParent, CXFA_Node* pBefore) const;
+  CXFA_Node* CreateDatetimeEdit(CXFA_Node* pParent, CXFA_Node* pBefore) const;
+  CXFA_Node* CreateDecimalField(CXFA_Node* pParent, CXFA_Node* pBefore) const;
+  CXFA_Node* CreateNumericField(CXFA_Node* pParent, CXFA_Node* pBefore) const;
+  CXFA_Node* CreateSignature(CXFA_Node* pParent, CXFA_Node* pBefore) const;
+  CXFA_Node* CreateTextEdit(CXFA_Node* pParent, CXFA_Node* pBefore) const;
+  CXFA_Node* CreateDropdownList(CXFA_Node* pParent, CXFA_Node* pBefore) const;
+  CXFA_Node* CreateListBox(CXFA_Node* pParent, CXFA_Node* pBefore) const;
+  CXFA_Node* CreateImageField(CXFA_Node* pParent, CXFA_Node* pBefore) const;
+  CXFA_Node* CreatePasswordEdit(CXFA_Node* pParent, CXFA_Node* pBefore) const;
+  CXFA_Node* CreateField(XFA_ELEMENT eElement,
+                         CXFA_Node* pParent,
+                         CXFA_Node* pBefore) const;
+  CXFA_Node* CreateArc(CXFA_Node* pParent, CXFA_Node* pBefore) const;
+  CXFA_Node* CreateRectangle(CXFA_Node* pParent, CXFA_Node* pBefore) const;
+  CXFA_Node* CreateImage(CXFA_Node* pParent, CXFA_Node* pBefore) const;
+  CXFA_Node* CreateLine(CXFA_Node* pParent, CXFA_Node* pBefore) const;
+  CXFA_Node* CreateText(CXFA_Node* pParent, CXFA_Node* pBefore) const;
+  CXFA_Node* CreateDraw(XFA_ELEMENT eElement,
+                        CXFA_Node* pParent,
+                        CXFA_Node* pBefore) const;
+
+  CXFA_Node* CreateSubform(CXFA_Node* pParent, CXFA_Node* pBefore) const;
+  CXFA_Node* CreateFormItem(XFA_ELEMENT eElement,
+                            CXFA_Node* pParent,
+                            CXFA_Node* pBefore) const;
+  CXFA_Node* CreateCopyNode(XFA_ELEMENT eElement,
+                            CXFA_Node* pParent,
+                            CXFA_Node* pBefore = NULL) const;
+  CXFA_Node* CreateTemplateNode(XFA_ELEMENT eElement,
+                                CXFA_Node* pParent,
+                                CXFA_Node* pBefore) const;
+  CXFA_Node* CreateFontNode(CXFA_Node* pParent) const;
+  CXFA_Node* CreateMarginNode(CXFA_Node* pParent,
+                              uint32_t dwFlags,
+                              FX_FLOAT fInsets[4]) const;
+  CXFA_Node* CreateValueNode(XFA_ELEMENT eValue, CXFA_Node* pParent) const;
+  CXFA_Document* GetObjFactory() const;
+  CXFA_Document* GetXFADoc() const;
+
+  CXFA_FFDocView* m_pDocView;
+};
+
+class CXFA_FFMenuHandler {
+ public:
+  CXFA_FFMenuHandler();
+  ~CXFA_FFMenuHandler();
+
+  FX_BOOL CanCopy(CXFA_FFWidget* hWidget);
+  FX_BOOL CanCut(CXFA_FFWidget* hWidget);
+  FX_BOOL CanPaste(CXFA_FFWidget* hWidget);
+  FX_BOOL CanSelectAll(CXFA_FFWidget* hWidget);
+  FX_BOOL CanDelete(CXFA_FFWidget* hWidget);
+  FX_BOOL CanDeSelect(CXFA_FFWidget* hWidget);
+  FX_BOOL Copy(CXFA_FFWidget* hWidget, CFX_WideString& wsText);
+  FX_BOOL Cut(CXFA_FFWidget* hWidget, CFX_WideString& wsText);
+  FX_BOOL Paste(CXFA_FFWidget* hWidget, const CFX_WideString& wsText);
+  FX_BOOL SelectAll(CXFA_FFWidget* hWidget);
+  FX_BOOL Delete(CXFA_FFWidget* hWidget);
+  FX_BOOL DeSelect(CXFA_FFWidget* hWidget);
+  FX_BOOL CanUndo(CXFA_FFWidget* hWidget);
+  FX_BOOL CanRedo(CXFA_FFWidget* hWidget);
+  FX_BOOL Undo(CXFA_FFWidget* hWidget);
+  FX_BOOL Redo(CXFA_FFWidget* hWidget);
+  FX_BOOL GetSuggestWords(CXFA_FFWidget* hWidget,
+                          CFX_PointF pointf,
+                          std::vector<CFX_ByteString>& sSuggest);
+  FX_BOOL ReplaceSpellCheckWord(CXFA_FFWidget* hWidget,
+                                CFX_PointF pointf,
+                                const CFX_ByteStringC& bsReplace);
+};
+
+#endif  //  XFA_INCLUDE_FXFA_XFA_FFWIDGETHANDLER_H_
diff --git a/xfa/include/fxfa/xfa_fontmgr.h b/xfa/include/fxfa/xfa_fontmgr.h
new file mode 100644
index 0000000..082c672
--- /dev/null
+++ b/xfa/include/fxfa/xfa_fontmgr.h
@@ -0,0 +1,99 @@
+// Copyright 2014 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 XFA_INCLUDE_FXFA_XFA_FONTMGR_H_
+#define XFA_INCLUDE_FXFA_XFA_FONTMGR_H_
+
+#include <map>
+
+#include "core/fxcrt/include/fx_ext.h"
+#include "core/fxcrt/include/fx_system.h"
+#include "xfa/fgas/font/fgas_font.h"
+#include "xfa/include/fxfa/fxfa.h"
+
+class CPDF_Font;
+
+struct XFA_FONTINFO {
+  uint32_t dwFontNameHash;
+  const FX_WCHAR* pPsName;
+  const FX_WCHAR* pReplaceFont;
+  uint16_t dwStyles;
+  uint16_t wCodePage;
+};
+
+class CXFA_DefFontMgr {
+ public:
+  CXFA_DefFontMgr() {}
+  ~CXFA_DefFontMgr();
+
+  IFX_Font* GetFont(CXFA_FFDoc* hDoc,
+                    const CFX_WideStringC& wsFontFamily,
+                    uint32_t dwFontStyles,
+                    uint16_t wCodePage = 0xFFFF);
+  IFX_Font* GetDefaultFont(CXFA_FFDoc* hDoc,
+                           const CFX_WideStringC& wsFontFamily,
+                           uint32_t dwFontStyles,
+                           uint16_t wCodePage = 0xFFFF);
+
+ protected:
+  CFX_PtrArray m_CacheFonts;
+};
+
+class CXFA_PDFFontMgr : public IFX_FontProvider {
+ public:
+  CXFA_PDFFontMgr(CXFA_FFDoc* pDoc);
+  ~CXFA_PDFFontMgr();
+  IFX_Font* GetFont(const CFX_WideStringC& wsFontFamily,
+                    uint32_t dwFontStyles,
+                    CPDF_Font** pPDFFont,
+                    FX_BOOL bStrictMatch = TRUE);
+  FX_BOOL GetCharWidth(IFX_Font* pFont,
+                       FX_WCHAR wUnicode,
+                       int32_t& iWidth,
+                       FX_BOOL bCharCode);
+  CFX_MapPtrToPtr m_FDE2PDFFont;
+
+ protected:
+  IFX_Font* FindFont(CFX_ByteString strFamilyName,
+                     FX_BOOL bBold,
+                     FX_BOOL bItalic,
+                     CPDF_Font** pPDFFont,
+                     FX_BOOL bStrictMatch = TRUE);
+  CFX_ByteString PsNameToFontName(const CFX_ByteString& strPsName,
+                                  FX_BOOL bBold,
+                                  FX_BOOL bItalic);
+  FX_BOOL PsNameMatchDRFontName(const CFX_ByteStringC& bsPsName,
+                                FX_BOOL bBold,
+                                FX_BOOL bItalic,
+                                const CFX_ByteString& bsDRFontName,
+                                FX_BOOL bStrictMatch = TRUE);
+
+  CXFA_FFDoc* m_pDoc;
+  std::map<CFX_ByteString, IFX_Font*> m_FontMap;
+};
+
+class CXFA_FontMgr {
+ public:
+  CXFA_FontMgr();
+  ~CXFA_FontMgr();
+  IFX_Font* GetFont(CXFA_FFDoc* hDoc,
+                    const CFX_WideStringC& wsFontFamily,
+                    uint32_t dwFontStyles,
+                    uint16_t wCodePage = 0xFFFF);
+  void LoadDocFonts(CXFA_FFDoc* hDoc);
+  void ReleaseDocFonts(CXFA_FFDoc* hDoc);
+
+  void SetDefFontMgr(CXFA_DefFontMgr* pFontMgr);
+
+ protected:
+  void DelAllMgrMap();
+
+  CFX_MapPtrToPtr m_PDFFontMgrArray;
+  CXFA_DefFontMgr* m_pDefFontMgr;
+  std::map<CFX_ByteString, IFX_Font*> m_FontMap;
+};
+
+#endif  //  XFA_INCLUDE_FXFA_XFA_FONTMGR_H_
diff --git a/xfa/include/fxfa/xfa_rendercontext.h b/xfa/include/fxfa/xfa_rendercontext.h
new file mode 100644
index 0000000..d620527
--- /dev/null
+++ b/xfa/include/fxfa/xfa_rendercontext.h
@@ -0,0 +1,36 @@
+// Copyright 2014 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 XFA_INCLUDE_FXFA_XFA_RENDERCONTEXT_H_
+#define XFA_INCLUDE_FXFA_XFA_RENDERCONTEXT_H_
+
+#include "xfa/include/fxfa/fxfa.h"
+
+class CXFA_RenderContext {
+ public:
+  CXFA_RenderContext();
+  ~CXFA_RenderContext();
+
+  void Release() { delete this; }
+  int32_t StartRender(CXFA_FFPageView* pPageView,
+                      CFX_Graphics* pGS,
+                      const CFX_Matrix& matrix,
+                      const CXFA_RenderOptions& options);
+  int32_t DoRender(IFX_Pause* pPause = NULL);
+  void StopRender();
+
+ protected:
+  IXFA_WidgetIterator* m_pWidgetIterator;
+  CXFA_FFWidget* m_pWidget;
+  CXFA_FFPageView* m_pPageView;
+  CFX_Graphics* m_pGS;
+  CFX_Matrix m_matrix;
+  CXFA_RenderOptions m_options;
+  uint32_t m_dwStatus;
+  CFX_RectF m_rtClipRect;
+};
+
+#endif  // XFA_INCLUDE_FXFA_XFA_RENDERCONTEXT_H_