From 97c9daa858cf840b1efeaec8514c65381c6476f2 Mon Sep 17 00:00:00 2001 From: "smontagu%smontagu.org" Date: Thu, 20 Dec 2007 10:06:14 +0000 Subject: [PATCH] Collect frames from all block continuations in the buffer for bidi resolution. Bug 408292. r+sr=roc, a=schrep git-svn-id: svn://10.0.0.236/trunk@241838 18797224-902f-48f8-a5cc-f745e15eee43 --- mozilla/layout/base/nsBidiPresUtils.cpp | 10 ++++++++-- mozilla/layout/base/nsBidiPresUtils.h | 2 -- mozilla/layout/generic/nsBlockFrame.cpp | 14 +------------- 3 files changed, 9 insertions(+), 17 deletions(-) diff --git a/mozilla/layout/base/nsBidiPresUtils.cpp b/mozilla/layout/base/nsBidiPresUtils.cpp index 7d8ca7682de..d51d4ad74a2 100644 --- a/mozilla/layout/base/nsBidiPresUtils.cpp +++ b/mozilla/layout/base/nsBidiPresUtils.cpp @@ -254,7 +254,6 @@ AdvanceLineIteratorToFrame(nsIFrame* aFrame, */ nsresult nsBidiPresUtils::Resolve(nsBlockFrame* aBlockFrame, - nsIFrame* aFirstChild, PRBool aIsVisualFormControl) { mLogicalFrames.Clear(); @@ -283,7 +282,11 @@ nsBidiPresUtils::Resolve(nsBlockFrame* aBlockFrame, mLogicalFrames.AppendElement(directionalFrame); } } - InitLogicalArray(aFirstChild); + for (nsBlockFrame* block = aBlockFrame; block; + block = static_cast(block->GetNextContinuation())) { + block->RemoveStateBits(NS_BLOCK_NEEDS_BIDI_RESOLUTION); + InitLogicalArray(block->GetFirstChild(nsnull)); + } if (text->mUnicodeBidi == NS_STYLE_UNICODE_BIDI_OVERRIDE) { nsIFrame* directionalFrame = NS_NewDirectionalFrame(shell, styleContext, kPDF); @@ -481,6 +484,9 @@ PRBool IsBidiLeaf(nsIFrame* aFrame) { void nsBidiPresUtils::InitLogicalArray(nsIFrame* aCurrentFrame) { + if (!aCurrentFrame) + return; + nsIPresShell* shell = aCurrentFrame->PresContext()->PresShell(); nsStyleContext* styleContext; diff --git a/mozilla/layout/base/nsBidiPresUtils.h b/mozilla/layout/base/nsBidiPresUtils.h index 0372594984f..f7386073873 100644 --- a/mozilla/layout/base/nsBidiPresUtils.h +++ b/mozilla/layout/base/nsBidiPresUtils.h @@ -118,7 +118,6 @@ public: * descendants of a given block frame. * * @param aBlockFrame The block frame - * @param aFirstChild The first child frame of aBlockFrame * @param aIsVisualFormControl [IN] Set if we are in a form control on a * visual page. * @see nsBlockFrame::IsVisualFormControl @@ -126,7 +125,6 @@ public: * @lina 06/18/2000 */ nsresult Resolve(nsBlockFrame* aBlockFrame, - nsIFrame* aFirstChild, PRBool aIsVisualFormControl); /** diff --git a/mozilla/layout/generic/nsBlockFrame.cpp b/mozilla/layout/generic/nsBlockFrame.cpp index 2b057968f3b..50aa9e670f8 100644 --- a/mozilla/layout/generic/nsBlockFrame.cpp +++ b/mozilla/layout/generic/nsBlockFrame.cpp @@ -6742,19 +6742,7 @@ nsBlockFrame::ResolveBidi() if (!bidiUtils) return NS_ERROR_NULL_POINTER; - for (nsBlockFrame* curFrame = this; curFrame; - curFrame = static_cast(curFrame->GetNextContinuation())) { - curFrame->RemoveStateBits(NS_BLOCK_NEEDS_BIDI_RESOLUTION); - if (!curFrame->mLines.empty()) { - nsresult rv = bidiUtils->Resolve(curFrame, - curFrame->mLines.front()->mFirstChild, - IsVisualFormControl(presContext)); - if (NS_FAILED(rv)) - return rv; - } - } - - return NS_OK; + return bidiUtils->Resolve(this, IsVisualFormControl(presContext)); } PRBool