Part 11 of fix for bug 560273 (Stop using DOM tearoffs from quickstubs) - move nsIDOMNSElement implementation to nsGenericElement. r=jst.

--HG--
extra : rebase_source : 6b39d2cbb5b6462b0d1e65ee0f204fb1804a468e
This commit is contained in:
Peter Van der Beken 2010-04-19 17:41:37 +02:00
parent c4d1da402d
commit a3eb999017
6 changed files with 352 additions and 236 deletions

View File

@ -1594,6 +1594,15 @@ public:
{
sIsHandlingKeyBoardEvent = aHandling;
}
/**
* Utility method for getElementsByClassName. aRootNode is the node (either
* document or element), which getElementsByClassName was called on.
*/
static nsresult GetElementsByClassName(nsINode* aRootNode,
const nsAString& aClasses,
nsIDOMNodeList** aReturn);
private:
static PRBool InitializeEventTable();

View File

@ -195,7 +195,6 @@ static NS_DEFINE_CID(kXTFServiceCID, NS_XTFSERVICE_CID);
#include "jstypedarray.h"
#include "xpcprivate.h"
#include "nsScriptSecurityManager.h"
#include "nsDocument.h"
using namespace mozilla::dom;
@ -5768,11 +5767,9 @@ struct ClassMatchingInfo {
nsCaseTreatment mCaseTreatment;
};
// static
PRBool
nsDocument::MatchClassNames(nsIContent* aContent,
PRInt32 aNamespaceID,
nsIAtom* aAtom, void* aData)
static PRBool
MatchClassNames(nsIContent* aContent, PRInt32 aNamespaceID, nsIAtom* aAtom,
void* aData)
{
// We can't match if there are no class names
const nsAttrValue* classAttr = aContent->GetClasses();
@ -5794,19 +5791,18 @@ nsDocument::MatchClassNames(nsIContent* aContent,
return PR_TRUE;
}
// static
void
nsDocument::DestroyClassNameArray(void* aData)
static void
DestroyClassNameArray(void* aData)
{
ClassMatchingInfo* info = static_cast<ClassMatchingInfo*>(aData);
delete info;
}
// static GetElementsByClassName helpers
// static
nsresult
nsDocument::GetElementsByClassNameHelper(nsINode* aRootNode,
const nsAString& aClasses,
nsIDOMNodeList** aReturn)
nsContentUtils::GetElementsByClassName(nsINode* aRootNode,
const nsAString& aClasses,
nsIDOMNodeList** aReturn)
{
NS_PRECONDITION(aRootNode, "Must have root node");

View File

@ -2814,7 +2814,7 @@ NS_IMETHODIMP
nsDocument::GetElementsByClassName(const nsAString& aClasses,
nsIDOMNodeList** aReturn)
{
return GetElementsByClassNameHelper(this, aClasses, aReturn);
return nsContentUtils::GetElementsByClassName(this, aClasses, aReturn);
}
NS_IMETHODIMP

View File

@ -899,14 +899,6 @@ public:
NS_DECL_CYCLE_COLLECTION_SCRIPT_HOLDER_CLASS_AMBIGUOUS(nsDocument,
nsIDocument)
/**
* Utility method for getElementsByClassName. aRootNode is the node (either
* document or element), which getElementsByClassName was called on.
*/
static nsresult GetElementsByClassNameHelper(nsINode* aRootNode,
const nsAString& aClasses,
nsIDOMNodeList** aReturn);
void DoNotifyPossibleTitleChange();
nsExternalResourceMap& ExternalResourceMap()
@ -1005,12 +997,6 @@ protected:
virtual nsPIDOMWindow *GetWindowInternal();
virtual nsPIDOMWindow *GetInnerWindowInternal();
// nsContentList match functions for GetElementsByClassName
static PRBool MatchClassNames(nsIContent* aContent, PRInt32 aNamespaceID,
nsIAtom* aAtom, void* aData);
static void DestroyClassNameArray(void* aData);
#define NS_DOCUMENT_NOTIFY_OBSERVERS(func_, params_) \
NS_OBSERVER_ARRAY_NOTIFY_OBSERVERS(mObservers, nsIDocumentObserver, \
func_, params_);

View File

@ -1232,21 +1232,104 @@ nsNode3Tearoff::IsDefaultNamespace(const nsAString& aNamespaceURI,
return NS_OK;
}
nsIContent*
nsGenericElement::GetFirstElementChild()
{
nsAttrAndChildArray& children = mAttrsAndChildren;
PRUint32 i, count = children.ChildCount();
for (i = 0; i < count; ++i) {
nsIContent* child = children.ChildAt(i);
if (child->IsElement()) {
return child;
}
}
return nsnull;
}
nsIContent*
nsGenericElement::GetLastElementChild()
{
nsAttrAndChildArray& children = mAttrsAndChildren;
PRUint32 i = children.ChildCount();
while (i > 0) {
nsIContent* child = children.ChildAt(--i);
if (child->IsElement()) {
return child;
}
}
return nsnull;
}
nsIContent*
nsGenericElement::GetPreviousElementSibling()
{
nsIContent* parent = GetParent();
if (!parent) {
return nsnull;
}
NS_ASSERTION(parent->IsElement() ||
parent->IsNodeOfType(nsINode::eDOCUMENT_FRAGMENT),
"Parent content must be an element or a doc fragment");
nsAttrAndChildArray& children =
static_cast<nsGenericElement*>(parent)->mAttrsAndChildren;
PRInt32 index = children.IndexOfChild(this);
if (index < 0) {
return nsnull;
}
PRUint32 i = index;
while (i > 0) {
nsIContent* child = children.ChildAt((PRUint32)--i);
if (child->IsElement()) {
return child;
}
}
return nsnull;
}
nsIContent*
nsGenericElement::GetNextElementSibling()
{
nsIContent* parent = GetParent();
if (!parent) {
return nsnull;
}
NS_ASSERTION(parent->IsElement() ||
parent->IsNodeOfType(nsINode::eDOCUMENT_FRAGMENT),
"Parent content must be an element or a doc fragment");
nsAttrAndChildArray& children =
static_cast<nsGenericElement*>(parent)->mAttrsAndChildren;
PRInt32 index = children.IndexOfChild(this);
if (index < 0) {
return nsnull;
}
PRUint32 i, count = children.ChildCount();
for (i = (PRUint32)index + 1; i < count; ++i) {
nsIContent* child = children.ChildAt(i);
if (child->IsElement()) {
return child;
}
}
return nsnull;
}
NS_IMETHODIMP
nsNSElementTearoff::GetFirstElementChild(nsIDOMElement** aResult)
{
*aResult = nsnull;
nsAttrAndChildArray& children = mContent->mAttrsAndChildren;
PRUint32 i, count = children.ChildCount();
for (i = 0; i < count; ++i) {
nsIContent* child = children.ChildAt(i);
if (child->IsElement()) {
return CallQueryInterface(child, aResult);
}
}
return NS_OK;
nsIContent *result = mContent->GetFirstElementChild();
return result ? CallQueryInterface(result, aResult) : NS_OK;
}
NS_IMETHODIMP
@ -1254,16 +1337,9 @@ nsNSElementTearoff::GetLastElementChild(nsIDOMElement** aResult)
{
*aResult = nsnull;
nsAttrAndChildArray& children = mContent->mAttrsAndChildren;
PRUint32 i = children.ChildCount();
while (i > 0) {
nsIContent* child = children.ChildAt(--i);
if (child->IsElement()) {
return CallQueryInterface(child, aResult);
}
}
return NS_OK;
nsIContent *result = mContent->GetLastElementChild();
return result ? CallQueryInterface(result, aResult) : NS_OK;
}
NS_IMETHODIMP
@ -1271,31 +1347,9 @@ nsNSElementTearoff::GetPreviousElementSibling(nsIDOMElement** aResult)
{
*aResult = nsnull;
nsIContent* parent = mContent->GetParent();
if (!parent) {
return NS_OK;
}
nsIContent *result = mContent->GetPreviousElementSibling();
NS_ASSERTION(parent->IsElement() ||
parent->IsNodeOfType(nsINode::eDOCUMENT_FRAGMENT),
"Parent content must be an element or a doc fragment");
nsAttrAndChildArray& children =
static_cast<nsGenericElement*>(parent)->mAttrsAndChildren;
PRInt32 index = children.IndexOfChild(mContent);
if (index < 0) {
return NS_OK;
}
PRUint32 i = index;
while (i > 0) {
nsIContent* child = children.ChildAt((PRUint32)--i);
if (child->IsElement()) {
return CallQueryInterface(child, aResult);
}
}
return NS_OK;
return result ? CallQueryInterface(result, aResult) : NS_OK;
}
NS_IMETHODIMP
@ -1303,41 +1357,19 @@ nsNSElementTearoff::GetNextElementSibling(nsIDOMElement** aResult)
{
*aResult = nsnull;
nsIContent* parent = mContent->GetParent();
if (!parent) {
return NS_OK;
}
nsIContent *result = mContent->GetNextElementSibling();
NS_ASSERTION(parent->IsElement() ||
parent->IsNodeOfType(nsINode::eDOCUMENT_FRAGMENT),
"Parent content must be an element or a doc fragment");
nsAttrAndChildArray& children =
static_cast<nsGenericElement*>(parent)->mAttrsAndChildren;
PRInt32 index = children.IndexOfChild(mContent);
if (index < 0) {
return NS_OK;
}
PRUint32 i, count = children.ChildCount();
for (i = (PRUint32)index + 1; i < count; ++i) {
nsIContent* child = children.ChildAt(i);
if (child->IsElement()) {
return CallQueryInterface(child, aResult);
}
}
return NS_OK;
return result ? CallQueryInterface(result, aResult) : NS_OK;
}
nsContentList*
nsNSElementTearoff::GetChildrenList()
nsGenericElement::GetChildrenList()
{
nsGenericElement::nsDOMSlots *slots = mContent->GetDOMSlots();
nsGenericElement::nsDOMSlots *slots = GetDOMSlots();
NS_ENSURE_TRUE(slots, nsnull);
if (!slots->mChildrenList) {
slots->mChildrenList = new nsContentList(mContent, nsGkAtoms::_asterix,
slots->mChildrenList = new nsContentList(this, nsGkAtoms::_asterix,
kNameSpaceID_Wildcard, PR_FALSE);
}
@ -1347,43 +1379,50 @@ nsNSElementTearoff::GetChildrenList()
NS_IMETHODIMP
nsNSElementTearoff::GetChildElementCount(PRUint32* aResult)
{
*aResult = 0;
nsContentList* list = GetChildrenList();
NS_ENSURE_TRUE(list, NS_ERROR_OUT_OF_MEMORY);
*aResult = list->Length(PR_TRUE);
return NS_OK;
return mContent->GetChildElementCount(aResult);
}
NS_IMETHODIMP
nsNSElementTearoff::GetChildren(nsIDOMNodeList** aResult)
{
*aResult = nsnull;
return mContent->GetChildren(aResult);
}
nsContentList* list = GetChildrenList();
NS_ENSURE_TRUE(list, NS_ERROR_OUT_OF_MEMORY);
nsIDOMDOMTokenList*
nsGenericElement::GetClassList(nsresult *aResult)
{
*aResult = NS_ERROR_OUT_OF_MEMORY;
NS_ADDREF(*aResult = list);
nsGenericElement::nsDOMSlots *slots = GetDOMSlots();
NS_ENSURE_TRUE(slots, nsnull);
return NS_OK;
if (!slots->mClassList) {
nsCOMPtr<nsIAtom> classAttr = GetClassAttributeName();
if (!classAttr) {
*aResult = NS_OK;
return nsnull;
}
slots->mClassList = new nsDOMTokenList(this, classAttr);
NS_ENSURE_TRUE(slots->mClassList, nsnull);
}
*aResult = NS_OK;
return slots->mClassList;
}
NS_IMETHODIMP
nsNSElementTearoff::GetClassList(nsIDOMDOMTokenList** aResult)
{
nsGenericElement::nsDOMSlots *slots = mContent->GetDOMSlots();
NS_ENSURE_TRUE(slots, nsnull);
*aResult = nsnull;
if (!slots->mClassList) {
nsCOMPtr<nsIAtom> classAttr = mContent->GetClassAttributeName();
NS_ENSURE_TRUE(classAttr, NS_OK);
slots->mClassList = new nsDOMTokenList(mContent, classAttr);
NS_ENSURE_TRUE(slots->mClassList, NS_ERROR_OUT_OF_MEMORY);
}
nsresult rv;
nsIDOMDOMTokenList* list = mContent->GetClassList(&rv);
NS_ENSURE_TRUE(list, rv);
NS_ADDREF(*aResult = slots->mClassList);
NS_ADDREF(*aResult = list);
return NS_OK;
}
@ -1429,7 +1468,7 @@ NS_IMETHODIMP
nsNSElementTearoff::GetElementsByClassName(const nsAString& aClasses,
nsIDOMNodeList** aReturn)
{
return nsDocument::GetElementsByClassNameHelper(mContent, aClasses, aReturn);
return mContent->GetElementsByClassName(aClasses, aReturn);
}
nsIFrame*
@ -1465,18 +1504,17 @@ nsGenericElement::GetOffsetRect(nsRect& aRect, nsIContent** aOffsetParent)
}
nsIScrollableFrame*
nsNSElementTearoff::GetScrollFrame(nsIFrame **aStyledFrame)
nsGenericElement::GetScrollFrame(nsIFrame **aStyledFrame)
{
// it isn't clear what to return for SVG nodes, so just return nothing
if (mContent->IsSVG()) {
if (IsSVG()) {
if (aStyledFrame) {
*aStyledFrame = nsnull;
}
return nsnull;
}
nsIFrame* frame =
(static_cast<nsGenericElement*>(mContent))->GetStyledFrame();
nsIFrame* frame = GetStyledFrame();
if (aStyledFrame) {
*aStyledFrame = frame;
@ -1493,11 +1531,11 @@ nsNSElementTearoff::GetScrollFrame(nsIFrame **aStyledFrame)
return scrollFrame;
}
nsIDocument* doc = mContent->GetOwnerDoc();
nsIDocument* doc = GetOwnerDoc();
PRBool quirksMode = doc->GetCompatibilityMode() == eCompatibility_NavQuirks;
Element* elementWithRootScrollInfo =
quirksMode ? doc->GetBodyElement() : doc->GetRootElement();
if (mContent == elementWithRootScrollInfo) {
if (this == elementWithRootScrollInfo) {
// In quirks mode, the scroll info for the body element should map to the
// root scrollable frame.
// In strict mode, the scroll info for the root element should map to the
@ -1508,23 +1546,26 @@ nsNSElementTearoff::GetScrollFrame(nsIFrame **aStyledFrame)
return nsnull;
}
nsresult
PRInt32
nsGenericElement::GetScrollTop()
{
nsIScrollableFrame* sf = GetScrollFrame();
return sf ?
nsPresContext::AppUnitsToIntCSSPixels(sf->GetScrollPosition().y) :
0;
}
NS_IMETHODIMP
nsNSElementTearoff::GetScrollTop(PRInt32* aScrollTop)
{
NS_ENSURE_ARG_POINTER(aScrollTop);
*aScrollTop = 0;
nsIScrollableFrame* sf = GetScrollFrame();
if (sf) {
nscoord y = sf->GetScrollPosition().y;
*aScrollTop = nsPresContext::AppUnitsToIntCSSPixels(y);
}
*aScrollTop = mContent->GetScrollTop();
return NS_OK;
}
nsresult
nsNSElementTearoff::SetScrollTop(PRInt32 aScrollTop)
void
nsGenericElement::SetScrollTop(PRInt32 aScrollTop)
{
nsIScrollableFrame* sf = GetScrollFrame();
if (sf) {
@ -1532,27 +1573,36 @@ nsNSElementTearoff::SetScrollTop(PRInt32 aScrollTop)
pt.y = nsPresContext::CSSPixelsToAppUnits(aScrollTop);
sf->ScrollTo(pt, nsIScrollableFrame::INSTANT);
}
}
NS_IMETHODIMP
nsNSElementTearoff::SetScrollTop(PRInt32 aScrollTop)
{
mContent->SetScrollTop(aScrollTop);
return NS_OK;
}
nsresult
PRInt32
nsGenericElement::GetScrollLeft()
{
nsIScrollableFrame* sf = GetScrollFrame();
return sf ?
nsPresContext::AppUnitsToIntCSSPixels(sf->GetScrollPosition().x) :
0;
}
NS_IMETHODIMP
nsNSElementTearoff::GetScrollLeft(PRInt32* aScrollLeft)
{
NS_ENSURE_ARG_POINTER(aScrollLeft);
*aScrollLeft = 0;
nsIScrollableFrame* sf = GetScrollFrame();
if (sf) {
nscoord x = sf->GetScrollPosition().x;
*aScrollLeft = nsPresContext::AppUnitsToIntCSSPixels(x);
}
*aScrollLeft = mContent->GetScrollLeft();
return NS_OK;
}
nsresult
nsNSElementTearoff::SetScrollLeft(PRInt32 aScrollLeft)
void
nsGenericElement::SetScrollLeft(PRInt32 aScrollLeft)
{
nsIScrollableFrame* sf = GetScrollFrame();
if (sf) {
@ -1560,58 +1610,70 @@ nsNSElementTearoff::SetScrollLeft(PRInt32 aScrollLeft)
pt.x = nsPresContext::CSSPixelsToAppUnits(aScrollLeft);
sf->ScrollTo(pt, nsIScrollableFrame::INSTANT);
}
}
NS_IMETHODIMP
nsNSElementTearoff::SetScrollLeft(PRInt32 aScrollLeft)
{
mContent->SetScrollLeft(aScrollLeft);
return NS_OK;
}
nsresult
nsNSElementTearoff::GetScrollHeight(PRInt32* aScrollHeight)
PRInt32
nsGenericElement::GetScrollHeight()
{
NS_ENSURE_ARG_POINTER(aScrollHeight);
*aScrollHeight = 0;
if (mContent->IsSVG())
return NS_OK;
if (IsSVG())
return 0;
nsIScrollableFrame* sf = GetScrollFrame();
if (!sf) {
nsRect rcFrame;
nsCOMPtr<nsIContent> parent;
(static_cast<nsGenericElement *>(mContent))->GetOffsetRect(rcFrame, getter_AddRefs(parent));
*aScrollHeight = rcFrame.height;
return NS_OK;
GetOffsetRect(rcFrame, getter_AddRefs(parent));
return rcFrame.height;
}
nscoord height = sf->GetScrollRange().height + sf->GetScrollPortRect().height;
*aScrollHeight = nsPresContext::AppUnitsToIntCSSPixels(height);
return nsPresContext::AppUnitsToIntCSSPixels(height);
}
NS_IMETHODIMP
nsNSElementTearoff::GetScrollHeight(PRInt32* aScrollHeight)
{
*aScrollHeight = mContent->GetScrollHeight();
return NS_OK;
}
nsresult
nsNSElementTearoff::GetScrollWidth(PRInt32* aScrollWidth)
PRInt32
nsGenericElement::GetScrollWidth()
{
NS_ENSURE_ARG_POINTER(aScrollWidth);
*aScrollWidth = 0;
if (mContent->IsSVG())
return NS_OK;
if (IsSVG())
return 0;
nsIScrollableFrame* sf = GetScrollFrame();
if (!sf) {
nsRect rcFrame;
nsCOMPtr<nsIContent> parent;
(static_cast<nsGenericElement *>(mContent))->GetOffsetRect(rcFrame, getter_AddRefs(parent));
*aScrollWidth = rcFrame.width;
return NS_OK;
GetOffsetRect(rcFrame, getter_AddRefs(parent));
return rcFrame.width;
}
nscoord width = sf->GetScrollRange().width + sf->GetScrollPortRect().width;
*aScrollWidth = nsPresContext::AppUnitsToIntCSSPixels(width);
return nsPresContext::AppUnitsToIntCSSPixels(width);
}
NS_IMETHODIMP
nsNSElementTearoff::GetScrollWidth(PRInt32 *aScrollWidth)
{
*aScrollWidth = mContent->GetScrollWidth();
return NS_OK;
}
nsRect
nsNSElementTearoff::GetClientAreaRect()
nsGenericElement::GetClientAreaRect()
{
nsIFrame* styledFrame;
nsIScrollableFrame* sf = GetScrollFrame(&styledFrame);
@ -1632,40 +1694,36 @@ nsNSElementTearoff::GetClientAreaRect()
return nsRect(0, 0, 0, 0);
}
nsresult
nsNSElementTearoff::GetClientTop(PRInt32* aLength)
NS_IMETHODIMP
nsNSElementTearoff::GetClientTop(PRInt32 *aClientTop)
{
NS_ENSURE_ARG_POINTER(aLength);
*aLength = nsPresContext::AppUnitsToIntCSSPixels(GetClientAreaRect().y);
return NS_OK;
}
nsresult
nsNSElementTearoff::GetClientLeft(PRInt32* aLength)
{
NS_ENSURE_ARG_POINTER(aLength);
*aLength = nsPresContext::AppUnitsToIntCSSPixels(GetClientAreaRect().x);
return NS_OK;
}
nsresult
nsNSElementTearoff::GetClientHeight(PRInt32* aLength)
{
NS_ENSURE_ARG_POINTER(aLength);
*aLength = nsPresContext::AppUnitsToIntCSSPixels(GetClientAreaRect().height);
return NS_OK;
}
nsresult
nsNSElementTearoff::GetClientWidth(PRInt32* aLength)
{
NS_ENSURE_ARG_POINTER(aLength);
*aLength = nsPresContext::AppUnitsToIntCSSPixels(GetClientAreaRect().width);
*aClientTop = mContent->GetClientTop();
return NS_OK;
}
NS_IMETHODIMP
nsNSElementTearoff::GetBoundingClientRect(nsIDOMClientRect** aResult)
nsNSElementTearoff::GetClientLeft(PRInt32 *aClientLeft)
{
*aClientLeft = mContent->GetClientLeft();
return NS_OK;
}
NS_IMETHODIMP
nsNSElementTearoff::GetClientHeight(PRInt32 *aClientHeight)
{
*aClientHeight = mContent->GetClientHeight();
return NS_OK;
}
NS_IMETHODIMP
nsNSElementTearoff::GetClientWidth(PRInt32 *aClientWidth)
{
*aClientWidth = mContent->GetClientWidth();
return NS_OK;
}
nsresult
nsGenericElement::GetBoundingClientRect(nsIDOMClientRect** aResult)
{
// Weak ref, since we addref it below
nsClientRect* rect = new nsClientRect();
@ -1674,7 +1732,7 @@ nsNSElementTearoff::GetBoundingClientRect(nsIDOMClientRect** aResult)
NS_ADDREF(*aResult = rect);
nsIFrame* frame = mContent->GetPrimaryFrame(Flush_Layout);
nsIFrame* frame = GetPrimaryFrame(Flush_Layout);
if (!frame) {
// display:none, perhaps? Return the empty rect
return NS_OK;
@ -1687,7 +1745,13 @@ nsNSElementTearoff::GetBoundingClientRect(nsIDOMClientRect** aResult)
}
NS_IMETHODIMP
nsNSElementTearoff::GetClientRects(nsIDOMClientRectList** aResult)
nsNSElementTearoff::GetBoundingClientRect(nsIDOMClientRect** aResult)
{
return mContent->GetBoundingClientRect(aResult);
}
nsresult
nsGenericElement::GetClientRects(nsIDOMClientRectList** aResult)
{
*aResult = nsnull;
@ -1695,7 +1759,7 @@ nsNSElementTearoff::GetClientRects(nsIDOMClientRectList** aResult)
if (!rectList)
return NS_ERROR_OUT_OF_MEMORY;
nsIFrame* frame = mContent->GetPrimaryFrame(Flush_Layout);
nsIFrame* frame = GetPrimaryFrame(Flush_Layout);
if (!frame) {
// display:none, perhaps? Return an empty list
*aResult = rectList.forget().get();
@ -1711,6 +1775,12 @@ nsNSElementTearoff::GetClientRects(nsIDOMClientRectList** aResult)
return NS_OK;
}
NS_IMETHODIMP
nsNSElementTearoff::GetClientRects(nsIDOMClientRectList** aResult)
{
return mContent->GetClientRects(aResult);
}
//----------------------------------------------------------------------
@ -5540,30 +5610,29 @@ nsGenericElement::doQuerySelectorAll(nsINode* aRoot,
return NS_OK;
}
NS_IMETHODIMP
nsNSElementTearoff::MozMatchesSelector(const nsAString& aSelector, PRBool* aReturn)
{
NS_PRECONDITION(aReturn, "Null out param?");
*aReturn = nsGenericElement::doMatchesSelector(mContent, aSelector);
return NS_OK;
}
/* static */
PRBool
nsGenericElement::doMatchesSelector(Element* aElement,
const nsAString& aSelector)
nsGenericElement::MozMatchesSelector(const nsAString& aSelector)
{
nsAutoPtr<nsCSSSelectorList> selectorList;
nsPresContext* presContext;
PRBool matches = PR_FALSE;
if (NS_SUCCEEDED(ParseSelectorList(aElement, aSelector,
if (NS_SUCCEEDED(ParseSelectorList(this, aSelector,
getter_Transfers(selectorList),
&presContext)))
{
RuleProcessorData data(presContext, aElement, nsnull);
RuleProcessorData data(presContext, this, nsnull);
matches = nsCSSRuleProcessor::SelectorListMatches(data, selectorList);
}
return matches;
}
NS_IMETHODIMP
nsNSElementTearoff::MozMatchesSelector(const nsAString& aSelector, PRBool* aReturn)
{
NS_PRECONDITION(aReturn, "Null out param?");
*aReturn = mContent->MozMatchesSelector(aSelector);
return NS_OK;
}

View File

@ -65,6 +65,7 @@
#include "nsIDocument.h"
#include "nsIDOMNodeSelector.h"
#include "nsIDOMXPathNSResolver.h"
#include "nsPresContext.h"
#ifdef MOZ_SMIL
#include "nsISMILAttr.h"
@ -644,8 +645,6 @@ public:
static nsresult doQuerySelectorAll(nsINode* aRoot,
const nsAString& aSelector,
nsIDOMNodeList **aReturn);
static PRBool doMatchesSelector(mozilla::dom::Element* aElement,
const nsAString& aSelector);
/**
* Default event prehandling for content objects. Handles event retargeting.
@ -725,6 +724,69 @@ public:
{
}
// nsIDOMNSElement methods
nsresult GetElementsByClassName(const nsAString& aClasses,
nsIDOMNodeList** aReturn)
{
return nsContentUtils::GetElementsByClassName(this, aClasses, aReturn);
}
nsresult GetClientRects(nsIDOMClientRectList** aResult);
nsresult GetBoundingClientRect(nsIDOMClientRect** aResult);
PRInt32 GetScrollTop();
void SetScrollTop(PRInt32 aScrollTop);
PRInt32 GetScrollLeft();
void SetScrollLeft(PRInt32 aScrollLeft);
PRInt32 GetScrollHeight();
PRInt32 GetScrollWidth();
PRInt32 GetClientTop()
{
return nsPresContext::AppUnitsToIntCSSPixels(GetClientAreaRect().y);
}
PRInt32 GetClientLeft()
{
return nsPresContext::AppUnitsToIntCSSPixels(GetClientAreaRect().x);
}
PRInt32 GetClientHeight()
{
return nsPresContext::AppUnitsToIntCSSPixels(GetClientAreaRect().height);
}
PRInt32 GetClientWidth()
{
return nsPresContext::AppUnitsToIntCSSPixels(GetClientAreaRect().width);
}
nsIContent* GetFirstElementChild();
nsIContent* GetLastElementChild();
nsIContent* GetPreviousElementSibling();
nsIContent* GetNextElementSibling();
nsresult GetChildElementCount(PRUint32* aResult)
{
nsContentList* list = GetChildrenList();
if (!list) {
*aResult = 0;
return NS_ERROR_OUT_OF_MEMORY;
}
*aResult = list->Length(PR_TRUE);
return NS_OK;
}
nsresult GetChildren(nsIDOMNodeList** aResult)
{
nsContentList* list = GetChildrenList();
if (!list) {
*aResult = nsnull;
return NS_ERROR_OUT_OF_MEMORY;
}
NS_ADDREF(*aResult = list);
return NS_OK;
}
nsIDOMDOMTokenList* GetClassList(nsresult *aResult);
PRBool MozMatchesSelector(const nsAString& aSelector);
NS_DECL_CYCLE_COLLECTION_SCRIPT_HOLDER_CLASS(nsGenericElement)
protected:
@ -1023,6 +1085,17 @@ protected:
* Array containing all attributes and children for this element
*/
nsAttrAndChildArray mAttrsAndChildren;
private:
/**
* Get this element's client area rect in app units.
* @return the frame's client area
*/
nsRect GetClientAreaRect();
nsIScrollableFrame* GetScrollFrame(nsIFrame **aStyledFrame = nsnull);
nsContentList* GetChildrenList();
};
/**
@ -1088,24 +1161,7 @@ public:
}
private:
nsContentList* GetChildrenList();
nsRefPtr<nsGenericElement> mContent;
/**
* Get this element's client area rect in app units.
* @return the frame's client area
*/
nsRect GetClientAreaRect();
private:
/**
* Get the element's styled frame (the primary frame or, for tables, the inner
* table frame) and associated scrollable frame (if any).
* @note This method flushes pending notifications (Flush_Layout).
* @param aFrame (optional) the styled frame [OUT]
*/
nsIScrollableFrame* GetScrollFrame(nsIFrame** aStyledFrame = nsnull);
};
#define NS_ELEMENT_INTERFACE_TABLE_TO_MAP_SEGUE \