bug 76070, namespace and localName atom support for transformiix. original work by Jonas Sicking, alot of work by me. r=peterv, sicking@bigfoot.com, sr=jst

This commit is contained in:
axel%pike.org 2001-10-19 12:09:42 +00:00
Родитель ecb14ba94b
Коммит 3b7719c991
19 изменённых файлов: 1085 добавлений и 154 удалений

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

@ -68,6 +68,40 @@ RegisterTransformiix(nsIComponentManager *aCompMgr,
return rv; return rv;
} }
// Perform our one-time intialization for this module
static PRBool gInitialized = PR_FALSE;
PR_STATIC_CALLBACK(nsresult)
Initialize(nsIModule* self)
{
NS_PRECONDITION(!gInitialized, "module already initialized");
if (gInitialized)
return NS_OK;
gInitialized = PR_TRUE;
txXMLAtoms::XMLPrefix = NS_NewAtom("xml");
NS_ENSURE_TRUE(txXMLAtoms::XMLPrefix, NS_ERROR_OUT_OF_MEMORY);
txXMLAtoms::XMLNSPrefix = NS_NewAtom("xmlns");
NS_ENSURE_TRUE(txXMLAtoms::XMLNSPrefix, NS_ERROR_OUT_OF_MEMORY);
return NS_OK;
}
// Shutdown this module, releasing all of the module resources
PR_STATIC_CALLBACK(void)
Shutdown(nsIModule* self)
{
NS_PRECONDITION(gInitialized, "module not initialized");
if (! gInitialized)
return;
gInitialized = PR_FALSE;
NS_IF_RELEASE(txXMLAtoms::XMLPrefix);
NS_IF_RELEASE(txXMLAtoms::XMLNSPrefix);
}
// Component Table // Component Table
static nsModuleComponentInfo components[] = { static nsModuleComponentInfo components[] = {
{ "Transformiix XSLT Processor", { "Transformiix XSLT Processor",
@ -85,4 +119,5 @@ static nsModuleComponentInfo components[] = {
nsSyncLoaderConstructor } nsSyncLoaderConstructor }
}; };
NS_IMPL_NSGETMODULE(TransformiixModule, components) NS_IMPL_NSGETMODULE_WITH_CTOR_DTOR(TransformiixModule, components,
Initialize, Shutdown)

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

@ -1,4 +1,5 @@
/* /* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*-
*
* The contents of this file are subject to the Mozilla Public * The contents of this file are subject to the Mozilla Public
* License Version 1.1 (the "License"); you may not use this file * License Version 1.1 (the "License"); you may not use this file
* except in compliance with the License. You may obtain a copy of * except in compliance with the License. You may obtain a copy of
@ -363,12 +364,20 @@ void* txListIterator::advance(int i) {
void* obj = 0; void* obj = 0;
if (i > 0) { if (i > 0) {
if (!currentItem && !atEndOfList) {
currentItem = list->firstItem;
--i;
}
for (; currentItem && i > 0; i--) for (; currentItem && i > 0; i--)
currentItem = currentItem->nextItem; currentItem = currentItem->nextItem;
atEndOfList = currentItem == 0; atEndOfList = currentItem == 0;
} }
else { else if (i < 0) {
if (!currentItem && atEndOfList) {
currentItem = list->lastItem;
++i;
}
for (; currentItem && i < 0; i++) for (; currentItem && i < 0; i++)
currentItem = currentItem->prevItem; currentItem = currentItem->prevItem;

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

@ -0,0 +1,165 @@
/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
/* ***** 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 TransforMiiX XSLT processor.
*
* The Initial Developer of the Original Code is
* Jonas Sicking.
* Portions created by the Initial Developer are Copyright (C) 2001
* Jonas Sicking. All Rights Reserved.
*
* Contributor(s):
* Jonas Sicking <sicking@bigfoot.com>
* Axel Hecht <axel@pike.org>
*
* Alternatively, the contents of this file may be used under the terms of
* either 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 ***** */
/*
* Atom implementation for standalone and wrapper for module
*
* For module,
* txAtom is typedef'd to nsIAtom,
* for standalone there is a separate implementation. The
* code is all inlined in this header file.
*
* There is one major difference between the standalone and
* the module implementation, module atoms are refcounted,
* standalone atoms are not. Therefor code that is standalone
* only may not use TX_RELEASE..ATOM, code that works in both
* module and standalone has to pair these. Or you leak.
*
* To use this code standalone,
* TX_IMPL_ATOM_STATICS;
* has to appear in your source file. This is done by
* TX_IMPL_STATICS
* defined below. XSLTProcessor.cpp does this.
*/
#ifndef TRANSFRMX_ATOM_H
#define TRANSFRMX_ATOM_H
#include "TxString.h"
#ifndef TX_EXE
#include "nsIAtom.h"
#else
#include "NamedMap.h"
#endif
#ifdef TX_EXE
class txAtom : public TxObject
{
public:
txAtom(const String& aString)
{
mString = aString;
}
MBool getString(String& aString)
{
aString = mString;
return MB_TRUE;
}
private:
String mString;
};
class txAtomService
{
public:
static txAtom* getAtom(const String& aString)
{
if (!mAtoms && !Init())
return NULL;
txAtom* atom = (txAtom*)mAtoms->get(aString);
if (!atom) {
atom = new txAtom(aString);
if (!atom)
return 0;
mAtoms->put(aString, atom);
}
return atom;
}
static MBool Init()
{
NS_ASSERTION(!mAtoms, "called without matching Shutdown()");
if (mAtoms)
return MB_TRUE;
mAtoms = new NamedMap();
if (!mAtoms)
return MB_FALSE;
mAtoms->setObjectDeletion(MB_TRUE);
return MB_TRUE;
}
static void Shutdown()
{
NS_ASSERTION(mAtoms, "called without matching Init()");
if (!mAtoms)
return;
delete mAtoms;
mAtoms = NULL;
}
private:
static NamedMap* mAtoms;
};
#define TX_GET_ATOM(str) \
(txAtomService::getAtom(str))
#define TX_ADDREF_ATOM(atom) {}
#define TX_RELEASE_ATOM(atom) {}
#define TX_RELEASE_IF_ATOM(atom) {}
#define TX_GET_ATOM_STRING(atom, str) \
((atom)->getString(str))
#define TX_IMPL_ATOM_STATICS \
NamedMap* txAtomService::mAtoms = 0
#else
typedef nsIAtom txAtom;
#define TX_GET_ATOM(str) \
NS_NewAtom((str).getConstNSString())
#define TX_ADDREF_ATOM(atom) NS_ADDREF(atom)
#define TX_RELEASE_ATOM(atom) NS_RELEASE(atom)
#define TX_RELEASE_IF_ATOM(atom) NS_IF_RELEASE(atom)
#define TX_GET_ATOM_STRING(atom, string) \
NS_SUCCESS((atom)->ToString(string))
#endif // TX_EXE
#endif // TRANSFRMX_ATOM_H

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

@ -1,4 +1,5 @@
/* /* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*-
*
* The contents of this file are subject to the Mozilla Public * The contents of this file are subject to the Mozilla Public
* License Version 1.1 (the "License"); you may not use this file * License Version 1.1 (the "License"); you may not use this file
* except in compliance with the License. You may obtain a copy of * except in compliance with the License. You may obtain a copy of
@ -56,6 +57,8 @@ void printUsage();
**/ **/
int main(int argc, char** argv) { int main(int argc, char** argv) {
if (!txInit())
return 1;
XSLTProcessor xsltProcessor; XSLTProcessor xsltProcessor;
//-- add ErrorObserver //-- add ErrorObserver
@ -135,6 +138,7 @@ int main(int argc, char** argv) {
xsltProcessor.process(*xmlInput, *xmlFilename, xsltInput, *xsltFilename, *resultOutput); xsltProcessor.process(*xmlInput, *xmlFilename, xsltInput, *xsltFilename, *resultOutput);
} }
resultFileStream.close(); resultFileStream.close();
txShutdown();
return 0; return 0;
} //-- main } //-- main

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

@ -23,13 +23,14 @@
* *
*/ */
/* Implementation of the wrapper class to convert the Mozilla nsIDOMAttr /*
interface into a TransforMIIX Attr interface. * Implementation of the wrapper class to convert the Mozilla nsIDOMAttr
*/ * interface into a TransforMiiX Attr interface.
*/
#include "mozilladom.h" #include "mozilladom.h"
/** /*
* Construct a wrapper with the specified Mozilla object and document owner. * Construct a wrapper with the specified Mozilla object and document owner.
* *
* @param aAttr the nsIDOMAttr you want to wrap * @param aAttr the nsIDOMAttr you want to wrap
@ -37,16 +38,27 @@
*/ */
Attr::Attr(nsIDOMAttr* aAttr, Document* aOwner) : Node(aAttr, aOwner) Attr::Attr(nsIDOMAttr* aAttr, Document* aOwner) : Node(aAttr, aOwner)
{ {
NS_ASSERTION(aAttr, "Wrapper needs nsObject");
NS_ASSERTION(aOwner, "Wrapper needs owner document");
if (!aAttr || !aOwner)
return;
nsAutoString ns;
aAttr->GetNamespaceURI(ns);
NS_ASSERTION(aOwner->nsNSManager,
"owner document lacks namespace manager");
if (!aOwner->nsNSManager)
return;
aOwner->nsNSManager->GetNameSpaceID(ns, namespaceID);
} }
/** /*
* Destructor * Destructor
*/ */
Attr::~Attr() Attr::~Attr()
{ {
} }
/** /*
* Call nsIDOMAttr::GetName to retrieve the name of this attribute. * Call nsIDOMAttr::GetName to retrieve the name of this attribute.
* *
* @return the attribute's name * @return the attribute's name
@ -61,7 +73,7 @@ const String& Attr::getName()
return nodeName; return nodeName;
} }
/** /*
* Call nsIDOMAttr::GetSpecified to retrieve the specified flag for this * Call nsIDOMAttr::GetSpecified to retrieve the specified flag for this
* attribute. * attribute.
* *
@ -77,7 +89,7 @@ MBool Attr::getSpecified() const
return specified; return specified;
} }
/** /*
* Call nsIDOMAttr::GetValue to retrieve the value of this attribute. * Call nsIDOMAttr::GetValue to retrieve the value of this attribute.
* *
* @return the attribute's value * @return the attribute's value
@ -92,7 +104,7 @@ const String& Attr::getValue()
return nodeValue; return nodeValue;
} }
/** /*
* Call nsIDOMAttr::SetValue to set the value of this attribute. * Call nsIDOMAttr::SetValue to set the value of this attribute.
* *
* @return the attribute's value * @return the attribute's value
@ -119,3 +131,22 @@ Node* Attr::getXPathParent()
return ownerDocument->createWrapper(ownerElem); return ownerDocument->createWrapper(ownerElem);
return NULL; return NULL;
} }
/*
* Returns the local name atomized
*
* @return the node's localname atom
*/
MBool Attr::getLocalName(txAtom** aLocalName)
{
if (!aLocalName)
return MB_FALSE;
NSI_FROM_TX(Attr)
if (!nsAttr)
return MB_FALSE;
nsAutoString lName;
NS_ENSURE_SUCCESS(nsAttr->GetLocalName(lName), MB_FALSE);
*aLocalName = NS_NewAtom(lName);
NS_ENSURE_TRUE(*aLocalName, MB_FALSE);
return MB_TRUE;
}

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

@ -1,4 +1,5 @@
/* /* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*-
*
* (C) Copyright The MITRE Corporation 1999 All rights reserved. * (C) Copyright The MITRE Corporation 1999 All rights reserved.
* *
* The contents of this file are subject to the Mozilla Public License * The contents of this file are subject to the Mozilla Public License
@ -59,8 +60,15 @@ Document::Document() : Node(0, 0)
//if (NS_FAILED(res)) return NULL; //if (NS_FAILED(res)) return NULL;
ownerDocument = this; ownerDocument = this;
wrapperHashTable = new nsObjectHashtable(nsnull, nsnull, DeleteWrapper, nsnull); wrapperHashTable = new nsObjectHashtable(nsnull, nsnull,
DeleteWrapper, nsnull);
bInHashTableDeletion = PR_FALSE; bInHashTableDeletion = PR_FALSE;
nsCOMPtr<nsIDocument> doc(do_QueryInterface(document));
NS_ASSERTION(doc,"document doesn't implement nsIDocument");
if (doc) {
doc->GetNameSpaceManager(*getter_AddRefs(nsNSManager));
NS_ASSERTION(nsNSManager, "Unable to get nsINamespaceManager");
}
addWrapper(this); addWrapper(this);
} }
@ -73,8 +81,15 @@ Document::Document() : Node(0, 0)
Document::Document(nsIDOMDocument* aDocument) : Node(aDocument, 0) Document::Document(nsIDOMDocument* aDocument) : Node(aDocument, 0)
{ {
ownerDocument = this; ownerDocument = this;
wrapperHashTable = new nsObjectHashtable(nsnull, nsnull, DeleteWrapper, nsnull); wrapperHashTable = new nsObjectHashtable(nsnull, nsnull,
DeleteWrapper, nsnull);
bInHashTableDeletion = PR_FALSE; bInHashTableDeletion = PR_FALSE;
nsCOMPtr<nsIDocument> doc(do_QueryInterface(aDocument));
NS_ASSERTION(doc,"document doesn't implement nsIDocument");
if (doc) {
doc->GetNameSpaceManager(*getter_AddRefs(nsNSManager));
NS_ASSERTION(nsNSManager, "Unable to get nsINamespaceManager");
}
addWrapper(this); addWrapper(this);
} }

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

@ -1,4 +1,5 @@
/* /* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*-
*
* (C) Copyright The MITRE Corporation 1999 All rights reserved. * (C) Copyright The MITRE Corporation 1999 All rights reserved.
* *
* The contents of this file are subject to the Mozilla Public License * The contents of this file are subject to the Mozilla Public License
@ -22,13 +23,15 @@
* *
*/ */
/* Implementation of the wrapper class to convert the Mozilla nsIDOMElement /*
interface into a TransforMIIX Element interface. * Implementation of the wrapper class to convert the Mozilla nsIDOMElement
*/ * interface into a TransforMiiX Element interface.
*/
#include "mozilladom.h" #include "mozilladom.h"
#include "nsIContent.h"
/** /*
* Construct a wrapper with the specified Mozilla object and document owner. * Construct a wrapper with the specified Mozilla object and document owner.
* *
* @param aElement the nsIDOMElement you want to wrap * @param aElement the nsIDOMElement you want to wrap
@ -37,16 +40,20 @@
Element::Element(nsIDOMElement* aElement, Document* aOwner) : Element::Element(nsIDOMElement* aElement, Document* aOwner) :
Node(aElement, aOwner) Node(aElement, aOwner)
{ {
nsCOMPtr<nsIContent> cont(do_QueryInterface(aElement));
NS_ASSERTION(cont, "Element doesn't implement nsIContent");
if (cont)
cont->GetNameSpaceID(namespaceID);
} }
/** /*
* Destructor * Destructor
*/ */
Element::~Element() Element::~Element()
{ {
} }
/** /*
* Call nsIDOMElement::GetTagName to retrieve the tag name for this element. * Call nsIDOMElement::GetTagName to retrieve the tag name for this element.
* *
* @return the element's tag name * @return the element's tag name
@ -61,7 +68,7 @@ const String& Element::getTagName()
return nodeName; return nodeName;
} }
/** /*
* Get the attribute node for the specified name and return it's value or the * Get the attribute node for the specified name and return it's value or the
* null string if the attribute node doesn't exist. * null string if the attribute node doesn't exist.
* *
@ -78,7 +85,7 @@ const String& Element::getAttribute(const String& aName)
return NULL_STRING; return NULL_STRING;
} }
/** /*
* Call nsIDOMElement::SetAttribute to set an attribute to the specified value. * Call nsIDOMElement::SetAttribute to set an attribute to the specified value.
* *
* @param aName the name of the attribute you want to set * @param aName the name of the attribute you want to set
@ -92,7 +99,7 @@ void Element::setAttribute(const String& aName, const String& aValue)
nsElement->SetAttribute(aName.getConstNSString(), aValue.getConstNSString()); nsElement->SetAttribute(aName.getConstNSString(), aValue.getConstNSString());
} }
/** /*
* Call nsIDOMElement::SetAttributeNS to set an attribute to the specified * Call nsIDOMElement::SetAttributeNS to set an attribute to the specified
* value. * value.
* *
@ -111,7 +118,7 @@ void Element::setAttributeNS(const String& aNamespaceURI, const String& aName,
aValue.getConstNSString()); aValue.getConstNSString());
} }
/** /*
* Call nsIDOMElement::RemoveAttribute to remove an attribute. We need to make * Call nsIDOMElement::RemoveAttribute to remove an attribute. We need to make
* this call a bit more complicated than usual because we want to make sure * this call a bit more complicated than usual because we want to make sure
* we remove the attribute wrapper from the document's wrapper hash table. * we remove the attribute wrapper from the document's wrapper hash table.
@ -141,7 +148,7 @@ void Element::removeAttribute(const String& aName)
} }
} }
/** /*
* Call nsIDOMElement::GetAttributeNode to get an nsIDOMAttr. If successful, * Call nsIDOMElement::GetAttributeNode to get an nsIDOMAttr. If successful,
* refer to the owner document for an attribute wrapper. * refer to the owner document for an attribute wrapper.
* *
@ -160,7 +167,27 @@ Attr* Element::getAttributeNode(const String& aName)
return NULL; return NULL;
} }
/** /*
* Call nsIContent::GetAttr for the localname and nsID.
*/
MBool Element::getAttr(txAtom* aLocalName, PRInt32 aNSID,
String& aValue)
{
aValue.clear();
nsCOMPtr<nsIContent> cont(do_QueryInterface(nsObject));
NS_ASSERTION(cont, "Element doesn't implement nsIContent");
if (!cont)
return MB_FALSE;
nsresult rv;
rv = cont->GetAttr(aNSID, aLocalName, aValue.getNSString());
NS_ENSURE_SUCCESS(rv, MB_FALSE);
if (rv != NS_CONTENT_ATTR_NOT_THERE)
return MB_TRUE;
return MB_FALSE;
}
/*
* Call nsIDOMElement::SetAttributeNode passing it the nsIDOMAttr object wrapped * Call nsIDOMElement::SetAttributeNode passing it the nsIDOMAttr object wrapped
* by the aNewAttr parameter. * by the aNewAttr parameter.
* *
@ -180,7 +207,7 @@ Attr* Element::setAttributeNode(Attr* aNewAttr)
return NULL; return NULL;
} }
/** /*
* Call nsIDOMElement::RemoveAttributeNode, then refer to the owner document to * Call nsIDOMElement::RemoveAttributeNode, then refer to the owner document to
* remove it from its hash table. The caller is then responsible for destroying * remove it from its hash table. The caller is then responsible for destroying
* the wrapper. * the wrapper.
@ -197,8 +224,7 @@ Attr* Element::removeAttributeNode(Attr* aOldAttr)
Attr* attrWrapper = NULL; Attr* attrWrapper = NULL;
if (NS_SUCCEEDED(nsElement->RemoveAttributeNode(oldAttr, if (NS_SUCCEEDED(nsElement->RemoveAttributeNode(oldAttr,
getter_AddRefs(removedAttr)))) getter_AddRefs(removedAttr)))) {
{
attrWrapper = (Attr*)ownerDocument->removeWrapper(aOldAttr); attrWrapper = (Attr*)ownerDocument->removeWrapper(aOldAttr);
if (!attrWrapper) if (!attrWrapper)
attrWrapper = new Attr(removedAttr, ownerDocument); attrWrapper = new Attr(removedAttr, ownerDocument);
@ -207,7 +233,7 @@ Attr* Element::removeAttributeNode(Attr* aOldAttr)
return NULL; return NULL;
} }
/** /*
* Call nsIDOMElement::GetElementsByTagName. If successful, refer to the owner * Call nsIDOMElement::GetElementsByTagName. If successful, refer to the owner
* document for a Nodelist wrapper. * document for a Nodelist wrapper.
* *
@ -226,7 +252,7 @@ NodeList* Element::getElementsByTagName(const String& aName)
return NULL; return NULL;
} }
/** /*
* Simply call nsIDOMElement::Normalize(). * Simply call nsIDOMElement::Normalize().
*/ */
void Element::normalize() void Element::normalize()
@ -236,3 +262,19 @@ void Element::normalize()
if (nsElement) if (nsElement)
nsElement->Normalize(); nsElement->Normalize();
} }
/*
* Returns the local name atomized
*
* @return the node's localname atom
*/
MBool Element::getLocalName(txAtom** aLocalName)
{
NS_ENSURE_TRUE(aLocalName, MB_FALSE);
nsCOMPtr<nsIContent> cont(do_QueryInterface(nsObject));
NS_ASSERTION(cont, "Element doesn't implement nsIContent");
if (!cont)
return MB_FALSE;
cont->GetTag(*aLocalName);
return MB_TRUE;
}

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

@ -27,11 +27,14 @@
interface into a TransforMIIX Node interface. interface into a TransforMIIX Node interface.
*/ */
#include "txAtom.h"
#include "mozilladom.h" #include "mozilladom.h"
#include "nsIContent.h"
#include "nsINameSpaceManager.h"
MOZ_DECL_CTOR_COUNTER(Node) MOZ_DECL_CTOR_COUNTER(Node)
/** /*
* Construct a wrapper with the specified Mozilla object and document owner. * Construct a wrapper with the specified Mozilla object and document owner.
* *
* @param aNode the nsIDOMNode you want to wrap * @param aNode the nsIDOMNode you want to wrap
@ -41,9 +44,10 @@ Node::Node(nsIDOMNode* aNode, Document* aOwner) :
MozillaObjectWrapper(aNode, aOwner) MozillaObjectWrapper(aNode, aOwner)
{ {
MOZ_COUNT_CTOR(Node); MOZ_COUNT_CTOR(Node);
namespaceID=0;
} }
/** /*
* Destructor * Destructor
*/ */
Node::~Node() Node::~Node()
@ -51,7 +55,7 @@ Node::~Node()
MOZ_COUNT_DTOR(Node); MOZ_COUNT_DTOR(Node);
} }
/** /*
* Wrap a different Mozilla object with this wrapper. * Wrap a different Mozilla object with this wrapper.
* *
* @param aNode the nsIDOMNode you want to wrap * @param aNode the nsIDOMNode you want to wrap
@ -73,7 +77,7 @@ void Node::setNSObj(nsIDOMNode* aNode)
ownerDocument->addWrapper(this); ownerDocument->addWrapper(this);
} }
/** /*
* Call nsIDOMNode::GetNodeName to get the node's name. * Call nsIDOMNode::GetNodeName to get the node's name.
* *
* @return the node's name * @return the node's name
@ -88,7 +92,7 @@ const String& Node::getNodeName()
return nodeName; return nodeName;
} }
/** /*
* Call nsIDOMNode::GetNodeValue to get the node's value. * Call nsIDOMNode::GetNodeValue to get the node's value.
* *
* @return the node's name * @return the node's name
@ -103,7 +107,7 @@ const String& Node::getNodeValue()
return nodeValue; return nodeValue;
} }
/** /*
* Call nsIDOMNode::GetNodeType to get the node's type. * Call nsIDOMNode::GetNodeType to get the node's type.
* *
* @return the node's type * @return the node's type
@ -118,7 +122,7 @@ unsigned short Node::getNodeType() const
return nodeType; return nodeType;
} }
/** /*
* Call nsIDOMNode::GetParentNode to get the node's parent. * Call nsIDOMNode::GetParentNode to get the node's parent.
* *
* @return the node's parent * @return the node's parent
@ -134,7 +138,7 @@ Node* Node::getParentNode()
return NULL; return NULL;
} }
/** /*
* Call nsIDOMNode::GetChildNodes to get the node's childnodes. * Call nsIDOMNode::GetChildNodes to get the node's childnodes.
* *
* @return the node's children * @return the node's children
@ -150,7 +154,7 @@ NodeList* Node::getChildNodes()
return NULL; return NULL;
} }
/** /*
* Call nsIDOMNode::GetFirstChild to get the node's first child. * Call nsIDOMNode::GetFirstChild to get the node's first child.
* *
* @return the node's first child * @return the node's first child
@ -166,7 +170,7 @@ Node* Node::getFirstChild()
return NULL; return NULL;
} }
/** /*
* Call nsIDOMNode::GetLastChild to get the node's last child. * Call nsIDOMNode::GetLastChild to get the node's last child.
* *
* @return the node's first child * @return the node's first child
@ -182,7 +186,7 @@ Node* Node::getLastChild()
return NULL; return NULL;
} }
/** /*
* Call nsIDOMNode::GetPreviousSibling to get the node's previous sibling. * Call nsIDOMNode::GetPreviousSibling to get the node's previous sibling.
* *
* @return the node's previous sibling * @return the node's previous sibling
@ -198,7 +202,7 @@ Node* Node::getPreviousSibling()
return NULL; return NULL;
} }
/** /*
* Call nsIDOMNode::GetNextSibling to get the node's next sibling. * Call nsIDOMNode::GetNextSibling to get the node's next sibling.
* *
* @return the node's next sibling * @return the node's next sibling
@ -214,7 +218,7 @@ Node* Node::getNextSibling()
return NULL; return NULL;
} }
/** /*
* Call nsIDOMNode::GetAttributes to get the node's attributes. * Call nsIDOMNode::GetAttributes to get the node's attributes.
* *
* @return the node's attributes * @return the node's attributes
@ -230,7 +234,7 @@ NamedNodeMap* Node::getAttributes()
return NULL; return NULL;
} }
/** /*
* Get this wrapper's owning document. * Get this wrapper's owning document.
* *
* @return the wrapper's owning document * @return the wrapper's owning document
@ -240,7 +244,7 @@ Document* Node::getOwnerDocument()
return ownerDocument; return ownerDocument;
} }
/** /*
* Call nsIDOMNode::SetNodeValue to set this node's value. * Call nsIDOMNode::SetNodeValue to set this node's value.
* *
* @param aNewNodeValue the new value for the node * @param aNewNodeValue the new value for the node
@ -253,7 +257,7 @@ void Node::setNodeValue(const String& aNewNodeValue)
nsNode->SetNodeValue(aNewNodeValue.getConstNSString()); nsNode->SetNodeValue(aNewNodeValue.getConstNSString());
} }
/** /*
* Call nsIDOMNode::insertBefore to insert a new child before an existing child. * Call nsIDOMNode::insertBefore to insert a new child before an existing child.
* *
* @param aNewChild the new child to insert * @param aNewChild the new child to insert
@ -275,7 +279,7 @@ Node* Node::insertBefore(Node* aNewChild, Node* aRefChild)
return NULL; return NULL;
} }
/** /*
* Call nsIDOMNode::ReplaceChild to replace an existing child with a new child. * Call nsIDOMNode::ReplaceChild to replace an existing child with a new child.
* *
* @param aNewChild the new child to insert * @param aNewChild the new child to insert
@ -297,7 +301,7 @@ Node* Node::replaceChild(Node* aNewChild, Node* aOldChild)
return NULL; return NULL;
} }
/** /*
* Call nsIDOMNode::RemoveChild to remove a child. * Call nsIDOMNode::RemoveChild to remove a child.
* *
* @param aOldChild the child to remove * @param aOldChild the child to remove
@ -317,7 +321,7 @@ Node* Node::removeChild(Node* aOldChild)
return NULL; return NULL;
} }
/** /*
* Call nsIDOMNode::AppendChild to append a child to the current node. * Call nsIDOMNode::AppendChild to append a child to the current node.
* *
* @param aNewChild the child to append * @param aNewChild the child to append
@ -337,7 +341,7 @@ Node* Node::appendChild(Node* aNewChild)
return NULL; return NULL;
} }
/** /*
* Call nsIDOMNode::CloneNode to clone this node. * Call nsIDOMNode::CloneNode to clone this node.
* *
* @param aDeep recursive cloning? * @param aDeep recursive cloning?
@ -359,7 +363,7 @@ Node* Node::cloneNode(MBool aDeep, Node* aDest)
return NULL; return NULL;
} }
/** /*
* Call nsIDOMNode::HasChildNodes to return if this node has children. * Call nsIDOMNode::HasChildNodes to return if this node has children.
* *
* @return boolean value that says if this node has children * @return boolean value that says if this node has children
@ -374,12 +378,121 @@ MBool Node::hasChildNodes() const
return returnValue; return returnValue;
} }
/** /*
* Returns the Namespace URI
* uses the Mozilla dom
* Intoduced in DOM2
*/
String Node::getNamespaceURI()
{
NSI_FROM_TX(Node)
String uri;
if (nsNode)
nsNode->GetNamespaceURI(uri.getNSString());
return uri;
}
/*
* Returns the local name atomized
*
* @return the node's localname atom
*/
MBool Node::getLocalName(txAtom** aLocalName)
{
if (!aLocalName)
return MB_FALSE;
*aLocalName = 0;
return MB_TRUE;
}
/*
* Returns the namespace ID of the node
*
* @return the node's namespace ID
*/
PRInt32 Node::getNamespaceID()
{
return namespaceID;
}
/*
* Returns the parent node according to the XPath datamodel
*/
Node* Node::getXPathParent()
{
return getParentNode();
}
/*
* Returns the namespace ID associated with the given prefix in the context
* of this node.
*
* Creating our own implementation until content provides us with a way
* to do it, that is a way that jst doesn't want to kill.
*
* @param prefix atom for prefix to look up
* @return namespace ID for prefix
*/
PRInt32 Node::lookupNamespaceID(txAtom* prefix)
{
NSI_FROM_TX(Node)
nsresult rv;
if (!nsNode)
return kNameSpaceID_Unknown;
if (prefix == txXMLAtoms::XMLNSPrefix)
return kNameSpaceID_XMLNS;
if (prefix == txXMLAtoms::XMLPrefix)
return kNameSpaceID_XML;
nsCOMPtr<nsIContent> elem;
unsigned short nodeType = 0;
nsNode->GetNodeType(&nodeType);
switch(nodeType) {
case Node::ATTRIBUTE_NODE :
{
nsCOMPtr<nsIDOMElement> owner;
nsCOMPtr<nsIDOMAttr> attr(do_QueryInterface(nsNode));
rv = attr->GetOwnerElement(getter_AddRefs(owner));
NS_ENSURE_SUCCESS(rv, kNameSpaceID_Unknown);
elem = do_QueryInterface(owner);
break;
}
default:
//XXX Namespace: we have to handle namespace nodes here
elem = do_QueryInterface(nsNode);
}
while (elem) {
nsAutoString uri;
rv = elem->GetAttr(kNameSpaceID_XMLNS, prefix, uri);
NS_ENSURE_SUCCESS(rv, kNameSpaceID_Unknown);
if (rv != NS_CONTENT_ATTR_NOT_THERE) {
PRInt32 nsId;
NS_ASSERTION(ownerDocument->nsNSManager,
"owner document lacks namespace manager");
if (!ownerDocument->nsNSManager)
return kNameSpaceID_Unknown;
ownerDocument->nsNSManager->RegisterNameSpace(uri, nsId);
return nsId;
}
nsCOMPtr<nsIContent> temp(elem);
rv = temp->GetParent(*getter_AddRefs(elem));
NS_ENSURE_SUCCESS(rv, kNameSpaceID_Unknown);
}
// Error, namespace not found
return kNameSpaceID_Unknown;
}
/*
* Returns the base URI of the node. Acccounts for xml:base * Returns the base URI of the node. Acccounts for xml:base
* attributes. * attributes.
* *
* @return base URI for the node * @return base URI for the node
**/ */
String Node::getBaseURI() String Node::getBaseURI()
{ {
NSI_FROM_TX(Node) NSI_FROM_TX(Node)
@ -391,11 +504,3 @@ String Node::getBaseURI()
return url; return url;
} }
/*
* Returns the parent node according to the XPath datamodel
*/
Node* Node::getXPathParent()
{
return getParentNode();
}

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

@ -1,4 +1,5 @@
/* /* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*-
*
* (C) Copyright The MITRE Corporation 1999 All rights reserved. * (C) Copyright The MITRE Corporation 1999 All rights reserved.
* *
* The contents of this file are subject to the Mozilla Public License * The contents of this file are subject to the Mozilla Public License
@ -22,14 +23,16 @@
* *
*/ */
/* Implementation of the wrapper class to convert the Mozilla /*
nsIDOMProcessingInstruction interface into a TransforMIIX * Implementation of the wrapper class to convert the Mozilla
ProcessingInstruction interface. * nsIDOMProcessingInstruction interface into a TransforMiiX
*/ * ProcessingInstruction interface.
*/
#include "mozilladom.h" #include "mozilladom.h"
#include "nsIAtom.h"
/** /*
* Construct a wrapper with the specified Mozilla object and document owner. * Construct a wrapper with the specified Mozilla object and document owner.
* *
* @param aProcInstr the nsIDOMProcessingInstruction you want to wrap * @param aProcInstr the nsIDOMProcessingInstruction you want to wrap
@ -42,14 +45,14 @@ ProcessingInstruction::ProcessingInstruction(
{ {
} }
/** /*
* Destructor * Destructor
*/ */
ProcessingInstruction::~ProcessingInstruction() ProcessingInstruction::~ProcessingInstruction()
{ {
} }
/** /*
* Call nsIDOMProcessingInstruction::GetTarget to retrieve the target of the * Call nsIDOMProcessingInstruction::GetTarget to retrieve the target of the
* processing instruction. * processing instruction.
* *
@ -65,7 +68,7 @@ const String& ProcessingInstruction::getTarget()
return target; return target;
} }
/** /*
* Call nsIDOMProcessingInstruction::GetData to retrieve the data of the * Call nsIDOMProcessingInstruction::GetData to retrieve the data of the
* processing instruction. * processing instruction.
* *
@ -81,7 +84,7 @@ const String& ProcessingInstruction::getData()
return data; return data;
} }
/** /*
* Call nsIDOMProcessingInstruction::SetData to set the data of the * Call nsIDOMProcessingInstruction::SetData to set the data of the
* processing instruction. * processing instruction.
* *
@ -94,3 +97,22 @@ void ProcessingInstruction::setData(const String& aData)
if (nsProcessingInstruction) if (nsProcessingInstruction)
nsProcessingInstruction->SetData(aData.getConstNSString()); nsProcessingInstruction->SetData(aData.getConstNSString());
} }
/*
* Returns the local name atomized
*
* @return the node's localname atom
*/
MBool ProcessingInstruction::getLocalName(txAtom** aLocalName)
{
if (!aLocalName)
return MB_FALSE;
NSI_FROM_TX(ProcessingInstruction)
if (!nsProcessingInstruction)
return MB_FALSE;
nsAutoString target;
nsProcessingInstruction->GetNodeName(target);
*aLocalName = NS_NewAtom(target);
NS_ENSURE_TRUE(*aLocalName, MB_FALSE);
return MB_TRUE;
}

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

@ -23,11 +23,11 @@
/* Definition of the wrapper classes. /* Definition of the wrapper classes.
*/ */
/** /*
* Implementation of the Mozilla Wrapper classes for the Mozilla DOM to * Implementation of the Mozilla Wrapper classes for the Mozilla DOM to
* TransforMIIX DOM interface conversion. Note that these wrapper classes are * TransforMiiX DOM interface conversion. Note that these wrapper classes are
* only interchangable with the TransforMIIX DOM at compile time. They are * only interchangable with the TransforMiiX DOM at compile time. They are
* merely a copy of the TransforMIIX interface/class structure wich then * merely a copy of the TransforMiiX interface/class structure wich then
* deffer their processing to a Mozilla object. Complete interchangability * deffer their processing to a Mozilla object. Complete interchangability
* would require the use of multiple inherritance using virtual base classes * would require the use of multiple inherritance using virtual base classes
* and RTTI which is not supported in Mozilla's cross platform domain. * and RTTI which is not supported in Mozilla's cross platform domain.
@ -71,6 +71,9 @@
#include "nsIDOMNotation.h" #include "nsIDOMNotation.h"
#include "nsIDOMProcessingInstruction.h" #include "nsIDOMProcessingInstruction.h"
#include "nsIDOMText.h" #include "nsIDOMText.h"
#include "nsINameSpaceManager.h"
#include "txAtom.h"
#ifndef NULL #ifndef NULL
typedef 0 NULL; typedef 0 NULL;
@ -92,8 +95,22 @@ class Notation;
class ProcessingInstruction; class ProcessingInstruction;
class Text; class Text;
/*
* Definition of txXMLAtoms
*/
class txXMLAtoms
{
public:
static txAtom* XMLPrefix;
static txAtom* XMLNSPrefix;
};
/** #define TX_IMPL_DOM_STATICS \
txAtom* txXMLAtoms::XMLPrefix = 0; \
txAtom* txXMLAtoms::XMLNSPrefix = 0
/*
* This macro creates a nsCOMPtr to a specific interface for the * This macro creates a nsCOMPtr to a specific interface for the
* wrapper's Mozilla object. The nsCOMPtr will be named like the * wrapper's Mozilla object. The nsCOMPtr will be named like the
* supplied class with "ns" as a prefix. * supplied class with "ns" as a prefix.
@ -101,7 +118,7 @@ class Text;
#define NSI_FROM_TX(_txClass) \ #define NSI_FROM_TX(_txClass) \
nsCOMPtr<nsIDOM##_txClass> ns##_txClass(do_QueryInterface(nsObject)); nsCOMPtr<nsIDOM##_txClass> ns##_txClass(do_QueryInterface(nsObject));
/** /*
* This macro creates a nsCOMPtr to a specific interface for the * This macro creates a nsCOMPtr to a specific interface for the
* wrapper's Mozilla object. It returns NULL if the interface is * wrapper's Mozilla object. It returns NULL if the interface is
* unavailable (or the wrapper's Mozilla object is nsnull). The * unavailable (or the wrapper's Mozilla object is nsnull). The
@ -113,7 +130,7 @@ NSI_FROM_TX(_txClass) \
if (!ns##_txClass) return NULL; if (!ns##_txClass) return NULL;
/** /*
* This macro can be used to declare a createWrapper implementation * This macro can be used to declare a createWrapper implementation
* for the supplied wrapper class. This macro should only be used * for the supplied wrapper class. This macro should only be used
* in MozillaDocument. * in MozillaDocument.
@ -121,7 +138,7 @@ if (!ns##_txClass) return NULL;
#define IMPL_CREATE_WRAPPER(_txClass) \ #define IMPL_CREATE_WRAPPER(_txClass) \
IMPL_CREATE_WRAPPER2(_txClass, create##_txClass) IMPL_CREATE_WRAPPER2(_txClass, create##_txClass)
/** /*
* This macro can be used to declare a createWrapper implementation * This macro can be used to declare a createWrapper implementation
* for the supplied wrapper class. The function parameter defines * for the supplied wrapper class. The function parameter defines
* the function name for the implementation function. This macro * the function name for the implementation function. This macro
@ -144,13 +161,13 @@ _txClass* Document::_function(nsIDOM##_txClass* aNsObject) \
return wrapper; \ return wrapper; \
} }
/** /*
* This macro does a nullsafe getNSObj. If the wrapper object is NULL, * This macro does a nullsafe getNSObj. If the wrapper object is NULL,
* NULL is returned. Else getNSObj is used to get the inner object. * NULL is returned. Else getNSObj is used to get the inner object.
*/ */
#define GET_NSOBJ(_txWrapper) ((_txWrapper) ? (_txWrapper)->getNSObj() : nsnull) #define GET_NSOBJ(_txWrapper) ((_txWrapper) ? (_txWrapper)->getNSObj() : nsnull)
/** /*
* Base wrapper class for a Mozilla object. Owns the Mozilla object through an * Base wrapper class for a Mozilla object. Owns the Mozilla object through an
* nsCOMPtr<nsISupports>. * nsCOMPtr<nsISupports>.
*/ */
@ -172,7 +189,7 @@ class MozillaObjectWrapper : public TxObject
nsCOMPtr<nsISupports> nsObject; nsCOMPtr<nsISupports> nsObject;
}; };
/** /*
* Wrapper class for nsIDOMDOMImplementation. * Wrapper class for nsIDOMDOMImplementation.
*/ */
class DOMImplementation : public MozillaObjectWrapper class DOMImplementation : public MozillaObjectWrapper
@ -184,7 +201,7 @@ class DOMImplementation : public MozillaObjectWrapper
MBool hasFeature(const String& aFeature, const String& aVersion) const; MBool hasFeature(const String& aFeature, const String& aVersion) const;
}; };
/** /*
* Wrapper class for nsIDOMNode. It provides the generic Node interface, * Wrapper class for nsIDOMNode. It provides the generic Node interface,
* forwarding all functionality to its Mozilla counterpart. * forwarding all functionality to its Mozilla counterpart.
*/ */
@ -238,18 +255,25 @@ class Node : public MozillaObjectWrapper
virtual MBool hasChildNodes() const; virtual MBool hasChildNodes() const;
//Introduced in DOM2
virtual String getNamespaceURI();
//From DOM3 26-Jan-2001 WD //From DOM3 26-Jan-2001 WD
virtual String getBaseURI(); virtual String getBaseURI();
// txXPathNode functions // txXPathNode functions
virtual MBool getLocalName(txAtom** aLocalName);
virtual PRInt32 getNamespaceID();
virtual PRInt32 lookupNamespaceID(txAtom* prefix);
virtual Node* getXPathParent(); virtual Node* getXPathParent();
protected: protected:
String nodeName; String nodeName;
String nodeValue; String nodeValue;
PRInt32 namespaceID;
}; };
/** /*
* Wrapper class for nsIDOMNodeList. * Wrapper class for nsIDOMNodeList.
*/ */
class NodeList : public MozillaObjectWrapper class NodeList : public MozillaObjectWrapper
@ -263,7 +287,7 @@ class NodeList : public MozillaObjectWrapper
}; };
/** /*
* Wrapper class for nsIDOMNamedNodeMap. * Wrapper class for nsIDOMNamedNodeMap.
*/ */
class NamedNodeMap : public MozillaObjectWrapper class NamedNodeMap : public MozillaObjectWrapper
@ -279,7 +303,7 @@ class NamedNodeMap : public MozillaObjectWrapper
PRUint32 getLength(); PRUint32 getLength();
}; };
/** /*
* Wrapper class for nsIDOMDocumentFragment. * Wrapper class for nsIDOMDocumentFragment.
*/ */
class DocumentFragment : public Node class DocumentFragment : public Node
@ -290,11 +314,14 @@ class DocumentFragment : public Node
~DocumentFragment(); ~DocumentFragment();
}; };
/** /*
* Wrapper class for nsIDOMDocument. * Wrapper class for nsIDOMDocument.
*/ */
class Document : public Node class Document : public Node
{ {
friend class Attr; // Attrs and Nodes need to get to the cached nsNSManager
friend class Node;
public: public:
Document(); Document();
Document(nsIDOMDocument* aDocument); Document(nsIDOMDocument* aDocument);
@ -374,9 +401,11 @@ class Document : public Node
PRBool bInHashTableDeletion; PRBool bInHashTableDeletion;
nsObjectHashtable *wrapperHashTable; nsObjectHashtable *wrapperHashTable;
nsCOMPtr<nsINameSpaceManager> nsNSManager;
}; };
/** /*
* Wrapper class for nsIDOMElement. * Wrapper class for nsIDOMElement.
*/ */
class Element : public Node class Element : public Node
@ -397,9 +426,12 @@ class Element : public Node
NodeList* getElementsByTagName(const String& aName); NodeList* getElementsByTagName(const String& aName);
void normalize(); void normalize();
// txXPathNode functions
MBool getLocalName(txAtom** aLocalName);
MBool getAttr(txAtom* aLocalName, PRInt32 aNSID, String& aValue);
}; };
/** /*
* Wrapper class for nsIDOMAttr. * Wrapper class for nsIDOMAttr.
*/ */
class Attr : public Node class Attr : public Node
@ -414,10 +446,11 @@ class Attr : public Node
void setValue(const String& aNewValue); void setValue(const String& aNewValue);
// txXPathNode functions override // txXPathNode functions override
MBool getLocalName(txAtom** aLocalName);
Node* getXPathParent(); Node* getXPathParent();
}; };
/** /*
* Wrapper class for nsIDOMCharacterData. * Wrapper class for nsIDOMCharacterData.
*/ */
class CharacterData : public Node class CharacterData : public Node
@ -440,7 +473,7 @@ class CharacterData : public Node
String nodeValue; String nodeValue;
}; };
/** /*
* Wrapper class for nsIDOMText. * Wrapper class for nsIDOMText.
*/ */
class Text : public CharacterData class Text : public CharacterData
@ -452,7 +485,7 @@ class Text : public CharacterData
Text* splitText(PRInt32 aOffset); Text* splitText(PRInt32 aOffset);
}; };
/** /*
* Wrapper class for nsIDOMComment. * Wrapper class for nsIDOMComment.
*/ */
class Comment : public CharacterData class Comment : public CharacterData
@ -462,7 +495,7 @@ class Comment : public CharacterData
~Comment(); ~Comment();
}; };
/** /*
* Wrapper class for nsIDOMCDATASection. * Wrapper class for nsIDOMCDATASection.
*/ */
class CDATASection : public Text class CDATASection : public Text
@ -472,7 +505,7 @@ class CDATASection : public Text
~CDATASection(); ~CDATASection();
}; };
/** /*
* Wrapper class for nsIDOMProcessingInstruction. * Wrapper class for nsIDOMProcessingInstruction.
*/ */
class ProcessingInstruction : public Node class ProcessingInstruction : public Node
@ -487,12 +520,15 @@ class ProcessingInstruction : public Node
void setData(const String& aData); void setData(const String& aData);
// txXPathNode functions
MBool getLocalName(txAtom** aLocalName);
private: private:
String target; String target;
String data; String data;
}; };
/** /*
* Wrapper class for nsIDOMNotation. * Wrapper class for nsIDOMNotation.
*/ */
class Notation : public Node class Notation : public Node
@ -509,7 +545,7 @@ class Notation : public Node
String systemId; String systemId;
}; };
/** /*
* Wrapper class for nsIDOMEntity. * Wrapper class for nsIDOMEntity.
*/ */
class Entity : public Node class Entity : public Node
@ -528,7 +564,7 @@ class Entity : public Node
String notationName; String notationName;
}; };
/** /*
* Wrapper class for nsIDOMEntityReference. * Wrapper class for nsIDOMEntityReference.
*/ */
class EntityReference : public Node class EntityReference : public Node
@ -539,7 +575,7 @@ class EntityReference : public Node
~EntityReference(); ~EntityReference();
}; };
/** /*
* Wrapper class for nsIDOMDocumentType. * Wrapper class for nsIDOMDocumentType.
*/ */
class DocumentType : public Node class DocumentType : public Node

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

@ -26,6 +26,7 @@
// //
#include "dom.h" #include "dom.h"
#include "txAtom.h"
// //
//Construct an Attribute object using the specified name and document owner //Construct an Attribute object using the specified name and document owner
@ -34,6 +35,41 @@ Attr::Attr(const String& name, Document* owner):
NodeDefinition(Node::ATTRIBUTE_NODE, name, NULL_STRING, owner) NodeDefinition(Node::ATTRIBUTE_NODE, name, NULL_STRING, owner)
{ {
specified = MB_FALSE; specified = MB_FALSE;
int idx = nodeName.indexOf(':');
if (idx == NOT_FOUND) {
mLocalName = TX_GET_ATOM(nodeName);
if (mLocalName == txXMLAtoms::XMLNSPrefix)
mNamespaceID = kNameSpaceID_XMLNS;
else
mNamespaceID = kNameSpaceID_None;
}
else {
String tmp;
nodeName.subString(idx+1, tmp);
mLocalName = TX_GET_ATOM(tmp);
// namespace handling has to be handled late, the attribute must
// be added to the tree to resolve the prefix, unless it's
// xmlns or xml, try to do that here
String prefix;
nodeName.subString(0, idx, prefix);
txAtom* prefixAtom = TX_GET_ATOM(prefix);
if (prefixAtom == txXMLAtoms::XMLNSPrefix)
mNamespaceID = kNameSpaceID_XMLNS;
else if (prefixAtom == txXMLAtoms::XMLPrefix)
mNamespaceID = kNameSpaceID_XML;
else
mNamespaceID = kNameSpaceID_Unknown;
TX_RELEASE_IF_ATOM(prefixAtom);
}
}
//
//Release the mLocalName
//
Attr::~Attr()
{
TX_RELEASE_IF_ATOM(mLocalName);
} }
// //
@ -135,6 +171,37 @@ Node* Attr::insertBefore(Node* newChild, Node* refChild)
return returnVal; return returnVal;
} }
//
//Return the attributes local (unprefixed) name atom.
//
MBool Attr::getLocalName(txAtom** aLocalName)
{
if (!aLocalName)
return MB_FALSE;
*aLocalName = mLocalName;
TX_ADDREF_ATOM(*aLocalName);
return MB_TRUE;
}
//
//Return the namespace the attribute belongs to. If the attribute doesn't
//have a prefix it doesn't belong to any namespace per the namespace spec,
//and is handled in the constructor.
//
PRInt32 Attr::getNamespaceID()
{
if (mNamespaceID >= 0)
return mNamespaceID;
int idx = nodeName.indexOf(':');
String prefix;
nodeName.subString(0, idx, prefix);
txAtom* prefixAtom = TX_GET_ATOM(prefix);
mNamespaceID = lookupNamespaceID(prefixAtom);
TX_RELEASE_IF_ATOM(prefixAtom);
return mNamespaceID;
}
// //
//Return the attributes owning element //Return the attributes owning element
// //

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

@ -26,6 +26,9 @@
// //
#include "dom.h" #include "dom.h"
#include "txAtom.h"
const String XMLNS_ATTR = "xmlns";
// //
//Construct a new element with the specified tagName and Document owner. //Construct a new element with the specified tagName and Document owner.
@ -35,7 +38,77 @@
Element::Element(const String& tagName, Document* owner) : Element::Element(const String& tagName, Document* owner) :
NodeDefinition(Node::ELEMENT_NODE, tagName, NULL_STRING, owner) NodeDefinition(Node::ELEMENT_NODE, tagName, NULL_STRING, owner)
{ {
attributes.ownerElement = this; mAttributes.ownerElement = this;
mNamespaceID = kNameSpaceID_Unknown;
int idx = nodeName.indexOf(':');
if (idx == NOT_FOUND) {
mLocalName = TX_GET_ATOM(nodeName);
}
else {
String tmp;
nodeName.subString(idx+1, tmp);
mLocalName = TX_GET_ATOM(tmp);
}
}
//
// This element is being destroyed, so destroy all attributes stored
// in the mAttributes NamedNodeMap.
//
Element::~Element()
{
mAttributes.clear();
TX_RELEASE_IF_ATOM(mLocalName);
}
//
//Return the elements local (unprefixed) name.
//
MBool Element::getLocalName(txAtom** aLocalName)
{
if (!aLocalName)
return MB_FALSE;
*aLocalName = mLocalName;
TX_ADDREF_ATOM(*aLocalName);
return MB_TRUE;
}
//
//Return the namespace the elements belongs to.
//
PRInt32 Element::getNamespaceID()
{
if (mNamespaceID>=0)
return mNamespaceID;
int idx = nodeName.indexOf(':');
if (idx == NOT_FOUND) {
Node* node = this;
while (node && node->getNodeType() == Node::ELEMENT_NODE) {
String nsURI;
if (((Element*)node)->getAttr(txXMLAtoms::XMLNSPrefix,
kNameSpaceID_XMLNS, nsURI)) {
// xmlns = "" sets the default namespace ID to kNameSpaceID_None;
if (!nsURI.isEmpty()) {
mNamespaceID = txNamespaceManager::getNamespaceID(nsURI);
}
else {
mNamespaceID = kNameSpaceID_None;
}
return mNamespaceID;
}
node = node->getParentNode();
}
mNamespaceID = kNameSpaceID_None;
}
else {
String prefix;
nodeName.subString(0, idx, prefix);
txAtom* prefixAtom = TX_GET_ATOM(prefix);
mNamespaceID = lookupNamespaceID(prefixAtom);
TX_RELEASE_IF_ATOM(prefixAtom);
}
return mNamespaceID;
} }
// //
@ -73,16 +146,21 @@ const String& Element::getTagName()
return nodeName; return nodeName;
} }
NamedNodeMap* Element::getAttributes()
{
return &mAttributes;
}
// //
//Retreive an attribute's value by name. If the attribute does not exist, //Retreive an attribute's value by name. If the attribute does not exist,
//return a reference to the pre-created, constatnt "NULL STRING". //return a reference to the pre-created, constatnt "NULL STRING".
// //
const String& Element::getAttribute(const String& name) const String& Element::getAttribute(const String& name)
{ {
Node* tempNode = attributes.getNamedItem(name); Node* tempNode = mAttributes.getNamedItem(name);
if (tempNode) if (tempNode)
return attributes.getNamedItem(name)->getNodeValue(); return mAttributes.getNamedItem(name)->getNodeValue();
else else
return NULL_STRING; return NULL_STRING;
} }
@ -91,7 +169,7 @@ const String& Element::getAttribute(const String& name)
// //
//Add an attribute to this Element. Create a new Attr object using the //Add an attribute to this Element. Create a new Attr object using the
//name and value specified. Then add the Attr to the the Element's //name and value specified. Then add the Attr to the the Element's
//attributes NamedNodeMap. //mAttributes NamedNodeMap.
// //
void Element::setAttribute(const String& name, const String& value) void Element::setAttribute(const String& name, const String& value)
{ {
@ -106,17 +184,17 @@ void Element::setAttribute(const String& name, const String& value)
{ {
tempAttribute = getOwnerDocument()->createAttribute(name); tempAttribute = getOwnerDocument()->createAttribute(name);
tempAttribute->setNodeValue(value); tempAttribute->setNodeValue(value);
attributes.setNamedItem(tempAttribute); mAttributes.setNamedItem(tempAttribute);
} }
} }
// //
//Remove an attribute from the attributes NamedNodeMap, and free its memory. //Remove an attribute from the mAttributes NamedNodeMap, and free its memory.
// NOTE: How do default values enter into this picture // NOTE: How do default values enter into this picture
// //
void Element::removeAttribute(const String& name) void Element::removeAttribute(const String& name)
{ {
delete attributes.removeNamedItem(name); delete mAttributes.removeNamedItem(name);
} }
// //
@ -124,7 +202,33 @@ void Element::removeAttribute(const String& name)
// //
Attr* Element::getAttributeNode(const String& name) Attr* Element::getAttributeNode(const String& name)
{ {
return (Attr*)attributes.getNamedItem(name); return (Attr*)mAttributes.getNamedItem(name);
}
//
// Return true if the attribute specified by localname and nsID
// exists, and sets aValue to the value of the attribute.
// Return false, if the attribute does not exist.
//
MBool Element::getAttr(txAtom* aLocalName, PRInt32 aNSID,
String& aValue)
{
aValue.clear();
AttrMap::ListItem* item = mAttributes.firstItem;
while (item) {
Attr* attrNode = (Attr*)item->node;
txAtom* localName;
if (attrNode->getLocalName(&localName) &&
aNSID == attrNode->getNamespaceID() &&
aLocalName == localName) {
aValue.append(attrNode->getValue());
TX_RELEASE_IF_ATOM(localName);
return MB_TRUE;
}
TX_RELEASE_IF_ATOM(localName);
item = item->next;
}
return MB_FALSE;
} }
// //
@ -134,9 +238,9 @@ Attr* Element::getAttributeNode(const String& name)
// //
Attr* Element::setAttributeNode(Attr* newAttr) Attr* Element::setAttributeNode(Attr* newAttr)
{ {
Attr* pOldAttr = (Attr*)attributes.removeNamedItem(newAttr->getNodeName()); Attr* pOldAttr = (Attr*)mAttributes.removeNamedItem(newAttr->getNodeName());
attributes.setNamedItem(newAttr); mAttributes.setNamedItem(newAttr);
return pOldAttr; return pOldAttr;
} }
@ -146,7 +250,7 @@ Attr* Element::setAttributeNode(Attr* newAttr)
// //
Attr* Element::removeAttributeNode(Attr* oldAttr) Attr* Element::removeAttributeNode(Attr* oldAttr)
{ {
return (Attr*)attributes.removeNamedItem(oldAttr->getNodeName()); return (Attr*)mAttributes.removeNamedItem(oldAttr->getNodeName());
} }
NodeList* Element::getElementsByTagName(const String& name) NodeList* Element::getElementsByTagName(const String& name)

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

@ -131,3 +131,19 @@ Node* AttrMap::removeNamedItem(const String& name)
node->ownerElement = NULL; node->ownerElement = NULL;
return node; return node;
} }
void AttrMap::clear()
{
ListItem* pDeleteItem;
ListItem* pListTraversal = firstItem;
while (pListTraversal) {
pDeleteItem = pListTraversal;
pListTraversal = pListTraversal->next;
delete pDeleteItem->node;
delete pDeleteItem;
}
firstItem = 0;
lastItem = 0;
length = 0;
}

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

@ -32,8 +32,10 @@
#include "dom.h" #include "dom.h"
#include "ArrayList.h" #include "ArrayList.h"
#include "URIUtils.h" #include "URIUtils.h"
#include "txAtom.h"
const String XMLBASE_ATTR = "xml:base"; const String XMLBASE_ATTR = "xml:base";
const String XMLNS_ATTR = "xmlns";
NodeDefinition::NodeDefinition(NodeType type, const String& name, NodeDefinition::NodeDefinition(NodeType type, const String& name,
const String& value, Document* owner) const String& value, Document* owner)
@ -56,17 +58,10 @@ NodeDefinition::NodeDefinition(NodeType type, const String& name,
// //
// This node is being destroyed, so loop through and destroy all the children. // This node is being destroyed, so loop through and destroy all the children.
// Also, destroy all attributes stored in the attributes NamedNodeMap.
// //
NodeDefinition::~NodeDefinition() NodeDefinition::~NodeDefinition()
{ {
PRInt32 numAttributes = attributes.getLength();
PRInt32 killAttrLoop;
DeleteChildren(); DeleteChildren();
for (killAttrLoop=0;killAttrLoop<numAttributes;killAttrLoop++)
delete attributes.removeNamedItem(attributes.item(0)->getNodeName());
} }
// //
@ -141,7 +136,7 @@ Node* NodeDefinition::getNextSibling() const
NamedNodeMap* NodeDefinition::getAttributes() NamedNodeMap* NodeDefinition::getAttributes()
{ {
return &attributes; return 0;
} }
Document* NodeDefinition::getOwnerDocument() const Document* NodeDefinition::getOwnerDocument() const
@ -360,17 +355,76 @@ MBool NodeDefinition::hasChildNodes() const
return MB_FALSE; return MB_FALSE;
} }
MBool NodeDefinition::getLocalName(txAtom** aLocalName)
{
if (!aLocalName)
return MB_FALSE;
*aLocalName = 0;
return MB_TRUE;
}
const String& NodeDefinition::getNamespaceURI()
{
return txNamespaceManager::getNamespaceURI(getNamespaceID());
}
PRInt32 NodeDefinition::getNamespaceID()
{
return kNameSpaceID_None;
}
//
// Looks up the Namespace associated with a certain prefix in the context of
// this node.
//
// @return namespace associated with prefix
//
PRInt32 NodeDefinition::lookupNamespaceID(txAtom* prefix)
{
// this is http://www.w3.org/2000/xmlns/,
// ID = kNameSpaceID_XMLNS, see txNamespaceManager::Init
if (prefix == txXMLAtoms::XMLNSPrefix)
return kNameSpaceID_XMLNS;
// this is http://www.w3.org/XML/1998/namespace,
// ID = kNameSpaceID_XML, see txNamespaceManager::Init
if (prefix == txXMLAtoms::XMLPrefix)
return kNameSpaceID_XML;
Node* node = this;
if (node->getNodeType() != Node::ELEMENT_NODE)
node = node->getXPathParent();
String name("xmlns:");
String prefixString;
TX_GET_ATOM_STRING(prefix,prefixString);
name.append(prefixString);
Attr* xmlns;
while (node && node->getNodeType() == Node::ELEMENT_NODE) {
String nsURI;
if ((xmlns = ((Element*)node)->getAttributeNode(name))) {
/*
* xmlns:foo = "" makes "" a valid URI, so get that.
* xmlns = "" resolves to 0 (null Namespace) (caught above)
* in Element::getNamespaceID()
*/
return txNamespaceManager::getNamespaceID(xmlns->getValue());
}
node = node->getXPathParent();
}
return kNameSpaceID_Unknown;
}
Node* NodeDefinition::getXPathParent() Node* NodeDefinition::getXPathParent()
{ {
return parentNode; return parentNode;
} }
/* //
* Returns the base URI of the node. Acccounts for xml:base // Returns the base URI of the node. Acccounts for xml:base
* attributes. // attributes.
* //
* @return base URI for the node // @return base URI for the node
*/ //
String NodeDefinition::getBaseURI() String NodeDefinition::getBaseURI()
{ {
Node* node = this; Node* node = this;

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

@ -1,4 +1,5 @@
/* /* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*-
*
* (C) Copyright The MITRE Corporation 1999 All rights reserved. * (C) Copyright The MITRE Corporation 1999 All rights reserved.
* *
* The contents of this file are subject to the Mozilla Public License * The contents of this file are subject to the Mozilla Public License
@ -29,6 +30,7 @@
// //
#include "dom.h" #include "dom.h"
#include "txAtom.h"
// //
//Construct a text object with the specified document owner and data //Construct a text object with the specified document owner and data
@ -39,6 +41,15 @@ ProcessingInstruction::ProcessingInstruction(const String& theTarget,
NodeDefinition(Node::PROCESSING_INSTRUCTION_NODE, NodeDefinition(Node::PROCESSING_INSTRUCTION_NODE,
theTarget, theData, owner) theTarget, theData, owner)
{ {
mLocalName = TX_GET_ATOM(nodeName);
}
//
//Release the mLocalName
//
ProcessingInstruction::~ProcessingInstruction()
{
TX_RELEASE_IF_ATOM(mLocalName);
} }
// //
@ -91,3 +102,12 @@ Node* ProcessingInstruction::appendChild(Node* newChild)
{ {
return NULL; return NULL;
} }
MBool ProcessingInstruction::getLocalName(txAtom** aLocalName)
{
if (!aLocalName)
return MB_FALSE;
*aLocalName = mLocalName;
TX_ADDREF_ATOM(*aLocalName);
return MB_TRUE;
}

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

@ -1,4 +1,5 @@
/* /* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*-
*
* (C) Copyright The MITRE Corporation 1999 All rights reserved. * (C) Copyright The MITRE Corporation 1999 All rights reserved.
* *
* The contents of this file are subject to the Mozilla Public License * The contents of this file are subject to the Mozilla Public License
@ -37,8 +38,10 @@
#include <stdlib.h> #include <stdlib.h>
#endif #endif
#include "List.h"
#include "TxString.h" #include "TxString.h"
#include "baseutils.h" #include "baseutils.h"
#ifndef NULL #ifndef NULL
typedef 0 NULL; typedef 0 NULL;
#endif #endif
@ -57,6 +60,23 @@ class ProcessingInstruction;
class EntityReference; class EntityReference;
class DocumentType; class DocumentType;
class txAtom;
/*
* NULL string for use by Element::getAttribute() for when the attribute
* specified by "name" does not exist, and therefore shoud be "NULL".
* Used in txNamespaceManager as well.
*/
const String NULL_STRING;
#define kNameSpaceID_Unknown -1
#define kNameSpaceID_None 0
// not really a namespace, but it needs to play the game
#define kNameSpaceID_XMLNS 1
#define kNameSpaceID_XML 2
// kNameSpaceID_XSLT is 6 for module, see nsINameSpaceManager.h
#define kNameSpaceID_XSLT 3
// //
//Definition and Implementation the DOMImplementation class //Definition and Implementation the DOMImplementation class
// //
@ -128,7 +148,13 @@ class Node : public TxObject
//From DOM3 26-Jan-2001 WD //From DOM3 26-Jan-2001 WD
virtual String getBaseURI() = 0; virtual String getBaseURI() = 0;
//Introduced in DOM2
virtual const String& getNamespaceURI() = 0;
//txXPathNode functions //txXPathNode functions
virtual MBool getLocalName(txAtom** aLocalName) = 0;
virtual PRInt32 getNamespaceID() = 0;
virtual PRInt32 lookupNamespaceID(txAtom* prefix) = 0;
virtual Node* getXPathParent() = 0; virtual Node* getXPathParent() = 0;
}; };
@ -157,7 +183,7 @@ class NodeList
// //
class NodeListDefinition : public NodeList class NodeListDefinition : public NodeList
{ {
friend NamedNodeMap; //-- LF friend class NamedNodeMap; //-- LF
public: public:
NodeListDefinition(); NodeListDefinition();
virtual ~NodeListDefinition(); virtual ~NodeListDefinition();
@ -207,7 +233,7 @@ class NamedNodeMap : public NodeListDefinition
class AttrMap : public NamedNodeMap class AttrMap : public NamedNodeMap
{ {
// Elenent needs to be friend to be able to set the AttrMaps ownerElement // Elenent needs to be friend to be able to set the AttrMaps ownerElement
friend Element; friend class Element;
public: public:
AttrMap(); AttrMap();
@ -215,6 +241,7 @@ class AttrMap : public NamedNodeMap
Node* setNamedItem(Node* arg); Node* setNamedItem(Node* arg);
Node* removeNamedItem(const String& name); Node* removeNamedItem(const String& name);
void clear();
private: private:
Element* ownerElement; Element* ownerElement;
@ -244,7 +271,7 @@ class NodeDefinition : public Node, public NodeList
Node* getLastChild() const; Node* getLastChild() const;
Node* getPreviousSibling() const; Node* getPreviousSibling() const;
Node* getNextSibling() const; Node* getNextSibling() const;
NamedNodeMap* getAttributes(); virtual NamedNodeMap* getAttributes();
Document* getOwnerDocument() const; Document* getOwnerDocument() const;
//Write functions //Write functions
@ -258,11 +285,17 @@ class NodeDefinition : public Node, public NodeList
Node* cloneNode(MBool deep, Node* dest); Node* cloneNode(MBool deep, Node* dest);
MBool hasChildNodes() const; MBool hasChildNodes() const;
//From DOM3 26-Jan-2001 WD //From DOM3 26-Jan-2001 WD
virtual String getBaseURI(); virtual String getBaseURI();
//Introduced in DOM2
const String& getNamespaceURI();
//txXPathNode functions //txXPathNode functions
virtual MBool getLocalName(txAtom** aLocalName);
virtual PRInt32 getNamespaceID();
virtual PRInt32 lookupNamespaceID(txAtom*);
virtual Node* getXPathParent(); virtual Node* getXPathParent();
//Inherited from NodeList //Inherited from NodeList
@ -275,7 +308,6 @@ class NodeDefinition : public Node, public NodeList
//than the generic node does. //than the generic node does.
String nodeName; String nodeName;
String nodeValue; String nodeValue;
AttrMap attributes;
void DeleteChildren(); void DeleteChildren();
@ -365,12 +397,14 @@ class Element : public NodeDefinition
{ {
public: public:
Element(const String& tagName, Document* owner); Element(const String& tagName, Document* owner);
virtual ~Element();
//Override insertBefore to limit Elements to having only certain nodes as //Override insertBefore to limit Elements to having only certain nodes as
//children //children
Node* insertBefore(Node* newChild, Node* refChild); Node* insertBefore(Node* newChild, Node* refChild);
const String& getTagName(); const String& getTagName();
NamedNodeMap* getAttributes();
const String& getAttribute(const String& name); const String& getAttribute(const String& name);
void setAttribute(const String& name, const String& value); void setAttribute(const String& name, const String& value);
void removeAttribute(const String& name); void removeAttribute(const String& name);
@ -379,6 +413,16 @@ class Element : public NodeDefinition
Attr* removeAttributeNode(Attr* oldAttr); Attr* removeAttributeNode(Attr* oldAttr);
NodeList* getElementsByTagName(const String& name); NodeList* getElementsByTagName(const String& name);
void normalize(); void normalize();
//txXPathNode functions override
MBool getLocalName(txAtom** aLocalName);
PRInt32 getNamespaceID();
MBool getAttr(txAtom* aLocalName, PRInt32 aNSID, String& aValue);
private:
AttrMap mAttributes;
txAtom* mLocalName;
PRInt32 mNamespaceID;
}; };
// //
@ -389,9 +433,10 @@ class Element : public NodeDefinition
class Attr : public NodeDefinition class Attr : public NodeDefinition
{ {
// AttrMap needs to be friend to be able to update the ownerElement // AttrMap needs to be friend to be able to update the ownerElement
friend AttrMap; friend class AttrMap;
public: public:
Attr(const String& name, Document* owner); Attr(const String& name, Document* owner);
virtual ~Attr();
const String& getName() const; const String& getName() const;
MBool getSpecified() const; MBool getSpecified() const;
@ -408,11 +453,16 @@ class Attr : public NodeDefinition
Node* insertBefore(Node* newChild, Node* refChild); Node* insertBefore(Node* newChild, Node* refChild);
//txXPathNode functions override //txXPathNode functions override
MBool getLocalName(txAtom** aLocalName);
PRInt32 getNamespaceID();
Node* getXPathParent(); Node* getXPathParent();
private: private:
Element* ownerElement; Element* ownerElement;
MBool specified; MBool specified;
txAtom* mLocalName;
PRInt32 mNamespaceID;
}; };
// //
@ -508,6 +558,7 @@ class ProcessingInstruction : public NodeDefinition
public: public:
ProcessingInstruction(const String& theTarget, const String& theData, ProcessingInstruction(const String& theTarget, const String& theData,
Document* owner); Document* owner);
~ProcessingInstruction();
const String& getTarget() const; const String& getTarget() const;
const String& getData() const; const String& getData() const;
@ -520,11 +571,17 @@ class ProcessingInstruction : public NodeDefinition
Node* replaceChild(Node* newChild, Node* oldChild); Node* replaceChild(Node* newChild, Node* oldChild);
Node* removeChild(Node* oldChild); Node* removeChild(Node* oldChild);
Node* appendChild(Node* newChild); Node* appendChild(Node* newChild);
//txXPathNode functions override
MBool getLocalName(txAtom** aLocalName);
private:
txAtom* mLocalName;
}; };
// //
//Definition and Implementation of a Notation. Most functionality is inherrited //Definition and Implementation of a Notation. Most functionality
//from NodeDefinition. //is inherrited from NodeDefinition.
// //
class Notation : public NodeDefinition class Notation : public NodeDefinition
{ {
@ -608,8 +665,110 @@ class DocumentType : public NodeDefinition
NamedNodeMap* notations; NamedNodeMap* notations;
}; };
//NULL string for use by Element::getAttribute() for when the attribute class txNamespaceManager
//spcified by "name" does not exist, and therefore shoud be "NULL". {
const String NULL_STRING; public:
static PRInt32 getNamespaceID(const String& aURI)
{
if (!mNamespaces && !Init())
return kNameSpaceID_Unknown;
txListIterator nameIter(mNamespaces);
PRInt32 id=0;
String* uri;
while (nameIter.hasNext()) {
uri = (String*)nameIter.next();
id++;
if (uri->isEqual(aURI))
return id;
}
uri = new String(aURI);
NS_ASSERTION(uri, "Out of memory, namespaces are getting lost");
if (!uri)
return kNameSpaceID_Unknown;
mNamespaces->add(uri);
id++;
return id;
}
static const String& getNamespaceURI(const PRInt32 aID)
{
// empty namespace, and errors
if (aID <= 0)
return NULL_STRING;
if (!mNamespaces && !Init())
return NULL_STRING;
txListIterator nameIter(mNamespaces);
String* aURI = (String*)nameIter.advance(aID);
if (aURI)
return *aURI;
return NULL_STRING;
}
static MBool Init()
{
NS_ASSERTION(!mNamespaces,
"called without matching Shutdown()");
if (mNamespaces)
return MB_TRUE;
mNamespaces = new txList();
if (!mNamespaces)
return MB_FALSE;
/*
* Hardwiring some Namespace IDs.
* no Namespace is 0
* xmlns prefix is 1, mapped to http://www.w3.org/2000/xmlns/
* xml prefix is 2, mapped to http://www.w3.org/XML/1998/namespace
*/
String* XMLNSUri = new String("http://www.w3.org/2000/xmlns/");
if (!XMLNSUri) {
delete mNamespaces;
mNamespaces = 0;
return MB_FALSE;
}
mNamespaces->add(XMLNSUri);
String* XMLUri = new String("http://www.w3.org/XML/1998/namespace");
if (!XMLUri) {
delete mNamespaces;
mNamespaces = 0;
return MB_FALSE;
}
mNamespaces->add(XMLUri);
String* XSLTUri = new String("http://www.w3.org/1999/XSL/Transform");
if (!XSLTUri) {
delete mNamespaces;
mNamespaces = 0;
return MB_FALSE;
}
mNamespaces->add(XSLTUri);
return MB_TRUE;
}
static void Shutdown()
{
NS_ASSERTION(mNamespaces, "called without matching Init()");
if (!mNamespaces)
return;
delete mNamespaces;
mNamespaces = NULL;
}
private:
static txList* mNamespaces;
};
//
// Definition of txXMLAtoms
//
class txXMLAtoms
{
public:
static txAtom* XMLPrefix;
static txAtom* XMLNSPrefix;
};
#define TX_IMPL_DOM_STATICS \
txAtom* txXMLAtoms::XMLPrefix = 0; \
txAtom* txXMLAtoms::XMLNSPrefix = 0; \
txList* txNamespaceManager::mNamespaces = 0
#endif #endif

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

@ -189,7 +189,7 @@ ExprResult* NodeSetFunctionCall::evaluate(Node* context, ContextState* cs) {
} }
break; break;
case NAMESPACE_URI : case NAMESPACE_URI :
XMLUtils::getNameSpace(node->getNodeName(),name); name = node->getNamespaceURI();
break; break;
default: default:
switch (node->getNodeType()) { switch (node->getNodeType()) {

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

@ -1,4 +1,5 @@
/* /* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*-
*
* The contents of this file are subject to the Mozilla Public * The contents of this file are subject to the Mozilla Public
* License Version 1.1 (the "License"); you may not use this file * License Version 1.1 (the "License"); you may not use this file
* except in compliance with the License. You may obtain a copy of * except in compliance with the License. You may obtain a copy of
@ -50,6 +51,7 @@
#include "Numbering.h" #include "Numbering.h"
#include "Tokenizer.h" #include "Tokenizer.h"
#include "URIUtils.h" #include "URIUtils.h"
#include "txAtom.h"
#ifndef TX_EXE #ifndef TX_EXE
#include "nsIObserverService.h" #include "nsIObserverService.h"
#include "nsIURL.h" #include "nsIURL.h"
@ -81,6 +83,16 @@
const String XSLTProcessor::NON_TEXT_TEMPLATE_WARNING = const String XSLTProcessor::NON_TEXT_TEMPLATE_WARNING =
"templates for the following element are not allowed to generate non character data: "; "templates for the following element are not allowed to generate non character data: ";
/*
* Implement static variables for standalone
* atomservice
* and dom
*/
#ifdef TX_EXE
TX_IMPL_ATOM_STATICS;
#endif
TX_IMPL_DOM_STATICS;
/** /**
* Creates a new XSLTProcessor * Creates a new XSLTProcessor
**/ **/
@ -152,6 +164,40 @@ NS_INTERFACE_MAP_END
NS_IMPL_ADDREF(XSLTProcessor) NS_IMPL_ADDREF(XSLTProcessor)
NS_IMPL_RELEASE(XSLTProcessor) NS_IMPL_RELEASE(XSLTProcessor)
#else
/*
* Initialize atom tables, hardcode xml and xmlns prefixes.
*/
MBool txInit()
{
if (!txAtomService::Init())
return MB_FALSE;
if (!txNamespaceManager::Init())
return MB_FALSE;
String xml;
xml.append("xml");
txXMLAtoms::XMLPrefix = TX_GET_ATOM(xml);
if (!txXMLAtoms::XMLPrefix)
return MB_FALSE;
xml.append("ns");
txXMLAtoms::XMLNSPrefix = TX_GET_ATOM(xml);
if (!txXMLAtoms::XMLNSPrefix)
return MB_FALSE;
return MB_TRUE;
}
/*
* To be called when done with transformiix
*
* Free atom table, namespace manager
*/
MBool txShutdown()
{
txNamespaceManager::Shutdown();
txAtomService::Shutdown();
return MB_TRUE;
}
#endif #endif
/** /**
@ -1021,18 +1067,10 @@ void XSLTProcessor::processAction
//-- documents //-- documents
const String curValue = xslAction->getNodeValue(); const String curValue = xslAction->getNodeValue();
//-- set leading + trailing whitespace stripping flags
#ifdef DEBUG_ah
Node* priorNode = xslAction->getPreviousSibling();
Node* nextNode = xslAction->getNextSibling();
if (priorNode && (priorNode->getNodeType()==Node::TEXT_NODE))
cout << "Textnode found in prior in whitespace strip"<<endl;
if (nextNode && (nextNode->getNodeType()==Node::TEXT_NODE))
cout << "Textnode found in next in whitespace strip"<<endl;
#endif
if (XMLUtils::shouldStripTextnode(curValue)) if (XMLUtils::shouldStripTextnode(curValue))
textValue=""; textValue="";
else textValue=curValue; else
textValue=curValue;
} }
else { else {
textValue = xslAction->getNodeValue(); textValue = xslAction->getNodeValue();

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

@ -1,4 +1,5 @@
/* /* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*-
*
* The contents of this file are subject to the Mozilla Public * The contents of this file are subject to the Mozilla Public
* License Version 1.1 (the "License"); you may not use this file * License Version 1.1 (the "License"); you may not use this file
* except in compliance with the License. You may obtain a copy of * except in compliance with the License. You may obtain a copy of
@ -56,8 +57,16 @@
#define TRANSFORMIIX_XSLT_PROCESSOR_CONTRACTID \ #define TRANSFORMIIX_XSLT_PROCESSOR_CONTRACTID \
"@mozilla.org/document-transformer;1?type=text/xsl" "@mozilla.org/document-transformer;1?type=text/xsl"
#endif #else
/*
* Initialisation and shutdown routines for standalone
* Allocate and free static atoms.
*/
MBool txInit();
MBool txShutdown();
#endif
/** /**
* A class for Processing XSL Stylesheets * A class for Processing XSL Stylesheets