WebCore:
authordarin <darin@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Sat, 4 Dec 2004 22:31:12 +0000 (22:31 +0000)
committerdarin <darin@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Sat, 4 Dec 2004 22:31:12 +0000 (22:31 +0000)
        Reviewed by John.

        - fixed <rdar://problem/3878329> REGRESSION (169-170): colors are wrong for my.yahoo.com due to CSS background parsing changes

        * khtml/css/cssparser.cpp: (CSSParser::parseBackgroundShorthand): Changed function so it doesn't rely on the position
        attribute being at the end of the array and then moved position attribute before color attribute so it takes precedence.
        Since "0" can be both the X coordinate of a position and a legal color (meaning black), we need to do position first.

        - fixed <rdar://problem/3760869> click events for input type=button or type=checkbox don't have flags like shiftKey set

        * khtml/rendering/render_form.h: Remove unused RenderFormElement fields.
        * khtml/rendering/render_form.cpp:
        (RenderFormElement::RenderFormElement): Take out code to set a bunch of unused fields.
        (RenderFormElement::slotClicked): Change to create the QMouseEvent from the actual mouse event rather than
        creating it with all the flags set to 0, using the new QMouseEvent constructor that does so.

        * kwq/KWQEvent.h: Added constructor that takes no parameters which uses the current event from AppKit.
        Made the click count getter const and added an isDoubleClick that matches the logic used elsewhere.
        Added a fixState helper method so the constructors can save code.
        * kwq/KWQEvent.mm:
        (QMouseEvent::QMouseEvent): Factored out the state-fixing code that was in the two existing constructors
        and added a third constructor that uses the "current event" from AppKit (used above).
        (QMouseEvent::fixState): Compute state and click count based on event type.

        - fixed first symptom of <rdar://problem/3830936> REGRESSION (125-165): crash due to null font family, hang at changeforamerica.com

        * kwq/KWQFontFamily.mm: (KWQFontFamily::getNSFamily): Handle empty strings specially so we don't run into trouble when
        the family name is a null string. This prevents the crash, but there are still other problems that may have the same
        underlying cause in CSS.

        - fixed <rdar://problem/3829808> Safari crashes when adding a DOM node that was removed from an XMLHTTP request result

        * khtml/html/html_baseimpl.cpp: (HTMLBodyElementImpl::insertedIntoDocument):
        Added nil check before calling scheduleRelayout. This is new code so the nil-dereference is a recent regression.

WebKit:

        Reviewed by John.

        - fixed <rdar://problem/3846079> assertion failure in WebHTMLView(WebPrivate) removeTrackingRect at boots.com
        - fixed <rdar://problem/3857737> REGRESSION (165-166): clicking in a text field that's scrolled to the right causes it to scroll all the way left
        - fixed <rdar://problem/3861952> REGRESSION (165-166): selection is cleared when you start to scroll a frame

        * WebView.subproj/WebHTMLViewInternal.h: Added handlingMouseDown flag.
        * WebView.subproj/WebHTMLView.m:
        (-[WebHTMLView _addTrackingRect:owner:userData:assumeInside:useTrackingNum:]): Allow passing in a
        tracking number of 0, which means no existing tracking number.
        (-[WebHTMLView _addTrackingRects:owner:userDataList:assumeInsideList:trackingNums:count:]): Ditto.
        (-[WebHTMLView removeTrackingRect:]): Allow removing a tracking number of 0, which is a no-op.
        (-[WebHTMLView _removeTrackingRects:count:]): Ditto.
        (-[WebHTMLView acceptsFirstResponder]): Changed check to use handlingMouseDown flag instead of mouseDownEvent
        field since that field is set up too early in the mouse down event handling process.
        (-[WebHTMLView mouseDown:]): Added code to set handlingMouseDown flag.

        - fixed part of <rdar://problem/3829808> Safari crashes when adding a DOM node that was removed from an XMLHTTP request result

        * WebCoreSupport.subproj/WebBridge.m:
        (-[WebBridge syncLoadResourceWithURL:customHeaders:postData:finalURL:responseHeaders:statusCode:]):
        Changed code around so that it won't try to create a WebResource when the load fails.

        - moved next/previous links into private structure with the rest of WebFrame fields
          (We have a rule against putting new fields into obejcts that are part of our public API.)

        * WebView.subproj/WebFrame.h: Remove _nextSibling and _previousSibling.
        * WebView.subproj/WebFramePrivate.h: Added nextSibling and previousSibling fields to private class.
        * WebView.subproj/WebFrame.m: Got rid of some tabs in this file.
        (-[WebFrame _addChild:]): Changed code to use fields inside _private.
        (-[WebFrame _removeChild:]): Ditto.
        (-[WebFrame _nextFrameWithWrap:]): Ditto.
        (-[WebFrame _previousFrameWithWrap:]): Ditto.

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

15 files changed:
WebCore/ChangeLog-2005-08-23
WebCore/khtml/css/cssparser.cpp
WebCore/khtml/html/html_baseimpl.cpp
WebCore/khtml/rendering/render_form.cpp
WebCore/khtml/rendering/render_form.h
WebCore/kwq/KWQEvent.h
WebCore/kwq/KWQEvent.mm
WebCore/kwq/KWQFontFamily.mm
WebKit/ChangeLog
WebKit/WebCoreSupport.subproj/WebBridge.m
WebKit/WebView.subproj/WebFrame.h
WebKit/WebView.subproj/WebFrame.m
WebKit/WebView.subproj/WebFramePrivate.h
WebKit/WebView.subproj/WebHTMLView.m
WebKit/WebView.subproj/WebHTMLViewInternal.h

index 4a594d8b2b7e8836c057d6dc8f5000d33b9a8686..af307f69bb3e261ff2b96f35e3b0e0b4c87675b9 100644 (file)
@@ -1,3 +1,40 @@
+2004-12-04  Darin Adler  <darin@apple.com>
+
+        Reviewed by John.
+
+        - fixed <rdar://problem/3878329> REGRESSION (169-170): colors are wrong for my.yahoo.com due to CSS background parsing changes
+
+        * khtml/css/cssparser.cpp: (CSSParser::parseBackgroundShorthand): Changed function so it doesn't rely on the position
+        attribute being at the end of the array and then moved position attribute before color attribute so it takes precedence.
+        Since "0" can be both the X coordinate of a position and a legal color (meaning black), we need to do position first.
+
+        - fixed <rdar://problem/3760869> click events for input type=button or type=checkbox don't have flags like shiftKey set
+
+        * khtml/rendering/render_form.h: Remove unused RenderFormElement fields.
+        * khtml/rendering/render_form.cpp:
+        (RenderFormElement::RenderFormElement): Take out code to set a bunch of unused fields.
+        (RenderFormElement::slotClicked): Change to create the QMouseEvent from the actual mouse event rather than
+        creating it with all the flags set to 0, using the new QMouseEvent constructor that does so.
+
+        * kwq/KWQEvent.h: Added constructor that takes no parameters which uses the current event from AppKit.
+        Made the click count getter const and added an isDoubleClick that matches the logic used elsewhere.
+        Added a fixState helper method so the constructors can save code.
+        * kwq/KWQEvent.mm:
+        (QMouseEvent::QMouseEvent): Factored out the state-fixing code that was in the two existing constructors
+        and added a third constructor that uses the "current event" from AppKit (used above).
+        (QMouseEvent::fixState): Compute state and click count based on event type.
+
+        - fixed first symptom of <rdar://problem/3830936> REGRESSION (125-165): crash due to null font family, hang at changeforamerica.com
+
+        * kwq/KWQFontFamily.mm: (KWQFontFamily::getNSFamily): Handle empty strings specially so we don't run into trouble when
+        the family name is a null string. This prevents the crash, but there are still other problems that may have the same
+        underlying cause in CSS.
+
+        - fixed <rdar://problem/3829808> Safari crashes when adding a DOM node that was removed from an XMLHTTP request result
+
+        * khtml/html/html_baseimpl.cpp: (HTMLBodyElementImpl::insertedIntoDocument):
+        Added nil check before calling scheduleRelayout. This is new code so the nil-dereference is a recent regression.
+
 2004-12-03  Chris Blumenberg  <cblu@apple.com>
 
        New fixes for:
 
         * khtml/rendering/bidi.cpp:
         (khtml::RenderBlock::findNextLineBreak): I did not get my fix for 3848343 and 3848224
-           yesterday quite right: words that should have been placed on the next line were instead
+        yesterday quite right: words that should have been placed on the next line were instead
         appearing on the line before, beyond the right margin. This was a one-word only error
         based on moving the line break object when it should have stayed put. Here is the rule:
         The line break object only moves to after the whitespace on the end of a line if that 
index 76c96ccc101e24cdcaf1ff2fbb0b922694b78b12..f149328c9963c1842890d6031bad0242e4d99eed 100644 (file)
@@ -1264,16 +1264,17 @@ void CSSParser::addBackgroundValue(CSSValueImpl*& lval, CSSValueImpl* rval)
 
 bool CSSParser::parseBackgroundShorthand(bool important)
 {
+    // Position must come before color in this array because a plain old "0" is a legal color
+    // in quirks mode but it's usually the X coordinate of a position.
     const int numProperties = 5;
-    const int numValues = numProperties + 1;
     const int properties[numProperties] = { CSS_PROP_BACKGROUND_IMAGE, CSS_PROP_BACKGROUND_REPEAT,
-        CSS_PROP_BACKGROUND_ATTACHMENT, CSS_PROP_BACKGROUND_COLOR, CSS_PROP_BACKGROUND_POSITION };
+        CSS_PROP_BACKGROUND_ATTACHMENT, CSS_PROP_BACKGROUND_POSITION, CSS_PROP_BACKGROUND_COLOR };
     
     inParseShortHand = true;
     
-    bool found = false;
-    bool parsedProperty[numProperties] = { false }; // C compiler will repeat as necessary
-    CSSValueImpl* values[numValues] = { 0 }; // C compiler will repeat as necessary
+    bool parsedProperty[numProperties] = { false }; // compiler will repeat false as necessary
+    CSSValueImpl* values[numProperties] = { 0 }; // compiler will repeat 0 as necessary
+    CSSValueImpl* positionYValue = 0;
     int i;
 
     while (valueList->current()) {
@@ -1282,19 +1283,15 @@ bool CSSParser::parseBackgroundShorthand(bool important)
             // We hit the end.  Fill in all remaining values with the initial value.
             valueList->next();
             for (i = 0; i < numProperties; ++i) {
-                if (properties[i] == CSS_PROP_BACKGROUND_COLOR && parsedProperty[i]) {
+                if (properties[i] == CSS_PROP_BACKGROUND_COLOR && parsedProperty[i])
                     // Color is not allowed except as the last item in a list.  Reject the entire
                     // property.
-                    inParseShortHand = false;
-                    for (int k = 0; k < numValues; k++)
-                        delete values[k];
-                    return false;
-                }
+                    goto fail;
 
                 if (!parsedProperty[i] && properties[i] != CSS_PROP_BACKGROUND_COLOR) {
                     addBackgroundValue(values[i], new CSSInitialValueImpl());
                     if (properties[i] == CSS_PROP_BACKGROUND_POSITION)
-                        addBackgroundValue(values[i+1], new CSSInitialValueImpl());
+                        addBackgroundValue(positionYValue, new CSSInitialValueImpl());
                 }
                 parsedProperty[i] = false;
             }
@@ -1302,7 +1299,7 @@ bool CSSParser::parseBackgroundShorthand(bool important)
                 break;
         }
         
-        found = false;
+        bool found = false;
         for (i = 0; !found && i < numProperties; ++i) {
             if (!parsedProperty[i]) {
                 CSSValueImpl *val1 = 0, *val2 = 0;
@@ -1310,22 +1307,16 @@ bool CSSParser::parseBackgroundShorthand(bool important)
                if (parseBackgroundProperty(properties[i], propId1, propId2, val1, val2)) {
                    parsedProperty[i] = found = true;
                     addBackgroundValue(values[i], val1);
-                    if (properties[i] == CSS_PROP_BACKGROUND_POSITION) {
-                        i++;
-                        addBackgroundValue(values[i], val2);
-                    }
+                    if (properties[i] == CSS_PROP_BACKGROUND_POSITION)
+                        addBackgroundValue(positionYValue, val2);
                }
            }
        }
 
         // if we didn't find at least one match, this is an
         // invalid shorthand and we have to ignore it
-        if (!found) {
-           inParseShortHand = false;
-            for (int k = 0; k < numValues; k++)
-                delete values[k];
-           return false;
-       }
+        if (!found)
+            goto fail;
     }
     
     // Fill in any remaining properties with the initial value.
@@ -1333,7 +1324,7 @@ bool CSSParser::parseBackgroundShorthand(bool important)
         if (!parsedProperty[i]) {
             addBackgroundValue(values[i], new CSSInitialValueImpl());
             if (properties[i] == CSS_PROP_BACKGROUND_POSITION)
-                addBackgroundValue(values[i+1], new CSSInitialValueImpl());
+                addBackgroundValue(positionYValue, new CSSInitialValueImpl());
         }
     }
     
@@ -1341,7 +1332,7 @@ bool CSSParser::parseBackgroundShorthand(bool important)
     for (i = 0; i < numProperties; i++) {
         if (properties[i] == CSS_PROP_BACKGROUND_POSITION) {
             addProperty(CSS_PROP_BACKGROUND_POSITION_X, values[i], important);
-            addProperty(CSS_PROP_BACKGROUND_POSITION_Y, values[i+1], important);
+            addProperty(CSS_PROP_BACKGROUND_POSITION_Y, positionYValue, important);
         }
         else
             addProperty(properties[i], values[i], important);
@@ -1349,6 +1340,13 @@ bool CSSParser::parseBackgroundShorthand(bool important)
     
     inParseShortHand = false;
     return true;
+
+fail:
+    inParseShortHand = false;
+    for (int k = 0; k < numProperties; k++)
+        delete values[k];
+    delete positionYValue;
+    return false;
 }
 
 bool CSSParser::parseShortHand( const int *properties, int numProperties, bool important )
index 05157001609fe7ba15b7a8c8ade3de42cc102327..f59c2712be86dfc01dec9f75402c2a085e4ac1ad 100644 (file)
@@ -215,8 +215,9 @@ void HTMLBodyElementImpl::insertedIntoDocument()
         s.sprintf( "%d", w->marginHeight() );
         setAttribute(ATTR_MARGINHEIGHT, s);
     }
-    
-    w->scheduleRelayout();
+
+    if (w)
+        w->scheduleRelayout();
 }
 
 bool HTMLBodyElementImpl::isURLAttribute(AttributeImpl *attr) const
index bcc7d3991622b22c594239bf18a609fb852891f4..4e21358910172a61acf830977524324c24a1331c 100644 (file)
@@ -56,13 +56,7 @@ using namespace DOM;
 RenderFormElement::RenderFormElement(HTMLGenericFormElementImpl *element)
     : RenderWidget(element)
 {
-    // init RenderObject attributes
-    setInline(true);   // our object is Inline
-
-    m_clickCount = 0;
-    m_state = 0;
-    m_button = 0;
-    m_isDoubleClick = false;
+    setInline(true);
 }
 
 RenderFormElement::~RenderFormElement()
@@ -190,9 +184,6 @@ void RenderFormElement::layout()
 void RenderFormElement::slotClicked()
 {
     RenderArena *arena = ref();
-    QMouseEvent e2( QEvent::MouseButtonRelease, m_mousePos, m_button, m_state);
-
-    element()->dispatchMouseEvent(&e2, EventImpl::CLICK_EVENT, m_clickCount);
 
     // We also send the KHTML_CLICK or KHTML_DBLCLICK event for
     // CLICK. This is not part of the DOM specs, but is used for
@@ -200,9 +191,17 @@ void RenderFormElement::slotClicked()
     // attributes, as there is no way to tell the difference between
     // single & double clicks using DOM (only the click count is
     // stored, which is not necessarily the same)
+
+#if APPLE_CHANGES
+    QMouseEvent event(QEvent::MouseButtonRelease); // gets "current event"
+    element()->dispatchMouseEvent(&event, EventImpl::CLICK_EVENT, event.clickCount());
+    element()->dispatchMouseEvent(&event, event.isDoubleClick() ? EventImpl::KHTML_DBLCLICK_EVENT : EventImpl::KHTML_CLICK_EVENT, event.clickCount());
+#else
+    QMouseEvent e2(QEvent::MouseButtonRelease, m_mousePos, m_button, m_state);
+    element()->dispatchMouseEvent(&e2, EventImpl::CLICK_EVENT, m_clickCount);
     element()->dispatchMouseEvent(&e2, m_isDoubleClick ? EventImpl::KHTML_DBLCLICK_EVENT : EventImpl::KHTML_CLICK_EVENT, m_clickCount);
+#endif
 
-    m_isDoubleClick = false;
     deref(arena);
 }
 
index 571246689a3f7d677bb63432433a4c4ca0a4d818..bba054b67fdbc36c06e4654462d93b7d607fb8f5 100644 (file)
@@ -4,7 +4,7 @@
  * Copyright (C) 1999 Lars Knoll (knoll@kde.org)
  *           (C) 1999 Antti Koivisto (koivisto@kde.org)
  *           (C) 2000 Dirk Mueller (mueller@kde.org)
- * Copyright (C) 2003 Apple Computer, Inc.
+ * Copyright (C) 2004 Apple Computer, Inc.
  *
  * This library is free software; you can redistribute it and/or
  * modify it under the terms of the GNU Library General Public
@@ -111,12 +111,6 @@ protected:
     virtual bool isEditable() const { return false; }
 
     AlignmentFlags textAlignment() const;
-
-    QPoint m_mousePos;
-    int m_state;
-    int m_button;
-    int m_clickCount;
-    bool m_isDoubleClick;
 };
 
 // -------------------------------------------------------------------------
index 9774fc8b0c97cc21c475bd11a3b954e6022fc616..289f6460aaa31e66ee06650ffdb16751c6583125 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 2003 Apple Computer, Inc.  All rights reserved.
+ * Copyright (C) 2004 Apple Computer, Inc.  All rights reserved.
  *
  * Redistribution and use in source and binary forms, with or without
  * modification, are permitted provided that the following conditions
@@ -73,6 +73,7 @@ class QMouseEvent : public QEvent {
 public:
     QMouseEvent(Type, const QPoint &pos, int button, int state);
     QMouseEvent(Type, NSEvent *);
+    explicit QMouseEvent(Type); // uses AppKit's current event
 
     const QPoint &pos() const { return _position; }
     int x() const { return _position.x(); }
@@ -83,9 +84,12 @@ public:
     ButtonState state() const { return static_cast<ButtonState>(_state); }
     ButtonState stateAfter() const { return static_cast<ButtonState>(_stateAfter); }
 
-    int clickCount() { return _clickCount; }
+    int clickCount() const { return _clickCount; }
+    bool isDoubleClick() const { return _clickCount > 0 && _clickCount % 2 == 0; }
 
 private:
+    void fixState();
+
     QPoint _position;
     int _button;
     int _state;
index 4a8f0b11892ee60977e7bff862bab60abd3a2383..a1118b8862c68887cc55c0fb1631c7891286b85b 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 2003 Apple Computer, Inc.  All rights reserved.
+ * Copyright (C) 2004 Apple Computer, Inc.  All rights reserved.
  *
  * Redistribution and use in source and binary forms, with or without
  * modification, are permitted provided that the following conditions
@@ -755,44 +755,52 @@ QEvent::~QEvent()
 // ======== 
 
 QMouseEvent::QMouseEvent(Type type, const QPoint &position, int button, int state)
-    : QEvent(type), _position(position)
+    : QEvent(type), _position(position), _button(button), _state(state), _clickCount(1)
 {
-    _button = button;
-    if (type == MouseMove) {
-        _clickCount = 0;
-        _state = state | button;
-        _stateAfter = state | button;
-    } else {
-        _clickCount = 1;
-        if (type == MouseButtonRelease) {
-            _state = state | button;
-            _stateAfter = state & ~button;
-        } else {
-            _state = state & ~button;
-            _stateAfter = state | button;
-        }
-    }
+    fixState();
 }
 
 QMouseEvent::QMouseEvent(Type type, NSEvent *event)
-    : QEvent(type), _position([event locationInWindow])
+    : QEvent(type)
+    , _position([event locationInWindow])
+    , _button(mouseButtonForEvent(event))
+    , _state(nonMouseButtonsForEvent(event))
+    , _clickCount([event clickCount])
 {
-    int button = mouseButtonForEvent(event);
-    int state = nonMouseButtonsForEvent(event);
-    _button = button;
-    if (type == MouseMove) {
-        _clickCount = 0;
-        _state = state | button;
-        _stateAfter = state | button;
-    } else {
+    fixState();
+}
+
+QMouseEvent::QMouseEvent(Type type)
+    : QEvent(type), _button(0), _state(0), _clickCount(0)
+{
+    NSEvent *event = [NSApp currentEvent];
+    if (event) {
+        _position = QPoint([event locationInWindow]);
+        _button = mouseButtonForEvent(event);
+        _state = nonMouseButtonsForEvent(event);
         _clickCount = [event clickCount];
-        if (type == MouseButtonRelease) {
+    }
+    fixState();
+}
+
+void QMouseEvent::fixState()
+{
+    int button = _button;
+    int state = _state;
+    switch (type()) {
+        case MouseMove:
+            _clickCount = 0;
+            _state = state | button;
+            _stateAfter = state | button;
+            break;
+        case MouseButtonRelease:
             _state = state | button;
             _stateAfter = state & ~button;
-        } else {
+            break;
+        default:
             _state = state & ~button;
             _stateAfter = state | button;
-        }
+            break;
     }
 }
 
index 3a2866651fb35ceca9b6d8dbcb7ecd1869dbd31f..8b0d7820568720aeb06ad71f71ce7a79fe6e18f3 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 2003 Apple Computer, Inc.  All rights reserved.
+ * Copyright (C) 2004 Apple Computer, Inc.  All rights reserved.
  *
  * Redistribution and use in source and binary forms, with or without
  * modification, are permitted provided that the following conditions
@@ -74,15 +74,19 @@ const CFDictionaryKeyCallBacks CFDictionaryFamilyKeyCallBacks = { 0, retainDOMSt
 NSString *KWQFontFamily::getNSFamily() const
 {
     if (!_NSFamily) {
-        // Use an immutable copy of the name, but keep a set of
-        // all family names so we don't end up with too many objects.
-        static CFMutableDictionaryRef families;
-        if (families == NULL)
-            families = CFDictionaryCreateMutable(NULL, 0, &CFDictionaryFamilyKeyCallBacks, &kCFTypeDictionaryValueCallBacks);
-        _NSFamily = (NSString *)CFDictionaryGetValue(families, _family.implementation());
-        if (!_NSFamily) {
-            _NSFamily = [NSString stringWithCharacters:(const unichar *)_family.unicode() length:_family.length()];
-            CFDictionarySetValue(families, _family.implementation(), _NSFamily);
+        if (_family.isEmpty())
+            _NSFamily = @"";
+        else {
+            // Use an immutable copy of the name, but keep a set of
+            // all family names so we don't end up with too many objects.
+            static CFMutableDictionaryRef families;
+            if (families == NULL)
+                families = CFDictionaryCreateMutable(NULL, 0, &CFDictionaryFamilyKeyCallBacks, &kCFTypeDictionaryValueCallBacks);
+            _NSFamily = (NSString *)CFDictionaryGetValue(families, _family.implementation());
+            if (!_NSFamily) {
+                _NSFamily = [NSString stringWithCharacters:(const unichar *)_family.unicode() length:_family.length()];
+                CFDictionarySetValue(families, _family.implementation(), _NSFamily);
+            }
         }
     }
     return _NSFamily;
index 48ad056fbe4c0d03ffe73b4829cbac14b9383a56..8f59d98be68d76f0bd1f94a3c829363a0925f683 100644 (file)
@@ -1,3 +1,39 @@
+2004-12-04  Darin Adler  <darin@apple.com>
+
+        Reviewed by John.
+
+        - fixed <rdar://problem/3846079> assertion failure in WebHTMLView(WebPrivate) removeTrackingRect at boots.com
+        - fixed <rdar://problem/3857737> REGRESSION (165-166): clicking in a text field that's scrolled to the right causes it to scroll all the way left
+        - fixed <rdar://problem/3861952> REGRESSION (165-166): selection is cleared when you start to scroll a frame
+
+        * WebView.subproj/WebHTMLViewInternal.h: Added handlingMouseDown flag.
+        * WebView.subproj/WebHTMLView.m:
+        (-[WebHTMLView _addTrackingRect:owner:userData:assumeInside:useTrackingNum:]): Allow passing in a
+        tracking number of 0, which means no existing tracking number.
+        (-[WebHTMLView _addTrackingRects:owner:userDataList:assumeInsideList:trackingNums:count:]): Ditto.
+        (-[WebHTMLView removeTrackingRect:]): Allow removing a tracking number of 0, which is a no-op.
+        (-[WebHTMLView _removeTrackingRects:count:]): Ditto.
+        (-[WebHTMLView acceptsFirstResponder]): Changed check to use handlingMouseDown flag instead of mouseDownEvent
+        field since that field is set up too early in the mouse down event handling process.
+        (-[WebHTMLView mouseDown:]): Added code to set handlingMouseDown flag.
+
+        - fixed part of <rdar://problem/3829808> Safari crashes when adding a DOM node that was removed from an XMLHTTP request result
+
+        * WebCoreSupport.subproj/WebBridge.m:
+        (-[WebBridge syncLoadResourceWithURL:customHeaders:postData:finalURL:responseHeaders:statusCode:]):
+        Changed code around so that it won't try to create a WebResource when the load fails.
+
+        - moved next/previous links into private structure with the rest of WebFrame fields
+          (We have a rule against putting new fields into obejcts that are part of our public API.)
+
+        * WebView.subproj/WebFrame.h: Remove _nextSibling and _previousSibling.
+        * WebView.subproj/WebFramePrivate.h: Added nextSibling and previousSibling fields to private class.
+        * WebView.subproj/WebFrame.m: Got rid of some tabs in this file.
+        (-[WebFrame _addChild:]): Changed code to use fields inside _private.
+        (-[WebFrame _removeChild:]): Ditto.
+        (-[WebFrame _nextFrameWithWrap:]): Ditto.
+        (-[WebFrame _previousFrameWithWrap:]): Ditto.
+
 2004-12-04  Chris Blumenberg  <cblu@apple.com>
 
        New fixes for:
index 4c80482ad29dfa9e0f324e9fc81826fa13d590aa..d193a28c2ee2c1700681536a2e33d5234331673a 100644 (file)
@@ -490,22 +490,23 @@ NSString *WebPluginContainerKey =   @"WebPluginContainer";
     if (error == nil) {
         *finalURL = [response URL];
         if ([response isKindOfClass:[NSHTTPURLResponse class]]) {
-                NSHTTPURLResponse *httpResponse = (NSHTTPURLResponse *)response; 
-                *responseHeaderDict = [httpResponse allHeaderFields];
-                *statusCode = [httpResponse statusCode];
+            NSHTTPURLResponse *httpResponse = (NSHTTPURLResponse *)response; 
+            *responseHeaderDict = [httpResponse allHeaderFields];
+            *statusCode = [httpResponse statusCode];
         } else {
             *responseHeaderDict = [NSDictionary dictionary];
             *statusCode = 200;
         }
+
+        // notify the delegates
+        // FIXME: Bridge method name "loaded from cache" doesn't make any sense here.
+        [self objectLoadedFromCacheWithURL:URL response:response data:result];
     } else {
         *finalURL = URL;
         *responseHeaderDict = [NSDictionary dictionary];
         *statusCode = 404;
     }
 
-    // notify the delegates
-    [self objectLoadedFromCacheWithURL:URL response:response data:result];
-
     return result;
 }
 
index cf91b2206eb25eead3ccd058702fc2cddc8e4faf..af04150b49de6e0a8217c1629d8fd089d62703e3 100644 (file)
@@ -25,8 +25,6 @@
 {
 @private
     WebFramePrivate *_private;
-    WebFrame *_nextSibling;
-    WebFrame *_previousSibling;
 }
 
 /*!
index 19f9794e4bffac4d361a82b0e5f0cc7978ded03b..4a469ec38055a47aaaa041ee06a34bb8246b02f9 100644 (file)
@@ -116,18 +116,18 @@ NSString *WebPageCacheDocumentViewKey = @"WebPageCacheDocumentViewKey";
 {
     unsigned count = [self count];
     if (0 == count)
-       return;
+        return;
 
     if (count > 128) {
-       [[self copy] makeObjectsPerformSelector:aSelector];
-       return;
+        [[self copy] makeObjectsPerformSelector:aSelector];
+        return;
     }
  
     id batch[128];
     [self getObjects:batch range:NSMakeRange(0, count)];
     unsigned i;
     for (i = 0; i < count; i++) {
-       objc_msgSend(batch[i], aSelector);
+        objc_msgSend(batch[i], aSelector);
     }
 }
 
@@ -942,26 +942,26 @@ static CFAbsoluteTime _timeOfLastCompletedLoad;
             && ![[self dataSource] isLoading]
             && ![[self dataSource] _isStopping])
         {
-           if ([[[self dataSource] representation] isKindOfClass: [WebHTMLRepresentation class]]) {
-               if (![item pageCache]){
-
-                   // Add the items to this page's cache.
-                   if ([self _createPageCacheForItem:item]) {
-                       LOG(PageCache, "Saving page to back/forward cache, %@\n", [[self dataSource] _URL]);
-
-                       // See if any page caches need to be purged after the addition of this
-                       // new page cache.
-                       [self _purgePageCache];
-                   }
-                   else {
-                       LOG(PageCache, "NOT saving page to back/forward cache, unable to create items, %@\n", [[self dataSource] _URL]);
-                   }
-               }
-           }
-           else {
-               // Put the document into a null state, so it can be restored correctly.
-               [_private->bridge clear];
-           }
+            if ([[[self dataSource] representation] isKindOfClass: [WebHTMLRepresentation class]]) {
+                if (![item pageCache]){
+
+                    // Add the items to this page's cache.
+                    if ([self _createPageCacheForItem:item]) {
+                        LOG(PageCache, "Saving page to back/forward cache, %@\n", [[self dataSource] _URL]);
+
+                        // See if any page caches need to be purged after the addition of this
+                        // new page cache.
+                        [self _purgePageCache];
+                    }
+                    else {
+                        LOG(PageCache, "NOT saving page to back/forward cache, unable to create items, %@\n", [[self dataSource] _URL]);
+                    }
+                }
+            }
+            else {
+                // Put the document into a null state, so it can be restored correctly.
+                [_private->bridge clear];
+            }
         }
         else {
             LOG(PageCache, "NOT saving page to back/forward cache, %@\n", [[self dataSource] _URL]);
@@ -2091,35 +2091,35 @@ static CFAbsoluteTime _timeOfLastCompletedLoad;
     if (_private->children == nil)
         _private->children = [[NSMutableArray alloc] init];
     [_private->children addObject:child];
-       
+
     child->_private->parent = self;
     [[child _bridge] setParent:_private->bridge];
     [[child dataSource] _setOverrideEncoding:[[self dataSource] _overrideEncoding]];  
-        
     unsigned currentIndex = [_private->children count] - 1;
     // we keep track of sibling pointers to avoid the overhead of a lookup in the children array
     
     if (currentIndex > 0) {
         WebFrame *previousFrame = [[self childFrames] objectAtIndex: currentIndex - 1];
-        previousFrame->_nextSibling = child;
-        child->_previousSibling = previousFrame;
-        ASSERT(child->_nextSibling == nil);
+        previousFrame->_private->nextSibling = child;
+        child->_private->previousSibling = previousFrame;
+        ASSERT(child->_private->nextSibling == nil);
     }
     
 }
 
 - (void)_removeChild:(WebFrame *)child
 {
-       // move corresponding previous and next WebFrame sibling pointers to their new positions
-       // when we remove a child we may have to reattach the previous frame's next frame and visa versa
-       if (child->_previousSibling) {
-            child->_previousSibling->_nextSibling = child->_nextSibling;
-       }
-       
-       if (child->_nextSibling) { 
-            child->_nextSibling->_previousSibling = child->_previousSibling; 
-       }
-       
+    // move corresponding previous and next WebFrame sibling pointers to their new positions
+    // when we remove a child we may have to reattach the previous frame's next frame and visa versa
+    if (child->_private->previousSibling) {
+        child->_private->previousSibling->_private->nextSibling = child->_private->nextSibling;
+    }
+    
+    if (child->_private->nextSibling) { 
+        child->_private->nextSibling->_private->previousSibling = child->_private->previousSibling; 
+    }
+
     [_private->children removeObject:child];
     child->_private->parent = nil;
 }
@@ -2362,18 +2362,6 @@ static CFAbsoluteTime _timeOfLastCompletedLoad;
     [self _checkNewWindowPolicyForRequest:request action:(NSDictionary *)action frameName:frameName formState:nil andCall:self withSelector:@selector(_continueLoadRequestAfterNewWindowPolicy:frameName:formState:)];
 }
 
-// Returns the next frame in our parent's children array
-- (WebFrame *)_nextSibling
-{
-    return _nextSibling;
-}
-
-// Returns the previous frame in our parent's children array, or nil
-- (WebFrame *)_previousSibling
-{
-    return _previousSibling;
-}
-
 // Returns the last child of us and any children, or nil
 - (WebFrame *)_lastChild
 {
@@ -2393,7 +2381,7 @@ static CFAbsoluteTime _timeOfLastCompletedLoad;
     } else if (_private->parent) {
         WebFrame *frame;
         for (frame = self; frame->_private->parent; frame = frame->_private->parent) {
-            WebFrame *nextSibling = [frame _nextSibling];
+            WebFrame *nextSibling = frame->_private->nextSibling;
             if (nextSibling) {
                 return nextSibling;
             }
@@ -2407,7 +2395,7 @@ static CFAbsoluteTime _timeOfLastCompletedLoad;
 // Return previous frame to be traversed, exact reverse order of _nextFrame
 - (WebFrame *)_previousFrameWithWrap:(BOOL)wrapFlag
 {
-    WebFrame *prevSibling = [self _previousSibling];
+    WebFrame *prevSibling = _private->previousSibling;
     if (prevSibling) {
         WebFrame *prevSiblingLastChild = [prevSibling _lastChild];
         return prevSiblingLastChild ? prevSiblingLastChild : prevSibling;
index 629812d46f58eb9cbc51c859e6ae374268b81d4e..f34f58907e60068675e5097e70bb310bd9f0fddf 100644 (file)
@@ -59,6 +59,9 @@ extern NSString *WebPageCacheDocumentViewKey;
 @interface WebFramePrivate : NSObject
 {
 @public
+    WebFrame *nextSibling;
+    WebFrame *previousSibling;
+
     NSString *name;
     WebFrameView *webFrameView;
     WebDataSource *dataSource;
index fb62c1d86547bee9d2dd6e2ad19142a02c3ab27e..fc7ed30cc74e1a3a2fb7183c67a53bfd26bf51b7 100644 (file)
@@ -676,24 +676,27 @@ static WebHTMLView *lastHitView = nil;
 
 - (NSTrackingRectTag)_addTrackingRect:(NSRect)rect owner:(id)owner userData:(void *)data assumeInside:(BOOL)assumeInside useTrackingNum:(int)tag
 {
-    ASSERT(tag == TRACKING_RECT_TAG);
+    ASSERT(tag == 0 || tag == TRACKING_RECT_TAG);
     ASSERT(_private->trackingRectOwner == nil);
     _private->trackingRectOwner = owner;
     _private->trackingRectUserData = data;
-    return tag;
+    return TRACKING_RECT_TAG;
 }
 
 - (void)_addTrackingRects:(NSRect *)rects owner:(id)owner userDataList:(void **)userDataList assumeInsideList:(BOOL *)assumeInsideList trackingNums:(NSTrackingRectTag *)trackingNums count:(int)count
 {
     ASSERT(count == 1);
-    ASSERT(trackingNums[0] == TRACKING_RECT_TAG);
+    ASSERT(trackingNums[0] == 0 || trackingNums[0] == TRACKING_RECT_TAG);
     ASSERT(_private->trackingRectOwner == nil);
     _private->trackingRectOwner = owner;
     _private->trackingRectUserData = userDataList[0];
+    trackingNums[0] = TRACKING_RECT_TAG;
 }
 
 - (void)removeTrackingRect:(NSTrackingRectTag)tag
 {
+    if (tag == 0)
+        return;
     ASSERT(tag == TRACKING_RECT_TAG);
     if (_private != nil) {
         _private->trackingRectOwner = nil;
@@ -702,11 +705,16 @@ static WebHTMLView *lastHitView = nil;
 
 - (void)_removeTrackingRects:(NSTrackingRectTag *)tags count:(int)count
 {
-    ASSERT(count == 1);
-    ASSERT(tags[0] == TRACKING_RECT_TAG);
-    if (count == 0)
-        return;
-    [self removeTrackingRect:TRACKING_RECT_TAG];
+    int i;
+    for (i = 0; i < count; ++i) {
+        int tag = tags[i];
+        if (tag == 0)
+            continue;
+        ASSERT(tag == TRACKING_RECT_TAG);
+        if (_private != nil) {
+            _private->trackingRectOwner = nil;
+        }
+    }
 }
 
 - (void)_sendToolTipMouseExited
@@ -1579,8 +1587,9 @@ static WebHTMLView *lastHitView = nil;
     // Do accept first responder at any other time, for example from keyboard events,
     // or from calls back from WebCore once we begin mouse-down event handling.
     NSEvent *event = [NSApp currentEvent];
-    if ([event type] == NSLeftMouseDown && event != _private->mouseDownEvent && 
-        NSPointInRect([event locationInWindow], [self convertRect:[self visibleRect] toView:nil])) {
+    if ([event type] == NSLeftMouseDown
+            && !_private->handlingMouseDownEvent
+            && NSPointInRect([event locationInWindow], [self convertRect:[self visibleRect] toView:nil])) {
         return NO;
     }
     return YES;
@@ -2187,7 +2196,9 @@ static WebHTMLView *lastHitView = nil;
 }
 
 - (void)mouseDown:(NSEvent *)event
-{   
+{
+    _private->handlingMouseDownEvent = YES;
+
     // Record the mouse down position so we can determine drag hysteresis.
     [self _setMouseDownEvent:event];
 
@@ -2214,6 +2225,8 @@ static WebHTMLView *lastHitView = nil;
 
     [_private->firstResponderAtMouseDownTime release];
     _private->firstResponderAtMouseDownTime = nil;
+
+    _private->handlingMouseDownEvent = NO;
 }
 
 - (void)dragImage:(NSImage *)dragImage
index f999d69d31622ffef0e655e016d065674ea83add..0186eb88e6c2f9598a8b9a07d1be91ed44ab3de0 100644 (file)
@@ -23,6 +23,7 @@
     BOOL subviewsSetAside;
 
     NSEvent *mouseDownEvent; // Kept after handling the event.
+    BOOL handlingMouseDownEvent;
     NSEvent *keyDownEvent; // Kept only during handling of the event.
 
     NSURL *draggingImageURL;