From e269dbe04710e2f6a8e8dae3ebcd9dd58193ce2f Mon Sep 17 00:00:00 2001 From: "alecf%netscape.com" Date: Sat, 11 Sep 1999 09:11:03 +0000 Subject: [PATCH] update to use weak references to DOM elements, fix tree to use new templates, get rid of old dom:// <-> DOMNode system git-svn-id: svn://10.0.0.236/trunk@46944 18797224-902f-48f8-a5cc-f745e15eee43 --- .../rdf/tests/domds/nsRDFDOMDataSource.cpp | 265 +++++------------- mozilla/rdf/tests/domds/nsRDFDOMDataSource.h | 4 +- .../tests/domds/nsRDFDOMDataSourceFactory.cpp | 2 +- .../tests/domds/nsRDFDOMResourceFactory.cpp | 32 +-- mozilla/rdf/tests/domds/resources/DOMTree.xul | 43 ++- 5 files changed, 121 insertions(+), 225 deletions(-) diff --git a/mozilla/rdf/tests/domds/nsRDFDOMDataSource.cpp b/mozilla/rdf/tests/domds/nsRDFDOMDataSource.cpp index 85362f5c18e..e36cadf78ab 100644 --- a/mozilla/rdf/tests/domds/nsRDFDOMDataSource.cpp +++ b/mozilla/rdf/tests/domds/nsRDFDOMDataSource.cpp @@ -31,6 +31,7 @@ #include "nsIDOMNamedNodeMap.h" #include "nsIDOMAttr.h" +#include "nsIDOMViewerElement.h" #include "nsIDOMHTMLDocument.h" @@ -42,7 +43,7 @@ #define NC_RDF_Value NC_NAMESPACE_URI "Value" #define NC_RDF_Type NC_NAMESPACE_URI "Type" #define NC_RDF_Child NC_NAMESPACE_URI "child" - +#define NC_RDF_DOMRoot "NC:DOMRoot" static PRInt32 gCurrentId=0; @@ -59,6 +60,7 @@ nsRDFDOMDataSource::nsRDFDOMDataSource(): getRDFService()->GetResource(NC_RDF_Name, &kNC_Name); getRDFService()->GetResource(NC_RDF_Value, &kNC_Value); getRDFService()->GetResource(NC_RDF_Type, &kNC_Type); + getRDFService()->GetResource(NC_RDF_DOMRoot, &kNC_DOMRoot); } @@ -154,71 +156,60 @@ nsRDFDOMDataSource::GetSources(nsIRDFResource *aProperty, nsIRDFNode *aTarget, P NS_IMETHODIMP nsRDFDOMDataSource::GetTarget(nsIRDFResource *aSource, nsIRDFResource *aProperty, PRBool aTruthValue, nsIRDFNode **_retval) { - nsresult rv; + +#ifdef DEBUG_alecf nsXPIDLCString sourceval; aSource->GetValue(getter_Copies(sourceval)); nsXPIDLCString propval; aProperty->GetValue(getter_Copies(propval)); - - nsString str; - -#ifdef DEBUG_alecf printf("GetTarget(%s, %s,..)\n", (const char*)sourceval, (const char*)propval); #endif - // extract the ID if any - nsCOMPtr node; - rv = getNodeByURI(sourceval, getter_AddRefs(node)); - if (NS_FAILED(rv)) return rv; - - if (node) { + nsresult rv; + nsString str; + if (aSource == kNC_DOMRoot) { if (aProperty == kNC_Name) - node->GetNodeName(str); + str="DOMRoot"; else if (aProperty == kNC_Value) - node->GetNodeValue(str); - else if (aProperty == kNC_Type) { - PRUint16 type; - node->GetNodeType(&type); - str.Append((PRInt32)type, 10); - } - - else { -#ifdef DEBUG_alecf - printf("Unknown arc %s\n", (const char*)propval); -#endif - return NS_ERROR_UNEXPECTED; - } - - } - else if (!PL_strncmp(sourceval, "text://", 7)) { - - - /* name - use the tag name */ - if (aProperty == kNC_Name) - str = "#text"; - - /* value - ID? */ - else if (aProperty == kNC_Value) - str = ((const char*)sourceval + 7); + str="DOMRootValue"; else if (aProperty == kNC_Type) - str.Append(3); - - else { - printf("Unknown arc %s\n", (const char*)propval); - return NS_ERROR_UNEXPECTED; + str = "DOMRootType"; + + } else { + nsCOMPtr nodeContainer = + do_QueryInterface(aSource); + + nsCOMPtr node; + nodeContainer->GetNode(getter_AddRefs(node)); + + if (node) { + if (aProperty == kNC_Name) + node->GetNodeName(str); + else if (aProperty == kNC_Value) + node->GetNodeValue(str); + else if (aProperty == kNC_Type) { + PRUint16 type; + node->GetNodeType(&type); + str = type; + } else + str = "Valid node, unknown arc"; + } } printf("GetTarget() returning %s\n", str.ToNewCString()); nsCOMPtr literal; - rv =getRDFService()->GetLiteral(str.ToNewUnicode(), getter_AddRefs(literal)); - if (NS_FAILED(rv)) return rv; - *_retval = literal; - NS_ADDREF(*_retval); + PRUnichar* uniStr = str.ToNewUnicode(); + rv = getRDFService()->GetLiteral(uniStr, + getter_AddRefs(literal)); + nsAllocator::Free(uniStr); - return NS_OK; + *_retval = literal; + NS_IF_ADDREF(*_retval); + + return rv; } @@ -229,14 +220,14 @@ nsRDFDOMDataSource::GetTargets(nsIRDFResource *aSource, nsIRDFResource *aPropert nsXPIDLCString sourceval; aSource->GetValue(getter_Copies(sourceval)); +#ifdef DEBUG_alecf nsXPIDLCString propval; aProperty->GetValue(getter_Copies(propval)); - -#ifdef DEBUG_alecf - printf("GetTargets(%s, %s,..)\n", (const char*)sourceval, + printf("GetTarget(%s, %s,..)\n", (const char*)sourceval, (const char*)propval); #endif - + + // prepare the root nsresult rv; nsCOMPtr arcs; rv = NS_NewISupportsArray(getter_AddRefs(arcs)); @@ -247,18 +238,24 @@ nsRDFDOMDataSource::GetTargets(nsIRDFResource *aSource, nsIRDFResource *aPropert *_retval = cursor; NS_ADDREF(*_retval); - - if (!mDocument) { - return NS_OK; - } - // convert the URI (aSource) to a DOM element - nsCOMPtr node; - - rv = getNodeByURI(sourceval, getter_AddRefs(node)); - if (NS_FAILED(rv)) return rv; - if (!node) return NS_OK; - /* children - get all child nodes */ + if (!mDocument) return NS_OK; + + + // what node is this? + nsCOMPtr node; + if (aSource == kNC_DOMRoot) { + node = mDocument; + } else { + nsCOMPtr nodeContainer; + nodeContainer = do_QueryInterface(aSource, &rv); + + if (NS_SUCCEEDED(rv) && nodeContainer) + nodeContainer->GetNode(getter_AddRefs(node)); + } + + // node is now the node we're interested in. + if (aProperty == kNC_Child) { PRUint32 i; @@ -285,6 +282,13 @@ nsRDFDOMDataSource::GetTargets(nsIRDFResource *aSource, nsIRDFResource *aPropert nsCOMPtr resource; getRDFService()->GetResource(uri, getter_AddRefs(resource)); + { + // now fill in the resource stuff + nsCOMPtr nodeContainer = + do_QueryInterface(resource); + if (nodeContainer) + nodeContainer->SetNode(attrNode); + } arcs->AppendElement(resource); } } @@ -301,7 +305,6 @@ nsRDFDOMDataSource::GetTargets(nsIRDFResource *aSource, nsIRDFResource *aPropert nsCOMPtr childNode; for (i=0; iItem(i, getter_AddRefs(childNode)); if (NS_FAILED(rv)) return rv; @@ -312,31 +315,25 @@ nsRDFDOMDataSource::GetTargets(nsIRDFResource *aSource, nsIRDFResource *aPropert printf("child node %d has type %d\n", i, (PRUint32)nodeType); #endif - char *uri = nsnull; - rv = getURIForNode(childNode, &uri); - if (NS_FAILED(rv)) return rv; + char *uri = + PR_smprintf("dom://%8.8X", gCurrentId++); if (uri) { nsCOMPtr resource; getRDFService()->GetResource(uri, getter_AddRefs(resource)); + { + // now fill in the resource stuff + nsCOMPtr nodeContainer = + do_QueryInterface(resource); + if (nodeContainer) + nodeContainer->SetNode(childNode); + } arcs->AppendElement(resource); } } } - /* name - use the tag name */ - else if (aProperty == kNC_Name) { - - - } - /* value - ID? */ - else if (aProperty == kNC_Value) { - - - } else { - printf("Unknown arc %s\n", (const char*)propval); - } return NS_OK; } @@ -556,116 +553,6 @@ nsRDFDOMDataSource::SetWindow(nsIDOMWindow *window) { return rv; } -nsresult -nsRDFDOMDataSource::getNodeByURI(const char* uri, nsIDOMNode **aResult) -{ - nsresult rv = NS_OK; - nsCOMPtr node; - - // root node - if (!PL_strcmp(uri, "dom:/")) { - nsCOMPtr element; - rv = mDocument->GetDocumentElement(getter_AddRefs(element)); - node = element; - } - else if (!PL_strncmp(uri, "dom://", 6)) { - - nsAutoString id = (uri + 6); - nsAutoString attr =""; - PRInt32 attrloc = id.Find('#'); - if (attrloc >= 0) { - id.Right(attr, (id.Length() - attrloc - 1)); - printf("%s is an attribute: %s\n", uri, attr.ToNewCString()); - - id.Truncate(attrloc); - } - - - printf("Looking for ID %s\n", id.ToNewCString()); - - nsCOMPtr element; - - // if this is HTML, we can use GetElementById - nsCOMPtr htmlDocument = - do_QueryInterface(mDocument, &rv); - if (NS_SUCCEEDED(rv)) { - rv = htmlDocument->GetElementById(id, getter_AddRefs(element)); - if (NS_FAILED(rv)) return rv; - } - - nsCOMPtr xulDocument = - do_QueryInterface(mDocument, &rv); - if (NS_SUCCEEDED(rv)) { - rv = xulDocument->GetElementById(id, getter_AddRefs(element)); - if (NS_FAILED(rv)) return rv; - } - - - if (attr != "") { - printf("This is an attribute: %s\n", attr.ToNewCString()); - - nsCOMPtr attrNode; - rv = element->GetAttributeNode(attr, getter_AddRefs(attrNode)); - if (NS_FAILED(rv)) return rv; - - node=attrNode; - } else - node = element; - } - - if (node) { - *aResult = node; - NS_ADDREF(*aResult); - return NS_OK; - } - - return rv; -} - -nsresult -nsRDFDOMDataSource::getURIForNode(nsIDOMNode *node, char **uri) -{ - - nsresult rv; - // DOM Elements - // extract the ID (create one if necessary) - nsCOMPtr element = - do_QueryInterface(node, &rv); - if (NS_SUCCEEDED(rv)) { - nsString id; - rv = element->GetAttribute(nsAutoString("id"), id); - if (NS_FAILED(rv)) return rv; - if (id == "") { - char *idstr = PR_smprintf("%8.8X", gCurrentId++); - id = idstr; - printf("Element has no ID. Assigning it %s\n", idstr); - - - } - else { - printf("ID of this element is %s\n", id.ToNewCString()); - } - - // leaks id.ToNewCString() - *uri = PR_smprintf("dom://%s", id.ToNewCString()); - } - - // DOM Texts - nsCOMPtr text = - do_QueryInterface(node, &rv); - if (NS_SUCCEEDED(rv)) { - nsString textValue; - rv = text->GetData(textValue); - if (NS_FAILED(rv)) return rv; - - // leaks - char *textval = textValue.ToNewCString(); - *uri = PR_smprintf("text://%s", textval); - nsCRT::free(textval); - } - - return NS_OK; -} nsresult diff --git a/mozilla/rdf/tests/domds/nsRDFDOMDataSource.h b/mozilla/rdf/tests/domds/nsRDFDOMDataSource.h index 32b0e338ffe..0283ca094b5 100644 --- a/mozilla/rdf/tests/domds/nsRDFDOMDataSource.h +++ b/mozilla/rdf/tests/domds/nsRDFDOMDataSource.h @@ -172,9 +172,6 @@ class nsRDFDOMDataSource : public nsIRDFDataSource, private: - nsresult getNodeByURI(const char* uri, nsIDOMNode** aResult); - nsresult getURIForNode(nsIDOMNode *node, char **uri); - PRBool init; nsIRDFService *mRDFService; nsVoidArray *mObservers; @@ -185,6 +182,7 @@ class nsRDFDOMDataSource : public nsIRDFDataSource, nsIRDFResource* kNC_Value; nsIRDFResource* kNC_Type; nsIRDFResource* kNC_Child; + nsIRDFResource* kNC_DOMRoot; }; nsresult diff --git a/mozilla/rdf/tests/domds/nsRDFDOMDataSourceFactory.cpp b/mozilla/rdf/tests/domds/nsRDFDOMDataSourceFactory.cpp index 2f848af66d7..e655959805c 100644 --- a/mozilla/rdf/tests/domds/nsRDFDOMDataSourceFactory.cpp +++ b/mozilla/rdf/tests/domds/nsRDFDOMDataSourceFactory.cpp @@ -67,7 +67,7 @@ NSRegisterSelf(nsISupports* aServMgr, const char* aPath) &rv); if (NS_FAILED(rv)) return rv; - + printf("Registering DOM Viewer\n"); rv = compMgr->RegisterComponent(kRDFDOMDataSourceCID, "Generic DataSource DataSource", NS_RDF_DATASOURCE_PROGID_PREFIX "domds", diff --git a/mozilla/rdf/tests/domds/nsRDFDOMResourceFactory.cpp b/mozilla/rdf/tests/domds/nsRDFDOMResourceFactory.cpp index 7db848c06bb..b3ef452ed3e 100644 --- a/mozilla/rdf/tests/domds/nsRDFDOMResourceFactory.cpp +++ b/mozilla/rdf/tests/domds/nsRDFDOMResourceFactory.cpp @@ -20,7 +20,7 @@ #include "nscore.h" #include "nsCOMPtr.h" - +#include "nsWeakPtr.h" #include "rdf.h" #include "nsRDFResource.h" #include "nsRDFDOMResourceFactory.h" @@ -28,7 +28,8 @@ #include "nsIDOMNode.h" class nsRDFDOMViewerElement : nsRDFResource, - nsIDOMViewerElement { + nsIDOMViewerElement +{ public: nsRDFDOMViewerElement(); virtual ~nsRDFDOMViewerElement(); @@ -38,21 +39,17 @@ public: NS_DECL_NSIDOMVIEWERELEMENT private: - - nsIDOMNode *mNode; - - + // weak reference to DOM node + nsWeakPtr mNode; }; -nsRDFDOMViewerElement::nsRDFDOMViewerElement() : - mNode(nsnull) +nsRDFDOMViewerElement::nsRDFDOMViewerElement() { } nsRDFDOMViewerElement::~nsRDFDOMViewerElement() { - if (mNode) NS_RELEASE(mNode); } NS_IMPL_ISUPPORTS_INHERITED(nsRDFDOMViewerElement, nsRDFResource, nsIDOMViewerElement) @@ -60,9 +57,7 @@ NS_IMPL_ISUPPORTS_INHERITED(nsRDFDOMViewerElement, nsRDFResource, nsIDOMViewerEl NS_IMETHODIMP nsRDFDOMViewerElement::SetNode(nsIDOMNode* node) { - if (mNode) NS_RELEASE(mNode); - mNode = node; - NS_ADDREF(mNode); + mNode = getter_AddRefs(NS_GetWeakReference(node)); return NS_OK; } @@ -70,10 +65,10 @@ NS_IMETHODIMP nsRDFDOMViewerElement::GetNode(nsIDOMNode** node) { if (!node) return NS_ERROR_NULL_POINTER; - - *node = mNode; - NS_ADDREF(*node); - return NS_OK; + + nsresult rv = + mNode->QueryReferent(NS_GET_IID(nsIDOMNode), (void **)node); + return rv; } nsresult @@ -83,6 +78,9 @@ NS_NewRDFDOMResourceFactory(nsISupports* aOuter, nsRDFDOMViewerElement* ve = new nsRDFDOMViewerElement(); if (!ve) return NS_ERROR_NULL_POINTER; - return ve->QueryInterface(iid, result); + NS_ADDREF(ve); + nsresult rv = ve->QueryInterface(iid, result); + NS_RELEASE(ve); + return rv; } diff --git a/mozilla/rdf/tests/domds/resources/DOMTree.xul b/mozilla/rdf/tests/domds/resources/DOMTree.xul index a3fadd8991b..7159fdb3ce0 100644 --- a/mozilla/rdf/tests/domds/resources/DOMTree.xul +++ b/mozilla/rdf/tests/domds/resources/DOMTree.xul @@ -8,21 +8,34 @@ xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul" style="width: 100%; height: 100%"> - - - - - - - Name - Value - Type - - + + - - + + + + + + + + + + +