diff --git a/mozilla/layout/xul/base/src/nsMenuBarFrame.cpp b/mozilla/layout/xul/base/src/nsMenuBarFrame.cpp index db4d6180d15..874b2fa3b2b 100644 --- a/mozilla/layout/xul/base/src/nsMenuBarFrame.cpp +++ b/mozilla/layout/xul/base/src/nsMenuBarFrame.cpp @@ -30,6 +30,8 @@ #include "nsIDOMEventReceiver.h" #include "nsXULAtoms.h" #include "nsMenuFrame.h" +#include "nsIView.h" +#include "nsIViewManager.h" // // NS_NewMenuBarFrame @@ -113,6 +115,13 @@ nsMenuBarFrame::Init(nsIPresContext& aPresContext, return rv; } +NS_IMETHODIMP +nsMenuBarFrame::SetActive() +{ + mIsActive = PR_TRUE; + return NS_OK; +} + void nsMenuBarFrame::ToggleMenuActiveState() { @@ -129,7 +138,7 @@ nsMenuBarFrame::ToggleMenuActiveState() } else { // Activate the menu bar - mIsActive = PR_TRUE; + SetActive(); // Set the active menu to be the top left item (e.g., the File menu). // We use an attribute called "active" to track the current active menu. diff --git a/mozilla/layout/xul/base/src/nsMenuBarFrame.h b/mozilla/layout/xul/base/src/nsMenuBarFrame.h index 5b594929a7c..b47345e72a6 100644 --- a/mozilla/layout/xul/base/src/nsMenuBarFrame.h +++ b/mozilla/layout/xul/base/src/nsMenuBarFrame.h @@ -45,7 +45,7 @@ public: NS_IMETHOD SetCurrentMenuItem(nsIFrame* aMenuItem); NS_IMETHOD GetNextMenuItem(nsIFrame* aStart, nsIFrame** aResult); NS_IMETHOD GetPreviousMenuItem(nsIFrame* aStart, nsIFrame** aResult); - NS_IMETHOD SetActive() { mIsActive = PR_TRUE; return NS_OK; }; + NS_IMETHOD SetActive(); NS_IMETHOD IsActive() { return mIsActive; }; diff --git a/mozilla/layout/xul/base/src/nsMenuFrame.cpp b/mozilla/layout/xul/base/src/nsMenuFrame.cpp index 769a1ae11e8..7d77ac8ddcd 100644 --- a/mozilla/layout/xul/base/src/nsMenuFrame.cpp +++ b/mozilla/layout/xul/base/src/nsMenuFrame.cpp @@ -191,9 +191,6 @@ nsMenuFrame::HandleEvent(nsIPresContext& aPresContext, nsIFrame* frame = mPopupFrames.FirstChild(); if (frame) { // We have children. - nsMenuPopupFrame* popup = (nsMenuPopupFrame*)frame; - PRBool onMenuBar = PR_TRUE; - popup->SyncViewWithFrame(onMenuBar); ToggleMenuState(); } } @@ -244,6 +241,11 @@ nsMenuFrame::OpenMenu(PRBool aActivateFlag) nsMenuPopupFrame* menuPopup = (nsMenuPopupFrame*)frame; if (aActivateFlag) { + + // Sync up the view. + if (menuPopup) + menuPopup->SyncViewWithFrame(PR_TRUE); + // Open the menu. mContent->SetAttribute(kNameSpaceID_None, nsXULAtoms::open, "true", PR_TRUE); if (child) { @@ -264,6 +266,10 @@ nsMenuFrame::OpenMenu(PRBool aActivateFlag) if (child) child->UnsetAttribute(kNameSpaceID_None, nsXULAtoms::menuactive, PR_TRUE); mMenuOpen = PR_FALSE; + + // Make sure we clear out our own items. + if (menuPopup) + menuPopup->SetCurrentMenuItem(nsnull); } } diff --git a/mozilla/layout/xul/base/src/nsMenuFrame.h b/mozilla/layout/xul/base/src/nsMenuFrame.h index b0d317cde80..d2f2ce8bf74 100644 --- a/mozilla/layout/xul/base/src/nsMenuFrame.h +++ b/mozilla/layout/xul/base/src/nsMenuFrame.h @@ -93,7 +93,6 @@ protected: protected: nsFrameList mPopupFrames; PRBool mMenuOpen; - nsMenuBarFrame* mMenuBar; nsIMenuParent* mMenuParent; // Our parent menu. }; // class nsMenuFrame