Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 /* | 1 /* |
| 2 * Copyright (C) 2000 Peter Kelly (pmk@post.com) | 2 * Copyright (C) 2000 Peter Kelly (pmk@post.com) |
| 3 * Copyright (C) 2005, 2006, 2008, 2014 Apple Inc. All rights reserved. | 3 * Copyright (C) 2005, 2006, 2008, 2014 Apple Inc. All rights reserved. |
| 4 * Copyright (C) 2006 Alexey Proskuryakov (ap@webkit.org) | 4 * Copyright (C) 2006 Alexey Proskuryakov (ap@webkit.org) |
| 5 * Copyright (C) 2007 Samuel Weinig (sam@webkit.org) | 5 * Copyright (C) 2007 Samuel Weinig (sam@webkit.org) |
| 6 * Copyright (C) 2008 Nokia Corporation and/or its subsidiary(-ies) | 6 * Copyright (C) 2008 Nokia Corporation and/or its subsidiary(-ies) |
| 7 * Copyright (C) 2008 Holger Hans Peter Freyther | 7 * Copyright (C) 2008 Holger Hans Peter Freyther |
| 8 * Copyright (C) 2008 Torch Mobile Inc. All rights reserved. (http://www.torchmo bile.com/) | 8 * Copyright (C) 2008 Torch Mobile Inc. All rights reserved. |
| 9 * (http://www.torchmobile.com/) | |
| 9 * | 10 * |
| 10 * This library is free software; you can redistribute it and/or | 11 * This library is free software; you can redistribute it and/or |
| 11 * modify it under the terms of the GNU Library General Public | 12 * modify it under the terms of the GNU Library General Public |
| 12 * License as published by the Free Software Foundation; either | 13 * License as published by the Free Software Foundation; either |
| 13 * version 2 of the License, or (at your option) any later version. | 14 * version 2 of the License, or (at your option) any later version. |
| 14 * | 15 * |
| 15 * This library is distributed in the hope that it will be useful, | 16 * This library is distributed in the hope that it will be useful, |
| 16 * but WITHOUT ANY WARRANTY; without even the implied warranty of | 17 * but WITHOUT ANY WARRANTY; without even the implied warranty of |
| 17 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU | 18 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU |
| 18 * Library General Public License for more details. | 19 * Library General Public License for more details. |
| (...skipping 361 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 380 m_pendingScript->removeClient(this); | 381 m_pendingScript->removeClient(this); |
| 381 m_pendingScript = nullptr; | 382 m_pendingScript = nullptr; |
| 382 m_parserBlockingPendingScriptLoadStartTime = 0.0; | 383 m_parserBlockingPendingScriptLoadStartTime = 0.0; |
| 383 } | 384 } |
| 384 clearCurrentNodeStack(); | 385 clearCurrentNodeStack(); |
| 385 ScriptableDocumentParser::detach(); | 386 ScriptableDocumentParser::detach(); |
| 386 } | 387 } |
| 387 | 388 |
| 388 void XMLDocumentParser::end() { | 389 void XMLDocumentParser::end() { |
| 389 TRACE_EVENT0("blink", "XMLDocumentParser::end"); | 390 TRACE_EVENT0("blink", "XMLDocumentParser::end"); |
| 390 // XMLDocumentParserLibxml2 will do bad things to the document if doEnd() is c alled. | 391 // XMLDocumentParserLibxml2 will do bad things to the document if doEnd() is |
| 391 // I don't believe XMLDocumentParserQt needs doEnd called in the fragment case . | 392 // called. I don't believe XMLDocumentParserQt needs doEnd called in the |
|
jbroman
2016/10/04 19:56:51
super-duper-nit: vim likes to put two spaces betwe
Nico
2016/10/04 20:17:12
I use vim's gq to join lines manually, and it defa
| |
| 393 // fragment case. | |
| 392 DCHECK(!m_parsingFragment); | 394 DCHECK(!m_parsingFragment); |
| 393 | 395 |
| 394 doEnd(); | 396 doEnd(); |
| 395 | 397 |
| 396 // doEnd() call above can detach the parser and null out its document. | 398 // doEnd() call above can detach the parser and null out its document. |
| 397 // In that case, we just bail out. | 399 // In that case, we just bail out. |
| 398 if (isDetached()) | 400 if (isDetached()) |
| 399 return; | 401 return; |
| 400 | 402 |
| 401 // doEnd() could process a script tag, thus pausing parsing. | 403 // doEnd() could process a script tag, thus pausing parsing. |
| (...skipping 200 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 602 return false; | 604 return false; |
| 603 | 605 |
| 604 // The libxml doesn't give us a lot of context for deciding whether to allow | 606 // The libxml doesn't give us a lot of context for deciding whether to allow |
| 605 // this request. In the worst case, this load could be for an external | 607 // this request. In the worst case, this load could be for an external |
| 606 // entity and the resulting document could simply read the retrieved | 608 // entity and the resulting document could simply read the retrieved |
| 607 // content. If we had more context, we could potentially allow the parser to | 609 // content. If we had more context, we could potentially allow the parser to |
| 608 // load a DTD. As things stand, we take the conservative route and allow | 610 // load a DTD. As things stand, we take the conservative route and allow |
| 609 // same-origin requests only. | 611 // same-origin requests only. |
| 610 if (!XMLDocumentParserScope::currentDocument->getSecurityOrigin()->canRequest( | 612 if (!XMLDocumentParserScope::currentDocument->getSecurityOrigin()->canRequest( |
| 611 url)) { | 613 url)) { |
| 612 // FIXME: This is copy/pasted. We should probably build console logging into canRequest(). | 614 // FIXME: This is copy/pasted. We should probably build console logging into |
| 615 // canRequest(). | |
| 613 if (!url.isNull()) { | 616 if (!url.isNull()) { |
| 614 String message = | 617 String message = |
| 615 "Unsafe attempt to load URL " + url.elidedString() + | 618 "Unsafe attempt to load URL " + url.elidedString() + |
| 616 " from frame with URL " + | 619 " from frame with URL " + |
| 617 XMLDocumentParserScope::currentDocument->url().elidedString() + | 620 XMLDocumentParserScope::currentDocument->url().elidedString() + |
| 618 ". Domains, protocols and ports must match.\n"; | 621 ". Domains, protocols and ports must match.\n"; |
| 619 XMLDocumentParserScope::currentDocument->addConsoleMessage( | 622 XMLDocumentParserScope::currentDocument->addConsoleMessage( |
| 620 ConsoleMessage::create(SecurityMessageSource, ErrorMessageLevel, | 623 ConsoleMessage::create(SecurityMessageSource, ErrorMessageLevel, |
| 621 message)); | 624 message)); |
| 622 } | 625 } |
| (...skipping 195 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 818 Element* element = elemStack.last(); | 821 Element* element = elemStack.last(); |
| 819 AttributeCollection attributes = element->attributes(); | 822 AttributeCollection attributes = element->attributes(); |
| 820 for (auto& attribute : attributes) { | 823 for (auto& attribute : attributes) { |
| 821 if (attribute.localName() == xmlnsAtom) | 824 if (attribute.localName() == xmlnsAtom) |
| 822 m_defaultNamespaceURI = attribute.value(); | 825 m_defaultNamespaceURI = attribute.value(); |
| 823 else if (attribute.prefix() == xmlnsAtom) | 826 else if (attribute.prefix() == xmlnsAtom) |
| 824 m_prefixToNamespaceMap.set(attribute.localName(), attribute.value()); | 827 m_prefixToNamespaceMap.set(attribute.localName(), attribute.value()); |
| 825 } | 828 } |
| 826 } | 829 } |
| 827 | 830 |
| 828 // If the parent element is not in document tree, there may be no xmlns attrib ute; just default to the parent's namespace. | 831 // If the parent element is not in document tree, there may be no xmlns |
| 832 // attribute; just default to the parent's namespace. | |
| 829 if (m_defaultNamespaceURI.isNull() && !parentElement->isConnected()) | 833 if (m_defaultNamespaceURI.isNull() && !parentElement->isConnected()) |
| 830 m_defaultNamespaceURI = parentElement->namespaceURI(); | 834 m_defaultNamespaceURI = parentElement->namespaceURI(); |
| 831 } | 835 } |
| 832 | 836 |
| 833 XMLParserContext::~XMLParserContext() { | 837 XMLParserContext::~XMLParserContext() { |
| 834 if (m_context->myDoc) | 838 if (m_context->myDoc) |
| 835 xmlFreeDoc(m_context->myDoc); | 839 xmlFreeDoc(m_context->myDoc); |
| 836 xmlFreeParserCtxt(m_context); | 840 xmlFreeParserCtxt(m_context); |
| 837 } | 841 } |
| 838 | 842 |
| (...skipping 540 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1379 char* target, | 1383 char* target, |
| 1380 size_t targetSize) { | 1384 size_t targetSize) { |
| 1381 const char* originalTarget = target; | 1385 const char* originalTarget = target; |
| 1382 WTF::Unicode::ConversionResult conversionResult = | 1386 WTF::Unicode::ConversionResult conversionResult = |
| 1383 WTF::Unicode::convertUTF16ToUTF8(&utf16Entity, | 1387 WTF::Unicode::convertUTF16ToUTF8(&utf16Entity, |
| 1384 utf16Entity + numberOfCodeUnits, &target, | 1388 utf16Entity + numberOfCodeUnits, &target, |
| 1385 target + targetSize); | 1389 target + targetSize); |
| 1386 if (conversionResult != WTF::Unicode::conversionOK) | 1390 if (conversionResult != WTF::Unicode::conversionOK) |
| 1387 return 0; | 1391 return 0; |
| 1388 | 1392 |
| 1389 // Even though we must pass the length, libxml expects the entity string to be null terminated. | 1393 // Even though we must pass the length, libxml expects the entity string to be |
| 1394 // null terminated. | |
| 1390 DCHECK_GT(target, originalTarget + 1); | 1395 DCHECK_GT(target, originalTarget + 1); |
| 1391 *target = '\0'; | 1396 *target = '\0'; |
| 1392 return target - originalTarget; | 1397 return target - originalTarget; |
| 1393 } | 1398 } |
| 1394 | 1399 |
| 1395 static xmlEntityPtr getXHTMLEntity(const xmlChar* name) { | 1400 static xmlEntityPtr getXHTMLEntity(const xmlChar* name) { |
| 1396 UChar utf16DecodedEntity[4]; | 1401 UChar utf16DecodedEntity[4]; |
| 1397 size_t numberOfCodeUnits = decodeNamedEntityToUCharArray( | 1402 size_t numberOfCodeUnits = decodeNamedEntityToUCharArray( |
| 1398 reinterpret_cast<const char*>(name), utf16DecodedEntity); | 1403 reinterpret_cast<const char*>(name), utf16DecodedEntity); |
| 1399 if (!numberOfCodeUnits) | 1404 if (!numberOfCodeUnits) |
| (...skipping 79 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1479 // http://bugzilla.gnome.org/show_bug.cgi?id=172255 | 1484 // http://bugzilla.gnome.org/show_bug.cgi?id=172255 |
| 1480 // http://bugs.webkit.org/show_bug.cgi?id=5792 | 1485 // http://bugs.webkit.org/show_bug.cgi?id=5792 |
| 1481 } | 1486 } |
| 1482 | 1487 |
| 1483 void XMLDocumentParser::initializeParserContext(const CString& chunk) { | 1488 void XMLDocumentParser::initializeParserContext(const CString& chunk) { |
| 1484 xmlSAXHandler sax; | 1489 xmlSAXHandler sax; |
| 1485 memset(&sax, 0, sizeof(sax)); | 1490 memset(&sax, 0, sizeof(sax)); |
| 1486 | 1491 |
| 1487 // According to http://xmlsoft.org/html/libxml-tree.html#xmlSAXHandler and | 1492 // According to http://xmlsoft.org/html/libxml-tree.html#xmlSAXHandler and |
| 1488 // http://xmlsoft.org/html/libxml-parser.html#fatalErrorSAXFunc the SAX | 1493 // http://xmlsoft.org/html/libxml-parser.html#fatalErrorSAXFunc the SAX |
| 1489 // fatalError callback is unused; error gets all the errors. Use normalErrorHa ndler | 1494 // fatalError callback is unused; error gets all the errors. Use |
| 1490 // for both the error and fatalError callbacks. | 1495 // normalErrorHandler for both the error and fatalError callbacks. |
| 1491 sax.error = normalErrorHandler; | 1496 sax.error = normalErrorHandler; |
| 1492 sax.fatalError = normalErrorHandler; | 1497 sax.fatalError = normalErrorHandler; |
| 1493 sax.characters = charactersHandler; | 1498 sax.characters = charactersHandler; |
| 1494 sax.processingInstruction = processingInstructionHandler; | 1499 sax.processingInstruction = processingInstructionHandler; |
| 1495 sax.cdataBlock = cdataBlockHandler; | 1500 sax.cdataBlock = cdataBlockHandler; |
| 1496 sax.comment = commentHandler; | 1501 sax.comment = commentHandler; |
| 1497 sax.warning = warningHandler; | 1502 sax.warning = warningHandler; |
| 1498 sax.startElementNs = startElementNsHandler; | 1503 sax.startElementNs = startElementNsHandler; |
| 1499 sax.endElementNs = endElementNsHandler; | 1504 sax.endElementNs = endElementNsHandler; |
| 1500 sax.getEntity = getEntityHandler; | 1505 sax.getEntity = getEntityHandler; |
| (...skipping 201 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1702 RefPtr<XMLParserContext> parser = | 1707 RefPtr<XMLParserContext> parser = |
| 1703 XMLParserContext::createStringParser(&sax, &state); | 1708 XMLParserContext::createStringParser(&sax, &state); |
| 1704 String parseString = "<?xml version=\"1.0\"?><attrs " + string + " />"; | 1709 String parseString = "<?xml version=\"1.0\"?><attrs " + string + " />"; |
| 1705 parseChunk(parser->context(), parseString); | 1710 parseChunk(parser->context(), parseString); |
| 1706 finishParsing(parser->context()); | 1711 finishParsing(parser->context()); |
| 1707 attrsOK = state.gotAttributes; | 1712 attrsOK = state.gotAttributes; |
| 1708 return state.attributes; | 1713 return state.attributes; |
| 1709 } | 1714 } |
| 1710 | 1715 |
| 1711 } // namespace blink | 1716 } // namespace blink |
| OLD | NEW |