Changing XUL menus to use a :-moz-menuactive pseudoclass rather than a menuactive attribute for styling the active item. This will allow XBL select widgets to not modify the HTML DOM. Bug 128947, r=dbaron, sr=hyatt, a=asa.

git-svn-id: svn://10.0.0.236/trunk@116424 18797224-902f-48f8-a5cc-f745e15eee43
This commit is contained in:
bryner%netscape.com
2002-03-12 21:49:23 +00:00
parent 83b7c6e601
commit 97fd40e754
25 changed files with 321 additions and 60 deletions

View File

@@ -94,6 +94,9 @@
#include "nsQuickSort.h"
#ifdef MOZ_XUL
#include "nsIXULContent.h"
#include "nsIDOMXULPopupElement.h"
#include "nsIDOMXULMenuBarElement.h"
#include "nsXULAtoms.h"
#endif
#include "nsContentUtils.h"
@@ -3234,6 +3237,7 @@ RuleProcessorData::RuleProcessorData(nsIPresContext* aPresContext,
mIsHTMLLink = PR_FALSE;
mIsSimpleXLink = PR_FALSE;
mIsChecked = PR_FALSE;
mIsMenuActive = PR_FALSE;
mLinkState = eLinkState_Unknown;
mEventState = NS_EVENT_STATE_UNSPECIFIED;
mNameSpaceID = kNameSpaceID_Unknown;
@@ -3302,14 +3306,39 @@ RuleProcessorData::RuleProcessorData(nsIPresContext* aPresContext,
mIsSimpleXLink = PR_TRUE;
}
// The :checked pseudoclass applies to input and option elements
if (mIsHTMLContent) {
PRBool isChecked = PR_FALSE;
if (mContentTag == nsHTMLAtoms::option) {
nsCOMPtr<nsIDOMHTMLOptionElement> optEl = do_QueryInterface(mContent);
optEl->GetSelected(&isChecked);
}
mIsChecked = isChecked;
}
// The :-moz-menuactive pseudoclass applies to HTML option elements,
// XUL menuitem elements, and XUL menu elements.
if ((mIsHTMLContent && mContentTag == nsHTMLAtoms::option) ||
(mContent->IsContentOfType(nsIContent::eXUL) &&
(mContentTag == nsXULAtoms::menuitem || mContentTag == nsXULAtoms::menu))) {
nsCOMPtr<nsIDOMElement> currentItem;
nsCOMPtr<nsIDOMXULPopupElement> popupEl = do_QueryInterface(mParentContent);
if (popupEl)
popupEl->GetActiveItem(getter_AddRefs(currentItem));
else {
nsCOMPtr<nsIDOMXULMenuBarElement> menubar = do_QueryInterface(mParentContent);
if (menubar)
menubar->GetActiveMenu(getter_AddRefs(currentItem));
}
if (currentItem) {
nsCOMPtr<nsIDOMElement> element = do_QueryInterface(mContent);
if (currentItem == element)
mIsMenuActive = PR_TRUE;
}
}
}
}
@@ -3609,6 +3638,12 @@ static PRBool SelectorMatches(RuleProcessorData &data,
if (aTestState)
result = data.mIsChecked ? localTrue : localFalse;
}
else if (nsCSSAtoms::menuActivePseudo == pseudoClass->mAtom) {
// This pseudoclass will match on at most one child of
// a menupopup.
if (aTestState)
result = data.mIsMenuActive ? localTrue : localFalse;
}
else {
result = localFalse; // unknown pseudo class
}
@@ -4242,6 +4277,7 @@ PRBool IsStateSelector(nsCSSSelector& aSelector)
(pseudoClass->mAtom == nsCSSAtoms::focusPseudo) ||
(pseudoClass->mAtom == nsCSSAtoms::hoverPseudo) ||
(pseudoClass->mAtom == nsCSSAtoms::linkPseudo) ||
(pseudoClass->mAtom == nsCSSAtoms::menuActivePseudo) ||
(pseudoClass->mAtom == nsCSSAtoms::selectionPseudo) ||
(pseudoClass->mAtom == nsCSSAtoms::visitedPseudo)) {
return PR_TRUE;