зеркало из https://github.com/mozilla/pjs.git
Bug 325404: Get rid of _base_href and _base_target attributes and use properties instead. r/sr=jst
This commit is contained in:
Родитель
d96bbafedd
Коммит
09593adb0a
|
@ -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));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
Загрузка…
Ссылка в новой задаче