| 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 "fpdfsdk/src/javascript/JS_Value.h" | 7 #include "fpdfsdk/javascript/JS_Value.h" |
| 8 | 8 |
| 9 #include <time.h> | 9 #include <time.h> |
| 10 | 10 |
| 11 #include <algorithm> | 11 #include <algorithm> |
| 12 #include <cmath> | 12 #include <cmath> |
| 13 #include <limits> | 13 #include <limits> |
| 14 #include <vector> | 14 #include <vector> |
| 15 | 15 |
| 16 #include "fpdfsdk/src/javascript/Document.h" | 16 #include "fpdfsdk/javascript/Document.h" |
| 17 #include "fpdfsdk/src/javascript/JS_Define.h" | 17 #include "fpdfsdk/javascript/JS_Define.h" |
| 18 #include "fpdfsdk/src/javascript/JS_Object.h" | 18 #include "fpdfsdk/javascript/JS_Object.h" |
| 19 | 19 |
| 20 static const FX_DWORD g_nan[2] = {0, 0x7FF80000}; | 20 static const FX_DWORD g_nan[2] = {0, 0x7FF80000}; |
| 21 static double GetNan() { | 21 static double GetNan() { |
| 22 return *(double*)g_nan; | 22 return *(double*)g_nan; |
| 23 } | 23 } |
| 24 | 24 |
| 25 CJS_Value::CJS_Value(CJS_Runtime* pRuntime) | 25 CJS_Value::CJS_Value(CJS_Runtime* pRuntime) |
| 26 : m_eType(VT_unknown), m_pJSRuntime(pRuntime) { | 26 : m_eType(VT_unknown), m_pJSRuntime(pRuntime) {} |
| 27 } | |
| 28 | 27 |
| 29 CJS_Value::CJS_Value(CJS_Runtime* pRuntime, v8::Local<v8::Value> pValue, Type t) | 28 CJS_Value::CJS_Value(CJS_Runtime* pRuntime, v8::Local<v8::Value> pValue, Type t) |
| 30 : m_eType(t), m_pValue(pValue), m_pJSRuntime(pRuntime) { | 29 : m_eType(t), m_pValue(pValue), m_pJSRuntime(pRuntime) {} |
| 31 } | |
| 32 | 30 |
| 33 CJS_Value::CJS_Value(CJS_Runtime* pRuntime, const int& iValue) | 31 CJS_Value::CJS_Value(CJS_Runtime* pRuntime, const int& iValue) |
| 34 : m_pJSRuntime(pRuntime) { | 32 : m_pJSRuntime(pRuntime) { |
| 35 operator=(iValue); | 33 operator=(iValue); |
| 36 } | 34 } |
| 37 | 35 |
| 38 CJS_Value::CJS_Value(CJS_Runtime* pRuntime, const bool& bValue) | 36 CJS_Value::CJS_Value(CJS_Runtime* pRuntime, const bool& bValue) |
| 39 : m_pJSRuntime(pRuntime) { | 37 : m_pJSRuntime(pRuntime) { |
| 40 operator=(bValue); | 38 operator=(bValue); |
| 41 } | 39 } |
| (...skipping 241 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 283 | 281 |
| 284 return FALSE; | 282 return FALSE; |
| 285 } | 283 } |
| 286 | 284 |
| 287 /* ---------------------------- CJS_PropValue ---------------------------- */ | 285 /* ---------------------------- CJS_PropValue ---------------------------- */ |
| 288 | 286 |
| 289 CJS_PropValue::CJS_PropValue(const CJS_Value& value) | 287 CJS_PropValue::CJS_PropValue(const CJS_Value& value) |
| 290 : CJS_Value(value), m_bIsSetting(0) {} | 288 : CJS_Value(value), m_bIsSetting(0) {} |
| 291 | 289 |
| 292 CJS_PropValue::CJS_PropValue(CJS_Runtime* pRuntime) | 290 CJS_PropValue::CJS_PropValue(CJS_Runtime* pRuntime) |
| 293 : CJS_Value(pRuntime), m_bIsSetting(0) { | 291 : CJS_Value(pRuntime), m_bIsSetting(0) {} |
| 294 } | |
| 295 | 292 |
| 296 CJS_PropValue::~CJS_PropValue() { | 293 CJS_PropValue::~CJS_PropValue() {} |
| 297 } | |
| 298 | 294 |
| 299 void CJS_PropValue::operator<<(int iValue) { | 295 void CJS_PropValue::operator<<(int iValue) { |
| 300 ASSERT(!m_bIsSetting); | 296 ASSERT(!m_bIsSetting); |
| 301 CJS_Value::operator=(iValue); | 297 CJS_Value::operator=(iValue); |
| 302 } | 298 } |
| 303 | 299 |
| 304 void CJS_PropValue::operator>>(int& iValue) const { | 300 void CJS_PropValue::operator>>(int& iValue) const { |
| 305 ASSERT(m_bIsSetting); | 301 ASSERT(m_bIsSetting); |
| 306 iValue = CJS_Value::ToInt(); | 302 iValue = CJS_Value::ToInt(); |
| 307 } | 303 } |
| (...skipping 97 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 405 | 401 |
| 406 void CJS_PropValue::operator<<(CJS_Date& date) { | 402 void CJS_PropValue::operator<<(CJS_Date& date) { |
| 407 ASSERT(!m_bIsSetting); | 403 ASSERT(!m_bIsSetting); |
| 408 CJS_Value::operator=(date); | 404 CJS_Value::operator=(date); |
| 409 } | 405 } |
| 410 | 406 |
| 411 CJS_PropValue::operator v8::Local<v8::Value>() const { | 407 CJS_PropValue::operator v8::Local<v8::Value>() const { |
| 412 return m_pValue; | 408 return m_pValue; |
| 413 } | 409 } |
| 414 | 410 |
| 415 CJS_Array::CJS_Array(CJS_Runtime* pRuntime) : m_pJSRuntime(pRuntime) { | 411 CJS_Array::CJS_Array(CJS_Runtime* pRuntime) : m_pJSRuntime(pRuntime) {} |
| 416 } | |
| 417 | 412 |
| 418 CJS_Array::~CJS_Array() {} | 413 CJS_Array::~CJS_Array() {} |
| 419 | 414 |
| 420 void CJS_Array::Attach(v8::Local<v8::Array> pArray) { | 415 void CJS_Array::Attach(v8::Local<v8::Array> pArray) { |
| 421 m_pArray = pArray; | 416 m_pArray = pArray; |
| 422 } | 417 } |
| 423 | 418 |
| 424 FX_BOOL CJS_Array::IsAttached() { | 419 FX_BOOL CJS_Array::IsAttached() { |
| 425 return FALSE; | 420 return FALSE; |
| 426 } | 421 } |
| (...skipping 20 matching lines...) Expand all Loading... |
| 447 return FXJS_GetArrayLength(m_pArray); | 442 return FXJS_GetArrayLength(m_pArray); |
| 448 } | 443 } |
| 449 | 444 |
| 450 CJS_Array::operator v8::Local<v8::Array>() { | 445 CJS_Array::operator v8::Local<v8::Array>() { |
| 451 if (m_pArray.IsEmpty()) | 446 if (m_pArray.IsEmpty()) |
| 452 m_pArray = FXJS_NewArray(m_pJSRuntime->GetIsolate()); | 447 m_pArray = FXJS_NewArray(m_pJSRuntime->GetIsolate()); |
| 453 | 448 |
| 454 return m_pArray; | 449 return m_pArray; |
| 455 } | 450 } |
| 456 | 451 |
| 457 CJS_Date::CJS_Date(CJS_Runtime* pRuntime) : m_pJSRuntime(pRuntime) { | 452 CJS_Date::CJS_Date(CJS_Runtime* pRuntime) : m_pJSRuntime(pRuntime) {} |
| 458 } | |
| 459 | 453 |
| 460 CJS_Date::CJS_Date(CJS_Runtime* pRuntime, double dMsecTime) | 454 CJS_Date::CJS_Date(CJS_Runtime* pRuntime, double dMsecTime) |
| 461 : m_pJSRuntime(pRuntime) { | 455 : m_pJSRuntime(pRuntime) { |
| 462 m_pDate = FXJS_NewDate(pRuntime->GetIsolate(), dMsecTime); | 456 m_pDate = FXJS_NewDate(pRuntime->GetIsolate(), dMsecTime); |
| 463 } | 457 } |
| 464 | 458 |
| 465 CJS_Date::CJS_Date(CJS_Runtime* pRuntime, | 459 CJS_Date::CJS_Date(CJS_Runtime* pRuntime, |
| 466 int year, | 460 int year, |
| 467 int mon, | 461 int mon, |
| 468 int day, | 462 int day, |
| (...skipping 184 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 653 return (int)(365 * (y - 1970.0) + FXSYS_floor((y - 1969.0) / 4) - | 647 return (int)(365 * (y - 1970.0) + FXSYS_floor((y - 1969.0) / 4) - |
| 654 FXSYS_floor((y - 1901.0) / 100) + | 648 FXSYS_floor((y - 1901.0) / 100) + |
| 655 FXSYS_floor((y - 1601.0) / 400)); | 649 FXSYS_floor((y - 1601.0) / 400)); |
| 656 } | 650 } |
| 657 | 651 |
| 658 double _TimeFromYear(int y) { | 652 double _TimeFromYear(int y) { |
| 659 return 86400000.0 * _DayFromYear(y); | 653 return 86400000.0 * _DayFromYear(y); |
| 660 } | 654 } |
| 661 | 655 |
| 662 double _TimeFromYearMonth(int y, int m) { | 656 double _TimeFromYearMonth(int y, int m) { |
| 663 static int daysMonth[12] = { | 657 static int daysMonth[12] = {0, 31, 59, 90, 120, 151, |
| 664 0, 31, 59, 90, 120, 151, 181, 212, 243, 273, 304, 334}; | 658 181, 212, 243, 273, 304, 334}; |
| 665 static int leapDaysMonth[12] = { | 659 static int leapDaysMonth[12] = {0, 31, 60, 91, 121, 152, |
| 666 0, 31, 60, 91, 121, 152, 182, 213, 244, 274, 305, 335}; | 660 182, 213, 244, 274, 305, 335}; |
| 667 int* pMonth = daysMonth; | 661 int* pMonth = daysMonth; |
| 668 if (_isLeapYear(y)) | 662 if (_isLeapYear(y)) |
| 669 pMonth = leapDaysMonth; | 663 pMonth = leapDaysMonth; |
| 670 return _TimeFromYear(y) + ((double)pMonth[m]) * 86400000; | 664 return _TimeFromYear(y) + ((double)pMonth[m]) * 86400000; |
| 671 } | 665 } |
| 672 | 666 |
| 673 int _Day(double t) { | 667 int _Day(double t) { |
| 674 return (int)FXSYS_floor(t / 86400000); | 668 return (int)FXSYS_floor(t / 86400000); |
| 675 } | 669 } |
| 676 | 670 |
| (...skipping 130 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 807 v8::Local<v8::Value> v = | 801 v8::Local<v8::Value> v = |
| 808 context->Global() | 802 context->Global() |
| 809 ->Get(context, v8::String::NewFromUtf8(pIsolate, "Date", | 803 ->Get(context, v8::String::NewFromUtf8(pIsolate, "Date", |
| 810 v8::NewStringType::kNormal) | 804 v8::NewStringType::kNormal) |
| 811 .ToLocalChecked()) | 805 .ToLocalChecked()) |
| 812 .ToLocalChecked(); | 806 .ToLocalChecked(); |
| 813 if (v->IsObject()) { | 807 if (v->IsObject()) { |
| 814 v8::Local<v8::Object> o = v->ToObject(context).ToLocalChecked(); | 808 v8::Local<v8::Object> o = v->ToObject(context).ToLocalChecked(); |
| 815 v = o->Get(context, v8::String::NewFromUtf8(pIsolate, "parse", | 809 v = o->Get(context, v8::String::NewFromUtf8(pIsolate, "parse", |
| 816 v8::NewStringType::kNormal) | 810 v8::NewStringType::kNormal) |
| 817 .ToLocalChecked()).ToLocalChecked(); | 811 .ToLocalChecked()) |
| 812 .ToLocalChecked(); |
| 818 if (v->IsFunction()) { | 813 if (v->IsFunction()) { |
| 819 v8::Local<v8::Function> funC = v8::Local<v8::Function>::Cast(v); | 814 v8::Local<v8::Function> funC = v8::Local<v8::Function>::Cast(v); |
| 820 | 815 |
| 821 const int argc = 1; | 816 const int argc = 1; |
| 822 v8::Local<v8::String> timeStr = FXJS_WSToJSString(pIsolate, str); | 817 v8::Local<v8::String> timeStr = FXJS_WSToJSString(pIsolate, str); |
| 823 v8::Local<v8::Value> argv[argc] = {timeStr}; | 818 v8::Local<v8::Value> argv[argc] = {timeStr}; |
| 824 v = funC->Call(context, context->Global(), argc, argv).ToLocalChecked(); | 819 v = funC->Call(context, context->Global(), argc, argv).ToLocalChecked(); |
| 825 if (v->IsNumber()) { | 820 if (v->IsNumber()) { |
| 826 double date = v->ToNumber(context).ToLocalChecked()->Value(); | 821 double date = v->ToNumber(context).ToLocalChecked()->Value(); |
| 827 if (!_isfinite(date)) | 822 if (!_isfinite(date)) |
| (...skipping 74 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 902 for (int i = 0; i < nKeywords; ++i) { | 897 for (int i = 0; i < nKeywords; ++i) { |
| 903 const wchar_t* property = va_arg(ap, const wchar_t*); | 898 const wchar_t* property = va_arg(ap, const wchar_t*); |
| 904 v8::Local<v8::Value> v8Value = | 899 v8::Local<v8::Value> v8Value = |
| 905 FXJS_GetObjectElement(pRuntime->GetIsolate(), pObj, property); | 900 FXJS_GetObjectElement(pRuntime->GetIsolate(), pObj, property); |
| 906 if (!v8Value->IsUndefined()) | 901 if (!v8Value->IsUndefined()) |
| 907 result[i] = CJS_Value(pRuntime, v8Value, CJS_Value::VT_unknown); | 902 result[i] = CJS_Value(pRuntime, v8Value, CJS_Value::VT_unknown); |
| 908 } | 903 } |
| 909 va_end(ap); | 904 va_end(ap); |
| 910 return result; | 905 return result; |
| 911 } | 906 } |
| OLD | NEW |