Bug 325404: Get rid of _base_href and _base_target attributes and use properties instead. r/sr=jst

This commit is contained in:
cvshook%sicking.cc 2006-02-01 04:43:55 +00:00
Родитель d96bbafedd
Коммит 09593adb0a
7 изменённых файлов: 104 добавлений и 51 удалений

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

@ -3881,16 +3881,6 @@ nsDocument::GetUserData(const nsAString &aKey,
return GetUserData(this, key, aResult);
}
static void
ReleaseDOMUserData(void *aObject,
nsIAtom *aPropertyName,
void *aPropertyValue,
void *aData)
{
nsISupports *propertyValue = NS_STATIC_CAST(nsISupports*, aPropertyValue);
NS_RELEASE(propertyValue);
}
nsresult
nsDocument::SetUserData(const nsINode *aObject,
nsIAtom *aKey,
@ -3910,7 +3900,7 @@ nsDocument::SetUserData(const nsINode *aObject,
void *data;
if (aData) {
rv = mPropertyTable.SetProperty(aObject, DOM_USER_DATA, aKey, aData,
ReleaseDOMUserData, &data);
nsPropertyTable::SupportsDtorFunc, &data);
NS_ENSURE_SUCCESS(rv, rv);
NS_ADDREF(aData);
@ -3925,7 +3915,8 @@ nsDocument::SetUserData(const nsINode *aObject,
if (aData && aHandler) {
rv = mPropertyTable.SetProperty(aObject, DOM_USER_DATA_HANDLER, aKey,
aHandler, ReleaseDOMUserData);
aHandler,
nsPropertyTable::SupportsDtorFunc);
if (NS_SUCCEEDED(rv)) {
NS_ADDREF(aHandler);
}

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

@ -62,8 +62,6 @@
//---------------------------------------------------------------------------
GK_ATOM(_empty, "")
GK_ATOM(_baseHref, "_base_href")
GK_ATOM(_baseTarget, "_base_target")
GK_ATOM(mozdirty, "_moz_dirty")
GK_ATOM(_moz_target, "_moz_target")
GK_ATOM(menuactive, "_moz-menuactive")
@ -351,6 +349,8 @@ GK_ATOM(href, "href")
GK_ATOM(hreflang, "hreflang")
GK_ATOM(hspace, "hspace")
GK_ATOM(html, "html")
GK_ATOM(htmlBaseHref, "html-base-href")
GK_ATOM(htmlBaseTarget, "html-base-target")
GK_ATOM(httpEquiv, "http-equiv")
GK_ATOM(i, "i")
GK_ATOM(id, "id")

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

@ -330,3 +330,12 @@ nsPropertyTable::PropertyList::DeletePropertyFor(nsPropertyOwner aObject)
return PR_TRUE;
}
/* static */
void
nsPropertyTable::SupportsDtorFunc(void *aObject, nsIAtom *aPropertyName,
void *aPropertyValue, void *aData)
{
nsISupports *propertyValue = NS_STATIC_CAST(nsISupports*, aPropertyValue);
NS_IF_RELEASE(propertyValue);
}

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

@ -236,6 +236,14 @@ class nsPropertyTable
DeleteAllProperties();
}
/**
* Function useable as destructor function for property data that is
* XPCOM objects. The function will call NS_IF_RELASE on the value
* to destroy it.
*/
static void SupportsDtorFunc(void *aObject, nsIAtom *aPropertyName,
void *aPropertyValue, void *aData);
class PropertyList;
private:

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

@ -309,6 +309,23 @@ nsGenericHTMLElement::CopyInnerTo(nsGenericElement* aDst, PRBool aDeep) const
NS_ENSURE_SUCCESS(rv, rv);
}
// Copy the baseuri and basetarget
void* prop;
if ((prop = GetProperty(nsHTMLAtoms::htmlBaseHref))) {
rv = aDst->SetProperty(nsHTMLAtoms::htmlBaseHref, prop,
nsPropertyTable::SupportsDtorFunc);
if (NS_SUCCEEDED(rv)) {
NS_ADDREF(NS_STATIC_CAST(nsIURI*, prop));
}
}
if ((prop = GetProperty(nsHTMLAtoms::htmlBaseTarget))) {
rv = aDst->SetProperty(nsHTMLAtoms::htmlBaseTarget, prop,
nsPropertyTable::SupportsDtorFunc);
if (NS_SUCCEEDED(rv)) {
NS_ADDREF(NS_STATIC_CAST(nsIAtom*, prop));
}
}
nsIDocument *newDoc = aDst->GetOwnerDoc();
if (aDeep) {
@ -1860,20 +1877,11 @@ nsGenericHTMLElement::GetBaseURI() const
{
nsIDocument* doc = GetOwnerDoc();
const nsAttrValue* val = mAttrsAndChildren.GetAttr(nsHTMLAtoms::_baseHref);
if (val) {
// We have a _baseHref attribute; that will determine our base URI
nsAutoString str;
val->ToString(str);
nsIURI* docBaseURL = nsnull;
if (doc) {
docBaseURL = doc->GetBaseURI();
}
nsIURI* uri = nsnull;
NS_NewURI(&uri, str, nsnull, docBaseURL);
void* prop;
if (HasProperties() && (prop = GetProperty(nsHTMLAtoms::htmlBaseHref))) {
nsIURI* uri = NS_STATIC_CAST(nsIURI*, prop);
NS_ADDREF(uri);
return uri;
}
@ -1896,9 +1904,10 @@ nsGenericHTMLElement::GetBaseURI() const
void
nsGenericHTMLElement::GetBaseTarget(nsAString& aBaseTarget) const
{
const nsAttrValue* val = mAttrsAndChildren.GetAttr(nsHTMLAtoms::_baseTarget);
if (val) {
val->ToString(aBaseTarget);
void* prop;
if (HasProperties() && (prop = GetProperty(nsHTMLAtoms::htmlBaseHref))) {
NS_STATIC_CAST(nsIAtom*, prop)->ToString(aBaseTarget);
return;
}

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

@ -343,8 +343,8 @@ protected:
PRInt32 mNumOpenIFRAMES;
nsCOMPtr<nsIRequest> mDummyParserRequest;
nsString mBaseHREF;
nsString mBaseTarget;
nsCOMPtr<nsIURI> mBaseHref;
nsCOMPtr<nsIAtom> mBaseTarget;
// depth of containment within <noembed>, <noframes> etc
PRInt32 mInsideNoXXXTag;
@ -3513,14 +3513,22 @@ HTMLContentSink::TryToScrollToRef()
void
HTMLContentSink::AddBaseTagInfo(nsIContent* aContent)
{
if (!mBaseHREF.IsEmpty()) {
aContent->SetAttr(kNameSpaceID_None, nsHTMLAtoms::_baseHref, mBaseHREF,
PR_FALSE);
nsresult rv;
if (mBaseHref) {
rv = aContent->SetProperty(nsHTMLAtoms::htmlBaseHref, mBaseHref,
nsPropertyTable::SupportsDtorFunc);
if (NS_SUCCEEDED(rv)) {
// circumvent nsDerivedSafe
NS_ADDREF(NS_STATIC_CAST(nsIURI*, mBaseHref));
}
}
if (!mBaseTarget.IsEmpty()) {
aContent->SetAttr(kNameSpaceID_None, nsHTMLAtoms::_baseTarget,
mBaseTarget, PR_FALSE);
if (mBaseTarget) {
rv = aContent->SetProperty(nsHTMLAtoms::htmlBaseTarget, mBaseTarget,
nsPropertyTable::SupportsDtorFunc);
if (NS_SUCCEEDED(rv)) {
// circumvent nsDerivedSafe
NS_ADDREF(NS_STATIC_CAST(nsIAtom*, mBaseTarget));
}
}
}
@ -3604,7 +3612,7 @@ HTMLContentSink::ProcessBASEElement(nsGenericHTMLElement* aElement)
CheckLoadURIWithPrincipal(mDocument->GetPrincipal(), baseHrefURI,
nsIScriptSecurityManager::STANDARD);
if (NS_SUCCEEDED(rv)) {
mBaseHREF = attrValue;
mBaseHref = baseHrefURI;
}
}
}
@ -3616,7 +3624,7 @@ HTMLContentSink::ProcessBASEElement(nsGenericHTMLElement* aElement)
mDocument->SetBaseTarget(attrValue);
} else {
// NAV compatibility quirk
mBaseTarget = attrValue;
mBaseTarget = do_GetAtom(attrValue);
}
}
}

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

@ -60,6 +60,8 @@
#include "nsEscape.h"
#include "nsNodeInfoManager.h"
#include "nsContentCreatorFunctions.h"
#include "nsNetUtil.h"
#include "nsIScriptSecurityManager.h"
//
// XXX THIS IS TEMPORARY CODE
@ -146,8 +148,8 @@ public:
PRInt32 mTextLength;
PRInt32 mTextSize;
nsString mBaseHREF;
nsString mBaseTarget;
nsCOMPtr<nsIURI> mBaseHref;
nsCOMPtr<nsIAtom> mBaseTarget;
nsCOMPtr<nsIDocument> mTargetDocument;
nsRefPtr<nsNodeInfoManager> mNodeInfoManager;
@ -299,22 +301,48 @@ nsHTMLFragmentContentSink::ProcessBaseTag(nsIContent* aContent)
{
nsAutoString value;
if (aContent->GetAttr(kNameSpaceID_None, nsHTMLAtoms::href, value)) {
mBaseHREF = value;
nsCOMPtr<nsIURI> baseHrefURI;
nsresult rv = NS_NewURI(getter_AddRefs(baseHrefURI), value, nsnull);
if (NS_FAILED(rv))
return;
nsIScriptSecurityManager *securityManager =
nsContentUtils::GetSecurityManager();
rv = securityManager->
CheckLoadURIWithPrincipal(mTargetDocument->GetPrincipal(), baseHrefURI,
nsIScriptSecurityManager::STANDARD);
if (NS_SUCCEEDED(rv)) {
mBaseHref = baseHrefURI;
}
}
if (aContent->GetAttr(kNameSpaceID_None, nsHTMLAtoms::target, value)) {
mBaseTarget = value;
mBaseTarget = do_GetAtom(value);
}
}
void
nsHTMLFragmentContentSink::AddBaseTagInfo(nsIContent* aContent)
{
if (aContent) {
if (!mBaseHREF.IsEmpty()) {
aContent->SetAttr(kNameSpaceID_None, nsHTMLAtoms::_baseHref, mBaseHREF, PR_FALSE);
if (!aContent) {
return;
}
nsresult rv;
if (mBaseHref) {
rv = aContent->SetProperty(nsHTMLAtoms::htmlBaseHref, mBaseHref,
nsPropertyTable::SupportsDtorFunc);
if (NS_SUCCEEDED(rv)) {
// circumvent nsDerivedSafe
NS_ADDREF(NS_STATIC_CAST(nsIURI*, mBaseHref));
}
if (!mBaseTarget.IsEmpty()) {
aContent->SetAttr(kNameSpaceID_None, nsHTMLAtoms::_baseTarget, mBaseTarget, PR_FALSE);
}
if (mBaseTarget) {
rv = aContent->SetProperty(nsHTMLAtoms::htmlBaseTarget, mBaseTarget,
nsPropertyTable::SupportsDtorFunc);
if (NS_SUCCEEDED(rv)) {
// circumvent nsDerivedSafe
NS_ADDREF(NS_STATIC_CAST(nsIAtom*, mBaseTarget));
}
}
}