Bug 1401888 - Part 2. Implement PDFiumEngineShim::GetInstanceOrNull(const nsCString&) draft
authorcku <cku@mozilla.com>
Thu, 21 Sep 2017 15:22:18 +0800
changeset 669446 171b81cfffd1dc2b2cfacac61adaced12866e32e
parent 669445 912ced940eb3dca6bcaed53c97c3e672210e409a
child 669447 aa89341fcd0ed260976560b789f7ceb9c0f21aa5
push id81327
push usercku@mozilla.com
push dateSat, 23 Sep 2017 05:05:28 +0000
bugs1401888
milestone57.0a1
Bug 1401888 - Part 2. Implement PDFiumEngineShim::GetInstanceOrNull(const nsCString&) With this change, we are able to load PDFium engine from different library. MozReview-Commit-ID: ErAZCPRzRR5
widget/windows/PDFiumEngineShim.cpp
widget/windows/PDFiumEngineShim.h
--- a/widget/windows/PDFiumEngineShim.cpp
+++ b/widget/windows/PDFiumEngineShim.cpp
@@ -13,25 +13,37 @@ static PDFiumEngineShim* sPDFiumEngineSh
 
 /* static */
 already_AddRefed<PDFiumEngineShim>
 PDFiumEngineShim::GetInstanceOrNull()
 {
   RefPtr<PDFiumEngineShim> inst = sPDFiumEngineShim;
   if (!inst) {
     inst = new PDFiumEngineShim();
-    if (!inst->Init()) {
+    if (!inst->Init(nsCString("pdfium.dll"))) {
       inst = nullptr;
     }
     sPDFiumEngineShim = inst.get();
   }
 
   return inst.forget();
 }
 
+/* static */
+already_AddRefed<PDFiumEngineShim>
+PDFiumEngineShim::GetInstanceOrNull(const nsCString& aLibrary)
+{
+  RefPtr<PDFiumEngineShim> shim = new PDFiumEngineShim();
+  if (!shim->Init(aLibrary)) {
+    return nullptr;
+  }
+
+  return shim.forget();
+}
+
 PDFiumEngineShim::PDFiumEngineShim()
   : mFPDF_InitLibrary(nullptr)
   , mFPDF_DestroyLibrary(nullptr)
   , mFPDF_CloseDocument(nullptr)
   , mFPDF_GetPageCount(nullptr)
   , mFPDF_LoadPage(nullptr)
   , mFPDF_ClosePage(nullptr)
   , mFPDF_RenderPage(nullptr)
@@ -49,23 +61,23 @@ PDFiumEngineShim::~PDFiumEngineShim()
   sPDFiumEngineShim = nullptr;
 
   if (mPRLibrary) {
     PR_UnloadLibrary(mPRLibrary);
   }
 }
 
 bool
-PDFiumEngineShim::Init()
+PDFiumEngineShim::Init(const nsCString& aLibrary)
 {
   if (mInitialized) {
     return true;
   }
 
-  mPRLibrary = PR_LoadLibrary("pdfium.dll");
+  mPRLibrary = PR_LoadLibrary(aLibrary.get());
   NS_ENSURE_TRUE(mPRLibrary, false);
 
   mFPDF_InitLibrary = (FPDF_InitLibrary_Pfn)PR_FindFunctionSymbol(
     mPRLibrary, "FPDF_InitLibrary");
   NS_ENSURE_TRUE(mFPDF_InitLibrary, false);
 
   mFPDF_DestroyLibrary = (FPDF_DestroyLibrary_Pfn)PR_FindFunctionSymbol(
     mPRLibrary, "FPDF_DestroyLibrary");
--- a/widget/windows/PDFiumEngineShim.h
+++ b/widget/windows/PDFiumEngineShim.h
@@ -43,16 +43,20 @@ typedef void (STDCALL *FPDF_RenderPage_P
  */
 class PDFiumEngineShim
 {
 public:
 
   NS_INLINE_DECL_THREADSAFE_REFCOUNTING(PDFiumEngineShim)
 
   static already_AddRefed<PDFiumEngineShim> GetInstanceOrNull();
+  // This function is used for testing purpose only, do not call it in regular
+  // code.
+  static already_AddRefed<PDFiumEngineShim>
+  GetInstanceOrNull(const nsCString& aLibrary);
 
   FPDF_DOCUMENT LoadDocument(FPDF_STRING file_path,
                              FPDF_BYTESTRING aPassword);
   void CloseDocument(FPDF_DOCUMENT aDocument);
   int GetPageCount(FPDF_DOCUMENT aDocument);
   int GetPageSizeByIndex(FPDF_DOCUMENT aDocument, int aPageIndex,
                          double* aWidth, double* aHeight);
 
@@ -61,17 +65,17 @@ public:
   void RenderPage(HDC aDC, FPDF_PAGE aPage,
                   int aStartX, int aStartY,
                   int aSizeX, int aSizeY,
                   int aRotate, int aFlags);
 
 private:
   PDFiumEngineShim();
   ~PDFiumEngineShim();
-  bool Init();
+  bool Init(const nsCString& aLibrary);
 
   bool        mInitialized ;
 
   FPDF_InitLibrary_Pfn        mFPDF_InitLibrary;
   FPDF_DestroyLibrary_Pfn     mFPDF_DestroyLibrary;
   FPDF_LoadDocument_Pfn       mFPDF_LoadDocument;
   FPDF_CloseDocument_Pfn      mFPDF_CloseDocument;
   FPDF_GetPageCount_Pfn       mFPDF_GetPageCount;