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;