Home | History | Annotate | Download | only in testing
      1 // Copyright 2017 PDFium Authors. All rights reserved.
      2 // Use of this source code is governed by a BSD-style license that can be
      3 // found in the LICENSE file.
      4 
      5 #include "testing/xfa_js_embedder_test.h"
      6 
      7 #include <string>
      8 
      9 #include "fpdfsdk/fpdfxfa/cpdfxfa_context.h"
     10 #include "fpdfsdk/fsdk_define.h"
     11 #include "fxjs/cfxjse_engine.h"
     12 #include "testing/gtest/include/gtest/gtest.h"
     13 #include "third_party/base/ptr_util.h"
     14 
     15 XFAJSEmbedderTest::XFAJSEmbedderTest()
     16     : array_buffer_allocator_(pdfium::MakeUnique<FXJS_ArrayBufferAllocator>()) {
     17 }
     18 
     19 XFAJSEmbedderTest::~XFAJSEmbedderTest() {}
     20 
     21 void XFAJSEmbedderTest::SetUp() {
     22   v8::Isolate::CreateParams params;
     23   params.array_buffer_allocator = array_buffer_allocator_.get();
     24   isolate_ = v8::Isolate::New(params);
     25   ASSERT_TRUE(isolate_);
     26 
     27   EmbedderTest::SetExternalIsolate(isolate_);
     28   EmbedderTest::SetUp();
     29 }
     30 
     31 void XFAJSEmbedderTest::TearDown() {
     32   value_.reset();
     33   script_context_ = nullptr;
     34 
     35   EmbedderTest::TearDown();
     36 
     37   isolate_->Dispose();
     38   isolate_ = nullptr;
     39 }
     40 
     41 CXFA_Document* XFAJSEmbedderTest::GetXFADocument() {
     42   return UnderlyingFromFPDFDocument(document())->GetXFADoc()->GetXFADoc();
     43 }
     44 
     45 bool XFAJSEmbedderTest::OpenDocumentWithOptions(const std::string& filename,
     46                                                 const char* password,
     47                                                 bool must_linearize) {
     48   if (!EmbedderTest::OpenDocumentWithOptions(filename, password,
     49                                              must_linearize))
     50     return false;
     51 
     52   script_context_ = GetXFADocument()->GetScriptContext();
     53   return true;
     54 }
     55 
     56 bool XFAJSEmbedderTest::Execute(const ByteStringView& input) {
     57   if (ExecuteHelper(input)) {
     58     return true;
     59   }
     60 
     61   CFXJSE_Value msg(GetIsolate());
     62   value_->GetObjectPropertyByIdx(1, &msg);
     63   fprintf(stderr, "JS: %.*s\n", static_cast<int>(input.GetLength()),
     64           input.unterminated_c_str());
     65   // If the parsing of the input fails, then v8 will not run, so there will be
     66   // no value here to print.
     67   if (msg.IsString() && !msg.ToWideString().IsEmpty())
     68     fprintf(stderr, "JS ERROR: %ls\n", msg.ToWideString().c_str());
     69   return false;
     70 }
     71 
     72 bool XFAJSEmbedderTest::ExecuteSilenceFailure(const ByteStringView& input) {
     73   return ExecuteHelper(input);
     74 }
     75 
     76 bool XFAJSEmbedderTest::ExecuteHelper(const ByteStringView& input) {
     77   value_ = pdfium::MakeUnique<CFXJSE_Value>(GetIsolate());
     78   return script_context_->RunScript(CXFA_Script::Type::Formcalc,
     79                                     WideString::FromUTF8(input).AsStringView(),
     80                                     value_.get(), GetXFADocument()->GetRoot());
     81 }
     82