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

Side by Side Diff: third_party/WebKit/Source/core/html/parser/HTMLScriptRunner.cpp

Issue 2200613002: The HTML parser synchronously creates custom elements (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Eliminate redundant TODOs. 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
OLDNEW
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 115 matching lines...) Expand 10 before | Expand all | Expand 10 after
126 } 126 }
127 127
128 // Use the URL of the currently active document for this frame. 128 // Use the URL of the currently active document for this frame.
129 return document->frame()->document()->url(); 129 return document->frame()->document()->url();
130 } 130 }
131 131
132 } // namespace 132 } // namespace
133 133
134 using namespace HTMLNames; 134 using namespace HTMLNames;
135 135
136 HTMLScriptRunner::HTMLScriptRunner(Document* document, HTMLScriptRunnerHost* hos t) 136 HTMLScriptRunner::HTMLScriptRunner(HTMLParserReentryPermit* reentryPermit, Docum ent* document, HTMLScriptRunnerHost* host)
137 : m_document(document) 137 : m_reentryPermit(reentryPermit)
138 , m_document(document)
138 , m_host(host) 139 , m_host(host)
139 , m_parserBlockingScript(PendingScript::create(nullptr, nullptr)) 140 , m_parserBlockingScript(PendingScript::create(nullptr, nullptr))
140 , m_scriptNestingLevel(0)
141 , m_hasScriptsWaitingForResources(false) 141 , m_hasScriptsWaitingForResources(false)
142 { 142 {
143 ASSERT(m_host); 143 ASSERT(m_host);
144 ThreadState::current()->registerPreFinalizer(this); 144 ThreadState::current()->registerPreFinalizer(this);
145 } 145 }
146 146
147 HTMLScriptRunner::~HTMLScriptRunner() 147 HTMLScriptRunner::~HTMLScriptRunner()
148 { 148 {
149 // Verify that detach() has been called. 149 // Verify that detach() has been called.
150 ASSERT(!m_document); 150 ASSERT(!m_document);
151 } 151 }
152 152
153 void HTMLScriptRunner::detach() 153 void HTMLScriptRunner::detach()
154 { 154 {
155 if (!m_document) 155 if (!m_document)
156 return; 156 return;
157 157
158 m_parserBlockingScript->stopWatchingForLoad(); 158 m_parserBlockingScript->stopWatchingForLoad();
159 m_parserBlockingScript->releaseElementAndClear(); 159 m_parserBlockingScript->releaseElementAndClear();
160 160
161 while (!m_scriptsToExecuteAfterParsing.isEmpty()) { 161 while (!m_scriptsToExecuteAfterParsing.isEmpty()) {
162 PendingScript* pendingScript = m_scriptsToExecuteAfterParsing.takeFirst( ); 162 PendingScript* pendingScript = m_scriptsToExecuteAfterParsing.takeFirst( );
163 pendingScript->stopWatchingForLoad(); 163 pendingScript->stopWatchingForLoad();
164 pendingScript->releaseElementAndClear(); 164 pendingScript->releaseElementAndClear();
165 } 165 }
166 m_document = nullptr; 166 m_document = nullptr;
167 // m_reentryPermit is not cleared here, because the script runner
168 // may continue to run pending scripts after the parser has
169 // detached.
167 } 170 }
168 171
169 bool HTMLScriptRunner::isPendingScriptReady(const PendingScript* script) 172 bool HTMLScriptRunner::isPendingScriptReady(const PendingScript* script)
170 { 173 {
171 m_hasScriptsWaitingForResources = !m_document->isScriptExecutionReady(); 174 m_hasScriptsWaitingForResources = !m_document->isScriptExecutionReady();
172 if (m_hasScriptsWaitingForResources) 175 if (m_hasScriptsWaitingForResources)
173 return false; 176 return false;
174 return script->isReady(); 177 return script->isReady();
175 } 178 }
176 179
(...skipping 24 matching lines...) Expand all
201 if (m_hasScriptsWaitingForResources) 204 if (m_hasScriptsWaitingForResources)
202 return; 205 return;
203 } 206 }
204 } 207 }
205 208
206 TextPosition scriptStartPosition = pendingScript->startingPosition(); 209 TextPosition scriptStartPosition = pendingScript->startingPosition();
207 double scriptParserBlockingTime = pendingScript->parserBlockingLoadStartTime (); 210 double scriptParserBlockingTime = pendingScript->parserBlockingLoadStartTime ();
208 // Clear the pending script before possible re-entrancy from executeScript() 211 // Clear the pending script before possible re-entrancy from executeScript()
209 Element* element = pendingScript->releaseElementAndClear(); 212 Element* element = pendingScript->releaseElementAndClear();
210 if (ScriptLoader* scriptLoader = toScriptLoaderIfPossible(element)) { 213 if (ScriptLoader* scriptLoader = toScriptLoaderIfPossible(element)) {
211 NestingLevelIncrementer nestingLevelIncrementer(m_scriptNestingLevel); 214 HTMLParserReentryPermit::ScriptNestingLevelIncrementer nestingLevelIncre menter = m_reentryPermit->incrementScriptNestingLevel();
212 IgnoreDestructiveWriteCountIncrementer ignoreDestructiveWriteCountIncrem enter(m_document); 215 IgnoreDestructiveWriteCountIncrementer ignoreDestructiveWriteCountIncrem enter(m_document);
213 if (errorOccurred) { 216 if (errorOccurred) {
214 TRACE_EVENT_WITH_FLOW1("blink", "HTMLScriptRunner ExecuteScriptFaile d", element, TRACE_EVENT_FLAG_FLOW_IN, 217 TRACE_EVENT_WITH_FLOW1("blink", "HTMLScriptRunner ExecuteScriptFaile d", element, TRACE_EVENT_FLAG_FLOW_IN,
215 "data", getTraceArgsForScriptElement(element, scriptStartPositio n)); 218 "data", getTraceArgsForScriptElement(element, scriptStartPositio n));
216 scriptLoader->dispatchErrorEvent(); 219 scriptLoader->dispatchErrorEvent();
217 } else { 220 } else {
218 ASSERT(isExecutingScript()); 221 ASSERT(isExecutingScript());
219 if (scriptParserBlockingTime > 0.0) { 222 if (scriptParserBlockingTime > 0.0) {
220 DocumentParserTiming::from(*m_document).recordParserBlockedOnScr iptLoadDuration(monotonicallyIncreasingTime() - scriptParserBlockingTime, script Loader->wasCreatedDuringDocumentWrite()); 223 DocumentParserTiming::from(*m_document).recordParserBlockedOnScr iptLoadDuration(monotonicallyIncreasingTime() - scriptParserBlockingTime, script Loader->wasCreatedDuringDocumentWrite());
221 } 224 }
(...skipping 190 matching lines...) Expand 10 before | Expand all | Expand 10 after
412 ASSERT(scriptLoader); 415 ASSERT(scriptLoader);
413 if (!scriptLoader) 416 if (!scriptLoader)
414 return; 417 return;
415 418
416 ASSERT(scriptLoader->isParserInserted()); 419 ASSERT(scriptLoader->isParserInserted());
417 420
418 if (!isExecutingScript()) 421 if (!isExecutingScript())
419 Microtask::performCheckpoint(V8PerIsolateData::mainThreadIsolate()); 422 Microtask::performCheckpoint(V8PerIsolateData::mainThreadIsolate());
420 423
421 InsertionPointRecord insertionPointRecord(m_host->inputStream()); 424 InsertionPointRecord insertionPointRecord(m_host->inputStream());
422 NestingLevelIncrementer nestingLevelIncrementer(m_scriptNestingLevel); 425 HTMLParserReentryPermit::ScriptNestingLevelIncrementer nestingLevelIncre menter = m_reentryPermit->incrementScriptNestingLevel();
423 426
424 scriptLoader->prepareScript(scriptStartPosition); 427 scriptLoader->prepareScript(scriptStartPosition);
425 428
426 if (!scriptLoader->willBeParserExecuted()) 429 if (!scriptLoader->willBeParserExecuted())
427 return; 430 return;
428 431
429 if (scriptLoader->willExecuteWhenDocumentFinishedParsing()) { 432 if (scriptLoader->willExecuteWhenDocumentFinishedParsing()) {
430 requestDeferredScript(script); 433 requestDeferredScript(script);
431 } else if (scriptLoader->readyToBeParserExecuted()) { 434 } else if (scriptLoader->readyToBeParserExecuted()) {
432 if (m_scriptNestingLevel == 1) { 435 if (m_reentryPermit->scriptNestingLevel() == 1u) {
433 m_parserBlockingScript->setElement(script); 436 m_parserBlockingScript->setElement(script);
434 m_parserBlockingScript->setStartingPosition(scriptStartPosition) ; 437 m_parserBlockingScript->setStartingPosition(scriptStartPosition) ;
435 } else { 438 } else {
436 ASSERT(m_scriptNestingLevel > 1); 439 DCHECK_GT(m_reentryPermit->scriptNestingLevel(), 1u);
437 m_parserBlockingScript->releaseElementAndClear(); 440 m_parserBlockingScript->releaseElementAndClear();
438 ScriptSourceCode sourceCode(script->textContent(), documentURLFo rScriptExecution(m_document), scriptStartPosition); 441 ScriptSourceCode sourceCode(script->textContent(), documentURLFo rScriptExecution(m_document), scriptStartPosition);
439 doExecuteScript(script, sourceCode, scriptStartPosition); 442 doExecuteScript(script, sourceCode, scriptStartPosition);
440 } 443 }
441 } else { 444 } else {
442 requestParsingBlockingScript(script); 445 requestParsingBlockingScript(script);
443 } 446 }
444 } 447 }
445 } 448 }
446 449
447 DEFINE_TRACE(HTMLScriptRunner) 450 DEFINE_TRACE(HTMLScriptRunner)
448 { 451 {
449 visitor->trace(m_document); 452 visitor->trace(m_document);
450 visitor->trace(m_host); 453 visitor->trace(m_host);
451 visitor->trace(m_parserBlockingScript); 454 visitor->trace(m_parserBlockingScript);
452 visitor->trace(m_scriptsToExecuteAfterParsing); 455 visitor->trace(m_scriptsToExecuteAfterParsing);
453 ScriptResourceClient::trace(visitor); 456 ScriptResourceClient::trace(visitor);
454 } 457 }
455 458
456 } // namespace blink 459 } // namespace blink
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698