Bug 239372 ESM caches profile preferences and constantly gets others

r=bryner sr=bz
This commit is contained in:
timeless%mozdev.org 2004-04-13 06:41:35 +00:00
Родитель b95abd42f8
Коммит 492beea450
2 изменённых файлов: 114 добавлений и 74 удалений

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

@ -140,10 +140,28 @@ nsIContent * gLastFocusedContent = 0; // Strong reference
nsIDocument * gLastFocusedDocument = 0; // Strong reference nsIDocument * gLastFocusedDocument = 0; // Strong reference
nsIPresContext* gLastFocusedPresContext = 0; // Weak reference nsIPresContext* gLastFocusedPresContext = 0; // Weak reference
PRInt8 nsEventStateManager::sTextfieldSelectModel = eTextfieldSelect_unset; // Tab focus model bit field:
enum nsTabFocusModel {
//eTabFocus_textControlsMask = (1<<0), // unused - textboxes always tabbable
eTabFocus_formElementsMask = (1<<1), // non-text form elements
eTabFocus_linksMask = (1<<2), // links
eTabFocus_any = 1 + (1<<1) + (1<<2) // everything that can be focused
};
PRUint32 nsEventStateManager::mInstanceCount = 0; enum nsTextfieldSelectModel {
PRInt32 nsEventStateManager::gGeneralAccesskeyModifier = -1; // magic value of -1 means uninitialized eTextfieldSelect_unset = -1,
eTextfieldSelect_manual = 0,
eTextfieldSelect_auto = 1 // select textfields when focused with keyboard
};
// Tab focus policy (static, constant across the app):
// Which types of elements are in the tab order?
static PRInt8 sTextfieldSelectModel = eTextfieldSelect_unset;
static PRBool sLeftClickOnly = PR_TRUE;
static PRBool sKeyCausesActivation = PR_TRUE;
static PRUint32 sESMInstanceCount = 0;
static PRInt32 sGeneralAccesskeyModifier = -1; // magic value of -1 means uninitialized
static PRInt32 sTabFocusModel = eTabFocus_any;
enum { enum {
MOUSE_SCROLL_N_LINES, MOUSE_SCROLL_N_LINES,
@ -218,7 +236,6 @@ nsEventStateManager::nsEventStateManager()
mCurrentTabIndex = 0; mCurrentTabIndex = 0;
mAccessKeys = nsnull; mAccessKeys = nsnull;
mBrowseWithCaret = PR_FALSE; mBrowseWithCaret = PR_FALSE;
mLeftClickOnly = PR_TRUE;
mNormalLMouseEventInProcess = PR_FALSE; mNormalLMouseEventInProcess = PR_FALSE;
mTabbedThroughDocument = PR_FALSE; mTabbedThroughDocument = PR_FALSE;
@ -226,7 +243,7 @@ nsEventStateManager::nsEventStateManager()
mEventDownWidget = nsnull; mEventDownWidget = nsnull;
#endif #endif
++mInstanceCount; ++sESMInstanceCount;
} }
NS_IMETHODIMP NS_IMETHODIMP
@ -243,19 +260,37 @@ nsEventStateManager::Init()
rv = getPrefBranch(); rv = getPrefBranch();
if (NS_SUCCEEDED(rv)) { if (NS_SUCCEEDED(rv)) {
mPrefBranch->GetBoolPref("nglayout.events.dispatchLeftClickOnly", if (sESMInstanceCount == 1) {
&mLeftClickOnly); mPrefBranch->GetBoolPref("nglayout.events.dispatchLeftClickOnly",
&sLeftClickOnly);
// magic value of -1 means uninitialized
if (nsEventStateManager::gGeneralAccesskeyModifier == -1) {
mPrefBranch->GetIntPref("ui.key.generalAccessKey", mPrefBranch->GetIntPref("ui.key.generalAccessKey",
&nsEventStateManager::gGeneralAccesskeyModifier); &sGeneralAccesskeyModifier);
}
mPrefBranch->GetIntPref("accessibility.tabfocus", &sTabFocusModel);
}
mPrefBranch->AddObserver("accessibility.accesskeycausesactivation", this, PR_TRUE);
mPrefBranch->AddObserver("accessibility.browsewithcaret", this, PR_TRUE); mPrefBranch->AddObserver("accessibility.browsewithcaret", this, PR_TRUE);
mPrefBranch->AddObserver("accessibility.tabfocus", this, PR_TRUE);
mPrefBranch->AddObserver("nglayout.events.dispatchLeftClickOnly", this, PR_TRUE);
mPrefBranch->AddObserver("ui.key.generalAccessKey", this, PR_TRUE);
#if 0
mPrefBranch->AddObserver("mousewheel.withaltkey.action", this, PR_TRUE);
mPrefBranch->AddObserver("mousewheel.withaltkey.numlines", this, PR_TRUE);
mPrefBranch->AddObserver("mousewheel.withaltkey.sysnumlines", this, PR_TRUE);
mPrefBranch->AddObserver("mousewheel.withcontrolkey.action", this, PR_TRUE);
mPrefBranch->AddObserver("mousewheel.withcontrolkey.numlines", this, PR_TRUE);
mPrefBranch->AddObserver("mousewheel.withcontrolkey.sysnumlines", this, PR_TRUE);
mPrefBranch->AddObserver("mousewheel.withnokey.action", this, PR_TRUE);
mPrefBranch->AddObserver("mousewheel.withnokey.numlines", this, PR_TRUE);
mPrefBranch->AddObserver("mousewheel.withnokey.sysnumlines", this, PR_TRUE);
mPrefBranch->AddObserver("mousewheel.withshiftkey.action", this, PR_TRUE);
mPrefBranch->AddObserver("mousewheel.withshiftkey.numlines", this, PR_TRUE);
mPrefBranch->AddObserver("mousewheel.withshiftkey.sysnumlines", this, PR_TRUE);
#endif
} }
if (nsEventStateManager::sTextfieldSelectModel == eTextfieldSelect_unset) { if (sTextfieldSelectModel == eTextfieldSelect_unset) {
nsCOMPtr<nsILookAndFeel> lookNFeel(do_GetService(kLookAndFeelCID)); nsCOMPtr<nsILookAndFeel> lookNFeel(do_GetService(kLookAndFeelCID));
PRInt32 selectTextfieldsOnKeyFocus = 0; PRInt32 selectTextfieldsOnKeyFocus = 0;
lookNFeel->GetMetric(nsILookAndFeel::eMetric_SelectTextfieldsOnKeyFocus, lookNFeel->GetMetric(nsILookAndFeel::eMetric_SelectTextfieldsOnKeyFocus,
@ -276,8 +311,8 @@ nsEventStateManager::~nsEventStateManager()
} }
#endif #endif
--mInstanceCount; --sESMInstanceCount;
if(mInstanceCount == 0) { if(sESMInstanceCount == 0) {
NS_IF_RELEASE(gLastFocusedContent); NS_IF_RELEASE(gLastFocusedContent);
NS_IF_RELEASE(gLastFocusedDocument); NS_IF_RELEASE(gLastFocusedDocument);
} }
@ -297,10 +332,9 @@ nsEventStateManager::~nsEventStateManager()
nsCOMPtr<nsIObserverService> observerService = nsCOMPtr<nsIObserverService> observerService =
do_GetService("@mozilla.org/observer-service;1", &rv); do_GetService("@mozilla.org/observer-service;1", &rv);
if (NS_SUCCEEDED(rv)) if (NS_SUCCEEDED(rv)) {
{ observerService->RemoveObserver(this, NS_XPCOM_SHUTDOWN_OBSERVER_ID);
observerService->RemoveObserver(this, NS_XPCOM_SHUTDOWN_OBSERVER_ID); }
}
} }
} }
@ -308,9 +342,28 @@ nsEventStateManager::~nsEventStateManager()
nsresult nsresult
nsEventStateManager::Shutdown() nsEventStateManager::Shutdown()
{ {
mPrefBranch->RemoveObserver("accessibility.browsewithcaret", this); if (mPrefBranch) {
mPrefBranch->RemoveObserver("accessibility.accesskeycausesactivation", this);
mPrefBranch = nsnull; mPrefBranch->RemoveObserver("accessibility.browsewithcaret", this);
mPrefBranch->RemoveObserver("accessibility.tabfocus", this);
mPrefBranch->RemoveObserver("nglayout.events.dispatchLeftClickOnly", this);
mPrefBranch->RemoveObserver("ui.key.generalAccessKey", this);
#if 0
mPrefBranch->RemoveObserver("mousewheel.withshiftkey.action", this);
mPrefBranch->RemoveObserver("mousewheel.withshiftkey.numlines", this);
mPrefBranch->RemoveObserver("mousewheel.withshiftkey.sysnumlines", this);
mPrefBranch->RemoveObserver("mousewheel.withcontrolkey.action", this);
mPrefBranch->RemoveObserver("mousewheel.withcontrolkey.numlines", this);
mPrefBranch->RemoveObserver("mousewheel.withcontrolkey.sysnumlines", this);
mPrefBranch->RemoveObserver("mousewheel.withaltkey.action", this);
mPrefBranch->RemoveObserver("mousewheel.withaltkey.numlines", this);
mPrefBranch->RemoveObserver("mousewheel.withaltkey.sysnumlines", this);
mPrefBranch->RemoveObserver("mousewheel.withnokey.action", this);
mPrefBranch->RemoveObserver("mousewheel.withnokey.numlines", this);
mPrefBranch->RemoveObserver("mousewheel.withnokey.sysnumlines", this);
#endif
mPrefBranch = nsnull;
}
m_haveShutdown = PR_TRUE; m_haveShutdown = PR_TRUE;
return NS_OK; return NS_OK;
@ -340,9 +393,37 @@ nsEventStateManager::Observe(nsISupports *aSubject,
if (!nsCRT::strcmp(aTopic, NS_XPCOM_SHUTDOWN_OBSERVER_ID)) if (!nsCRT::strcmp(aTopic, NS_XPCOM_SHUTDOWN_OBSERVER_ID))
Shutdown(); Shutdown();
else if (!nsCRT::strcmp(aTopic, NS_PREFBRANCH_PREFCHANGE_TOPIC_ID)) { else if (!nsCRT::strcmp(aTopic, NS_PREFBRANCH_PREFCHANGE_TOPIC_ID)) {
if (someData && nsDependentString(someData).Equals(NS_LITERAL_STRING("accessibility.browsewithcaret"))) { if (!someData)
return NS_OK;
nsDependentString data(someData);
if (data.Equals(NS_LITERAL_STRING("accessibility.accesskeycausesactivation"))) {
mPrefBranch->GetBoolPref("accessibility.accesskeycausesactivation", &sKeyCausesActivation);
} else if (data.Equals(NS_LITERAL_STRING("accessibility.browsewithcaret"))) {
PRBool browseWithCaret; PRBool browseWithCaret;
ResetBrowseWithCaret(&browseWithCaret); ResetBrowseWithCaret(&browseWithCaret);
} else if (data.Equals(NS_LITERAL_STRING("accessibility.tabfocus"))) {
mPrefBranch->GetIntPref("accessibility.tabfocus", &sTabFocusModel);
} else if (data.Equals(NS_LITERAL_STRING("nglayout.events.dispatchLeftClickOnly"))) {
mPrefBranch->GetBoolPref("nglayout.events.dispatchLeftClickOnly",
&sLeftClickOnly);
} else if (data.Equals(NS_LITERAL_STRING("ui.key.generalAccessKey"))) {
mPrefBranch->GetIntPref("ui.key.generalAccessKey",
&sGeneralAccesskeyModifier);
#if 0
} else if (data.Equals(NS_LITERAL_STRING("mousewheel.withaltkey.action"))) {
} else if (data.Equals(NS_LITERAL_STRING("mousewheel.withaltkey.numlines"))) {
} else if (data.Equals(NS_LITERAL_STRING("mousewheel.withaltkey.sysnumlines"))) {
} else if (data.Equals(NS_LITERAL_STRING("mousewheel.withcontrolkey.action"))) {
} else if (data.Equals(NS_LITERAL_STRING("mousewheel.withcontrolkey.numlines"))) {
} else if (data.Equals(NS_LITERAL_STRING("mousewheel.withcontrolkey.sysnumlines"))) {
} else if (data.Equals(NS_LITERAL_STRING("mousewheel.withshiftkey.action"))) {
} else if (data.Equals(NS_LITERAL_STRING("mousewheel.withshiftkey.numlines"))) {
} else if (data.Equals(NS_LITERAL_STRING("mousewheel.withshiftkey.sysnumlines"))) {
} else if (data.Equals(NS_LITERAL_STRING("mousewheel.withnokey.action"))) {
} else if (data.Equals(NS_LITERAL_STRING("mousewheel.withnokey.numlines"))) {
} else if (data.Equals(NS_LITERAL_STRING("mousewheel.withnokey.sysnumlines"))) {
#endif
} }
} }
@ -859,7 +940,7 @@ nsEventStateManager::PreHandleEvent(nsIPresContext* aPresContext,
nsKeyEvent* keyEvent = (nsKeyEvent*)aEvent; nsKeyEvent* keyEvent = (nsKeyEvent*)aEvent;
PRBool isSpecialAccessKeyDown = PR_FALSE; PRBool isSpecialAccessKeyDown = PR_FALSE;
switch (gGeneralAccesskeyModifier) { switch (sGeneralAccesskeyModifier) {
case nsIDOMKeyEvent::DOM_VK_CONTROL: isSpecialAccessKeyDown = keyEvent->isControl; break; case nsIDOMKeyEvent::DOM_VK_CONTROL: isSpecialAccessKeyDown = keyEvent->isControl; break;
case nsIDOMKeyEvent::DOM_VK_ALT: isSpecialAccessKeyDown = keyEvent->isAlt; break; case nsIDOMKeyEvent::DOM_VK_ALT: isSpecialAccessKeyDown = keyEvent->isAlt; break;
case nsIDOMKeyEvent::DOM_VK_META: isSpecialAccessKeyDown = keyEvent->isMeta; break; case nsIDOMKeyEvent::DOM_VK_META: isSpecialAccessKeyDown = keyEvent->isMeta; break;
@ -964,14 +1045,7 @@ nsEventStateManager::HandleAccessKey(nsIPresContext* aPresContext,
// So for now we'll settle for A) Set focus // So for now we'll settle for A) Set focus
ChangeFocus(content, eEventFocusedByKey); ChangeFocus(content, eEventFocusedByKey);
nsresult rv = getPrefBranch(); if (sKeyCausesActivation) {
PRBool activate = PR_TRUE;
if (NS_SUCCEEDED(rv)) {
mPrefBranch->GetBoolPref("accessibility.accesskeycausesactivation", &activate);
}
if (activate) {
// B) Click on it if the users prefs indicate to do so. // B) Click on it if the users prefs indicate to do so.
nsEventStatus status = nsEventStatus_eIgnore; nsEventStatus status = nsEventStatus_eIgnore;
nsMouseEvent event(NS_MOUSE_LEFT_CLICK); nsMouseEvent event(NS_MOUSE_LEFT_CLICK);
@ -1142,7 +1216,7 @@ nsEventStateManager::KillClickHoldTimer()
// This fires after the mouse has been down for a certain length of time. // This fires after the mouse has been down for a certain length of time.
// //
void void
nsEventStateManager::sClickHoldCallback(nsITimer *aTimer, void* aESM) sClickHoldCallback(nsITimer *aTimer, void* aESM)
{ {
nsEventStateManager* self = NS_STATIC_CAST(nsEventStateManager*, aESM); nsEventStateManager* self = NS_STATIC_CAST(nsEventStateManager*, aESM);
if ( self ) if ( self )
@ -2834,11 +2908,11 @@ nsEventStateManager::CheckForAndDispatchClick(nsIPresContext* aPresContext,
break; break;
case NS_MOUSE_MIDDLE_BUTTON_UP: case NS_MOUSE_MIDDLE_BUTTON_UP:
eventMsg = NS_MOUSE_MIDDLE_CLICK; eventMsg = NS_MOUSE_MIDDLE_CLICK;
flags |= mLeftClickOnly ? NS_EVENT_FLAG_NO_CONTENT_DISPATCH : NS_EVENT_FLAG_NONE; flags |= sLeftClickOnly ? NS_EVENT_FLAG_NO_CONTENT_DISPATCH : NS_EVENT_FLAG_NONE;
break; break;
case NS_MOUSE_RIGHT_BUTTON_UP: case NS_MOUSE_RIGHT_BUTTON_UP:
eventMsg = NS_MOUSE_RIGHT_CLICK; eventMsg = NS_MOUSE_RIGHT_CLICK;
flags |= mLeftClickOnly ? NS_EVENT_FLAG_NO_CONTENT_DISPATCH : NS_EVENT_FLAG_NONE; flags |= sLeftClickOnly ? NS_EVENT_FLAG_NO_CONTENT_DISPATCH : NS_EVENT_FLAG_NONE;
break; break;
} }
@ -3362,16 +3436,6 @@ nsEventStateManager::GetNextTabbableContent(nsIContent* aRootContent,
PRBool disabled = PR_TRUE; PRBool disabled = PR_TRUE;
PRBool hidden = PR_FALSE; PRBool hidden = PR_FALSE;
PRInt32 tabFocusModel = eTabFocus_any;
if (mPrefBranch) {
// This could be done via a pref observer, but because there are
// no static pref callbacks we'd have to create a singleton object
// just to observe this pref. Since mPrefBranch is already cached, and
// GetIntPref() is fairly fast, that would probably be overkill.
// This only happens once per tab press.
mPrefBranch->GetIntPref("accessibility.tabfocus", &tabFocusModel);
}
nsIAtom *tag = child->Tag(); nsIAtom *tag = child->Tag();
if (child->IsContentOfType(nsIContent::eHTML)) { if (child->IsContentOfType(nsIContent::eHTML)) {
if (tag == nsHTMLAtoms::input) { if (tag == nsHTMLAtoms::input) {
@ -3396,14 +3460,14 @@ nsEventStateManager::GetNextTabbableContent(nsIContent* aRootContent,
break; break;
default: default:
disabled = disabled =
disabled || !(tabFocusModel & eTabFocus_formElementsMask); disabled || !(sTabFocusModel & eTabFocus_formElementsMask);
break; break;
} }
} }
} }
else if (tag == nsHTMLAtoms::select) { else if (tag == nsHTMLAtoms::select) {
// Select counts as form but not as text // Select counts as form but not as text
disabled = !(tabFocusModel & eTabFocus_formElementsMask); disabled = !(sTabFocusModel & eTabFocus_formElementsMask);
if (!disabled) { if (!disabled) {
nsCOMPtr<nsIDOMHTMLSelectElement> nextSelect(do_QueryInterface(child)); nsCOMPtr<nsIDOMHTMLSelectElement> nextSelect(do_QueryInterface(child));
if (nextSelect) { if (nextSelect) {
@ -3425,7 +3489,7 @@ nsEventStateManager::GetNextTabbableContent(nsIContent* aRootContent,
} }
else if (tag == nsHTMLAtoms::a) { else if (tag == nsHTMLAtoms::a) {
// it's a link // it's a link
disabled = !(tabFocusModel & eTabFocus_linksMask); disabled = !(sTabFocusModel & eTabFocus_linksMask);
nsCOMPtr<nsIDOMHTMLAnchorElement> nextAnchor(do_QueryInterface(child)); nsCOMPtr<nsIDOMHTMLAnchorElement> nextAnchor(do_QueryInterface(child));
if (!disabled) { if (!disabled) {
if (nextAnchor) if (nextAnchor)
@ -3441,7 +3505,7 @@ nsEventStateManager::GetNextTabbableContent(nsIContent* aRootContent,
} }
else if (tag == nsHTMLAtoms::button) { else if (tag == nsHTMLAtoms::button) {
// Button counts as a form element but not as text // Button counts as a form element but not as text
disabled = !(tabFocusModel & eTabFocus_formElementsMask); disabled = !(sTabFocusModel & eTabFocus_formElementsMask);
if (!disabled) { if (!disabled) {
nsCOMPtr<nsIDOMHTMLButtonElement> nextButton(do_QueryInterface(child)); nsCOMPtr<nsIDOMHTMLButtonElement> nextButton(do_QueryInterface(child));
if (nextButton) { if (nextButton) {
@ -3453,7 +3517,7 @@ nsEventStateManager::GetNextTabbableContent(nsIContent* aRootContent,
else if (tag == nsHTMLAtoms::img) { else if (tag == nsHTMLAtoms::img) {
// Don't need to set disabled here, because if we // Don't need to set disabled here, because if we
// match an imagemap, we'll return from there. // match an imagemap, we'll return from there.
if (tabFocusModel & eTabFocus_linksMask) { if (sTabFocusModel & eTabFocus_linksMask) {
nsCOMPtr<nsIDOMHTMLImageElement> nextImage(do_QueryInterface(child)); nsCOMPtr<nsIDOMHTMLImageElement> nextImage(do_QueryInterface(child));
nsAutoString usemap; nsAutoString usemap;
if (nextImage) { if (nextImage) {
@ -3510,7 +3574,7 @@ nsEventStateManager::GetNextTabbableContent(nsIContent* aRootContent,
} }
else if (tag == nsHTMLAtoms::object) { else if (tag == nsHTMLAtoms::object) {
// OBJECT is treated as a form element. // OBJECT is treated as a form element.
disabled = !(tabFocusModel & eTabFocus_formElementsMask); disabled = !(sTabFocusModel & eTabFocus_formElementsMask);
if (!disabled) { if (!disabled) {
nsCOMPtr<nsIDOMHTMLObjectElement> nextObject(do_QueryInterface(child)); nsCOMPtr<nsIDOMHTMLObjectElement> nextObject(do_QueryInterface(child));
if (nextObject) if (nextObject)

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

@ -74,20 +74,6 @@ class nsEventStateManager : public nsSupportsWeakReference,
public nsIEventStateManager, public nsIEventStateManager,
public nsIObserver public nsIObserver
{ {
// Tab focus model bit field:
enum nsTabFocusModel {
//eTabFocus_textControlsMask = (1<<0), // unused - textboxes always tabbable
eTabFocus_formElementsMask = (1<<1), // non-text form elements
eTabFocus_linksMask = (1<<2), // links
eTabFocus_any = 1 + (1<<1) + (1<<2) // everything that can be focused
};
enum nsTextfieldSelectModel {
eTextfieldSelect_unset = -1,
eTextfieldSelect_manual = 0,
eTextfieldSelect_auto = 1 // select textfields when focused with keyboard
};
public: public:
nsEventStateManager(); nsEventStateManager();
virtual ~nsEventStateManager(); virtual ~nsEventStateManager();
@ -299,9 +285,6 @@ protected:
nsIPresContext* mPresContext; // Not refcnted nsIPresContext* mPresContext; // Not refcnted
nsCOMPtr<nsIDocument> mDocument; // Doesn't necessarily need to be owner nsCOMPtr<nsIDocument> mDocument; // Doesn't necessarily need to be owner
//Pref for dispatching middle and right clicks to content
PRBool mLeftClickOnly;
PRUint32 mLClickCount; PRUint32 mLClickCount;
PRUint32 mMClickCount; PRUint32 mMClickCount;
PRUint32 mRClickCount; PRUint32 mRClickCount;
@ -311,9 +294,6 @@ protected:
//Hashtable for accesskey support //Hashtable for accesskey support
nsSupportsHashtable *mAccessKeys; nsSupportsHashtable *mAccessKeys;
static PRUint32 mInstanceCount;
static PRInt32 gGeneralAccesskeyModifier;
// For preferences handling // For preferences handling
nsCOMPtr<nsIPrefBranchInternal> mPrefBranch; nsCOMPtr<nsIPrefBranchInternal> mPrefBranch;
PRPackedBool m_haveShutdown; PRPackedBool m_haveShutdown;
@ -329,10 +309,6 @@ protected:
// So we don't have to keep checking accessibility.browsewithcaret pref // So we don't have to keep checking accessibility.browsewithcaret pref
PRBool mBrowseWithCaret; PRBool mBrowseWithCaret;
// Tab focus policy (static, constant across the app):
// Which types of elements are in the tab order?
static PRInt8 sTextfieldSelectModel;
// Recursion guard for tabbing // Recursion guard for tabbing
PRBool mTabbedThroughDocument; PRBool mTabbedThroughDocument;
nsCOMArray<nsIDocShell> mTabbingFromDocShells; nsCOMArray<nsIDocShell> mTabbingFromDocShells;