Backing out bug 399852 again, looks like it caused more focus-related mochitest failures
authorroc+@cs.cmu.edu
Mon, 11 Feb 2008 19:04:48 -0800
changeset 11564 34d547076472503c9e3043ab388c6d3869b72e59
parent 11563 7219ca1060991dff3a8d49fee0377f53af42b5e6
child 11565 416ccc98470c6557619a66a8ed64e9a220fef205
push id1
push userbsmedberg@mozilla.com
push dateThu, 20 Mar 2008 16:49:24 +0000
treeherdermozilla-central@61007906a1f8 [default view] [failures only]
perfherder[talos] [build metrics] [platform microbench] (compared to previous push)
bugs399852
milestone1.9b4pre
Backing out bug 399852 again, looks like it caused more focus-related mochitest failures
layout/base/nsCSSFrameConstructor.cpp
view/public/nsIViewManager.h
view/src/nsView.cpp
view/src/nsViewManager.cpp
view/src/nsViewManager.h
--- a/layout/base/nsCSSFrameConstructor.cpp
+++ b/layout/base/nsCSSFrameConstructor.cpp
@@ -374,33 +374,16 @@ static PRInt32 FFWC_recursions=0;
 static PRInt32 FFWC_nextInFlows=0;
 static PRInt32 FFWC_slowSearchForText=0;
 #endif
 
 static nsresult
 DeletingFrameSubtree(nsFrameManager* aFrameManager,
                      nsIFrame*       aFrame);
 
-void nsFocusEventSuppressor::Suppress(nsIPresShell *aPresShell)
-{
-  NS_ASSERTION(aPresShell, "Need non-null nsIPresShell!");
-  if (!mViewManager) {
-    nsFrameManager *frameManager = aPresShell->FrameManager();
-    mViewManager = frameManager->GetPresContext()->GetViewManager();
-    NS_ASSERTION(mViewManager, "We must have an mViewManager here");
-  }
-  mViewManager->SuppressFocusEvents();
-}
-
-void nsFocusEventSuppressor::Unsuppress()
-{
-  NS_ASSERTION(mViewManager, "We must have an mViewManager here");
-  mViewManager->UnsuppressFocusEvents();
-}
-
 #ifdef  MOZ_SVG
 
 static nsIFrame *
 SVG_GetFirstNonAAncestorFrame(nsIFrame *aParentFrame)
 {
   for (nsIFrame *ancestorFrame = aParentFrame; ancestorFrame != nsnull;
        ancestorFrame = ancestorFrame->GetParent()) {
     if (ancestorFrame->GetType() != nsGkAtoms::svgAFrame) {
@@ -10246,32 +10229,26 @@ nsCSSFrameConstructor::AttributeChanged(
                                                                   aStateMask);
 
   PostRestyleEvent(aContent, rshint, hint);
 
   return result;
 }
 
 void
-nsCSSFrameConstructor::BeginUpdate() {
-  mFocusSuppressor.Suppress(mPresShell);
-  ++mUpdateCount;
-}
-
-void
 nsCSSFrameConstructor::EndUpdate()
 {
   if (mUpdateCount == 1) {
     // This is the end of our last update.  Before we decrement
     // mUpdateCount, recalc quotes and counters as needed.
 
     RecalcQuotesAndCounters();
     NS_ASSERTION(mUpdateCount == 1, "Odd update count");
   }
-  mFocusSuppressor.Unsuppress();
+
   --mUpdateCount;
 }
 
 void
 nsCSSFrameConstructor::RecalcQuotesAndCounters()
 {
   if (mQuotesDirty) {
     mQuotesDirty = PR_FALSE;
--- a/view/public/nsIViewManager.h
+++ b/view/public/nsIViewManager.h
@@ -476,41 +476,16 @@ public:
                                nsRectVisibility *aRectVisibility)=0;
 
   /**
    * Dispatch a mouse move event based on the most recent mouse
    * position.  This is used when the contents of the page moved
    * (aFromScroll is false) or scrolled (aFromScroll is true).
    */
   NS_IMETHOD SynthesizeMouseMove(PRBool aFromScroll)=0;
-   
-  /**
-   * Enables focus/blur event suppression. This stops focus/blur
-   * events from reaching the widgets. This should be enabled 
-   * when we're messing with the frame tree, so focus/blur handlers
-   * don't mess with stuff while we are. See Bug 399852.   
-   */
-  virtual void SuppressFocusEvents()=0;
-  
-  /**
-   * Disables focus/blur event suppression. This "reboots" 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.
-   * Note this can run arbitrary code, and could even destroy the view
-   * manager. The suppression should be enabled when we're messing with
-   * the frame tree, so focus/blur handlers don't mess with stuff while
-   * we are. See Bug 399852.
-   */
-  virtual void UnsuppressFocusEvents()=0;
-
-  /**
-   * Returns true when focus suppression is on.
-   */
-  virtual PRBool IsFocusSuppressed()=0;
-
 };
 
 NS_DEFINE_STATIC_IID_ACCESSOR(nsIViewManager, NS_IVIEWMANAGER_IID)
 
 // Paint timing mode flags
 
 // intermediate: do no special timing processing; repaint when the
 // toolkit issues an expose event (which will happen *before* PLEvent
--- a/view/src/nsView.cpp
+++ b/view/src/nsView.cpp
@@ -195,23 +195,16 @@ void nsView::DropMouseGrabbing() {
     mViewManager->GrabMouseEvents(GetParent(), boolResult);
   }
 }
 
 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();
     if (child->GetViewManager() == mViewManager) {
       child->Destroy();
     } else {
       // just unhook it. Someone else will want to destroy this.
       RemoveChild(child);
--- a/view/src/nsViewManager.cpp
+++ b/view/src/nsViewManager.cpp
@@ -930,69 +930,16 @@ void nsViewManager::UpdateViews(nsView *
   // update all children as well.
   nsView* childView = aView->GetFirstChild();
   while (nsnull != childView)  {
     UpdateViews(childView, aUpdateFlags);
     childView = childView->GetNextSibling();
   }
 }
 
-nsView *nsViewManager::sCurrentlyFocusView = nsnull;
-nsView *nsViewManager::sViewFocusedBeforeSuppression = nsnull;
-PRInt32 nsViewManager::sSuppressCount = 0;
-
-void nsViewManager::SuppressFocusEvents()
-{
-  sSuppressCount++;
-  if (sSuppressCount == 1) {
-    // We're turning on focus/blur suppression, remember what had
-    // the focus.
-    SetViewFocusedBeforeSuppression(GetCurrentlyFocusedView());
-  }  
-}
-
-void nsViewManager::UnsuppressFocusEvents()
-{
-  sSuppressCount--;
-  if (sSuppressCount > 0 ||
-      GetCurrentlyFocusedView() == GetViewFocusedBeforeSuppression())
-  return;
-
-  // We're turning off suppression, synthesize LOSTFOCUS/GOTFOCUS.
-  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); 
-    }
-  }
-
-}
-
 NS_IMETHODIMP nsViewManager::DispatchEvent(nsGUIEvent *aEvent, nsEventStatus *aStatus)
 {
   *aStatus = nsEventStatus_eIgnore;
 
   switch(aEvent->message)
     {
     case NS_SIZE:
       {
@@ -1186,23 +1133,16 @@ NS_IMETHODIMP nsViewManager::DispatchEve
         if (obs) {
           obs->HandleEvent(view, aEvent, aStatus);
         }
       }
       break; 
 
     default:
       {
-        if (aEvent->message == NS_GOTFOCUS) {
-          SetCurrentlyFocusedView(nsView::GetViewFor(aEvent->widget));
-        }
-        if ((aEvent->message == NS_GOTFOCUS || aEvent->message == NS_LOSTFOCUS) &&
-             nsViewManager::IsFocusSuppressed()) 
-          break;
-        
         if ((NS_IS_MOUSE_EVENT(aEvent) &&
              // Ignore moves that we synthesize.
              static_cast<nsMouseEvent*>(aEvent)->reason ==
                nsMouseEvent::eReal &&
              // Ignore mouse exit and enter (we'll get moves if the user
              // is really moving the mouse) since we get them when we
              // create and destroy widgets.
              aEvent->message != NS_MOUSE_EXIT &&
--- a/view/src/nsViewManager.h
+++ b/view/src/nsViewManager.h
@@ -196,53 +196,20 @@ public:
                                nsRectVisibility *aRectVisibility);
 
   NS_IMETHOD SynthesizeMouseMove(PRBool aFromScroll);
   void ProcessSynthMouseMoveEvent(PRBool aFromScroll);
 
   /* Update the cached RootViewManager pointer on this view manager. */
   void InvalidateHierarchy();
 
-  virtual void SuppressFocusEvents();
-  virtual void UnsuppressFocusEvents();
-
-  virtual PRBool IsFocusSuppressed()
-  {
-    return sSuppressCount > 0;
-  }
-
-  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 PRInt32 sSuppressCount;
-
   void FlushPendingInvalidates();
   void ProcessPendingUpdates(nsView *aView, PRBool aDoInvalidate);
   void ReparentChildWidgets(nsIView* aView, nsIWidget *aNewWidget);
   void ReparentWidgets(nsIView* aView, nsIView *aParent);
   already_AddRefed<nsIRenderingContext> CreateRenderingContext(nsView &aView);
   void UpdateWidgetArea(nsView *aWidgetView, const nsRegion &aDamagedRegion,
                         nsView* aIgnoreWidgetView);