| 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 13 matching lines...) Expand all Loading... |
| 24 */ | 24 */ |
| 25 | 25 |
| 26 #include "core/html/parser/HTMLParserScriptRunner.h" | 26 #include "core/html/parser/HTMLParserScriptRunner.h" |
| 27 | 27 |
| 28 #include <inttypes.h> | 28 #include <inttypes.h> |
| 29 #include <memory> | 29 #include <memory> |
| 30 #include "bindings/core/v8/Microtask.h" | 30 #include "bindings/core/v8/Microtask.h" |
| 31 #include "bindings/core/v8/ScriptSourceCode.h" | 31 #include "bindings/core/v8/ScriptSourceCode.h" |
| 32 #include "bindings/core/v8/V8Binding.h" | 32 #include "bindings/core/v8/V8Binding.h" |
| 33 #include "bindings/core/v8/V8PerIsolateData.h" | 33 #include "bindings/core/v8/V8PerIsolateData.h" |
| 34 #include "core/dom/ClassicScript.h" |
| 34 #include "core/dom/DocumentParserTiming.h" | 35 #include "core/dom/DocumentParserTiming.h" |
| 35 #include "core/dom/Element.h" | 36 #include "core/dom/Element.h" |
| 36 #include "core/dom/IgnoreDestructiveWriteCountIncrementer.h" | 37 #include "core/dom/IgnoreDestructiveWriteCountIncrementer.h" |
| 37 #include "core/dom/ScriptLoader.h" | 38 #include "core/dom/ScriptLoader.h" |
| 38 #include "core/dom/TaskRunnerHelper.h" | 39 #include "core/dom/TaskRunnerHelper.h" |
| 39 #include "core/events/Event.h" | 40 #include "core/events/Event.h" |
| 40 #include "core/frame/LocalFrame.h" | 41 #include "core/frame/LocalFrame.h" |
| 41 #include "core/html/parser/HTMLInputStream.h" | 42 #include "core/html/parser/HTMLInputStream.h" |
| 42 #include "core/html/parser/HTMLParserScriptRunnerHost.h" | 43 #include "core/html/parser/HTMLParserScriptRunnerHost.h" |
| 43 #include "core/html/parser/NestingLevelIncrementer.h" | 44 #include "core/html/parser/NestingLevelIncrementer.h" |
| (...skipping 28 matching lines...) Expand all Loading... |
| 72 } | 73 } |
| 73 if (textPosition.m_line.zeroBasedInt() > 0 || | 74 if (textPosition.m_line.zeroBasedInt() > 0 || |
| 74 textPosition.m_column.zeroBasedInt() > 0) { | 75 textPosition.m_column.zeroBasedInt() > 0) { |
| 75 value->setInteger("lineNumber", textPosition.m_line.oneBasedInt()); | 76 value->setInteger("lineNumber", textPosition.m_line.oneBasedInt()); |
| 76 value->setInteger("columnNumber", textPosition.m_column.oneBasedInt()); | 77 value->setInteger("columnNumber", textPosition.m_column.oneBasedInt()); |
| 77 } | 78 } |
| 78 return value; | 79 return value; |
| 79 } | 80 } |
| 80 | 81 |
| 81 bool doExecuteScript(ScriptElementBase* element, | 82 bool doExecuteScript(ScriptElementBase* element, |
| 82 const ScriptSourceCode& sourceCode, | 83 const Script* script, |
| 83 const TextPosition& textPosition) { | 84 const TextPosition& textPosition) { |
| 84 ScriptLoader* scriptLoader = element->loader(); | 85 ScriptLoader* scriptLoader = element->loader(); |
| 85 DCHECK(scriptLoader); | 86 DCHECK(scriptLoader); |
| 86 TRACE_EVENT_WITH_FLOW1("blink", "HTMLParserScriptRunner ExecuteScript", | 87 TRACE_EVENT_WITH_FLOW1("blink", "HTMLParserScriptRunner ExecuteScript", |
| 87 element, TRACE_EVENT_FLAG_FLOW_IN, "data", | 88 element, TRACE_EVENT_FLAG_FLOW_IN, "data", |
| 88 getTraceArgsForScriptElement(element, textPosition)); | 89 getTraceArgsForScriptElement(element, textPosition)); |
| 89 return scriptLoader->executeScript(sourceCode); | 90 return scriptLoader->executeScript(script); |
| 90 } | 91 } |
| 91 | 92 |
| 92 void traceParserBlockingScript(const PendingScript* pendingScript, | 93 void traceParserBlockingScript(const PendingScript* pendingScript, |
| 93 bool waitingForResources) { | 94 bool waitingForResources) { |
| 94 // The HTML parser must yield before executing script in the following | 95 // The HTML parser must yield before executing script in the following |
| 95 // cases: | 96 // cases: |
| 96 // * the script's execution is blocked on the completed load of the script | 97 // * the script's execution is blocked on the completed load of the script |
| 97 // resource | 98 // resource |
| 98 // (https://html.spec.whatwg.org/multipage/scripting.html#pending-parsing-bl
ocking-script) | 99 // (https://html.spec.whatwg.org/multipage/scripting.html#pending-parsing-bl
ocking-script) |
| 99 // * the script's execution is blocked on the load of a style sheet or other | 100 // * the script's execution is blocked on the load of a style sheet or other |
| (...skipping 96 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 196 // steps of the "Otherwise" Clause of 'An end tag whose tag name is "script"' | 197 // steps of the "Otherwise" Clause of 'An end tag whose tag name is "script"' |
| 197 // https://html.spec.whatwg.org/#scriptEndTag | 198 // https://html.spec.whatwg.org/#scriptEndTag |
| 198 // - When called from executeScriptsWaitingForParsing(), this corresponds | 199 // - When called from executeScriptsWaitingForParsing(), this corresponds |
| 199 // https://html.spec.whatwg.org/#execute-the-script-block | 200 // https://html.spec.whatwg.org/#execute-the-script-block |
| 200 // and thus currently this function does more than specced. | 201 // and thus currently this function does more than specced. |
| 201 // TODO(hiroshige): Make the spec and implementation consistent. | 202 // TODO(hiroshige): Make the spec and implementation consistent. |
| 202 void HTMLParserScriptRunner::executePendingScriptAndDispatchEvent( | 203 void HTMLParserScriptRunner::executePendingScriptAndDispatchEvent( |
| 203 PendingScript* pendingScript, | 204 PendingScript* pendingScript, |
| 204 ScriptStreamer::Type pendingScriptType) { | 205 ScriptStreamer::Type pendingScriptType) { |
| 205 bool errorOccurred = false; | 206 bool errorOccurred = false; |
| 206 ScriptSourceCode sourceCode = pendingScript->getSource( | 207 Script* script = pendingScript->getSource( |
| 207 documentURLForScriptExecution(m_document), errorOccurred); | 208 documentURLForScriptExecution(m_document), errorOccurred); |
| 208 | 209 |
| 209 // Stop watching loads before executeScript to prevent recursion if the script | 210 // Stop watching loads before executeScript to prevent recursion if the script |
| 210 // reloads itself. | 211 // reloads itself. |
| 211 // TODO(kouhei): Consider merging this w/ pendingScript->dispose() after the | 212 // TODO(kouhei): Consider merging this w/ pendingScript->dispose() after the |
| 212 // if block. | 213 // if block. |
| 213 pendingScript->stopWatchingForLoad(); | 214 pendingScript->stopWatchingForLoad(); |
| 214 | 215 |
| 215 if (!isExecutingScript()) { | 216 if (!isExecutingScript()) { |
| 216 Microtask::performCheckpoint(V8PerIsolateData::mainThreadIsolate()); | 217 Microtask::performCheckpoint(V8PerIsolateData::mainThreadIsolate()); |
| (...skipping 38 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 255 getTraceArgsForScriptElement(element, scriptStartPosition)); | 256 getTraceArgsForScriptElement(element, scriptStartPosition)); |
| 256 scriptLoader->dispatchErrorEvent(); | 257 scriptLoader->dispatchErrorEvent(); |
| 257 } else { | 258 } else { |
| 258 DCHECK(isExecutingScript()); | 259 DCHECK(isExecutingScript()); |
| 259 if (scriptParserBlockingTime > 0.0) { | 260 if (scriptParserBlockingTime > 0.0) { |
| 260 DocumentParserTiming::from(*m_document) | 261 DocumentParserTiming::from(*m_document) |
| 261 .recordParserBlockedOnScriptLoadDuration( | 262 .recordParserBlockedOnScriptLoadDuration( |
| 262 monotonicallyIncreasingTime() - scriptParserBlockingTime, | 263 monotonicallyIncreasingTime() - scriptParserBlockingTime, |
| 263 scriptLoader->wasCreatedDuringDocumentWrite()); | 264 scriptLoader->wasCreatedDuringDocumentWrite()); |
| 264 } | 265 } |
| 265 if (!doExecuteScript(element, sourceCode, scriptStartPosition)) { | 266 if (!doExecuteScript(element, script, scriptStartPosition)) { |
| 266 scriptLoader->dispatchErrorEvent(); | 267 scriptLoader->dispatchErrorEvent(); |
| 267 } else { | 268 } else { |
| 268 element->dispatchLoadEvent(); | 269 element->dispatchLoadEvent(); |
| 269 } | 270 } |
| 270 } | 271 } |
| 271 | 272 |
| 272 // 9. "Decrement the parser's script nesting level by one. | 273 // 9. "Decrement the parser's script nesting level by one. |
| 273 // If the parser's script nesting level is zero | 274 // If the parser's script nesting level is zero |
| 274 // (which it always should be at this point), | 275 // (which it always should be at this point), |
| 275 // then set the parser pause flag to false." | 276 // then set the parser pause flag to false." |
| (...skipping 389 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 665 // "Immediately execute the script block, | 666 // "Immediately execute the script block, |
| 666 // even if other scripts are already executing." | 667 // even if other scripts are already executing." |
| 667 // TODO(hiroshige): Merge the block into ScriptLoader::prepareScript(). | 668 // TODO(hiroshige): Merge the block into ScriptLoader::prepareScript(). |
| 668 DCHECK_GT(m_reentryPermit->scriptNestingLevel(), 1u); | 669 DCHECK_GT(m_reentryPermit->scriptNestingLevel(), 1u); |
| 669 if (m_parserBlockingScript) | 670 if (m_parserBlockingScript) |
| 670 m_parserBlockingScript->dispose(); | 671 m_parserBlockingScript->dispose(); |
| 671 m_parserBlockingScript = nullptr; | 672 m_parserBlockingScript = nullptr; |
| 672 ScriptSourceCode sourceCode(script->textContent(), | 673 ScriptSourceCode sourceCode(script->textContent(), |
| 673 documentURLForScriptExecution(m_document), | 674 documentURLForScriptExecution(m_document), |
| 674 scriptStartPosition); | 675 scriptStartPosition); |
| 675 doExecuteScript(element, sourceCode, scriptStartPosition); | 676 doExecuteScript(element, ClassicScript::create(sourceCode), |
| 677 scriptStartPosition); |
| 676 } | 678 } |
| 677 } else { | 679 } else { |
| 678 // 2nd Clause of Step 23. | 680 // 2nd Clause of Step 23. |
| 679 requestParsingBlockingScript(script); | 681 requestParsingBlockingScript(script); |
| 680 } | 682 } |
| 681 | 683 |
| 682 // "Decrement the parser's script nesting level by one. | 684 // "Decrement the parser's script nesting level by one. |
| 683 // If the parser's script nesting level is zero, then set the parser | 685 // If the parser's script nesting level is zero, then set the parser |
| 684 // pause flag to false." | 686 // pause flag to false." |
| 685 // Implemented by ~ScriptNestingLevelIncrementer(). | 687 // Implemented by ~ScriptNestingLevelIncrementer(). |
| 686 | 688 |
| 687 // "Let the insertion point have the value of the old insertion point." | 689 // "Let the insertion point have the value of the old insertion point." |
| 688 // Implemented by ~InsertionPointRecord(). | 690 // Implemented by ~InsertionPointRecord(). |
| 689 } | 691 } |
| 690 } | 692 } |
| 691 | 693 |
| 692 DEFINE_TRACE(HTMLParserScriptRunner) { | 694 DEFINE_TRACE(HTMLParserScriptRunner) { |
| 693 visitor->trace(m_document); | 695 visitor->trace(m_document); |
| 694 visitor->trace(m_host); | 696 visitor->trace(m_host); |
| 695 visitor->trace(m_parserBlockingScript); | 697 visitor->trace(m_parserBlockingScript); |
| 696 visitor->trace(m_scriptsToExecuteAfterParsing); | 698 visitor->trace(m_scriptsToExecuteAfterParsing); |
| 697 PendingScriptClient::trace(visitor); | 699 PendingScriptClient::trace(visitor); |
| 698 } | 700 } |
| 699 | 701 |
| 700 } // namespace blink | 702 } // namespace blink |
| OLD | NEW |