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