OLD | NEW |
1 // Copyright 2014 PDFium Authors. All rights reserved. | 1 // Copyright 2014 PDFium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 // Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com | 5 // Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com |
6 | 6 |
7 #include "../../include/javascript/JavaScript.h" | 7 #include "../../include/javascript/JavaScript.h" |
8 #include "../../include/javascript/JS_Define.h" | 8 #include "../../include/javascript/JS_Define.h" |
9 #include "../../include/javascript/JS_Object.h" | 9 #include "../../include/javascript/JS_Object.h" |
10 #include "../../include/javascript/JS_Value.h" | 10 #include "../../include/javascript/JS_Value.h" |
11 #include "../../include/javascript/Document.h" | 11 #include "../../include/javascript/Document.h" |
12 | 12 |
| 13 static const FX_DWORD g_nan[2] = {0, 0x7FF80000}; |
| 14 static double GetNan() { |
| 15 return *(double*)g_nan; |
| 16 } |
| 17 |
13 /* ---------------------------- CJS_Value ---------------------------- */ | 18 /* ---------------------------- CJS_Value ---------------------------- */ |
14 | 19 |
15 CJS_Value::CJS_Value(v8::Isolate* isolate) | 20 CJS_Value::CJS_Value(v8::Isolate* isolate) |
16 : m_eType(VT_unknown), m_isolate(isolate) {} | 21 : m_eType(VT_unknown), m_isolate(isolate) {} |
17 CJS_Value::CJS_Value(v8::Isolate* isolate, | 22 CJS_Value::CJS_Value(v8::Isolate* isolate, v8::Local<v8::Value> pValue, Type t) |
18 v8::Local<v8::Value> pValue, | 23 : m_eType(t), m_pValue(pValue), m_isolate(isolate) { |
19 FXJSVALUETYPE t) | 24 } |
20 : m_pValue(pValue), m_eType(t), m_isolate(isolate) {} | |
21 | 25 |
22 CJS_Value::CJS_Value(v8::Isolate* isolate, const int& iValue) | 26 CJS_Value::CJS_Value(v8::Isolate* isolate, const int& iValue) |
23 : m_isolate(isolate) { | 27 : m_isolate(isolate) { |
24 operator=(iValue); | 28 operator=(iValue); |
25 } | 29 } |
26 | 30 |
27 CJS_Value::CJS_Value(v8::Isolate* isolate, const bool& bValue) | 31 CJS_Value::CJS_Value(v8::Isolate* isolate, const bool& bValue) |
28 : m_isolate(isolate) { | 32 : m_isolate(isolate) { |
29 operator=(bValue); | 33 operator=(bValue); |
30 } | 34 } |
(...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
66 operator=(pStr); | 70 operator=(pStr); |
67 } | 71 } |
68 | 72 |
69 CJS_Value::CJS_Value(v8::Isolate* isolate, CJS_Array& array) | 73 CJS_Value::CJS_Value(v8::Isolate* isolate, CJS_Array& array) |
70 : m_isolate(isolate) { | 74 : m_isolate(isolate) { |
71 operator=(array); | 75 operator=(array); |
72 } | 76 } |
73 | 77 |
74 CJS_Value::~CJS_Value() {} | 78 CJS_Value::~CJS_Value() {} |
75 | 79 |
76 void CJS_Value::Attach(v8::Local<v8::Value> pValue, FXJSVALUETYPE t) { | 80 void CJS_Value::Attach(v8::Local<v8::Value> pValue, Type t) { |
77 m_pValue = pValue; | 81 m_pValue = pValue; |
78 m_eType = t; | 82 m_eType = t; |
79 } | 83 } |
80 | 84 |
81 void CJS_Value::Attach(CJS_Value* pValue) { | 85 void CJS_Value::Attach(CJS_Value* pValue) { |
82 if (pValue) | 86 if (pValue) |
83 Attach(pValue->ToV8Value(), pValue->GetType()); | 87 Attach(pValue->ToV8Value(), pValue->GetType()); |
84 } | 88 } |
85 | 89 |
86 void CJS_Value::Detach() { | 90 void CJS_Value::Detach() { |
87 m_pValue = v8::Local<v8::Value>(); | 91 m_pValue = v8::Local<v8::Value>(); |
88 m_eType = VT_unknown; | 92 m_eType = VT_unknown; |
89 } | 93 } |
90 | 94 |
91 /* -----------------------------------------------------------------------------
----------- | 95 /* -----------------------------------------------------------------------------
----------- |
92 */ | 96 */ |
93 | 97 |
94 int CJS_Value::ToInt() const { | 98 int CJS_Value::ToInt() const { |
95 return JS_ToInt32(m_isolate, m_pValue); | 99 return FXJS_ToInt32(m_isolate, m_pValue); |
96 } | 100 } |
97 | 101 |
98 bool CJS_Value::ToBool() const { | 102 bool CJS_Value::ToBool() const { |
99 return JS_ToBoolean(m_isolate, m_pValue); | 103 return FXJS_ToBoolean(m_isolate, m_pValue); |
100 } | 104 } |
101 | 105 |
102 double CJS_Value::ToDouble() const { | 106 double CJS_Value::ToDouble() const { |
103 return JS_ToNumber(m_isolate, m_pValue); | 107 return FXJS_ToNumber(m_isolate, m_pValue); |
104 } | 108 } |
105 | 109 |
106 float CJS_Value::ToFloat() const { | 110 float CJS_Value::ToFloat() const { |
107 return (float)ToDouble(); | 111 return (float)ToDouble(); |
108 } | 112 } |
109 | 113 |
110 CJS_Object* CJS_Value::ToCJSObject() const { | 114 CJS_Object* CJS_Value::ToCJSObject() const { |
111 v8::Local<v8::Object> pObj = JS_ToObject(m_isolate, m_pValue); | 115 v8::Local<v8::Object> pObj = FXJS_ToObject(m_isolate, m_pValue); |
112 return (CJS_Object*)JS_GetPrivate(m_isolate, pObj); | 116 return (CJS_Object*)FXJS_GetPrivate(m_isolate, pObj); |
113 } | 117 } |
114 | 118 |
115 v8::Local<v8::Object> CJS_Value::ToV8Object() const { | 119 v8::Local<v8::Object> CJS_Value::ToV8Object() const { |
116 return JS_ToObject(m_isolate, m_pValue); | 120 return FXJS_ToObject(m_isolate, m_pValue); |
117 } | 121 } |
118 | 122 |
119 CFX_WideString CJS_Value::ToCFXWideString() const { | 123 CFX_WideString CJS_Value::ToCFXWideString() const { |
120 return JS_ToString(m_isolate, m_pValue); | 124 return FXJS_ToString(m_isolate, m_pValue); |
121 } | 125 } |
122 | 126 |
123 CFX_ByteString CJS_Value::ToCFXByteString() const { | 127 CFX_ByteString CJS_Value::ToCFXByteString() const { |
124 return CFX_ByteString::FromUnicode(ToCFXWideString()); | 128 return CFX_ByteString::FromUnicode(ToCFXWideString()); |
125 } | 129 } |
126 | 130 |
127 v8::Local<v8::Value> CJS_Value::ToV8Value() const { | 131 v8::Local<v8::Value> CJS_Value::ToV8Value() const { |
128 return m_pValue; | 132 return m_pValue; |
129 } | 133 } |
130 | 134 |
131 v8::Local<v8::Array> CJS_Value::ToV8Array() const { | 135 v8::Local<v8::Array> CJS_Value::ToV8Array() const { |
132 if (IsArrayObject()) | 136 if (IsArrayObject()) |
133 return v8::Local<v8::Array>::Cast(JS_ToObject(m_isolate, m_pValue)); | 137 return v8::Local<v8::Array>::Cast(FXJS_ToObject(m_isolate, m_pValue)); |
134 return v8::Local<v8::Array>(); | 138 return v8::Local<v8::Array>(); |
135 } | 139 } |
136 | 140 |
137 /* -----------------------------------------------------------------------------
----------- | 141 /* -----------------------------------------------------------------------------
----------- |
138 */ | 142 */ |
139 | 143 |
140 void CJS_Value::operator=(int iValue) { | 144 void CJS_Value::operator=(int iValue) { |
141 m_pValue = JS_NewNumber(m_isolate, iValue); | 145 m_pValue = FXJS_NewNumber(m_isolate, iValue); |
142 | |
143 m_eType = VT_number; | 146 m_eType = VT_number; |
144 } | 147 } |
145 | 148 |
146 void CJS_Value::operator=(bool bValue) { | 149 void CJS_Value::operator=(bool bValue) { |
147 m_pValue = JS_NewBoolean(m_isolate, bValue); | 150 m_pValue = FXJS_NewBoolean(m_isolate, bValue); |
148 | |
149 m_eType = VT_boolean; | 151 m_eType = VT_boolean; |
150 } | 152 } |
151 | 153 |
152 void CJS_Value::operator=(double dValue) { | 154 void CJS_Value::operator=(double dValue) { |
153 m_pValue = JS_NewNumber(m_isolate, dValue); | 155 m_pValue = FXJS_NewNumber(m_isolate, dValue); |
154 | |
155 m_eType = VT_number; | 156 m_eType = VT_number; |
156 } | 157 } |
157 | 158 |
158 void CJS_Value::operator=(float fValue) { | 159 void CJS_Value::operator=(float fValue) { |
159 m_pValue = JS_NewNumber(m_isolate, fValue); | 160 m_pValue = FXJS_NewNumber(m_isolate, fValue); |
160 m_eType = VT_number; | 161 m_eType = VT_number; |
161 } | 162 } |
162 | 163 |
163 void CJS_Value::operator=(v8::Local<v8::Object> pObj) { | 164 void CJS_Value::operator=(v8::Local<v8::Object> pObj) { |
164 m_pValue = JS_NewObject(m_isolate, pObj); | 165 m_pValue = FXJS_NewObject(m_isolate, pObj); |
165 | |
166 m_eType = VT_fxobject; | 166 m_eType = VT_fxobject; |
167 } | 167 } |
168 | 168 |
169 void CJS_Value::operator=(CJS_Object* pObj) { | 169 void CJS_Value::operator=(CJS_Object* pObj) { |
170 if (pObj) | 170 if (pObj) |
171 operator=((v8::Local<v8::Object>)*pObj); | 171 operator=((v8::Local<v8::Object>)*pObj); |
172 } | 172 } |
173 | 173 |
174 void CJS_Value::operator=(CJS_Document* pJsDoc) { | 174 void CJS_Value::operator=(CJS_Document* pJsDoc) { |
175 m_eType = VT_object; | 175 m_eType = VT_object; |
176 if (pJsDoc) { | 176 if (pJsDoc) { |
177 m_pValue = static_cast<v8::Local<v8::Object>>(*pJsDoc); | 177 m_pValue = static_cast<v8::Local<v8::Object>>(*pJsDoc); |
178 } | 178 } |
179 } | 179 } |
180 | 180 |
181 void CJS_Value::operator=(const FX_WCHAR* pWstr) { | 181 void CJS_Value::operator=(const FX_WCHAR* pWstr) { |
182 m_pValue = JS_NewString(m_isolate, (wchar_t*)pWstr); | 182 m_pValue = FXJS_NewString(m_isolate, (wchar_t*)pWstr); |
183 | |
184 m_eType = VT_string; | 183 m_eType = VT_string; |
185 } | 184 } |
186 | 185 |
187 void CJS_Value::SetNull() { | 186 void CJS_Value::SetNull() { |
188 m_pValue = JS_NewNull(); | 187 m_pValue = FXJS_NewNull(); |
189 | |
190 m_eType = VT_null; | 188 m_eType = VT_null; |
191 } | 189 } |
192 | 190 |
193 void CJS_Value::operator=(const FX_CHAR* pStr) { | 191 void CJS_Value::operator=(const FX_CHAR* pStr) { |
194 operator=(CFX_WideString::FromLocal(pStr).c_str()); | 192 operator=(CFX_WideString::FromLocal(pStr).c_str()); |
195 } | 193 } |
196 | 194 |
197 void CJS_Value::operator=(CJS_Array& array) { | 195 void CJS_Value::operator=(CJS_Array& array) { |
198 m_pValue = JS_NewObject2(m_isolate, (v8::Local<v8::Array>)array); | 196 m_pValue = FXJS_NewObject2(m_isolate, (v8::Local<v8::Array>)array); |
199 | |
200 m_eType = VT_object; | 197 m_eType = VT_object; |
201 } | 198 } |
202 | 199 |
203 void CJS_Value::operator=(CJS_Date& date) { | 200 void CJS_Value::operator=(CJS_Date& date) { |
204 m_pValue = JS_NewDate(m_isolate, (double)date); | 201 m_pValue = FXJS_NewDate(m_isolate, (double)date); |
205 | |
206 m_eType = VT_date; | 202 m_eType = VT_date; |
207 } | 203 } |
208 | 204 |
209 void CJS_Value::operator=(CJS_Value value) { | 205 void CJS_Value::operator=(CJS_Value value) { |
210 m_pValue = value.ToV8Value(); | 206 m_pValue = value.ToV8Value(); |
211 | |
212 m_eType = value.m_eType; | 207 m_eType = value.m_eType; |
213 m_isolate = value.m_isolate; | 208 m_isolate = value.m_isolate; |
214 } | 209 } |
215 | 210 |
216 /* -----------------------------------------------------------------------------
----------- | 211 /* -----------------------------------------------------------------------------
----------- |
217 */ | 212 */ |
218 | 213 |
219 FXJSVALUETYPE CJS_Value::GetType() const { | 214 CJS_Value::Type CJS_Value::GetType() const { |
220 if (m_pValue.IsEmpty()) | 215 if (m_pValue.IsEmpty()) |
221 return VT_unknown; | 216 return VT_unknown; |
222 if (m_pValue->IsString()) | 217 if (m_pValue->IsString()) |
223 return VT_string; | 218 return VT_string; |
224 if (m_pValue->IsNumber()) | 219 if (m_pValue->IsNumber()) |
225 return VT_number; | 220 return VT_number; |
226 if (m_pValue->IsBoolean()) | 221 if (m_pValue->IsBoolean()) |
227 return VT_boolean; | 222 return VT_boolean; |
228 if (m_pValue->IsDate()) | 223 if (m_pValue->IsDate()) |
229 return VT_date; | 224 return VT_date; |
(...skipping 14 matching lines...) Expand all Loading... |
244 | 239 |
245 FX_BOOL CJS_Value::IsDateObject() const { | 240 FX_BOOL CJS_Value::IsDateObject() const { |
246 if (m_pValue.IsEmpty()) | 241 if (m_pValue.IsEmpty()) |
247 return FALSE; | 242 return FALSE; |
248 return m_pValue->IsDate(); | 243 return m_pValue->IsDate(); |
249 } | 244 } |
250 | 245 |
251 // CJS_Value::operator CJS_Array() | 246 // CJS_Value::operator CJS_Array() |
252 FX_BOOL CJS_Value::ConvertToArray(CJS_Array& array) const { | 247 FX_BOOL CJS_Value::ConvertToArray(CJS_Array& array) const { |
253 if (IsArrayObject()) { | 248 if (IsArrayObject()) { |
254 array.Attach(JS_ToArray(m_isolate, m_pValue)); | 249 array.Attach(FXJS_ToArray(m_isolate, m_pValue)); |
255 return TRUE; | 250 return TRUE; |
256 } | 251 } |
257 | 252 |
258 return FALSE; | 253 return FALSE; |
259 } | 254 } |
260 | 255 |
261 FX_BOOL CJS_Value::ConvertToDate(CJS_Date& date) const { | 256 FX_BOOL CJS_Value::ConvertToDate(CJS_Date& date) const { |
262 // if (GetType() == VT_date) | 257 // if (GetType() == VT_date) |
263 // { | 258 // { |
264 // date = (double)(*this); | 259 // date = (double)(*this); |
(...skipping 152 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
417 m_pArray = pArray; | 412 m_pArray = pArray; |
418 } | 413 } |
419 | 414 |
420 FX_BOOL CJS_Array::IsAttached() { | 415 FX_BOOL CJS_Array::IsAttached() { |
421 return FALSE; | 416 return FALSE; |
422 } | 417 } |
423 | 418 |
424 void CJS_Array::GetElement(unsigned index, CJS_Value& value) { | 419 void CJS_Array::GetElement(unsigned index, CJS_Value& value) { |
425 if (m_pArray.IsEmpty()) | 420 if (m_pArray.IsEmpty()) |
426 return; | 421 return; |
427 v8::Local<v8::Value> p = JS_GetArrayElement(m_isolate, m_pArray, index); | 422 v8::Local<v8::Value> p = FXJS_GetArrayElement(m_isolate, m_pArray, index); |
428 value.Attach(p, VT_object); | 423 value.Attach(p, CJS_Value::VT_object); |
429 } | 424 } |
430 | 425 |
431 void CJS_Array::SetElement(unsigned index, CJS_Value value) { | 426 void CJS_Array::SetElement(unsigned index, CJS_Value value) { |
432 if (m_pArray.IsEmpty()) | 427 if (m_pArray.IsEmpty()) |
433 m_pArray = JS_NewArray(m_isolate); | 428 m_pArray = FXJS_NewArray(m_isolate); |
434 | 429 |
435 JS_PutArrayElement(m_isolate, m_pArray, index, value.ToV8Value(), | 430 FXJS_PutArrayElement(m_isolate, m_pArray, index, value.ToV8Value()); |
436 value.GetType()); | |
437 } | 431 } |
438 | 432 |
439 int CJS_Array::GetLength() { | 433 int CJS_Array::GetLength() { |
440 if (m_pArray.IsEmpty()) | 434 if (m_pArray.IsEmpty()) |
441 return 0; | 435 return 0; |
442 return JS_GetArrayLength(m_pArray); | 436 return FXJS_GetArrayLength(m_pArray); |
443 } | 437 } |
444 | 438 |
445 CJS_Array::operator v8::Local<v8::Array>() { | 439 CJS_Array::operator v8::Local<v8::Array>() { |
446 if (m_pArray.IsEmpty()) | 440 if (m_pArray.IsEmpty()) |
447 m_pArray = JS_NewArray(m_isolate); | 441 m_pArray = FXJS_NewArray(m_isolate); |
448 | 442 |
449 return m_pArray; | 443 return m_pArray; |
450 } | 444 } |
451 | 445 |
452 /* ======================================== CJS_Date | 446 /* ======================================== CJS_Date |
453 * ========================================= */ | 447 * ========================================= */ |
454 | 448 |
455 CJS_Date::CJS_Date(v8::Isolate* isolate) : m_isolate(isolate) {} | 449 CJS_Date::CJS_Date(v8::Isolate* isolate) : m_isolate(isolate) {} |
456 | 450 |
457 CJS_Date::CJS_Date(v8::Isolate* isolate, double dMsec_time) { | 451 CJS_Date::CJS_Date(v8::Isolate* isolate, double dMsec_time) { |
458 m_isolate = isolate; | 452 m_isolate = isolate; |
459 m_pDate = JS_NewDate(isolate, dMsec_time); | 453 m_pDate = FXJS_NewDate(isolate, dMsec_time); |
460 } | 454 } |
461 | 455 |
462 CJS_Date::CJS_Date(v8::Isolate* isolate, | 456 CJS_Date::CJS_Date(v8::Isolate* isolate, |
463 int year, | 457 int year, |
464 int mon, | 458 int mon, |
465 int day, | 459 int day, |
466 int hour, | 460 int hour, |
467 int min, | 461 int min, |
468 int sec) { | 462 int sec) { |
469 m_isolate = isolate; | 463 m_isolate = isolate; |
470 m_pDate = JS_NewDate(isolate, MakeDate(year, mon, day, hour, min, sec, 0)); | 464 m_pDate = FXJS_NewDate(isolate, MakeDate(year, mon, day, hour, min, sec, 0)); |
471 } | 465 } |
472 | 466 |
473 double CJS_Date::MakeDate(int year, | 467 double CJS_Date::MakeDate(int year, |
474 int mon, | 468 int mon, |
475 int day, | 469 int day, |
476 int hour, | 470 int hour, |
477 int min, | 471 int min, |
478 int sec, | 472 int sec, |
479 int ms) { | 473 int ms) { |
480 return JS_MakeDate(JS_MakeDay(year, mon, day), | 474 return JS_MakeDate(JS_MakeDay(year, mon, day), |
481 JS_MakeTime(hour, min, sec, ms)); | 475 JS_MakeTime(hour, min, sec, ms)); |
482 } | 476 } |
483 | 477 |
484 CJS_Date::~CJS_Date() {} | 478 CJS_Date::~CJS_Date() {} |
485 | 479 |
486 FX_BOOL CJS_Date::IsValidDate() { | 480 FX_BOOL CJS_Date::IsValidDate() { |
487 if (m_pDate.IsEmpty()) | 481 if (m_pDate.IsEmpty()) |
488 return FALSE; | 482 return FALSE; |
489 return !JS_PortIsNan(JS_ToNumber(m_isolate, m_pDate)); | 483 return !JS_PortIsNan(FXJS_ToNumber(m_isolate, m_pDate)); |
490 } | 484 } |
491 | 485 |
492 void CJS_Date::Attach(v8::Local<v8::Value> pDate) { | 486 void CJS_Date::Attach(v8::Local<v8::Value> pDate) { |
493 m_pDate = pDate; | 487 m_pDate = pDate; |
494 } | 488 } |
495 | 489 |
496 int CJS_Date::GetYear() { | 490 int CJS_Date::GetYear() { |
497 if (IsValidDate()) | 491 if (IsValidDate()) |
498 return JS_GetYearFromTime(JS_LocalTime(JS_ToNumber(m_isolate, m_pDate))); | 492 return JS_GetYearFromTime(JS_LocalTime(FXJS_ToNumber(m_isolate, m_pDate))); |
499 | 493 |
500 return 0; | 494 return 0; |
501 } | 495 } |
502 | 496 |
503 void CJS_Date::SetYear(int iYear) { | 497 void CJS_Date::SetYear(int iYear) { |
504 double date = MakeDate(iYear, GetMonth(), GetDay(), GetHours(), GetMinutes(), | 498 double date = MakeDate(iYear, GetMonth(), GetDay(), GetHours(), GetMinutes(), |
505 GetSeconds(), 0); | 499 GetSeconds(), 0); |
506 JS_ValueCopy(m_pDate, JS_NewDate(m_isolate, date)); | 500 FXJS_ValueCopy(m_pDate, FXJS_NewDate(m_isolate, date)); |
507 } | 501 } |
508 | 502 |
509 int CJS_Date::GetMonth() { | 503 int CJS_Date::GetMonth() { |
510 if (IsValidDate()) | 504 if (IsValidDate()) |
511 return JS_GetMonthFromTime(JS_LocalTime(JS_ToNumber(m_isolate, m_pDate))); | 505 return JS_GetMonthFromTime(JS_LocalTime(FXJS_ToNumber(m_isolate, m_pDate))); |
512 | 506 |
513 return 0; | 507 return 0; |
514 } | 508 } |
515 | 509 |
516 void CJS_Date::SetMonth(int iMonth) { | 510 void CJS_Date::SetMonth(int iMonth) { |
517 double date = MakeDate(GetYear(), iMonth, GetDay(), GetHours(), GetMinutes(), | 511 double date = MakeDate(GetYear(), iMonth, GetDay(), GetHours(), GetMinutes(), |
518 GetSeconds(), 0); | 512 GetSeconds(), 0); |
519 JS_ValueCopy(m_pDate, JS_NewDate(m_isolate, date)); | 513 FXJS_ValueCopy(m_pDate, FXJS_NewDate(m_isolate, date)); |
520 } | 514 } |
521 | 515 |
522 int CJS_Date::GetDay() { | 516 int CJS_Date::GetDay() { |
523 if (IsValidDate()) | 517 if (IsValidDate()) |
524 return JS_GetDayFromTime(JS_LocalTime(JS_ToNumber(m_isolate, m_pDate))); | 518 return JS_GetDayFromTime(JS_LocalTime(FXJS_ToNumber(m_isolate, m_pDate))); |
525 | 519 |
526 return 0; | 520 return 0; |
527 } | 521 } |
528 | 522 |
529 void CJS_Date::SetDay(int iDay) { | 523 void CJS_Date::SetDay(int iDay) { |
530 double date = MakeDate(GetYear(), GetMonth(), iDay, GetHours(), GetMinutes(), | 524 double date = MakeDate(GetYear(), GetMonth(), iDay, GetHours(), GetMinutes(), |
531 GetSeconds(), 0); | 525 GetSeconds(), 0); |
532 JS_ValueCopy(m_pDate, JS_NewDate(m_isolate, date)); | 526 FXJS_ValueCopy(m_pDate, FXJS_NewDate(m_isolate, date)); |
533 } | 527 } |
534 | 528 |
535 int CJS_Date::GetHours() { | 529 int CJS_Date::GetHours() { |
536 if (IsValidDate()) | 530 if (IsValidDate()) |
537 return JS_GetHourFromTime(JS_LocalTime(JS_ToNumber(m_isolate, m_pDate))); | 531 return JS_GetHourFromTime(JS_LocalTime(FXJS_ToNumber(m_isolate, m_pDate))); |
538 | 532 |
539 return 0; | 533 return 0; |
540 } | 534 } |
541 | 535 |
542 void CJS_Date::SetHours(int iHours) { | 536 void CJS_Date::SetHours(int iHours) { |
543 double date = MakeDate(GetYear(), GetMonth(), GetDay(), iHours, GetMinutes(), | 537 double date = MakeDate(GetYear(), GetMonth(), GetDay(), iHours, GetMinutes(), |
544 GetSeconds(), 0); | 538 GetSeconds(), 0); |
545 JS_ValueCopy(m_pDate, JS_NewDate(m_isolate, date)); | 539 FXJS_ValueCopy(m_pDate, FXJS_NewDate(m_isolate, date)); |
546 } | 540 } |
547 | 541 |
548 int CJS_Date::GetMinutes() { | 542 int CJS_Date::GetMinutes() { |
549 if (IsValidDate()) | 543 if (IsValidDate()) |
550 return JS_GetMinFromTime(JS_LocalTime(JS_ToNumber(m_isolate, m_pDate))); | 544 return JS_GetMinFromTime(JS_LocalTime(FXJS_ToNumber(m_isolate, m_pDate))); |
551 | 545 |
552 return 0; | 546 return 0; |
553 } | 547 } |
554 | 548 |
555 void CJS_Date::SetMinutes(int minutes) { | 549 void CJS_Date::SetMinutes(int minutes) { |
556 double date = MakeDate(GetYear(), GetMonth(), GetDay(), GetHours(), minutes, | 550 double date = MakeDate(GetYear(), GetMonth(), GetDay(), GetHours(), minutes, |
557 GetSeconds(), 0); | 551 GetSeconds(), 0); |
558 JS_ValueCopy(m_pDate, JS_NewDate(m_isolate, date)); | 552 FXJS_ValueCopy(m_pDate, FXJS_NewDate(m_isolate, date)); |
559 } | 553 } |
560 | 554 |
561 int CJS_Date::GetSeconds() { | 555 int CJS_Date::GetSeconds() { |
562 if (IsValidDate()) | 556 if (IsValidDate()) |
563 return JS_GetSecFromTime(JS_LocalTime(JS_ToNumber(m_isolate, m_pDate))); | 557 return JS_GetSecFromTime(JS_LocalTime(FXJS_ToNumber(m_isolate, m_pDate))); |
564 | 558 |
565 return 0; | 559 return 0; |
566 } | 560 } |
567 | 561 |
568 void CJS_Date::SetSeconds(int seconds) { | 562 void CJS_Date::SetSeconds(int seconds) { |
569 double date = MakeDate(GetYear(), GetMonth(), GetDay(), GetHours(), | 563 double date = MakeDate(GetYear(), GetMonth(), GetDay(), GetHours(), |
570 GetMinutes(), seconds, 0); | 564 GetMinutes(), seconds, 0); |
571 JS_ValueCopy(m_pDate, JS_NewDate(m_isolate, date)); | 565 FXJS_ValueCopy(m_pDate, FXJS_NewDate(m_isolate, date)); |
572 } | 566 } |
573 | 567 |
574 CJS_Date::operator v8::Local<v8::Value>() { | 568 CJS_Date::operator v8::Local<v8::Value>() { |
575 return m_pDate; | 569 return m_pDate; |
576 } | 570 } |
577 | 571 |
578 CJS_Date::operator double() const { | 572 CJS_Date::operator double() const { |
579 if (m_pDate.IsEmpty()) | 573 if (m_pDate.IsEmpty()) |
580 return 0.0; | 574 return 0.0; |
581 return JS_ToNumber(m_isolate, m_pDate); | 575 return FXJS_ToNumber(m_isolate, m_pDate); |
582 } | 576 } |
583 | 577 |
584 CFX_WideString CJS_Date::ToString() const { | 578 CFX_WideString CJS_Date::ToString() const { |
585 if (m_pDate.IsEmpty()) | 579 if (m_pDate.IsEmpty()) |
586 return L""; | 580 return L""; |
587 return JS_ToString(m_isolate, m_pDate); | 581 return FXJS_ToString(m_isolate, m_pDate); |
588 } | 582 } |
| 583 |
| 584 double _getLocalTZA() { |
| 585 if (!FSDK_IsSandBoxPolicyEnabled(FPDF_POLICY_MACHINETIME_ACCESS)) |
| 586 return 0; |
| 587 time_t t = 0; |
| 588 time(&t); |
| 589 localtime(&t); |
| 590 #if _MSC_VER >= 1900 |
| 591 // In gcc and in Visual Studio prior to VS 2015 'timezone' is a global |
| 592 // variable declared in time.h. That variable was deprecated and in VS 2015 |
| 593 // is removed, with _get_timezone replacing it. |
| 594 long timezone = 0; |
| 595 _get_timezone(&timezone); |
| 596 #endif |
| 597 return (double)(-(timezone * 1000)); |
| 598 } |
| 599 |
| 600 int _getDaylightSavingTA(double d) { |
| 601 if (!FSDK_IsSandBoxPolicyEnabled(FPDF_POLICY_MACHINETIME_ACCESS)) |
| 602 return 0; |
| 603 time_t t = (time_t)(d / 1000); |
| 604 struct tm* tmp = localtime(&t); |
| 605 if (tmp == NULL) |
| 606 return 0; |
| 607 if (tmp->tm_isdst > 0) |
| 608 // One hour. |
| 609 return (int)60 * 60 * 1000; |
| 610 return 0; |
| 611 } |
| 612 |
| 613 double _Mod(double x, double y) { |
| 614 double r = fmod(x, y); |
| 615 if (r < 0) |
| 616 r += y; |
| 617 return r; |
| 618 } |
| 619 |
| 620 int _isfinite(double v) { |
| 621 #if _MSC_VER |
| 622 return ::_finite(v); |
| 623 #else |
| 624 return std::fabs(v) < std::numeric_limits<double>::max(); |
| 625 #endif |
| 626 } |
| 627 |
| 628 double _toInteger(double n) { |
| 629 return (n >= 0) ? FXSYS_floor(n) : -FXSYS_floor(-n); |
| 630 } |
| 631 |
| 632 bool _isLeapYear(int year) { |
| 633 return (year % 4 == 0) && ((year % 100 != 0) || (year % 400 != 0)); |
| 634 } |
| 635 |
| 636 int _DayFromYear(int y) { |
| 637 return (int)(365 * (y - 1970.0) + FXSYS_floor((y - 1969.0) / 4) - |
| 638 FXSYS_floor((y - 1901.0) / 100) + |
| 639 FXSYS_floor((y - 1601.0) / 400)); |
| 640 } |
| 641 |
| 642 double _TimeFromYear(int y) { |
| 643 return ((double)86400000) * _DayFromYear(y); |
| 644 } |
| 645 |
| 646 double _TimeFromYearMonth(int y, int m) { |
| 647 static int daysMonth[12] = { |
| 648 0, 31, 59, 90, 120, 151, 181, 212, 243, 273, 304, 334}; |
| 649 static int leapDaysMonth[12] = { |
| 650 0, 31, 60, 91, 121, 152, 182, 213, 244, 274, 305, 335}; |
| 651 int* pMonth = daysMonth; |
| 652 if (_isLeapYear(y)) |
| 653 pMonth = leapDaysMonth; |
| 654 return _TimeFromYear(y) + ((double)pMonth[m]) * 86400000; |
| 655 } |
| 656 |
| 657 int _Day(double t) { |
| 658 return (int)FXSYS_floor(t / 86400000); |
| 659 } |
| 660 |
| 661 int _YearFromTime(double t) { |
| 662 // estimate the time. |
| 663 int y = 1970 + (int)(t / (365.0 * 86400000)); |
| 664 if (_TimeFromYear(y) <= t) { |
| 665 while (_TimeFromYear(y + 1) <= t) |
| 666 y++; |
| 667 } else |
| 668 while (_TimeFromYear(y - 1) > t) |
| 669 y--; |
| 670 return y; |
| 671 } |
| 672 |
| 673 int _DayWithinYear(double t) { |
| 674 int year = _YearFromTime(t); |
| 675 int day = _Day(t); |
| 676 return day - _DayFromYear(year); |
| 677 } |
| 678 |
| 679 int _MonthFromTime(double t) { |
| 680 int day = _DayWithinYear(t); |
| 681 int year = _YearFromTime(t); |
| 682 if (0 <= day && day < 31) |
| 683 return 0; |
| 684 if (31 <= day && day < 59 + _isLeapYear(year)) |
| 685 return 1; |
| 686 if ((59 + _isLeapYear(year)) <= day && day < (90 + _isLeapYear(year))) |
| 687 return 2; |
| 688 if ((90 + _isLeapYear(year)) <= day && day < (120 + _isLeapYear(year))) |
| 689 return 3; |
| 690 if ((120 + _isLeapYear(year)) <= day && day < (151 + _isLeapYear(year))) |
| 691 return 4; |
| 692 if ((151 + _isLeapYear(year)) <= day && day < (181 + _isLeapYear(year))) |
| 693 return 5; |
| 694 if ((181 + _isLeapYear(year)) <= day && day < (212 + _isLeapYear(year))) |
| 695 return 6; |
| 696 if ((212 + _isLeapYear(year)) <= day && day < (243 + _isLeapYear(year))) |
| 697 return 7; |
| 698 if ((243 + _isLeapYear(year)) <= day && day < (273 + _isLeapYear(year))) |
| 699 return 8; |
| 700 if ((273 + _isLeapYear(year)) <= day && day < (304 + _isLeapYear(year))) |
| 701 return 9; |
| 702 if ((304 + _isLeapYear(year)) <= day && day < (334 + _isLeapYear(year))) |
| 703 return 10; |
| 704 if ((334 + _isLeapYear(year)) <= day && day < (365 + _isLeapYear(year))) |
| 705 return 11; |
| 706 |
| 707 return -1; |
| 708 } |
| 709 |
| 710 int _DateFromTime(double t) { |
| 711 int day = _DayWithinYear(t); |
| 712 int year = _YearFromTime(t); |
| 713 bool leap = _isLeapYear(year); |
| 714 int month = _MonthFromTime(t); |
| 715 switch (month) { |
| 716 case 0: |
| 717 return day + 1; |
| 718 case 1: |
| 719 return day - 30; |
| 720 case 2: |
| 721 return day - 58 - leap; |
| 722 case 3: |
| 723 return day - 89 - leap; |
| 724 case 4: |
| 725 return day - 119 - leap; |
| 726 case 5: |
| 727 return day - 150 - leap; |
| 728 case 6: |
| 729 return day - 180 - leap; |
| 730 case 7: |
| 731 return day - 211 - leap; |
| 732 case 8: |
| 733 return day - 242 - leap; |
| 734 case 9: |
| 735 return day - 272 - leap; |
| 736 case 10: |
| 737 return day - 303 - leap; |
| 738 case 11: |
| 739 return day - 333 - leap; |
| 740 default: |
| 741 return 0; |
| 742 } |
| 743 } |
| 744 |
| 745 double JS_GetDateTime() { |
| 746 if (!FSDK_IsSandBoxPolicyEnabled(FPDF_POLICY_MACHINETIME_ACCESS)) |
| 747 return 0; |
| 748 time_t t = time(NULL); |
| 749 struct tm* pTm = localtime(&t); |
| 750 |
| 751 int year = pTm->tm_year + 1900; |
| 752 double t1 = _TimeFromYear(year); |
| 753 |
| 754 return t1 + pTm->tm_yday * 86400000.0 + pTm->tm_hour * 3600000.0 + |
| 755 pTm->tm_min * 60000.0 + pTm->tm_sec * 1000.0; |
| 756 } |
| 757 |
| 758 int JS_GetYearFromTime(double dt) { |
| 759 return _YearFromTime(dt); |
| 760 } |
| 761 |
| 762 int JS_GetMonthFromTime(double dt) { |
| 763 return _MonthFromTime(dt); |
| 764 } |
| 765 |
| 766 int JS_GetDayFromTime(double dt) { |
| 767 return _DateFromTime(dt); |
| 768 } |
| 769 |
| 770 int JS_GetHourFromTime(double dt) { |
| 771 return (int)_Mod(FXSYS_floor((double)(dt / (60 * 60 * 1000))), 24); |
| 772 } |
| 773 |
| 774 int JS_GetMinFromTime(double dt) { |
| 775 return (int)_Mod(FXSYS_floor((double)(dt / (60 * 1000))), 60); |
| 776 } |
| 777 |
| 778 int JS_GetSecFromTime(double dt) { |
| 779 return (int)_Mod(FXSYS_floor((double)(dt / 1000)), 60); |
| 780 } |
| 781 |
| 782 double JS_DateParse(const wchar_t* string) { |
| 783 v8::Isolate* pIsolate = v8::Isolate::GetCurrent(); |
| 784 v8::Isolate::Scope isolate_scope(pIsolate); |
| 785 v8::HandleScope scope(pIsolate); |
| 786 |
| 787 v8::Local<v8::Context> context = pIsolate->GetCurrentContext(); |
| 788 |
| 789 // Use the built-in object method. |
| 790 v8::Local<v8::Value> v = |
| 791 context->Global() |
| 792 ->Get(context, v8::String::NewFromUtf8(pIsolate, "Date", |
| 793 v8::NewStringType::kNormal) |
| 794 .ToLocalChecked()) |
| 795 .ToLocalChecked(); |
| 796 if (v->IsObject()) { |
| 797 v8::Local<v8::Object> o = v->ToObject(context).ToLocalChecked(); |
| 798 v = o->Get(context, v8::String::NewFromUtf8(pIsolate, "parse", |
| 799 v8::NewStringType::kNormal) |
| 800 .ToLocalChecked()).ToLocalChecked(); |
| 801 if (v->IsFunction()) { |
| 802 v8::Local<v8::Function> funC = v8::Local<v8::Function>::Cast(v); |
| 803 |
| 804 const int argc = 1; |
| 805 v8::Local<v8::String> timeStr = FXJS_WSToJSString(pIsolate, string); |
| 806 v8::Local<v8::Value> argv[argc] = {timeStr}; |
| 807 v = funC->Call(context, context->Global(), argc, argv).ToLocalChecked(); |
| 808 if (v->IsNumber()) { |
| 809 double date = v->ToNumber(context).ToLocalChecked()->Value(); |
| 810 if (!_isfinite(date)) |
| 811 return date; |
| 812 return date + _getLocalTZA() + _getDaylightSavingTA(date); |
| 813 } |
| 814 } |
| 815 } |
| 816 return 0; |
| 817 } |
| 818 |
| 819 double JS_MakeDay(int nYear, int nMonth, int nDate) { |
| 820 if (!_isfinite(nYear) || !_isfinite(nMonth) || !_isfinite(nDate)) |
| 821 return GetNan(); |
| 822 double y = _toInteger(nYear); |
| 823 double m = _toInteger(nMonth); |
| 824 double dt = _toInteger(nDate); |
| 825 double ym = y + FXSYS_floor((double)m / 12); |
| 826 double mn = _Mod(m, 12); |
| 827 |
| 828 double t = _TimeFromYearMonth((int)ym, (int)mn); |
| 829 |
| 830 if (_YearFromTime(t) != ym || _MonthFromTime(t) != mn || |
| 831 _DateFromTime(t) != 1) |
| 832 return GetNan(); |
| 833 return _Day(t) + dt - 1; |
| 834 } |
| 835 |
| 836 double JS_MakeTime(int nHour, int nMin, int nSec, int nMs) { |
| 837 if (!_isfinite(nHour) || !_isfinite(nMin) || !_isfinite(nSec) || |
| 838 !_isfinite(nMs)) |
| 839 return GetNan(); |
| 840 |
| 841 double h = _toInteger(nHour); |
| 842 double m = _toInteger(nMin); |
| 843 double s = _toInteger(nSec); |
| 844 double milli = _toInteger(nMs); |
| 845 |
| 846 return h * 3600000 + m * 60000 + s * 1000 + milli; |
| 847 } |
| 848 |
| 849 double JS_MakeDate(double day, double time) { |
| 850 if (!_isfinite(day) || !_isfinite(time)) |
| 851 return GetNan(); |
| 852 |
| 853 return day * 86400000 + time; |
| 854 } |
| 855 |
| 856 bool JS_PortIsNan(double d) { |
| 857 return d != d; |
| 858 } |
| 859 |
| 860 double JS_LocalTime(double d) { |
| 861 return JS_GetDateTime() + _getDaylightSavingTA(d); |
| 862 } |
OLD | NEW |