From 08d9f6e3f0a68bae9eedb015458071e1481d28f4 Mon Sep 17 00:00:00 2001 From: Dan Sinclair Date: Fri, 25 May 2018 15:05:04 +0000 Subject: [xfa] Allow accessing the event changed parameter from JS. This CL updates the CFXJSE_Engine code to access the defined properties of a class if we fail to find the property in any other way. This fixes up an issue where we were unable to read the 'change' property of the CJX_EventPseudoModel because we could not find the 'change' property. Bug: 1066 Change-Id: I4ad205bc527beeca1c3e24a36cdde0c21287d9fb Reviewed-on: https://pdfium-review.googlesource.com/32930 Commit-Queue: Ryan Harrison Reviewed-by: Ryan Harrison --- fxjs/cfxjse_engine.cpp | 14 ++++++++++++ fxjs/cfxjse_formcalc_context_embeddertest.cpp | 31 +++++++++++++++++++++++++++ 2 files changed, 45 insertions(+) (limited to 'fxjs') diff --git a/fxjs/cfxjse_engine.cpp b/fxjs/cfxjse_engine.cpp index f0c522f018..ff2bcc4618 100644 --- a/fxjs/cfxjse_engine.cpp +++ b/fxjs/cfxjse_engine.cpp @@ -325,6 +325,19 @@ void CFXJSE_Engine::NormalPropertyGetter(CFXJSE_Value* pOriginalValue, if (pScriptObject) { bRet = lpScriptContext->QueryVariableValue(ToNode(pScriptObject), szPropName, pReturnValue, true); + + if (!bRet) { + WideString wsPropName = WideString::FromUTF8(szPropName); + const XFA_SCRIPTATTRIBUTEINFO* lpAttributeInfo = + XFA_GetScriptAttributeByName(pObject->GetElementType(), + wsPropName.AsStringView()); + if (lpAttributeInfo) { + CJX_Object* jsObject = pObject->JSObject(); + (jsObject->*(lpAttributeInfo->callback))(pReturnValue, false, + lpAttributeInfo->attribute); + return; + } + } } if (!bRet) pReturnValue->SetUndefined(); @@ -510,6 +523,7 @@ bool CFXJSE_Engine::QueryVariableValue(CXFA_Node* pScriptNode, pObject->SetObjectOwnProperty(szPropName, pValue); return true; } + if (pObject->HasObjectOwnProperty(szPropName, false)) { pObject->GetObjectProperty(szPropName, hVariableValue.get()); if (hVariableValue->IsFunction()) diff --git a/fxjs/cfxjse_formcalc_context_embeddertest.cpp b/fxjs/cfxjse_formcalc_context_embeddertest.cpp index a7efc14d20..a32f988d06 100644 --- a/fxjs/cfxjse_formcalc_context_embeddertest.cpp +++ b/fxjs/cfxjse_formcalc_context_embeddertest.cpp @@ -2,8 +2,10 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. +#include "fxjs/cfxjse_engine.h" #include "testing/gtest/include/gtest/gtest.h" #include "testing/xfa_js_embedder_test.h" +#include "xfa/fxfa/cxfa_eventparam.h" class CFXJSE_FormCalcContextEmbedderTest : public XFAJSEmbedderTest {}; @@ -1455,3 +1457,32 @@ TEST_F(CFXJSE_FormCalcContextEmbedderTest, MethodCall) { EXPECT_TRUE(value->IsString()); EXPECT_STREQ("12.7mm", value->ToString().c_str()); } + +TEST_F(CFXJSE_FormCalcContextEmbedderTest, GetXFAEventChange) { + ASSERT_TRUE(OpenDocument("simple_xfa.pdf")); + + CXFA_EventParam params; + params.m_wsChange = L"changed"; + + CFXJSE_Engine* context = GetScriptContext(); + context->SetEventParam(params); + + const char test[] = {"xfa.event.change"}; + EXPECT_TRUE(Execute(test)); + + CFXJSE_Value* value = GetValue(); + EXPECT_TRUE(value->IsString()); + EXPECT_STREQ("changed", value->ToString().c_str()); +} + +TEST_F(CFXJSE_FormCalcContextEmbedderTest, SetXFAEventChange) { + ASSERT_TRUE(OpenDocument("simple_xfa.pdf")); + + CXFA_EventParam params; + CFXJSE_Engine* context = GetScriptContext(); + context->SetEventParam(params); + + const char test[] = {"xfa.event.change = \"changed\""}; + EXPECT_TRUE(Execute(test)); + EXPECT_EQ(L"changed", context->GetEventParam()->m_wsChange); +} -- cgit v1.2.3