- rolled out Maciej's event cleanup patch, which is causing problems
authordarin <darin@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Sun, 5 Feb 2006 19:00:30 +0000 (19:00 +0000)
committerdarin <darin@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Sun, 5 Feb 2006 19:00:30 +0000 (19:00 +0000)
        I believe he has a fix, and he'll re-land the patch with the fix later.

        Original fix was <http://bugzilla.opendarwin.org/show_bug.cgi?id=7079>.
        Problems described in <http://bugzilla.opendarwin.org/show_bug.cgi?id=7084>.

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

WebCore/ChangeLog
WebCore/bridge/mac/MacFrame.mm
WebCore/khtml/xml/NodeImpl.cpp
WebCore/khtml/xml/NodeImpl.h

index cb7ced22f4739cd626d6defff5b57572b973df19..2e829470049bc7e8cf96dba29aec3dbd1bc4ad3e 100644 (file)
@@ -1,3 +1,12 @@
+2006-02-05  Darin Adler  <darin@apple.com>
+
+        - rolled out Maciej's event cleanup patch, which is causing problems
+
+        I believe he has a fix, and he'll re-land the patch with the fix later.
+
+        Original fix was <http://bugzilla.opendarwin.org/show_bug.cgi?id=7079>.
+        Problems described in <http://bugzilla.opendarwin.org/show_bug.cgi?id=7084>.
+
 2006-02-05  Darin Adler  <darin@apple.com>
 
         * ksvg2/css/KSVGCSSParser.cpp: Remove config.h, since this is included by another
index 4c960ae7d2f1f54042ba3ca8823652cd63c243ca..233ed48f672b5a9346a61006cbaea58cd22d684e 100644 (file)
@@ -3531,7 +3531,7 @@ bool MacFrame::shouldClose()
     RefPtr<BeforeUnloadEventImpl> event = new BeforeUnloadEventImpl;
     event->setTarget(doc.get());
     int exception = 0;
-    body->dispatchGenericEvent(event, exception, true);
+    body->dispatchGenericEvent(event, exception);
     if (!event->defaultPrevented() && doc)
         doc->defaultEventHandler(event.get());
     if (event->result().isNull())
index f41db123aaa262571c862c3e83076026af98c90a..47216bcb1ef577fb2b0a2f116ee00423268dedab 100644 (file)
@@ -495,12 +495,31 @@ bool NodeImpl::dispatchEvent(PassRefPtr<EventImpl> e, int &exceptioncode, bool t
     }
     evt->setTarget(this);
 
-    RefPtr<FrameView> view = getDocument()->view();
+    // We've had at least one report of a crash on a page where document is null here.
+    // Unfortunately that page no longer exists, but we'll make this code robust against
+    // that anyway.
+    // FIXME: Much code in this class assumes document is non-null; it would be better to
+    // ensure that document can never be null.
+    Frame *frame = 0;
+    RefPtr<FrameView> view;
+
+    if (DocumentImpl *doc = getDocument()) {
+        frame = doc->frame();
+        view = doc->view();
+    }
+
+    bool ret = dispatchGenericEvent(evt, exceptioncode);
 
-    return dispatchGenericEvent(evt.release(), exceptioncode, tempEvent);
+    // If tempEvent is true, this means that the DOM implementation will not be storing a reference to the event, i.e.
+    // there is no way to retrieve it from javascript if a script does not already have a reference to it in a variable.
+    // So there is no need for the interpreter to keep the event in it's cache
+    if (tempEvent && frame && frame->jScript())
+        frame->jScript()->finishedWithEvent(evt.get());
+
+    return ret;
 }
 
-bool NodeImpl::dispatchGenericEvent(PassRefPtr<EventImpl> e, int &/*exceptioncode */, bool tempEvent)
+bool NodeImpl::dispatchGenericEvent(PassRefPtr<EventImpl> e, int &/*exceptioncode */)
 {
     RefPtr<EventImpl> evt(e);
     assert(!eventDispatchForbidden());
@@ -516,6 +535,7 @@ bool NodeImpl::dispatchGenericEvent(PassRefPtr<EventImpl> e, int &/*exceptioncod
         nodeChain.prepend(n);
     }
 
+    
     QPtrListIterator<NodeImpl> it(nodeChain);
     
     // Before we begin dispatching events, give the target node a chance to do some work prior
@@ -569,16 +589,12 @@ bool NodeImpl::dispatchGenericEvent(PassRefPtr<EventImpl> e, int &/*exceptioncod
     // Now call the post dispatch.
     postDispatchEventHandler(evt.get(), data);
     
-    // now we call all default event handlers (this is not part of DOM - it is internal to khtml)
-
     if (evt->bubbles()) {
+        // now we call all default event handlers (this is not part of DOM - it is internal to khtml)
+
         it.toLast();
         for (; it.current() && !evt->defaultPrevented() && !evt->defaultHandled(); --it)
             it.current()->defaultEventHandler(evt.get());
-    } else {
-        it.toFirst();
-        if (!evt->defaultPrevented() && !evt->defaultHandled())
-            it.current()->defaultEventHandler(evt.get());
     }
     
     // deref all nodes in chain
@@ -588,15 +604,6 @@ bool NodeImpl::dispatchGenericEvent(PassRefPtr<EventImpl> e, int &/*exceptioncod
 
     DocumentImpl::updateDocumentsRendering();
 
-    // If tempEvent is true, this means that the DOM implementation
-    // will not be storing a reference to the event, i.e.  there is no
-    // way to retrieve it from javascript if a script does not already
-    // have a reference to it in a variable.  So there is no need for
-    // the interpreter to keep the event in its cache
-    Frame *frame = getDocument()->frame();
-    if (tempEvent && frame && frame->jScript())
-        frame->jScript()->finishedWithEvent(evt.get());
-
     return !evt->defaultPrevented(); // ### what if defaultPrevented was called before dispatchEvent?
 }
 
@@ -614,17 +621,29 @@ bool NodeImpl::dispatchWindowEvent(const AtomicString &eventType, bool canBubble
     RefPtr<EventImpl> evt = new EventImpl(eventType, canBubbleArg, cancelableArg);
     RefPtr<DocumentImpl> doc = getDocument();
     evt->setTarget(doc.get());
-    bool r = dispatchGenericEvent(evt.release(), exceptioncode, true);
+    bool r = dispatchGenericEvent(evt, exceptioncode);
+    if (!evt->defaultPrevented() && doc)
+        doc->defaultEventHandler(evt.get());
 
-    if (eventType == loadEvent) {
-        // For onload events, send a separate load event to the enclosing frame only.
+    if (eventType == loadEvent && !evt->propagationStopped() && doc) {
+        // For onload events, send them to the enclosing frame only.
         // This is a DOM extension and is independent of bubbling/capturing rules of
-        // the DOM.
-        ElementImpl* ownerElement = doc->ownerElement();
-        if (ownerElement) {
-            RefPtr<EventImpl> ownerEvent = new EventImpl(eventType, false, cancelableArg);
-            ownerEvent->setTarget(ownerElement);
-            ownerElement->dispatchGenericEvent(ownerEvent.release(), exceptioncode, true);
+        // the DOM.  You send the event only to the enclosing frame.  It does not
+        // bubble through the parent document.
+        ElementImpl* elt = doc->ownerElement();
+        if (elt && (elt->getDocument()->domain().isNull() ||
+                    elt->getDocument()->domain() == doc->domain())) {
+            // We also do a security check, since we don't want to allow the enclosing
+            // iframe to see loads of child documents in other domains.
+            evt->setCurrentTarget(elt);
+
+            // Capturing first.
+            elt->handleLocalEvents(evt.get(), true);
+
+            // Bubbling second.
+            if (!evt->propagationStopped())
+                elt->handleLocalEvents(evt.get(), false);
+            r = !evt->defaultPrevented();
         }
     }
 
index 8f153b687c8fe1e5f173a2d1921939edde899f30..2df640f96d0202ed9178880a7059d02db8fba37f 100644 (file)
@@ -272,7 +272,7 @@ public:
     void removeAllEventListeners();
 
     bool dispatchEvent(PassRefPtr<EventImpl>, ExceptionCode&, bool tempEvent = false);
-    bool dispatchGenericEvent(PassRefPtr<EventImpl>, ExceptionCode&, bool tempEvent = false);
+    bool dispatchGenericEvent(PassRefPtr<EventImpl>, ExceptionCode&);
     bool dispatchHTMLEvent(const AtomicString& eventType, bool canBubble, bool cancelable);
     bool dispatchWindowEvent(const AtomicString& eventType, bool canBubble, bool cancelable);
     bool dispatchMouseEvent(QMouseEvent*, const AtomicString& overrideType,