diff --git a/layout/base/nsFrameTraversal.cpp b/layout/base/nsFrameTraversal.cpp index d530c8f6eda1..2de492210196 100644 --- a/layout/base/nsFrameTraversal.cpp +++ b/layout/base/nsFrameTraversal.cpp @@ -127,6 +127,7 @@ private: nsIFrame* GetRealFrame(nsIFrame* aFrame); nsIFrame* GetPlaceholderFrame(nsIFrame* aFrame); + PRBool IsPopupFrame(nsIFrame* aFrame); nsIPresContext* mPresContext; }; @@ -483,6 +484,14 @@ nsFocusIterator::GetRealFrame(nsIFrame* aFrame) return result; } +PRBool +nsFocusIterator::IsPopupFrame(nsIFrame* aFrame) +{ + nsStyleDisplay* display; + aFrame->GetStyleData(eStyleStruct_Display, (const nsStyleStruct*&) display); + return (display->mDisplay == NS_STYLE_DISPLAY_POPUP); +} + nsIFrame* nsFocusIterator::GetParentFrame(nsIFrame* aFrame) { @@ -502,6 +511,9 @@ nsFocusIterator::GetFirstChild(nsIFrame* aFrame) if (result) result = GetRealFrame(result); + if (result && IsPopupFrame(result)) + result = GetNextSibling(result); + return result; } @@ -516,6 +528,9 @@ nsFocusIterator::GetNextSibling(nsIFrame* aFrame) result = GetRealFrame(result); } + if (result && IsPopupFrame(result)) + result = GetNextSibling(result); + return result; } @@ -535,6 +550,9 @@ nsFocusIterator::GetPrevSibling(nsIFrame* aFrame) } } + if (result && IsPopupFrame(result)) + result = GetPrevSibling(result); + return result; } diff --git a/layout/base/src/nsFrameTraversal.cpp b/layout/base/src/nsFrameTraversal.cpp index d530c8f6eda1..2de492210196 100644 --- a/layout/base/src/nsFrameTraversal.cpp +++ b/layout/base/src/nsFrameTraversal.cpp @@ -127,6 +127,7 @@ private: nsIFrame* GetRealFrame(nsIFrame* aFrame); nsIFrame* GetPlaceholderFrame(nsIFrame* aFrame); + PRBool IsPopupFrame(nsIFrame* aFrame); nsIPresContext* mPresContext; }; @@ -483,6 +484,14 @@ nsFocusIterator::GetRealFrame(nsIFrame* aFrame) return result; } +PRBool +nsFocusIterator::IsPopupFrame(nsIFrame* aFrame) +{ + nsStyleDisplay* display; + aFrame->GetStyleData(eStyleStruct_Display, (const nsStyleStruct*&) display); + return (display->mDisplay == NS_STYLE_DISPLAY_POPUP); +} + nsIFrame* nsFocusIterator::GetParentFrame(nsIFrame* aFrame) { @@ -502,6 +511,9 @@ nsFocusIterator::GetFirstChild(nsIFrame* aFrame) if (result) result = GetRealFrame(result); + if (result && IsPopupFrame(result)) + result = GetNextSibling(result); + return result; } @@ -516,6 +528,9 @@ nsFocusIterator::GetNextSibling(nsIFrame* aFrame) result = GetRealFrame(result); } + if (result && IsPopupFrame(result)) + result = GetNextSibling(result); + return result; } @@ -535,6 +550,9 @@ nsFocusIterator::GetPrevSibling(nsIFrame* aFrame) } } + if (result && IsPopupFrame(result)) + result = GetPrevSibling(result); + return result; }