Loading tools/aapt2/ResourceParser.cpp +15 −2 Original line number Diff line number Diff line Loading @@ -345,10 +345,23 @@ bool ResourceParser::parseResources(XmlPullParser* parser) { result = parseSymbol(parser, &parsedResource); } else if (elementName == u"public-group") { result = parsePublicGroup(parser, &parsedResource); } else { // Try parsing the elementName (or type) as a resource. These shall only be // resources like 'layout' or 'xml' and they can only be references. if (const ResourceType* type = parseResourceType(elementName)) { parsedResource.name.type = *type; parsedResource.value = parseXml(parser, android::ResTable_map::TYPE_REFERENCE, false); if (!parsedResource.value) { mDiag->error(DiagMessage(parsedResource.source) << "invalid value for type '" << *type << "'. Expected a reference"); result = false; } } else { mDiag->warn(DiagMessage(mSource.withLine(parser->getLineNumber())) << "unknown resource type '" << elementName << "'"); } } if (result) { // We successfully parsed the resource. Loading tools/aapt2/ResourceParser_test.cpp +8 −0 Original line number Diff line number Diff line Loading @@ -521,4 +521,12 @@ TEST_F(ResourceParserTest, AutoIncrementIdsInPublicGroup) { EXPECT_EQ(ResourceId(0x01010041), actualId); } TEST_F(ResourceParserTest, ExternalTypesShouldOnlyBeReferences) { std::string input = R"EOF(<item type="layout" name="foo">@layout/bar</item>)EOF"; ASSERT_TRUE(testParse(input)); input = R"EOF(<item type="layout" name="bar">"this is a string"</item>)EOF"; ASSERT_FALSE(testParse(input)); } } // namespace aapt Loading
tools/aapt2/ResourceParser.cpp +15 −2 Original line number Diff line number Diff line Loading @@ -345,10 +345,23 @@ bool ResourceParser::parseResources(XmlPullParser* parser) { result = parseSymbol(parser, &parsedResource); } else if (elementName == u"public-group") { result = parsePublicGroup(parser, &parsedResource); } else { // Try parsing the elementName (or type) as a resource. These shall only be // resources like 'layout' or 'xml' and they can only be references. if (const ResourceType* type = parseResourceType(elementName)) { parsedResource.name.type = *type; parsedResource.value = parseXml(parser, android::ResTable_map::TYPE_REFERENCE, false); if (!parsedResource.value) { mDiag->error(DiagMessage(parsedResource.source) << "invalid value for type '" << *type << "'. Expected a reference"); result = false; } } else { mDiag->warn(DiagMessage(mSource.withLine(parser->getLineNumber())) << "unknown resource type '" << elementName << "'"); } } if (result) { // We successfully parsed the resource. Loading
tools/aapt2/ResourceParser_test.cpp +8 −0 Original line number Diff line number Diff line Loading @@ -521,4 +521,12 @@ TEST_F(ResourceParserTest, AutoIncrementIdsInPublicGroup) { EXPECT_EQ(ResourceId(0x01010041), actualId); } TEST_F(ResourceParserTest, ExternalTypesShouldOnlyBeReferences) { std::string input = R"EOF(<item type="layout" name="foo">@layout/bar</item>)EOF"; ASSERT_TRUE(testParse(input)); input = R"EOF(<item type="layout" name="bar">"this is a string"</item>)EOF"; ASSERT_FALSE(testParse(input)); } } // namespace aapt