diff --git a/mozilla/content/base/public/nsIDocument.h b/mozilla/content/base/public/nsIDocument.h index 7076a9b6ded..dc39eb67e1c 100644 --- a/mozilla/content/base/public/nsIDocument.h +++ b/mozilla/content/base/public/nsIDocument.h @@ -124,6 +124,13 @@ public: * Return the base URL for realtive URLs in the document. May return null (or the document URL). */ NS_IMETHOD GetBaseURL(nsIURI*& aURL) const = 0; + NS_IMETHOD SetBaseURL(nsIURI* aURL) = 0; + + /** + * Get/Set the base target of a link in a document. + */ + NS_IMETHOD GetBaseTarget(nsAWritableString &aBaseTarget)=0; + NS_IMETHOD SetBaseTarget(const nsAReadableString &aBaseTarget)=0; /** * Return the content (mime) type of this document. diff --git a/mozilla/content/base/src/nsDocument.cpp b/mozilla/content/base/src/nsDocument.cpp index ee47c778a47..7ac61f1db0a 100644 --- a/mozilla/content/base/src/nsDocument.cpp +++ b/mozilla/content/base/src/nsDocument.cpp @@ -710,6 +710,8 @@ nsDocument::Reset(nsIChannel* aChannel, nsILoadGroup* aLoadGroup) owner->QueryInterface(NS_GET_IID(nsIPrincipal), (void**)&mPrincipal); } + mDocumentBaseURL = mDocumentURL; + if (aLoadGroup) { mDocumentLoadGroup = getter_AddRefs(NS_GetWeakReference(aLoadGroup)); // there was an assertion here that aLoadGroup was not null. This is no longer valid @@ -824,11 +826,40 @@ nsDocument::GetDocumentLoadGroup(nsILoadGroup **aGroup) const NS_IMETHODIMP nsDocument::GetBaseURL(nsIURI*& aURL) const { - aURL = mDocumentURL; + aURL = mDocumentBaseURL.get(); NS_IF_ADDREF(aURL); return NS_OK; } +NS_IMETHODIMP +nsDocument::SetBaseURL(nsIURI* aURL) +{ + nsresult rv; + NS_WITH_SERVICE(nsIScriptSecurityManager, securityManager, + NS_SCRIPTSECURITYMANAGER_CONTRACTID, &rv); + if (NS_SUCCEEDED(rv)) { + rv = securityManager->CheckLoadURI(mDocumentURL, aURL, nsIScriptSecurityManager::STANDARD); + if (NS_SUCCEEDED(rv)) { + mDocumentBaseURL = aURL; + } + } + + return rv; +} + +NS_IMETHODIMP +nsDocument::GetBaseTarget(nsAWritableString &aBaseTarget) +{ + aBaseTarget.Truncate(); + return NS_OK; +} + +NS_IMETHODIMP +nsDocument::SetBaseTarget(const nsAReadableString &aBaseTarget) +{ + return NS_OK; +} + NS_IMETHODIMP nsDocument::GetDocumentCharacterSet(nsAWritableString& oCharSetID) { oCharSetID = mCharacterSet; @@ -2741,9 +2772,9 @@ NS_IMETHODIMP nsDocument::GetBaseURI(nsAWritableString &aURI) { aURI.Truncate(); - if (mDocumentURL) { + if (mDocumentBaseURL) { nsXPIDLCString spec; - mDocumentURL->GetSpec(getter_Copies(spec)); + mDocumentBaseURL->GetSpec(getter_Copies(spec)); if (spec) { CopyASCIItoUCS2(nsLiteralCString(spec), aURI); } diff --git a/mozilla/content/base/src/nsDocument.h b/mozilla/content/base/src/nsDocument.h index 629010fab73..ac33adb441d 100644 --- a/mozilla/content/base/src/nsDocument.h +++ b/mozilla/content/base/src/nsDocument.h @@ -49,6 +49,7 @@ #include "nsHashtable.h" #include "nsIWordBreakerFactory.h" #include "nsILineBreakerFactory.h" +#include "nsIURI.h" class nsIEventListenerManager; class nsDOMStyleSheetList; @@ -259,6 +260,13 @@ public: * Return the base URL for realtive URLs in the document. May return null (or the document URL). */ NS_IMETHOD GetBaseURL(nsIURI*& aURL) const; + NS_IMETHOD SetBaseURL(nsIURI* aURL); + + /** + * Get/Set the base target of a link in a document. + */ + NS_IMETHOD GetBaseTarget(nsAWritableString &aBaseTarget); + NS_IMETHOD SetBaseTarget(const nsAReadableString &aBaseTarget); /** * Return a standard name for the document's character set. This will @@ -557,6 +565,7 @@ protected: nsIArena* mArena; nsString* mDocumentTitle; nsIURI* mDocumentURL; + nsCOMPtr mDocumentBaseURL; nsIPrincipal* mPrincipal; nsWeakPtr mDocumentLoadGroup; nsString mCharacterSet; diff --git a/mozilla/content/build/nsContentModule.cpp b/mozilla/content/build/nsContentModule.cpp index ad81dd140be..8a4f6a1e5a5 100644 --- a/mozilla/content/build/nsContentModule.cpp +++ b/mozilla/content/build/nsContentModule.cpp @@ -329,6 +329,10 @@ static Components gComponents[] = { { "XML document encoder", NS_TEXT_ENCODER_CID, NS_DOC_ENCODER_CONTRACTID_BASE "text/xml", }, + { "XML document encoder", NS_TEXT_ENCODER_CID, + NS_DOC_ENCODER_CONTRACTID_BASE "application/xml", }, + { "XML document encoder", NS_TEXT_ENCODER_CID, + NS_DOC_ENCODER_CONTRACTID_BASE "application/xhtml+xml", }, { "HTML document encoder", NS_TEXT_ENCODER_CID, NS_DOC_ENCODER_CONTRACTID_BASE "text/html", }, { "Plaintext document encoder", NS_TEXT_ENCODER_CID, @@ -337,6 +341,10 @@ static Components gComponents[] = { NS_HTMLCOPY_ENCODER_CONTRACTID, }, { "XML content serializer", NS_XMLCONTENTSERIALIZER_CID, NS_CONTENTSERIALIZER_CONTRACTID_PREFIX "text/xml", }, + { "XML content serializer", NS_XMLCONTENTSERIALIZER_CID, + NS_CONTENTSERIALIZER_CONTRACTID_PREFIX "application/xml", }, + { "XML content serializer", NS_XMLCONTENTSERIALIZER_CID, + NS_CONTENTSERIALIZER_CONTRACTID_PREFIX "application/xhtml+xml", }, { "HTML content serializer", NS_HTMLCONTENTSERIALIZER_CID, NS_CONTENTSERIALIZER_CONTRACTID_PREFIX "text/html", }, { "XUL content serializer", NS_XMLCONTENTSERIALIZER_CID, diff --git a/mozilla/content/html/content/src/nsGenericHTMLElement.cpp b/mozilla/content/html/content/src/nsGenericHTMLElement.cpp index 4d3789c716e..4b1c01b6398 100644 --- a/mozilla/content/html/content/src/nsGenericHTMLElement.cpp +++ b/mozilla/content/html/content/src/nsGenericHTMLElement.cpp @@ -1918,12 +1918,7 @@ nsGenericHTMLElement::GetBaseTarget(nsAWritableString& aBaseTarget) const } } if (nsnull != mDocument) { - nsIHTMLDocument* htmlDoc; - result = mDocument->QueryInterface(NS_GET_IID(nsIHTMLDocument), (void**)&htmlDoc); - if (NS_SUCCEEDED(result)) { - result = htmlDoc->GetBaseTarget(aBaseTarget); - NS_RELEASE(htmlDoc); - } + result = mDocument->GetBaseTarget(aBaseTarget); } else { aBaseTarget.Truncate(); diff --git a/mozilla/content/html/content/src/nsHTMLAnchorElement.cpp b/mozilla/content/html/content/src/nsHTMLAnchorElement.cpp index 7588f8b6ec7..d478c105860 100644 --- a/mozilla/content/html/content/src/nsHTMLAnchorElement.cpp +++ b/mozilla/content/html/content/src/nsHTMLAnchorElement.cpp @@ -37,7 +37,6 @@ #include "nsIPresContext.h" #include "nsIEventStateManager.h" #include "nsIURL.h" - #include "nsIEventStateManager.h" #include "nsIDOMEvent.h" #include "nsNetUtil.h" @@ -398,12 +397,9 @@ nsHTMLAnchorElement::GetTarget(nsAWritableString& aValue) rv = NS_STATIC_CAST(nsIContent *, this)->GetAttribute(kNameSpaceID_HTML, nsHTMLAtoms::target, aValue); - if (rv == NS_CONTENT_ATTR_NOT_THERE) { - nsCOMPtrdoc(do_QueryInterface(mDocument)); - if (doc) { - rv = doc->GetBaseTarget(aValue); - NS_ENSURE_SUCCESS(rv, rv); - } + if (rv == NS_CONTENT_ATTR_NOT_THERE && mDocument) { + rv = mDocument->GetBaseTarget(aValue); + NS_ENSURE_SUCCESS(rv, rv); } return NS_OK; } diff --git a/mozilla/content/html/content/src/nsHTMLAtomList.h b/mozilla/content/html/content/src/nsHTMLAtomList.h index 47563167e91..a12292a6284 100644 --- a/mozilla/content/html/content/src/nsHTMLAtomList.h +++ b/mozilla/content/html/content/src/nsHTMLAtomList.h @@ -64,6 +64,7 @@ HTML_ATOM(archive, "archive") HTML_ATOM(area, "area") HTML_ATOM(axis, "axis") HTML_ATOM(background, "background") +HTML_ATOM(base, "base") HTML_ATOM(below, "below") #ifdef IBMBIDI HTML_ATOM(bdo, "bdo") diff --git a/mozilla/content/html/document/src/nsHTMLContentSink.cpp b/mozilla/content/html/document/src/nsHTMLContentSink.cpp index 7474e031d1b..ce4114c976e 100644 --- a/mozilla/content/html/document/src/nsHTMLContentSink.cpp +++ b/mozilla/content/html/document/src/nsHTMLContentSink.cpp @@ -366,14 +366,14 @@ public: void AddBaseTagInfo(nsIHTMLContent* aContent); - nsresult ProcessLink(nsIHTMLContent* aElement, const nsString& aLinkData); + nsresult ProcessLink(nsIHTMLContent* aElement, const nsAReadableString& aLinkData); nsresult ProcessStyleLink(nsIHTMLContent* aElement, const nsString& aHref, const nsString& aRel, const nsString& aTitle, const nsString& aType, const nsString& aMedia); - void ProcessBaseHref(const nsString& aBaseHref); - void ProcessBaseTarget(const nsString& aBaseTarget); + void ProcessBaseHref(const nsAReadableString& aBaseHref); + void ProcessBaseTarget(const nsAReadableString& aBaseTarget); nsresult RefreshIfEnabled(nsIViewManager* vm); @@ -387,7 +387,7 @@ public: nsresult ProcessSCRIPTTag(const nsIParserNode& aNode); nsresult ProcessSTYLETag(const nsIParserNode& aNode); - nsresult ProcessHeaderData(nsIAtom* aHeader,nsString& aValue,nsIHTMLContent* aContent=nsnull); + nsresult ProcessHeaderData(nsIAtom* aHeader,const nsAReadableString& aValue,nsIHTMLContent* aContent=nsnull); nsresult ProcessHTTPHeaders(nsIChannel* aChannel); // Script processing related routines @@ -3752,25 +3752,29 @@ HTMLContentSink::ProcessAREATag(const nsIParserNode& aNode) } void -HTMLContentSink::ProcessBaseHref(const nsString& aBaseHref) +HTMLContentSink::ProcessBaseHref(const nsAReadableString& aBaseHref) { //-- Make sure this page is allowed to load this URL nsresult rv; - NS_WITH_SERVICE(nsIScriptSecurityManager, securityManager, - NS_SCRIPTSECURITYMANAGER_CONTRACTID, &rv); - if (NS_FAILED(rv)) return; nsCOMPtr baseHrefURI; rv = NS_NewURI(getter_AddRefs(baseHrefURI), aBaseHref, nsnull); if (NS_FAILED(rv)) return; - rv = securityManager->CheckLoadURI(mDocumentBaseURL, baseHrefURI, nsIScriptSecurityManager::STANDARD); - if (NS_FAILED(rv)) return; if (nsnull == mBody) { // still in real HEAD - mHTMLDocument->SetBaseURL(aBaseHref); - NS_RELEASE(mDocumentBaseURL); - mDocument->GetBaseURL(mDocumentBaseURL); + rv = mDocument->SetBaseURL(baseHrefURI); // The document checks if it is legal to set this base + if (NS_SUCCEEDED(rv)) { + NS_RELEASE(mDocumentBaseURL); + mDocument->GetBaseURL(mDocumentBaseURL); + } } else { // NAV compatibility quirk + NS_WITH_SERVICE(nsIScriptSecurityManager, securityManager, + NS_SCRIPTSECURITYMANAGER_CONTRACTID, &rv); + if (NS_FAILED(rv)) return; + + rv = securityManager->CheckLoadURI(mDocumentBaseURL, baseHrefURI, nsIScriptSecurityManager::STANDARD); + if (NS_FAILED(rv)) return; + mBaseHREF = aBaseHref; } } @@ -3795,10 +3799,10 @@ HTMLContentSink::RefreshIfEnabled(nsIViewManager* vm) } void -HTMLContentSink::ProcessBaseTarget(const nsString& aBaseTarget) +HTMLContentSink::ProcessBaseTarget(const nsAReadableString& aBaseTarget) { if (nsnull == mBody) { // still in real HEAD - mHTMLDocument->SetBaseTarget(aBaseTarget); + mDocument->SetBaseTarget(aBaseTarget); } else { // NAV compatibility quirk mBaseTarget = aBaseTarget; @@ -3859,7 +3863,7 @@ const PRUnichar kLessThanCh = PRUnichar('<'); const PRUnichar kGreaterThanCh = PRUnichar('>'); nsresult -HTMLContentSink::ProcessLink(nsIHTMLContent* aElement, const nsString& aLinkData) +HTMLContentSink::ProcessLink(nsIHTMLContent* aElement, const nsAReadableString& aLinkData) { nsresult result = NS_OK; @@ -4371,7 +4375,7 @@ HTMLContentSink::ProcessHTTPHeaders(nsIChannel* aChannel) { } nsresult -HTMLContentSink::ProcessHeaderData(nsIAtom* aHeader,nsString& aValue,nsIHTMLContent* aContent) +HTMLContentSink::ProcessHeaderData(nsIAtom* aHeader,const nsAReadableString& aValue,nsIHTMLContent* aContent) { nsresult rv=NS_OK; // XXX necko isn't going to process headers coming in from the parser @@ -4404,7 +4408,7 @@ HTMLContentSink::ProcessHeaderData(nsIAtom* aHeader,nsString& aValue,nsIHTMLCont nsCOMPtr webNav = do_QueryInterface(docShell); rv = webNav->GetCurrentURI(getter_AddRefs(baseURI)); if (NS_FAILED(rv)) return rv; - char *cookie = aValue.ToNewCString(); + char *cookie = ToNewUTF8String(aValue); nsCOMPtr globalObj; nsCOMPtr prompt; mDocument->GetScriptGlobalObject(getter_AddRefs(globalObj)); diff --git a/mozilla/content/html/document/src/nsHTMLDocument.cpp b/mozilla/content/html/document/src/nsHTMLDocument.cpp index 727aff07ef1..76ac05ca1a0 100644 --- a/mozilla/content/html/document/src/nsHTMLDocument.cpp +++ b/mozilla/content/html/document/src/nsHTMLDocument.cpp @@ -1075,13 +1075,12 @@ nsHTMLDocument::InternalInsertStyleSheetAt(nsIStyleSheet* aSheet, PRInt32 aIndex mStyleSheets.InsertElementAt(aSheet, aIndex + 1); // offset one for the attr style sheet } - NS_IMETHODIMP nsHTMLDocument::GetBaseURL(nsIURI*& aURL) const { - if (nsnull != mBaseURL) { - NS_ADDREF(mBaseURL); - aURL = mBaseURL; + if (mDocumentBaseURL) { + aURL = mDocumentBaseURL.get(); + NS_ADDREF(aURL); } else { aURL = GetDocumentURL(); @@ -1089,20 +1088,6 @@ nsHTMLDocument::GetBaseURL(nsIURI*& aURL) const return NS_OK; } -NS_IMETHODIMP -nsHTMLDocument::SetBaseURL(const nsAReadableString& aURLSpec) -{ - nsresult result = NS_OK; - - NS_IF_RELEASE(mBaseURL); - if (0 < aURLSpec.Length()) { - { - result = NS_NewURI(&mBaseURL, aURLSpec, mDocumentURL); - } - } - return result; -} - NS_IMETHODIMP nsHTMLDocument::GetBaseTarget(nsAWritableString& aTarget) const { diff --git a/mozilla/content/html/document/src/nsHTMLDocument.h b/mozilla/content/html/document/src/nsHTMLDocument.h index 1f9722ed931..8c975fd3d5e 100644 --- a/mozilla/content/html/document/src/nsHTMLDocument.h +++ b/mozilla/content/html/document/src/nsHTMLDocument.h @@ -91,7 +91,6 @@ public: NS_IMETHOD GetCSSLoader(nsICSSLoader*& aLoader); NS_IMETHOD GetBaseURL(nsIURI*& aURL) const; - NS_IMETHOD SetBaseURL(const nsAReadableString& aURLSpec); NS_IMETHOD GetBaseTarget(nsAWritableString& aTarget) const; NS_IMETHOD SetBaseTarget(const nsAReadableString& aTarget); diff --git a/mozilla/content/html/document/src/nsIHTMLDocument.h b/mozilla/content/html/document/src/nsIHTMLDocument.h index cea7e37cae5..9149e482f77 100644 --- a/mozilla/content/html/document/src/nsIHTMLDocument.h +++ b/mozilla/content/html/document/src/nsIHTMLDocument.h @@ -58,11 +58,6 @@ public: NS_IMETHOD GetForms(nsIDOMHTMLCollection** aForms) = 0; - NS_IMETHOD SetBaseURL(const nsAReadableString& aURLSpec) = 0; - - NS_IMETHOD GetBaseTarget(nsAWritableString& aTarget) const = 0; - NS_IMETHOD SetBaseTarget(const nsAReadableString& aTarget) = 0; - NS_IMETHOD SetLastModified(const nsAReadableString& aLastModified) = 0; NS_IMETHOD SetReferrer(const nsAReadableString& aReferrer) = 0; diff --git a/mozilla/content/shared/public/nsHTMLAtomList.h b/mozilla/content/shared/public/nsHTMLAtomList.h index 47563167e91..a12292a6284 100644 --- a/mozilla/content/shared/public/nsHTMLAtomList.h +++ b/mozilla/content/shared/public/nsHTMLAtomList.h @@ -64,6 +64,7 @@ HTML_ATOM(archive, "archive") HTML_ATOM(area, "area") HTML_ATOM(axis, "axis") HTML_ATOM(background, "background") +HTML_ATOM(base, "base") HTML_ATOM(below, "below") #ifdef IBMBIDI HTML_ATOM(bdo, "bdo") diff --git a/mozilla/content/xml/document/src/nsXMLContentSink.cpp b/mozilla/content/xml/document/src/nsXMLContentSink.cpp index cca579d3ac1..a456f3a8da4 100644 --- a/mozilla/content/xml/document/src/nsXMLContentSink.cpp +++ b/mozilla/content/xml/document/src/nsXMLContentSink.cpp @@ -34,7 +34,7 @@ #include "nsIScriptObjectOwner.h" #include "nsIScriptGlobalObject.h" #include "nsIURL.h" -#include "nsIURL.h" +#include "nsIRefreshURI.h" #include "nsNetUtil.h" #include "nsIWebShell.h" #include "nsIDocShell.h" @@ -74,6 +74,7 @@ #include "nsParserUtils.h" #include "nsIDocumentViewer.h" #include "nsIScrollable.h" +#include "nsIWebNavigation.h" // XXX misnamed header file, but oh well #include "nsHTMLTokens.h" @@ -90,13 +91,10 @@ nsINameSpaceManager* nsXMLContentSink::gNameSpaceManager = nsnull; PRUint32 nsXMLContentSink::gRefCnt = 0; // XXX Open Issues: -// 1) html:base - Should we allow a base tag? If so, the content -// sink needs to maintain the base when resolving URLs for -// loaded scripts and style sheets. Should it be allowed anywhere? -// 2) what's not allowed - We need to figure out which HTML tags +// 1) what's not allowed - We need to figure out which HTML tags // (prefixed with a HTML namespace qualifier) are explicitly not // allowed (if any). -// 3) factoring code with nsHTMLContentSink - There's some amount of +// 2) factoring code with nsHTMLContentSink - There's some amount of // common code between this and the HTML content sink. This will // increase as we support more and more HTML elements. How can code // from the code be factored? @@ -615,6 +613,18 @@ nsXMLContentSink::OpenContainer(const nsIParserNode& aNode) mTextAreaElement = do_QueryInterface(htmlContent); } else if (tagAtom.get() == nsHTMLAtoms::style) { mStyleElement = htmlContent; + } else if (tagAtom.get() == nsHTMLAtoms::base) { + if (!mBaseElement) { + mBaseElement = htmlContent; // The first base wins + } + } else if (tagAtom.get() == nsHTMLAtoms::meta) { + if (!mMetaElement) { + mMetaElement = htmlContent; + } + } else if (tagAtom.get() == nsHTMLAtoms::link) { + if (!mLinkElement) { + mLinkElement = htmlContent; + } } } else { @@ -726,6 +736,20 @@ nsXMLContentSink::CloseContainer(const nsIParserNode& aNode) mStyleElement=nsnull; mStyleText.Truncate(); } + } else if (tagAtom.get() == nsHTMLAtoms::base) { + if (mBaseElement) { + result = ProcessBASETag(); + } + } else if (tagAtom.get() == nsHTMLAtoms::meta) { + if (mMetaElement) { + result = ProcessMETATag(); + mMetaElement = nsnull; // HTML can have more than one meta so clear this now + } + } else if (tagAtom.get() == nsHTMLAtoms::link) { + if (mLinkElement) { + result = ProcessLINKTag(); + mLinkElement = nsnull; // HTML can have more than one link so clear this now + } } } @@ -978,7 +1002,7 @@ nsXMLContentSink::LoadXSLStyleSheet(nsIURI* aUrl, const nsString& aType) // Hook up the content sink to the parser's output and ask the parser // to start parsing the URL specified by aURL. parser->SetContentSink(sink); - nsAutoString utf8(NS_ConvertASCIItoUCS2("UTF-8")); + nsAutoString utf8(NS_LITERAL_STRING("UTF-8")); styleDoc->SetDocumentCharacterSet(utf8); parser->SetDocumentCharset(utf8, kCharsetFromDocTypeDefault); parser->Parse(aUrl); @@ -1205,6 +1229,113 @@ nsXMLContentSink::ProcessSTYLETag(const nsIParserNode& aNode) return rv; } +nsresult +nsXMLContentSink::ProcessBASETag() +{ + nsresult rv = NS_OK; + + if (mDocument) { + nsAutoString value; + + if (NS_CONTENT_ATTR_HAS_VALUE == mBaseElement->GetAttribute(kNameSpaceID_HTML, nsHTMLAtoms::target, value)) { + mDocument->SetBaseTarget(value); + } + + if (NS_CONTENT_ATTR_HAS_VALUE == mBaseElement->GetAttribute(kNameSpaceID_HTML, nsHTMLAtoms::href, value)) { + nsCOMPtr baseURI; + rv = NS_NewURI(getter_AddRefs(baseURI), value, nsnull); + if (NS_SUCCEEDED(rv)) { + rv = mDocument->SetBaseURL(baseURI); // The document checks if it is legal to set this base + if (NS_SUCCEEDED(rv)) { + NS_IF_RELEASE(mDocumentBaseURL); + mDocument->GetBaseURL(mDocumentBaseURL); + } + } + } + } + + return rv; +} + +nsresult +nsXMLContentSink::ProcessHeaderData(nsIAtom* aHeader,const nsAReadableString& aValue,nsIHTMLContent* aContent) +{ + nsresult rv=NS_OK; + // XXX necko isn't going to process headers coming in from the parser + //NS_WARNING("need to fix how necko adds mime headers (in HTMLContentSink::ProcessMETATag)"); + + // see if we have a refresh "header". + if (aHeader == nsHTMLAtoms::refresh) { + // first get our baseURI + nsCOMPtr docShell = do_QueryInterface(mWebShell, &rv); + if (NS_FAILED(rv)) return rv; + + nsCOMPtr baseURI; + nsCOMPtr webNav = do_QueryInterface(docShell); + rv = webNav->GetCurrentURI(getter_AddRefs(baseURI)); + if (NS_FAILED(rv)) return rv; + + nsCOMPtr reefer = do_QueryInterface(mWebShell); + if (reefer) { + rv = reefer->RefreshURIFromHeader(baseURI, aValue); + if (NS_FAILED(rv)) return rv; + } + } // END refresh + return rv; +} + +nsresult +nsXMLContentSink::ProcessMETATag() +{ + nsresult rv = NS_OK; + + // set any HTTP-EQUIV data into document's header data as well as url + nsAutoString header; + mMetaElement->GetAttribute(kNameSpaceID_HTML, nsHTMLAtoms::httpEquiv, header); + if (header.Length() > 0) { + nsAutoString result; + mMetaElement->GetAttribute(kNameSpaceID_HTML, nsHTMLAtoms::content, result); + if (result.Length() > 0) { + header.ToLowerCase(); + nsCOMPtr fieldAtom(dont_AddRef(NS_NewAtom(header))); + rv=ProcessHeaderData(fieldAtom,result,mMetaElement); + }//if (result.Length() > 0) + }//if (header.Length() > 0) + + return rv; +} + +nsresult +nsXMLContentSink::ProcessLINKTag() +{ + nsresult result = NS_OK; + + nsAutoString href; + nsAutoString rel; + nsAutoString title; + nsAutoString type; + nsAutoString media; + + mLinkElement->GetAttribute(kNameSpaceID_HTML, nsHTMLAtoms::href, href); + mLinkElement->GetAttribute(kNameSpaceID_HTML, nsHTMLAtoms::rel, rel); + mLinkElement->GetAttribute(kNameSpaceID_HTML, nsHTMLAtoms::title, title); + mLinkElement->GetAttribute(kNameSpaceID_HTML, nsHTMLAtoms::type, type); + mLinkElement->GetAttribute(kNameSpaceID_HTML, nsHTMLAtoms::media, media); + + href.CompressWhitespace(); + rel.CompressWhitespace(); + title.CompressWhitespace(); + type.CompressWhitespace(); + media.CompressWhitespace(); + media.ToLowerCase(); // HTML4.0 spec is inconsistent, make it case INSENSITIVE + + if (!href.IsEmpty()) { + result = ProcessStyleLink(mLinkElement, href, rel.Find("alternate") == 0, title, type, media); + } + + return result; +} + NS_IMETHODIMP nsXMLContentSink::AddProcessingInstruction(const nsIParserNode& aNode) @@ -1231,8 +1362,8 @@ nsXMLContentSink::AddProcessingInstruction(const nsIParserNode& aNode) result = nsParserUtils::GetQuotedAttributeValue(text, NS_ConvertASCIItoUCS2("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; + if ((NS_OK != result) || href.IsEmpty()) { + return NS_OK; } result = nsParserUtils::GetQuotedAttributeValue(text, NS_ConvertASCIItoUCS2("type"), type); if (NS_FAILED(result)) { @@ -1247,7 +1378,7 @@ nsXMLContentSink::AddProcessingInstruction(const nsIParserNode& aNode) media.ToLowerCase(); } result = nsParserUtils::GetQuotedAttributeValue(text, NS_ConvertASCIItoUCS2("alternate"), alternate); - result = ProcessStyleLink(node, href, alternate.EqualsWithConversion("yes"), + result = ProcessStyleLink(node, href, alternate.Equals(NS_LITERAL_STRING("yes")), title, type, media); } } diff --git a/mozilla/content/xml/document/src/nsXMLContentSink.h b/mozilla/content/xml/document/src/nsXMLContentSink.h index 15bbcdf6e49..8c930731f7b 100644 --- a/mozilla/content/xml/document/src/nsXMLContentSink.h +++ b/mozilla/content/xml/document/src/nsXMLContentSink.h @@ -136,6 +136,11 @@ protected: nsresult ProcessStartSCRIPTTag(const nsIParserNode& aNode); nsresult ProcessSTYLETag(const nsIParserNode& aNode); + nsresult ProcessBASETag(); + nsresult ProcessMETATag(); + nsresult ProcessLINKTag(); + nsresult ProcessHeaderData(nsIAtom* aHeader,const nsAReadableString& aValue,nsIHTMLContent* aContent); + nsresult RefreshIfEnabled(nsIViewManager* vm); nsresult ProcessCSSStyleLink(nsIContent* aElement, @@ -182,8 +187,6 @@ protected: PRInt32 mTextSize; PRPackedBool mConstrainSize; - // XXX Special processing for HTML SCRIPT tags. We may need - // something similar for STYLE. PRPackedBool mInScript; PRPackedBool mInTitle; nsString mScriptText; @@ -201,6 +204,9 @@ protected: nsString mTextareaText; nsCOMPtr mTextAreaElement; nsCOMPtr mStyleElement; + nsCOMPtr mBaseElement; + nsCOMPtr mMetaElement; + nsCOMPtr mLinkElement; }; #endif // nsXMLContentSink_h__ diff --git a/mozilla/content/xml/document/src/nsXMLDocument.cpp b/mozilla/content/xml/document/src/nsXMLDocument.cpp index d08bad0b7bd..9edac8f6361 100644 --- a/mozilla/content/xml/document/src/nsXMLDocument.cpp +++ b/mozilla/content/xml/document/src/nsXMLDocument.cpp @@ -54,8 +54,8 @@ #include "nsINameSpaceManager.h" #include "nsICSSLoader.h" #include "nsCOMPtr.h" -#include "nsIURI.h" #include "nsXPIDLString.h" +#include "nsIURI.h" #include "nsIHTTPChannel.h" #include "nsIServiceManager.h" #include "nsICharsetAlias.h" @@ -143,6 +143,7 @@ NS_NewDOMDocument(nsIDOMDocument** aInstancePtrResult, NS_ENSURE_SUCCESS(rv, rv); doc->SetDocumentURL(aBaseURI); + doc->SetBaseURL(aBaseURI); if (aDoctype) { nsCOMPtr tmpNode; @@ -178,12 +179,10 @@ NS_NewXMLDocument(nsIDocument** aInstancePtrResult) return doc->QueryInterface(NS_GET_IID(nsIDocument), (void**) aInstancePtrResult); } -nsXMLDocument::nsXMLDocument() +nsXMLDocument::nsXMLDocument() + : mAttrStyleSheet(nsnull), mInlineStyleSheet(nsnull), + mParser(nsnull), mCSSLoader(nsnull) { - mParser = nsnull; - mAttrStyleSheet = nsnull; - mInlineStyleSheet = nsnull; - mCSSLoader = nsnull; } nsXMLDocument::~nsXMLDocument() @@ -262,6 +261,8 @@ nsXMLDocument::Reset(nsIChannel* aChannel, nsILoadGroup* aLoadGroup) result = SetDefaultStylesheets(url); + mBaseTarget.Truncate(); + return result; } @@ -343,8 +344,10 @@ nsXMLDocument::Load(const nsAReadableString& aUrl) if (NS_FAILED(secMan->CheckLoadURIFromScript(nsnull, uri))) return NS_ERROR_FAILURE; - // Reset the document URL to the new URL + // Partial Reset SetDocumentURL(uri); + SetBaseURL(uri); + mBaseTarget.Truncate(); // Create a channel rv = NS_OpenURI(getter_AddRefs(channel), uri, nsnull, nsnull, this); @@ -991,7 +994,7 @@ nsXMLDocument::CreateElementNS(const nsAReadableString& aNamespaceURI, } static nsIContent * -MatchName(nsIContent *aContent, const nsAReadableString& aName) +MatchId(nsIContent *aContent, const nsAReadableString& aName) { nsAutoString value; nsIContent *result = nsnull; @@ -1003,10 +1006,6 @@ MatchName(nsIContent *aContent, const nsAReadableString& aName) aName.Equals(value)) { return aContent; } - else if ((NS_CONTENT_ATTR_HAS_VALUE == aContent->GetAttribute(kNameSpaceID_None, nsHTMLAtoms::name, value)) && - aName.Equals(value)) { - return aContent; - } } else { nsCOMPtr xmlContent = do_QueryInterface(aContent); @@ -1025,7 +1024,7 @@ MatchName(nsIContent *aContent, const nsAReadableString& aName) for (i = 0; i < count && result == nsnull; i++) { nsIContent *child; aContent->ChildAt(i, child); - result = MatchName(child, aName); + result = MatchId(child, aName); NS_RELEASE(child); } @@ -1051,7 +1050,7 @@ nsXMLDocument::GetElementById(const nsAReadableString& aElementId, // XXX For now, we do a brute force search of the content tree. // We should come up with a more efficient solution. - nsCOMPtr content(do_QueryInterface(MatchName(mRootContent,aElementId))); + nsCOMPtr content(do_QueryInterface(MatchId(mRootContent,aElementId))); nsresult rv = NS_OK; if (content) { @@ -1111,6 +1110,20 @@ nsXMLDocument::SetTitle(const PRUnichar *aTitle) return NS_OK; } +NS_IMETHODIMP +nsXMLDocument::SetBaseTarget(const nsAReadableString &aBaseTarget) +{ + mBaseTarget.Assign(aBaseTarget); + return NS_OK; +} + +NS_IMETHODIMP +nsXMLDocument::GetBaseTarget(nsAWritableString &aBaseTarget) +{ + aBaseTarget.Assign(mBaseTarget); + return NS_OK; +} + NS_IMETHODIMP nsXMLDocument::GetCSSLoader(nsICSSLoader*& aLoader) { diff --git a/mozilla/content/xml/document/src/nsXMLDocument.h b/mozilla/content/xml/document/src/nsXMLDocument.h index a9cb4921e67..27c356a41b5 100644 --- a/mozilla/content/xml/document/src/nsXMLDocument.h +++ b/mozilla/content/xml/document/src/nsXMLDocument.h @@ -32,7 +32,7 @@ class nsIParser; class nsIDOMNode; class nsICSSLoader; - +class nsIURI; class nsXMLDocument : public nsMarkupDocument, public nsIXMLDocument, @@ -62,6 +62,9 @@ public: NS_IMETHOD EndLoad(); + NS_IMETHOD GetBaseTarget(nsAWritableString &aBaseTarget); + NS_IMETHOD SetBaseTarget(const nsAReadableString &aBaseTarget); + // nsIDOMNode interface NS_IMETHOD CloneNode(PRBool aDeep, nsIDOMNode** aReturn); @@ -105,8 +108,10 @@ protected: virtual void InternalInsertStyleSheetAt(nsIStyleSheet* aSheet, PRInt32 aIndex); // For HTML elements in our content model + // XXX This is not clean, but is there a better way? nsIHTMLStyleSheet* mAttrStyleSheet; nsIHTMLCSSStyleSheet* mInlineStyleSheet; + nsString mBaseTarget; nsIParser *mParser; nsICSSLoader* mCSSLoader; diff --git a/mozilla/content/xul/document/src/nsXULDocument.cpp b/mozilla/content/xul/document/src/nsXULDocument.cpp index bdd6f263f5f..cee6ba7ef81 100644 --- a/mozilla/content/xul/document/src/nsXULDocument.cpp +++ b/mozilla/content/xul/document/src/nsXULDocument.cpp @@ -807,9 +807,43 @@ nsXULDocument::GetDocumentLoadGroup(nsILoadGroup **aGroup) const NS_IMETHODIMP nsXULDocument::GetBaseURL(nsIURI*& aURL) const { - aURL = mDocumentURL; - NS_IF_ADDREF(aURL); - return NS_OK; + if (mDocumentBaseURL) { + aURL = mDocumentBaseURL.get(); + NS_ADDREF(aURL); + } + else { + aURL = GetDocumentURL(); + } + return NS_OK; +} + +NS_IMETHODIMP +nsXULDocument::SetBaseURL(nsIURI* aURL) +{ + nsresult rv; + NS_WITH_SERVICE(nsIScriptSecurityManager, securityManager, + NS_SCRIPTSECURITYMANAGER_CONTRACTID, &rv); + if (NS_SUCCEEDED(rv)) { + rv = securityManager->CheckLoadURI(mDocumentURL, aURL, nsIScriptSecurityManager::STANDARD); + if (NS_SUCCEEDED(rv)) { + mDocumentBaseURL = aURL; + } + } + + return rv; +} + +NS_IMETHODIMP +nsXULDocument::GetBaseTarget(nsAWritableString &aBaseTarget) +{ + aBaseTarget.Truncate(); + return NS_OK; +} + +NS_IMETHODIMP +nsXULDocument::SetBaseTarget(const nsAReadableString &aBaseTarget) +{ + return NS_OK; } NS_IMETHODIMP @@ -3560,9 +3594,9 @@ NS_IMETHODIMP nsXULDocument::GetBaseURI(nsAWritableString &aURI) { aURI.Truncate(); - if (mDocumentURL) { + if (mDocumentBaseURL) { nsXPIDLCString spec; - mDocumentURL->GetSpec(getter_Copies(spec)); // XUL documents do not have base URL? + mDocumentBaseURL->GetSpec(getter_Copies(spec)); if (spec) { CopyASCIItoUCS2(nsLiteralCString(spec), aURI); } diff --git a/mozilla/content/xul/document/src/nsXULDocument.h b/mozilla/content/xul/document/src/nsXULDocument.h index d9cd8483552..9f7bf326a3a 100644 --- a/mozilla/content/xul/document/src/nsXULDocument.h +++ b/mozilla/content/xul/document/src/nsXULDocument.h @@ -142,6 +142,12 @@ public: NS_IMETHOD GetBaseURL(nsIURI*& aURL) const; + NS_IMETHOD SetBaseURL(nsIURI *aURI); + + NS_IMETHOD GetBaseTarget(nsAWritableString &aBaseTarget); + + NS_IMETHOD SetBaseTarget(const nsAReadableString &aBaseTarget); + NS_IMETHOD GetStyleSheets(nsIDOMStyleSheetList** aStyleSheets); NS_IMETHOD GetDocumentCharacterSet(nsAWritableString& oCharSetID); @@ -492,6 +498,7 @@ protected: nsVoidArray mObservers; nsAutoString mDocumentTitle; nsCOMPtr mDocumentURL; // [OWNER] ??? compare with loader + nsCOMPtr mDocumentBaseURL; nsWeakPtr mDocumentLoadGroup; // [WEAK] leads to loader nsCOMPtr mDocumentPrincipal; // [OWNER] nsCOMPtr mRootContent; // [OWNER]