From ed5c851afb8bd4e3082b0b805b33fb26ae6202c4 Mon Sep 17 00:00:00 2001 From: Olli Pettay Date: Sat, 19 Jul 2008 18:20:22 +0300 Subject: [PATCH] Bug 445330, document.loaded XML documents fire onload before DOMContentLoaded, r+sr=bz --- content/base/src/nsDocument.cpp | 12 ++-- content/base/src/nsDocument.h | 2 + content/xml/document/src/nsXMLDocument.cpp | 6 +- content/xml/document/test/Makefile.in | 1 + content/xml/document/test/test_bug445330.html | 56 +++++++++++++++++++ 5 files changed, 71 insertions(+), 6 deletions(-) create mode 100644 content/xml/document/test/test_bug445330.html diff --git a/content/base/src/nsDocument.cpp b/content/base/src/nsDocument.cpp index 8e547b94d7a..98cb28b3280 100644 --- a/content/base/src/nsDocument.cpp +++ b/content/base/src/nsDocument.cpp @@ -3431,10 +3431,14 @@ nsDocument::EndLoad() NS_DOCUMENT_NOTIFY_OBSERVERS(EndLoad, (this)); - nsRefPtr ev = - new nsRunnableMethod(this, - &nsDocument::DispatchContentLoadedEvents); - NS_DispatchToCurrentThread(ev); + if (!mSynchronousDOMContentLoaded) { + nsRefPtr ev = + new nsRunnableMethod(this, + &nsDocument::DispatchContentLoadedEvents); + NS_DispatchToCurrentThread(ev); + } else { + DispatchContentLoadedEvents(); + } } void diff --git a/content/base/src/nsDocument.h b/content/base/src/nsDocument.h index 9d36587d0d8..20da706bee1 100644 --- a/content/base/src/nsDocument.h +++ b/content/base/src/nsDocument.h @@ -940,6 +940,8 @@ protected: PRPackedBool mDelayFrameLoaderInitialization:1; + PRPackedBool mSynchronousDOMContentLoaded:1; + PRUint8 mXMLDeclarationBits; PRUint8 mDefaultElementType; diff --git a/content/xml/document/src/nsXMLDocument.cpp b/content/xml/document/src/nsXMLDocument.cpp index 906a18b95a2..673c98c67fe 100644 --- a/content/xml/document/src/nsXMLDocument.cpp +++ b/content/xml/document/src/nsXMLDocument.cpp @@ -542,7 +542,10 @@ nsXMLDocument::EndLoad() mChannelIsPending = PR_FALSE; mLoopingForSyncLoad = PR_FALSE; - if (mLoadedAsData || mLoadedAsInteractiveData) { + mSynchronousDOMContentLoaded = (mLoadedAsData || mLoadedAsInteractiveData); + nsDocument::EndLoad(); + if (mSynchronousDOMContentLoaded) { + mSynchronousDOMContentLoaded = PR_FALSE; // Generate a document load event for the case when an XML // document was loaded as pure data without any presentation // attached to it. @@ -550,7 +553,6 @@ nsXMLDocument::EndLoad() nsEventDispatcher::Dispatch(static_cast(this), nsnull, &event); } - nsDocument::EndLoad(); } // nsIDOMNode interface diff --git a/content/xml/document/test/Makefile.in b/content/xml/document/test/Makefile.in index f4095732382..39ef49a30e0 100644 --- a/content/xml/document/test/Makefile.in +++ b/content/xml/document/test/Makefile.in @@ -49,6 +49,7 @@ _TEST_FILES = test_bug232004.xhtml \ test_bug355213.xhtml \ test_bug392338.html \ test_bug399502.xhtml \ + test_bug445330.html \ test_viewport.xhtml \ $(NULL) diff --git a/content/xml/document/test/test_bug445330.html b/content/xml/document/test/test_bug445330.html new file mode 100644 index 00000000000..6c0660751bd --- /dev/null +++ b/content/xml/document/test/test_bug445330.html @@ -0,0 +1,56 @@ + + + + + Test for Bug 445330 + + + + + +Mozilla Bug 445330 +

+ +
+
+
+ + +