|
|
|
|
| 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); |
|
|
| 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 { |
|
|
| 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 |
|
|
|
| 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 |
|
|
|
| 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); |
|
|
| 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; |
|
|
| 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 |
|
|
|
| 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 |
|
|
|
| 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); |
|
|
| 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 |
|