Bug 595036 (2/2) - Introduce nsEventStates class to represent event states. r+a=bz

This commit is contained in:
Mounir Lamouri 2010-10-20 13:26:32 +02:00
Родитель 12794928a0
Коммит 06426cc202
77 изменённых файлов: 748 добавлений и 529 удалений

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

@ -686,16 +686,16 @@ nsAccessible::GetStateInternal(PRUint32 *aState, PRUint32 *aExtraState)
if (aExtraState)
*aExtraState = 0;
PRInt32 intrinsicState = mContent->IntrinsicState();
nsEventStates intrinsicState = mContent->IntrinsicState();
if (intrinsicState & NS_EVENT_STATE_INVALID)
if (intrinsicState.HasState(NS_EVENT_STATE_INVALID))
*aState |= nsIAccessibleStates::STATE_INVALID;
if (intrinsicState & NS_EVENT_STATE_REQUIRED)
if (intrinsicState.HasState(NS_EVENT_STATE_REQUIRED))
*aState |= nsIAccessibleStates::STATE_REQUIRED;
PRBool disabled = mContent->IsHTML() ?
(intrinsicState & NS_EVENT_STATE_DISABLED) :
(intrinsicState.HasState(NS_EVENT_STATE_DISABLED)) :
(mContent->AttrValueIs(kNameSpaceID_None,
nsAccessibilityAtoms::disabled,
nsAccessibilityAtoms::_true,

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

@ -1249,9 +1249,9 @@ void nsDocAccessible::ContentAppended(nsIDocument *aDocument,
void nsDocAccessible::ContentStatesChanged(nsIDocument* aDocument,
nsIContent* aContent1,
nsIContent* aContent2,
PRInt32 aStateMask)
nsEventStates aStateMask)
{
if (0 == (aStateMask & NS_EVENT_STATE_CHECKED)) {
if (!aStateMask.HasState(NS_EVENT_STATE_CHECKED)) {
return;
}
@ -1260,7 +1260,7 @@ void nsDocAccessible::ContentStatesChanged(nsIDocument* aDocument,
}
void nsDocAccessible::DocumentStatesChanged(nsIDocument* aDocument,
PRInt32 aStateMask)
nsEventStates aStateMask)
{
}

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

@ -71,8 +71,8 @@ enum nsLinkState {
// IID for the nsIContent interface
#define NS_ICONTENT_IID \
{ 0x64ef8589, 0xbd19, 0x40f4, \
{ 0xa9, 0x61, 0x47, 0x89, 0xe0, 0x8d, 0xb0, 0x49 } }
{ 0x71afb9e6, 0xe8a7, 0x475d, \
{ 0x89, 0xc4, 0xe4, 0x62, 0x21, 0xeb, 0xe1, 0xa4 } }
/**
* A node of content in a document's content model. This interface
@ -787,9 +787,7 @@ public:
* content state, use nsIEventStateManager. Also see nsIEventStateManager
* for the possible bits that could be set here.
*/
// XXXbz this is PRInt32 because all the ESM content state APIs use
// PRInt32. We should really use PRUint32 instead.
virtual PRInt32 IntrinsicState() const;
virtual nsEventStates IntrinsicState() const;
/**
* Get the ID of this content node (the atom corresponding to the

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

@ -65,6 +65,7 @@
#include "nsIScriptGlobalObject.h"
#include "nsIDocumentEncoder.h"
#include "nsIAnimationFrameListener.h"
#include "nsEventStates.h"
class nsIContent;
class nsPresContext;
@ -120,8 +121,8 @@ class Element;
#define NS_IDOCUMENT_IID \
{ 0x73d79167, 0xacba, 0x46eb, \
{ 0xad, 0x45, 0xa3, 0x4b, 0x92, 0xf6, 0x01, 0x5b } }
{ 0x7fb1e97d, 0xbd2c, 0x47cf, \
{ 0xa3, 0x05, 0x5b, 0x31, 0xd4, 0x1d, 0x3a, 0x52 } }
// Flag for AddStyleSheet().
#define NS_STYLESHEET_FROM_CATALOG (1 << 0)
@ -129,9 +130,9 @@ class Element;
// Document states
// RTL locale: specific to the XUL localedir attribute
#define NS_DOCUMENT_STATE_RTL_LOCALE (1 << 0)
#define NS_DOCUMENT_STATE_RTL_LOCALE NS_DEFINE_EVENT_STATE_MACRO(0)
// Window activation status
#define NS_DOCUMENT_STATE_WINDOW_INACTIVE (1 << 1)
#define NS_DOCUMENT_STATE_WINDOW_INACTIVE NS_DEFINE_EVENT_STATE_MACRO(1)
//----------------------------------------------------------------------
@ -723,12 +724,12 @@ public:
// either may be nsnull, but not both
virtual void ContentStatesChanged(nsIContent* aContent1,
nsIContent* aContent2,
PRInt32 aStateMask) = 0;
nsEventStates aStateMask) = 0;
// Notify that a document state has changed.
// This should only be called by callers whose state is also reflected in the
// implementation of nsDocument::GetDocumentState.
virtual void DocumentStatesChanged(PRInt32 aStateMask) = 0;
virtual void DocumentStatesChanged(nsEventStates aStateMask) = 0;
// Observation hooks for style data to propagate notifications
// to document observers
@ -1415,7 +1416,7 @@ public:
* Document state bits have the form NS_DOCUMENT_STATE_* and are declared in
* nsIDocument.h.
*/
virtual PRInt32 GetDocumentState() = 0;
virtual nsEventStates GetDocumentState() = 0;
virtual nsISupports* GetCurrentContentSink() = 0;

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

@ -39,6 +39,7 @@
#include "nsISupports.h"
#include "nsIMutationObserver.h"
#include "nsEventStates.h"
class nsIAtom;
class nsIContent;
@ -48,8 +49,8 @@ class nsString;
class nsIDocument;
#define NS_IDOCUMENT_OBSERVER_IID \
{ 0x4e14e321, 0xa4bb, 0x49f8, \
{ 0xa5, 0x7a, 0x23, 0x63, 0x66, 0x8d, 0x14, 0xd0 } }
{ 0x3d005225, 0x210f, 0x4b07, \
{ 0xb1, 0xd9, 0x96, 0x02, 0x05, 0x74, 0xc4, 0x37 } }
typedef PRUint32 nsUpdateType;
@ -115,7 +116,7 @@ public:
virtual void ContentStatesChanged(nsIDocument* aDocument,
nsIContent* aContent1,
nsIContent* aContent2,
PRInt32 aStateMask) = 0;
nsEventStates aStateMask) = 0;
/**
* Notification that the state of the document has changed.
@ -124,7 +125,7 @@ public:
* @param aStateMask the state that changed
*/
virtual void DocumentStatesChanged(nsIDocument* aDocument,
PRInt32 aStateMask) = 0;
nsEventStates aStateMask) = 0;
/**
* A StyleSheet has just been added to the document. This method is
@ -250,11 +251,11 @@ NS_DEFINE_STATIC_IID_ACCESSOR(nsIDocumentObserver, NS_IDOCUMENT_OBSERVER_IID)
virtual void ContentStatesChanged(nsIDocument* aDocument, \
nsIContent* aContent1, \
nsIContent* aContent2, \
PRInt32 aStateMask);
nsEventStates aStateMask);
#define NS_DECL_NSIDOCUMENTOBSERVER_DOCUMENTSTATESCHANGED \
virtual void DocumentStatesChanged(nsIDocument* aDocument, \
PRInt32 aStateMask);
nsEventStates aStateMask);
#define NS_DECL_NSIDOCUMENTOBSERVER_STYLESHEETADDED \
virtual void StyleSheetAdded(nsIDocument* aDocument, \
@ -329,13 +330,13 @@ void \
_class::ContentStatesChanged(nsIDocument* aDocument, \
nsIContent* aContent1, \
nsIContent* aContent2, \
PRInt32 aStateMask) \
nsEventStates aStateMask) \
{ \
} \
\
void \
_class::DocumentStatesChanged(nsIDocument* aDocument, \
PRInt32 aStateMask) \
nsEventStates aStateMask) \
{ \
}

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

@ -65,7 +65,7 @@ interface nsIDocument;
* sufficient, when combined with the imageBlockingStatus information.)
*/
[scriptable, uuid(7974082c-3267-4ab1-96fa-bd47d7e3a093)]
[scriptable, uuid(95c74255-df9a-4060-b5a0-0d111fcafe08)]
interface nsIImageLoadingContent : imgIDecoderObserver
{
/**
@ -174,7 +174,7 @@ interface nsIImageLoadingContent : imgIDecoderObserver
* nsImageLoadingContent::ImageState() to return |aState|. Call again with |aForce|
* as PR_FALSE to revert ImageState() to its original behaviour.
*/
void forceImageState(in boolean aForce, in long aState);
void forceImageState(in boolean aForce, in unsigned long long aState);
/**
* We need to be notified when our document changes.

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

@ -84,7 +84,7 @@ Link::SetLinkState(nsLinkState aState)
"Setting state to the currently set state!");
// Remember our old link state for when we notify.
PRInt32 oldLinkState = LinkState();
nsEventStates oldLinkState = LinkState();
// Set our current state as appropriate.
mLinkState = aState;
@ -96,7 +96,7 @@ Link::SetLinkState(nsLinkState aState)
nsIContent *content = Content();
nsIDocument *doc = content->GetCurrentDoc();
NS_ASSERTION(doc, "Registered but we have no document?!");
PRInt32 newLinkState = LinkState();
nsEventStates newLinkState = LinkState();
NS_ASSERTION(newLinkState == NS_EVENT_STATE_VISITED ||
newLinkState == NS_EVENT_STATE_UNVISITED,
"Unexpected state obtained from LinkState()!");
@ -104,7 +104,7 @@ Link::SetLinkState(nsLinkState aState)
doc->ContentStatesChanged(content, nsnull, oldLinkState ^ newLinkState);
}
PRInt32
nsEventStates
Link::LinkState() const
{
// We are a constant method, but we are just lazily doing things and have to
@ -124,7 +124,7 @@ Link::LinkState() const
nsCOMPtr<nsIURI> hrefURI(GetURI());
if (!hrefURI) {
self->mLinkState = eLinkState_NotLink;
return 0;
return nsEventStates();
}
// We have a good href, so register with History.
@ -153,7 +153,7 @@ Link::LinkState() const
return NS_EVENT_STATE_UNVISITED;
}
return 0;
return nsEventStates();
}
already_AddRefed<nsIURI>
@ -491,7 +491,7 @@ Link::ResetLinkState(bool aNotify)
// not before. In particular, we need to make sure that our LinkState() is
// called so that we'll start a new history query as needed.
if (aNotify && doc) {
PRUint32 changedState = NS_EVENT_STATE_VISITED ^ NS_EVENT_STATE_UNVISITED;
nsEventStates changedState = NS_EVENT_STATE_VISITED ^ NS_EVENT_STATE_UNVISITED;
MOZ_AUTO_DOC_UPDATE(doc, UPDATE_STYLE, aNotify);
doc->ContentStatesChanged(content, nsnull, changedState);
}

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

@ -68,7 +68,7 @@ public:
* NS_EVENT_STATE_UNVISTED if this link is not visited, or 0 if this
* link is not actually a link.
*/
PRInt32 LinkState() const;
nsEventStates LinkState() const;
/**
* @return the URI this link is for, if available.

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

@ -4206,14 +4206,14 @@ nsDocument::EndLoad()
void
nsDocument::ContentStatesChanged(nsIContent* aContent1, nsIContent* aContent2,
PRInt32 aStateMask)
nsEventStates aStateMask)
{
NS_DOCUMENT_NOTIFY_OBSERVERS(ContentStatesChanged,
(this, aContent1, aContent2, aStateMask));
}
void
nsDocument::DocumentStatesChanged(PRInt32 aStateMask)
nsDocument::DocumentStatesChanged(nsEventStates aStateMask)
{
// Invalidate our cached state.
mGotDocumentState &= ~aStateMask;
@ -7734,16 +7734,16 @@ nsDocument::MaybePreLoadImage(nsIURI* uri)
}
}
PRInt32
nsEventStates
nsDocument::GetDocumentState()
{
if (!(mGotDocumentState & NS_DOCUMENT_STATE_RTL_LOCALE)) {
if (!mGotDocumentState.HasState(NS_DOCUMENT_STATE_RTL_LOCALE)) {
if (IsDocumentRightToLeft()) {
mDocumentState |= NS_DOCUMENT_STATE_RTL_LOCALE;
}
mGotDocumentState |= NS_DOCUMENT_STATE_RTL_LOCALE;
}
if (!(mGotDocumentState & NS_DOCUMENT_STATE_WINDOW_INACTIVE)) {
if (!mGotDocumentState.HasState(NS_DOCUMENT_STATE_WINDOW_INACTIVE)) {
nsIPresShell* shell = GetShell();
if (shell && shell->GetPresContext() &&
shell->GetPresContext()->IsTopLevelWindowInactive()) {

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

@ -710,8 +710,8 @@ public:
virtual void ContentStatesChanged(nsIContent* aContent1,
nsIContent* aContent2,
PRInt32 aStateMask);
virtual void DocumentStatesChanged(PRInt32 aStateMask);
nsEventStates aStateMask);
virtual void DocumentStatesChanged(nsEventStates aStateMask);
virtual void StyleRuleChanged(nsIStyleSheet* aStyleSheet,
nsIStyleRule* aOldStyleRule,
@ -952,7 +952,7 @@ public:
virtual nsISupports* GetCurrentContentSink();
virtual PRInt32 GetDocumentState();
virtual nsEventStates GetDocumentState();
virtual void RegisterFileDataUri(const nsACString& aUri);
virtual void UnregisterFileDataUri(const nsACString& aUri);
@ -1171,8 +1171,8 @@ protected:
nsCOMPtr<nsIContent> mFirstBaseNodeWithHref;
PRInt32 mDocumentState;
PRInt32 mGotDocumentState;
nsEventStates mDocumentState;
nsEventStates mGotDocumentState;
private:
friend class nsUnblockOnloadEvent;

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

@ -64,7 +64,7 @@ public:
}
// nsIContent overrides
virtual PRInt32 IntrinsicState() const;
virtual nsEventStates IntrinsicState() const;
private:
virtual ~nsGenConImageContent();
@ -96,13 +96,13 @@ nsGenConImageContent::~nsGenConImageContent()
DestroyImageLoadingContent();
}
PRInt32
nsEventStates
nsGenConImageContent::IntrinsicState() const
{
PRInt32 state = nsXMLElement::IntrinsicState();
nsEventStates state = nsXMLElement::IntrinsicState();
PRInt32 imageState = nsImageLoadingContent::ImageState();
if (imageState & (NS_EVENT_STATE_BROKEN | NS_EVENT_STATE_USERDISABLED)) {
nsEventStates imageState = nsImageLoadingContent::ImageState();
if (imageState.HasAtLeastOneOfStates(NS_EVENT_STATE_BROKEN | NS_EVENT_STATE_USERDISABLED)) {
// We should never be in an error state; if the image fails to load, we
// just go to the suppressed state.
imageState |= NS_EVENT_STATE_SUPPRESSED;

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

@ -771,7 +771,7 @@ nsINode::LookupNamespaceURI(const nsAString& aNamespacePrefix,
//----------------------------------------------------------------------
PRInt32
nsEventStates
nsIContent::IntrinsicState() const
{
return IsEditable() ? NS_EVENT_STATE_MOZ_READWRITE :
@ -4675,9 +4675,9 @@ nsGenericElement::SetAttrAndNotify(PRInt32 aNamespaceID,
// When notifying, make sure to keep track of states whose value
// depends solely on the value of an attribute.
PRUint32 stateMask;
nsEventStates stateMask;
if (aNotify) {
stateMask = PRUint32(IntrinsicState());
stateMask = IntrinsicState();
}
nsMutationGuard::DidMutate();
@ -4712,8 +4712,8 @@ nsGenericElement::SetAttrAndNotify(PRInt32 aNamespaceID,
}
if (aNotify) {
stateMask = stateMask ^ PRUint32(IntrinsicState());
if (stateMask && document) {
stateMask ^= IntrinsicState();
if (document && !stateMask.IsEmpty()) {
MOZ_AUTO_DOC_UPDATE(document, UPDATE_CONTENT_STATE, aNotify);
document->ContentStatesChanged(this, nsnull, stateMask);
}
@ -4914,10 +4914,10 @@ nsGenericElement::UnsetAttr(PRInt32 aNameSpaceID, nsIAtom* aName,
// When notifying, make sure to keep track of states whose value
// depends solely on the value of an attribute.
PRUint32 stateMask;
nsEventStates stateMask;
if (aNotify) {
stateMask = PRUint32(IntrinsicState());
}
stateMask = IntrinsicState();
}
PRBool hasMutationListeners = aNotify &&
nsContentUtils::HasMutationListeners(this,
@ -4959,8 +4959,8 @@ nsGenericElement::UnsetAttr(PRInt32 aNameSpaceID, nsIAtom* aName,
}
if (aNotify) {
stateMask = stateMask ^ PRUint32(IntrinsicState());
if (stateMask && document) {
stateMask ^= IntrinsicState();
if (document && !stateMask.IsEmpty()) {
MOZ_AUTO_DOC_UPDATE(document, UPDATE_CONTENT_STATE, aNotify);
document->ContentStatesChanged(this, nsnull, stateMask);
}

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

@ -699,21 +699,36 @@ nsImageLoadingContent::LoadImage(nsIURI* aNewURI,
}
nsresult
nsImageLoadingContent::ForceImageState(PRBool aForce, PRInt32 aState)
nsImageLoadingContent::ForceImageState(PRBool aForce, nsEventStates::InternalType aState)
{
mIsImageStateForced = aForce;
mForcedImageState = aState;
mForcedImageState = nsEventStates(aState);
return NS_OK;
}
PRInt32
nsEventStates
nsImageLoadingContent::ImageState() const
{
return mIsImageStateForced ? mForcedImageState :
(mBroken * NS_EVENT_STATE_BROKEN) |
(mUserDisabled * NS_EVENT_STATE_USERDISABLED) |
(mSuppressed * NS_EVENT_STATE_SUPPRESSED) |
(mLoading * NS_EVENT_STATE_LOADING);
if (mIsImageStateForced) {
return mForcedImageState;
}
nsEventStates states;
if (mBroken) {
states |= NS_EVENT_STATE_BROKEN;
}
if (mUserDisabled) {
states |= NS_EVENT_STATE_USERDISABLED;
}
if (mSuppressed) {
states |= NS_EVENT_STATE_SUPPRESSED;
}
if (mLoading) {
states |= NS_EVENT_STATE_LOADING;
}
return states;
}
void
@ -734,7 +749,7 @@ nsImageLoadingContent::UpdateImageState(PRBool aNotify)
return;
}
PRInt32 oldState = ImageState();
nsEventStates oldState = ImageState();
mLoading = mBroken = mUserDisabled = mSuppressed = PR_FALSE;
@ -762,8 +777,8 @@ nsImageLoadingContent::UpdateImageState(PRBool aNotify)
nsIDocument* doc = thisContent->GetCurrentDoc();
if (doc) {
NS_ASSERTION(thisContent->IsInDoc(), "Something is confused");
PRInt32 changedBits = oldState ^ ImageState();
if (changedBits) {
nsEventStates changedBits = oldState ^ ImageState();
if (!changedBits.IsEmpty()) {
mozAutoDocUpdate upd(doc, UPDATE_CONTENT_STATE, PR_TRUE);
doc->ContentStatesChanged(thisContent, nsnull, changedBits);
}

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

@ -96,7 +96,7 @@ protected:
* be an image (eg an HTML <input> of type other than "image") should just
* not call this method when computing their intrinsic state.
*/
PRInt32 ImageState() const;
nsEventStates ImageState() const;
/**
* LoadImage is called by subclasses when the appropriate
@ -315,7 +315,7 @@ private:
* When mIsImageStateForced is true, this holds the ImageState that we'll
* return in ImageState().
*/
PRInt32 mForcedImageState;
nsEventStates mForcedImageState;
PRInt16 mImageBlockingStatus;
PRPackedBool mLoadingEnabled : 1;

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

@ -359,7 +359,7 @@ class AutoNotifier {
nsObjectLoadingContent* mContent;
PRBool mNotify;
nsObjectLoadingContent::ObjectType mOldType;
PRInt32 mOldState;
nsEventStates mOldState;
};
/**
@ -1043,7 +1043,7 @@ nsObjectLoadingContent::AsyncOnChannelRedirect(nsIChannel *aOldChannel,
}
// <public>
PRInt32
nsEventStates
nsObjectLoadingContent::ObjectState() const
{
switch (mType) {
@ -1056,7 +1056,7 @@ nsObjectLoadingContent::ObjectState() const
// These are OK. If documents start to load successfully, they display
// something, and are thus not broken in this sense. The same goes for
// plugins.
return 0;
return nsEventStates();
case eType_Null:
if (mSuppressed)
return NS_EVENT_STATE_SUPPRESSED;
@ -1064,7 +1064,7 @@ nsObjectLoadingContent::ObjectState() const
return NS_EVENT_STATE_USERDISABLED;
// Otherwise, broken
PRInt32 state = NS_EVENT_STATE_BROKEN;
nsEventStates state = NS_EVENT_STATE_BROKEN;
switch (mFallbackReason) {
case ePluginDisabled:
state |= NS_EVENT_STATE_HANDLER_DISABLED;
@ -1083,7 +1083,7 @@ nsObjectLoadingContent::ObjectState() const
};
NS_NOTREACHED("unknown type?");
// this return statement only exists to avoid a compile warning
return 0;
return nsEventStates();
}
// <protected>
@ -1634,11 +1634,11 @@ nsObjectLoadingContent::UnloadContent()
void
nsObjectLoadingContent::NotifyStateChanged(ObjectType aOldType,
PRInt32 aOldState,
PRBool aSync)
nsEventStates aOldState, PRBool aSync)
{
LOG(("OBJLC [%p]: Notifying about state change: (%u, %x) -> (%u, %x) (sync=%i)\n",
this, aOldType, aOldState, mType, ObjectState(), aSync));
LOG(("OBJLC [%p]: Notifying about state change: (%u, %lx) -> (%u, %lx) (sync=%i)\n",
this, aOldType, aOldState.GetInternalValue(), mType,
ObjectState().GetInternalValue(), aSync));
nsCOMPtr<nsIContent> thisContent =
do_QueryInterface(static_cast<nsIImageLoadingContent*>(this));
@ -1649,12 +1649,12 @@ nsObjectLoadingContent::NotifyStateChanged(ObjectType aOldType,
return; // Nothing to do
}
PRInt32 newState = ObjectState();
nsEventStates newState = ObjectState();
if (newState != aOldState) {
// This will trigger frame construction
NS_ASSERTION(thisContent->IsInDoc(), "Something is confused");
PRInt32 changedBits = aOldState ^ newState;
nsEventStates changedBits = aOldState ^ newState;
{
mozAutoDocUpdate upd(doc, UPDATE_CONTENT_STATE, PR_TRUE);

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

@ -132,7 +132,7 @@ class nsObjectLoadingContent : public nsImageLoadingContent
* NS_EVENT_STATE_BROKEN, NS_EVENT_STATE_USERDISABLED and
* NS_EVENT_STATE_SUPPRESSED representing the current state of the object.
*/
PRInt32 ObjectState() const;
nsEventStates ObjectState() const;
void SetIsNetworkCreated(PRBool aNetworkCreated)
{
@ -259,7 +259,7 @@ class nsObjectLoadingContent : public nsImageLoadingContent
* @param aSync If a synchronous frame construction is required. If false,
* the construction may either be sync or async.
*/
void NotifyStateChanged(ObjectType aOldType, PRInt32 aOldState,
void NotifyStateChanged(ObjectType aOldType, nsEventStates aOldState,
PRBool aSync);
/**

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

@ -55,6 +55,7 @@ EXPORTS = \
nsPLDOMEvent.h \
nsEventDispatcher.h \
nsPIDOMEventTarget.h \
nsEventStates.h \
$(NULL)
XPIDLSRCS = \

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

@ -0,0 +1,266 @@
/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
/* ***** BEGIN LICENSE BLOCK *****
* Version: MPL 1.1/GPL 2.0/LGPL 2.1
*
* The contents of this file are subject to the Mozilla Public License Version
* 1.1 (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
* http://www.mozilla.org/MPL/
*
* Software distributed under the License is distributed on an "AS IS" basis,
* WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
* for the specific language governing rights and limitations under the
* License.
*
* The Original Code is Mozilla code.
*
* The Initial Developer of the Original Code is Mozilla Foundation
* Portions created by the Initial Developer are Copyright (C) 2010
* the Initial Developer. All Rights Reserved.
*
* Contributor(s):
* Mounir Lamouri <mounir.lamouri@mozilla.com> (original author)
*
* Alternatively, the contents of this file may be used under the terms of
* either of the GNU General Public License Version 2 or later (the "GPL"),
* or the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
* in which case the provisions of the GPL or the LGPL are applicable instead
* of those above. If you wish to allow use of your version of this file only
* under the terms of either the GPL or the LGPL, and not to allow others to
* use your version of this file under the terms of the MPL, indicate your
* decision by deleting the provisions above and replace them with the notice
* and other provisions required by the GPL or the LGPL. If you do not delete
* the provisions above, a recipient may use your version of this file under
* the terms of any one of the MPL, the GPL or the LGPL.
*
* ***** END LICENSE BLOCK ***** */
#ifndef nsEventStates_h__
#define nsEventStates_h__
/**
* nsEventStates is the class used to represent the event states of nsIContent
* instances. These states are calculated by IntrinsicState() and
* ContentStatesChanged() has to be called when one of them changes thus
* informing the layout/style engine of the change.
* Event states are associated with pseudo-classes.
*/
class nsEventStates
{
public:
typedef PRUint64 InternalType;
nsEventStates()
: mStates(0)
{ }
// NOTE: the ideal scenario would be to have the default constructor public
// setting mStates to 0 and this constructor (without = 0) private.
// In that case, we could be sure that only macros at the end were creating
// nsEventStates instances with mStates set to something else than 0.
// Unfortunately, this constructor is needed at at least two places now.
explicit nsEventStates(InternalType aStates)
: mStates(aStates)
{ }
nsEventStates(const nsEventStates& aEventStates) {
mStates = aEventStates.mStates;
}
nsEventStates& operator=(const nsEventStates& aEventStates) {
mStates = aEventStates.mStates;
return *this;
}
nsEventStates operator|(const nsEventStates& aEventStates) const {
return nsEventStates(mStates | aEventStates.mStates);
}
nsEventStates& operator|=(const nsEventStates& aEventStates) {
mStates |= aEventStates.mStates;
return *this;
}
// NOTE: calling if (eventStates1 & eventStates2) will not build.
// This might work correctly if operator bool() is defined
// but using HasState, HasAllStates or HasAtLeastOneOfStates is recommended.
nsEventStates operator&(const nsEventStates& aEventStates) const {
return nsEventStates(mStates & aEventStates.mStates);
}
nsEventStates& operator&=(const nsEventStates& aEventStates) {
mStates &= aEventStates.mStates;
return *this;
}
bool operator==(const nsEventStates& aEventStates) const {
return mStates == aEventStates.mStates;
}
bool operator!=(const nsEventStates& aEventStates) const {
return mStates != aEventStates.mStates;
}
nsEventStates operator~() const {
return nsEventStates(~mStates);
}
nsEventStates operator^(const nsEventStates& aEventStates) const {
return nsEventStates(mStates ^ aEventStates.mStates);
}
nsEventStates& operator^=(const nsEventStates& aEventStates) {
mStates ^= aEventStates.mStates;
return *this;
}
/**
* Returns true if the nsEventStates instance is empty.
* A nsEventStates instance is empty if it contains no state.
*
* @return Whether if the object is empty.
*/
bool IsEmpty() const {
return mStates == 0;
}
/**
* Returns true if the nsEventStates instance contains the state
* contained in aEventStates.
* @note aEventStates should contain only one state.
*
* @param aEventStates The state to check.
*
* @return Whether the object has the state from aEventStates
*/
bool HasState(nsEventStates aEventStates) const {
#ifdef DEBUG
// If aEventStates.mStates is a power of two, it contains only one state
// (or none, but we don't really care).
if ((aEventStates.mStates & (aEventStates.mStates - 1))) {
NS_ERROR("When calling HasState, "
"nsEventStates object has to contain only one state!");
}
#endif // DEBUG
return mStates & aEventStates.mStates;
}
/**
* Returns true if the nsEventStates instance contains one of the states
* contained in aEventStates.
*
* @param aEventStates The states to check.
*
* @return Whether the object has at least one state from aEventStates
*/
bool HasAtLeastOneOfStates(nsEventStates aEventStates) const {
return mStates & aEventStates.mStates;
}
/**
* Returns true if the nsEventStates instance contains all states
* contained in aEventStates.
*
* @param aEventStates The states to check.
*
* @return Whether the object has all states from aEventStates
*/
bool HasAllStates(nsEventStates aEventStates) const {
return (mStates & aEventStates.mStates) == aEventStates.mStates;
}
// We only need that method for inDOMUtils::GetContentState.
// If inDOMUtils::GetContentState is removed, this method should be removed.
InternalType GetInternalValue() const {
return mStates;
}
private:
InternalType mStates;
};
/**
* The following macros are creating nsEventStates instance with different
* values depending of their meaning.
* Ideally, nsEventStates instance with values different than 0 should only be
* created that way.
*/
// Helper to define a new nsEventStates macro.
#define NS_DEFINE_EVENT_STATE_MACRO(_val) \
(nsEventStates(nsEventStates::InternalType(1) << _val))
// Mouse is down on content.
#define NS_EVENT_STATE_ACTIVE NS_DEFINE_EVENT_STATE_MACRO(0)
// Content has focus.
#define NS_EVENT_STATE_FOCUS NS_DEFINE_EVENT_STATE_MACRO(1)
// Mouse is hovering over content.
#define NS_EVENT_STATE_HOVER NS_DEFINE_EVENT_STATE_MACRO(2)
// Drag is hovering over content.
#define NS_EVENT_STATE_DRAGOVER NS_DEFINE_EVENT_STATE_MACRO(3)
// Content is URL's target (ref).
#define NS_EVENT_STATE_URLTARGET NS_DEFINE_EVENT_STATE_MACRO(4)
// Content is checked.
#define NS_EVENT_STATE_CHECKED NS_DEFINE_EVENT_STATE_MACRO(5)
// Content is enabled (and can be disabled).
#define NS_EVENT_STATE_ENABLED NS_DEFINE_EVENT_STATE_MACRO(6)
// Content is disabled.
#define NS_EVENT_STATE_DISABLED NS_DEFINE_EVENT_STATE_MACRO(7)
// Content is required.
#define NS_EVENT_STATE_REQUIRED NS_DEFINE_EVENT_STATE_MACRO(8)
// Content is optional (and can be required).
#define NS_EVENT_STATE_OPTIONAL NS_DEFINE_EVENT_STATE_MACRO(9)
// Link has been visited.
#define NS_EVENT_STATE_VISITED NS_DEFINE_EVENT_STATE_MACRO(10)
// Link hasn't been visited.
#define NS_EVENT_STATE_UNVISITED NS_DEFINE_EVENT_STATE_MACRO(11)
// Content is valid (and can be invalid).
#define NS_EVENT_STATE_VALID NS_DEFINE_EVENT_STATE_MACRO(12)
// Content is invalid.
#define NS_EVENT_STATE_INVALID NS_DEFINE_EVENT_STATE_MACRO(13)
// Content value is in-range (and can be out-of-range).
#define NS_EVENT_STATE_INRANGE NS_DEFINE_EVENT_STATE_MACRO(14)
// Content value is out-of-range.
#define NS_EVENT_STATE_OUTOFRANGE NS_DEFINE_EVENT_STATE_MACRO(15)
// These two are temporary (see bug 302188)
// Content is read-only.
#define NS_EVENT_STATE_MOZ_READONLY NS_DEFINE_EVENT_STATE_MACRO(16)
// Content is editable.
#define NS_EVENT_STATE_MOZ_READWRITE NS_DEFINE_EVENT_STATE_MACRO(17)
// Content is the default one (meaning depends of the context).
#define NS_EVENT_STATE_DEFAULT NS_DEFINE_EVENT_STATE_MACRO(18)
// Content could not be rendered (image/object/etc).
#define NS_EVENT_STATE_BROKEN NS_DEFINE_EVENT_STATE_MACRO(19)
// Content disabled by the user (images turned off, say).
#define NS_EVENT_STATE_USERDISABLED NS_DEFINE_EVENT_STATE_MACRO(20)
// Content suppressed by the user (ad blocking, etc).
#define NS_EVENT_STATE_SUPPRESSED NS_DEFINE_EVENT_STATE_MACRO(21)
// Content is still loading such that there is nothing to show the
// user (eg an image which hasn't started coming in yet).
#define NS_EVENT_STATE_LOADING NS_DEFINE_EVENT_STATE_MACRO(22)
// Content is of a type that gecko can't handle.
#define NS_EVENT_STATE_TYPE_UNSUPPORTED NS_DEFINE_EVENT_STATE_MACRO(23)
#ifdef MOZ_MATHML
#define NS_EVENT_STATE_INCREMENT_SCRIPT_LEVEL NS_DEFINE_EVENT_STATE_MACRO(24)
#endif
// Handler for the content has been blocked.
#define NS_EVENT_STATE_HANDLER_BLOCKED NS_DEFINE_EVENT_STATE_MACRO(25)
// Handler for the content has been disabled.
#define NS_EVENT_STATE_HANDLER_DISABLED NS_DEFINE_EVENT_STATE_MACRO(26)
// Content is in the indeterminate state.
#define NS_EVENT_STATE_INDETERMINATE NS_DEFINE_EVENT_STATE_MACRO(27)
// Handler for the content has crashed
#define NS_EVENT_STATE_HANDLER_CRASHED NS_DEFINE_EVENT_STATE_MACRO(28)
// Content has focus and should show a ring.
#define NS_EVENT_STATE_FOCUSRING NS_DEFINE_EVENT_STATE_MACRO(29)
// Content shows its placeholder
#define NS_EVENT_STATE_MOZ_PLACEHOLDER NS_DEFINE_EVENT_STATE_MACRO(30)
// Content is a submit control and the form isn't valid.
#define NS_EVENT_STATE_MOZ_SUBMITINVALID NS_DEFINE_EVENT_STATE_MACRO(31)
/**
* NOTE: do not go over 63 without updating nsEventStates::InternalType!
*/
#endif // nsEventStates_h__

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

@ -40,6 +40,7 @@
#include "nsEvent.h"
#include "nsISupports.h"
#include "nsEventStates.h"
class nsIContent;
class nsIDocument;
@ -53,10 +54,9 @@ class imgIContainer;
/*
* Event state manager interface.
*/
// {92EDD580-062E-4471-ADEB-68329B0EC2E4}
#define NS_IEVENTSTATEMANAGER_IID \
{ 0x92edd580, 0x062e, 0x4471, \
{ 0xad, 0xeb, 0x68, 0x32, 0x9b, 0x0e, 0xc2, 0xe4 } }
{0x69ab5b16, 0x6690, 0x42fc, \
{ 0xa9, 0xe5, 0xa3, 0xb4, 0xf8, 0x0f, 0xcb, 0xa6 } }
#define NS_EVENT_NEEDS_FRAME(event) (!NS_IS_ACTIVATION_EVENT(event))
@ -95,8 +95,8 @@ public:
* will pretend that those states are also set on aContent.
* @return The content state.
*/
virtual PRInt32 GetContentState(nsIContent *aContent,
PRBool aFollowLabels = PR_FALSE) = 0;
virtual nsEventStates GetContentState(nsIContent *aContent,
PRBool aFollowLabels = PR_FALSE) = 0;
/**
* Notify that the given NS_EVENT_STATE_* bit has changed for this content.
@ -110,7 +110,7 @@ public:
* frame reconstructions that may occur, but this does not
* affect the return value.
*/
virtual PRBool SetContentState(nsIContent *aContent, PRInt32 aState) = 0;
virtual PRBool SetContentState(nsIContent *aContent, nsEventStates aState) = 0;
NS_IMETHOD ContentRemoved(nsIDocument* aDocument, nsIContent* aContent) = 0;
NS_IMETHOD EventStatusOK(nsGUIEvent* aEvent, PRBool *aOK) = 0;
@ -161,75 +161,4 @@ public:
NS_DEFINE_STATIC_IID_ACCESSOR(nsIEventStateManager, NS_IEVENTSTATEMANAGER_IID)
#define NS_EVENT_STATE_ACTIVE (1 << 0) // mouse is down on content
#define NS_EVENT_STATE_FOCUS (1 << 1) // content has focus
#define NS_EVENT_STATE_HOVER (1 << 2) // mouse is hovering over content
#define NS_EVENT_STATE_DRAGOVER (1 << 3) // drag is hovering over content
#define NS_EVENT_STATE_URLTARGET (1 << 4) // content is URL's target (ref)
// The following states are used only for ContentStatesChanged
#define NS_EVENT_STATE_CHECKED (1 << 5) // CSS3-Selectors
#define NS_EVENT_STATE_ENABLED (1 << 6) // CSS3-Selectors
#define NS_EVENT_STATE_DISABLED (1 << 7) // CSS3-Selectors
#define NS_EVENT_STATE_REQUIRED (1 << 8) // CSS3-UI
#define NS_EVENT_STATE_OPTIONAL (1 << 9) // CSS3-UI
#define NS_EVENT_STATE_VISITED (1 << 10) // CSS2
#define NS_EVENT_STATE_UNVISITED (1 << 11)
#define NS_EVENT_STATE_VALID (1 << 12) // CSS3-UI
#define NS_EVENT_STATE_INVALID (1 << 13) // CSS3-UI
#define NS_EVENT_STATE_INRANGE (1 << 14) // CSS3-UI
#define NS_EVENT_STATE_OUTOFRANGE (1 << 15) // CSS3-UI
// these two are temporary (see bug 302188)
#define NS_EVENT_STATE_MOZ_READONLY (1 << 16) // CSS3-UI
#define NS_EVENT_STATE_MOZ_READWRITE (1 << 17) // CSS3-UI
#define NS_EVENT_STATE_DEFAULT (1 << 18) // CSS3-UI
// Content could not be rendered (image/object/etc).
#define NS_EVENT_STATE_BROKEN (1 << 19)
// Content disabled by the user (images turned off, say)
#define NS_EVENT_STATE_USERDISABLED (1 << 20)
// Content suppressed by the user (ad blocking, etc)
#define NS_EVENT_STATE_SUPPRESSED (1 << 21)
// Content is still loading such that there is nothing to show the
// user (eg an image which hasn't started coming in yet)
#define NS_EVENT_STATE_LOADING (1 << 22)
// Content is of a type that gecko can't handle
#define NS_EVENT_STATE_TYPE_UNSUPPORTED \
(1 << 23)
#ifdef MOZ_MATHML
#define NS_EVENT_STATE_INCREMENT_SCRIPT_LEVEL \
(1 << 24)
#endif
// Handler for the content has been blocked
#define NS_EVENT_STATE_HANDLER_BLOCKED \
(1 << 25)
// Handler for the content has been disabled
#define NS_EVENT_STATE_HANDLER_DISABLED \
(1 << 26)
#define NS_EVENT_STATE_INDETERMINATE (1 << 27) // CSS3-Selectors
// Handler for the content has crashed
#define NS_EVENT_STATE_HANDLER_CRASHED \
(1 << 28)
// content has focus and should show a ring
#define NS_EVENT_STATE_FOCUSRING (1 << 29)
// Content shows its placeholder
#define NS_EVENT_STATE_MOZ_PLACEHOLDER (1 << 30)
// Content is a submit control and the form isn't valid.
#define NS_EVENT_STATE_MOZ_SUBMITINVALID (1U << 31)
/**
* WARNING:
* (1U << 31) should work but we currently handle event states with PRInt32
* so it's an edge case.
* DO NOT ADD AN EVENT STATE after NS_EVENT_STATE_MOZ_SUBMITINVALID until we
* move to PRUint64 and we introduce a type to handle event states.
* See bug 595036.
*/
#endif // nsIEventStateManager_h__

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

@ -4159,10 +4159,10 @@ IsAncestorOf(nsIContent* aPossibleAncestor, nsIContent* aPossibleDescendant,
return false;
}
PRInt32
nsEventStates
nsEventStateManager::GetContentState(nsIContent *aContent, PRBool aFollowLabels)
{
PRInt32 state = aContent->IntrinsicState();
nsEventStates state = aContent->IntrinsicState();
if (IsAncestorOf(aContent, mActiveContent, aFollowLabels)) {
state |= NS_EVENT_STATE_ACTIVE;
@ -4239,7 +4239,7 @@ static nsIContent* FindCommonAncestor(nsIContent *aNode1, nsIContent *aNode2)
static void
NotifyAncestors(nsIDocument* aDocument, nsIContent* aStartNode,
nsIContent* aStopBefore, PRInt32 aState)
nsIContent* aStopBefore, nsEventStates aState)
{
while (aStartNode && aStartNode != aStopBefore) {
aDocument->ContentStatesChanged(aStartNode, nsnull, aState);
@ -4252,7 +4252,7 @@ NotifyAncestors(nsIDocument* aDocument, nsIContent* aStartNode,
}
PRBool
nsEventStateManager::SetContentState(nsIContent *aContent, PRInt32 aState)
nsEventStateManager::SetContentState(nsIContent *aContent, nsEventStates aState)
{
const PRInt32 maxNotify = 5;
// We must initialize this array with memset for the sake of the boneheaded
@ -4270,20 +4270,20 @@ nsEventStateManager::SetContentState(nsIContent *aContent, PRInt32 aState)
return PR_FALSE;
}
if ((aState & NS_EVENT_STATE_DRAGOVER) && (aContent != mDragOverContent)) {
if (aState.HasState(NS_EVENT_STATE_DRAGOVER) && aContent != mDragOverContent) {
notifyContent[3] = mDragOverContent; // notify dragover first, since more common case
NS_IF_ADDREF(notifyContent[3]);
mDragOverContent = aContent;
}
if ((aState & NS_EVENT_STATE_URLTARGET) && (aContent != mURLTargetContent)) {
if (aState.HasState(NS_EVENT_STATE_URLTARGET) && aContent != mURLTargetContent) {
notifyContent[4] = mURLTargetContent;
NS_IF_ADDREF(notifyContent[4]);
mURLTargetContent = aContent;
}
nsCOMPtr<nsIContent> commonActiveAncestor, oldActive, newActive;
if ((aState & NS_EVENT_STATE_ACTIVE) && (aContent != mActiveContent)) {
if (aState.HasState(NS_EVENT_STATE_ACTIVE) && aContent != mActiveContent) {
oldActive = mActiveContent;
newActive = aContent;
commonActiveAncestor = FindCommonAncestor(mActiveContent, aContent);
@ -4291,7 +4291,7 @@ nsEventStateManager::SetContentState(nsIContent *aContent, PRInt32 aState)
}
nsCOMPtr<nsIContent> commonHoverAncestor, oldHover, newHover;
if ((aState & NS_EVENT_STATE_HOVER) && (aContent != mHoverContent)) {
if (aState.HasState(NS_EVENT_STATE_HOVER) && aContent != mHoverContent) {
oldHover = mHoverContent;
if (!mPresContext || mPresContext->IsDynamic()) {
@ -4315,15 +4315,16 @@ nsEventStateManager::SetContentState(nsIContent *aContent, PRInt32 aState)
mHoverContent = aContent;
}
if (aState & NS_EVENT_STATE_FOCUS) {
if (aState.HasState(NS_EVENT_STATE_FOCUS)) {
aState |= NS_EVENT_STATE_FOCUSRING;
notifyContent[2] = aContent;
NS_IF_ADDREF(notifyContent[2]);
}
PRInt32 simpleStates = aState & ~(NS_EVENT_STATE_ACTIVE|NS_EVENT_STATE_HOVER);
nsEventStates simpleStates = aState;
simpleStates &= ~(NS_EVENT_STATE_ACTIVE|NS_EVENT_STATE_HOVER);
if (aContent && simpleStates != 0) {
if (aContent && !simpleStates.IsEmpty()) {
// notify about new content too
notifyContent[0] = aContent;
NS_ADDREF(aContent); // everything in notify array has a ref

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

@ -118,9 +118,9 @@ public:
NS_IMETHOD GetEventTarget(nsIFrame **aFrame);
NS_IMETHOD GetEventTargetContent(nsEvent* aEvent, nsIContent** aContent);
virtual PRInt32 GetContentState(nsIContent *aContent,
PRBool aFollowLabels = PR_FALSE);
virtual PRBool SetContentState(nsIContent *aContent, PRInt32 aState);
virtual nsEventStates GetContentState(nsIContent *aContent,
PRBool aFollowLabels = PR_FALSE);
virtual PRBool SetContentState(nsIContent *aContent, nsEventStates aState);
NS_IMETHOD ContentRemoved(nsIDocument* aDocument, nsIContent* aContent);
NS_IMETHOD EventStatusOK(nsGUIEvent* aEvent, PRBool *aOK);

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

@ -2730,13 +2730,13 @@ nsGenericHTMLFormElement::IsSubmittableControl() const
type & NS_FORM_INPUT_ELEMENT;
}
PRInt32
nsEventStates
nsGenericHTMLFormElement::IntrinsicState() const
{
// If you add attribute-dependent states here, you need to add them them to
// AfterSetAttr too. And add them to AfterSetAttr for all subclasses that
// implement IntrinsicState() and are affected by that attribute.
PRInt32 state = nsGenericHTMLElement::IntrinsicState();
nsEventStates state = nsGenericHTMLElement::IntrinsicState();
if (CanBeDisabled()) {
// :enabled/:disabled
@ -2949,7 +2949,7 @@ nsGenericHTMLFormElement::UpdateFieldSet()
}
void
nsGenericHTMLFormElement::FieldSetDisabledChanged(PRInt32 aStates, PRBool aNotify)
nsGenericHTMLFormElement::FieldSetDisabledChanged(nsEventStates aStates, PRBool aNotify)
{
if (!aNotify) {
return;
@ -3457,7 +3457,7 @@ nsGenericHTMLElement::IsEditableRoot() const
static void
MakeContentDescendantsEditable(nsIContent *aContent, nsIDocument *aDocument)
{
PRInt32 stateBefore = aContent->IntrinsicState();
nsEventStates stateBefore = aContent->IntrinsicState();
aContent->UpdateEditableState();

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

@ -846,7 +846,7 @@ public:
virtual void UnbindFromTree(PRBool aDeep = PR_TRUE,
PRBool aNullParent = PR_TRUE);
virtual PRUint32 GetDesiredIMEState();
virtual PRInt32 IntrinsicState() const;
virtual nsEventStates IntrinsicState() const;
virtual nsresult PreHandleEvent(nsEventChainPreVisitor& aVisitor);
@ -864,14 +864,14 @@ public:
* @note Classes redefining this method should not call ContentStatesChanged
* but they should pass aStates instead.
*/
virtual void FieldSetDisabledChanged(PRInt32 aStates, PRBool aNotify);
virtual void FieldSetDisabledChanged(nsEventStates aStates, PRBool aNotify);
void FieldSetFirstLegendChanged(PRBool aNotify) {
UpdateFieldSet();
// The disabled state may have change because the element might not be in
// the first legend anymore.
FieldSetDisabledChanged(0, aNotify);
FieldSetDisabledChanged(nsEventStates(), aNotify);
}
/**

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

@ -119,7 +119,7 @@ public:
virtual nsresult Clone(nsINodeInfo *aNodeInfo, nsINode **aResult) const;
virtual PRInt32 IntrinsicState() const;
virtual nsEventStates IntrinsicState() const;
virtual nsXPCClassInfo* GetClassInfo();
};
@ -479,7 +479,7 @@ nsHTMLAnchorElement::ParseAttribute(PRInt32 aNamespaceID,
aResult);
}
PRInt32
nsEventStates
nsHTMLAnchorElement::IntrinsicState() const
{
return Link::LinkState() | nsGenericHTMLElement::IntrinsicState();

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

@ -103,7 +103,7 @@ public:
virtual nsresult Clone(nsINodeInfo *aNodeInfo, nsINode **aResult) const;
virtual PRInt32 IntrinsicState() const;
virtual nsEventStates IntrinsicState() const;
virtual nsXPCClassInfo* GetClassInfo();
};
@ -331,7 +331,7 @@ nsHTMLAreaElement::GetHrefURI() const
return GetHrefURIForAnchors();
}
PRInt32
nsEventStates
nsHTMLAreaElement::IntrinsicState() const
{
return Link::LinkState() | nsGenericHTMLElement::IntrinsicState();

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

@ -110,9 +110,9 @@ public:
NS_IMETHOD SaveState();
PRBool RestoreState(nsPresState* aState);
virtual void FieldSetDisabledChanged(PRInt32 aStates, PRBool aNotify);
virtual void FieldSetDisabledChanged(nsEventStates aStates, PRBool aNotify);
PRInt32 IntrinsicState() const;
nsEventStates IntrinsicState() const;
virtual nsresult BindToTree(nsIDocument* aDocument, nsIContent* aParent,
nsIContent* aBindingParent,
@ -639,7 +639,7 @@ nsresult
nsHTMLButtonElement::AfterSetAttr(PRInt32 aNameSpaceID, nsIAtom* aName,
const nsAString* aValue, PRBool aNotify)
{
PRInt32 states = 0;
nsEventStates states;
if (aNameSpaceID == kNameSpaceID_None) {
if (aName == nsGkAtoms::type) {
@ -655,7 +655,7 @@ nsHTMLButtonElement::AfterSetAttr(PRInt32 aNameSpaceID, nsIAtom* aName,
states |= NS_EVENT_STATE_VALID | NS_EVENT_STATE_INVALID;
}
if (aNotify && states) {
if (aNotify && !states.IsEmpty()) {
nsIDocument* doc = GetCurrentDoc();
if (doc) {
MOZ_AUTO_DOC_UPDATE(doc, UPDATE_CONTENT_STATE, PR_TRUE);
@ -696,10 +696,10 @@ nsHTMLButtonElement::RestoreState(nsPresState* aState)
return PR_FALSE;
}
PRInt32
nsEventStates
nsHTMLButtonElement::IntrinsicState() const
{
PRInt32 state = nsGenericHTMLFormElement::IntrinsicState();
nsEventStates state = nsGenericHTMLFormElement::IntrinsicState();
if (IsCandidateForConstraintValidation()) {
state |= IsValid() ? NS_EVENT_STATE_VALID : NS_EVENT_STATE_INVALID;
@ -738,7 +738,7 @@ nsHTMLButtonElement::UpdateBarredFromConstraintValidation()
}
void
nsHTMLButtonElement::FieldSetDisabledChanged(PRInt32 aStates, PRBool aNotify)
nsHTMLButtonElement::FieldSetDisabledChanged(nsEventStates aStates, PRBool aNotify)
{
UpdateBarredFromConstraintValidation();

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

@ -122,7 +122,7 @@ nsHTMLFieldSetElement::AfterSetAttr(PRInt32 aNameSpaceID, nsIAtom* aName,
PRUint32 length = mElements->Length(PR_TRUE);
for (PRUint32 i=0; i<length; ++i) {
static_cast<nsGenericHTMLFormElement*>(mElements->GetNodeAt(i))
->FieldSetDisabledChanged(0, aNotify);
->FieldSetDisabledChanged(nsEventStates(), aNotify);
}
}

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

@ -140,7 +140,7 @@ public:
nsIContent* aBindingParent,
PRBool aCompileEventHandlers);
virtual PRInt32 IntrinsicState() const;
virtual nsEventStates IntrinsicState() const;
virtual nsresult Clone(nsINodeInfo *aNodeInfo, nsINode **aResult) const;
nsresult CopyInnerTo(nsGenericElement* aDest) const;
@ -583,7 +583,7 @@ nsHTMLImageElement::MaybeLoadImage()
}
}
PRInt32
nsEventStates
nsHTMLImageElement::IntrinsicState() const
{
return nsGenericHTMLElement::IntrinsicState() |

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

@ -799,7 +799,7 @@ nsHTMLInputElement::AfterSetAttr(PRInt32 aNameSpaceID, nsIAtom* aName,
PRBool aNotify)
{
// States changes that have to be passed to ContentStatesChanged().
PRInt32 states = 0;
nsEventStates states;
if (aNameSpaceID == kNameSpaceID_None) {
//
@ -932,7 +932,7 @@ nsHTMLInputElement::AfterSetAttr(PRInt32 aNameSpaceID, nsIAtom* aName,
states |= NS_EVENT_STATE_MOZ_READONLY | NS_EVENT_STATE_MOZ_READWRITE;
}
if (doc && states) {
if (doc && !states.IsEmpty()) {
MOZ_AUTO_DOC_UPDATE(doc, UPDATE_CONTENT_STATE, PR_TRUE);
doc->ContentStatesChanged(this, nsnull, states);
}
@ -3257,13 +3257,13 @@ nsHTMLInputElement::DoneCreatingElement()
SET_BOOLBIT(mBitField, BF_SHOULD_INIT_CHECKED, PR_FALSE);
}
PRInt32
nsEventStates
nsHTMLInputElement::IntrinsicState() const
{
// If you add states here, and they're type-dependent, you need to add them
// to the type case in AfterSetAttr.
PRInt32 state = nsGenericHTMLFormElement::IntrinsicState();
nsEventStates state = nsGenericHTMLFormElement::IntrinsicState();
if (mType == NS_FORM_INPUT_CHECKBOX || mType == NS_FORM_INPUT_RADIO) {
// Check current checked state (:checked)
if (GET_BOOLBIT(mBitField, BF_CHECKED)) {
@ -4413,7 +4413,7 @@ nsHTMLInputElement::OnValueChanged(PRBool aNotify)
}
void
nsHTMLInputElement::FieldSetDisabledChanged(PRInt32 aStates, PRBool aNotify)
nsHTMLInputElement::FieldSetDisabledChanged(nsEventStates aStates, PRBool aNotify)
{
UpdateValueMissingValidityState();
UpdateBarredFromConstraintValidation();

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

@ -159,7 +159,7 @@ public:
virtual PRBool RestoreState(nsPresState* aState);
virtual PRBool AllowDrop();
virtual void FieldSetDisabledChanged(PRInt32 aStates, PRBool aNotify);
virtual void FieldSetDisabledChanged(nsEventStates aStates, PRBool aNotify);
// nsIContent
virtual PRBool IsHTMLFocusable(PRBool aWithMouse, PRBool *aIsFocusable, PRInt32 *aTabIndex);
@ -184,7 +184,7 @@ public:
virtual void DoneCreatingElement();
virtual PRInt32 IntrinsicState() const;
virtual nsEventStates IntrinsicState() const;
// nsITextControlElement
NS_IMETHOD SetValueChanged(PRBool aValueChanged);

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

@ -117,7 +117,7 @@ public:
virtual nsresult Clone(nsINodeInfo *aNodeInfo, nsINode **aResult) const;
virtual PRInt32 IntrinsicState() const;
virtual nsEventStates IntrinsicState() const;
virtual nsXPCClassInfo* GetClassInfo();
protected:
@ -444,7 +444,7 @@ nsHTMLLinkElement::GetStyleSheetInfo(nsAString& aTitle,
return;
}
PRInt32
nsEventStates
nsHTMLLinkElement::IntrinsicState() const
{
return Link::LinkState() | nsGenericHTMLElement::IntrinsicState();

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

@ -122,7 +122,7 @@ public:
nsAttrValue &aResult);
virtual nsMapRuleToAttributesFunc GetAttributeMappingFunction() const;
NS_IMETHOD_(PRBool) IsAttributeMapped(const nsIAtom *aAttribute) const;
virtual PRInt32 IntrinsicState() const;
virtual nsEventStates IntrinsicState() const;
virtual void DestroyContent();
// nsObjectLoadingContent
@ -524,7 +524,7 @@ nsHTMLObjectElement::StartObjectLoad(PRBool aNotify)
SetIsNetworkCreated(PR_FALSE);
}
PRInt32
nsEventStates
nsHTMLObjectElement::IntrinsicState() const
{
return nsGenericHTMLFormElement::IntrinsicState() | ObjectState();

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

@ -82,7 +82,7 @@ public:
// nsIContent
virtual nsresult PreHandleEvent(nsEventChainPreVisitor& aVisitor);
virtual PRInt32 IntrinsicState() const;
virtual nsEventStates IntrinsicState() const;
virtual nsresult Clone(nsINodeInfo *aNodeInfo, nsINode **aResult) const;
@ -194,10 +194,10 @@ nsHTMLOptGroupElement::RemoveChildAt(PRUint32 aIndex, PRBool aNotify, PRBool aMu
return rv;
}
PRInt32
nsEventStates
nsHTMLOptGroupElement::IntrinsicState() const
{
PRInt32 state = nsGenericHTMLElement::IntrinsicState();
nsEventStates state = nsGenericHTMLElement::IntrinsicState();
if (HasAttr(kNameSpaceID_None, nsGkAtoms::disabled)) {
state |= NS_EVENT_STATE_DISABLED;

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

@ -338,10 +338,10 @@ nsHTMLOptionElement::SetText(const nsAString& aText)
return nsContentUtils::SetNodeTextContent(this, aText, PR_TRUE);
}
PRInt32
nsEventStates
nsHTMLOptionElement::IntrinsicState() const
{
PRInt32 state = nsGenericHTMLElement::IntrinsicState();
nsEventStates state = nsGenericHTMLElement::IntrinsicState();
// Nasty hack because we need to call an interface method, and one that
// toggles some of our hidden internal state at that! Would that we could
// use |mutable|.

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

@ -91,7 +91,7 @@ public:
void SetSelectedInternal(PRBool aValue, PRBool aNotify);
// nsIContent
virtual PRInt32 IntrinsicState() const;
virtual nsEventStates IntrinsicState() const;
virtual nsresult Clone(nsINodeInfo *aNodeInfo, nsINode **aResult) const;

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

@ -1490,10 +1490,10 @@ nsHTMLSelectElement::PreHandleEvent(nsEventChainPreVisitor& aVisitor)
return nsGenericHTMLFormElement::PreHandleEvent(aVisitor);
}
PRInt32
nsEventStates
nsHTMLSelectElement::IntrinsicState() const
{
PRInt32 state = nsGenericHTMLFormElement::IntrinsicState();
nsEventStates state = nsGenericHTMLFormElement::IntrinsicState();
if (IsCandidateForConstraintValidation()) {
state |= IsValid() ? NS_EVENT_STATE_VALID : NS_EVENT_STATE_INVALID;
@ -2098,7 +2098,7 @@ nsHTMLSelectElement::UpdateBarredFromConstraintValidation()
}
void
nsHTMLSelectElement::FieldSetDisabledChanged(PRInt32 aStates, PRBool aNotify)
nsHTMLSelectElement::FieldSetDisabledChanged(nsEventStates aStates, PRBool aNotify)
{
UpdateBarredFromConstraintValidation();

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

@ -277,9 +277,9 @@ public:
NS_IMETHOD SaveState();
virtual PRBool RestoreState(nsPresState* aState);
virtual void FieldSetDisabledChanged(PRInt32 aStates, PRBool aNotify);
virtual void FieldSetDisabledChanged(nsEventStates aStates, PRBool aNotify);
PRInt32 IntrinsicState() const;
nsEventStates IntrinsicState() const;
// nsISelectElement
NS_DECL_NSISELECTELEMENT

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

@ -122,7 +122,7 @@ public:
nsAttrValue &aResult);
virtual nsMapRuleToAttributesFunc GetAttributeMappingFunction() const;
NS_IMETHOD_(PRBool) IsAttributeMapped(const nsIAtom *aAttribute) const;
virtual PRInt32 IntrinsicState() const;
virtual nsEventStates IntrinsicState() const;
virtual void DestroyContent();
// nsObjectLoadingContent
@ -455,7 +455,7 @@ nsHTMLSharedObjectElement::StartObjectLoad(PRBool aNotify)
}
}
PRInt32
nsEventStates
nsHTMLSharedObjectElement::IntrinsicState() const
{
return nsGenericHTMLElement::IntrinsicState() | ObjectState();

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

@ -131,9 +131,9 @@ public:
NS_IMETHOD SaveState();
virtual PRBool RestoreState(nsPresState* aState);
virtual void FieldSetDisabledChanged(PRInt32 aStates, PRBool aNotify);
virtual void FieldSetDisabledChanged(nsEventStates aStates, PRBool aNotify);
virtual PRInt32 IntrinsicState() const;
virtual nsEventStates IntrinsicState() const;
// nsITextControlElemet
NS_IMETHOD SetValueChanged(PRBool aValueChanged);
@ -989,10 +989,10 @@ nsHTMLTextAreaElement::RestoreState(nsPresState* aState)
return PR_FALSE;
}
PRInt32
nsEventStates
nsHTMLTextAreaElement::IntrinsicState() const
{
PRInt32 state = nsGenericHTMLFormElement::IntrinsicState();
nsEventStates state = nsGenericHTMLFormElement::IntrinsicState();
if (HasAttr(kNameSpaceID_None, nsGkAtoms::required)) {
state |= NS_EVENT_STATE_REQUIRED;
@ -1109,7 +1109,7 @@ nsresult
nsHTMLTextAreaElement::AfterSetAttr(PRInt32 aNameSpaceID, nsIAtom* aName,
const nsAString* aValue, PRBool aNotify)
{
PRInt32 states = 0;
nsEventStates states;
if (aNameSpaceID == kNameSpaceID_None) {
if (aName == nsGkAtoms::required || aName == nsGkAtoms::disabled ||
@ -1136,7 +1136,7 @@ nsHTMLTextAreaElement::AfterSetAttr(PRInt32 aNameSpaceID, nsIAtom* aName,
states |= NS_EVENT_STATE_MOZ_READONLY | NS_EVENT_STATE_MOZ_READWRITE;
}
if (doc && states) {
if (doc && !states.IsEmpty()) {
MOZ_AUTO_DOC_UPDATE(doc, UPDATE_CONTENT_STATE, PR_TRUE);
doc->ContentStatesChanged(this, nsnull, states);
}
@ -1405,7 +1405,7 @@ nsHTMLTextAreaElement::OnValueChanged(PRBool aNotify)
}
void
nsHTMLTextAreaElement::FieldSetDisabledChanged(PRInt32 aStates, PRBool aNotify)
nsHTMLTextAreaElement::FieldSetDisabledChanged(nsEventStates aStates, PRBool aNotify)
{
UpdateValueMissingValidityState();
UpdateBarredFromConstraintValidation();

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

@ -436,11 +436,11 @@ nsMathMLElement::MapMathMLAttributesInto(const nsMappedAttributes* aAttributes,
NS_IMPL_ELEMENT_CLONE(nsMathMLElement)
PRInt32
nsEventStates
nsMathMLElement::IntrinsicState() const
{
return nsMathMLElementBase::IntrinsicState() |
(mIncrementScriptLevel ? NS_EVENT_STATE_INCREMENT_SCRIPT_LEVEL : 0);
(mIncrementScriptLevel ? NS_EVENT_STATE_INCREMENT_SCRIPT_LEVEL : nsEventStates());
}
PRBool

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

@ -90,7 +90,7 @@ public:
nsRuleData* aRuleData);
nsresult Clone(nsINodeInfo*, nsINode**) const;
virtual PRInt32 IntrinsicState() const;
virtual nsEventStates IntrinsicState() const;
virtual PRBool IsNodeOfType(PRUint32 aFlags) const;
// Set during reflow as necessary. Does a style change notification,

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

@ -276,7 +276,7 @@ nsSVGAElement::GetLinkTarget(nsAString& aTarget)
}
}
PRInt32
nsEventStates
nsSVGAElement::IntrinsicState() const
{
return Link::LinkState() | nsSVGAElementBase::IntrinsicState();

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

@ -92,7 +92,7 @@ public:
virtual void GetLinkTarget(nsAString& aTarget);
virtual nsLinkState GetLinkState() const;
virtual already_AddRefed<nsIURI> GetHrefURI() const;
virtual PRInt32 IntrinsicState() const;
virtual nsEventStates IntrinsicState() const;
nsresult SetAttr(PRInt32 aNameSpaceID, nsIAtom* aName,
const nsAString& aValue, PRBool aNotify)
{

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

@ -5337,7 +5337,7 @@ public:
virtual nsresult BindToTree(nsIDocument* aDocument, nsIContent* aParent,
nsIContent* aBindingParent,
PRBool aCompileEventHandlers);
virtual PRInt32 IntrinsicState() const;
virtual nsEventStates IntrinsicState() const;
// imgIDecoderObserver
NS_IMETHOD OnStopDecode(imgIRequest *aRequest, nsresult status,
@ -5488,7 +5488,7 @@ nsSVGFEImageElement::BindToTree(nsIDocument* aDocument, nsIContent* aParent,
return rv;
}
PRInt32
nsEventStates
nsSVGFEImageElement::IntrinsicState() const
{
return nsSVGFEImageElementBase::IntrinsicState() |

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

@ -212,7 +212,7 @@ nsSVGImageElement::BindToTree(nsIDocument* aDocument, nsIContent* aParent,
return rv;
}
PRInt32
nsEventStates
nsSVGImageElement::IntrinsicState() const
{
return nsSVGImageElementBase::IntrinsicState() |

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

@ -81,7 +81,7 @@ public:
nsIContent* aBindingParent,
PRBool aCompileEventHandlers);
virtual PRInt32 IntrinsicState() const;
virtual nsEventStates IntrinsicState() const;
NS_IMETHOD_(PRBool) IsAttributeMapped(const nsIAtom* name) const;

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

@ -543,13 +543,13 @@ nsXTFElementWrapper::GetExistingAttrNameFromQName(const nsAString& aStr) const
return nodeInfo;
}
PRInt32
nsEventStates
nsXTFElementWrapper::IntrinsicState() const
{
PRInt32 retState = nsXTFElementWrapperBase::IntrinsicState();
if (mIntrinsicState & NS_EVENT_STATE_MOZ_READONLY) {
nsEventStates retState = nsXTFElementWrapperBase::IntrinsicState();
if (mIntrinsicState.HasState(NS_EVENT_STATE_MOZ_READONLY)) {
retState &= ~NS_EVENT_STATE_MOZ_READWRITE;
} else if (mIntrinsicState & NS_EVENT_STATE_MOZ_READWRITE) {
} else if (mIntrinsicState.HasState(NS_EVENT_STATE_MOZ_READWRITE)) {
retState &= ~NS_EVENT_STATE_MOZ_READONLY;
}
@ -901,21 +901,22 @@ nsXTFElementWrapper::PostHandleEvent(nsEventChainPostVisitor& aVisitor)
}
NS_IMETHODIMP
nsXTFElementWrapper::SetIntrinsicState(PRUint64 aNewState)
nsXTFElementWrapper::SetIntrinsicState(nsEventStates::InternalType aNewState)
{
nsIDocument *doc = GetCurrentDoc();
PRUint64 bits = mIntrinsicState ^ aNewState;
if (!doc || !bits)
nsEventStates newStates(aNewState);
nsEventStates bits = mIntrinsicState ^ newStates;
if (!doc || bits.IsEmpty())
return NS_OK;
NS_WARN_IF_FALSE(!((aNewState & NS_EVENT_STATE_MOZ_READONLY) &&
(aNewState & NS_EVENT_STATE_MOZ_READWRITE)),
NS_WARN_IF_FALSE(!newStates.HasAllStates(NS_EVENT_STATE_MOZ_READONLY |
NS_EVENT_STATE_MOZ_READWRITE),
"Both READONLY and READWRITE are being set. Yikes!!!");
mIntrinsicState = aNewState;
mIntrinsicState = newStates;
mozAutoDocUpdate upd(doc, UPDATE_CONTENT_STATE, PR_TRUE);
doc->ContentStatesChanged(this, nsnull, (PRInt32)bits);
doc->ContentStatesChanged(this, nsnull, bits);
return NS_OK;
}

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

@ -108,7 +108,7 @@ public:
PRUint32 GetAttrCount() const;
virtual already_AddRefed<nsINodeInfo> GetExistingAttrNameFromQName(const nsAString& aStr) const;
virtual PRInt32 IntrinsicState() const;
virtual nsEventStates IntrinsicState() const;
virtual void BeginAddingChildren();
virtual nsresult DoneAddingChildren(PRBool aHaveNotified);
@ -187,7 +187,7 @@ protected:
* The intrinsic state of the element.
* @see nsIContent::IntrinsicState()
*/
PRUint64 mIntrinsicState;
nsEventStates mIntrinsicState;
// Temporary owner used by GetAttrNameAt
nsAttrName mTmpAttrName;

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

@ -1355,9 +1355,9 @@ nsXULElement::UnsetAttr(PRInt32 aNameSpaceID, nsIAtom* aName, PRBool aNotify)
// When notifying, make sure to keep track of states whose value
// depends solely on the value of an attribute.
PRUint32 stateMask;
nsEventStates stateMask;
if (aNotify) {
stateMask = PRUint32(IntrinsicState());
stateMask = IntrinsicState();
nsNodeUtils::AttributeWillChange(this, aNameSpaceID, aName,
nsIDOMMutationEvent::REMOVAL);
@ -1459,8 +1459,8 @@ nsXULElement::UnsetAttr(PRInt32 aNameSpaceID, nsIAtom* aName, PRBool aNotify)
}
if (aNotify) {
stateMask = stateMask ^ PRUint32(IntrinsicState());
if (stateMask && doc) {
stateMask ^= IntrinsicState();
if (doc && !stateMask.IsEmpty()) {
MOZ_AUTO_DOC_UPDATE(doc, UPDATE_CONTENT_STATE, aNotify);
doc->ContentStatesChanged(this, nsnull, stateMask);
}
@ -2239,10 +2239,10 @@ nsXULElement::AddPopupListener(nsIAtom* aName)
return NS_OK;
}
PRInt32
nsEventStates
nsXULElement::IntrinsicState() const
{
PRInt32 state = nsStyledElement::IntrinsicState();
nsEventStates state = nsStyledElement::IntrinsicState();
const nsIAtom* tag = Tag();
if (GetNameSpaceID() == kNameSpaceID_XUL &&

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

@ -564,7 +564,7 @@ public:
NS_DECL_NSIDOMXULELEMENT
virtual nsresult Clone(nsINodeInfo *aNodeInfo, nsINode **aResult) const;
virtual PRInt32 IntrinsicState() const;
virtual nsEventStates IntrinsicState() const;
nsresult EnsureLocalStyle();

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

@ -3909,7 +3909,7 @@ nsHTMLEditor::IsModifiableNode(nsIDOMNode *aNode)
{
nsCOMPtr<nsIContent> content = do_QueryInterface(aNode);
return !content || !(content->IntrinsicState() & NS_EVENT_STATE_MOZ_READONLY);
return !content || !content->IntrinsicState().HasState(NS_EVENT_STATE_MOZ_READONLY);
}
static nsresult SetSelectionAroundHeadChildren(nsCOMPtr<nsISelection> aSelection, nsWeakPtr aDocWeak)

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

@ -1160,7 +1160,7 @@ mozInlineSpellChecker::SkipSpellCheckForNode(nsIEditor* aEditor,
else {
// XXX Do we really want this for all read-write content?
nsCOMPtr<nsIContent> content = do_QueryInterface(aNode);
*checkSpelling = !!(content->IntrinsicState() & NS_EVENT_STATE_MOZ_READWRITE);
*checkSpelling = content->IntrinsicState().HasState(NS_EVENT_STATE_MOZ_READWRITE);
}
return NS_OK;

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

@ -1883,7 +1883,7 @@ nsCSSFrameConstructor::ConstructTable(nsFrameConstructorState& aState,
nsIContent* const content = aItem.mContent;
nsStyleContext* const styleContext = aItem.mStyleContext;
const PRUint32 nameSpaceID = aItem.mNameSpaceID;
nsresult rv = NS_OK;
// create the pseudo SC for the outer table as a child of the inner SC
@ -3650,9 +3650,9 @@ nsCSSFrameConstructor::FindObjectData(nsIContent* aContent,
// cases when the object is broken/suppressed/etc (e.g. a broken image), but
// we want to treat those cases as TYPE_NULL
PRUint32 type;
if (aContent->IntrinsicState() &
(NS_EVENT_STATE_BROKEN | NS_EVENT_STATE_USERDISABLED |
NS_EVENT_STATE_SUPPRESSED)) {
if (aContent->IntrinsicState().HasAtLeastOneOfStates(NS_EVENT_STATE_BROKEN |
NS_EVENT_STATE_USERDISABLED |
NS_EVENT_STATE_SUPPRESSED)) {
type = nsIObjectLoadingContent::TYPE_NULL;
} else {
nsCOMPtr<nsIObjectLoadingContent> objContent(do_QueryInterface(aContent));
@ -8035,7 +8035,7 @@ nsCSSFrameConstructor::RestyleElement(Element *aElement,
nsresult
nsCSSFrameConstructor::ContentStatesChanged(nsIContent* aContent1,
nsIContent* aContent2,
PRInt32 aStateMask)
nsEventStates aStateMask)
{
// XXXbz it would be good if this function only took Elements, but
// we'd have to make ESM guarantee that usefully.
@ -8050,7 +8050,7 @@ nsCSSFrameConstructor::ContentStatesChanged(nsIContent* aContent1,
void
nsCSSFrameConstructor::DoContentStateChanged(Element* aElement,
PRInt32 aStateMask)
nsEventStates aStateMask)
{
nsStyleSet *styleSet = mPresShell->StyleSet();
nsPresContext *presContext = mPresShell->GetPresContext();
@ -8067,8 +8067,10 @@ nsCSSFrameConstructor::DoContentStateChanged(Element* aElement,
if (primaryFrame) {
// If it's generated content, ignore LOADING/etc state changes on it.
if (!primaryFrame->IsGeneratedContentFrame() &&
(aStateMask & (NS_EVENT_STATE_BROKEN | NS_EVENT_STATE_USERDISABLED |
NS_EVENT_STATE_SUPPRESSED | NS_EVENT_STATE_LOADING))) {
aStateMask.HasAtLeastOneOfStates(NS_EVENT_STATE_BROKEN |
NS_EVENT_STATE_USERDISABLED |
NS_EVENT_STATE_SUPPRESSED |
NS_EVENT_STATE_LOADING)) {
hint = nsChangeHint_ReconstructFrame;
} else {
PRUint8 app = primaryFrame->GetStyleDisplay()->mAppearance;
@ -8089,11 +8091,11 @@ nsCSSFrameConstructor::DoContentStateChanged(Element* aElement,
nsRestyleHint rshint =
styleSet->HasStateDependentStyle(presContext, aElement, aStateMask);
if ((aStateMask & NS_EVENT_STATE_HOVER) && rshint != 0) {
if (aStateMask.HasState(NS_EVENT_STATE_HOVER) && rshint != 0) {
++mHoverGeneration;
}
if (aStateMask & NS_EVENT_STATE_VISITED) {
if (aStateMask.HasState(NS_EVENT_STATE_VISITED)) {
// Exposing information to the page about whether the link is
// visited or not isn't really something we can worry about here.
// FIXME: We could probably do this a bit better.

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

@ -235,9 +235,9 @@ public:
nsresult CharacterDataChanged(nsIContent* aContent,
CharacterDataChangeInfo* aInfo);
nsresult ContentStatesChanged(nsIContent* aContent1,
nsIContent* aContent2,
PRInt32 aStateMask);
nsresult ContentStatesChanged(nsIContent* aContent1,
nsIContent* aContent2,
nsEventStates aStateMask);
// generate the child frames and process bindings
nsresult GenerateChildFrames(nsIFrame* aFrame);
@ -416,7 +416,7 @@ private:
nsIFrame*& aCanvasFrame);
void DoContentStateChanged(Element* aElement,
PRInt32 aStateMask);
nsEventStates aStateMask);
/* aMinHint is the minimal change that should be made to the element */
// XXXbz do we really need the aPrimaryFrame argument here?

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

@ -4953,7 +4953,7 @@ void
PresShell::ContentStatesChanged(nsIDocument* aDocument,
nsIContent* aContent1,
nsIContent* aContent2,
PRInt32 aStateMask)
nsEventStates aStateMask)
{
NS_PRECONDITION(!mIsDocumentGone, "Unexpected ContentStatesChanged");
NS_PRECONDITION(aDocument == mDocument, "Unexpected aDocument");
@ -4967,7 +4967,7 @@ PresShell::ContentStatesChanged(nsIDocument* aDocument,
void
PresShell::DocumentStatesChanged(nsIDocument* aDocument,
PRInt32 aStateMask)
nsEventStates aStateMask)
{
NS_PRECONDITION(!mIsDocumentGone, "Unexpected DocumentStatesChanged");
NS_PRECONDITION(aDocument == mDocument, "Unexpected aDocument");
@ -4981,7 +4981,7 @@ PresShell::DocumentStatesChanged(nsIDocument* aDocument,
VERIFY_STYLE_TREE;
}
if (aStateMask & NS_DOCUMENT_STATE_WINDOW_INACTIVE) {
if (aStateMask.HasState(NS_DOCUMENT_STATE_WINDOW_INACTIVE)) {
nsIFrame* root = FrameManager()->GetRootFrame();
if (root) {
// It's a display root. So, invalidate the layer contents of

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

@ -89,7 +89,7 @@ nsButtonFrameRenderer::isDisabled()
{
// NOTE: we might want to remove this method to prevent calling too often
// IntrinsicState().
return (mFrame->GetContent()->IntrinsicState() & NS_EVENT_STATE_DISABLED) != 0;
return mFrame->GetContent()->IntrinsicState().HasState(NS_EVENT_STATE_DISABLED);
}
class nsDisplayButtonBoxShadowOuter : public nsDisplayItem {

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

@ -728,8 +728,8 @@ nsComboboxControlFrame::GetFrameName(nsAString& aResult) const
void
nsComboboxControlFrame::ShowDropDown(PRBool aDoDropDown)
{
PRInt32 eventStates = mContent->IntrinsicState();
if (eventStates & NS_EVENT_STATE_DISABLED) {
nsEventStates eventStates = mContent->IntrinsicState();
if (eventStates.HasState(NS_EVENT_STATE_DISABLED)) {
return;
}
@ -928,8 +928,8 @@ nsComboboxControlFrame::HandleEvent(nsPresContext* aPresContext,
return NS_OK;
}
PRInt32 eventStates = mContent->IntrinsicState();
if (eventStates & NS_EVENT_STATE_DISABLED) {
nsEventStates eventStates = mContent->IntrinsicState();
if (eventStates.HasState(NS_EVENT_STATE_DISABLED)) {
return NS_OK;
}
@ -1386,8 +1386,8 @@ void nsComboboxControlFrame::PaintFocus(nsIRenderingContext& aRenderingContext,
nsPoint aPt)
{
/* Do we need to do anything? */
PRInt32 eventStates = mContent->IntrinsicState();
if ((eventStates & NS_EVENT_STATE_DISABLED) || mFocused != this)
nsEventStates eventStates = mContent->IntrinsicState();
if (eventStates.HasState(NS_EVENT_STATE_DISABLED) || mFocused != this)
return;
aRenderingContext.PushState();

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

@ -681,8 +681,8 @@ nsFileControlFrame::BuildDisplayList(nsDisplayListBuilder* aBuilder,
// Disabled file controls don't pass mouse events to their children, so we
// put an invisible item in the display list above the children
// just to catch events
PRInt32 eventStates = mContent->IntrinsicState();
if ((eventStates & NS_EVENT_STATE_DISABLED) && IsVisibleForPainting(aBuilder)) {
nsEventStates eventStates = mContent->IntrinsicState();
if (eventStates.HasState(NS_EVENT_STATE_DISABLED) && IsVisibleForPainting(aBuilder)) {
rv = aLists.Content()->AppendNewToTop(
new (aBuilder) nsDisplayEventReceiver(aBuilder, this));
if (NS_FAILED(rv))

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

@ -1101,8 +1101,8 @@ nsListControlFrame::HandleEvent(nsPresContext* aPresContext,
if (uiStyle->mUserInput == NS_STYLE_USER_INPUT_NONE || uiStyle->mUserInput == NS_STYLE_USER_INPUT_DISABLED)
return nsFrame::HandleEvent(aPresContext, aEvent, aEventStatus);
PRInt32 eventStates = mContent->IntrinsicState();
if (eventStates & NS_EVENT_STATE_DISABLED)
nsEventStates eventStates = mContent->IntrinsicState();
if (eventStates.HasState(NS_EVENT_STATE_DISABLED))
return NS_OK;
return nsHTMLScrollFrame::HandleEvent(aPresContext, aEvent, aEventStatus);
@ -1962,8 +1962,8 @@ nsListControlFrame::MouseUp(nsIDOMEvent* aMouseEvent)
mButtonDown = PR_FALSE;
PRInt32 eventStates = mContent->IntrinsicState();
if (eventStates & NS_EVENT_STATE_DISABLED) {
nsEventStates eventStates = mContent->IntrinsicState();
if (eventStates.HasState(NS_EVENT_STATE_DISABLED)) {
return NS_OK;
}
@ -2172,8 +2172,8 @@ nsListControlFrame::MouseDown(nsIDOMEvent* aMouseEvent)
UpdateInListState(aMouseEvent);
PRInt32 eventStates = mContent->IntrinsicState();
if (eventStates & NS_EVENT_STATE_DISABLED) {
nsEventStates eventStates = mContent->IntrinsicState();
if (eventStates.HasState(NS_EVENT_STATE_DISABLED)) {
return NS_OK;
}
@ -2479,8 +2479,8 @@ nsListControlFrame::KeyPress(nsIDOMEvent* aKeyEvent)
{
NS_ASSERTION(aKeyEvent, "keyEvent is null.");
PRInt32 eventStates = mContent->IntrinsicState();
if (eventStates & NS_EVENT_STATE_DISABLED)
nsEventStates eventStates = mContent->IntrinsicState();
if (eventStates.HasState(NS_EVENT_STATE_DISABLED))
return NS_OK;
// Start by making sure we can query for a key event

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

@ -448,17 +448,17 @@ nsImageFrame::SourceRectToDest(const nsIntRect& aRect)
// This is a macro so that we don't evaluate the boolean last arg
// unless we have to; it can be expensive
#define IMAGE_OK(_state, _loadingOK) \
(((_state) & BAD_STATES) == 0 || \
(((_state) & BAD_STATES) == NS_EVENT_STATE_LOADING && \
(_loadingOK)))
#define IMAGE_OK(_state, _loadingOK) \
(!(_state).HasAtLeastOneOfStates(BAD_STATES) || \
(!(_state).HasAtLeastOneOfStates(NS_EVENT_STATE_BROKEN | NS_EVENT_STATE_USERDISABLED) && \
(_state).HasState(NS_EVENT_STATE_LOADING) && (_loadingOK)))
/* static */
PRBool
nsImageFrame::ShouldCreateImageFrameFor(nsIContent* aContent,
nsStyleContext* aStyleContext)
{
PRInt32 state = aContent->IntrinsicState();
nsEventStates state = aContent->IntrinsicState();
if (IMAGE_OK(state,
HaveFixedSize(aStyleContext->GetStylePosition()))) {
// Image is fine; do the image frame thing
@ -1261,7 +1261,7 @@ nsImageFrame::BuildDisplayList(nsDisplayListBuilder* aBuilder,
getter_AddRefs(currentRequest));
}
PRInt32 contentState = mContent->IntrinsicState();
nsEventStates contentState = mContent->IntrinsicState();
PRBool imageOK = IMAGE_OK(contentState, PR_TRUE);
nsCOMPtr<imgIContainer> imgCon;

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

@ -232,7 +232,7 @@ inDOMUtils::GetBindingURLs(nsIDOMElement *aElement, nsIArray **_retval)
}
NS_IMETHODIMP
inDOMUtils::SetContentState(nsIDOMElement *aElement, PRUint64 aState)
inDOMUtils::SetContentState(nsIDOMElement *aElement, nsEventStates::InternalType aState)
{
NS_ENSURE_ARG_POINTER(aElement);
@ -241,14 +241,14 @@ inDOMUtils::SetContentState(nsIDOMElement *aElement, PRUint64 aState)
nsCOMPtr<nsIContent> content;
content = do_QueryInterface(aElement);
return esm->SetContentState(content, (PRInt32)aState);
return esm->SetContentState(content, nsEventStates(aState));
}
return NS_ERROR_FAILURE;
}
NS_IMETHODIMP
inDOMUtils::GetContentState(nsIDOMElement *aElement, PRUint64* aState)
inDOMUtils::GetContentState(nsIDOMElement *aElement, nsEventStates::InternalType* aState)
{
*aState = 0;
@ -258,7 +258,9 @@ inDOMUtils::GetContentState(nsIDOMElement *aElement, PRUint64* aState)
if (esm) {
nsCOMPtr<nsIContent> content;
content = do_QueryInterface(aElement);
*aState = esm->GetContentState(content);
// NOTE: if this method is removed,
// please remove GetInternalValue from nsEventStates
*aState = esm->GetContentState(content).GetInternalValue();
return NS_OK;
}

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

@ -818,7 +818,7 @@ struct RuleCascadeData {
RuleHash*
mPseudoElementRuleHashes[nsCSSPseudoElements::ePseudo_PseudoElementCount];
nsTArray<nsCSSSelector*> mStateSelectors;
PRUint32 mSelectorDocumentStates;
nsEventStates mSelectorDocumentStates;
PLDHashTable mClassSelectors;
nsTArray<nsCSSSelector*> mPossiblyNegatedClassSelectors;
nsTArray<nsCSSSelector*> mIDSelectors;
@ -1228,7 +1228,7 @@ const nsString* RuleProcessorData::GetLang()
return mLanguage;
}
PRUint32
nsEventStates
RuleProcessorData::ContentState()
{
if (!mGotContentState) {
@ -1243,15 +1243,15 @@ RuleProcessorData::ContentState()
// expose that :visited support is disabled to the Web page.
if ((!gSupportVisitedPseudo ||
gPrivateBrowsingObserver->InPrivateBrowsing()) &&
(mContentState & NS_EVENT_STATE_VISITED)) {
mContentState = (mContentState & ~PRUint32(NS_EVENT_STATE_VISITED)) |
NS_EVENT_STATE_UNVISITED;
mContentState.HasState(NS_EVENT_STATE_VISITED)) {
mContentState &= ~NS_EVENT_STATE_VISITED;
mContentState |= NS_EVENT_STATE_UNVISITED;
}
}
return mContentState;
}
PRUint32
nsEventStates
RuleProcessorData::DocumentState()
{
return mElement->GetOwnerDoc()->GetDocumentState();
@ -1260,20 +1260,19 @@ RuleProcessorData::DocumentState()
PRBool
RuleProcessorData::IsLink()
{
PRUint32 state = ContentState();
return (state & (NS_EVENT_STATE_VISITED | NS_EVENT_STATE_UNVISITED)) != 0;
nsEventStates state = ContentState();
return state.HasAtLeastOneOfStates(NS_EVENT_STATE_VISITED | NS_EVENT_STATE_UNVISITED);
}
PRUint32
nsEventStates
RuleProcessorData::GetContentStateForVisitedHandling(
nsRuleWalker::VisitedHandlingType aVisitedHandling,
PRBool aIsRelevantLink)
{
PRUint32 contentState = ContentState();
if (contentState & (NS_EVENT_STATE_VISITED | NS_EVENT_STATE_UNVISITED)) {
nsEventStates contentState = ContentState();
if (contentState.HasAtLeastOneOfStates(NS_EVENT_STATE_VISITED | NS_EVENT_STATE_UNVISITED)) {
NS_ABORT_IF_FALSE(IsLink(), "IsLink() should match state");
contentState &=
~PRUint32(NS_EVENT_STATE_VISITED | NS_EVENT_STATE_UNVISITED);
contentState &= ~(NS_EVENT_STATE_VISITED | NS_EVENT_STATE_UNVISITED);
if (aIsRelevantLink) {
switch (aVisitedHandling) {
case nsRuleWalker::eRelevantLinkUnvisited:
@ -1415,7 +1414,7 @@ struct NodeMatchContext {
// we do separate notifications then we might determine the style is
// not state-dependent when it really is (e.g., determining that a
// :hover:active rule no longer matches when both states are unset).
const PRInt32 mStateMask;
const nsEventStates mStateMask;
// Is this link the unique link whose visitedness can affect the style
// of the node being matched? (That link is the nearest link to the
@ -1428,7 +1427,7 @@ struct NodeMatchContext {
// mForStyling is false, we have to assume we don't know.)
const PRBool mIsRelevantLink;
NodeMatchContext(PRInt32 aStateMask, PRBool aIsRelevantLink)
NodeMatchContext(nsEventStates aStateMask, PRBool aIsRelevantLink)
: mStateMask(aStateMask)
, mIsRelevantLink(aIsRelevantLink)
{
@ -1630,21 +1629,21 @@ checkGenericEmptyMatches(RuleProcessorData& data,
return (child == nsnull);
}
// An array of the bits that are relevant for various pseudoclasses.
static const PRUint32 sPseudoClassBits[] = {
// An array of the states that are relevant for various pseudoclasses.
static const nsEventStates sPseudoClassStates[] = {
#define CSS_PSEUDO_CLASS(_name, _value) \
0,
#define CSS_STATE_PSEUDO_CLASS(_name, _value, _bit) \
_bit,
nsEventStates(),
#define CSS_STATE_PSEUDO_CLASS(_name, _value, _states) \
_states,
#include "nsCSSPseudoClassList.h"
#undef CSS_STATE_PSEUDO_CLASS
#undef CSS_PSEUDO_CLASS
// Add more entries for our fake values to make sure we can't
// index out of bounds into this array no matter what.
0,
0
nsEventStates(),
nsEventStates()
};
PR_STATIC_ASSERT(NS_ARRAY_LENGTH(sPseudoClassBits) ==
PR_STATIC_ASSERT(NS_ARRAY_LENGTH(sPseudoClassStates) ==
nsCSSPseudoClasses::ePseudoClass_NotPseudoClass + 1);
// |aDependence| has two functions:
@ -1741,7 +1740,7 @@ static PRBool SelectorMatches(RuleProcessorData &data,
// generally quick to test, and thus earlier). If they were later,
// we'd probably avoid setting those bits in more cases where setting
// them is unnecessary.
NS_ASSERTION(aNodeMatchContext.mStateMask == 0 ||
NS_ASSERTION(aNodeMatchContext.mStateMask.IsEmpty() ||
!aTreeMatchContext.mForStyling,
"mForStyling must be false if we're just testing for "
"state-dependence");
@ -1749,8 +1748,8 @@ static PRBool SelectorMatches(RuleProcessorData &data,
// test for pseudo class match
for (nsPseudoClassList* pseudoClass = aSelector->mPseudoClassList;
pseudoClass; pseudoClass = pseudoClass->mNext) {
PRInt32 statesToCheck = sPseudoClassBits[pseudoClass->mType];
if (!statesToCheck) {
nsEventStates statesToCheck = sPseudoClassStates[pseudoClass->mType];
if (statesToCheck.IsEmpty()) {
// keep the cases here in the same order as the list in
// nsCSSPseudoClassList.h
switch (pseudoClass->mType) {
@ -2026,7 +2025,7 @@ static PRBool SelectorMatches(RuleProcessorData &data,
case nsCSSPseudoClasses::ePseudoClass_mozLocaleDir:
{
PRBool docIsRTL =
(data.DocumentState() & NS_DOCUMENT_STATE_RTL_LOCALE) != 0;
data.DocumentState().HasState(NS_DOCUMENT_STATE_RTL_LOCALE);
nsDependentString dirString(pseudoClass->u.mString);
NS_ASSERTION(dirString.EqualsLiteral("ltr") ||
@ -2070,7 +2069,7 @@ static PRBool SelectorMatches(RuleProcessorData &data,
break;
case nsCSSPseudoClasses::ePseudoClass_mozWindowInactive:
if ((data.DocumentState() & NS_DOCUMENT_STATE_WINDOW_INACTIVE) == 0) {
if (!data.DocumentState().HasState(NS_DOCUMENT_STATE_WINDOW_INACTIVE)) {
return PR_FALSE;
}
break;
@ -2095,7 +2094,7 @@ static PRBool SelectorMatches(RuleProcessorData &data,
}
} else {
// Bit-based pseudo-classes
if ((statesToCheck & (NS_EVENT_STATE_HOVER | NS_EVENT_STATE_ACTIVE)) &&
if (statesToCheck.HasAtLeastOneOfStates(NS_EVENT_STATE_HOVER | NS_EVENT_STATE_ACTIVE) &&
data.mCompatMode == eCompatibility_NavQuirks &&
// global selector (but don't check .class):
!aSelector->HasTagSelector() && !aSelector->mIDList &&
@ -2112,14 +2111,14 @@ static PRBool SelectorMatches(RuleProcessorData &data,
// selectors ":hover" and ":active".
return PR_FALSE;
} else {
if (aNodeMatchContext.mStateMask & statesToCheck) {
if (aNodeMatchContext.mStateMask.HasAtLeastOneOfStates(statesToCheck)) {
if (aDependence)
*aDependence = PR_TRUE;
} else {
PRUint32 contentState = data.GetContentStateForVisitedHandling(
aTreeMatchContext.mVisitedHandling,
aNodeMatchContext.mIsRelevantLink);
if (!(contentState & statesToCheck)) {
nsEventStates contentState = data.GetContentStateForVisitedHandling(
aTreeMatchContext.mVisitedHandling,
aNodeMatchContext.mIsRelevantLink);
if (!contentState.HasAtLeastOneOfStates(statesToCheck)) {
return PR_FALSE;
}
}
@ -2296,7 +2295,8 @@ static PRBool SelectorMatchesTree(RuleProcessorData& aPrevData,
if (! data) {
return PR_FALSE;
}
NodeMatchContext nodeContext(0, aLookForRelevantLink && data->IsLink());
NodeMatchContext nodeContext(nsEventStates(), aLookForRelevantLink &&
data->IsLink());
if (nodeContext.mIsRelevantLink) {
// If we find an ancestor of the matched node that is a link
// during the matching process, then it's the relevant link (see
@ -2353,7 +2353,7 @@ static void ContentEnumFunc(nsICSSStyleRule* aRule, nsCSSSelector* aSelector,
RuleProcessorData* data = (RuleProcessorData*)aData;
TreeMatchContext treeContext(PR_TRUE, data->mRuleWalker->VisitedHandling());
NodeMatchContext nodeContext(0, data->IsLink());
NodeMatchContext nodeContext(nsEventStates(), data->IsLink());
if (nodeContext.mIsRelevantLink) {
treeContext.mHaveRelevantLink = PR_TRUE;
}
@ -2522,7 +2522,7 @@ nsCSSRuleProcessor::HasDocumentStateDependentStyle(StateRuleProcessorData* aData
{
RuleCascadeData* cascade = GetRuleCascade(aData->mPresContext);
return cascade && (cascade->mSelectorDocumentStates & aData->mStateMask) != 0;
return cascade && cascade->mSelectorDocumentStates.HasAtLeastOneOfStates(aData->mStateMask);
}
struct AttributeEnumData {
@ -2546,7 +2546,7 @@ AttributeEnumFunc(nsCSSSelector* aSelector, AttributeEnumData* aData)
// enumData->change won't change.
TreeMatchContext treeContext(PR_FALSE,
nsRuleWalker::eLinksVisitedOrUnvisited);
NodeMatchContext nodeContext(0, PR_FALSE);
NodeMatchContext nodeContext(nsEventStates(), PR_FALSE);
if ((possibleChange & ~(aData->change)) &&
SelectorMatches(*data, aSelector, nodeContext, treeContext) &&
SelectorMatchesTree(*data, aSelector->mNext, treeContext, PR_FALSE)) {
@ -2698,7 +2698,7 @@ PRBool IsStateSelector(nsCSSSelector& aSelector)
if (pseudoClass->mType >= nsCSSPseudoClasses::ePseudoClass_Count) {
continue;
}
if (sPseudoClassBits[pseudoClass->mType]) {
if (!sPseudoClassStates[pseudoClass->mType].IsEmpty()) {
return PR_TRUE;
}
}
@ -3160,7 +3160,7 @@ nsCSSRuleProcessor::SelectorListMatches(RuleProcessorData& aData,
NS_ASSERTION(!sel->IsPseudoElement(), "Shouldn't have been called");
TreeMatchContext treeContext(PR_FALSE,
nsRuleWalker::eRelevantLinkUnvisited);
NodeMatchContext nodeContext(0, PR_FALSE);
NodeMatchContext nodeContext(nsEventStates(), PR_FALSE);
if (SelectorMatches(aData, sel, nodeContext, treeContext)) {
nsCSSSelector* next = sel->mNext;
if (!next || SelectorMatchesTree(aData, next, treeContext, PR_FALSE)) {

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

@ -220,23 +220,23 @@ nsHTMLStyleSheet::RulesMatching(ElementRuleProcessorData* aData)
// if we have anchor colors, check if this is an anchor with an href
if (tag == nsGkAtoms::a) {
if (mLinkRule || mVisitedRule || mActiveRule) {
PRUint32 state = aData->GetContentStateForVisitedHandling(
nsEventStates state = aData->GetContentStateForVisitedHandling(
ruleWalker->VisitedHandling(),
// If the node being matched is a link,
// it's the relevant link.
aData->IsLink());
if (mLinkRule && (state & NS_EVENT_STATE_UNVISITED)) {
if (mLinkRule && state.HasState(NS_EVENT_STATE_UNVISITED)) {
ruleWalker->Forward(mLinkRule);
ruleWalker->SetHaveRelevantLink();
}
else if (mVisitedRule && (state & NS_EVENT_STATE_VISITED)) {
else if (mVisitedRule && state.HasState(NS_EVENT_STATE_VISITED)) {
ruleWalker->Forward(mVisitedRule);
ruleWalker->SetHaveRelevantLink();
}
// No need to add to the active rule if it's not a link
if (mActiveRule && aData->IsLink() &&
(state & NS_EVENT_STATE_ACTIVE)) {
state.HasState(NS_EVENT_STATE_ACTIVE)) {
ruleWalker->Forward(mActiveRule);
}
} // end link/visited/active rules
@ -275,9 +275,9 @@ nsHTMLStyleSheet::HasStateDependentStyle(StateRuleProcessorData* aData)
if (aData->mIsHTMLContent &&
aData->mContentTag == nsGkAtoms::a &&
aData->IsLink() &&
((mActiveRule && (aData->mStateMask & NS_EVENT_STATE_ACTIVE)) ||
(mLinkRule && (aData->mStateMask & NS_EVENT_STATE_VISITED)) ||
(mVisitedRule && (aData->mStateMask & NS_EVENT_STATE_VISITED)))) {
((mActiveRule && aData->mStateMask.HasState(NS_EVENT_STATE_ACTIVE)) ||
(mLinkRule && aData->mStateMask.HasState(NS_EVENT_STATE_VISITED)) ||
(mVisitedRule && aData->mStateMask.HasState(NS_EVENT_STATE_VISITED)))) {
return eRestyle_Self;
}

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

@ -106,13 +106,13 @@ private:
}
public:
const nsString* GetLang();
PRUint32 ContentState();
PRUint32 DocumentState();
nsEventStates ContentState();
nsEventStates DocumentState();
PRBool IsLink();
PRUint32 GetContentStateForVisitedHandling(
nsRuleWalker::VisitedHandlingType aVisitedHandling,
PRBool aIsRelevantLink);
nsEventStates GetContentStateForVisitedHandling(
nsRuleWalker::VisitedHandlingType aVisitedHandling,
PRBool aIsRelevantLink);
// Returns a 1-based index of the child in its parent. If the child
// is not in its parent's child list (i.e., it is anonymous content),
@ -155,10 +155,11 @@ private:
PRInt32 mNthIndices[2][2];
// mContentState is initialized lazily.
PRInt32 mContentState; // eventStateMgr->GetContentState() or
// mElement->IntrinsicState() if we have no ESM
// adjusted for not supporting :visited (but with
// visitedness information when we support it)
nsEventStates mContentState; // eventStateMgr->GetContentState() or
// mElement->IntrinsicState() if we have no ESM
// adjusted for not supporting :visited (but
// with visitedness information when we support
// it).
PRPackedBool mGotContentState;
};
@ -234,14 +235,14 @@ struct XULTreeRuleProcessorData : public RuleProcessorData {
struct StateRuleProcessorData : public RuleProcessorData {
StateRuleProcessorData(nsPresContext* aPresContext,
mozilla::dom::Element* aElement,
PRInt32 aStateMask)
nsEventStates aStateMask)
: RuleProcessorData(aPresContext, aElement, nsnull),
mStateMask(aStateMask)
{
NS_PRECONDITION(aPresContext, "null pointer");
}
const PRInt32 mStateMask; // |HasStateDependentStyle| for which state(s)?
// Constants defined in nsIEventStateManager.h .
const nsEventStates mStateMask; // |HasStateDependentStyle| for which state(s)?
// Constants defined in nsEventStates.h .
};
struct AttributeRuleProcessorData : public RuleProcessorData {

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

@ -805,7 +805,7 @@ nsStyleSet::ResolveStyleFor(Element* aElement,
return GetContext(aParentContext, ruleNode, visitedRuleNode,
data.IsLink(),
(data.ContentState() & NS_EVENT_STATE_VISITED) != 0,
data.ContentState().HasState(NS_EVENT_STATE_VISITED),
nsnull, nsCSSPseudoElements::ePseudo_NotPseudoElement);
}
@ -1212,7 +1212,7 @@ nsStyleSet::ReparentStyleContext(nsStyleContext* aStyleContext,
struct StatefulData : public StateRuleProcessorData {
StatefulData(nsPresContext* aPresContext,
Element* aElement, PRInt32 aStateMask)
Element* aElement, nsEventStates aStateMask)
: StateRuleProcessorData(aPresContext, aElement, aStateMask),
mHint(nsRestyleHint(0))
{}
@ -1234,7 +1234,7 @@ static PRBool SheetHasDocumentStateStyle(nsIStyleRuleProcessor* aProcessor,
PRBool
nsStyleSet::HasDocumentStateDependentStyle(nsPresContext* aPresContext,
nsIContent* aContent,
PRInt32 aStateMask)
nsEventStates aStateMask)
{
if (!aContent || !aContent->IsElement())
return PR_FALSE;
@ -1255,9 +1255,9 @@ static PRBool SheetHasStatefulStyle(nsIStyleRuleProcessor* aProcessor,
// Test if style is dependent on content state
nsRestyleHint
nsStyleSet::HasStateDependentStyle(nsPresContext* aPresContext,
Element* aElement,
PRInt32 aStateMask)
nsStyleSet::HasStateDependentStyle(nsPresContext* aPresContext,
Element* aElement,
nsEventStates aStateMask)
{
StatefulData data(aPresContext, aElement, aStateMask);
WalkRuleProcessors(SheetHasStatefulStyle, &data, PR_FALSE);

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

@ -185,12 +185,12 @@ class nsStyleSet
// Test if style is dependent on a document state.
PRBool HasDocumentStateDependentStyle(nsPresContext* aPresContext,
nsIContent* aContent,
PRInt32 aStateMask);
nsEventStates aStateMask);
// Test if style is dependent on content state
nsRestyleHint HasStateDependentStyle(nsPresContext* aPresContext,
mozilla::dom::Element* aElement,
PRInt32 aStateMask);
nsEventStates aStateMask);
// Test if style is dependent on the presence of an attribute.
nsRestyleHint HasAttributeDependentStyle(nsPresContext* aPresContext,

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

@ -121,10 +121,10 @@ nsButtonBoxFrame::HandleEvent(nsPresContext* aPresContext,
nsKeyEvent* keyEvent = (nsKeyEvent*)aEvent;
if (NS_VK_SPACE == keyEvent->keyCode) {
// only activate on keyup if we're already in the :hover:active state
const PRInt32 activeHover = NS_EVENT_STATE_ACTIVE | NS_EVENT_STATE_HOVER;
const nsEventStates activeHover = NS_EVENT_STATE_ACTIVE | NS_EVENT_STATE_HOVER;
nsIEventStateManager *esm = aPresContext->EventStateManager();
PRInt32 buttonState = esm->GetContentState(mContent);
if ((buttonState & activeHover) == activeHover) {
nsEventStates buttonState = esm->GetContentState(mContent);
if (buttonState.HasAllStates(activeHover)) {
esm->SetContentState(nsnull, activeHover); // return to normal state
MouseClicked(aPresContext, aEvent);
}

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

@ -818,9 +818,9 @@ nsMenuPopupFrame::HidePopup(PRBool aDeselectMenu, nsPopupState aNewState)
// This code may not the best solution, but we can leave it here until we find the better approach.
nsIEventStateManager *esm = PresContext()->EventStateManager();
PRInt32 state = esm->GetContentState(mContent);
nsEventStates state = esm->GetContentState(mContent);
if (state & NS_EVENT_STATE_HOVER)
if (state.HasState(NS_EVENT_STATE_HOVER))
esm->SetContentState(nsnull, NS_EVENT_STATE_HOVER);
nsMenuFrame* menuFrame = GetParentMenu();

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

@ -823,11 +823,11 @@ void
nsTreeContentView::ContentStatesChanged(nsIDocument* aDocument,
nsIContent* aContent1,
nsIContent* aContent2,
PRInt32 aStateMask)
nsEventStates aStateMask)
{
if (!aContent1 || !mSelection ||
!aContent1->IsHTML() ||
!(aStateMask & NS_EVENT_STATE_CHECKED))
!aStateMask.HasState(NS_EVENT_STATE_CHECKED))
return;
if (aContent1->Tag() == nsGkAtoms::option) {

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

@ -360,7 +360,7 @@ nsHtml5TreeOperation::Perform(nsHtml5TreeOpExecutor* aBuilder,
// the manual notification code is based on nsGenericElement
PRUint32 stateMask = PRUint32(node->IntrinsicState());
nsEventStates stateMask = node->IntrinsicState();
nsNodeUtils::AttributeWillChange(node,
nsuri,
localName,
@ -382,8 +382,8 @@ nsHtml5TreeOperation::Perform(nsHtml5TreeOpExecutor* aBuilder,
}
}
stateMask ^= PRUint32(node->IntrinsicState());
if (stateMask && document) {
stateMask ^= node->IntrinsicState();
if (!stateMask.IsEmpty() && document) {
MOZ_AUTO_DOC_UPDATE(document, UPDATE_CONTENT_STATE, PR_TRUE);
document->ContentStatesChanged(node, nsnull, stateMask);
}

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

@ -103,34 +103,35 @@ protected:
// HITheme drawing routines
void DrawFrame(CGContextRef context, HIThemeFrameKind inKind,
const HIRect& inBoxRect, PRBool inReadOnly, PRInt32 inState);
const HIRect& inBoxRect, PRBool inReadOnly,
nsEventStates inState);
void DrawProgress(CGContextRef context, const HIRect& inBoxRect,
PRBool inIsIndeterminate, PRBool inIsHorizontal,
PRInt32 inValue, PRInt32 inMaxValue, nsIFrame* aFrame);
void DrawTab(CGContextRef context, HIRect inBoxRect, PRInt32 inState,
void DrawTab(CGContextRef context, HIRect inBoxRect, nsEventStates inState,
nsIFrame* aFrame);
void DrawTabPanel(CGContextRef context, const HIRect& inBoxRect, nsIFrame* aFrame);
void DrawScale(CGContextRef context, const HIRect& inBoxRect,
PRInt32 inState, PRBool inDirection, PRBool inIsReverse,
PRInt32 inCurrentValue, PRInt32 inMinValue, PRInt32 inMaxValue,
nsIFrame* aFrame);
nsEventStates inState, PRBool inDirection,
PRBool inIsReverse, PRInt32 inCurrentValue, PRInt32 inMinValue,
PRInt32 inMaxValue, nsIFrame* aFrame);
void DrawCheckboxOrRadio(CGContextRef cgContext, PRBool inCheckbox,
const HIRect& inBoxRect, PRBool inSelected,
PRInt32 inState, nsIFrame* aFrame);
nsEventStates inState, nsIFrame* aFrame);
void DrawSearchField(CGContextRef cgContext, const HIRect& inBoxRect,
nsIFrame* aFrame, PRInt32 inState);
nsIFrame* aFrame, nsEventStates inState);
void DrawPushButton(CGContextRef cgContext, const HIRect& inBoxRect,
PRInt32 inState, nsIFrame* aFrame);
nsEventStates inState, nsIFrame* aFrame);
void DrawButton(CGContextRef context, ThemeButtonKind inKind,
const HIRect& inBoxRect, PRBool inIsDefault,
ThemeButtonValue inValue, ThemeButtonAdornment inAdornment,
PRInt32 inState, nsIFrame* aFrame);
void DrawDropdown(CGContextRef context, const HIRect& inBoxRect, PRInt32 inState,
PRUint8 aWidgetType, nsIFrame* aFrame);
nsEventStates inState, nsIFrame* aFrame);
void DrawDropdown(CGContextRef context, const HIRect& inBoxRect,
nsEventStates inState, PRUint8 aWidgetType,
nsIFrame* aFrame);
void DrawSpinButtons(CGContextRef context, ThemeButtonKind inKind,
const HIRect& inBoxRect,
ThemeDrawState inDrawState,
ThemeButtonAdornment inAdornment, PRInt32 inState,
const HIRect& inBoxRect, ThemeDrawState inDrawState,
ThemeButtonAdornment inAdornment, nsEventStates inState,
nsIFrame* aFrame);
void DrawUnifiedToolbar(CGContextRef cgContext, const HIRect& inBoxRect,
NSWindow* aWindow);
@ -140,7 +141,7 @@ protected:
// Scrollbars
void DrawScrollbar(CGContextRef aCGContext, const HIRect& aBoxRect, nsIFrame *aFrame);
void GetScrollbarPressStates (nsIFrame *aFrame, PRInt32 aButtonStates[]);
void GetScrollbarPressStates (nsIFrame *aFrame, nsEventStates aButtonStates[]);
void GetScrollbarDrawInfo (HIThemeTrackDrawInfo& aTdi, nsIFrame *aFrame,
const CGSize& aSize, PRBool aShouldGetButtonStates);
nsIFrame* GetParentScrollbarFrame(nsIFrame *aFrame);

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

@ -610,7 +610,7 @@ static const CellRenderSettings checkboxSettings = {
void
nsNativeThemeCocoa::DrawCheckboxOrRadio(CGContextRef cgContext, PRBool inCheckbox,
const HIRect& inBoxRect, PRBool inSelected,
PRInt32 inState, nsIFrame* aFrame)
nsEventStates inState, nsIFrame* aFrame)
{
NS_OBJC_BEGIN_TRY_ABORT_BLOCK;
@ -622,9 +622,9 @@ nsNativeThemeCocoa::DrawCheckboxOrRadio(CGContextRef cgContext, PRBool inCheckbo
state = NSMixedState;
[cell setEnabled:!IsDisabled(aFrame, inState)];
[cell setShowsFirstResponder:(inState & NS_EVENT_STATE_FOCUS)];
[cell setShowsFirstResponder:inState.HasState(NS_EVENT_STATE_FOCUS)];
[cell setState:state];
[cell setHighlighted:((inState & NS_EVENT_STATE_ACTIVE) && (inState & NS_EVENT_STATE_HOVER))];
[cell setHighlighted:inState.HasAllStates(NS_EVENT_STATE_ACTIVE | NS_EVENT_STATE_HOVER)];
[cell setControlTint:(FrameIsInActiveWindow(aFrame) ? [NSColor currentControlTint] : NSClearControlTint)];
// Ensure that the control is square.
@ -667,7 +667,7 @@ static const CellRenderSettings searchFieldSettings = {
void
nsNativeThemeCocoa::DrawSearchField(CGContextRef cgContext, const HIRect& inBoxRect,
nsIFrame* aFrame, PRInt32 inState)
nsIFrame* aFrame, nsEventStates inState)
{
NS_OBJC_BEGIN_TRY_ABORT_BLOCK;
@ -715,7 +715,7 @@ static const CellRenderSettings pushButtonSettings = {
void
nsNativeThemeCocoa::DrawPushButton(CGContextRef cgContext, const HIRect& inBoxRect,
PRInt32 inState, nsIFrame* aFrame)
nsEventStates inState, nsIFrame* aFrame)
{
NS_OBJC_BEGIN_TRY_ABORT_BLOCK;
@ -723,10 +723,9 @@ nsNativeThemeCocoa::DrawPushButton(CGContextRef cgContext, const HIRect& inBoxRe
BOOL isDisabled = IsDisabled(aFrame, inState);
[mPushButtonCell setEnabled:!isDisabled];
[mPushButtonCell setHighlighted:((inState & NS_EVENT_STATE_ACTIVE) &&
(inState & NS_EVENT_STATE_HOVER) &&
isActive)];
[mPushButtonCell setShowsFirstResponder:(inState & NS_EVENT_STATE_FOCUS) && !isDisabled && isActive];
[mPushButtonCell setHighlighted:isActive &&
inState.HasAllStates(NS_EVENT_STATE_ACTIVE | NS_EVENT_STATE_HOVER)];
[mPushButtonCell setShowsFirstResponder:inState.HasState(NS_EVENT_STATE_FOCUS) && !isDisabled && isActive];
// If the button is tall enough, draw the square button style so that buttons with
// non-standard content look good. Otherwise draw normal rounded aqua buttons.
@ -831,7 +830,7 @@ void
nsNativeThemeCocoa::DrawButton(CGContextRef cgContext, ThemeButtonKind inKind,
const HIRect& inBoxRect, PRBool inIsDefault,
ThemeButtonValue inValue, ThemeButtonAdornment inAdornment,
PRInt32 inState, nsIFrame* aFrame)
nsEventStates inState, nsIFrame* aFrame)
{
NS_OBJC_BEGIN_TRY_ABORT_BLOCK;
@ -847,7 +846,7 @@ nsNativeThemeCocoa::DrawButton(CGContextRef cgContext, ThemeButtonKind inKind,
if (isDisabled) {
bdi.state = kThemeStateUnavailable;
}
else if ((inState & NS_EVENT_STATE_ACTIVE) && (inState & NS_EVENT_STATE_HOVER)) {
else if (inState.HasAllStates(NS_EVENT_STATE_ACTIVE | NS_EVENT_STATE_HOVER)) {
bdi.state = kThemeStatePressed;
}
else {
@ -859,11 +858,11 @@ nsNativeThemeCocoa::DrawButton(CGContextRef cgContext, ThemeButtonKind inKind,
bdi.state = kThemeStateActive;
}
if (inState & NS_EVENT_STATE_FOCUS && isActive)
if (inState.HasState(NS_EVENT_STATE_FOCUS) && isActive)
bdi.adornment |= kThemeAdornmentFocus;
if (inIsDefault && !isDisabled && isActive &&
!(inState & NS_EVENT_STATE_ACTIVE)) {
!inState.HasState(NS_EVENT_STATE_ACTIVE)) {
bdi.adornment |= kThemeAdornmentDefault;
bdi.animation.time.start = 0;
bdi.animation.time.current = CFAbsoluteTimeGetCurrent();
@ -960,7 +959,8 @@ static const CellRenderSettings editableMenulistSettings = {
void
nsNativeThemeCocoa::DrawDropdown(CGContextRef cgContext, const HIRect& inBoxRect,
PRInt32 inState, PRUint8 aWidgetType, nsIFrame* aFrame)
nsEventStates inState, PRUint8 aWidgetType,
nsIFrame* aFrame)
{
NS_OBJC_BEGIN_TRY_ABORT_BLOCK;
@ -970,7 +970,7 @@ nsNativeThemeCocoa::DrawDropdown(CGContextRef cgContext, const HIRect& inBoxRect
NSCell* cell = isEditable ? (NSCell*)mComboBoxCell : (NSCell*)mDropdownCell;
[cell setEnabled:!IsDisabled(aFrame, inState)];
[cell setShowsFirstResponder:(IsFocused(aFrame) || (inState & NS_EVENT_STATE_FOCUS))];
[cell setShowsFirstResponder:(IsFocused(aFrame) || inState.HasState(NS_EVENT_STATE_FOCUS))];
[cell setHighlighted:IsOpenButton(aFrame)];
[cell setControlTint:(FrameIsInActiveWindow(aFrame) ? [NSColor currentControlTint] : NSClearControlTint)];
@ -985,7 +985,7 @@ void
nsNativeThemeCocoa::DrawSpinButtons(CGContextRef cgContext, ThemeButtonKind inKind,
const HIRect& inBoxRect, ThemeDrawState inDrawState,
ThemeButtonAdornment inAdornment,
PRInt32 inState, nsIFrame* aFrame)
nsEventStates inState, nsIFrame* aFrame)
{
NS_OBJC_BEGIN_TRY_ABORT_BLOCK;
@ -1007,7 +1007,8 @@ nsNativeThemeCocoa::DrawSpinButtons(CGContextRef cgContext, ThemeButtonKind inKi
void
nsNativeThemeCocoa::DrawFrame(CGContextRef cgContext, HIThemeFrameKind inKind,
const HIRect& inBoxRect, PRBool inDisabled, PRInt32 inState)
const HIRect& inBoxRect, PRBool inDisabled,
nsEventStates inState)
{
NS_OBJC_BEGIN_TRY_ABORT_BLOCK;
@ -1023,7 +1024,7 @@ nsNativeThemeCocoa::DrawFrame(CGContextRef cgContext, HIThemeFrameKind inKind,
if (inKind == kHIThemeFrameListBox)
fdi.isFocused = 0;
else
fdi.isFocused = (inState & NS_EVENT_STATE_FOCUS) != 0;
fdi.isFocused = inState.HasState(NS_EVENT_STATE_FOCUS);
// HIThemeDrawFrame takes the rect for the content area of the frame, not
// the bounding rect for the frame. Here we reduce the size of the rect we
@ -1115,7 +1116,7 @@ nsNativeThemeCocoa::DrawTabPanel(CGContextRef cgContext, const HIRect& inBoxRect
void
nsNativeThemeCocoa::DrawScale(CGContextRef cgContext, const HIRect& inBoxRect,
PRInt32 inState, PRBool inIsVertical,
nsEventStates inState, PRBool inIsVertical,
PRBool inIsReverse, PRInt32 inCurrentValue,
PRInt32 inMinValue, PRInt32 inMaxValue,
nsIFrame* aFrame)
@ -1135,7 +1136,7 @@ nsNativeThemeCocoa::DrawScale(CGContextRef cgContext, const HIRect& inBoxRect,
tdi.attributes |= kThemeTrackHorizontal;
if (inIsReverse)
tdi.attributes |= kThemeTrackRightToLeft;
if (inState & NS_EVENT_STATE_FOCUS)
if (inState.HasState(NS_EVENT_STATE_FOCUS))
tdi.attributes |= kThemeTrackHasFocus;
if (IsDisabled(aFrame, inState))
tdi.enableState = kThemeTrackDisabled;
@ -1155,7 +1156,7 @@ nsNativeThemeCocoa::DrawScale(CGContextRef cgContext, const HIRect& inBoxRect,
void
nsNativeThemeCocoa::DrawTab(CGContextRef cgContext, HIRect inBoxRect,
PRInt32 inState, nsIFrame* aFrame)
nsEventStates inState, nsIFrame* aFrame)
{
NS_OBJC_BEGIN_TRY_ABORT_BLOCK;
@ -1174,7 +1175,7 @@ nsNativeThemeCocoa::DrawTab(CGContextRef cgContext, HIRect inBoxRect,
} else {
if (isDisabled)
tdi.style = kThemeTabNonFrontUnavailable;
else if ((inState & NS_EVENT_STATE_ACTIVE) && (inState & NS_EVENT_STATE_HOVER))
else if (inState.HasAllStates(NS_EVENT_STATE_ACTIVE | NS_EVENT_STATE_HOVER))
tdi.style = kThemeTabNonFrontPressed;
else
tdi.style = FrameIsInActiveWindow(aFrame) ? kThemeTabNonFront : kThemeTabNonFrontInactive;
@ -1223,7 +1224,7 @@ nsNativeThemeCocoa::DrawTab(CGContextRef cgContext, HIRect inBoxRect,
inBoxRect.size.width += 1;
}
if (inState & NS_EVENT_STATE_FOCUS)
if (inState.HasState(NS_EVENT_STATE_FOCUS))
tdi.adornment |= kThemeAdornmentFocus;
HIThemeDrawTab(&inBoxRect, &tdi, cgContext, HITHEME_ORIENTATION, NULL);
@ -1232,14 +1233,14 @@ nsNativeThemeCocoa::DrawTab(CGContextRef cgContext, HIRect inBoxRect,
}
static inline UInt8
ConvertToPressState(PRInt32 aButtonState, UInt8 aPressState)
ConvertToPressState(nsEventStates aButtonState, UInt8 aPressState)
{
// If the button is pressed, return the press state passed in. Otherwise, return 0.
return ((aButtonState & NS_EVENT_STATE_ACTIVE) && (aButtonState & NS_EVENT_STATE_HOVER)) ? aPressState : 0;
return aButtonState.HasAllStates(NS_EVENT_STATE_ACTIVE | NS_EVENT_STATE_HOVER) ? aPressState : 0;
}
void
nsNativeThemeCocoa::GetScrollbarPressStates(nsIFrame *aFrame, PRInt32 aButtonStates[])
nsNativeThemeCocoa::GetScrollbarPressStates(nsIFrame *aFrame, nsEventStates aButtonStates[])
{
static nsIContent::AttrValuesArray attributeValues[] = {
&nsWidgetAtoms::scrollbarUpTop,
@ -1260,8 +1261,7 @@ nsNativeThemeCocoa::GetScrollbarPressStates(nsIFrame *aFrame, PRInt32 aButtonSta
attributeValues, eCaseMatters);
if (attrIndex < 0) continue;
PRInt32 currentState = GetContentState(childFrame, NS_THEME_BUTTON);
aButtonStates[attrIndex] = currentState;
aButtonStates[attrIndex] = GetContentState(childFrame, NS_THEME_BUTTON);
}
}
@ -1325,7 +1325,7 @@ nsNativeThemeCocoa::GetScrollbarDrawInfo(HIThemeTrackDrawInfo& aTdi, nsIFrame *a
// Only go get these scrollbar button states if we need it. For example, there's no reaon to look up scrollbar button
// states when we're only creating a TrackDrawInfo to determine the size of the thumb.
if (aShouldGetButtonStates) {
PRInt32 buttonStates[] = {0, 0, 0, 0};
nsEventStates buttonStates[4];
GetScrollbarPressStates(aFrame, buttonStates);
NSString *buttonPlacement = [[NSUserDefaults standardUserDefaults] objectForKey:@"AppleScrollBarVariant"];
// It seems that unless all four buttons are showing, kThemeTopOutsideArrowPressed is the correct constant for
@ -1601,7 +1601,7 @@ nsNativeThemeCocoa::DrawWidgetBackground(nsIRenderingContext* aContext, nsIFrame
//CGContextFillRect(cgContext, bounds);
#endif
PRInt32 eventState = GetContentState(aFrame, aWidgetType);
nsEventStates eventState = GetContentState(aFrame, aWidgetType);
switch (aWidgetType) {
case NS_THEME_DIALOG: {
@ -1927,7 +1927,7 @@ nsNativeThemeCocoa::DrawWidgetBackground(nsIRenderingContext* aContext, nsIFrame
CGContextStrokePath(cgContext);
// draw a focus ring
if (eventState & NS_EVENT_STATE_FOCUS) {
if (eventState.HasState(NS_EVENT_STATE_FOCUS)) {
// We need to bring the rectangle in by 1 pixel on each side.
CGRect cgr = CGRectMake(macRect.origin.x + 1,
macRect.origin.y + 1,

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

@ -255,12 +255,12 @@ nsNativeThemeGTK::GetGtkWidgetAndState(PRUint8 aWidgetType, nsIFrame* aFrame,
stateFrame = aFrame = aFrame->GetParent();
}
PRInt32 eventState = GetContentState(stateFrame, aWidgetType);
nsEventStates eventState = GetContentState(stateFrame, aWidgetType);
aState->disabled = IsDisabled(aFrame, eventState) || IsReadOnly(aFrame);
aState->active = (eventState & NS_EVENT_STATE_ACTIVE) == NS_EVENT_STATE_ACTIVE;
aState->focused = (eventState & NS_EVENT_STATE_FOCUS) == NS_EVENT_STATE_FOCUS;
aState->inHover = (eventState & NS_EVENT_STATE_HOVER) == NS_EVENT_STATE_HOVER;
aState->active = eventState.HasState(NS_EVENT_STATE_ACTIVE);
aState->focused = eventState.HasState(NS_EVENT_STATE_FOCUS);
aState->inHover = eventState.HasState(NS_EVENT_STATE_HOVER);
aState->isDefault = IsDefaultButton(aFrame);
aState->canDefault = FALSE; // XXX fix me
aState->depressed = FALSE;

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

@ -314,7 +314,7 @@ nsNativeThemeQt::DrawWidgetBackground(QPainter *qPainter,
case NS_THEME_TEXTFIELD_MULTILINE:
case NS_THEME_LISTBOX: {
QStyleOptionFrameV2 frameOpt;
PRInt32 eventState = GetContentState(aFrame, aWidgetType);
nsEventStates eventState = GetContentState(aFrame, aWidgetType);
if (!IsDisabled(aFrame, eventState))
frameOpt.state |= QStyle::State_Enabled;
@ -638,7 +638,7 @@ nsNativeThemeQt::InitButtonStyle(PRUint8 aWidgetType,
QRect rect,
QStyleOptionButton &opt)
{
PRInt32 eventState = GetContentState(aFrame, aWidgetType);
nsEventStates eventState = GetContentState(aFrame, aWidgetType);
opt.rect = rect;
opt.palette = mNoBackgroundPalette;
@ -647,11 +647,11 @@ nsNativeThemeQt::InitButtonStyle(PRUint8 aWidgetType,
if (!isDisabled)
opt.state |= QStyle::State_Enabled;
if (eventState & NS_EVENT_STATE_HOVER)
if (eventState.HasState(NS_EVENT_STATE_HOVER))
opt.state |= QStyle::State_MouseOver;
if (eventState & NS_EVENT_STATE_FOCUS)
if (eventState.HasState(NS_EVENT_STATE_FOCUS))
opt.state |= QStyle::State_HasFocus;
if (!isDisabled && (eventState & NS_EVENT_STATE_ACTIVE))
if (!isDisabled && eventState.HasState(NS_EVENT_STATE_ACTIVE))
// Don't allow sunken when disabled
opt.state |= QStyle::State_Sunken;
@ -665,7 +665,7 @@ nsNativeThemeQt::InitButtonStyle(PRUint8 aWidgetType,
break;
default:
if (!(eventState & NS_EVENT_STATE_ACTIVE))
if (!eventState.HasState(NS_EVENT_STATE_ACTIVE))
opt.state |= QStyle::State_Raised;
break;
}
@ -678,15 +678,15 @@ nsNativeThemeQt::InitPlainStyle(PRUint8 aWidgetType,
QStyleOption &opt,
QStyle::State extraFlags)
{
PRInt32 eventState = GetContentState(aFrame, aWidgetType);
nsEventStates eventState = GetContentState(aFrame, aWidgetType);
opt.rect = rect;
if (!IsDisabled(aFrame, eventState))
opt.state |= QStyle::State_Enabled;
if (eventState & NS_EVENT_STATE_HOVER)
if (eventState.HasState(NS_EVENT_STATE_HOVER))
opt.state |= QStyle::State_MouseOver;
if (eventState & NS_EVENT_STATE_FOCUS)
if (eventState.HasState(NS_EVENT_STATE_FOCUS))
opt.state |= QStyle::State_HasFocus;
opt.state |= extraFlags;
@ -698,18 +698,18 @@ nsNativeThemeQt::InitComboStyle(PRUint8 aWidgetType,
QRect rect,
QStyleOptionComboBox &opt)
{
PRInt32 eventState = GetContentState(aFrame, aWidgetType);
nsEventStates eventState = GetContentState(aFrame, aWidgetType);
PRBool isDisabled = IsDisabled(aFrame, eventState);
if (!isDisabled)
opt.state |= QStyle::State_Enabled;
if (eventState & NS_EVENT_STATE_HOVER)
if (eventState.HasState(NS_EVENT_STATE_HOVER))
opt.state |= QStyle::State_MouseOver;
if (eventState & NS_EVENT_STATE_FOCUS)
if (eventState.HasState(NS_EVENT_STATE_FOCUS))
opt.state |= QStyle::State_HasFocus;
if (!(eventState & NS_EVENT_STATE_ACTIVE))
if (!eventState.HasState(NS_EVENT_STATE_ACTIVE))
opt.state |= QStyle::State_Raised;
if (!isDisabled && (eventState & NS_EVENT_STATE_ACTIVE))
if (!isDisabled && eventState.HasState(NS_EVENT_STATE_ACTIVE))
// Don't allow sunken when disabled
opt.state |= QStyle::State_Sunken;

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

@ -137,28 +137,28 @@ static PRInt32 GetTopLevelWindowActiveState(nsIFrame *aFrame)
return mozilla::widget::themeconst::FS_INACTIVE;
}
static PRInt32 GetWindowFrameButtonState(nsIFrame *aFrame, PRInt32 eventState)
static PRInt32 GetWindowFrameButtonState(nsIFrame *aFrame, nsEventStates eventState)
{
if (GetTopLevelWindowActiveState(aFrame) ==
mozilla::widget::themeconst::FS_INACTIVE) {
if (eventState & NS_EVENT_STATE_HOVER)
if (eventState.HasState(NS_EVENT_STATE_HOVER))
return mozilla::widget::themeconst::BS_HOT;
return mozilla::widget::themeconst::BS_INACTIVE;
}
if (eventState & NS_EVENT_STATE_ACTIVE)
if (eventState.HasState(NS_EVENT_STATE_ACTIVE))
return mozilla::widget::themeconst::BS_PUSHED;
else if (eventState & NS_EVENT_STATE_HOVER)
else if (eventState.HasState(NS_EVENT_STATE_HOVER))
return mozilla::widget::themeconst::BS_HOT;
else
return mozilla::widget::themeconst::BS_NORMAL;
}
static PRInt32 GetClassicWindowFrameButtonState(PRInt32 eventState)
static PRInt32 GetClassicWindowFrameButtonState(nsEventStates eventState)
{
if (eventState & NS_EVENT_STATE_ACTIVE)
if (eventState.HasState(NS_EVENT_STATE_ACTIVE))
return DFCS_BUTTONPUSH|DFCS_PUSHED;
else if (eventState & NS_EVENT_STATE_HOVER)
else if (eventState.HasState(NS_EVENT_STATE_HOVER))
return DFCS_BUTTONPUSH|DFCS_HOT;
else
return DFCS_BUTTONPUSH;
@ -440,12 +440,12 @@ PRInt32
nsNativeThemeWin::StandardGetState(nsIFrame* aFrame, PRUint8 aWidgetType,
PRBool wantFocused)
{
PRInt32 eventState = GetContentState(aFrame, aWidgetType);
if (eventState & NS_EVENT_STATE_HOVER && eventState & NS_EVENT_STATE_ACTIVE)
nsEventStates eventState = GetContentState(aFrame, aWidgetType);
if (eventState.HasAllStates(NS_EVENT_STATE_HOVER | NS_EVENT_STATE_ACTIVE))
return TS_ACTIVE;
if (wantFocused && eventState & NS_EVENT_STATE_FOCUS)
if (wantFocused && eventState.HasState(NS_EVENT_STATE_FOCUS))
return TS_FOCUSED;
if (eventState & NS_EVENT_STATE_HOVER)
if (eventState.HasState(NS_EVENT_STATE_HOVER))
return TS_HOVER;
return TS_NORMAL;
@ -487,7 +487,7 @@ nsNativeThemeWin::GetThemePartAndState(nsIFrame* aFrame, PRUint8 aWidgetType,
return NS_OK;
}
PRInt32 eventState = GetContentState(aFrame, aWidgetType);
nsEventStates eventState = GetContentState(aFrame, aWidgetType);
if (IsDisabled(aFrame, eventState)) {
aState = TS_DISABLED;
return NS_OK;
@ -525,8 +525,8 @@ nsNativeThemeWin::GetThemePartAndState(nsIFrame* aFrame, PRUint8 aWidgetType,
inputState = INDETERMINATE;
}
PRInt32 eventState = GetContentState(isXULCheckboxRadio ? aFrame->GetParent()
: aFrame,
nsEventStates eventState = GetContentState(isXULCheckboxRadio ? aFrame->GetParent()
: aFrame,
aWidgetType);
if (IsDisabled(aFrame, eventState)) {
aState = TS_DISABLED;
@ -548,7 +548,7 @@ nsNativeThemeWin::GetThemePartAndState(nsIFrame* aFrame, PRUint8 aWidgetType,
}
case NS_THEME_TEXTFIELD:
case NS_THEME_TEXTFIELD_MULTILINE: {
PRInt32 eventState = GetContentState(aFrame, aWidgetType);
nsEventStates eventState = GetContentState(aFrame, aWidgetType);
if (nsUXThemeData::sIsVistaOrLater) {
/* Note: the NOSCROLL type has a rounded corner in each
@ -576,9 +576,9 @@ nsNativeThemeWin::GetThemePartAndState(nsIFrame* aFrame, PRUint8 aWidgetType,
*/
if (content && content->IsXUL() && IsFocused(aFrame))
aState = TFS_EDITBORDER_FOCUSED;
else if (eventState & NS_EVENT_STATE_ACTIVE || eventState & NS_EVENT_STATE_FOCUS)
else if (eventState.HasAtLeastOneOfStates(NS_EVENT_STATE_ACTIVE | NS_EVENT_STATE_FOCUS))
aState = TFS_EDITBORDER_FOCUSED;
else if (eventState & NS_EVENT_STATE_HOVER)
else if (eventState.HasState(NS_EVENT_STATE_HOVER))
aState = TFS_EDITBORDER_HOVER;
else
aState = TFS_EDITBORDER_NORMAL;
@ -630,7 +630,7 @@ nsNativeThemeWin::GetThemePartAndState(nsIFrame* aFrame, PRUint8 aWidgetType,
return NS_OK;
}
PRInt32 eventState = GetContentState(aFrame, aWidgetType);
nsEventStates eventState = GetContentState(aFrame, aWidgetType);
if (IsDisabled(aFrame, eventState)) {
aState = TS_DISABLED;
return NS_OK;
@ -640,9 +640,9 @@ nsNativeThemeWin::GetThemePartAndState(nsIFrame* aFrame, PRUint8 aWidgetType,
return NS_OK;
}
if (eventState & NS_EVENT_STATE_HOVER && eventState & NS_EVENT_STATE_ACTIVE)
if (eventState.HasAllStates(NS_EVENT_STATE_HOVER | NS_EVENT_STATE_ACTIVE))
aState = TS_ACTIVE;
else if (eventState & NS_EVENT_STATE_HOVER) {
else if (eventState.HasState(NS_EVENT_STATE_HOVER)) {
if (IsCheckedButton(aFrame))
aState = TB_HOVER_CHECKED;
else
@ -668,19 +668,19 @@ nsNativeThemeWin::GetThemePartAndState(nsIFrame* aFrame, PRUint8 aWidgetType,
case NS_THEME_SCROLLBAR_BUTTON_RIGHT: {
aPart = SP_BUTTON;
aState = (aWidgetType - NS_THEME_SCROLLBAR_BUTTON_UP)*4;
PRInt32 eventState = GetContentState(aFrame, aWidgetType);
nsEventStates eventState = GetContentState(aFrame, aWidgetType);
if (!aFrame)
aState += TS_NORMAL;
else if (IsDisabled(aFrame, eventState))
aState += TS_DISABLED;
else {
nsIFrame *parent = aFrame->GetParent();
PRInt32 parentState = GetContentState(parent, parent->GetStyleDisplay()->mAppearance);
if (eventState & NS_EVENT_STATE_HOVER && eventState & NS_EVENT_STATE_ACTIVE)
nsEventStates parentState = GetContentState(parent, parent->GetStyleDisplay()->mAppearance);
if (eventState.HasAllStates(NS_EVENT_STATE_HOVER | NS_EVENT_STATE_ACTIVE))
aState += TS_ACTIVE;
else if (eventState & NS_EVENT_STATE_HOVER)
else if (eventState.HasState(NS_EVENT_STATE_HOVER))
aState += TS_HOVER;
else if (nsUXThemeData::sIsVistaOrLater && parentState & NS_EVENT_STATE_HOVER)
else if (nsUXThemeData::sIsVistaOrLater && parentState.HasState(NS_EVENT_STATE_HOVER))
aState = (aWidgetType - NS_THEME_SCROLLBAR_BUTTON_UP) + SP_BUTTON_IMPLICIT_HOVER_BASE;
else
aState += TS_NORMAL;
@ -698,17 +698,17 @@ nsNativeThemeWin::GetThemePartAndState(nsIFrame* aFrame, PRUint8 aWidgetType,
case NS_THEME_SCROLLBAR_THUMB_VERTICAL: {
aPart = (aWidgetType == NS_THEME_SCROLLBAR_THUMB_HORIZONTAL) ?
SP_THUMBHOR : SP_THUMBVERT;
PRInt32 eventState = GetContentState(aFrame, aWidgetType);
nsEventStates eventState = GetContentState(aFrame, aWidgetType);
if (!aFrame)
aState = TS_NORMAL;
else if (IsDisabled(aFrame, eventState))
aState = TS_DISABLED;
else {
if (eventState & NS_EVENT_STATE_ACTIVE) // Hover is not also a requirement for
// the thumb, since the drag is not canceled
// when you move outside the thumb.
if (eventState.HasState(NS_EVENT_STATE_ACTIVE)) // Hover is not also a requirement for
// the thumb, since the drag is not canceled
// when you move outside the thumb.
aState = TS_ACTIVE;
else if (eventState & NS_EVENT_STATE_HOVER)
else if (eventState.HasState(NS_EVENT_STATE_HOVER))
aState = TS_HOVER;
else
aState = TS_NORMAL;
@ -727,20 +727,20 @@ nsNativeThemeWin::GetThemePartAndState(nsIFrame* aFrame, PRUint8 aWidgetType,
case NS_THEME_SCALE_THUMB_VERTICAL: {
aPart = (aWidgetType == NS_THEME_SCALE_THUMB_HORIZONTAL) ?
TKP_THUMB : TKP_THUMBVERT;
PRInt32 eventState = GetContentState(aFrame, aWidgetType);
nsEventStates eventState = GetContentState(aFrame, aWidgetType);
if (!aFrame)
aState = TS_NORMAL;
else if (IsDisabled(aFrame, eventState)) {
aState = TKP_DISABLED;
}
else {
if (eventState & NS_EVENT_STATE_ACTIVE) // Hover is not also a requirement for
// the thumb, since the drag is not canceled
// when you move outside the thumb.
if (eventState.HasState(NS_EVENT_STATE_ACTIVE)) // Hover is not also a requirement for
// the thumb, since the drag is not canceled
// when you move outside the thumb.
aState = TS_ACTIVE;
else if (eventState & NS_EVENT_STATE_FOCUS)
else if (eventState.HasState(NS_EVENT_STATE_FOCUS))
aState = TKP_FOCUSED;
else if (eventState & NS_EVENT_STATE_HOVER)
else if (eventState.HasState(NS_EVENT_STATE_HOVER))
aState = TS_HOVER;
else
aState = TS_NORMAL;
@ -751,7 +751,7 @@ nsNativeThemeWin::GetThemePartAndState(nsIFrame* aFrame, PRUint8 aWidgetType,
case NS_THEME_SPINNER_DOWN_BUTTON: {
aPart = (aWidgetType == NS_THEME_SPINNER_UP_BUTTON) ?
SPNP_UP : SPNP_DOWN;
PRInt32 eventState = GetContentState(aFrame, aWidgetType);
nsEventStates eventState = GetContentState(aFrame, aWidgetType);
if (!aFrame)
aState = TS_NORMAL;
else if (IsDisabled(aFrame, eventState))
@ -824,7 +824,7 @@ nsNativeThemeWin::GetThemePartAndState(nsIFrame* aFrame, PRUint8 aWidgetType,
return NS_OK;
}
PRInt32 eventState = GetContentState(aFrame, aWidgetType);
nsEventStates eventState = GetContentState(aFrame, aWidgetType);
if (IsDisabled(aFrame, eventState)) {
aState = TS_DISABLED;
return NS_OK;
@ -859,7 +859,7 @@ nsNativeThemeWin::GetThemePartAndState(nsIFrame* aFrame, PRUint8 aWidgetType,
case NS_THEME_DROPDOWN: {
nsIContent* content = aFrame->GetContent();
PRBool isHTML = content && content->IsHTML();
PRInt32 eventState = GetContentState(aFrame, aWidgetType);
nsEventStates eventState = GetContentState(aFrame, aWidgetType);
/* On vista, in HTML, we use CBP_DROPBORDER instead of DROPFRAME for HTML content;
* this gives us the thin outline in HTML content, instead of the gradient-filled
@ -876,11 +876,11 @@ nsNativeThemeWin::GetThemePartAndState(nsIFrame* aFrame, PRUint8 aWidgetType,
} else if (IsOpenButton(aFrame)) {
aState = TS_ACTIVE;
} else {
if (isHTML && eventState & NS_EVENT_STATE_FOCUS)
if (isHTML && eventState.HasState(NS_EVENT_STATE_FOCUS))
aState = TS_ACTIVE;
else if (eventState & NS_EVENT_STATE_HOVER && eventState & NS_EVENT_STATE_ACTIVE)
else if (eventState.HasAllStates(NS_EVENT_STATE_HOVER | NS_EVENT_STATE_ACTIVE))
aState = TS_ACTIVE;
else if (eventState & NS_EVENT_STATE_HOVER)
else if (eventState.HasState(NS_EVENT_STATE_HOVER))
aState = TS_HOVER;
else
aState = TS_NORMAL;
@ -898,7 +898,7 @@ nsNativeThemeWin::GetThemePartAndState(nsIFrame* aFrame, PRUint8 aWidgetType,
if (isHTML || isMenulist)
aFrame = parentFrame;
PRInt32 eventState = GetContentState(aFrame, aWidgetType);
nsEventStates eventState = GetContentState(aFrame, aWidgetType);
aPart = nsUXThemeData::sIsVistaOrLater ? CBP_DROPMARKER_VISTA : CBP_DROPMARKER;
// For HTML controls with author styling, we should fall
@ -946,7 +946,7 @@ nsNativeThemeWin::GetThemePartAndState(nsIFrame* aFrame, PRUint8 aWidgetType,
aState = TS_NORMAL;
// Dropdown button active state doesn't need :hover.
if (eventState & NS_EVENT_STATE_ACTIVE) {
if (eventState.HasState(NS_EVENT_STATE_ACTIVE)) {
if (isOpen && (isHTML || isMenulist)) {
// XXX Button should look active until the mouse is released, but
// without making it look active when the popup is clicked.
@ -954,7 +954,7 @@ nsNativeThemeWin::GetThemePartAndState(nsIFrame* aFrame, PRUint8 aWidgetType,
}
aState = TS_ACTIVE;
}
else if (eventState & NS_EVENT_STATE_HOVER) {
else if (eventState.HasState(NS_EVENT_STATE_HOVER)) {
// No hover effect for XUL menulists and autocomplete dropdown buttons
// while the dropdown menu is open.
if (isOpen) {
@ -978,7 +978,7 @@ nsNativeThemeWin::GetThemePartAndState(nsIFrame* aFrame, PRUint8 aWidgetType,
PRBool isOpen = PR_FALSE;
PRBool isHover = PR_FALSE;
nsIMenuFrame *menuFrame = do_QueryFrame(aFrame);
PRInt32 eventState = GetContentState(aFrame, aWidgetType);
nsEventStates eventState = GetContentState(aFrame, aWidgetType);
isTopLevel = IsTopLevelMenu(aFrame);
@ -1022,7 +1022,7 @@ nsNativeThemeWin::GetThemePartAndState(nsIFrame* aFrame, PRUint8 aWidgetType,
case NS_THEME_MENUARROW:
{
aPart = MENU_POPUPSUBMENU;
PRInt32 eventState = GetContentState(aFrame, aWidgetType);
nsEventStates eventState = GetContentState(aFrame, aWidgetType);
aState = IsDisabled(aFrame, eventState) ? MSM_DISABLED : MSM_NORMAL;
return NS_OK;
}
@ -1030,7 +1030,7 @@ nsNativeThemeWin::GetThemePartAndState(nsIFrame* aFrame, PRUint8 aWidgetType,
case NS_THEME_MENURADIO:
{
PRBool isChecked;
PRInt32 eventState = GetContentState(aFrame, aWidgetType);
nsEventStates eventState = GetContentState(aFrame, aWidgetType);
// NOTE: we can probably use NS_EVENT_STATE_CHECKED
isChecked = CheckBooleanAttr(aFrame, nsWidgetAtoms::checked);
@ -1258,7 +1258,7 @@ RENDER_AGAIN:
if (isChecked)
{
int bgState = MCB_NORMAL;
PRInt32 eventState = GetContentState(aFrame, aWidgetType);
nsEventStates eventState = GetContentState(aFrame, aWidgetType);
// the disabled states are offset by 1
if (IsDisabled(aFrame, eventState))
@ -1349,10 +1349,9 @@ RENDER_AGAIN:
aFrame->GetContent()->IsHTML()) ||
aWidgetType == NS_THEME_SCALE_HORIZONTAL ||
aWidgetType == NS_THEME_SCALE_VERTICAL) {
PRInt32 contentState;
contentState = GetContentState(aFrame, aWidgetType);
nsEventStates contentState = GetContentState(aFrame, aWidgetType);
if (contentState & NS_EVENT_STATE_FOCUS) {
if (contentState.HasState(NS_EVENT_STATE_FOCUS)) {
POINT vpOrg;
HPEN hPen = nsnull;
@ -1375,7 +1374,7 @@ RENDER_AGAIN:
::SelectObject(hdc, hPen);
// If pressed, draw the upper left corner of the dotted rect.
if (contentState & NS_EVENT_STATE_ACTIVE) {
if (contentState.HasState(NS_EVENT_STATE_ACTIVE)) {
::MoveToEx(hdc, widgetRect.left, widgetRect.bottom-1, NULL);
::LineTo(hdc, widgetRect.left, widgetRect.top);
::LineTo(hdc, widgetRect.right-1, widgetRect.top);
@ -2489,7 +2488,7 @@ nsresult nsNativeThemeWin::ClassicGetThemePartAndState(nsIFrame* aFrame, PRUint8
{
switch (aWidgetType) {
case NS_THEME_BUTTON: {
PRInt32 contentState;
nsEventStates contentState;
aPart = DFC_BUTTON;
aState = DFCS_BUTTONPUSH;
@ -2503,7 +2502,7 @@ nsresult nsNativeThemeWin::ClassicGetThemePartAndState(nsIFrame* aFrame, PRUint8
else if (IsCheckedButton(aFrame))
aState |= DFCS_CHECKED;
else {
if (contentState & NS_EVENT_STATE_ACTIVE && contentState & NS_EVENT_STATE_HOVER) {
if (contentState.HasAllStates(NS_EVENT_STATE_ACTIVE | NS_EVENT_STATE_HOVER)) {
aState |= DFCS_PUSHED;
const nsStyleUserInterface *uiData = aFrame->GetStyleUserInterface();
// The down state is flat if the button is focusable
@ -2515,9 +2514,9 @@ nsresult nsNativeThemeWin::ClassicGetThemePartAndState(nsIFrame* aFrame, PRUint8
aFocused = PR_TRUE;
}
}
if ((contentState & NS_EVENT_STATE_FOCUS) ||
(aState == DFCS_BUTTONPUSH && IsDefaultButton(aFrame))) {
aFocused = PR_TRUE;
if (contentState.HasState(NS_EVENT_STATE_FOCUS) ||
(aState == DFCS_BUTTONPUSH && IsDefaultButton(aFrame))) {
aFocused = PR_TRUE;
}
}
@ -2526,7 +2525,7 @@ nsresult nsNativeThemeWin::ClassicGetThemePartAndState(nsIFrame* aFrame, PRUint8
}
case NS_THEME_CHECKBOX:
case NS_THEME_RADIO: {
PRInt32 contentState;
nsEventStates contentState;
aFocused = PR_FALSE;
aPart = DFC_BUTTON;
@ -2552,14 +2551,14 @@ nsresult nsNativeThemeWin::ClassicGetThemePartAndState(nsIFrame* aFrame, PRUint8
contentState = GetContentState(aFrame, aWidgetType);
if (!content->IsXUL() &&
(contentState & NS_EVENT_STATE_FOCUS)) {
contentState.HasState(NS_EVENT_STATE_FOCUS)) {
aFocused = PR_TRUE;
}
if (IsDisabled(aFrame, contentState)) {
aState |= DFCS_INACTIVE;
} else if (contentState & NS_EVENT_STATE_ACTIVE &&
contentState & NS_EVENT_STATE_HOVER) {
} else if (contentState.HasAllStates(NS_EVENT_STATE_ACTIVE |
NS_EVENT_STATE_HOVER)) {
aState |= DFCS_PUSHED;
}
@ -2572,7 +2571,7 @@ nsresult nsNativeThemeWin::ClassicGetThemePartAndState(nsIFrame* aFrame, PRUint8
PRBool isOpen = PR_FALSE;
PRBool isContainer = PR_FALSE;
nsIMenuFrame *menuFrame = do_QueryFrame(aFrame);
PRInt32 eventState = GetContentState(aFrame, aWidgetType);
nsEventStates eventState = GetContentState(aFrame, aWidgetType);
// We indicate top-level-ness using aPart. 0 is a normal menu item,
// 1 is a top-level menu item. The state of the item is composed of
@ -2607,7 +2606,7 @@ nsresult nsNativeThemeWin::ClassicGetThemePartAndState(nsIFrame* aFrame, PRUint8
case NS_THEME_MENURADIO:
case NS_THEME_MENUARROW: {
aState = 0;
PRInt32 eventState = GetContentState(aFrame, aWidgetType);
nsEventStates eventState = GetContentState(aFrame, aWidgetType);
if (IsDisabled(aFrame, eventState))
aState |= DFCS_INACTIVE;
@ -2666,7 +2665,7 @@ nsresult nsNativeThemeWin::ClassicGetThemePartAndState(nsIFrame* aFrame, PRUint8
if (isHTML || isMenulist)
aFrame = parentFrame;
PRInt32 eventState = GetContentState(aFrame, aWidgetType);
nsEventStates eventState = GetContentState(aFrame, aWidgetType);
if (IsDisabled(aFrame, eventState)) {
aState |= DFCS_INACTIVE;
@ -2687,7 +2686,7 @@ nsresult nsNativeThemeWin::ClassicGetThemePartAndState(nsIFrame* aFrame, PRUint8
return NS_OK;
// Dropdown button active state doesn't need :hover.
if (eventState & NS_EVENT_STATE_ACTIVE)
if (eventState.HasState(NS_EVENT_STATE_ACTIVE))
aState |= DFCS_PUSHED | DFCS_FLAT;
#endif
@ -2697,7 +2696,7 @@ nsresult nsNativeThemeWin::ClassicGetThemePartAndState(nsIFrame* aFrame, PRUint8
case NS_THEME_SCROLLBAR_BUTTON_DOWN:
case NS_THEME_SCROLLBAR_BUTTON_LEFT:
case NS_THEME_SCROLLBAR_BUTTON_RIGHT: {
PRInt32 contentState = GetContentState(aFrame, aWidgetType);
nsEventStates contentState = GetContentState(aFrame, aWidgetType);
aPart = DFC_SCROLL;
switch (aWidgetType) {
@ -2719,8 +2718,8 @@ nsresult nsNativeThemeWin::ClassicGetThemePartAndState(nsIFrame* aFrame, PRUint8
aState |= DFCS_INACTIVE;
else {
#ifndef WINCE
if (contentState & NS_EVENT_STATE_HOVER && contentState & NS_EVENT_STATE_ACTIVE)
aState |= DFCS_PUSHED | DFCS_FLAT;
if (contentState.HasAllStates(NS_EVENT_STATE_HOVER | NS_EVENT_STATE_ACTIVE))
aState |= DFCS_PUSHED | DFCS_FLAT;
#endif
}
@ -2728,7 +2727,7 @@ nsresult nsNativeThemeWin::ClassicGetThemePartAndState(nsIFrame* aFrame, PRUint8
}
case NS_THEME_SPINNER_UP_BUTTON:
case NS_THEME_SPINNER_DOWN_BUTTON: {
PRInt32 contentState = GetContentState(aFrame, aWidgetType);
nsEventStates contentState = GetContentState(aFrame, aWidgetType);
aPart = DFC_SCROLL;
switch (aWidgetType) {
@ -2743,7 +2742,7 @@ nsresult nsNativeThemeWin::ClassicGetThemePartAndState(nsIFrame* aFrame, PRUint8
if (IsDisabled(aFrame, contentState))
aState |= DFCS_INACTIVE;
else {
if (contentState & NS_EVENT_STATE_HOVER && contentState & NS_EVENT_STATE_ACTIVE)
if (contentState.HasAllStates(NS_EVENT_STATE_HOVER | NS_EVENT_STATE_ACTIVE))
aState |= DFCS_PUSHED;
}
@ -3072,7 +3071,7 @@ RENDER_AGAIN:
case NS_THEME_DROPDOWN_TEXTFIELD: {
// Draw inset edge
::DrawEdge(hdc, &widgetRect, EDGE_SUNKEN, BF_RECT | BF_ADJUST);
PRInt32 eventState = GetContentState(aFrame, aWidgetType);
nsEventStates eventState = GetContentState(aFrame, aWidgetType);
// Fill in background
if (IsDisabled(aFrame, eventState) ||
@ -3135,7 +3134,7 @@ RENDER_AGAIN:
break;
case NS_THEME_SCALE_THUMB_VERTICAL:
case NS_THEME_SCALE_THUMB_HORIZONTAL: {
PRInt32 eventState = GetContentState(aFrame, aWidgetType);
nsEventStates eventState = GetContentState(aFrame, aWidgetType);
::DrawEdge(hdc, &widgetRect, EDGE_RAISED, BF_RECT | BF_SOFT | BF_MIDDLE | BF_ADJUST);
if (IsDisabled(aFrame, eventState)) {

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

@ -68,11 +68,11 @@ nsNativeTheme::GetPresShell(nsIFrame* aFrame)
return context ? context->GetPresShell() : nsnull;
}
PRInt32
nsEventStates
nsNativeTheme::GetContentState(nsIFrame* aFrame, PRUint8 aWidgetType)
{
if (!aFrame)
return 0;
return nsEventStates();
PRBool isXULCheckboxRadio =
(aWidgetType == NS_THEME_CHECKBOX ||
@ -82,14 +82,14 @@ nsNativeTheme::GetContentState(nsIFrame* aFrame, PRUint8 aWidgetType)
aFrame = aFrame->GetParent();
if (!aFrame->GetContent())
return 0;
return nsEventStates();
nsIPresShell *shell = GetPresShell(aFrame);
if (!shell)
return 0;
return nsEventStates();
nsIEventStateManager* esm = shell->GetPresContext()->EventStateManager();
PRInt32 flags = esm->GetContentState(aFrame->GetContent(), PR_TRUE);
nsEventStates flags = esm->GetContentState(aFrame->GetContent(), PR_TRUE);
if (isXULCheckboxRadio && aWidgetType == NS_THEME_RADIO) {
if (IsFocused(aFrame))
@ -260,7 +260,7 @@ nsNativeTheme::IsWidgetStyled(nsPresContext* aPresContext, nsIFrame* aFrame,
}
bool
nsNativeTheme::IsDisabled(nsIFrame* aFrame, PRInt32 aEventStates)
nsNativeTheme::IsDisabled(nsIFrame* aFrame, nsEventStates aEventStates)
{
if (!aFrame) {
return false;
@ -272,7 +272,7 @@ nsNativeTheme::IsDisabled(nsIFrame* aFrame, PRInt32 aEventStates)
}
if (content->IsHTML()) {
return (aEventStates & NS_EVENT_STATE_DISABLED);
return aEventStates.HasState(NS_EVENT_STATE_DISABLED);
}
// For XML/XUL elements, an attribute must be equal to the literal

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

@ -46,6 +46,7 @@
#include "nsMargin.h"
#include "nsILookAndFeel.h"
#include "nsWidgetAtoms.h"
#include "nsEventStates.h"
class nsIFrame;
class nsIPresShell;
@ -70,7 +71,7 @@ class nsNativeTheme
nsNativeTheme();
// Returns the content state (hover, focus, etc), see nsIEventStateManager.h
PRInt32 GetContentState(nsIFrame* aFrame, PRUint8 aWidgetType);
nsEventStates GetContentState(nsIFrame* aFrame, PRUint8 aWidgetType);
// Returns whether the widget is already styled by content
// Normally called from ThemeSupportsWidget to turn off native theming
@ -80,7 +81,7 @@ class nsNativeTheme
// Accessors to widget-specific state information
bool IsDisabled(nsIFrame* aFrame, PRInt32 aEventStates);
bool IsDisabled(nsIFrame* aFrame, nsEventStates aEventStates);
// RTL chrome direction
PRBool IsFrameRTL(nsIFrame* aFrame);