зеркало из https://github.com/mozilla/pjs.git
Fixes a visibility logic bug. Also extends support for the collapsed attribute to all menu node types (menu, menu item, and separator). Apparently there was a previous assumption that collapsed would only be used on the menu type, but that is nonsense. In XUL collapsed=true is the same as visibility:collapsed, and according to CSS2 visibility:collapsed outside the context of a table is the same as hidden:true. Cleans up the code for hidden and collapsed attribute checks. b=373730 r=mano sr=pav
This commit is contained in:
Родитель
a063d1457c
Коммит
ec6e299f88
|
@ -58,6 +58,8 @@ class nsIDOMNode;
|
|||
|
||||
extern "C" MenuRef _NSGetCarbonMenu(NSMenu* aMenu);
|
||||
|
||||
PRBool NodeIsHiddenOrCollapsed(nsIContent* inContent);
|
||||
|
||||
namespace MenuHelpersX
|
||||
{
|
||||
nsEventStatus DispatchCommandTo(nsIWeakReference* aDocShellWeakRef,
|
||||
|
|
|
@ -87,6 +87,15 @@ enum {
|
|||
};
|
||||
|
||||
|
||||
PRBool NodeIsHiddenOrCollapsed(nsIContent* inContent)
|
||||
{
|
||||
return (inContent->AttrValueIs(kNameSpaceID_None, nsWidgetAtoms::hidden,
|
||||
nsWidgetAtoms::_true, eCaseMatters) ||
|
||||
inContent->AttrValueIs(kNameSpaceID_None, nsWidgetAtoms::collapsed,
|
||||
nsWidgetAtoms::_true, eCaseMatters));
|
||||
}
|
||||
|
||||
|
||||
nsMenuBarX::nsMenuBarX()
|
||||
: mParent(nsnull), mIsMenuBarAdded(PR_FALSE), mCurrentCommandID(eCommand_ID_Last), mDocument(nsnull)
|
||||
{
|
||||
|
@ -502,9 +511,8 @@ NS_IMETHODIMP nsMenuBarX::AddMenu(nsIMenu * aMenu)
|
|||
|
||||
nsCOMPtr<nsIContent> menu;
|
||||
aMenu->GetMenuContent(getter_AddRefs(menu));
|
||||
if (!menu->AttrValueIs(kNameSpaceID_None, nsWidgetAtoms::hidden,
|
||||
nsWidgetAtoms::_true, eCaseMatters) &&
|
||||
menu->GetChildCount() > 0) {
|
||||
if (menu->GetChildCount() > 0 &&
|
||||
!NodeIsHiddenOrCollapsed(menu)) {
|
||||
NSMenuItem* newMenuItem = [[[NSMenuItem alloc] initWithTitle:@"SomeMenuItem" action:NULL keyEquivalent:@""] autorelease];
|
||||
[mRootMenu addItem:newMenuItem];
|
||||
[newMenuItem setSubmenu:menuRef];
|
||||
|
|
|
@ -135,9 +135,9 @@ protected:
|
|||
PRBool OnDestroyed();
|
||||
PRBool OnCreated();
|
||||
|
||||
void LoadMenuItem(nsIMenu* pParentMenu, nsIContent* menuitemContent);
|
||||
void LoadSubMenu(nsIMenu * pParentMenu, nsIContent* menuitemContent);
|
||||
void LoadSeparator(nsIContent* menuitemContent);
|
||||
void LoadMenuItem(nsIMenu* pParentMenu, nsIContent* inMenuItemContent);
|
||||
void LoadSubMenu(nsIMenu * pParentMenu, nsIContent* inMenuContent);
|
||||
void LoadSeparator(nsIContent* inSeparatorContent);
|
||||
|
||||
NSMenu* CreateMenuWithGeckoString(nsString& menuTitle);
|
||||
|
||||
|
|
|
@ -153,10 +153,7 @@ nsMenuX::Create(nsISupports * aParent, const nsAString &aLabel, const nsAString
|
|||
// SetLabel will create the native menu if it has not been created yet
|
||||
SetLabel(aLabel);
|
||||
|
||||
if (mMenuContent->AttrValueIs(kNameSpaceID_None, nsWidgetAtoms::hidden,
|
||||
nsWidgetAtoms::_true, eCaseMatters) ||
|
||||
mMenuContent->AttrValueIs(kNameSpaceID_None, nsWidgetAtoms::collapsed,
|
||||
nsWidgetAtoms::_true, eCaseMatters))
|
||||
if (NodeIsHiddenOrCollapsed(mMenuContent))
|
||||
mVisible = PR_FALSE;
|
||||
|
||||
if (menubar && mMenuContent->GetChildCount() == 0)
|
||||
|
@ -614,9 +611,7 @@ void nsMenuX::LoadMenuItem(nsIMenu* inParentMenu, nsIContent* inMenuItemContent)
|
|||
if (!inMenuItemContent)
|
||||
return;
|
||||
|
||||
// if menu should be hidden, bail
|
||||
if (inMenuItemContent->AttrValueIs(kNameSpaceID_None, nsWidgetAtoms::hidden,
|
||||
nsWidgetAtoms::_true, eCaseMatters))
|
||||
if (NodeIsHiddenOrCollapsed(inMenuItemContent))
|
||||
return;
|
||||
|
||||
// create nsMenuItem
|
||||
|
@ -687,15 +682,13 @@ void nsMenuX::LoadMenuItem(nsIMenu* inParentMenu, nsIContent* inMenuItemContent)
|
|||
}
|
||||
|
||||
|
||||
void nsMenuX::LoadSubMenu(nsIMenu * pParentMenu, nsIContent* inMenuItemContent)
|
||||
void nsMenuX::LoadSubMenu(nsIMenu * pParentMenu, nsIContent* inMenuContent)
|
||||
{
|
||||
// if menu should be hidden, bail
|
||||
if (inMenuItemContent->AttrValueIs(kNameSpaceID_None, nsWidgetAtoms::hidden,
|
||||
nsWidgetAtoms::_true, eCaseMatters))
|
||||
if (NodeIsHiddenOrCollapsed(inMenuContent))
|
||||
return;
|
||||
|
||||
nsAutoString menuName;
|
||||
inMenuItemContent->GetAttr(kNameSpaceID_None, nsWidgetAtoms::label, menuName);
|
||||
inMenuContent->GetAttr(kNameSpaceID_None, nsWidgetAtoms::label, menuName);
|
||||
//printf("Creating Menu [%s] \n", NS_LossyConvertUTF16toASCII(menuName).get());
|
||||
|
||||
// Create nsMenu
|
||||
|
@ -706,11 +699,11 @@ void nsMenuX::LoadSubMenu(nsIMenu * pParentMenu, nsIContent* inMenuItemContent)
|
|||
if (!docShell)
|
||||
return;
|
||||
nsCOMPtr<nsISupports> supports(do_QueryInterface(pParentMenu));
|
||||
pnsMenu->Create(supports, menuName, EmptyString(), mManager, docShell, inMenuItemContent);
|
||||
pnsMenu->Create(supports, menuName, EmptyString(), mManager, docShell, inMenuContent);
|
||||
|
||||
// set if it's enabled or disabled
|
||||
if (inMenuItemContent->AttrValueIs(kNameSpaceID_None, nsWidgetAtoms::disabled,
|
||||
nsWidgetAtoms::_true, eCaseMatters))
|
||||
if (inMenuContent->AttrValueIs(kNameSpaceID_None, nsWidgetAtoms::disabled,
|
||||
nsWidgetAtoms::_true, eCaseMatters))
|
||||
pnsMenu->SetEnabled(PR_FALSE);
|
||||
else
|
||||
pnsMenu->SetEnabled(PR_TRUE);
|
||||
|
@ -722,11 +715,9 @@ void nsMenuX::LoadSubMenu(nsIMenu * pParentMenu, nsIContent* inMenuItemContent)
|
|||
}
|
||||
|
||||
|
||||
void nsMenuX::LoadSeparator(nsIContent* inMenuItemContent)
|
||||
void nsMenuX::LoadSeparator(nsIContent* inSeparatorContent)
|
||||
{
|
||||
// if item should be hidden, bail
|
||||
if (inMenuItemContent->AttrValueIs(kNameSpaceID_None, nsWidgetAtoms::hidden,
|
||||
nsWidgetAtoms::_true, eCaseMatters))
|
||||
if (NodeIsHiddenOrCollapsed(inSeparatorContent))
|
||||
return;
|
||||
|
||||
AddSeparator();
|
||||
|
@ -968,30 +959,22 @@ nsresult nsMenuX::CountVisibleBefore(PRUint32* outVisibleBefore)
|
|||
for (PRUint32 i = 0; i < numMenus; i++) {
|
||||
nsCOMPtr<nsIMenu> currMenu;
|
||||
menubarParent->GetMenuAt(i, *getter_AddRefs(currMenu));
|
||||
|
||||
// we found ourselves, break out
|
||||
if (currMenu == NS_STATIC_CAST(nsIMenu*, this)) {
|
||||
// we found ourselves, break out
|
||||
gotThisMenu = PR_TRUE;
|
||||
break;
|
||||
}
|
||||
|
||||
// check the current menu to see if it is visible (not hidden, not collapsed). If
|
||||
// it is, count it.
|
||||
if (currMenu) {
|
||||
nsCOMPtr<nsIContent> menuContent;
|
||||
currMenu->GetMenuContent(getter_AddRefs(menuContent));
|
||||
if (menuContent) {
|
||||
if (menuContent->GetChildCount() > 0 ||
|
||||
!menuContent->AttrValueIs(kNameSpaceID_None, nsWidgetAtoms::hidden,
|
||||
nsWidgetAtoms::_true, eCaseMatters) &&
|
||||
!menuContent->AttrValueIs(kNameSpaceID_None, nsWidgetAtoms::collapsed,
|
||||
nsWidgetAtoms::_true, eCaseMatters)) {
|
||||
++(*outVisibleBefore);
|
||||
}
|
||||
if (menuContent &&
|
||||
menuContent->GetChildCount() > 0 &&
|
||||
!NodeIsHiddenOrCollapsed(menuContent)) {
|
||||
++(*outVisibleBefore);
|
||||
}
|
||||
}
|
||||
|
||||
} // for each menu
|
||||
}
|
||||
|
||||
return gotThisMenu ? NS_OK : NS_ERROR_FAILURE;
|
||||
} // CountVisibleBefore
|
||||
|
@ -1061,10 +1044,7 @@ NS_IMETHODIMP nsMenuX::AttributeChanged(nsIDocument *aDocument, PRInt32 aNameSpa
|
|||
else if (aAttribute == nsWidgetAtoms::hidden || aAttribute == nsWidgetAtoms::collapsed) {
|
||||
SetRebuild(PR_TRUE);
|
||||
|
||||
if (mMenuContent->AttrValueIs(kNameSpaceID_None, nsWidgetAtoms::hidden,
|
||||
nsWidgetAtoms::_true, eCaseMatters) ||
|
||||
mMenuContent->AttrValueIs(kNameSpaceID_None, nsWidgetAtoms::collapsed,
|
||||
nsWidgetAtoms::_true, eCaseMatters)) {
|
||||
if (NodeIsHiddenOrCollapsed(mMenuContent)) {
|
||||
if (mVisible) {
|
||||
if (menubarParent) {
|
||||
PRUint32 indexToRemove = 0;
|
||||
|
|
Загрузка…
Ссылка в новой задаче