Remove CFXJSE_Value from CFXJSE_FormCalcContext::DotAccessorCommon(). Bug: pdfium:1610 Change-Id: I211383cd45dfa54d2ffe22e95cf7e9d47dbfb735 Reviewed-on: https://pdfium-review.googlesource.com/c/pdfium/+/76422 Commit-Queue: Tom Sepez <tsepez@chromium.org> Reviewed-by: Daniel Hosseinian <dhoss@chromium.org>
diff --git a/fxjs/fxv8.cpp b/fxjs/fxv8.cpp index 6a952b0..f029eaa 100644 --- a/fxjs/fxv8.cpp +++ b/fxjs/fxv8.cpp
@@ -88,6 +88,17 @@ return v8::Array::New(pIsolate); } +v8::Local<v8::Array> NewArrayHelper(v8::Isolate* pIsolate, + pdfium::span<v8::Local<v8::Value>> values) { + v8::Local<v8::Array> result = NewArrayHelper(pIsolate); + for (size_t i = 0; i < values.size(); ++i) { + fxv8::ReentrantPutArrayElementHelper( + pIsolate, result, i, + values[i].IsEmpty() ? fxv8::NewUndefinedHelper(pIsolate) : values[i]); + } + return result; +} + v8::Local<v8::Object> NewObjectHelper(v8::Isolate* pIsolate) { return v8::Object::New(pIsolate); }
diff --git a/fxjs/fxv8.h b/fxjs/fxv8.h index 5e492c2..00c5a8a 100644 --- a/fxjs/fxv8.h +++ b/fxjs/fxv8.h
@@ -10,6 +10,7 @@ #include <vector> #include "core/fxcrt/fx_string.h" +#include "third_party/base/span.h" #include "v8/include/v8.h" // The fxv8 functions soften up the interface to the V8 API. @@ -39,6 +40,8 @@ v8::Local<v8::String> NewStringHelper(v8::Isolate* pIsolate, WideStringView str); v8::Local<v8::Array> NewArrayHelper(v8::Isolate* pIsolate); +v8::Local<v8::Array> NewArrayHelper(v8::Isolate* pIsolate, + pdfium::span<v8::Local<v8::Value>> values); v8::Local<v8::Object> NewObjectHelper(v8::Isolate* pIsolate); v8::Local<v8::Date> NewDateHelper(v8::Isolate* pIsolate, double d);
diff --git a/fxjs/xfa/cfxjse_formcalc_context.cpp b/fxjs/xfa/cfxjse_formcalc_context.cpp index becf069..99d7ca1 100644 --- a/fxjs/xfa/cfxjse_formcalc_context.cpp +++ b/fxjs/xfa/cfxjse_formcalc_context.cpp
@@ -1551,33 +1551,32 @@ return results; } -bool GetObjectForName(CFXJSE_HostObject* pHostObject, - CFXJSE_Value* accessorValue, - ByteStringView bsAccessorName) { +// Returns empty value on failure. +v8::Local<v8::Value> GetObjectForName(CFXJSE_HostObject* pHostObject, + ByteStringView bsAccessorName) { CXFA_Document* pDoc = ToFormCalcContext(pHostObject)->GetDocument(); if (!pDoc) - return false; + return v8::Local<v8::Value>(); CFXJSE_Engine* pScriptContext = pDoc->GetScriptContext(); XFA_ResolveNodeRS resolveNodeRS; uint32_t dwFlags = XFA_RESOLVENODE_Children | XFA_RESOLVENODE_Properties | XFA_RESOLVENODE_Siblings | XFA_RESOLVENODE_Parent; - bool bRet = pScriptContext->ResolveObjects( - pScriptContext->GetThisObject(), - WideString::FromUTF8(bsAccessorName).AsStringView(), &resolveNodeRS, - dwFlags, nullptr); - if (bRet && resolveNodeRS.dwFlags == XFA_ResolveNodeRS::Type::kNodes) { - v8::Isolate* pIsolate = ToFormCalcContext(pHostObject)->GetIsolate(); - accessorValue->ForceSetValue(pIsolate, - pScriptContext->GetOrCreateJSBindingFromMap( - resolveNodeRS.objects.front().Get())); - return true; + if (!pScriptContext->ResolveObjects( + pScriptContext->GetThisObject(), + WideString::FromUTF8(bsAccessorName).AsStringView(), &resolveNodeRS, + dwFlags, /*bindNode=*/nullptr)) { + return v8::Local<v8::Value>(); } - return false; + if (resolveNodeRS.dwFlags != XFA_ResolveNodeRS::Type::kNodes) + return v8::Local<v8::Value>(); + + return pScriptContext->GetOrCreateJSBindingFromMap( + resolveNodeRS.objects.front().Get()); } bool ResolveObjects(CFXJSE_HostObject* pHostObject, - CFXJSE_Value* pRefValue, + v8::Local<v8::Value> pRefValue, ByteStringView bsSomExp, XFA_ResolveNodeRS* resolveNodeRS, bool bDotAccessor, @@ -1592,7 +1591,7 @@ CXFA_Object* pNode = nullptr; uint32_t dFlags = 0UL; if (bDotAccessor) { - if (pRefValue && pRefValue->IsNull(pIsolate)) { + if (fxv8::IsNull(pRefValue)) { pNode = pScriptContext->GetThisObject(); dFlags = XFA_RESOLVENODE_Siblings | XFA_RESOLVENODE_Parent; } else { @@ -1628,14 +1627,11 @@ resolveNodeRS, dFlags, nullptr); } -void ParseResolveResult( - CFXJSE_HostObject* pHostObject, - const XFA_ResolveNodeRS& resolveNodeRS, - CFXJSE_Value* pParentValue, - std::vector<std::unique_ptr<CFXJSE_Value>>* resultValues, - bool* bAttribute) { - ASSERT(bAttribute); - +void ParseResolveResult(CFXJSE_HostObject* pHostObject, + const XFA_ResolveNodeRS& resolveNodeRS, + v8::Local<v8::Value> pParentValue, + std::vector<v8::Local<v8::Value>>* resultValues, + bool* bAttribute) { resultValues->clear(); CFXJSE_FormCalcContext* pContext = ToFormCalcContext(pHostObject); @@ -1645,9 +1641,8 @@ *bAttribute = false; CFXJSE_Engine* pScriptContext = pContext->GetDocument()->GetScriptContext(); for (auto& pObject : resolveNodeRS.objects) { - resultValues->push_back(std::make_unique<CFXJSE_Value>()); - resultValues->back()->ForceSetValue( - pIsolate, pScriptContext->GetOrCreateJSBindingFromMap(pObject.Get())); + resultValues->push_back( + pScriptContext->GetOrCreateJSBindingFromMap(pObject.Get())); } return; } @@ -1661,17 +1656,12 @@ (*resolveNodeRS.script_attribute.callback)( pIsolate, jsObject, pValue.get(), false, resolveNodeRS.script_attribute.attribute); - resultValues->push_back(std::move(pValue)); + resultValues->push_back(pValue->GetValue(pIsolate)); *bAttribute = false; } } - if (!*bAttribute) - return; - if (!pParentValue || !pParentValue->IsObject(pIsolate)) - return; - - resultValues->push_back(std::make_unique<CFXJSE_Value>()); - resultValues->back()->Assign(pIsolate, pParentValue); + if (*bAttribute && fxv8::IsObject(pParentValue)) + resultValues->push_back(pParentValue); } } // namespace @@ -5427,29 +5417,26 @@ fxv8::ReentrantToInt32Helper(info.GetIsolate(), info[3]), iIndexValue, bIsStar); - auto argAccessor = std::make_unique<CFXJSE_Value>(info.GetIsolate(), info[0]); - if (argAccessor->IsArray(info.GetIsolate())) { - auto pLengthValue = std::make_unique<CFXJSE_Value>(); - argAccessor->GetObjectProperty(info.GetIsolate(), "length", - pLengthValue.get()); - int32_t iLength = pLengthValue->ToInteger(info.GetIsolate()); + v8::Local<v8::Value> argAccessor = info[0]; + if (fxv8::IsArray(argAccessor)) { + v8::Local<v8::Array> arr = argAccessor.As<v8::Array>(); + uint32_t iLength = fxv8::GetArrayLengthHelper(arr); if (iLength < 3) { pContext->ThrowArgumentMismatchException(); return; } - auto hJSObjValue = std::make_unique<CFXJSE_Value>(); - std::vector<std::vector<std::unique_ptr<CFXJSE_Value>>> resolveValues( - iLength - 2); + std::vector<std::vector<v8::Local<v8::Value>>> resolveValues(iLength - 2); bool bAttribute = false; bool bAllEmpty = true; - for (int32_t i = 2; i < iLength; i++) { - argAccessor->GetObjectPropertyByIdx(info.GetIsolate(), i, - hJSObjValue.get()); + for (uint32_t i = 2; i < iLength; i++) { + v8::Local<v8::Value> hJSObjValue = + fxv8::ReentrantGetArrayElementHelper(info.GetIsolate(), arr, i); + XFA_ResolveNodeRS resolveNodeRS; - if (ResolveObjects(pThis, hJSObjValue.get(), bsSomExp.AsStringView(), + if (ResolveObjects(pThis, hJSObjValue, bsSomExp.AsStringView(), &resolveNodeRS, bDotAccessor, bHasNoResolveName)) { - ParseResolveResult(pThis, resolveNodeRS, hJSObjValue.get(), + ParseResolveResult(pThis, resolveNodeRS, hJSObjValue, &resolveValues[i - 2], &bAttribute); bAllEmpty = bAllEmpty && resolveValues[i - 2].empty(); } @@ -5470,10 +5457,10 @@ else values.back()->SetNull(pIsolate); - for (int32_t i = 0; i < iLength - 2; i++) { + for (uint32_t i = 0; i < iLength - 2; i++) { for (size_t j = 0; j < resolveValues[i].size(); j++) { - values.push_back(std::make_unique<CFXJSE_Value>()); - values.back()->Assign(pIsolate, resolveValues[i][j].get()); + values.push_back( + std::make_unique<CFXJSE_Value>(pIsolate, resolveValues[i][j])); } } auto pReturn = std::make_unique<CFXJSE_Value>(); @@ -5486,15 +5473,18 @@ bool bRet = false; ByteString bsAccessorName = fxv8::ReentrantToByteStringHelper(info.GetIsolate(), info[1]); - if (argAccessor->IsObject(pIsolate) || - (argAccessor->IsNull(pIsolate) && bsAccessorName.IsEmpty())) { - bRet = ResolveObjects(pThis, argAccessor.get(), bsSomExp.AsStringView(), + if (fxv8::IsObject(argAccessor) || + (fxv8::IsNull(argAccessor) && bsAccessorName.IsEmpty())) { + bRet = ResolveObjects(pThis, argAccessor, bsSomExp.AsStringView(), &resolveNodeRS, bDotAccessor, bHasNoResolveName); - } else if (!argAccessor->IsObject(pIsolate) && !bsAccessorName.IsEmpty() && - GetObjectForName(pThis, argAccessor.get(), - bsAccessorName.AsStringView())) { - bRet = ResolveObjects(pThis, argAccessor.get(), bsSomExp.AsStringView(), - &resolveNodeRS, bDotAccessor, bHasNoResolveName); + } else if (!fxv8::IsObject(argAccessor) && !bsAccessorName.IsEmpty()) { + v8::Local<v8::Value> obj = + GetObjectForName(pThis, bsAccessorName.AsStringView()); + if (!obj.IsEmpty()) { + argAccessor = obj; + bRet = ResolveObjects(pThis, argAccessor, bsSomExp.AsStringView(), + &resolveNodeRS, bDotAccessor, bHasNoResolveName); + } } if (!bRet) { pContext->ThrowPropertyNotInObjectException( @@ -5503,27 +5493,22 @@ return; } - std::vector<std::unique_ptr<CFXJSE_Value>> resolveValues; + std::vector<v8::Local<v8::Value>> resolveValues; bool bAttribute = false; - ParseResolveResult(pThis, resolveNodeRS, argAccessor.get(), &resolveValues, + ParseResolveResult(pThis, resolveNodeRS, argAccessor, &resolveValues, &bAttribute); - std::vector<std::unique_ptr<CFXJSE_Value>> values; - for (size_t i = 0; i < resolveValues.size() + 2; i++) - values.push_back(std::make_unique<CFXJSE_Value>()); - - values[0]->SetInteger(pIsolate, 1); - if (bAttribute) - values[1]->SetString(pIsolate, bsName.AsStringView()); - else - values[1]->SetNull(pIsolate); + std::vector<v8::Local<v8::Value>> values(resolveValues.size() + 2); + values[0] = fxv8::NewNumberHelper(pIsolate, 1); + values[1] = bAttribute + ? fxv8::NewStringHelper(pIsolate, bsName.AsStringView()) + .As<v8::Value>() + : fxv8::NewNullHelper(pIsolate).As<v8::Value>(); for (size_t i = 0; i < resolveValues.size(); i++) - values[i + 2]->Assign(pIsolate, resolveValues[i].get()); + values[i + 2] = resolveValues[i]; - auto pReturn = std::make_unique<CFXJSE_Value>(); - pReturn->SetArray(pIsolate, values); - info.GetReturnValue().Set(pReturn->DirectGetValue()); + info.GetReturnValue().Set(fxv8::NewArrayHelper(pIsolate, values)); } bool CFXJSE_FormCalcContext::ApplyToExpansion(