add a state enumeration to track down cause of null CachedScript execution
https://bugs.webkit.org/show_bug.cgi?id=66939
Reviewed by Alexey Proskuryakov.
Over in http://code.google.com/p/chromium/issues/detail?id=75604 I
have a bug I cannot reproduce. I added an earlier crash in
https://bugs.webkit.org/show_bug.cgi?id=65563 , and we've since
gotten many good stacks, all coming in through a failed request that
eventually calls notifyFinished() on a ScriptElement with a NULL
m_cachedScript.
I'd like to know how this got NULL. This enumeration should let
me find that in stack dumps from reproductions.
No new tests, as my goal here is to get telemetry on a bug that I cannot reproduce.
* dom/ScriptElement.cpp:
(WebCore::ScriptElement::ScriptElement):
(WebCore::ScriptElement::requestScript):
(WebCore::ScriptElement::stopLoadRequest):
(WebCore::ScriptElement::notifyFinished):
* dom/ScriptElement.h:
git-svn-id: http://svn.webkit.org/repository/webkit/trunk@93871 268f45cc-cd09-0410-ab3c-d52691b4dbfc
diff --git a/Source/WebCore/dom/ScriptElement.cpp b/Source/WebCore/dom/ScriptElement.cpp
index 1f8c858..29e7de0 100644
--- a/Source/WebCore/dom/ScriptElement.cpp
+++ b/Source/WebCore/dom/ScriptElement.cpp
@@ -64,6 +64,7 @@
, m_willExecuteWhenDocumentFinishedParsing(false)
, m_forceAsync(!parserInserted)
, m_willExecuteInOrder(false)
+ , m_cachedScriptState(NeverSet)
{
ASSERT(m_element);
}
@@ -258,8 +259,11 @@
m_cachedScript = m_element->document()->cachedResourceLoader()->requestScript(request, scriptCharset());
m_isExternalScript = true;
- if (m_cachedScript)
+ if (m_cachedScript) {
+ ASSERT(m_cachedScriptState == NeverSet);
+ m_cachedScriptState = Set;
return true;
+ }
dispatchErrorEvent();
return false;
@@ -295,6 +299,8 @@
if (m_cachedScript) {
if (!m_willBeParserExecuted)
m_cachedScript->removeClient(this);
+ ASSERT(m_cachedScriptState == Set);
+ m_cachedScriptState = ZeroedInStopLoadRequest;
m_cachedScript = 0;
}
}
@@ -320,6 +326,9 @@
m_element->document()->scriptRunner()->notifyInOrderScriptReady();
else
m_element->document()->scriptRunner()->queueScriptForExecution(this, m_cachedScript, ScriptRunner::ASYNC_EXECUTION);
+
+ ASSERT(m_cachedScriptState == Set);
+ m_cachedScriptState = ZeroedInNotifyFinished;
m_cachedScript = 0;
}