OLD | NEW |
---|---|
1 /* | 1 /* |
2 * Copyright (C) 2010 Google, Inc. All Rights Reserved. | 2 * Copyright (C) 2010 Google, Inc. All Rights Reserved. |
3 * | 3 * |
4 * Redistribution and use in source and binary forms, with or without | 4 * Redistribution and use in source and binary forms, with or without |
5 * modification, are permitted provided that the following conditions | 5 * modification, are permitted provided that the following conditions |
6 * are met: | 6 * are met: |
7 * 1. Redistributions of source code must retain the above copyright | 7 * 1. Redistributions of source code must retain the above copyright |
8 * notice, this list of conditions and the following disclaimer. | 8 * notice, this list of conditions and the following disclaimer. |
9 * 2. Redistributions in binary form must reproduce the above copyright | 9 * 2. Redistributions in binary form must reproduce the above copyright |
10 * notice, this list of conditions and the following disclaimer in the | 10 * notice, this list of conditions and the following disclaimer in the |
(...skipping 71 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
82 || (contextTag.matches(noscriptTag) && options.scriptEnabled) | 82 || (contextTag.matches(noscriptTag) && options.scriptEnabled) |
83 || contextTag.matches(noframesTag)) | 83 || contextTag.matches(noframesTag)) |
84 return reportErrors ? HTMLTokenizer::RAWTEXTState : HTMLTokenizer::PLAIN TEXTState; | 84 return reportErrors ? HTMLTokenizer::RAWTEXTState : HTMLTokenizer::PLAIN TEXTState; |
85 if (contextTag.matches(scriptTag)) | 85 if (contextTag.matches(scriptTag)) |
86 return reportErrors ? HTMLTokenizer::ScriptDataState : HTMLTokenizer::PL AINTEXTState; | 86 return reportErrors ? HTMLTokenizer::ScriptDataState : HTMLTokenizer::PL AINTEXTState; |
87 if (contextTag.matches(plaintextTag)) | 87 if (contextTag.matches(plaintextTag)) |
88 return HTMLTokenizer::PLAINTEXTState; | 88 return HTMLTokenizer::PLAINTEXTState; |
89 return HTMLTokenizer::DataState; | 89 return HTMLTokenizer::DataState; |
90 } | 90 } |
91 | 91 |
92 // static | |
93 HTMLDocumentParser* HTMLDocumentParser::create( | |
Charlie Harrison
2016/08/03 14:40:03
I have a slight preference for passing the sync po
droger
2016/08/03 16:45:50
Done.
| |
94 HTMLDocument& document, | |
95 ParserSynchronizationPolicy backgroundParsingPolicy) | |
96 { | |
97 return new HTMLDocumentParser( | |
98 document, | |
99 threadingAllowedForDocument(document) | |
100 ? backgroundParsingPolicy : ForceSynchronousParsing); | |
101 } | |
102 | |
92 HTMLDocumentParser::HTMLDocumentParser(HTMLDocument& document, ParserSynchroniza tionPolicy syncPolicy) | 103 HTMLDocumentParser::HTMLDocumentParser(HTMLDocument& document, ParserSynchroniza tionPolicy syncPolicy) |
93 : HTMLDocumentParser(document, AllowScriptingContent, syncPolicy) | 104 : HTMLDocumentParser(document, AllowScriptingContent, syncPolicy) |
94 { | 105 { |
95 m_scriptRunner = HTMLScriptRunner::create(&document, this); | 106 m_scriptRunner = HTMLScriptRunner::create(&document, this); |
96 m_treeBuilder = HTMLTreeBuilder::create(this, document, AllowScriptingConten t, m_options); | 107 m_treeBuilder = HTMLTreeBuilder::create(this, document, AllowScriptingConten t, m_options); |
97 } | 108 } |
98 | 109 |
99 HTMLDocumentParser::HTMLDocumentParser(DocumentFragment* fragment, Element* cont extElement, ParserContentPolicy parserContentPolicy) | 110 HTMLDocumentParser::HTMLDocumentParser(DocumentFragment* fragment, Element* cont extElement, ParserContentPolicy parserContentPolicy) |
100 : HTMLDocumentParser(fragment->document(), parserContentPolicy, ForceSynchro nousParsing) | 111 : HTMLDocumentParser(fragment->document(), parserContentPolicy, ForceSynchro nousParsing) |
101 { | 112 { |
(...skipping 41 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
143 { | 154 { |
144 visitor->trace(m_treeBuilder); | 155 visitor->trace(m_treeBuilder); |
145 visitor->trace(m_parserScheduler); | 156 visitor->trace(m_parserScheduler); |
146 visitor->trace(m_xssAuditorDelegate); | 157 visitor->trace(m_xssAuditorDelegate); |
147 visitor->trace(m_scriptRunner); | 158 visitor->trace(m_scriptRunner); |
148 visitor->trace(m_preloader); | 159 visitor->trace(m_preloader); |
149 ScriptableDocumentParser::trace(visitor); | 160 ScriptableDocumentParser::trace(visitor); |
150 HTMLScriptRunnerHost::trace(visitor); | 161 HTMLScriptRunnerHost::trace(visitor); |
151 } | 162 } |
152 | 163 |
164 // static | |
165 bool HTMLDocumentParser::threadingAllowedForDocument(HTMLDocument& document) | |
166 { | |
167 return !document.isPrefetchOnly(); | |
168 } | |
169 | |
153 void HTMLDocumentParser::detach() | 170 void HTMLDocumentParser::detach() |
154 { | 171 { |
155 if (!isParsingFragment() && m_tokenizedChunkQueue.get() && m_tokenizedChunkQ ueue->peakPendingChunkCount()) { | 172 if (!isParsingFragment() && m_tokenizedChunkQueue.get() && m_tokenizedChunkQ ueue->peakPendingChunkCount()) { |
156 DEFINE_STATIC_LOCAL(CustomCountHistogram, peakPendingChunkHistogram, ("P arser.PeakPendingChunkCount", 1, 1000, 50)); | 173 DEFINE_STATIC_LOCAL(CustomCountHistogram, peakPendingChunkHistogram, ("P arser.PeakPendingChunkCount", 1, 1000, 50)); |
157 peakPendingChunkHistogram.count(m_tokenizedChunkQueue->peakPendingChunkC ount()); | 174 peakPendingChunkHistogram.count(m_tokenizedChunkQueue->peakPendingChunkC ount()); |
158 DEFINE_STATIC_LOCAL(CustomCountHistogram, peakPendingTokenHistogram, ("P arser.PeakPendingTokenCount", 1, 100000, 50)); | 175 DEFINE_STATIC_LOCAL(CustomCountHistogram, peakPendingTokenHistogram, ("P arser.PeakPendingTokenCount", 1, 100000, 50)); |
159 peakPendingTokenHistogram.count(m_tokenizedChunkQueue->peakPendingTokenC ount()); | 176 peakPendingTokenHistogram.count(m_tokenizedChunkQueue->peakPendingTokenC ount()); |
160 } | 177 } |
161 | 178 |
162 if (m_haveBackgroundParser) | 179 if (m_haveBackgroundParser) |
(...skipping 537 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
700 excludedLineNumberSource.setExcludeLineNumbers(); | 717 excludedLineNumberSource.setExcludeLineNumbers(); |
701 m_input.insertAtCurrentInsertionPoint(excludedLineNumberSource); | 718 m_input.insertAtCurrentInsertionPoint(excludedLineNumberSource); |
702 pumpTokenizerIfPossible(); | 719 pumpTokenizerIfPossible(); |
703 | 720 |
704 if (isWaitingForScripts()) { | 721 if (isWaitingForScripts()) { |
705 // Check the document.write() output with a separate preload scanner as | 722 // Check the document.write() output with a separate preload scanner as |
706 // the main scanner can't deal with insertions. | 723 // the main scanner can't deal with insertions. |
707 if (!m_insertionPreloadScanner) | 724 if (!m_insertionPreloadScanner) |
708 m_insertionPreloadScanner = createPreloadScanner(); | 725 m_insertionPreloadScanner = createPreloadScanner(); |
709 m_insertionPreloadScanner->appendToEnd(source); | 726 m_insertionPreloadScanner->appendToEnd(source); |
710 m_insertionPreloadScanner->scanAndPreload(m_preloader.get(), document()- >validBaseElementURL(), nullptr); | 727 m_insertionPreloadScanner->scanAndPreload( |
Charlie Harrison
2016/08/03 14:40:03
nit: Unnecessary line break.
droger
2016/08/03 16:45:50
Done.
| |
728 m_preloader.get(), document()->validBaseElementURL(), nullptr); | |
711 } | 729 } |
712 | 730 |
713 endIfDelayed(); | 731 endIfDelayed(); |
714 } | 732 } |
715 | 733 |
716 void HTMLDocumentParser::startBackgroundParser() | 734 void HTMLDocumentParser::startBackgroundParser() |
717 { | 735 { |
718 ASSERT(!isStopped()); | 736 ASSERT(!isStopped()); |
719 ASSERT(shouldUseThreading()); | 737 ASSERT(shouldUseThreading()); |
720 ASSERT(!m_haveBackgroundParser); | 738 ASSERT(!m_haveBackgroundParser); |
(...skipping 60 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
781 if (isStopped()) | 799 if (isStopped()) |
782 return; | 800 return; |
783 | 801 |
784 // We should never reach this point if we're using a parser thread, | 802 // We should never reach this point if we're using a parser thread, |
785 // as appendBytes() will directly ship the data to the thread. | 803 // as appendBytes() will directly ship the data to the thread. |
786 ASSERT(!shouldUseThreading()); | 804 ASSERT(!shouldUseThreading()); |
787 | 805 |
788 TRACE_EVENT1(TRACE_DISABLED_BY_DEFAULT("blink.debug"), "HTMLDocumentParser:: append", "size", inputSource.length()); | 806 TRACE_EVENT1(TRACE_DISABLED_BY_DEFAULT("blink.debug"), "HTMLDocumentParser:: append", "size", inputSource.length()); |
789 const SegmentedString source(inputSource); | 807 const SegmentedString source(inputSource); |
790 | 808 |
809 if (document()->isPrefetchOnly()) { | |
810 if (!m_preloadScanner) | |
811 m_preloadScanner = createPreloadScanner(); | |
812 | |
813 m_preloadScanner->appendToEnd(source); | |
814 m_preloadScanner->scanAndPreload(m_preloader.get(), document()->validBas eElementURL(), nullptr); | |
Charlie Harrison
2016/08/03 14:40:03
This just preloads the tokens normally. Do we want
droger
2016/08/03 16:45:50
This uses the same code as the standard preload sc
Charlie Harrison
2016/08/03 17:15:14
Nope, LOAD_PREFETCH afaik is only used for the lin
pasko
2016/08/04 12:23:08
csharrison: thank you for investigation and the in
| |
815 | |
816 // Return after the preload scanner, do not actually parse the document. | |
817 return; | |
818 } | |
819 | |
791 if (m_preloadScanner) { | 820 if (m_preloadScanner) { |
792 if (m_input.current().isEmpty() && !isWaitingForScripts()) { | 821 if (m_input.current().isEmpty() && !isWaitingForScripts()) { |
793 // We have parsed until the end of the current input and so are now moving ahead of the preload scanner. | 822 // We have parsed until the end of the current input and so are now moving ahead of the preload scanner. |
794 // Clear the scanner so we know to scan starting from the current in put point if we block again. | 823 // Clear the scanner so we know to scan starting from the current in put point if we block again. |
795 m_preloadScanner.reset(); | 824 m_preloadScanner.reset(); |
796 } else { | 825 } else { |
797 m_preloadScanner->appendToEnd(source); | 826 m_preloadScanner->appendToEnd(source); |
798 if (isWaitingForScripts()) | 827 if (isWaitingForScripts()) |
799 m_preloadScanner->scanAndPreload(m_preloader.get(), document()-> validBaseElementURL(), nullptr); | 828 m_preloadScanner->scanAndPreload(m_preloader.get(), document()-> validBaseElementURL(), nullptr); |
800 } | 829 } |
(...skipping 226 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
1027 void HTMLDocumentParser::resumeScheduledTasks() | 1056 void HTMLDocumentParser::resumeScheduledTasks() |
1028 { | 1057 { |
1029 ASSERT(m_tasksWereSuspended); | 1058 ASSERT(m_tasksWereSuspended); |
1030 m_tasksWereSuspended = false; | 1059 m_tasksWereSuspended = false; |
1031 if (m_parserScheduler) | 1060 if (m_parserScheduler) |
1032 m_parserScheduler->resume(); | 1061 m_parserScheduler->resume(); |
1033 } | 1062 } |
1034 | 1063 |
1035 void HTMLDocumentParser::appendBytes(const char* data, size_t length) | 1064 void HTMLDocumentParser::appendBytes(const char* data, size_t length) |
1036 { | 1065 { |
1037 if (!length || isStopped()) | 1066 if (!length || isStopped()) |
Charlie Harrison
2016/08/03 14:40:03
Can you DCHECK(!document()->isPrefetchOnly()) here
droger
2016/08/03 16:45:50
Why? Is this because isStopped() should never be t
Charlie Harrison
2016/08/03 17:15:14
This method should not run in the non-threaded mod
droger
2016/08/04 12:42:29
Is "This method" appendBytes()? Or isStopped()?
a
Charlie Harrison
2016/08/04 12:44:41
Ah you're right, I was misremember the control flo
| |
1038 return; | 1067 return; |
1039 | 1068 |
1040 if (shouldUseThreading()) { | 1069 if (shouldUseThreading()) { |
1041 double bytesReceivedTime = monotonicallyIncreasingTimeMS(); | 1070 double bytesReceivedTime = monotonicallyIncreasingTimeMS(); |
1042 if (!m_haveBackgroundParser) | 1071 if (!m_haveBackgroundParser) |
1043 startBackgroundParser(); | 1072 startBackgroundParser(); |
1044 | 1073 |
1045 std::unique_ptr<Vector<char>> buffer = wrapUnique(new Vector<char>(lengt h)); | 1074 std::unique_ptr<Vector<char>> buffer = wrapUnique(new Vector<char>(lengt h)); |
1046 memcpy(buffer->data(), data, length); | 1075 memcpy(buffer->data(), data, length); |
1047 TRACE_EVENT1(TRACE_DISABLED_BY_DEFAULT("blink.debug"), "HTMLDocumentPars er::appendBytes", "size", (unsigned)length); | 1076 TRACE_EVENT1(TRACE_DISABLED_BY_DEFAULT("blink.debug"), "HTMLDocumentPars er::appendBytes", "size", (unsigned)length); |
(...skipping 115 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
1163 (*WTF::bind(function, std::forward<Ps>(parameters)...))(); | 1192 (*WTF::bind(function, std::forward<Ps>(parameters)...))(); |
1164 return; | 1193 return; |
1165 case Asynchronous: | 1194 case Asynchronous: |
1166 m_loadingTaskRunner->postTask(BLINK_FROM_HERE, WTF::bind(function, std:: forward<Ps>(parameters)...)); | 1195 m_loadingTaskRunner->postTask(BLINK_FROM_HERE, WTF::bind(function, std:: forward<Ps>(parameters)...)); |
1167 return; | 1196 return; |
1168 } | 1197 } |
1169 NOTREACHED(); | 1198 NOTREACHED(); |
1170 } | 1199 } |
1171 | 1200 |
1172 } // namespace blink | 1201 } // namespace blink |
OLD | NEW |