Reviewed by Darin.
authoradele <adele@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Sat, 5 Feb 2005 01:45:23 +0000 (01:45 +0000)
committeradele <adele@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Sat, 5 Feb 2005 01:45:23 +0000 (01:45 +0000)
        Fix for <rdar://problem/3758785> Safari no longer works at BankOfAmerica online banking for military users

        When closing the document, if a body doesn't exist we now create one.  This bug was preventing the onload handler from
        firing in cases where there wasn't a body.  In the BankOfAmerica case, the page was just a bit of script where the onload
        handler redirected to the correct page.

        * khtml/xml/dom_docimpl.cpp: (DocumentImpl::close):

git-svn-id: https://svn.webkit.org/repository/webkit/trunk@8526 268f45cc-cd09-0410-ab3c-d52691b4dbfc

WebCore/ChangeLog-2005-08-23
WebCore/khtml/xml/dom_docimpl.cpp

index 1657f026814a507982455954117323cea1d710a0..44f2b2763c4f11218b6020c410f6d00abef526dc 100644 (file)
@@ -1,3 +1,15 @@
+2005-02-04  Adele Amchan  <adele@apple.com>
+
+        Reviewed by Darin.
+
+        Fix for <rdar://problem/3758785> Safari no longer works at BankOfAmerica online banking for military users
+  
+        When closing the document, if a body doesn't exist we now create one.  This bug was preventing the onload handler from
+        firing in cases where there wasn't a body.  In the BankOfAmerica case, the page was just a bit of script where the onload
+        handler redirected to the correct page.
+
+        * khtml/xml/dom_docimpl.cpp: (DocumentImpl::close):
+
 2005-02-03  Ken Kocienda  <kocienda@apple.com>
 
         Reviewed by Chris
index 45350aa716761d9c4bfd638581bbb7003f9ac65f..59585b554e1bfa14cc53b27f8c513de08a57fe2a 100644 (file)
@@ -1338,19 +1338,39 @@ void DocumentImpl::close()
     bool wasLocationChangePending = part() && part()->isScheduledLocationChangePending();
     bool doload = !parsing() && m_tokenizer && !m_processingLoadEvent && !wasLocationChangePending;
     
-    if (body() && doload) {
+    if (doload) {
         m_processingLoadEvent = true;
+
         // We have to clear the tokenizer, in case someone document.write()s from the
         // onLoad event handler, as in Radar 3206524
         delete m_tokenizer;
         m_tokenizer = 0;
-        dispatchImageLoadEventsNow();
-        body()->dispatchWindowEvent(EventImpl::LOAD_EVENT, false, false);
+
+        // Create a body element if we don't already have one.
+        // In the case of Radar 3758785, the window.onload was set in some javascript, but never fired because there was no body.  
+        // This behavior now matches Firefox and IE.
+        HTMLElementImpl *body = this->body();
+        if (!body) {
+            NodeImpl *de = documentElement();
+            if (de) {
+                body = new HTMLBodyElementImpl(docPtr());
+                int exceptionCode = 0;
+                de->appendChild(body, exceptionCode);
+                if (exceptionCode != 0)
+                    body = 0;
+            }
+        }
+
+        if (body) {
+            dispatchImageLoadEventsNow();
+            body->dispatchWindowEvent(EventImpl::LOAD_EVENT, false, false);
+        }
 
 #ifdef INSTRUMENT_LAYOUT_SCHEDULING
         if (!ownerElement())
             printf("onload fired at %d\n", elapsedTime());
 #endif
+
         m_processingLoadEvent = false;
     }