Merge "AAPT2: Preserve line numbers when deserializing from binary XML" into oc-mr1-dev
This commit is contained in:
committed by
Android (Google) Code Review
commit
9b581c7bc1
@@ -274,6 +274,8 @@ std::unique_ptr<XmlResource> Inflate(const void* data, size_t data_len, IDiagnos
|
||||
switch (code) {
|
||||
case ResXMLParser::START_NAMESPACE: {
|
||||
NamespaceDecl decl;
|
||||
decl.line_number = tree.getLineNumber();
|
||||
|
||||
size_t len;
|
||||
const char16_t* str16 = tree.getNamespacePrefix(&len);
|
||||
if (str16) {
|
||||
@@ -288,6 +290,7 @@ std::unique_ptr<XmlResource> Inflate(const void* data, size_t data_len, IDiagnos
|
||||
if (pending_element == nullptr) {
|
||||
pending_element = util::make_unique<Element>();
|
||||
}
|
||||
pending_element->namespace_decls.push_back(std::move(decl));
|
||||
break;
|
||||
}
|
||||
|
||||
@@ -297,8 +300,8 @@ std::unique_ptr<XmlResource> Inflate(const void* data, size_t data_len, IDiagnos
|
||||
el = std::move(pending_element);
|
||||
} else {
|
||||
el = util::make_unique<Element>();
|
||||
;
|
||||
}
|
||||
el->line_number = tree.getLineNumber();
|
||||
|
||||
size_t len;
|
||||
const char16_t* str16 = tree.getElementNamespace(&len);
|
||||
|
||||
@@ -18,6 +18,7 @@
|
||||
|
||||
#include <string>
|
||||
|
||||
#include "flatten/XmlFlattener.h"
|
||||
#include "io/StringInputStream.h"
|
||||
#include "test/Test.h"
|
||||
|
||||
@@ -51,6 +52,36 @@ TEST(XmlDomTest, Inflate) {
|
||||
EXPECT_THAT(el->namespace_decls[0].prefix, StrEq("android"));
|
||||
}
|
||||
|
||||
TEST(XmlDomTest, BinaryInflate) {
|
||||
std::unique_ptr<IAaptContext> context = test::ContextBuilder().Build();
|
||||
std::unique_ptr<XmlResource> doc = util::make_unique<XmlResource>();
|
||||
doc->root = util::make_unique<Element>();
|
||||
doc->root->name = "Layout";
|
||||
doc->root->line_number = 2u;
|
||||
|
||||
NamespaceDecl decl;
|
||||
decl.uri = kSchemaAndroid;
|
||||
decl.prefix = "android";
|
||||
decl.line_number = 2u;
|
||||
doc->root->namespace_decls.push_back(decl);
|
||||
|
||||
BigBuffer buffer(4096);
|
||||
XmlFlattener flattener(&buffer, {});
|
||||
ASSERT_TRUE(flattener.Consume(context.get(), doc.get()));
|
||||
|
||||
auto block = util::Copy(buffer);
|
||||
std::unique_ptr<XmlResource> new_doc =
|
||||
Inflate(block.get(), buffer.size(), context->GetDiagnostics(), Source("test.xml"));
|
||||
ASSERT_THAT(new_doc, NotNull());
|
||||
|
||||
EXPECT_THAT(new_doc->root->name, StrEq("Layout"));
|
||||
EXPECT_THAT(new_doc->root->line_number, Eq(2u));
|
||||
ASSERT_THAT(new_doc->root->namespace_decls, SizeIs(1u));
|
||||
EXPECT_THAT(new_doc->root->namespace_decls[0].uri, StrEq(kSchemaAndroid));
|
||||
EXPECT_THAT(new_doc->root->namespace_decls[0].prefix, StrEq("android"));
|
||||
EXPECT_THAT(new_doc->root->namespace_decls[0].line_number, Eq(2u));
|
||||
}
|
||||
|
||||
// Escaping is handled after parsing of the values for resource-specific values.
|
||||
TEST(XmlDomTest, ForwardEscapes) {
|
||||
std::unique_ptr<XmlResource> doc = test::BuildXmlDom(R"(
|
||||
|
||||
Reference in New Issue
Block a user