From 420b97695bc8d2cc7fc45ee9c7d46a2cb55e2df4 Mon Sep 17 00:00:00 2001 From: "bzbarsky%mit.edu" Date: Tue, 10 Aug 2004 22:24:00 +0000 Subject: [PATCH] Make sure that GetFrameForPoint checks all layers of each float before moving on to the next one. Bug 253572, r+sr=roc git-svn-id: svn://10.0.0.236/trunk@160632 18797224-902f-48f8-a5cc-f745e15eee43 --- mozilla/layout/base/public/nsIFrame.h | 10 +++++++--- mozilla/layout/generic/nsBlockFrame.cpp | 15 +-------------- mozilla/layout/generic/nsContainerFrame.cpp | 16 +++++++++++++++- mozilla/layout/generic/nsIFrame.h | 10 +++++++--- mozilla/layout/html/base/src/nsBlockFrame.cpp | 15 +-------------- .../layout/html/base/src/nsContainerFrame.cpp | 16 +++++++++++++++- 6 files changed, 46 insertions(+), 36 deletions(-) diff --git a/mozilla/layout/base/public/nsIFrame.h b/mozilla/layout/base/public/nsIFrame.h index 1b4576c67ed..1b90993524d 100644 --- a/mozilla/layout/base/public/nsIFrame.h +++ b/mozilla/layout/base/public/nsIFrame.h @@ -224,9 +224,9 @@ typedef PRUint32 nsFrameState; //---------------------------------------------------------------------- enum nsFramePaintLayer { - eFramePaintLayer_Underlay = 0, - eFramePaintLayer_Content = 1, - eFramePaintLayer_Overlay = 2 + eFramePaintLayer_Underlay = 1, + eFramePaintLayer_Content = 2, + eFramePaintLayer_Overlay = 4 }; enum nsSelectionAmount { @@ -263,6 +263,10 @@ enum nsSpread { #define NS_FRAME_PAINT_LAYER_FLOATS eFramePaintLayer_Content #define NS_FRAME_PAINT_LAYER_FOREGROUND eFramePaintLayer_Overlay #define NS_FRAME_PAINT_LAYER_DEBUG eFramePaintLayer_Overlay +#define NS_FRAME_PAINT_LAYER_ALL \ + (nsFramePaintLayer(NS_FRAME_PAINT_LAYER_BACKGROUND | \ + NS_FRAME_PAINT_LAYER_FLOATS | \ + NS_FRAME_PAINT_LAYER_FOREGROUND)) /** * Reflow status returned by the reflow methods. diff --git a/mozilla/layout/generic/nsBlockFrame.cpp b/mozilla/layout/generic/nsBlockFrame.cpp index 3d9ceb86eb9..3a586e046e4 100644 --- a/mozilla/layout/generic/nsBlockFrame.cpp +++ b/mozilla/layout/generic/nsBlockFrame.cpp @@ -5910,25 +5910,12 @@ nsBlockFrame::GetFrameForPoint(nsPresContext* aPresContext, rv = GetFrameForPointUsing(aPresContext, aPoint, nsLayoutAtoms::floatList, - NS_FRAME_PAINT_LAYER_FOREGROUND, + NS_FRAME_PAINT_LAYER_ALL, PR_FALSE, aFrame); if (NS_OK == rv) { return NS_OK; } - rv = GetFrameForPointUsing(aPresContext, aPoint, - nsLayoutAtoms::floatList, - NS_FRAME_PAINT_LAYER_FLOATS, - PR_FALSE, aFrame); - if (NS_OK == rv) { - return NS_OK; - } - - return GetFrameForPointUsing(aPresContext, aPoint, - nsLayoutAtoms::floatList, - NS_FRAME_PAINT_LAYER_BACKGROUND, - PR_FALSE, aFrame); - } else { return NS_ERROR_FAILURE; } diff --git a/mozilla/layout/generic/nsContainerFrame.cpp b/mozilla/layout/generic/nsContainerFrame.cpp index 79f510e54c4..0efbd37a72a 100644 --- a/mozilla/layout/generic/nsContainerFrame.cpp +++ b/mozilla/layout/generic/nsContainerFrame.cpp @@ -354,7 +354,21 @@ nsContainerFrame::GetFrameForPointUsing(nsPresContext* aPresContext, tmp += originOffset; while (kid) { - rv = kid->GetFrameForPoint(aPresContext, tmp, aWhichLayer, &hit); + if (aWhichLayer == NS_FRAME_PAINT_LAYER_ALL) { + // Check all layers on this kid before moving on to the next one + rv = kid->GetFrameForPoint(aPresContext, tmp, + NS_FRAME_PAINT_LAYER_FOREGROUND, &hit); + if (NS_FAILED(rv) || !hit) { + rv = kid->GetFrameForPoint(aPresContext, tmp, + NS_FRAME_PAINT_LAYER_FLOATS, &hit); + if (NS_FAILED(rv) || !hit) { + rv = kid->GetFrameForPoint(aPresContext, tmp, + NS_FRAME_PAINT_LAYER_BACKGROUND, &hit); + } + } + } else { + rv = kid->GetFrameForPoint(aPresContext, tmp, aWhichLayer, &hit); + } if (NS_SUCCEEDED(rv) && hit) { *aFrame = hit; diff --git a/mozilla/layout/generic/nsIFrame.h b/mozilla/layout/generic/nsIFrame.h index 1b4576c67ed..1b90993524d 100644 --- a/mozilla/layout/generic/nsIFrame.h +++ b/mozilla/layout/generic/nsIFrame.h @@ -224,9 +224,9 @@ typedef PRUint32 nsFrameState; //---------------------------------------------------------------------- enum nsFramePaintLayer { - eFramePaintLayer_Underlay = 0, - eFramePaintLayer_Content = 1, - eFramePaintLayer_Overlay = 2 + eFramePaintLayer_Underlay = 1, + eFramePaintLayer_Content = 2, + eFramePaintLayer_Overlay = 4 }; enum nsSelectionAmount { @@ -263,6 +263,10 @@ enum nsSpread { #define NS_FRAME_PAINT_LAYER_FLOATS eFramePaintLayer_Content #define NS_FRAME_PAINT_LAYER_FOREGROUND eFramePaintLayer_Overlay #define NS_FRAME_PAINT_LAYER_DEBUG eFramePaintLayer_Overlay +#define NS_FRAME_PAINT_LAYER_ALL \ + (nsFramePaintLayer(NS_FRAME_PAINT_LAYER_BACKGROUND | \ + NS_FRAME_PAINT_LAYER_FLOATS | \ + NS_FRAME_PAINT_LAYER_FOREGROUND)) /** * Reflow status returned by the reflow methods. diff --git a/mozilla/layout/html/base/src/nsBlockFrame.cpp b/mozilla/layout/html/base/src/nsBlockFrame.cpp index 3d9ceb86eb9..3a586e046e4 100644 --- a/mozilla/layout/html/base/src/nsBlockFrame.cpp +++ b/mozilla/layout/html/base/src/nsBlockFrame.cpp @@ -5910,25 +5910,12 @@ nsBlockFrame::GetFrameForPoint(nsPresContext* aPresContext, rv = GetFrameForPointUsing(aPresContext, aPoint, nsLayoutAtoms::floatList, - NS_FRAME_PAINT_LAYER_FOREGROUND, + NS_FRAME_PAINT_LAYER_ALL, PR_FALSE, aFrame); if (NS_OK == rv) { return NS_OK; } - rv = GetFrameForPointUsing(aPresContext, aPoint, - nsLayoutAtoms::floatList, - NS_FRAME_PAINT_LAYER_FLOATS, - PR_FALSE, aFrame); - if (NS_OK == rv) { - return NS_OK; - } - - return GetFrameForPointUsing(aPresContext, aPoint, - nsLayoutAtoms::floatList, - NS_FRAME_PAINT_LAYER_BACKGROUND, - PR_FALSE, aFrame); - } else { return NS_ERROR_FAILURE; } diff --git a/mozilla/layout/html/base/src/nsContainerFrame.cpp b/mozilla/layout/html/base/src/nsContainerFrame.cpp index 79f510e54c4..0efbd37a72a 100644 --- a/mozilla/layout/html/base/src/nsContainerFrame.cpp +++ b/mozilla/layout/html/base/src/nsContainerFrame.cpp @@ -354,7 +354,21 @@ nsContainerFrame::GetFrameForPointUsing(nsPresContext* aPresContext, tmp += originOffset; while (kid) { - rv = kid->GetFrameForPoint(aPresContext, tmp, aWhichLayer, &hit); + if (aWhichLayer == NS_FRAME_PAINT_LAYER_ALL) { + // Check all layers on this kid before moving on to the next one + rv = kid->GetFrameForPoint(aPresContext, tmp, + NS_FRAME_PAINT_LAYER_FOREGROUND, &hit); + if (NS_FAILED(rv) || !hit) { + rv = kid->GetFrameForPoint(aPresContext, tmp, + NS_FRAME_PAINT_LAYER_FLOATS, &hit); + if (NS_FAILED(rv) || !hit) { + rv = kid->GetFrameForPoint(aPresContext, tmp, + NS_FRAME_PAINT_LAYER_BACKGROUND, &hit); + } + } + } else { + rv = kid->GetFrameForPoint(aPresContext, tmp, aWhichLayer, &hit); + } if (NS_SUCCEEDED(rv) && hit) { *aFrame = hit;