| // Copyright (c) 2010 The Chromium Embedded Framework 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 "include/cef_stream.h" |
| #include "include/cef_xml_reader.h" |
| #include "include/wrapper/cef_xml_object.h" |
| #include "tests/gtest/include/gtest/gtest.h" |
| |
| namespace { |
| |
| char g_test_xml[] = |
| "<?xml version=\"1.0\" encoding=\"ISO-8859-1\"?>\n" |
| "<?my_instruction my_value?>\n" |
| "<!DOCTYPE my_document SYSTEM \"example.dtd\" [\n" |
| " <!ENTITY EA \"EA Value\">\n" |
| " <!ENTITY EB \"EB Value\">\n" |
| "]>\n" |
| "<ns:obj xmlns:ns=\"http://www.example.org/ns\">\n" |
| " <ns:objA>value A</ns:objA>\n" |
| " <!-- my comment -->\n" |
| " <ns:objB>\n" |
| " <ns:objB_1>value B1</ns:objB_1>\n" |
| " <ns:objB_2><![CDATA[some <br/> data]]></ns:objB_2>\n" |
| " <ns:objB_3>&EB;</ns:objB_3>\n" |
| " <ns:objB_4><b>this is</b> mixed content &EA;</ns:objB_4>\n" |
| " </ns:objB>\n" |
| " <ns:objC ns:attr1=\"value C1\" ns:attr2=\"value C2\"/><ns:objD>" |
| "</ns:objD>\n" |
| "</ns:obj>\n"; |
| |
| } // namespace |
| |
| // Test XML reading |
| TEST(XmlReaderTest, Read) { |
| // Create the stream reader. |
| CefRefPtr<CefStreamReader> stream( |
| CefStreamReader::CreateForData(g_test_xml, sizeof(g_test_xml) - 1)); |
| ASSERT_TRUE(stream.get() != nullptr); |
| |
| // Create the XML reader. |
| CefRefPtr<CefXmlReader> reader(CefXmlReader::Create( |
| stream, XML_ENCODING_NONE, "http://www.example.org/example.xml")); |
| ASSERT_TRUE(reader.get() != nullptr); |
| |
| // Move to the processing instruction node. |
| ASSERT_TRUE(reader->MoveToNextNode()); |
| ASSERT_EQ(reader->GetDepth(), 0); |
| ASSERT_EQ(reader->GetType(), XML_NODE_PROCESSING_INSTRUCTION); |
| ASSERT_EQ(reader->GetLocalName(), "my_instruction"); |
| ASSERT_EQ(reader->GetQualifiedName(), "my_instruction"); |
| ASSERT_TRUE(reader->HasValue()); |
| ASSERT_EQ(reader->GetValue(), "my_value"); |
| |
| // Move to the DOCTYPE node. |
| ASSERT_TRUE(reader->MoveToNextNode()); |
| ASSERT_EQ(reader->GetDepth(), 0); |
| ASSERT_EQ(reader->GetType(), XML_NODE_DOCUMENT_TYPE); |
| ASSERT_EQ(reader->GetLocalName(), "my_document"); |
| ASSERT_EQ(reader->GetQualifiedName(), "my_document"); |
| ASSERT_FALSE(reader->HasValue()); |
| |
| // Move to ns:obj element start node. |
| ASSERT_TRUE(reader->MoveToNextNode()); |
| ASSERT_EQ(reader->GetDepth(), 0); |
| ASSERT_EQ(reader->GetType(), XML_NODE_ELEMENT_START); |
| ASSERT_EQ(reader->GetLocalName(), "obj"); |
| ASSERT_EQ(reader->GetPrefix(), "ns"); |
| ASSERT_EQ(reader->GetQualifiedName(), "ns:obj"); |
| ASSERT_EQ(reader->GetNamespaceURI(), "http://www.example.org/ns"); |
| ASSERT_TRUE(reader->HasAttributes()); |
| ASSERT_EQ(reader->GetAttributeCount(), (size_t)1); |
| ASSERT_EQ(reader->GetAttribute(0), "http://www.example.org/ns"); |
| ASSERT_EQ(reader->GetAttribute("xmlns:ns"), "http://www.example.org/ns"); |
| ASSERT_EQ(reader->GetAttribute("ns", "http://www.w3.org/2000/xmlns/"), |
| "http://www.example.org/ns"); |
| |
| // Move to the whitespace node. |
| ASSERT_TRUE(reader->MoveToNextNode()); |
| ASSERT_EQ(reader->GetType(), XML_NODE_WHITESPACE); |
| |
| // Move to the ns:objA element start node. |
| ASSERT_TRUE(reader->MoveToNextNode()); |
| ASSERT_EQ(reader->GetDepth(), 1); |
| ASSERT_EQ(reader->GetType(), XML_NODE_ELEMENT_START); |
| ASSERT_EQ(reader->GetLocalName(), "objA"); |
| ASSERT_EQ(reader->GetPrefix(), "ns"); |
| ASSERT_EQ(reader->GetQualifiedName(), "ns:objA"); |
| ASSERT_EQ(reader->GetNamespaceURI(), "http://www.example.org/ns"); |
| ASSERT_FALSE(reader->IsEmptyElement()); |
| ASSERT_FALSE(reader->HasAttributes()); |
| ASSERT_FALSE(reader->HasValue()); |
| |
| // Move to the ns:objA value node. |
| ASSERT_TRUE(reader->MoveToNextNode()); |
| ASSERT_EQ(reader->GetDepth(), 2); |
| ASSERT_EQ(reader->GetType(), XML_NODE_TEXT); |
| ASSERT_EQ(reader->GetLocalName(), "#text"); |
| ASSERT_EQ(reader->GetQualifiedName(), "#text"); |
| ASSERT_TRUE(reader->HasValue()); |
| ASSERT_EQ(reader->GetValue(), "value A"); |
| |
| // Move to the ns:objA element ending node. |
| ASSERT_TRUE(reader->MoveToNextNode()); |
| ASSERT_EQ(reader->GetDepth(), 1); |
| ASSERT_EQ(reader->GetType(), XML_NODE_ELEMENT_END); |
| ASSERT_EQ(reader->GetLocalName(), "objA"); |
| ASSERT_EQ(reader->GetPrefix(), "ns"); |
| ASSERT_EQ(reader->GetQualifiedName(), "ns:objA"); |
| ASSERT_EQ(reader->GetNamespaceURI(), "http://www.example.org/ns"); |
| ASSERT_FALSE(reader->IsEmptyElement()); |
| ASSERT_FALSE(reader->HasAttributes()); |
| ASSERT_FALSE(reader->HasValue()); |
| |
| // Move to the whitespace node. |
| ASSERT_TRUE(reader->MoveToNextNode()); |
| ASSERT_EQ(reader->GetDepth(), 1); |
| ASSERT_EQ(reader->GetType(), XML_NODE_WHITESPACE); |
| |
| // Move to the comment node. |
| ASSERT_TRUE(reader->MoveToNextNode()); |
| ASSERT_EQ(reader->GetDepth(), 1); |
| ASSERT_EQ(reader->GetType(), XML_NODE_COMMENT); |
| ASSERT_EQ(reader->GetLocalName(), "#comment"); |
| ASSERT_EQ(reader->GetQualifiedName(), "#comment"); |
| ASSERT_TRUE(reader->HasValue()); |
| ASSERT_EQ(reader->GetValue(), " my comment "); |
| |
| // Move to the whitespace node. |
| ASSERT_TRUE(reader->MoveToNextNode()); |
| ASSERT_EQ(reader->GetType(), XML_NODE_WHITESPACE); |
| |
| // Move to the ns:objB element start node. |
| ASSERT_TRUE(reader->MoveToNextNode()); |
| ASSERT_EQ(reader->GetDepth(), 1); |
| ASSERT_EQ(reader->GetType(), XML_NODE_ELEMENT_START); |
| ASSERT_EQ(reader->GetLocalName(), "objB"); |
| ASSERT_EQ(reader->GetPrefix(), "ns"); |
| ASSERT_EQ(reader->GetQualifiedName(), "ns:objB"); |
| ASSERT_EQ(reader->GetNamespaceURI(), "http://www.example.org/ns"); |
| ASSERT_FALSE(reader->IsEmptyElement()); |
| ASSERT_FALSE(reader->HasAttributes()); |
| ASSERT_FALSE(reader->HasValue()); |
| |
| // Move to the whitespace node. |
| ASSERT_TRUE(reader->MoveToNextNode()); |
| ASSERT_EQ(reader->GetType(), XML_NODE_WHITESPACE); |
| |
| // Move to the ns:objB_1 element start node. |
| ASSERT_TRUE(reader->MoveToNextNode()); |
| ASSERT_EQ(reader->GetDepth(), 2); |
| ASSERT_EQ(reader->GetType(), XML_NODE_ELEMENT_START); |
| ASSERT_EQ(reader->GetLocalName(), "objB_1"); |
| ASSERT_EQ(reader->GetPrefix(), "ns"); |
| ASSERT_EQ(reader->GetQualifiedName(), "ns:objB_1"); |
| ASSERT_EQ(reader->GetNamespaceURI(), "http://www.example.org/ns"); |
| ASSERT_FALSE(reader->IsEmptyElement()); |
| ASSERT_FALSE(reader->HasAttributes()); |
| ASSERT_FALSE(reader->HasValue()); |
| |
| // Move to the ns:objB_1 value node. |
| ASSERT_TRUE(reader->MoveToNextNode()); |
| ASSERT_EQ(reader->GetDepth(), 3); |
| ASSERT_EQ(reader->GetType(), XML_NODE_TEXT); |
| ASSERT_TRUE(reader->HasValue()); |
| ASSERT_EQ(reader->GetValue(), "value B1"); |
| |
| // Move to the ns:objB_1 element ending node. |
| ASSERT_TRUE(reader->MoveToNextNode()); |
| ASSERT_EQ(reader->GetDepth(), 2); |
| ASSERT_EQ(reader->GetType(), XML_NODE_ELEMENT_END); |
| ASSERT_EQ(reader->GetLocalName(), "objB_1"); |
| ASSERT_EQ(reader->GetPrefix(), "ns"); |
| ASSERT_EQ(reader->GetQualifiedName(), "ns:objB_1"); |
| ASSERT_EQ(reader->GetNamespaceURI(), "http://www.example.org/ns"); |
| ASSERT_FALSE(reader->IsEmptyElement()); |
| ASSERT_FALSE(reader->HasAttributes()); |
| ASSERT_FALSE(reader->HasValue()); |
| |
| // Move to the whitespace node. |
| ASSERT_TRUE(reader->MoveToNextNode()); |
| ASSERT_EQ(reader->GetType(), XML_NODE_WHITESPACE); |
| |
| // Move to the ns:objB_2 element start node. |
| ASSERT_TRUE(reader->MoveToNextNode()); |
| ASSERT_EQ(reader->GetDepth(), 2); |
| ASSERT_EQ(reader->GetType(), XML_NODE_ELEMENT_START); |
| ASSERT_EQ(reader->GetLocalName(), "objB_2"); |
| ASSERT_EQ(reader->GetPrefix(), "ns"); |
| ASSERT_EQ(reader->GetQualifiedName(), "ns:objB_2"); |
| ASSERT_EQ(reader->GetNamespaceURI(), "http://www.example.org/ns"); |
| ASSERT_FALSE(reader->IsEmptyElement()); |
| ASSERT_FALSE(reader->HasAttributes()); |
| ASSERT_FALSE(reader->HasValue()); |
| |
| // Move to the ns:objB_2 value node. |
| ASSERT_TRUE(reader->MoveToNextNode()); |
| ASSERT_EQ(reader->GetDepth(), 3); |
| ASSERT_EQ(reader->GetType(), XML_NODE_CDATA); |
| ASSERT_TRUE(reader->HasValue()); |
| ASSERT_EQ(reader->GetValue(), "some <br/> data"); |
| |
| // Move to the ns:objB_2 element ending node. |
| ASSERT_TRUE(reader->MoveToNextNode()); |
| ASSERT_EQ(reader->GetDepth(), 2); |
| ASSERT_EQ(reader->GetType(), XML_NODE_ELEMENT_END); |
| ASSERT_EQ(reader->GetLocalName(), "objB_2"); |
| ASSERT_EQ(reader->GetPrefix(), "ns"); |
| ASSERT_EQ(reader->GetQualifiedName(), "ns:objB_2"); |
| ASSERT_EQ(reader->GetNamespaceURI(), "http://www.example.org/ns"); |
| ASSERT_FALSE(reader->IsEmptyElement()); |
| ASSERT_FALSE(reader->HasAttributes()); |
| ASSERT_FALSE(reader->HasValue()); |
| |
| // Move to the whitespace node. |
| ASSERT_TRUE(reader->MoveToNextNode()); |
| ASSERT_EQ(reader->GetType(), XML_NODE_WHITESPACE); |
| |
| // Move to the ns:objB_3 element start node. |
| ASSERT_TRUE(reader->MoveToNextNode()); |
| ASSERT_EQ(reader->GetDepth(), 2); |
| ASSERT_EQ(reader->GetType(), XML_NODE_ELEMENT_START); |
| ASSERT_EQ(reader->GetLocalName(), "objB_3"); |
| ASSERT_EQ(reader->GetPrefix(), "ns"); |
| ASSERT_EQ(reader->GetQualifiedName(), "ns:objB_3"); |
| ASSERT_EQ(reader->GetNamespaceURI(), "http://www.example.org/ns"); |
| ASSERT_FALSE(reader->IsEmptyElement()); |
| ASSERT_FALSE(reader->HasAttributes()); |
| ASSERT_FALSE(reader->HasValue()); |
| |
| // Move to the EB entity reference node. |
| ASSERT_TRUE(reader->MoveToNextNode()); |
| ASSERT_EQ(reader->GetDepth(), 3); |
| ASSERT_EQ(reader->GetType(), XML_NODE_ENTITY_REFERENCE); |
| ASSERT_EQ(reader->GetLocalName(), "EB"); |
| ASSERT_EQ(reader->GetQualifiedName(), "EB"); |
| ASSERT_TRUE(reader->HasValue()); |
| ASSERT_EQ(reader->GetValue(), "EB Value"); |
| |
| // Move to the ns:objB_3 element ending node. |
| ASSERT_TRUE(reader->MoveToNextNode()); |
| ASSERT_EQ(reader->GetDepth(), 2); |
| ASSERT_EQ(reader->GetType(), XML_NODE_ELEMENT_END); |
| ASSERT_EQ(reader->GetLocalName(), "objB_3"); |
| ASSERT_EQ(reader->GetPrefix(), "ns"); |
| ASSERT_EQ(reader->GetQualifiedName(), "ns:objB_3"); |
| ASSERT_EQ(reader->GetNamespaceURI(), "http://www.example.org/ns"); |
| ASSERT_FALSE(reader->IsEmptyElement()); |
| ASSERT_FALSE(reader->HasAttributes()); |
| ASSERT_FALSE(reader->HasValue()); |
| |
| // Move to the whitespace node. |
| ASSERT_TRUE(reader->MoveToNextNode()); |
| ASSERT_EQ(reader->GetType(), XML_NODE_WHITESPACE); |
| |
| // Move to the ns:objB_4 element start node. |
| ASSERT_TRUE(reader->MoveToNextNode()); |
| ASSERT_EQ(reader->GetDepth(), 2); |
| ASSERT_EQ(reader->GetType(), XML_NODE_ELEMENT_START); |
| ASSERT_EQ(reader->GetLocalName(), "objB_4"); |
| ASSERT_EQ(reader->GetPrefix(), "ns"); |
| ASSERT_EQ(reader->GetQualifiedName(), "ns:objB_4"); |
| ASSERT_EQ(reader->GetNamespaceURI(), "http://www.example.org/ns"); |
| ASSERT_FALSE(reader->IsEmptyElement()); |
| ASSERT_FALSE(reader->HasAttributes()); |
| ASSERT_FALSE(reader->HasValue()); |
| ASSERT_EQ(reader->GetInnerXml(), "<b>this is</b> mixed content &EA;"); |
| ASSERT_EQ(reader->GetOuterXml(), |
| "<ns:objB_4 xmlns:ns=\"http://www.example.org/ns\">" |
| "<b>this is</b> mixed content &EA;</ns:objB_4>"); |
| |
| // Move to the <b> element node. |
| ASSERT_TRUE(reader->MoveToNextNode()); |
| ASSERT_EQ(reader->GetDepth(), 3); |
| ASSERT_EQ(reader->GetType(), XML_NODE_ELEMENT_START); |
| ASSERT_EQ(reader->GetLocalName(), "b"); |
| ASSERT_EQ(reader->GetQualifiedName(), "b"); |
| ASSERT_FALSE(reader->IsEmptyElement()); |
| ASSERT_FALSE(reader->HasAttributes()); |
| ASSERT_FALSE(reader->HasValue()); |
| |
| // Move to the text node. |
| ASSERT_TRUE(reader->MoveToNextNode()); |
| ASSERT_EQ(reader->GetDepth(), 4); |
| ASSERT_EQ(reader->GetType(), XML_NODE_TEXT); |
| ASSERT_EQ(reader->GetLocalName(), "#text"); |
| ASSERT_EQ(reader->GetQualifiedName(), "#text"); |
| ASSERT_TRUE(reader->HasValue()); |
| ASSERT_EQ(reader->GetValue(), "this is"); |
| |
| // Move to the </b> element node. |
| ASSERT_TRUE(reader->MoveToNextNode()); |
| ASSERT_EQ(reader->GetDepth(), 3); |
| ASSERT_EQ(reader->GetType(), XML_NODE_ELEMENT_END); |
| ASSERT_EQ(reader->GetLocalName(), "b"); |
| ASSERT_EQ(reader->GetQualifiedName(), "b"); |
| |
| // Move to the text node. |
| ASSERT_TRUE(reader->MoveToNextNode()); |
| ASSERT_EQ(reader->GetDepth(), 3); |
| ASSERT_EQ(reader->GetType(), XML_NODE_TEXT); |
| ASSERT_EQ(reader->GetLocalName(), "#text"); |
| ASSERT_EQ(reader->GetQualifiedName(), "#text"); |
| ASSERT_TRUE(reader->HasValue()); |
| ASSERT_EQ(reader->GetValue(), " mixed content "); |
| |
| // Move to the EA entity reference node. |
| ASSERT_TRUE(reader->MoveToNextNode()); |
| ASSERT_EQ(reader->GetDepth(), 3); |
| ASSERT_EQ(reader->GetType(), XML_NODE_ENTITY_REFERENCE); |
| ASSERT_EQ(reader->GetLocalName(), "EA"); |
| ASSERT_EQ(reader->GetQualifiedName(), "EA"); |
| ASSERT_TRUE(reader->HasValue()); |
| ASSERT_EQ(reader->GetValue(), "EA Value"); |
| |
| // Move to the ns:objB_4 element ending node. |
| ASSERT_TRUE(reader->MoveToNextNode()); |
| ASSERT_EQ(reader->GetDepth(), 2); |
| ASSERT_EQ(reader->GetType(), XML_NODE_ELEMENT_END); |
| ASSERT_EQ(reader->GetLocalName(), "objB_4"); |
| ASSERT_EQ(reader->GetPrefix(), "ns"); |
| ASSERT_EQ(reader->GetQualifiedName(), "ns:objB_4"); |
| ASSERT_EQ(reader->GetNamespaceURI(), "http://www.example.org/ns"); |
| ASSERT_FALSE(reader->IsEmptyElement()); |
| ASSERT_FALSE(reader->HasAttributes()); |
| ASSERT_FALSE(reader->HasValue()); |
| |
| // Move to the whitespace node. |
| ASSERT_TRUE(reader->MoveToNextNode()); |
| ASSERT_EQ(reader->GetType(), XML_NODE_WHITESPACE); |
| |
| // Move to the ns:objB element ending node. |
| ASSERT_TRUE(reader->MoveToNextNode()); |
| ASSERT_EQ(reader->GetDepth(), 1); |
| ASSERT_EQ(reader->GetType(), XML_NODE_ELEMENT_END); |
| ASSERT_EQ(reader->GetLocalName(), "objB"); |
| ASSERT_EQ(reader->GetPrefix(), "ns"); |
| ASSERT_EQ(reader->GetQualifiedName(), "ns:objB"); |
| ASSERT_EQ(reader->GetNamespaceURI(), "http://www.example.org/ns"); |
| ASSERT_FALSE(reader->IsEmptyElement()); |
| ASSERT_FALSE(reader->HasAttributes()); |
| ASSERT_FALSE(reader->HasValue()); |
| |
| // Move to the whitespace node. |
| ASSERT_TRUE(reader->MoveToNextNode()); |
| ASSERT_EQ(reader->GetType(), XML_NODE_WHITESPACE); |
| |
| // Move to the ns:objC element start node. |
| ASSERT_TRUE(reader->MoveToNextNode()); |
| ASSERT_EQ(reader->GetDepth(), 1); |
| ASSERT_EQ(reader->GetType(), XML_NODE_ELEMENT_START); |
| ASSERT_EQ(reader->GetLocalName(), "objC"); |
| ASSERT_EQ(reader->GetPrefix(), "ns"); |
| ASSERT_EQ(reader->GetQualifiedName(), "ns:objC"); |
| ASSERT_EQ(reader->GetNamespaceURI(), "http://www.example.org/ns"); |
| ASSERT_TRUE(reader->IsEmptyElement()); |
| ASSERT_TRUE(reader->HasAttributes()); |
| ASSERT_FALSE(reader->HasValue()); |
| ASSERT_EQ(reader->GetAttributeCount(), (size_t)2); |
| ASSERT_EQ(reader->GetAttribute(0), "value C1"); |
| ASSERT_EQ(reader->GetAttribute("ns:attr1"), "value C1"); |
| ASSERT_EQ(reader->GetAttribute("attr1", "http://www.example.org/ns"), |
| "value C1"); |
| ASSERT_EQ(reader->GetAttribute(1), "value C2"); |
| ASSERT_EQ(reader->GetAttribute("ns:attr2"), "value C2"); |
| ASSERT_EQ(reader->GetAttribute("attr2", "http://www.example.org/ns"), |
| "value C2"); |
| |
| // Move to the ns:attr1 attribute. |
| ASSERT_TRUE(reader->MoveToFirstAttribute()); |
| ASSERT_EQ(reader->GetDepth(), 2); |
| ASSERT_EQ(reader->GetType(), XML_NODE_ATTRIBUTE); |
| ASSERT_EQ(reader->GetLocalName(), "attr1"); |
| ASSERT_EQ(reader->GetPrefix(), "ns"); |
| ASSERT_EQ(reader->GetQualifiedName(), "ns:attr1"); |
| ASSERT_EQ(reader->GetNamespaceURI(), "http://www.example.org/ns"); |
| ASSERT_TRUE(reader->HasValue()); |
| ASSERT_FALSE(reader->IsEmptyElement()); |
| ASSERT_FALSE(reader->HasAttributes()); |
| ASSERT_EQ(reader->GetValue(), "value C1"); |
| |
| // Move to the ns:attr2 attribute. |
| ASSERT_TRUE(reader->MoveToNextAttribute()); |
| ASSERT_EQ(reader->GetDepth(), 2); |
| ASSERT_EQ(reader->GetType(), XML_NODE_ATTRIBUTE); |
| ASSERT_EQ(reader->GetLocalName(), "attr2"); |
| ASSERT_EQ(reader->GetPrefix(), "ns"); |
| ASSERT_EQ(reader->GetQualifiedName(), "ns:attr2"); |
| ASSERT_EQ(reader->GetNamespaceURI(), "http://www.example.org/ns"); |
| ASSERT_TRUE(reader->HasValue()); |
| ASSERT_FALSE(reader->IsEmptyElement()); |
| ASSERT_FALSE(reader->HasAttributes()); |
| ASSERT_EQ(reader->GetValue(), "value C2"); |
| |
| // No more attributes. |
| ASSERT_FALSE(reader->MoveToNextAttribute()); |
| |
| // Return to the ns:objC element start node. |
| ASSERT_TRUE(reader->MoveToCarryingElement()); |
| ASSERT_EQ(reader->GetDepth(), 1); |
| ASSERT_EQ(reader->GetType(), XML_NODE_ELEMENT_START); |
| ASSERT_EQ(reader->GetQualifiedName(), "ns:objC"); |
| |
| // Move to the ns:attr1 attribute. |
| ASSERT_TRUE(reader->MoveToAttribute(0)); |
| ASSERT_EQ(reader->GetDepth(), 2); |
| ASSERT_EQ(reader->GetType(), XML_NODE_ATTRIBUTE); |
| ASSERT_EQ(reader->GetLocalName(), "attr1"); |
| ASSERT_EQ(reader->GetPrefix(), "ns"); |
| ASSERT_EQ(reader->GetQualifiedName(), "ns:attr1"); |
| ASSERT_EQ(reader->GetNamespaceURI(), "http://www.example.org/ns"); |
| ASSERT_TRUE(reader->HasValue()); |
| ASSERT_FALSE(reader->IsEmptyElement()); |
| ASSERT_FALSE(reader->HasAttributes()); |
| ASSERT_EQ(reader->GetValue(), "value C1"); |
| |
| // Return to the ns:objC element start node. |
| ASSERT_TRUE(reader->MoveToCarryingElement()); |
| ASSERT_EQ(reader->GetDepth(), 1); |
| ASSERT_EQ(reader->GetType(), XML_NODE_ELEMENT_START); |
| ASSERT_EQ(reader->GetQualifiedName(), "ns:objC"); |
| |
| // Move to the ns:attr2 attribute. |
| ASSERT_TRUE(reader->MoveToAttribute("ns:attr2")); |
| ASSERT_EQ(reader->GetDepth(), 2); |
| ASSERT_EQ(reader->GetType(), XML_NODE_ATTRIBUTE); |
| ASSERT_EQ(reader->GetLocalName(), "attr2"); |
| ASSERT_EQ(reader->GetPrefix(), "ns"); |
| ASSERT_EQ(reader->GetQualifiedName(), "ns:attr2"); |
| ASSERT_EQ(reader->GetNamespaceURI(), "http://www.example.org/ns"); |
| ASSERT_TRUE(reader->HasValue()); |
| ASSERT_FALSE(reader->IsEmptyElement()); |
| ASSERT_FALSE(reader->HasAttributes()); |
| ASSERT_EQ(reader->GetValue(), "value C2"); |
| |
| // Move to the ns:attr1 attribute without returning to the ns:objC element. |
| ASSERT_TRUE(reader->MoveToAttribute("attr1", "http://www.example.org/ns")); |
| ASSERT_EQ(reader->GetDepth(), 2); |
| ASSERT_EQ(reader->GetType(), XML_NODE_ATTRIBUTE); |
| ASSERT_EQ(reader->GetLocalName(), "attr1"); |
| ASSERT_EQ(reader->GetPrefix(), "ns"); |
| ASSERT_EQ(reader->GetQualifiedName(), "ns:attr1"); |
| ASSERT_EQ(reader->GetNamespaceURI(), "http://www.example.org/ns"); |
| ASSERT_TRUE(reader->HasValue()); |
| ASSERT_FALSE(reader->IsEmptyElement()); |
| ASSERT_FALSE(reader->HasAttributes()); |
| ASSERT_EQ(reader->GetValue(), "value C1"); |
| |
| // Move to the ns:objD element start node. |
| ASSERT_TRUE(reader->MoveToNextNode()); |
| ASSERT_EQ(reader->GetDepth(), 1); |
| ASSERT_EQ(reader->GetType(), XML_NODE_ELEMENT_START); |
| ASSERT_EQ(reader->GetLocalName(), "objD"); |
| ASSERT_EQ(reader->GetPrefix(), "ns"); |
| ASSERT_EQ(reader->GetQualifiedName(), "ns:objD"); |
| ASSERT_FALSE(reader->IsEmptyElement()); |
| ASSERT_FALSE(reader->HasAttributes()); |
| ASSERT_FALSE(reader->HasValue()); |
| |
| // Move to the ns:objD element end node. |
| ASSERT_TRUE(reader->MoveToNextNode()); |
| ASSERT_EQ(reader->GetDepth(), 1); |
| ASSERT_EQ(reader->GetType(), XML_NODE_ELEMENT_END); |
| ASSERT_EQ(reader->GetLocalName(), "objD"); |
| ASSERT_EQ(reader->GetPrefix(), "ns"); |
| ASSERT_EQ(reader->GetQualifiedName(), "ns:objD"); |
| ASSERT_FALSE(reader->IsEmptyElement()); |
| ASSERT_FALSE(reader->HasAttributes()); |
| ASSERT_FALSE(reader->HasValue()); |
| |
| // Move to the whitespace node without returning to the ns:objC element. |
| ASSERT_TRUE(reader->MoveToNextNode()); |
| ASSERT_EQ(reader->GetType(), XML_NODE_WHITESPACE); |
| |
| // Move to ns:obj element ending node. |
| ASSERT_TRUE(reader->MoveToNextNode()); |
| ASSERT_EQ(reader->GetDepth(), 0); |
| ASSERT_EQ(reader->GetType(), XML_NODE_ELEMENT_END); |
| ASSERT_EQ(reader->GetLocalName(), "obj"); |
| ASSERT_EQ(reader->GetPrefix(), "ns"); |
| ASSERT_EQ(reader->GetQualifiedName(), "ns:obj"); |
| ASSERT_EQ(reader->GetNamespaceURI(), "http://www.example.org/ns"); |
| ASSERT_FALSE(reader->IsEmptyElement()); |
| ASSERT_TRUE(reader->HasAttributes()); |
| ASSERT_FALSE(reader->HasValue()); |
| // Strangely, the end node will report if the starting node has attributes |
| // but will not provide access to them. |
| ASSERT_TRUE(reader->HasAttributes()); |
| ASSERT_EQ(reader->GetAttributeCount(), (size_t)0); |
| |
| // And we're done. |
| ASSERT_FALSE(reader->MoveToNextNode()); |
| |
| ASSERT_TRUE(reader->Close()); |
| } |
| |
| // Test XML read error handling. |
| TEST(XmlReaderTest, ReadError) { |
| char test_str[] = |
| "<?xml version=\"1.0\" encoding=\"ISO-8859-1\"?>\n" |
| "<!ATTRIBUTE foo bar>\n"; |
| |
| // Create the stream reader. |
| CefRefPtr<CefStreamReader> stream( |
| CefStreamReader::CreateForData(test_str, sizeof(test_str) - 1)); |
| ASSERT_TRUE(stream.get() != nullptr); |
| |
| // Create the XML reader. |
| CefRefPtr<CefXmlReader> reader(CefXmlReader::Create( |
| stream, XML_ENCODING_NONE, "http://www.example.org/example.xml")); |
| ASSERT_TRUE(reader.get() != nullptr); |
| |
| // Move to the processing instruction node and generate parser error. |
| ASSERT_FALSE(reader->MoveToNextNode()); |
| ASSERT_TRUE(reader->HasError()); |
| } |
| |
| // Test XmlObject load behavior. |
| TEST(XmlReaderTest, ObjectLoad) { |
| // Create the stream reader. |
| CefRefPtr<CefStreamReader> stream( |
| CefStreamReader::CreateForData(g_test_xml, sizeof(g_test_xml) - 1)); |
| ASSERT_TRUE(stream.get() != nullptr); |
| |
| // Create the XML reader. |
| CefRefPtr<CefXmlObject> object(new CefXmlObject("object")); |
| ASSERT_TRUE(object->Load(stream, XML_ENCODING_NONE, |
| "http://www.example.org/example.xml", nullptr)); |
| |
| ASSERT_FALSE(object->HasAttributes()); |
| ASSERT_TRUE(object->HasChildren()); |
| ASSERT_EQ(object->GetChildCount(), (size_t)1); |
| |
| CefRefPtr<CefXmlObject> obj(object->FindChild("ns:obj")); |
| ASSERT_TRUE(obj.get()); |
| ASSERT_TRUE(obj->HasChildren()); |
| ASSERT_EQ(obj->GetChildCount(), (size_t)4); |
| |
| CefRefPtr<CefXmlObject> obj_child(obj->FindChild("ns:objC")); |
| ASSERT_TRUE(obj_child.get()); |
| ASSERT_EQ(obj_child->GetName(), "ns:objC"); |
| ASSERT_FALSE(obj_child->HasChildren()); |
| ASSERT_FALSE(obj_child->HasValue()); |
| ASSERT_TRUE(obj_child->HasAttributes()); |
| |
| CefXmlObject::ObjectVector obj_children; |
| ASSERT_EQ(obj->GetChildren(obj_children), (size_t)4); |
| ASSERT_EQ(obj_children.size(), (size_t)4); |
| |
| CefXmlObject::ObjectVector::const_iterator it = obj_children.begin(); |
| for (int ct = 0; it != obj_children.end(); ++it, ++ct) { |
| obj_child = *it; |
| ASSERT_TRUE(obj_child.get()); |
| if (ct == 0) { |
| // ns:objA |
| ASSERT_EQ(obj_child->GetName(), "ns:objA"); |
| ASSERT_FALSE(obj_child->HasChildren()); |
| ASSERT_TRUE(obj_child->HasValue()); |
| ASSERT_FALSE(obj_child->HasAttributes()); |
| ASSERT_EQ(obj_child->GetValue(), "value A"); |
| } else if (ct == 1) { |
| // ns:objB |
| ASSERT_EQ(obj_child->GetName(), "ns:objB"); |
| ASSERT_TRUE(obj_child->HasChildren()); |
| ASSERT_FALSE(obj_child->HasValue()); |
| ASSERT_FALSE(obj_child->HasAttributes()); |
| ASSERT_EQ(obj_child->GetChildCount(), (size_t)4); |
| obj_child = obj_child->FindChild("ns:objB_4"); |
| ASSERT_TRUE(obj_child.get()); |
| ASSERT_TRUE(obj_child->HasValue()); |
| ASSERT_EQ(obj_child->GetValue(), "<b>this is</b> mixed content EA Value"); |
| } else if (ct == 2) { |
| // ns:objC |
| ASSERT_EQ(obj_child->GetName(), "ns:objC"); |
| ASSERT_FALSE(obj_child->HasChildren()); |
| ASSERT_FALSE(obj_child->HasValue()); |
| ASSERT_TRUE(obj_child->HasAttributes()); |
| |
| CefXmlObject::AttributeMap attribs; |
| ASSERT_EQ(obj_child->GetAttributes(attribs), (size_t)2); |
| ASSERT_EQ(attribs.size(), (size_t)2); |
| ASSERT_EQ(attribs["ns:attr1"], "value C1"); |
| ASSERT_EQ(attribs["ns:attr2"], "value C2"); |
| |
| ASSERT_EQ(obj_child->GetAttributeCount(), (size_t)2); |
| ASSERT_TRUE(obj_child->HasAttribute("ns:attr1")); |
| ASSERT_EQ(obj_child->GetAttributeValue("ns:attr1"), "value C1"); |
| ASSERT_TRUE(obj_child->HasAttribute("ns:attr2")); |
| ASSERT_EQ(obj_child->GetAttributeValue("ns:attr2"), "value C2"); |
| } else if (ct == 3) { |
| // ns:objD |
| ASSERT_EQ(obj_child->GetName(), "ns:objD"); |
| ASSERT_FALSE(obj_child->HasChildren()); |
| ASSERT_FALSE(obj_child->HasValue()); |
| ASSERT_FALSE(obj_child->HasAttributes()); |
| } |
| } |
| } |
| |
| // Test XmlObject load error handling behavior. |
| TEST(XmlReaderTest, ObjectLoadError) { |
| // Test start/end tag mismatch error. |
| { |
| char error_xml[] = "<obj>\n<foo>\n</obj>\n</foo>"; |
| |
| // Create the stream reader. |
| CefRefPtr<CefStreamReader> stream( |
| CefStreamReader::CreateForData(error_xml, sizeof(error_xml) - 1)); |
| ASSERT_TRUE(stream.get() != nullptr); |
| |
| CefString error_str; |
| |
| // Create the XML reader. |
| CefRefPtr<CefXmlObject> object(new CefXmlObject("object")); |
| ASSERT_FALSE(object->Load(stream, XML_ENCODING_NONE, |
| "http://www.example.org/example.xml", |
| &error_str)); |
| ASSERT_EQ(error_str, |
| "Opening and ending tag mismatch: foo line 2 and obj, line 3"); |
| } |
| |
| // Test value following child error. |
| { |
| char error_xml[] = "<obj>\n<foo>\n</foo>disallowed value\n</obj>"; |
| |
| // Create the stream reader. |
| CefRefPtr<CefStreamReader> stream( |
| CefStreamReader::CreateForData(error_xml, sizeof(error_xml) - 1)); |
| ASSERT_TRUE(stream.get() != nullptr); |
| |
| CefString error_str; |
| |
| // Create the XML reader. |
| CefRefPtr<CefXmlObject> object(new CefXmlObject("object")); |
| ASSERT_FALSE(object->Load(stream, XML_ENCODING_NONE, |
| "http://www.example.org/example.xml", |
| &error_str)); |
| ASSERT_EQ(error_str, "Value following child element, line 4"); |
| } |
| } |