// Copyright 2018 PDFium Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. #include "xfa/fxfa/parser/cxfa_document_parser.h" #include "core/fxcrt/cfx_readonlymemorystream.h" #include "testing/gtest/include/gtest/gtest.h" #include "testing/test_support.h" #include "third_party/base/ptr_util.h" #include "xfa/fxfa/parser/cxfa_document.h" class CXFA_DocumentParserTest : public testing::Test { public: void SetUp() override { doc_ = pdfium::MakeUnique(nullptr); parser_ = pdfium::MakeUnique(doc_.get()); } void TearDown() override { // Hold the XML tree until we cleanup the document. std::unique_ptr doc = parser_->GetXMLDoc(); parser_ = nullptr; doc_ = nullptr; } CXFA_Document* GetDoc() const { return doc_.get(); } CXFA_DocumentParser* GetParser() const { return parser_.get(); } private: std::unique_ptr doc_; std::unique_ptr parser_; }; TEST_F(CXFA_DocumentParserTest, XMLInstructionsScriptOff) { static const char input[] = "\n" "\n" ""; EXPECT_FALSE(GetDoc()->HasFlag(XFA_DOCFLAG_Scripting)); auto stream = pdfium::MakeRetain( pdfium::as_bytes(pdfium::make_span(input))); ASSERT_TRUE(GetParser()->Parse(stream, XFA_PacketType::Config)); CXFA_Node* root = GetParser()->GetRootNode(); ASSERT_TRUE(root != nullptr); EXPECT_FALSE(GetDoc()->HasFlag(XFA_DOCFLAG_Scripting)); } TEST_F(CXFA_DocumentParserTest, XMLInstructionsScriptOn) { static const char input[] = "\n" "\n" ""; EXPECT_FALSE(GetDoc()->HasFlag(XFA_DOCFLAG_Scripting)); auto stream = pdfium::MakeRetain( pdfium::as_bytes(pdfium::make_span(input))); ASSERT_TRUE(GetParser()->Parse(stream, XFA_PacketType::Config)); CXFA_Node* root = GetParser()->GetRootNode(); ASSERT_TRUE(root != nullptr); EXPECT_TRUE(GetDoc()->HasFlag(XFA_DOCFLAG_Scripting)); } TEST_F(CXFA_DocumentParserTest, XMLInstructionsStrictScope) { static const char input[] = "" "\n" ""; EXPECT_FALSE(GetDoc()->HasFlag(XFA_DOCFLAG_StrictScoping)); auto stream = pdfium::MakeRetain( pdfium::as_bytes(pdfium::make_span(input))); ASSERT_TRUE(GetParser()->Parse(stream, XFA_PacketType::Config)); CXFA_Node* root = GetParser()->GetRootNode(); ASSERT_TRUE(root != nullptr); EXPECT_TRUE(GetDoc()->HasFlag(XFA_DOCFLAG_StrictScoping)); } TEST_F(CXFA_DocumentParserTest, XMLInstructionsStrictScopeBad) { static const char input[] = "" "\n" ""; EXPECT_FALSE(GetDoc()->HasFlag(XFA_DOCFLAG_StrictScoping)); auto stream = pdfium::MakeRetain( pdfium::as_bytes(pdfium::make_span(input))); ASSERT_TRUE(GetParser()->Parse(stream, XFA_PacketType::Config)); CXFA_Node* root = GetParser()->GetRootNode(); ASSERT_TRUE(root != nullptr); EXPECT_FALSE(GetDoc()->HasFlag(XFA_DOCFLAG_StrictScoping)); } TEST_F(CXFA_DocumentParserTest, MultipleXMLInstructions) { static const char input[] = "" "\n" "\n" ""; EXPECT_FALSE(GetDoc()->HasFlag(XFA_DOCFLAG_Scripting)); EXPECT_FALSE(GetDoc()->HasFlag(XFA_DOCFLAG_StrictScoping)); auto stream = pdfium::MakeRetain( pdfium::as_bytes(pdfium::make_span(input))); ASSERT_TRUE(GetParser()->Parse(stream, XFA_PacketType::Config)); CXFA_Node* root = GetParser()->GetRootNode(); ASSERT_TRUE(root != nullptr); EXPECT_TRUE(GetDoc()->HasFlag(XFA_DOCFLAG_Scripting)); EXPECT_TRUE(GetDoc()->HasFlag(XFA_DOCFLAG_StrictScoping)); }