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
--- 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;