Attachment #57387: fix for simple test case for bug #101982

View | Details | Raw Unified | Return to bug 101982
Collapse All | Expand All

(-)nsXULDocument.cpp (-39 / +44 lines)
Line     Link Here 
 Lines 1728-1737    Link Here 
1728
    return PR_TRUE;
1728
    return PR_TRUE;
1729
}
1729
}
1730
1730
1731
static void
1731
void
1732
SynchronizeBroadcastListener(nsIDOMElement* aBroadcaster,
1732
nsXULDocument::SynchronizeBroadcastListener(nsIDOMElement   *aBroadcaster,
1733
                             nsIDOMElement* aListener,
1733
                                            nsIDOMElement   *aListener,
1734
                             const nsAString& aAttr)
1734
                                            const nsAString &aAttr)
1735
{
1735
{
1736
    nsCOMPtr<nsIContent> broadcaster = do_QueryInterface(aBroadcaster);
1736
    nsCOMPtr<nsIContent> broadcaster = do_QueryInterface(aBroadcaster);
1737
    nsCOMPtr<nsIContent> listener = do_QueryInterface(aListener);
1737
    nsCOMPtr<nsIContent> listener = do_QueryInterface(aListener);
 Lines 1754-1759    Link Here 
1754
            nsAutoString value;
1754
            nsAutoString value;
1755
            broadcaster->GetAttr(nameSpaceID, name, value);
1755
            broadcaster->GetAttr(nameSpaceID, name, value);
1756
            listener->SetAttr(nameSpaceID, name, value, PR_TRUE);
1756
            listener->SetAttr(nameSpaceID, name, value, PR_TRUE);
1757
1758
            ExecuteOnBroadcastHandlerFor(broadcaster, aListener, name);
1757
        }
1759
        }
1758
    }
1760
    }
1759
    else {
1761
    else {
 Lines 1770-1775    Link Here 
1770
        else {
1772
        else {
1771
            listener->UnsetAttr(kNameSpaceID_None, name, PR_TRUE);
1773
            listener->UnsetAttr(kNameSpaceID_None, name, PR_TRUE);
1772
        }
1774
        }
1775
1776
        ExecuteOnBroadcastHandlerFor(broadcaster, aListener, name);
1773
    }
1777
    }
1774
}
1778
}
1775
1779
 Lines 1918-1923    Link Here 
1918
    PRInt32 count;
1922
    PRInt32 count;
1919
    listener->ChildCount(count);
1923
    listener->ChildCount(count);
1920
    for (PRInt32 i = 0; i < count; ++i) {
1924
    for (PRInt32 i = 0; i < count; ++i) {
1925
        // Look for an <observes> element beneath the listener. This
1926
        // ought to have an |element| attribute that refers to
1927
        // aBroadcaster, and an |attribute| element that tells us what
1928
        // attriubtes we're listening for.
1921
        nsCOMPtr<nsIContent> child;
1929
        nsCOMPtr<nsIContent> child;
1922
        listener->ChildAt(i, *getter_AddRefs(child));
1930
        listener->ChildAt(i, *getter_AddRefs(child));
1923
1931
 Lines 1928-1934    Link Here 
1928
1936
1929
        // Is this the element that was listening to us?
1937
        // Is this the element that was listening to us?
1930
        nsAutoString listeningToID;
1938
        nsAutoString listeningToID;
1931
        aBroadcaster->GetAttr(kNameSpaceID_None, nsXULAtoms::element, listeningToID);
1939
        child->GetAttr(kNameSpaceID_None, nsXULAtoms::element, listeningToID);
1932
1940
1933
        nsAutoString broadcasterID;
1941
        nsAutoString broadcasterID;
1934
        aBroadcaster->GetAttr(kNameSpaceID_None, nsXULAtoms::id, broadcasterID);
1942
        aBroadcaster->GetAttr(kNameSpaceID_None, nsXULAtoms::id, broadcasterID);
 Lines 1939-1953    Link Here 
1939
        // We are observing the broadcaster, but is this the right
1947
        // We are observing the broadcaster, but is this the right
1940
        // attribute?
1948
        // attribute?
1941
        nsAutoString listeningToAttribute;
1949
        nsAutoString listeningToAttribute;
1942
        listener->GetAttr(kNameSpaceID_None, nsXULAtoms::attribute, listeningToAttribute);
1950
        child->GetAttr(kNameSpaceID_None, nsXULAtoms::attribute,
1951
                       listeningToAttribute);
1943
1952
1944
        if (!listeningToAttribute.Equals(attrName) &&
1953
        if (listeningToAttribute != attrName &&
1945
            !listeningToAttribute.Equals(NS_LITERAL_STRING("*"))) {
1954
            listeningToAttribute != NS_LITERAL_STRING("*")) {
1946
            continue;
1955
            continue;
1947
        }
1956
        }
1948
1957
1949
        // This is the right observes node. Execute the onchange
1958
        // This is the right <observes> element. Execute the
1950
        // event handler
1959
        // |onbroadcast| event handler
1951
        nsEvent event;
1960
        nsEvent event;
1952
        event.eventStructType = NS_EVENT;
1961
        event.eventStructType = NS_EVENT;
1953
        event.message = NS_XUL_BROADCAST;
1962
        event.message = NS_XUL_BROADCAST;
 Lines 1961-1967    Link Here 
1961
1970
1962
            // Handle the DOM event
1971
            // Handle the DOM event
1963
            nsEventStatus status = nsEventStatus_eIgnore;
1972
            nsEventStatus status = nsEventStatus_eIgnore;
1964
            listener->HandleDOMEvent(aPresContext, &event, nsnull, NS_EVENT_FLAG_INIT, &status);
1973
            child->HandleDOMEvent(aPresContext, &event, nsnull, NS_EVENT_FLAG_INIT, &status);
1965
        }
1974
        }
1966
    }
1975
    }
1967
1976
 Lines 1976-1985    Link Here 
1976
{
1985
{
1977
    nsresult rv;
1986
    nsresult rv;
1978
1987
1979
    PRInt32 nameSpaceID;
1980
    rv = aElement->GetNameSpaceID(nameSpaceID);
1981
    if (NS_FAILED(rv)) return rv;
1982
1983
    // First see if we need to update our element map.
1988
    // First see if we need to update our element map.
1984
    if ((aAttribute == nsXULAtoms::id) || (aAttribute == nsXULAtoms::ref)) {
1989
    if ((aAttribute == nsXULAtoms::id) || (aAttribute == nsXULAtoms::ref)) {
1985
1990
 Lines 1992-2021    Link Here 
1992
        if (NS_FAILED(rv)) return rv;
1997
        if (NS_FAILED(rv)) return rv;
1993
    }
1998
    }
1994
1999
1995
    // Now notify external observers
1996
    for (PRInt32 i = mObservers.Count() - 1; i >= 0; --i) {
1997
        nsIDocumentObserver*  observer = (nsIDocumentObserver*)mObservers[i];
1998
        observer->AttributeChanged(this, aElement, aNameSpaceID, aAttribute, aModType, aHint);
1999
    }
2000
2001
    // See if there is anything we need to persist in the localstore.
2002
    //
2003
    // XXX Namespace handling broken :-(
2004
    nsAutoString persist;
2005
    rv = aElement->GetAttr(kNameSpaceID_None, nsXULAtoms::persist, persist);
2006
    if (NS_FAILED(rv)) return rv;
2007
2008
    if (rv == NS_CONTENT_ATTR_HAS_VALUE) {
2009
        nsAutoString attr;
2010
        rv = aAttribute->ToString(attr);
2011
        if (NS_FAILED(rv)) return rv;
2012
2013
        if (persist.Find(attr) >= 0) {
2014
            rv = Persist(aElement, kNameSpaceID_None, aAttribute);
2015
            if (NS_FAILED(rv)) return rv;
2016
        }
2017
    }
2018
2019
    // Synchronize broadcast listeners
2000
    // Synchronize broadcast listeners
2020
    if (mBroadcasterMap && CanBroadcast(aNameSpaceID, aAttribute)) {
2001
    if (mBroadcasterMap && CanBroadcast(aNameSpaceID, aAttribute)) {
2021
        nsCOMPtr<nsIDOMElement> domele = do_QueryInterface(aElement);
2002
        nsCOMPtr<nsIDOMElement> domele = do_QueryInterface(aElement);
 Lines 2053-2058    Link Here 
2053
                                                 aAttribute);
2034
                                                 aAttribute);
2054
                }
2035
                }
2055
            }
2036
            }
2037
        }
2038
    }
2039
2040
    // Now notify external observers
2041
    for (PRInt32 i = mObservers.Count() - 1; i >= 0; --i) {
2042
        nsIDocumentObserver*  observer = (nsIDocumentObserver*)mObservers[i];
2043
        observer->AttributeChanged(this, aElement, aNameSpaceID, aAttribute, aModType, aHint);
2044
    }
2045
2046
    // See if there is anything we need to persist in the localstore.
2047
    //
2048
    // XXX Namespace handling broken :-(
2049
    nsAutoString persist;
2050
    rv = aElement->GetAttr(kNameSpaceID_None, nsXULAtoms::persist, persist);
2051
    if (NS_FAILED(rv)) return rv;
2052
2053
    if (rv == NS_CONTENT_ATTR_HAS_VALUE) {
2054
        nsAutoString attr;
2055
        rv = aAttribute->ToString(attr);
2056
        if (NS_FAILED(rv)) return rv;
2057
2058
        if (persist.Find(attr) >= 0) {
2059
            rv = Persist(aElement, kNameSpaceID_None, aAttribute);
2060
            if (NS_FAILED(rv)) return rv;
2056
        }
2061
        }
2057
    }
2062
    }
2058
2063
(-)nsXULDocument.h (+5 lines)
Line     Link Here 
 Lines 788-793    Link Here 
788
                           PRBool* aNeedsHookup,
788
                           PRBool* aNeedsHookup,
789
                           PRBool* aDidResolve);
789
                           PRBool* aDidResolve);
790
790
791
    void
792
    SynchronizeBroadcastListener(nsIDOMElement   *aBroadcaster,
793
                                 nsIDOMElement   *aListener,
794
                                 const nsAString &aAttr);
795
791
    static
796
    static
792
    nsresult
797
    nsresult
793
    InsertElement(nsIContent* aParent, nsIContent* aChild);
798
    InsertElement(nsIContent* aParent, nsIContent* aChild);

Return to bug 101982