void HTMLScriptRunner::executePendingScriptAndDispatchEvent(PendingScript& pendingScript) { bool errorOccurred = false; ScriptSourceCode sourceCode = sourceFromPendingScript(pendingScript, errorOccurred); // Stop watching loads before executeScript to prevent recursion if the script reloads itself. if (pendingScript.cachedScript() && pendingScript.watchingForLoad()) stopWatchingForLoad(pendingScript); if (!isExecutingScript()) { #if ENABLE(CUSTOM_ELEMENTS) CustomElementRegistry::deliverAllLifecycleCallbacks(); #endif MutationObserver::deliverAllMutations(); } // Clear the pending script before possible rentrancy from executeScript() RefPtr<Element> element = pendingScript.releaseElementAndClear(); if (ScriptElement* scriptElement = toScriptElement(element.get())) { NestingLevelIncrementer nestingLevelIncrementer(m_scriptNestingLevel); IgnoreDestructiveWriteCountIncrementer ignoreDestructiveWriteCountIncrementer(m_document); if (errorOccurred) scriptElement->dispatchErrorEvent(); else { ASSERT(isExecutingScript()); scriptElement->executeScript(sourceCode); element->dispatchEvent(createScriptLoadEvent()); } } ASSERT(!isExecutingScript()); }
void HTMLScriptRunner::executePendingScriptAndDispatchEvent(PendingScript& pendingScript) { bool errorOccurred = false; ScriptSourceCode sourceCode = sourceFromPendingScript(pendingScript, errorOccurred); // Stop watching loads before executeScript to prevent recursion if the script reloads itself. if (pendingScript.resource() && pendingScript.watchingForLoad()) stopWatchingForLoad(pendingScript); if (!isExecutingScript()) Microtask::performCheckpoint(); // Clear the pending script before possible rentrancy from executeScript() RefPtr<Element> element = pendingScript.releaseElementAndClear(); if (ScriptLoader* scriptLoader = toScriptLoaderIfPossible(element.get())) { NestingLevelIncrementer nestingLevelIncrementer(m_scriptNestingLevel); IgnoreDestructiveWriteCountIncrementer ignoreDestructiveWriteCountIncrementer(m_document); if (errorOccurred) scriptLoader->dispatchErrorEvent(); else { ASSERT(isExecutingScript()); scriptLoader->executeScript(sourceCode); element->dispatchEvent(createScriptLoadEvent()); } } ASSERT(!isExecutingScript()); }
void HTMLScriptRunner::executePendingScriptAndDispatchEvent(PendingScript& pendingScript) { bool errorOccurred = false; ScriptSourceCode sourceCode = sourceFromPendingScript(pendingScript, errorOccurred); // Stop watching loads before executeScript to prevent recursion if the script reloads itself. if (pendingScript.cachedScript() && pendingScript.watchingForLoad()) stopWatchingForLoad(pendingScript); // WebERA: Insert HB relation between the execution of a pending script and the load of the script if (HBIsCurrentEventActionValid() && pendingScript.cachedScript() && pendingScript.cachedScript()->isLoaded() && pendingScript.cachedScript()->getLoadingEventAction() != 0) { HBAddExplicitArc(pendingScript.cachedScript()->getLoadingEventAction(), HBCurrentEventAction()); } // Clear the pending script before possible rentrancy from executeScript() RefPtr<Element> element = pendingScript.releaseElementAndClear(); if (ScriptElement* scriptElement = toScriptElement(element.get())) { NestingLevelIncrementer nestingLevelIncrementer(m_scriptNestingLevel); IgnoreDestructiveWriteCountIncrementer ignoreDestructiveWriteCountIncrementer(m_document); if (errorOccurred) scriptElement->dispatchErrorEvent(); else { ASSERT(isExecutingScript()); scriptElement->executeScript(sourceCode); element->dispatchEvent(createScriptLoadEvent()); } } ASSERT(!m_scriptNestingLevel); }
void HTMLScriptRunner::executePendingScriptAndDispatchEvent(PendingScript& pendingScript, PendingScriptType pendingScriptType) { bool errorOccurred = false; ScriptSourceCode sourceCode = sourceFromPendingScript(pendingScript, errorOccurred); // Stop watching loads before executeScript to prevent recursion if the script reloads itself. if (pendingScript.resource() && pendingScript.watchingForLoad()) stopWatchingForLoad(pendingScript); if (!isExecutingScript()) { Microtask::performCheckpoint(); if (pendingScriptType == PendingScriptBlockingParser) { m_hasScriptsWaitingForResources = !m_document->isScriptExecutionReady(); // The parser cannot be unblocked as a microtask requested another resource if (m_hasScriptsWaitingForResources) return; } } // Clear the pending script before possible rentrancy from executeScript() RefPtr<Element> element = pendingScript.releaseElementAndClear(); if (ScriptLoader* scriptLoader = toScriptLoaderIfPossible(element.get())) { NestingLevelIncrementer nestingLevelIncrementer(m_scriptNestingLevel); IgnoreDestructiveWriteCountIncrementer ignoreDestructiveWriteCountIncrementer(m_document); if (errorOccurred) scriptLoader->dispatchErrorEvent(); else { ASSERT(isExecutingScript()); scriptLoader->executeScript(sourceCode); element->dispatchEvent(createScriptLoadEvent()); } } ASSERT(!isExecutingScript()); }
void HTMLScriptRunner::detach() { if (!m_document) return; m_parserBlockingScript->stopWatchingForLoad(); m_parserBlockingScript->releaseElementAndClear(); while (!m_scriptsToExecuteAfterParsing.isEmpty()) { PendingScript* pendingScript = m_scriptsToExecuteAfterParsing.takeFirst(); pendingScript->stopWatchingForLoad(); pendingScript->releaseElementAndClear(); } m_document = nullptr; }
void HTMLScriptRunner::executePendingScriptAndDispatchEvent(PendingScript& pendingScript) { bool errorOccurred = false; ScriptSourceCode sourceCode = sourceFromPendingScript(pendingScript, errorOccurred); // Clear the pending script before possible rentrancy from executeScript() RefPtr<Element> scriptElement = pendingScript.releaseElementAndClear(); { NestingLevelIncrementer nestingLevelIncrementer(m_scriptNestingLevel); if (errorOccurred) scriptElement->dispatchEvent(createScriptErrorEvent()); else { executeScript(scriptElement.get(), sourceCode); scriptElement->dispatchEvent(createScriptLoadEvent()); } } ASSERT(!m_scriptNestingLevel); }