summaryrefslogtreecommitdiff
path: root/fpdfsdk/javascript/global.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'fpdfsdk/javascript/global.cpp')
-rw-r--r--fpdfsdk/javascript/global.cpp185
1 files changed, 86 insertions, 99 deletions
diff --git a/fpdfsdk/javascript/global.cpp b/fpdfsdk/javascript/global.cpp
index 5dc6ac9d78..df7927b116 100644
--- a/fpdfsdk/javascript/global.cpp
+++ b/fpdfsdk/javascript/global.cpp
@@ -63,6 +63,11 @@
namespace {
+WideString PropFromV8Prop(v8::Local<v8::String> property) {
+ v8::String::Utf8Value utf8_value(property);
+ return WideString::FromUTF8(ByteStringView(*utf8_value, utf8_value.length()));
+}
+
template <class Alt>
void JSSpecialPropQuery(const char*,
v8::Local<v8::String> property,
@@ -78,11 +83,8 @@ void JSSpecialPropQuery(const char*,
return;
Alt* pObj = reinterpret_cast<Alt*>(pJSObj->GetEmbedObject());
- v8::String::Utf8Value utf8_value(property);
- WideString propname =
- WideString::FromUTF8(ByteStringView(*utf8_value, utf8_value.length()));
- bool bRet = pObj->QueryProperty(propname.c_str());
- info.GetReturnValue().Set(bRet ? 4 : 0);
+ CJS_Return result = pObj->QueryProperty(PropFromV8Prop(property).c_str());
+ info.GetReturnValue().Set(!result.HasError() ? 4 : 0);
}
template <class Alt>
@@ -100,17 +102,16 @@ void JSSpecialPropGet(const char* class_name,
return;
Alt* pObj = reinterpret_cast<Alt*>(pJSObj->GetEmbedObject());
- v8::String::Utf8Value utf8_value(property);
- WideString propname =
- WideString::FromUTF8(ByteStringView(*utf8_value, utf8_value.length()));
-
- CJS_Value value;
- if (!pObj->GetProperty(pRuntime, propname.c_str(), &value)) {
- pRuntime->Error(JSFormatErrorString(class_name, "GetProperty", L""));
+ CJS_Return result =
+ pObj->GetProperty(pRuntime, PropFromV8Prop(property).c_str());
+ if (result.HasError()) {
+ pRuntime->Error(
+ JSFormatErrorString(class_name, "GetProperty", result.Error()));
return;
}
- if (!value.ToV8Value().IsEmpty())
- info.GetReturnValue().Set(value.ToV8Value());
+
+ if (result.HasReturn())
+ info.GetReturnValue().Set(result.Return());
}
template <class Alt>
@@ -129,11 +130,12 @@ void JSSpecialPropPut(const char* class_name,
return;
Alt* pObj = reinterpret_cast<Alt*>(pJSObj->GetEmbedObject());
- v8::String::Utf8Value utf8_value(property);
- WideString propname =
- WideString::FromUTF8(ByteStringView(*utf8_value, utf8_value.length()));
- if (!pObj->SetProperty(pRuntime, propname.c_str(), value))
- pRuntime->Error(JSFormatErrorString(class_name, "PutProperty", L""));
+ CJS_Return result =
+ pObj->SetProperty(pRuntime, PropFromV8Prop(property).c_str(), value);
+ if (result.HasError()) {
+ pRuntime->Error(
+ JSFormatErrorString(class_name, "PutProperty", result.Error()));
+ }
}
template <class Alt>
@@ -151,13 +153,12 @@ void JSSpecialPropDel(const char* class_name,
return;
Alt* pObj = reinterpret_cast<Alt*>(pJSObj->GetEmbedObject());
- v8::String::Utf8Value utf8_value(property);
- WideString propname =
- WideString::FromUTF8(ByteStringView(*utf8_value, utf8_value.length()));
- if (!pObj->DelProperty(pRuntime, propname.c_str())) {
- ByteString cbName;
- cbName.Format("%s.%s", class_name, "DelProperty");
- // Probably a missing call to JSFX_Error().
+ CJS_Return result =
+ pObj->DelProperty(pRuntime, PropFromV8Prop(property).c_str());
+ if (result.HasError()) {
+ // TODO(dsinclair): Should this set the pRuntime->Error result?
+ // ByteString cbName;
+ // cbName.Format("%s.%s", class_name, "DelProperty");
}
}
@@ -179,31 +180,27 @@ class JSGlobalAlternate : public CJS_EmbedObj {
explicit JSGlobalAlternate(CJS_Object* pJSObject);
~JSGlobalAlternate() override;
- bool setPersistent(CJS_Runtime* pRuntime,
- const std::vector<v8::Local<v8::Value>>& params,
- CJS_Value& vRet,
- WideString& sError);
- bool QueryProperty(const wchar_t* propname);
- bool GetProperty(CJS_Runtime* pRuntime,
- const wchar_t* propname,
- CJS_Value* vp);
- bool SetProperty(CJS_Runtime* pRuntime,
- const wchar_t* propname,
- v8::Local<v8::Value> vp);
- bool DelProperty(CJS_Runtime* pRuntime, const wchar_t* propname);
+ CJS_Return setPersistent(CJS_Runtime* pRuntime,
+ const std::vector<v8::Local<v8::Value>>& params);
+ CJS_Return QueryProperty(const wchar_t* propname);
+ CJS_Return GetProperty(CJS_Runtime* pRuntime, const wchar_t* propname);
+ CJS_Return SetProperty(CJS_Runtime* pRuntime,
+ const wchar_t* propname,
+ v8::Local<v8::Value> vp);
+ CJS_Return DelProperty(CJS_Runtime* pRuntime, const wchar_t* propname);
void Initial(CPDFSDK_FormFillEnvironment* pFormFillEnv);
private:
void UpdateGlobalPersistentVariables();
void CommitGlobalPersisitentVariables(CJS_Runtime* pRuntime);
void DestroyGlobalPersisitentVariables();
- bool SetGlobalVariables(const ByteString& propname,
- JS_GlobalDataType nType,
- double dData,
- bool bData,
- const ByteString& sData,
- v8::Local<v8::Object> pData,
- bool bDefaultPersistent);
+ CJS_Return SetGlobalVariables(const ByteString& propname,
+ JS_GlobalDataType nType,
+ double dData,
+ bool bData,
+ const ByteString& sData,
+ v8::Local<v8::Object> pData,
+ bool bDefaultPersistent);
void ObjectToArray(CJS_Runtime* pRuntime,
v8::Local<v8::Object> pObj,
CJS_GlobalVariableArray& array);
@@ -267,58 +264,52 @@ void JSGlobalAlternate::Initial(CPDFSDK_FormFillEnvironment* pFormFillEnv) {
UpdateGlobalPersistentVariables();
}
-bool JSGlobalAlternate::QueryProperty(const wchar_t* propname) {
- return WideString(propname) != L"setPersistent";
+CJS_Return JSGlobalAlternate::QueryProperty(const wchar_t* propname) {
+ return CJS_Return(WideString(propname) != L"setPersistent");
}
-bool JSGlobalAlternate::DelProperty(CJS_Runtime* pRuntime,
- const wchar_t* propname) {
+CJS_Return JSGlobalAlternate::DelProperty(CJS_Runtime* pRuntime,
+ const wchar_t* propname) {
auto it = m_MapGlobal.find(ByteString::FromUnicode(propname));
if (it == m_MapGlobal.end())
- return false;
+ return CJS_Return(false);
it->second->bDeleted = true;
- return true;
+ return CJS_Return(true);
}
-bool JSGlobalAlternate::GetProperty(CJS_Runtime* pRuntime,
- const wchar_t* propname,
- CJS_Value* vp) {
+CJS_Return JSGlobalAlternate::GetProperty(CJS_Runtime* pRuntime,
+ const wchar_t* propname) {
auto it = m_MapGlobal.find(ByteString::FromUnicode(propname));
if (it == m_MapGlobal.end())
- return true;
+ return CJS_Return(true);
JSGlobalData* pData = it->second.get();
if (pData->bDeleted)
- return true;
+ return CJS_Return(true);
switch (pData->nType) {
case JS_GlobalDataType::NUMBER:
- vp->Set(pRuntime->NewNumber(pData->dData));
- return true;
+ return CJS_Return(pRuntime->NewNumber(pData->dData));
case JS_GlobalDataType::BOOLEAN:
- vp->Set(pRuntime->NewBoolean(pData->bData));
- return true;
+ return CJS_Return(pRuntime->NewBoolean(pData->bData));
case JS_GlobalDataType::STRING:
- vp->Set(pRuntime->NewString(
+ return CJS_Return(pRuntime->NewString(
WideString::FromLocal(pData->sData.c_str()).c_str()));
- return true;
- case JS_GlobalDataType::OBJECT: {
- vp->Set(v8::Local<v8::Object>::New(pRuntime->GetIsolate(), pData->pData));
- return true;
- }
+ case JS_GlobalDataType::OBJECT:
+ return CJS_Return(
+ v8::Local<v8::Object>::New(pRuntime->GetIsolate(), pData->pData));
case JS_GlobalDataType::NULLOBJ:
- vp->Set(pRuntime->NewNull());
- return true;
+ return CJS_Return(pRuntime->NewNull());
default:
break;
}
- return false;
+ return CJS_Return(false);
}
-bool JSGlobalAlternate::SetProperty(CJS_Runtime* pRuntime,
- const wchar_t* propname,
- v8::Local<v8::Value> vp) {
+CJS_Return JSGlobalAlternate::SetProperty(CJS_Runtime* pRuntime,
+ const wchar_t* propname,
+ v8::Local<v8::Value> vp) {
ByteString sPropName = ByteString::FromUnicode(propname);
if (vp->IsNumber()) {
return SetGlobalVariables(sPropName, JS_GlobalDataType::NUMBER,
@@ -346,28 +337,24 @@ bool JSGlobalAlternate::SetProperty(CJS_Runtime* pRuntime,
}
if (vp->IsUndefined()) {
DelProperty(pRuntime, propname);
- return true;
+ return CJS_Return(true);
}
- return false;
+ return CJS_Return(false);
}
-bool JSGlobalAlternate::setPersistent(
+CJS_Return JSGlobalAlternate::setPersistent(
CJS_Runtime* pRuntime,
- const std::vector<v8::Local<v8::Value>>& params,
- CJS_Value& vRet,
- WideString& sError) {
- if (params.size() != 2) {
- sError = JSGetStringFromID(IDS_STRING_JSPARAMERROR);
- return false;
- }
+ const std::vector<v8::Local<v8::Value>>& params) {
+ if (params.size() != 2)
+ return CJS_Return(JSGetStringFromID(IDS_STRING_JSPARAMERROR));
+
auto it = m_MapGlobal.find(
ByteString::FromUnicode(pRuntime->ToWideString(params[0])));
- if (it == m_MapGlobal.end() || it->second->bDeleted) {
- sError = JSGetStringFromID(IDS_STRING_JSNOGLOBAL);
- return false;
- }
+ if (it == m_MapGlobal.end() || it->second->bDeleted)
+ return CJS_Return(JSGetStringFromID(IDS_STRING_JSNOGLOBAL));
+
it->second->bPersistent = pRuntime->ToBoolean(params[1]);
- return true;
+ return CJS_Return(true);
}
void JSGlobalAlternate::UpdateGlobalPersistentVariables() {
@@ -552,15 +539,15 @@ void JSGlobalAlternate::DestroyGlobalPersisitentVariables() {
m_MapGlobal.clear();
}
-bool JSGlobalAlternate::SetGlobalVariables(const ByteString& propname,
- JS_GlobalDataType nType,
- double dData,
- bool bData,
- const ByteString& sData,
- v8::Local<v8::Object> pData,
- bool bDefaultPersistent) {
+CJS_Return JSGlobalAlternate::SetGlobalVariables(const ByteString& propname,
+ JS_GlobalDataType nType,
+ double dData,
+ bool bData,
+ const ByteString& sData,
+ v8::Local<v8::Object> pData,
+ bool bDefaultPersistent) {
if (propname.IsEmpty())
- return false;
+ return CJS_Return(false);
auto it = m_MapGlobal.find(propname);
if (it != m_MapGlobal.end()) {
@@ -588,9 +575,9 @@ bool JSGlobalAlternate::SetGlobalVariables(const ByteString& propname,
case JS_GlobalDataType::NULLOBJ:
break;
default:
- return false;
+ return CJS_Return(false);
}
- return true;
+ return CJS_Return(true);
}
auto pNewData = pdfium::MakeUnique<JSGlobalData>();
@@ -620,8 +607,8 @@ bool JSGlobalAlternate::SetGlobalVariables(const ByteString& propname,
pNewData->bPersistent = bDefaultPersistent;
break;
default:
- return false;
+ return CJS_Return(false);
}
m_MapGlobal[propname] = std::move(pNewData);
- return true;
+ return CJS_Return(true);
}