| Index: third_party/WebKit/Source/core/dom/ScriptLoader.cpp
|
| diff --git a/third_party/WebKit/Source/core/dom/ScriptLoader.cpp b/third_party/WebKit/Source/core/dom/ScriptLoader.cpp
|
| index e656de67ada8e2be16cbce860cb73955745b1ffc..d9f60581e018236f91e0e1782a8a29cb7fdb413c 100644
|
| --- a/third_party/WebKit/Source/core/dom/ScriptLoader.cpp
|
| +++ b/third_party/WebKit/Source/core/dom/ScriptLoader.cpp
|
| @@ -74,11 +74,16 @@ ScriptLoader::ScriptLoader(Element* element, bool parserInserted, bool alreadySt
|
| ASSERT(m_element);
|
| if (parserInserted && element->document().scriptableDocumentParser() && !element->document().isInDocumentWrite())
|
| m_startLineNumber = element->document().scriptableDocumentParser()->lineNumber();
|
| +#if ENABLE(OILPAN)
|
| + ThreadState::current()->registerPreFinalizer(this);
|
| +#endif
|
| }
|
|
|
| ScriptLoader::~ScriptLoader()
|
| {
|
| - m_pendingScript.stopWatchingForLoad(this);
|
| +#if !ENABLE(OILPAN)
|
| + detach();
|
| +#endif
|
| }
|
|
|
| DEFINE_TRACE(ScriptLoader)
|
| @@ -114,8 +119,11 @@ void ScriptLoader::handleAsyncAttribute()
|
|
|
| void ScriptLoader::detach()
|
| {
|
| - m_pendingScript.stopWatchingForLoad(this);
|
| - m_pendingScript.releaseElementAndClear();
|
| + if (!m_pendingScript)
|
| + return;
|
| + m_pendingScript->stopWatchingForLoad(this);
|
| + m_pendingScript->releaseElementAndClear();
|
| + m_pendingScript = nullptr;
|
| }
|
|
|
| // Helper function
|
| @@ -250,21 +258,21 @@ bool ScriptLoader::prepareScript(const TextPosition& scriptStartPosition, Legacy
|
| m_readyToBeParserExecuted = true;
|
| } else if (client->hasSourceAttribute() && !client->asyncAttributeValue() && !m_forceAsync) {
|
| m_willExecuteInOrder = true;
|
| - m_pendingScript = PendingScript(m_element, m_resource.get());
|
| + m_pendingScript = PendingScript::create(m_element, m_resource.get());
|
| contextDocument->scriptRunner()->queueScriptForExecution(this, ScriptRunner::IN_ORDER_EXECUTION);
|
| // Note that watchForLoad can immediately call notifyFinished.
|
| - m_pendingScript.watchForLoad(this);
|
| + m_pendingScript->watchForLoad(this);
|
| } else if (client->hasSourceAttribute()) {
|
| - m_pendingScript = PendingScript(m_element, m_resource.get());
|
| + m_pendingScript = PendingScript::create(m_element, m_resource.get());
|
| LocalFrame* frame = m_element->document().frame();
|
| if (frame) {
|
| ScriptState* scriptState = ScriptState::forMainWorld(frame);
|
| if (scriptState)
|
| - ScriptStreamer::startStreaming(m_pendingScript, PendingScript::Async, frame->settings(), scriptState, frame->frameScheduler()->loadingTaskRunner());
|
| + ScriptStreamer::startStreaming(m_pendingScript.get(), ScriptStreamer::Async, frame->settings(), scriptState, frame->frameScheduler()->loadingTaskRunner());
|
| }
|
| contextDocument->scriptRunner()->queueScriptForExecution(this, ScriptRunner::ASYNC_EXECUTION);
|
| // Note that watchForLoad can immediately call notifyFinished.
|
| - m_pendingScript.watchForLoad(this);
|
| + m_pendingScript->watchForLoad(this);
|
| } else {
|
| // Reset line numbering for nested writes.
|
| TextPosition position = elementDocument.isInDocumentWrite() ? TextPosition() : scriptStartPosition;
|
| @@ -429,10 +437,10 @@ bool ScriptLoader::executeScript(const ScriptSourceCode& sourceCode, double* com
|
| void ScriptLoader::execute()
|
| {
|
| ASSERT(!m_willBeParserExecuted);
|
| - ASSERT(m_pendingScript.resource());
|
| + ASSERT(m_pendingScript->resource());
|
| bool errorOccurred = false;
|
| - ScriptSourceCode source = m_pendingScript.getSource(KURL(), errorOccurred);
|
| - RefPtrWillBeRawPtr<Element> element = m_pendingScript.releaseElementAndClear();
|
| + ScriptSourceCode source = m_pendingScript->getSource(KURL(), errorOccurred);
|
| + RefPtrWillBeRawPtr<Element> element = m_pendingScript->releaseElementAndClear();
|
| ALLOW_UNUSED_LOCAL(element);
|
| if (errorOccurred) {
|
| dispatchErrorEvent();
|
| @@ -469,7 +477,7 @@ void ScriptLoader::notifyFinished(Resource* resource)
|
| return;
|
| }
|
| contextDocument->scriptRunner()->notifyScriptReady(this, runOrder);
|
| - m_pendingScript.stopWatchingForLoad(this);
|
| + m_pendingScript->stopWatchingForLoad(this);
|
| }
|
|
|
| bool ScriptLoader::ignoresLoadRequest() const
|
|
|