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
This commit is contained in:
alecf%netscape.com
1999-09-11 09:11:03 +00:00
parent 554c386dd8
commit e269dbe047
5 changed files with 121 additions and 225 deletions

View File

@@ -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<nsIDOMNode> 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<nsIDOMViewerElement> nodeContainer =
do_QueryInterface(aSource);
nsCOMPtr<nsIDOMNode> 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<nsIRDFLiteral> 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<nsISupportsArray> 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<nsIDOMNode> 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<nsIDOMNode> node;
if (aSource == kNC_DOMRoot) {
node = mDocument;
} else {
nsCOMPtr<nsIDOMViewerElement> 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<nsIRDFResource> resource;
getRDFService()->GetResource(uri,
getter_AddRefs(resource));
{
// now fill in the resource stuff
nsCOMPtr<nsIDOMViewerElement> nodeContainer =
do_QueryInterface(resource);
if (nodeContainer)
nodeContainer->SetNode(attrNode);
}
arcs->AppendElement(resource);
}
}
@@ -301,7 +305,6 @@ nsRDFDOMDataSource::GetTargets(nsIRDFResource *aSource, nsIRDFResource *aPropert
nsCOMPtr<nsIDOMNode> childNode;
for (i=0; i<length; i++) {
rv = childNodes->Item(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<nsIRDFResource> resource;
getRDFService()->GetResource(uri,
getter_AddRefs(resource));
{
// now fill in the resource stuff
nsCOMPtr<nsIDOMViewerElement> 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<nsIDOMNode> node;
// root node
if (!PL_strcmp(uri, "dom:/")) {
nsCOMPtr<nsIDOMElement> 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<nsIDOMElement> element;
// if this is HTML, we can use GetElementById
nsCOMPtr<nsIDOMHTMLDocument> htmlDocument =
do_QueryInterface(mDocument, &rv);
if (NS_SUCCEEDED(rv)) {
rv = htmlDocument->GetElementById(id, getter_AddRefs(element));
if (NS_FAILED(rv)) return rv;
}
nsCOMPtr<nsIDOMXULDocument> 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<nsIDOMAttr> 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<nsIDOMElement> 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<nsIDOMText> 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

View File

@@ -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

View File

@@ -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",

View File

@@ -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;
}

View File

@@ -8,21 +8,34 @@
xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul"
style="width: 100%; height: 100%">
<tree style="width:100%" datasources="rdf:domds"
id="dataSourceTree"
containment="http://home.netscape.com/NC-rdf#child">
<treecol id="NameColumn" rdf:resource="http://home.netscape.com/NC-rdf#Name" style="width: 40%"/>
<treecol id="ValueColumn" rdf:resource="http://home.netscape.com/NC-rdf#Value" style="width: 50%"/>
<treecol id="TypeColumn" rdf:resource="http://home.netscape.com/NC-rdf#Type" style="width: 10%"/>
<treehead>
<treeitem>
<treecell>Name</treecell>
<treecell>Value</treecell>
<treecell>Type</treecell>
</treeitem>
</treehead>
<html:div flex="100%">
<tree style="height:100%"
rdf:datasources="rdf:domds"
id="dataSourceTree">
<treebody id="" rdf:containment="http://home.netscape.com/NC-rdf#child" name="dataSourceTreeBody">
</treebody>
<template>
<rule>
<treechildren>
<treeitem uri="...">
<treerow>
<treecell ident="true" value="rdf:http://home.netscape.com/NC-rdf#Name"/>
<treecell value="rdf:http://home.netscape.com/NC-rdf#Value"/>
<treecell value="rdf:http://home.netscape.com/NC-rdf#Type"/>
</treerow>
</treeitem>
</treechildren>
</rule>
<treeitem uri="NC:DOMRoot"/>
</template>
<treecol id="NameColumn" rdf:resource="http://home.netscape.com/NC-rdf#Name"/>
<treecol id="ValueColumn" rdf:resource="http://home.netscape.com/NC-rdf#Value"/>
<treecol id="TypeColumn" rdf:resource="http://home.netscape.com/NC-rdf#Type"/>
<treehead>
<treecell value="Name"/>
<treecell value="Value"/>
<treecell value="Type"/>
</treehead>
</tree>
</window>