blob: 8c94ca742a42cbe433c965f6dcc1f09d72643f1d [file] [log] [blame]
// Copyright 2014 PDFium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
// Original code copyright 2014 Foxit Software Inc.
#include <vector>
#include "fxjs/fxjs_v8.h"
class CJS_Array;
class CJS_Date;
class CJS_Document;
class CJS_Object;
class CJS_Runtime;
class CJS_Value {
enum Type {
explicit CJS_Value(CJS_Runtime* pRuntime);
CJS_Value(CJS_Runtime* pRuntime, v8::Local<v8::Value> pValue);
CJS_Value(CJS_Runtime* pRuntime, const int& iValue);
CJS_Value(CJS_Runtime* pRuntime, const double& dValue);
CJS_Value(CJS_Runtime* pRuntime, const float& fValue);
CJS_Value(CJS_Runtime* pRuntime, const bool& bValue);
CJS_Value(CJS_Runtime* pRuntime, CJS_Object* pObj);
CJS_Value(CJS_Runtime* pRuntime, const char* pStr);
CJS_Value(CJS_Runtime* pRuntime, const wchar_t* pWstr);
CJS_Value(CJS_Runtime* pRuntime, const CJS_Array& array);
CJS_Value(CJS_Runtime* pRuntime, const CJS_Date& date);
CJS_Value(CJS_Runtime* pRuntime, const CJS_Object* object);
CJS_Value(const CJS_Value& other);
void SetNull(CJS_Runtime* pRuntime);
void SetValue(const CJS_Value& other);
void Attach(v8::Local<v8::Value> pValue);
void Detach();
static Type GetValueType(v8::Local<v8::Value> value);
Type GetType() const { return GetValueType(m_pValue); }
int ToInt(CJS_Runtime* pRuntime) const;
bool ToBool(CJS_Runtime* pRuntime) const;
double ToDouble(CJS_Runtime* pRuntime) const;
float ToFloat(CJS_Runtime* pRuntime) const;
CJS_Object* ToCJSObject(CJS_Runtime* pRuntime) const;
WideString ToCFXWideString(CJS_Runtime* pRuntime) const;
ByteString ToCFXByteString(CJS_Runtime* pRuntime) const;
v8::Local<v8::Object> ToV8Object(CJS_Runtime* pRuntime) const;
v8::Local<v8::Array> ToV8Array(CJS_Runtime* pRuntime) const;
v8::Local<v8::Value> ToV8Value(CJS_Runtime* pRuntime) const;
// Replace the current |m_pValue| with a v8::Number if possible
// to make one from the current |m_pValue|.
void MaybeCoerceToNumber(CJS_Runtime* pRuntime);
bool IsArrayObject() const;
bool IsDateObject() const;
bool ConvertToArray(CJS_Runtime* pRuntime, CJS_Array&) const;
bool ConvertToDate(CJS_Runtime* pRuntime, CJS_Date&) const;
v8::Local<v8::Value> m_pValue;
class CJS_PropValue {
explicit CJS_PropValue(CJS_Runtime* pRuntime);
CJS_PropValue(CJS_Runtime* pRuntime, const CJS_Value&);
void StartSetting() { m_bIsSetting = true; }
void StartGetting() { m_bIsSetting = false; }
bool IsSetting() const { return m_bIsSetting; }
bool IsGetting() const { return !m_bIsSetting; }
CJS_Runtime* GetJSRuntime() const { return m_pJSRuntime.Get(); }
CJS_Value* GetJSValue() { return &m_Value; }
// These calls may re-enter JS (and hence invalidate objects).
void operator<<(int val);
void operator>>(int&) const;
void operator<<(bool val);
void operator>>(bool&) const;
void operator<<(double val);
void operator>>(double&) const;
void operator<<(CJS_Object* pObj);
void operator>>(CJS_Object*& ppObj) const;
void operator<<(CJS_Document* pJsDoc);
void operator>>(CJS_Document*& ppJsDoc) const;
void operator<<(ByteString);
void operator>>(ByteString&) const;
void operator<<(WideString);
void operator>>(WideString&) const;
void operator<<(const wchar_t* c_string);
void operator<<(v8::Local<v8::Object>);
void operator>>(v8::Local<v8::Object>&) const;
void operator>>(CJS_Array& array) const;
void operator<<(CJS_Array& array);
void operator<<(CJS_Date& date);
void operator>>(CJS_Date& date) const;
bool m_bIsSetting;
CJS_Value m_Value;
UnownedPtr<CJS_Runtime> const m_pJSRuntime;
class CJS_Array {
CJS_Array(const CJS_Array& other);
virtual ~CJS_Array();
void Attach(v8::Local<v8::Array> pArray);
int GetLength(CJS_Runtime* pRuntime) const;
// These two calls may re-enter JS (and hence invalidate objects).
void GetElement(CJS_Runtime* pRuntime,
unsigned index,
CJS_Value& value) const;
void SetElement(CJS_Runtime* pRuntime,
unsigned index,
const CJS_Value& value);
v8::Local<v8::Array> ToV8Array(CJS_Runtime* pRuntime) const;
mutable v8::Local<v8::Array> m_pArray;
class CJS_Date {
CJS_Date(CJS_Runtime* pRuntime, double dMsec_time);
CJS_Date(CJS_Runtime* pRuntime,
int year,
int mon,
int day,
int hour,
int min,
int sec);
virtual ~CJS_Date();
void Attach(v8::Local<v8::Date> pDate);
bool IsValidDate(CJS_Runtime* pRuntime) const;
int GetYear(CJS_Runtime* pRuntime) const;
void SetYear(CJS_Runtime* pRuntime, int iYear);
int GetMonth(CJS_Runtime* pRuntime) const;
void SetMonth(CJS_Runtime* pRuntime, int iMonth);
int GetDay(CJS_Runtime* pRuntime) const;
void SetDay(CJS_Runtime* pRuntime, int iDay);
int GetHours(CJS_Runtime* pRuntime) const;
void SetHours(CJS_Runtime* pRuntime, int iHours);
int GetMinutes(CJS_Runtime* pRuntime) const;
void SetMinutes(CJS_Runtime* pRuntime, int minutes);
int GetSeconds(CJS_Runtime* pRuntime) const;
void SetSeconds(CJS_Runtime* pRuntime, int seconds);
v8::Local<v8::Date> ToV8Date(CJS_Runtime* pRuntime) const;
double ToDouble(CJS_Runtime* pRuntime) const;
WideString ToString(CJS_Runtime* pRuntime) const;
v8::Local<v8::Date> m_pDate;
double JS_GetDateTime();
int JS_GetYearFromTime(double dt);
int JS_GetMonthFromTime(double dt);
int JS_GetDayFromTime(double dt);
int JS_GetHourFromTime(double dt);
int JS_GetMinFromTime(double dt);
int JS_GetSecFromTime(double dt);
double JS_DateParse(const WideString& str);
double JS_MakeDay(int nYear, int nMonth, int nDay);
double JS_MakeTime(int nHour, int nMin, int nSec, int nMs);
double JS_MakeDate(double day, double time);
double JS_LocalTime(double d);
// Some JS methods have the bizarre convention that they may also be called
// with a single argument which is an object containing the actual arguments
// as its properties. The varying arguments to this method are the property
// names as wchar_t string literals corresponding to each positional argument.
// The result will always contain |nKeywords| value, with unspecified ones
// being set to type VT_unknown.
std::vector<CJS_Value> JS_ExpandKeywordParams(
CJS_Runtime* pRuntime,
const std::vector<CJS_Value>& originals,
size_t nKeywords,