diff options
-rw-r--r-- | fxjs/cfxjse_formcalc_context_embeddertest.cpp | 11 | ||||
-rw-r--r-- | testing/xfa_js_embedder_test.cpp | 2 | ||||
-rw-r--r-- | xfa/fxfa/fm2js/cxfa_fmexpression.cpp | 11 | ||||
-rw-r--r-- | xfa/fxfa/fm2js/cxfa_fmparser_unittest.cpp | 128 | ||||
-rw-r--r-- | xfa/fxfa/fm2js/cxfa_fmsimpleexpression.cpp | 18 |
5 files changed, 105 insertions, 65 deletions
diff --git a/fxjs/cfxjse_formcalc_context_embeddertest.cpp b/fxjs/cfxjse_formcalc_context_embeddertest.cpp index d48d5cc445..a7efc14d20 100644 --- a/fxjs/cfxjse_formcalc_context_embeddertest.cpp +++ b/fxjs/cfxjse_formcalc_context_embeddertest.cpp @@ -1444,3 +1444,14 @@ TEST_F(CFXJSE_FormCalcContextEmbedderTest, InvalidFunctions) { EXPECT_FALSE(ExecuteSilenceFailure(tests[i])); } } + +TEST_F(CFXJSE_FormCalcContextEmbedderTest, MethodCall) { + ASSERT_TRUE(OpenDocument("simple_xfa.pdf")); + + const char test[] = {"$form.form1.TextField11.getAttribute(\"h\")"}; + EXPECT_TRUE(Execute(test)); + + CFXJSE_Value* value = GetValue(); + EXPECT_TRUE(value->IsString()); + EXPECT_STREQ("12.7mm", value->ToString().c_str()); +} diff --git a/testing/xfa_js_embedder_test.cpp b/testing/xfa_js_embedder_test.cpp index fe54621a2b..97009f34c2 100644 --- a/testing/xfa_js_embedder_test.cpp +++ b/testing/xfa_js_embedder_test.cpp @@ -76,7 +76,7 @@ bool XFAJSEmbedderTest::Execute(const ByteStringView& input) { CFXJSE_Value msg(GetIsolate()); value_->GetObjectPropertyByIdx(1, &msg); - fprintf(stderr, "JS: %.*s\n", static_cast<int>(input.GetLength()), + fprintf(stderr, "FormCalc: %.*s\n", static_cast<int>(input.GetLength()), input.unterminated_c_str()); // If the parsing of the input fails, then v8 will not run, so there will be // no value here to print. diff --git a/xfa/fxfa/fm2js/cxfa_fmexpression.cpp b/xfa/fxfa/fm2js/cxfa_fmexpression.cpp index a3c65a2203..ef2153d6be 100644 --- a/xfa/fxfa/fm2js/cxfa_fmexpression.cpp +++ b/xfa/fxfa/fm2js/cxfa_fmexpression.cpp @@ -89,6 +89,16 @@ bool CXFA_FMAST::ToJavaScript(CFX_WideTextBuf& js) { } js << L"(function() {\n"; + js << L"let pfm_method_runner = function(obj, cb) {\n"; + js << L" if (pfm_rt.is_ary(obj)) {\n"; + js << L" let pfm_method_return = null;\n"; + js << L" for (var idx = obj.length -1; idx > 1; idx--) {\n"; + js << L" pfm_method_return = cb(obj[idx]);\n"; + js << L" }\n"; + js << L" return pfm_method_return;\n"; + js << L" }\n"; + js << L" return cb(obj);\n"; + js << L"};\n"; js << L"var pfm_ret = null;\n"; for (const auto& expr : expressions_) { @@ -100,7 +110,6 @@ bool CXFA_FMAST::ToJavaScript(CFX_WideTextBuf& js) { js << L"return pfm_rt.get_val(pfm_ret);\n"; js << L"}).call(this);"; - return !CXFA_IsTooBig(js); } diff --git a/xfa/fxfa/fm2js/cxfa_fmparser_unittest.cpp b/xfa/fxfa/fm2js/cxfa_fmparser_unittest.cpp index 0dba59c3bb..81fae08384 100644 --- a/xfa/fxfa/fm2js/cxfa_fmparser_unittest.cpp +++ b/xfa/fxfa/fm2js/cxfa_fmparser_unittest.cpp @@ -42,6 +42,16 @@ TEST(CXFA_FMParserTest, CommentOnlyIsError) { TEST(CXFA_FMParserTest, CommentThenValue) { const wchar_t ret[] = L"(function() {\n" + L"let pfm_method_runner = function(obj, cb) {\n" + L" if (pfm_rt.is_ary(obj)) {\n" + L" let pfm_method_return = null;\n" + L" for (var idx = obj.length -1; idx > 1; idx--) {\n" + L" pfm_method_return = cb(obj[idx]);\n" + L" }\n" + L" return pfm_method_return;\n" + L" }\n" + L" return cb(obj);\n" + L"};\n" L"var pfm_ret = null;\n" L"pfm_ret = 12;\n" L"return pfm_rt.get_val(pfm_ret);\n" @@ -75,6 +85,16 @@ TEST(CXFA_FMParserTest, Parse) { const wchar_t ret[] = L"(function() {\n" + L"let pfm_method_runner = function(obj, cb) {\n" + L" if (pfm_rt.is_ary(obj)) {\n" + L" let pfm_method_return = null;\n" + L" for (var idx = obj.length -1; idx > 1; idx--) {\n" + L" pfm_method_return = cb(obj[idx]);\n" + L" }\n" + L" return pfm_method_return;\n" + L" }\n" + L" return cb(obj);\n" + L"};\n" L"var pfm_ret = null;\n" L"if (pfm_rt.is_obj(this))\n{\n" L"pfm_rt.asgn_val_op(this, pfm_rt.Avg(pfm_rt.neg_op(3), 5, " @@ -159,6 +179,16 @@ TEST(CXFA_FMParserTest, ParseFuncWithParams) { const wchar_t ret[] = { L"(function() {\n" + L"let pfm_method_runner = function(obj, cb) {\n" + L" if (pfm_rt.is_ary(obj)) {\n" + L" let pfm_method_return = null;\n" + L" for (var idx = obj.length -1; idx > 1; idx--) {\n" + L" pfm_method_return = cb(obj[idx]);\n" + L" }\n" + L" return pfm_method_return;\n" + L" }\n" + L" return cb(obj);\n" + L"};\n" L"var pfm_ret = null;\n" L"function MyFunction(param1, param2) {\n" L"var pfm_ret = null;\n" @@ -187,6 +217,16 @@ TEST(CXFA_FMParserTest, ParseFuncWithoutParams) { const wchar_t ret[] = { L"(function() {\n" + L"let pfm_method_runner = function(obj, cb) {\n" + L" if (pfm_rt.is_ary(obj)) {\n" + L" let pfm_method_return = null;\n" + L" for (var idx = obj.length -1; idx > 1; idx--) {\n" + L" pfm_method_return = cb(obj[idx]);\n" + L" }\n" + L" return pfm_method_return;\n" + L" }\n" + L" return cb(obj);\n" + L"};\n" L"var pfm_ret = null;\n" L"function MyFunction() {\n" L"var pfm_ret = null;\n" @@ -262,20 +302,22 @@ TEST(CXFA_FMParserTest, ParseCallSmall) { const wchar_t input[] = {L"i.f(O)"}; const wchar_t ret[] = { L"(function() {\n" - L"var pfm_ret = null;\n" - L"pfm_ret = pfm_rt.get_val((function () {\n" - L"let pfm_cb = function(obj) {\n" - L"return obj.f(pfm_rt.get_val(O));\n" + L"let pfm_method_runner = function(obj, cb) {\n" + L" if (pfm_rt.is_ary(obj)) {\n" + L" let pfm_method_return = null;\n" + L" for (var idx = obj.length -1; idx > 1; idx--) {\n" + L" pfm_method_return = cb(obj[idx]);\n" + L" }\n" + L" return pfm_method_return;\n" + L" }\n" + L" return cb(obj);\n" L"};\n" - L"if (pfm_rt.is_ary(i)) {\n" - L"let method_return_value = null;\n" - L"for (var index = i.length - 1; index > 1; index--) {\n" - L"method_return_value = pfm_cb(i[index]);\n" - L"}\n" - L"return method_return_value;\n" - L"} else {\n" - L"return pfm_cb(i);\n" - L"}}).call(this));\n" + L"var pfm_ret = null;\n" + L"pfm_ret = pfm_rt.get_val((function() {\n" + L" return pfm_method_runner(i, function(obj) {\n" + L" return obj.f(pfm_rt.get_val(O));\n" + L" });\n" + L"}).call(this));\n" L"return pfm_rt.get_val(pfm_ret);\n" L"}).call(this);"}; @@ -293,44 +335,30 @@ TEST(CXFA_FMParserTest, ParseCallBig) { const wchar_t input[] = {L"i.f(O.e(O.e(O)))"}; const wchar_t ret[] = { L"(function() {\n" - L"var pfm_ret = null;\n" - L"pfm_ret = pfm_rt.get_val((function () {\n" - L"let pfm_cb = function(obj) {\n" - L"return obj.f(pfm_rt.get_val((function () {\n" - L"let pfm_cb = function(obj) {\n" - L"return obj.e(pfm_rt.get_val((function () {\n" - L"let pfm_cb = function(obj) {\n" - L"return obj.e(pfm_rt.get_val(O));\n" - L"};\n" - L"if (pfm_rt.is_ary(O)) {\n" - L"let method_return_value = null;\n" - L"for (var index = O.length - 1; index > 1; index--) {\n" - L"method_return_value = pfm_cb(O[index]);\n" - L"}\n" - L"return method_return_value;\n" - L"} else {\n" - L"return pfm_cb(O);\n" - L"}}).call(this)));\n" + L"let pfm_method_runner = function(obj, cb) {\n" + L" if (pfm_rt.is_ary(obj)) {\n" + L" let pfm_method_return = null;\n" + L" for (var idx = obj.length -1; idx > 1; idx--) {\n" + L" pfm_method_return = cb(obj[idx]);\n" + L" }\n" + L" return pfm_method_return;\n" + L" }\n" + L" return cb(obj);\n" L"};\n" - L"if (pfm_rt.is_ary(O)) {\n" - L"let method_return_value = null;\n" - L"for (var index = O.length - 1; index > 1; index--) {\n" - L"method_return_value = pfm_cb(O[index]);\n" - L"}\n" - L"return method_return_value;\n" - L"} else {\n" - L"return pfm_cb(O);\n" - L"}}).call(this)));\n" - L"};\n" - L"if (pfm_rt.is_ary(i)) {\n" - L"let method_return_value = null;\n" - L"for (var index = i.length - 1; index > 1; index--) {\n" - L"method_return_value = pfm_cb(i[index]);\n" - L"}\n" - L"return method_return_value;\n" - L"} else {\n" - L"return pfm_cb(i);\n" - L"}}).call(this));\n" + L"var pfm_ret = null;\n" + L"pfm_ret = pfm_rt.get_val((function() {\n" + L" return pfm_method_runner(i, function(obj) {\n" + L" return obj.f(pfm_rt.get_val((function() {\n" + L" return pfm_method_runner(O, function(obj) {\n" + L" return obj.e(pfm_rt.get_val((function() {\n" + L" return pfm_method_runner(O, function(obj) {\n" + L" return obj.e(pfm_rt.get_val(O));\n" + L" });\n" + L"}).call(this)));\n" + L" });\n" + L"}).call(this)));\n" + L" });\n" + L"}).call(this));\n" L"return pfm_rt.get_val(pfm_ret);\n" L"}).call(this);"}; diff --git a/xfa/fxfa/fm2js/cxfa_fmsimpleexpression.cpp b/xfa/fxfa/fm2js/cxfa_fmsimpleexpression.cpp index 069899311e..e34d4ba127 100644 --- a/xfa/fxfa/fm2js/cxfa_fmsimpleexpression.cpp +++ b/xfa/fxfa/fm2js/cxfa_fmsimpleexpression.cpp @@ -676,22 +676,14 @@ bool CXFA_FMMethodCallExpression::ToJavaScript(CFX_WideTextBuf& js, if (!m_pExp1->ToJavaScript(buf, ReturnType::kInfered)) return false; - js << L"(function () {\n"; - js << L"let pfm_cb = function(obj) {\n"; - js << L"return obj."; + js << L"(function() {\n"; + js << L" return pfm_method_runner(" << buf << L", function(obj) {\n"; + js << L" return obj."; if (!m_pExp2->ToJavaScript(js, ReturnType::kInfered)) return false; js << L";\n"; - js << L"};\n"; - js << L"if (pfm_rt.is_ary(" << buf << L")) {\n"; - js << L"let method_return_value = null;\n"; - js << L"for (var index = " << buf << L".length - 1; index > 1; index--) {\n"; - js << L"method_return_value = pfm_cb(" << buf << L"[index]);\n"; - js << L"}\n"; - js << L"return method_return_value;\n"; - js << L"} else {\n"; - js << L"return pfm_cb(" << buf << L");\n"; - js << L"}}).call(this)"; + js << L" });\n"; + js << L"}).call(this)"; return !CXFA_IsTooBig(js); } |