зеркало из https://github.com/mozilla/pjs.git
Added epilog and prolog to document. Added processing instructions and CDATASections for XML. Completed document Node methods.
This commit is contained in:
Родитель
ca263b2c48
Коммит
f6f2f989a9
|
@ -157,6 +157,22 @@ public:
|
||||||
virtual nsIContent* GetRootContent() = 0;
|
virtual nsIContent* GetRootContent() = 0;
|
||||||
virtual void SetRootContent(nsIContent* aRoot) = 0;
|
virtual void SetRootContent(nsIContent* aRoot) = 0;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Methods to append to the prolog and epilog of
|
||||||
|
* a document. The prolog is the content before the document
|
||||||
|
* element, the epilog after.
|
||||||
|
*/
|
||||||
|
NS_IMETHOD AppendToProlog(nsIContent* aContent) = 0;
|
||||||
|
NS_IMETHOD AppendToEpilog(nsIContent* aContent) = 0;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get the direct children of the document - content in
|
||||||
|
* the prolog, the root content and content in the epilog.
|
||||||
|
*/
|
||||||
|
NS_IMETHOD ChildAt(PRInt32 aIndex, nsIContent*& aResult) const = 0;
|
||||||
|
NS_IMETHOD IndexOf(nsIContent* aPossibleChild, PRInt32& aIndex) const = 0;
|
||||||
|
NS_IMETHOD GetChildCount(PRInt32& aCount) = 0;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Get the style sheets owned by this document.
|
* Get the style sheets owned by this document.
|
||||||
* Style sheets are ordered, most significant last.
|
* Style sheets are ordered, most significant last.
|
||||||
|
|
|
@ -331,7 +331,8 @@ nsContentList::Match(nsIContent *aContent, PRBool *aMatch)
|
||||||
// If we have to match all, only do those that have
|
// If we have to match all, only do those that have
|
||||||
// a tagName i.e. only the elements.
|
// a tagName i.e. only the elements.
|
||||||
if (mMatchAll && (nsLayoutAtoms::textTagName != name) &&
|
if (mMatchAll && (nsLayoutAtoms::textTagName != name) &&
|
||||||
(nsLayoutAtoms::commentTagName != name)) {
|
(nsLayoutAtoms::commentTagName != name) &&
|
||||||
|
(nsLayoutAtoms::processingInstructionTagName != name)) {
|
||||||
*aMatch = PR_TRUE;
|
*aMatch = PR_TRUE;
|
||||||
}
|
}
|
||||||
// XXX We don't yet match on namespace. Maybe we should??
|
// XXX We don't yet match on namespace. Maybe we should??
|
||||||
|
|
|
@ -549,8 +549,62 @@ PRInt32 nsPostData::GetDataLength()
|
||||||
return mDataLen;
|
return mDataLen;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// ==================================================================
|
||||||
|
// =
|
||||||
|
// ==================================================================
|
||||||
|
nsDocumentChildNodes::nsDocumentChildNodes(nsIDocument* aDocument)
|
||||||
|
{
|
||||||
|
// We don't reference count our document reference (to avoid circular
|
||||||
|
// references). We'll be told when the document goes away.
|
||||||
|
mDocument = aDocument;
|
||||||
|
}
|
||||||
|
|
||||||
|
nsDocumentChildNodes::~nsDocumentChildNodes()
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
NS_IMETHODIMP
|
||||||
|
nsDocumentChildNodes::GetLength(PRUint32* aLength)
|
||||||
|
{
|
||||||
|
if (nsnull != mDocument) {
|
||||||
|
PRInt32 count;
|
||||||
|
mDocument->GetChildCount(count);
|
||||||
|
*aLength = (PRUint32)count;
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
*aLength = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
return NS_OK;
|
||||||
|
}
|
||||||
|
|
||||||
|
NS_IMETHODIMP
|
||||||
|
nsDocumentChildNodes::Item(PRUint32 aIndex, nsIDOMNode** aReturn)
|
||||||
|
{
|
||||||
|
nsresult result = NS_OK;
|
||||||
|
nsIContent* content = nsnull;
|
||||||
|
|
||||||
|
*aReturn = nsnull;
|
||||||
|
if (nsnull != mDocument) {
|
||||||
|
result = mDocument->ChildAt(aIndex, content);
|
||||||
|
if ((NS_OK == result) && (nsnull != content)) {
|
||||||
|
result = content->QueryInterface(kIDOMNodeIID, (void**)aReturn);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
nsDocumentChildNodes::DropReference()
|
||||||
|
{
|
||||||
|
mDocument = nsnull;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// ==================================================================
|
||||||
|
// =
|
||||||
|
// ==================================================================
|
||||||
|
|
||||||
nsDocument::nsDocument()
|
nsDocument::nsDocument()
|
||||||
{
|
{
|
||||||
|
@ -572,6 +626,9 @@ nsDocument::nsDocument()
|
||||||
mNameSpaceManager = nsnull;
|
mNameSpaceManager = nsnull;
|
||||||
mHeaderData = nsnull;
|
mHeaderData = nsnull;
|
||||||
mLineBreaker = nsnull;
|
mLineBreaker = nsnull;
|
||||||
|
mProlog = nsnull;
|
||||||
|
mEpilog = nsnull;
|
||||||
|
mChildNodes = nsnull;
|
||||||
mWordBreaker = nsnull;
|
mWordBreaker = nsnull;
|
||||||
|
|
||||||
Init();/* XXX */
|
Init();/* XXX */
|
||||||
|
@ -585,7 +642,7 @@ nsDocument::~nsDocument()
|
||||||
// This notification will occur only after the reference has
|
// This notification will occur only after the reference has
|
||||||
// been dropped.
|
// been dropped.
|
||||||
mInDestructor = PR_TRUE;
|
mInDestructor = PR_TRUE;
|
||||||
PRInt32 index;
|
PRInt32 index, count;
|
||||||
for (index = 0; index < mObservers.Count(); index++) {
|
for (index = 0; index < mObservers.Count(); index++) {
|
||||||
nsIDocumentObserver* observer = (nsIDocumentObserver*)mObservers.ElementAt(index);
|
nsIDocumentObserver* observer = (nsIDocumentObserver*)mObservers.ElementAt(index);
|
||||||
observer->DocumentWillBeDestroyed(this);
|
observer->DocumentWillBeDestroyed(this);
|
||||||
|
@ -617,6 +674,29 @@ nsDocument::~nsDocument()
|
||||||
NS_RELEASE(sheet);
|
NS_RELEASE(sheet);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
nsIContent* content;
|
||||||
|
if (nsnull != mProlog) {
|
||||||
|
count = mProlog->Count();
|
||||||
|
for (index = 0; index < count; index++) {
|
||||||
|
content = (nsIContent*)mProlog->ElementAt(index);
|
||||||
|
NS_RELEASE(content);
|
||||||
|
}
|
||||||
|
delete mProlog;
|
||||||
|
}
|
||||||
|
if (nsnull != mEpilog) {
|
||||||
|
count = mEpilog->Count();
|
||||||
|
for (index = 0; index < count; index++) {
|
||||||
|
content = (nsIContent*)mEpilog->ElementAt(index);
|
||||||
|
NS_RELEASE(content);
|
||||||
|
}
|
||||||
|
delete mEpilog;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (nsnull != mChildNodes) {
|
||||||
|
mChildNodes->DropReference();
|
||||||
|
NS_RELEASE(mChildNodes);
|
||||||
|
}
|
||||||
|
|
||||||
NS_IF_RELEASE(mArena);
|
NS_IF_RELEASE(mArena);
|
||||||
NS_IF_RELEASE(mScriptContextOwner);
|
NS_IF_RELEASE(mScriptContextOwner);
|
||||||
NS_IF_RELEASE(mListenerManager);
|
NS_IF_RELEASE(mListenerManager);
|
||||||
|
@ -1047,6 +1127,103 @@ void nsDocument::SetRootContent(nsIContent* aRoot)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
NS_IMETHODIMP
|
||||||
|
nsDocument::AppendToProlog(nsIContent* aContent)
|
||||||
|
{
|
||||||
|
if (nsnull == mProlog) {
|
||||||
|
mProlog = new nsVoidArray();
|
||||||
|
}
|
||||||
|
|
||||||
|
mProlog->AppendElement((void *)aContent);
|
||||||
|
NS_ADDREF(aContent);
|
||||||
|
|
||||||
|
return NS_OK;
|
||||||
|
}
|
||||||
|
|
||||||
|
NS_IMETHODIMP
|
||||||
|
nsDocument::AppendToEpilog(nsIContent* aContent)
|
||||||
|
{
|
||||||
|
if (nsnull == mEpilog) {
|
||||||
|
mEpilog = new nsVoidArray();
|
||||||
|
}
|
||||||
|
|
||||||
|
mEpilog->AppendElement((void *)aContent);
|
||||||
|
NS_ADDREF(aContent);
|
||||||
|
|
||||||
|
return NS_OK;
|
||||||
|
}
|
||||||
|
|
||||||
|
NS_IMETHODIMP
|
||||||
|
nsDocument::ChildAt(PRInt32 aIndex, nsIContent*& aResult) const
|
||||||
|
{
|
||||||
|
nsIContent* content = nsnull;
|
||||||
|
PRInt32 prolog = 0;
|
||||||
|
|
||||||
|
if (nsnull != mProlog) {
|
||||||
|
prolog = mProlog->Count();
|
||||||
|
if (aIndex < prolog) {
|
||||||
|
// It's in the prolog
|
||||||
|
content = (nsIContent*)mProlog->ElementAt(aIndex);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (aIndex == prolog) {
|
||||||
|
// It's the document element
|
||||||
|
content = mRootContent;
|
||||||
|
}
|
||||||
|
else if ((aIndex > prolog) && (nsnull != mEpilog)) {
|
||||||
|
// It's in the epilog
|
||||||
|
content = (nsIContent*)mEpilog->ElementAt(aIndex-prolog-1);
|
||||||
|
}
|
||||||
|
|
||||||
|
NS_IF_ADDREF(content);
|
||||||
|
aResult = content;
|
||||||
|
|
||||||
|
return NS_OK;
|
||||||
|
}
|
||||||
|
|
||||||
|
NS_IMETHODIMP
|
||||||
|
nsDocument::IndexOf(nsIContent* aPossibleChild, PRInt32& aIndex) const
|
||||||
|
{
|
||||||
|
PRInt32 index = -1;
|
||||||
|
PRInt32 prolog = 0;
|
||||||
|
|
||||||
|
if (nsnull != mProlog) {
|
||||||
|
index = mProlog->IndexOf(aPossibleChild);
|
||||||
|
prolog = mProlog->Count();
|
||||||
|
}
|
||||||
|
|
||||||
|
if (-1 == index) {
|
||||||
|
if (aPossibleChild == mRootContent) {
|
||||||
|
index = prolog;
|
||||||
|
}
|
||||||
|
else if (nsnull != mEpilog) {
|
||||||
|
index = mEpilog->IndexOf(aPossibleChild);
|
||||||
|
if (-1 != index) {
|
||||||
|
index += (prolog+1);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
aIndex = index;
|
||||||
|
|
||||||
|
return NS_OK;
|
||||||
|
}
|
||||||
|
|
||||||
|
NS_IMETHODIMP
|
||||||
|
nsDocument::GetChildCount(PRInt32& aCount)
|
||||||
|
{
|
||||||
|
aCount = 1;
|
||||||
|
if (nsnull != mProlog) {
|
||||||
|
aCount += mProlog->Count();
|
||||||
|
}
|
||||||
|
if (nsnull != mEpilog) {
|
||||||
|
aCount += mEpilog->Count();
|
||||||
|
}
|
||||||
|
|
||||||
|
return NS_OK;
|
||||||
|
}
|
||||||
|
|
||||||
PRInt32 nsDocument::GetNumberOfStyleSheets()
|
PRInt32 nsDocument::GetNumberOfStyleSheets()
|
||||||
{
|
{
|
||||||
return mStyleSheets.Count();
|
return mStyleSheets.Count();
|
||||||
|
@ -1504,6 +1681,7 @@ nsDocument::CreateTextNode(const nsString& aData, nsIDOMText** aReturn)
|
||||||
if (NS_OK == rv) {
|
if (NS_OK == rv) {
|
||||||
rv = text->QueryInterface(kIDOMTextIID, (void**)aReturn);
|
rv = text->QueryInterface(kIDOMTextIID, (void**)aReturn);
|
||||||
(*aReturn)->AppendData(aData);
|
(*aReturn)->AppendData(aData);
|
||||||
|
NS_RELEASE(text);
|
||||||
}
|
}
|
||||||
|
|
||||||
return rv;
|
return rv;
|
||||||
|
@ -1524,6 +1702,7 @@ nsDocument::CreateComment(const nsString& aData, nsIDOMComment** aReturn)
|
||||||
if (NS_OK == rv) {
|
if (NS_OK == rv) {
|
||||||
rv = comment->QueryInterface(kIDOMCommentIID, (void**)aReturn);
|
rv = comment->QueryInterface(kIDOMCommentIID, (void**)aReturn);
|
||||||
(*aReturn)->AppendData(aData);
|
(*aReturn)->AppendData(aData);
|
||||||
|
NS_RELEASE(comment);
|
||||||
}
|
}
|
||||||
|
|
||||||
return rv;
|
return rv;
|
||||||
|
@ -1663,29 +1842,71 @@ nsDocument::GetParentNode(nsIDOMNode** aParentNode)
|
||||||
NS_IMETHODIMP
|
NS_IMETHODIMP
|
||||||
nsDocument::GetChildNodes(nsIDOMNodeList** aChildNodes)
|
nsDocument::GetChildNodes(nsIDOMNodeList** aChildNodes)
|
||||||
{
|
{
|
||||||
// Should be implemented by subclass
|
if (nsnull == mChildNodes) {
|
||||||
return NS_ERROR_NOT_IMPLEMENTED;
|
mChildNodes = new nsDocumentChildNodes(this);
|
||||||
|
if (nsnull == mChildNodes) {
|
||||||
|
return NS_ERROR_OUT_OF_MEMORY;
|
||||||
|
}
|
||||||
|
NS_ADDREF(mChildNodes);
|
||||||
|
}
|
||||||
|
|
||||||
|
return mChildNodes->QueryInterface(kIDOMNodeListIID, (void**)aChildNodes);
|
||||||
}
|
}
|
||||||
|
|
||||||
NS_IMETHODIMP
|
NS_IMETHODIMP
|
||||||
nsDocument::HasChildNodes(PRBool* aHasChildNodes)
|
nsDocument::HasChildNodes(PRBool* aHasChildNodes)
|
||||||
{
|
{
|
||||||
// Should be implemented by subclass
|
*aHasChildNodes = PR_TRUE;
|
||||||
return NS_ERROR_NOT_IMPLEMENTED;
|
return NS_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
NS_IMETHODIMP
|
NS_IMETHODIMP
|
||||||
nsDocument::GetFirstChild(nsIDOMNode** aFirstChild)
|
nsDocument::GetFirstChild(nsIDOMNode** aFirstChild)
|
||||||
{
|
{
|
||||||
// Should be implemented by subclass
|
nsresult result = NS_OK;
|
||||||
return NS_ERROR_NOT_IMPLEMENTED;
|
|
||||||
|
if ((nsnull != mProlog) && (0 != mProlog->Count())) {
|
||||||
|
nsIContent* content;
|
||||||
|
content = (nsIContent *)mProlog->ElementAt(0);
|
||||||
|
|
||||||
|
if (nsnull != content) {
|
||||||
|
result = content->QueryInterface(kIDOMNodeIID, (void**)aFirstChild);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
nsIDOMElement* element;
|
||||||
|
result = GetDocumentElement(&element);
|
||||||
|
if (NS_OK == result) {
|
||||||
|
result = element->QueryInterface(kIDOMNodeIID, (void**)aFirstChild);
|
||||||
|
NS_RELEASE(element);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
NS_IMETHODIMP
|
NS_IMETHODIMP
|
||||||
nsDocument::GetLastChild(nsIDOMNode** aLastChild)
|
nsDocument::GetLastChild(nsIDOMNode** aLastChild)
|
||||||
{
|
{
|
||||||
// Should be implemented by subclass
|
nsresult result = NS_OK;
|
||||||
return NS_ERROR_NOT_IMPLEMENTED;
|
|
||||||
|
if ((nsnull != mEpilog) && (0 != mEpilog->Count())) {
|
||||||
|
nsIContent* content;
|
||||||
|
content = (nsIContent *)mEpilog->ElementAt(mEpilog->Count()-1);
|
||||||
|
if (nsnull != content) {
|
||||||
|
result = content->QueryInterface(kIDOMNodeIID, (void**)aLastChild);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
nsIDOMElement* element;
|
||||||
|
result = GetDocumentElement(&element);
|
||||||
|
if (NS_OK == result) {
|
||||||
|
result = element->QueryInterface(kIDOMNodeIID, (void**)aLastChild);
|
||||||
|
NS_RELEASE(element);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
NS_IMETHODIMP
|
NS_IMETHODIMP
|
||||||
|
@ -1712,29 +1933,194 @@ nsDocument::GetAttributes(nsIDOMNamedNodeMap** aAttributes)
|
||||||
NS_IMETHODIMP
|
NS_IMETHODIMP
|
||||||
nsDocument::InsertBefore(nsIDOMNode* aNewChild, nsIDOMNode* aRefChild, nsIDOMNode** aReturn)
|
nsDocument::InsertBefore(nsIDOMNode* aNewChild, nsIDOMNode* aRefChild, nsIDOMNode** aReturn)
|
||||||
{
|
{
|
||||||
// Should be implemented by subclass
|
NS_ASSERTION(nsnull != aNewChild, "null ptr");
|
||||||
return NS_ERROR_NOT_IMPLEMENTED;
|
nsresult result = NS_OK;
|
||||||
|
PRInt32 index;
|
||||||
|
PRUint16 nodeType;
|
||||||
|
nsIContent *content, *refContent = nsnull;
|
||||||
|
|
||||||
|
if (nsnull == aNewChild) {
|
||||||
|
return NS_ERROR_INVALID_ARG;
|
||||||
|
}
|
||||||
|
|
||||||
|
aNewChild->GetNodeType(&nodeType);
|
||||||
|
if ((COMMENT_NODE != nodeType) && (PROCESSING_INSTRUCTION_NODE != nodeType)) {
|
||||||
|
return NS_ERROR_INVALID_ARG;
|
||||||
|
}
|
||||||
|
|
||||||
|
result = aNewChild->QueryInterface(kIContentIID, (void**)&content);
|
||||||
|
if (NS_OK != result) {
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (nsnull == aRefChild) {
|
||||||
|
AppendToEpilog(content);
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
result = aRefChild->QueryInterface(kIContentIID, (void**)&refContent);
|
||||||
|
if (NS_OK != result) {
|
||||||
|
NS_RELEASE(content);
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
if ((nsnull != mProlog) && (0 != mProlog->Count())) {
|
||||||
|
index = mProlog->IndexOf(refContent);
|
||||||
|
if (-1 != index) {
|
||||||
|
mProlog->InsertElementAt(content, index);
|
||||||
|
NS_ADDREF(content);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (refContent == mRootContent) {
|
||||||
|
AppendToProlog(content);
|
||||||
|
}
|
||||||
|
else if ((nsnull != mEpilog) && (0 != mEpilog->Count())) {
|
||||||
|
index = mEpilog->IndexOf(refContent);
|
||||||
|
if (-1 != index) {
|
||||||
|
mEpilog->InsertElementAt(content, index);
|
||||||
|
NS_ADDREF(content);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
NS_RELEASE(refContent);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (NS_OK == result) {
|
||||||
|
content->SetDocument(this, PR_TRUE);
|
||||||
|
*aReturn = aNewChild;
|
||||||
|
NS_ADDREF(aNewChild);
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
*aReturn = nsnull;
|
||||||
|
}
|
||||||
|
|
||||||
|
NS_RELEASE(content);
|
||||||
|
|
||||||
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
NS_IMETHODIMP
|
NS_IMETHODIMP
|
||||||
nsDocument::ReplaceChild(nsIDOMNode* aNewChild, nsIDOMNode* aOldChild, nsIDOMNode** aReturn)
|
nsDocument::ReplaceChild(nsIDOMNode* aNewChild, nsIDOMNode* aOldChild, nsIDOMNode** aReturn)
|
||||||
{
|
{
|
||||||
// Should be implemented by subclass
|
NS_ASSERTION(((nsnull != aNewChild) && (nsnull != aOldChild)), "null ptr");
|
||||||
return NS_ERROR_NOT_IMPLEMENTED;
|
nsresult result = NS_OK;
|
||||||
|
PRInt32 index;
|
||||||
|
PRUint16 nodeType;
|
||||||
|
nsIContent *content, *refContent;
|
||||||
|
|
||||||
|
if ((nsnull == aNewChild) || (nsnull == aOldChild)) {
|
||||||
|
return NS_ERROR_INVALID_ARG;
|
||||||
|
}
|
||||||
|
|
||||||
|
aNewChild->GetNodeType(&nodeType);
|
||||||
|
if ((COMMENT_NODE != nodeType) && (PROCESSING_INSTRUCTION_NODE != nodeType)) {
|
||||||
|
return NS_ERROR_INVALID_ARG;
|
||||||
|
}
|
||||||
|
|
||||||
|
result = aNewChild->QueryInterface(kIContentIID, (void**)&content);
|
||||||
|
if (NS_OK != result) {
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
result = aOldChild->QueryInterface(kIContentIID, (void**)&refContent);
|
||||||
|
if (NS_OK != result) {
|
||||||
|
NS_RELEASE(content);
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
if ((nsnull != mProlog) && (0 != mProlog->Count())) {
|
||||||
|
index = mProlog->IndexOf(refContent);
|
||||||
|
if (-1 != index) {
|
||||||
|
nsIContent* oldContent;
|
||||||
|
oldContent = (nsIContent*)mProlog->ElementAt(index);
|
||||||
|
NS_RELEASE(oldContent);
|
||||||
|
mProlog->ReplaceElementAt(content, index);
|
||||||
|
NS_ADDREF(content);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (refContent == mRootContent) {
|
||||||
|
result = NS_ERROR_INVALID_ARG;
|
||||||
|
}
|
||||||
|
else if ((nsnull != mEpilog) && (0 != mEpilog->Count())) {
|
||||||
|
index = mEpilog->IndexOf(refContent);
|
||||||
|
if (-1 != index) {
|
||||||
|
nsIContent* oldContent;
|
||||||
|
oldContent = (nsIContent*)mEpilog->ElementAt(index);
|
||||||
|
NS_RELEASE(oldContent);
|
||||||
|
mEpilog->ReplaceElementAt(content, index);
|
||||||
|
NS_ADDREF(content);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (NS_OK == result) {
|
||||||
|
content->SetDocument(this, PR_TRUE);
|
||||||
|
refContent->SetDocument(nsnull, PR_TRUE);
|
||||||
|
*aReturn = aNewChild;
|
||||||
|
NS_ADDREF(aNewChild);
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
*aReturn = nsnull;
|
||||||
|
}
|
||||||
|
|
||||||
|
NS_RELEASE(content);
|
||||||
|
NS_RELEASE(refContent);
|
||||||
|
|
||||||
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
NS_IMETHODIMP
|
NS_IMETHODIMP
|
||||||
nsDocument::RemoveChild(nsIDOMNode* aOldChild, nsIDOMNode** aReturn)
|
nsDocument::RemoveChild(nsIDOMNode* aOldChild, nsIDOMNode** aReturn)
|
||||||
{
|
{
|
||||||
// Should be implemented by subclass
|
NS_ASSERTION(nsnull != aOldChild, "null ptr");
|
||||||
return NS_ERROR_NOT_IMPLEMENTED;
|
nsresult result = NS_OK;
|
||||||
|
PRInt32 index;
|
||||||
|
nsIContent *content;
|
||||||
|
|
||||||
|
if (nsnull == aOldChild) {
|
||||||
|
return NS_ERROR_INVALID_ARG;
|
||||||
|
}
|
||||||
|
|
||||||
|
result = aOldChild->QueryInterface(kIContentIID, (void**)&content);
|
||||||
|
if (NS_OK != result) {
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
if ((nsnull != mProlog) && (0 != mProlog->Count())) {
|
||||||
|
index = mProlog->IndexOf(content);
|
||||||
|
if (-1 != index) {
|
||||||
|
// Don't drop reference count since we're going
|
||||||
|
// to return this element anyway.
|
||||||
|
mProlog->RemoveElementAt(index);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (content == mRootContent) {
|
||||||
|
result = NS_ERROR_INVALID_ARG;
|
||||||
|
}
|
||||||
|
else if ((nsnull != mEpilog) && (0 != mEpilog->Count())) {
|
||||||
|
index = mEpilog->IndexOf(content);
|
||||||
|
if (-1 != index) {
|
||||||
|
mEpilog->RemoveElementAt(index);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (NS_OK == result) {
|
||||||
|
content->SetDocument(nsnull, PR_TRUE);
|
||||||
|
*aReturn = aOldChild;
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
*aReturn = nsnull;
|
||||||
|
}
|
||||||
|
|
||||||
|
NS_RELEASE(content);
|
||||||
|
|
||||||
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
NS_IMETHODIMP
|
NS_IMETHODIMP
|
||||||
nsDocument::AppendChild(nsIDOMNode* aNewChild, nsIDOMNode** aReturn)
|
nsDocument::AppendChild(nsIDOMNode* aNewChild, nsIDOMNode** aReturn)
|
||||||
{
|
{
|
||||||
// Should be implemented by subclass
|
return InsertBefore(aNewChild, nsnull, aReturn);
|
||||||
return NS_ERROR_NOT_IMPLEMENTED;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
NS_IMETHODIMP
|
NS_IMETHODIMP
|
||||||
|
|
|
@ -29,11 +29,12 @@
|
||||||
#include "nsXIFConverter.h"
|
#include "nsXIFConverter.h"
|
||||||
#include "nsIJSScriptObject.h"
|
#include "nsIJSScriptObject.h"
|
||||||
#include "nsIContent.h"
|
#include "nsIContent.h"
|
||||||
|
#include "nsGenericDOMNodeList.h"
|
||||||
|
|
||||||
class nsIEventListenerManager;
|
class nsIEventListenerManager;
|
||||||
class nsDOMStyleSheetCollection;
|
class nsDOMStyleSheetCollection;
|
||||||
class nsIDOMSelection;
|
class nsIDOMSelection;
|
||||||
|
class nsDocument;
|
||||||
|
|
||||||
class nsPostData : public nsIPostData {
|
class nsPostData : public nsIPostData {
|
||||||
public:
|
public:
|
||||||
|
@ -77,6 +78,23 @@ public:
|
||||||
nsDocHeaderData* mNext;
|
nsDocHeaderData* mNext;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
// Represents the children of a document (prolog, epilog and
|
||||||
|
// document element)
|
||||||
|
class nsDocumentChildNodes : public nsGenericDOMNodeList
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
nsDocumentChildNodes(nsIDocument* aDocument);
|
||||||
|
~nsDocumentChildNodes();
|
||||||
|
|
||||||
|
NS_IMETHOD GetLength(PRUint32* aLength);
|
||||||
|
NS_IMETHOD Item(PRUint32 aIndex, nsIDOMNode** aReturn);
|
||||||
|
|
||||||
|
void DropReference();
|
||||||
|
|
||||||
|
protected:
|
||||||
|
nsIDocument* mDocument;
|
||||||
|
};
|
||||||
|
|
||||||
// Base class for our document implementations
|
// Base class for our document implementations
|
||||||
class nsDocument : public nsIDocument,
|
class nsDocument : public nsIDocument,
|
||||||
public nsIDOMDocument,
|
public nsIDOMDocument,
|
||||||
|
@ -169,6 +187,22 @@ public:
|
||||||
virtual nsIContent* GetRootContent();
|
virtual nsIContent* GetRootContent();
|
||||||
virtual void SetRootContent(nsIContent* aRoot);
|
virtual void SetRootContent(nsIContent* aRoot);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Methods to append to the prolog and epilog of
|
||||||
|
* a document. The prolog is the content before the document
|
||||||
|
* element, the epilog after.
|
||||||
|
*/
|
||||||
|
NS_IMETHOD AppendToProlog(nsIContent* aContent);
|
||||||
|
NS_IMETHOD AppendToEpilog(nsIContent* aContent);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get the direct children of the document - content in
|
||||||
|
* the prolog, the root content and content in the epilog.
|
||||||
|
*/
|
||||||
|
NS_IMETHOD ChildAt(PRInt32 aIndex, nsIContent*& aResult) const;
|
||||||
|
NS_IMETHOD IndexOf(nsIContent* aPossibleChild, PRInt32& aIndex) const;
|
||||||
|
NS_IMETHOD GetChildCount(PRInt32& aCount);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Get the style sheets owned by this document.
|
* Get the style sheets owned by this document.
|
||||||
* These are ordered, highest priority last
|
* These are ordered, highest priority last
|
||||||
|
@ -383,6 +417,9 @@ protected:
|
||||||
nsINameSpaceManager* mNameSpaceManager;
|
nsINameSpaceManager* mNameSpaceManager;
|
||||||
nsDocHeaderData* mHeaderData;
|
nsDocHeaderData* mHeaderData;
|
||||||
nsILineBreaker* mLineBreaker;
|
nsILineBreaker* mLineBreaker;
|
||||||
|
nsVoidArray *mProlog;
|
||||||
|
nsVoidArray *mEpilog;
|
||||||
|
nsDocumentChildNodes* mChildNodes;
|
||||||
nsIWordBreaker* mWordBreaker;
|
nsIWordBreaker* mWordBreaker;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
@ -37,6 +37,7 @@
|
||||||
#include "nsIPrivateDOMEvent.h"
|
#include "nsIPrivateDOMEvent.h"
|
||||||
#include "nsISizeOfHandler.h"
|
#include "nsISizeOfHandler.h"
|
||||||
#include "nsDOMEvent.h"
|
#include "nsDOMEvent.h"
|
||||||
|
#include "nsIDOMText.h"
|
||||||
#include "nsIDOMScriptObjectFactory.h"
|
#include "nsIDOMScriptObjectFactory.h"
|
||||||
#include "nsIScriptContextOwner.h"
|
#include "nsIScriptContextOwner.h"
|
||||||
#include "prprf.h"
|
#include "prprf.h"
|
||||||
|
@ -49,6 +50,8 @@ NS_DEFINE_IID(kIDOMCharacterDataIID, NS_IDOMCHARACTERDATA_IID);
|
||||||
static NS_DEFINE_IID(kIPrivateDOMEventIID, NS_IPRIVATEDOMEVENT_IID);
|
static NS_DEFINE_IID(kIPrivateDOMEventIID, NS_IPRIVATEDOMEVENT_IID);
|
||||||
static NS_DEFINE_IID(kIEnumeratorIID, NS_IENUMERATOR_IID);
|
static NS_DEFINE_IID(kIEnumeratorIID, NS_IENUMERATOR_IID);
|
||||||
static NS_DEFINE_IID(kIDOMDocumentIID, NS_IDOMDOCUMENT_IID);
|
static NS_DEFINE_IID(kIDOMDocumentIID, NS_IDOMDOCUMENT_IID);
|
||||||
|
static NS_DEFINE_IID(kIDOMTextIID, NS_IDOMTEXT_IID);
|
||||||
|
static NS_DEFINE_IID(kITextContentIID, NS_ITEXT_CONTENT_IID);
|
||||||
|
|
||||||
//----------------------------------------------------------------------
|
//----------------------------------------------------------------------
|
||||||
|
|
||||||
|
@ -133,49 +136,73 @@ nsGenericDOMDataNode::GetParentNode(nsIDOMNode** aParentNode)
|
||||||
}
|
}
|
||||||
|
|
||||||
nsresult
|
nsresult
|
||||||
nsGenericDOMDataNode::GetPreviousSibling(nsIDOMNode** aNode)
|
nsGenericDOMDataNode::GetPreviousSibling(nsIDOMNode** aPrevSibling)
|
||||||
{
|
{
|
||||||
|
nsIContent* sibling = nsnull;
|
||||||
|
nsresult result = NS_OK;
|
||||||
|
|
||||||
if (nsnull != mParent) {
|
if (nsnull != mParent) {
|
||||||
PRInt32 pos;
|
PRInt32 pos;
|
||||||
mParent->IndexOf(mContent, pos);
|
mParent->IndexOf(mContent, pos);
|
||||||
if (pos > -1) {
|
if (pos > -1 ) {
|
||||||
nsIContent* prev;
|
mParent->ChildAt(--pos, sibling);
|
||||||
mParent->ChildAt(--pos, prev);
|
|
||||||
if (nsnull != prev) {
|
|
||||||
nsresult res = prev->QueryInterface(kIDOMNodeIID, (void**)aNode);
|
|
||||||
NS_ASSERTION(NS_OK == res, "Must be a DOM Node");
|
|
||||||
NS_RELEASE(prev); // balance the AddRef in ChildAt()
|
|
||||||
return res;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
// XXX Nodes that are just below the document (their parent is the
|
else if (nsnull != mDocument) {
|
||||||
// document) need to go to the document to find their previous sibling.
|
// Nodes that are just below the document (their parent is the
|
||||||
*aNode = nsnull;
|
// document) need to go to the document to find their next sibling.
|
||||||
return NS_OK;
|
PRInt32 pos;
|
||||||
|
mDocument->IndexOf(mContent, pos);
|
||||||
|
if (pos > -1 ) {
|
||||||
|
mDocument->ChildAt(--pos, sibling);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (nsnull != sibling) {
|
||||||
|
result = sibling->QueryInterface(kIDOMNodeIID,(void**)aPrevSibling);
|
||||||
|
NS_ASSERTION(NS_OK == result, "Must be a DOM Node");
|
||||||
|
NS_RELEASE(sibling); // balance the AddRef in ChildAt()
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
*aPrevSibling = nsnull;
|
||||||
|
}
|
||||||
|
|
||||||
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
nsresult
|
nsresult
|
||||||
nsGenericDOMDataNode::GetNextSibling(nsIDOMNode** aNextSibling)
|
nsGenericDOMDataNode::GetNextSibling(nsIDOMNode** aNextSibling)
|
||||||
{
|
{
|
||||||
|
nsIContent* sibling = nsnull;
|
||||||
|
nsresult result = NS_OK;
|
||||||
|
|
||||||
if (nsnull != mParent) {
|
if (nsnull != mParent) {
|
||||||
PRInt32 pos;
|
PRInt32 pos;
|
||||||
mParent->IndexOf(mContent, pos);
|
mParent->IndexOf(mContent, pos);
|
||||||
if (pos > -1 ) {
|
if (pos > -1 ) {
|
||||||
nsIContent* prev;
|
mParent->ChildAt(++pos, sibling);
|
||||||
mParent->ChildAt(++pos, prev);
|
|
||||||
if (nsnull != prev) {
|
|
||||||
nsresult res = prev->QueryInterface(kIDOMNodeIID,(void**)aNextSibling);
|
|
||||||
NS_ASSERTION(NS_OK == res, "Must be a DOM Node");
|
|
||||||
NS_RELEASE(prev); // balance the AddRef in ChildAt()
|
|
||||||
return res;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
// XXX Nodes that are just below the document (their parent is the
|
else if (nsnull != mDocument) {
|
||||||
// document) need to go to the document to find their next sibling.
|
// Nodes that are just below the document (their parent is the
|
||||||
*aNextSibling = nsnull;
|
// document) need to go to the document to find their next sibling.
|
||||||
return NS_OK;
|
PRInt32 pos;
|
||||||
|
mDocument->IndexOf(mContent, pos);
|
||||||
|
if (pos > -1 ) {
|
||||||
|
mDocument->ChildAt(++pos, sibling);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (nsnull != sibling) {
|
||||||
|
result = sibling->QueryInterface(kIDOMNodeIID,(void**)aNextSibling);
|
||||||
|
NS_ASSERTION(NS_OK == result, "Must be a DOM Node");
|
||||||
|
NS_RELEASE(sibling); // balance the AddRef in ChildAt()
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
*aNextSibling = nsnull;
|
||||||
|
}
|
||||||
|
|
||||||
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
nsresult
|
nsresult
|
||||||
|
@ -775,3 +802,141 @@ nsGenericDOMDataNode::GetRangeList(nsVoidArray*& aResult) const
|
||||||
aResult = mRangeList;
|
aResult = mRangeList;
|
||||||
return NS_OK;
|
return NS_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
//----------------------------------------------------------------------
|
||||||
|
|
||||||
|
// Implementation of the nsIDOMText interface
|
||||||
|
|
||||||
|
nsresult
|
||||||
|
nsGenericDOMDataNode::SplitText(PRUint32 aOffset, nsIDOMText** aReturn)
|
||||||
|
{
|
||||||
|
nsresult result = NS_OK;
|
||||||
|
nsIContent* newNode;
|
||||||
|
nsITextContent* text;
|
||||||
|
nsAutoString cutText;
|
||||||
|
nsIContent* parentNode;
|
||||||
|
PRUint32 length;
|
||||||
|
|
||||||
|
GetLength(&length);
|
||||||
|
// Cut the second part out of the original text node
|
||||||
|
result = SubstringData(aOffset, length-aOffset, cutText);
|
||||||
|
if (NS_OK == result) {
|
||||||
|
result = DeleteData(aOffset, length-aOffset);
|
||||||
|
if (NS_OK == result) {
|
||||||
|
// Create a new text node and set its data to the
|
||||||
|
// string we just cut out
|
||||||
|
result = NS_NewTextNode(&newNode);
|
||||||
|
if (NS_OK == result) {
|
||||||
|
result = newNode->QueryInterface(kITextContentIID, (void**)&text);
|
||||||
|
if (NS_OK == result) {
|
||||||
|
text->SetText(cutText, cutText.Length(), PR_FALSE);
|
||||||
|
// Find the parent of the current node and insert the
|
||||||
|
// new text node as a child after the current node
|
||||||
|
GetParent(parentNode);
|
||||||
|
if (nsnull != parentNode) {
|
||||||
|
PRInt32 index;
|
||||||
|
|
||||||
|
result = parentNode->IndexOf(mContent, index);
|
||||||
|
if (NS_OK == result) {
|
||||||
|
result = parentNode->InsertChildAt(newNode, index+1, PR_TRUE);
|
||||||
|
}
|
||||||
|
NS_RELEASE(parentNode);
|
||||||
|
}
|
||||||
|
result = text->QueryInterface(kIDOMTextIID, (void**)aReturn);
|
||||||
|
NS_RELEASE(text);
|
||||||
|
}
|
||||||
|
NS_RELEASE(newNode);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
//----------------------------------------------------------------------
|
||||||
|
|
||||||
|
// Implementation of the nsITextContent interface
|
||||||
|
|
||||||
|
nsresult
|
||||||
|
nsGenericDOMDataNode::GetText(const nsTextFragment*& aFragmentsResult,
|
||||||
|
PRInt32& aNumFragmentsResult)
|
||||||
|
{
|
||||||
|
aFragmentsResult = &mText;
|
||||||
|
aNumFragmentsResult = 1;
|
||||||
|
return NS_OK;
|
||||||
|
}
|
||||||
|
|
||||||
|
nsresult
|
||||||
|
nsGenericDOMDataNode::SetText(const PRUnichar* aBuffer, PRInt32 aLength,
|
||||||
|
PRBool aNotify)
|
||||||
|
{
|
||||||
|
NS_PRECONDITION((aLength >= 0) && (nsnull != aBuffer), "bad args");
|
||||||
|
if (aLength < 0) {
|
||||||
|
return NS_ERROR_ILLEGAL_VALUE;
|
||||||
|
}
|
||||||
|
if (nsnull == aBuffer) {
|
||||||
|
return NS_ERROR_NULL_POINTER;
|
||||||
|
}
|
||||||
|
mText.SetTo(aBuffer, aLength);
|
||||||
|
|
||||||
|
// Trigger a reflow
|
||||||
|
if (aNotify && (nsnull != mDocument)) {
|
||||||
|
mDocument->ContentChanged(mContent, nsnull);
|
||||||
|
}
|
||||||
|
return NS_OK;
|
||||||
|
}
|
||||||
|
|
||||||
|
nsresult
|
||||||
|
nsGenericDOMDataNode::SetText(const char* aBuffer,
|
||||||
|
PRInt32 aLength,
|
||||||
|
PRBool aNotify)
|
||||||
|
{
|
||||||
|
NS_PRECONDITION((aLength >= 0) && (nsnull != aBuffer), "bad args");
|
||||||
|
if (aLength < 0) {
|
||||||
|
return NS_ERROR_ILLEGAL_VALUE;
|
||||||
|
}
|
||||||
|
if (nsnull == aBuffer) {
|
||||||
|
return NS_ERROR_NULL_POINTER;
|
||||||
|
}
|
||||||
|
mText.SetTo(aBuffer, aLength);
|
||||||
|
|
||||||
|
// Trigger a reflow
|
||||||
|
if (aNotify && (nsnull != mDocument)) {
|
||||||
|
mDocument->ContentChanged(mContent, nsnull);
|
||||||
|
}
|
||||||
|
return NS_OK;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
nsresult
|
||||||
|
nsGenericDOMDataNode::IsOnlyWhitespace(PRBool* aResult)
|
||||||
|
{
|
||||||
|
nsTextFragment& frag = mText;
|
||||||
|
if (frag.Is2b()) {
|
||||||
|
const PRUnichar* cp = frag.Get2b();
|
||||||
|
const PRUnichar* end = cp + frag.GetLength();
|
||||||
|
while (cp < end) {
|
||||||
|
PRUnichar ch = *cp++;
|
||||||
|
if (!XP_IS_SPACE(ch)) {
|
||||||
|
*aResult = PR_FALSE;
|
||||||
|
return NS_OK;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
const char* cp = frag.Get1b();
|
||||||
|
const char* end = cp + frag.GetLength();
|
||||||
|
while (cp < end) {
|
||||||
|
PRUnichar ch = PRUnichar(*(unsigned char*)cp);
|
||||||
|
cp++;
|
||||||
|
if (!XP_IS_SPACE(ch)) {
|
||||||
|
*aResult = PR_FALSE;
|
||||||
|
return NS_OK;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
*aResult = PR_TRUE;
|
||||||
|
return NS_OK;
|
||||||
|
}
|
||||||
|
|
|
@ -26,6 +26,7 @@
|
||||||
#include "nsTextFragment.h"
|
#include "nsTextFragment.h"
|
||||||
#include "nsVoidArray.h"
|
#include "nsVoidArray.h"
|
||||||
#include "nsINameSpaceManager.h"
|
#include "nsINameSpaceManager.h"
|
||||||
|
#include "nsITextContent.h"
|
||||||
|
|
||||||
extern const nsIID kIDOMCharacterDataIID;
|
extern const nsIID kIDOMCharacterDataIID;
|
||||||
extern const nsIID kIDOMNodeIID;
|
extern const nsIID kIDOMNodeIID;
|
||||||
|
@ -43,6 +44,7 @@ class nsIFrame;
|
||||||
class nsIStyleContext;
|
class nsIStyleContext;
|
||||||
class nsIStyleRule;
|
class nsIStyleRule;
|
||||||
class nsISupportsArray;
|
class nsISupportsArray;
|
||||||
|
class nsIDOMText;
|
||||||
|
|
||||||
struct nsGenericDOMDataNode {
|
struct nsGenericDOMDataNode {
|
||||||
nsGenericDOMDataNode();
|
nsGenericDOMDataNode();
|
||||||
|
@ -206,6 +208,18 @@ struct nsGenericDOMDataNode {
|
||||||
return NS_OK;
|
return NS_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
nsresult SplitText(PRUint32 aOffset, nsIDOMText** aReturn);
|
||||||
|
|
||||||
|
nsresult GetText(const nsTextFragment*& aFragmentsResult,
|
||||||
|
PRInt32& aNumFragmentsResult);
|
||||||
|
nsresult SetText(const PRUnichar* aBuffer,
|
||||||
|
PRInt32 aLength,
|
||||||
|
PRBool aNotify);
|
||||||
|
nsresult SetText(const char* aBuffer,
|
||||||
|
PRInt32 aLength,
|
||||||
|
PRBool aNotify);
|
||||||
|
nsresult IsOnlyWhitespace(PRBool* aResult);
|
||||||
|
|
||||||
//----------------------------------------
|
//----------------------------------------
|
||||||
|
|
||||||
void ToCString(nsString& aBuf, PRInt32 aOffset, PRInt32 aLen) const;
|
void ToCString(nsString& aBuf, PRInt32 aOffset, PRInt32 aLen) const;
|
||||||
|
@ -464,6 +478,38 @@ struct nsGenericDOMDataNode {
|
||||||
return _g.GetRangeList(aResult); \
|
return _g.GetRangeList(aResult); \
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Implement the nsIDOMText API by forwarding the methods to a
|
||||||
|
* generic character data content object.
|
||||||
|
*/
|
||||||
|
#define NS_IMPL_IDOMTEXT_USING_GENERIC_DOM_DATA(_g) \
|
||||||
|
NS_IMETHOD SplitText(PRUint32 aOffset, nsIDOMText** aReturn){ \
|
||||||
|
return _g.SplitText(aOffset, aReturn); \
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Implement the nsITextContent API by forwarding the methods to a
|
||||||
|
* generic character data content object.
|
||||||
|
*/
|
||||||
|
#define NS_IMPL_ITEXTCONTENT_USING_GENERIC_DOM_DATA(_g) \
|
||||||
|
NS_IMETHOD GetText(const nsTextFragment*& aFragmentsResult, \
|
||||||
|
PRInt32& aNumFragmentsResult){ \
|
||||||
|
return mInner.GetText(aFragmentsResult, aNumFragmentsResult); \
|
||||||
|
} \
|
||||||
|
NS_IMETHOD SetText(const PRUnichar* aBuffer, \
|
||||||
|
PRInt32 aLength, \
|
||||||
|
PRBool aNotify){ \
|
||||||
|
return mInner.SetText(aBuffer, aLength, aNotify); \
|
||||||
|
} \
|
||||||
|
NS_IMETHOD SetText(const char* aBuffer, \
|
||||||
|
PRInt32 aLength, \
|
||||||
|
PRBool aNotify){ \
|
||||||
|
return mInner.SetText(aBuffer, aLength, aNotify); \
|
||||||
|
} \
|
||||||
|
NS_IMETHOD IsOnlyWhitespace(PRBool* aResult){ \
|
||||||
|
return mInner.IsOnlyWhitespace(aResult); \
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* This macro implements the portion of query interface that is
|
* This macro implements the portion of query interface that is
|
||||||
* generic to all html content objects.
|
* generic to all html content objects.
|
||||||
|
|
|
@ -293,49 +293,73 @@ nsGenericElement::GetParentNode(nsIDOMNode** aParentNode)
|
||||||
}
|
}
|
||||||
|
|
||||||
nsresult
|
nsresult
|
||||||
nsGenericElement::GetPreviousSibling(nsIDOMNode** aNode)
|
nsGenericElement::GetPreviousSibling(nsIDOMNode** aPrevSibling)
|
||||||
{
|
{
|
||||||
|
nsIContent* sibling = nsnull;
|
||||||
|
nsresult result = NS_OK;
|
||||||
|
|
||||||
if (nsnull != mParent) {
|
if (nsnull != mParent) {
|
||||||
PRInt32 pos;
|
PRInt32 pos;
|
||||||
mParent->IndexOf(mContent, pos);
|
mParent->IndexOf(mContent, pos);
|
||||||
if (pos > -1) {
|
if (pos > -1 ) {
|
||||||
nsIContent* prev;
|
mParent->ChildAt(--pos, sibling);
|
||||||
mParent->ChildAt(--pos, prev);
|
|
||||||
if (nsnull != prev) {
|
|
||||||
nsresult res = prev->QueryInterface(kIDOMNodeIID, (void**)aNode);
|
|
||||||
NS_ASSERTION(NS_OK == res, "Must be a DOM Node");
|
|
||||||
NS_RELEASE(prev); // balance the AddRef in ChildAt()
|
|
||||||
return res;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
// XXX Nodes that are just below the document (their parent is the
|
else if (nsnull != mDocument) {
|
||||||
// document) need to go to the document to find their previous sibling.
|
// Nodes that are just below the document (their parent is the
|
||||||
*aNode = nsnull;
|
// document) need to go to the document to find their next sibling.
|
||||||
return NS_OK;
|
PRInt32 pos;
|
||||||
|
mDocument->IndexOf(mContent, pos);
|
||||||
|
if (pos > -1 ) {
|
||||||
|
mDocument->ChildAt(--pos, sibling);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (nsnull != sibling) {
|
||||||
|
result = sibling->QueryInterface(kIDOMNodeIID,(void**)aPrevSibling);
|
||||||
|
NS_ASSERTION(NS_OK == result, "Must be a DOM Node");
|
||||||
|
NS_RELEASE(sibling); // balance the AddRef in ChildAt()
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
*aPrevSibling = nsnull;
|
||||||
|
}
|
||||||
|
|
||||||
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
nsresult
|
nsresult
|
||||||
nsGenericElement::GetNextSibling(nsIDOMNode** aNextSibling)
|
nsGenericElement::GetNextSibling(nsIDOMNode** aNextSibling)
|
||||||
{
|
{
|
||||||
|
nsIContent* sibling = nsnull;
|
||||||
|
nsresult result = NS_OK;
|
||||||
|
|
||||||
if (nsnull != mParent) {
|
if (nsnull != mParent) {
|
||||||
PRInt32 pos;
|
PRInt32 pos;
|
||||||
mParent->IndexOf(mContent, pos);
|
mParent->IndexOf(mContent, pos);
|
||||||
if (pos > -1 ) {
|
if (pos > -1 ) {
|
||||||
nsIContent* prev;
|
mParent->ChildAt(++pos, sibling);
|
||||||
mParent->ChildAt(++pos, prev);
|
|
||||||
if (nsnull != prev) {
|
|
||||||
nsresult res = prev->QueryInterface(kIDOMNodeIID,(void**)aNextSibling);
|
|
||||||
NS_ASSERTION(NS_OK == res, "Must be a DOM Node");
|
|
||||||
NS_RELEASE(prev); // balance the AddRef in ChildAt()
|
|
||||||
return res;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
// XXX Nodes that are just below the document (their parent is the
|
else if (nsnull != mDocument) {
|
||||||
// document) need to go to the document to find their next sibling.
|
// Nodes that are just below the document (their parent is the
|
||||||
*aNextSibling = nsnull;
|
// document) need to go to the document to find their next sibling.
|
||||||
return NS_OK;
|
PRInt32 pos;
|
||||||
|
mDocument->IndexOf(mContent, pos);
|
||||||
|
if (pos > -1 ) {
|
||||||
|
mDocument->ChildAt(++pos, sibling);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (nsnull != sibling) {
|
||||||
|
result = sibling->QueryInterface(kIDOMNodeIID,(void**)aNextSibling);
|
||||||
|
NS_ASSERTION(NS_OK == result, "Must be a DOM Node");
|
||||||
|
NS_RELEASE(sibling); // balance the AddRef in ChildAt()
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
*aNextSibling = nsnull;
|
||||||
|
}
|
||||||
|
|
||||||
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
nsresult
|
nsresult
|
||||||
|
@ -1436,9 +1460,6 @@ nsGenericContainerElement::GetLastChild(nsIDOMNode** aNode)
|
||||||
return NS_OK;
|
return NS_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
// XXX It's possible that newChild has already been inserted in the
|
|
||||||
// tree; if this is the case then we need to remove it from where it
|
|
||||||
// was before placing it in it's new home
|
|
||||||
|
|
||||||
nsresult
|
nsresult
|
||||||
nsGenericContainerElement::InsertBefore(nsIDOMNode* aNewChild,
|
nsGenericContainerElement::InsertBefore(nsIDOMNode* aNewChild,
|
||||||
|
|
|
@ -16,12 +16,13 @@
|
||||||
* Corporation. Portions created by Netscape are Copyright (C) 1998
|
* Corporation. Portions created by Netscape are Copyright (C) 1998
|
||||||
* Netscape Communications Corporation. All Rights Reserved.
|
* Netscape Communications Corporation. All Rights Reserved.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include "nsIDOMText.h"
|
#include "nsIDOMText.h"
|
||||||
#include "nsGenericDOMDataNode.h"
|
|
||||||
#include "nsIScriptObjectOwner.h"
|
#include "nsIScriptObjectOwner.h"
|
||||||
#include "nsIDOMEventReceiver.h"
|
#include "nsIDOMEventReceiver.h"
|
||||||
#include "nsIContent.h"
|
#include "nsIContent.h"
|
||||||
#include "nsITextContent.h"
|
#include "nsITextContent.h"
|
||||||
|
#include "nsGenericDOMDataNode.h"
|
||||||
#include "nsFrame.h"
|
#include "nsFrame.h"
|
||||||
#include "nsIDocument.h"
|
#include "nsIDocument.h"
|
||||||
#include "nsCRT.h"
|
#include "nsCRT.h"
|
||||||
|
@ -30,8 +31,6 @@
|
||||||
static NS_DEFINE_IID(kIDOMTextIID, NS_IDOMTEXT_IID);
|
static NS_DEFINE_IID(kIDOMTextIID, NS_IDOMTEXT_IID);
|
||||||
static NS_DEFINE_IID(kITextContentIID, NS_ITEXT_CONTENT_IID);
|
static NS_DEFINE_IID(kITextContentIID, NS_ITEXT_CONTENT_IID);
|
||||||
|
|
||||||
/* XXX should not be html content; should be nsITextContent */
|
|
||||||
|
|
||||||
class nsTextNode : public nsIDOMText,
|
class nsTextNode : public nsIDOMText,
|
||||||
public nsIScriptObjectOwner,
|
public nsIScriptObjectOwner,
|
||||||
public nsIDOMEventReceiver,
|
public nsIDOMEventReceiver,
|
||||||
|
@ -52,7 +51,7 @@ public:
|
||||||
NS_IMPL_IDOMCHARACTERDATA_USING_GENERIC_DOM_DATA(mInner)
|
NS_IMPL_IDOMCHARACTERDATA_USING_GENERIC_DOM_DATA(mInner)
|
||||||
|
|
||||||
// nsIDOMText
|
// nsIDOMText
|
||||||
NS_IMETHOD SplitText(PRUint32 aOffset, nsIDOMText** aReturn);
|
NS_IMPL_IDOMTEXT_USING_GENERIC_DOM_DATA(mInner)
|
||||||
|
|
||||||
// nsIScriptObjectOwner
|
// nsIScriptObjectOwner
|
||||||
NS_IMPL_ISCRIPTOBJECTOWNER_USING_GENERIC_DOM_DATA(mInner)
|
NS_IMPL_ISCRIPTOBJECTOWNER_USING_GENERIC_DOM_DATA(mInner)
|
||||||
|
@ -64,16 +63,7 @@ public:
|
||||||
NS_IMPL_ICONTENT_USING_GENERIC_DOM_DATA(mInner)
|
NS_IMPL_ICONTENT_USING_GENERIC_DOM_DATA(mInner)
|
||||||
|
|
||||||
// nsITextContent
|
// nsITextContent
|
||||||
NS_IMETHOD GetText(const nsTextFragment*& aFragmentsResult,
|
NS_IMPL_ITEXTCONTENT_USING_GENERIC_DOM_DATA(mInner)
|
||||||
PRInt32& aNumFragmentsResult);
|
|
||||||
NS_IMETHOD SetText(const PRUnichar* aBuffer,
|
|
||||||
PRInt32 aLength,
|
|
||||||
PRBool aNotify);
|
|
||||||
NS_IMETHOD SetText(const char* aBuffer,
|
|
||||||
PRInt32 aLength,
|
|
||||||
PRBool aNotify);
|
|
||||||
|
|
||||||
NS_IMETHOD IsOnlyWhitespace(PRBool* aResult);
|
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
nsGenericDOMDataNode mInner;
|
nsGenericDOMDataNode mInner;
|
||||||
|
@ -197,138 +187,3 @@ nsTextNode::HandleDOMEvent(nsIPresContext& aPresContext,
|
||||||
return mInner.HandleDOMEvent(aPresContext, aEvent, aDOMEvent,
|
return mInner.HandleDOMEvent(aPresContext, aEvent, aDOMEvent,
|
||||||
aFlags, aEventStatus);
|
aFlags, aEventStatus);
|
||||||
}
|
}
|
||||||
|
|
||||||
//----------------------------------------------------------------------
|
|
||||||
|
|
||||||
// Implementation of the nsIDOMText interface
|
|
||||||
|
|
||||||
NS_IMETHODIMP
|
|
||||||
nsTextNode::SplitText(PRUint32 aOffset, nsIDOMText** aReturn)
|
|
||||||
{
|
|
||||||
nsresult result = NS_OK;
|
|
||||||
nsIContent* newNode;
|
|
||||||
nsITextContent* text;
|
|
||||||
nsAutoString cutText;
|
|
||||||
nsIContent* parentNode;
|
|
||||||
PRUint32 length;
|
|
||||||
|
|
||||||
GetLength(&length);
|
|
||||||
// Cut the second part out of the original text node
|
|
||||||
result = SubstringData(aOffset, length-aOffset, cutText);
|
|
||||||
if (NS_OK == result) {
|
|
||||||
result = DeleteData(aOffset, length-aOffset);
|
|
||||||
if (NS_OK == result) {
|
|
||||||
// Create a new text node and set its data to the
|
|
||||||
// string we just cut out
|
|
||||||
result = NS_NewTextNode(&newNode);
|
|
||||||
if (NS_OK == result) {
|
|
||||||
result = newNode->QueryInterface(kITextContentIID, (void**)&text);
|
|
||||||
if (NS_OK == result) {
|
|
||||||
text->SetText(cutText, cutText.Length(), PR_FALSE);
|
|
||||||
// Find the parent of the current node and insert the
|
|
||||||
// new text node as a child after the current node
|
|
||||||
GetParent(parentNode);
|
|
||||||
if (nsnull != parentNode) {
|
|
||||||
PRInt32 index;
|
|
||||||
|
|
||||||
result = parentNode->IndexOf(this, index);
|
|
||||||
if (NS_OK == result) {
|
|
||||||
result = parentNode->InsertChildAt(newNode, index+1, PR_TRUE);
|
|
||||||
}
|
|
||||||
NS_RELEASE(parentNode);
|
|
||||||
}
|
|
||||||
result = text->QueryInterface(kIDOMTextIID, (void**)aReturn);
|
|
||||||
NS_RELEASE(text);
|
|
||||||
}
|
|
||||||
NS_RELEASE(newNode);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return result;
|
|
||||||
}
|
|
||||||
|
|
||||||
//----------------------------------------------------------------------
|
|
||||||
|
|
||||||
// Implementation of the nsITextContent interface
|
|
||||||
|
|
||||||
NS_IMETHODIMP
|
|
||||||
nsTextNode::GetText(const nsTextFragment*& aFragmentsResult,
|
|
||||||
PRInt32& aNumFragmentsResult)
|
|
||||||
{
|
|
||||||
aFragmentsResult = &mInner.mText;
|
|
||||||
aNumFragmentsResult = 1;
|
|
||||||
return NS_OK;
|
|
||||||
}
|
|
||||||
|
|
||||||
NS_IMETHODIMP
|
|
||||||
nsTextNode::SetText(const PRUnichar* aBuffer, PRInt32 aLength,
|
|
||||||
PRBool aNotify)
|
|
||||||
{
|
|
||||||
NS_PRECONDITION((aLength >= 0) && (nsnull != aBuffer), "bad args");
|
|
||||||
if (aLength < 0) {
|
|
||||||
return NS_ERROR_ILLEGAL_VALUE;
|
|
||||||
}
|
|
||||||
if (nsnull == aBuffer) {
|
|
||||||
return NS_ERROR_NULL_POINTER;
|
|
||||||
}
|
|
||||||
mInner.mText.SetTo(aBuffer, aLength);
|
|
||||||
|
|
||||||
// Trigger a reflow
|
|
||||||
if (aNotify && (nsnull != mInner.mDocument)) {
|
|
||||||
mInner.mDocument->ContentChanged(this, nsnull);
|
|
||||||
}
|
|
||||||
return NS_OK;
|
|
||||||
}
|
|
||||||
|
|
||||||
NS_IMETHODIMP
|
|
||||||
nsTextNode::SetText(const char* aBuffer, PRInt32 aLength,
|
|
||||||
PRBool aNotify)
|
|
||||||
{
|
|
||||||
NS_PRECONDITION((aLength >= 0) && (nsnull != aBuffer), "bad args");
|
|
||||||
if (aLength < 0) {
|
|
||||||
return NS_ERROR_ILLEGAL_VALUE;
|
|
||||||
}
|
|
||||||
if (nsnull == aBuffer) {
|
|
||||||
return NS_ERROR_NULL_POINTER;
|
|
||||||
}
|
|
||||||
mInner.mText.SetTo(aBuffer, aLength);
|
|
||||||
|
|
||||||
// Trigger a reflow
|
|
||||||
if (aNotify && (nsnull != mInner.mDocument)) {
|
|
||||||
mInner.mDocument->ContentChanged(this, nsnull);
|
|
||||||
}
|
|
||||||
return NS_OK;
|
|
||||||
}
|
|
||||||
|
|
||||||
NS_IMETHODIMP
|
|
||||||
nsTextNode::IsOnlyWhitespace(PRBool* aResult)
|
|
||||||
{
|
|
||||||
nsTextFragment& frag = mInner.mText;
|
|
||||||
if (frag.Is2b()) {
|
|
||||||
const PRUnichar* cp = frag.Get2b();
|
|
||||||
const PRUnichar* end = cp + frag.GetLength();
|
|
||||||
while (cp < end) {
|
|
||||||
PRUnichar ch = *cp++;
|
|
||||||
if (!XP_IS_SPACE(ch)) {
|
|
||||||
*aResult = PR_FALSE;
|
|
||||||
return NS_OK;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
const char* cp = frag.Get1b();
|
|
||||||
const char* end = cp + frag.GetLength();
|
|
||||||
while (cp < end) {
|
|
||||||
PRUnichar ch = PRUnichar(*(unsigned char*)cp);
|
|
||||||
cp++;
|
|
||||||
if (!XP_IS_SPACE(ch)) {
|
|
||||||
*aResult = PR_FALSE;
|
|
||||||
return NS_OK;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
*aResult = PR_TRUE;
|
|
||||||
return NS_OK;
|
|
||||||
}
|
|
||||||
|
|
|
@ -200,6 +200,7 @@ nsIAtom* nsHTMLAtoms::param;
|
||||||
nsIAtom* nsHTMLAtoms::placeholderPseudo;
|
nsIAtom* nsHTMLAtoms::placeholderPseudo;
|
||||||
nsIAtom* nsHTMLAtoms::pointSize;
|
nsIAtom* nsHTMLAtoms::pointSize;
|
||||||
nsIAtom* nsHTMLAtoms::pre;
|
nsIAtom* nsHTMLAtoms::pre;
|
||||||
|
nsIAtom* nsHTMLAtoms::processingInstructionPseudo;
|
||||||
nsIAtom* nsHTMLAtoms::profile;
|
nsIAtom* nsHTMLAtoms::profile;
|
||||||
nsIAtom* nsHTMLAtoms::prompt;
|
nsIAtom* nsHTMLAtoms::prompt;
|
||||||
nsIAtom* nsHTMLAtoms::readonly;
|
nsIAtom* nsHTMLAtoms::readonly;
|
||||||
|
@ -457,6 +458,7 @@ void nsHTMLAtoms::AddrefAtoms()
|
||||||
placeholderPseudo = NS_NewAtom(":placeholder-frame");
|
placeholderPseudo = NS_NewAtom(":placeholder-frame");
|
||||||
pointSize = NS_NewAtom("point-size");
|
pointSize = NS_NewAtom("point-size");
|
||||||
pre = NS_NewAtom("pre");
|
pre = NS_NewAtom("pre");
|
||||||
|
processingInstructionPseudo = NS_NewAtom(":-moz-pi");
|
||||||
profile = NS_NewAtom("profile");
|
profile = NS_NewAtom("profile");
|
||||||
prompt = NS_NewAtom("prompt");
|
prompt = NS_NewAtom("prompt");
|
||||||
readonly = NS_NewAtom("readonly");
|
readonly = NS_NewAtom("readonly");
|
||||||
|
@ -706,6 +708,7 @@ void nsHTMLAtoms::ReleaseAtoms()
|
||||||
NS_RELEASE(placeholderPseudo);
|
NS_RELEASE(placeholderPseudo);
|
||||||
NS_RELEASE(pointSize);
|
NS_RELEASE(pointSize);
|
||||||
NS_RELEASE(pre);
|
NS_RELEASE(pre);
|
||||||
|
NS_RELEASE(processingInstructionPseudo);
|
||||||
NS_RELEASE(profile);
|
NS_RELEASE(profile);
|
||||||
NS_RELEASE(prompt);
|
NS_RELEASE(prompt);
|
||||||
NS_RELEASE(readonly);
|
NS_RELEASE(readonly);
|
||||||
|
|
|
@ -232,6 +232,7 @@ public:
|
||||||
static nsIAtom* placeholderPseudo;
|
static nsIAtom* placeholderPseudo;
|
||||||
static nsIAtom* pointSize;
|
static nsIAtom* pointSize;
|
||||||
static nsIAtom* pre;
|
static nsIAtom* pre;
|
||||||
|
static nsIAtom* processingInstructionPseudo;
|
||||||
static nsIAtom* profile;
|
static nsIAtom* profile;
|
||||||
static nsIAtom* prompt;
|
static nsIAtom* prompt;
|
||||||
|
|
||||||
|
|
|
@ -129,6 +129,7 @@ NS_IMPL_STRING_ATTR(nsHTMLLIElement, Type, type)
|
||||||
NS_IMPL_INT_ATTR(nsHTMLLIElement, Value, value)
|
NS_IMPL_INT_ATTR(nsHTMLLIElement, Value, value)
|
||||||
|
|
||||||
static nsGenericHTMLElement::EnumTable kListItemTypeTable[] = {
|
static nsGenericHTMLElement::EnumTable kListItemTypeTable[] = {
|
||||||
|
{ "disc", NS_STYLE_LIST_STYLE_DISC },
|
||||||
{ "circle", NS_STYLE_LIST_STYLE_CIRCLE },
|
{ "circle", NS_STYLE_LIST_STYLE_CIRCLE },
|
||||||
{ "round", NS_STYLE_LIST_STYLE_CIRCLE },
|
{ "round", NS_STYLE_LIST_STYLE_CIRCLE },
|
||||||
{ "square", NS_STYLE_LIST_STYLE_SQUARE },
|
{ "square", NS_STYLE_LIST_STYLE_SQUARE },
|
||||||
|
|
|
@ -87,59 +87,6 @@ static NS_DEFINE_IID(kIHTMLContentContainerIID, NS_IHTMLCONTENTCONTAINER_IID);
|
||||||
static NS_DEFINE_IID(kIDOMHTMLElementIID, NS_IDOMHTMLELEMENT_IID);
|
static NS_DEFINE_IID(kIDOMHTMLElementIID, NS_IDOMHTMLELEMENT_IID);
|
||||||
static NS_DEFINE_IID(kIDOMHTMLBodyElementIID, NS_IDOMHTMLBODYELEMENT_IID);
|
static NS_DEFINE_IID(kIDOMHTMLBodyElementIID, NS_IDOMHTMLBODYELEMENT_IID);
|
||||||
|
|
||||||
// ==================================================================
|
|
||||||
// =
|
|
||||||
// ==================================================================
|
|
||||||
class nsHTMLDocumentChildNodes : public nsGenericDOMNodeList
|
|
||||||
{
|
|
||||||
public:
|
|
||||||
nsHTMLDocumentChildNodes(nsIDOMDocument* aDocument);
|
|
||||||
~nsHTMLDocumentChildNodes();
|
|
||||||
|
|
||||||
NS_IMETHOD GetLength(PRUint32* aLength);
|
|
||||||
NS_IMETHOD Item(PRUint32 aIndex, nsIDOMNode** aReturn);
|
|
||||||
|
|
||||||
protected:
|
|
||||||
nsIDOMDocument* mDocument;
|
|
||||||
};
|
|
||||||
|
|
||||||
nsHTMLDocumentChildNodes::nsHTMLDocumentChildNodes(nsIDOMDocument* aDocument)
|
|
||||||
{
|
|
||||||
mDocument = aDocument;
|
|
||||||
NS_ADDREF(mDocument);
|
|
||||||
}
|
|
||||||
|
|
||||||
nsHTMLDocumentChildNodes::~nsHTMLDocumentChildNodes()
|
|
||||||
{
|
|
||||||
NS_RELEASE(mDocument);
|
|
||||||
}
|
|
||||||
|
|
||||||
NS_IMETHODIMP
|
|
||||||
nsHTMLDocumentChildNodes::GetLength(PRUint32* aLength)
|
|
||||||
{
|
|
||||||
*aLength = 1;
|
|
||||||
return NS_OK;
|
|
||||||
}
|
|
||||||
|
|
||||||
NS_IMETHODIMP
|
|
||||||
nsHTMLDocumentChildNodes::Item(PRUint32 aIndex, nsIDOMNode** aReturn)
|
|
||||||
{
|
|
||||||
nsresult result = NS_OK;
|
|
||||||
if (0 == aIndex) {
|
|
||||||
nsIDOMElement* root;
|
|
||||||
|
|
||||||
result = mDocument->GetDocumentElement(&root);
|
|
||||||
if (NS_OK == result) {
|
|
||||||
result = root->QueryInterface(kIDOMNodeIID, (void**)aReturn);
|
|
||||||
NS_RELEASE(root);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
*aReturn = nsnull;
|
|
||||||
}
|
|
||||||
|
|
||||||
return result;
|
|
||||||
}
|
|
||||||
|
|
||||||
// ==================================================================
|
// ==================================================================
|
||||||
// =
|
// =
|
||||||
|
@ -840,36 +787,19 @@ nsHTMLDocument::GetElementsByTagName(const nsString& aTagname, nsIDOMNodeList**
|
||||||
NS_IMETHODIMP
|
NS_IMETHODIMP
|
||||||
nsHTMLDocument::GetChildNodes(nsIDOMNodeList** aChildNodes)
|
nsHTMLDocument::GetChildNodes(nsIDOMNodeList** aChildNodes)
|
||||||
{
|
{
|
||||||
nsHTMLDocumentChildNodes* childNodes = new nsHTMLDocumentChildNodes((nsIDOMDocument*)(nsIDOMHTMLDocument*)this);
|
return nsDocument::GetChildNodes(aChildNodes);
|
||||||
if (nsnull == childNodes) {
|
|
||||||
return NS_ERROR_OUT_OF_MEMORY;
|
|
||||||
}
|
|
||||||
|
|
||||||
return childNodes->QueryInterface(kIDOMNodeListIID, (void**)aChildNodes);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
NS_IMETHODIMP
|
NS_IMETHODIMP
|
||||||
nsHTMLDocument::GetFirstChild(nsIDOMNode** aFirstChild)
|
nsHTMLDocument::GetFirstChild(nsIDOMNode** aFirstChild)
|
||||||
{
|
{
|
||||||
if (nsnull != mRootContent) {
|
return nsDocument::GetFirstChild(aFirstChild);
|
||||||
return mRootContent->QueryInterface(kIDOMNodeIID, (void**)aFirstChild);
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
*aFirstChild = nsnull;
|
|
||||||
return NS_OK;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
NS_IMETHODIMP
|
NS_IMETHODIMP
|
||||||
nsHTMLDocument::GetLastChild(nsIDOMNode** aLastChild)
|
nsHTMLDocument::GetLastChild(nsIDOMNode** aLastChild)
|
||||||
{
|
{
|
||||||
if (nsnull != mRootContent) {
|
return nsDocument::GetLastChild(aLastChild);
|
||||||
return mRootContent->QueryInterface(kIDOMNodeIID, (void**)aLastChild);
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
*aLastChild = nsnull;
|
|
||||||
return NS_OK;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
NS_IMETHODIMP
|
NS_IMETHODIMP
|
||||||
|
@ -877,8 +807,7 @@ nsHTMLDocument::InsertBefore(nsIDOMNode* aNewChild,
|
||||||
nsIDOMNode* aRefChild,
|
nsIDOMNode* aRefChild,
|
||||||
nsIDOMNode** aReturn)
|
nsIDOMNode** aReturn)
|
||||||
{
|
{
|
||||||
*aReturn = nsnull;
|
return nsDocument::InsertBefore(aNewChild, aRefChild, aReturn);
|
||||||
return NS_OK;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
NS_IMETHODIMP
|
NS_IMETHODIMP
|
||||||
|
@ -886,29 +815,25 @@ nsHTMLDocument::ReplaceChild(nsIDOMNode* aNewChild,
|
||||||
nsIDOMNode* aOldChild,
|
nsIDOMNode* aOldChild,
|
||||||
nsIDOMNode** aReturn)
|
nsIDOMNode** aReturn)
|
||||||
{
|
{
|
||||||
*aReturn = nsnull;
|
return nsDocument::ReplaceChild(aNewChild, aOldChild, aReturn);
|
||||||
return NS_OK;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
NS_IMETHODIMP
|
NS_IMETHODIMP
|
||||||
nsHTMLDocument::RemoveChild(nsIDOMNode* aOldChild, nsIDOMNode** aReturn)
|
nsHTMLDocument::RemoveChild(nsIDOMNode* aOldChild, nsIDOMNode** aReturn)
|
||||||
{
|
{
|
||||||
*aReturn = nsnull;
|
return nsDocument::RemoveChild(aOldChild, aReturn);
|
||||||
return NS_OK;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
NS_IMETHODIMP
|
NS_IMETHODIMP
|
||||||
nsHTMLDocument::AppendChild(nsIDOMNode* aNewChild, nsIDOMNode** aReturn)
|
nsHTMLDocument::AppendChild(nsIDOMNode* aNewChild, nsIDOMNode** aReturn)
|
||||||
{
|
{
|
||||||
*aReturn = nsnull;
|
return nsDocument::AppendChild(aNewChild, aReturn);
|
||||||
return NS_OK;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
NS_IMETHODIMP
|
NS_IMETHODIMP
|
||||||
nsHTMLDocument::HasChildNodes(PRBool* aReturn)
|
nsHTMLDocument::HasChildNodes(PRBool* aReturn)
|
||||||
{
|
{
|
||||||
*aReturn = PR_TRUE;
|
return nsDocument::HasChildNodes(aReturn);
|
||||||
return NS_OK;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
NS_IMETHODIMP
|
NS_IMETHODIMP
|
||||||
|
|
|
@ -1068,7 +1068,8 @@ static PRBool SelectorMatches(nsIPresContext* aPresContext,
|
||||||
nsIAtom* tag;
|
nsIAtom* tag;
|
||||||
firstChild->GetTag(tag);
|
firstChild->GetTag(tag);
|
||||||
if ((tag != nsLayoutAtoms::textTagName) &&
|
if ((tag != nsLayoutAtoms::textTagName) &&
|
||||||
(tag != nsLayoutAtoms::commentTagName)) {
|
(tag != nsLayoutAtoms::commentTagName) &&
|
||||||
|
(tag != nsLayoutAtoms::processingInstructionTagName)) {
|
||||||
NS_IF_RELEASE(tag);
|
NS_IF_RELEASE(tag);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
|
@ -232,6 +232,7 @@ public:
|
||||||
static nsIAtom* placeholderPseudo;
|
static nsIAtom* placeholderPseudo;
|
||||||
static nsIAtom* pointSize;
|
static nsIAtom* pointSize;
|
||||||
static nsIAtom* pre;
|
static nsIAtom* pre;
|
||||||
|
static nsIAtom* processingInstructionPseudo;
|
||||||
static nsIAtom* profile;
|
static nsIAtom* profile;
|
||||||
static nsIAtom* prompt;
|
static nsIAtom* prompt;
|
||||||
|
|
||||||
|
|
|
@ -60,6 +60,7 @@ public:
|
||||||
// Alphabetical list of pseudo tag names for non-element content
|
// Alphabetical list of pseudo tag names for non-element content
|
||||||
static nsIAtom* commentTagName;
|
static nsIAtom* commentTagName;
|
||||||
static nsIAtom* textTagName;
|
static nsIAtom* textTagName;
|
||||||
|
static nsIAtom* processingInstructionTagName;
|
||||||
static nsIAtom* viewportPseudo;
|
static nsIAtom* viewportPseudo;
|
||||||
static nsIAtom* pagePseudo;
|
static nsIAtom* pagePseudo;
|
||||||
|
|
||||||
|
|
|
@ -200,6 +200,7 @@ nsIAtom* nsHTMLAtoms::param;
|
||||||
nsIAtom* nsHTMLAtoms::placeholderPseudo;
|
nsIAtom* nsHTMLAtoms::placeholderPseudo;
|
||||||
nsIAtom* nsHTMLAtoms::pointSize;
|
nsIAtom* nsHTMLAtoms::pointSize;
|
||||||
nsIAtom* nsHTMLAtoms::pre;
|
nsIAtom* nsHTMLAtoms::pre;
|
||||||
|
nsIAtom* nsHTMLAtoms::processingInstructionPseudo;
|
||||||
nsIAtom* nsHTMLAtoms::profile;
|
nsIAtom* nsHTMLAtoms::profile;
|
||||||
nsIAtom* nsHTMLAtoms::prompt;
|
nsIAtom* nsHTMLAtoms::prompt;
|
||||||
nsIAtom* nsHTMLAtoms::readonly;
|
nsIAtom* nsHTMLAtoms::readonly;
|
||||||
|
@ -457,6 +458,7 @@ void nsHTMLAtoms::AddrefAtoms()
|
||||||
placeholderPseudo = NS_NewAtom(":placeholder-frame");
|
placeholderPseudo = NS_NewAtom(":placeholder-frame");
|
||||||
pointSize = NS_NewAtom("point-size");
|
pointSize = NS_NewAtom("point-size");
|
||||||
pre = NS_NewAtom("pre");
|
pre = NS_NewAtom("pre");
|
||||||
|
processingInstructionPseudo = NS_NewAtom(":-moz-pi");
|
||||||
profile = NS_NewAtom("profile");
|
profile = NS_NewAtom("profile");
|
||||||
prompt = NS_NewAtom("prompt");
|
prompt = NS_NewAtom("prompt");
|
||||||
readonly = NS_NewAtom("readonly");
|
readonly = NS_NewAtom("readonly");
|
||||||
|
@ -706,6 +708,7 @@ void nsHTMLAtoms::ReleaseAtoms()
|
||||||
NS_RELEASE(placeholderPseudo);
|
NS_RELEASE(placeholderPseudo);
|
||||||
NS_RELEASE(pointSize);
|
NS_RELEASE(pointSize);
|
||||||
NS_RELEASE(pre);
|
NS_RELEASE(pre);
|
||||||
|
NS_RELEASE(processingInstructionPseudo);
|
||||||
NS_RELEASE(profile);
|
NS_RELEASE(profile);
|
||||||
NS_RELEASE(prompt);
|
NS_RELEASE(prompt);
|
||||||
NS_RELEASE(readonly);
|
NS_RELEASE(readonly);
|
||||||
|
|
|
@ -46,6 +46,7 @@ nsIAtom* nsLayoutAtoms::floaterList;
|
||||||
// pseudo tag names for non-element content
|
// pseudo tag names for non-element content
|
||||||
nsIAtom* nsLayoutAtoms::commentTagName;
|
nsIAtom* nsLayoutAtoms::commentTagName;
|
||||||
nsIAtom* nsLayoutAtoms::textTagName;
|
nsIAtom* nsLayoutAtoms::textTagName;
|
||||||
|
nsIAtom* nsLayoutAtoms::processingInstructionTagName;
|
||||||
nsIAtom* nsLayoutAtoms::viewportPseudo;
|
nsIAtom* nsLayoutAtoms::viewportPseudo;
|
||||||
nsIAtom* nsLayoutAtoms::pagePseudo;
|
nsIAtom* nsLayoutAtoms::pagePseudo;
|
||||||
|
|
||||||
|
@ -90,6 +91,7 @@ void nsLayoutAtoms::AddrefAtoms()
|
||||||
|
|
||||||
commentTagName = NS_NewAtom("__moz_comment");
|
commentTagName = NS_NewAtom("__moz_comment");
|
||||||
textTagName = NS_NewAtom("__moz_text");
|
textTagName = NS_NewAtom("__moz_text");
|
||||||
|
processingInstructionTagName = NS_NewAtom("__moz_pi");
|
||||||
viewportPseudo = NS_NewAtom(":-moz-viewport");
|
viewportPseudo = NS_NewAtom(":-moz-viewport");
|
||||||
pagePseudo = NS_NewAtom(":-moz-page");
|
pagePseudo = NS_NewAtom(":-moz-page");
|
||||||
|
|
||||||
|
@ -135,6 +137,7 @@ void nsLayoutAtoms::ReleaseAtoms()
|
||||||
|
|
||||||
NS_RELEASE(commentTagName);
|
NS_RELEASE(commentTagName);
|
||||||
NS_RELEASE(textTagName);
|
NS_RELEASE(textTagName);
|
||||||
|
NS_RELEASE(processingInstructionTagName);
|
||||||
NS_RELEASE(viewportPseudo);
|
NS_RELEASE(viewportPseudo);
|
||||||
NS_RELEASE(pagePseudo);
|
NS_RELEASE(pagePseudo);
|
||||||
|
|
||||||
|
|
|
@ -46,4 +46,13 @@ public:
|
||||||
extern nsresult
|
extern nsresult
|
||||||
NS_NewXMLElement(nsIXMLContent** aResult, nsIAtom* aTag);
|
NS_NewXMLElement(nsIXMLContent** aResult, nsIAtom* aTag);
|
||||||
|
|
||||||
|
// XXX These belongs elsewhere
|
||||||
|
extern nsresult
|
||||||
|
NS_NewXMLProcessingInstruction(nsIContent** aInstancePtrResult,
|
||||||
|
const nsString& aTarget,
|
||||||
|
const nsString& aData);
|
||||||
|
|
||||||
|
extern nsresult
|
||||||
|
NS_NewXMLCDATASection(nsIContent** aInstancePtrResult);
|
||||||
|
|
||||||
#endif // nsIXMLContent_h___
|
#endif // nsIXMLContent_h___
|
||||||
|
|
|
@ -40,6 +40,8 @@ INCLUDES += \
|
||||||
CPPSRCS = \
|
CPPSRCS = \
|
||||||
nsXMLElement.cpp \
|
nsXMLElement.cpp \
|
||||||
nsGenericXMLElement.cpp \
|
nsGenericXMLElement.cpp \
|
||||||
|
nsXMLCDATASection.cpp \
|
||||||
|
nsXMLProcessingInstruction.cpp \
|
||||||
$(NULL)
|
$(NULL)
|
||||||
|
|
||||||
EXPORTS = \
|
EXPORTS = \
|
||||||
|
|
|
@ -26,11 +26,15 @@ DEFINES=-D_IMPL_NS_HTML -DWIN32_LEAN_AND_MEAN
|
||||||
CPPSRCS= \
|
CPPSRCS= \
|
||||||
nsXMLElement.cpp \
|
nsXMLElement.cpp \
|
||||||
nsGenericXMLElement.cpp \
|
nsGenericXMLElement.cpp \
|
||||||
|
nsXMLCDATASection.cpp \
|
||||||
|
nsXMLProcessingInstruction.cpp \
|
||||||
$(NULL)
|
$(NULL)
|
||||||
|
|
||||||
CPP_OBJS= \
|
CPP_OBJS= \
|
||||||
.\$(OBJDIR)\nsXMLElement.obj \
|
.\$(OBJDIR)\nsXMLElement.obj \
|
||||||
.\$(OBJDIR)\nsGenericXMLElement.obj \
|
.\$(OBJDIR)\nsGenericXMLElement.obj \
|
||||||
|
.\$(OBJDIR)\nsXMLCDATASection.obj \
|
||||||
|
.\$(OBJDIR)\nsXMLProcessingInstruction.obj \
|
||||||
$(NULL)
|
$(NULL)
|
||||||
|
|
||||||
EXPORTS = \
|
EXPORTS = \
|
||||||
|
|
|
@ -0,0 +1,195 @@
|
||||||
|
/* -*- 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.0 (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 Communicator client 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.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "nsIDOMCDATASection.h"
|
||||||
|
#include "nsIScriptObjectOwner.h"
|
||||||
|
#include "nsIDOMEventReceiver.h"
|
||||||
|
#include "nsIContent.h"
|
||||||
|
#include "nsITextContent.h"
|
||||||
|
#include "nsGenericDOMDataNode.h"
|
||||||
|
#include "nsFrame.h"
|
||||||
|
#include "nsIDocument.h"
|
||||||
|
#include "nsCRT.h"
|
||||||
|
#include "nsLayoutAtoms.h"
|
||||||
|
#include "nsIXMLContent.h"
|
||||||
|
|
||||||
|
static NS_DEFINE_IID(kIDOMCDATASectionIID, NS_IDOMCDATASECTION_IID);
|
||||||
|
static NS_DEFINE_IID(kIDOMTextIID, NS_IDOMTEXT_IID);
|
||||||
|
static NS_DEFINE_IID(kITextContentIID, NS_ITEXT_CONTENT_IID);
|
||||||
|
|
||||||
|
class nsXMLCDATASection : public nsIDOMCDATASection,
|
||||||
|
public nsIScriptObjectOwner,
|
||||||
|
public nsIDOMEventReceiver,
|
||||||
|
public nsIContent,
|
||||||
|
public nsITextContent
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
nsXMLCDATASection();
|
||||||
|
virtual ~nsXMLCDATASection();
|
||||||
|
|
||||||
|
// nsISupports
|
||||||
|
NS_DECL_ISUPPORTS
|
||||||
|
|
||||||
|
// nsIDOMNode
|
||||||
|
NS_IMPL_IDOMNODE_USING_GENERIC_DOM_DATA(mInner)
|
||||||
|
|
||||||
|
// nsIDOMCharacterData
|
||||||
|
NS_IMPL_IDOMCHARACTERDATA_USING_GENERIC_DOM_DATA(mInner)
|
||||||
|
|
||||||
|
// nsIDOMText
|
||||||
|
NS_IMPL_IDOMTEXT_USING_GENERIC_DOM_DATA(mInner)
|
||||||
|
|
||||||
|
// nsIScriptObjectOwner
|
||||||
|
NS_IMPL_ISCRIPTOBJECTOWNER_USING_GENERIC_DOM_DATA(mInner)
|
||||||
|
|
||||||
|
// nsIDOMEventReceiver
|
||||||
|
NS_IMPL_IDOMEVENTRECEIVER_USING_GENERIC_DOM_DATA(mInner)
|
||||||
|
|
||||||
|
// nsIContent
|
||||||
|
NS_IMPL_ICONTENT_USING_GENERIC_DOM_DATA(mInner)
|
||||||
|
|
||||||
|
// nsITextContent
|
||||||
|
NS_IMPL_ITEXTCONTENT_USING_GENERIC_DOM_DATA(mInner)
|
||||||
|
|
||||||
|
protected:
|
||||||
|
nsGenericDOMDataNode mInner;
|
||||||
|
};
|
||||||
|
|
||||||
|
nsresult
|
||||||
|
NS_NewXMLCDATASection(nsIContent** aInstancePtrResult)
|
||||||
|
{
|
||||||
|
NS_PRECONDITION(nsnull != aInstancePtrResult, "null ptr");
|
||||||
|
if (nsnull == aInstancePtrResult) {
|
||||||
|
return NS_ERROR_NULL_POINTER;
|
||||||
|
}
|
||||||
|
nsIContent* it = new nsXMLCDATASection();
|
||||||
|
if (nsnull == it) {
|
||||||
|
return NS_ERROR_OUT_OF_MEMORY;
|
||||||
|
}
|
||||||
|
return it->QueryInterface(kIContentIID, (void **) aInstancePtrResult);
|
||||||
|
}
|
||||||
|
|
||||||
|
nsXMLCDATASection::nsXMLCDATASection()
|
||||||
|
{
|
||||||
|
NS_INIT_REFCNT();
|
||||||
|
mInner.Init(this);
|
||||||
|
}
|
||||||
|
|
||||||
|
nsXMLCDATASection::~nsXMLCDATASection()
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
NS_IMPL_ADDREF(nsXMLCDATASection)
|
||||||
|
NS_IMPL_RELEASE(nsXMLCDATASection)
|
||||||
|
|
||||||
|
NS_IMETHODIMP
|
||||||
|
nsXMLCDATASection::QueryInterface(REFNSIID aIID, void** aInstancePtr)
|
||||||
|
{
|
||||||
|
NS_IMPL_DOM_DATA_QUERY_INTERFACE(aIID, aInstancePtr, this)
|
||||||
|
if (aIID.Equals(kIDOMCDATASectionIID)) {
|
||||||
|
nsIDOMCDATASection* tmp = this;
|
||||||
|
*aInstancePtr = (void*) tmp;
|
||||||
|
NS_ADDREF_THIS();
|
||||||
|
return NS_OK;
|
||||||
|
}
|
||||||
|
if (aIID.Equals(kIDOMTextIID)) {
|
||||||
|
nsIDOMText* tmp = this;
|
||||||
|
*aInstancePtr = (void*) tmp;
|
||||||
|
NS_ADDREF_THIS();
|
||||||
|
return NS_OK;
|
||||||
|
}
|
||||||
|
if (aIID.Equals(kITextContentIID)) {
|
||||||
|
nsITextContent* tmp = this;
|
||||||
|
*aInstancePtr = (void*) tmp;
|
||||||
|
NS_ADDREF_THIS();
|
||||||
|
return NS_OK;
|
||||||
|
}
|
||||||
|
return NS_NOINTERFACE;
|
||||||
|
}
|
||||||
|
|
||||||
|
NS_IMETHODIMP
|
||||||
|
nsXMLCDATASection::GetTag(nsIAtom*& aResult) const
|
||||||
|
{
|
||||||
|
aResult = nsLayoutAtoms::textTagName;
|
||||||
|
NS_ADDREF(aResult);
|
||||||
|
return NS_OK;
|
||||||
|
}
|
||||||
|
|
||||||
|
NS_IMETHODIMP
|
||||||
|
nsXMLCDATASection::GetNodeName(nsString& aNodeName)
|
||||||
|
{
|
||||||
|
aNodeName.SetString("#cdata-section");
|
||||||
|
return NS_OK;
|
||||||
|
}
|
||||||
|
|
||||||
|
NS_IMETHODIMP
|
||||||
|
nsXMLCDATASection::GetNodeType(PRUint16* aNodeType)
|
||||||
|
{
|
||||||
|
*aNodeType = (PRUint16)nsIDOMNode::CDATA_SECTION_NODE;
|
||||||
|
return NS_OK;
|
||||||
|
}
|
||||||
|
|
||||||
|
NS_IMETHODIMP
|
||||||
|
nsXMLCDATASection::CloneNode(PRBool aDeep, nsIDOMNode** aReturn)
|
||||||
|
{
|
||||||
|
nsXMLCDATASection* it;
|
||||||
|
NS_NEWXPCOM(it, nsXMLCDATASection);
|
||||||
|
if (nsnull == it) {
|
||||||
|
return NS_ERROR_OUT_OF_MEMORY;
|
||||||
|
}
|
||||||
|
nsAutoString data;
|
||||||
|
nsresult result = GetData(data);
|
||||||
|
if (NS_FAILED(result)) {
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
result = it->SetData(data);
|
||||||
|
if (NS_FAILED(result)) {
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
return it->QueryInterface(kIDOMNodeIID, (void**) aReturn);
|
||||||
|
}
|
||||||
|
|
||||||
|
NS_IMETHODIMP
|
||||||
|
nsXMLCDATASection::List(FILE* out, PRInt32 aIndent) const
|
||||||
|
{
|
||||||
|
NS_PRECONDITION(nsnull != mInner.mDocument, "bad content");
|
||||||
|
|
||||||
|
PRInt32 index;
|
||||||
|
for (index = aIndent; --index >= 0; ) fputs(" ", out);
|
||||||
|
|
||||||
|
fprintf(out, "CDATASection refcount=%d<", mRefCnt);
|
||||||
|
|
||||||
|
nsAutoString tmp;
|
||||||
|
mInner.ToCString(tmp, 0, mInner.mText.GetLength());
|
||||||
|
fputs(tmp, out);
|
||||||
|
|
||||||
|
fputs(">\n", out);
|
||||||
|
return NS_OK;
|
||||||
|
}
|
||||||
|
|
||||||
|
NS_IMETHODIMP
|
||||||
|
nsXMLCDATASection::HandleDOMEvent(nsIPresContext& aPresContext,
|
||||||
|
nsEvent* aEvent,
|
||||||
|
nsIDOMEvent** aDOMEvent,
|
||||||
|
PRUint32 aFlags,
|
||||||
|
nsEventStatus& aEventStatus)
|
||||||
|
{
|
||||||
|
return mInner.HandleDOMEvent(aPresContext, aEvent, aDOMEvent,
|
||||||
|
aFlags, aEventStatus);
|
||||||
|
}
|
|
@ -0,0 +1,275 @@
|
||||||
|
/* -*- 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.0 (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 Communicator client 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.
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
#include "nsIDOMProcessingInstruction.h"
|
||||||
|
#include "nsIScriptObjectOwner.h"
|
||||||
|
#include "nsIDOMEventReceiver.h"
|
||||||
|
#include "nsIContent.h"
|
||||||
|
#include "nsGenericDOMDataNode.h"
|
||||||
|
#include "nsGenericElement.h"
|
||||||
|
#include "nsIDOMScriptObjectFactory.h"
|
||||||
|
#include "nsLayoutAtoms.h"
|
||||||
|
#include "nsString.h"
|
||||||
|
#include "nsIXMLContent.h"
|
||||||
|
|
||||||
|
static NS_DEFINE_IID(kIDOMProcessingInstructionIID, NS_IDOMPROCESSINGINSTRUCTION_IID);
|
||||||
|
|
||||||
|
class nsXMLProcessingInstruction : public nsIDOMProcessingInstruction,
|
||||||
|
public nsIScriptObjectOwner,
|
||||||
|
public nsIDOMEventReceiver,
|
||||||
|
public nsIContent
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
nsXMLProcessingInstruction(const nsString& aTarget, const nsString& aData);
|
||||||
|
virtual ~nsXMLProcessingInstruction();
|
||||||
|
|
||||||
|
// nsISupports
|
||||||
|
NS_DECL_ISUPPORTS
|
||||||
|
|
||||||
|
// nsIDOMNode
|
||||||
|
NS_IMPL_IDOMNODE_USING_GENERIC_DOM_DATA(mInner)
|
||||||
|
|
||||||
|
// nsIDOMProcessingInstruction
|
||||||
|
NS_IMETHOD GetTarget(nsString& aTarget);
|
||||||
|
NS_IMETHOD GetData(nsString& aData);
|
||||||
|
NS_IMETHOD SetData(const nsString& aData);
|
||||||
|
|
||||||
|
// nsIScriptObjectOwner interface
|
||||||
|
NS_IMETHOD GetScriptObject(nsIScriptContext* aContext, void** aScriptObject);
|
||||||
|
NS_IMETHOD SetScriptObject(void *aScriptObject);
|
||||||
|
|
||||||
|
// nsIDOMEventReceiver
|
||||||
|
NS_IMPL_IDOMEVENTRECEIVER_USING_GENERIC_DOM_DATA(mInner)
|
||||||
|
|
||||||
|
// nsIContent
|
||||||
|
NS_IMPL_ICONTENT_USING_GENERIC_DOM_DATA(mInner)
|
||||||
|
|
||||||
|
protected:
|
||||||
|
// XXX Processing instructions are currently implemented by using
|
||||||
|
// the generic CharacterData inner object, even though PIs are not
|
||||||
|
// character data. This is done simply for convenience and should
|
||||||
|
// be changed if this restricts what should be done for character data.
|
||||||
|
nsGenericDOMDataNode mInner;
|
||||||
|
nsString mTarget;
|
||||||
|
void* mScriptObject;
|
||||||
|
};
|
||||||
|
|
||||||
|
nsresult
|
||||||
|
NS_NewXMLProcessingInstruction(nsIContent** aInstancePtrResult,
|
||||||
|
const nsString& aTarget,
|
||||||
|
const nsString& aData)
|
||||||
|
{
|
||||||
|
NS_PRECONDITION(nsnull != aInstancePtrResult, "null ptr");
|
||||||
|
if (nsnull == aInstancePtrResult) {
|
||||||
|
return NS_ERROR_NULL_POINTER;
|
||||||
|
}
|
||||||
|
nsIContent* it = new nsXMLProcessingInstruction(aTarget, aData);
|
||||||
|
if (nsnull == it) {
|
||||||
|
return NS_ERROR_OUT_OF_MEMORY;
|
||||||
|
}
|
||||||
|
return it->QueryInterface(kIContentIID, (void **) aInstancePtrResult);
|
||||||
|
}
|
||||||
|
|
||||||
|
nsXMLProcessingInstruction::nsXMLProcessingInstruction(const nsString& aTarget,
|
||||||
|
const nsString& aData) :
|
||||||
|
mTarget(aTarget)
|
||||||
|
{
|
||||||
|
NS_INIT_REFCNT();
|
||||||
|
mInner.Init(this);
|
||||||
|
mInner.SetData(aData);
|
||||||
|
mScriptObject = nsnull;
|
||||||
|
}
|
||||||
|
|
||||||
|
nsXMLProcessingInstruction::~nsXMLProcessingInstruction()
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
NS_IMPL_ADDREF(nsXMLProcessingInstruction)
|
||||||
|
NS_IMPL_RELEASE(nsXMLProcessingInstruction)
|
||||||
|
|
||||||
|
nsresult
|
||||||
|
nsXMLProcessingInstruction::QueryInterface(REFNSIID aIID, void** aInstancePtrResult)
|
||||||
|
{
|
||||||
|
if (NULL == aInstancePtrResult) {
|
||||||
|
return NS_ERROR_NULL_POINTER;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (aIID.Equals(kISupportsIID)) {
|
||||||
|
nsIDOMProcessingInstruction* tmp = this;
|
||||||
|
nsISupports* tmp2 = tmp;
|
||||||
|
*aInstancePtrResult = (void*) tmp2;
|
||||||
|
NS_ADDREF_THIS();
|
||||||
|
return NS_OK;
|
||||||
|
}
|
||||||
|
if (aIID.Equals(kIDOMNodeIID)) {
|
||||||
|
nsIDOMNode* tmp = this;
|
||||||
|
*aInstancePtrResult = (void*) tmp;
|
||||||
|
NS_ADDREF_THIS();
|
||||||
|
return NS_OK;
|
||||||
|
}
|
||||||
|
if (aIID.Equals(kIDOMEventReceiverIID)) {
|
||||||
|
nsIDOMEventReceiver* tmp = this;
|
||||||
|
*aInstancePtrResult = (void*) tmp;
|
||||||
|
NS_ADDREF_THIS();
|
||||||
|
return NS_OK;
|
||||||
|
}
|
||||||
|
if (aIID.Equals(kIScriptObjectOwnerIID)) {
|
||||||
|
nsIScriptObjectOwner* tmp = this;
|
||||||
|
*aInstancePtrResult = (void*) tmp;
|
||||||
|
NS_ADDREF_THIS();
|
||||||
|
return NS_OK;
|
||||||
|
}
|
||||||
|
if (aIID.Equals(kIContentIID)) {
|
||||||
|
nsIContent* tmp = this;
|
||||||
|
*aInstancePtrResult = (void*) tmp;
|
||||||
|
NS_ADDREF_THIS();
|
||||||
|
return NS_OK;
|
||||||
|
}
|
||||||
|
if (aIID.Equals(kIDOMProcessingInstructionIID)) {
|
||||||
|
nsIDOMProcessingInstruction* tmp = this;
|
||||||
|
*aInstancePtrResult = (void*) tmp;
|
||||||
|
NS_ADDREF_THIS();
|
||||||
|
return NS_OK;
|
||||||
|
}
|
||||||
|
return NS_NOINTERFACE;
|
||||||
|
}
|
||||||
|
|
||||||
|
NS_IMETHODIMP
|
||||||
|
nsXMLProcessingInstruction::GetTarget(nsString& aTarget)
|
||||||
|
{
|
||||||
|
aTarget.SetString(mTarget);
|
||||||
|
|
||||||
|
return NS_OK;
|
||||||
|
}
|
||||||
|
|
||||||
|
NS_IMETHODIMP
|
||||||
|
nsXMLProcessingInstruction::GetData(nsString& aData)
|
||||||
|
{
|
||||||
|
return mInner.GetData(aData);
|
||||||
|
}
|
||||||
|
|
||||||
|
NS_IMETHODIMP
|
||||||
|
nsXMLProcessingInstruction::SetData(const nsString& aData)
|
||||||
|
{
|
||||||
|
// XXX Check if this is a stylesheet PI. If so, we may need
|
||||||
|
// to parse the contents and see if anything has changed.
|
||||||
|
return mInner.SetData(aData);
|
||||||
|
}
|
||||||
|
|
||||||
|
NS_IMETHODIMP
|
||||||
|
nsXMLProcessingInstruction::GetScriptObject(nsIScriptContext* aContext,
|
||||||
|
void** aScriptObject)
|
||||||
|
{
|
||||||
|
nsresult res = NS_OK;
|
||||||
|
if (nsnull == mScriptObject) {
|
||||||
|
nsIDOMScriptObjectFactory *factory;
|
||||||
|
|
||||||
|
res = nsGenericElement::GetScriptObjectFactory(&factory);
|
||||||
|
if (NS_OK != res) {
|
||||||
|
return res;
|
||||||
|
}
|
||||||
|
|
||||||
|
res = factory->NewScriptProcessingInstruction(aContext,
|
||||||
|
(nsISupports*)(nsIDOMProcessingInstruction*)this,
|
||||||
|
mInner.mParent,
|
||||||
|
(void**)&mScriptObject);
|
||||||
|
|
||||||
|
NS_RELEASE(factory);
|
||||||
|
}
|
||||||
|
*aScriptObject = mScriptObject;
|
||||||
|
return res;
|
||||||
|
}
|
||||||
|
|
||||||
|
NS_IMETHODIMP
|
||||||
|
nsXMLProcessingInstruction::SetScriptObject(void *aScriptObject)
|
||||||
|
{
|
||||||
|
mScriptObject = aScriptObject;
|
||||||
|
return NS_OK;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
NS_IMETHODIMP
|
||||||
|
nsXMLProcessingInstruction::GetTag(nsIAtom*& aResult) const
|
||||||
|
{
|
||||||
|
aResult = nsLayoutAtoms::processingInstructionTagName;
|
||||||
|
NS_ADDREF(aResult);
|
||||||
|
return NS_OK;
|
||||||
|
}
|
||||||
|
|
||||||
|
NS_IMETHODIMP
|
||||||
|
nsXMLProcessingInstruction::GetNodeName(nsString& aNodeName)
|
||||||
|
{
|
||||||
|
aNodeName.SetString(mTarget);
|
||||||
|
return NS_OK;
|
||||||
|
}
|
||||||
|
|
||||||
|
NS_IMETHODIMP
|
||||||
|
nsXMLProcessingInstruction::GetNodeType(PRUint16* aNodeType)
|
||||||
|
{
|
||||||
|
*aNodeType = (PRUint16)nsIDOMNode::PROCESSING_INSTRUCTION_NODE;
|
||||||
|
return NS_OK;
|
||||||
|
}
|
||||||
|
|
||||||
|
NS_IMETHODIMP
|
||||||
|
nsXMLProcessingInstruction::CloneNode(PRBool aDeep, nsIDOMNode** aReturn)
|
||||||
|
{
|
||||||
|
nsString data;
|
||||||
|
mInner.GetData(data);
|
||||||
|
|
||||||
|
nsXMLProcessingInstruction* it = new nsXMLProcessingInstruction(mTarget,
|
||||||
|
data);
|
||||||
|
if (nsnull == it) {
|
||||||
|
return NS_ERROR_OUT_OF_MEMORY;
|
||||||
|
}
|
||||||
|
return it->QueryInterface(kIDOMNodeIID, (void**) aReturn);
|
||||||
|
}
|
||||||
|
|
||||||
|
NS_IMETHODIMP
|
||||||
|
nsXMLProcessingInstruction::List(FILE* out, PRInt32 aIndent) const
|
||||||
|
{
|
||||||
|
NS_PRECONDITION(nsnull != mInner.mDocument, "bad content");
|
||||||
|
|
||||||
|
PRInt32 index;
|
||||||
|
for (index = aIndent; --index >= 0; ) fputs(" ", out);
|
||||||
|
|
||||||
|
fprintf(out, "Processing instruction refcount=%d<", mRefCnt);
|
||||||
|
|
||||||
|
nsAutoString tmp;
|
||||||
|
mInner.ToCString(tmp, 0, mInner.mText.GetLength());
|
||||||
|
tmp.Insert(mTarget, 0);
|
||||||
|
fputs(tmp, out);
|
||||||
|
|
||||||
|
fputs(">\n", out);
|
||||||
|
return NS_OK;
|
||||||
|
}
|
||||||
|
|
||||||
|
NS_IMETHODIMP
|
||||||
|
nsXMLProcessingInstruction::HandleDOMEvent(nsIPresContext& aPresContext,
|
||||||
|
nsEvent* aEvent,
|
||||||
|
nsIDOMEvent** aDOMEvent,
|
||||||
|
PRUint32 aFlags,
|
||||||
|
nsEventStatus& aEventStatus)
|
||||||
|
{
|
||||||
|
// We should never be getting events
|
||||||
|
NS_ASSERTION(0, "event handler called for processing instruction");
|
||||||
|
return mInner.HandleDOMEvent(aPresContext, aEvent, aDOMEvent,
|
||||||
|
aFlags, aEventStatus);
|
||||||
|
}
|
||||||
|
|
|
@ -34,14 +34,6 @@ class nsIAtom;
|
||||||
*/
|
*/
|
||||||
class nsIXMLDocument : public nsISupports {
|
class nsIXMLDocument : public nsISupports {
|
||||||
public:
|
public:
|
||||||
NS_IMETHOD PrologElementAt(PRUint32 aOffset, nsIContent** aContent)=0;
|
|
||||||
NS_IMETHOD PrologCount(PRUint32* aCount)=0;
|
|
||||||
NS_IMETHOD AppendToProlog(nsIContent* aContent)=0;
|
|
||||||
|
|
||||||
NS_IMETHOD EpilogElementAt(PRUint32 aOffset, nsIContent** aContent)=0;
|
|
||||||
NS_IMETHOD EpilogCount(PRUint32* aCount)=0;
|
|
||||||
NS_IMETHOD AppendToEpilog(nsIContent* aContent)=0;
|
|
||||||
|
|
||||||
// XXX This (or a variant thereof) should be in a DOM interface.
|
// XXX This (or a variant thereof) should be in a DOM interface.
|
||||||
// Since it isn't, we add it here temporarily
|
// Since it isn't, we add it here temporarily
|
||||||
NS_IMETHOD GetContentById(const nsString& aName, nsIContent** aContent)=0;
|
NS_IMETHOD GetContentById(const nsString& aName, nsIContent** aContent)=0;
|
||||||
|
|
|
@ -34,6 +34,7 @@
|
||||||
#include "nsIPresShell.h"
|
#include "nsIPresShell.h"
|
||||||
#include "nsIViewManager.h"
|
#include "nsIViewManager.h"
|
||||||
#include "nsIDOMComment.h"
|
#include "nsIDOMComment.h"
|
||||||
|
#include "nsIDOMCDATASection.h"
|
||||||
#include "nsIHTMLContent.h"
|
#include "nsIHTMLContent.h"
|
||||||
#include "nsHTMLEntities.h"
|
#include "nsHTMLEntities.h"
|
||||||
#include "nsHTMLParts.h"
|
#include "nsHTMLParts.h"
|
||||||
|
@ -56,7 +57,7 @@
|
||||||
|
|
||||||
static char kNameSpaceSeparator[] = ":";
|
static char kNameSpaceSeparator[] = ":";
|
||||||
static char kNameSpaceDef[] = "xmlns";
|
static char kNameSpaceDef[] = "xmlns";
|
||||||
static char kStyleSheetPI[] = "<?xml-stylesheet";
|
static char kStyleSheetPI[] = "xml-stylesheet";
|
||||||
static char kCSSType[] = "text/css";
|
static char kCSSType[] = "text/css";
|
||||||
|
|
||||||
#ifdef XSL
|
#ifdef XSL
|
||||||
|
@ -70,6 +71,7 @@ static NS_DEFINE_IID(kIXMLDocumentIID, NS_IXMLDOCUMENT_IID);
|
||||||
static NS_DEFINE_IID(kIDOMCommentIID, NS_IDOMCOMMENT_IID);
|
static NS_DEFINE_IID(kIDOMCommentIID, NS_IDOMCOMMENT_IID);
|
||||||
static NS_DEFINE_IID(kIScrollableViewIID, NS_ISCROLLABLEVIEW_IID);
|
static NS_DEFINE_IID(kIScrollableViewIID, NS_ISCROLLABLEVIEW_IID);
|
||||||
static NS_DEFINE_IID(kIDOMNodeIID, NS_IDOMNODE_IID);
|
static NS_DEFINE_IID(kIDOMNodeIID, NS_IDOMNODE_IID);
|
||||||
|
static NS_DEFINE_IID(kIDOMCDATASectionIID, NS_IDOMCDATASECTION_IID);
|
||||||
|
|
||||||
static void SetTextStringOnTextNode(const nsString& aTextString, nsIContent* aTextNode);
|
static void SetTextStringOnTextNode(const nsString& aTextString, nsIContent* aTextNode);
|
||||||
|
|
||||||
|
@ -704,10 +706,13 @@ nsXMLContentSink::AddLeaf(const nsIParserNode& aNode)
|
||||||
case eToken_text:
|
case eToken_text:
|
||||||
case eToken_whitespace:
|
case eToken_whitespace:
|
||||||
case eToken_newline:
|
case eToken_newline:
|
||||||
case eToken_cdatasection:
|
|
||||||
AddText(aNode.GetText());
|
AddText(aNode.GetText());
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
case eToken_cdatasection:
|
||||||
|
AddCDATASection(aNode);
|
||||||
|
break;
|
||||||
|
|
||||||
case eToken_entity:
|
case eToken_entity:
|
||||||
{
|
{
|
||||||
nsAutoString tmp;
|
nsAutoString tmp;
|
||||||
|
@ -854,15 +859,13 @@ nsXMLContentSink::AddXMLDecl(const nsIParserNode& aNode)
|
||||||
nsresult
|
nsresult
|
||||||
nsXMLContentSink::AddContentAsLeaf(nsIContent *aContent)
|
nsXMLContentSink::AddContentAsLeaf(nsIContent *aContent)
|
||||||
{
|
{
|
||||||
nsIXMLDocument *xmlDoc;
|
nsresult result = NS_OK;
|
||||||
nsresult result = mDocument->QueryInterface(kIXMLDocumentIID,
|
|
||||||
(void **)&xmlDoc);
|
|
||||||
|
|
||||||
if (eXMLContentSinkState_InProlog == mState) {
|
if (eXMLContentSinkState_InProlog == mState) {
|
||||||
result = xmlDoc->AppendToProlog(aContent);
|
result = mDocument->AppendToProlog(aContent);
|
||||||
}
|
}
|
||||||
else if (eXMLContentSinkState_InEpilog == mState) {
|
else if (eXMLContentSinkState_InEpilog == mState) {
|
||||||
result = xmlDoc->AppendToEpilog(aContent);
|
result = mDocument->AppendToEpilog(aContent);
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
nsIContent *parent = GetCurrentContent();
|
nsIContent *parent = GetCurrentContent();
|
||||||
|
@ -872,7 +875,6 @@ nsXMLContentSink::AddContentAsLeaf(nsIContent *aContent)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
NS_RELEASE(xmlDoc);
|
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -903,6 +905,33 @@ nsXMLContentSink::AddComment(const nsIParserNode& aNode)
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
NS_IMETHODIMP
|
||||||
|
nsXMLContentSink::AddCDATASection(const nsIParserNode& aNode)
|
||||||
|
{
|
||||||
|
FlushText();
|
||||||
|
|
||||||
|
nsAutoString text;
|
||||||
|
nsIContent *cdata;
|
||||||
|
nsIDOMCDATASection *domCDATA;
|
||||||
|
nsresult result = NS_OK;
|
||||||
|
|
||||||
|
text = aNode.GetText();
|
||||||
|
result = NS_NewXMLCDATASection(&cdata);
|
||||||
|
if (NS_OK == result) {
|
||||||
|
result = cdata->QueryInterface(kIDOMCDATASectionIID, (void **)&domCDATA);
|
||||||
|
if (NS_OK == result) {
|
||||||
|
domCDATA->AppendData(text);
|
||||||
|
NS_RELEASE(domCDATA);
|
||||||
|
|
||||||
|
cdata->SetDocument(mDocument, PR_FALSE);
|
||||||
|
result = AddContentAsLeaf(cdata);
|
||||||
|
}
|
||||||
|
NS_RELEASE(cdata);
|
||||||
|
}
|
||||||
|
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
// XXX Borrowed from HTMLContentSink. Should be shared.
|
// XXX Borrowed from HTMLContentSink. Should be shared.
|
||||||
NS_IMETHODIMP
|
NS_IMETHODIMP
|
||||||
nsXMLContentSink::LoadStyleSheet(nsIURL* aURL,
|
nsXMLContentSink::LoadStyleSheet(nsIURL* aURL,
|
||||||
|
@ -1088,87 +1117,111 @@ nsXMLContentSink::LoadXSLStyleSheet(const nsIURL* aUrl)
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
static void
|
||||||
|
ParseProcessingInstruction(const nsString& aText,
|
||||||
|
nsString& aTarget,
|
||||||
|
nsString& aData)
|
||||||
|
{
|
||||||
|
PRInt32 offset;
|
||||||
|
|
||||||
|
aTarget.Truncate();
|
||||||
|
aData.Truncate();
|
||||||
|
|
||||||
|
offset = aText.FindCharInSet(" \n\r\t");
|
||||||
|
if (-1 != offset) {
|
||||||
|
aText.Mid(aTarget, 2, offset-2);
|
||||||
|
aText.Mid(aData, offset+1, aText.Length()-offset-3);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
#ifndef XSL
|
#ifndef XSL
|
||||||
NS_IMETHODIMP
|
NS_IMETHODIMP
|
||||||
nsXMLContentSink::AddProcessingInstruction(const nsIParserNode& aNode)
|
nsXMLContentSink::AddProcessingInstruction(const nsIParserNode& aNode)
|
||||||
{
|
{
|
||||||
|
nsresult result = NS_OK;
|
||||||
|
nsAutoString text, target, data;
|
||||||
|
nsIContent* node;
|
||||||
|
|
||||||
FlushText();
|
FlushText();
|
||||||
|
|
||||||
// XXX For now, we don't add the PI to the content model.
|
|
||||||
// We just check for a style sheet PI
|
|
||||||
nsAutoString text, type, href, title, media;
|
|
||||||
PRInt32 offset;
|
|
||||||
nsresult result = NS_OK;
|
|
||||||
|
|
||||||
text = aNode.GetText();
|
text = aNode.GetText();
|
||||||
|
ParseProcessingInstruction(text, target, data);
|
||||||
|
result = NS_NewXMLProcessingInstruction(&node, target, data);
|
||||||
|
if (NS_OK == result) {
|
||||||
|
node->SetDocument(mDocument, PR_FALSE);
|
||||||
|
result = AddContentAsLeaf(node);
|
||||||
|
}
|
||||||
|
|
||||||
offset = text.Find(kStyleSheetPI);
|
if (NS_OK == result) {
|
||||||
// If it's a stylesheet PI...
|
nsAutoString type, href, title, media;
|
||||||
if (0 == offset) {
|
|
||||||
result = GetQuotedAttributeValue(text, "href", href);
|
|
||||||
// If there was an error or there's no href, we can't do
|
|
||||||
// anything with this PI
|
|
||||||
if ((NS_OK != result) || (0 == href.Length())) {
|
|
||||||
return result;
|
|
||||||
}
|
|
||||||
|
|
||||||
result = GetQuotedAttributeValue(text, "type", type);
|
// If it's a stylesheet PI...
|
||||||
if (NS_OK != result) {
|
if (target.EqualsIgnoreCase(kStyleSheetPI)) {
|
||||||
return result;
|
result = GetQuotedAttributeValue(text, "href", href);
|
||||||
}
|
// If there was an error or there's no href, we can't do
|
||||||
result = GetQuotedAttributeValue(text, "title", title);
|
// anything with this PI
|
||||||
if (NS_OK != result) {
|
if ((NS_OK != result) || (0 == href.Length())) {
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
title.CompressWhitespace();
|
|
||||||
result = GetQuotedAttributeValue(text, "media", media);
|
|
||||||
if (NS_OK != result) {
|
|
||||||
return result;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (type.Equals(kCSSType)) {
|
|
||||||
// Use the SRC attribute value to load the URL
|
|
||||||
nsIURL* url = nsnull;
|
|
||||||
nsAutoString absURL;
|
|
||||||
nsIURL* docURL = mDocument->GetDocumentURL();
|
|
||||||
nsIURLGroup* urlGroup;
|
|
||||||
|
|
||||||
result = docURL->GetURLGroup(&urlGroup);
|
result = GetQuotedAttributeValue(text, "type", type);
|
||||||
|
|
||||||
if ((NS_OK == result) && urlGroup) {
|
|
||||||
result = urlGroup->CreateURL(&url, docURL, href, nsnull);
|
|
||||||
NS_RELEASE(urlGroup);
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
result = NS_NewURL(&url, absURL);
|
|
||||||
}
|
|
||||||
NS_RELEASE(docURL);
|
|
||||||
if (NS_OK != result) {
|
if (NS_OK != result) {
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
result = GetQuotedAttributeValue(text, "title", title);
|
||||||
nsAsyncStyleProcessingDataXML* d = new nsAsyncStyleProcessingDataXML;
|
if (NS_OK != result) {
|
||||||
if (nsnull == d) {
|
return result;
|
||||||
return NS_ERROR_OUT_OF_MEMORY;
|
|
||||||
}
|
}
|
||||||
d->mTitle.SetString(title);
|
title.CompressWhitespace();
|
||||||
d->mMedia.SetString(media);
|
result = GetQuotedAttributeValue(text, "media", media);
|
||||||
d->mIsActive = PR_TRUE;
|
if (NS_OK != result) {
|
||||||
d->mURL = url;
|
return result;
|
||||||
NS_ADDREF(url);
|
}
|
||||||
// XXX Need to create PI node
|
|
||||||
d->mElement = nsnull;
|
if (type.Equals(kCSSType)) {
|
||||||
d->mSink = this;
|
// Use the SRC attribute value to load the URL
|
||||||
NS_ADDREF(this);
|
nsIURL* url = nsnull;
|
||||||
|
nsAutoString absURL;
|
||||||
nsIUnicharStreamLoader* loader;
|
nsIURL* docURL = mDocument->GetDocumentURL();
|
||||||
result = NS_NewUnicharStreamLoader(&loader,
|
nsIURLGroup* urlGroup;
|
||||||
url,
|
|
||||||
(nsStreamCompleteFunc)nsDoneLoadingStyle,
|
result = docURL->GetURLGroup(&urlGroup);
|
||||||
(void *)d);
|
|
||||||
NS_RELEASE(url);
|
if ((NS_OK == result) && urlGroup) {
|
||||||
if (NS_OK == result) {
|
result = urlGroup->CreateURL(&url, docURL, href, nsnull);
|
||||||
result = NS_ERROR_HTMLPARSER_BLOCK;
|
NS_RELEASE(urlGroup);
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
result = NS_NewURL(&url, absURL);
|
||||||
|
}
|
||||||
|
NS_RELEASE(docURL);
|
||||||
|
if (NS_OK != result) {
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
nsAsyncStyleProcessingDataXML* d = new nsAsyncStyleProcessingDataXML;
|
||||||
|
if (nsnull == d) {
|
||||||
|
return NS_ERROR_OUT_OF_MEMORY;
|
||||||
|
}
|
||||||
|
d->mTitle.SetString(title);
|
||||||
|
d->mMedia.SetString(media);
|
||||||
|
d->mIsActive = PR_TRUE;
|
||||||
|
d->mURL = url;
|
||||||
|
NS_ADDREF(url);
|
||||||
|
// XXX Need to create PI node
|
||||||
|
d->mElement = nsnull;
|
||||||
|
d->mSink = this;
|
||||||
|
NS_ADDREF(this);
|
||||||
|
|
||||||
|
nsIUnicharStreamLoader* loader;
|
||||||
|
result = NS_NewUnicharStreamLoader(&loader,
|
||||||
|
url,
|
||||||
|
(nsStreamCompleteFunc)nsDoneLoadingStyle,
|
||||||
|
(void *)d);
|
||||||
|
NS_RELEASE(url);
|
||||||
|
if (NS_OK == result) {
|
||||||
|
result = NS_ERROR_HTMLPARSER_BLOCK;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -73,6 +73,7 @@ public:
|
||||||
NS_IMETHOD AddLeaf(const nsIParserNode& aNode);
|
NS_IMETHOD AddLeaf(const nsIParserNode& aNode);
|
||||||
NS_IMETHOD AddComment(const nsIParserNode& aNode);
|
NS_IMETHOD AddComment(const nsIParserNode& aNode);
|
||||||
NS_IMETHOD AddProcessingInstruction(const nsIParserNode& aNode);
|
NS_IMETHOD AddProcessingInstruction(const nsIParserNode& aNode);
|
||||||
|
NS_IMETHOD AddCDATASection(const nsIParserNode& aNode);
|
||||||
NS_IMETHOD NotifyError(const nsParserError* aError);
|
NS_IMETHOD NotifyError(const nsParserError* aError);
|
||||||
|
|
||||||
// nsIXMLContentSink
|
// nsIXMLContentSink
|
||||||
|
|
|
@ -38,6 +38,8 @@
|
||||||
#include "nsIDOMComment.h"
|
#include "nsIDOMComment.h"
|
||||||
#include "nsIDOMElement.h"
|
#include "nsIDOMElement.h"
|
||||||
#include "nsIDOMText.h"
|
#include "nsIDOMText.h"
|
||||||
|
#include "nsIDOMCDATASection.h"
|
||||||
|
#include "nsIDOMProcessingInstruction.h"
|
||||||
#include "nsExpatDTD.h"
|
#include "nsExpatDTD.h"
|
||||||
#include "nsINameSpaceManager.h"
|
#include "nsINameSpaceManager.h"
|
||||||
|
|
||||||
|
@ -57,87 +59,10 @@ static NS_DEFINE_IID(kIDOMTextIID, NS_IDOMTEXT_IID);
|
||||||
static NS_DEFINE_IID(kIHTMLContentContainerIID, NS_IHTMLCONTENTCONTAINER_IID);
|
static NS_DEFINE_IID(kIHTMLContentContainerIID, NS_IHTMLCONTENTCONTAINER_IID);
|
||||||
static NS_DEFINE_IID(kIDOMNodeIID, NS_IDOMNODE_IID);
|
static NS_DEFINE_IID(kIDOMNodeIID, NS_IDOMNODE_IID);
|
||||||
static NS_DEFINE_IID(kIDOMNodeListIID, NS_IDOMNODELIST_IID);
|
static NS_DEFINE_IID(kIDOMNodeListIID, NS_IDOMNODELIST_IID);
|
||||||
|
static NS_DEFINE_IID(kIDOMProcessingInstructionIID, NS_IDOMPROCESSINGINSTRUCTION_IID);
|
||||||
|
static NS_DEFINE_IID(kIDOMCDATASectionIID, NS_IDOMCDATASECTION_IID);
|
||||||
|
static NS_DEFINE_IID(kIContentIID, NS_ICONTENT_IID);
|
||||||
|
|
||||||
// ==================================================================
|
|
||||||
// =
|
|
||||||
// ==================================================================
|
|
||||||
nsXMLDocumentChildNodes::nsXMLDocumentChildNodes(nsXMLDocument* aDocument)
|
|
||||||
{
|
|
||||||
// We don't reference count our document reference (to avoid circular
|
|
||||||
// references). We'll be told when the document goes away.
|
|
||||||
mDocument = aDocument;
|
|
||||||
}
|
|
||||||
|
|
||||||
nsXMLDocumentChildNodes::~nsXMLDocumentChildNodes()
|
|
||||||
{
|
|
||||||
}
|
|
||||||
|
|
||||||
NS_IMETHODIMP
|
|
||||||
nsXMLDocumentChildNodes::GetLength(PRUint32* aLength)
|
|
||||||
{
|
|
||||||
if (nsnull != mDocument) {
|
|
||||||
PRUint32 prolog, epilog;
|
|
||||||
|
|
||||||
// The length is the sum of the prolog, epilog and
|
|
||||||
// document element;
|
|
||||||
mDocument->PrologCount(&prolog);
|
|
||||||
mDocument->EpilogCount(&epilog);
|
|
||||||
*aLength = prolog + epilog + 1;
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
*aLength = 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
return NS_OK;
|
|
||||||
}
|
|
||||||
|
|
||||||
NS_IMETHODIMP
|
|
||||||
nsXMLDocumentChildNodes::Item(PRUint32 aIndex, nsIDOMNode** aReturn)
|
|
||||||
{
|
|
||||||
nsresult result = NS_OK;
|
|
||||||
|
|
||||||
*aReturn = nsnull;
|
|
||||||
if (nsnull != mDocument) {
|
|
||||||
PRUint32 prolog;
|
|
||||||
|
|
||||||
mDocument->PrologCount(&prolog);
|
|
||||||
if (aIndex < prolog) {
|
|
||||||
// It's in the prolog
|
|
||||||
nsIContent* content;
|
|
||||||
result = mDocument->PrologElementAt(aIndex, &content);
|
|
||||||
if ((NS_OK == result) && (nsnull != content)) {
|
|
||||||
result = content->QueryInterface(kIDOMNodeIID, (void**)aReturn);
|
|
||||||
NS_RELEASE(content);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else if (aIndex == prolog) {
|
|
||||||
// It's the document element
|
|
||||||
nsIDOMElement* element;
|
|
||||||
result = mDocument->GetDocumentElement(&element);
|
|
||||||
if (NS_OK == result) {
|
|
||||||
result = element->QueryInterface(kIDOMNodeIID, (void**)aReturn);
|
|
||||||
NS_RELEASE(element);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
// It's in the epilog
|
|
||||||
nsIContent* content;
|
|
||||||
result = mDocument->EpilogElementAt(aIndex-prolog-1, &content);
|
|
||||||
if ((NS_OK == result) && (nsnull != content)) {
|
|
||||||
result = content->QueryInterface(kIDOMNodeIID, (void**)aReturn);
|
|
||||||
NS_RELEASE(content);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return result;
|
|
||||||
}
|
|
||||||
|
|
||||||
void
|
|
||||||
nsXMLDocumentChildNodes::DropReference()
|
|
||||||
{
|
|
||||||
mDocument = nsnull;
|
|
||||||
}
|
|
||||||
|
|
||||||
// ==================================================================
|
// ==================================================================
|
||||||
// =
|
// =
|
||||||
|
@ -155,9 +80,6 @@ nsXMLDocument::nsXMLDocument()
|
||||||
mParser = nsnull;
|
mParser = nsnull;
|
||||||
mAttrStyleSheet = nsnull;
|
mAttrStyleSheet = nsnull;
|
||||||
mInlineStyleSheet = nsnull;
|
mInlineStyleSheet = nsnull;
|
||||||
mProlog = nsnull;
|
|
||||||
mEpilog = nsnull;
|
|
||||||
mChildNodes = nsnull;
|
|
||||||
|
|
||||||
// XXX The XML world depends on the html atoms
|
// XXX The XML world depends on the html atoms
|
||||||
nsHTMLAtoms::AddrefAtoms();
|
nsHTMLAtoms::AddrefAtoms();
|
||||||
|
@ -169,8 +91,6 @@ nsXMLDocument::nsXMLDocument()
|
||||||
|
|
||||||
nsXMLDocument::~nsXMLDocument()
|
nsXMLDocument::~nsXMLDocument()
|
||||||
{
|
{
|
||||||
PRInt32 i, count;
|
|
||||||
nsIContent* content;
|
|
||||||
NS_IF_RELEASE(mParser);
|
NS_IF_RELEASE(mParser);
|
||||||
if (nsnull != mAttrStyleSheet) {
|
if (nsnull != mAttrStyleSheet) {
|
||||||
mAttrStyleSheet->SetOwningDocument(nsnull);
|
mAttrStyleSheet->SetOwningDocument(nsnull);
|
||||||
|
@ -180,23 +100,6 @@ nsXMLDocument::~nsXMLDocument()
|
||||||
mInlineStyleSheet->SetOwningDocument(nsnull);
|
mInlineStyleSheet->SetOwningDocument(nsnull);
|
||||||
NS_RELEASE(mInlineStyleSheet);
|
NS_RELEASE(mInlineStyleSheet);
|
||||||
}
|
}
|
||||||
if (nsnull != mProlog) {
|
|
||||||
count = mProlog->Count();
|
|
||||||
for (i = 0; i < count; i++) {
|
|
||||||
content = (nsIContent*)mProlog->ElementAt(i);
|
|
||||||
NS_RELEASE(content);
|
|
||||||
}
|
|
||||||
delete mProlog;
|
|
||||||
}
|
|
||||||
if (nsnull != mEpilog) {
|
|
||||||
count = mEpilog->Count();
|
|
||||||
for (i = 0; i < count; i++) {
|
|
||||||
content = (nsIContent*)mEpilog->ElementAt(i);
|
|
||||||
NS_RELEASE(content);
|
|
||||||
}
|
|
||||||
delete mEpilog;
|
|
||||||
}
|
|
||||||
NS_IF_RELEASE(mChildNodes);
|
|
||||||
#ifdef INCLUDE_XUL
|
#ifdef INCLUDE_XUL
|
||||||
nsXULAtoms::ReleaseAtoms();
|
nsXULAtoms::ReleaseAtoms();
|
||||||
#endif
|
#endif
|
||||||
|
@ -377,111 +280,6 @@ void nsXMLDocument::InternalAddStyleSheet(nsIStyleSheet* aSheet) // subclass ho
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
// nsIDOMNode interface
|
|
||||||
NS_IMETHODIMP
|
|
||||||
nsXMLDocument::GetChildNodes(nsIDOMNodeList** aChildNodes)
|
|
||||||
{
|
|
||||||
if (nsnull == mChildNodes) {
|
|
||||||
mChildNodes = new nsXMLDocumentChildNodes(this);
|
|
||||||
if (nsnull == mChildNodes) {
|
|
||||||
return NS_ERROR_OUT_OF_MEMORY;
|
|
||||||
}
|
|
||||||
NS_ADDREF(mChildNodes);
|
|
||||||
}
|
|
||||||
|
|
||||||
return mChildNodes->QueryInterface(kIDOMNodeListIID, (void**)aChildNodes);
|
|
||||||
}
|
|
||||||
|
|
||||||
NS_IMETHODIMP
|
|
||||||
nsXMLDocument::GetFirstChild(nsIDOMNode** aFirstChild)
|
|
||||||
{
|
|
||||||
nsresult result = NS_OK;
|
|
||||||
|
|
||||||
if ((nsnull != mProlog) && (0 != mProlog->Count())) {
|
|
||||||
nsIContent* content;
|
|
||||||
result = PrologElementAt(0, &content);
|
|
||||||
if ((NS_OK == result) && (nsnull != content)) {
|
|
||||||
result = content->QueryInterface(kIDOMNodeIID, (void**)aFirstChild);
|
|
||||||
NS_RELEASE(content);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
nsIDOMElement* element;
|
|
||||||
result = GetDocumentElement(&element);
|
|
||||||
if (NS_OK == result) {
|
|
||||||
result = element->QueryInterface(kIDOMNodeIID, (void**)aFirstChild);
|
|
||||||
NS_RELEASE(element);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return result;
|
|
||||||
}
|
|
||||||
|
|
||||||
NS_IMETHODIMP
|
|
||||||
nsXMLDocument::GetLastChild(nsIDOMNode** aLastChild)
|
|
||||||
{
|
|
||||||
nsresult result = NS_OK;
|
|
||||||
|
|
||||||
if ((nsnull != mEpilog) && (0 != mEpilog->Count())) {
|
|
||||||
nsIContent* content;
|
|
||||||
result = EpilogElementAt(mEpilog->Count()-1, &content);
|
|
||||||
if ((NS_OK == result) && (nsnull != content)) {
|
|
||||||
result = content->QueryInterface(kIDOMNodeIID, (void**)aLastChild);
|
|
||||||
NS_RELEASE(content);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
nsIDOMElement* element;
|
|
||||||
result = GetDocumentElement(&element);
|
|
||||||
if (NS_OK == result) {
|
|
||||||
result = element->QueryInterface(kIDOMNodeIID, (void**)aLastChild);
|
|
||||||
NS_RELEASE(element);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return result;
|
|
||||||
}
|
|
||||||
|
|
||||||
NS_IMETHODIMP
|
|
||||||
nsXMLDocument::InsertBefore(nsIDOMNode* aNewChild,
|
|
||||||
nsIDOMNode* aRefChild,
|
|
||||||
nsIDOMNode** aReturn)
|
|
||||||
{
|
|
||||||
// XXX TBI
|
|
||||||
return NS_ERROR_NOT_IMPLEMENTED;
|
|
||||||
}
|
|
||||||
|
|
||||||
NS_IMETHODIMP
|
|
||||||
nsXMLDocument::ReplaceChild(nsIDOMNode* aNewChild,
|
|
||||||
nsIDOMNode* aOldChild,
|
|
||||||
nsIDOMNode** aReturn)
|
|
||||||
{
|
|
||||||
// XXX TBI
|
|
||||||
return NS_ERROR_NOT_IMPLEMENTED;
|
|
||||||
}
|
|
||||||
|
|
||||||
NS_IMETHODIMP
|
|
||||||
nsXMLDocument::RemoveChild(nsIDOMNode* aOldChild, nsIDOMNode** aReturn)
|
|
||||||
{
|
|
||||||
// XXX TBI
|
|
||||||
return NS_ERROR_NOT_IMPLEMENTED;
|
|
||||||
}
|
|
||||||
|
|
||||||
NS_IMETHODIMP
|
|
||||||
nsXMLDocument::AppendChild(nsIDOMNode* aNewChild, nsIDOMNode** aReturn)
|
|
||||||
{
|
|
||||||
// XXX TBI
|
|
||||||
return NS_ERROR_NOT_IMPLEMENTED;
|
|
||||||
}
|
|
||||||
|
|
||||||
NS_IMETHODIMP
|
|
||||||
nsXMLDocument::HasChildNodes(PRBool* aReturn)
|
|
||||||
{
|
|
||||||
*aReturn = PR_TRUE;
|
|
||||||
return NS_OK;
|
|
||||||
}
|
|
||||||
|
|
||||||
// nsIDOMDocument interface
|
// nsIDOMDocument interface
|
||||||
NS_IMETHODIMP
|
NS_IMETHODIMP
|
||||||
nsXMLDocument::GetDoctype(nsIDOMDocumentType** aDocumentType)
|
nsXMLDocument::GetDoctype(nsIDOMDocumentType** aDocumentType)
|
||||||
|
@ -494,25 +292,41 @@ nsXMLDocument::GetDoctype(nsIDOMDocumentType** aDocumentType)
|
||||||
NS_IMETHODIMP
|
NS_IMETHODIMP
|
||||||
nsXMLDocument::CreateCDATASection(const nsString& aData, nsIDOMCDATASection** aReturn)
|
nsXMLDocument::CreateCDATASection(const nsString& aData, nsIDOMCDATASection** aReturn)
|
||||||
{
|
{
|
||||||
// XXX TBI
|
nsIContent* content;
|
||||||
*aReturn = nsnull;
|
nsresult rv = NS_NewXMLCDATASection(&content);
|
||||||
return NS_ERROR_NOT_IMPLEMENTED;
|
|
||||||
|
if (NS_OK == rv) {
|
||||||
|
rv = content->QueryInterface(kIDOMCDATASectionIID, (void**)aReturn);
|
||||||
|
(*aReturn)->AppendData(aData);
|
||||||
|
NS_RELEASE(content);
|
||||||
|
}
|
||||||
|
|
||||||
|
return rv;
|
||||||
}
|
}
|
||||||
|
|
||||||
NS_IMETHODIMP
|
NS_IMETHODIMP
|
||||||
nsXMLDocument::CreateEntityReference(const nsString& aName, nsIDOMEntityReference** aReturn)
|
nsXMLDocument::CreateEntityReference(const nsString& aName, nsIDOMEntityReference** aReturn)
|
||||||
{
|
{
|
||||||
// XXX TBI
|
|
||||||
*aReturn = nsnull;
|
*aReturn = nsnull;
|
||||||
return NS_ERROR_NOT_IMPLEMENTED;
|
return NS_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
NS_IMETHODIMP
|
NS_IMETHODIMP
|
||||||
nsXMLDocument::CreateProcessingInstruction(const nsString& aTarget, const nsString& aData, nsIDOMProcessingInstruction** aReturn)
|
nsXMLDocument::CreateProcessingInstruction(const nsString& aTarget,
|
||||||
|
const nsString& aData,
|
||||||
|
nsIDOMProcessingInstruction** aReturn)
|
||||||
{
|
{
|
||||||
// XXX TBI
|
nsIContent* content;
|
||||||
*aReturn = nsnull;
|
nsresult rv = NS_NewXMLProcessingInstruction(&content, aTarget, aData);
|
||||||
return NS_ERROR_NOT_IMPLEMENTED;
|
|
||||||
|
if (NS_OK != rv) {
|
||||||
|
return rv;
|
||||||
|
}
|
||||||
|
|
||||||
|
rv = content->QueryInterface(kIDOMProcessingInstructionIID, (void**)aReturn);
|
||||||
|
NS_RELEASE(content);
|
||||||
|
|
||||||
|
return rv;
|
||||||
}
|
}
|
||||||
|
|
||||||
static char kNameSpaceSeparator[] = ":";
|
static char kNameSpaceSeparator[] = ":";
|
||||||
|
@ -530,7 +344,8 @@ nsXMLDocument::CreateElement(const nsString& aTagName,
|
||||||
return rv;
|
return rv;
|
||||||
}
|
}
|
||||||
rv = content->QueryInterface(kIDOMElementIID, (void**)aReturn);
|
rv = content->QueryInterface(kIDOMElementIID, (void**)aReturn);
|
||||||
|
NS_RELEASE(content);
|
||||||
|
|
||||||
return rv;
|
return rv;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -576,86 +391,6 @@ nsXMLDocument::CreateElementWithNameSpace(const nsString& aTagName,
|
||||||
|
|
||||||
|
|
||||||
// nsIXMLDocument interface
|
// nsIXMLDocument interface
|
||||||
NS_IMETHODIMP
|
|
||||||
nsXMLDocument::PrologElementAt(PRUint32 aIndex, nsIContent** aContent)
|
|
||||||
{
|
|
||||||
if (nsnull == mProlog) {
|
|
||||||
*aContent = nsnull;
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
*aContent = (nsIContent *)mProlog->ElementAt((PRInt32)aIndex);
|
|
||||||
NS_ADDREF(*aContent);
|
|
||||||
}
|
|
||||||
|
|
||||||
return NS_OK;
|
|
||||||
}
|
|
||||||
|
|
||||||
NS_IMETHODIMP
|
|
||||||
nsXMLDocument::PrologCount(PRUint32* aCount)
|
|
||||||
{
|
|
||||||
if (nsnull == mProlog) {
|
|
||||||
*aCount = 0;
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
*aCount = (PRUint32)mProlog->Count();
|
|
||||||
}
|
|
||||||
|
|
||||||
return NS_OK;
|
|
||||||
}
|
|
||||||
|
|
||||||
NS_IMETHODIMP
|
|
||||||
nsXMLDocument::AppendToProlog(nsIContent* aContent)
|
|
||||||
{
|
|
||||||
if (nsnull == mProlog) {
|
|
||||||
mProlog = new nsVoidArray();
|
|
||||||
}
|
|
||||||
|
|
||||||
mProlog->AppendElement((void *)aContent);
|
|
||||||
NS_ADDREF(aContent);
|
|
||||||
|
|
||||||
return NS_OK;
|
|
||||||
}
|
|
||||||
|
|
||||||
NS_IMETHODIMP
|
|
||||||
nsXMLDocument::EpilogElementAt(PRUint32 aIndex, nsIContent** aContent)
|
|
||||||
{
|
|
||||||
if (nsnull == mEpilog) {
|
|
||||||
*aContent = nsnull;
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
*aContent = (nsIContent *)mEpilog->ElementAt((PRInt32)aIndex);
|
|
||||||
NS_ADDREF(*aContent);
|
|
||||||
}
|
|
||||||
|
|
||||||
return NS_OK;
|
|
||||||
}
|
|
||||||
|
|
||||||
NS_IMETHODIMP
|
|
||||||
nsXMLDocument::EpilogCount(PRUint32* aCount)
|
|
||||||
{
|
|
||||||
if (nsnull == mEpilog) {
|
|
||||||
*aCount = 0;
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
*aCount = (PRUint32)mEpilog->Count();
|
|
||||||
}
|
|
||||||
|
|
||||||
return NS_OK;
|
|
||||||
}
|
|
||||||
|
|
||||||
NS_IMETHODIMP
|
|
||||||
nsXMLDocument::AppendToEpilog(nsIContent* aContent)
|
|
||||||
{
|
|
||||||
if (nsnull == mEpilog) {
|
|
||||||
mEpilog = new nsVoidArray();
|
|
||||||
}
|
|
||||||
|
|
||||||
mEpilog->AppendElement((void *)aContent);
|
|
||||||
NS_ADDREF(aContent);
|
|
||||||
|
|
||||||
return NS_OK;
|
|
||||||
}
|
|
||||||
|
|
||||||
static nsIContent *
|
static nsIContent *
|
||||||
MatchName(nsIContent *aContent, const nsString& aName)
|
MatchName(nsIContent *aContent, const nsString& aName)
|
||||||
{
|
{
|
||||||
|
|
|
@ -23,28 +23,9 @@
|
||||||
#include "nsMarkupDocument.h"
|
#include "nsMarkupDocument.h"
|
||||||
#include "nsIXMLDocument.h"
|
#include "nsIXMLDocument.h"
|
||||||
#include "nsIHTMLContentContainer.h"
|
#include "nsIHTMLContentContainer.h"
|
||||||
#include "nsGenericDOMNodeList.h"
|
|
||||||
|
|
||||||
class nsIParser;
|
class nsIParser;
|
||||||
class nsIDOMNode;
|
class nsIDOMNode;
|
||||||
class nsXMLDocument;
|
|
||||||
|
|
||||||
// Represents the children of an XML document (prolog, epilog and
|
|
||||||
// document element)
|
|
||||||
class nsXMLDocumentChildNodes : public nsGenericDOMNodeList
|
|
||||||
{
|
|
||||||
public:
|
|
||||||
nsXMLDocumentChildNodes(nsXMLDocument* aDocument);
|
|
||||||
~nsXMLDocumentChildNodes();
|
|
||||||
|
|
||||||
NS_IMETHOD GetLength(PRUint32* aLength);
|
|
||||||
NS_IMETHOD Item(PRUint32 aIndex, nsIDOMNode** aReturn);
|
|
||||||
|
|
||||||
void DropReference();
|
|
||||||
|
|
||||||
protected:
|
|
||||||
nsXMLDocument* mDocument;
|
|
||||||
};
|
|
||||||
|
|
||||||
|
|
||||||
class nsXMLDocument : public nsMarkupDocument,
|
class nsXMLDocument : public nsMarkupDocument,
|
||||||
|
@ -67,20 +48,6 @@ public:
|
||||||
|
|
||||||
NS_IMETHOD EndLoad();
|
NS_IMETHOD EndLoad();
|
||||||
|
|
||||||
// nsIDOMNode interface
|
|
||||||
NS_IMETHOD GetChildNodes(nsIDOMNodeList** aChildNodes);
|
|
||||||
NS_IMETHOD GetFirstChild(nsIDOMNode** aFirstChild);
|
|
||||||
NS_IMETHOD GetLastChild(nsIDOMNode** aLastChild);
|
|
||||||
NS_IMETHOD InsertBefore(nsIDOMNode* aNewChild,
|
|
||||||
nsIDOMNode* aRefChild,
|
|
||||||
nsIDOMNode** aReturn);
|
|
||||||
NS_IMETHOD ReplaceChild(nsIDOMNode* aNewChild,
|
|
||||||
nsIDOMNode* aOldChild,
|
|
||||||
nsIDOMNode** aReturn);
|
|
||||||
NS_IMETHOD RemoveChild(nsIDOMNode* aOldChild, nsIDOMNode** aReturn);
|
|
||||||
NS_IMETHOD AppendChild(nsIDOMNode* aNewChild, nsIDOMNode** aReturn);
|
|
||||||
NS_IMETHOD HasChildNodes(PRBool* aReturn);
|
|
||||||
|
|
||||||
// nsIDOMDocument interface
|
// nsIDOMDocument interface
|
||||||
NS_IMETHOD GetDoctype(nsIDOMDocumentType** aDocumentType);
|
NS_IMETHOD GetDoctype(nsIDOMDocumentType** aDocumentType);
|
||||||
NS_IMETHOD CreateCDATASection(const nsString& aData, nsIDOMCDATASection** aReturn);
|
NS_IMETHOD CreateCDATASection(const nsString& aData, nsIDOMCDATASection** aReturn);
|
||||||
|
@ -93,14 +60,6 @@ public:
|
||||||
nsIDOMElement** aReturn);
|
nsIDOMElement** aReturn);
|
||||||
|
|
||||||
// nsIXMLDocument interface
|
// nsIXMLDocument interface
|
||||||
NS_IMETHOD PrologElementAt(PRUint32 aOffset, nsIContent** aContent);
|
|
||||||
NS_IMETHOD PrologCount(PRUint32* aCount);
|
|
||||||
NS_IMETHOD AppendToProlog(nsIContent* aContent);
|
|
||||||
|
|
||||||
NS_IMETHOD EpilogElementAt(PRUint32 aOffset, nsIContent** aContent);
|
|
||||||
NS_IMETHOD EpilogCount(PRUint32* aCount);
|
|
||||||
NS_IMETHOD AppendToEpilog(nsIContent* aContent);
|
|
||||||
|
|
||||||
NS_IMETHOD GetContentById(const nsString& aName, nsIContent** aContent);
|
NS_IMETHOD GetContentById(const nsString& aName, nsIContent** aContent);
|
||||||
|
|
||||||
// nsIHTMLContentContainer
|
// nsIHTMLContentContainer
|
||||||
|
@ -111,16 +70,11 @@ protected:
|
||||||
virtual void InternalAddStyleSheet(nsIStyleSheet* aSheet); // subclass hook for sheet ordering
|
virtual void InternalAddStyleSheet(nsIStyleSheet* aSheet); // subclass hook for sheet ordering
|
||||||
virtual nsresult Reset(nsIURL* aUrl);
|
virtual nsresult Reset(nsIURL* aUrl);
|
||||||
|
|
||||||
|
|
||||||
// For HTML elements in our content model
|
// For HTML elements in our content model
|
||||||
nsIHTMLStyleSheet* mAttrStyleSheet;
|
nsIHTMLStyleSheet* mAttrStyleSheet;
|
||||||
nsIHTMLCSSStyleSheet* mInlineStyleSheet;
|
nsIHTMLCSSStyleSheet* mInlineStyleSheet;
|
||||||
|
|
||||||
nsVoidArray *mProlog;
|
|
||||||
nsVoidArray *mEpilog;
|
|
||||||
|
|
||||||
nsIParser *mParser;
|
nsIParser *mParser;
|
||||||
nsXMLDocumentChildNodes* mChildNodes;
|
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -2962,6 +2962,17 @@ nsCSSFrameConstructor::ResolveStyleContext(nsIPresContext* aPresContext,
|
||||||
parentStyleContext,
|
parentStyleContext,
|
||||||
PR_FALSE,
|
PR_FALSE,
|
||||||
aStyleContext);
|
aStyleContext);
|
||||||
|
} else if (nsLayoutAtoms::processingInstructionTagName == aTag) {
|
||||||
|
// Use a special pseudo element style context for comments
|
||||||
|
nsCOMPtr<nsIContent> parentContent;
|
||||||
|
if (nsnull != aParentFrame) {
|
||||||
|
aParentFrame->GetContent(getter_AddRefs(parentContent));
|
||||||
|
}
|
||||||
|
rv = aPresContext->ResolvePseudoStyleContextFor(parentContent,
|
||||||
|
nsHTMLAtoms::processingInstructionPseudo,
|
||||||
|
parentStyleContext,
|
||||||
|
PR_FALSE,
|
||||||
|
aStyleContext);
|
||||||
} else {
|
} else {
|
||||||
rv = aPresContext->ResolveStyleContextFor(aContent, parentStyleContext,
|
rv = aPresContext->ResolveStyleContextFor(aContent, parentStyleContext,
|
||||||
PR_FALSE,
|
PR_FALSE,
|
||||||
|
@ -3019,6 +3030,17 @@ nsCSSFrameConstructor::ConstructFrame(nsIPresContext* aPresContext,
|
||||||
parentStyleContext,
|
parentStyleContext,
|
||||||
PR_FALSE,
|
PR_FALSE,
|
||||||
getter_AddRefs(styleContext));
|
getter_AddRefs(styleContext));
|
||||||
|
} else if (nsLayoutAtoms::processingInstructionTagName == tag) {
|
||||||
|
// Use a special pseudo element style context for comments
|
||||||
|
nsCOMPtr<nsIContent> parentContent;
|
||||||
|
if (nsnull != aParentFrame) {
|
||||||
|
aParentFrame->GetContent(getter_AddRefs(parentContent));
|
||||||
|
}
|
||||||
|
rv = aPresContext->ResolvePseudoStyleContextFor(parentContent,
|
||||||
|
nsHTMLAtoms::processingInstructionPseudo,
|
||||||
|
parentStyleContext,
|
||||||
|
PR_FALSE,
|
||||||
|
getter_AddRefs(styleContext));
|
||||||
} else {
|
} else {
|
||||||
rv = aPresContext->ResolveStyleContextFor(aContent, parentStyleContext,
|
rv = aPresContext->ResolveStyleContextFor(aContent, parentStyleContext,
|
||||||
PR_FALSE,
|
PR_FALSE,
|
||||||
|
|
|
@ -46,6 +46,7 @@ nsIAtom* nsLayoutAtoms::floaterList;
|
||||||
// pseudo tag names for non-element content
|
// pseudo tag names for non-element content
|
||||||
nsIAtom* nsLayoutAtoms::commentTagName;
|
nsIAtom* nsLayoutAtoms::commentTagName;
|
||||||
nsIAtom* nsLayoutAtoms::textTagName;
|
nsIAtom* nsLayoutAtoms::textTagName;
|
||||||
|
nsIAtom* nsLayoutAtoms::processingInstructionTagName;
|
||||||
nsIAtom* nsLayoutAtoms::viewportPseudo;
|
nsIAtom* nsLayoutAtoms::viewportPseudo;
|
||||||
nsIAtom* nsLayoutAtoms::pagePseudo;
|
nsIAtom* nsLayoutAtoms::pagePseudo;
|
||||||
|
|
||||||
|
@ -90,6 +91,7 @@ void nsLayoutAtoms::AddrefAtoms()
|
||||||
|
|
||||||
commentTagName = NS_NewAtom("__moz_comment");
|
commentTagName = NS_NewAtom("__moz_comment");
|
||||||
textTagName = NS_NewAtom("__moz_text");
|
textTagName = NS_NewAtom("__moz_text");
|
||||||
|
processingInstructionTagName = NS_NewAtom("__moz_pi");
|
||||||
viewportPseudo = NS_NewAtom(":-moz-viewport");
|
viewportPseudo = NS_NewAtom(":-moz-viewport");
|
||||||
pagePseudo = NS_NewAtom(":-moz-page");
|
pagePseudo = NS_NewAtom(":-moz-page");
|
||||||
|
|
||||||
|
@ -135,6 +137,7 @@ void nsLayoutAtoms::ReleaseAtoms()
|
||||||
|
|
||||||
NS_RELEASE(commentTagName);
|
NS_RELEASE(commentTagName);
|
||||||
NS_RELEASE(textTagName);
|
NS_RELEASE(textTagName);
|
||||||
|
NS_RELEASE(processingInstructionTagName);
|
||||||
NS_RELEASE(viewportPseudo);
|
NS_RELEASE(viewportPseudo);
|
||||||
NS_RELEASE(pagePseudo);
|
NS_RELEASE(pagePseudo);
|
||||||
|
|
||||||
|
|
|
@ -60,6 +60,7 @@ public:
|
||||||
// Alphabetical list of pseudo tag names for non-element content
|
// Alphabetical list of pseudo tag names for non-element content
|
||||||
static nsIAtom* commentTagName;
|
static nsIAtom* commentTagName;
|
||||||
static nsIAtom* textTagName;
|
static nsIAtom* textTagName;
|
||||||
|
static nsIAtom* processingInstructionTagName;
|
||||||
static nsIAtom* viewportPseudo;
|
static nsIAtom* viewportPseudo;
|
||||||
static nsIAtom* pagePseudo;
|
static nsIAtom* pagePseudo;
|
||||||
|
|
||||||
|
|
|
@ -157,6 +157,22 @@ public:
|
||||||
virtual nsIContent* GetRootContent() = 0;
|
virtual nsIContent* GetRootContent() = 0;
|
||||||
virtual void SetRootContent(nsIContent* aRoot) = 0;
|
virtual void SetRootContent(nsIContent* aRoot) = 0;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Methods to append to the prolog and epilog of
|
||||||
|
* a document. The prolog is the content before the document
|
||||||
|
* element, the epilog after.
|
||||||
|
*/
|
||||||
|
NS_IMETHOD AppendToProlog(nsIContent* aContent) = 0;
|
||||||
|
NS_IMETHOD AppendToEpilog(nsIContent* aContent) = 0;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get the direct children of the document - content in
|
||||||
|
* the prolog, the root content and content in the epilog.
|
||||||
|
*/
|
||||||
|
NS_IMETHOD ChildAt(PRInt32 aIndex, nsIContent*& aResult) const = 0;
|
||||||
|
NS_IMETHOD IndexOf(nsIContent* aPossibleChild, PRInt32& aIndex) const = 0;
|
||||||
|
NS_IMETHOD GetChildCount(PRInt32& aCount) = 0;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Get the style sheets owned by this document.
|
* Get the style sheets owned by this document.
|
||||||
* Style sheets are ordered, most significant last.
|
* Style sheets are ordered, most significant last.
|
||||||
|
|
|
@ -60,6 +60,7 @@ public:
|
||||||
// Alphabetical list of pseudo tag names for non-element content
|
// Alphabetical list of pseudo tag names for non-element content
|
||||||
static nsIAtom* commentTagName;
|
static nsIAtom* commentTagName;
|
||||||
static nsIAtom* textTagName;
|
static nsIAtom* textTagName;
|
||||||
|
static nsIAtom* processingInstructionTagName;
|
||||||
static nsIAtom* viewportPseudo;
|
static nsIAtom* viewportPseudo;
|
||||||
static nsIAtom* pagePseudo;
|
static nsIAtom* pagePseudo;
|
||||||
|
|
||||||
|
|
|
@ -331,7 +331,8 @@ nsContentList::Match(nsIContent *aContent, PRBool *aMatch)
|
||||||
// If we have to match all, only do those that have
|
// If we have to match all, only do those that have
|
||||||
// a tagName i.e. only the elements.
|
// a tagName i.e. only the elements.
|
||||||
if (mMatchAll && (nsLayoutAtoms::textTagName != name) &&
|
if (mMatchAll && (nsLayoutAtoms::textTagName != name) &&
|
||||||
(nsLayoutAtoms::commentTagName != name)) {
|
(nsLayoutAtoms::commentTagName != name) &&
|
||||||
|
(nsLayoutAtoms::processingInstructionTagName != name)) {
|
||||||
*aMatch = PR_TRUE;
|
*aMatch = PR_TRUE;
|
||||||
}
|
}
|
||||||
// XXX We don't yet match on namespace. Maybe we should??
|
// XXX We don't yet match on namespace. Maybe we should??
|
||||||
|
|
|
@ -549,8 +549,62 @@ PRInt32 nsPostData::GetDataLength()
|
||||||
return mDataLen;
|
return mDataLen;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// ==================================================================
|
||||||
|
// =
|
||||||
|
// ==================================================================
|
||||||
|
nsDocumentChildNodes::nsDocumentChildNodes(nsIDocument* aDocument)
|
||||||
|
{
|
||||||
|
// We don't reference count our document reference (to avoid circular
|
||||||
|
// references). We'll be told when the document goes away.
|
||||||
|
mDocument = aDocument;
|
||||||
|
}
|
||||||
|
|
||||||
|
nsDocumentChildNodes::~nsDocumentChildNodes()
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
NS_IMETHODIMP
|
||||||
|
nsDocumentChildNodes::GetLength(PRUint32* aLength)
|
||||||
|
{
|
||||||
|
if (nsnull != mDocument) {
|
||||||
|
PRInt32 count;
|
||||||
|
mDocument->GetChildCount(count);
|
||||||
|
*aLength = (PRUint32)count;
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
*aLength = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
return NS_OK;
|
||||||
|
}
|
||||||
|
|
||||||
|
NS_IMETHODIMP
|
||||||
|
nsDocumentChildNodes::Item(PRUint32 aIndex, nsIDOMNode** aReturn)
|
||||||
|
{
|
||||||
|
nsresult result = NS_OK;
|
||||||
|
nsIContent* content = nsnull;
|
||||||
|
|
||||||
|
*aReturn = nsnull;
|
||||||
|
if (nsnull != mDocument) {
|
||||||
|
result = mDocument->ChildAt(aIndex, content);
|
||||||
|
if ((NS_OK == result) && (nsnull != content)) {
|
||||||
|
result = content->QueryInterface(kIDOMNodeIID, (void**)aReturn);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
nsDocumentChildNodes::DropReference()
|
||||||
|
{
|
||||||
|
mDocument = nsnull;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// ==================================================================
|
||||||
|
// =
|
||||||
|
// ==================================================================
|
||||||
|
|
||||||
nsDocument::nsDocument()
|
nsDocument::nsDocument()
|
||||||
{
|
{
|
||||||
|
@ -572,6 +626,9 @@ nsDocument::nsDocument()
|
||||||
mNameSpaceManager = nsnull;
|
mNameSpaceManager = nsnull;
|
||||||
mHeaderData = nsnull;
|
mHeaderData = nsnull;
|
||||||
mLineBreaker = nsnull;
|
mLineBreaker = nsnull;
|
||||||
|
mProlog = nsnull;
|
||||||
|
mEpilog = nsnull;
|
||||||
|
mChildNodes = nsnull;
|
||||||
mWordBreaker = nsnull;
|
mWordBreaker = nsnull;
|
||||||
|
|
||||||
Init();/* XXX */
|
Init();/* XXX */
|
||||||
|
@ -585,7 +642,7 @@ nsDocument::~nsDocument()
|
||||||
// This notification will occur only after the reference has
|
// This notification will occur only after the reference has
|
||||||
// been dropped.
|
// been dropped.
|
||||||
mInDestructor = PR_TRUE;
|
mInDestructor = PR_TRUE;
|
||||||
PRInt32 index;
|
PRInt32 index, count;
|
||||||
for (index = 0; index < mObservers.Count(); index++) {
|
for (index = 0; index < mObservers.Count(); index++) {
|
||||||
nsIDocumentObserver* observer = (nsIDocumentObserver*)mObservers.ElementAt(index);
|
nsIDocumentObserver* observer = (nsIDocumentObserver*)mObservers.ElementAt(index);
|
||||||
observer->DocumentWillBeDestroyed(this);
|
observer->DocumentWillBeDestroyed(this);
|
||||||
|
@ -617,6 +674,29 @@ nsDocument::~nsDocument()
|
||||||
NS_RELEASE(sheet);
|
NS_RELEASE(sheet);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
nsIContent* content;
|
||||||
|
if (nsnull != mProlog) {
|
||||||
|
count = mProlog->Count();
|
||||||
|
for (index = 0; index < count; index++) {
|
||||||
|
content = (nsIContent*)mProlog->ElementAt(index);
|
||||||
|
NS_RELEASE(content);
|
||||||
|
}
|
||||||
|
delete mProlog;
|
||||||
|
}
|
||||||
|
if (nsnull != mEpilog) {
|
||||||
|
count = mEpilog->Count();
|
||||||
|
for (index = 0; index < count; index++) {
|
||||||
|
content = (nsIContent*)mEpilog->ElementAt(index);
|
||||||
|
NS_RELEASE(content);
|
||||||
|
}
|
||||||
|
delete mEpilog;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (nsnull != mChildNodes) {
|
||||||
|
mChildNodes->DropReference();
|
||||||
|
NS_RELEASE(mChildNodes);
|
||||||
|
}
|
||||||
|
|
||||||
NS_IF_RELEASE(mArena);
|
NS_IF_RELEASE(mArena);
|
||||||
NS_IF_RELEASE(mScriptContextOwner);
|
NS_IF_RELEASE(mScriptContextOwner);
|
||||||
NS_IF_RELEASE(mListenerManager);
|
NS_IF_RELEASE(mListenerManager);
|
||||||
|
@ -1047,6 +1127,103 @@ void nsDocument::SetRootContent(nsIContent* aRoot)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
NS_IMETHODIMP
|
||||||
|
nsDocument::AppendToProlog(nsIContent* aContent)
|
||||||
|
{
|
||||||
|
if (nsnull == mProlog) {
|
||||||
|
mProlog = new nsVoidArray();
|
||||||
|
}
|
||||||
|
|
||||||
|
mProlog->AppendElement((void *)aContent);
|
||||||
|
NS_ADDREF(aContent);
|
||||||
|
|
||||||
|
return NS_OK;
|
||||||
|
}
|
||||||
|
|
||||||
|
NS_IMETHODIMP
|
||||||
|
nsDocument::AppendToEpilog(nsIContent* aContent)
|
||||||
|
{
|
||||||
|
if (nsnull == mEpilog) {
|
||||||
|
mEpilog = new nsVoidArray();
|
||||||
|
}
|
||||||
|
|
||||||
|
mEpilog->AppendElement((void *)aContent);
|
||||||
|
NS_ADDREF(aContent);
|
||||||
|
|
||||||
|
return NS_OK;
|
||||||
|
}
|
||||||
|
|
||||||
|
NS_IMETHODIMP
|
||||||
|
nsDocument::ChildAt(PRInt32 aIndex, nsIContent*& aResult) const
|
||||||
|
{
|
||||||
|
nsIContent* content = nsnull;
|
||||||
|
PRInt32 prolog = 0;
|
||||||
|
|
||||||
|
if (nsnull != mProlog) {
|
||||||
|
prolog = mProlog->Count();
|
||||||
|
if (aIndex < prolog) {
|
||||||
|
// It's in the prolog
|
||||||
|
content = (nsIContent*)mProlog->ElementAt(aIndex);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (aIndex == prolog) {
|
||||||
|
// It's the document element
|
||||||
|
content = mRootContent;
|
||||||
|
}
|
||||||
|
else if ((aIndex > prolog) && (nsnull != mEpilog)) {
|
||||||
|
// It's in the epilog
|
||||||
|
content = (nsIContent*)mEpilog->ElementAt(aIndex-prolog-1);
|
||||||
|
}
|
||||||
|
|
||||||
|
NS_IF_ADDREF(content);
|
||||||
|
aResult = content;
|
||||||
|
|
||||||
|
return NS_OK;
|
||||||
|
}
|
||||||
|
|
||||||
|
NS_IMETHODIMP
|
||||||
|
nsDocument::IndexOf(nsIContent* aPossibleChild, PRInt32& aIndex) const
|
||||||
|
{
|
||||||
|
PRInt32 index = -1;
|
||||||
|
PRInt32 prolog = 0;
|
||||||
|
|
||||||
|
if (nsnull != mProlog) {
|
||||||
|
index = mProlog->IndexOf(aPossibleChild);
|
||||||
|
prolog = mProlog->Count();
|
||||||
|
}
|
||||||
|
|
||||||
|
if (-1 == index) {
|
||||||
|
if (aPossibleChild == mRootContent) {
|
||||||
|
index = prolog;
|
||||||
|
}
|
||||||
|
else if (nsnull != mEpilog) {
|
||||||
|
index = mEpilog->IndexOf(aPossibleChild);
|
||||||
|
if (-1 != index) {
|
||||||
|
index += (prolog+1);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
aIndex = index;
|
||||||
|
|
||||||
|
return NS_OK;
|
||||||
|
}
|
||||||
|
|
||||||
|
NS_IMETHODIMP
|
||||||
|
nsDocument::GetChildCount(PRInt32& aCount)
|
||||||
|
{
|
||||||
|
aCount = 1;
|
||||||
|
if (nsnull != mProlog) {
|
||||||
|
aCount += mProlog->Count();
|
||||||
|
}
|
||||||
|
if (nsnull != mEpilog) {
|
||||||
|
aCount += mEpilog->Count();
|
||||||
|
}
|
||||||
|
|
||||||
|
return NS_OK;
|
||||||
|
}
|
||||||
|
|
||||||
PRInt32 nsDocument::GetNumberOfStyleSheets()
|
PRInt32 nsDocument::GetNumberOfStyleSheets()
|
||||||
{
|
{
|
||||||
return mStyleSheets.Count();
|
return mStyleSheets.Count();
|
||||||
|
@ -1504,6 +1681,7 @@ nsDocument::CreateTextNode(const nsString& aData, nsIDOMText** aReturn)
|
||||||
if (NS_OK == rv) {
|
if (NS_OK == rv) {
|
||||||
rv = text->QueryInterface(kIDOMTextIID, (void**)aReturn);
|
rv = text->QueryInterface(kIDOMTextIID, (void**)aReturn);
|
||||||
(*aReturn)->AppendData(aData);
|
(*aReturn)->AppendData(aData);
|
||||||
|
NS_RELEASE(text);
|
||||||
}
|
}
|
||||||
|
|
||||||
return rv;
|
return rv;
|
||||||
|
@ -1524,6 +1702,7 @@ nsDocument::CreateComment(const nsString& aData, nsIDOMComment** aReturn)
|
||||||
if (NS_OK == rv) {
|
if (NS_OK == rv) {
|
||||||
rv = comment->QueryInterface(kIDOMCommentIID, (void**)aReturn);
|
rv = comment->QueryInterface(kIDOMCommentIID, (void**)aReturn);
|
||||||
(*aReturn)->AppendData(aData);
|
(*aReturn)->AppendData(aData);
|
||||||
|
NS_RELEASE(comment);
|
||||||
}
|
}
|
||||||
|
|
||||||
return rv;
|
return rv;
|
||||||
|
@ -1663,29 +1842,71 @@ nsDocument::GetParentNode(nsIDOMNode** aParentNode)
|
||||||
NS_IMETHODIMP
|
NS_IMETHODIMP
|
||||||
nsDocument::GetChildNodes(nsIDOMNodeList** aChildNodes)
|
nsDocument::GetChildNodes(nsIDOMNodeList** aChildNodes)
|
||||||
{
|
{
|
||||||
// Should be implemented by subclass
|
if (nsnull == mChildNodes) {
|
||||||
return NS_ERROR_NOT_IMPLEMENTED;
|
mChildNodes = new nsDocumentChildNodes(this);
|
||||||
|
if (nsnull == mChildNodes) {
|
||||||
|
return NS_ERROR_OUT_OF_MEMORY;
|
||||||
|
}
|
||||||
|
NS_ADDREF(mChildNodes);
|
||||||
|
}
|
||||||
|
|
||||||
|
return mChildNodes->QueryInterface(kIDOMNodeListIID, (void**)aChildNodes);
|
||||||
}
|
}
|
||||||
|
|
||||||
NS_IMETHODIMP
|
NS_IMETHODIMP
|
||||||
nsDocument::HasChildNodes(PRBool* aHasChildNodes)
|
nsDocument::HasChildNodes(PRBool* aHasChildNodes)
|
||||||
{
|
{
|
||||||
// Should be implemented by subclass
|
*aHasChildNodes = PR_TRUE;
|
||||||
return NS_ERROR_NOT_IMPLEMENTED;
|
return NS_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
NS_IMETHODIMP
|
NS_IMETHODIMP
|
||||||
nsDocument::GetFirstChild(nsIDOMNode** aFirstChild)
|
nsDocument::GetFirstChild(nsIDOMNode** aFirstChild)
|
||||||
{
|
{
|
||||||
// Should be implemented by subclass
|
nsresult result = NS_OK;
|
||||||
return NS_ERROR_NOT_IMPLEMENTED;
|
|
||||||
|
if ((nsnull != mProlog) && (0 != mProlog->Count())) {
|
||||||
|
nsIContent* content;
|
||||||
|
content = (nsIContent *)mProlog->ElementAt(0);
|
||||||
|
|
||||||
|
if (nsnull != content) {
|
||||||
|
result = content->QueryInterface(kIDOMNodeIID, (void**)aFirstChild);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
nsIDOMElement* element;
|
||||||
|
result = GetDocumentElement(&element);
|
||||||
|
if (NS_OK == result) {
|
||||||
|
result = element->QueryInterface(kIDOMNodeIID, (void**)aFirstChild);
|
||||||
|
NS_RELEASE(element);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
NS_IMETHODIMP
|
NS_IMETHODIMP
|
||||||
nsDocument::GetLastChild(nsIDOMNode** aLastChild)
|
nsDocument::GetLastChild(nsIDOMNode** aLastChild)
|
||||||
{
|
{
|
||||||
// Should be implemented by subclass
|
nsresult result = NS_OK;
|
||||||
return NS_ERROR_NOT_IMPLEMENTED;
|
|
||||||
|
if ((nsnull != mEpilog) && (0 != mEpilog->Count())) {
|
||||||
|
nsIContent* content;
|
||||||
|
content = (nsIContent *)mEpilog->ElementAt(mEpilog->Count()-1);
|
||||||
|
if (nsnull != content) {
|
||||||
|
result = content->QueryInterface(kIDOMNodeIID, (void**)aLastChild);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
nsIDOMElement* element;
|
||||||
|
result = GetDocumentElement(&element);
|
||||||
|
if (NS_OK == result) {
|
||||||
|
result = element->QueryInterface(kIDOMNodeIID, (void**)aLastChild);
|
||||||
|
NS_RELEASE(element);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
NS_IMETHODIMP
|
NS_IMETHODIMP
|
||||||
|
@ -1712,29 +1933,194 @@ nsDocument::GetAttributes(nsIDOMNamedNodeMap** aAttributes)
|
||||||
NS_IMETHODIMP
|
NS_IMETHODIMP
|
||||||
nsDocument::InsertBefore(nsIDOMNode* aNewChild, nsIDOMNode* aRefChild, nsIDOMNode** aReturn)
|
nsDocument::InsertBefore(nsIDOMNode* aNewChild, nsIDOMNode* aRefChild, nsIDOMNode** aReturn)
|
||||||
{
|
{
|
||||||
// Should be implemented by subclass
|
NS_ASSERTION(nsnull != aNewChild, "null ptr");
|
||||||
return NS_ERROR_NOT_IMPLEMENTED;
|
nsresult result = NS_OK;
|
||||||
|
PRInt32 index;
|
||||||
|
PRUint16 nodeType;
|
||||||
|
nsIContent *content, *refContent = nsnull;
|
||||||
|
|
||||||
|
if (nsnull == aNewChild) {
|
||||||
|
return NS_ERROR_INVALID_ARG;
|
||||||
|
}
|
||||||
|
|
||||||
|
aNewChild->GetNodeType(&nodeType);
|
||||||
|
if ((COMMENT_NODE != nodeType) && (PROCESSING_INSTRUCTION_NODE != nodeType)) {
|
||||||
|
return NS_ERROR_INVALID_ARG;
|
||||||
|
}
|
||||||
|
|
||||||
|
result = aNewChild->QueryInterface(kIContentIID, (void**)&content);
|
||||||
|
if (NS_OK != result) {
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (nsnull == aRefChild) {
|
||||||
|
AppendToEpilog(content);
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
result = aRefChild->QueryInterface(kIContentIID, (void**)&refContent);
|
||||||
|
if (NS_OK != result) {
|
||||||
|
NS_RELEASE(content);
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
if ((nsnull != mProlog) && (0 != mProlog->Count())) {
|
||||||
|
index = mProlog->IndexOf(refContent);
|
||||||
|
if (-1 != index) {
|
||||||
|
mProlog->InsertElementAt(content, index);
|
||||||
|
NS_ADDREF(content);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (refContent == mRootContent) {
|
||||||
|
AppendToProlog(content);
|
||||||
|
}
|
||||||
|
else if ((nsnull != mEpilog) && (0 != mEpilog->Count())) {
|
||||||
|
index = mEpilog->IndexOf(refContent);
|
||||||
|
if (-1 != index) {
|
||||||
|
mEpilog->InsertElementAt(content, index);
|
||||||
|
NS_ADDREF(content);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
NS_RELEASE(refContent);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (NS_OK == result) {
|
||||||
|
content->SetDocument(this, PR_TRUE);
|
||||||
|
*aReturn = aNewChild;
|
||||||
|
NS_ADDREF(aNewChild);
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
*aReturn = nsnull;
|
||||||
|
}
|
||||||
|
|
||||||
|
NS_RELEASE(content);
|
||||||
|
|
||||||
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
NS_IMETHODIMP
|
NS_IMETHODIMP
|
||||||
nsDocument::ReplaceChild(nsIDOMNode* aNewChild, nsIDOMNode* aOldChild, nsIDOMNode** aReturn)
|
nsDocument::ReplaceChild(nsIDOMNode* aNewChild, nsIDOMNode* aOldChild, nsIDOMNode** aReturn)
|
||||||
{
|
{
|
||||||
// Should be implemented by subclass
|
NS_ASSERTION(((nsnull != aNewChild) && (nsnull != aOldChild)), "null ptr");
|
||||||
return NS_ERROR_NOT_IMPLEMENTED;
|
nsresult result = NS_OK;
|
||||||
|
PRInt32 index;
|
||||||
|
PRUint16 nodeType;
|
||||||
|
nsIContent *content, *refContent;
|
||||||
|
|
||||||
|
if ((nsnull == aNewChild) || (nsnull == aOldChild)) {
|
||||||
|
return NS_ERROR_INVALID_ARG;
|
||||||
|
}
|
||||||
|
|
||||||
|
aNewChild->GetNodeType(&nodeType);
|
||||||
|
if ((COMMENT_NODE != nodeType) && (PROCESSING_INSTRUCTION_NODE != nodeType)) {
|
||||||
|
return NS_ERROR_INVALID_ARG;
|
||||||
|
}
|
||||||
|
|
||||||
|
result = aNewChild->QueryInterface(kIContentIID, (void**)&content);
|
||||||
|
if (NS_OK != result) {
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
result = aOldChild->QueryInterface(kIContentIID, (void**)&refContent);
|
||||||
|
if (NS_OK != result) {
|
||||||
|
NS_RELEASE(content);
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
if ((nsnull != mProlog) && (0 != mProlog->Count())) {
|
||||||
|
index = mProlog->IndexOf(refContent);
|
||||||
|
if (-1 != index) {
|
||||||
|
nsIContent* oldContent;
|
||||||
|
oldContent = (nsIContent*)mProlog->ElementAt(index);
|
||||||
|
NS_RELEASE(oldContent);
|
||||||
|
mProlog->ReplaceElementAt(content, index);
|
||||||
|
NS_ADDREF(content);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (refContent == mRootContent) {
|
||||||
|
result = NS_ERROR_INVALID_ARG;
|
||||||
|
}
|
||||||
|
else if ((nsnull != mEpilog) && (0 != mEpilog->Count())) {
|
||||||
|
index = mEpilog->IndexOf(refContent);
|
||||||
|
if (-1 != index) {
|
||||||
|
nsIContent* oldContent;
|
||||||
|
oldContent = (nsIContent*)mEpilog->ElementAt(index);
|
||||||
|
NS_RELEASE(oldContent);
|
||||||
|
mEpilog->ReplaceElementAt(content, index);
|
||||||
|
NS_ADDREF(content);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (NS_OK == result) {
|
||||||
|
content->SetDocument(this, PR_TRUE);
|
||||||
|
refContent->SetDocument(nsnull, PR_TRUE);
|
||||||
|
*aReturn = aNewChild;
|
||||||
|
NS_ADDREF(aNewChild);
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
*aReturn = nsnull;
|
||||||
|
}
|
||||||
|
|
||||||
|
NS_RELEASE(content);
|
||||||
|
NS_RELEASE(refContent);
|
||||||
|
|
||||||
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
NS_IMETHODIMP
|
NS_IMETHODIMP
|
||||||
nsDocument::RemoveChild(nsIDOMNode* aOldChild, nsIDOMNode** aReturn)
|
nsDocument::RemoveChild(nsIDOMNode* aOldChild, nsIDOMNode** aReturn)
|
||||||
{
|
{
|
||||||
// Should be implemented by subclass
|
NS_ASSERTION(nsnull != aOldChild, "null ptr");
|
||||||
return NS_ERROR_NOT_IMPLEMENTED;
|
nsresult result = NS_OK;
|
||||||
|
PRInt32 index;
|
||||||
|
nsIContent *content;
|
||||||
|
|
||||||
|
if (nsnull == aOldChild) {
|
||||||
|
return NS_ERROR_INVALID_ARG;
|
||||||
|
}
|
||||||
|
|
||||||
|
result = aOldChild->QueryInterface(kIContentIID, (void**)&content);
|
||||||
|
if (NS_OK != result) {
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
if ((nsnull != mProlog) && (0 != mProlog->Count())) {
|
||||||
|
index = mProlog->IndexOf(content);
|
||||||
|
if (-1 != index) {
|
||||||
|
// Don't drop reference count since we're going
|
||||||
|
// to return this element anyway.
|
||||||
|
mProlog->RemoveElementAt(index);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (content == mRootContent) {
|
||||||
|
result = NS_ERROR_INVALID_ARG;
|
||||||
|
}
|
||||||
|
else if ((nsnull != mEpilog) && (0 != mEpilog->Count())) {
|
||||||
|
index = mEpilog->IndexOf(content);
|
||||||
|
if (-1 != index) {
|
||||||
|
mEpilog->RemoveElementAt(index);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (NS_OK == result) {
|
||||||
|
content->SetDocument(nsnull, PR_TRUE);
|
||||||
|
*aReturn = aOldChild;
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
*aReturn = nsnull;
|
||||||
|
}
|
||||||
|
|
||||||
|
NS_RELEASE(content);
|
||||||
|
|
||||||
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
NS_IMETHODIMP
|
NS_IMETHODIMP
|
||||||
nsDocument::AppendChild(nsIDOMNode* aNewChild, nsIDOMNode** aReturn)
|
nsDocument::AppendChild(nsIDOMNode* aNewChild, nsIDOMNode** aReturn)
|
||||||
{
|
{
|
||||||
// Should be implemented by subclass
|
return InsertBefore(aNewChild, nsnull, aReturn);
|
||||||
return NS_ERROR_NOT_IMPLEMENTED;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
NS_IMETHODIMP
|
NS_IMETHODIMP
|
||||||
|
|
|
@ -29,11 +29,12 @@
|
||||||
#include "nsXIFConverter.h"
|
#include "nsXIFConverter.h"
|
||||||
#include "nsIJSScriptObject.h"
|
#include "nsIJSScriptObject.h"
|
||||||
#include "nsIContent.h"
|
#include "nsIContent.h"
|
||||||
|
#include "nsGenericDOMNodeList.h"
|
||||||
|
|
||||||
class nsIEventListenerManager;
|
class nsIEventListenerManager;
|
||||||
class nsDOMStyleSheetCollection;
|
class nsDOMStyleSheetCollection;
|
||||||
class nsIDOMSelection;
|
class nsIDOMSelection;
|
||||||
|
class nsDocument;
|
||||||
|
|
||||||
class nsPostData : public nsIPostData {
|
class nsPostData : public nsIPostData {
|
||||||
public:
|
public:
|
||||||
|
@ -77,6 +78,23 @@ public:
|
||||||
nsDocHeaderData* mNext;
|
nsDocHeaderData* mNext;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
// Represents the children of a document (prolog, epilog and
|
||||||
|
// document element)
|
||||||
|
class nsDocumentChildNodes : public nsGenericDOMNodeList
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
nsDocumentChildNodes(nsIDocument* aDocument);
|
||||||
|
~nsDocumentChildNodes();
|
||||||
|
|
||||||
|
NS_IMETHOD GetLength(PRUint32* aLength);
|
||||||
|
NS_IMETHOD Item(PRUint32 aIndex, nsIDOMNode** aReturn);
|
||||||
|
|
||||||
|
void DropReference();
|
||||||
|
|
||||||
|
protected:
|
||||||
|
nsIDocument* mDocument;
|
||||||
|
};
|
||||||
|
|
||||||
// Base class for our document implementations
|
// Base class for our document implementations
|
||||||
class nsDocument : public nsIDocument,
|
class nsDocument : public nsIDocument,
|
||||||
public nsIDOMDocument,
|
public nsIDOMDocument,
|
||||||
|
@ -169,6 +187,22 @@ public:
|
||||||
virtual nsIContent* GetRootContent();
|
virtual nsIContent* GetRootContent();
|
||||||
virtual void SetRootContent(nsIContent* aRoot);
|
virtual void SetRootContent(nsIContent* aRoot);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Methods to append to the prolog and epilog of
|
||||||
|
* a document. The prolog is the content before the document
|
||||||
|
* element, the epilog after.
|
||||||
|
*/
|
||||||
|
NS_IMETHOD AppendToProlog(nsIContent* aContent);
|
||||||
|
NS_IMETHOD AppendToEpilog(nsIContent* aContent);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get the direct children of the document - content in
|
||||||
|
* the prolog, the root content and content in the epilog.
|
||||||
|
*/
|
||||||
|
NS_IMETHOD ChildAt(PRInt32 aIndex, nsIContent*& aResult) const;
|
||||||
|
NS_IMETHOD IndexOf(nsIContent* aPossibleChild, PRInt32& aIndex) const;
|
||||||
|
NS_IMETHOD GetChildCount(PRInt32& aCount);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Get the style sheets owned by this document.
|
* Get the style sheets owned by this document.
|
||||||
* These are ordered, highest priority last
|
* These are ordered, highest priority last
|
||||||
|
@ -383,6 +417,9 @@ protected:
|
||||||
nsINameSpaceManager* mNameSpaceManager;
|
nsINameSpaceManager* mNameSpaceManager;
|
||||||
nsDocHeaderData* mHeaderData;
|
nsDocHeaderData* mHeaderData;
|
||||||
nsILineBreaker* mLineBreaker;
|
nsILineBreaker* mLineBreaker;
|
||||||
|
nsVoidArray *mProlog;
|
||||||
|
nsVoidArray *mEpilog;
|
||||||
|
nsDocumentChildNodes* mChildNodes;
|
||||||
nsIWordBreaker* mWordBreaker;
|
nsIWordBreaker* mWordBreaker;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
@ -37,6 +37,7 @@
|
||||||
#include "nsIPrivateDOMEvent.h"
|
#include "nsIPrivateDOMEvent.h"
|
||||||
#include "nsISizeOfHandler.h"
|
#include "nsISizeOfHandler.h"
|
||||||
#include "nsDOMEvent.h"
|
#include "nsDOMEvent.h"
|
||||||
|
#include "nsIDOMText.h"
|
||||||
#include "nsIDOMScriptObjectFactory.h"
|
#include "nsIDOMScriptObjectFactory.h"
|
||||||
#include "nsIScriptContextOwner.h"
|
#include "nsIScriptContextOwner.h"
|
||||||
#include "prprf.h"
|
#include "prprf.h"
|
||||||
|
@ -49,6 +50,8 @@ NS_DEFINE_IID(kIDOMCharacterDataIID, NS_IDOMCHARACTERDATA_IID);
|
||||||
static NS_DEFINE_IID(kIPrivateDOMEventIID, NS_IPRIVATEDOMEVENT_IID);
|
static NS_DEFINE_IID(kIPrivateDOMEventIID, NS_IPRIVATEDOMEVENT_IID);
|
||||||
static NS_DEFINE_IID(kIEnumeratorIID, NS_IENUMERATOR_IID);
|
static NS_DEFINE_IID(kIEnumeratorIID, NS_IENUMERATOR_IID);
|
||||||
static NS_DEFINE_IID(kIDOMDocumentIID, NS_IDOMDOCUMENT_IID);
|
static NS_DEFINE_IID(kIDOMDocumentIID, NS_IDOMDOCUMENT_IID);
|
||||||
|
static NS_DEFINE_IID(kIDOMTextIID, NS_IDOMTEXT_IID);
|
||||||
|
static NS_DEFINE_IID(kITextContentIID, NS_ITEXT_CONTENT_IID);
|
||||||
|
|
||||||
//----------------------------------------------------------------------
|
//----------------------------------------------------------------------
|
||||||
|
|
||||||
|
@ -133,49 +136,73 @@ nsGenericDOMDataNode::GetParentNode(nsIDOMNode** aParentNode)
|
||||||
}
|
}
|
||||||
|
|
||||||
nsresult
|
nsresult
|
||||||
nsGenericDOMDataNode::GetPreviousSibling(nsIDOMNode** aNode)
|
nsGenericDOMDataNode::GetPreviousSibling(nsIDOMNode** aPrevSibling)
|
||||||
{
|
{
|
||||||
|
nsIContent* sibling = nsnull;
|
||||||
|
nsresult result = NS_OK;
|
||||||
|
|
||||||
if (nsnull != mParent) {
|
if (nsnull != mParent) {
|
||||||
PRInt32 pos;
|
PRInt32 pos;
|
||||||
mParent->IndexOf(mContent, pos);
|
mParent->IndexOf(mContent, pos);
|
||||||
if (pos > -1) {
|
if (pos > -1 ) {
|
||||||
nsIContent* prev;
|
mParent->ChildAt(--pos, sibling);
|
||||||
mParent->ChildAt(--pos, prev);
|
|
||||||
if (nsnull != prev) {
|
|
||||||
nsresult res = prev->QueryInterface(kIDOMNodeIID, (void**)aNode);
|
|
||||||
NS_ASSERTION(NS_OK == res, "Must be a DOM Node");
|
|
||||||
NS_RELEASE(prev); // balance the AddRef in ChildAt()
|
|
||||||
return res;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
// XXX Nodes that are just below the document (their parent is the
|
else if (nsnull != mDocument) {
|
||||||
// document) need to go to the document to find their previous sibling.
|
// Nodes that are just below the document (their parent is the
|
||||||
*aNode = nsnull;
|
// document) need to go to the document to find their next sibling.
|
||||||
return NS_OK;
|
PRInt32 pos;
|
||||||
|
mDocument->IndexOf(mContent, pos);
|
||||||
|
if (pos > -1 ) {
|
||||||
|
mDocument->ChildAt(--pos, sibling);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (nsnull != sibling) {
|
||||||
|
result = sibling->QueryInterface(kIDOMNodeIID,(void**)aPrevSibling);
|
||||||
|
NS_ASSERTION(NS_OK == result, "Must be a DOM Node");
|
||||||
|
NS_RELEASE(sibling); // balance the AddRef in ChildAt()
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
*aPrevSibling = nsnull;
|
||||||
|
}
|
||||||
|
|
||||||
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
nsresult
|
nsresult
|
||||||
nsGenericDOMDataNode::GetNextSibling(nsIDOMNode** aNextSibling)
|
nsGenericDOMDataNode::GetNextSibling(nsIDOMNode** aNextSibling)
|
||||||
{
|
{
|
||||||
|
nsIContent* sibling = nsnull;
|
||||||
|
nsresult result = NS_OK;
|
||||||
|
|
||||||
if (nsnull != mParent) {
|
if (nsnull != mParent) {
|
||||||
PRInt32 pos;
|
PRInt32 pos;
|
||||||
mParent->IndexOf(mContent, pos);
|
mParent->IndexOf(mContent, pos);
|
||||||
if (pos > -1 ) {
|
if (pos > -1 ) {
|
||||||
nsIContent* prev;
|
mParent->ChildAt(++pos, sibling);
|
||||||
mParent->ChildAt(++pos, prev);
|
|
||||||
if (nsnull != prev) {
|
|
||||||
nsresult res = prev->QueryInterface(kIDOMNodeIID,(void**)aNextSibling);
|
|
||||||
NS_ASSERTION(NS_OK == res, "Must be a DOM Node");
|
|
||||||
NS_RELEASE(prev); // balance the AddRef in ChildAt()
|
|
||||||
return res;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
// XXX Nodes that are just below the document (their parent is the
|
else if (nsnull != mDocument) {
|
||||||
// document) need to go to the document to find their next sibling.
|
// Nodes that are just below the document (their parent is the
|
||||||
*aNextSibling = nsnull;
|
// document) need to go to the document to find their next sibling.
|
||||||
return NS_OK;
|
PRInt32 pos;
|
||||||
|
mDocument->IndexOf(mContent, pos);
|
||||||
|
if (pos > -1 ) {
|
||||||
|
mDocument->ChildAt(++pos, sibling);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (nsnull != sibling) {
|
||||||
|
result = sibling->QueryInterface(kIDOMNodeIID,(void**)aNextSibling);
|
||||||
|
NS_ASSERTION(NS_OK == result, "Must be a DOM Node");
|
||||||
|
NS_RELEASE(sibling); // balance the AddRef in ChildAt()
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
*aNextSibling = nsnull;
|
||||||
|
}
|
||||||
|
|
||||||
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
nsresult
|
nsresult
|
||||||
|
@ -775,3 +802,141 @@ nsGenericDOMDataNode::GetRangeList(nsVoidArray*& aResult) const
|
||||||
aResult = mRangeList;
|
aResult = mRangeList;
|
||||||
return NS_OK;
|
return NS_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
//----------------------------------------------------------------------
|
||||||
|
|
||||||
|
// Implementation of the nsIDOMText interface
|
||||||
|
|
||||||
|
nsresult
|
||||||
|
nsGenericDOMDataNode::SplitText(PRUint32 aOffset, nsIDOMText** aReturn)
|
||||||
|
{
|
||||||
|
nsresult result = NS_OK;
|
||||||
|
nsIContent* newNode;
|
||||||
|
nsITextContent* text;
|
||||||
|
nsAutoString cutText;
|
||||||
|
nsIContent* parentNode;
|
||||||
|
PRUint32 length;
|
||||||
|
|
||||||
|
GetLength(&length);
|
||||||
|
// Cut the second part out of the original text node
|
||||||
|
result = SubstringData(aOffset, length-aOffset, cutText);
|
||||||
|
if (NS_OK == result) {
|
||||||
|
result = DeleteData(aOffset, length-aOffset);
|
||||||
|
if (NS_OK == result) {
|
||||||
|
// Create a new text node and set its data to the
|
||||||
|
// string we just cut out
|
||||||
|
result = NS_NewTextNode(&newNode);
|
||||||
|
if (NS_OK == result) {
|
||||||
|
result = newNode->QueryInterface(kITextContentIID, (void**)&text);
|
||||||
|
if (NS_OK == result) {
|
||||||
|
text->SetText(cutText, cutText.Length(), PR_FALSE);
|
||||||
|
// Find the parent of the current node and insert the
|
||||||
|
// new text node as a child after the current node
|
||||||
|
GetParent(parentNode);
|
||||||
|
if (nsnull != parentNode) {
|
||||||
|
PRInt32 index;
|
||||||
|
|
||||||
|
result = parentNode->IndexOf(mContent, index);
|
||||||
|
if (NS_OK == result) {
|
||||||
|
result = parentNode->InsertChildAt(newNode, index+1, PR_TRUE);
|
||||||
|
}
|
||||||
|
NS_RELEASE(parentNode);
|
||||||
|
}
|
||||||
|
result = text->QueryInterface(kIDOMTextIID, (void**)aReturn);
|
||||||
|
NS_RELEASE(text);
|
||||||
|
}
|
||||||
|
NS_RELEASE(newNode);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
//----------------------------------------------------------------------
|
||||||
|
|
||||||
|
// Implementation of the nsITextContent interface
|
||||||
|
|
||||||
|
nsresult
|
||||||
|
nsGenericDOMDataNode::GetText(const nsTextFragment*& aFragmentsResult,
|
||||||
|
PRInt32& aNumFragmentsResult)
|
||||||
|
{
|
||||||
|
aFragmentsResult = &mText;
|
||||||
|
aNumFragmentsResult = 1;
|
||||||
|
return NS_OK;
|
||||||
|
}
|
||||||
|
|
||||||
|
nsresult
|
||||||
|
nsGenericDOMDataNode::SetText(const PRUnichar* aBuffer, PRInt32 aLength,
|
||||||
|
PRBool aNotify)
|
||||||
|
{
|
||||||
|
NS_PRECONDITION((aLength >= 0) && (nsnull != aBuffer), "bad args");
|
||||||
|
if (aLength < 0) {
|
||||||
|
return NS_ERROR_ILLEGAL_VALUE;
|
||||||
|
}
|
||||||
|
if (nsnull == aBuffer) {
|
||||||
|
return NS_ERROR_NULL_POINTER;
|
||||||
|
}
|
||||||
|
mText.SetTo(aBuffer, aLength);
|
||||||
|
|
||||||
|
// Trigger a reflow
|
||||||
|
if (aNotify && (nsnull != mDocument)) {
|
||||||
|
mDocument->ContentChanged(mContent, nsnull);
|
||||||
|
}
|
||||||
|
return NS_OK;
|
||||||
|
}
|
||||||
|
|
||||||
|
nsresult
|
||||||
|
nsGenericDOMDataNode::SetText(const char* aBuffer,
|
||||||
|
PRInt32 aLength,
|
||||||
|
PRBool aNotify)
|
||||||
|
{
|
||||||
|
NS_PRECONDITION((aLength >= 0) && (nsnull != aBuffer), "bad args");
|
||||||
|
if (aLength < 0) {
|
||||||
|
return NS_ERROR_ILLEGAL_VALUE;
|
||||||
|
}
|
||||||
|
if (nsnull == aBuffer) {
|
||||||
|
return NS_ERROR_NULL_POINTER;
|
||||||
|
}
|
||||||
|
mText.SetTo(aBuffer, aLength);
|
||||||
|
|
||||||
|
// Trigger a reflow
|
||||||
|
if (aNotify && (nsnull != mDocument)) {
|
||||||
|
mDocument->ContentChanged(mContent, nsnull);
|
||||||
|
}
|
||||||
|
return NS_OK;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
nsresult
|
||||||
|
nsGenericDOMDataNode::IsOnlyWhitespace(PRBool* aResult)
|
||||||
|
{
|
||||||
|
nsTextFragment& frag = mText;
|
||||||
|
if (frag.Is2b()) {
|
||||||
|
const PRUnichar* cp = frag.Get2b();
|
||||||
|
const PRUnichar* end = cp + frag.GetLength();
|
||||||
|
while (cp < end) {
|
||||||
|
PRUnichar ch = *cp++;
|
||||||
|
if (!XP_IS_SPACE(ch)) {
|
||||||
|
*aResult = PR_FALSE;
|
||||||
|
return NS_OK;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
const char* cp = frag.Get1b();
|
||||||
|
const char* end = cp + frag.GetLength();
|
||||||
|
while (cp < end) {
|
||||||
|
PRUnichar ch = PRUnichar(*(unsigned char*)cp);
|
||||||
|
cp++;
|
||||||
|
if (!XP_IS_SPACE(ch)) {
|
||||||
|
*aResult = PR_FALSE;
|
||||||
|
return NS_OK;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
*aResult = PR_TRUE;
|
||||||
|
return NS_OK;
|
||||||
|
}
|
||||||
|
|
|
@ -26,6 +26,7 @@
|
||||||
#include "nsTextFragment.h"
|
#include "nsTextFragment.h"
|
||||||
#include "nsVoidArray.h"
|
#include "nsVoidArray.h"
|
||||||
#include "nsINameSpaceManager.h"
|
#include "nsINameSpaceManager.h"
|
||||||
|
#include "nsITextContent.h"
|
||||||
|
|
||||||
extern const nsIID kIDOMCharacterDataIID;
|
extern const nsIID kIDOMCharacterDataIID;
|
||||||
extern const nsIID kIDOMNodeIID;
|
extern const nsIID kIDOMNodeIID;
|
||||||
|
@ -43,6 +44,7 @@ class nsIFrame;
|
||||||
class nsIStyleContext;
|
class nsIStyleContext;
|
||||||
class nsIStyleRule;
|
class nsIStyleRule;
|
||||||
class nsISupportsArray;
|
class nsISupportsArray;
|
||||||
|
class nsIDOMText;
|
||||||
|
|
||||||
struct nsGenericDOMDataNode {
|
struct nsGenericDOMDataNode {
|
||||||
nsGenericDOMDataNode();
|
nsGenericDOMDataNode();
|
||||||
|
@ -206,6 +208,18 @@ struct nsGenericDOMDataNode {
|
||||||
return NS_OK;
|
return NS_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
nsresult SplitText(PRUint32 aOffset, nsIDOMText** aReturn);
|
||||||
|
|
||||||
|
nsresult GetText(const nsTextFragment*& aFragmentsResult,
|
||||||
|
PRInt32& aNumFragmentsResult);
|
||||||
|
nsresult SetText(const PRUnichar* aBuffer,
|
||||||
|
PRInt32 aLength,
|
||||||
|
PRBool aNotify);
|
||||||
|
nsresult SetText(const char* aBuffer,
|
||||||
|
PRInt32 aLength,
|
||||||
|
PRBool aNotify);
|
||||||
|
nsresult IsOnlyWhitespace(PRBool* aResult);
|
||||||
|
|
||||||
//----------------------------------------
|
//----------------------------------------
|
||||||
|
|
||||||
void ToCString(nsString& aBuf, PRInt32 aOffset, PRInt32 aLen) const;
|
void ToCString(nsString& aBuf, PRInt32 aOffset, PRInt32 aLen) const;
|
||||||
|
@ -464,6 +478,38 @@ struct nsGenericDOMDataNode {
|
||||||
return _g.GetRangeList(aResult); \
|
return _g.GetRangeList(aResult); \
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Implement the nsIDOMText API by forwarding the methods to a
|
||||||
|
* generic character data content object.
|
||||||
|
*/
|
||||||
|
#define NS_IMPL_IDOMTEXT_USING_GENERIC_DOM_DATA(_g) \
|
||||||
|
NS_IMETHOD SplitText(PRUint32 aOffset, nsIDOMText** aReturn){ \
|
||||||
|
return _g.SplitText(aOffset, aReturn); \
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Implement the nsITextContent API by forwarding the methods to a
|
||||||
|
* generic character data content object.
|
||||||
|
*/
|
||||||
|
#define NS_IMPL_ITEXTCONTENT_USING_GENERIC_DOM_DATA(_g) \
|
||||||
|
NS_IMETHOD GetText(const nsTextFragment*& aFragmentsResult, \
|
||||||
|
PRInt32& aNumFragmentsResult){ \
|
||||||
|
return mInner.GetText(aFragmentsResult, aNumFragmentsResult); \
|
||||||
|
} \
|
||||||
|
NS_IMETHOD SetText(const PRUnichar* aBuffer, \
|
||||||
|
PRInt32 aLength, \
|
||||||
|
PRBool aNotify){ \
|
||||||
|
return mInner.SetText(aBuffer, aLength, aNotify); \
|
||||||
|
} \
|
||||||
|
NS_IMETHOD SetText(const char* aBuffer, \
|
||||||
|
PRInt32 aLength, \
|
||||||
|
PRBool aNotify){ \
|
||||||
|
return mInner.SetText(aBuffer, aLength, aNotify); \
|
||||||
|
} \
|
||||||
|
NS_IMETHOD IsOnlyWhitespace(PRBool* aResult){ \
|
||||||
|
return mInner.IsOnlyWhitespace(aResult); \
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* This macro implements the portion of query interface that is
|
* This macro implements the portion of query interface that is
|
||||||
* generic to all html content objects.
|
* generic to all html content objects.
|
||||||
|
|
|
@ -293,49 +293,73 @@ nsGenericElement::GetParentNode(nsIDOMNode** aParentNode)
|
||||||
}
|
}
|
||||||
|
|
||||||
nsresult
|
nsresult
|
||||||
nsGenericElement::GetPreviousSibling(nsIDOMNode** aNode)
|
nsGenericElement::GetPreviousSibling(nsIDOMNode** aPrevSibling)
|
||||||
{
|
{
|
||||||
|
nsIContent* sibling = nsnull;
|
||||||
|
nsresult result = NS_OK;
|
||||||
|
|
||||||
if (nsnull != mParent) {
|
if (nsnull != mParent) {
|
||||||
PRInt32 pos;
|
PRInt32 pos;
|
||||||
mParent->IndexOf(mContent, pos);
|
mParent->IndexOf(mContent, pos);
|
||||||
if (pos > -1) {
|
if (pos > -1 ) {
|
||||||
nsIContent* prev;
|
mParent->ChildAt(--pos, sibling);
|
||||||
mParent->ChildAt(--pos, prev);
|
|
||||||
if (nsnull != prev) {
|
|
||||||
nsresult res = prev->QueryInterface(kIDOMNodeIID, (void**)aNode);
|
|
||||||
NS_ASSERTION(NS_OK == res, "Must be a DOM Node");
|
|
||||||
NS_RELEASE(prev); // balance the AddRef in ChildAt()
|
|
||||||
return res;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
// XXX Nodes that are just below the document (their parent is the
|
else if (nsnull != mDocument) {
|
||||||
// document) need to go to the document to find their previous sibling.
|
// Nodes that are just below the document (their parent is the
|
||||||
*aNode = nsnull;
|
// document) need to go to the document to find their next sibling.
|
||||||
return NS_OK;
|
PRInt32 pos;
|
||||||
|
mDocument->IndexOf(mContent, pos);
|
||||||
|
if (pos > -1 ) {
|
||||||
|
mDocument->ChildAt(--pos, sibling);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (nsnull != sibling) {
|
||||||
|
result = sibling->QueryInterface(kIDOMNodeIID,(void**)aPrevSibling);
|
||||||
|
NS_ASSERTION(NS_OK == result, "Must be a DOM Node");
|
||||||
|
NS_RELEASE(sibling); // balance the AddRef in ChildAt()
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
*aPrevSibling = nsnull;
|
||||||
|
}
|
||||||
|
|
||||||
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
nsresult
|
nsresult
|
||||||
nsGenericElement::GetNextSibling(nsIDOMNode** aNextSibling)
|
nsGenericElement::GetNextSibling(nsIDOMNode** aNextSibling)
|
||||||
{
|
{
|
||||||
|
nsIContent* sibling = nsnull;
|
||||||
|
nsresult result = NS_OK;
|
||||||
|
|
||||||
if (nsnull != mParent) {
|
if (nsnull != mParent) {
|
||||||
PRInt32 pos;
|
PRInt32 pos;
|
||||||
mParent->IndexOf(mContent, pos);
|
mParent->IndexOf(mContent, pos);
|
||||||
if (pos > -1 ) {
|
if (pos > -1 ) {
|
||||||
nsIContent* prev;
|
mParent->ChildAt(++pos, sibling);
|
||||||
mParent->ChildAt(++pos, prev);
|
|
||||||
if (nsnull != prev) {
|
|
||||||
nsresult res = prev->QueryInterface(kIDOMNodeIID,(void**)aNextSibling);
|
|
||||||
NS_ASSERTION(NS_OK == res, "Must be a DOM Node");
|
|
||||||
NS_RELEASE(prev); // balance the AddRef in ChildAt()
|
|
||||||
return res;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
// XXX Nodes that are just below the document (their parent is the
|
else if (nsnull != mDocument) {
|
||||||
// document) need to go to the document to find their next sibling.
|
// Nodes that are just below the document (their parent is the
|
||||||
*aNextSibling = nsnull;
|
// document) need to go to the document to find their next sibling.
|
||||||
return NS_OK;
|
PRInt32 pos;
|
||||||
|
mDocument->IndexOf(mContent, pos);
|
||||||
|
if (pos > -1 ) {
|
||||||
|
mDocument->ChildAt(++pos, sibling);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (nsnull != sibling) {
|
||||||
|
result = sibling->QueryInterface(kIDOMNodeIID,(void**)aNextSibling);
|
||||||
|
NS_ASSERTION(NS_OK == result, "Must be a DOM Node");
|
||||||
|
NS_RELEASE(sibling); // balance the AddRef in ChildAt()
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
*aNextSibling = nsnull;
|
||||||
|
}
|
||||||
|
|
||||||
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
nsresult
|
nsresult
|
||||||
|
@ -1436,9 +1460,6 @@ nsGenericContainerElement::GetLastChild(nsIDOMNode** aNode)
|
||||||
return NS_OK;
|
return NS_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
// XXX It's possible that newChild has already been inserted in the
|
|
||||||
// tree; if this is the case then we need to remove it from where it
|
|
||||||
// was before placing it in it's new home
|
|
||||||
|
|
||||||
nsresult
|
nsresult
|
||||||
nsGenericContainerElement::InsertBefore(nsIDOMNode* aNewChild,
|
nsGenericContainerElement::InsertBefore(nsIDOMNode* aNewChild,
|
||||||
|
|
|
@ -46,6 +46,7 @@ nsIAtom* nsLayoutAtoms::floaterList;
|
||||||
// pseudo tag names for non-element content
|
// pseudo tag names for non-element content
|
||||||
nsIAtom* nsLayoutAtoms::commentTagName;
|
nsIAtom* nsLayoutAtoms::commentTagName;
|
||||||
nsIAtom* nsLayoutAtoms::textTagName;
|
nsIAtom* nsLayoutAtoms::textTagName;
|
||||||
|
nsIAtom* nsLayoutAtoms::processingInstructionTagName;
|
||||||
nsIAtom* nsLayoutAtoms::viewportPseudo;
|
nsIAtom* nsLayoutAtoms::viewportPseudo;
|
||||||
nsIAtom* nsLayoutAtoms::pagePseudo;
|
nsIAtom* nsLayoutAtoms::pagePseudo;
|
||||||
|
|
||||||
|
@ -90,6 +91,7 @@ void nsLayoutAtoms::AddrefAtoms()
|
||||||
|
|
||||||
commentTagName = NS_NewAtom("__moz_comment");
|
commentTagName = NS_NewAtom("__moz_comment");
|
||||||
textTagName = NS_NewAtom("__moz_text");
|
textTagName = NS_NewAtom("__moz_text");
|
||||||
|
processingInstructionTagName = NS_NewAtom("__moz_pi");
|
||||||
viewportPseudo = NS_NewAtom(":-moz-viewport");
|
viewportPseudo = NS_NewAtom(":-moz-viewport");
|
||||||
pagePseudo = NS_NewAtom(":-moz-page");
|
pagePseudo = NS_NewAtom(":-moz-page");
|
||||||
|
|
||||||
|
@ -135,6 +137,7 @@ void nsLayoutAtoms::ReleaseAtoms()
|
||||||
|
|
||||||
NS_RELEASE(commentTagName);
|
NS_RELEASE(commentTagName);
|
||||||
NS_RELEASE(textTagName);
|
NS_RELEASE(textTagName);
|
||||||
|
NS_RELEASE(processingInstructionTagName);
|
||||||
NS_RELEASE(viewportPseudo);
|
NS_RELEASE(viewportPseudo);
|
||||||
NS_RELEASE(pagePseudo);
|
NS_RELEASE(pagePseudo);
|
||||||
|
|
||||||
|
|
|
@ -16,12 +16,13 @@
|
||||||
* Corporation. Portions created by Netscape are Copyright (C) 1998
|
* Corporation. Portions created by Netscape are Copyright (C) 1998
|
||||||
* Netscape Communications Corporation. All Rights Reserved.
|
* Netscape Communications Corporation. All Rights Reserved.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include "nsIDOMText.h"
|
#include "nsIDOMText.h"
|
||||||
#include "nsGenericDOMDataNode.h"
|
|
||||||
#include "nsIScriptObjectOwner.h"
|
#include "nsIScriptObjectOwner.h"
|
||||||
#include "nsIDOMEventReceiver.h"
|
#include "nsIDOMEventReceiver.h"
|
||||||
#include "nsIContent.h"
|
#include "nsIContent.h"
|
||||||
#include "nsITextContent.h"
|
#include "nsITextContent.h"
|
||||||
|
#include "nsGenericDOMDataNode.h"
|
||||||
#include "nsFrame.h"
|
#include "nsFrame.h"
|
||||||
#include "nsIDocument.h"
|
#include "nsIDocument.h"
|
||||||
#include "nsCRT.h"
|
#include "nsCRT.h"
|
||||||
|
@ -30,8 +31,6 @@
|
||||||
static NS_DEFINE_IID(kIDOMTextIID, NS_IDOMTEXT_IID);
|
static NS_DEFINE_IID(kIDOMTextIID, NS_IDOMTEXT_IID);
|
||||||
static NS_DEFINE_IID(kITextContentIID, NS_ITEXT_CONTENT_IID);
|
static NS_DEFINE_IID(kITextContentIID, NS_ITEXT_CONTENT_IID);
|
||||||
|
|
||||||
/* XXX should not be html content; should be nsITextContent */
|
|
||||||
|
|
||||||
class nsTextNode : public nsIDOMText,
|
class nsTextNode : public nsIDOMText,
|
||||||
public nsIScriptObjectOwner,
|
public nsIScriptObjectOwner,
|
||||||
public nsIDOMEventReceiver,
|
public nsIDOMEventReceiver,
|
||||||
|
@ -52,7 +51,7 @@ public:
|
||||||
NS_IMPL_IDOMCHARACTERDATA_USING_GENERIC_DOM_DATA(mInner)
|
NS_IMPL_IDOMCHARACTERDATA_USING_GENERIC_DOM_DATA(mInner)
|
||||||
|
|
||||||
// nsIDOMText
|
// nsIDOMText
|
||||||
NS_IMETHOD SplitText(PRUint32 aOffset, nsIDOMText** aReturn);
|
NS_IMPL_IDOMTEXT_USING_GENERIC_DOM_DATA(mInner)
|
||||||
|
|
||||||
// nsIScriptObjectOwner
|
// nsIScriptObjectOwner
|
||||||
NS_IMPL_ISCRIPTOBJECTOWNER_USING_GENERIC_DOM_DATA(mInner)
|
NS_IMPL_ISCRIPTOBJECTOWNER_USING_GENERIC_DOM_DATA(mInner)
|
||||||
|
@ -64,16 +63,7 @@ public:
|
||||||
NS_IMPL_ICONTENT_USING_GENERIC_DOM_DATA(mInner)
|
NS_IMPL_ICONTENT_USING_GENERIC_DOM_DATA(mInner)
|
||||||
|
|
||||||
// nsITextContent
|
// nsITextContent
|
||||||
NS_IMETHOD GetText(const nsTextFragment*& aFragmentsResult,
|
NS_IMPL_ITEXTCONTENT_USING_GENERIC_DOM_DATA(mInner)
|
||||||
PRInt32& aNumFragmentsResult);
|
|
||||||
NS_IMETHOD SetText(const PRUnichar* aBuffer,
|
|
||||||
PRInt32 aLength,
|
|
||||||
PRBool aNotify);
|
|
||||||
NS_IMETHOD SetText(const char* aBuffer,
|
|
||||||
PRInt32 aLength,
|
|
||||||
PRBool aNotify);
|
|
||||||
|
|
||||||
NS_IMETHOD IsOnlyWhitespace(PRBool* aResult);
|
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
nsGenericDOMDataNode mInner;
|
nsGenericDOMDataNode mInner;
|
||||||
|
@ -197,138 +187,3 @@ nsTextNode::HandleDOMEvent(nsIPresContext& aPresContext,
|
||||||
return mInner.HandleDOMEvent(aPresContext, aEvent, aDOMEvent,
|
return mInner.HandleDOMEvent(aPresContext, aEvent, aDOMEvent,
|
||||||
aFlags, aEventStatus);
|
aFlags, aEventStatus);
|
||||||
}
|
}
|
||||||
|
|
||||||
//----------------------------------------------------------------------
|
|
||||||
|
|
||||||
// Implementation of the nsIDOMText interface
|
|
||||||
|
|
||||||
NS_IMETHODIMP
|
|
||||||
nsTextNode::SplitText(PRUint32 aOffset, nsIDOMText** aReturn)
|
|
||||||
{
|
|
||||||
nsresult result = NS_OK;
|
|
||||||
nsIContent* newNode;
|
|
||||||
nsITextContent* text;
|
|
||||||
nsAutoString cutText;
|
|
||||||
nsIContent* parentNode;
|
|
||||||
PRUint32 length;
|
|
||||||
|
|
||||||
GetLength(&length);
|
|
||||||
// Cut the second part out of the original text node
|
|
||||||
result = SubstringData(aOffset, length-aOffset, cutText);
|
|
||||||
if (NS_OK == result) {
|
|
||||||
result = DeleteData(aOffset, length-aOffset);
|
|
||||||
if (NS_OK == result) {
|
|
||||||
// Create a new text node and set its data to the
|
|
||||||
// string we just cut out
|
|
||||||
result = NS_NewTextNode(&newNode);
|
|
||||||
if (NS_OK == result) {
|
|
||||||
result = newNode->QueryInterface(kITextContentIID, (void**)&text);
|
|
||||||
if (NS_OK == result) {
|
|
||||||
text->SetText(cutText, cutText.Length(), PR_FALSE);
|
|
||||||
// Find the parent of the current node and insert the
|
|
||||||
// new text node as a child after the current node
|
|
||||||
GetParent(parentNode);
|
|
||||||
if (nsnull != parentNode) {
|
|
||||||
PRInt32 index;
|
|
||||||
|
|
||||||
result = parentNode->IndexOf(this, index);
|
|
||||||
if (NS_OK == result) {
|
|
||||||
result = parentNode->InsertChildAt(newNode, index+1, PR_TRUE);
|
|
||||||
}
|
|
||||||
NS_RELEASE(parentNode);
|
|
||||||
}
|
|
||||||
result = text->QueryInterface(kIDOMTextIID, (void**)aReturn);
|
|
||||||
NS_RELEASE(text);
|
|
||||||
}
|
|
||||||
NS_RELEASE(newNode);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return result;
|
|
||||||
}
|
|
||||||
|
|
||||||
//----------------------------------------------------------------------
|
|
||||||
|
|
||||||
// Implementation of the nsITextContent interface
|
|
||||||
|
|
||||||
NS_IMETHODIMP
|
|
||||||
nsTextNode::GetText(const nsTextFragment*& aFragmentsResult,
|
|
||||||
PRInt32& aNumFragmentsResult)
|
|
||||||
{
|
|
||||||
aFragmentsResult = &mInner.mText;
|
|
||||||
aNumFragmentsResult = 1;
|
|
||||||
return NS_OK;
|
|
||||||
}
|
|
||||||
|
|
||||||
NS_IMETHODIMP
|
|
||||||
nsTextNode::SetText(const PRUnichar* aBuffer, PRInt32 aLength,
|
|
||||||
PRBool aNotify)
|
|
||||||
{
|
|
||||||
NS_PRECONDITION((aLength >= 0) && (nsnull != aBuffer), "bad args");
|
|
||||||
if (aLength < 0) {
|
|
||||||
return NS_ERROR_ILLEGAL_VALUE;
|
|
||||||
}
|
|
||||||
if (nsnull == aBuffer) {
|
|
||||||
return NS_ERROR_NULL_POINTER;
|
|
||||||
}
|
|
||||||
mInner.mText.SetTo(aBuffer, aLength);
|
|
||||||
|
|
||||||
// Trigger a reflow
|
|
||||||
if (aNotify && (nsnull != mInner.mDocument)) {
|
|
||||||
mInner.mDocument->ContentChanged(this, nsnull);
|
|
||||||
}
|
|
||||||
return NS_OK;
|
|
||||||
}
|
|
||||||
|
|
||||||
NS_IMETHODIMP
|
|
||||||
nsTextNode::SetText(const char* aBuffer, PRInt32 aLength,
|
|
||||||
PRBool aNotify)
|
|
||||||
{
|
|
||||||
NS_PRECONDITION((aLength >= 0) && (nsnull != aBuffer), "bad args");
|
|
||||||
if (aLength < 0) {
|
|
||||||
return NS_ERROR_ILLEGAL_VALUE;
|
|
||||||
}
|
|
||||||
if (nsnull == aBuffer) {
|
|
||||||
return NS_ERROR_NULL_POINTER;
|
|
||||||
}
|
|
||||||
mInner.mText.SetTo(aBuffer, aLength);
|
|
||||||
|
|
||||||
// Trigger a reflow
|
|
||||||
if (aNotify && (nsnull != mInner.mDocument)) {
|
|
||||||
mInner.mDocument->ContentChanged(this, nsnull);
|
|
||||||
}
|
|
||||||
return NS_OK;
|
|
||||||
}
|
|
||||||
|
|
||||||
NS_IMETHODIMP
|
|
||||||
nsTextNode::IsOnlyWhitespace(PRBool* aResult)
|
|
||||||
{
|
|
||||||
nsTextFragment& frag = mInner.mText;
|
|
||||||
if (frag.Is2b()) {
|
|
||||||
const PRUnichar* cp = frag.Get2b();
|
|
||||||
const PRUnichar* end = cp + frag.GetLength();
|
|
||||||
while (cp < end) {
|
|
||||||
PRUnichar ch = *cp++;
|
|
||||||
if (!XP_IS_SPACE(ch)) {
|
|
||||||
*aResult = PR_FALSE;
|
|
||||||
return NS_OK;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
const char* cp = frag.Get1b();
|
|
||||||
const char* end = cp + frag.GetLength();
|
|
||||||
while (cp < end) {
|
|
||||||
PRUnichar ch = PRUnichar(*(unsigned char*)cp);
|
|
||||||
cp++;
|
|
||||||
if (!XP_IS_SPACE(ch)) {
|
|
||||||
*aResult = PR_FALSE;
|
|
||||||
return NS_OK;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
*aResult = PR_TRUE;
|
|
||||||
return NS_OK;
|
|
||||||
}
|
|
||||||
|
|
|
@ -200,6 +200,7 @@ nsIAtom* nsHTMLAtoms::param;
|
||||||
nsIAtom* nsHTMLAtoms::placeholderPseudo;
|
nsIAtom* nsHTMLAtoms::placeholderPseudo;
|
||||||
nsIAtom* nsHTMLAtoms::pointSize;
|
nsIAtom* nsHTMLAtoms::pointSize;
|
||||||
nsIAtom* nsHTMLAtoms::pre;
|
nsIAtom* nsHTMLAtoms::pre;
|
||||||
|
nsIAtom* nsHTMLAtoms::processingInstructionPseudo;
|
||||||
nsIAtom* nsHTMLAtoms::profile;
|
nsIAtom* nsHTMLAtoms::profile;
|
||||||
nsIAtom* nsHTMLAtoms::prompt;
|
nsIAtom* nsHTMLAtoms::prompt;
|
||||||
nsIAtom* nsHTMLAtoms::readonly;
|
nsIAtom* nsHTMLAtoms::readonly;
|
||||||
|
@ -457,6 +458,7 @@ void nsHTMLAtoms::AddrefAtoms()
|
||||||
placeholderPseudo = NS_NewAtom(":placeholder-frame");
|
placeholderPseudo = NS_NewAtom(":placeholder-frame");
|
||||||
pointSize = NS_NewAtom("point-size");
|
pointSize = NS_NewAtom("point-size");
|
||||||
pre = NS_NewAtom("pre");
|
pre = NS_NewAtom("pre");
|
||||||
|
processingInstructionPseudo = NS_NewAtom(":-moz-pi");
|
||||||
profile = NS_NewAtom("profile");
|
profile = NS_NewAtom("profile");
|
||||||
prompt = NS_NewAtom("prompt");
|
prompt = NS_NewAtom("prompt");
|
||||||
readonly = NS_NewAtom("readonly");
|
readonly = NS_NewAtom("readonly");
|
||||||
|
@ -706,6 +708,7 @@ void nsHTMLAtoms::ReleaseAtoms()
|
||||||
NS_RELEASE(placeholderPseudo);
|
NS_RELEASE(placeholderPseudo);
|
||||||
NS_RELEASE(pointSize);
|
NS_RELEASE(pointSize);
|
||||||
NS_RELEASE(pre);
|
NS_RELEASE(pre);
|
||||||
|
NS_RELEASE(processingInstructionPseudo);
|
||||||
NS_RELEASE(profile);
|
NS_RELEASE(profile);
|
||||||
NS_RELEASE(prompt);
|
NS_RELEASE(prompt);
|
||||||
NS_RELEASE(readonly);
|
NS_RELEASE(readonly);
|
||||||
|
|
|
@ -232,6 +232,7 @@ public:
|
||||||
static nsIAtom* placeholderPseudo;
|
static nsIAtom* placeholderPseudo;
|
||||||
static nsIAtom* pointSize;
|
static nsIAtom* pointSize;
|
||||||
static nsIAtom* pre;
|
static nsIAtom* pre;
|
||||||
|
static nsIAtom* processingInstructionPseudo;
|
||||||
static nsIAtom* profile;
|
static nsIAtom* profile;
|
||||||
static nsIAtom* prompt;
|
static nsIAtom* prompt;
|
||||||
|
|
||||||
|
|
|
@ -129,6 +129,7 @@ NS_IMPL_STRING_ATTR(nsHTMLLIElement, Type, type)
|
||||||
NS_IMPL_INT_ATTR(nsHTMLLIElement, Value, value)
|
NS_IMPL_INT_ATTR(nsHTMLLIElement, Value, value)
|
||||||
|
|
||||||
static nsGenericHTMLElement::EnumTable kListItemTypeTable[] = {
|
static nsGenericHTMLElement::EnumTable kListItemTypeTable[] = {
|
||||||
|
{ "disc", NS_STYLE_LIST_STYLE_DISC },
|
||||||
{ "circle", NS_STYLE_LIST_STYLE_CIRCLE },
|
{ "circle", NS_STYLE_LIST_STYLE_CIRCLE },
|
||||||
{ "round", NS_STYLE_LIST_STYLE_CIRCLE },
|
{ "round", NS_STYLE_LIST_STYLE_CIRCLE },
|
||||||
{ "square", NS_STYLE_LIST_STYLE_SQUARE },
|
{ "square", NS_STYLE_LIST_STYLE_SQUARE },
|
||||||
|
|
|
@ -87,59 +87,6 @@ static NS_DEFINE_IID(kIHTMLContentContainerIID, NS_IHTMLCONTENTCONTAINER_IID);
|
||||||
static NS_DEFINE_IID(kIDOMHTMLElementIID, NS_IDOMHTMLELEMENT_IID);
|
static NS_DEFINE_IID(kIDOMHTMLElementIID, NS_IDOMHTMLELEMENT_IID);
|
||||||
static NS_DEFINE_IID(kIDOMHTMLBodyElementIID, NS_IDOMHTMLBODYELEMENT_IID);
|
static NS_DEFINE_IID(kIDOMHTMLBodyElementIID, NS_IDOMHTMLBODYELEMENT_IID);
|
||||||
|
|
||||||
// ==================================================================
|
|
||||||
// =
|
|
||||||
// ==================================================================
|
|
||||||
class nsHTMLDocumentChildNodes : public nsGenericDOMNodeList
|
|
||||||
{
|
|
||||||
public:
|
|
||||||
nsHTMLDocumentChildNodes(nsIDOMDocument* aDocument);
|
|
||||||
~nsHTMLDocumentChildNodes();
|
|
||||||
|
|
||||||
NS_IMETHOD GetLength(PRUint32* aLength);
|
|
||||||
NS_IMETHOD Item(PRUint32 aIndex, nsIDOMNode** aReturn);
|
|
||||||
|
|
||||||
protected:
|
|
||||||
nsIDOMDocument* mDocument;
|
|
||||||
};
|
|
||||||
|
|
||||||
nsHTMLDocumentChildNodes::nsHTMLDocumentChildNodes(nsIDOMDocument* aDocument)
|
|
||||||
{
|
|
||||||
mDocument = aDocument;
|
|
||||||
NS_ADDREF(mDocument);
|
|
||||||
}
|
|
||||||
|
|
||||||
nsHTMLDocumentChildNodes::~nsHTMLDocumentChildNodes()
|
|
||||||
{
|
|
||||||
NS_RELEASE(mDocument);
|
|
||||||
}
|
|
||||||
|
|
||||||
NS_IMETHODIMP
|
|
||||||
nsHTMLDocumentChildNodes::GetLength(PRUint32* aLength)
|
|
||||||
{
|
|
||||||
*aLength = 1;
|
|
||||||
return NS_OK;
|
|
||||||
}
|
|
||||||
|
|
||||||
NS_IMETHODIMP
|
|
||||||
nsHTMLDocumentChildNodes::Item(PRUint32 aIndex, nsIDOMNode** aReturn)
|
|
||||||
{
|
|
||||||
nsresult result = NS_OK;
|
|
||||||
if (0 == aIndex) {
|
|
||||||
nsIDOMElement* root;
|
|
||||||
|
|
||||||
result = mDocument->GetDocumentElement(&root);
|
|
||||||
if (NS_OK == result) {
|
|
||||||
result = root->QueryInterface(kIDOMNodeIID, (void**)aReturn);
|
|
||||||
NS_RELEASE(root);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
*aReturn = nsnull;
|
|
||||||
}
|
|
||||||
|
|
||||||
return result;
|
|
||||||
}
|
|
||||||
|
|
||||||
// ==================================================================
|
// ==================================================================
|
||||||
// =
|
// =
|
||||||
|
@ -840,36 +787,19 @@ nsHTMLDocument::GetElementsByTagName(const nsString& aTagname, nsIDOMNodeList**
|
||||||
NS_IMETHODIMP
|
NS_IMETHODIMP
|
||||||
nsHTMLDocument::GetChildNodes(nsIDOMNodeList** aChildNodes)
|
nsHTMLDocument::GetChildNodes(nsIDOMNodeList** aChildNodes)
|
||||||
{
|
{
|
||||||
nsHTMLDocumentChildNodes* childNodes = new nsHTMLDocumentChildNodes((nsIDOMDocument*)(nsIDOMHTMLDocument*)this);
|
return nsDocument::GetChildNodes(aChildNodes);
|
||||||
if (nsnull == childNodes) {
|
|
||||||
return NS_ERROR_OUT_OF_MEMORY;
|
|
||||||
}
|
|
||||||
|
|
||||||
return childNodes->QueryInterface(kIDOMNodeListIID, (void**)aChildNodes);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
NS_IMETHODIMP
|
NS_IMETHODIMP
|
||||||
nsHTMLDocument::GetFirstChild(nsIDOMNode** aFirstChild)
|
nsHTMLDocument::GetFirstChild(nsIDOMNode** aFirstChild)
|
||||||
{
|
{
|
||||||
if (nsnull != mRootContent) {
|
return nsDocument::GetFirstChild(aFirstChild);
|
||||||
return mRootContent->QueryInterface(kIDOMNodeIID, (void**)aFirstChild);
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
*aFirstChild = nsnull;
|
|
||||||
return NS_OK;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
NS_IMETHODIMP
|
NS_IMETHODIMP
|
||||||
nsHTMLDocument::GetLastChild(nsIDOMNode** aLastChild)
|
nsHTMLDocument::GetLastChild(nsIDOMNode** aLastChild)
|
||||||
{
|
{
|
||||||
if (nsnull != mRootContent) {
|
return nsDocument::GetLastChild(aLastChild);
|
||||||
return mRootContent->QueryInterface(kIDOMNodeIID, (void**)aLastChild);
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
*aLastChild = nsnull;
|
|
||||||
return NS_OK;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
NS_IMETHODIMP
|
NS_IMETHODIMP
|
||||||
|
@ -877,8 +807,7 @@ nsHTMLDocument::InsertBefore(nsIDOMNode* aNewChild,
|
||||||
nsIDOMNode* aRefChild,
|
nsIDOMNode* aRefChild,
|
||||||
nsIDOMNode** aReturn)
|
nsIDOMNode** aReturn)
|
||||||
{
|
{
|
||||||
*aReturn = nsnull;
|
return nsDocument::InsertBefore(aNewChild, aRefChild, aReturn);
|
||||||
return NS_OK;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
NS_IMETHODIMP
|
NS_IMETHODIMP
|
||||||
|
@ -886,29 +815,25 @@ nsHTMLDocument::ReplaceChild(nsIDOMNode* aNewChild,
|
||||||
nsIDOMNode* aOldChild,
|
nsIDOMNode* aOldChild,
|
||||||
nsIDOMNode** aReturn)
|
nsIDOMNode** aReturn)
|
||||||
{
|
{
|
||||||
*aReturn = nsnull;
|
return nsDocument::ReplaceChild(aNewChild, aOldChild, aReturn);
|
||||||
return NS_OK;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
NS_IMETHODIMP
|
NS_IMETHODIMP
|
||||||
nsHTMLDocument::RemoveChild(nsIDOMNode* aOldChild, nsIDOMNode** aReturn)
|
nsHTMLDocument::RemoveChild(nsIDOMNode* aOldChild, nsIDOMNode** aReturn)
|
||||||
{
|
{
|
||||||
*aReturn = nsnull;
|
return nsDocument::RemoveChild(aOldChild, aReturn);
|
||||||
return NS_OK;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
NS_IMETHODIMP
|
NS_IMETHODIMP
|
||||||
nsHTMLDocument::AppendChild(nsIDOMNode* aNewChild, nsIDOMNode** aReturn)
|
nsHTMLDocument::AppendChild(nsIDOMNode* aNewChild, nsIDOMNode** aReturn)
|
||||||
{
|
{
|
||||||
*aReturn = nsnull;
|
return nsDocument::AppendChild(aNewChild, aReturn);
|
||||||
return NS_OK;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
NS_IMETHODIMP
|
NS_IMETHODIMP
|
||||||
nsHTMLDocument::HasChildNodes(PRBool* aReturn)
|
nsHTMLDocument::HasChildNodes(PRBool* aReturn)
|
||||||
{
|
{
|
||||||
*aReturn = PR_TRUE;
|
return nsDocument::HasChildNodes(aReturn);
|
||||||
return NS_OK;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
NS_IMETHODIMP
|
NS_IMETHODIMP
|
||||||
|
|
|
@ -874,6 +874,10 @@ sourcetext {
|
||||||
display: none;
|
display: none;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
:-moz-pi {
|
||||||
|
display: none;
|
||||||
|
}
|
||||||
|
|
||||||
:dropdown-visible {
|
:dropdown-visible {
|
||||||
visibility: visible;
|
visibility: visible;
|
||||||
}
|
}
|
||||||
|
|
|
@ -2962,6 +2962,17 @@ nsCSSFrameConstructor::ResolveStyleContext(nsIPresContext* aPresContext,
|
||||||
parentStyleContext,
|
parentStyleContext,
|
||||||
PR_FALSE,
|
PR_FALSE,
|
||||||
aStyleContext);
|
aStyleContext);
|
||||||
|
} else if (nsLayoutAtoms::processingInstructionTagName == aTag) {
|
||||||
|
// Use a special pseudo element style context for comments
|
||||||
|
nsCOMPtr<nsIContent> parentContent;
|
||||||
|
if (nsnull != aParentFrame) {
|
||||||
|
aParentFrame->GetContent(getter_AddRefs(parentContent));
|
||||||
|
}
|
||||||
|
rv = aPresContext->ResolvePseudoStyleContextFor(parentContent,
|
||||||
|
nsHTMLAtoms::processingInstructionPseudo,
|
||||||
|
parentStyleContext,
|
||||||
|
PR_FALSE,
|
||||||
|
aStyleContext);
|
||||||
} else {
|
} else {
|
||||||
rv = aPresContext->ResolveStyleContextFor(aContent, parentStyleContext,
|
rv = aPresContext->ResolveStyleContextFor(aContent, parentStyleContext,
|
||||||
PR_FALSE,
|
PR_FALSE,
|
||||||
|
@ -3019,6 +3030,17 @@ nsCSSFrameConstructor::ConstructFrame(nsIPresContext* aPresContext,
|
||||||
parentStyleContext,
|
parentStyleContext,
|
||||||
PR_FALSE,
|
PR_FALSE,
|
||||||
getter_AddRefs(styleContext));
|
getter_AddRefs(styleContext));
|
||||||
|
} else if (nsLayoutAtoms::processingInstructionTagName == tag) {
|
||||||
|
// Use a special pseudo element style context for comments
|
||||||
|
nsCOMPtr<nsIContent> parentContent;
|
||||||
|
if (nsnull != aParentFrame) {
|
||||||
|
aParentFrame->GetContent(getter_AddRefs(parentContent));
|
||||||
|
}
|
||||||
|
rv = aPresContext->ResolvePseudoStyleContextFor(parentContent,
|
||||||
|
nsHTMLAtoms::processingInstructionPseudo,
|
||||||
|
parentStyleContext,
|
||||||
|
PR_FALSE,
|
||||||
|
getter_AddRefs(styleContext));
|
||||||
} else {
|
} else {
|
||||||
rv = aPresContext->ResolveStyleContextFor(aContent, parentStyleContext,
|
rv = aPresContext->ResolveStyleContextFor(aContent, parentStyleContext,
|
||||||
PR_FALSE,
|
PR_FALSE,
|
||||||
|
|
|
@ -1068,7 +1068,8 @@ static PRBool SelectorMatches(nsIPresContext* aPresContext,
|
||||||
nsIAtom* tag;
|
nsIAtom* tag;
|
||||||
firstChild->GetTag(tag);
|
firstChild->GetTag(tag);
|
||||||
if ((tag != nsLayoutAtoms::textTagName) &&
|
if ((tag != nsLayoutAtoms::textTagName) &&
|
||||||
(tag != nsLayoutAtoms::commentTagName)) {
|
(tag != nsLayoutAtoms::commentTagName) &&
|
||||||
|
(tag != nsLayoutAtoms::processingInstructionTagName)) {
|
||||||
NS_IF_RELEASE(tag);
|
NS_IF_RELEASE(tag);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
|
@ -1068,7 +1068,8 @@ static PRBool SelectorMatches(nsIPresContext* aPresContext,
|
||||||
nsIAtom* tag;
|
nsIAtom* tag;
|
||||||
firstChild->GetTag(tag);
|
firstChild->GetTag(tag);
|
||||||
if ((tag != nsLayoutAtoms::textTagName) &&
|
if ((tag != nsLayoutAtoms::textTagName) &&
|
||||||
(tag != nsLayoutAtoms::commentTagName)) {
|
(tag != nsLayoutAtoms::commentTagName) &&
|
||||||
|
(tag != nsLayoutAtoms::processingInstructionTagName)) {
|
||||||
NS_IF_RELEASE(tag);
|
NS_IF_RELEASE(tag);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
|
@ -874,6 +874,10 @@ sourcetext {
|
||||||
display: none;
|
display: none;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
:-moz-pi {
|
||||||
|
display: none;
|
||||||
|
}
|
||||||
|
|
||||||
:dropdown-visible {
|
:dropdown-visible {
|
||||||
visibility: visible;
|
visibility: visible;
|
||||||
}
|
}
|
||||||
|
|
|
@ -46,4 +46,13 @@ public:
|
||||||
extern nsresult
|
extern nsresult
|
||||||
NS_NewXMLElement(nsIXMLContent** aResult, nsIAtom* aTag);
|
NS_NewXMLElement(nsIXMLContent** aResult, nsIAtom* aTag);
|
||||||
|
|
||||||
|
// XXX These belongs elsewhere
|
||||||
|
extern nsresult
|
||||||
|
NS_NewXMLProcessingInstruction(nsIContent** aInstancePtrResult,
|
||||||
|
const nsString& aTarget,
|
||||||
|
const nsString& aData);
|
||||||
|
|
||||||
|
extern nsresult
|
||||||
|
NS_NewXMLCDATASection(nsIContent** aInstancePtrResult);
|
||||||
|
|
||||||
#endif // nsIXMLContent_h___
|
#endif // nsIXMLContent_h___
|
||||||
|
|
|
@ -40,6 +40,8 @@ INCLUDES += \
|
||||||
CPPSRCS = \
|
CPPSRCS = \
|
||||||
nsXMLElement.cpp \
|
nsXMLElement.cpp \
|
||||||
nsGenericXMLElement.cpp \
|
nsGenericXMLElement.cpp \
|
||||||
|
nsXMLCDATASection.cpp \
|
||||||
|
nsXMLProcessingInstruction.cpp \
|
||||||
$(NULL)
|
$(NULL)
|
||||||
|
|
||||||
EXPORTS = \
|
EXPORTS = \
|
||||||
|
|
|
@ -26,11 +26,15 @@ DEFINES=-D_IMPL_NS_HTML -DWIN32_LEAN_AND_MEAN
|
||||||
CPPSRCS= \
|
CPPSRCS= \
|
||||||
nsXMLElement.cpp \
|
nsXMLElement.cpp \
|
||||||
nsGenericXMLElement.cpp \
|
nsGenericXMLElement.cpp \
|
||||||
|
nsXMLCDATASection.cpp \
|
||||||
|
nsXMLProcessingInstruction.cpp \
|
||||||
$(NULL)
|
$(NULL)
|
||||||
|
|
||||||
CPP_OBJS= \
|
CPP_OBJS= \
|
||||||
.\$(OBJDIR)\nsXMLElement.obj \
|
.\$(OBJDIR)\nsXMLElement.obj \
|
||||||
.\$(OBJDIR)\nsGenericXMLElement.obj \
|
.\$(OBJDIR)\nsGenericXMLElement.obj \
|
||||||
|
.\$(OBJDIR)\nsXMLCDATASection.obj \
|
||||||
|
.\$(OBJDIR)\nsXMLProcessingInstruction.obj \
|
||||||
$(NULL)
|
$(NULL)
|
||||||
|
|
||||||
EXPORTS = \
|
EXPORTS = \
|
||||||
|
|
|
@ -0,0 +1,195 @@
|
||||||
|
/* -*- 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.0 (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 Communicator client 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.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "nsIDOMCDATASection.h"
|
||||||
|
#include "nsIScriptObjectOwner.h"
|
||||||
|
#include "nsIDOMEventReceiver.h"
|
||||||
|
#include "nsIContent.h"
|
||||||
|
#include "nsITextContent.h"
|
||||||
|
#include "nsGenericDOMDataNode.h"
|
||||||
|
#include "nsFrame.h"
|
||||||
|
#include "nsIDocument.h"
|
||||||
|
#include "nsCRT.h"
|
||||||
|
#include "nsLayoutAtoms.h"
|
||||||
|
#include "nsIXMLContent.h"
|
||||||
|
|
||||||
|
static NS_DEFINE_IID(kIDOMCDATASectionIID, NS_IDOMCDATASECTION_IID);
|
||||||
|
static NS_DEFINE_IID(kIDOMTextIID, NS_IDOMTEXT_IID);
|
||||||
|
static NS_DEFINE_IID(kITextContentIID, NS_ITEXT_CONTENT_IID);
|
||||||
|
|
||||||
|
class nsXMLCDATASection : public nsIDOMCDATASection,
|
||||||
|
public nsIScriptObjectOwner,
|
||||||
|
public nsIDOMEventReceiver,
|
||||||
|
public nsIContent,
|
||||||
|
public nsITextContent
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
nsXMLCDATASection();
|
||||||
|
virtual ~nsXMLCDATASection();
|
||||||
|
|
||||||
|
// nsISupports
|
||||||
|
NS_DECL_ISUPPORTS
|
||||||
|
|
||||||
|
// nsIDOMNode
|
||||||
|
NS_IMPL_IDOMNODE_USING_GENERIC_DOM_DATA(mInner)
|
||||||
|
|
||||||
|
// nsIDOMCharacterData
|
||||||
|
NS_IMPL_IDOMCHARACTERDATA_USING_GENERIC_DOM_DATA(mInner)
|
||||||
|
|
||||||
|
// nsIDOMText
|
||||||
|
NS_IMPL_IDOMTEXT_USING_GENERIC_DOM_DATA(mInner)
|
||||||
|
|
||||||
|
// nsIScriptObjectOwner
|
||||||
|
NS_IMPL_ISCRIPTOBJECTOWNER_USING_GENERIC_DOM_DATA(mInner)
|
||||||
|
|
||||||
|
// nsIDOMEventReceiver
|
||||||
|
NS_IMPL_IDOMEVENTRECEIVER_USING_GENERIC_DOM_DATA(mInner)
|
||||||
|
|
||||||
|
// nsIContent
|
||||||
|
NS_IMPL_ICONTENT_USING_GENERIC_DOM_DATA(mInner)
|
||||||
|
|
||||||
|
// nsITextContent
|
||||||
|
NS_IMPL_ITEXTCONTENT_USING_GENERIC_DOM_DATA(mInner)
|
||||||
|
|
||||||
|
protected:
|
||||||
|
nsGenericDOMDataNode mInner;
|
||||||
|
};
|
||||||
|
|
||||||
|
nsresult
|
||||||
|
NS_NewXMLCDATASection(nsIContent** aInstancePtrResult)
|
||||||
|
{
|
||||||
|
NS_PRECONDITION(nsnull != aInstancePtrResult, "null ptr");
|
||||||
|
if (nsnull == aInstancePtrResult) {
|
||||||
|
return NS_ERROR_NULL_POINTER;
|
||||||
|
}
|
||||||
|
nsIContent* it = new nsXMLCDATASection();
|
||||||
|
if (nsnull == it) {
|
||||||
|
return NS_ERROR_OUT_OF_MEMORY;
|
||||||
|
}
|
||||||
|
return it->QueryInterface(kIContentIID, (void **) aInstancePtrResult);
|
||||||
|
}
|
||||||
|
|
||||||
|
nsXMLCDATASection::nsXMLCDATASection()
|
||||||
|
{
|
||||||
|
NS_INIT_REFCNT();
|
||||||
|
mInner.Init(this);
|
||||||
|
}
|
||||||
|
|
||||||
|
nsXMLCDATASection::~nsXMLCDATASection()
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
NS_IMPL_ADDREF(nsXMLCDATASection)
|
||||||
|
NS_IMPL_RELEASE(nsXMLCDATASection)
|
||||||
|
|
||||||
|
NS_IMETHODIMP
|
||||||
|
nsXMLCDATASection::QueryInterface(REFNSIID aIID, void** aInstancePtr)
|
||||||
|
{
|
||||||
|
NS_IMPL_DOM_DATA_QUERY_INTERFACE(aIID, aInstancePtr, this)
|
||||||
|
if (aIID.Equals(kIDOMCDATASectionIID)) {
|
||||||
|
nsIDOMCDATASection* tmp = this;
|
||||||
|
*aInstancePtr = (void*) tmp;
|
||||||
|
NS_ADDREF_THIS();
|
||||||
|
return NS_OK;
|
||||||
|
}
|
||||||
|
if (aIID.Equals(kIDOMTextIID)) {
|
||||||
|
nsIDOMText* tmp = this;
|
||||||
|
*aInstancePtr = (void*) tmp;
|
||||||
|
NS_ADDREF_THIS();
|
||||||
|
return NS_OK;
|
||||||
|
}
|
||||||
|
if (aIID.Equals(kITextContentIID)) {
|
||||||
|
nsITextContent* tmp = this;
|
||||||
|
*aInstancePtr = (void*) tmp;
|
||||||
|
NS_ADDREF_THIS();
|
||||||
|
return NS_OK;
|
||||||
|
}
|
||||||
|
return NS_NOINTERFACE;
|
||||||
|
}
|
||||||
|
|
||||||
|
NS_IMETHODIMP
|
||||||
|
nsXMLCDATASection::GetTag(nsIAtom*& aResult) const
|
||||||
|
{
|
||||||
|
aResult = nsLayoutAtoms::textTagName;
|
||||||
|
NS_ADDREF(aResult);
|
||||||
|
return NS_OK;
|
||||||
|
}
|
||||||
|
|
||||||
|
NS_IMETHODIMP
|
||||||
|
nsXMLCDATASection::GetNodeName(nsString& aNodeName)
|
||||||
|
{
|
||||||
|
aNodeName.SetString("#cdata-section");
|
||||||
|
return NS_OK;
|
||||||
|
}
|
||||||
|
|
||||||
|
NS_IMETHODIMP
|
||||||
|
nsXMLCDATASection::GetNodeType(PRUint16* aNodeType)
|
||||||
|
{
|
||||||
|
*aNodeType = (PRUint16)nsIDOMNode::CDATA_SECTION_NODE;
|
||||||
|
return NS_OK;
|
||||||
|
}
|
||||||
|
|
||||||
|
NS_IMETHODIMP
|
||||||
|
nsXMLCDATASection::CloneNode(PRBool aDeep, nsIDOMNode** aReturn)
|
||||||
|
{
|
||||||
|
nsXMLCDATASection* it;
|
||||||
|
NS_NEWXPCOM(it, nsXMLCDATASection);
|
||||||
|
if (nsnull == it) {
|
||||||
|
return NS_ERROR_OUT_OF_MEMORY;
|
||||||
|
}
|
||||||
|
nsAutoString data;
|
||||||
|
nsresult result = GetData(data);
|
||||||
|
if (NS_FAILED(result)) {
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
result = it->SetData(data);
|
||||||
|
if (NS_FAILED(result)) {
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
return it->QueryInterface(kIDOMNodeIID, (void**) aReturn);
|
||||||
|
}
|
||||||
|
|
||||||
|
NS_IMETHODIMP
|
||||||
|
nsXMLCDATASection::List(FILE* out, PRInt32 aIndent) const
|
||||||
|
{
|
||||||
|
NS_PRECONDITION(nsnull != mInner.mDocument, "bad content");
|
||||||
|
|
||||||
|
PRInt32 index;
|
||||||
|
for (index = aIndent; --index >= 0; ) fputs(" ", out);
|
||||||
|
|
||||||
|
fprintf(out, "CDATASection refcount=%d<", mRefCnt);
|
||||||
|
|
||||||
|
nsAutoString tmp;
|
||||||
|
mInner.ToCString(tmp, 0, mInner.mText.GetLength());
|
||||||
|
fputs(tmp, out);
|
||||||
|
|
||||||
|
fputs(">\n", out);
|
||||||
|
return NS_OK;
|
||||||
|
}
|
||||||
|
|
||||||
|
NS_IMETHODIMP
|
||||||
|
nsXMLCDATASection::HandleDOMEvent(nsIPresContext& aPresContext,
|
||||||
|
nsEvent* aEvent,
|
||||||
|
nsIDOMEvent** aDOMEvent,
|
||||||
|
PRUint32 aFlags,
|
||||||
|
nsEventStatus& aEventStatus)
|
||||||
|
{
|
||||||
|
return mInner.HandleDOMEvent(aPresContext, aEvent, aDOMEvent,
|
||||||
|
aFlags, aEventStatus);
|
||||||
|
}
|
|
@ -0,0 +1,275 @@
|
||||||
|
/* -*- 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.0 (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 Communicator client 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.
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
#include "nsIDOMProcessingInstruction.h"
|
||||||
|
#include "nsIScriptObjectOwner.h"
|
||||||
|
#include "nsIDOMEventReceiver.h"
|
||||||
|
#include "nsIContent.h"
|
||||||
|
#include "nsGenericDOMDataNode.h"
|
||||||
|
#include "nsGenericElement.h"
|
||||||
|
#include "nsIDOMScriptObjectFactory.h"
|
||||||
|
#include "nsLayoutAtoms.h"
|
||||||
|
#include "nsString.h"
|
||||||
|
#include "nsIXMLContent.h"
|
||||||
|
|
||||||
|
static NS_DEFINE_IID(kIDOMProcessingInstructionIID, NS_IDOMPROCESSINGINSTRUCTION_IID);
|
||||||
|
|
||||||
|
class nsXMLProcessingInstruction : public nsIDOMProcessingInstruction,
|
||||||
|
public nsIScriptObjectOwner,
|
||||||
|
public nsIDOMEventReceiver,
|
||||||
|
public nsIContent
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
nsXMLProcessingInstruction(const nsString& aTarget, const nsString& aData);
|
||||||
|
virtual ~nsXMLProcessingInstruction();
|
||||||
|
|
||||||
|
// nsISupports
|
||||||
|
NS_DECL_ISUPPORTS
|
||||||
|
|
||||||
|
// nsIDOMNode
|
||||||
|
NS_IMPL_IDOMNODE_USING_GENERIC_DOM_DATA(mInner)
|
||||||
|
|
||||||
|
// nsIDOMProcessingInstruction
|
||||||
|
NS_IMETHOD GetTarget(nsString& aTarget);
|
||||||
|
NS_IMETHOD GetData(nsString& aData);
|
||||||
|
NS_IMETHOD SetData(const nsString& aData);
|
||||||
|
|
||||||
|
// nsIScriptObjectOwner interface
|
||||||
|
NS_IMETHOD GetScriptObject(nsIScriptContext* aContext, void** aScriptObject);
|
||||||
|
NS_IMETHOD SetScriptObject(void *aScriptObject);
|
||||||
|
|
||||||
|
// nsIDOMEventReceiver
|
||||||
|
NS_IMPL_IDOMEVENTRECEIVER_USING_GENERIC_DOM_DATA(mInner)
|
||||||
|
|
||||||
|
// nsIContent
|
||||||
|
NS_IMPL_ICONTENT_USING_GENERIC_DOM_DATA(mInner)
|
||||||
|
|
||||||
|
protected:
|
||||||
|
// XXX Processing instructions are currently implemented by using
|
||||||
|
// the generic CharacterData inner object, even though PIs are not
|
||||||
|
// character data. This is done simply for convenience and should
|
||||||
|
// be changed if this restricts what should be done for character data.
|
||||||
|
nsGenericDOMDataNode mInner;
|
||||||
|
nsString mTarget;
|
||||||
|
void* mScriptObject;
|
||||||
|
};
|
||||||
|
|
||||||
|
nsresult
|
||||||
|
NS_NewXMLProcessingInstruction(nsIContent** aInstancePtrResult,
|
||||||
|
const nsString& aTarget,
|
||||||
|
const nsString& aData)
|
||||||
|
{
|
||||||
|
NS_PRECONDITION(nsnull != aInstancePtrResult, "null ptr");
|
||||||
|
if (nsnull == aInstancePtrResult) {
|
||||||
|
return NS_ERROR_NULL_POINTER;
|
||||||
|
}
|
||||||
|
nsIContent* it = new nsXMLProcessingInstruction(aTarget, aData);
|
||||||
|
if (nsnull == it) {
|
||||||
|
return NS_ERROR_OUT_OF_MEMORY;
|
||||||
|
}
|
||||||
|
return it->QueryInterface(kIContentIID, (void **) aInstancePtrResult);
|
||||||
|
}
|
||||||
|
|
||||||
|
nsXMLProcessingInstruction::nsXMLProcessingInstruction(const nsString& aTarget,
|
||||||
|
const nsString& aData) :
|
||||||
|
mTarget(aTarget)
|
||||||
|
{
|
||||||
|
NS_INIT_REFCNT();
|
||||||
|
mInner.Init(this);
|
||||||
|
mInner.SetData(aData);
|
||||||
|
mScriptObject = nsnull;
|
||||||
|
}
|
||||||
|
|
||||||
|
nsXMLProcessingInstruction::~nsXMLProcessingInstruction()
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
NS_IMPL_ADDREF(nsXMLProcessingInstruction)
|
||||||
|
NS_IMPL_RELEASE(nsXMLProcessingInstruction)
|
||||||
|
|
||||||
|
nsresult
|
||||||
|
nsXMLProcessingInstruction::QueryInterface(REFNSIID aIID, void** aInstancePtrResult)
|
||||||
|
{
|
||||||
|
if (NULL == aInstancePtrResult) {
|
||||||
|
return NS_ERROR_NULL_POINTER;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (aIID.Equals(kISupportsIID)) {
|
||||||
|
nsIDOMProcessingInstruction* tmp = this;
|
||||||
|
nsISupports* tmp2 = tmp;
|
||||||
|
*aInstancePtrResult = (void*) tmp2;
|
||||||
|
NS_ADDREF_THIS();
|
||||||
|
return NS_OK;
|
||||||
|
}
|
||||||
|
if (aIID.Equals(kIDOMNodeIID)) {
|
||||||
|
nsIDOMNode* tmp = this;
|
||||||
|
*aInstancePtrResult = (void*) tmp;
|
||||||
|
NS_ADDREF_THIS();
|
||||||
|
return NS_OK;
|
||||||
|
}
|
||||||
|
if (aIID.Equals(kIDOMEventReceiverIID)) {
|
||||||
|
nsIDOMEventReceiver* tmp = this;
|
||||||
|
*aInstancePtrResult = (void*) tmp;
|
||||||
|
NS_ADDREF_THIS();
|
||||||
|
return NS_OK;
|
||||||
|
}
|
||||||
|
if (aIID.Equals(kIScriptObjectOwnerIID)) {
|
||||||
|
nsIScriptObjectOwner* tmp = this;
|
||||||
|
*aInstancePtrResult = (void*) tmp;
|
||||||
|
NS_ADDREF_THIS();
|
||||||
|
return NS_OK;
|
||||||
|
}
|
||||||
|
if (aIID.Equals(kIContentIID)) {
|
||||||
|
nsIContent* tmp = this;
|
||||||
|
*aInstancePtrResult = (void*) tmp;
|
||||||
|
NS_ADDREF_THIS();
|
||||||
|
return NS_OK;
|
||||||
|
}
|
||||||
|
if (aIID.Equals(kIDOMProcessingInstructionIID)) {
|
||||||
|
nsIDOMProcessingInstruction* tmp = this;
|
||||||
|
*aInstancePtrResult = (void*) tmp;
|
||||||
|
NS_ADDREF_THIS();
|
||||||
|
return NS_OK;
|
||||||
|
}
|
||||||
|
return NS_NOINTERFACE;
|
||||||
|
}
|
||||||
|
|
||||||
|
NS_IMETHODIMP
|
||||||
|
nsXMLProcessingInstruction::GetTarget(nsString& aTarget)
|
||||||
|
{
|
||||||
|
aTarget.SetString(mTarget);
|
||||||
|
|
||||||
|
return NS_OK;
|
||||||
|
}
|
||||||
|
|
||||||
|
NS_IMETHODIMP
|
||||||
|
nsXMLProcessingInstruction::GetData(nsString& aData)
|
||||||
|
{
|
||||||
|
return mInner.GetData(aData);
|
||||||
|
}
|
||||||
|
|
||||||
|
NS_IMETHODIMP
|
||||||
|
nsXMLProcessingInstruction::SetData(const nsString& aData)
|
||||||
|
{
|
||||||
|
// XXX Check if this is a stylesheet PI. If so, we may need
|
||||||
|
// to parse the contents and see if anything has changed.
|
||||||
|
return mInner.SetData(aData);
|
||||||
|
}
|
||||||
|
|
||||||
|
NS_IMETHODIMP
|
||||||
|
nsXMLProcessingInstruction::GetScriptObject(nsIScriptContext* aContext,
|
||||||
|
void** aScriptObject)
|
||||||
|
{
|
||||||
|
nsresult res = NS_OK;
|
||||||
|
if (nsnull == mScriptObject) {
|
||||||
|
nsIDOMScriptObjectFactory *factory;
|
||||||
|
|
||||||
|
res = nsGenericElement::GetScriptObjectFactory(&factory);
|
||||||
|
if (NS_OK != res) {
|
||||||
|
return res;
|
||||||
|
}
|
||||||
|
|
||||||
|
res = factory->NewScriptProcessingInstruction(aContext,
|
||||||
|
(nsISupports*)(nsIDOMProcessingInstruction*)this,
|
||||||
|
mInner.mParent,
|
||||||
|
(void**)&mScriptObject);
|
||||||
|
|
||||||
|
NS_RELEASE(factory);
|
||||||
|
}
|
||||||
|
*aScriptObject = mScriptObject;
|
||||||
|
return res;
|
||||||
|
}
|
||||||
|
|
||||||
|
NS_IMETHODIMP
|
||||||
|
nsXMLProcessingInstruction::SetScriptObject(void *aScriptObject)
|
||||||
|
{
|
||||||
|
mScriptObject = aScriptObject;
|
||||||
|
return NS_OK;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
NS_IMETHODIMP
|
||||||
|
nsXMLProcessingInstruction::GetTag(nsIAtom*& aResult) const
|
||||||
|
{
|
||||||
|
aResult = nsLayoutAtoms::processingInstructionTagName;
|
||||||
|
NS_ADDREF(aResult);
|
||||||
|
return NS_OK;
|
||||||
|
}
|
||||||
|
|
||||||
|
NS_IMETHODIMP
|
||||||
|
nsXMLProcessingInstruction::GetNodeName(nsString& aNodeName)
|
||||||
|
{
|
||||||
|
aNodeName.SetString(mTarget);
|
||||||
|
return NS_OK;
|
||||||
|
}
|
||||||
|
|
||||||
|
NS_IMETHODIMP
|
||||||
|
nsXMLProcessingInstruction::GetNodeType(PRUint16* aNodeType)
|
||||||
|
{
|
||||||
|
*aNodeType = (PRUint16)nsIDOMNode::PROCESSING_INSTRUCTION_NODE;
|
||||||
|
return NS_OK;
|
||||||
|
}
|
||||||
|
|
||||||
|
NS_IMETHODIMP
|
||||||
|
nsXMLProcessingInstruction::CloneNode(PRBool aDeep, nsIDOMNode** aReturn)
|
||||||
|
{
|
||||||
|
nsString data;
|
||||||
|
mInner.GetData(data);
|
||||||
|
|
||||||
|
nsXMLProcessingInstruction* it = new nsXMLProcessingInstruction(mTarget,
|
||||||
|
data);
|
||||||
|
if (nsnull == it) {
|
||||||
|
return NS_ERROR_OUT_OF_MEMORY;
|
||||||
|
}
|
||||||
|
return it->QueryInterface(kIDOMNodeIID, (void**) aReturn);
|
||||||
|
}
|
||||||
|
|
||||||
|
NS_IMETHODIMP
|
||||||
|
nsXMLProcessingInstruction::List(FILE* out, PRInt32 aIndent) const
|
||||||
|
{
|
||||||
|
NS_PRECONDITION(nsnull != mInner.mDocument, "bad content");
|
||||||
|
|
||||||
|
PRInt32 index;
|
||||||
|
for (index = aIndent; --index >= 0; ) fputs(" ", out);
|
||||||
|
|
||||||
|
fprintf(out, "Processing instruction refcount=%d<", mRefCnt);
|
||||||
|
|
||||||
|
nsAutoString tmp;
|
||||||
|
mInner.ToCString(tmp, 0, mInner.mText.GetLength());
|
||||||
|
tmp.Insert(mTarget, 0);
|
||||||
|
fputs(tmp, out);
|
||||||
|
|
||||||
|
fputs(">\n", out);
|
||||||
|
return NS_OK;
|
||||||
|
}
|
||||||
|
|
||||||
|
NS_IMETHODIMP
|
||||||
|
nsXMLProcessingInstruction::HandleDOMEvent(nsIPresContext& aPresContext,
|
||||||
|
nsEvent* aEvent,
|
||||||
|
nsIDOMEvent** aDOMEvent,
|
||||||
|
PRUint32 aFlags,
|
||||||
|
nsEventStatus& aEventStatus)
|
||||||
|
{
|
||||||
|
// We should never be getting events
|
||||||
|
NS_ASSERTION(0, "event handler called for processing instruction");
|
||||||
|
return mInner.HandleDOMEvent(aPresContext, aEvent, aDOMEvent,
|
||||||
|
aFlags, aEventStatus);
|
||||||
|
}
|
||||||
|
|
|
@ -34,14 +34,6 @@ class nsIAtom;
|
||||||
*/
|
*/
|
||||||
class nsIXMLDocument : public nsISupports {
|
class nsIXMLDocument : public nsISupports {
|
||||||
public:
|
public:
|
||||||
NS_IMETHOD PrologElementAt(PRUint32 aOffset, nsIContent** aContent)=0;
|
|
||||||
NS_IMETHOD PrologCount(PRUint32* aCount)=0;
|
|
||||||
NS_IMETHOD AppendToProlog(nsIContent* aContent)=0;
|
|
||||||
|
|
||||||
NS_IMETHOD EpilogElementAt(PRUint32 aOffset, nsIContent** aContent)=0;
|
|
||||||
NS_IMETHOD EpilogCount(PRUint32* aCount)=0;
|
|
||||||
NS_IMETHOD AppendToEpilog(nsIContent* aContent)=0;
|
|
||||||
|
|
||||||
// XXX This (or a variant thereof) should be in a DOM interface.
|
// XXX This (or a variant thereof) should be in a DOM interface.
|
||||||
// Since it isn't, we add it here temporarily
|
// Since it isn't, we add it here temporarily
|
||||||
NS_IMETHOD GetContentById(const nsString& aName, nsIContent** aContent)=0;
|
NS_IMETHOD GetContentById(const nsString& aName, nsIContent** aContent)=0;
|
||||||
|
|
|
@ -34,6 +34,7 @@
|
||||||
#include "nsIPresShell.h"
|
#include "nsIPresShell.h"
|
||||||
#include "nsIViewManager.h"
|
#include "nsIViewManager.h"
|
||||||
#include "nsIDOMComment.h"
|
#include "nsIDOMComment.h"
|
||||||
|
#include "nsIDOMCDATASection.h"
|
||||||
#include "nsIHTMLContent.h"
|
#include "nsIHTMLContent.h"
|
||||||
#include "nsHTMLEntities.h"
|
#include "nsHTMLEntities.h"
|
||||||
#include "nsHTMLParts.h"
|
#include "nsHTMLParts.h"
|
||||||
|
@ -56,7 +57,7 @@
|
||||||
|
|
||||||
static char kNameSpaceSeparator[] = ":";
|
static char kNameSpaceSeparator[] = ":";
|
||||||
static char kNameSpaceDef[] = "xmlns";
|
static char kNameSpaceDef[] = "xmlns";
|
||||||
static char kStyleSheetPI[] = "<?xml-stylesheet";
|
static char kStyleSheetPI[] = "xml-stylesheet";
|
||||||
static char kCSSType[] = "text/css";
|
static char kCSSType[] = "text/css";
|
||||||
|
|
||||||
#ifdef XSL
|
#ifdef XSL
|
||||||
|
@ -70,6 +71,7 @@ static NS_DEFINE_IID(kIXMLDocumentIID, NS_IXMLDOCUMENT_IID);
|
||||||
static NS_DEFINE_IID(kIDOMCommentIID, NS_IDOMCOMMENT_IID);
|
static NS_DEFINE_IID(kIDOMCommentIID, NS_IDOMCOMMENT_IID);
|
||||||
static NS_DEFINE_IID(kIScrollableViewIID, NS_ISCROLLABLEVIEW_IID);
|
static NS_DEFINE_IID(kIScrollableViewIID, NS_ISCROLLABLEVIEW_IID);
|
||||||
static NS_DEFINE_IID(kIDOMNodeIID, NS_IDOMNODE_IID);
|
static NS_DEFINE_IID(kIDOMNodeIID, NS_IDOMNODE_IID);
|
||||||
|
static NS_DEFINE_IID(kIDOMCDATASectionIID, NS_IDOMCDATASECTION_IID);
|
||||||
|
|
||||||
static void SetTextStringOnTextNode(const nsString& aTextString, nsIContent* aTextNode);
|
static void SetTextStringOnTextNode(const nsString& aTextString, nsIContent* aTextNode);
|
||||||
|
|
||||||
|
@ -704,10 +706,13 @@ nsXMLContentSink::AddLeaf(const nsIParserNode& aNode)
|
||||||
case eToken_text:
|
case eToken_text:
|
||||||
case eToken_whitespace:
|
case eToken_whitespace:
|
||||||
case eToken_newline:
|
case eToken_newline:
|
||||||
case eToken_cdatasection:
|
|
||||||
AddText(aNode.GetText());
|
AddText(aNode.GetText());
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
case eToken_cdatasection:
|
||||||
|
AddCDATASection(aNode);
|
||||||
|
break;
|
||||||
|
|
||||||
case eToken_entity:
|
case eToken_entity:
|
||||||
{
|
{
|
||||||
nsAutoString tmp;
|
nsAutoString tmp;
|
||||||
|
@ -854,15 +859,13 @@ nsXMLContentSink::AddXMLDecl(const nsIParserNode& aNode)
|
||||||
nsresult
|
nsresult
|
||||||
nsXMLContentSink::AddContentAsLeaf(nsIContent *aContent)
|
nsXMLContentSink::AddContentAsLeaf(nsIContent *aContent)
|
||||||
{
|
{
|
||||||
nsIXMLDocument *xmlDoc;
|
nsresult result = NS_OK;
|
||||||
nsresult result = mDocument->QueryInterface(kIXMLDocumentIID,
|
|
||||||
(void **)&xmlDoc);
|
|
||||||
|
|
||||||
if (eXMLContentSinkState_InProlog == mState) {
|
if (eXMLContentSinkState_InProlog == mState) {
|
||||||
result = xmlDoc->AppendToProlog(aContent);
|
result = mDocument->AppendToProlog(aContent);
|
||||||
}
|
}
|
||||||
else if (eXMLContentSinkState_InEpilog == mState) {
|
else if (eXMLContentSinkState_InEpilog == mState) {
|
||||||
result = xmlDoc->AppendToEpilog(aContent);
|
result = mDocument->AppendToEpilog(aContent);
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
nsIContent *parent = GetCurrentContent();
|
nsIContent *parent = GetCurrentContent();
|
||||||
|
@ -872,7 +875,6 @@ nsXMLContentSink::AddContentAsLeaf(nsIContent *aContent)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
NS_RELEASE(xmlDoc);
|
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -903,6 +905,33 @@ nsXMLContentSink::AddComment(const nsIParserNode& aNode)
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
NS_IMETHODIMP
|
||||||
|
nsXMLContentSink::AddCDATASection(const nsIParserNode& aNode)
|
||||||
|
{
|
||||||
|
FlushText();
|
||||||
|
|
||||||
|
nsAutoString text;
|
||||||
|
nsIContent *cdata;
|
||||||
|
nsIDOMCDATASection *domCDATA;
|
||||||
|
nsresult result = NS_OK;
|
||||||
|
|
||||||
|
text = aNode.GetText();
|
||||||
|
result = NS_NewXMLCDATASection(&cdata);
|
||||||
|
if (NS_OK == result) {
|
||||||
|
result = cdata->QueryInterface(kIDOMCDATASectionIID, (void **)&domCDATA);
|
||||||
|
if (NS_OK == result) {
|
||||||
|
domCDATA->AppendData(text);
|
||||||
|
NS_RELEASE(domCDATA);
|
||||||
|
|
||||||
|
cdata->SetDocument(mDocument, PR_FALSE);
|
||||||
|
result = AddContentAsLeaf(cdata);
|
||||||
|
}
|
||||||
|
NS_RELEASE(cdata);
|
||||||
|
}
|
||||||
|
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
// XXX Borrowed from HTMLContentSink. Should be shared.
|
// XXX Borrowed from HTMLContentSink. Should be shared.
|
||||||
NS_IMETHODIMP
|
NS_IMETHODIMP
|
||||||
nsXMLContentSink::LoadStyleSheet(nsIURL* aURL,
|
nsXMLContentSink::LoadStyleSheet(nsIURL* aURL,
|
||||||
|
@ -1088,87 +1117,111 @@ nsXMLContentSink::LoadXSLStyleSheet(const nsIURL* aUrl)
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
static void
|
||||||
|
ParseProcessingInstruction(const nsString& aText,
|
||||||
|
nsString& aTarget,
|
||||||
|
nsString& aData)
|
||||||
|
{
|
||||||
|
PRInt32 offset;
|
||||||
|
|
||||||
|
aTarget.Truncate();
|
||||||
|
aData.Truncate();
|
||||||
|
|
||||||
|
offset = aText.FindCharInSet(" \n\r\t");
|
||||||
|
if (-1 != offset) {
|
||||||
|
aText.Mid(aTarget, 2, offset-2);
|
||||||
|
aText.Mid(aData, offset+1, aText.Length()-offset-3);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
#ifndef XSL
|
#ifndef XSL
|
||||||
NS_IMETHODIMP
|
NS_IMETHODIMP
|
||||||
nsXMLContentSink::AddProcessingInstruction(const nsIParserNode& aNode)
|
nsXMLContentSink::AddProcessingInstruction(const nsIParserNode& aNode)
|
||||||
{
|
{
|
||||||
|
nsresult result = NS_OK;
|
||||||
|
nsAutoString text, target, data;
|
||||||
|
nsIContent* node;
|
||||||
|
|
||||||
FlushText();
|
FlushText();
|
||||||
|
|
||||||
// XXX For now, we don't add the PI to the content model.
|
|
||||||
// We just check for a style sheet PI
|
|
||||||
nsAutoString text, type, href, title, media;
|
|
||||||
PRInt32 offset;
|
|
||||||
nsresult result = NS_OK;
|
|
||||||
|
|
||||||
text = aNode.GetText();
|
text = aNode.GetText();
|
||||||
|
ParseProcessingInstruction(text, target, data);
|
||||||
|
result = NS_NewXMLProcessingInstruction(&node, target, data);
|
||||||
|
if (NS_OK == result) {
|
||||||
|
node->SetDocument(mDocument, PR_FALSE);
|
||||||
|
result = AddContentAsLeaf(node);
|
||||||
|
}
|
||||||
|
|
||||||
offset = text.Find(kStyleSheetPI);
|
if (NS_OK == result) {
|
||||||
// If it's a stylesheet PI...
|
nsAutoString type, href, title, media;
|
||||||
if (0 == offset) {
|
|
||||||
result = GetQuotedAttributeValue(text, "href", href);
|
|
||||||
// If there was an error or there's no href, we can't do
|
|
||||||
// anything with this PI
|
|
||||||
if ((NS_OK != result) || (0 == href.Length())) {
|
|
||||||
return result;
|
|
||||||
}
|
|
||||||
|
|
||||||
result = GetQuotedAttributeValue(text, "type", type);
|
// If it's a stylesheet PI...
|
||||||
if (NS_OK != result) {
|
if (target.EqualsIgnoreCase(kStyleSheetPI)) {
|
||||||
return result;
|
result = GetQuotedAttributeValue(text, "href", href);
|
||||||
}
|
// If there was an error or there's no href, we can't do
|
||||||
result = GetQuotedAttributeValue(text, "title", title);
|
// anything with this PI
|
||||||
if (NS_OK != result) {
|
if ((NS_OK != result) || (0 == href.Length())) {
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
title.CompressWhitespace();
|
|
||||||
result = GetQuotedAttributeValue(text, "media", media);
|
|
||||||
if (NS_OK != result) {
|
|
||||||
return result;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (type.Equals(kCSSType)) {
|
|
||||||
// Use the SRC attribute value to load the URL
|
|
||||||
nsIURL* url = nsnull;
|
|
||||||
nsAutoString absURL;
|
|
||||||
nsIURL* docURL = mDocument->GetDocumentURL();
|
|
||||||
nsIURLGroup* urlGroup;
|
|
||||||
|
|
||||||
result = docURL->GetURLGroup(&urlGroup);
|
result = GetQuotedAttributeValue(text, "type", type);
|
||||||
|
|
||||||
if ((NS_OK == result) && urlGroup) {
|
|
||||||
result = urlGroup->CreateURL(&url, docURL, href, nsnull);
|
|
||||||
NS_RELEASE(urlGroup);
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
result = NS_NewURL(&url, absURL);
|
|
||||||
}
|
|
||||||
NS_RELEASE(docURL);
|
|
||||||
if (NS_OK != result) {
|
if (NS_OK != result) {
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
result = GetQuotedAttributeValue(text, "title", title);
|
||||||
nsAsyncStyleProcessingDataXML* d = new nsAsyncStyleProcessingDataXML;
|
if (NS_OK != result) {
|
||||||
if (nsnull == d) {
|
return result;
|
||||||
return NS_ERROR_OUT_OF_MEMORY;
|
|
||||||
}
|
}
|
||||||
d->mTitle.SetString(title);
|
title.CompressWhitespace();
|
||||||
d->mMedia.SetString(media);
|
result = GetQuotedAttributeValue(text, "media", media);
|
||||||
d->mIsActive = PR_TRUE;
|
if (NS_OK != result) {
|
||||||
d->mURL = url;
|
return result;
|
||||||
NS_ADDREF(url);
|
}
|
||||||
// XXX Need to create PI node
|
|
||||||
d->mElement = nsnull;
|
if (type.Equals(kCSSType)) {
|
||||||
d->mSink = this;
|
// Use the SRC attribute value to load the URL
|
||||||
NS_ADDREF(this);
|
nsIURL* url = nsnull;
|
||||||
|
nsAutoString absURL;
|
||||||
nsIUnicharStreamLoader* loader;
|
nsIURL* docURL = mDocument->GetDocumentURL();
|
||||||
result = NS_NewUnicharStreamLoader(&loader,
|
nsIURLGroup* urlGroup;
|
||||||
url,
|
|
||||||
(nsStreamCompleteFunc)nsDoneLoadingStyle,
|
result = docURL->GetURLGroup(&urlGroup);
|
||||||
(void *)d);
|
|
||||||
NS_RELEASE(url);
|
if ((NS_OK == result) && urlGroup) {
|
||||||
if (NS_OK == result) {
|
result = urlGroup->CreateURL(&url, docURL, href, nsnull);
|
||||||
result = NS_ERROR_HTMLPARSER_BLOCK;
|
NS_RELEASE(urlGroup);
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
result = NS_NewURL(&url, absURL);
|
||||||
|
}
|
||||||
|
NS_RELEASE(docURL);
|
||||||
|
if (NS_OK != result) {
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
nsAsyncStyleProcessingDataXML* d = new nsAsyncStyleProcessingDataXML;
|
||||||
|
if (nsnull == d) {
|
||||||
|
return NS_ERROR_OUT_OF_MEMORY;
|
||||||
|
}
|
||||||
|
d->mTitle.SetString(title);
|
||||||
|
d->mMedia.SetString(media);
|
||||||
|
d->mIsActive = PR_TRUE;
|
||||||
|
d->mURL = url;
|
||||||
|
NS_ADDREF(url);
|
||||||
|
// XXX Need to create PI node
|
||||||
|
d->mElement = nsnull;
|
||||||
|
d->mSink = this;
|
||||||
|
NS_ADDREF(this);
|
||||||
|
|
||||||
|
nsIUnicharStreamLoader* loader;
|
||||||
|
result = NS_NewUnicharStreamLoader(&loader,
|
||||||
|
url,
|
||||||
|
(nsStreamCompleteFunc)nsDoneLoadingStyle,
|
||||||
|
(void *)d);
|
||||||
|
NS_RELEASE(url);
|
||||||
|
if (NS_OK == result) {
|
||||||
|
result = NS_ERROR_HTMLPARSER_BLOCK;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -73,6 +73,7 @@ public:
|
||||||
NS_IMETHOD AddLeaf(const nsIParserNode& aNode);
|
NS_IMETHOD AddLeaf(const nsIParserNode& aNode);
|
||||||
NS_IMETHOD AddComment(const nsIParserNode& aNode);
|
NS_IMETHOD AddComment(const nsIParserNode& aNode);
|
||||||
NS_IMETHOD AddProcessingInstruction(const nsIParserNode& aNode);
|
NS_IMETHOD AddProcessingInstruction(const nsIParserNode& aNode);
|
||||||
|
NS_IMETHOD AddCDATASection(const nsIParserNode& aNode);
|
||||||
NS_IMETHOD NotifyError(const nsParserError* aError);
|
NS_IMETHOD NotifyError(const nsParserError* aError);
|
||||||
|
|
||||||
// nsIXMLContentSink
|
// nsIXMLContentSink
|
||||||
|
|
|
@ -38,6 +38,8 @@
|
||||||
#include "nsIDOMComment.h"
|
#include "nsIDOMComment.h"
|
||||||
#include "nsIDOMElement.h"
|
#include "nsIDOMElement.h"
|
||||||
#include "nsIDOMText.h"
|
#include "nsIDOMText.h"
|
||||||
|
#include "nsIDOMCDATASection.h"
|
||||||
|
#include "nsIDOMProcessingInstruction.h"
|
||||||
#include "nsExpatDTD.h"
|
#include "nsExpatDTD.h"
|
||||||
#include "nsINameSpaceManager.h"
|
#include "nsINameSpaceManager.h"
|
||||||
|
|
||||||
|
@ -57,87 +59,10 @@ static NS_DEFINE_IID(kIDOMTextIID, NS_IDOMTEXT_IID);
|
||||||
static NS_DEFINE_IID(kIHTMLContentContainerIID, NS_IHTMLCONTENTCONTAINER_IID);
|
static NS_DEFINE_IID(kIHTMLContentContainerIID, NS_IHTMLCONTENTCONTAINER_IID);
|
||||||
static NS_DEFINE_IID(kIDOMNodeIID, NS_IDOMNODE_IID);
|
static NS_DEFINE_IID(kIDOMNodeIID, NS_IDOMNODE_IID);
|
||||||
static NS_DEFINE_IID(kIDOMNodeListIID, NS_IDOMNODELIST_IID);
|
static NS_DEFINE_IID(kIDOMNodeListIID, NS_IDOMNODELIST_IID);
|
||||||
|
static NS_DEFINE_IID(kIDOMProcessingInstructionIID, NS_IDOMPROCESSINGINSTRUCTION_IID);
|
||||||
|
static NS_DEFINE_IID(kIDOMCDATASectionIID, NS_IDOMCDATASECTION_IID);
|
||||||
|
static NS_DEFINE_IID(kIContentIID, NS_ICONTENT_IID);
|
||||||
|
|
||||||
// ==================================================================
|
|
||||||
// =
|
|
||||||
// ==================================================================
|
|
||||||
nsXMLDocumentChildNodes::nsXMLDocumentChildNodes(nsXMLDocument* aDocument)
|
|
||||||
{
|
|
||||||
// We don't reference count our document reference (to avoid circular
|
|
||||||
// references). We'll be told when the document goes away.
|
|
||||||
mDocument = aDocument;
|
|
||||||
}
|
|
||||||
|
|
||||||
nsXMLDocumentChildNodes::~nsXMLDocumentChildNodes()
|
|
||||||
{
|
|
||||||
}
|
|
||||||
|
|
||||||
NS_IMETHODIMP
|
|
||||||
nsXMLDocumentChildNodes::GetLength(PRUint32* aLength)
|
|
||||||
{
|
|
||||||
if (nsnull != mDocument) {
|
|
||||||
PRUint32 prolog, epilog;
|
|
||||||
|
|
||||||
// The length is the sum of the prolog, epilog and
|
|
||||||
// document element;
|
|
||||||
mDocument->PrologCount(&prolog);
|
|
||||||
mDocument->EpilogCount(&epilog);
|
|
||||||
*aLength = prolog + epilog + 1;
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
*aLength = 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
return NS_OK;
|
|
||||||
}
|
|
||||||
|
|
||||||
NS_IMETHODIMP
|
|
||||||
nsXMLDocumentChildNodes::Item(PRUint32 aIndex, nsIDOMNode** aReturn)
|
|
||||||
{
|
|
||||||
nsresult result = NS_OK;
|
|
||||||
|
|
||||||
*aReturn = nsnull;
|
|
||||||
if (nsnull != mDocument) {
|
|
||||||
PRUint32 prolog;
|
|
||||||
|
|
||||||
mDocument->PrologCount(&prolog);
|
|
||||||
if (aIndex < prolog) {
|
|
||||||
// It's in the prolog
|
|
||||||
nsIContent* content;
|
|
||||||
result = mDocument->PrologElementAt(aIndex, &content);
|
|
||||||
if ((NS_OK == result) && (nsnull != content)) {
|
|
||||||
result = content->QueryInterface(kIDOMNodeIID, (void**)aReturn);
|
|
||||||
NS_RELEASE(content);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else if (aIndex == prolog) {
|
|
||||||
// It's the document element
|
|
||||||
nsIDOMElement* element;
|
|
||||||
result = mDocument->GetDocumentElement(&element);
|
|
||||||
if (NS_OK == result) {
|
|
||||||
result = element->QueryInterface(kIDOMNodeIID, (void**)aReturn);
|
|
||||||
NS_RELEASE(element);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
// It's in the epilog
|
|
||||||
nsIContent* content;
|
|
||||||
result = mDocument->EpilogElementAt(aIndex-prolog-1, &content);
|
|
||||||
if ((NS_OK == result) && (nsnull != content)) {
|
|
||||||
result = content->QueryInterface(kIDOMNodeIID, (void**)aReturn);
|
|
||||||
NS_RELEASE(content);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return result;
|
|
||||||
}
|
|
||||||
|
|
||||||
void
|
|
||||||
nsXMLDocumentChildNodes::DropReference()
|
|
||||||
{
|
|
||||||
mDocument = nsnull;
|
|
||||||
}
|
|
||||||
|
|
||||||
// ==================================================================
|
// ==================================================================
|
||||||
// =
|
// =
|
||||||
|
@ -155,9 +80,6 @@ nsXMLDocument::nsXMLDocument()
|
||||||
mParser = nsnull;
|
mParser = nsnull;
|
||||||
mAttrStyleSheet = nsnull;
|
mAttrStyleSheet = nsnull;
|
||||||
mInlineStyleSheet = nsnull;
|
mInlineStyleSheet = nsnull;
|
||||||
mProlog = nsnull;
|
|
||||||
mEpilog = nsnull;
|
|
||||||
mChildNodes = nsnull;
|
|
||||||
|
|
||||||
// XXX The XML world depends on the html atoms
|
// XXX The XML world depends on the html atoms
|
||||||
nsHTMLAtoms::AddrefAtoms();
|
nsHTMLAtoms::AddrefAtoms();
|
||||||
|
@ -169,8 +91,6 @@ nsXMLDocument::nsXMLDocument()
|
||||||
|
|
||||||
nsXMLDocument::~nsXMLDocument()
|
nsXMLDocument::~nsXMLDocument()
|
||||||
{
|
{
|
||||||
PRInt32 i, count;
|
|
||||||
nsIContent* content;
|
|
||||||
NS_IF_RELEASE(mParser);
|
NS_IF_RELEASE(mParser);
|
||||||
if (nsnull != mAttrStyleSheet) {
|
if (nsnull != mAttrStyleSheet) {
|
||||||
mAttrStyleSheet->SetOwningDocument(nsnull);
|
mAttrStyleSheet->SetOwningDocument(nsnull);
|
||||||
|
@ -180,23 +100,6 @@ nsXMLDocument::~nsXMLDocument()
|
||||||
mInlineStyleSheet->SetOwningDocument(nsnull);
|
mInlineStyleSheet->SetOwningDocument(nsnull);
|
||||||
NS_RELEASE(mInlineStyleSheet);
|
NS_RELEASE(mInlineStyleSheet);
|
||||||
}
|
}
|
||||||
if (nsnull != mProlog) {
|
|
||||||
count = mProlog->Count();
|
|
||||||
for (i = 0; i < count; i++) {
|
|
||||||
content = (nsIContent*)mProlog->ElementAt(i);
|
|
||||||
NS_RELEASE(content);
|
|
||||||
}
|
|
||||||
delete mProlog;
|
|
||||||
}
|
|
||||||
if (nsnull != mEpilog) {
|
|
||||||
count = mEpilog->Count();
|
|
||||||
for (i = 0; i < count; i++) {
|
|
||||||
content = (nsIContent*)mEpilog->ElementAt(i);
|
|
||||||
NS_RELEASE(content);
|
|
||||||
}
|
|
||||||
delete mEpilog;
|
|
||||||
}
|
|
||||||
NS_IF_RELEASE(mChildNodes);
|
|
||||||
#ifdef INCLUDE_XUL
|
#ifdef INCLUDE_XUL
|
||||||
nsXULAtoms::ReleaseAtoms();
|
nsXULAtoms::ReleaseAtoms();
|
||||||
#endif
|
#endif
|
||||||
|
@ -377,111 +280,6 @@ void nsXMLDocument::InternalAddStyleSheet(nsIStyleSheet* aSheet) // subclass ho
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
// nsIDOMNode interface
|
|
||||||
NS_IMETHODIMP
|
|
||||||
nsXMLDocument::GetChildNodes(nsIDOMNodeList** aChildNodes)
|
|
||||||
{
|
|
||||||
if (nsnull == mChildNodes) {
|
|
||||||
mChildNodes = new nsXMLDocumentChildNodes(this);
|
|
||||||
if (nsnull == mChildNodes) {
|
|
||||||
return NS_ERROR_OUT_OF_MEMORY;
|
|
||||||
}
|
|
||||||
NS_ADDREF(mChildNodes);
|
|
||||||
}
|
|
||||||
|
|
||||||
return mChildNodes->QueryInterface(kIDOMNodeListIID, (void**)aChildNodes);
|
|
||||||
}
|
|
||||||
|
|
||||||
NS_IMETHODIMP
|
|
||||||
nsXMLDocument::GetFirstChild(nsIDOMNode** aFirstChild)
|
|
||||||
{
|
|
||||||
nsresult result = NS_OK;
|
|
||||||
|
|
||||||
if ((nsnull != mProlog) && (0 != mProlog->Count())) {
|
|
||||||
nsIContent* content;
|
|
||||||
result = PrologElementAt(0, &content);
|
|
||||||
if ((NS_OK == result) && (nsnull != content)) {
|
|
||||||
result = content->QueryInterface(kIDOMNodeIID, (void**)aFirstChild);
|
|
||||||
NS_RELEASE(content);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
nsIDOMElement* element;
|
|
||||||
result = GetDocumentElement(&element);
|
|
||||||
if (NS_OK == result) {
|
|
||||||
result = element->QueryInterface(kIDOMNodeIID, (void**)aFirstChild);
|
|
||||||
NS_RELEASE(element);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return result;
|
|
||||||
}
|
|
||||||
|
|
||||||
NS_IMETHODIMP
|
|
||||||
nsXMLDocument::GetLastChild(nsIDOMNode** aLastChild)
|
|
||||||
{
|
|
||||||
nsresult result = NS_OK;
|
|
||||||
|
|
||||||
if ((nsnull != mEpilog) && (0 != mEpilog->Count())) {
|
|
||||||
nsIContent* content;
|
|
||||||
result = EpilogElementAt(mEpilog->Count()-1, &content);
|
|
||||||
if ((NS_OK == result) && (nsnull != content)) {
|
|
||||||
result = content->QueryInterface(kIDOMNodeIID, (void**)aLastChild);
|
|
||||||
NS_RELEASE(content);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
nsIDOMElement* element;
|
|
||||||
result = GetDocumentElement(&element);
|
|
||||||
if (NS_OK == result) {
|
|
||||||
result = element->QueryInterface(kIDOMNodeIID, (void**)aLastChild);
|
|
||||||
NS_RELEASE(element);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return result;
|
|
||||||
}
|
|
||||||
|
|
||||||
NS_IMETHODIMP
|
|
||||||
nsXMLDocument::InsertBefore(nsIDOMNode* aNewChild,
|
|
||||||
nsIDOMNode* aRefChild,
|
|
||||||
nsIDOMNode** aReturn)
|
|
||||||
{
|
|
||||||
// XXX TBI
|
|
||||||
return NS_ERROR_NOT_IMPLEMENTED;
|
|
||||||
}
|
|
||||||
|
|
||||||
NS_IMETHODIMP
|
|
||||||
nsXMLDocument::ReplaceChild(nsIDOMNode* aNewChild,
|
|
||||||
nsIDOMNode* aOldChild,
|
|
||||||
nsIDOMNode** aReturn)
|
|
||||||
{
|
|
||||||
// XXX TBI
|
|
||||||
return NS_ERROR_NOT_IMPLEMENTED;
|
|
||||||
}
|
|
||||||
|
|
||||||
NS_IMETHODIMP
|
|
||||||
nsXMLDocument::RemoveChild(nsIDOMNode* aOldChild, nsIDOMNode** aReturn)
|
|
||||||
{
|
|
||||||
// XXX TBI
|
|
||||||
return NS_ERROR_NOT_IMPLEMENTED;
|
|
||||||
}
|
|
||||||
|
|
||||||
NS_IMETHODIMP
|
|
||||||
nsXMLDocument::AppendChild(nsIDOMNode* aNewChild, nsIDOMNode** aReturn)
|
|
||||||
{
|
|
||||||
// XXX TBI
|
|
||||||
return NS_ERROR_NOT_IMPLEMENTED;
|
|
||||||
}
|
|
||||||
|
|
||||||
NS_IMETHODIMP
|
|
||||||
nsXMLDocument::HasChildNodes(PRBool* aReturn)
|
|
||||||
{
|
|
||||||
*aReturn = PR_TRUE;
|
|
||||||
return NS_OK;
|
|
||||||
}
|
|
||||||
|
|
||||||
// nsIDOMDocument interface
|
// nsIDOMDocument interface
|
||||||
NS_IMETHODIMP
|
NS_IMETHODIMP
|
||||||
nsXMLDocument::GetDoctype(nsIDOMDocumentType** aDocumentType)
|
nsXMLDocument::GetDoctype(nsIDOMDocumentType** aDocumentType)
|
||||||
|
@ -494,25 +292,41 @@ nsXMLDocument::GetDoctype(nsIDOMDocumentType** aDocumentType)
|
||||||
NS_IMETHODIMP
|
NS_IMETHODIMP
|
||||||
nsXMLDocument::CreateCDATASection(const nsString& aData, nsIDOMCDATASection** aReturn)
|
nsXMLDocument::CreateCDATASection(const nsString& aData, nsIDOMCDATASection** aReturn)
|
||||||
{
|
{
|
||||||
// XXX TBI
|
nsIContent* content;
|
||||||
*aReturn = nsnull;
|
nsresult rv = NS_NewXMLCDATASection(&content);
|
||||||
return NS_ERROR_NOT_IMPLEMENTED;
|
|
||||||
|
if (NS_OK == rv) {
|
||||||
|
rv = content->QueryInterface(kIDOMCDATASectionIID, (void**)aReturn);
|
||||||
|
(*aReturn)->AppendData(aData);
|
||||||
|
NS_RELEASE(content);
|
||||||
|
}
|
||||||
|
|
||||||
|
return rv;
|
||||||
}
|
}
|
||||||
|
|
||||||
NS_IMETHODIMP
|
NS_IMETHODIMP
|
||||||
nsXMLDocument::CreateEntityReference(const nsString& aName, nsIDOMEntityReference** aReturn)
|
nsXMLDocument::CreateEntityReference(const nsString& aName, nsIDOMEntityReference** aReturn)
|
||||||
{
|
{
|
||||||
// XXX TBI
|
|
||||||
*aReturn = nsnull;
|
*aReturn = nsnull;
|
||||||
return NS_ERROR_NOT_IMPLEMENTED;
|
return NS_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
NS_IMETHODIMP
|
NS_IMETHODIMP
|
||||||
nsXMLDocument::CreateProcessingInstruction(const nsString& aTarget, const nsString& aData, nsIDOMProcessingInstruction** aReturn)
|
nsXMLDocument::CreateProcessingInstruction(const nsString& aTarget,
|
||||||
|
const nsString& aData,
|
||||||
|
nsIDOMProcessingInstruction** aReturn)
|
||||||
{
|
{
|
||||||
// XXX TBI
|
nsIContent* content;
|
||||||
*aReturn = nsnull;
|
nsresult rv = NS_NewXMLProcessingInstruction(&content, aTarget, aData);
|
||||||
return NS_ERROR_NOT_IMPLEMENTED;
|
|
||||||
|
if (NS_OK != rv) {
|
||||||
|
return rv;
|
||||||
|
}
|
||||||
|
|
||||||
|
rv = content->QueryInterface(kIDOMProcessingInstructionIID, (void**)aReturn);
|
||||||
|
NS_RELEASE(content);
|
||||||
|
|
||||||
|
return rv;
|
||||||
}
|
}
|
||||||
|
|
||||||
static char kNameSpaceSeparator[] = ":";
|
static char kNameSpaceSeparator[] = ":";
|
||||||
|
@ -530,7 +344,8 @@ nsXMLDocument::CreateElement(const nsString& aTagName,
|
||||||
return rv;
|
return rv;
|
||||||
}
|
}
|
||||||
rv = content->QueryInterface(kIDOMElementIID, (void**)aReturn);
|
rv = content->QueryInterface(kIDOMElementIID, (void**)aReturn);
|
||||||
|
NS_RELEASE(content);
|
||||||
|
|
||||||
return rv;
|
return rv;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -576,86 +391,6 @@ nsXMLDocument::CreateElementWithNameSpace(const nsString& aTagName,
|
||||||
|
|
||||||
|
|
||||||
// nsIXMLDocument interface
|
// nsIXMLDocument interface
|
||||||
NS_IMETHODIMP
|
|
||||||
nsXMLDocument::PrologElementAt(PRUint32 aIndex, nsIContent** aContent)
|
|
||||||
{
|
|
||||||
if (nsnull == mProlog) {
|
|
||||||
*aContent = nsnull;
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
*aContent = (nsIContent *)mProlog->ElementAt((PRInt32)aIndex);
|
|
||||||
NS_ADDREF(*aContent);
|
|
||||||
}
|
|
||||||
|
|
||||||
return NS_OK;
|
|
||||||
}
|
|
||||||
|
|
||||||
NS_IMETHODIMP
|
|
||||||
nsXMLDocument::PrologCount(PRUint32* aCount)
|
|
||||||
{
|
|
||||||
if (nsnull == mProlog) {
|
|
||||||
*aCount = 0;
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
*aCount = (PRUint32)mProlog->Count();
|
|
||||||
}
|
|
||||||
|
|
||||||
return NS_OK;
|
|
||||||
}
|
|
||||||
|
|
||||||
NS_IMETHODIMP
|
|
||||||
nsXMLDocument::AppendToProlog(nsIContent* aContent)
|
|
||||||
{
|
|
||||||
if (nsnull == mProlog) {
|
|
||||||
mProlog = new nsVoidArray();
|
|
||||||
}
|
|
||||||
|
|
||||||
mProlog->AppendElement((void *)aContent);
|
|
||||||
NS_ADDREF(aContent);
|
|
||||||
|
|
||||||
return NS_OK;
|
|
||||||
}
|
|
||||||
|
|
||||||
NS_IMETHODIMP
|
|
||||||
nsXMLDocument::EpilogElementAt(PRUint32 aIndex, nsIContent** aContent)
|
|
||||||
{
|
|
||||||
if (nsnull == mEpilog) {
|
|
||||||
*aContent = nsnull;
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
*aContent = (nsIContent *)mEpilog->ElementAt((PRInt32)aIndex);
|
|
||||||
NS_ADDREF(*aContent);
|
|
||||||
}
|
|
||||||
|
|
||||||
return NS_OK;
|
|
||||||
}
|
|
||||||
|
|
||||||
NS_IMETHODIMP
|
|
||||||
nsXMLDocument::EpilogCount(PRUint32* aCount)
|
|
||||||
{
|
|
||||||
if (nsnull == mEpilog) {
|
|
||||||
*aCount = 0;
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
*aCount = (PRUint32)mEpilog->Count();
|
|
||||||
}
|
|
||||||
|
|
||||||
return NS_OK;
|
|
||||||
}
|
|
||||||
|
|
||||||
NS_IMETHODIMP
|
|
||||||
nsXMLDocument::AppendToEpilog(nsIContent* aContent)
|
|
||||||
{
|
|
||||||
if (nsnull == mEpilog) {
|
|
||||||
mEpilog = new nsVoidArray();
|
|
||||||
}
|
|
||||||
|
|
||||||
mEpilog->AppendElement((void *)aContent);
|
|
||||||
NS_ADDREF(aContent);
|
|
||||||
|
|
||||||
return NS_OK;
|
|
||||||
}
|
|
||||||
|
|
||||||
static nsIContent *
|
static nsIContent *
|
||||||
MatchName(nsIContent *aContent, const nsString& aName)
|
MatchName(nsIContent *aContent, const nsString& aName)
|
||||||
{
|
{
|
||||||
|
|
|
@ -23,28 +23,9 @@
|
||||||
#include "nsMarkupDocument.h"
|
#include "nsMarkupDocument.h"
|
||||||
#include "nsIXMLDocument.h"
|
#include "nsIXMLDocument.h"
|
||||||
#include "nsIHTMLContentContainer.h"
|
#include "nsIHTMLContentContainer.h"
|
||||||
#include "nsGenericDOMNodeList.h"
|
|
||||||
|
|
||||||
class nsIParser;
|
class nsIParser;
|
||||||
class nsIDOMNode;
|
class nsIDOMNode;
|
||||||
class nsXMLDocument;
|
|
||||||
|
|
||||||
// Represents the children of an XML document (prolog, epilog and
|
|
||||||
// document element)
|
|
||||||
class nsXMLDocumentChildNodes : public nsGenericDOMNodeList
|
|
||||||
{
|
|
||||||
public:
|
|
||||||
nsXMLDocumentChildNodes(nsXMLDocument* aDocument);
|
|
||||||
~nsXMLDocumentChildNodes();
|
|
||||||
|
|
||||||
NS_IMETHOD GetLength(PRUint32* aLength);
|
|
||||||
NS_IMETHOD Item(PRUint32 aIndex, nsIDOMNode** aReturn);
|
|
||||||
|
|
||||||
void DropReference();
|
|
||||||
|
|
||||||
protected:
|
|
||||||
nsXMLDocument* mDocument;
|
|
||||||
};
|
|
||||||
|
|
||||||
|
|
||||||
class nsXMLDocument : public nsMarkupDocument,
|
class nsXMLDocument : public nsMarkupDocument,
|
||||||
|
@ -67,20 +48,6 @@ public:
|
||||||
|
|
||||||
NS_IMETHOD EndLoad();
|
NS_IMETHOD EndLoad();
|
||||||
|
|
||||||
// nsIDOMNode interface
|
|
||||||
NS_IMETHOD GetChildNodes(nsIDOMNodeList** aChildNodes);
|
|
||||||
NS_IMETHOD GetFirstChild(nsIDOMNode** aFirstChild);
|
|
||||||
NS_IMETHOD GetLastChild(nsIDOMNode** aLastChild);
|
|
||||||
NS_IMETHOD InsertBefore(nsIDOMNode* aNewChild,
|
|
||||||
nsIDOMNode* aRefChild,
|
|
||||||
nsIDOMNode** aReturn);
|
|
||||||
NS_IMETHOD ReplaceChild(nsIDOMNode* aNewChild,
|
|
||||||
nsIDOMNode* aOldChild,
|
|
||||||
nsIDOMNode** aReturn);
|
|
||||||
NS_IMETHOD RemoveChild(nsIDOMNode* aOldChild, nsIDOMNode** aReturn);
|
|
||||||
NS_IMETHOD AppendChild(nsIDOMNode* aNewChild, nsIDOMNode** aReturn);
|
|
||||||
NS_IMETHOD HasChildNodes(PRBool* aReturn);
|
|
||||||
|
|
||||||
// nsIDOMDocument interface
|
// nsIDOMDocument interface
|
||||||
NS_IMETHOD GetDoctype(nsIDOMDocumentType** aDocumentType);
|
NS_IMETHOD GetDoctype(nsIDOMDocumentType** aDocumentType);
|
||||||
NS_IMETHOD CreateCDATASection(const nsString& aData, nsIDOMCDATASection** aReturn);
|
NS_IMETHOD CreateCDATASection(const nsString& aData, nsIDOMCDATASection** aReturn);
|
||||||
|
@ -93,14 +60,6 @@ public:
|
||||||
nsIDOMElement** aReturn);
|
nsIDOMElement** aReturn);
|
||||||
|
|
||||||
// nsIXMLDocument interface
|
// nsIXMLDocument interface
|
||||||
NS_IMETHOD PrologElementAt(PRUint32 aOffset, nsIContent** aContent);
|
|
||||||
NS_IMETHOD PrologCount(PRUint32* aCount);
|
|
||||||
NS_IMETHOD AppendToProlog(nsIContent* aContent);
|
|
||||||
|
|
||||||
NS_IMETHOD EpilogElementAt(PRUint32 aOffset, nsIContent** aContent);
|
|
||||||
NS_IMETHOD EpilogCount(PRUint32* aCount);
|
|
||||||
NS_IMETHOD AppendToEpilog(nsIContent* aContent);
|
|
||||||
|
|
||||||
NS_IMETHOD GetContentById(const nsString& aName, nsIContent** aContent);
|
NS_IMETHOD GetContentById(const nsString& aName, nsIContent** aContent);
|
||||||
|
|
||||||
// nsIHTMLContentContainer
|
// nsIHTMLContentContainer
|
||||||
|
@ -111,16 +70,11 @@ protected:
|
||||||
virtual void InternalAddStyleSheet(nsIStyleSheet* aSheet); // subclass hook for sheet ordering
|
virtual void InternalAddStyleSheet(nsIStyleSheet* aSheet); // subclass hook for sheet ordering
|
||||||
virtual nsresult Reset(nsIURL* aUrl);
|
virtual nsresult Reset(nsIURL* aUrl);
|
||||||
|
|
||||||
|
|
||||||
// For HTML elements in our content model
|
// For HTML elements in our content model
|
||||||
nsIHTMLStyleSheet* mAttrStyleSheet;
|
nsIHTMLStyleSheet* mAttrStyleSheet;
|
||||||
nsIHTMLCSSStyleSheet* mInlineStyleSheet;
|
nsIHTMLCSSStyleSheet* mInlineStyleSheet;
|
||||||
|
|
||||||
nsVoidArray *mProlog;
|
|
||||||
nsVoidArray *mEpilog;
|
|
||||||
|
|
||||||
nsIParser *mParser;
|
nsIParser *mParser;
|
||||||
nsXMLDocumentChildNodes* mChildNodes;
|
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
|
Загрузка…
Ссылка в новой задаче