diff --git a/BUILD.gn b/BUILD.gn
index 29cf5f5..4f356ee 100644
--- a/BUILD.gn
+++ b/BUILD.gn
@@ -65,13 +65,16 @@
     "fpdfsdk/cba_annotiterator.cpp",
     "fpdfsdk/cfx_systemhandler.cpp",
     "fpdfsdk/cfx_systemhandler.h",
+    "fpdfsdk/cpdfdoc_environment.cpp",
     "fpdfsdk/cpdfsdk_annot.cpp",
     "fpdfsdk/cpdfsdk_annothandlermgr.cpp",
     "fpdfsdk/cpdfsdk_annotiterator.cpp",
     "fpdfsdk/cpdfsdk_baannot.cpp",
     "fpdfsdk/cpdfsdk_baannothandler.cpp",
     "fpdfsdk/cpdfsdk_datetime.cpp",
+    "fpdfsdk/cpdfsdk_document.cpp",
     "fpdfsdk/cpdfsdk_interform.cpp",
+    "fpdfsdk/cpdfsdk_pageview.cpp",
     "fpdfsdk/cpdfsdk_widget.cpp",
     "fpdfsdk/cpdfsdk_widgethandler.cpp",
     "fpdfsdk/fpdf_dataavail.cpp",
@@ -90,16 +93,18 @@
     "fpdfsdk/fpdftext.cpp",
     "fpdfsdk/fpdfview.cpp",
     "fpdfsdk/fsdk_actionhandler.cpp",
-    "fpdfsdk/fsdk_mgr.cpp",
     "fpdfsdk/fsdk_pauseadapter.cpp",
     "fpdfsdk/include/cba_annotiterator.h",
+    "fpdfsdk/include/cpdfdoc_environment.h",
     "fpdfsdk/include/cpdfsdk_annot.h",
     "fpdfsdk/include/cpdfsdk_annothandlermgr.h",
     "fpdfsdk/include/cpdfsdk_annotiterator.h",
     "fpdfsdk/include/cpdfsdk_baannot.h",
     "fpdfsdk/include/cpdfsdk_baannothandler.h",
     "fpdfsdk/include/cpdfsdk_datetime.h",
+    "fpdfsdk/include/cpdfsdk_document.h",
     "fpdfsdk/include/cpdfsdk_interform.h",
+    "fpdfsdk/include/cpdfsdk_pageview.h",
     "fpdfsdk/include/cpdfsdk_widget.h",
     "fpdfsdk/include/cpdfsdk_widgethandler.h",
     "fpdfsdk/include/fsdk_actionhandler.h",
diff --git a/fpdfsdk/cba_annotiterator.cpp b/fpdfsdk/cba_annotiterator.cpp
index b99fabf..51ee54b 100644
--- a/fpdfsdk/cba_annotiterator.cpp
+++ b/fpdfsdk/cba_annotiterator.cpp
@@ -8,7 +8,7 @@
 
 #include "core/fpdfapi/fpdf_page/include/cpdf_page.h"
 #include "fpdfsdk/include/cpdfsdk_annot.h"
-#include "fpdfsdk/include/fsdk_mgr.h"
+#include "fpdfsdk/include/cpdfsdk_pageview.h"
 
 // static
 bool CBA_AnnotIterator::CompareByLeftAscending(const CPDFSDK_Annot* p1,
diff --git a/fpdfsdk/cfx_systemhandler.cpp b/fpdfsdk/cfx_systemhandler.cpp
index 996a17a..2589565 100644
--- a/fpdfsdk/cfx_systemhandler.cpp
+++ b/fpdfsdk/cfx_systemhandler.cpp
@@ -8,11 +8,15 @@
 
 #include <memory>
 
+#include "core/fpdfapi/fpdf_parser/include/cpdf_document.h"
 #include "core/fxge/include/cfx_fontmapper.h"
 #include "core/fxge/include/cfx_fontmgr.h"
 #include "core/fxge/include/cfx_gemodule.h"
 #include "fpdfsdk/formfiller/cffl_formfiller.h"
-#include "fpdfsdk/include/fsdk_mgr.h"
+#include "fpdfsdk/include/cpdfdoc_environment.h"
+#include "fpdfsdk/include/cpdfsdk_annot.h"
+#include "fpdfsdk/include/cpdfsdk_document.h"
+#include "fpdfsdk/include/cpdfsdk_pageview.h"
 
 namespace {
 
diff --git a/fpdfsdk/cpdfdoc_environment.cpp b/fpdfsdk/cpdfdoc_environment.cpp
new file mode 100644
index 0000000..ddc9917
--- /dev/null
+++ b/fpdfsdk/cpdfdoc_environment.cpp
@@ -0,0 +1,214 @@
+// Copyright 2016 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/include/cpdfdoc_environment.h"
+
+#include "fpdfsdk/formfiller/cffl_iformfiller.h"
+#include "fpdfsdk/include/cpdfsdk_annothandlermgr.h"
+#include "fpdfsdk/include/fsdk_actionhandler.h"
+#include "fpdfsdk/javascript/ijs_runtime.h"
+
+#ifdef PDF_ENABLE_XFA
+#include "fpdfsdk/fpdfxfa/include/fpdfxfa_app.h"
+#endif  // PDF_ENABLE_XFA
+
+namespace {
+
+// NOTE: |bsUTF16LE| must outlive the use of the result. Care must be taken
+// since modifying the result would impact |bsUTF16LE|.
+FPDF_WIDESTRING AsFPDFWideString(CFX_ByteString* bsUTF16LE) {
+  return reinterpret_cast<FPDF_WIDESTRING>(
+      bsUTF16LE->GetBuffer(bsUTF16LE->GetLength()));
+}
+
+}  // namespace
+
+CPDFDoc_Environment::CPDFDoc_Environment(UnderlyingDocumentType* pDoc,
+                                         FPDF_FORMFILLINFO* pFFinfo)
+    : m_pInfo(pFFinfo), m_pSDKDoc(nullptr), m_pUnderlyingDoc(pDoc) {
+  m_pSysHandler.reset(new CFX_SystemHandler(this));
+}
+
+CPDFDoc_Environment::~CPDFDoc_Environment() {
+#ifdef PDF_ENABLE_XFA
+  CPDFXFA_App* pProvider = CPDFXFA_App::GetInstance();
+  if (pProvider->m_pEnvList.GetSize() == 0)
+    pProvider->SetJavaScriptInitialized(FALSE);
+#endif  // PDF_ENABLE_XFA
+  if (m_pInfo && m_pInfo->Release)
+    m_pInfo->Release(m_pInfo);
+}
+
+int CPDFDoc_Environment::JS_appAlert(const FX_WCHAR* Msg,
+                                     const FX_WCHAR* Title,
+                                     FX_UINT Type,
+                                     FX_UINT Icon) {
+  if (!m_pInfo || !m_pInfo->m_pJsPlatform ||
+      !m_pInfo->m_pJsPlatform->app_alert) {
+    return -1;
+  }
+  CFX_ByteString bsMsg = CFX_WideString(Msg).UTF16LE_Encode();
+  CFX_ByteString bsTitle = CFX_WideString(Title).UTF16LE_Encode();
+  return m_pInfo->m_pJsPlatform->app_alert(
+      m_pInfo->m_pJsPlatform, AsFPDFWideString(&bsMsg),
+      AsFPDFWideString(&bsTitle), Type, Icon);
+}
+
+int CPDFDoc_Environment::JS_appResponse(const FX_WCHAR* Question,
+                                        const FX_WCHAR* Title,
+                                        const FX_WCHAR* Default,
+                                        const FX_WCHAR* cLabel,
+                                        FPDF_BOOL bPassword,
+                                        void* response,
+                                        int length) {
+  if (!m_pInfo || !m_pInfo->m_pJsPlatform ||
+      !m_pInfo->m_pJsPlatform->app_response) {
+    return -1;
+  }
+  CFX_ByteString bsQuestion = CFX_WideString(Question).UTF16LE_Encode();
+  CFX_ByteString bsTitle = CFX_WideString(Title).UTF16LE_Encode();
+  CFX_ByteString bsDefault = CFX_WideString(Default).UTF16LE_Encode();
+  CFX_ByteString bsLabel = CFX_WideString(cLabel).UTF16LE_Encode();
+  return m_pInfo->m_pJsPlatform->app_response(
+      m_pInfo->m_pJsPlatform, AsFPDFWideString(&bsQuestion),
+      AsFPDFWideString(&bsTitle), AsFPDFWideString(&bsDefault),
+      AsFPDFWideString(&bsLabel), bPassword, response, length);
+}
+
+void CPDFDoc_Environment::JS_appBeep(int nType) {
+  if (!m_pInfo || !m_pInfo->m_pJsPlatform ||
+      !m_pInfo->m_pJsPlatform->app_beep) {
+    return;
+  }
+  m_pInfo->m_pJsPlatform->app_beep(m_pInfo->m_pJsPlatform, nType);
+}
+
+CFX_WideString CPDFDoc_Environment::JS_fieldBrowse() {
+  if (!m_pInfo || !m_pInfo->m_pJsPlatform ||
+      !m_pInfo->m_pJsPlatform->Field_browse) {
+    return CFX_WideString();
+  }
+  const int nRequiredLen =
+      m_pInfo->m_pJsPlatform->Field_browse(m_pInfo->m_pJsPlatform, nullptr, 0);
+  if (nRequiredLen <= 0)
+    return CFX_WideString();
+
+  std::unique_ptr<char[]> pBuff(new char[nRequiredLen]);
+  memset(pBuff.get(), 0, nRequiredLen);
+  const int nActualLen = m_pInfo->m_pJsPlatform->Field_browse(
+      m_pInfo->m_pJsPlatform, pBuff.get(), nRequiredLen);
+  if (nActualLen <= 0 || nActualLen > nRequiredLen)
+    return CFX_WideString();
+
+  return CFX_WideString::FromLocal(CFX_ByteStringC(pBuff.get(), nActualLen));
+}
+
+CFX_WideString CPDFDoc_Environment::JS_docGetFilePath() {
+  if (!m_pInfo || !m_pInfo->m_pJsPlatform ||
+      !m_pInfo->m_pJsPlatform->Doc_getFilePath) {
+    return CFX_WideString();
+  }
+  const int nRequiredLen = m_pInfo->m_pJsPlatform->Doc_getFilePath(
+      m_pInfo->m_pJsPlatform, nullptr, 0);
+  if (nRequiredLen <= 0)
+    return CFX_WideString();
+
+  std::unique_ptr<char[]> pBuff(new char[nRequiredLen]);
+  memset(pBuff.get(), 0, nRequiredLen);
+  const int nActualLen = m_pInfo->m_pJsPlatform->Doc_getFilePath(
+      m_pInfo->m_pJsPlatform, pBuff.get(), nRequiredLen);
+  if (nActualLen <= 0 || nActualLen > nRequiredLen)
+    return CFX_WideString();
+
+  return CFX_WideString::FromLocal(CFX_ByteStringC(pBuff.get(), nActualLen));
+}
+
+void CPDFDoc_Environment::JS_docSubmitForm(void* formData,
+                                           int length,
+                                           const FX_WCHAR* URL) {
+  if (!m_pInfo || !m_pInfo->m_pJsPlatform ||
+      !m_pInfo->m_pJsPlatform->Doc_submitForm) {
+    return;
+  }
+  CFX_ByteString bsDestination = CFX_WideString(URL).UTF16LE_Encode();
+  m_pInfo->m_pJsPlatform->Doc_submitForm(m_pInfo->m_pJsPlatform, formData,
+                                         length,
+                                         AsFPDFWideString(&bsDestination));
+}
+
+void CPDFDoc_Environment::JS_docmailForm(void* mailData,
+                                         int length,
+                                         FPDF_BOOL bUI,
+                                         const FX_WCHAR* To,
+                                         const FX_WCHAR* Subject,
+                                         const FX_WCHAR* CC,
+                                         const FX_WCHAR* BCC,
+                                         const FX_WCHAR* Msg) {
+  if (!m_pInfo || !m_pInfo->m_pJsPlatform ||
+      !m_pInfo->m_pJsPlatform->Doc_mail) {
+    return;
+  }
+  CFX_ByteString bsTo = CFX_WideString(To).UTF16LE_Encode();
+  CFX_ByteString bsSubject = CFX_WideString(Subject).UTF16LE_Encode();
+  CFX_ByteString bsCC = CFX_WideString(CC).UTF16LE_Encode();
+  CFX_ByteString bsBcc = CFX_WideString(BCC).UTF16LE_Encode();
+  CFX_ByteString bsMsg = CFX_WideString(Msg).UTF16LE_Encode();
+  m_pInfo->m_pJsPlatform->Doc_mail(
+      m_pInfo->m_pJsPlatform, mailData, length, bUI, AsFPDFWideString(&bsTo),
+      AsFPDFWideString(&bsSubject), AsFPDFWideString(&bsCC),
+      AsFPDFWideString(&bsBcc), AsFPDFWideString(&bsMsg));
+}
+
+void CPDFDoc_Environment::JS_docprint(FPDF_BOOL bUI,
+                                      int nStart,
+                                      int nEnd,
+                                      FPDF_BOOL bSilent,
+                                      FPDF_BOOL bShrinkToFit,
+                                      FPDF_BOOL bPrintAsImage,
+                                      FPDF_BOOL bReverse,
+                                      FPDF_BOOL bAnnotations) {
+  if (!m_pInfo || !m_pInfo->m_pJsPlatform ||
+      !m_pInfo->m_pJsPlatform->Doc_print) {
+    return;
+  }
+  m_pInfo->m_pJsPlatform->Doc_print(m_pInfo->m_pJsPlatform, bUI, nStart, nEnd,
+                                    bSilent, bShrinkToFit, bPrintAsImage,
+                                    bReverse, bAnnotations);
+}
+
+void CPDFDoc_Environment::JS_docgotoPage(int nPageNum) {
+  if (!m_pInfo || !m_pInfo->m_pJsPlatform ||
+      !m_pInfo->m_pJsPlatform->Doc_gotoPage) {
+    return;
+  }
+  m_pInfo->m_pJsPlatform->Doc_gotoPage(m_pInfo->m_pJsPlatform, nPageNum);
+}
+
+IJS_Runtime* CPDFDoc_Environment::GetJSRuntime() {
+  if (!IsJSInitiated())
+    return nullptr;
+  if (!m_pJSRuntime)
+    m_pJSRuntime.reset(IJS_Runtime::Create(this));
+  return m_pJSRuntime.get();
+}
+
+CPDFSDK_AnnotHandlerMgr* CPDFDoc_Environment::GetAnnotHandlerMgr() {
+  if (!m_pAnnotHandlerMgr)
+    m_pAnnotHandlerMgr.reset(new CPDFSDK_AnnotHandlerMgr(this));
+  return m_pAnnotHandlerMgr.get();
+}
+
+CPDFSDK_ActionHandler* CPDFDoc_Environment::GetActionHander() {
+  if (!m_pActionHandler)
+    m_pActionHandler.reset(new CPDFSDK_ActionHandler());
+  return m_pActionHandler.get();
+}
+
+CFFL_IFormFiller* CPDFDoc_Environment::GetIFormFiller() {
+  if (!m_pIFormFiller)
+    m_pIFormFiller.reset(new CFFL_IFormFiller(this));
+  return m_pIFormFiller.get();
+}
diff --git a/fpdfsdk/cpdfsdk_annot.cpp b/fpdfsdk/cpdfsdk_annot.cpp
index 738508f..7752cf1 100644
--- a/fpdfsdk/cpdfsdk_annot.cpp
+++ b/fpdfsdk/cpdfsdk_annot.cpp
@@ -8,7 +8,7 @@
 
 #include <algorithm>
 
-#include "fpdfsdk/include/fsdk_mgr.h"
+#include "fpdfsdk/include/cpdfsdk_pageview.h"
 #include "third_party/base/stl_util.h"
 
 #ifdef PDF_ENABLE_XFA
diff --git a/fpdfsdk/cpdfsdk_annothandlermgr.cpp b/fpdfsdk/cpdfsdk_annothandlermgr.cpp
index 0fd48d2..8fa1093 100644
--- a/fpdfsdk/cpdfsdk_annothandlermgr.cpp
+++ b/fpdfsdk/cpdfsdk_annothandlermgr.cpp
@@ -8,12 +8,14 @@
 
 #include "core/fpdfdoc/include/cpdf_annot.h"
 #include "fpdfsdk/include/cba_annotiterator.h"
+#include "fpdfsdk/include/cpdfdoc_environment.h"
 #include "fpdfsdk/include/cpdfsdk_annot.h"
 #include "fpdfsdk/include/cpdfsdk_baannot.h"
 #include "fpdfsdk/include/cpdfsdk_baannothandler.h"
 #include "fpdfsdk/include/cpdfsdk_datetime.h"
+#include "fpdfsdk/include/cpdfsdk_document.h"
+#include "fpdfsdk/include/cpdfsdk_pageview.h"
 #include "fpdfsdk/include/cpdfsdk_widgethandler.h"
-#include "fpdfsdk/include/fsdk_mgr.h"
 
 #ifdef PDF_ENABLE_XFA
 #include "fpdfsdk/include/cpdfsdk_xfawidgethandler.h"
diff --git a/fpdfsdk/cpdfsdk_annotiterator.cpp b/fpdfsdk/cpdfsdk_annotiterator.cpp
index 01a4e15..0505ce0 100644
--- a/fpdfsdk/cpdfsdk_annotiterator.cpp
+++ b/fpdfsdk/cpdfsdk_annotiterator.cpp
@@ -9,7 +9,7 @@
 #include <algorithm>
 
 #include "fpdfsdk/include/cpdfsdk_annot.h"
-#include "fpdfsdk/include/fsdk_mgr.h"
+#include "fpdfsdk/include/cpdfsdk_pageview.h"
 
 CPDFSDK_AnnotIterator::CPDFSDK_AnnotIterator(CPDFSDK_PageView* pPageView,
                                              bool bReverse)
diff --git a/fpdfsdk/cpdfsdk_baannot.cpp b/fpdfsdk/cpdfsdk_baannot.cpp
index a2fd7c7..48daaf9 100644
--- a/fpdfsdk/cpdfsdk_baannot.cpp
+++ b/fpdfsdk/cpdfsdk_baannot.cpp
@@ -7,11 +7,13 @@
 #include "fpdfsdk/include/cpdfsdk_baannot.h"
 
 #include "core/fpdfapi/fpdf_parser/include/cpdf_array.h"
+#include "core/fpdfapi/fpdf_parser/include/cpdf_document.h"
 #include "core/fpdfapi/fpdf_parser/include/cpdf_number.h"
 #include "core/fpdfapi/fpdf_parser/include/cpdf_stream.h"
 #include "core/fpdfapi/fpdf_parser/include/fpdf_parser_decode.h"
 #include "fpdfsdk/include/cpdfsdk_datetime.h"
-#include "fpdfsdk/include/fsdk_mgr.h"
+#include "fpdfsdk/include/cpdfsdk_document.h"
+#include "fpdfsdk/include/cpdfsdk_pageview.h"
 
 CPDFSDK_BAAnnot::CPDFSDK_BAAnnot(CPDF_Annot* pAnnot,
                                  CPDFSDK_PageView* pPageView)
diff --git a/fpdfsdk/cpdfsdk_baannothandler.cpp b/fpdfsdk/cpdfsdk_baannothandler.cpp
index f0d67f4..1422c75 100644
--- a/fpdfsdk/cpdfsdk_baannothandler.cpp
+++ b/fpdfsdk/cpdfsdk_baannothandler.cpp
@@ -15,7 +15,7 @@
 #include "fpdfsdk/formfiller/cffl_formfiller.h"
 #include "fpdfsdk/include/cpdfsdk_annot.h"
 #include "fpdfsdk/include/cpdfsdk_baannot.h"
-#include "fpdfsdk/include/fsdk_mgr.h"
+#include "fpdfsdk/include/cpdfsdk_pageview.h"
 
 #ifdef PDF_ENABLE_XFA
 #include "fpdfsdk/fpdfxfa/include/fpdfxfa_doc.h"
diff --git a/fpdfsdk/cpdfsdk_document.cpp b/fpdfsdk/cpdfsdk_document.cpp
new file mode 100644
index 0000000..232adba
--- /dev/null
+++ b/fpdfsdk/cpdfsdk_document.cpp
@@ -0,0 +1,261 @@
+// Copyright 2016 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/include/cpdfsdk_document.h"
+
+#include "core/fpdfapi/fpdf_parser/include/cpdf_array.h"
+#include "core/fpdfapi/fpdf_parser/include/cpdf_dictionary.h"
+#include "core/fpdfapi/fpdf_parser/include/cpdf_document.h"
+#include "core/fpdfapi/fpdf_parser/include/cpdf_object.h"
+#include "core/fpdfdoc/include/cpdf_action.h"
+#include "core/fpdfdoc/include/cpdf_docjsactions.h"
+#include "core/fpdfdoc/include/cpdf_occontext.h"
+#include "fpdfsdk/include/cpdfdoc_environment.h"
+#include "fpdfsdk/include/cpdfsdk_annot.h"
+#include "fpdfsdk/include/cpdfsdk_annothandlermgr.h"
+#include "fpdfsdk/include/cpdfsdk_interform.h"
+#include "fpdfsdk/include/cpdfsdk_pageview.h"
+#include "fpdfsdk/include/cpdfsdk_widget.h"
+#include "fpdfsdk/include/fsdk_actionhandler.h"
+
+// static
+CPDFSDK_Document* CPDFSDK_Document::FromFPDFFormHandle(
+    FPDF_FORMHANDLE hHandle) {
+  CPDFDoc_Environment* pEnv = static_cast<CPDFDoc_Environment*>(hHandle);
+  return pEnv ? pEnv->GetSDKDocument() : nullptr;
+}
+
+CPDFSDK_Document::CPDFSDK_Document(UnderlyingDocumentType* pDoc,
+                                   CPDFDoc_Environment* pEnv)
+    : m_pDoc(pDoc),
+      m_pFocusAnnot(nullptr),
+      m_pEnv(pEnv),
+      m_bChangeMask(FALSE),
+      m_bBeingDestroyed(FALSE) {}
+
+CPDFSDK_Document::~CPDFSDK_Document() {
+  m_bBeingDestroyed = TRUE;
+
+  for (auto& it : m_pageMap)
+    it.second->KillFocusAnnotIfNeeded();
+
+  for (auto& it : m_pageMap)
+    delete it.second;
+  m_pageMap.clear();
+}
+
+CPDFSDK_PageView* CPDFSDK_Document::GetPageView(
+    UnderlyingPageType* pUnderlyingPage,
+    bool ReNew) {
+  auto it = m_pageMap.find(pUnderlyingPage);
+  if (it != m_pageMap.end())
+    return it->second;
+
+  if (!ReNew)
+    return nullptr;
+
+  CPDFSDK_PageView* pPageView = new CPDFSDK_PageView(this, pUnderlyingPage);
+  m_pageMap[pUnderlyingPage] = pPageView;
+  // Delay to load all the annotations, to avoid endless loop.
+  pPageView->LoadFXAnnots();
+  return pPageView;
+}
+
+CPDFSDK_PageView* CPDFSDK_Document::GetCurrentView() {
+  UnderlyingPageType* pPage =
+      UnderlyingFromFPDFPage(m_pEnv->FFI_GetCurrentPage(m_pDoc));
+  return pPage ? GetPageView(pPage, true) : nullptr;
+}
+
+CPDFSDK_PageView* CPDFSDK_Document::GetPageView(int nIndex) {
+  UnderlyingPageType* pTempPage =
+      UnderlyingFromFPDFPage(m_pEnv->FFI_GetPage(m_pDoc, nIndex));
+  if (!pTempPage)
+    return nullptr;
+
+  auto it = m_pageMap.find(pTempPage);
+  return it != m_pageMap.end() ? it->second : nullptr;
+}
+
+void CPDFSDK_Document::ProcJavascriptFun() {
+  CPDF_Document* pPDFDoc = GetPDFDocument();
+  CPDF_DocJSActions docJS(pPDFDoc);
+  int iCount = docJS.CountJSActions();
+  if (iCount < 1)
+    return;
+  for (int i = 0; i < iCount; i++) {
+    CFX_ByteString csJSName;
+    CPDF_Action jsAction = docJS.GetJSAction(i, csJSName);
+    if (m_pEnv->GetActionHander())
+      m_pEnv->GetActionHander()->DoAction_JavaScript(
+          jsAction, CFX_WideString::FromLocal(csJSName.AsStringC()), this);
+  }
+}
+
+FX_BOOL CPDFSDK_Document::ProcOpenAction() {
+  if (!m_pDoc)
+    return FALSE;
+
+  CPDF_Dictionary* pRoot = GetPDFDocument()->GetRoot();
+  if (!pRoot)
+    return FALSE;
+
+  CPDF_Object* pOpenAction = pRoot->GetDictBy("OpenAction");
+  if (!pOpenAction)
+    pOpenAction = pRoot->GetArrayBy("OpenAction");
+
+  if (!pOpenAction)
+    return FALSE;
+
+  if (pOpenAction->IsArray())
+    return TRUE;
+
+  if (CPDF_Dictionary* pDict = pOpenAction->AsDictionary()) {
+    CPDF_Action action(pDict);
+    if (m_pEnv->GetActionHander())
+      m_pEnv->GetActionHander()->DoAction_DocOpen(action, this);
+    return TRUE;
+  }
+  return FALSE;
+}
+
+CPDF_OCContext* CPDFSDK_Document::GetOCContext() {
+  if (!m_pOccontent) {
+    m_pOccontent.reset(
+        new CPDF_OCContext(GetPDFDocument(), CPDF_OCContext::View));
+  }
+  return m_pOccontent.get();
+}
+
+void CPDFSDK_Document::RemovePageView(UnderlyingPageType* pUnderlyingPage) {
+  auto it = m_pageMap.find(pUnderlyingPage);
+  if (it == m_pageMap.end())
+    return;
+
+  CPDFSDK_PageView* pPageView = it->second;
+  if (pPageView->IsLocked())
+    return;
+
+  // This must happen before we remove |pPageView| from the map because
+  // |KillFocusAnnotIfNeeded| can call into the |GetPage| method which will
+  // look for this page view in the map, if it doesn't find it a new one will
+  // be created. We then have two page views pointing to the same page and
+  // bad things happen.
+  pPageView->KillFocusAnnotIfNeeded();
+
+  // Remove the page from the map to make sure we don't accidentally attempt
+  // to use the |pPageView| while we're cleaning it up.
+  m_pageMap.erase(it);
+
+  delete pPageView;
+}
+
+UnderlyingPageType* CPDFSDK_Document::GetPage(int nIndex) {
+  return UnderlyingFromFPDFPage(m_pEnv->FFI_GetPage(m_pDoc, nIndex));
+}
+
+CPDFSDK_InterForm* CPDFSDK_Document::GetInterForm() {
+  if (!m_pInterForm)
+    m_pInterForm.reset(new CPDFSDK_InterForm(this));
+  return m_pInterForm.get();
+}
+
+void CPDFSDK_Document::UpdateAllViews(CPDFSDK_PageView* pSender,
+                                      CPDFSDK_Annot* pAnnot) {
+  for (const auto& it : m_pageMap) {
+    CPDFSDK_PageView* pPageView = it.second;
+    if (pPageView != pSender) {
+      pPageView->UpdateView(pAnnot);
+    }
+  }
+}
+
+CPDFSDK_Annot* CPDFSDK_Document::GetFocusAnnot() {
+  return m_pFocusAnnot;
+}
+
+FX_BOOL CPDFSDK_Document::SetFocusAnnot(CPDFSDK_Annot* pAnnot, FX_UINT nFlag) {
+  if (m_bBeingDestroyed)
+    return FALSE;
+
+  if (m_pFocusAnnot == pAnnot)
+    return TRUE;
+
+  if (m_pFocusAnnot) {
+    if (!KillFocusAnnot(nFlag))
+      return FALSE;
+  }
+
+  if (!pAnnot)
+    return FALSE;
+
+#ifdef PDF_ENABLE_XFA
+  CPDFSDK_Annot* pLastFocusAnnot = m_pFocusAnnot;
+#endif  // PDF_ENABLE_XFA
+  CPDFSDK_PageView* pPageView = pAnnot->GetPageView();
+  if (pPageView && pPageView->IsValid()) {
+    CPDFSDK_AnnotHandlerMgr* pAnnotHandler = m_pEnv->GetAnnotHandlerMgr();
+    if (!m_pFocusAnnot) {
+#ifdef PDF_ENABLE_XFA
+      if (!pAnnotHandler->Annot_OnChangeFocus(pAnnot, pLastFocusAnnot))
+        return FALSE;
+#endif  // PDF_ENABLE_XFA
+      if (!pAnnotHandler->Annot_OnSetFocus(pAnnot, nFlag))
+        return FALSE;
+      if (!m_pFocusAnnot) {
+        m_pFocusAnnot = pAnnot;
+        return TRUE;
+      }
+    }
+  }
+  return FALSE;
+}
+
+FX_BOOL CPDFSDK_Document::KillFocusAnnot(FX_UINT nFlag) {
+  if (m_pFocusAnnot) {
+    CPDFSDK_AnnotHandlerMgr* pAnnotHandler = m_pEnv->GetAnnotHandlerMgr();
+    CPDFSDK_Annot* pFocusAnnot = m_pFocusAnnot;
+    m_pFocusAnnot = nullptr;
+
+#ifdef PDF_ENABLE_XFA
+    if (!pAnnotHandler->Annot_OnChangeFocus(nullptr, pFocusAnnot))
+      return FALSE;
+#endif  // PDF_ENABLE_XFA
+
+    if (pAnnotHandler->Annot_OnKillFocus(pFocusAnnot, nFlag)) {
+      if (pFocusAnnot->GetAnnotSubtype() == CPDF_Annot::Subtype::WIDGET) {
+        CPDFSDK_Widget* pWidget = (CPDFSDK_Widget*)pFocusAnnot;
+        int nFieldType = pWidget->GetFieldType();
+        if (FIELDTYPE_TEXTFIELD == nFieldType ||
+            FIELDTYPE_COMBOBOX == nFieldType) {
+          m_pEnv->FFI_OnSetFieldInputFocus(nullptr, nullptr, 0, FALSE);
+        }
+      }
+
+      if (!m_pFocusAnnot)
+        return TRUE;
+    } else {
+      m_pFocusAnnot = pFocusAnnot;
+    }
+  }
+  return FALSE;
+}
+
+void CPDFSDK_Document::OnCloseDocument() {
+  KillFocusAnnot();
+}
+
+FX_BOOL CPDFSDK_Document::GetPermissions(int nFlag) {
+  return GetPDFDocument()->GetUserPermissions() & nFlag;
+}
+
+IJS_Runtime* CPDFSDK_Document::GetJsRuntime() {
+  return m_pEnv->GetJSRuntime();
+}
+
+CFX_WideString CPDFSDK_Document::GetPath() {
+  return m_pEnv->JS_docGetFilePath();
+}
diff --git a/fpdfsdk/cpdfsdk_interform.cpp b/fpdfsdk/cpdfsdk_interform.cpp
index 1f182d4..f762b89 100644
--- a/fpdfsdk/cpdfsdk_interform.cpp
+++ b/fpdfsdk/cpdfsdk_interform.cpp
@@ -22,11 +22,13 @@
 #include "fpdfsdk/formfiller/cffl_formfiller.h"
 #include "fpdfsdk/fxedit/include/fxet_edit.h"
 #include "fpdfsdk/include/cba_annotiterator.h"
+#include "fpdfsdk/include/cpdfdoc_environment.h"
 #include "fpdfsdk/include/cpdfsdk_annot.h"
+#include "fpdfsdk/include/cpdfsdk_document.h"
+#include "fpdfsdk/include/cpdfsdk_pageview.h"
 #include "fpdfsdk/include/cpdfsdk_widget.h"
 #include "fpdfsdk/include/fsdk_actionhandler.h"
 #include "fpdfsdk/include/fsdk_define.h"
-#include "fpdfsdk/include/fsdk_mgr.h"
 #include "fpdfsdk/include/ipdfsdk_annothandler.h"
 #include "fpdfsdk/javascript/ijs_context.h"
 #include "fpdfsdk/javascript/ijs_runtime.h"
diff --git a/fpdfsdk/cpdfsdk_pageview.cpp b/fpdfsdk/cpdfsdk_pageview.cpp
new file mode 100644
index 0000000..ae0d3fa
--- /dev/null
+++ b/fpdfsdk/cpdfsdk_pageview.cpp
@@ -0,0 +1,587 @@
+// Copyright 2016 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/include/cpdfsdk_pageview.h"
+
+#include "core/fpdfapi/fpdf_parser/include/cpdf_document.h"
+#include "core/fpdfapi/fpdf_render/include/cpdf_renderoptions.h"
+#include "core/fpdfdoc/include/cpdf_annotlist.h"
+#include "core/fpdfdoc/include/cpdf_interform.h"
+#include "fpdfsdk/include/cpdfdoc_environment.h"
+#include "fpdfsdk/include/cpdfsdk_annot.h"
+#include "fpdfsdk/include/cpdfsdk_annothandlermgr.h"
+#include "fpdfsdk/include/cpdfsdk_annotiterator.h"
+#include "fpdfsdk/include/cpdfsdk_interform.h"
+
+#ifdef PDF_ENABLE_XFA
+#include "fpdfsdk/fpdfxfa/include/fpdfxfa_page.h"
+#include "xfa/fxfa/include/xfa_ffdocview.h"
+#include "xfa/fxfa/include/xfa_ffpageview.h"
+#include "xfa/fxfa/include/xfa_ffwidgethandler.h"
+#include "xfa/fxfa/include/xfa_rendercontext.h"
+#include "xfa/fxgraphics/include/cfx_graphics.h"
+#endif  // PDF_ENABLE_XFA
+
+CPDFSDK_PageView::CPDFSDK_PageView(CPDFSDK_Document* pSDKDoc,
+                                   UnderlyingPageType* page)
+    : m_page(page),
+      m_pSDKDoc(pSDKDoc),
+      m_CaptureWidget(nullptr),
+#ifndef PDF_ENABLE_XFA
+      m_bOwnsPage(false),
+#endif  // PDF_ENABLE_XFA
+      m_bEnterWidget(FALSE),
+      m_bExitWidget(FALSE),
+      m_bOnWidget(FALSE),
+      m_bValid(FALSE),
+      m_bLocked(FALSE) {
+  CPDFSDK_InterForm* pInterForm = pSDKDoc->GetInterForm();
+  if (pInterForm) {
+    CPDF_InterForm* pPDFInterForm = pInterForm->GetInterForm();
+#ifdef PDF_ENABLE_XFA
+    if (page->GetPDFPage())
+      pPDFInterForm->FixPageFields(page->GetPDFPage());
+#else   // PDF_ENABLE_XFA
+    pPDFInterForm->FixPageFields(page);
+#endif  // PDF_ENABLE_XFA
+  }
+#ifndef PDF_ENABLE_XFA
+  m_page->SetView(this);
+#endif  // PDF_ENABLE_XFA
+}
+
+CPDFSDK_PageView::~CPDFSDK_PageView() {
+#ifndef PDF_ENABLE_XFA
+  // The call to |ReleaseAnnot| can cause the page pointed to by |m_page| to
+  // be freed, which will cause issues if we try to cleanup the pageview pointer
+  // in |m_page|. So, reset the pageview pointer before doing anything else.
+  m_page->SetView(nullptr);
+#endif  // PDF_ENABLE_XFA
+
+  CPDFDoc_Environment* pEnv = m_pSDKDoc->GetEnv();
+  CPDFSDK_AnnotHandlerMgr* pAnnotHandlerMgr = pEnv->GetAnnotHandlerMgr();
+  for (CPDFSDK_Annot* pAnnot : m_fxAnnotArray)
+    pAnnotHandlerMgr->ReleaseAnnot(pAnnot);
+
+  m_fxAnnotArray.clear();
+  m_pAnnotList.reset();
+
+#ifndef PDF_ENABLE_XFA
+  if (m_bOwnsPage)
+    delete m_page;
+#endif  // PDF_ENABLE_XFA
+}
+
+void CPDFSDK_PageView::PageView_OnDraw(CFX_RenderDevice* pDevice,
+                                       CFX_Matrix* pUser2Device,
+#ifdef PDF_ENABLE_XFA
+                                       CPDF_RenderOptions* pOptions,
+                                       const FX_RECT& pClip) {
+#else
+                                       CPDF_RenderOptions* pOptions) {
+#endif  // PDF_ENABLE_XFA
+  m_curMatrix = *pUser2Device;
+  CPDFDoc_Environment* pEnv = m_pSDKDoc->GetEnv();
+
+#ifdef PDF_ENABLE_XFA
+  CPDFXFA_Page* pPage = GetPDFXFAPage();
+  if (!pPage)
+    return;
+
+  if (pPage->GetDocument()->GetDocType() == DOCTYPE_DYNAMIC_XFA) {
+    CFX_Graphics gs;
+    gs.Create(pDevice);
+    CFX_RectF rectClip;
+    rectClip.Set(static_cast<FX_FLOAT>(pClip.left),
+                 static_cast<FX_FLOAT>(pClip.top),
+                 static_cast<FX_FLOAT>(pClip.Width()),
+                 static_cast<FX_FLOAT>(pClip.Height()));
+    gs.SetClipRect(rectClip);
+    std::unique_ptr<CXFA_RenderContext> pRenderContext(new CXFA_RenderContext);
+    CXFA_RenderOptions renderOptions;
+    renderOptions.m_bHighlight = TRUE;
+    CXFA_FFPageView* xfaView = pPage->GetXFAPageView();
+    pRenderContext->StartRender(xfaView, &gs, *pUser2Device, renderOptions);
+    pRenderContext->DoRender();
+    pRenderContext->StopRender();
+    CXFA_FFDocView* docView = xfaView->GetDocView();
+    if (!docView)
+      return;
+    CPDFSDK_Annot* annot = GetFocusAnnot();
+    if (!annot)
+      return;
+    // Render the focus widget
+    docView->GetWidgetHandler()->RenderWidget(annot->GetXFAWidget(), &gs,
+                                              pUser2Device, FALSE);
+    return;
+  }
+#endif  // PDF_ENABLE_XFA
+
+  // for pdf/static xfa.
+  CPDFSDK_AnnotIterator annotIterator(this, true);
+  while (CPDFSDK_Annot* pSDKAnnot = annotIterator.Next()) {
+    CPDFSDK_AnnotHandlerMgr* pAnnotHandlerMgr = pEnv->GetAnnotHandlerMgr();
+    pAnnotHandlerMgr->Annot_OnDraw(this, pSDKAnnot, pDevice, pUser2Device,
+                                   pOptions->m_bDrawAnnots);
+  }
+}
+
+const CPDF_Annot* CPDFSDK_PageView::GetPDFAnnotAtPoint(FX_FLOAT pageX,
+                                                       FX_FLOAT pageY) {
+  for (const auto& pAnnot : m_pAnnotList->All()) {
+    CFX_FloatRect annotRect = pAnnot->GetRect();
+    if (annotRect.Contains(pageX, pageY))
+      return pAnnot.get();
+  }
+  return nullptr;
+}
+
+const CPDF_Annot* CPDFSDK_PageView::GetPDFWidgetAtPoint(FX_FLOAT pageX,
+                                                        FX_FLOAT pageY) {
+  for (const auto& pAnnot : m_pAnnotList->All()) {
+    if (pAnnot->GetSubtype() == CPDF_Annot::Subtype::WIDGET) {
+      CFX_FloatRect annotRect = pAnnot->GetRect();
+      if (annotRect.Contains(pageX, pageY))
+        return pAnnot.get();
+    }
+  }
+  return nullptr;
+}
+
+CPDFSDK_Annot* CPDFSDK_PageView::GetFXAnnotAtPoint(FX_FLOAT pageX,
+                                                   FX_FLOAT pageY) {
+  CPDFDoc_Environment* pEnv = m_pSDKDoc->GetEnv();
+  CPDFSDK_AnnotHandlerMgr* pAnnotMgr = pEnv->GetAnnotHandlerMgr();
+  CPDFSDK_AnnotIterator annotIterator(this, false);
+  while (CPDFSDK_Annot* pSDKAnnot = annotIterator.Next()) {
+    CFX_FloatRect rc = pAnnotMgr->Annot_OnGetViewBBox(this, pSDKAnnot);
+    if (pSDKAnnot->GetAnnotSubtype() == CPDF_Annot::Subtype::POPUP)
+      continue;
+    if (rc.Contains(pageX, pageY))
+      return pSDKAnnot;
+  }
+
+  return nullptr;
+}
+
+CPDFSDK_Annot* CPDFSDK_PageView::GetFXWidgetAtPoint(FX_FLOAT pageX,
+                                                    FX_FLOAT pageY) {
+  CPDFDoc_Environment* pEnv = m_pSDKDoc->GetEnv();
+  CPDFSDK_AnnotHandlerMgr* pAnnotMgr = pEnv->GetAnnotHandlerMgr();
+  CPDFSDK_AnnotIterator annotIterator(this, false);
+  while (CPDFSDK_Annot* pSDKAnnot = annotIterator.Next()) {
+    bool bHitTest = pSDKAnnot->GetAnnotSubtype() == CPDF_Annot::Subtype::WIDGET;
+#ifdef PDF_ENABLE_XFA
+    bHitTest = bHitTest ||
+               pSDKAnnot->GetAnnotSubtype() == CPDF_Annot::Subtype::XFAWIDGET;
+#endif  // PDF_ENABLE_XFA
+    if (bHitTest) {
+      pAnnotMgr->Annot_OnGetViewBBox(this, pSDKAnnot);
+      CFX_FloatPoint point(pageX, pageY);
+      if (pAnnotMgr->Annot_OnHitTest(this, pSDKAnnot, point))
+        return pSDKAnnot;
+    }
+  }
+
+  return nullptr;
+}
+
+void CPDFSDK_PageView::KillFocusAnnotIfNeeded() {
+  // if there is a focused annot on the page, we should kill the focus first.
+  if (CPDFSDK_Annot* focusedAnnot = m_pSDKDoc->GetFocusAnnot()) {
+    if (pdfium::ContainsValue(m_fxAnnotArray, focusedAnnot))
+      KillFocusAnnot();
+  }
+}
+
+CPDFSDK_Annot* CPDFSDK_PageView::AddAnnot(CPDF_Annot* pPDFAnnot) {
+  CPDFDoc_Environment* pEnv = m_pSDKDoc->GetEnv();
+  ASSERT(pEnv);
+  CPDFSDK_AnnotHandlerMgr* pAnnotHandler = pEnv->GetAnnotHandlerMgr();
+  CPDFSDK_Annot* pSDKAnnot = pAnnotHandler->NewAnnot(pPDFAnnot, this);
+  if (!pSDKAnnot)
+    return nullptr;
+
+  m_fxAnnotArray.push_back(pSDKAnnot);
+  pAnnotHandler->Annot_OnCreate(pSDKAnnot);
+  return pSDKAnnot;
+}
+
+#ifdef PDF_ENABLE_XFA
+CPDFSDK_Annot* CPDFSDK_PageView::AddAnnot(CXFA_FFWidget* pPDFAnnot) {
+  if (!pPDFAnnot)
+    return nullptr;
+
+  CPDFSDK_Annot* pSDKAnnot = GetAnnotByXFAWidget(pPDFAnnot);
+  if (pSDKAnnot)
+    return pSDKAnnot;
+
+  CPDFDoc_Environment* pEnv = m_pSDKDoc->GetEnv();
+  CPDFSDK_AnnotHandlerMgr* pAnnotHandler = pEnv->GetAnnotHandlerMgr();
+  pSDKAnnot = pAnnotHandler->NewAnnot(pPDFAnnot, this);
+  if (!pSDKAnnot)
+    return nullptr;
+
+  m_fxAnnotArray.push_back(pSDKAnnot);
+  return pSDKAnnot;
+}
+#endif  // PDF_ENABLE_XFA
+
+CPDFSDK_Annot* CPDFSDK_PageView::AddAnnot(CPDF_Dictionary* pDict) {
+  return pDict ? AddAnnot(pDict->GetStringBy("Subtype").c_str(), pDict)
+               : nullptr;
+}
+
+CPDFSDK_Annot* CPDFSDK_PageView::AddAnnot(const FX_CHAR* lpSubType,
+                                          CPDF_Dictionary* pDict) {
+  return nullptr;
+}
+
+FX_BOOL CPDFSDK_PageView::DeleteAnnot(CPDFSDK_Annot* pAnnot) {
+#ifdef PDF_ENABLE_XFA
+  if (!pAnnot)
+    return FALSE;
+  CPDFXFA_Page* pPage = pAnnot->GetPDFXFAPage();
+  if (!pPage || (pPage->GetDocument()->GetDocType() != DOCTYPE_STATIC_XFA &&
+                 pPage->GetDocument()->GetDocType() != DOCTYPE_DYNAMIC_XFA))
+    return FALSE;
+
+  if (GetFocusAnnot() == pAnnot)
+    KillFocusAnnot();
+  CPDFDoc_Environment* pEnv = m_pSDKDoc->GetEnv();
+  CPDFSDK_AnnotHandlerMgr* pAnnotHandler = pEnv->GetAnnotHandlerMgr();
+  if (pAnnotHandler)
+    pAnnotHandler->ReleaseAnnot(pAnnot);
+
+  auto it = std::find(m_fxAnnotArray.begin(), m_fxAnnotArray.end(), pAnnot);
+  if (it != m_fxAnnotArray.end())
+    m_fxAnnotArray.erase(it);
+  if (m_CaptureWidget == pAnnot)
+    m_CaptureWidget = nullptr;
+
+  return TRUE;
+#else   // PDF_ENABLE_XFA
+  return FALSE;
+#endif  // PDF_ENABLE_XFA
+}
+
+CPDF_Document* CPDFSDK_PageView::GetPDFDocument() {
+  if (m_page) {
+#ifdef PDF_ENABLE_XFA
+    return m_page->GetDocument()->GetPDFDoc();
+#else   // PDF_ENABLE_XFA
+    return m_page->m_pDocument;
+#endif  // PDF_ENABLE_XFA
+  }
+  return nullptr;
+}
+
+CPDF_Page* CPDFSDK_PageView::GetPDFPage() const {
+#ifdef PDF_ENABLE_XFA
+  return m_page ? m_page->GetPDFPage() : nullptr;
+#else   // PDF_ENABLE_XFA
+  return m_page;
+#endif  // PDF_ENABLE_XFA
+}
+
+size_t CPDFSDK_PageView::CountAnnots() const {
+  return m_fxAnnotArray.size();
+}
+
+CPDFSDK_Annot* CPDFSDK_PageView::GetAnnot(size_t nIndex) {
+  return nIndex < m_fxAnnotArray.size() ? m_fxAnnotArray[nIndex] : nullptr;
+}
+
+CPDFSDK_Annot* CPDFSDK_PageView::GetAnnotByDict(CPDF_Dictionary* pDict) {
+  for (CPDFSDK_Annot* pAnnot : m_fxAnnotArray) {
+    if (pAnnot->GetPDFAnnot()->GetAnnotDict() == pDict)
+      return pAnnot;
+  }
+  return nullptr;
+}
+
+#ifdef PDF_ENABLE_XFA
+CPDFSDK_Annot* CPDFSDK_PageView::GetAnnotByXFAWidget(CXFA_FFWidget* hWidget) {
+  if (!hWidget)
+    return nullptr;
+
+  for (CPDFSDK_Annot* pAnnot : m_fxAnnotArray) {
+    if (pAnnot->GetXFAWidget() == hWidget)
+      return pAnnot;
+  }
+  return nullptr;
+}
+#endif  // PDF_ENABLE_XFA
+
+FX_BOOL CPDFSDK_PageView::OnLButtonDown(const CFX_FloatPoint& point,
+                                        FX_UINT nFlag) {
+  CPDFDoc_Environment* pEnv = m_pSDKDoc->GetEnv();
+  ASSERT(pEnv);
+  CPDFSDK_Annot* pFXAnnot = GetFXWidgetAtPoint(point.x, point.y);
+  if (!pFXAnnot) {
+    KillFocusAnnot(nFlag);
+    return FALSE;
+  }
+
+  CPDFSDK_AnnotHandlerMgr* pAnnotHandlerMgr = pEnv->GetAnnotHandlerMgr();
+  FX_BOOL bRet =
+      pAnnotHandlerMgr->Annot_OnLButtonDown(this, pFXAnnot, nFlag, point);
+  if (bRet)
+    SetFocusAnnot(pFXAnnot);
+  return bRet;
+}
+
+#ifdef PDF_ENABLE_XFA
+FX_BOOL CPDFSDK_PageView::OnRButtonDown(const CFX_FloatPoint& point,
+                                        FX_UINT nFlag) {
+  CPDFDoc_Environment* pEnv = m_pSDKDoc->GetEnv();
+  ASSERT(pEnv);
+  CPDFSDK_AnnotHandlerMgr* pAnnotHandlerMgr = pEnv->GetAnnotHandlerMgr();
+  ASSERT(pAnnotHandlerMgr);
+
+  CPDFSDK_Annot* pFXAnnot = GetFXWidgetAtPoint(point.x, point.y);
+
+  if (!pFXAnnot)
+    return FALSE;
+
+  if (pAnnotHandlerMgr->Annot_OnRButtonDown(this, pFXAnnot, nFlag, point))
+    SetFocusAnnot(pFXAnnot);
+
+  return TRUE;
+}
+
+FX_BOOL CPDFSDK_PageView::OnRButtonUp(const CFX_FloatPoint& point,
+                                      FX_UINT nFlag) {
+  CPDFDoc_Environment* pEnv = m_pSDKDoc->GetEnv();
+  ASSERT(pEnv);
+  CPDFSDK_AnnotHandlerMgr* pAnnotHandlerMgr = pEnv->GetAnnotHandlerMgr();
+
+  CPDFSDK_Annot* pFXAnnot = GetFXWidgetAtPoint(point.x, point.y);
+
+  if (!pFXAnnot)
+    return FALSE;
+
+  if (pAnnotHandlerMgr->Annot_OnRButtonUp(this, pFXAnnot, nFlag, point))
+    SetFocusAnnot(pFXAnnot);
+
+  return TRUE;
+}
+#endif  // PDF_ENABLE_XFA
+
+FX_BOOL CPDFSDK_PageView::OnLButtonUp(const CFX_FloatPoint& point,
+                                      FX_UINT nFlag) {
+  CPDFDoc_Environment* pEnv = m_pSDKDoc->GetEnv();
+  ASSERT(pEnv);
+  CPDFSDK_AnnotHandlerMgr* pAnnotHandlerMgr = pEnv->GetAnnotHandlerMgr();
+  CPDFSDK_Annot* pFXAnnot = GetFXWidgetAtPoint(point.x, point.y);
+  CPDFSDK_Annot* pFocusAnnot = GetFocusAnnot();
+  FX_BOOL bRet = FALSE;
+  if (pFocusAnnot && pFocusAnnot != pFXAnnot) {
+    // Last focus Annot gets a chance to handle the event.
+    bRet = pAnnotHandlerMgr->Annot_OnLButtonUp(this, pFocusAnnot, nFlag, point);
+  }
+  if (pFXAnnot && !bRet)
+    bRet = pAnnotHandlerMgr->Annot_OnLButtonUp(this, pFXAnnot, nFlag, point);
+  return bRet;
+}
+
+FX_BOOL CPDFSDK_PageView::OnMouseMove(const CFX_FloatPoint& point, int nFlag) {
+  CPDFDoc_Environment* pEnv = m_pSDKDoc->GetEnv();
+  CPDFSDK_AnnotHandlerMgr* pAnnotHandlerMgr = pEnv->GetAnnotHandlerMgr();
+  if (CPDFSDK_Annot* pFXAnnot = GetFXAnnotAtPoint(point.x, point.y)) {
+    if (m_CaptureWidget && m_CaptureWidget != pFXAnnot) {
+      m_bExitWidget = TRUE;
+      m_bEnterWidget = FALSE;
+      pAnnotHandlerMgr->Annot_OnMouseExit(this, m_CaptureWidget, nFlag);
+    }
+    m_CaptureWidget = pFXAnnot;
+    m_bOnWidget = TRUE;
+    if (!m_bEnterWidget) {
+      m_bEnterWidget = TRUE;
+      m_bExitWidget = FALSE;
+      pAnnotHandlerMgr->Annot_OnMouseEnter(this, pFXAnnot, nFlag);
+    }
+    pAnnotHandlerMgr->Annot_OnMouseMove(this, pFXAnnot, nFlag, point);
+    return TRUE;
+  }
+  if (m_bOnWidget) {
+    m_bOnWidget = FALSE;
+    m_bExitWidget = TRUE;
+    m_bEnterWidget = FALSE;
+    if (m_CaptureWidget) {
+      pAnnotHandlerMgr->Annot_OnMouseExit(this, m_CaptureWidget, nFlag);
+      m_CaptureWidget = nullptr;
+    }
+  }
+  return FALSE;
+}
+
+FX_BOOL CPDFSDK_PageView::OnMouseWheel(double deltaX,
+                                       double deltaY,
+                                       const CFX_FloatPoint& point,
+                                       int nFlag) {
+  if (CPDFSDK_Annot* pAnnot = GetFXWidgetAtPoint(point.x, point.y)) {
+    CPDFDoc_Environment* pEnv = m_pSDKDoc->GetEnv();
+    CPDFSDK_AnnotHandlerMgr* pAnnotHandlerMgr = pEnv->GetAnnotHandlerMgr();
+    return pAnnotHandlerMgr->Annot_OnMouseWheel(this, pAnnot, nFlag,
+                                                (int)deltaY, point);
+  }
+  return FALSE;
+}
+
+FX_BOOL CPDFSDK_PageView::OnChar(int nChar, FX_UINT nFlag) {
+  if (CPDFSDK_Annot* pAnnot = GetFocusAnnot()) {
+    CPDFDoc_Environment* pEnv = m_pSDKDoc->GetEnv();
+    CPDFSDK_AnnotHandlerMgr* pAnnotHandlerMgr = pEnv->GetAnnotHandlerMgr();
+    return pAnnotHandlerMgr->Annot_OnChar(pAnnot, nChar, nFlag);
+  }
+
+  return FALSE;
+}
+
+FX_BOOL CPDFSDK_PageView::OnKeyDown(int nKeyCode, int nFlag) {
+  if (CPDFSDK_Annot* pAnnot = GetFocusAnnot()) {
+    CPDFDoc_Environment* pEnv = m_pSDKDoc->GetEnv();
+    CPDFSDK_AnnotHandlerMgr* pAnnotHandlerMgr = pEnv->GetAnnotHandlerMgr();
+    return pAnnotHandlerMgr->Annot_OnKeyDown(pAnnot, nKeyCode, nFlag);
+  }
+  return FALSE;
+}
+
+FX_BOOL CPDFSDK_PageView::OnKeyUp(int nKeyCode, int nFlag) {
+  return FALSE;
+}
+
+void CPDFSDK_PageView::LoadFXAnnots() {
+  CPDFDoc_Environment* pEnv = m_pSDKDoc->GetEnv();
+  CPDFSDK_AnnotHandlerMgr* pAnnotHandlerMgr = pEnv->GetAnnotHandlerMgr();
+
+  SetLock(TRUE);
+
+#ifdef PDF_ENABLE_XFA
+  CFX_RetainPtr<CPDFXFA_Page> protector(m_page);
+  if (m_pSDKDoc->GetXFADocument()->GetDocType() == DOCTYPE_DYNAMIC_XFA) {
+    CXFA_FFPageView* pageView = m_page->GetXFAPageView();
+    std::unique_ptr<IXFA_WidgetIterator> pWidgetHander(
+        pageView->CreateWidgetIterator(
+            XFA_TRAVERSEWAY_Form,
+            XFA_WidgetStatus_Visible | XFA_WidgetStatus_Viewable));
+    if (!pWidgetHander) {
+      SetLock(FALSE);
+      return;
+    }
+
+    while (CXFA_FFWidget* pXFAAnnot = pWidgetHander->MoveToNext()) {
+      CPDFSDK_Annot* pAnnot = pAnnotHandlerMgr->NewAnnot(pXFAAnnot, this);
+      if (!pAnnot)
+        continue;
+      m_fxAnnotArray.push_back(pAnnot);
+      pAnnotHandlerMgr->Annot_OnLoad(pAnnot);
+    }
+
+    SetLock(FALSE);
+    return;
+  }
+#endif  // PDF_ENABLE_XFA
+
+  CPDF_Page* pPage = GetPDFPage();
+  ASSERT(pPage);
+  FX_BOOL bUpdateAP = CPDF_InterForm::IsUpdateAPEnabled();
+  // Disable the default AP construction.
+  CPDF_InterForm::SetUpdateAP(FALSE);
+  m_pAnnotList.reset(new CPDF_AnnotList(pPage));
+  CPDF_InterForm::SetUpdateAP(bUpdateAP);
+
+  const size_t nCount = m_pAnnotList->Count();
+  for (size_t i = 0; i < nCount; ++i) {
+    CPDF_Annot* pPDFAnnot = m_pAnnotList->GetAt(i);
+    CheckUnSupportAnnot(GetPDFDocument(), pPDFAnnot);
+    CPDFSDK_Annot* pAnnot = pAnnotHandlerMgr->NewAnnot(pPDFAnnot, this);
+    if (!pAnnot)
+      continue;
+    m_fxAnnotArray.push_back(pAnnot);
+    pAnnotHandlerMgr->Annot_OnLoad(pAnnot);
+  }
+
+  SetLock(FALSE);
+}
+
+void CPDFSDK_PageView::ClearFXAnnots() {
+  SetLock(TRUE);
+  if (m_pSDKDoc && GetFocusAnnot())
+    m_pSDKDoc->SetFocusAnnot(nullptr);
+  m_CaptureWidget = nullptr;
+  for (CPDFSDK_Annot* pAnnot : m_fxAnnotArray)
+    m_pSDKDoc->GetEnv()->GetAnnotHandlerMgr()->ReleaseAnnot(pAnnot);
+  m_fxAnnotArray.clear();
+  m_pAnnotList.reset();
+  SetLock(FALSE);
+}
+
+void CPDFSDK_PageView::UpdateRects(const std::vector<CFX_FloatRect>& rects) {
+  CPDFDoc_Environment* pEnv = m_pSDKDoc->GetEnv();
+  for (const auto& rc : rects)
+    pEnv->FFI_Invalidate(m_page, rc.left, rc.top, rc.right, rc.bottom);
+}
+
+void CPDFSDK_PageView::UpdateView(CPDFSDK_Annot* pAnnot) {
+  CFX_FloatRect rcWindow = pAnnot->GetRect();
+  CPDFDoc_Environment* pEnv = m_pSDKDoc->GetEnv();
+  pEnv->FFI_Invalidate(m_page, rcWindow.left, rcWindow.top, rcWindow.right,
+                       rcWindow.bottom);
+}
+
+int CPDFSDK_PageView::GetPageIndex() const {
+  if (!m_page)
+    return -1;
+
+#ifdef PDF_ENABLE_XFA
+  int nDocType = m_page->GetDocument()->GetDocType();
+  switch (nDocType) {
+    case DOCTYPE_DYNAMIC_XFA: {
+      CXFA_FFPageView* pPageView = m_page->GetXFAPageView();
+      return pPageView ? pPageView->GetPageIndex() : -1;
+    }
+    case DOCTYPE_STATIC_XFA:
+    case DOCTYPE_PDF:
+      return GetPageIndexForStaticPDF();
+    default:
+      return -1;
+  }
+#else   // PDF_ENABLE_XFA
+  return GetPageIndexForStaticPDF();
+#endif  // PDF_ENABLE_XFA
+}
+
+bool CPDFSDK_PageView::IsValidAnnot(const CPDF_Annot* p) const {
+  if (!p)
+    return false;
+
+  const auto& annots = m_pAnnotList->All();
+  auto it = std::find_if(annots.begin(), annots.end(),
+                         [p](const std::unique_ptr<CPDF_Annot>& annot) {
+                           return annot.get() == p;
+                         });
+  return it != annots.end();
+}
+
+CPDFSDK_Annot* CPDFSDK_PageView::GetFocusAnnot() {
+  CPDFSDK_Annot* pFocusAnnot = m_pSDKDoc->GetFocusAnnot();
+  if (!pFocusAnnot)
+    return nullptr;
+
+  for (CPDFSDK_Annot* pAnnot : m_fxAnnotArray) {
+    if (pAnnot == pFocusAnnot)
+      return pAnnot;
+  }
+  return nullptr;
+}
+
+int CPDFSDK_PageView::GetPageIndexForStaticPDF() const {
+  CPDF_Dictionary* pDict = GetPDFPage()->m_pFormDict;
+  CPDF_Document* pDoc = m_pSDKDoc->GetPDFDocument();
+  return (pDoc && pDict) ? pDoc->GetPageIndex(pDict->GetObjNum()) : -1;
+}
diff --git a/fpdfsdk/cpdfsdk_widget.cpp b/fpdfsdk/cpdfsdk_widget.cpp
index 016e78a..11e9883 100644
--- a/fpdfsdk/cpdfsdk_widget.cpp
+++ b/fpdfsdk/cpdfsdk_widget.cpp
@@ -21,9 +21,12 @@
 #include "core/fxge/include/cfx_renderdevice.h"
 #include "fpdfsdk/formfiller/cba_fontmap.h"
 #include "fpdfsdk/fxedit/include/fxet_edit.h"
+#include "fpdfsdk/include/cpdfdoc_environment.h"
+#include "fpdfsdk/include/cpdfsdk_document.h"
 #include "fpdfsdk/include/cpdfsdk_interform.h"
+#include "fpdfsdk/include/cpdfsdk_pageview.h"
+#include "fpdfsdk/include/fsdk_actionhandler.h"
 #include "fpdfsdk/include/fsdk_define.h"
-#include "fpdfsdk/include/fsdk_mgr.h"
 #include "fpdfsdk/pdfwindow/PWL_Edit.h"
 #include "fpdfsdk/pdfwindow/PWL_Utils.h"
 
diff --git a/fpdfsdk/cpdfsdk_widgethandler.cpp b/fpdfsdk/cpdfsdk_widgethandler.cpp
index 8a061e5..965a26c 100644
--- a/fpdfsdk/cpdfsdk_widgethandler.cpp
+++ b/fpdfsdk/cpdfsdk_widgethandler.cpp
@@ -13,10 +13,12 @@
 #include "core/fpdfapi/fpdf_parser/include/cpdf_document.h"
 #include "core/fpdfdoc/include/cpdf_interform.h"
 #include "fpdfsdk/formfiller/cffl_formfiller.h"
+#include "fpdfsdk/include/cpdfdoc_environment.h"
 #include "fpdfsdk/include/cpdfsdk_annot.h"
+#include "fpdfsdk/include/cpdfsdk_document.h"
 #include "fpdfsdk/include/cpdfsdk_interform.h"
+#include "fpdfsdk/include/cpdfsdk_pageview.h"
 #include "fpdfsdk/include/cpdfsdk_widget.h"
-#include "fpdfsdk/include/fsdk_mgr.h"
 
 #ifdef PDF_ENABLE_XFA
 #include "fpdfsdk/fpdfxfa/include/fpdfxfa_doc.h"
diff --git a/fpdfsdk/cpdfsdk_xfawidgethandler.cpp b/fpdfsdk/cpdfsdk_xfawidgethandler.cpp
index 8621f77..0765011 100644
--- a/fpdfsdk/cpdfsdk_xfawidgethandler.cpp
+++ b/fpdfsdk/cpdfsdk_xfawidgethandler.cpp
@@ -8,10 +8,12 @@
 
 #include "core/fpdfdoc/include/cpdf_interform.h"
 #include "fpdfsdk/fpdfxfa/include/fpdfxfa_doc.h"
+#include "fpdfsdk/include/cpdfdoc_environment.h"
 #include "fpdfsdk/include/cpdfsdk_annot.h"
+#include "fpdfsdk/include/cpdfsdk_document.h"
 #include "fpdfsdk/include/cpdfsdk_interform.h"
+#include "fpdfsdk/include/cpdfsdk_pageview.h"
 #include "fpdfsdk/include/cpdfsdk_xfawidget.h"
-#include "fpdfsdk/include/fsdk_mgr.h"
 #include "xfa/fxfa/include/fxfa_basic.h"
 #include "xfa/fxfa/include/xfa_ffdocview.h"
 #include "xfa/fxfa/include/xfa_ffpageview.h"
diff --git a/fpdfsdk/formfiller/cffl_checkbox.cpp b/fpdfsdk/formfiller/cffl_checkbox.cpp
index ed81f37..3455cde 100644
--- a/fpdfsdk/formfiller/cffl_checkbox.cpp
+++ b/fpdfsdk/formfiller/cffl_checkbox.cpp
@@ -7,8 +7,8 @@
 #include "fpdfsdk/formfiller/cffl_checkbox.h"
 
 #include "fpdfsdk/formfiller/cffl_formfiller.h"
+#include "fpdfsdk/include/cpdfdoc_environment.h"
 #include "fpdfsdk/include/cpdfsdk_widget.h"
-#include "fpdfsdk/include/fsdk_mgr.h"
 #include "fpdfsdk/pdfwindow/PWL_SpecialButton.h"
 #include "public/fpdf_fwlevent.h"
 
diff --git a/fpdfsdk/formfiller/cffl_combobox.cpp b/fpdfsdk/formfiller/cffl_combobox.cpp
index fc590fd..3eea1e4 100644
--- a/fpdfsdk/formfiller/cffl_combobox.cpp
+++ b/fpdfsdk/formfiller/cffl_combobox.cpp
@@ -9,9 +9,9 @@
 #include "fpdfsdk/formfiller/cba_fontmap.h"
 #include "fpdfsdk/formfiller/cffl_formfiller.h"
 #include "fpdfsdk/formfiller/cffl_iformfiller.h"
+#include "fpdfsdk/include/cpdfdoc_environment.h"
 #include "fpdfsdk/include/cpdfsdk_widget.h"
 #include "fpdfsdk/include/fsdk_common.h"
-#include "fpdfsdk/include/fsdk_mgr.h"
 #include "fpdfsdk/pdfwindow/PWL_ComboBox.h"
 
 CFFL_ComboBox::CFFL_ComboBox(CPDFDoc_Environment* pApp, CPDFSDK_Annot* pAnnot)
diff --git a/fpdfsdk/formfiller/cffl_formfiller.cpp b/fpdfsdk/formfiller/cffl_formfiller.cpp
index f97df0a..4b33c38 100644
--- a/fpdfsdk/formfiller/cffl_formfiller.cpp
+++ b/fpdfsdk/formfiller/cffl_formfiller.cpp
@@ -8,10 +8,12 @@
 
 #include "core/fpdfapi/fpdf_page/include/cpdf_page.h"
 #include "core/fxge/include/cfx_renderdevice.h"
-#include "fpdfsdk/include/cpdfsdk_widget.h"
 #include "fpdfsdk/formfiller/cba_fontmap.h"
+#include "fpdfsdk/include/cpdfdoc_environment.h"
+#include "fpdfsdk/include/cpdfsdk_document.h"
+#include "fpdfsdk/include/cpdfsdk_pageview.h"
+#include "fpdfsdk/include/cpdfsdk_widget.h"
 #include "fpdfsdk/include/fsdk_common.h"
-#include "fpdfsdk/include/fsdk_mgr.h"
 #include "fpdfsdk/pdfwindow/PWL_Utils.h"
 
 #define GetRed(rgb) ((uint8_t)(rgb))
diff --git a/fpdfsdk/formfiller/cffl_iformfiller.cpp b/fpdfsdk/formfiller/cffl_iformfiller.cpp
index 24a6122..d7ccaf2 100644
--- a/fpdfsdk/formfiller/cffl_iformfiller.cpp
+++ b/fpdfsdk/formfiller/cffl_iformfiller.cpp
@@ -18,9 +18,11 @@
 #include "fpdfsdk/formfiller/cffl_pushbutton.h"
 #include "fpdfsdk/formfiller/cffl_radiobutton.h"
 #include "fpdfsdk/formfiller/cffl_textfield.h"
+#include "fpdfsdk/include/cpdfdoc_environment.h"
+#include "fpdfsdk/include/cpdfsdk_document.h"
 #include "fpdfsdk/include/cpdfsdk_interform.h"
+#include "fpdfsdk/include/cpdfsdk_pageview.h"
 #include "fpdfsdk/include/cpdfsdk_widget.h"
-#include "fpdfsdk/include/fsdk_mgr.h"
 #include "fpdfsdk/pdfwindow/PWL_Utils.h"
 
 #define FFL_MAXLISTBOXHEIGHT 140.0f
diff --git a/fpdfsdk/formfiller/cffl_listbox.cpp b/fpdfsdk/formfiller/cffl_listbox.cpp
index 860fd07..39b766a 100644
--- a/fpdfsdk/formfiller/cffl_listbox.cpp
+++ b/fpdfsdk/formfiller/cffl_listbox.cpp
@@ -9,9 +9,9 @@
 #include "fpdfsdk/formfiller/cba_fontmap.h"
 #include "fpdfsdk/formfiller/cffl_formfiller.h"
 #include "fpdfsdk/formfiller/cffl_iformfiller.h"
+#include "fpdfsdk/include/cpdfdoc_environment.h"
 #include "fpdfsdk/include/cpdfsdk_widget.h"
 #include "fpdfsdk/include/fsdk_common.h"
-#include "fpdfsdk/include/fsdk_mgr.h"
 #include "fpdfsdk/pdfwindow/PWL_ListBox.h"
 
 #define FFL_DEFAULTLISTBOXFONTSIZE 12.0f
diff --git a/fpdfsdk/formfiller/cffl_radiobutton.cpp b/fpdfsdk/formfiller/cffl_radiobutton.cpp
index d5474f9..752baad 100644
--- a/fpdfsdk/formfiller/cffl_radiobutton.cpp
+++ b/fpdfsdk/formfiller/cffl_radiobutton.cpp
@@ -7,9 +7,10 @@
 #include "fpdfsdk/formfiller/cffl_radiobutton.h"
 
 #include "fpdfsdk/formfiller/cffl_formfiller.h"
+#include "fpdfsdk/include/cpdfdoc_environment.h"
 #include "fpdfsdk/include/cpdfsdk_widget.h"
-#include "fpdfsdk/include/fsdk_mgr.h"
 #include "fpdfsdk/pdfwindow/PWL_SpecialButton.h"
+#include "public/fpdf_fwlevent.h"
 
 CFFL_RadioButton::CFFL_RadioButton(CPDFDoc_Environment* pApp,
                                    CPDFSDK_Annot* pWidget)
diff --git a/fpdfsdk/formfiller/cffl_textfield.cpp b/fpdfsdk/formfiller/cffl_textfield.cpp
index 369bb4d..15bfbc8 100644
--- a/fpdfsdk/formfiller/cffl_textfield.cpp
+++ b/fpdfsdk/formfiller/cffl_textfield.cpp
@@ -7,9 +7,9 @@
 #include "fpdfsdk/formfiller/cffl_textfield.h"
 
 #include "fpdfsdk/formfiller/cba_fontmap.h"
+#include "fpdfsdk/include/cpdfdoc_environment.h"
 #include "fpdfsdk/include/cpdfsdk_widget.h"
 #include "fpdfsdk/include/fsdk_common.h"
-#include "fpdfsdk/include/fsdk_mgr.h"
 
 CFFL_TextField::CFFL_TextField(CPDFDoc_Environment* pApp, CPDFSDK_Annot* pAnnot)
     : CFFL_FormFiller(pApp, pAnnot) {}
diff --git a/fpdfsdk/fpdfformfill.cpp b/fpdfsdk/fpdfformfill.cpp
index 2ac6c60..8658584 100644
--- a/fpdfsdk/fpdfformfill.cpp
+++ b/fpdfsdk/fpdfformfill.cpp
@@ -15,10 +15,14 @@
 #include "core/fpdfdoc/include/cpdf_formcontrol.h"
 #include "core/fpdfdoc/include/cpdf_formfield.h"
 #include "core/fpdfdoc/include/cpdf_interform.h"
+#include "core/fpdfdoc/include/cpdf_occontext.h"
 #include "core/fxge/include/cfx_fxgedevice.h"
+#include "fpdfsdk/include/cpdfdoc_environment.h"
+#include "fpdfsdk/include/cpdfsdk_document.h"
 #include "fpdfsdk/include/cpdfsdk_interform.h"
+#include "fpdfsdk/include/cpdfsdk_pageview.h"
+#include "fpdfsdk/include/fsdk_actionhandler.h"
 #include "fpdfsdk/include/fsdk_define.h"
-#include "fpdfsdk/include/fsdk_mgr.h"
 #include "public/fpdfview.h"
 #include "third_party/base/stl_util.h"
 
diff --git a/fpdfsdk/fpdfview.cpp b/fpdfsdk/fpdfview.cpp
index 4e20751..76540fc 100644
--- a/fpdfsdk/fpdfview.cpp
+++ b/fpdfsdk/fpdfview.cpp
@@ -18,14 +18,15 @@
 #include "core/fpdfapi/include/cpdf_pagerendercontext.h"
 #include "core/fpdfdoc/include/cpdf_annotlist.h"
 #include "core/fpdfdoc/include/cpdf_nametree.h"
+#include "core/fpdfdoc/include/cpdf_occontext.h"
 #include "core/fpdfdoc/include/cpdf_viewerpreferences.h"
 #include "core/fxcodec/include/fx_codec.h"
 #include "core/fxcrt/include/fx_memory.h"
 #include "core/fxcrt/include/fx_safe_types.h"
 #include "core/fxge/include/cfx_fxgedevice.h"
 #include "core/fxge/include/cfx_gemodule.h"
+#include "fpdfsdk/include/cpdfsdk_pageview.h"
 #include "fpdfsdk/include/fsdk_define.h"
-#include "fpdfsdk/include/fsdk_mgr.h"
 #include "fpdfsdk/include/fsdk_pauseadapter.h"
 #include "fpdfsdk/javascript/ijs_runtime.h"
 #include "public/fpdf_ext.h"
diff --git a/fpdfsdk/fpdfxfa/fpdfxfa_app.cpp b/fpdfsdk/fpdfxfa/fpdfxfa_app.cpp
index b829246..9f89a14 100644
--- a/fpdfsdk/fpdfxfa/fpdfxfa_app.cpp
+++ b/fpdfsdk/fpdfxfa/fpdfxfa_app.cpp
@@ -7,8 +7,8 @@
 #include "fpdfsdk/fpdfxfa/include/fpdfxfa_app.h"
 
 #include "fpdfsdk/fpdfxfa/include/fpdfxfa_util.h"
+#include "fpdfsdk/include/cpdfdoc_environment.h"
 #include "fpdfsdk/include/fsdk_define.h"
-#include "fpdfsdk/include/fsdk_mgr.h"
 #include "xfa/fxbarcode/include/BC_Library.h"
 #include "xfa/fxfa/include/xfa_ffapp.h"
 #include "xfa/fxfa/include/xfa_fontmgr.h"
diff --git a/fpdfsdk/fpdfxfa/fpdfxfa_doc.cpp b/fpdfsdk/fpdfxfa/fpdfxfa_doc.cpp
index d4c43c5..63f4bb9 100644
--- a/fpdfsdk/fpdfxfa/fpdfxfa_doc.cpp
+++ b/fpdfsdk/fpdfxfa/fpdfxfa_doc.cpp
@@ -13,9 +13,11 @@
 #include "fpdfsdk/fpdfxfa/include/fpdfxfa_app.h"
 #include "fpdfsdk/fpdfxfa/include/fpdfxfa_page.h"
 #include "fpdfsdk/fpdfxfa/include/fpdfxfa_util.h"
-#include "fpdfsdk/include/fsdk_define.h"
+#include "fpdfsdk/include/cpdfdoc_environment.h"
+#include "fpdfsdk/include/cpdfsdk_document.h"
 #include "fpdfsdk/include/cpdfsdk_interform.h"
-#include "fpdfsdk/include/fsdk_mgr.h"
+#include "fpdfsdk/include/cpdfsdk_pageview.h"
+#include "fpdfsdk/include/fsdk_define.h"
 #include "fpdfsdk/javascript/ijs_runtime.h"
 #include "public/fpdf_formfill.h"
 #include "xfa/fxfa/include/cxfa_eventparam.h"
diff --git a/fpdfsdk/fpdfxfa/fpdfxfa_page.cpp b/fpdfsdk/fpdfxfa/fpdfxfa_page.cpp
index 8c4301f..451175a 100644
--- a/fpdfsdk/fpdfxfa/fpdfxfa_page.cpp
+++ b/fpdfsdk/fpdfxfa/fpdfxfa_page.cpp
@@ -6,11 +6,12 @@
 
 #include "fpdfsdk/fpdfxfa/include/fpdfxfa_page.h"
 
+#include "core/fpdfapi/fpdf_page/include/cpdf_page.h"
 #include "core/fpdfapi/fpdf_parser/include/cpdf_document.h"
 #include "fpdfsdk/fpdfxfa/include/fpdfxfa_doc.h"
 #include "fpdfsdk/fpdfxfa/include/fpdfxfa_util.h"
 #include "fpdfsdk/include/fsdk_define.h"
-#include "fpdfsdk/include/fsdk_mgr.h"
+#include "public/fpdf_formfill.h"
 #include "xfa/fxfa/include/xfa_ffdocview.h"
 #include "xfa/fxfa/include/xfa_ffpageview.h"
 
diff --git a/fpdfsdk/fpdfxfa/fpdfxfa_util.cpp b/fpdfsdk/fpdfxfa/fpdfxfa_util.cpp
index 9971f5d..b3a77a8 100644
--- a/fpdfsdk/fpdfxfa/fpdfxfa_util.cpp
+++ b/fpdfsdk/fpdfxfa/fpdfxfa_util.cpp
@@ -8,8 +8,8 @@
 
 #include <vector>
 
+#include "fpdfsdk/include/cpdfdoc_environment.h"
 #include "fpdfsdk/include/fsdk_define.h"
-#include "fpdfsdk/include/fsdk_mgr.h"
 
 std::vector<CFWL_TimerInfo*>* CXFA_FWLAdapterTimerMgr::s_TimerArray = nullptr;
 
diff --git a/fpdfsdk/fsdk_actionhandler.cpp b/fpdfsdk/fsdk_actionhandler.cpp
index c755d72..8168d4a 100644
--- a/fpdfsdk/fsdk_actionhandler.cpp
+++ b/fpdfsdk/fsdk_actionhandler.cpp
@@ -11,9 +11,10 @@
 #include "core/fpdfapi/fpdf_parser/include/cpdf_array.h"
 #include "core/fpdfdoc/include/cpdf_formfield.h"
 #include "core/fpdfdoc/include/cpdf_interform.h"
+#include "fpdfsdk/include/cpdfdoc_environment.h"
+#include "fpdfsdk/include/cpdfsdk_document.h"
 #include "fpdfsdk/include/cpdfsdk_interform.h"
 #include "fpdfsdk/include/fsdk_define.h"
-#include "fpdfsdk/include/fsdk_mgr.h"
 #include "fpdfsdk/javascript/ijs_context.h"
 #include "fpdfsdk/javascript/ijs_runtime.h"
 #include "third_party/base/stl_util.h"
diff --git a/fpdfsdk/fsdk_baseform_embeddertest.cpp b/fpdfsdk/fsdk_baseform_embeddertest.cpp
index 53611ae..1bb081d 100644
--- a/fpdfsdk/fsdk_baseform_embeddertest.cpp
+++ b/fpdfsdk/fsdk_baseform_embeddertest.cpp
@@ -3,8 +3,9 @@
 // found in the LICENSE file.
 
 #include "fpdfsdk/include/cba_annotiterator.h"
+#include "fpdfsdk/include/cpdfsdk_annot.h"
+#include "fpdfsdk/include/cpdfsdk_document.h"
 #include "fpdfsdk/include/fsdk_define.h"
-#include "fpdfsdk/include/fsdk_mgr.h"
 #include "testing/embedder_test.h"
 #include "testing/embedder_test_mock_delegate.h"
 #include "testing/embedder_test_timer_handling_delegate.h"
diff --git a/fpdfsdk/fsdk_mgr.cpp b/fpdfsdk/fsdk_mgr.cpp
deleted file mode 100644
index c8f387e..0000000
--- a/fpdfsdk/fsdk_mgr.cpp
+++ /dev/null
@@ -1,1045 +0,0 @@
-// 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
-
-#include "fpdfsdk/include/fsdk_mgr.h"
-
-#include <algorithm>
-#include <memory>
-
-#include "core/fpdfapi/fpdf_page/include/cpdf_page.h"
-#include "core/fpdfapi/fpdf_parser/include/cpdf_array.h"
-#include "core/fpdfapi/fpdf_parser/include/cpdf_document.h"
-#include "core/fpdfapi/fpdf_render/include/cpdf_renderoptions.h"
-#include "core/fpdfdoc/include/cpdf_docjsactions.h"
-#include "core/fpdfdoc/include/cpdf_interform.h"
-#include "core/fxcrt/include/cfx_retain_ptr.h"
-#include "core/fxge/include/cfx_renderdevice.h"
-#include "fpdfsdk/formfiller/cffl_formfiller.h"
-#include "fpdfsdk/include/cpdfsdk_annothandlermgr.h"
-#include "fpdfsdk/include/cpdfsdk_annotiterator.h"
-#include "fpdfsdk/include/cpdfsdk_interform.h"
-#include "fpdfsdk/include/cpdfsdk_widget.h"
-#include "fpdfsdk/include/fsdk_define.h"
-#include "fpdfsdk/include/ipdfsdk_annothandler.h"
-#include "fpdfsdk/javascript/ijs_runtime.h"
-#include "public/fpdf_ext.h"
-#include "third_party/base/stl_util.h"
-
-#ifdef PDF_ENABLE_XFA
-#include "fpdfsdk/fpdfxfa/include/fpdfxfa_app.h"
-#include "fpdfsdk/fpdfxfa/include/fpdfxfa_doc.h"
-#include "fpdfsdk/fpdfxfa/include/fpdfxfa_page.h"
-#include "fpdfsdk/fpdfxfa/include/fpdfxfa_util.h"
-#include "xfa/fxfa/include/xfa_ffdocview.h"
-#include "xfa/fxfa/include/xfa_ffpageview.h"
-#include "xfa/fxfa/include/xfa_ffwidgethandler.h"
-#include "xfa/fxfa/include/xfa_rendercontext.h"
-#include "xfa/fxgraphics/include/cfx_graphics.h"
-#endif  // PDF_ENABLE_XFA
-
-#if _FX_OS_ == _FX_ANDROID_
-#include "time.h"
-#else
-#include <ctime>
-#endif
-
-namespace {
-
-// NOTE: |bsUTF16LE| must outlive the use of the result. Care must be taken
-// since modifying the result would impact |bsUTF16LE|.
-FPDF_WIDESTRING AsFPDFWideString(CFX_ByteString* bsUTF16LE) {
-  return reinterpret_cast<FPDF_WIDESTRING>(
-      bsUTF16LE->GetBuffer(bsUTF16LE->GetLength()));
-}
-
-}  // namespace
-
-CPDFDoc_Environment::CPDFDoc_Environment(UnderlyingDocumentType* pDoc,
-                                         FPDF_FORMFILLINFO* pFFinfo)
-    : m_pInfo(pFFinfo), m_pSDKDoc(nullptr), m_pUnderlyingDoc(pDoc) {
-  m_pSysHandler.reset(new CFX_SystemHandler(this));
-}
-
-CPDFDoc_Environment::~CPDFDoc_Environment() {
-#ifdef PDF_ENABLE_XFA
-  CPDFXFA_App* pProvider = CPDFXFA_App::GetInstance();
-  if (pProvider->m_pEnvList.GetSize() == 0)
-    pProvider->SetJavaScriptInitialized(FALSE);
-#endif  // PDF_ENABLE_XFA
-  if (m_pInfo && m_pInfo->Release)
-    m_pInfo->Release(m_pInfo);
-}
-
-int CPDFDoc_Environment::JS_appAlert(const FX_WCHAR* Msg,
-                                     const FX_WCHAR* Title,
-                                     FX_UINT Type,
-                                     FX_UINT Icon) {
-  if (!m_pInfo || !m_pInfo->m_pJsPlatform ||
-      !m_pInfo->m_pJsPlatform->app_alert) {
-    return -1;
-  }
-  CFX_ByteString bsMsg = CFX_WideString(Msg).UTF16LE_Encode();
-  CFX_ByteString bsTitle = CFX_WideString(Title).UTF16LE_Encode();
-  return m_pInfo->m_pJsPlatform->app_alert(
-      m_pInfo->m_pJsPlatform, AsFPDFWideString(&bsMsg),
-      AsFPDFWideString(&bsTitle), Type, Icon);
-}
-
-int CPDFDoc_Environment::JS_appResponse(const FX_WCHAR* Question,
-                                        const FX_WCHAR* Title,
-                                        const FX_WCHAR* Default,
-                                        const FX_WCHAR* cLabel,
-                                        FPDF_BOOL bPassword,
-                                        void* response,
-                                        int length) {
-  if (!m_pInfo || !m_pInfo->m_pJsPlatform ||
-      !m_pInfo->m_pJsPlatform->app_response) {
-    return -1;
-  }
-  CFX_ByteString bsQuestion = CFX_WideString(Question).UTF16LE_Encode();
-  CFX_ByteString bsTitle = CFX_WideString(Title).UTF16LE_Encode();
-  CFX_ByteString bsDefault = CFX_WideString(Default).UTF16LE_Encode();
-  CFX_ByteString bsLabel = CFX_WideString(cLabel).UTF16LE_Encode();
-  return m_pInfo->m_pJsPlatform->app_response(
-      m_pInfo->m_pJsPlatform, AsFPDFWideString(&bsQuestion),
-      AsFPDFWideString(&bsTitle), AsFPDFWideString(&bsDefault),
-      AsFPDFWideString(&bsLabel), bPassword, response, length);
-}
-
-void CPDFDoc_Environment::JS_appBeep(int nType) {
-  if (!m_pInfo || !m_pInfo->m_pJsPlatform ||
-      !m_pInfo->m_pJsPlatform->app_beep) {
-    return;
-  }
-  m_pInfo->m_pJsPlatform->app_beep(m_pInfo->m_pJsPlatform, nType);
-}
-
-CFX_WideString CPDFDoc_Environment::JS_fieldBrowse() {
-  if (!m_pInfo || !m_pInfo->m_pJsPlatform ||
-      !m_pInfo->m_pJsPlatform->Field_browse) {
-    return CFX_WideString();
-  }
-  const int nRequiredLen =
-      m_pInfo->m_pJsPlatform->Field_browse(m_pInfo->m_pJsPlatform, nullptr, 0);
-  if (nRequiredLen <= 0)
-    return CFX_WideString();
-
-  std::unique_ptr<char[]> pBuff(new char[nRequiredLen]);
-  memset(pBuff.get(), 0, nRequiredLen);
-  const int nActualLen = m_pInfo->m_pJsPlatform->Field_browse(
-      m_pInfo->m_pJsPlatform, pBuff.get(), nRequiredLen);
-  if (nActualLen <= 0 || nActualLen > nRequiredLen)
-    return CFX_WideString();
-
-  return CFX_WideString::FromLocal(CFX_ByteStringC(pBuff.get(), nActualLen));
-}
-
-CFX_WideString CPDFDoc_Environment::JS_docGetFilePath() {
-  if (!m_pInfo || !m_pInfo->m_pJsPlatform ||
-      !m_pInfo->m_pJsPlatform->Doc_getFilePath) {
-    return CFX_WideString();
-  }
-  const int nRequiredLen = m_pInfo->m_pJsPlatform->Doc_getFilePath(
-      m_pInfo->m_pJsPlatform, nullptr, 0);
-  if (nRequiredLen <= 0)
-    return CFX_WideString();
-
-  std::unique_ptr<char[]> pBuff(new char[nRequiredLen]);
-  memset(pBuff.get(), 0, nRequiredLen);
-  const int nActualLen = m_pInfo->m_pJsPlatform->Doc_getFilePath(
-      m_pInfo->m_pJsPlatform, pBuff.get(), nRequiredLen);
-  if (nActualLen <= 0 || nActualLen > nRequiredLen)
-    return CFX_WideString();
-
-  return CFX_WideString::FromLocal(CFX_ByteStringC(pBuff.get(), nActualLen));
-}
-
-void CPDFDoc_Environment::JS_docSubmitForm(void* formData,
-                                           int length,
-                                           const FX_WCHAR* URL) {
-  if (!m_pInfo || !m_pInfo->m_pJsPlatform ||
-      !m_pInfo->m_pJsPlatform->Doc_submitForm) {
-    return;
-  }
-  CFX_ByteString bsDestination = CFX_WideString(URL).UTF16LE_Encode();
-  m_pInfo->m_pJsPlatform->Doc_submitForm(m_pInfo->m_pJsPlatform, formData,
-                                         length,
-                                         AsFPDFWideString(&bsDestination));
-}
-
-void CPDFDoc_Environment::JS_docmailForm(void* mailData,
-                                         int length,
-                                         FPDF_BOOL bUI,
-                                         const FX_WCHAR* To,
-                                         const FX_WCHAR* Subject,
-                                         const FX_WCHAR* CC,
-                                         const FX_WCHAR* BCC,
-                                         const FX_WCHAR* Msg) {
-  if (!m_pInfo || !m_pInfo->m_pJsPlatform ||
-      !m_pInfo->m_pJsPlatform->Doc_mail) {
-    return;
-  }
-  CFX_ByteString bsTo = CFX_WideString(To).UTF16LE_Encode();
-  CFX_ByteString bsSubject = CFX_WideString(Subject).UTF16LE_Encode();
-  CFX_ByteString bsCC = CFX_WideString(CC).UTF16LE_Encode();
-  CFX_ByteString bsBcc = CFX_WideString(BCC).UTF16LE_Encode();
-  CFX_ByteString bsMsg = CFX_WideString(Msg).UTF16LE_Encode();
-  m_pInfo->m_pJsPlatform->Doc_mail(
-      m_pInfo->m_pJsPlatform, mailData, length, bUI, AsFPDFWideString(&bsTo),
-      AsFPDFWideString(&bsSubject), AsFPDFWideString(&bsCC),
-      AsFPDFWideString(&bsBcc), AsFPDFWideString(&bsMsg));
-}
-
-void CPDFDoc_Environment::JS_docprint(FPDF_BOOL bUI,
-                                      int nStart,
-                                      int nEnd,
-                                      FPDF_BOOL bSilent,
-                                      FPDF_BOOL bShrinkToFit,
-                                      FPDF_BOOL bPrintAsImage,
-                                      FPDF_BOOL bReverse,
-                                      FPDF_BOOL bAnnotations) {
-  if (!m_pInfo || !m_pInfo->m_pJsPlatform ||
-      !m_pInfo->m_pJsPlatform->Doc_print) {
-    return;
-  }
-  m_pInfo->m_pJsPlatform->Doc_print(m_pInfo->m_pJsPlatform, bUI, nStart, nEnd,
-                                    bSilent, bShrinkToFit, bPrintAsImage,
-                                    bReverse, bAnnotations);
-}
-
-void CPDFDoc_Environment::JS_docgotoPage(int nPageNum) {
-  if (!m_pInfo || !m_pInfo->m_pJsPlatform ||
-      !m_pInfo->m_pJsPlatform->Doc_gotoPage) {
-    return;
-  }
-  m_pInfo->m_pJsPlatform->Doc_gotoPage(m_pInfo->m_pJsPlatform, nPageNum);
-}
-
-IJS_Runtime* CPDFDoc_Environment::GetJSRuntime() {
-  if (!IsJSInitiated())
-    return nullptr;
-  if (!m_pJSRuntime)
-    m_pJSRuntime.reset(IJS_Runtime::Create(this));
-  return m_pJSRuntime.get();
-}
-
-CPDFSDK_AnnotHandlerMgr* CPDFDoc_Environment::GetAnnotHandlerMgr() {
-  if (!m_pAnnotHandlerMgr)
-    m_pAnnotHandlerMgr.reset(new CPDFSDK_AnnotHandlerMgr(this));
-  return m_pAnnotHandlerMgr.get();
-}
-
-CPDFSDK_ActionHandler* CPDFDoc_Environment::GetActionHander() {
-  if (!m_pActionHandler)
-    m_pActionHandler.reset(new CPDFSDK_ActionHandler());
-  return m_pActionHandler.get();
-}
-
-CFFL_IFormFiller* CPDFDoc_Environment::GetIFormFiller() {
-  if (!m_pIFormFiller)
-    m_pIFormFiller.reset(new CFFL_IFormFiller(this));
-  return m_pIFormFiller.get();
-}
-
-// static
-CPDFSDK_Document* CPDFSDK_Document::FromFPDFFormHandle(
-    FPDF_FORMHANDLE hHandle) {
-  CPDFDoc_Environment* pEnv = static_cast<CPDFDoc_Environment*>(hHandle);
-  return pEnv ? pEnv->GetSDKDocument() : nullptr;
-}
-
-CPDFSDK_Document::CPDFSDK_Document(UnderlyingDocumentType* pDoc,
-                                   CPDFDoc_Environment* pEnv)
-    : m_pDoc(pDoc),
-      m_pFocusAnnot(nullptr),
-      m_pEnv(pEnv),
-      m_bChangeMask(FALSE),
-      m_bBeingDestroyed(FALSE) {}
-
-CPDFSDK_Document::~CPDFSDK_Document() {
-  m_bBeingDestroyed = TRUE;
-
-  for (auto& it : m_pageMap)
-    it.second->KillFocusAnnotIfNeeded();
-
-  for (auto& it : m_pageMap)
-    delete it.second;
-  m_pageMap.clear();
-}
-
-CPDFSDK_PageView* CPDFSDK_Document::GetPageView(
-    UnderlyingPageType* pUnderlyingPage,
-    bool ReNew) {
-  auto it = m_pageMap.find(pUnderlyingPage);
-  if (it != m_pageMap.end())
-    return it->second;
-
-  if (!ReNew)
-    return nullptr;
-
-  CPDFSDK_PageView* pPageView = new CPDFSDK_PageView(this, pUnderlyingPage);
-  m_pageMap[pUnderlyingPage] = pPageView;
-  // Delay to load all the annotations, to avoid endless loop.
-  pPageView->LoadFXAnnots();
-  return pPageView;
-}
-
-CPDFSDK_PageView* CPDFSDK_Document::GetCurrentView() {
-  UnderlyingPageType* pPage =
-      UnderlyingFromFPDFPage(m_pEnv->FFI_GetCurrentPage(m_pDoc));
-  return pPage ? GetPageView(pPage, true) : nullptr;
-}
-
-CPDFSDK_PageView* CPDFSDK_Document::GetPageView(int nIndex) {
-  UnderlyingPageType* pTempPage =
-      UnderlyingFromFPDFPage(m_pEnv->FFI_GetPage(m_pDoc, nIndex));
-  if (!pTempPage)
-    return nullptr;
-
-  auto it = m_pageMap.find(pTempPage);
-  return it != m_pageMap.end() ? it->second : nullptr;
-}
-
-void CPDFSDK_Document::ProcJavascriptFun() {
-  CPDF_Document* pPDFDoc = GetPDFDocument();
-  CPDF_DocJSActions docJS(pPDFDoc);
-  int iCount = docJS.CountJSActions();
-  if (iCount < 1)
-    return;
-  for (int i = 0; i < iCount; i++) {
-    CFX_ByteString csJSName;
-    CPDF_Action jsAction = docJS.GetJSAction(i, csJSName);
-    if (m_pEnv->GetActionHander())
-      m_pEnv->GetActionHander()->DoAction_JavaScript(
-          jsAction, CFX_WideString::FromLocal(csJSName.AsStringC()), this);
-  }
-}
-
-FX_BOOL CPDFSDK_Document::ProcOpenAction() {
-  if (!m_pDoc)
-    return FALSE;
-
-  CPDF_Dictionary* pRoot = GetPDFDocument()->GetRoot();
-  if (!pRoot)
-    return FALSE;
-
-  CPDF_Object* pOpenAction = pRoot->GetDictBy("OpenAction");
-  if (!pOpenAction)
-    pOpenAction = pRoot->GetArrayBy("OpenAction");
-
-  if (!pOpenAction)
-    return FALSE;
-
-  if (pOpenAction->IsArray())
-    return TRUE;
-
-  if (CPDF_Dictionary* pDict = pOpenAction->AsDictionary()) {
-    CPDF_Action action(pDict);
-    if (m_pEnv->GetActionHander())
-      m_pEnv->GetActionHander()->DoAction_DocOpen(action, this);
-    return TRUE;
-  }
-  return FALSE;
-}
-
-CPDF_OCContext* CPDFSDK_Document::GetOCContext() {
-  if (!m_pOccontent) {
-    m_pOccontent.reset(
-        new CPDF_OCContext(GetPDFDocument(), CPDF_OCContext::View));
-  }
-  return m_pOccontent.get();
-}
-
-void CPDFSDK_Document::RemovePageView(UnderlyingPageType* pUnderlyingPage) {
-  auto it = m_pageMap.find(pUnderlyingPage);
-  if (it == m_pageMap.end())
-    return;
-
-  CPDFSDK_PageView* pPageView = it->second;
-  if (pPageView->IsLocked())
-    return;
-
-  // This must happen before we remove |pPageView| from the map because
-  // |KillFocusAnnotIfNeeded| can call into the |GetPage| method which will
-  // look for this page view in the map, if it doesn't find it a new one will
-  // be created. We then have two page views pointing to the same page and
-  // bad things happen.
-  pPageView->KillFocusAnnotIfNeeded();
-
-  // Remove the page from the map to make sure we don't accidentally attempt
-  // to use the |pPageView| while we're cleaning it up.
-  m_pageMap.erase(it);
-
-  delete pPageView;
-}
-
-UnderlyingPageType* CPDFSDK_Document::GetPage(int nIndex) {
-  return UnderlyingFromFPDFPage(m_pEnv->FFI_GetPage(m_pDoc, nIndex));
-}
-
-CPDFSDK_InterForm* CPDFSDK_Document::GetInterForm() {
-  if (!m_pInterForm)
-    m_pInterForm.reset(new CPDFSDK_InterForm(this));
-  return m_pInterForm.get();
-}
-
-void CPDFSDK_Document::UpdateAllViews(CPDFSDK_PageView* pSender,
-                                      CPDFSDK_Annot* pAnnot) {
-  for (const auto& it : m_pageMap) {
-    CPDFSDK_PageView* pPageView = it.second;
-    if (pPageView != pSender) {
-      pPageView->UpdateView(pAnnot);
-    }
-  }
-}
-
-CPDFSDK_Annot* CPDFSDK_Document::GetFocusAnnot() {
-  return m_pFocusAnnot;
-}
-
-FX_BOOL CPDFSDK_Document::SetFocusAnnot(CPDFSDK_Annot* pAnnot, FX_UINT nFlag) {
-  if (m_bBeingDestroyed)
-    return FALSE;
-
-  if (m_pFocusAnnot == pAnnot)
-    return TRUE;
-
-  if (m_pFocusAnnot) {
-    if (!KillFocusAnnot(nFlag))
-      return FALSE;
-  }
-
-  if (!pAnnot)
-    return FALSE;
-
-#ifdef PDF_ENABLE_XFA
-  CPDFSDK_Annot* pLastFocusAnnot = m_pFocusAnnot;
-#endif  // PDF_ENABLE_XFA
-  CPDFSDK_PageView* pPageView = pAnnot->GetPageView();
-  if (pPageView && pPageView->IsValid()) {
-    CPDFSDK_AnnotHandlerMgr* pAnnotHandler = m_pEnv->GetAnnotHandlerMgr();
-    if (!m_pFocusAnnot) {
-#ifdef PDF_ENABLE_XFA
-      if (!pAnnotHandler->Annot_OnChangeFocus(pAnnot, pLastFocusAnnot))
-        return FALSE;
-#endif  // PDF_ENABLE_XFA
-      if (!pAnnotHandler->Annot_OnSetFocus(pAnnot, nFlag))
-        return FALSE;
-      if (!m_pFocusAnnot) {
-        m_pFocusAnnot = pAnnot;
-        return TRUE;
-      }
-    }
-  }
-  return FALSE;
-}
-
-FX_BOOL CPDFSDK_Document::KillFocusAnnot(FX_UINT nFlag) {
-  if (m_pFocusAnnot) {
-    CPDFSDK_AnnotHandlerMgr* pAnnotHandler = m_pEnv->GetAnnotHandlerMgr();
-    CPDFSDK_Annot* pFocusAnnot = m_pFocusAnnot;
-    m_pFocusAnnot = nullptr;
-
-#ifdef PDF_ENABLE_XFA
-    if (!pAnnotHandler->Annot_OnChangeFocus(nullptr, pFocusAnnot))
-      return FALSE;
-#endif  // PDF_ENABLE_XFA
-
-    if (pAnnotHandler->Annot_OnKillFocus(pFocusAnnot, nFlag)) {
-      if (pFocusAnnot->GetAnnotSubtype() == CPDF_Annot::Subtype::WIDGET) {
-        CPDFSDK_Widget* pWidget = (CPDFSDK_Widget*)pFocusAnnot;
-        int nFieldType = pWidget->GetFieldType();
-        if (FIELDTYPE_TEXTFIELD == nFieldType ||
-            FIELDTYPE_COMBOBOX == nFieldType) {
-          m_pEnv->FFI_OnSetFieldInputFocus(nullptr, nullptr, 0, FALSE);
-        }
-      }
-
-      if (!m_pFocusAnnot)
-        return TRUE;
-    } else {
-      m_pFocusAnnot = pFocusAnnot;
-    }
-  }
-  return FALSE;
-}
-
-void CPDFSDK_Document::OnCloseDocument() {
-  KillFocusAnnot();
-}
-
-FX_BOOL CPDFSDK_Document::GetPermissions(int nFlag) {
-  return GetPDFDocument()->GetUserPermissions() & nFlag;
-}
-
-IJS_Runtime* CPDFSDK_Document::GetJsRuntime() {
-  return m_pEnv->GetJSRuntime();
-}
-
-CFX_WideString CPDFSDK_Document::GetPath() {
-  return m_pEnv->JS_docGetFilePath();
-}
-
-CPDFSDK_PageView::CPDFSDK_PageView(CPDFSDK_Document* pSDKDoc,
-                                   UnderlyingPageType* page)
-    : m_page(page),
-      m_pSDKDoc(pSDKDoc),
-      m_CaptureWidget(nullptr),
-#ifndef PDF_ENABLE_XFA
-      m_bOwnsPage(false),
-#endif  // PDF_ENABLE_XFA
-      m_bEnterWidget(FALSE),
-      m_bExitWidget(FALSE),
-      m_bOnWidget(FALSE),
-      m_bValid(FALSE),
-      m_bLocked(FALSE) {
-  CPDFSDK_InterForm* pInterForm = pSDKDoc->GetInterForm();
-  if (pInterForm) {
-    CPDF_InterForm* pPDFInterForm = pInterForm->GetInterForm();
-#ifdef PDF_ENABLE_XFA
-    if (page->GetPDFPage())
-      pPDFInterForm->FixPageFields(page->GetPDFPage());
-#else   // PDF_ENABLE_XFA
-    pPDFInterForm->FixPageFields(page);
-#endif  // PDF_ENABLE_XFA
-  }
-#ifndef PDF_ENABLE_XFA
-  m_page->SetView(this);
-#endif  // PDF_ENABLE_XFA
-}
-
-CPDFSDK_PageView::~CPDFSDK_PageView() {
-#ifndef PDF_ENABLE_XFA
-  // The call to |ReleaseAnnot| can cause the page pointed to by |m_page| to
-  // be freed, which will cause issues if we try to cleanup the pageview pointer
-  // in |m_page|. So, reset the pageview pointer before doing anything else.
-  m_page->SetView(nullptr);
-#endif  // PDF_ENABLE_XFA
-
-  CPDFDoc_Environment* pEnv = m_pSDKDoc->GetEnv();
-  CPDFSDK_AnnotHandlerMgr* pAnnotHandlerMgr = pEnv->GetAnnotHandlerMgr();
-  for (CPDFSDK_Annot* pAnnot : m_fxAnnotArray)
-    pAnnotHandlerMgr->ReleaseAnnot(pAnnot);
-
-  m_fxAnnotArray.clear();
-  m_pAnnotList.reset();
-
-#ifndef PDF_ENABLE_XFA
-  if (m_bOwnsPage)
-    delete m_page;
-#endif  // PDF_ENABLE_XFA
-}
-
-void CPDFSDK_PageView::PageView_OnDraw(CFX_RenderDevice* pDevice,
-                                       CFX_Matrix* pUser2Device,
-#ifdef PDF_ENABLE_XFA
-                                       CPDF_RenderOptions* pOptions,
-                                       const FX_RECT& pClip) {
-#else
-                                       CPDF_RenderOptions* pOptions) {
-#endif  // PDF_ENABLE_XFA
-  m_curMatrix = *pUser2Device;
-  CPDFDoc_Environment* pEnv = m_pSDKDoc->GetEnv();
-
-#ifdef PDF_ENABLE_XFA
-  CPDFXFA_Page* pPage = GetPDFXFAPage();
-  if (!pPage)
-    return;
-
-  if (pPage->GetDocument()->GetDocType() == DOCTYPE_DYNAMIC_XFA) {
-    CFX_Graphics gs;
-    gs.Create(pDevice);
-    CFX_RectF rectClip;
-    rectClip.Set(static_cast<FX_FLOAT>(pClip.left),
-                 static_cast<FX_FLOAT>(pClip.top),
-                 static_cast<FX_FLOAT>(pClip.Width()),
-                 static_cast<FX_FLOAT>(pClip.Height()));
-    gs.SetClipRect(rectClip);
-    std::unique_ptr<CXFA_RenderContext> pRenderContext(new CXFA_RenderContext);
-    CXFA_RenderOptions renderOptions;
-    renderOptions.m_bHighlight = TRUE;
-    CXFA_FFPageView* xfaView = pPage->GetXFAPageView();
-    pRenderContext->StartRender(xfaView, &gs, *pUser2Device, renderOptions);
-    pRenderContext->DoRender();
-    pRenderContext->StopRender();
-    CXFA_FFDocView* docView = xfaView->GetDocView();
-    if (!docView)
-      return;
-    CPDFSDK_Annot* annot = GetFocusAnnot();
-    if (!annot)
-      return;
-    // Render the focus widget
-    docView->GetWidgetHandler()->RenderWidget(annot->GetXFAWidget(), &gs,
-                                              pUser2Device, FALSE);
-    return;
-  }
-#endif  // PDF_ENABLE_XFA
-
-  // for pdf/static xfa.
-  CPDFSDK_AnnotIterator annotIterator(this, true);
-  while (CPDFSDK_Annot* pSDKAnnot = annotIterator.Next()) {
-    CPDFSDK_AnnotHandlerMgr* pAnnotHandlerMgr = pEnv->GetAnnotHandlerMgr();
-    pAnnotHandlerMgr->Annot_OnDraw(this, pSDKAnnot, pDevice, pUser2Device,
-                                   pOptions->m_bDrawAnnots);
-  }
-}
-
-const CPDF_Annot* CPDFSDK_PageView::GetPDFAnnotAtPoint(FX_FLOAT pageX,
-                                                       FX_FLOAT pageY) {
-  for (const auto& pAnnot : m_pAnnotList->All()) {
-    CFX_FloatRect annotRect = pAnnot->GetRect();
-    if (annotRect.Contains(pageX, pageY))
-      return pAnnot.get();
-  }
-  return nullptr;
-}
-
-const CPDF_Annot* CPDFSDK_PageView::GetPDFWidgetAtPoint(FX_FLOAT pageX,
-                                                        FX_FLOAT pageY) {
-  for (const auto& pAnnot : m_pAnnotList->All()) {
-    if (pAnnot->GetSubtype() == CPDF_Annot::Subtype::WIDGET) {
-      CFX_FloatRect annotRect = pAnnot->GetRect();
-      if (annotRect.Contains(pageX, pageY))
-        return pAnnot.get();
-    }
-  }
-  return nullptr;
-}
-
-CPDFSDK_Annot* CPDFSDK_PageView::GetFXAnnotAtPoint(FX_FLOAT pageX,
-                                                   FX_FLOAT pageY) {
-  CPDFDoc_Environment* pEnv = m_pSDKDoc->GetEnv();
-  CPDFSDK_AnnotHandlerMgr* pAnnotMgr = pEnv->GetAnnotHandlerMgr();
-  CPDFSDK_AnnotIterator annotIterator(this, false);
-  while (CPDFSDK_Annot* pSDKAnnot = annotIterator.Next()) {
-    CFX_FloatRect rc = pAnnotMgr->Annot_OnGetViewBBox(this, pSDKAnnot);
-    if (pSDKAnnot->GetAnnotSubtype() == CPDF_Annot::Subtype::POPUP)
-      continue;
-    if (rc.Contains(pageX, pageY))
-      return pSDKAnnot;
-  }
-
-  return nullptr;
-}
-
-CPDFSDK_Annot* CPDFSDK_PageView::GetFXWidgetAtPoint(FX_FLOAT pageX,
-                                                    FX_FLOAT pageY) {
-  CPDFDoc_Environment* pEnv = m_pSDKDoc->GetEnv();
-  CPDFSDK_AnnotHandlerMgr* pAnnotMgr = pEnv->GetAnnotHandlerMgr();
-  CPDFSDK_AnnotIterator annotIterator(this, false);
-  while (CPDFSDK_Annot* pSDKAnnot = annotIterator.Next()) {
-    bool bHitTest = pSDKAnnot->GetAnnotSubtype() == CPDF_Annot::Subtype::WIDGET;
-#ifdef PDF_ENABLE_XFA
-    bHitTest = bHitTest ||
-               pSDKAnnot->GetAnnotSubtype() == CPDF_Annot::Subtype::XFAWIDGET;
-#endif  // PDF_ENABLE_XFA
-    if (bHitTest) {
-      pAnnotMgr->Annot_OnGetViewBBox(this, pSDKAnnot);
-      CFX_FloatPoint point(pageX, pageY);
-      if (pAnnotMgr->Annot_OnHitTest(this, pSDKAnnot, point))
-        return pSDKAnnot;
-    }
-  }
-
-  return nullptr;
-}
-
-void CPDFSDK_PageView::KillFocusAnnotIfNeeded() {
-  // if there is a focused annot on the page, we should kill the focus first.
-  if (CPDFSDK_Annot* focusedAnnot = m_pSDKDoc->GetFocusAnnot()) {
-    if (pdfium::ContainsValue(m_fxAnnotArray, focusedAnnot))
-      KillFocusAnnot();
-  }
-}
-
-CPDFSDK_Annot* CPDFSDK_PageView::AddAnnot(CPDF_Annot* pPDFAnnot) {
-  CPDFDoc_Environment* pEnv = m_pSDKDoc->GetEnv();
-  ASSERT(pEnv);
-  CPDFSDK_AnnotHandlerMgr* pAnnotHandler = pEnv->GetAnnotHandlerMgr();
-  CPDFSDK_Annot* pSDKAnnot = pAnnotHandler->NewAnnot(pPDFAnnot, this);
-  if (!pSDKAnnot)
-    return nullptr;
-
-  m_fxAnnotArray.push_back(pSDKAnnot);
-  pAnnotHandler->Annot_OnCreate(pSDKAnnot);
-  return pSDKAnnot;
-}
-
-#ifdef PDF_ENABLE_XFA
-CPDFSDK_Annot* CPDFSDK_PageView::AddAnnot(CXFA_FFWidget* pPDFAnnot) {
-  if (!pPDFAnnot)
-    return nullptr;
-
-  CPDFSDK_Annot* pSDKAnnot = GetAnnotByXFAWidget(pPDFAnnot);
-  if (pSDKAnnot)
-    return pSDKAnnot;
-
-  CPDFDoc_Environment* pEnv = m_pSDKDoc->GetEnv();
-  CPDFSDK_AnnotHandlerMgr* pAnnotHandler = pEnv->GetAnnotHandlerMgr();
-  pSDKAnnot = pAnnotHandler->NewAnnot(pPDFAnnot, this);
-  if (!pSDKAnnot)
-    return nullptr;
-
-  m_fxAnnotArray.push_back(pSDKAnnot);
-  return pSDKAnnot;
-}
-#endif  // PDF_ENABLE_XFA
-
-CPDFSDK_Annot* CPDFSDK_PageView::AddAnnot(CPDF_Dictionary* pDict) {
-  return pDict ? AddAnnot(pDict->GetStringBy("Subtype").c_str(), pDict)
-               : nullptr;
-}
-
-CPDFSDK_Annot* CPDFSDK_PageView::AddAnnot(const FX_CHAR* lpSubType,
-                                          CPDF_Dictionary* pDict) {
-  return nullptr;
-}
-
-FX_BOOL CPDFSDK_PageView::DeleteAnnot(CPDFSDK_Annot* pAnnot) {
-#ifdef PDF_ENABLE_XFA
-  if (!pAnnot)
-    return FALSE;
-  CPDFXFA_Page* pPage = pAnnot->GetPDFXFAPage();
-  if (!pPage || (pPage->GetDocument()->GetDocType() != DOCTYPE_STATIC_XFA &&
-                 pPage->GetDocument()->GetDocType() != DOCTYPE_DYNAMIC_XFA))
-    return FALSE;
-
-  if (GetFocusAnnot() == pAnnot)
-    KillFocusAnnot();
-  CPDFDoc_Environment* pEnv = m_pSDKDoc->GetEnv();
-  CPDFSDK_AnnotHandlerMgr* pAnnotHandler = pEnv->GetAnnotHandlerMgr();
-  if (pAnnotHandler)
-    pAnnotHandler->ReleaseAnnot(pAnnot);
-
-  auto it = std::find(m_fxAnnotArray.begin(), m_fxAnnotArray.end(), pAnnot);
-  if (it != m_fxAnnotArray.end())
-    m_fxAnnotArray.erase(it);
-  if (m_CaptureWidget == pAnnot)
-    m_CaptureWidget = nullptr;
-
-  return TRUE;
-#else   // PDF_ENABLE_XFA
-  return FALSE;
-#endif  // PDF_ENABLE_XFA
-}
-
-CPDF_Document* CPDFSDK_PageView::GetPDFDocument() {
-  if (m_page) {
-#ifdef PDF_ENABLE_XFA
-    return m_page->GetDocument()->GetPDFDoc();
-#else   // PDF_ENABLE_XFA
-    return m_page->m_pDocument;
-#endif  // PDF_ENABLE_XFA
-  }
-  return nullptr;
-}
-
-CPDF_Page* CPDFSDK_PageView::GetPDFPage() const {
-#ifdef PDF_ENABLE_XFA
-  return m_page ? m_page->GetPDFPage() : nullptr;
-#else   // PDF_ENABLE_XFA
-  return m_page;
-#endif  // PDF_ENABLE_XFA
-}
-
-size_t CPDFSDK_PageView::CountAnnots() const {
-  return m_fxAnnotArray.size();
-}
-
-CPDFSDK_Annot* CPDFSDK_PageView::GetAnnot(size_t nIndex) {
-  return nIndex < m_fxAnnotArray.size() ? m_fxAnnotArray[nIndex] : nullptr;
-}
-
-CPDFSDK_Annot* CPDFSDK_PageView::GetAnnotByDict(CPDF_Dictionary* pDict) {
-  for (CPDFSDK_Annot* pAnnot : m_fxAnnotArray) {
-    if (pAnnot->GetPDFAnnot()->GetAnnotDict() == pDict)
-      return pAnnot;
-  }
-  return nullptr;
-}
-
-#ifdef PDF_ENABLE_XFA
-CPDFSDK_Annot* CPDFSDK_PageView::GetAnnotByXFAWidget(CXFA_FFWidget* hWidget) {
-  if (!hWidget)
-    return nullptr;
-
-  for (CPDFSDK_Annot* pAnnot : m_fxAnnotArray) {
-    if (pAnnot->GetXFAWidget() == hWidget)
-      return pAnnot;
-  }
-  return nullptr;
-}
-#endif  // PDF_ENABLE_XFA
-
-FX_BOOL CPDFSDK_PageView::OnLButtonDown(const CFX_FloatPoint& point,
-                                        FX_UINT nFlag) {
-  CPDFDoc_Environment* pEnv = m_pSDKDoc->GetEnv();
-  ASSERT(pEnv);
-  CPDFSDK_Annot* pFXAnnot = GetFXWidgetAtPoint(point.x, point.y);
-  if (!pFXAnnot) {
-    KillFocusAnnot(nFlag);
-    return FALSE;
-  }
-
-  CPDFSDK_AnnotHandlerMgr* pAnnotHandlerMgr = pEnv->GetAnnotHandlerMgr();
-  FX_BOOL bRet =
-      pAnnotHandlerMgr->Annot_OnLButtonDown(this, pFXAnnot, nFlag, point);
-  if (bRet)
-    SetFocusAnnot(pFXAnnot);
-  return bRet;
-}
-
-#ifdef PDF_ENABLE_XFA
-FX_BOOL CPDFSDK_PageView::OnRButtonDown(const CFX_FloatPoint& point,
-                                        FX_UINT nFlag) {
-  CPDFDoc_Environment* pEnv = m_pSDKDoc->GetEnv();
-  ASSERT(pEnv);
-  CPDFSDK_AnnotHandlerMgr* pAnnotHandlerMgr = pEnv->GetAnnotHandlerMgr();
-  ASSERT(pAnnotHandlerMgr);
-
-  CPDFSDK_Annot* pFXAnnot = GetFXWidgetAtPoint(point.x, point.y);
-
-  if (!pFXAnnot)
-    return FALSE;
-
-  if (pAnnotHandlerMgr->Annot_OnRButtonDown(this, pFXAnnot, nFlag, point))
-    SetFocusAnnot(pFXAnnot);
-
-  return TRUE;
-}
-
-FX_BOOL CPDFSDK_PageView::OnRButtonUp(const CFX_FloatPoint& point,
-                                      FX_UINT nFlag) {
-  CPDFDoc_Environment* pEnv = m_pSDKDoc->GetEnv();
-  ASSERT(pEnv);
-  CPDFSDK_AnnotHandlerMgr* pAnnotHandlerMgr = pEnv->GetAnnotHandlerMgr();
-
-  CPDFSDK_Annot* pFXAnnot = GetFXWidgetAtPoint(point.x, point.y);
-
-  if (!pFXAnnot)
-    return FALSE;
-
-  if (pAnnotHandlerMgr->Annot_OnRButtonUp(this, pFXAnnot, nFlag, point))
-    SetFocusAnnot(pFXAnnot);
-
-  return TRUE;
-}
-#endif  // PDF_ENABLE_XFA
-
-FX_BOOL CPDFSDK_PageView::OnLButtonUp(const CFX_FloatPoint& point,
-                                      FX_UINT nFlag) {
-  CPDFDoc_Environment* pEnv = m_pSDKDoc->GetEnv();
-  ASSERT(pEnv);
-  CPDFSDK_AnnotHandlerMgr* pAnnotHandlerMgr = pEnv->GetAnnotHandlerMgr();
-  CPDFSDK_Annot* pFXAnnot = GetFXWidgetAtPoint(point.x, point.y);
-  CPDFSDK_Annot* pFocusAnnot = GetFocusAnnot();
-  FX_BOOL bRet = FALSE;
-  if (pFocusAnnot && pFocusAnnot != pFXAnnot) {
-    // Last focus Annot gets a chance to handle the event.
-    bRet = pAnnotHandlerMgr->Annot_OnLButtonUp(this, pFocusAnnot, nFlag, point);
-  }
-  if (pFXAnnot && !bRet)
-    bRet = pAnnotHandlerMgr->Annot_OnLButtonUp(this, pFXAnnot, nFlag, point);
-  return bRet;
-}
-
-FX_BOOL CPDFSDK_PageView::OnMouseMove(const CFX_FloatPoint& point, int nFlag) {
-  CPDFDoc_Environment* pEnv = m_pSDKDoc->GetEnv();
-  CPDFSDK_AnnotHandlerMgr* pAnnotHandlerMgr = pEnv->GetAnnotHandlerMgr();
-  if (CPDFSDK_Annot* pFXAnnot = GetFXAnnotAtPoint(point.x, point.y)) {
-    if (m_CaptureWidget && m_CaptureWidget != pFXAnnot) {
-      m_bExitWidget = TRUE;
-      m_bEnterWidget = FALSE;
-      pAnnotHandlerMgr->Annot_OnMouseExit(this, m_CaptureWidget, nFlag);
-    }
-    m_CaptureWidget = pFXAnnot;
-    m_bOnWidget = TRUE;
-    if (!m_bEnterWidget) {
-      m_bEnterWidget = TRUE;
-      m_bExitWidget = FALSE;
-      pAnnotHandlerMgr->Annot_OnMouseEnter(this, pFXAnnot, nFlag);
-    }
-    pAnnotHandlerMgr->Annot_OnMouseMove(this, pFXAnnot, nFlag, point);
-    return TRUE;
-  }
-  if (m_bOnWidget) {
-    m_bOnWidget = FALSE;
-    m_bExitWidget = TRUE;
-    m_bEnterWidget = FALSE;
-    if (m_CaptureWidget) {
-      pAnnotHandlerMgr->Annot_OnMouseExit(this, m_CaptureWidget, nFlag);
-      m_CaptureWidget = nullptr;
-    }
-  }
-  return FALSE;
-}
-
-FX_BOOL CPDFSDK_PageView::OnMouseWheel(double deltaX,
-                                       double deltaY,
-                                       const CFX_FloatPoint& point,
-                                       int nFlag) {
-  if (CPDFSDK_Annot* pAnnot = GetFXWidgetAtPoint(point.x, point.y)) {
-    CPDFDoc_Environment* pEnv = m_pSDKDoc->GetEnv();
-    CPDFSDK_AnnotHandlerMgr* pAnnotHandlerMgr = pEnv->GetAnnotHandlerMgr();
-    return pAnnotHandlerMgr->Annot_OnMouseWheel(this, pAnnot, nFlag,
-                                                (int)deltaY, point);
-  }
-  return FALSE;
-}
-
-FX_BOOL CPDFSDK_PageView::OnChar(int nChar, FX_UINT nFlag) {
-  if (CPDFSDK_Annot* pAnnot = GetFocusAnnot()) {
-    CPDFDoc_Environment* pEnv = m_pSDKDoc->GetEnv();
-    CPDFSDK_AnnotHandlerMgr* pAnnotHandlerMgr = pEnv->GetAnnotHandlerMgr();
-    return pAnnotHandlerMgr->Annot_OnChar(pAnnot, nChar, nFlag);
-  }
-
-  return FALSE;
-}
-
-FX_BOOL CPDFSDK_PageView::OnKeyDown(int nKeyCode, int nFlag) {
-  if (CPDFSDK_Annot* pAnnot = GetFocusAnnot()) {
-    CPDFDoc_Environment* pEnv = m_pSDKDoc->GetEnv();
-    CPDFSDK_AnnotHandlerMgr* pAnnotHandlerMgr = pEnv->GetAnnotHandlerMgr();
-    return pAnnotHandlerMgr->Annot_OnKeyDown(pAnnot, nKeyCode, nFlag);
-  }
-  return FALSE;
-}
-
-FX_BOOL CPDFSDK_PageView::OnKeyUp(int nKeyCode, int nFlag) {
-  return FALSE;
-}
-
-void CPDFSDK_PageView::LoadFXAnnots() {
-  CPDFDoc_Environment* pEnv = m_pSDKDoc->GetEnv();
-  CPDFSDK_AnnotHandlerMgr* pAnnotHandlerMgr = pEnv->GetAnnotHandlerMgr();
-
-  SetLock(TRUE);
-
-#ifdef PDF_ENABLE_XFA
-  CFX_RetainPtr<CPDFXFA_Page> protector(m_page);
-  if (m_pSDKDoc->GetXFADocument()->GetDocType() == DOCTYPE_DYNAMIC_XFA) {
-    CXFA_FFPageView* pageView = m_page->GetXFAPageView();
-    std::unique_ptr<IXFA_WidgetIterator> pWidgetHander(
-        pageView->CreateWidgetIterator(
-            XFA_TRAVERSEWAY_Form,
-            XFA_WidgetStatus_Visible | XFA_WidgetStatus_Viewable));
-    if (!pWidgetHander) {
-      SetLock(FALSE);
-      return;
-    }
-
-    while (CXFA_FFWidget* pXFAAnnot = pWidgetHander->MoveToNext()) {
-      CPDFSDK_Annot* pAnnot = pAnnotHandlerMgr->NewAnnot(pXFAAnnot, this);
-      if (!pAnnot)
-        continue;
-      m_fxAnnotArray.push_back(pAnnot);
-      pAnnotHandlerMgr->Annot_OnLoad(pAnnot);
-    }
-
-    SetLock(FALSE);
-    return;
-  }
-#endif  // PDF_ENABLE_XFA
-
-  CPDF_Page* pPage = GetPDFPage();
-  ASSERT(pPage);
-  FX_BOOL bUpdateAP = CPDF_InterForm::IsUpdateAPEnabled();
-  // Disable the default AP construction.
-  CPDF_InterForm::SetUpdateAP(FALSE);
-  m_pAnnotList.reset(new CPDF_AnnotList(pPage));
-  CPDF_InterForm::SetUpdateAP(bUpdateAP);
-
-  const size_t nCount = m_pAnnotList->Count();
-  for (size_t i = 0; i < nCount; ++i) {
-    CPDF_Annot* pPDFAnnot = m_pAnnotList->GetAt(i);
-    CheckUnSupportAnnot(GetPDFDocument(), pPDFAnnot);
-    CPDFSDK_Annot* pAnnot = pAnnotHandlerMgr->NewAnnot(pPDFAnnot, this);
-    if (!pAnnot)
-      continue;
-    m_fxAnnotArray.push_back(pAnnot);
-    pAnnotHandlerMgr->Annot_OnLoad(pAnnot);
-  }
-
-  SetLock(FALSE);
-}
-
-void CPDFSDK_PageView::ClearFXAnnots() {
-  SetLock(TRUE);
-  if (m_pSDKDoc && GetFocusAnnot())
-    m_pSDKDoc->SetFocusAnnot(nullptr);
-  m_CaptureWidget = nullptr;
-  for (CPDFSDK_Annot* pAnnot : m_fxAnnotArray)
-    m_pSDKDoc->GetEnv()->GetAnnotHandlerMgr()->ReleaseAnnot(pAnnot);
-  m_fxAnnotArray.clear();
-  m_pAnnotList.reset();
-  SetLock(FALSE);
-}
-
-void CPDFSDK_PageView::UpdateRects(const std::vector<CFX_FloatRect>& rects) {
-  CPDFDoc_Environment* pEnv = m_pSDKDoc->GetEnv();
-  for (const auto& rc : rects)
-    pEnv->FFI_Invalidate(m_page, rc.left, rc.top, rc.right, rc.bottom);
-}
-
-void CPDFSDK_PageView::UpdateView(CPDFSDK_Annot* pAnnot) {
-  CFX_FloatRect rcWindow = pAnnot->GetRect();
-  CPDFDoc_Environment* pEnv = m_pSDKDoc->GetEnv();
-  pEnv->FFI_Invalidate(m_page, rcWindow.left, rcWindow.top, rcWindow.right,
-                       rcWindow.bottom);
-}
-
-int CPDFSDK_PageView::GetPageIndex() const {
-  if (!m_page)
-    return -1;
-
-#ifdef PDF_ENABLE_XFA
-  int nDocType = m_page->GetDocument()->GetDocType();
-  switch (nDocType) {
-    case DOCTYPE_DYNAMIC_XFA: {
-      CXFA_FFPageView* pPageView = m_page->GetXFAPageView();
-      return pPageView ? pPageView->GetPageIndex() : -1;
-    }
-    case DOCTYPE_STATIC_XFA:
-    case DOCTYPE_PDF:
-      return GetPageIndexForStaticPDF();
-    default:
-      return -1;
-  }
-#else   // PDF_ENABLE_XFA
-  return GetPageIndexForStaticPDF();
-#endif  // PDF_ENABLE_XFA
-}
-
-bool CPDFSDK_PageView::IsValidAnnot(const CPDF_Annot* p) const {
-  if (!p)
-    return false;
-
-  const auto& annots = m_pAnnotList->All();
-  auto it = std::find_if(annots.begin(), annots.end(),
-                         [p](const std::unique_ptr<CPDF_Annot>& annot) {
-                           return annot.get() == p;
-                         });
-  return it != annots.end();
-}
-
-CPDFSDK_Annot* CPDFSDK_PageView::GetFocusAnnot() {
-  CPDFSDK_Annot* pFocusAnnot = m_pSDKDoc->GetFocusAnnot();
-  if (!pFocusAnnot)
-    return nullptr;
-
-  for (CPDFSDK_Annot* pAnnot : m_fxAnnotArray) {
-    if (pAnnot == pFocusAnnot)
-      return pAnnot;
-  }
-  return nullptr;
-}
-
-int CPDFSDK_PageView::GetPageIndexForStaticPDF() const {
-  CPDF_Dictionary* pDict = GetPDFPage()->m_pFormDict;
-  CPDF_Document* pDoc = m_pSDKDoc->GetPDFDocument();
-  return (pDoc && pDict) ? pDoc->GetPageIndex(pDict->GetObjNum()) : -1;
-}
diff --git a/fpdfsdk/include/fsdk_mgr.h b/fpdfsdk/include/cpdfdoc_environment.h
similarity index 68%
rename from fpdfsdk/include/fsdk_mgr.h
rename to fpdfsdk/include/cpdfdoc_environment.h
index 38b06a9..f6211d2 100644
--- a/fpdfsdk/include/fsdk_mgr.h
+++ b/fpdfsdk/include/cpdfdoc_environment.h
@@ -1,37 +1,28 @@
-// Copyright 2014 PDFium Authors. All rights reserved.
+// Copyright 2016 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_INCLUDE_FSDK_MGR_H_
-#define FPDFSDK_INCLUDE_FSDK_MGR_H_
+#ifndef FPDFSDK_INCLUDE_CPDFDOC_ENVIRONMENT_H_
+#define FPDFSDK_INCLUDE_CPDFDOC_ENVIRONMENT_H_
 
-#include <map>
 #include <memory>
-#include <vector>
 
 #include "core/fpdfapi/fpdf_page/include/cpdf_page.h"
 #include "core/fpdfapi/fpdf_parser/include/cpdf_document.h"
 #include "core/fpdfdoc/include/cpdf_occontext.h"
 #include "core/fxcrt/include/cfx_observable.h"
 #include "fpdfsdk/cfx_systemhandler.h"
-#include "fpdfsdk/include/cpdfsdk_annot.h"
-#include "fpdfsdk/include/fsdk_actionhandler.h"
-#include "fpdfsdk/include/fsdk_common.h"
 #include "fpdfsdk/include/fsdk_define.h"
 #include "public/fpdf_formfill.h"
 #include "public/fpdf_fwlevent.h"
 
 class CFFL_IFormFiller;
 class CFX_SystemHandler;
-class CPDF_AnnotList;
 class CPDFSDK_ActionHandler;
-class CPDFSDK_Annot;
 class CPDFSDK_AnnotHandlerMgr;
-class CPDFSDK_InterForm;
-class CPDFSDK_PageView;
-class CPDFSDK_Widget;
+class CPDFSDK_Document;
 class IJS_Runtime;
 
 class CPDFDoc_Environment final {
@@ -445,188 +436,4 @@
   std::unique_ptr<CFX_SystemHandler> m_pSysHandler;
 };
 
-class CPDFSDK_Document : public CFX_Observable<CPDFSDK_Document> {
- public:
-  static CPDFSDK_Document* FromFPDFFormHandle(FPDF_FORMHANDLE hHandle);
-
-  CPDFSDK_Document(UnderlyingDocumentType* pDoc, CPDFDoc_Environment* pEnv);
-  ~CPDFSDK_Document();
-
-  CPDFSDK_InterForm* GetInterForm();
-
-  // Gets the document object for the next layer down; for master this is
-  // a CPDF_Document, but for XFA it is a CPDFXFA_Document.
-  UnderlyingDocumentType* GetUnderlyingDocument() const {
-#ifdef PDF_ENABLE_XFA
-    return GetXFADocument();
-#else   // PDF_ENABLE_XFA
-    return GetPDFDocument();
-#endif  // PDF_ENABLE_XFA
-  }
-
-  // Gets the CPDF_Document, either directly in master, or from the
-  // CPDFXFA_Document for XFA.
-  CPDF_Document* GetPDFDocument() const {
-#ifdef PDF_ENABLE_XFA
-    return m_pDoc ? m_pDoc->GetPDFDoc() : nullptr;
-#else   // PDF_ENABLE_XFA
-    return m_pDoc;
-#endif  // PDF_ENABLE_XFA
-  }
-
-#ifdef PDF_ENABLE_XFA
-  // Gets the XFA document directly (XFA-only).
-  CPDFXFA_Document* GetXFADocument() const { return m_pDoc; }
-
-  int GetPageViewCount() const { return m_pageMap.size(); }
-#endif  // PDF_ENABLE_XFA
-
-  CPDFSDK_PageView* GetPageView(UnderlyingPageType* pPage, bool ReNew);
-  CPDFSDK_PageView* GetPageView(int nIndex);
-  CPDFSDK_PageView* GetCurrentView();
-  void RemovePageView(UnderlyingPageType* pPage);
-  void UpdateAllViews(CPDFSDK_PageView* pSender, CPDFSDK_Annot* pAnnot);
-
-  CPDFSDK_Annot* GetFocusAnnot();
-
-  IJS_Runtime* GetJsRuntime();
-
-  FX_BOOL SetFocusAnnot(CPDFSDK_Annot* pAnnot, FX_UINT nFlag = 0);
-  FX_BOOL KillFocusAnnot(FX_UINT nFlag = 0);
-
-  FX_BOOL ExtractPages(const std::vector<uint16_t>& arrExtraPages,
-                       CPDF_Document* pDstDoc);
-  FX_BOOL InsertPages(int nInsertAt,
-                      const CPDF_Document* pSrcDoc,
-                      const std::vector<uint16_t>& arrSrcPages);
-  FX_BOOL ReplacePages(int nPage,
-                       const CPDF_Document* pSrcDoc,
-                       const std::vector<uint16_t>& arrSrcPages);
-
-  void OnCloseDocument();
-
-  int GetPageCount() { return m_pDoc->GetPageCount(); }
-  FX_BOOL GetPermissions(int nFlag);
-  FX_BOOL GetChangeMark() { return m_bChangeMask; }
-  void SetChangeMark() { m_bChangeMask = TRUE; }
-  void ClearChangeMark() { m_bChangeMask = FALSE; }
-  CFX_WideString GetPath();
-  UnderlyingPageType* GetPage(int nIndex);
-  CPDFDoc_Environment* GetEnv() { return m_pEnv; }
-  void ProcJavascriptFun();
-  FX_BOOL ProcOpenAction();
-  CPDF_OCContext* GetOCContext();
-
- private:
-  std::map<UnderlyingPageType*, CPDFSDK_PageView*> m_pageMap;
-  UnderlyingDocumentType* m_pDoc;
-  std::unique_ptr<CPDFSDK_InterForm> m_pInterForm;
-  CPDFSDK_Annot* m_pFocusAnnot;
-  CPDFDoc_Environment* m_pEnv;
-  std::unique_ptr<CPDF_OCContext> m_pOccontent;
-  FX_BOOL m_bChangeMask;
-  FX_BOOL m_bBeingDestroyed;
-};
-
-class CPDFSDK_PageView final : public CPDF_Page::View {
- public:
-  CPDFSDK_PageView(CPDFSDK_Document* pSDKDoc, UnderlyingPageType* page);
-  ~CPDFSDK_PageView();
-
-#ifdef PDF_ENABLE_XFA
-  void PageView_OnDraw(CFX_RenderDevice* pDevice,
-                       CFX_Matrix* pUser2Device,
-                       CPDF_RenderOptions* pOptions,
-                       const FX_RECT& pClip);
-#else   // PDF_ENABLE_XFA
-  void PageView_OnDraw(CFX_RenderDevice* pDevice,
-                       CFX_Matrix* pUser2Device,
-                       CPDF_RenderOptions* pOptions);
-#endif  // PDF_ENABLE_XFA
-
-  const CPDF_Annot* GetPDFAnnotAtPoint(FX_FLOAT pageX, FX_FLOAT pageY);
-  CPDFSDK_Annot* GetFXAnnotAtPoint(FX_FLOAT pageX, FX_FLOAT pageY);
-  const CPDF_Annot* GetPDFWidgetAtPoint(FX_FLOAT pageX, FX_FLOAT pageY);
-  CPDFSDK_Annot* GetFXWidgetAtPoint(FX_FLOAT pageX, FX_FLOAT pageY);
-  CPDFSDK_Annot* GetFocusAnnot();
-  void SetFocusAnnot(CPDFSDK_Annot* pSDKAnnot, FX_UINT nFlag = 0) {
-    m_pSDKDoc->SetFocusAnnot(pSDKAnnot, nFlag);
-  }
-  FX_BOOL KillFocusAnnot(FX_UINT nFlag = 0) {
-    return m_pSDKDoc->KillFocusAnnot(nFlag);
-  }
-  void KillFocusAnnotIfNeeded();
-
-  CPDFSDK_Annot* AddAnnot(CPDF_Dictionary* pDict);
-  CPDFSDK_Annot* AddAnnot(const FX_CHAR* lpSubType, CPDF_Dictionary* pDict);
-  CPDFSDK_Annot* AddAnnot(CPDF_Annot* pPDFAnnot);
-
-  FX_BOOL DeleteAnnot(CPDFSDK_Annot* pAnnot);
-  size_t CountAnnots() const;
-  CPDFSDK_Annot* GetAnnot(size_t nIndex);
-  CPDFSDK_Annot* GetAnnotByDict(CPDF_Dictionary* pDict);
-
-#ifdef PDF_ENABLE_XFA
-  CPDFSDK_Annot* AddAnnot(CXFA_FFWidget* pPDFAnnot);
-  CPDFSDK_Annot* GetAnnotByXFAWidget(CXFA_FFWidget* hWidget);
-  CPDFXFA_Page* GetPDFXFAPage() { return m_page; }
-#endif  // PDF_ENABLE_XFA
-
-  CPDF_Page* GetPDFPage() const;
-  CPDF_Document* GetPDFDocument();
-  CPDFSDK_Document* GetSDKDocument() { return m_pSDKDoc; }
-  FX_BOOL OnLButtonDown(const CFX_FloatPoint& point, FX_UINT nFlag);
-  FX_BOOL OnLButtonUp(const CFX_FloatPoint& point, FX_UINT nFlag);
-#ifdef PDF_ENABLE_XFA
-  FX_BOOL OnRButtonDown(const CFX_FloatPoint& point, FX_UINT nFlag);
-  FX_BOOL OnRButtonUp(const CFX_FloatPoint& point, FX_UINT nFlag);
-#endif  // PDF_ENABLE_XFA
-  FX_BOOL OnChar(int nChar, FX_UINT nFlag);
-  FX_BOOL OnKeyDown(int nKeyCode, int nFlag);
-  FX_BOOL OnKeyUp(int nKeyCode, int nFlag);
-
-  FX_BOOL OnMouseMove(const CFX_FloatPoint& point, int nFlag);
-  FX_BOOL OnMouseWheel(double deltaX,
-                       double deltaY,
-                       const CFX_FloatPoint& point,
-                       int nFlag);
-  bool IsValidAnnot(const CPDF_Annot* p) const;
-  void GetCurrentMatrix(CFX_Matrix& matrix) { matrix = m_curMatrix; }
-  void UpdateRects(const std::vector<CFX_FloatRect>& rects);
-  void UpdateView(CPDFSDK_Annot* pAnnot);
-  const std::vector<CPDFSDK_Annot*>& GetAnnotList() const {
-    return m_fxAnnotArray;
-  }
-
-  int GetPageIndex() const;
-  void LoadFXAnnots();
-  void ClearFXAnnots();
-  void SetValid(FX_BOOL bValid) { m_bValid = bValid; }
-  FX_BOOL IsValid() { return m_bValid; }
-  void SetLock(FX_BOOL bLocked) { m_bLocked = bLocked; }
-  FX_BOOL IsLocked() { return m_bLocked; }
-#ifndef PDF_ENABLE_XFA
-  bool OwnsPage() const { return m_bOwnsPage; }
-  void TakePageOwnership() { m_bOwnsPage = true; }
-#endif  // PDF_ENABLE_XFA
-
- private:
-  int GetPageIndexForStaticPDF() const;
-
-  CFX_Matrix m_curMatrix;
-  UnderlyingPageType* const m_page;
-  std::unique_ptr<CPDF_AnnotList> m_pAnnotList;
-  std::vector<CPDFSDK_Annot*> m_fxAnnotArray;
-  CPDFSDK_Document* const m_pSDKDoc;
-  CPDFSDK_Annot* m_CaptureWidget;
-#ifndef PDF_ENABLE_XFA
-  bool m_bOwnsPage;
-#endif  // PDF_ENABLE_XFA
-  FX_BOOL m_bEnterWidget;
-  FX_BOOL m_bExitWidget;
-  FX_BOOL m_bOnWidget;
-  FX_BOOL m_bValid;
-  FX_BOOL m_bLocked;
-};
-
-#endif  // FPDFSDK_INCLUDE_FSDK_MGR_H_
+#endif  // FPDFSDK_INCLUDE_CPDFDOC_ENVIRONMENT_H_
diff --git a/fpdfsdk/include/cpdfsdk_document.h b/fpdfsdk/include/cpdfsdk_document.h
new file mode 100644
index 0000000..610fb17
--- /dev/null
+++ b/fpdfsdk/include/cpdfsdk_document.h
@@ -0,0 +1,108 @@
+// Copyright 2016 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_INCLUDE_CPDFSDK_DOCUMENT_H_
+#define FPDFSDK_INCLUDE_CPDFSDK_DOCUMENT_H_
+
+#include <map>
+#include <memory>
+
+#include "core/fpdfapi/fpdf_parser/include/cpdf_document.h"
+#include "core/fxcrt/include/cfx_observable.h"
+#include "fpdfsdk/include/fsdk_define.h"
+#include "public/fpdf_formfill.h"
+
+class CPDF_OCContext;
+class CPDFDoc_Environment;
+class CPDFSDK_Annot;
+class CPDFSDK_InterForm;
+class CPDFSDK_PageView;
+class IJS_Runtime;
+
+class CPDFSDK_Document : public CFX_Observable<CPDFSDK_Document> {
+ public:
+  static CPDFSDK_Document* FromFPDFFormHandle(FPDF_FORMHANDLE hHandle);
+
+  CPDFSDK_Document(UnderlyingDocumentType* pDoc, CPDFDoc_Environment* pEnv);
+  ~CPDFSDK_Document();
+
+  CPDFSDK_InterForm* GetInterForm();
+
+  // Gets the document object for the next layer down; for master this is
+  // a CPDF_Document, but for XFA it is a CPDFXFA_Document.
+  UnderlyingDocumentType* GetUnderlyingDocument() const {
+#ifdef PDF_ENABLE_XFA
+    return GetXFADocument();
+#else   // PDF_ENABLE_XFA
+    return GetPDFDocument();
+#endif  // PDF_ENABLE_XFA
+  }
+
+  // Gets the CPDF_Document, either directly in master, or from the
+  // CPDFXFA_Document for XFA.
+  CPDF_Document* GetPDFDocument() const {
+#ifdef PDF_ENABLE_XFA
+    return m_pDoc ? m_pDoc->GetPDFDoc() : nullptr;
+#else   // PDF_ENABLE_XFA
+    return m_pDoc;
+#endif  // PDF_ENABLE_XFA
+  }
+
+#ifdef PDF_ENABLE_XFA
+  // Gets the XFA document directly (XFA-only).
+  CPDFXFA_Document* GetXFADocument() const { return m_pDoc; }
+
+  int GetPageViewCount() const { return m_pageMap.size(); }
+#endif  // PDF_ENABLE_XFA
+
+  CPDFSDK_PageView* GetPageView(UnderlyingPageType* pPage, bool ReNew);
+  CPDFSDK_PageView* GetPageView(int nIndex);
+  CPDFSDK_PageView* GetCurrentView();
+  void RemovePageView(UnderlyingPageType* pPage);
+  void UpdateAllViews(CPDFSDK_PageView* pSender, CPDFSDK_Annot* pAnnot);
+
+  CPDFSDK_Annot* GetFocusAnnot();
+
+  IJS_Runtime* GetJsRuntime();
+
+  FX_BOOL SetFocusAnnot(CPDFSDK_Annot* pAnnot, FX_UINT nFlag = 0);
+  FX_BOOL KillFocusAnnot(FX_UINT nFlag = 0);
+
+  FX_BOOL ExtractPages(const std::vector<uint16_t>& arrExtraPages,
+                       CPDF_Document* pDstDoc);
+  FX_BOOL InsertPages(int nInsertAt,
+                      const CPDF_Document* pSrcDoc,
+                      const std::vector<uint16_t>& arrSrcPages);
+  FX_BOOL ReplacePages(int nPage,
+                       const CPDF_Document* pSrcDoc,
+                       const std::vector<uint16_t>& arrSrcPages);
+
+  void OnCloseDocument();
+
+  int GetPageCount() { return m_pDoc->GetPageCount(); }
+  FX_BOOL GetPermissions(int nFlag);
+  FX_BOOL GetChangeMark() { return m_bChangeMask; }
+  void SetChangeMark() { m_bChangeMask = TRUE; }
+  void ClearChangeMark() { m_bChangeMask = FALSE; }
+  CFX_WideString GetPath();
+  UnderlyingPageType* GetPage(int nIndex);
+  CPDFDoc_Environment* GetEnv() { return m_pEnv; }
+  void ProcJavascriptFun();
+  FX_BOOL ProcOpenAction();
+  CPDF_OCContext* GetOCContext();
+
+ private:
+  std::map<UnderlyingPageType*, CPDFSDK_PageView*> m_pageMap;
+  UnderlyingDocumentType* m_pDoc;
+  std::unique_ptr<CPDFSDK_InterForm> m_pInterForm;
+  CPDFSDK_Annot* m_pFocusAnnot;
+  CPDFDoc_Environment* m_pEnv;
+  std::unique_ptr<CPDF_OCContext> m_pOccontent;
+  FX_BOOL m_bChangeMask;
+  FX_BOOL m_bBeingDestroyed;
+};
+
+#endif  // FPDFSDK_INCLUDE_CPDFSDK_DOCUMENT_H_
diff --git a/fpdfsdk/include/cpdfsdk_pageview.h b/fpdfsdk/include/cpdfsdk_pageview.h
new file mode 100644
index 0000000..a496334
--- /dev/null
+++ b/fpdfsdk/include/cpdfsdk_pageview.h
@@ -0,0 +1,122 @@
+// Copyright 2016 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_INCLUDE_CPDFSDK_PAGEVIEW_H_
+#define FPDFSDK_INCLUDE_CPDFSDK_PAGEVIEW_H_
+
+#include <memory>
+#include <vector>
+
+#include "core/fpdfapi/fpdf_page/include/cpdf_page.h"
+#include "core/fxcrt/include/fx_system.h"
+#include "fpdfsdk/include/cpdfsdk_document.h"
+
+class CFX_RenderDevice;
+class CPDF_AnnotList;
+class CPDF_RenderOptions;
+
+class CPDFSDK_PageView final : public CPDF_Page::View {
+ public:
+  CPDFSDK_PageView(CPDFSDK_Document* pSDKDoc, UnderlyingPageType* page);
+  ~CPDFSDK_PageView();
+
+#ifdef PDF_ENABLE_XFA
+  void PageView_OnDraw(CFX_RenderDevice* pDevice,
+                       CFX_Matrix* pUser2Device,
+                       CPDF_RenderOptions* pOptions,
+                       const FX_RECT& pClip);
+#else   // PDF_ENABLE_XFA
+  void PageView_OnDraw(CFX_RenderDevice* pDevice,
+                       CFX_Matrix* pUser2Device,
+                       CPDF_RenderOptions* pOptions);
+#endif  // PDF_ENABLE_XFA
+
+  const CPDF_Annot* GetPDFAnnotAtPoint(FX_FLOAT pageX, FX_FLOAT pageY);
+  CPDFSDK_Annot* GetFXAnnotAtPoint(FX_FLOAT pageX, FX_FLOAT pageY);
+  const CPDF_Annot* GetPDFWidgetAtPoint(FX_FLOAT pageX, FX_FLOAT pageY);
+  CPDFSDK_Annot* GetFXWidgetAtPoint(FX_FLOAT pageX, FX_FLOAT pageY);
+  CPDFSDK_Annot* GetFocusAnnot();
+  void SetFocusAnnot(CPDFSDK_Annot* pSDKAnnot, FX_UINT nFlag = 0) {
+    m_pSDKDoc->SetFocusAnnot(pSDKAnnot, nFlag);
+  }
+  FX_BOOL KillFocusAnnot(FX_UINT nFlag = 0) {
+    return m_pSDKDoc->KillFocusAnnot(nFlag);
+  }
+  void KillFocusAnnotIfNeeded();
+
+  CPDFSDK_Annot* AddAnnot(CPDF_Dictionary* pDict);
+  CPDFSDK_Annot* AddAnnot(const FX_CHAR* lpSubType, CPDF_Dictionary* pDict);
+  CPDFSDK_Annot* AddAnnot(CPDF_Annot* pPDFAnnot);
+
+  FX_BOOL DeleteAnnot(CPDFSDK_Annot* pAnnot);
+  size_t CountAnnots() const;
+  CPDFSDK_Annot* GetAnnot(size_t nIndex);
+  CPDFSDK_Annot* GetAnnotByDict(CPDF_Dictionary* pDict);
+
+#ifdef PDF_ENABLE_XFA
+  CPDFSDK_Annot* AddAnnot(CXFA_FFWidget* pPDFAnnot);
+  CPDFSDK_Annot* GetAnnotByXFAWidget(CXFA_FFWidget* hWidget);
+  CPDFXFA_Page* GetPDFXFAPage() { return m_page; }
+#endif  // PDF_ENABLE_XFA
+
+  CPDF_Page* GetPDFPage() const;
+  CPDF_Document* GetPDFDocument();
+  CPDFSDK_Document* GetSDKDocument() { return m_pSDKDoc; }
+  FX_BOOL OnLButtonDown(const CFX_FloatPoint& point, FX_UINT nFlag);
+  FX_BOOL OnLButtonUp(const CFX_FloatPoint& point, FX_UINT nFlag);
+#ifdef PDF_ENABLE_XFA
+  FX_BOOL OnRButtonDown(const CFX_FloatPoint& point, FX_UINT nFlag);
+  FX_BOOL OnRButtonUp(const CFX_FloatPoint& point, FX_UINT nFlag);
+#endif  // PDF_ENABLE_XFA
+  FX_BOOL OnChar(int nChar, FX_UINT nFlag);
+  FX_BOOL OnKeyDown(int nKeyCode, int nFlag);
+  FX_BOOL OnKeyUp(int nKeyCode, int nFlag);
+
+  FX_BOOL OnMouseMove(const CFX_FloatPoint& point, int nFlag);
+  FX_BOOL OnMouseWheel(double deltaX,
+                       double deltaY,
+                       const CFX_FloatPoint& point,
+                       int nFlag);
+  bool IsValidAnnot(const CPDF_Annot* p) const;
+  void GetCurrentMatrix(CFX_Matrix& matrix) { matrix = m_curMatrix; }
+  void UpdateRects(const std::vector<CFX_FloatRect>& rects);
+  void UpdateView(CPDFSDK_Annot* pAnnot);
+  const std::vector<CPDFSDK_Annot*>& GetAnnotList() const {
+    return m_fxAnnotArray;
+  }
+
+  int GetPageIndex() const;
+  void LoadFXAnnots();
+  void ClearFXAnnots();
+  void SetValid(FX_BOOL bValid) { m_bValid = bValid; }
+  FX_BOOL IsValid() { return m_bValid; }
+  void SetLock(FX_BOOL bLocked) { m_bLocked = bLocked; }
+  FX_BOOL IsLocked() { return m_bLocked; }
+#ifndef PDF_ENABLE_XFA
+  bool OwnsPage() const { return m_bOwnsPage; }
+  void TakePageOwnership() { m_bOwnsPage = true; }
+#endif  // PDF_ENABLE_XFA
+
+ private:
+  int GetPageIndexForStaticPDF() const;
+
+  CFX_Matrix m_curMatrix;
+  UnderlyingPageType* const m_page;
+  std::unique_ptr<CPDF_AnnotList> m_pAnnotList;
+  std::vector<CPDFSDK_Annot*> m_fxAnnotArray;
+  CPDFSDK_Document* const m_pSDKDoc;
+  CPDFSDK_Annot* m_CaptureWidget;
+#ifndef PDF_ENABLE_XFA
+  bool m_bOwnsPage;
+#endif  // PDF_ENABLE_XFA
+  FX_BOOL m_bEnterWidget;
+  FX_BOOL m_bExitWidget;
+  FX_BOOL m_bOnWidget;
+  FX_BOOL m_bValid;
+  FX_BOOL m_bLocked;
+};
+
+#endif  // FPDFSDK_INCLUDE_CPDFSDK_PAGEVIEW_H_
diff --git a/fpdfsdk/javascript/Document.cpp b/fpdfsdk/javascript/Document.cpp
index fe623e9..cbf155a 100644
--- a/fpdfsdk/javascript/Document.cpp
+++ b/fpdfsdk/javascript/Document.cpp
@@ -15,10 +15,12 @@
 #include "core/fpdfapi/fpdf_parser/include/fpdf_parser_decode.h"
 #include "core/fpdfdoc/include/cpdf_interform.h"
 #include "core/fpdfdoc/include/cpdf_nametree.h"
+#include "fpdfsdk/include/cpdfdoc_environment.h"
 #include "fpdfsdk/include/cpdfsdk_annotiterator.h"
+#include "fpdfsdk/include/cpdfsdk_document.h"
 #include "fpdfsdk/include/cpdfsdk_interform.h"
+#include "fpdfsdk/include/cpdfsdk_pageview.h"
 #include "fpdfsdk/include/cpdfsdk_widget.h"
-#include "fpdfsdk/include/fsdk_mgr.h"
 #include "fpdfsdk/javascript/Annot.h"
 #include "fpdfsdk/javascript/Field.h"
 #include "fpdfsdk/javascript/Icon.h"
diff --git a/fpdfsdk/javascript/Document.h b/fpdfsdk/javascript/Document.h
index a35358d..544a042 100644
--- a/fpdfsdk/javascript/Document.h
+++ b/fpdfsdk/javascript/Document.h
@@ -13,7 +13,7 @@
 
 #include "core/fpdfapi/fpdf_page/include/cpdf_pageobject.h"
 #include "core/fpdfapi/fpdf_page/include/cpdf_textobject.h"
-#include "fpdfsdk/include/fsdk_mgr.h"
+#include "fpdfsdk/include/cpdfsdk_document.h"
 #include "fpdfsdk/javascript/JS_Define.h"
 
 class PrintParamsObj : public CJS_EmbedObj {
diff --git a/fpdfsdk/javascript/Field.cpp b/fpdfsdk/javascript/Field.cpp
index 8b9e981..0803cfa 100644
--- a/fpdfsdk/javascript/Field.cpp
+++ b/fpdfsdk/javascript/Field.cpp
@@ -13,10 +13,13 @@
 
 #include "core/fpdfapi/fpdf_font/include/cpdf_font.h"
 #include "core/fpdfapi/fpdf_page/include/cpdf_page.h"
+#include "core/fpdfapi/fpdf_parser/include/cpdf_document.h"
 #include "core/fpdfdoc/include/cpdf_interform.h"
+#include "fpdfsdk/include/cpdfdoc_environment.h"
+#include "fpdfsdk/include/cpdfsdk_document.h"
 #include "fpdfsdk/include/cpdfsdk_interform.h"
+#include "fpdfsdk/include/cpdfsdk_pageview.h"
 #include "fpdfsdk/include/cpdfsdk_widget.h"
-#include "fpdfsdk/include/fsdk_mgr.h"
 #include "fpdfsdk/javascript/Document.h"
 #include "fpdfsdk/javascript/Icon.h"
 #include "fpdfsdk/javascript/JS_Define.h"
diff --git a/fpdfsdk/javascript/Field.h b/fpdfsdk/javascript/Field.h
index 700302c..56cfd20 100644
--- a/fpdfsdk/javascript/Field.h
+++ b/fpdfsdk/javascript/Field.h
@@ -11,7 +11,7 @@
 #include <vector>
 
 #include "core/fxcrt/include/cfx_observable.h"
-#include "fpdfsdk/include/fsdk_mgr.h"
+#include "fpdfsdk/include/cpdfsdk_document.h"
 #include "fpdfsdk/javascript/JS_Define.h"
 #include "fpdfsdk/pdfwindow/PWL_Wnd.h"  // For CPWL_Color.
 
diff --git a/fpdfsdk/javascript/JS_Object.cpp b/fpdfsdk/javascript/JS_Object.cpp
index 3de0ece..88dd288 100644
--- a/fpdfsdk/javascript/JS_Object.cpp
+++ b/fpdfsdk/javascript/JS_Object.cpp
@@ -6,7 +6,6 @@
 
 #include "fpdfsdk/javascript/JS_Object.h"
 
-#include "fpdfsdk/include/fsdk_mgr.h"
 #include "fpdfsdk/javascript/JS_Define.h"
 #include "fpdfsdk/javascript/cjs_context.h"
 
diff --git a/fpdfsdk/javascript/JS_Runtime_Stub.cpp b/fpdfsdk/javascript/JS_Runtime_Stub.cpp
index 98c641f..2b4a624 100644
--- a/fpdfsdk/javascript/JS_Runtime_Stub.cpp
+++ b/fpdfsdk/javascript/JS_Runtime_Stub.cpp
@@ -6,7 +6,6 @@
 
 #include <memory>
 
-#include "fpdfsdk/include/fsdk_mgr.h"
 #include "fpdfsdk/javascript/ijs_context.h"
 #include "fpdfsdk/javascript/ijs_runtime.h"
 
diff --git a/fpdfsdk/javascript/PublicMethods.cpp b/fpdfsdk/javascript/PublicMethods.cpp
index 749c8d7..5a793f4 100644
--- a/fpdfsdk/javascript/PublicMethods.cpp
+++ b/fpdfsdk/javascript/PublicMethods.cpp
@@ -11,8 +11,9 @@
 
 #include "core/fpdfdoc/include/cpdf_interform.h"
 #include "core/fxcrt/include/fx_ext.h"
+#include "fpdfsdk/include/cpdfdoc_environment.h"
+#include "fpdfsdk/include/cpdfsdk_document.h"
 #include "fpdfsdk/include/cpdfsdk_interform.h"
-#include "fpdfsdk/include/fsdk_mgr.h"
 #include "fpdfsdk/javascript/Field.h"
 #include "fpdfsdk/javascript/JS_Define.h"
 #include "fpdfsdk/javascript/JS_EventHandler.h"
diff --git a/fpdfsdk/javascript/app.cpp b/fpdfsdk/javascript/app.cpp
index 1e3ea2f..5e708de 100644
--- a/fpdfsdk/javascript/app.cpp
+++ b/fpdfsdk/javascript/app.cpp
@@ -9,8 +9,9 @@
 #include <memory>
 #include <vector>
 
+#include "fpdfsdk/include/cpdfdoc_environment.h"
+#include "fpdfsdk/include/cpdfsdk_document.h"
 #include "fpdfsdk/include/cpdfsdk_interform.h"
-#include "fpdfsdk/include/fsdk_mgr.h"
 #include "fpdfsdk/javascript/Document.h"
 #include "fpdfsdk/javascript/JS_Define.h"
 #include "fpdfsdk/javascript/JS_EventHandler.h"
diff --git a/fpdfsdk/javascript/cjs_runtime.cpp b/fpdfsdk/javascript/cjs_runtime.cpp
index bfed82e..e35ee5b 100644
--- a/fpdfsdk/javascript/cjs_runtime.cpp
+++ b/fpdfsdk/javascript/cjs_runtime.cpp
@@ -8,7 +8,7 @@
 
 #include <algorithm>
 
-#include "fpdfsdk/include/fsdk_mgr.h"
+#include "fpdfsdk/include/cpdfdoc_environment.h"
 #include "fpdfsdk/javascript/Annot.h"
 #include "fpdfsdk/javascript/Consts.h"
 #include "fpdfsdk/javascript/Document.h"
@@ -28,6 +28,7 @@
 #include "fpdfsdk/javascript/global.h"
 #include "fpdfsdk/javascript/report.h"
 #include "fpdfsdk/javascript/util.h"
+#include "public/fpdf_formfill.h"
 #include "third_party/base/stl_util.h"
 
 #ifdef PDF_ENABLE_XFA
