summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--core/fxcrt/fx_extension.cpp27
-rw-r--r--core/fxcrt/fx_extension.h7
-rw-r--r--fpdfsdk/fpdf_editpage.cpp2
-rw-r--r--fpdfsdk/fpdf_ext.cpp5
-rw-r--r--fpdfsdk/fpdf_view_c_api_test.c1
-rw-r--r--fxjs/cfxjse_formcalc_context.cpp2
-rw-r--r--fxjs/js_define.cpp12
-rw-r--r--public/fpdf_ext.h15
-rw-r--r--samples/pdfium_test.cc3
-rw-r--r--testing/resources/javascript/public_methods.in4
-rw-r--r--testing/resources/javascript/public_methods_expected.txt4
-rw-r--r--testing/resources/javascript/util_printd_expected.txt34
-rwxr-xr-xtesting/tools/api_check.py4
13 files changed, 81 insertions, 39 deletions
diff --git a/core/fxcrt/fx_extension.cpp b/core/fxcrt/fx_extension.cpp
index 8e78e4d789..443e301630 100644
--- a/core/fxcrt/fx_extension.cpp
+++ b/core/fxcrt/fx_extension.cpp
@@ -12,7 +12,20 @@
#include "third_party/base/compiler_specific.h"
-time_t (*time_func)() = []() -> time_t { return time(nullptr); };
+namespace {
+
+time_t DefaultTimeFunction() {
+ return time(nullptr);
+}
+
+struct tm* DefaultLocaltimeFunction(const time_t* tp) {
+ return localtime(tp);
+}
+
+time_t (*g_time_func)() = DefaultTimeFunction;
+struct tm* (*g_localtime_func)(const time_t*) = DefaultLocaltimeFunction;
+
+} // namespace
float FXSYS_wcstof(const wchar_t* pwsStr, int32_t iLength, int32_t* pUsedLen) {
ASSERT(pwsStr);
@@ -171,12 +184,20 @@ size_t FXSYS_ToUTF16BE(uint32_t unicode, char* buf) {
}
void FXSYS_SetTimeFunction(time_t (*func)()) {
- time_func = func ? func : []() -> time_t { return time(nullptr); };
+ g_time_func = func ? func : DefaultTimeFunction;
+}
+
+void FXSYS_SetLocaltimeFunction(struct tm* (*func)(const time_t*)) {
+ g_localtime_func = func ? func : DefaultLocaltimeFunction;
}
time_t FXSYS_time(time_t* tloc) {
- time_t ret_val = time_func();
+ time_t ret_val = g_time_func();
if (tloc)
*tloc = ret_val;
return ret_val;
}
+
+struct tm* FXSYS_localtime(const time_t* tp) {
+ return g_localtime_func(tp);
+}
diff --git a/core/fxcrt/fx_extension.h b/core/fxcrt/fx_extension.h
index c1cd188c81..38f9fd5993 100644
--- a/core/fxcrt/fx_extension.h
+++ b/core/fxcrt/fx_extension.h
@@ -7,6 +7,8 @@
#ifndef CORE_FXCRT_FX_EXTENSION_H_
#define CORE_FXCRT_FX_EXTENSION_H_
+#include <time.h>
+
#include <cctype>
#include <cmath>
#include <cwctype>
@@ -106,7 +108,12 @@ bool FXSYS_SafeLT(const T& lhs, const T& rhs) {
return lhs < rhs;
}
+// Override time/localtime functions for test consistency.
void FXSYS_SetTimeFunction(time_t (*func)());
+void FXSYS_SetLocaltimeFunction(struct tm* (*func)(const time_t*));
+
+// Replacements for time/localtime that respect overrides.
time_t FXSYS_time(time_t* tloc);
+struct tm* FXSYS_localtime(const time_t* tp);
#endif // CORE_FXCRT_FX_EXTENSION_H_
diff --git a/fpdfsdk/fpdf_editpage.cpp b/fpdfsdk/fpdf_editpage.cpp
index dcb3d5e1f0..585e7e1740 100644
--- a/fpdfsdk/fpdf_editpage.cpp
+++ b/fpdfsdk/fpdf_editpage.cpp
@@ -164,7 +164,7 @@ FPDF_EXPORT FPDF_DOCUMENT FPDF_CALLCONV FPDF_CreateNewDocument() {
ByteString DateStr;
if (FSDK_IsSandBoxPolicyEnabled(FPDF_POLICY_MACHINETIME_ACCESS)) {
if (FXSYS_time(&currentTime) != -1) {
- tm* pTM = localtime(&currentTime);
+ tm* pTM = FXSYS_localtime(&currentTime);
if (pTM) {
DateStr = ByteString::Format(
"D:%04d%02d%02d%02d%02d%02d", pTM->tm_year + 1900, pTM->tm_mon + 1,
diff --git a/fpdfsdk/fpdf_ext.cpp b/fpdfsdk/fpdf_ext.cpp
index 1ff27cc94d..9f7b24b60f 100644
--- a/fpdfsdk/fpdf_ext.cpp
+++ b/fpdfsdk/fpdf_ext.cpp
@@ -83,6 +83,11 @@ FPDF_EXPORT void FPDF_CALLCONV FSDK_SetTimeFunction(time_t (*func)()) {
FXSYS_SetTimeFunction(func);
}
+FPDF_EXPORT void FPDF_CALLCONV
+FSDK_SetLocaltimeFunction(struct tm* (*func)(const time_t* tp)) {
+ FXSYS_SetLocaltimeFunction(func);
+}
+
FPDF_EXPORT int FPDF_CALLCONV FPDFDoc_GetPageMode(FPDF_DOCUMENT document) {
CPDF_Document* pDoc = CPDFDocumentFromFPDFDocument(document);
if (!pDoc)
diff --git a/fpdfsdk/fpdf_view_c_api_test.c b/fpdfsdk/fpdf_view_c_api_test.c
index ab184cc519..9cf037685e 100644
--- a/fpdfsdk/fpdf_view_c_api_test.c
+++ b/fpdfsdk/fpdf_view_c_api_test.c
@@ -216,6 +216,7 @@ int CheckPDFiumCApi() {
// fpdf_ext.h
CHK(FPDFDoc_GetPageMode);
+ CHK(FSDK_SetLocaltimeFunction);
CHK(FSDK_SetTimeFunction);
CHK(FSDK_SetUnSpObjProcessHandler);
diff --git a/fxjs/cfxjse_formcalc_context.cpp b/fxjs/cfxjse_formcalc_context.cpp
index f95ee831a7..d77453ef72 100644
--- a/fxjs/cfxjse_formcalc_context.cpp
+++ b/fxjs/cfxjse_formcalc_context.cpp
@@ -959,7 +959,7 @@ void GetLocalTimeZone(int32_t* pHour, int32_t* pMin, int32_t* pSec) {
FXSYS_time(&now);
struct tm* pGmt = gmtime(&now);
- struct tm* pLocal = localtime(&now);
+ struct tm* pLocal = FXSYS_localtime(&now);
*pHour = pLocal->tm_hour - pGmt->tm_hour;
*pMin = pLocal->tm_min - pGmt->tm_min;
*pSec = pLocal->tm_sec - pGmt->tm_sec;
diff --git a/fxjs/js_define.cpp b/fxjs/js_define.cpp
index 54bd8e1c3a..b4e0197b54 100644
--- a/fxjs/js_define.cpp
+++ b/fxjs/js_define.cpp
@@ -24,7 +24,7 @@ double GetLocalTZA() {
return 0;
time_t t = 0;
FXSYS_time(&t);
- localtime(&t);
+ FXSYS_localtime(&t);
#if _FX_PLATFORM_ == _FX_PLATFORM_WINDOWS_
// In gcc 'timezone' is a global variable declared in time.h. In VC++, that
// variable was removed in VC++ 2015, with _get_timezone replacing it.
@@ -38,7 +38,7 @@ int GetDaylightSavingTA(double d) {
if (!FSDK_IsSandBoxPolicyEnabled(FPDF_POLICY_MACHINETIME_ACCESS))
return 0;
time_t t = (time_t)(d / 1000);
- struct tm* tmp = localtime(&t);
+ struct tm* tmp = FXSYS_localtime(&t);
if (!tmp)
return 0;
if (tmp->tm_isdst > 0)
@@ -175,12 +175,10 @@ void JSDestructor(v8::Local<v8::Object> obj) {
double JS_GetDateTime() {
if (!FSDK_IsSandBoxPolicyEnabled(FPDF_POLICY_MACHINETIME_ACCESS))
return 0;
- time_t t = FXSYS_time(nullptr);
- struct tm* pTm = localtime(&t);
-
- int year = pTm->tm_year + 1900;
- double t1 = TimeFromYear(year);
+ time_t t = FXSYS_time(nullptr);
+ struct tm* pTm = FXSYS_localtime(&t);
+ double t1 = TimeFromYear(pTm->tm_year + 1900);
return t1 + pTm->tm_yday * 86400000.0 + pTm->tm_hour * 3600000.0 +
pTm->tm_min * 60000.0 + pTm->tm_sec * 1000.0;
}
diff --git a/public/fpdf_ext.h b/public/fpdf_ext.h
index a531f1407e..b1784dd66f 100644
--- a/public/fpdf_ext.h
+++ b/public/fpdf_ext.h
@@ -69,14 +69,25 @@ typedef struct _UNSUPPORT_INFO {
FPDF_EXPORT FPDF_BOOL FPDF_CALLCONV
FSDK_SetUnSpObjProcessHandler(UNSUPPORT_INFO* unsp_info);
-// Sets generator function for calls to time.
+// Set replacement function for calls to time().
//
// This API is intended to be used only for testing, thus may cause PDFium to
// behave poorly in production environments.
//
-// func - Function pointer to alternate implementation of time.
+// func - Function pointer to alternate implementation of time(), or
+// NULL to restore to actual time() call itself.
FPDF_EXPORT void FPDF_CALLCONV FSDK_SetTimeFunction(time_t (*func)());
+// Set replacement function for calls to localtime().
+//
+// This API is intended to be used only for testing, thus may cause PDFium to
+// behave poorly in production environments.
+//
+// func - Function pointer to alternate implementation of localtime(), or
+// NULL to restore to actual localtime() call itself.
+FPDF_EXPORT void FPDF_CALLCONV
+FSDK_SetLocaltimeFunction(struct tm* (*func)(const time_t*));
+
// Unknown page mode.
#define PAGEMODE_UNKNOWN -1
// Document outline, and thumbnails hidden.
diff --git a/samples/pdfium_test.cc b/samples/pdfium_test.cc
index ac24bcc326..6f70c34644 100644
--- a/samples/pdfium_test.cc
+++ b/samples/pdfium_test.cc
@@ -963,7 +963,8 @@ int main(int argc, const char* argv[]) {
// This must be a static var to avoid explicit capture, so the lambda can be
// converted to a function ptr.
static time_t time_ret = options.time;
- FSDK_SetTimeFunction([]() -> time_t { return time_ret; });
+ FSDK_SetTimeFunction([]() { return time_ret; });
+ FSDK_SetLocaltimeFunction([](const time_t* tp) { return gmtime(tp); });
}
for (const std::string& filename : files) {
diff --git a/testing/resources/javascript/public_methods.in b/testing/resources/javascript/public_methods.in
index 4b70375b91..07797671b9 100644
--- a/testing/resources/javascript/public_methods.in
+++ b/testing/resources/javascript/public_methods.in
@@ -166,7 +166,7 @@ endobj
expectError(undefined, "AFParseDateEx()");
expectError(undefined, "AFParseDateEx(1, 2, 3)");
- expect(undefined, "AFParseDateEx(1, 2)", "1399646930000");
+ expect(undefined, "AFParseDateEx(1, 2)", "1399672130000");
app.alert("**********************");
@@ -223,7 +223,7 @@ endobj
expectError(undefined, "AFTime_Format()");
expectError(undefined, "AFTime_Format(1, 2)");
- expectEventValue(undefined, "AFTime_Format(1)", "2:48 pm");
+ expectEventValue(undefined, "AFTime_Format(1)", "9:48 pm");
app.alert("**********************");
diff --git a/testing/resources/javascript/public_methods_expected.txt b/testing/resources/javascript/public_methods_expected.txt
index 12e8496af5..48928f51b9 100644
--- a/testing/resources/javascript/public_methods_expected.txt
+++ b/testing/resources/javascript/public_methods_expected.txt
@@ -55,7 +55,7 @@ Alert: PASS: AFNumber_Keystroke(1, 2, 3) = 123
Alert: **********************
Alert: PASS: AFParseDateEx() threw AFParseDateEx: Incorrect number of parameters passed to function.
Alert: PASS: AFParseDateEx(1, 2, 3) threw AFParseDateEx: Incorrect number of parameters passed to function.
-Alert: PASS: AFParseDateEx(1, 2) = 1399646930000
+Alert: PASS: AFParseDateEx(1, 2) = 1399672130000
Alert: **********************
Alert: PASS: AFPercent_Format() threw AFPercent_Format: Incorrect number of parameters passed to function.
Alert: PASS: AFPercent_Format(1, 2, 3) threw AFPercent_Format: Incorrect number of parameters passed to function.
@@ -96,7 +96,7 @@ Alert: PASS: AFSpecial_KeystrokeEx('999999') = 12
Alert: **********************
Alert: PASS: AFTime_Format() threw AFTime_Format: Incorrect number of parameters passed to function.
Alert: PASS: AFTime_Format(1, 2) threw AFTime_Format: Incorrect number of parameters passed to function.
-Alert: PASS: AFTime_Format(1) = 2:48 pm
+Alert: PASS: AFTime_Format(1) = 9:48 pm
Alert: **********************
Alert: PASS: AFTime_FormatEx() threw AFTime_FormatEx: Incorrect number of parameters passed to function.
Alert: PASS: AFTime_FormatEx('blooey', 42) threw AFTime_FormatEx: Incorrect number of parameters passed to function.
diff --git a/testing/resources/javascript/util_printd_expected.txt b/testing/resources/javascript/util_printd_expected.txt
index 2f077fc5fd..c609e34d1b 100644
--- a/testing/resources/javascript/util_printd_expected.txt
+++ b/testing/resources/javascript/util_printd_expected.txt
@@ -1,7 +1,7 @@
-Alert: mm/dd/yyyy HH:MM:ss: 07/04/2014 15:59:58
-Alert: 0: D:20140704155958
-Alert: 1: 2014.07.04 15:59:58
-Alert: 2: 2014/07/04 15:59:58
+Alert: mm/dd/yyyy HH:MM:ss: 07/04/2014 14:59:58
+Alert: 0: D:20140704145958
+Alert: 1: 2014.07.04 14:59:58
+Alert: 2: 2014/07/04 14:59:58
Alert: 3: Caught error: util.printd: Incorrect parameter value.
Alert: mmmm: July
Alert: mmm: Jul
@@ -13,9 +13,9 @@ Alert: dd: 04
Alert: d: 4
Alert: yyyy: 2014
Alert: yy: 14
-Alert: HH: 15
-Alert: H: 15
-Alert: hh: 03
+Alert: HH: 14
+Alert: H: 14
+Alert: hh: 02
Alert: MM: 59
Alert: M: 59
Alert: ss: 58
@@ -23,7 +23,7 @@ Alert: s: 58
Alert: t: t
Alert: abc.efg.i.kl.nopqr..uvwxyzABC.EFG.I.KL.NOPQR..UVWXYZ0123456780: abc.efg.i.kl.nopqr..uvwxyzABC.EFG.I.KL.NOPQR..UVWXYZ0123456780
Alert: !@#$^&*()-_<>[];:~: !@#$^&*()-_<>[];:~
-Alert: %z %d %%z %%d %%%z %%%d %%% hh:MM: z 4 z 4 z 4 03:59
+Alert: %z %d %%z %%d %%%z %%%d %%% hh:MM: z 4 z 4 z 4 02:59
Alert: :
Alert: mm/dd/yyyy: 07/04/2014
Alert: mm/dd/yyyy: 12/31/1849
@@ -39,16 +39,16 @@ Alert: clams,3: Caught error: util.printd: Incorrect parameter type.
Alert: mm: 07
Alert: mm: Caught error: util.printd: Operation not supported.
Alert: mm/dd/yyyy HH:MM:ss: 07/03/1900 15:59:58
-Alert: mm/dd/yyyy HH:MM:ss: 09/04/2015 15:59:58
+Alert: mm/dd/yyyy HH:MM:ss: 09/04/2015 14:59:58
Alert: mm/dd/yyyy HH:MM:ss: 12/09/2015 15:59:58
-Alert: mm/dd/yyyy HH:MM:ss: 07/06/2014 02:59:58
-Alert: mm/dd/yyyy HH:MM:ss: 07/05/2014 11:34:58
-Alert: mm/dd/yyyy HH:MM:ss: 07/04/2014 16:00:05
-Alert: mm/dd/yyyy HH:MM:ss: 05/01/2014 15:59:58
+Alert: mm/dd/yyyy HH:MM:ss: 07/06/2014 01:59:58
+Alert: mm/dd/yyyy HH:MM:ss: 07/05/2014 10:34:58
+Alert: mm/dd/yyyy HH:MM:ss: 07/04/2014 15:00:05
+Alert: mm/dd/yyyy HH:MM:ss: 05/01/2014 14:59:58
Alert: mm/dd/yyyy HH:MM:ss: 03/02/2014 15:59:58
Alert: mm/dd/yyyy HH:MM:ss: Caught error: util.printd: Incorrect parameter value.
Alert: mm/dd/yyyy HH:MM:ss: 12/30/2013 15:59:58
-Alert: mm/dd/yyyy HH:MM:ss: 06/29/2014 15:59:58
-Alert: mm/dd/yyyy HH:MM:ss: 07/03/2014 23:59:58
-Alert: mm/dd/yyyy HH:MM:ss: 07/04/2014 14:59:58
-Alert: mm/dd/yyyy HH:MM:ss: 07/04/2014 15:58:59
+Alert: mm/dd/yyyy HH:MM:ss: 06/29/2014 14:59:58
+Alert: mm/dd/yyyy HH:MM:ss: 07/03/2014 22:59:58
+Alert: mm/dd/yyyy HH:MM:ss: 07/04/2014 13:59:58
+Alert: mm/dd/yyyy HH:MM:ss: 07/04/2014 14:58:59
diff --git a/testing/tools/api_check.py b/testing/tools/api_check.py
index 934577b21b..da2869f2fe 100755
--- a/testing/tools/api_check.py
+++ b/testing/tools/api_check.py
@@ -20,9 +20,7 @@ import sys
def _IsValidFunctionName(function, filename):
if function.startswith('FPDF'):
return True
- if function == 'FSDK_SetUnSpObjProcessHandler' and filename == 'fpdf_ext.h':
- return True
- if function == 'FSDK_SetTimeFunction' and filename == 'fpdf_ext.h':
+ if function.startswith('FSDK_') and filename == 'fpdf_ext.h':
return True
if function.startswith('FORM_') and filename == 'fpdf_formfill.h':
return True