diff --git a/layout/base/nsCSSFrameConstructor.cpp b/layout/base/nsCSSFrameConstructor.cpp index fdd38d01837..35fa0e5711e 100644 --- a/layout/base/nsCSSFrameConstructor.cpp +++ b/layout/base/nsCSSFrameConstructor.cpp @@ -66,7 +66,6 @@ #include "nsIPresShell.h" #include "nsStyleSet.h" #include "nsIViewManager.h" -#include "nsViewManager.h" #include "nsIEventStateManager.h" #include "nsIScrollableView.h" #include "nsStyleConsts.h" @@ -380,26 +379,6 @@ static nsresult DeletingFrameSubtree(nsFrameManager* aFrameManager, nsIFrame* aFrame); -void nsFocusEventSuppressor::Suppress(nsIPresShell *aPresShell) -{ - NS_ASSERTION(aPresShell, "Need non-null nsIPresShell!"); - NS_ASSERTION(!mViewManager, "Suppress before a pending UnSuppress()"); - nsFrameManager *frameManager = aPresShell->FrameManager(); - mViewManager = frameManager->GetPresContext()->GetViewManager(); - if (mViewManager) { - mOldSuppressState = mViewManager->GetSuppressFocusEvents(); - mViewManager->SetSuppressFocusEvents(PR_TRUE); - } -} - -void nsFocusEventSuppressor::Unsuppress() -{ - if (mViewManager) { - mViewManager->SetSuppressFocusEvents(mOldSuppressState); - mViewManager = nsnull; - } -} - #ifdef MOZ_SVG static nsIFrame * @@ -10258,14 +10237,6 @@ nsCSSFrameConstructor::AttributeChanged(nsIContent* aContent, return result; } -void -nsCSSFrameConstructor::BeginUpdate() { - if (!mUpdateCount) { - mFocusSuppressor.Suppress(mPresShell); - } - ++mUpdateCount; -} - void nsCSSFrameConstructor::EndUpdate() { @@ -10275,8 +10246,6 @@ nsCSSFrameConstructor::EndUpdate() RecalcQuotesAndCounters(); NS_ASSERTION(mUpdateCount == 1, "Odd update count"); - - mFocusSuppressor.Unsuppress(); } --mUpdateCount; diff --git a/layout/base/nsCSSFrameConstructor.h b/layout/base/nsCSSFrameConstructor.h index 08bb60d68f9..f26fed5c9db 100644 --- a/layout/base/nsCSSFrameConstructor.h +++ b/layout/base/nsCSSFrameConstructor.h @@ -52,7 +52,6 @@ #include "nsHashKeys.h" #include "nsThreadUtils.h" #include "nsPageContentFrame.h" -#include "nsIViewManager.h" class nsIDocument; struct nsFrameItems; @@ -74,20 +73,6 @@ struct nsFindFrameHint nsFindFrameHint() : mPrimaryFrameForPrevSibling(nsnull) { } }; -// Class which makes an nsIPresShell's ViewManager supress -// focus/blur events. This prevents the frame tree from being changed -// by focus handlers etc while *we* are trying to change it. -// Fix for bug 399852. -class nsFocusEventSuppressor -{ -public: - void Suppress(nsIPresShell *aPresShell); - void Unsuppress(); -private: - nsCOMPtr mViewManager; - PRBool mOldSuppressState; -}; - typedef void (PR_CALLBACK nsLazyFrameConstructionCallback) (nsIContent* aContent, nsIFrame* aFrame, void* aArg); @@ -163,7 +148,7 @@ public: PRInt32 aModType, PRUint32 aStateMask); - void BeginUpdate(); + void BeginUpdate() { ++mUpdateCount; } void EndUpdate(); void RecalcQuotesAndCounters(); @@ -177,9 +162,6 @@ public: nsresult ProcessRestyledFrames(nsStyleChangeList& aRestyleArray); private: - - nsFocusEventSuppressor mFocusSuppressor; - // Note: It's the caller's responsibility to make sure to wrap a // ProcessOneRestyle call in a view update batch. // This function does not call ProcessAttachedQueue() on the binding manager. diff --git a/view/public/nsIViewManager.h b/view/public/nsIViewManager.h index 8bdf3fcf689..b1a227ec4f3 100644 --- a/view/public/nsIViewManager.h +++ b/view/public/nsIViewManager.h @@ -440,18 +440,6 @@ public: * (aFromScroll is false) or scrolled (aFromScroll is true). */ NS_IMETHOD SynthesizeMouseMove(PRBool aFromScroll)=0; - - /** - * Toggles global suppression of focus/blur events. When suppression - * is on, focus/blur events will not be sent to their target widgets/views. - * Note that when called with aSuppress as false, blur/focus events are - * fired to reset the focus. This can run arbitrary code, and could - * even destroy the view manager. - */ - virtual void SetSuppressFocusEvents(PRBool aSuppress)=0; - - virtual PRBool GetSuppressFocusEvents()=0; - }; NS_DEFINE_STATIC_IID_ACCESSOR(nsIViewManager, NS_IVIEWMANAGER_IID) diff --git a/view/src/nsView.cpp b/view/src/nsView.cpp index 3311a365583..f2bcbd31ab4 100644 --- a/view/src/nsView.cpp +++ b/view/src/nsView.cpp @@ -200,13 +200,6 @@ nsView::~nsView() { MOZ_COUNT_DTOR(nsView); - if (this == nsViewManager::GetViewFocusedBeforeSuppression()) { - nsViewManager::SetViewFocusedBeforeSuppression(nsnull); - } - if (this == nsViewManager::GetCurrentlyFocusedView()) { - nsViewManager::SetCurrentlyFocusedView(nsnull); - } - while (GetFirstChild()) { nsView* child = GetFirstChild(); diff --git a/view/src/nsViewManager.cpp b/view/src/nsViewManager.cpp index ba4521ef0f8..f9fa1e59df0 100644 --- a/view/src/nsViewManager.cpp +++ b/view/src/nsViewManager.cpp @@ -935,62 +935,6 @@ void nsViewManager::UpdateViews(nsView *aView, PRUint32 aUpdateFlags) } } -PRBool nsViewManager::sSuppressFocusEvents = PR_FALSE; -nsView *nsViewManager::sCurrentlyFocusView = nsnull; -nsView *nsViewManager::sViewFocusedBeforeSuppression = nsnull; - -// Enables/disables focus/blur event suppression. When suppression -// is disabled, we "reboot" the focus by sending a blur to what was -// focused before suppression began, and by sending a focus event to -// what should be currently focused. The suppression should be enabled -// when we're messing with the frame tree, so focus/blur handlers -// don't mess with stuff while we're trying too. See Bug 399852. -void nsViewManager::SetSuppressFocusEvents(PRBool aSuppress) -{ - if (sSuppressFocusEvents && !aSuppress) { - - // We're turning off suppression, synthesize LOSTFOCUS/GOTFOCUS. - // Turn off suppresion before we send blur/focus events. - sSuppressFocusEvents = PR_FALSE; - if (GetCurrentlyFocusedView() != GetViewFocusedBeforeSuppression()) { - nsIWidget *widget = nsnull; - nsEventStatus status; - - // Backup what is focused before we send the blur. If the - // blur causes a focus change, keep that new focus change, - // don't overwrite with the old "currently focused view". - nsIView *currentFocusBeforeBlur = GetCurrentlyFocusedView(); - - // Send NS_LOSTFOCUS to widget that was focused before - // focus/blur suppression. - if (GetViewFocusedBeforeSuppression()) { - widget = GetViewFocusedBeforeSuppression()->GetWidget(); - if (widget) { - nsGUIEvent event(PR_TRUE, NS_LOSTFOCUS, widget); - widget->DispatchEvent(&event, status); - } - } - - // Send NS_GOTFOCUS to the widget that we think should be focused. - if (GetCurrentlyFocusedView() && - currentFocusBeforeBlur == GetCurrentlyFocusedView()) - { - widget = GetCurrentlyFocusedView()->GetWidget(); - if (widget) { - nsGUIEvent event(PR_TRUE, NS_GOTFOCUS, widget); - widget->DispatchEvent(&event, status); - } - } - } - - } else if (!sSuppressFocusEvents && aSuppress) { - // We're turning on focus/blur suppression, remember what had - // the focus. - SetViewFocusedBeforeSuppression(GetCurrentlyFocusedView()); - sSuppressFocusEvents = PR_TRUE; - } -} - NS_IMETHODIMP nsViewManager::DispatchEvent(nsGUIEvent *aEvent, nsEventStatus *aStatus) { *aStatus = nsEventStatus_eIgnore; @@ -1194,12 +1138,6 @@ NS_IMETHODIMP nsViewManager::DispatchEvent(nsGUIEvent *aEvent, nsEventStatus *aS default: { - if (aEvent->message == NS_GOTFOCUS) - SetCurrentlyFocusedView(nsView::GetViewFor(aEvent->widget)); - if ((aEvent->message == NS_GOTFOCUS || aEvent->message == NS_LOSTFOCUS) && - nsViewManager::GetSuppressFocusEvents()) - break; - if ((NS_IS_MOUSE_EVENT(aEvent) && // Ignore moves that we synthesize. static_cast(aEvent)->reason == diff --git a/view/src/nsViewManager.h b/view/src/nsViewManager.h index f1970245caa..cca9848a145 100644 --- a/view/src/nsViewManager.h +++ b/view/src/nsViewManager.h @@ -201,42 +201,10 @@ public: /* Update the cached RootViewManager pointer on this view manager. */ void InvalidateHierarchy(); - virtual void SetSuppressFocusEvents(PRBool aSuppress); - - virtual PRBool GetSuppressFocusEvents() - { - return sSuppressFocusEvents; - } - - static void SetCurrentlyFocusedView(nsView *aView) - { - sCurrentlyFocusView = aView; - } - - static nsView* GetCurrentlyFocusedView() - { - return sCurrentlyFocusView; - } - - static void SetViewFocusedBeforeSuppression(nsView *aView) - { - sViewFocusedBeforeSuppression = aView; - } - - static nsView* GetViewFocusedBeforeSuppression() - { - return sViewFocusedBeforeSuppression; - } - protected: virtual ~nsViewManager(); private: - - static nsView *sCurrentlyFocusView; - static nsView *sViewFocusedBeforeSuppression; - static PRBool sSuppressFocusEvents; - void FlushPendingInvalidates(); void ProcessPendingUpdates(nsView *aView, PRBool aDoInvalidate); void ReparentChildWidgets(nsIView* aView, nsIWidget *aNewWidget);