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
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;
PRInt32 nsEventStateManager::gGeneralAccesskeyModifier = -1; // magic value of -1 means uninitialized
enum nsTextfieldSelectModel {
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 {
MOUSE_SCROLL_N_LINES,
@ -218,7 +236,6 @@ nsEventStateManager::nsEventStateManager()
mCurrentTabIndex = 0;
mAccessKeys = nsnull;
mBrowseWithCaret = PR_FALSE;
mLeftClickOnly = PR_TRUE;
mNormalLMouseEventInProcess = PR_FALSE;
mTabbedThroughDocument = PR_FALSE;
@ -226,7 +243,7 @@ nsEventStateManager::nsEventStateManager()
mEventDownWidget = nsnull;
#endif
++mInstanceCount;
++sESMInstanceCount;
}
NS_IMETHODIMP
@ -243,19 +260,37 @@ nsEventStateManager::Init()
rv = getPrefBranch();
if (NS_SUCCEEDED(rv)) {
mPrefBranch->GetBoolPref("nglayout.events.dispatchLeftClickOnly",
&mLeftClickOnly);
if (sESMInstanceCount == 1) {
mPrefBranch->GetBoolPref("nglayout.events.dispatchLeftClickOnly",
&sLeftClickOnly);
// magic value of -1 means uninitialized
if (nsEventStateManager::gGeneralAccesskeyModifier == -1) {
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.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));
PRInt32 selectTextfieldsOnKeyFocus = 0;
lookNFeel->GetMetric(nsILookAndFeel::eMetric_SelectTextfieldsOnKeyFocus,
@ -276,8 +311,8 @@ nsEventStateManager::~nsEventStateManager()
}
#endif
--mInstanceCount;
if(mInstanceCount == 0) {
--sESMInstanceCount;
if(sESMInstanceCount == 0) {
NS_IF_RELEASE(gLastFocusedContent);
NS_IF_RELEASE(gLastFocusedDocument);
}
@ -297,10 +332,9 @@ nsEventStateManager::~nsEventStateManager()
nsCOMPtr<nsIObserverService> observerService =
do_GetService("@mozilla.org/observer-service;1", &rv);
if (NS_SUCCEEDED(rv))
{
observerService->RemoveObserver(this, NS_XPCOM_SHUTDOWN_OBSERVER_ID);
}
if (NS_SUCCEEDED(rv)) {
observerService->RemoveObserver(this, NS_XPCOM_SHUTDOWN_OBSERVER_ID);
}
}
}
@ -308,9 +342,28 @@ nsEventStateManager::~nsEventStateManager()
nsresult
nsEventStateManager::Shutdown()
{
mPrefBranch->RemoveObserver("accessibility.browsewithcaret", this);
mPrefBranch = nsnull;
if (mPrefBranch) {
mPrefBranch->RemoveObserver("accessibility.accesskeycausesactivation", this);
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;
return NS_OK;
@ -340,9 +393,37 @@ nsEventStateManager::Observe(nsISupports *aSubject,
if (!nsCRT::strcmp(aTopic, NS_XPCOM_SHUTDOWN_OBSERVER_ID))
Shutdown();
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;
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;
PRBool isSpecialAccessKeyDown = PR_FALSE;
switch (gGeneralAccesskeyModifier) {
switch (sGeneralAccesskeyModifier) {
case nsIDOMKeyEvent::DOM_VK_CONTROL: isSpecialAccessKeyDown = keyEvent->isControl; break;
case nsIDOMKeyEvent::DOM_VK_ALT: isSpecialAccessKeyDown = keyEvent->isAlt; 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
ChangeFocus(content, eEventFocusedByKey);
nsresult rv = getPrefBranch();
PRBool activate = PR_TRUE;
if (NS_SUCCEEDED(rv)) {
mPrefBranch->GetBoolPref("accessibility.accesskeycausesactivation", &activate);
}
if (activate) {
if (sKeyCausesActivation) {
// B) Click on it if the users prefs indicate to do so.
nsEventStatus status = nsEventStatus_eIgnore;
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.
//
void
nsEventStateManager::sClickHoldCallback(nsITimer *aTimer, void* aESM)
sClickHoldCallback(nsITimer *aTimer, void* aESM)
{
nsEventStateManager* self = NS_STATIC_CAST(nsEventStateManager*, aESM);
if ( self )
@ -2834,11 +2908,11 @@ nsEventStateManager::CheckForAndDispatchClick(nsIPresContext* aPresContext,
break;
case NS_MOUSE_MIDDLE_BUTTON_UP:
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;
case NS_MOUSE_RIGHT_BUTTON_UP:
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;
}
@ -3362,16 +3436,6 @@ nsEventStateManager::GetNextTabbableContent(nsIContent* aRootContent,
PRBool disabled = PR_TRUE;
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();
if (child->IsContentOfType(nsIContent::eHTML)) {
if (tag == nsHTMLAtoms::input) {
@ -3396,14 +3460,14 @@ nsEventStateManager::GetNextTabbableContent(nsIContent* aRootContent,
break;
default:
disabled =
disabled || !(tabFocusModel & eTabFocus_formElementsMask);
disabled || !(sTabFocusModel & eTabFocus_formElementsMask);
break;
}
}
}
else if (tag == nsHTMLAtoms::select) {
// Select counts as form but not as text
disabled = !(tabFocusModel & eTabFocus_formElementsMask);
disabled = !(sTabFocusModel & eTabFocus_formElementsMask);
if (!disabled) {
nsCOMPtr<nsIDOMHTMLSelectElement> nextSelect(do_QueryInterface(child));
if (nextSelect) {
@ -3425,7 +3489,7 @@ nsEventStateManager::GetNextTabbableContent(nsIContent* aRootContent,
}
else if (tag == nsHTMLAtoms::a) {
// it's a link
disabled = !(tabFocusModel & eTabFocus_linksMask);
disabled = !(sTabFocusModel & eTabFocus_linksMask);
nsCOMPtr<nsIDOMHTMLAnchorElement> nextAnchor(do_QueryInterface(child));
if (!disabled) {
if (nextAnchor)
@ -3441,7 +3505,7 @@ nsEventStateManager::GetNextTabbableContent(nsIContent* aRootContent,
}
else if (tag == nsHTMLAtoms::button) {
// Button counts as a form element but not as text
disabled = !(tabFocusModel & eTabFocus_formElementsMask);
disabled = !(sTabFocusModel & eTabFocus_formElementsMask);
if (!disabled) {
nsCOMPtr<nsIDOMHTMLButtonElement> nextButton(do_QueryInterface(child));
if (nextButton) {
@ -3453,7 +3517,7 @@ nsEventStateManager::GetNextTabbableContent(nsIContent* aRootContent,
else if (tag == nsHTMLAtoms::img) {
// Don't need to set disabled here, because if we
// match an imagemap, we'll return from there.
if (tabFocusModel & eTabFocus_linksMask) {
if (sTabFocusModel & eTabFocus_linksMask) {
nsCOMPtr<nsIDOMHTMLImageElement> nextImage(do_QueryInterface(child));
nsAutoString usemap;
if (nextImage) {
@ -3510,7 +3574,7 @@ nsEventStateManager::GetNextTabbableContent(nsIContent* aRootContent,
}
else if (tag == nsHTMLAtoms::object) {
// OBJECT is treated as a form element.
disabled = !(tabFocusModel & eTabFocus_formElementsMask);
disabled = !(sTabFocusModel & eTabFocus_formElementsMask);
if (!disabled) {
nsCOMPtr<nsIDOMHTMLObjectElement> nextObject(do_QueryInterface(child));
if (nextObject)

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

@ -74,20 +74,6 @@ class nsEventStateManager : public nsSupportsWeakReference,
public nsIEventStateManager,
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:
nsEventStateManager();
virtual ~nsEventStateManager();
@ -299,9 +285,6 @@ protected:
nsIPresContext* mPresContext; // Not refcnted
nsCOMPtr<nsIDocument> mDocument; // Doesn't necessarily need to be owner
//Pref for dispatching middle and right clicks to content
PRBool mLeftClickOnly;
PRUint32 mLClickCount;
PRUint32 mMClickCount;
PRUint32 mRClickCount;
@ -311,9 +294,6 @@ protected:
//Hashtable for accesskey support
nsSupportsHashtable *mAccessKeys;
static PRUint32 mInstanceCount;
static PRInt32 gGeneralAccesskeyModifier;
// For preferences handling
nsCOMPtr<nsIPrefBranchInternal> mPrefBranch;
PRPackedBool m_haveShutdown;
@ -329,10 +309,6 @@ protected:
// So we don't have to keep checking accessibility.browsewithcaret pref
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
PRBool mTabbedThroughDocument;
nsCOMArray<nsIDocShell> mTabbingFromDocShells;