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

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

Issue 1667843003: Make Resource RefCountedWillBeGarbageCollectedFinalized, attempt #2 (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Rebase + address review comments Created 4 years, 10 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
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 398 matching lines...) Expand 10 before | Expand all | Expand 10 after
409 m_leafTextNode->appendData(toString(m_bufferedText.data(), m_bufferedText.si ze())); 409 m_leafTextNode->appendData(toString(m_bufferedText.data(), m_bufferedText.si ze()));
410 m_bufferedText.clear(); 410 m_bufferedText.clear();
411 m_leafTextNode = nullptr; 411 m_leafTextNode = nullptr;
412 412
413 // Mutation event handlers executed by appendData() might detach this parser . 413 // Mutation event handlers executed by appendData() might detach this parser .
414 return !isStopped(); 414 return !isStopped();
415 } 415 }
416 416
417 void XMLDocumentParser::detach() 417 void XMLDocumentParser::detach()
418 { 418 {
419 if (m_pendingScript) {
420 m_pendingScript->removeClient(this);
421 m_pendingScript = nullptr;
422 }
419 clearCurrentNodeStack(); 423 clearCurrentNodeStack();
420 ScriptableDocumentParser::detach(); 424 ScriptableDocumentParser::detach();
421 } 425 }
422 426
423 void XMLDocumentParser::end() 427 void XMLDocumentParser::end()
424 { 428 {
425 TRACE_EVENT0("blink", "XMLDocumentParser::end"); 429 TRACE_EVENT0("blink", "XMLDocumentParser::end");
426 // XMLDocumentParserLibxml2 will do bad things to the document if doEnd() is called. 430 // XMLDocumentParserLibxml2 will do bad things to the document if doEnd() is called.
427 // I don't believe XMLDocumentParserQt needs doEnd called in the fragment ca se. 431 // I don't believe XMLDocumentParserQt needs doEnd called in the fragment ca se.
428 ASSERT(!m_parsingFragment); 432 ASSERT(!m_parsingFragment);
(...skipping 50 matching lines...) Expand 10 before | Expand all | Expand 10 after
479 483
480 void XMLDocumentParser::notifyFinished(Resource* unusedResource) 484 void XMLDocumentParser::notifyFinished(Resource* unusedResource)
481 { 485 {
482 ASSERT_UNUSED(unusedResource, unusedResource == m_pendingScript); 486 ASSERT_UNUSED(unusedResource, unusedResource == m_pendingScript);
483 487
484 ScriptSourceCode sourceCode(m_pendingScript.get()); 488 ScriptSourceCode sourceCode(m_pendingScript.get());
485 bool errorOccurred = m_pendingScript->errorOccurred(); 489 bool errorOccurred = m_pendingScript->errorOccurred();
486 bool wasCanceled = m_pendingScript->wasCanceled(); 490 bool wasCanceled = m_pendingScript->wasCanceled();
487 491
488 m_pendingScript->removeClient(this); 492 m_pendingScript->removeClient(this);
489 m_pendingScript = 0; 493 m_pendingScript = nullptr;
490 494
491 RefPtrWillBeRawPtr<Element> e = m_scriptElement; 495 RefPtrWillBeRawPtr<Element> e = m_scriptElement;
492 m_scriptElement = nullptr; 496 m_scriptElement = nullptr;
493 497
494 ScriptLoader* scriptLoader = toScriptLoaderIfPossible(e.get()); 498 ScriptLoader* scriptLoader = toScriptLoaderIfPossible(e.get());
495 ASSERT(scriptLoader); 499 ASSERT(scriptLoader);
496 500
497 // JavaScript can detach this parser, make sure it's kept alive even if 501 // JavaScript can detach this parser, make sure it's kept alive even if
498 // detached. 502 // detached.
499 RefPtrWillBeRawPtr<XMLDocumentParser> protect(this); 503 RefPtrWillBeRawPtr<XMLDocumentParser> protect(this);
(...skipping 166 matching lines...) Expand 10 before | Expand all | Expand 10 after
666 return &globalDescriptor; 670 return &globalDescriptor;
667 671
668 KURL finalURL; 672 KURL finalURL;
669 RefPtr<SharedBuffer> data; 673 RefPtr<SharedBuffer> data;
670 674
671 { 675 {
672 Document* document = XMLDocumentParserScope::currentDocument; 676 Document* document = XMLDocumentParserScope::currentDocument;
673 XMLDocumentParserScope scope(0); 677 XMLDocumentParserScope scope(0);
674 // FIXME: We should restore the original global error handler as well. 678 // FIXME: We should restore the original global error handler as well.
675 FetchRequest request(ResourceRequest(url), FetchInitiatorTypeNames::xml, ResourceFetcher::defaultResourceOptions()); 679 FetchRequest request(ResourceRequest(url), FetchInitiatorTypeNames::xml, ResourceFetcher::defaultResourceOptions());
676 ResourcePtr<Resource> resource = RawResource::fetchSynchronously(request , document->fetcher()); 680 RefPtrWillBeRawPtr<Resource> resource = RawResource::fetchSynchronously( request, document->fetcher());
677 if (resource && !resource->errorOccurred()) { 681 if (resource && !resource->errorOccurred()) {
678 data = resource->resourceBuffer(); 682 data = resource->resourceBuffer();
679 finalURL = resource->response().url(); 683 finalURL = resource->response().url();
680 } 684 }
681 } 685 }
682 686
683 // We have to check the URL again after the load to catch redirects. 687 // We have to check the URL again after the load to catch redirects.
684 // See <https://bugs.webkit.org/show_bug.cgi?id=21963>. 688 // See <https://bugs.webkit.org/show_bug.cgi?id=21963>.
685 if (!shouldAllowExternalLoad(finalURL)) 689 if (!shouldAllowExternalLoad(finalURL))
686 return &globalDescriptor; 690 return &globalDescriptor;
(...skipping 108 matching lines...) Expand 10 before | Expand all | Expand 10 after
795 , m_isCurrentlyParsing8BitChunk(false) 799 , m_isCurrentlyParsing8BitChunk(false)
796 , m_sawError(false) 800 , m_sawError(false)
797 , m_sawCSS(false) 801 , m_sawCSS(false)
798 , m_sawXSLTransform(false) 802 , m_sawXSLTransform(false)
799 , m_sawFirstElement(false) 803 , m_sawFirstElement(false)
800 , m_isXHTMLDocument(false) 804 , m_isXHTMLDocument(false)
801 , m_parserPaused(false) 805 , m_parserPaused(false)
802 , m_requestingScript(false) 806 , m_requestingScript(false)
803 , m_finishCalled(false) 807 , m_finishCalled(false)
804 , m_xmlErrors(&document) 808 , m_xmlErrors(&document)
805 , m_pendingScript(0)
806 , m_scriptStartPosition(TextPosition::belowRangePosition()) 809 , m_scriptStartPosition(TextPosition::belowRangePosition())
807 , m_parsingFragment(false) 810 , m_parsingFragment(false)
808 { 811 {
809 // This is XML being used as a document resource. 812 // This is XML being used as a document resource.
810 if (frameView && document.isXMLDocument()) 813 if (frameView && document.isXMLDocument())
811 UseCounter::count(document, UseCounter::XMLDocument); 814 UseCounter::count(document, UseCounter::XMLDocument);
812 } 815 }
813 816
814 XMLDocumentParser::XMLDocumentParser(DocumentFragment* fragment, Element* parent Element, ParserContentPolicy parserContentPolicy) 817 XMLDocumentParser::XMLDocumentParser(DocumentFragment* fragment, Element* parent Element, ParserContentPolicy parserContentPolicy)
815 : ScriptableDocumentParser(fragment->document(), parserContentPolicy) 818 : ScriptableDocumentParser(fragment->document(), parserContentPolicy)
816 , m_hasView(false) 819 , m_hasView(false)
817 , m_context(nullptr) 820 , m_context(nullptr)
818 , m_currentNode(fragment) 821 , m_currentNode(fragment)
819 , m_isCurrentlyParsing8BitChunk(false) 822 , m_isCurrentlyParsing8BitChunk(false)
820 , m_sawError(false) 823 , m_sawError(false)
821 , m_sawCSS(false) 824 , m_sawCSS(false)
822 , m_sawXSLTransform(false) 825 , m_sawXSLTransform(false)
823 , m_sawFirstElement(false) 826 , m_sawFirstElement(false)
824 , m_isXHTMLDocument(false) 827 , m_isXHTMLDocument(false)
825 , m_parserPaused(false) 828 , m_parserPaused(false)
826 , m_requestingScript(false) 829 , m_requestingScript(false)
827 , m_finishCalled(false) 830 , m_finishCalled(false)
828 , m_xmlErrors(&fragment->document()) 831 , m_xmlErrors(&fragment->document())
829 , m_pendingScript(0)
830 , m_scriptStartPosition(TextPosition::belowRangePosition()) 832 , m_scriptStartPosition(TextPosition::belowRangePosition())
831 , m_parsingFragment(true) 833 , m_parsingFragment(true)
832 { 834 {
833 #if !ENABLE(OILPAN) 835 #if !ENABLE(OILPAN)
834 fragment->ref(); 836 fragment->ref();
835 #endif 837 #endif
836 838
837 // Add namespaces based on the parent node 839 // Add namespaces based on the parent node
838 WillBeHeapVector<RawPtrWillBeMember<Element>> elemStack; 840 WillBeHeapVector<RawPtrWillBeMember<Element>> elemStack;
839 while (parentElement) { 841 while (parentElement) {
(...skipping 26 matching lines...) Expand all
866 868
867 XMLParserContext::~XMLParserContext() 869 XMLParserContext::~XMLParserContext()
868 { 870 {
869 if (m_context->myDoc) 871 if (m_context->myDoc)
870 xmlFreeDoc(m_context->myDoc); 872 xmlFreeDoc(m_context->myDoc);
871 xmlFreeParserCtxt(m_context); 873 xmlFreeParserCtxt(m_context);
872 } 874 }
873 875
874 XMLDocumentParser::~XMLDocumentParser() 876 XMLDocumentParser::~XMLDocumentParser()
875 { 877 {
878 ASSERT(!m_pendingScript);
876 #if !ENABLE(OILPAN) 879 #if !ENABLE(OILPAN)
877 // The XMLDocumentParser will always be detached before being destroyed. 880 // The XMLDocumentParser will always be detached before being destroyed.
878 ASSERT(m_currentNodeStack.isEmpty()); 881 ASSERT(m_currentNodeStack.isEmpty());
879 ASSERT(!m_currentNode); 882 ASSERT(!m_currentNode);
880 #endif 883 #endif
881
882 // FIXME: m_pendingScript handling should be moved into XMLDocumentParser.cp p!
883 if (m_pendingScript)
884 m_pendingScript->removeClient(this);
885 } 884 }
886 885
887 DEFINE_TRACE(XMLDocumentParser) 886 DEFINE_TRACE(XMLDocumentParser)
888 { 887 {
889 visitor->trace(m_currentNode); 888 visitor->trace(m_currentNode);
890 #if ENABLE(OILPAN) 889 #if ENABLE(OILPAN)
891 visitor->trace(m_currentNodeStack); 890 visitor->trace(m_currentNodeStack);
892 #endif 891 #endif
893 visitor->trace(m_leafTextNode); 892 visitor->trace(m_leafTextNode);
894 visitor->trace(m_xmlErrors); 893 visitor->trace(m_xmlErrors);
894 visitor->trace(m_pendingScript);
895 visitor->trace(m_scriptElement); 895 visitor->trace(m_scriptElement);
896 ScriptableDocumentParser::trace(visitor); 896 ScriptableDocumentParser::trace(visitor);
897 } 897 }
898 898
899 void XMLDocumentParser::doWrite(const String& parseString) 899 void XMLDocumentParser::doWrite(const String& parseString)
900 { 900 {
901 TRACE_EVENT0("blink", "XMLDocumentParser::doWrite"); 901 TRACE_EVENT0("blink", "XMLDocumentParser::doWrite");
902 ASSERT(!isDetached()); 902 ASSERT(!isDetached());
903 if (!m_context) 903 if (!m_context)
904 initializeParserContext(); 904 initializeParserContext();
(...skipping 793 matching lines...) Expand 10 before | Expand all | Expand 10 after
1698 sax.initialized = XML_SAX2_MAGIC; 1698 sax.initialized = XML_SAX2_MAGIC;
1699 RefPtr<XMLParserContext> parser = XMLParserContext::createStringParser(&sax, &state); 1699 RefPtr<XMLParserContext> parser = XMLParserContext::createStringParser(&sax, &state);
1700 String parseString = "<?xml version=\"1.0\"?><attrs " + string + " />"; 1700 String parseString = "<?xml version=\"1.0\"?><attrs " + string + " />";
1701 parseChunk(parser->context(), parseString); 1701 parseChunk(parser->context(), parseString);
1702 finishParsing(parser->context()); 1702 finishParsing(parser->context());
1703 attrsOK = state.gotAttributes; 1703 attrsOK = state.gotAttributes;
1704 return state.attributes; 1704 return state.attributes;
1705 } 1705 }
1706 1706
1707 } // namespace blink 1707 } // namespace blink
OLDNEW
« no previous file with comments | « third_party/WebKit/Source/core/xml/parser/XMLDocumentParser.h ('k') | third_party/WebKit/Source/web/tests/WebFrameTest.cpp » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698