1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132
|
/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
/* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
#include "nsCycleCollectionParticipant.h"
#include "nsISelectionController.h"
#include "nsIController.h"
#include "nsIControllers.h"
#include "nsIObserver.h"
#include "nsUnicharUtils.h"
#include "nsIFind.h"
#include "nsIWebBrowserFind.h"
#include "nsWeakReference.h"
#include "nsISelection.h"
#include "nsIDOMRange.h"
#include "nsIDocShellTreeItem.h"
#include "nsITypeAheadFind.h"
#include "nsISound.h"
class nsIPresShell;
class nsPresContext;
#define TYPEAHEADFIND_NOTFOUND_WAV_URL \
"chrome://global/content/notfound.wav"
class nsTypeAheadFind : public nsITypeAheadFind,
public nsIObserver,
public nsSupportsWeakReference
{
public:
nsTypeAheadFind();
NS_DECL_CYCLE_COLLECTING_ISUPPORTS
NS_DECL_NSITYPEAHEADFIND
NS_DECL_NSIOBSERVER
NS_DECL_CYCLE_COLLECTION_CLASS_AMBIGUOUS(nsTypeAheadFind, nsITypeAheadFind)
protected:
virtual ~nsTypeAheadFind();
nsresult PrefsReset();
void SaveFind();
void PlayNotFoundSound();
nsresult GetWebBrowserFind(nsIDocShell *aDocShell,
nsIWebBrowserFind **aWebBrowserFind);
void RangeStartsInsideLink(nsIDOMRange *aRange, nsIPresShell *aPresShell,
bool *aIsInsideLink, bool *aIsStartingLink);
void GetSelection(nsIPresShell *aPresShell, nsISelectionController **aSelCon,
nsISelection **aDomSel);
// *aNewRange may not be collapsed. If you want to collapse it in a
// particular way, you need to do it yourself.
bool IsRangeVisible(nsIPresShell *aPresShell, nsPresContext *aPresContext,
nsIDOMRange *aRange, bool aMustBeVisible,
bool aGetTopVisibleLeaf, nsIDOMRange **aNewRange,
bool *aUsesIndependentSelection);
nsresult FindItNow(nsIPresShell *aPresShell, bool aIsLinksOnly,
bool aIsFirstVisiblePreferred, bool aFindPrev,
uint16_t* aResult);
nsresult GetSearchContainers(nsISupports *aContainer,
nsISelectionController *aSelectionController,
bool aIsFirstVisiblePreferred,
bool aFindPrev, nsIPresShell **aPresShell,
nsPresContext **aPresContext);
// Get the pres shell from mPresShell and return it only if it is still
// attached to the DOM window.
already_AddRefed<nsIPresShell> GetPresShell();
void ReleaseStrongMemberVariables();
// Current find state
nsString mTypeAheadBuffer;
nsCString mNotFoundSoundURL;
// PRBools are used instead of PRPackedBools because the address of the
// boolean variable is getting passed into a method.
bool mStartLinksOnlyPref;
bool mCaretBrowsingOn;
bool mDidAddObservers;
nsCOMPtr<nsIDOMElement> mFoundLink; // Most recent elem found, if a link
nsCOMPtr<nsIDOMElement> mFoundEditable; // Most recent elem found, if editable
nsCOMPtr<nsIDOMRange> mFoundRange; // Most recent range found
nsCOMPtr<nsIDOMWindow> mCurrentWindow;
// mLastFindLength is the character length of the last find string. It is used for
// disabling the "not found" sound when using backspace or delete
uint32_t mLastFindLength;
// Sound is played asynchronously on some platforms.
// If we destroy mSoundInterface before sound has played, it won't play
nsCOMPtr<nsISound> mSoundInterface;
bool mIsSoundInitialized;
// where selection was when user started the find
nsCOMPtr<nsIDOMRange> mStartFindRange;
nsCOMPtr<nsIDOMRange> mSearchRange;
nsCOMPtr<nsIDOMRange> mStartPointRange;
nsCOMPtr<nsIDOMRange> mEndPointRange;
// Cached useful interfaces
nsCOMPtr<nsIFind> mFind;
bool mCaseSensitive;
bool EnsureFind() {
if (mFind) {
return true;
}
mFind = do_CreateInstance("@mozilla.org/embedcomp/rangefind;1");
if (!mFind) {
return false;
}
mFind->SetCaseSensitive(mCaseSensitive);
mFind->SetWordBreaker(nullptr);
return true;
}
nsCOMPtr<nsIWebBrowserFind> mWebBrowserFind;
// The focused content window that we're listening to and its cached objects
nsWeakPtr mDocShell;
nsWeakPtr mPresShell;
nsWeakPtr mSelectionController;
// Most recent match's controller
};
|