2010-09-06 Tony Gentilcore <tonyg@chromium.org>
Reviewed by Adam Barth.
Implement HTML5 definition of document.readyState
https://bugs.webkit.org/show_bug.cgi?id=45119
* fast/dom/Document/readystate-expected.txt: Added.
* fast/dom/Document/readystate.html: Added. Reads readyState inline script, external script, deferred script, DOMContentLoaded, onload, and dynamic post-onload script.
2010-09-06 Tony Gentilcore <tonyg@chromium.org>
Reviewed by Adam Barth.
Implement HTML5 definition of document.readyState
https://bugs.webkit.org/show_bug.cgi?id=45119
The legacy behavior was "loading" -> "loaded" -> "complete". The new
HTML5 behavior is "loading" -> "interactive" -> "complete". There is
some potential for this to cause compat problems if for instance a
page expects readyState to be "loaded" during the DOMContentLoaded event.
Test: fast/dom/Document/readystate.html
* dom/Document.cpp:
(WebCore::Document::Document): Initial value is Complete because according to http://www.whatwg.org/specs/web-apps/current-work/#dom-document-readystate,
when a Document is created the initial value is "complete" unless it has a parser associated with it, in which case it is "loading".
So the ctor starts it Complete, and when the parser is created it is flipped to Loading.
(WebCore::Document::readyState):
(WebCore::Document::setReadyState):
(WebCore::Document::implicitOpen):
(WebCore::Document::finishedParsing): Ensure that XML and HTML parser have transition to Stopping state.
* dom/Document.h:
* dom/DocumentParser.cpp:
(WebCore::DocumentParser::prepareToStopParsing): Previously this was being called when parsing had stopped.
It is better to ensure it is only called while parsing.
* dom/XMLDocumentParser.cpp:
(WebCore::XMLDocumentParser::end): Transition to stopping before calling document finishedParsiong().
* html/parser/HTMLDocumentParser.cpp:
(WebCore::HTMLDocumentParser::prepareToStopParsing): Set state to interactive before running deferred scripts.
This method is also called when parsing fragments, so we need to ensure it isn't done in that case.
(WebCore::HTMLDocumentParser::attemptToRunDeferredScriptsAndEnd): Added. Break out this part s that notifyFinished doesn't go through
the additional steps of pumping tokenizer, setting the state, etc.
(WebCore::HTMLDocumentParser::notifyFinished): Now that prepareToStopParsing is split up, we must protect. It also makes sense to add a couple of ASSERTs.
* loader/FrameLoader.cpp:
(WebCore::FrameLoader::stopLoading): It looks like an aborted load should never transition to "complete" according the HTML5. I've left the legacy behavior for now though.
(WebCore::FrameLoader::checkCompleted): The FrameLoader now sets the state on the Document instead of the Document polling the FrameLoader.
git-svn-id: http://svn.webkit.org/repository/webkit/trunk@66841 268f45cc-cd09-0410-ab3c-d52691b4dbfc
diff --git a/WebCore/loader/FrameLoader.cpp b/WebCore/loader/FrameLoader.cpp
index 7986dd9..dc7a1ce 100644
--- a/WebCore/loader/FrameLoader.cpp
+++ b/WebCore/loader/FrameLoader.cpp
@@ -425,6 +425,10 @@
m_workingURL = KURL();
if (Document* doc = m_frame->document()) {
+ // FIXME: HTML5 doesn't tell us to set the state to complete when aborting, but we do anyway to match legacy behavior.
+ // http://www.w3.org/Bugs/Public/show_bug.cgi?id=10537
+ doc->setReadyState(Document::Complete);
+
if (DocLoader* docLoader = doc->docLoader())
cache()->loader()->cancelRequests(docLoader);
@@ -838,6 +842,7 @@
// OK, completed.
m_isComplete = true;
+ m_frame->document()->setReadyState(Document::Complete);
RefPtr<Frame> protect(m_frame);
checkCallImplicitClose(); // if we didn't do it before