blob: 93da9bea2e144639170c0a4ea6da07133f53493c [file] [log] [blame]
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -07001// Copyright 2014 PDFium Authors. All rights reserved.
2// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
5// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
6
7#include "../../include/javascript/JavaScript.h"
8#include "../../include/javascript/JS_Define.h"
9#include "../../include/javascript/JS_Object.h"
10#include "../../include/javascript/JS_Value.h"
Tom Sepezf79a69c2014-10-30 13:23:42 -070011#include "../../include/javascript/Document.h"
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -070012
13/* ---------------------------- CJS_Value ---------------------------- */
14
Nico Weber09363c82014-07-31 10:07:04 -070015CJS_Value::CJS_Value(v8::Isolate* isolate) : m_eType(VT_unknown),m_isolate(isolate)
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -070016{
17}
Nico Weber09363c82014-07-31 10:07:04 -070018CJS_Value::CJS_Value(v8::Isolate* isolate, v8::Handle<v8::Value> pValue,FXJSVALUETYPE t) :
19 m_pValue(pValue), m_eType(t), m_isolate(isolate)
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -070020{
21}
22
23CJS_Value::CJS_Value(v8::Isolate* isolate, const int &iValue):m_isolate(isolate)
24{
25 operator =(iValue);
26}
27
28CJS_Value::CJS_Value(v8::Isolate* isolate, const bool &bValue):m_isolate(isolate)
29{
30 operator =(bValue);
31}
32
33CJS_Value::CJS_Value(v8::Isolate* isolate, const float &fValue):m_isolate(isolate)
34{
35 operator =(fValue);
36}
37
38CJS_Value::CJS_Value(v8::Isolate* isolate, const double &dValue):m_isolate(isolate)
39{
40 operator =(dValue);
41}
42
43CJS_Value::CJS_Value(v8::Isolate* isolate, JSFXObject pJsObj):m_isolate(isolate)
44{
45 operator =(pJsObj);
46}
47
Tom Sepezf79a69c2014-10-30 13:23:42 -070048CJS_Value::CJS_Value(v8::Isolate* isolate, CJS_Object* pJsObj):m_isolate(isolate)
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -070049{
50 operator =(pJsObj);
51}
52
Tom Sepezf79a69c2014-10-30 13:23:42 -070053CJS_Value::CJS_Value(v8::Isolate* isolate, CJS_Document* pJsDoc):m_isolate(isolate)
54{
55 m_eType = VT_object;
56 if (pJsDoc)
57 m_pValue = (JSFXObject)*pJsDoc;
58}
59
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -070060CJS_Value::CJS_Value(v8::Isolate* isolate, FX_LPCWSTR pWstr):m_isolate(isolate)
61{
62 operator =(pWstr);
63}
64
65CJS_Value::CJS_Value(v8::Isolate* isolate, FX_LPCSTR pStr):m_isolate(isolate)
66{
67 operator = (pStr);
68}
69
70CJS_Value::CJS_Value(v8::Isolate* isolate, CJS_Array& array):m_isolate(isolate)
71{
72 operator = (array);
73}
74
75CJS_Value::~CJS_Value()
76{
77}
78
79void CJS_Value::Attach(v8::Handle<v8::Value> pValue,FXJSVALUETYPE t)
80{
81 m_pValue = pValue;
82 m_eType = t;
83}
84
85void CJS_Value::Attach(CJS_Value *pValue)
86{
87 if (pValue)
88 Attach(pValue->ToJSValue(),pValue->GetType());
89}
90
91void CJS_Value::Detach()
92{
93 m_pValue = v8::Handle<v8::Value>();
94 m_eType = VT_unknown;
95}
96
97/* ---------------------------------------------------------------------------------------- */
98
99CJS_Value::operator int() const
100{
101
102 return JS_ToInt32(m_pValue);
103
104}
105
106CJS_Value::operator bool() const
107{
108
109 return JS_ToBoolean(m_pValue);
110
111}
112
113CJS_Value::operator double() const
114{
115
116 return JS_ToNumber(m_pValue);
117
118}
119
120CJS_Value::operator float() const
121{
122
123 return (float)JS_ToNumber(m_pValue);
124
125}
126
127CJS_Value::operator CJS_Object *() const
128{
129
130 v8::Handle<v8::Object> pObj = JS_ToObject(m_pValue);
131 return (CJS_Object*)JS_GetPrivate(m_isolate, pObj);
132}
133
134CJS_Value::operator v8::Handle<v8::Object>() const
135{
136 return JS_ToObject(m_pValue);
137}
138
139CJS_Value::operator CFX_WideString() const
140{
141 return JS_ToString(m_pValue);
142}
143
144CJS_Value::operator CFX_ByteString() const
145{
146 return CFX_ByteString::FromUnicode(operator CFX_WideString());
147}
148
149v8::Handle<v8::Value> CJS_Value::ToJSValue()
150{
151 return m_pValue;
152}
153
154
155CJS_Value::operator v8::Handle<v8::Array>() const
156{
157 if (IsArrayObject())
158 return v8::Handle<v8::Array>::Cast(JS_ToObject(m_pValue));
159 return v8::Handle<v8::Array>();
160}
161
162/* ---------------------------------------------------------------------------------------- */
163
164void CJS_Value::operator =(int iValue)
165{
166 m_pValue = JS_NewNumber(m_isolate, iValue);
167
168 m_eType = VT_number;
169}
170
171void CJS_Value::operator =(bool bValue)
172{
173 m_pValue = JS_NewBoolean(m_isolate, bValue);
174
175 m_eType = VT_boolean;
176}
177
178void CJS_Value::operator =(double dValue)
179{
180 m_pValue = JS_NewNumber(m_isolate,dValue);
181
182 m_eType = VT_number;
183}
184
185void CJS_Value::operator = (float fValue)
186{
187 m_pValue = JS_NewNumber(m_isolate,fValue);
188 m_eType = VT_number;
189}
190
191void CJS_Value::operator =(v8::Handle<v8::Object> pObj)
192{
193
194 m_pValue = JS_NewObject(m_isolate,pObj);
195
196 m_eType = VT_fxobject;
197}
198
199void CJS_Value::operator =(CJS_Object * pObj)
200{
201 if (pObj)
202 operator = ((JSFXObject)*pObj);
203}
204
205void CJS_Value::operator =(FX_LPCWSTR pWstr)
206{
207 m_pValue = JS_NewString(m_isolate,(wchar_t *)pWstr);
208
209 m_eType = VT_string;
210}
211
212void CJS_Value::SetNull()
213{
214 m_pValue = JS_NewNull();
215
216 m_eType = VT_null;
217}
218
219void CJS_Value::operator = (FX_LPCSTR pStr)
220{
221 operator = (CFX_WideString::FromLocal(pStr));
222}
223
224void CJS_Value::operator = (CJS_Array & array)
225{
226 m_pValue = JS_NewObject2(m_isolate,(v8::Handle<v8::Array>)array);
227
228 m_eType = VT_object;
229}
230
231void CJS_Value::operator = (CJS_Date & date)
232{
233 m_pValue = JS_NewDate(m_isolate, (double)date);
234
235 m_eType = VT_date;
236}
237
238void CJS_Value::operator = (CJS_Value value)
239{
240 m_pValue = value.ToJSValue();
241
242 m_eType = value.m_eType;
243}
244
245/* ---------------------------------------------------------------------------------------- */
246
247FXJSVALUETYPE CJS_Value::GetType() const
248{
249 if(m_pValue.IsEmpty()) return VT_unknown;
250 if(m_pValue->IsString()) return VT_string;
251 if(m_pValue->IsNumber()) return VT_number;
252 if(m_pValue->IsBoolean()) return VT_boolean;
253 if(m_pValue->IsDate()) return VT_date;
254 if(m_pValue->IsObject()) return VT_object;
255 if(m_pValue->IsNull()) return VT_null;
256 if(m_pValue->IsUndefined()) return VT_undefined;
257 return VT_unknown;
258}
259
260FX_BOOL CJS_Value::IsArrayObject() const
261{
262 if(m_pValue.IsEmpty()) return FALSE;
263 return m_pValue->IsArray();
264}
265
266FX_BOOL CJS_Value::IsDateObject() const
267{
268 if(m_pValue.IsEmpty()) return FALSE;
269 return m_pValue->IsDate();
270}
271
272//CJS_Value::operator CJS_Array()
273FX_BOOL CJS_Value::ConvertToArray(CJS_Array &array) const
274{
275 if (IsArrayObject())
276 {
277 array.Attach(JS_ToArray(m_pValue));
278 return TRUE;
279 }
280
281 return FALSE;
282}
283
284FX_BOOL CJS_Value::ConvertToDate(CJS_Date &date) const
285{
286// if (GetType() == VT_date)
287// {
288// date = (double)(*this);
289// return TRUE;
290// }
291
292 if (IsDateObject())
293 {
294 date.Attach(m_pValue);
295 return TRUE;
296 }
297
298 return FALSE;
299}
300
301/* ---------------------------- CJS_PropValue ---------------------------- */
302
303CJS_PropValue::CJS_PropValue(const CJS_Value &value) :
304 CJS_Value(value),
305 m_bIsSetting(0)
306{
307}
308
309CJS_PropValue::CJS_PropValue(v8::Isolate* isolate) : CJS_Value(isolate),
310 m_bIsSetting(0)
311{
312}
313
314CJS_PropValue::~CJS_PropValue()
315{
316}
317
318FX_BOOL CJS_PropValue::IsSetting()
319{
320 return m_bIsSetting;
321}
322
323FX_BOOL CJS_PropValue::IsGetting()
324{
325 return !m_bIsSetting;
326}
327
328void CJS_PropValue::operator <<(int iValue)
329{
330 ASSERT(!m_bIsSetting);
331 CJS_Value::operator =(iValue);
332}
333
334void CJS_PropValue::operator >>(int & iValue) const
335{
336 ASSERT(m_bIsSetting);
337 iValue = CJS_Value::operator int();
338}
339
340
341void CJS_PropValue::operator <<(bool bValue)
342{
343 ASSERT(!m_bIsSetting);
344 CJS_Value::operator =(bValue);
345}
346
347void CJS_PropValue::operator >>(bool &bValue) const
348{
349 ASSERT(m_bIsSetting);
350 bValue = CJS_Value::operator bool();
351
352}
353
354void CJS_PropValue::operator <<(double dValue)
355{
356 ASSERT(!m_bIsSetting);
357 CJS_Value::operator =(dValue);
358}
359
360void CJS_PropValue::operator >>(double &dValue) const
361{
362 ASSERT(m_bIsSetting);
363 dValue = CJS_Value::operator double();
364}
365
366void CJS_PropValue::operator <<(CJS_Object *pObj)
367{
368 ASSERT(!m_bIsSetting);
369 CJS_Value::operator = (pObj);
370}
371
372void CJS_PropValue::operator >>(CJS_Object *&ppObj) const
373{
374 ASSERT(m_bIsSetting);
375 ppObj = CJS_Value::operator CJS_Object *();
376}
377
378void CJS_PropValue::operator<<(JSFXObject pObj)
379{
380 ASSERT(!m_bIsSetting);
381 CJS_Value::operator = (pObj);
382}
383
384void CJS_PropValue::operator>>(JSFXObject &ppObj) const
385{
386 ASSERT(m_bIsSetting);
387 ppObj = CJS_Value::operator JSFXObject ();
388}
389
390
391void CJS_PropValue::StartSetting()
392{
393 m_bIsSetting = 1;
394}
395
396void CJS_PropValue::StartGetting()
397{
398 m_bIsSetting = 0;
399}
400void CJS_PropValue::operator <<(CFX_ByteString string)
401{
402 ASSERT(!m_bIsSetting);
403 CJS_Value::operator =((FX_LPCSTR)string);
404}
405
406void CJS_PropValue::operator >>(CFX_ByteString &string) const
407{
408 ASSERT(m_bIsSetting);
409 string = CJS_Value::operator CFX_ByteString();
410}
411
412void CJS_PropValue::operator <<(FX_LPCWSTR c_string)
413{
414 ASSERT(!m_bIsSetting);
415 CJS_Value::operator =(c_string);
416}
417
418void CJS_PropValue::operator >>(CFX_WideString &wide_string) const
419{
420 ASSERT(m_bIsSetting);
421 wide_string = CJS_Value::operator CFX_WideString();
422}
423
424void CJS_PropValue::operator <<(CFX_WideString wide_string)
425{
426 ASSERT(!m_bIsSetting);
427 CJS_Value::operator = (wide_string);
428}
429
430void CJS_PropValue::operator >>(CJS_Array &array) const
431{
432 ASSERT(m_bIsSetting);
433 ConvertToArray(array);
434}
435
436void CJS_PropValue::operator <<(CJS_Array &array)
437{
438 ASSERT(!m_bIsSetting);
439 CJS_Value::operator=(array);
440}
441
442void CJS_PropValue::operator>>(CJS_Date &date) const
443{
444 ASSERT(m_bIsSetting);
445 ConvertToDate(date);
446}
447
448void CJS_PropValue::operator<<(CJS_Date &date)
449{
450 ASSERT(!m_bIsSetting);
451 CJS_Value::operator=(date);
452}
453
454CJS_PropValue::operator v8::Handle<v8::Value>() const
455{
456 return m_pValue;
457}
458
459/* ======================================== CJS_Array ========================================= */
460CJS_Array::CJS_Array(v8::Isolate* isolate):m_isolate(isolate)
461{
462}
463
464CJS_Array::~CJS_Array()
465{
466}
467
468void CJS_Array::Attach(v8::Handle<v8::Array> pArray)
469{
470 m_pArray = pArray;
471}
472
473FX_BOOL CJS_Array::IsAttached()
474{
475 return FALSE;
476}
477
478void CJS_Array::GetElement(unsigned index,CJS_Value &value)
479{
480 if (m_pArray.IsEmpty())
481 return;
482 v8::Handle<v8::Value> p = JS_GetArrayElemnet(m_pArray,index);
483 value.Attach(p,VT_object);
484}
485
486void CJS_Array::SetElement(unsigned index,CJS_Value value)
487{
488 if (m_pArray.IsEmpty())
489 m_pArray = JS_NewArray(m_isolate);
490
491 JS_PutArrayElement(m_pArray,index,value.ToJSValue(),value.GetType());
492}
493
494int CJS_Array::GetLength()
495{
496 if (m_pArray.IsEmpty())
497 return 0;
498 return JS_GetArrayLength(m_pArray);
499}
500
501CJS_Array:: operator v8::Handle<v8::Array>()
502{
503 if (m_pArray.IsEmpty())
504 m_pArray = JS_NewArray(m_isolate);
505
506 return m_pArray;
507}
508
509/* ======================================== CJS_Date ========================================= */
510
511CJS_Date::CJS_Date(v8::Isolate* isolate) :m_isolate(isolate)
512{
513}
514
515CJS_Date::CJS_Date(v8::Isolate* isolate,double dMsec_time)
516{
517 m_isolate = isolate;
518 m_pDate = JS_NewDate(isolate,dMsec_time);
519}
520
521CJS_Date::CJS_Date(v8::Isolate* isolate,int year, int mon, int day,int hour, int min, int sec)
522{
523 m_isolate = isolate;
524 m_pDate = JS_NewDate(isolate,MakeDate(year,mon,day,hour,min,sec,0));
525}
526
527double CJS_Date::MakeDate(int year, int mon, int day,int hour, int min, int sec,int ms)
528{
529 return JS_MakeDate(JS_MakeDay(year,mon,day), JS_MakeTime(hour,min,sec,ms));
530}
531
532CJS_Date::~CJS_Date()
533{
534}
535
536FX_BOOL CJS_Date::IsValidDate()
537{
538 if(m_pDate.IsEmpty()) return FALSE;
539 return !JS_PortIsNan(JS_ToNumber(m_pDate));
540}
541
542void CJS_Date::Attach(v8::Handle<v8::Value> pDate)
543{
544 m_pDate = pDate;
545}
546
547int CJS_Date::GetYear()
548{
549 if (IsValidDate())
550 return JS_GetYearFromTime(JS_LocalTime(JS_ToNumber(m_pDate)));
551
552 return 0;
553}
554
555void CJS_Date::SetYear(int iYear)
556{
557 double date = MakeDate(iYear,GetMonth(),GetDay(),GetHours(),GetMinutes(),GetSeconds(),0);
558 JS_ValueCopy(m_pDate, JS_NewDate(m_isolate,date));
559}
560
561int CJS_Date::GetMonth()
562{
563 if (IsValidDate())
564 return JS_GetMonthFromTime(JS_LocalTime(JS_ToNumber(m_pDate)));
565
566 return 0;
567}
568
569void CJS_Date::SetMonth(int iMonth)
570{
571
572 double date = MakeDate(GetYear(),iMonth,GetDay(),GetHours(),GetMinutes(),GetSeconds(),0);
573 JS_ValueCopy(m_pDate, JS_NewDate(m_isolate,date));
574
575}
576
577int CJS_Date::GetDay()
578{
579 if (IsValidDate())
580 return JS_GetDayFromTime(JS_LocalTime(JS_ToNumber(m_pDate)));
581
582 return 0;
583}
584
585void CJS_Date::SetDay(int iDay)
586{
587
588 double date = MakeDate(GetYear(),GetMonth(),iDay,GetHours(),GetMinutes(),GetSeconds(),0);
589 JS_ValueCopy(m_pDate,JS_NewDate(m_isolate,date));
590
591}
592
593int CJS_Date::GetHours()
594{
595 if (IsValidDate())
596 return JS_GetHourFromTime(JS_LocalTime(JS_ToNumber(m_pDate)));
597
598 return 0;
599}
600
601void CJS_Date::SetHours(int iHours)
602{
603 double date = MakeDate(GetYear(),GetMonth(),GetDay(),iHours,GetMinutes(),GetSeconds(),0);
604 JS_ValueCopy(m_pDate,JS_NewDate(m_isolate,date));
605}
606
607int CJS_Date::GetMinutes()
608{
609 if (IsValidDate())
610 return JS_GetMinFromTime(JS_LocalTime(JS_ToNumber(m_pDate)));
611
612 return 0;
613}
614
615void CJS_Date::SetMinutes(int minutes)
616{
617 double date = MakeDate(GetYear(),GetMonth(),GetDay(),GetHours(),minutes,GetSeconds(),0);
618 JS_ValueCopy(m_pDate,JS_NewDate(m_isolate,date));
619}
620
621int CJS_Date::GetSeconds()
622{
623 if (IsValidDate())
624 return JS_GetSecFromTime(JS_LocalTime(JS_ToNumber(m_pDate)));
625
626 return 0;
627}
628
629void CJS_Date::SetSeconds(int seconds)
630{
631 double date = MakeDate(GetYear(),GetMonth(),GetDay(),GetHours(),GetMinutes(),seconds,0);
632 JS_ValueCopy(m_pDate,JS_NewDate(m_isolate,date));
633}
634
635CJS_Date::operator v8::Handle<v8::Value>()
636{
637 return m_pDate;
638}
639
640CJS_Date::operator double() const
641{
642 if(m_pDate.IsEmpty())
643 return 0.0;
644 return JS_ToNumber(m_pDate);
645}
646
647CFX_WideString CJS_Date::ToString() const
648{
649 if(m_pDate.IsEmpty())
650 return L"";
651 return JS_ToString(m_pDate);
652}