Fix typeahead find when fastback is turned on by checking that the pres shell is attached to a window before using it. Clean up some warnings as well. Bug 298622, r+sr=dbaron, a=chase.

This commit is contained in:
bryner%brianryner.com 2005-06-28 01:02:03 +00:00
Родитель 6163cf8997
Коммит adae76e381
4 изменённых файлов: 67 добавлений и 23 удалений

Просмотреть файл

@ -501,7 +501,7 @@ nsTypeAheadFind::UseInWindow(nsIDOMWindow *aDOMWin)
return NS_OK; return NS_OK;
} }
nsCOMPtr<nsIPresShell> oldPresShell(do_QueryReferent(mFocusedWeakShell)); nsCOMPtr<nsIPresShell> oldPresShell(GetPresShell());
if (!oldPresShell || oldPresShell != presShell) { if (!oldPresShell || oldPresShell != presShell) {
CancelFind(); CancelFind();
@ -556,7 +556,7 @@ nsTypeAheadFind::HandleEvent(nsIDOMEvent* aEvent)
nsCOMPtr<nsIDOMEventTarget> eventTarget; nsCOMPtr<nsIDOMEventTarget> eventTarget;
event->GetOriginalTarget(getter_AddRefs(eventTarget)); event->GetOriginalTarget(getter_AddRefs(eventTarget));
nsCOMPtr<nsIDocument> doc(do_QueryInterface(eventTarget)); nsCOMPtr<nsIDocument> doc(do_QueryInterface(eventTarget));
nsCOMPtr<nsIPresShell> focusedShell(do_QueryReferent(mFocusedWeakShell)); nsCOMPtr<nsIPresShell> focusedShell(GetPresShell());
if (!focusedShell || !doc) { if (!focusedShell || !doc) {
return NS_ERROR_FAILURE; return NS_ERROR_FAILURE;
} }
@ -933,7 +933,7 @@ nsTypeAheadFind::HandleChar(PRUnichar aChar)
// If not, make sure the selection is in sync with the focus, so we can // If not, make sure the selection is in sync with the focus, so we can
// start our search from there. // start our search from there.
nsCOMPtr<nsIContent> focusedContent; nsCOMPtr<nsIContent> focusedContent;
nsCOMPtr<nsIPresShell> presShell(do_QueryReferent(mFocusedWeakShell)); nsCOMPtr<nsIPresShell> presShell(GetPresShell());
NS_ENSURE_TRUE(presShell, NS_OK); NS_ENSURE_TRUE(presShell, NS_OK);
nsPresContext *presContext = presShell->GetPresContext(); nsPresContext *presContext = presShell->GetPresContext();
NS_ENSURE_TRUE(presContext, NS_OK); NS_ENSURE_TRUE(presContext, NS_OK);
@ -1224,8 +1224,7 @@ nsTypeAheadFind::FindItNow(nsIPresShell *aPresShell,
PRBool aIsFirstVisiblePreferred) PRBool aIsFirstVisiblePreferred)
{ {
nsCOMPtr<nsIPresShell> presShell(aPresShell); nsCOMPtr<nsIPresShell> presShell(aPresShell);
nsCOMPtr<nsIPresShell> startingPresShell = nsCOMPtr<nsIPresShell> startingPresShell = GetPresShell();
do_QueryReferent(mFocusedWeakShell);
if (!presShell) { if (!presShell) {
presShell = startingPresShell; // this is the current document presShell = startingPresShell; // this is the current document
@ -1525,8 +1524,7 @@ nsTypeAheadFind::GetSearchContainers(nsISupports *aContainer,
// Consider current selection as null if // Consider current selection as null if
// it's not in the currently focused document // it's not in the currently focused document
nsCOMPtr<nsIDOMRange> currentSelectionRange; nsCOMPtr<nsIDOMRange> currentSelectionRange;
nsCOMPtr<nsIPresShell> selectionPresShell = nsCOMPtr<nsIPresShell> selectionPresShell = GetPresShell();
do_QueryReferent(mFocusedWeakShell);
if (aCanUseDocSelection && selectionPresShell == presShell && mFocusedDocSelection) { if (aCanUseDocSelection && selectionPresShell == presShell && mFocusedDocSelection) {
mFocusedDocSelection->GetRangeAt(0, getter_AddRefs(currentSelectionRange)); mFocusedDocSelection->GetRangeAt(0, getter_AddRefs(currentSelectionRange));
@ -1707,7 +1705,7 @@ nsTypeAheadFind::NotifySelectionChanged(nsIDOMDocument *aDoc,
if (mRepeatingMode != eRepeatingNone) { if (mRepeatingMode != eRepeatingNone) {
// Selection had changed color for Type Ahead Find's version of Accel+G // Selection had changed color for Type Ahead Find's version of Accel+G
// We change it back when the selection changes from someone else // We change it back when the selection changes from someone else
nsCOMPtr<nsIPresShell> presShell(do_QueryReferent(mFocusedWeakShell)); nsCOMPtr<nsIPresShell> presShell(GetPresShell());
SetSelectionLook(presShell, PR_FALSE, PR_FALSE); SetSelectionLook(presShell, PR_FALSE, PR_FALSE);
} }
CancelFind(); CancelFind();
@ -1736,7 +1734,7 @@ nsTypeAheadFind::FindNext(PRBool aFindBackwards, nsISupportsInterfacePointer *aC
// with the top level content pres shell window where find next is happening // with the top level content pres shell window where find next is happening
// If they're different, exit so that webbrowswerfind can handle FindNext() // If they're different, exit so that webbrowswerfind can handle FindNext()
nsCOMPtr<nsIPresShell> typeAheadPresShell(do_QueryReferent(mFocusedWeakShell)); nsCOMPtr<nsIPresShell> typeAheadPresShell(GetPresShell());
NS_ENSURE_TRUE(typeAheadPresShell, NS_OK); NS_ENSURE_TRUE(typeAheadPresShell, NS_OK);
nsPresContext *presContext = typeAheadPresShell->GetPresContext(); nsPresContext *presContext = typeAheadPresShell->GetPresContext();
@ -1869,7 +1867,7 @@ nsTypeAheadFind::StartNewFind(nsIDOMWindow *aWindow, PRBool aLinksOnly)
mIsFindingText = PR_TRUE; // Turn off side effects from selection listener mIsFindingText = PR_TRUE; // Turn off side effects from selection listener
mFocusedDocSelection->CollapseToStart(); mFocusedDocSelection->CollapseToStart();
mIsFindingText = PR_FALSE; mIsFindingText = PR_FALSE;
nsCOMPtr<nsIPresShell> presShell(do_QueryReferent(mFocusedWeakShell)); nsCOMPtr<nsIPresShell> presShell(GetPresShell());
SetSelectionLook(presShell, PR_TRUE, PR_TRUE); SetSelectionLook(presShell, PR_TRUE, PR_TRUE);
} }
DisplayStatus(PR_TRUE, nsnull, PR_FALSE); DisplayStatus(PR_TRUE, nsnull, PR_FALSE);
@ -2033,7 +2031,7 @@ nsTypeAheadFind::CancelFind()
if (mIsTypeAheadOn || mRepeatingMode != eRepeatingNone) { if (mIsTypeAheadOn || mRepeatingMode != eRepeatingNone) {
mTypeAheadBuffer.Truncate(); mTypeAheadBuffer.Truncate();
DisplayStatus(PR_FALSE, nsnull, PR_TRUE); // Clear status DisplayStatus(PR_FALSE, nsnull, PR_TRUE); // Clear status
nsCOMPtr<nsIPresShell> presShell(do_QueryReferent(mFocusedWeakShell)); nsCOMPtr<nsIPresShell> presShell(GetPresShell());
SetSelectionLook(presShell, PR_FALSE, PR_FALSE); SetSelectionLook(presShell, PR_FALSE, PR_FALSE);
} }
@ -2214,7 +2212,7 @@ nsTypeAheadFind::SetSelectionLook(nsIPresShell *aPresShell,
void void
nsTypeAheadFind::RemoveDocListeners() nsTypeAheadFind::RemoveDocListeners()
{ {
nsCOMPtr<nsIPresShell> presShell(do_QueryReferent(mFocusedWeakShell)); nsCOMPtr<nsIPresShell> presShell(GetPresShell());
nsIViewManager* vm = nsnull; nsIViewManager* vm = nsnull;
if (presShell) { if (presShell) {
@ -2490,7 +2488,7 @@ nsTypeAheadFind::GetTargetIfTypeAheadOkay(nsIDOMEvent *aEvent,
return NS_OK; return NS_OK;
} }
nsCOMPtr<nsIPresShell> lastShell(do_QueryReferent(mFocusedWeakShell)); nsCOMPtr<nsIPresShell> lastShell(GetPresShell());
if (lastShell != presShell || topContentWin != mFocusedWindow) { if (lastShell != presShell || topContentWin != mFocusedWindow) {
GetAutoStart(topContentWin, &mIsFindAllowedInWindow); GetAutoStart(topContentWin, &mIsFindAllowedInWindow);
@ -2723,7 +2721,7 @@ nsTypeAheadFind::DisplayStatus(PRBool aSuccess, nsIContent *aFocusedContent,
// pres shell -> pres context -> container -> tree item -> // pres shell -> pres context -> container -> tree item ->
// tree owner -> browser chrome // tree owner -> browser chrome
nsCOMPtr<nsIPresShell> presShell(do_QueryReferent(mFocusedWeakShell)); nsCOMPtr<nsIPresShell> presShell(GetPresShell());
if (!presShell) { if (!presShell) {
return; return;
} }
@ -3012,3 +3010,21 @@ nsTypeAheadController::EnsureContentWindow(nsIDOMWindowInternal *aFocusedWin,
NS_IF_ADDREF(*aStartContentWin); NS_IF_ADDREF(*aStartContentWin);
return NS_OK; return NS_OK;
} }
already_AddRefed<nsIPresShell>
nsTypeAheadFind::GetPresShell()
{
if (!mFocusedWeakShell)
return nsnull;
nsIPresShell *shell = nsnull;
CallQueryReferent(mFocusedWeakShell.get(), &shell);
if (shell) {
nsPresContext *pc = shell->GetPresContext();
if (!pc || !nsCOMPtr<nsISupports>(pc->GetContainer())) {
NS_RELEASE(shell);
}
}
return shell;
}

Просмотреть файл

@ -183,6 +183,10 @@ protected:
PRBool aClearStatus, const PRUnichar *aText = nsnull); PRBool aClearStatus, const PRUnichar *aText = nsnull);
nsresult GetTranslatedString(const nsAString& aKey, nsAString& aStringOut); nsresult GetTranslatedString(const nsAString& aKey, nsAString& aStringOut);
// Get the pres shell from mFocusedWeakShell and return it only if it is
// still attached to the DOM window.
NS_HIDDEN_(already_AddRefed<nsIPresShell>) GetPresShell();
// Used by GetInstance and ReleaseInstance // Used by GetInstance and ReleaseInstance
static nsTypeAheadFind *sInstance; static nsTypeAheadFind *sInstance;

Просмотреть файл

@ -118,11 +118,10 @@ static NS_DEFINE_CID(kFrameTraversalCID, NS_FRAMETRAVERSAL_CID);
nsTypeAheadFind::nsTypeAheadFind(): nsTypeAheadFind::nsTypeAheadFind():
mLinksOnlyPref(PR_FALSE), mStartLinksOnlyPref(PR_FALSE), mLinksOnlyPref(PR_FALSE), mStartLinksOnlyPref(PR_FALSE),
mLinksOnly(PR_FALSE), mCaretBrowsingOn(PR_FALSE), mLinksOnly(PR_FALSE), mCaretBrowsingOn(PR_FALSE),
mLiteralTextSearchOnly(PR_FALSE), mDontTryExactMatch(PR_FALSE), mFocusLinks(PR_FALSE), mLiteralTextSearchOnly(PR_FALSE),
mAllTheSameChar(PR_TRUE), mDontTryExactMatch(PR_FALSE), mAllTheSameChar(PR_TRUE),
mRepeatingMode(eRepeatingNone), mLastFindLength(0), mRepeatingMode(eRepeatingNone), mLastFindLength(0),
mFocusLinks(PR_FALSE), mIsSoundInitialized(PR_FALSE)
mSoundInterface(nsnull), mIsSoundInitialized(PR_FALSE)
{ {
} }
@ -281,7 +280,7 @@ nsTypeAheadFind::FindItNow(nsIPresShell *aPresShell,
mFoundLink = nsnull; mFoundLink = nsnull;
nsCOMPtr<nsISelection> selection; nsCOMPtr<nsISelection> selection;
nsCOMPtr<nsISelectionController> selectionController; nsCOMPtr<nsISelectionController> selectionController;
nsCOMPtr<nsIPresShell> startingPresShell (do_QueryReferent(mPresShell)); nsCOMPtr<nsIPresShell> startingPresShell (GetPresShell());
if (!startingPresShell) { if (!startingPresShell) {
nsCOMPtr<nsIDocShell> ds = do_QueryReferent(mDocShell); nsCOMPtr<nsIDocShell> ds = do_QueryReferent(mDocShell);
NS_ENSURE_TRUE(ds, NS_ERROR_FAILURE); NS_ENSURE_TRUE(ds, NS_ERROR_FAILURE);
@ -442,7 +441,10 @@ nsTypeAheadFind::FindItNow(nsIPresShell *aPresShell,
} }
} }
*aResult = hasWrapped ? FIND_WRAPPED : FIND_FOUND; if (hasWrapped)
*aResult = FIND_WRAPPED;
else
*aResult = FIND_FOUND;
return NS_OK; return NS_OK;
} }
@ -603,7 +605,7 @@ nsTypeAheadFind::GetSearchContainers(nsISupports *aContainer,
// Consider current selection as null if // Consider current selection as null if
// it's not in the currently focused document // it's not in the currently focused document
nsCOMPtr<nsIDOMRange> currentSelectionRange; nsCOMPtr<nsIDOMRange> currentSelectionRange;
nsCOMPtr<nsIPresShell> selectionPresShell (do_QueryReferent(mPresShell)); nsCOMPtr<nsIPresShell> selectionPresShell (GetPresShell());
if (aCanUseDocSelection && selectionPresShell && selectionPresShell == presShell) { if (aCanUseDocSelection && selectionPresShell && selectionPresShell == presShell) {
nsCOMPtr<nsISelection> selection; nsCOMPtr<nsISelection> selection;
nsCOMPtr<nsISelectionController> selectionController; nsCOMPtr<nsISelectionController> selectionController;
@ -819,7 +821,7 @@ nsTypeAheadFind::Find(const nsAString& aSearchString, PRBool aLinksOnly, PRUint1
nsCOMPtr<nsISelection> selection; nsCOMPtr<nsISelection> selection;
nsCOMPtr<nsISelectionController> selectionController; nsCOMPtr<nsISelectionController> selectionController;
nsCOMPtr<nsIPresShell> presShell (do_QueryReferent(mPresShell)); nsCOMPtr<nsIPresShell> presShell (GetPresShell());
if (!presShell) { if (!presShell) {
nsCOMPtr<nsIDocShell> ds (do_QueryReferent(mDocShell)); nsCOMPtr<nsIDocShell> ds (do_QueryReferent(mDocShell));
NS_ENSURE_TRUE(ds, NS_ERROR_FAILURE); NS_ENSURE_TRUE(ds, NS_ERROR_FAILURE);
@ -1136,3 +1138,21 @@ nsTypeAheadFind::IsRangeVisible(nsIPresShell *aPresShell,
return PR_FALSE; return PR_FALSE;
} }
already_AddRefed<nsIPresShell>
nsTypeAheadFind::GetPresShell()
{
if (!mPresShell)
return nsnull;
nsIPresShell *shell = nsnull;
CallQueryReferent(mPresShell.get(), &shell);
if (shell) {
nsPresContext *pc = shell->GetPresContext();
if (!pc || !nsCOMPtr<nsISupports>(pc->GetContainer())) {
NS_RELEASE(shell);
}
}
return shell;
}

Просмотреть файл

@ -107,7 +107,11 @@ protected:
nsPresContext **aPresContext); nsPresContext **aPresContext);
nsresult Cancel(); nsresult Cancel();
// Get the pres shell from mPresShell and return it only if it is still
// attached to the DOM window.
NS_HIDDEN_(already_AddRefed<nsIPresShell>) GetPresShell();
// Current find state // Current find state
nsString mTypeAheadBuffer; nsString mTypeAheadBuffer;
nsCString mNotFoundSoundURL; nsCString mNotFoundSoundURL;