[1] Cutting down the size of content. Made nsIJSScriptObject inherit from nsIScriptObjectOwner [2] Cutting down the size of content. Made nsITextContent inherit from nsIContent. [3] Cutting down the size of content. Moved implementation of nsIDOMReceiver to nsListenerManager. This is not true aggregation since it isn't transitive, but it's OK for now. It will be necessary for nsListenerManager to have a reference to its content in the future anyway, so the transitivity could be done. dom/public/nsDOMPropEnums.h,v - bug 12559 dom/public/nsIJSScriptObject.h,v - [1] dom/public/html/MANIFEST,v - bug 12559 dom/public/html/Makefile.in,v - bug 12559 dom/public/html/makefile.win,v - bug 12559 dom/public/html/nsIDOMHTMLInputElement.h,v - bug 17544 dom/public/idl/html/HTMLAnchorElement.idl,v - bug 12559 dom/public/idl/html/HTMLAreaElement.idl,v - bug 12559 dom/public/idl/html/HTMLInputElement.idl,v - bug 17544 dom/src/base/nsGlobalWindow.cpp,v - bug 30700 dom/src/base/nsGlobalWindow.h,v - [1] dom/src/base/nsLocation.cpp,v - [1] dom/src/html/nsJSHTMLAnchorElement.cpp,v - bug 12559 dom/src/html/nsJSHTMLAreaElement.cpp,v - bug 12559 dom/src/html/nsJSHTMLInputElement.cpp,v - bug 17544 layout/base/public/nsIDocument.h,v - bug 27953 layout/base/public/nsITextContent.h,v - [2] layout/base/src/nsCommentNode.cpp,v - [2] layout/base/src/nsDocument.cpp,v - bug 27953 layout/base/src/nsDocument.h,v - bug 27953 layout/base/src/nsDocumentViewer.cpp,v - bug 27953 layout/base/src/nsGenericDOMDataNode.cpp,v - [3] layout/base/src/nsGenericDOMDataNode.h,v - [3] layout/base/src/nsGenericElement.cpp,v - [3] layout/base/src/nsGenericElement.h,v - [3] layout/base/src/nsNameSpaceManager.cpp,v - bug 7834 layout/base/src/nsStyleContext.cpp,v - outline property shouldn't reflow layout/base/src/nsTextNode.cpp,v - [2] layout/events/src/nsEventListenerManager.cpp,v - [3] layout/events/src/nsEventListenerManager.h,v - [3] layout/html/base/src/nsGfxScrollFrame.cpp,v - nsString->nsAutoString layout/html/content/src/nsAttributeContent.cpp,v - [2] layout/html/content/src/nsHTMLAnchorElement.cpp,v - [1][3] layout/html/content/src/nsHTMLAppletElement.cpp,v - [1][3] layout/html/content/src/nsHTMLAreaElement.cpp,v - [1][3] layout/html/content/src/nsHTMLBRElement.cpp,v - [1][3] layout/html/content/src/nsHTMLBaseElement.cpp,v - [1][3] layout/html/content/src/nsHTMLBaseFontElement.cpp,v - [1][3] layout/html/content/src/nsHTMLBodyElement.cpp,v - [1][3] layout/html/content/src/nsHTMLButtonElement.cpp,v - [1][3] layout/html/content/src/nsHTMLDListElement.cpp,v - [1][3] layout/html/content/src/nsHTMLDelElement.cpp,v - [1][3] layout/html/content/src/nsHTMLDirectoryElement.cpp,v - [1][3] layout/html/content/src/nsHTMLDivElement.cpp,v - [1][3] layout/html/content/src/nsHTMLEmbedElement.cpp,v - [1][3] layout/html/content/src/nsHTMLFieldSetElement.cpp,v - [1][3] layout/html/content/src/nsHTMLFontElement.cpp,v - [1][3] layout/html/content/src/nsHTMLFormElement.cpp,v - [1][3] layout/html/content/src/nsHTMLFrameElement.cpp,v - [1][3] layout/html/content/src/nsHTMLFrameSetElement.cpp,v - [1][3] layout/html/content/src/nsHTMLHRElement.cpp,v - [1][3] layout/html/content/src/nsHTMLHeadElement.cpp,v - [1][3] layout/html/content/src/nsHTMLHeadingElement.cpp,v - [1][3] layout/html/content/src/nsHTMLHtmlElement.cpp,v - [1][3] layout/html/content/src/nsHTMLIFrameElement.cpp,v - [1][3] layout/html/content/src/nsHTMLImageElement.cpp,v - [1][3] layout/html/content/src/nsHTMLInputElement.cpp,v - [1][3] layout/html/content/src/nsHTMLInsElement.cpp,v - [1][3] layout/html/content/src/nsHTMLIsIndexElement.cpp,v - [1][3] layout/html/content/src/nsHTMLLIElement.cpp,v - [1][3] layout/html/content/src/nsHTMLLabelElement.cpp,v - [1][3] layout/html/content/src/nsHTMLLayerElement.cpp,v - [1][3] layout/html/content/src/nsHTMLLegendElement.cpp,v - [1][3] layout/html/content/src/nsHTMLLinkElement.cpp,v - [1][3] layout/html/content/src/nsHTMLMapElement.cpp,v - [1][3] layout/html/content/src/nsHTMLMenuElement.cpp,v - [1][3] layout/html/content/src/nsHTMLMetaElement.cpp,v - [1][3] layout/html/content/src/nsHTMLModElement.cpp,v - [1][3] layout/html/content/src/nsHTMLOListElement.cpp,v - [1][3] layout/html/content/src/nsHTMLObjectElement.cpp,v - [1][3] layout/html/content/src/nsHTMLOptGroupElement.cpp,v - [1][3] layout/html/content/src/nsHTMLOptionElement.cpp,v - [1][3] layout/html/content/src/nsHTMLParagraphElement.cpp,v - [1][3] layout/html/content/src/nsHTMLParamElement.cpp,v - [1][3] layout/html/content/src/nsHTMLPreElement.cpp,v - [1][3] layout/html/content/src/nsHTMLQuoteElement.cpp,v - [1][3] layout/html/content/src/nsHTMLScriptElement.cpp,v - [1][3] layout/html/content/src/nsHTMLSelectElement.cpp,v - [1][3] layout/html/content/src/nsHTMLSpacerElement.cpp,v - [1][3] layout/html/content/src/nsHTMLSpanElement.cpp,v - [1][3] layout/html/content/src/nsHTMLStyleElement.cpp,v - [1][3] layout/html/content/src/nsHTMLTableCaptionElement.cpp,v - [1][3] layout/html/content/src/nsHTMLTableCellElement.cpp,v - [1][3] layout/html/content/src/nsHTMLTableColElement.cpp,v - [1][3] layout/html/content/src/nsHTMLTableColGroupElement.cpp,v - [1][3] layout/html/content/src/nsHTMLTableElement.cpp,v - [1][3] layout/html/content/src/nsHTMLTableRowElement.cpp,v - [1][3] layout/html/content/src/nsHTMLTableSectionElement.cpp,v - [1][3] layout/html/content/src/nsHTMLTextAreaElement.cpp,v - [1][3] layout/html/content/src/nsHTMLTitleElement.cpp,v - [1][3] layout/html/content/src/nsHTMLUListElement.cpp,v - [1][3] layout/html/content/src/nsHTMLWBRElement.cpp,v - [1][3] layout/html/document/src/nsHTMLDocument.cpp,v - bug 27953 layout/html/document/src/nsHTMLDocument.h,v - bug 27953 layout/xml/content/src/nsXMLCDATASection.cpp,v - [1][2] layout/xml/content/src/nsXMLDocumentType.cpp,v - [1][2] layout/xml/content/src/nsXMLElement.h,v - [1][2] layout/xml/content/src/nsXMLEntity.cpp,v - [1][2] layout/xml/content/src/nsXMLNotation.cpp,v - [1][2] layout/xml/content/src/nsXMLProcessingInstruction.cpp,v - [1][2] layout/xul/base/src/nsBoxFrame.cpp,v - nsString->nsAutoString layout/xul/base/src/nsSliderFrame.cpp,v - nsString->nsAutoString netwerk/protocol/http/src/nsHTTPRequest.cpp,v - nsString->nsAutoString rdf/content/src/nsXULDocument.cpp,v - bug 27953 rdf/content/src/nsXULDocument.h,v - bug 27953 rdf/content/src/nsXULElement.h,v - [1] xpcom/base/IIDS.h,v - bug 12559 git-svn-id: svn://10.0.0.236/trunk@63290 18797224-902f-48f8-a5cc-f745e15eee43
484 lines
13 KiB
C++
484 lines
13 KiB
C++
/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*-
|
|
*
|
|
* The contents of this file are subject to the Netscape 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/NPL/
|
|
*
|
|
* 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.org code.
|
|
*
|
|
* The Initial Developer of the Original Code is Netscape
|
|
* Communications Corporation. Portions created by Netscape are
|
|
* Copyright (C) 1998 Netscape Communications Corporation. All
|
|
* Rights Reserved.
|
|
*
|
|
* Contributor(s):
|
|
*/
|
|
#include "nsINameSpaceManager.h"
|
|
#include "nsINameSpace.h"
|
|
#include "nsHashtable.h"
|
|
#include "nsVoidArray.h"
|
|
#include "nsLayoutAtoms.h"
|
|
#include "nsString.h"
|
|
#include "nsCRT.h"
|
|
|
|
static NS_DEFINE_IID(kINameSpaceManagerIID, NS_INAMESPACEMANAGER_IID);
|
|
static NS_DEFINE_IID(kINameSpaceIID, NS_INAMESPACE_IID);
|
|
|
|
|
|
static const char kXMLNSNameSpaceURI[] = "<This isn't really a namespace>";
|
|
static const char kXMLNameSpaceURI[] = "http://www.w3.org/XML/1998/namespace";
|
|
static const char kHTMLNameSpaceURI[] = "http://www.w3.org/TR/REC-html40"; // XXX?? "urn:w3-org-ns:HTML"??
|
|
static const char kXHTMLNameSpaceURI[] = "http://www.w3.org/1999/xhtml";
|
|
|
|
//-----------------------------------------------------------
|
|
// Name Space ID table support
|
|
|
|
static PRInt32 gNameSpaceTableRefs;
|
|
static nsHashtable* gURIToIDTable;
|
|
static nsVoidArray* gURIArray;
|
|
|
|
MOZ_DECL_CTOR_COUNTER(NameSpaceURIKey);
|
|
|
|
class NameSpaceURIKey : public nsHashKey {
|
|
public:
|
|
NameSpaceURIKey(const nsString* aString)
|
|
: mString(aString)
|
|
{
|
|
MOZ_COUNT_CTOR(NameSpaceURIKey);
|
|
}
|
|
|
|
virtual ~NameSpaceURIKey(void)
|
|
{
|
|
MOZ_COUNT_DTOR(NameSpaceURIKey);
|
|
}
|
|
|
|
virtual PRUint32 HashValue(void) const
|
|
{
|
|
#if 1 // case insensitive XXX should this be case sensitive???
|
|
PRUint32 hash = 0;
|
|
const PRUnichar* string = mString->GetUnicode();
|
|
PRUnichar ch;
|
|
while ((ch = *string++) != 0) {
|
|
// FYI: hash = hash*37 + ch
|
|
ch = nsCRT::ToLower(ch);
|
|
hash = ((hash << 5) + (hash << 2) + hash) + ch;
|
|
}
|
|
return hash;
|
|
#else
|
|
if (nsnull != mString) {
|
|
return nsCRT::HashValue(mString->GetUnicode());
|
|
}
|
|
return 0;
|
|
#endif
|
|
}
|
|
|
|
virtual PRBool Equals(const nsHashKey *aKey) const
|
|
{
|
|
const nsString* other = ((const NameSpaceURIKey*)aKey)->mString;
|
|
if (nsnull != mString) {
|
|
if (nsnull != other) {
|
|
return mString->EqualsIgnoreCase(*other); // XXX case sensitive?
|
|
}
|
|
return PR_FALSE;
|
|
}
|
|
return PRBool(nsnull == other);
|
|
}
|
|
|
|
virtual nsHashKey *Clone(void) const
|
|
{
|
|
return new NameSpaceURIKey(mString);
|
|
}
|
|
|
|
const nsString* mString;
|
|
};
|
|
|
|
static void AddRefTable()
|
|
{
|
|
if (0 == gNameSpaceTableRefs++) {
|
|
NS_ASSERTION(nsnull == gURIToIDTable, "already have URI table");
|
|
NS_ASSERTION(nsnull == gURIArray, "already have URI array");
|
|
|
|
gURIToIDTable = new nsHashtable();
|
|
gURIArray = new nsVoidArray();
|
|
|
|
nsString* xmlns = new nsString(kXMLNSNameSpaceURI);
|
|
nsString* xml = new nsString(kXMLNameSpaceURI);
|
|
nsString* html = new nsString(kHTMLNameSpaceURI);
|
|
nsString* xhtml = new nsString(kXHTMLNameSpaceURI);
|
|
gURIArray->AppendElement(xmlns); // ordering here needs to match IDs
|
|
gURIArray->AppendElement(xml);
|
|
gURIArray->AppendElement(html);
|
|
gURIArray->AppendElement(xhtml);
|
|
NameSpaceURIKey xmlnsKey(xmlns);
|
|
NameSpaceURIKey xmlKey(xml);
|
|
NameSpaceURIKey htmlKey(html);
|
|
NameSpaceURIKey xhtmlKey(xhtml);
|
|
gURIToIDTable->Put(&xmlnsKey, (void*)kNameSpaceID_XMLNS);
|
|
gURIToIDTable->Put(&xmlKey, (void*)kNameSpaceID_XML);
|
|
gURIToIDTable->Put(&htmlKey, (void*)kNameSpaceID_HTML);
|
|
gURIToIDTable->Put(&xhtmlKey, (void*)kNameSpaceID_HTML);
|
|
}
|
|
NS_ASSERTION(nsnull != gURIToIDTable, "no URI table");
|
|
NS_ASSERTION(nsnull != gURIArray, "no URI array");
|
|
}
|
|
|
|
static void ReleaseTable()
|
|
{
|
|
if (0 == --gNameSpaceTableRefs) {
|
|
delete gURIToIDTable;
|
|
PRInt32 index = gURIArray->Count();
|
|
while (0 < index--) {
|
|
nsString* str = (nsString*)gURIArray->ElementAt(index);
|
|
delete str;
|
|
}
|
|
delete gURIArray;
|
|
gURIToIDTable = nsnull;
|
|
gURIArray = nsnull;
|
|
}
|
|
}
|
|
|
|
static PRInt32 FindNameSpaceID(const nsString& aURI)
|
|
{
|
|
NS_ASSERTION(nsnull != gURIToIDTable, "no URI table");
|
|
NameSpaceURIKey key(&aURI);
|
|
void* value = gURIToIDTable->Get(&key);
|
|
if (nsnull != value) {
|
|
return PRInt32(value);
|
|
}
|
|
return kNameSpaceID_Unknown;
|
|
}
|
|
|
|
static const nsString* FindNameSpaceURI(PRInt32 aID)
|
|
{
|
|
NS_ASSERTION(nsnull != gURIArray, "no URI array");
|
|
return (const nsString*)gURIArray->ElementAt(aID - 1);
|
|
}
|
|
|
|
//-----------------------------------------------------------
|
|
// Name Space
|
|
|
|
class NameSpaceImpl : public nsINameSpace {
|
|
public:
|
|
NameSpaceImpl(nsINameSpaceManager* aManager,
|
|
NameSpaceImpl* aParent,
|
|
nsIAtom* aPrefix,
|
|
const nsString& aURI);
|
|
NameSpaceImpl(nsINameSpaceManager* aManager,
|
|
NameSpaceImpl* aParent,
|
|
nsIAtom* aPrefix,
|
|
PRInt32 aNameSpaceID);
|
|
virtual ~NameSpaceImpl();
|
|
|
|
NS_DECL_ISUPPORTS
|
|
|
|
NS_IMETHOD GetNameSpaceManager(nsINameSpaceManager*& aManager) const;
|
|
|
|
NS_IMETHOD GetNameSpaceID(PRInt32& aID) const;
|
|
NS_IMETHOD GetNameSpaceURI(nsString& aURI) const;
|
|
NS_IMETHOD GetNameSpacePrefix(nsIAtom*& aPrefix) const;
|
|
|
|
NS_IMETHOD GetParentNameSpace(nsINameSpace*& aParent) const;
|
|
|
|
NS_IMETHOD FindNameSpace(nsIAtom* aPrefix, nsINameSpace*& aNameSpace) const;
|
|
NS_IMETHOD FindNameSpaceID(nsIAtom* aPrefix, PRInt32& aNameSpaceID) const;
|
|
NS_IMETHOD FindNameSpacePrefix(PRInt32 aNameSpaceID, nsIAtom*& aPrefix) const;
|
|
|
|
NS_IMETHOD CreateChildNameSpace(nsIAtom* aPrefix, const nsString& aURI,
|
|
nsINameSpace*& aChildNameSpace);
|
|
NS_IMETHOD CreateChildNameSpace(nsIAtom* aPrefix, PRInt32 aNameSpaceID,
|
|
nsINameSpace*& aChildNameSpace);
|
|
|
|
private:
|
|
// These are not supported and are not implemented!
|
|
NameSpaceImpl(const NameSpaceImpl& aCopy);
|
|
NameSpaceImpl& operator=(const NameSpaceImpl& aCopy);
|
|
|
|
public:
|
|
nsINameSpaceManager* mManager;
|
|
NameSpaceImpl* mParent;
|
|
nsIAtom* mPrefix;
|
|
PRInt32 mID;
|
|
};
|
|
|
|
NameSpaceImpl::NameSpaceImpl(nsINameSpaceManager* aManager,
|
|
NameSpaceImpl* aParent,
|
|
nsIAtom* aPrefix,
|
|
const nsString& aURI)
|
|
: mManager(aManager),
|
|
mParent(aParent),
|
|
mPrefix(aPrefix)
|
|
{
|
|
NS_ASSERTION(nsnull != aManager, "null namespace manager");
|
|
NS_INIT_REFCNT();
|
|
NS_ADDREF(mManager);
|
|
NS_IF_ADDREF(mParent);
|
|
NS_IF_ADDREF(mPrefix);
|
|
mManager->RegisterNameSpace(aURI, mID);
|
|
}
|
|
|
|
NameSpaceImpl::NameSpaceImpl(nsINameSpaceManager* aManager,
|
|
NameSpaceImpl* aParent,
|
|
nsIAtom* aPrefix,
|
|
PRInt32 aNameSpaceID)
|
|
: mManager(aManager),
|
|
mParent(aParent),
|
|
mPrefix(aPrefix),
|
|
mID(aNameSpaceID)
|
|
{
|
|
NS_ASSERTION(nsnull != aManager, "null namespace manager");
|
|
NS_INIT_REFCNT();
|
|
NS_ADDREF(mManager);
|
|
NS_IF_ADDREF(mParent);
|
|
NS_IF_ADDREF(mPrefix);
|
|
}
|
|
|
|
NameSpaceImpl::~NameSpaceImpl()
|
|
{
|
|
NS_RELEASE(mManager);
|
|
NS_IF_RELEASE(mParent);
|
|
NS_IF_RELEASE(mPrefix);
|
|
}
|
|
|
|
NS_IMPL_ISUPPORTS(NameSpaceImpl, kINameSpaceIID)
|
|
|
|
NS_IMETHODIMP
|
|
NameSpaceImpl::GetNameSpaceManager(nsINameSpaceManager*& aManager) const
|
|
{
|
|
NS_ASSERTION(nsnull != aManager, "null namespace manager");
|
|
aManager = mManager;
|
|
NS_ADDREF(aManager);
|
|
return NS_OK;
|
|
}
|
|
|
|
NS_IMETHODIMP
|
|
NameSpaceImpl::GetNameSpaceID(PRInt32& aID) const
|
|
{
|
|
aID = mID;
|
|
return NS_OK;
|
|
}
|
|
|
|
NS_IMETHODIMP
|
|
NameSpaceImpl::GetNameSpaceURI(nsString& aURI) const
|
|
{
|
|
NS_ASSERTION(nsnull != mManager, "null namespace manager");
|
|
return mManager->GetNameSpaceURI(mID, aURI);
|
|
}
|
|
|
|
NS_IMETHODIMP
|
|
NameSpaceImpl::GetNameSpacePrefix(nsIAtom*& aPrefix) const
|
|
{
|
|
aPrefix = mPrefix;
|
|
NS_IF_ADDREF(aPrefix);
|
|
return NS_OK;
|
|
}
|
|
|
|
NS_IMETHODIMP
|
|
NameSpaceImpl::GetParentNameSpace(nsINameSpace*& aParent) const
|
|
{
|
|
aParent = mParent;
|
|
NS_IF_ADDREF(aParent);
|
|
return NS_OK;
|
|
}
|
|
|
|
NS_IMETHODIMP
|
|
NameSpaceImpl::FindNameSpace(nsIAtom* aPrefix, nsINameSpace*& aNameSpace) const
|
|
{
|
|
const NameSpaceImpl* nameSpace = this;
|
|
do {
|
|
if (aPrefix == nameSpace->mPrefix) {
|
|
aNameSpace = (nsINameSpace*)nameSpace;
|
|
NS_ADDREF(aNameSpace);
|
|
return NS_OK;
|
|
}
|
|
nameSpace = nameSpace->mParent;
|
|
}
|
|
while (nsnull != nameSpace);
|
|
aNameSpace = nsnull;
|
|
return NS_ERROR_ILLEGAL_VALUE;
|
|
}
|
|
|
|
NS_IMETHODIMP
|
|
NameSpaceImpl::FindNameSpaceID(nsIAtom* aPrefix, PRInt32& aNameSpaceID) const
|
|
{
|
|
const NameSpaceImpl* nameSpace = this;
|
|
do {
|
|
if (aPrefix == nameSpace->mPrefix) {
|
|
aNameSpaceID = nameSpace->mID;
|
|
return NS_OK;
|
|
}
|
|
nameSpace = nameSpace->mParent;
|
|
}
|
|
while (nsnull != nameSpace);
|
|
if (nsnull == aPrefix) {
|
|
aNameSpaceID = kNameSpaceID_None;
|
|
}
|
|
else {
|
|
aNameSpaceID = kNameSpaceID_Unknown;
|
|
}
|
|
return NS_ERROR_ILLEGAL_VALUE;
|
|
}
|
|
|
|
NS_IMETHODIMP
|
|
NameSpaceImpl::FindNameSpacePrefix(PRInt32 aNameSpaceID, nsIAtom*& aPrefix) const
|
|
{
|
|
const NameSpaceImpl* nameSpace = this;
|
|
do {
|
|
if (aNameSpaceID == nameSpace->mID) {
|
|
aPrefix = nameSpace->mPrefix;
|
|
NS_IF_ADDREF(aPrefix);
|
|
return NS_OK;
|
|
}
|
|
nameSpace = nameSpace->mParent;
|
|
}
|
|
while (nsnull != nameSpace);
|
|
aPrefix = nsnull;
|
|
return NS_ERROR_ILLEGAL_VALUE;
|
|
}
|
|
|
|
NS_IMETHODIMP
|
|
NameSpaceImpl::CreateChildNameSpace(nsIAtom* aPrefix, const nsString& aURI,
|
|
nsINameSpace*& aChildNameSpace)
|
|
{
|
|
NameSpaceImpl* child = new NameSpaceImpl(mManager, this, aPrefix, aURI);
|
|
|
|
if (child) {
|
|
return child->QueryInterface(kINameSpaceIID, (void**)&aChildNameSpace);
|
|
}
|
|
aChildNameSpace = nsnull;
|
|
return NS_ERROR_OUT_OF_MEMORY;
|
|
}
|
|
|
|
NS_IMETHODIMP
|
|
NameSpaceImpl::CreateChildNameSpace(nsIAtom* aPrefix, PRInt32 aNameSpaceID,
|
|
nsINameSpace*& aChildNameSpace)
|
|
{
|
|
if (FindNameSpaceURI(aNameSpaceID)) {
|
|
NameSpaceImpl* child = new NameSpaceImpl(mManager, this, aPrefix, aNameSpaceID);
|
|
|
|
if (child) {
|
|
return child->QueryInterface(kINameSpaceIID, (void**)&aChildNameSpace);
|
|
}
|
|
aChildNameSpace = nsnull;
|
|
return NS_ERROR_OUT_OF_MEMORY;
|
|
}
|
|
aChildNameSpace = nsnull;
|
|
return NS_ERROR_ILLEGAL_VALUE;
|
|
}
|
|
|
|
//-----------------------------------------------------------
|
|
// Name Space Manager
|
|
|
|
class NameSpaceManagerImpl : public nsINameSpaceManager {
|
|
public:
|
|
NameSpaceManagerImpl();
|
|
|
|
NS_DECL_ISUPPORTS
|
|
|
|
NS_IMETHOD CreateRootNameSpace(nsINameSpace*& aRootNameSpace);
|
|
|
|
NS_IMETHOD RegisterNameSpace(const nsString& aURI,
|
|
PRInt32& aNameSpaceID);
|
|
|
|
NS_IMETHOD GetNameSpaceURI(PRInt32 aNameSpaceID, nsString& aURI);
|
|
NS_IMETHOD GetNameSpaceID(const nsString& aURI, PRInt32& aNameSpaceID);
|
|
|
|
private:
|
|
// These are not supported and are not implemented!
|
|
NameSpaceManagerImpl(const NameSpaceManagerImpl& aCopy);
|
|
NameSpaceManagerImpl& operator=(const NameSpaceManagerImpl& aCopy);
|
|
|
|
protected:
|
|
virtual ~NameSpaceManagerImpl();
|
|
|
|
};
|
|
|
|
NameSpaceManagerImpl::NameSpaceManagerImpl()
|
|
{
|
|
NS_INIT_REFCNT();
|
|
AddRefTable();
|
|
}
|
|
|
|
NameSpaceManagerImpl::~NameSpaceManagerImpl()
|
|
{
|
|
ReleaseTable();
|
|
}
|
|
|
|
NS_IMPL_ISUPPORTS(NameSpaceManagerImpl, kINameSpaceManagerIID)
|
|
|
|
NS_IMETHODIMP
|
|
NameSpaceManagerImpl::CreateRootNameSpace(nsINameSpace*& aRootNameSpace)
|
|
{
|
|
nsresult rv = NS_ERROR_OUT_OF_MEMORY;
|
|
aRootNameSpace = nsnull;
|
|
|
|
NameSpaceImpl* xmlns = new NameSpaceImpl(this, nsnull, nsLayoutAtoms::xmlnsNameSpace, kNameSpaceID_XMLNS);
|
|
if (nsnull != xmlns) {
|
|
NameSpaceImpl* xml = new NameSpaceImpl(this, xmlns, nsLayoutAtoms::xmlNameSpace, kNameSpaceID_XML);
|
|
if (nsnull != xml) {
|
|
rv = xml->QueryInterface(kINameSpaceIID, (void**)&aRootNameSpace);
|
|
}
|
|
else {
|
|
delete xmlns;
|
|
}
|
|
}
|
|
return rv;
|
|
}
|
|
|
|
NS_IMETHODIMP
|
|
NameSpaceManagerImpl::RegisterNameSpace(const nsString& aURI,
|
|
PRInt32& aNameSpaceID)
|
|
{
|
|
PRInt32 id = FindNameSpaceID(aURI);
|
|
|
|
if (kNameSpaceID_Unknown == id) {
|
|
nsString* uri = new nsString(aURI);
|
|
gURIArray->AppendElement(uri);
|
|
id = gURIArray->Count(); // id is index + 1
|
|
NameSpaceURIKey key(uri);
|
|
gURIToIDTable->Put(&key, (void*)id);
|
|
}
|
|
aNameSpaceID = id;
|
|
return NS_OK;
|
|
}
|
|
|
|
NS_IMETHODIMP
|
|
NameSpaceManagerImpl::GetNameSpaceURI(PRInt32 aNameSpaceID, nsString& aURI)
|
|
{
|
|
const nsString* result = FindNameSpaceURI(aNameSpaceID);
|
|
if (nsnull != result) {
|
|
aURI = *result;
|
|
return NS_OK;
|
|
}
|
|
aURI.Truncate();
|
|
return NS_ERROR_ILLEGAL_VALUE;
|
|
}
|
|
|
|
NS_IMETHODIMP
|
|
NameSpaceManagerImpl::GetNameSpaceID(const nsString& aURI, PRInt32& aNameSpaceID)
|
|
{
|
|
aNameSpaceID = FindNameSpaceID(aURI);
|
|
return NS_OK;
|
|
}
|
|
|
|
NS_LAYOUT nsresult
|
|
NS_NewNameSpaceManager(nsINameSpaceManager** aInstancePtrResult)
|
|
{
|
|
if (aInstancePtrResult == nsnull) {
|
|
return NS_ERROR_NULL_POINTER;
|
|
}
|
|
|
|
NameSpaceManagerImpl *it = new NameSpaceManagerImpl();
|
|
|
|
if (nsnull == it) {
|
|
return NS_ERROR_OUT_OF_MEMORY;
|
|
}
|
|
|
|
return it->QueryInterface(kINameSpaceManagerIID, (void **) aInstancePtrResult);
|
|
}
|