1d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann// Copyright 2016 PDFium Authors. All rights reserved. 2d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann// Use of this source code is governed by a BSD-style license that can be 3d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann// found in the LICENSE file. 4d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann 5d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann#include "xfa/fxfa/fm2js/cxfa_fmsimpleexpression.h" 6d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann 7d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann#include <memory> 8d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann#include <utility> 9d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann 10d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann#include "core/fxcrt/cfx_widetextbuf.h" 11d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann#include "core/fxcrt/fx_string.h" 12d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann#include "testing/gtest/include/gtest/gtest.h" 13d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann#include "testing/test_support.h" 14d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann#include "third_party/base/ptr_util.h" 15d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann#include "xfa/fxfa/fm2js/cxfa_fmlexer.h" 16d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann#include "xfa/fxfa/fm2js/cxfa_fmtojavascriptdepth.h" 17d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann 18d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. MoltmannTEST(FMCallExpressionTest, more_than_32_arguments) { 19d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann // Use sign as it has 3 object parameters at positions 0, 5, and 6. 20d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann auto exp = pdfium::MakeUnique<CXFA_FMIdentifierExpression>(0, L"sign"); 21d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann 22d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann std::vector<std::unique_ptr<CXFA_FMSimpleExpression>> args; 23d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann for (size_t i = 0; i < 50; i++) 24d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann args.push_back(pdfium::MakeUnique<CXFA_FMSimpleExpression>(0, TOKnan)); 25d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann 26d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann CXFA_FMToJavaScriptDepth::Reset(); 27d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann CXFA_FMCallExpression callExp(0, std::move(exp), std::move(args), true); 28d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann CFX_WideTextBuf js; 29d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann callExp.ToJavaScript(js); 30d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann 31d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann // Generate the result javascript string. 32d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann WideString result = L"sign("; 33d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann for (size_t i = 0; i < 50; i++) { 34d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann if (i > 0) 35d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann result += L", "; 36d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann 37d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann result += L"pfm_rt.get_"; 38d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann // Object positions for sign() method. 39d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann if (i == 0 || i == 5 || i == 6) 40d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann result += L"jsobj()"; 41d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann else 42d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann result += L"val()"; 43d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann } 44d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann result += L")"; 45d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann 46d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann EXPECT_EQ(result.AsStringView(), js.AsStringView()); 47d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann} 48d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann 49d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. MoltmannTEST(FMStringExpressionTest, Empty) { 50d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann CXFA_FMToJavaScriptDepth::Reset(); 51d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann CFX_WideTextBuf accumulator; 52d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann CXFA_FMStringExpression(1, WideStringView()).ToJavaScript(accumulator); 53d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann EXPECT_EQ(L"", accumulator.AsStringView()); 54d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann} 55d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann 56d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. MoltmannTEST(FMStringExpressionTest, Short) { 57d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann CXFA_FMToJavaScriptDepth::Reset(); 58d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann CFX_WideTextBuf accumulator; 59d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann CXFA_FMStringExpression(1, L"a").ToJavaScript(accumulator); 60d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann EXPECT_EQ(L"a", accumulator.AsStringView()); 61d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann} 62d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann 63d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. MoltmannTEST(FMStringExpressionTest, Medium) { 64d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann CXFA_FMToJavaScriptDepth::Reset(); 65d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann CFX_WideTextBuf accumulator; 66d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann CXFA_FMStringExpression(1, L".abcd.").ToJavaScript(accumulator); 67d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann EXPECT_EQ(L"\"abcd\"", accumulator.AsStringView()); 68d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann} 69d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann 70d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. MoltmannTEST(FMStringExpressionTest, Long) { 71d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann CXFA_FMToJavaScriptDepth::Reset(); 72d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann CFX_WideTextBuf accumulator; 73d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann std::vector<WideStringView::UnsignedType> vec(140000, L'A'); 74d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann CXFA_FMStringExpression(1, WideStringView(vec)).ToJavaScript(accumulator); 75d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann EXPECT_EQ(140000u, accumulator.GetLength()); 76d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann} 77d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann 78d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. MoltmannTEST(FMStringExpressionTest, Quoted) { 79d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann CXFA_FMToJavaScriptDepth::Reset(); 80d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann CFX_WideTextBuf accumulator; 81d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann CXFA_FMStringExpression(1, L".Simon says \"\"run\"\".") 82d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann .ToJavaScript(accumulator); 83d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann EXPECT_EQ(L"\"Simon says \\\"run\\\"\"", accumulator.AsStringView()); 84d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann} 85