diff options
-rw-r--r-- | tools/aapt2/ResourceParser.cpp | 27 | ||||
-rw-r--r-- | tools/aapt2/ResourceParser_test.cpp | 25 | ||||
-rw-r--r-- | tools/aapt2/ResourceUtils.cpp | 12 | ||||
-rw-r--r-- | tools/aapt2/ResourceUtils.h | 6 | ||||
-rw-r--r-- | tools/aapt2/ResourceUtils_test.cpp | 23 | ||||
-rw-r--r-- | tools/aapt2/format/binary/XmlFlattener.cpp | 3 | ||||
-rw-r--r-- | tools/aapt2/format/binary/XmlFlattener_test.cpp | 11 |
7 files changed, 31 insertions, 76 deletions
diff --git a/tools/aapt2/ResourceParser.cpp b/tools/aapt2/ResourceParser.cpp index d0237f80a8f0..5e8d870488c4 100644 --- a/tools/aapt2/ResourceParser.cpp +++ b/tools/aapt2/ResourceParser.cpp @@ -206,15 +206,6 @@ class SegmentNode : public Node { } }; -// A chunk of text in the XML string within a CDATA tags. -class CdataSegmentNode : public SegmentNode { - public: - - void Build(StringBuilder* builder) const override { - builder->AppendText(data, /* preserve_spaces */ true); - } -}; - // A tag that will be encoded into the final flattened string. Tags like <b> or <i>. class SpanNode : public Node { public: @@ -251,7 +242,6 @@ bool ResourceParser::FlattenXmlSubtree( std::vector<Node*> node_stack; node_stack.push_back(&root); - bool cdata_block = false; bool saw_span_node = false; SegmentNode* first_segment = nullptr; SegmentNode* last_segment = nullptr; @@ -262,12 +252,9 @@ bool ResourceParser::FlattenXmlSubtree( // First take care of any SegmentNodes that should be created. if (event == xml::XmlPullParser::Event::kStartElement - || event == xml::XmlPullParser::Event::kEndElement - || event == xml::XmlPullParser::Event::kCdataStart - || event == xml::XmlPullParser::Event::kCdataEnd) { + || event == xml::XmlPullParser::Event::kEndElement) { if (!current_text.empty()) { - std::unique_ptr<SegmentNode> segment_node = (cdata_block) - ? util::make_unique<CdataSegmentNode>() : util::make_unique<SegmentNode>(); + auto segment_node = util::make_unique<SegmentNode>(); segment_node->data = std::move(current_text); last_segment = node_stack.back()->AddChild(std::move(segment_node)); @@ -345,16 +332,6 @@ bool ResourceParser::FlattenXmlSubtree( } } break; - case xml::XmlPullParser::Event::kCdataStart: { - cdata_block = true; - break; - } - - case xml::XmlPullParser::Event::kCdataEnd: { - cdata_block = false; - break; - } - default: // ignore. break; diff --git a/tools/aapt2/ResourceParser_test.cpp b/tools/aapt2/ResourceParser_test.cpp index 25b76b0c1fa0..251ca0c9256e 100644 --- a/tools/aapt2/ResourceParser_test.cpp +++ b/tools/aapt2/ResourceParser_test.cpp @@ -1195,27 +1195,26 @@ TEST_F(ResourceParserTest, ParseIdItem) { } TEST_F(ResourceParserTest, ParseCData) { - std::string input = R"( - <string name="foo"><![CDATA[some text and ' apostrophe]]></string>)"; - + // Double quotes should still change the state of whitespace processing + std::string input = R"(<string name="foo">Hello<![CDATA[ "</string>' ]]> World</string>)"; ASSERT_TRUE(TestParse(input)); - String* output = test::GetValue<String>(&table_, "string/foo"); + auto output = test::GetValue<String>(&table_, "string/foo"); ASSERT_THAT(output, NotNull()); - EXPECT_THAT(*output, StrValueEq("some text and ' apostrophe")); + EXPECT_THAT(*output, StrValueEq(std::string("Hello </string>' World").data())); - // Double quotes should not change the state of whitespace processing - input = R"(<string name="foo2">Hello<![CDATA[ "</string>' ]]> World</string>)"; + input = R"(<string name="foo2"><![CDATA[Hello + World]]></string>)"; ASSERT_TRUE(TestParse(input)); output = test::GetValue<String>(&table_, "string/foo2"); ASSERT_THAT(output, NotNull()); - EXPECT_THAT(*output, StrValueEq(std::string("Hello \"</string>' World").data())); + EXPECT_THAT(*output, StrValueEq(std::string("Hello World").data())); - // Cdata blocks should not have their whitespace trimmed + // Cdata blocks should have their whitespace trimmed input = R"(<string name="foo3"> <![CDATA[ text ]]> </string>)"; ASSERT_TRUE(TestParse(input)); output = test::GetValue<String>(&table_, "string/foo3"); ASSERT_THAT(output, NotNull()); - EXPECT_THAT(*output, StrValueEq(std::string(" text ").data())); + EXPECT_THAT(*output, StrValueEq(std::string("text").data())); input = R"(<string name="foo4"> <![CDATA[]]> </string>)"; ASSERT_TRUE(TestParse(input)); @@ -1227,7 +1226,11 @@ TEST_F(ResourceParserTest, ParseCData) { ASSERT_TRUE(TestParse(input)); output = test::GetValue<String>(&table_, "string/foo5"); ASSERT_THAT(output, NotNull()); - EXPECT_THAT(*output, StrValueEq(std::string(" ").data())); + EXPECT_THAT(*output, StrValueEq(std::string("").data())); + + // Single quotes must still be escaped + input = R"(<string name="foo6"><![CDATA[some text and ' apostrophe]]></string>)"; + ASSERT_FALSE(TestParse(input)); } } // namespace aapt diff --git a/tools/aapt2/ResourceUtils.cpp b/tools/aapt2/ResourceUtils.cpp index ffc1a92a88b0..f0e4d9e7ce8c 100644 --- a/tools/aapt2/ResourceUtils.cpp +++ b/tools/aapt2/ResourceUtils.cpp @@ -845,20 +845,16 @@ StringBuilder::StringBuilder(bool preserve_spaces) : preserve_spaces_(preserve_spaces), quote_(preserve_spaces) { } -StringBuilder& StringBuilder::AppendText(const std::string& text, bool preserve_spaces) { +StringBuilder& StringBuilder::AppendText(const std::string& text) { if (!error_.empty()) { return *this; } - // Enable preserving spaces if it is enabled for this append or the StringBuilder was constructed - // to preserve spaces - preserve_spaces = (preserve_spaces) ? preserve_spaces : preserve_spaces_; - const size_t previous_len = xml_string_.text.size(); Utf8Iterator iter(text); while (iter.HasNext()) { char32_t codepoint = iter.Next(); - if (!preserve_spaces && !quote_ && codepoint != kNonBreakingSpace && iswspace(codepoint)) { + if (!preserve_spaces_ && !quote_ && codepoint != kNonBreakingSpace && iswspace(codepoint)) { if (!last_codepoint_was_space_) { // Emit a space if it's the first. xml_string_.text += ' '; @@ -906,11 +902,11 @@ StringBuilder& StringBuilder::AppendText(const std::string& text, bool preserve_ break; } } - } else if (!preserve_spaces && codepoint == U'"') { + } else if (!preserve_spaces_ && codepoint == U'"') { // Only toggle the quote state when we are not preserving spaces. quote_ = !quote_; - } else if (!preserve_spaces && !quote_ && codepoint == U'\'') { + } else if (!preserve_spaces_ && !quote_ && codepoint == U'\'') { // This should be escaped when we are not preserving spaces error_ = StringPrintf("unescaped apostrophe in string\n\"%s\"", text.c_str()); return *this; diff --git a/tools/aapt2/ResourceUtils.h b/tools/aapt2/ResourceUtils.h index a8a312005e4e..f77766ee9061 100644 --- a/tools/aapt2/ResourceUtils.h +++ b/tools/aapt2/ResourceUtils.h @@ -276,10 +276,8 @@ class StringBuilder { // single quotations can be used without escaping them. explicit StringBuilder(bool preserve_spaces = false); - // Appends a chunk of text. If preserve_spaces is true, whitespace removal is not performed, and - // single quotations can be used without escaping them for this append. Otherwise, the - // StringBuilder will behave as it was constructed. - StringBuilder& AppendText(const std::string& text, bool preserve_spaces = false); + // Appends a chunk of text. + StringBuilder& AppendText(const std::string& text); // Starts a Span (tag) with the given name. The name is expected to be of the form: // "tag_name;attr1=value;attr2=value;" diff --git a/tools/aapt2/ResourceUtils_test.cpp b/tools/aapt2/ResourceUtils_test.cpp index 9018b0fc372a..3b77135a09eb 100644 --- a/tools/aapt2/ResourceUtils_test.cpp +++ b/tools/aapt2/ResourceUtils_test.cpp @@ -266,29 +266,6 @@ TEST(ResourceUtilsTest, StringBuilderUnicodeCodes) { TEST(ResourceUtilsTest, StringBuilderPreserveSpaces) { EXPECT_THAT(ResourceUtils::StringBuilder(true /*preserve_spaces*/).AppendText("\"").to_string(), Eq("\"")); - - // Single quotes should be able to be used without escaping them when preserving spaces and the - // spaces should not be trimmed - EXPECT_THAT(ResourceUtils::StringBuilder() - .AppendText(" hey guys ") - .AppendText(" 'this is so cool' ", /* preserve_spaces */ true) - .AppendText(" wow ") - .to_string(), - Eq(" hey guys 'this is so cool' wow ")); - - // Reading a double quote while preserving spaces should not change the quote state - EXPECT_THAT(ResourceUtils::StringBuilder() - .AppendText(" hey guys ") - .AppendText(" \"this is so cool' ", /* preserve_spaces */ true) - .AppendText(" wow ") - .to_string(), - Eq(" hey guys \"this is so cool' wow ")); - EXPECT_THAT(ResourceUtils::StringBuilder() - .AppendText(" hey guys\" ") - .AppendText(" \"this is so cool' ", /* preserve_spaces */ true) - .AppendText(" wow \" ") - .to_string(), - Eq(" hey guys \"this is so cool' wow ")); } } // namespace aapt diff --git a/tools/aapt2/format/binary/XmlFlattener.cpp b/tools/aapt2/format/binary/XmlFlattener.cpp index 2fe24245f3d9..afbaae4ee2a8 100644 --- a/tools/aapt2/format/binary/XmlFlattener.cpp +++ b/tools/aapt2/format/binary/XmlFlattener.cpp @@ -99,9 +99,6 @@ class XmlFlattenerVisitor : public xml::ConstVisitor { flat_node->lineNumber = util::HostToDevice32(node->line_number); flat_node->comment.index = util::HostToDevice32(-1); - // Process plain strings to make sure they get properly escaped. - text = StringBuilder(true /*preserve_spaces*/).AppendText(text).to_string(); - ResXMLTree_cdataExt* flat_text = writer.NextBlock<ResXMLTree_cdataExt>(); AddString(text, kLowPriority, &flat_text->data); writer.Finish(); diff --git a/tools/aapt2/format/binary/XmlFlattener_test.cpp b/tools/aapt2/format/binary/XmlFlattener_test.cpp index 25786b1659e7..1dac493359e4 100644 --- a/tools/aapt2/format/binary/XmlFlattener_test.cpp +++ b/tools/aapt2/format/binary/XmlFlattener_test.cpp @@ -118,7 +118,7 @@ TEST_F(XmlFlattenerTest, FlattenXmlWithNoCompiledAttributes) { ASSERT_THAT(tree.getAttributeCount(), Eq(0u)); ASSERT_THAT(tree.next(), Eq(android::ResXMLTree::TEXT)); - EXPECT_THAT(tree.getText(&len), StrEq(u"Some text\\")); + EXPECT_THAT(tree.getText(&len), StrEq(u"Some text\\\\")); ASSERT_THAT(tree.next(), Eq(android::ResXMLTree::END_TAG)); EXPECT_THAT(tree.getElementNamespace(&len), IsNull()); @@ -283,7 +283,7 @@ TEST_F(XmlFlattenerTest, ProcessEscapedStrings) { EXPECT_THAT(tree.getAttributeStringValue(idx, &len), StrEq(u"\"")); ASSERT_THAT(tree.next(), Eq(android::ResXMLTree::TEXT)); - EXPECT_THAT(tree.getText(&len), StrEq(u"\\d{5}")); + EXPECT_THAT(tree.getText(&len), StrEq(u"\\\\d{5}")); } TEST_F(XmlFlattenerTest, ProcessQuotes) { @@ -360,6 +360,7 @@ I J </item> + <item>\t K \n </item> <item> </item> </root>)"); @@ -439,6 +440,12 @@ I ASSERT_THAT(tree.next(), Eq(android::ResXMLTree::START_TAG)); EXPECT_THAT(tree.getElementName(&len), StrEq(u"item")); + ASSERT_THAT(tree.next(), Eq(android::ResXMLTree::TEXT)); + EXPECT_THAT(tree.getText(&len), StrEq(u"\\t K \\n ")); + ASSERT_THAT(tree.next(), Eq(android::ResXMLTree::END_TAG)); + + ASSERT_THAT(tree.next(), Eq(android::ResXMLTree::START_TAG)); + EXPECT_THAT(tree.getElementName(&len), StrEq(u"item")); ASSERT_THAT(tree.next(), Eq(android::ResXMLTree::END_TAG)); ASSERT_THAT(tree.next(), Eq(android::ResXMLTree::END_TAG)); |