Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(668)

Side by Side Diff: third_party/WebKit/Source/core/xml/parser/XMLDocumentParser.cpp

Issue 2274573004: Replace ASSERT*() with DCHECK*() in core/xml/. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Created 4 years, 4 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « third_party/WebKit/Source/core/xml/parser/MarkupTokenizerInlines.h ('k') | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
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. (http://www.torchmo bile.com/)
9 * 9 *
10 * This library is free software; you can redistribute it and/or 10 * This library is free software; you can redistribute it and/or
(...skipping 293 matching lines...) Expand 10 before | Expand all | Expand 10 after
304 304
305 private: 305 private:
306 XMLErrors::ErrorType m_type; 306 XMLErrors::ErrorType m_type;
307 xmlChar* m_message; 307 xmlChar* m_message;
308 OrdinalNumber m_lineNumber; 308 OrdinalNumber m_lineNumber;
309 OrdinalNumber m_columnNumber; 309 OrdinalNumber m_columnNumber;
310 }; 310 };
311 311
312 void XMLDocumentParser::pushCurrentNode(ContainerNode* n) 312 void XMLDocumentParser::pushCurrentNode(ContainerNode* n)
313 { 313 {
314 ASSERT(n); 314 DCHECK(n);
315 ASSERT(m_currentNode); 315 DCHECK(m_currentNode);
316 m_currentNodeStack.append(m_currentNode); 316 m_currentNodeStack.append(m_currentNode);
317 m_currentNode = n; 317 m_currentNode = n;
318 if (m_currentNodeStack.size() > maxXMLTreeDepth) 318 if (m_currentNodeStack.size() > maxXMLTreeDepth)
319 handleError(XMLErrors::ErrorTypeFatal, "Excessive node nesting.", textPo sition()); 319 handleError(XMLErrors::ErrorTypeFatal, "Excessive node nesting.", textPo sition());
320 } 320 }
321 321
322 void XMLDocumentParser::popCurrentNode() 322 void XMLDocumentParser::popCurrentNode()
323 { 323 {
324 if (!m_currentNode) 324 if (!m_currentNode)
325 return; 325 return;
326 ASSERT(m_currentNodeStack.size()); 326 DCHECK(m_currentNodeStack.size());
327 m_currentNode = m_currentNodeStack.last(); 327 m_currentNode = m_currentNodeStack.last();
328 m_currentNodeStack.removeLast(); 328 m_currentNodeStack.removeLast();
329 } 329 }
330 330
331 void XMLDocumentParser::clearCurrentNodeStack() 331 void XMLDocumentParser::clearCurrentNodeStack()
332 { 332 {
333 m_currentNode = nullptr; 333 m_currentNode = nullptr;
334 m_leafTextNode = nullptr; 334 m_leafTextNode = nullptr;
335 335
336 if (m_currentNodeStack.size()) { // Aborted parsing. 336 if (m_currentNodeStack.size()) { // Aborted parsing.
337 m_currentNodeStack.clear(); 337 m_currentNodeStack.clear();
338 } 338 }
339 } 339 }
340 340
341 void XMLDocumentParser::insert(const SegmentedString&) 341 void XMLDocumentParser::insert(const SegmentedString&)
342 { 342 {
343 ASSERT_NOT_REACHED(); 343 NOTREACHED();
344 } 344 }
345 345
346 void XMLDocumentParser::append(const String& inputSource) 346 void XMLDocumentParser::append(const String& inputSource)
347 { 347 {
348 const SegmentedString source(inputSource); 348 const SegmentedString source(inputSource);
349 if (m_sawXSLTransform || !m_sawFirstElement) 349 if (m_sawXSLTransform || !m_sawFirstElement)
350 m_originalSourceForTransform.append(source); 350 m_originalSourceForTransform.append(source);
351 351
352 if (isStopped() || m_sawXSLTransform) 352 if (isStopped() || m_sawXSLTransform)
353 return; 353 return;
(...skipping 13 matching lines...) Expand all
367 m_sawError = true; 367 m_sawError = true;
368 if (type == XMLErrors::ErrorTypeFatal) 368 if (type == XMLErrors::ErrorTypeFatal)
369 stopParsing(); 369 stopParsing();
370 } 370 }
371 371
372 void XMLDocumentParser::createLeafTextNodeIfNeeded() 372 void XMLDocumentParser::createLeafTextNodeIfNeeded()
373 { 373 {
374 if (m_leafTextNode) 374 if (m_leafTextNode)
375 return; 375 return;
376 376
377 ASSERT(m_bufferedText.size() == 0); 377 DCHECK_EQ(m_bufferedText.size(), 0u);
378 m_leafTextNode = Text::create(m_currentNode->document(), ""); 378 m_leafTextNode = Text::create(m_currentNode->document(), "");
379 m_currentNode->parserAppendChild(m_leafTextNode.get()); 379 m_currentNode->parserAppendChild(m_leafTextNode.get());
380 } 380 }
381 381
382 bool XMLDocumentParser::updateLeafTextNode() 382 bool XMLDocumentParser::updateLeafTextNode()
383 { 383 {
384 if (isStopped()) 384 if (isStopped())
385 return false; 385 return false;
386 386
387 if (!m_leafTextNode) 387 if (!m_leafTextNode)
(...skipping 16 matching lines...) Expand all
404 } 404 }
405 clearCurrentNodeStack(); 405 clearCurrentNodeStack();
406 ScriptableDocumentParser::detach(); 406 ScriptableDocumentParser::detach();
407 } 407 }
408 408
409 void XMLDocumentParser::end() 409 void XMLDocumentParser::end()
410 { 410 {
411 TRACE_EVENT0("blink", "XMLDocumentParser::end"); 411 TRACE_EVENT0("blink", "XMLDocumentParser::end");
412 // XMLDocumentParserLibxml2 will do bad things to the document if doEnd() is called. 412 // XMLDocumentParserLibxml2 will do bad things to the document if doEnd() is called.
413 // I don't believe XMLDocumentParserQt needs doEnd called in the fragment ca se. 413 // I don't believe XMLDocumentParserQt needs doEnd called in the fragment ca se.
414 ASSERT(!m_parsingFragment); 414 DCHECK(!m_parsingFragment);
415 415
416 doEnd(); 416 doEnd();
417 417
418 // doEnd() call above can detach the parser and null out its document. 418 // doEnd() call above can detach the parser and null out its document.
419 // In that case, we just bail out. 419 // In that case, we just bail out.
420 if (isDetached()) 420 if (isDetached())
421 return; 421 return;
422 422
423 // doEnd() could process a script tag, thus pausing parsing. 423 // doEnd() could process a script tag, thus pausing parsing.
424 if (m_parserPaused) 424 if (m_parserPaused)
425 return; 425 return;
426 426
427 if (m_sawError) 427 if (m_sawError)
428 insertErrorMessageBlock(); 428 insertErrorMessageBlock();
429 else 429 else
430 updateLeafTextNode(); 430 updateLeafTextNode();
431 431
432 if (isParsing()) 432 if (isParsing())
433 prepareToStopParsing(); 433 prepareToStopParsing();
434 document()->setReadyState(Document::Interactive); 434 document()->setReadyState(Document::Interactive);
435 clearCurrentNodeStack(); 435 clearCurrentNodeStack();
436 document()->finishedParsing(); 436 document()->finishedParsing();
437 } 437 }
438 438
439 void XMLDocumentParser::finish() 439 void XMLDocumentParser::finish()
440 { 440 {
441 // FIXME: We should ASSERT(!m_parserStopped) here, since it does not 441 // FIXME: We should DCHECK(!m_parserStopped) here, since it does not
442 // makes sense to call any methods on DocumentParser once it's been stopped. 442 // makes sense to call any methods on DocumentParser once it's been stopped.
443 // However, FrameLoader::stop calls DocumentParser::finish unconditionally. 443 // However, FrameLoader::stop calls DocumentParser::finish unconditionally.
444 444
445 flush(); 445 flush();
446 if (isDetached()) 446 if (isDetached())
447 return; 447 return;
448 448
449 if (m_parserPaused) 449 if (m_parserPaused)
450 m_finishCalled = true; 450 m_finishCalled = true;
451 else 451 else
452 end(); 452 end();
453 } 453 }
454 454
455 void XMLDocumentParser::insertErrorMessageBlock() 455 void XMLDocumentParser::insertErrorMessageBlock()
456 { 456 {
457 m_xmlErrors.insertErrorMessageBlock(); 457 m_xmlErrors.insertErrorMessageBlock();
458 } 458 }
459 459
460 void XMLDocumentParser::notifyFinished(Resource* unusedResource) 460 void XMLDocumentParser::notifyFinished(Resource* unusedResource)
461 { 461 {
462 ASSERT_UNUSED(unusedResource, unusedResource == m_pendingScript); 462 DCHECK_EQ(unusedResource, m_pendingScript);
463 463
464 ScriptSourceCode sourceCode(m_pendingScript.get()); 464 ScriptSourceCode sourceCode(m_pendingScript.get());
465 bool errorOccurred = m_pendingScript->errorOccurred(); 465 bool errorOccurred = m_pendingScript->errorOccurred();
466 bool wasCanceled = m_pendingScript->wasCanceled(); 466 bool wasCanceled = m_pendingScript->wasCanceled();
467 double scriptParserBlockingTime = m_parserBlockingPendingScriptLoadStartTime ; 467 double scriptParserBlockingTime = m_parserBlockingPendingScriptLoadStartTime ;
468 m_parserBlockingPendingScriptLoadStartTime = 0.0; 468 m_parserBlockingPendingScriptLoadStartTime = 0.0;
469 469
470 m_pendingScript->removeClient(this); 470 m_pendingScript->removeClient(this);
471 m_pendingScript = nullptr; 471 m_pendingScript = nullptr;
472 472
473 Element* e = m_scriptElement; 473 Element* e = m_scriptElement;
474 m_scriptElement = nullptr; 474 m_scriptElement = nullptr;
475 475
476 ScriptLoader* scriptLoader = toScriptLoaderIfPossible(e); 476 ScriptLoader* scriptLoader = toScriptLoaderIfPossible(e);
477 ASSERT(scriptLoader); 477 DCHECK(scriptLoader);
478 478
479 if (errorOccurred) { 479 if (errorOccurred) {
480 scriptLoader->dispatchErrorEvent(); 480 scriptLoader->dispatchErrorEvent();
481 } else if (!wasCanceled) { 481 } else if (!wasCanceled) {
482 if (scriptParserBlockingTime > 0.0) { 482 if (scriptParserBlockingTime > 0.0) {
483 DocumentParserTiming::from(*document()).recordParserBlockedOnScriptL oadDuration(monotonicallyIncreasingTime() - scriptParserBlockingTime, scriptLoad er->wasCreatedDuringDocumentWrite()); 483 DocumentParserTiming::from(*document()).recordParserBlockedOnScriptL oadDuration(monotonicallyIncreasingTime() - scriptParserBlockingTime, scriptLoad er->wasCreatedDuringDocumentWrite());
484 } 484 }
485 485
486 if (!scriptLoader->executeScript(sourceCode)) 486 if (!scriptLoader->executeScript(sourceCode))
487 scriptLoader->dispatchErrorEvent(); 487 scriptLoader->dispatchErrorEvent();
(...skipping 144 matching lines...) Expand 10 before | Expand all | Expand 10 after
632 XMLDocumentParserScope::currentDocument->addConsoleMessage(ConsoleMe ssage::create(SecurityMessageSource, ErrorMessageLevel, message)); 632 XMLDocumentParserScope::currentDocument->addConsoleMessage(ConsoleMe ssage::create(SecurityMessageSource, ErrorMessageLevel, message));
633 } 633 }
634 return false; 634 return false;
635 } 635 }
636 636
637 return true; 637 return true;
638 } 638 }
639 639
640 static void* openFunc(const char* uri) 640 static void* openFunc(const char* uri)
641 { 641 {
642 ASSERT(XMLDocumentParserScope::currentDocument); 642 DCHECK(XMLDocumentParserScope::currentDocument);
643 ASSERT(currentThread() == libxmlLoaderThread); 643 DCHECK_EQ(currentThread(), libxmlLoaderThread);
644 644
645 KURL url(KURL(), uri); 645 KURL url(KURL(), uri);
646 646
647 if (!shouldAllowExternalLoad(url)) 647 if (!shouldAllowExternalLoad(url))
648 return &globalDescriptor; 648 return &globalDescriptor;
649 649
650 KURL finalURL; 650 KURL finalURL;
651 RefPtr<SharedBuffer> data; 651 RefPtr<SharedBuffer> data;
652 652
653 { 653 {
(...skipping 189 matching lines...) Expand 10 before | Expand all | Expand 10 after
843 843
844 XMLParserContext::~XMLParserContext() 844 XMLParserContext::~XMLParserContext()
845 { 845 {
846 if (m_context->myDoc) 846 if (m_context->myDoc)
847 xmlFreeDoc(m_context->myDoc); 847 xmlFreeDoc(m_context->myDoc);
848 xmlFreeParserCtxt(m_context); 848 xmlFreeParserCtxt(m_context);
849 } 849 }
850 850
851 XMLDocumentParser::~XMLDocumentParser() 851 XMLDocumentParser::~XMLDocumentParser()
852 { 852 {
853 ASSERT(!m_pendingScript); 853 DCHECK(!m_pendingScript);
854 } 854 }
855 855
856 DEFINE_TRACE(XMLDocumentParser) 856 DEFINE_TRACE(XMLDocumentParser)
857 { 857 {
858 visitor->trace(m_currentNode); 858 visitor->trace(m_currentNode);
859 visitor->trace(m_currentNodeStack); 859 visitor->trace(m_currentNodeStack);
860 visitor->trace(m_leafTextNode); 860 visitor->trace(m_leafTextNode);
861 visitor->trace(m_xmlErrors); 861 visitor->trace(m_xmlErrors);
862 visitor->trace(m_pendingScript); 862 visitor->trace(m_pendingScript);
863 visitor->trace(m_scriptElement); 863 visitor->trace(m_scriptElement);
864 ScriptableDocumentParser::trace(visitor); 864 ScriptableDocumentParser::trace(visitor);
865 ScriptResourceClient::trace(visitor); 865 ScriptResourceClient::trace(visitor);
866 } 866 }
867 867
868 void XMLDocumentParser::doWrite(const String& parseString) 868 void XMLDocumentParser::doWrite(const String& parseString)
869 { 869 {
870 TRACE_EVENT0("blink", "XMLDocumentParser::doWrite"); 870 TRACE_EVENT0("blink", "XMLDocumentParser::doWrite");
871 ASSERT(!isDetached()); 871 DCHECK(!isDetached());
872 if (!m_context) 872 if (!m_context)
873 initializeParserContext(); 873 initializeParserContext();
874 874
875 // Protect the libxml context from deletion during a callback 875 // Protect the libxml context from deletion during a callback
876 RefPtr<XMLParserContext> context = m_context; 876 RefPtr<XMLParserContext> context = m_context;
877 877
878 // libXML throws an error if you try to switch the encoding for an empty 878 // libXML throws an error if you try to switch the encoding for an empty
879 // string. 879 // string.
880 if (parseString.length()) { 880 if (parseString.length()) {
881 XMLDocumentParserScope scope(document()); 881 XMLDocumentParserScope scope(document());
(...skipping 198 matching lines...) Expand 10 before | Expand all | Expand 10 after
1080 return; 1080 return;
1081 } 1081 }
1082 1082
1083 ScriptLoader* scriptLoader = toScriptLoaderIfPossible(element); 1083 ScriptLoader* scriptLoader = toScriptLoaderIfPossible(element);
1084 if (!scriptLoader) { 1084 if (!scriptLoader) {
1085 popCurrentNode(); 1085 popCurrentNode();
1086 return; 1086 return;
1087 } 1087 }
1088 1088
1089 // Don't load external scripts for standalone documents (for now). 1089 // Don't load external scripts for standalone documents (for now).
1090 ASSERT(!m_pendingScript); 1090 DCHECK(!m_pendingScript);
1091 m_requestingScript = true; 1091 m_requestingScript = true;
1092 1092
1093 if (scriptLoader->prepareScript(m_scriptStartPosition, ScriptLoader::AllowLe gacyTypeInTypeAttribute)) { 1093 if (scriptLoader->prepareScript(m_scriptStartPosition, ScriptLoader::AllowLe gacyTypeInTypeAttribute)) {
1094 // FIXME: Script execution should be shared between 1094 // FIXME: Script execution should be shared between
1095 // the libxml2 and Qt XMLDocumentParser implementations. 1095 // the libxml2 and Qt XMLDocumentParser implementations.
1096 1096
1097 1097
1098 if (scriptLoader->readyToBeParserExecuted()) { 1098 if (scriptLoader->readyToBeParserExecuted()) {
1099 if (!scriptLoader->executeScript(ScriptSourceCode(scriptLoader->scri ptContent(), document()->url(), m_scriptStartPosition))) { 1099 if (!scriptLoader->executeScript(ScriptSourceCode(scriptLoader->scri ptContent(), document()->url(), m_scriptStartPosition))) {
1100 scriptLoader->dispatchErrorEvent(); 1100 scriptLoader->dispatchErrorEvent();
(...skipping 243 matching lines...) Expand 10 before | Expand all | Expand 10 after
1344 1344
1345 static size_t convertUTF16EntityToUTF8(const UChar* utf16Entity, size_t numberOf CodeUnits, char* target, size_t targetSize) 1345 static size_t convertUTF16EntityToUTF8(const UChar* utf16Entity, size_t numberOf CodeUnits, char* target, size_t targetSize)
1346 { 1346 {
1347 const char* originalTarget = target; 1347 const char* originalTarget = target;
1348 WTF::Unicode::ConversionResult conversionResult = WTF::Unicode::convertUTF16 ToUTF8(&utf16Entity, 1348 WTF::Unicode::ConversionResult conversionResult = WTF::Unicode::convertUTF16 ToUTF8(&utf16Entity,
1349 utf16Entity + numberOfCodeUnits, &target, target + targetSize); 1349 utf16Entity + numberOfCodeUnits, &target, target + targetSize);
1350 if (conversionResult != WTF::Unicode::conversionOK) 1350 if (conversionResult != WTF::Unicode::conversionOK)
1351 return 0; 1351 return 0;
1352 1352
1353 // Even though we must pass the length, libxml expects the entity string to be null terminated. 1353 // Even though we must pass the length, libxml expects the entity string to be null terminated.
1354 ASSERT(target > originalTarget + 1); 1354 DCHECK_GT(target, originalTarget + 1);
1355 *target = '\0'; 1355 *target = '\0';
1356 return target - originalTarget; 1356 return target - originalTarget;
1357 } 1357 }
1358 1358
1359 static xmlEntityPtr getXHTMLEntity(const xmlChar* name) 1359 static xmlEntityPtr getXHTMLEntity(const xmlChar* name)
1360 { 1360 {
1361 UChar utf16DecodedEntity[4]; 1361 UChar utf16DecodedEntity[4];
1362 size_t numberOfCodeUnits = decodeNamedEntityToUCharArray(reinterpret_cast<co nst char*>(name), utf16DecodedEntity); 1362 size_t numberOfCodeUnits = decodeNamedEntityToUCharArray(reinterpret_cast<co nst char*>(name), utf16DecodedEntity);
1363 if (!numberOfCodeUnits) 1363 if (!numberOfCodeUnits)
1364 return 0; 1364 return 0;
1365 1365
1366 ASSERT(numberOfCodeUnits <= 4); 1366 DCHECK_LE(numberOfCodeUnits, 4u);
1367 size_t entityLengthInUTF8 = convertUTF16EntityToUTF8(utf16DecodedEntity, num berOfCodeUnits, 1367 size_t entityLengthInUTF8 = convertUTF16EntityToUTF8(utf16DecodedEntity, num berOfCodeUnits,
1368 reinterpret_cast<char*>(sharedXHTMLEntityResult), WTF_ARRAY_LENGTH(share dXHTMLEntityResult)); 1368 reinterpret_cast<char*>(sharedXHTMLEntityResult), WTF_ARRAY_LENGTH(share dXHTMLEntityResult));
1369 if (!entityLengthInUTF8) 1369 if (!entityLengthInUTF8)
1370 return 0; 1370 return 0;
1371 1371
1372 xmlEntityPtr entity = sharedXHTMLEntity(); 1372 xmlEntityPtr entity = sharedXHTMLEntity();
1373 entity->length = entityLengthInUTF8; 1373 entity->length = entityLengthInUTF8;
1374 entity->name = name; 1374 entity->name = name;
1375 return entity; 1375 return entity;
1376 } 1376 }
(...skipping 91 matching lines...) Expand 10 before | Expand all | Expand 10 after
1468 sax.initialized = XML_SAX2_MAGIC; 1468 sax.initialized = XML_SAX2_MAGIC;
1469 m_sawError = false; 1469 m_sawError = false;
1470 m_sawCSS = false; 1470 m_sawCSS = false;
1471 m_sawXSLTransform = false; 1471 m_sawXSLTransform = false;
1472 m_sawFirstElement = false; 1472 m_sawFirstElement = false;
1473 1473
1474 XMLDocumentParserScope scope(document()); 1474 XMLDocumentParserScope scope(document());
1475 if (m_parsingFragment) { 1475 if (m_parsingFragment) {
1476 m_context = XMLParserContext::createMemoryParser(&sax, this, chunk); 1476 m_context = XMLParserContext::createMemoryParser(&sax, this, chunk);
1477 } else { 1477 } else {
1478 ASSERT(!chunk.data()); 1478 DCHECK(!chunk.data());
1479 m_context = XMLParserContext::createStringParser(&sax, this); 1479 m_context = XMLParserContext::createStringParser(&sax, this);
1480 } 1480 }
1481 } 1481 }
1482 1482
1483 void XMLDocumentParser::doEnd() 1483 void XMLDocumentParser::doEnd()
1484 { 1484 {
1485 if (!isStopped()) { 1485 if (!isStopped()) {
1486 if (m_context) { 1486 if (m_context) {
1487 // Tell libxml we're done. 1487 // Tell libxml we're done.
1488 { 1488 {
(...skipping 49 matching lines...) Expand 10 before | Expand all | Expand 10 after
1538 1538
1539 void XMLDocumentParser::stopParsing() 1539 void XMLDocumentParser::stopParsing()
1540 { 1540 {
1541 DocumentParser::stopParsing(); 1541 DocumentParser::stopParsing();
1542 if (context()) 1542 if (context())
1543 xmlStopParser(context()); 1543 xmlStopParser(context());
1544 } 1544 }
1545 1545
1546 void XMLDocumentParser::resumeParsing() 1546 void XMLDocumentParser::resumeParsing()
1547 { 1547 {
1548 ASSERT(!isDetached()); 1548 DCHECK(!isDetached());
1549 ASSERT(m_parserPaused); 1549 DCHECK(m_parserPaused);
1550 1550
1551 m_parserPaused = false; 1551 m_parserPaused = false;
1552 1552
1553 // First, execute any pending callbacks 1553 // First, execute any pending callbacks
1554 while (!m_pendingCallbacks.isEmpty()) { 1554 while (!m_pendingCallbacks.isEmpty()) {
1555 std::unique_ptr<PendingCallback> callback = m_pendingCallbacks.takeFirst (); 1555 std::unique_ptr<PendingCallback> callback = m_pendingCallbacks.takeFirst ();
1556 callback->call(this); 1556 callback->call(this);
1557 1557
1558 // A callback paused the parser 1558 // A callback paused the parser
1559 if (m_parserPaused) 1559 if (m_parserPaused)
1560 return; 1560 return;
1561 } 1561 }
1562 1562
1563 // Then, write any pending data 1563 // Then, write any pending data
1564 SegmentedString rest = m_pendingSrc; 1564 SegmentedString rest = m_pendingSrc;
1565 m_pendingSrc.clear(); 1565 m_pendingSrc.clear();
1566 // There is normally only one string left, so toString() shouldn't copy. 1566 // There is normally only one string left, so toString() shouldn't copy.
1567 // In any case, the XML parser runs on the main thread and it's OK if 1567 // In any case, the XML parser runs on the main thread and it's OK if
1568 // the passed string has more than one reference. 1568 // the passed string has more than one reference.
1569 append(rest.toString().impl()); 1569 append(rest.toString().impl());
1570 1570
1571 // Finally, if finish() has been called and write() didn't result 1571 // Finally, if finish() has been called and write() didn't result
1572 // in any further callbacks being queued, call end() 1572 // in any further callbacks being queued, call end()
1573 if (m_finishCalled && m_pendingCallbacks.isEmpty()) 1573 if (m_finishCalled && m_pendingCallbacks.isEmpty())
1574 end(); 1574 end();
1575 } 1575 }
1576 1576
1577 bool XMLDocumentParser::appendFragmentSource(const String& chunk) 1577 bool XMLDocumentParser::appendFragmentSource(const String& chunk)
1578 { 1578 {
1579 ASSERT(!m_context); 1579 DCHECK(!m_context);
1580 ASSERT(m_parsingFragment); 1580 DCHECK(m_parsingFragment);
1581 1581
1582 CString chunkAsUtf8 = chunk.utf8(); 1582 CString chunkAsUtf8 = chunk.utf8();
1583 1583
1584 // libxml2 takes an int for a length, and therefore can't handle XML chunks 1584 // libxml2 takes an int for a length, and therefore can't handle XML chunks
1585 // larger than 2 GiB. 1585 // larger than 2 GiB.
1586 if (chunkAsUtf8.length() > INT_MAX) 1586 if (chunkAsUtf8.length() > INT_MAX)
1587 return false; 1587 return false;
1588 1588
1589 TRACE_EVENT0("blink", "XMLDocumentParser::appendFragmentSource"); 1589 TRACE_EVENT0("blink", "XMLDocumentParser::appendFragmentSource");
1590 initializeParserContext(chunkAsUtf8); 1590 initializeParserContext(chunkAsUtf8);
1591 xmlParseContent(context()); 1591 xmlParseContent(context());
1592 endDocument(); // Close any open text nodes. 1592 endDocument(); // Close any open text nodes.
1593 1593
1594 // FIXME: If this code is actually needed, it should probably move to 1594 // FIXME: If this code is actually needed, it should probably move to
1595 // finish() 1595 // finish()
1596 // XMLDocumentParserQt has a similar check (m_stream.error() == 1596 // XMLDocumentParserQt has a similar check (m_stream.error() ==
1597 // QXmlStreamReader::PrematureEndOfDocumentError) in doEnd(). Check if all 1597 // QXmlStreamReader::PrematureEndOfDocumentError) in doEnd(). Check if all
1598 // the chunk has been processed. 1598 // the chunk has been processed.
1599 long bytesProcessed = xmlByteConsumed(context()); 1599 long bytesProcessed = xmlByteConsumed(context());
1600 if (bytesProcessed == -1 || static_cast<unsigned long>(bytesProcessed) != ch unkAsUtf8.length()) { 1600 if (bytesProcessed == -1 || static_cast<unsigned long>(bytesProcessed) != ch unkAsUtf8.length()) {
1601 // FIXME: I don't believe we can hit this case without also having seen 1601 // FIXME: I don't believe we can hit this case without also having seen
1602 // an error or a null byte. If we hit this ASSERT, we've found a test 1602 // an error or a null byte. If we hit this DCHECK, we've found a test
1603 // case which demonstrates the need for this code. 1603 // case which demonstrates the need for this code.
1604 ASSERT(m_sawError || (bytesProcessed >= 0 && !chunkAsUtf8.data()[bytesPr ocessed])); 1604 DCHECK(m_sawError || (bytesProcessed >= 0 && !chunkAsUtf8.data()[bytesPr ocessed]));
1605 return false; 1605 return false;
1606 } 1606 }
1607 1607
1608 // No error if the chunk is well formed or it is not but we have no error. 1608 // No error if the chunk is well formed or it is not but we have no error.
1609 return context()->wellFormed || !xmlCtxtGetLastError(context()); 1609 return context()->wellFormed || !xmlCtxtGetLastError(context());
1610 } 1610 }
1611 1611
1612 // -------------------------------- 1612 // --------------------------------
1613 1613
1614 struct AttributeParseState { 1614 struct AttributeParseState {
(...skipping 36 matching lines...) Expand 10 before | Expand all | Expand 10 after
1651 sax.initialized = XML_SAX2_MAGIC; 1651 sax.initialized = XML_SAX2_MAGIC;
1652 RefPtr<XMLParserContext> parser = XMLParserContext::createStringParser(&sax, &state); 1652 RefPtr<XMLParserContext> parser = XMLParserContext::createStringParser(&sax, &state);
1653 String parseString = "<?xml version=\"1.0\"?><attrs " + string + " />"; 1653 String parseString = "<?xml version=\"1.0\"?><attrs " + string + " />";
1654 parseChunk(parser->context(), parseString); 1654 parseChunk(parser->context(), parseString);
1655 finishParsing(parser->context()); 1655 finishParsing(parser->context());
1656 attrsOK = state.gotAttributes; 1656 attrsOK = state.gotAttributes;
1657 return state.attributes; 1657 return state.attributes;
1658 } 1658 }
1659 1659
1660 } // namespace blink 1660 } // namespace blink
OLDNEW
« no previous file with comments | « third_party/WebKit/Source/core/xml/parser/MarkupTokenizerInlines.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698