Bug 562688 part 5. Change the document id and named item table APIs to use Element. r=jst

This commit is contained in:
Boris Zbarsky 2010-04-30 09:12:05 -04:00
Родитель 9c2ad4b2aa
Коммит 7baad57df7
10 изменённых файлов: 146 добавлений и 120 удалений

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

@ -137,7 +137,11 @@ typedef int (*PR_CALLBACK PrefChangedFunc)(const char *, void *);
namespace mozilla {
class IHistory;
}
namespace dom {
class Element;
} // namespace dom
} // namespace mozilla
extern const char kLoadAsData[];
@ -1362,7 +1366,7 @@ public:
* If aContent is an HTML element with a DOM level 0 'name', then
* return the name. Otherwise return null.
*/
static nsIAtom* IsNamedItem(nsIContent* aContent);
static nsIAtom* IsNamedItem(mozilla::dom::Element* aElement);
/**
* Get the application manifest URI for this document. The manifest URI

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

@ -5005,13 +5005,13 @@ nsAutoGCRoot::Shutdown()
}
nsIAtom*
nsContentUtils::IsNamedItem(nsIContent* aContent)
nsContentUtils::IsNamedItem(Element* aElement)
{
// Only the content types reflected in Level 0 with a NAME
// attribute are registered. Images, layers and forms always get
// reflected up to the document. Applets and embeds only go
// to the closest container (which could be a form).
nsGenericHTMLElement* elm = nsGenericHTMLElement::FromContent(aContent);
nsGenericHTMLElement* elm = nsGenericHTMLElement::FromContent(aElement);
if (!elm) {
return nsnull;
}

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

@ -258,17 +258,17 @@ nsIdentifierMapEntry::CreateNameContentList()
return NS_OK;
}
nsIContent*
nsIdentifierMapEntry::GetIdContent()
Element*
nsIdentifierMapEntry::GetIdElement()
{
return static_cast<nsIContent*>(mIdContentList.SafeElementAt(0));
return static_cast<Element*>(mIdContentList.SafeElementAt(0));
}
void
nsIdentifierMapEntry::AppendAllIdContent(nsCOMArray<nsIContent>* aElements)
{
for (PRInt32 i = 0; i < mIdContentList.Count(); ++i) {
aElements->AppendObject(static_cast<nsIContent*>(mIdContentList[i]));
aElements->AppendObject(static_cast<Element*>(mIdContentList[i]));
}
}
@ -301,8 +301,8 @@ nsIdentifierMapEntry::RemoveContentChangeCallback(nsIDocument::IDTargetObserver
}
struct FireChangeArgs {
nsIContent* mFrom;
nsIContent* mTo;
Element* mFrom;
Element* mTo;
};
static PLDHashOperator
@ -314,35 +314,35 @@ FireChangeEnumerator(nsIdentifierMapEntry::ChangeCallbackEntry *aEntry, void *aA
}
void
nsIdentifierMapEntry::FireChangeCallbacks(nsIContent* aOldContent,
nsIContent* aNewContent)
nsIdentifierMapEntry::FireChangeCallbacks(Element* aOldElement,
Element* aNewElement)
{
if (!mChangeCallbacks)
return;
FireChangeArgs args = { aOldContent, aNewContent };
FireChangeArgs args = { aOldElement, aNewElement };
mChangeCallbacks->EnumerateEntries(FireChangeEnumerator, &args);
}
PRBool
nsIdentifierMapEntry::AddIdContent(nsIContent* aContent)
nsIdentifierMapEntry::AddIdElement(Element* aElement)
{
NS_PRECONDITION(aContent, "Must have content");
NS_PRECONDITION(aElement, "Must have element");
NS_PRECONDITION(mIdContentList.IndexOf(nsnull) < 0,
"Why is null in our list?");
#ifdef DEBUG
nsIContent* currentContent =
static_cast<nsIContent*>(mIdContentList.SafeElementAt(0));
Element* currentElement =
static_cast<Element*>(mIdContentList.SafeElementAt(0));
#endif
// Common case
if (mIdContentList.Count() == 0) {
if (!mIdContentList.AppendElement(aContent))
if (!mIdContentList.AppendElement(aElement))
return PR_FALSE;
NS_ADDREF(aContent);
NS_ASSERTION(currentContent == nsnull, "How did that happen?");
FireChangeCallbacks(nsnull, aContent);
NS_ADDREF(aElement);
NS_ASSERTION(currentElement == nsnull, "How did that happen?");
FireChangeCallbacks(nsnull, aElement);
return PR_TRUE;
}
@ -356,56 +356,57 @@ nsIdentifierMapEntry::AddIdContent(nsIContent* aContent)
PRInt32 cur = (start + end) / 2;
NS_ASSERTION(cur >= start && cur < end, "What happened here?");
nsIContent* curContent = static_cast<nsIContent*>(mIdContentList[cur]);
if (curContent == aContent) {
Element* curElement = static_cast<Element*>(mIdContentList[cur]);
if (curElement == aElement) {
// Already in the list, so already in the right spot. Get out of here.
// XXXbz this only happens because XUL does all sorts of random
// UpdateIdTableEntry calls. Hate, hate, hate!
return PR_TRUE;
}
if (nsContentUtils::PositionIsBefore(aContent, curContent)) {
if (nsContentUtils::PositionIsBefore(aElement, curElement)) {
end = cur;
} else {
start = cur + 1;
}
} while (start != end);
if (!mIdContentList.InsertElementAt(aContent, start))
if (!mIdContentList.InsertElementAt(aElement, start))
return PR_FALSE;
NS_ADDREF(aContent);
NS_ADDREF(aElement);
if (start == 0) {
nsIContent* oldContent =
static_cast<nsIContent*>(mIdContentList.SafeElementAt(1));
NS_ASSERTION(currentContent == oldContent, "How did that happen?");
FireChangeCallbacks(oldContent, aContent);
Element* oldElement =
static_cast<Element*>(mIdContentList.SafeElementAt(1));
NS_ASSERTION(currentElement == oldElement, "How did that happen?");
FireChangeCallbacks(oldElement, aElement);
}
return PR_TRUE;
}
PRBool
nsIdentifierMapEntry::RemoveIdContent(nsIContent* aContent)
nsIdentifierMapEntry::RemoveIdElement(Element* aElement)
{
// This should only be called while the document is in an update.
// Assertions near the call to this method guarantee this.
// XXXbz should this ever Compact() I guess when all the content is gone
// we'll just get cleaned up in the natural order of things...
nsIContent* currentContent = static_cast<nsIContent*>(mIdContentList.SafeElementAt(0));
if (!mIdContentList.RemoveElement(aContent))
Element* currentElement =
static_cast<Element*>(mIdContentList.SafeElementAt(0));
if (!mIdContentList.RemoveElement(aElement))
return PR_FALSE;
if (currentContent == aContent) {
FireChangeCallbacks(currentContent,
static_cast<nsIContent*>(mIdContentList.SafeElementAt(0)));
if (currentElement == aElement) {
FireChangeCallbacks(currentElement,
static_cast<Element*>(mIdContentList.SafeElementAt(0)));
}
// Make sure the release happens after the check above, since it'll
// null out aContent.
NS_RELEASE(aContent);
NS_RELEASE(aElement);
return mIdContentList.Count() == 0 && !mNameContentList && !mChangeCallbacks;
}
void
nsIdentifierMapEntry::AddNameContent(nsIContent* aContent)
nsIdentifierMapEntry::AddNameElement(Element* aElement)
{
if (!mNameContentList || mNameContentList == NAME_NOT_VALID)
return;
@ -414,16 +415,17 @@ nsIdentifierMapEntry::AddNameContent(nsIContent* aContent)
// content notifications when we do document.foo resolution. So
// aContent may be in our list already and just now getting notified
// for!
if (mNameContentList->IndexOf(aContent, PR_FALSE) < 0) {
mNameContentList->AppendElement(aContent);
// XXXbz with the HTML5 parser we can stop doing this!
if (mNameContentList->IndexOf(aElement, PR_FALSE) < 0) {
mNameContentList->AppendElement(aElement);
}
}
void
nsIdentifierMapEntry::RemoveNameContent(nsIContent* aContent)
nsIdentifierMapEntry::RemoveNameElement(Element* aElement)
{
if (mNameContentList && mNameContentList != NAME_NOT_VALID) {
mNameContentList->RemoveElement(aContent);
mNameContentList->RemoveElement(aElement);
}
}
@ -2329,12 +2331,12 @@ nsDocument::GetLastModified(nsAString& aLastModified)
}
void
nsDocument::UpdateNameTableEntry(nsIContent *aContent)
nsDocument::UpdateNameTableEntry(Element *aElement)
{
if (!mIsRegularHTML)
return;
nsIAtom* name = nsContentUtils::IsNamedItem(aContent);
nsIAtom* name = nsContentUtils::IsNamedItem(aElement);
if (!name)
return;
@ -2344,16 +2346,16 @@ nsDocument::UpdateNameTableEntry(nsIContent *aContent)
return;
}
entry->AddNameContent(aContent);
entry->AddNameElement(aElement);
}
void
nsDocument::RemoveFromNameTable(nsIContent *aContent)
nsDocument::RemoveFromNameTable(Element *aElement)
{
if (!mIsRegularHTML)
return;
nsIAtom* name = nsContentUtils::IsNamedItem(aContent);
nsIAtom* name = nsContentUtils::IsNamedItem(aElement);
if (!name)
return;
@ -2363,27 +2365,27 @@ nsDocument::RemoveFromNameTable(nsIContent *aContent)
return;
}
entry->RemoveNameContent(aContent);
entry->RemoveNameElement(aElement);
}
void
nsDocument::UpdateIdTableEntry(nsIContent *aContent)
nsDocument::UpdateIdTableEntry(Element *aElement)
{
nsIAtom* id = aContent->GetID();
nsIAtom* id = aElement->GetID();
if (!id)
return;
nsIdentifierMapEntry *entry = mIdentifierMap.PutEntry(id);
if (entry) { /* True except on OOM */
entry->AddIdContent(aContent);
entry->AddIdElement(aElement);
}
}
void
nsDocument::RemoveFromIdTable(nsIContent *aContent)
nsDocument::RemoveFromIdTable(Element *aElement)
{
nsIAtom* id = aContent->GetID();
nsIAtom* id = aElement->GetID();
if (!id)
return;
@ -2391,7 +2393,7 @@ nsDocument::RemoveFromIdTable(nsIContent *aContent)
if (!entry) /* Should be false unless we had OOM when adding the entry */
return;
if (entry->RemoveIdContent(aContent)) {
if (entry->RemoveIdElement(aElement)) {
mIdentifierMap.RemoveEntry(id);
}
}
@ -2399,13 +2401,13 @@ nsDocument::RemoveFromIdTable(nsIContent *aContent)
void
nsDocument::UnregisterNamedItems(nsIContent *aContent)
{
if (!aContent->IsNodeOfType(nsINode::eELEMENT)) {
if (!aContent->IsElement()) {
// non-element nodes are not named items nor can they have children.
return;
}
RemoveFromNameTable(aContent);
RemoveFromIdTable(aContent);
RemoveFromNameTable(aContent->AsElement());
RemoveFromIdTable(aContent->AsElement());
for (nsINode::ChildIterator iter(aContent); !iter.IsDone(); iter.Next()) {
UnregisterNamedItems(iter);
@ -2415,13 +2417,13 @@ nsDocument::UnregisterNamedItems(nsIContent *aContent)
void
nsDocument::RegisterNamedItems(nsIContent *aContent)
{
if (!aContent->IsNodeOfType(nsINode::eELEMENT)) {
if (!aContent->IsElement()) {
// non-element nodes are not named items nor can they have children.
return;
}
UpdateNameTableEntry(aContent);
UpdateIdTableEntry(aContent);
UpdateNameTableEntry(aContent->AsElement());
UpdateIdTableEntry(aContent->AsElement());
for (nsINode::ChildIterator iter(aContent); !iter.IsDone(); iter.Next()) {
RegisterNamedItems(iter);
@ -2473,15 +2475,15 @@ nsDocument::AttributeWillChange(nsIDocument* aDocument,
nsIContent* aContent, PRInt32 aNameSpaceID,
nsIAtom* aAttribute, PRInt32 aModType)
{
NS_ABORT_IF_FALSE(aContent, "Null content!");
NS_ABORT_IF_FALSE(aContent && aContent->IsElement(), "Null content!");
NS_PRECONDITION(aAttribute, "Must have an attribute that's changing!");
if (aNameSpaceID != kNameSpaceID_None)
return;
if (aAttribute == nsGkAtoms::name) {
RemoveFromNameTable(aContent);
RemoveFromNameTable(aContent->AsElement());
} else if (aAttribute == aContent->GetIDAttributeName()) {
RemoveFromIdTable(aContent);
RemoveFromIdTable(aContent->AsElement());
}
}
@ -2492,15 +2494,15 @@ nsDocument::AttributeChanged(nsIDocument* aDocument,
{
NS_ASSERTION(aDocument == this, "unexpected doc");
NS_ABORT_IF_FALSE(aContent, "Null content!");
NS_ABORT_IF_FALSE(aContent && aContent->IsElement(), "Null content!");
NS_PRECONDITION(aAttribute, "Must have an attribute that's changing!");
if (aNameSpaceID != kNameSpaceID_None)
return;
if (aAttribute == nsGkAtoms::name) {
UpdateNameTableEntry(aContent);
UpdateNameTableEntry(aContent->AsElement());
} else if (aAttribute == aContent->GetIDAttributeName()) {
UpdateIdTableEntry(aContent);
UpdateIdTableEntry(aContent->AsElement());
}
}
@ -3968,7 +3970,7 @@ nsDocument::GetElementByIdInternal(nsIAtom* aID)
nsIdentifierMapEntry *entry = mIdentifierMap.PutEntry(aID);
NS_ENSURE_TRUE(entry, nsnull);
if (entry->GetIdContent())
if (entry->GetIdElement())
return entry;
// Now we have to flush. It could be that we know nothing about this ID yet
@ -4006,7 +4008,7 @@ nsDocument::GetElementById(const nsAString& aElementId,
nsIdentifierMapEntry *entry = GetElementByIdInternal(idAtom);
NS_ENSURE_TRUE(entry, NS_ERROR_OUT_OF_MEMORY);
nsIContent *e = entry->GetIdContent();
Element *e = entry->GetIdElement();
if (!e)
return NS_OK;
@ -4024,7 +4026,7 @@ nsDocument::AddIDTargetObserver(nsIAtom* aID, IDTargetObserver aObserver,
NS_ENSURE_TRUE(entry, nsnull);
entry->AddContentChangeCallback(aObserver, aData);
return entry->GetIdContent();
return entry->GetIdElement();
}
void

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

@ -164,8 +164,8 @@ public:
void SetInvalidName();
PRBool IsInvalidName();
void AddNameContent(nsIContent* aContent);
void RemoveNameContent(nsIContent* aContent);
void AddNameElement(mozilla::dom::Element* aElement);
void RemoveNameElement(mozilla::dom::Element* aElement);
PRBool HasNameContentList() {
return mNameContentList != nsnull;
}
@ -178,7 +178,7 @@ public:
* Returns the element if we know the element associated with this
* id. Otherwise returns null.
*/
nsIContent* GetIdContent();
mozilla::dom::Element* GetIdElement();
/**
* Append all the elements with this id to aElements
*/
@ -188,12 +188,12 @@ public:
* @return true if the content could be added, false if we failed due
* to OOM.
*/
PRBool AddIdContent(nsIContent* aContent);
PRBool AddIdElement(mozilla::dom::Element* aElement);
/**
* This can fire ID change callbacks.
* @return true if this map entry should be removed
*/
PRBool RemoveIdContent(nsIContent* aContent);
PRBool RemoveIdElement(mozilla::dom::Element* aElement);
PRBool HasContentChangeCallback() { return mChangeCallbacks != nsnull; }
void AddContentChangeCallback(nsIDocument::IDTargetObserver aCallback, void* aData);
@ -236,12 +236,14 @@ public:
};
private:
void FireChangeCallbacks(nsIContent* aOldContent, nsIContent* aNewContent);
void FireChangeCallbacks(mozilla::dom::Element* aOldElement,
mozilla::dom::Element* aNewElement);
// empty if there are no nodes with this ID.
// The content nodes are stored addrefed.
// empty if there are no elementswith this ID.
// The elementsnodes are stored addrefed.
nsSmallVoidArray mIdContentList;
// NAME_NOT_VALID if this id cannot be used as a 'name'
// NAME_NOT_VALID if this id cannot be used as a 'name'. Otherwise
// stores Elements.
nsBaseContentList *mNameContentList;
nsRefPtr<nsContentList> mDocAllList;
nsAutoPtr<nsTHashtable<ChangeCallbackEntry> > mChangeCallbacks;
@ -946,10 +948,10 @@ protected:
friend class nsNodeUtils;
void RegisterNamedItems(nsIContent *aContent);
void UnregisterNamedItems(nsIContent *aContent);
void UpdateNameTableEntry(nsIContent *aContent);
void UpdateIdTableEntry(nsIContent *aContent);
void RemoveFromNameTable(nsIContent *aContent);
void RemoveFromIdTable(nsIContent *aContent);
void UpdateNameTableEntry(mozilla::dom::Element *aElement);
void UpdateIdTableEntry(mozilla::dom::Element *aElement);
void RemoveFromNameTable(mozilla::dom::Element *aElement);
void RemoveFromIdTable(mozilla::dom::Element *aElement);
/**
* Check that aId is not empty and log a message to the console

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

@ -2643,24 +2643,26 @@ FindNamedItems(nsIAtom* aName, nsIContent *aContent,
NS_ASSERTION(!aEntry->IsInvalidName(),
"Entry that should never have a list passed to FindNamedItems()!");
if (aContent->IsNodeOfType(nsINode::eTEXT)) {
// Text nodes are not named items nor can they have children.
if (!aContent->IsElement()) {
// non-elements are not named items nor can they have children.
return;
}
if (aName == nsContentUtils::IsNamedItem(aContent)) {
aEntry->AddNameContent(aContent);
Element* element = aContent->AsElement();
if (aName == nsContentUtils::IsNamedItem(element)) {
aEntry->AddNameElement(element);
}
if (!aEntry->GetIdContent() &&
if (!aEntry->GetIdElement() &&
// Maybe this node has the right id?
aName == aContent->GetID()) {
aEntry->AddIdContent(aContent);
aName == element->GetID()) {
aEntry->AddIdElement(element);
}
PRUint32 i, count = aContent->GetChildCount();
PRUint32 i, count = element->GetChildCount();
for (i = 0; i < count; ++i) {
FindNamedItems(aName, aContent->GetChildAt(i), aEntry);
FindNamedItems(aName, element->GetChildAt(i), aEntry);
}
}
@ -2791,7 +2793,7 @@ nsHTMLDocument::ResolveName(const nsAString& aName,
// for aName, so we're guaranteed that if there is an element with
// the id aName, it'll be entry's IdContent.
nsIContent *e = entry->GetIdContent();
Element *e = entry->GetIdElement();
if (e && e->IsHTML()) {
nsIAtom *tag = e->Tag();

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

@ -59,6 +59,9 @@
#include "nsNodeInfoManager.h"
#include "nsINodeInfo.h"
#include "nsIPrincipal.h"
#include "Element.h"
using namespace mozilla::dom;
nsresult
NS_NewXBLContentSink(nsIXMLContentSink** aResult,
@ -891,7 +894,10 @@ nsXBLContentSink::CreateElement(const PRUnichar** aAtts, PRUint32 aAttsCount,
AddAttributesToXULPrototype(aAtts, aAttsCount, prototype);
return nsXULElement::Create(prototype, mDocument, PR_FALSE, aResult);
Element* result;
nsresult rv = nsXULElement::Create(prototype, mDocument, PR_FALSE, &result);
*aResult = result;
return rv;
#endif
}

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

@ -303,7 +303,7 @@ nsresult
nsXULElement::Create(nsXULPrototypeElement* aPrototype,
nsIDocument* aDocument,
PRBool aIsScriptable,
nsIContent** aResult)
Element** aResult)
{
// Create an nsXULElement from a prototype
NS_PRECONDITION(aPrototype != nsnull, "null ptr");

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

@ -479,7 +479,7 @@ protected:
public:
static nsresult
Create(nsXULPrototypeElement* aPrototype, nsIDocument* aDocument,
PRBool aIsScriptable, nsIContent** aResult);
PRBool aIsScriptable, mozilla::dom::Element** aResult);
// nsISupports
NS_DECL_ISUPPORTS_INHERITED

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

@ -1138,8 +1138,10 @@ nsXULDocument::AddElementForID(nsIContent* aElement)
NS_PRECONDITION(aElement != nsnull, "null ptr");
if (! aElement)
return NS_ERROR_NULL_POINTER;
if (!aElement->IsElement())
return NS_ERROR_UNEXPECTED;
UpdateIdTableEntry(aElement);
UpdateIdTableEntry(aElement->AsElement());
return NS_OK;
}
@ -1670,9 +1672,9 @@ nsXULDocument::GetElementById(const nsAString& aId,
nsIdentifierMapEntry *entry = mIdentifierMap.GetEntry(atom);
if (entry) {
nsIContent* content = entry->GetIdContent();
if (content)
return CallQueryInterface(content, aReturn);
Element* element = entry->GetIdElement();
if (element)
return CallQueryInterface(element, aReturn);
}
nsRefMapEntry* refEntry = mRefMap.GetEntry(atom);
if (refEntry) {
@ -1684,7 +1686,7 @@ nsXULDocument::GetElementById(const nsAString& aId,
}
nsresult
nsXULDocument::AddElementToDocumentPre(nsIContent* aElement)
nsXULDocument::AddElementToDocumentPre(Element* aElement)
{
// Do a bunch of work that's necessary when an element gets added
// to the XUL Document.
@ -1727,7 +1729,7 @@ nsXULDocument::AddElementToDocumentPre(nsIContent* aElement)
}
nsresult
nsXULDocument::AddElementToDocumentPost(nsIContent* aElement)
nsXULDocument::AddElementToDocumentPost(Element* aElement)
{
// We need to pay special attention to the keyset tag to set up a listener
if (aElement->NodeInfo()->Equals(nsGkAtoms::keyset, kNameSpaceID_XUL)) {
@ -1766,14 +1768,16 @@ nsXULDocument::AddElementToDocumentPost(nsIContent* aElement)
}
NS_IMETHODIMP
nsXULDocument::AddSubtreeToDocument(nsIContent* aElement)
nsXULDocument::AddSubtreeToDocument(nsIContent* aContent)
{
NS_ASSERTION(aElement->GetCurrentDoc() == this, "Element not in doc!");
NS_ASSERTION(aContent->GetCurrentDoc() == this, "Element not in doc!");
// From here on we only care about elements.
if (!aElement->IsNodeOfType(nsINode::eELEMENT)) {
if (!aContent->IsElement()) {
return NS_OK;
}
Element* aElement = aContent->AsElement();
// Do pre-order addition magic
nsresult rv = AddElementToDocumentPre(aElement);
if (NS_FAILED(rv)) return rv;
@ -1792,13 +1796,15 @@ nsXULDocument::AddSubtreeToDocument(nsIContent* aElement)
}
NS_IMETHODIMP
nsXULDocument::RemoveSubtreeFromDocument(nsIContent* aElement)
nsXULDocument::RemoveSubtreeFromDocument(nsIContent* aContent)
{
// From here on we only care about elements.
if (!aElement->IsNodeOfType(nsINode::eELEMENT)) {
if (!aContent->IsElement()) {
return NS_OK;
}
Element* aElement = aContent->AsElement();
// Do a bunch of cleanup to remove an element from the XUL
// document.
nsresult rv;
@ -2451,7 +2457,7 @@ nsXULDocument::PrepareToWalk()
// Do one-time initialization if we're preparing to walk the
// master document's prototype.
nsCOMPtr<nsIContent> root;
nsCOMPtr<Element> root;
if (mState == eState_Master) {
// Add the root element
@ -2884,7 +2890,7 @@ nsXULDocument::ResumeWalk()
// document hookup done when it's successfully
// resolved.)
if (mState == eState_Master) {
AddElementToDocumentPost(element);
AddElementToDocumentPost(element->AsElement());
if (element->NodeInfo()->Equals(nsGkAtoms::style,
kNameSpaceID_XHTML) ||
@ -2937,7 +2943,7 @@ nsXULDocument::ResumeWalk()
nsXULPrototypeElement* protoele =
static_cast<nsXULPrototypeElement*>(childproto);
nsCOMPtr<nsIContent> child;
nsCOMPtr<Element> child;
if (!processingOverlayHookupNodes) {
rv = CreateElementFromPrototype(protoele,
@ -3664,7 +3670,7 @@ nsXULDocument::ExecuteScript(nsXULPrototypeScript *aScript)
nsresult
nsXULDocument::CreateElementFromPrototype(nsXULPrototypeElement* aPrototype,
nsIContent** aResult)
Element** aResult)
{
// Create a content model element from a prototype element.
NS_PRECONDITION(aPrototype != nsnull, "null ptr");
@ -3687,7 +3693,7 @@ nsXULDocument::CreateElementFromPrototype(nsXULPrototypeElement* aPrototype,
}
#endif
nsCOMPtr<nsIContent> result;
nsCOMPtr<Element> result;
if (aPrototype->mNodeInfo->NamespaceEquals(kNameSpaceID_XUL)) {
// If it's a XUL element, it'll be lightweight until somebody
@ -3705,10 +3711,13 @@ nsXULDocument::CreateElementFromPrototype(nsXULPrototypeElement* aPrototype,
aPrototype->mNodeInfo->GetPrefixAtom(),
aPrototype->mNodeInfo->NamespaceID());
if (!newNodeInfo) return NS_ERROR_OUT_OF_MEMORY;
rv = NS_NewElement(getter_AddRefs(result), newNodeInfo->NamespaceID(),
nsCOMPtr<nsIContent> content;
rv = NS_NewElement(getter_AddRefs(content), newNodeInfo->NamespaceID(),
newNodeInfo, PR_FALSE);
if (NS_FAILED(rv)) return rv;
result = content->AsElement();
#ifdef MOZ_XTF
if (result && newNodeInfo->NamespaceID() > kNameSpaceID_LastBuiltin) {
result->BeginAddingChildren();
@ -3726,11 +3735,11 @@ nsXULDocument::CreateElementFromPrototype(nsXULPrototypeElement* aPrototype,
nsresult
nsXULDocument::CreateOverlayElement(nsXULPrototypeElement* aPrototype,
nsIContent** aResult)
Element** aResult)
{
nsresult rv;
nsCOMPtr<nsIContent> element;
nsCOMPtr<Element> element;
rv = CreateElementFromPrototype(aPrototype, getter_AddRefs(element));
if (NS_FAILED(rv)) return rv;

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

@ -153,8 +153,8 @@ public:
nsCOMArray<nsIContent>& aElements);
NS_IMETHOD GetScriptGlobalObjectOwner(nsIScriptGlobalObjectOwner** aGlobalOwner);
NS_IMETHOD AddSubtreeToDocument(nsIContent* aElement);
NS_IMETHOD RemoveSubtreeFromDocument(nsIContent* aElement);
NS_IMETHOD AddSubtreeToDocument(nsIContent* aContent);
NS_IMETHOD RemoveSubtreeFromDocument(nsIContent* aContent);
NS_IMETHOD SetTemplateBuilderFor(nsIContent* aContent,
nsIXULTemplateBuilder* aBuilder);
NS_IMETHOD GetTemplateBuilderFor(nsIContent* aContent,
@ -235,10 +235,10 @@ protected:
nsCOMArray<nsIContent>& aElements);
nsresult
AddElementToDocumentPre(nsIContent* aElement);
AddElementToDocumentPre(mozilla::dom::Element* aElement);
nsresult
AddElementToDocumentPost(nsIContent* aElement);
AddElementToDocumentPost(mozilla::dom::Element* aElement);
nsresult
ExecuteOnBroadcastHandlerFor(nsIContent* aBroadcaster,
@ -409,13 +409,14 @@ protected:
* Note that the resulting content node is not bound to any tree
*/
nsresult CreateElementFromPrototype(nsXULPrototypeElement* aPrototype,
nsIContent** aResult);
mozilla::dom::Element** aResult);
/**
* Create a hook-up element to which content nodes can be attached for
* later resolution.
*/
nsresult CreateOverlayElement(nsXULPrototypeElement* aPrototype, nsIContent** aResult);
nsresult CreateOverlayElement(nsXULPrototypeElement* aPrototype,
mozilla::dom::Element** aResult);
/**
* Add attributes from the prototype to the element.