diff --git a/docshell/base/nsDocShell.cpp b/docshell/base/nsDocShell.cpp index 9f690678aff..931afeaccbf 100644 --- a/docshell/base/nsDocShell.cpp +++ b/docshell/base/nsDocShell.cpp @@ -48,6 +48,7 @@ #include "prenv.h" #include "nsIDOMWindow.h" #include "nsIGlobalObject.h" +#include "nsIViewSourceChannel.h" #include "nsIWebBrowserChrome.h" #include "nsPoint.h" #include "nsIObserverService.h" @@ -10395,20 +10396,18 @@ nsDocShell::DoURILoad(nsIURI* aURI, } if (!isSrcdoc) { - nsCOMPtr loadInfo = - new LoadInfo(requestingNode ? requestingNode->NodePrincipal() : - triggeringPrincipal.get(), - triggeringPrincipal, - requestingNode, - securityFlags, - aContentPolicyType, - aBaseURI); rv = NS_NewChannelInternal(getter_AddRefs(channel), aURI, - loadInfo, - nullptr, // loadGroup - static_cast(this), - loadFlags); + requestingNode, + requestingNode + ? requestingNode->NodePrincipal() + : triggeringPrincipal.get(), + triggeringPrincipal, + securityFlags, + aContentPolicyType, + nullptr, // loadGroup + static_cast(this), + loadFlags); if (NS_FAILED(rv)) { if (rv == NS_ERROR_UNKNOWN_PROTOCOL) { @@ -10425,6 +10424,12 @@ nsDocShell::DoURILoad(nsIURI* aURI, } return rv; } + if (aBaseURI) { + nsCOMPtr vsc = do_QueryInterface(channel); + if (vsc) { + vsc->SetBaseURI(aBaseURI); + } + } } else { nsAutoCString scheme; rv = aURI->GetScheme(scheme); @@ -10436,17 +10441,15 @@ nsDocShell::DoURILoad(nsIURI* aURI, nsViewSourceHandler* vsh = nsViewSourceHandler::GetInstance(); NS_ENSURE_TRUE(vsh, NS_ERROR_FAILURE); - rv = vsh->NewSrcdocChannel(aURI, aSrcdoc, getter_AddRefs(channel)); - NS_ENSURE_SUCCESS(rv, rv); - nsCOMPtr loadInfo = - new LoadInfo(requestingNode ? requestingNode->NodePrincipal() : - triggeringPrincipal.get(), - triggeringPrincipal, - requestingNode, - securityFlags, - aContentPolicyType, - aBaseURI); - channel->SetLoadInfo(loadInfo); + rv = vsh->NewSrcdocChannel(aURI, aBaseURI, aSrcdoc, + requestingNode, + requestingNode + ? requestingNode->NodePrincipal() + : triggeringPrincipal.get(), + triggeringPrincipal, + securityFlags, + aContentPolicyType, + getter_AddRefs(channel)); } else { rv = NS_NewInputStreamChannelInternal(getter_AddRefs(channel), aURI, @@ -10459,9 +10462,11 @@ nsDocShell::DoURILoad(nsIURI* aURI, triggeringPrincipal, securityFlags, aContentPolicyType, - true, - aBaseURI); + true); NS_ENSURE_SUCCESS(rv, rv); + nsCOMPtr isc = do_QueryInterface(channel); + MOZ_ASSERT(isc); + isc->SetBaseURI(aBaseURI); } } @@ -11735,7 +11740,7 @@ nsDocShell::AddToSessionHistory(nsIURI* aURI, nsIChannel* aChannel, nsCOMPtr loadInfo; aChannel->GetLoadInfo(getter_AddRefs(loadInfo)); nsCOMPtr baseURI; - loadInfo->GetBaseURI(getter_AddRefs(baseURI)); + inStrmChan->GetBaseURI(getter_AddRefs(baseURI)); entry->SetBaseURI(baseURI); } } diff --git a/netwerk/base/LoadInfo.cpp b/netwerk/base/LoadInfo.cpp index c4465a07fd9..d7940a2041c 100644 --- a/netwerk/base/LoadInfo.cpp +++ b/netwerk/base/LoadInfo.cpp @@ -23,8 +23,7 @@ LoadInfo::LoadInfo(nsIPrincipal* aLoadingPrincipal, nsIPrincipal* aTriggeringPrincipal, nsINode* aLoadingContext, nsSecurityFlags aSecurityFlags, - nsContentPolicyType aContentPolicyType, - nsIURI* aBaseURI) + nsContentPolicyType aContentPolicyType) : mLoadingPrincipal(aLoadingContext ? aLoadingContext->NodePrincipal() : aLoadingPrincipal) , mTriggeringPrincipal(aTriggeringPrincipal ? @@ -32,7 +31,6 @@ LoadInfo::LoadInfo(nsIPrincipal* aLoadingPrincipal, , mLoadingContext(do_GetWeakReference(aLoadingContext)) , mSecurityFlags(aSecurityFlags) , mContentPolicyType(aContentPolicyType) - , mBaseURI(aBaseURI) , mUpgradeInsecureRequests(false) , mInnerWindowID(0) , mOuterWindowID(0) @@ -226,20 +224,6 @@ LoadInfo::InternalContentPolicyType() return mContentPolicyType; } -NS_IMETHODIMP -LoadInfo::GetBaseURI(nsIURI** aBaseURI) -{ - *aBaseURI = mBaseURI; - NS_IF_ADDREF(*aBaseURI); - return NS_OK; -} - -nsIURI* -LoadInfo::BaseURI() -{ - return mBaseURI; -} - NS_IMETHODIMP LoadInfo::GetUpgradeInsecureRequests(bool* aResult) { diff --git a/netwerk/base/LoadInfo.h b/netwerk/base/LoadInfo.h index 23f096245f7..799e8f144b7 100644 --- a/netwerk/base/LoadInfo.h +++ b/netwerk/base/LoadInfo.h @@ -48,8 +48,7 @@ public: nsIPrincipal* aTriggeringPrincipal, nsINode* aLoadingContext, nsSecurityFlags aSecurityFlags, - nsContentPolicyType aContentPolicyType, - nsIURI* aBaseURI = nullptr); + nsContentPolicyType aContentPolicyType); private: // private constructor that is only allowed to be called from within @@ -80,7 +79,6 @@ private: nsWeakPtr mLoadingContext; nsSecurityFlags mSecurityFlags; nsContentPolicyType mContentPolicyType; - nsCOMPtr mBaseURI; bool mUpgradeInsecureRequests; uint64_t mInnerWindowID; uint64_t mOuterWindowID; diff --git a/netwerk/base/nsIInputStreamChannel.idl b/netwerk/base/nsIInputStreamChannel.idl index 73bcfa1b5cd..3af16ed62f0 100644 --- a/netwerk/base/nsIInputStreamChannel.idl +++ b/netwerk/base/nsIInputStreamChannel.idl @@ -13,7 +13,7 @@ interface nsIURI; * This interface provides methods to initialize an input stream channel. * The input stream channel serves as a data pump for an input stream. */ -[scriptable, uuid(e1e95852-914b-4d83-b574-23f114db9b89)] +[scriptable, uuid(ea730238-4bfd-4015-8489-8f264d05b343)] interface nsIInputStreamChannel : nsISupports { /** @@ -55,4 +55,10 @@ interface nsIInputStreamChannel : nsISupports * Returns true if srcdocData has been set within the channel. */ readonly attribute boolean isSrcdocChannel; + + /** + * The base URI to be used for the channel. Used when the base URI cannot + * be inferred by other means, for example when this is a srcdoc channel. + */ + attribute nsIURI baseURI; }; diff --git a/netwerk/base/nsILoadInfo.idl b/netwerk/base/nsILoadInfo.idl index 66efc5a85b0..074a9aabc04 100644 --- a/netwerk/base/nsILoadInfo.idl +++ b/netwerk/base/nsILoadInfo.idl @@ -10,7 +10,6 @@ interface nsIDOMDocument; interface nsINode; interface nsIPrincipal; -interface nsIURI; %{C++ #include "nsTArray.h" @@ -23,7 +22,7 @@ typedef unsigned long nsSecurityFlags; /** * An nsILoadOwner represents per-load information about who started the load. */ -[scriptable, builtinclass, uuid(cc51498e-f8f8-469d-85ba-6dcba17027e4)] +[scriptable, builtinclass, uuid(99abb145-29d2-4a0a-8bca-213fa6211cc9)] interface nsILoadInfo : nsISupports { /** @@ -270,19 +269,6 @@ interface nsILoadInfo : nsISupports [noscript, notxpcom] nsContentPolicyType internalContentPolicyType(); - /** - * A base URI for use in situations where it cannot otherwise be inferred. - * This attribute may be null. The value of this attribute may be - * ignored if the base URI can be inferred by the channel's URI. - */ - readonly attribute nsIURI baseURI; - - /** - * A C++-friendly version of baseURI. - */ - [noscript, notxpcom, nostdcall, binaryname(BaseURI)] - nsIURI binaryBaseURI(); - /** * Returns true if document or any of the documents ancestors * up to the toplevel document make use of the CSP directive diff --git a/netwerk/base/nsInputStreamChannel.cpp b/netwerk/base/nsInputStreamChannel.cpp index de1e0240edd..5aa4d70abdd 100644 --- a/netwerk/base/nsInputStreamChannel.cpp +++ b/netwerk/base/nsInputStreamChannel.cpp @@ -89,3 +89,18 @@ nsInputStreamChannel::GetIsSrcdocChannel(bool *aIsSrcdocChannel) *aIsSrcdocChannel = mIsSrcdocChannel; return NS_OK; } + +NS_IMETHODIMP +nsInputStreamChannel::GetBaseURI(nsIURI** aBaseURI) +{ + *aBaseURI = mBaseURI; + NS_IF_ADDREF(*aBaseURI); + return NS_OK; +} + +NS_IMETHODIMP +nsInputStreamChannel::SetBaseURI(nsIURI* aBaseURI) +{ + mBaseURI = aBaseURI; + return NS_OK; +} diff --git a/netwerk/base/nsInputStreamChannel.h b/netwerk/base/nsInputStreamChannel.h index f855533e654..f300e169527 100644 --- a/netwerk/base/nsInputStreamChannel.h +++ b/netwerk/base/nsInputStreamChannel.h @@ -33,6 +33,7 @@ protected: private: nsCOMPtr mContentStream; + nsCOMPtr mBaseURI; nsString mSrcdocData; bool mIsSrcdocChannel; }; diff --git a/netwerk/base/nsNetUtil.cpp b/netwerk/base/nsNetUtil.cpp index 6f04382da68..d5d5c7896e6 100644 --- a/netwerk/base/nsNetUtil.cpp +++ b/netwerk/base/nsNetUtil.cpp @@ -310,16 +310,14 @@ NS_NewInputStreamChannelInternal(nsIChannel **outChannel, nsIPrincipal *aLoadingPrincipal, nsIPrincipal *aTriggeringPrincipal, nsSecurityFlags aSecurityFlags, - nsContentPolicyType aContentPolicyType, - nsIURI *aBaseURI /* = nullptr */) + nsContentPolicyType aContentPolicyType) { nsCOMPtr loadInfo = new mozilla::LoadInfo(aLoadingPrincipal, aTriggeringPrincipal, aLoadingNode, aSecurityFlags, - aContentPolicyType, - aBaseURI); + aContentPolicyType); if (!loadInfo) { return NS_ERROR_UNEXPECTED; } @@ -363,8 +361,7 @@ NS_NewInputStreamChannelInternal(nsIChannel **outChannel, nsIPrincipal *aTriggeringPrincipal, nsSecurityFlags aSecurityFlags, nsContentPolicyType aContentPolicyType, - bool aIsSrcdocChannel /* = false */, - nsIURI *aBaseURI /* = nullptr */) + bool aIsSrcdocChannel /* = false */) { nsresult rv; nsCOMPtr stream; @@ -390,8 +387,7 @@ NS_NewInputStreamChannelInternal(nsIChannel **outChannel, aLoadingPrincipal, aTriggeringPrincipal, aSecurityFlags, - aContentPolicyType, - aBaseURI); + aContentPolicyType); NS_ENSURE_SUCCESS(rv, rv); @@ -412,8 +408,7 @@ NS_NewInputStreamChannel(nsIChannel **outChannel, nsIPrincipal *aLoadingPrincipal, nsSecurityFlags aSecurityFlags, nsContentPolicyType aContentPolicyType, - bool aIsSrcdocChannel /* = false */, - nsIURI *aBaseURI /* = nullptr */) + bool aIsSrcdocChannel /* = false */) { return NS_NewInputStreamChannelInternal(outChannel, aUri, @@ -424,8 +419,7 @@ NS_NewInputStreamChannel(nsIChannel **outChannel, nullptr, // aTriggeringPrincipal aSecurityFlags, aContentPolicyType, - aIsSrcdocChannel, - aBaseURI); + aIsSrcdocChannel); } nsresult diff --git a/netwerk/base/nsNetUtil.h b/netwerk/base/nsNetUtil.h index ba40c655fd3..2c2293656e9 100644 --- a/netwerk/base/nsNetUtil.h +++ b/netwerk/base/nsNetUtil.h @@ -288,8 +288,7 @@ nsresult NS_NewInputStreamChannelInternal(nsIChannel **outChannel, nsIPrincipal *aLoadingPrincipal, nsIPrincipal *aTriggeringPrincipal, nsSecurityFlags aSecurityFlags, - nsContentPolicyType aContentPolicyType, - nsIURI *aBaseURI = nullptr); + nsContentPolicyType aContentPolicyType); nsresult /* NS_NewInputStreamChannelPrincipal */ @@ -311,8 +310,7 @@ nsresult NS_NewInputStreamChannelInternal(nsIChannel **outChannel, nsIPrincipal *aTriggeringPrincipal, nsSecurityFlags aSecurityFlags, nsContentPolicyType aContentPolicyType, - bool aIsSrcdocChannel = false, - nsIURI *aBaseURI = nullptr); + bool aIsSrcdocChannel = false); nsresult NS_NewInputStreamChannel(nsIChannel **outChannel, nsIURI *aUri, @@ -321,8 +319,7 @@ nsresult NS_NewInputStreamChannel(nsIChannel **outChannel, nsIPrincipal *aLoadingPrincipal, nsSecurityFlags aSecurityFlags, nsContentPolicyType aContentPolicyType, - bool aIsSrcdocChannel = false, - nsIURI *aBaseURI = nullptr); + bool aIsSrcdocChannel = false); nsresult NS_NewInputStreamPump(nsIInputStreamPump **result, nsIInputStream *stream, diff --git a/netwerk/protocol/viewsource/nsIViewSourceChannel.idl b/netwerk/protocol/viewsource/nsIViewSourceChannel.idl index e0cc46674e0..9ed01ef3102 100644 --- a/netwerk/protocol/viewsource/nsIViewSourceChannel.idl +++ b/netwerk/protocol/viewsource/nsIViewSourceChannel.idl @@ -5,7 +5,7 @@ #include "nsIChannel.idl" -[uuid(72d9580a-b636-4392-b888-6c003c56f3d7)] +[uuid(3e9800f8-edb7-4c9a-9285-09b4f045b019)] interface nsIViewSourceChannel : nsIChannel { /** @@ -24,6 +24,15 @@ interface nsIViewSourceChannel : nsIChannel * Whether the channel was created to view the source of a srcdoc document. */ readonly attribute boolean isSrcdocChannel; + + /** + * Set to indicate the base URI. If this channel is a srcdoc channel, it + * returns the base URI provided by the embedded channel. It is used to + * provide an indication of the base URI in circumstances where it isn't + * otherwise recoverable. Returns null when it isn't set and isn't a + * srcdoc channel. + */ + attribute nsIURI baseURI; }; diff --git a/netwerk/protocol/viewsource/nsViewSourceChannel.cpp b/netwerk/protocol/viewsource/nsViewSourceChannel.cpp index 8824e9b1215..25fbade6050 100644 --- a/netwerk/protocol/viewsource/nsViewSourceChannel.cpp +++ b/netwerk/protocol/viewsource/nsViewSourceChannel.cpp @@ -13,6 +13,7 @@ #include "nsContentSecurityManager.h" #include "nsNullPrincipal.h" #include "nsServiceManagerUtils.h" +#include "nsIInputStreamChannel.h" NS_IMPL_ADDREF(nsViewSourceChannel) NS_IMPL_RELEASE(nsViewSourceChannel) @@ -91,9 +92,15 @@ nsViewSourceChannel::Init(nsIURI* uri) } nsresult -nsViewSourceChannel::InitSrcdoc(nsIURI* aURI, const nsAString &aSrcdoc) +nsViewSourceChannel::InitSrcdoc(nsIURI* aURI, + nsIURI* aBaseURI, + const nsAString &aSrcdoc, + nsINode *aLoadingNode, + nsIPrincipal *aLoadingPrincipal, + nsIPrincipal *aTriggeringPrincipal, + nsSecurityFlags aSecurityFlags, + nsContentPolicyType aContentPolicyType) { - nsresult rv; nsCOMPtr inStreamURI; @@ -104,14 +111,16 @@ nsViewSourceChannel::InitSrcdoc(nsIURI* aURI, const nsAString &aSrcdoc) NS_LITERAL_STRING("about:srcdoc")); NS_ENSURE_SUCCESS(rv, rv); - rv = NS_NewInputStreamChannel(getter_AddRefs(mChannel), - inStreamURI, - aSrcdoc, - NS_LITERAL_CSTRING("text/html"), - nsContentUtils::GetSystemPrincipal(), - nsILoadInfo::SEC_NORMAL, - nsIContentPolicy::TYPE_OTHER, - true); + rv = NS_NewInputStreamChannelInternal(getter_AddRefs(mChannel), + inStreamURI, + aSrcdoc, + NS_LITERAL_CSTRING("text/html"), + aLoadingNode, + aLoadingPrincipal, + aTriggeringPrincipal, + aSecurityFlags, + aContentPolicyType, + true); NS_ENSURE_SUCCESS(rv, rv); mOriginalURI = aURI; @@ -124,6 +133,10 @@ nsViewSourceChannel::InitSrcdoc(nsIURI* aURI, const nsAString &aSrcdoc) mCacheInfoChannel = do_QueryInterface(mChannel); mApplicationCacheChannel = do_QueryInterface(mChannel); mUploadChannel = do_QueryInterface(mChannel); + + nsCOMPtr isc = do_QueryInterface(mChannel); + MOZ_ASSERT(isc); + isc->SetBaseURI(aBaseURI); return NS_OK; } @@ -592,6 +605,27 @@ nsViewSourceChannel::GetIsSrcdocChannel(bool* aIsSrcdocChannel) return NS_OK; } +NS_IMETHODIMP +nsViewSourceChannel::GetBaseURI(nsIURI** aBaseURI) +{ + if (mIsSrcdocChannel) { + nsCOMPtr isc = do_QueryInterface(mChannel); + if (isc) { + return isc->GetBaseURI(aBaseURI); + } + } + *aBaseURI = mBaseURI; + NS_IF_ADDREF(*aBaseURI); + return NS_OK; +} + +NS_IMETHODIMP +nsViewSourceChannel::SetBaseURI(nsIURI* aBaseURI) +{ + mBaseURI = aBaseURI; + return NS_OK; +} + // nsIRequestObserver methods NS_IMETHODIMP nsViewSourceChannel::OnStartRequest(nsIRequest *aRequest, nsISupports *aContext) diff --git a/netwerk/protocol/viewsource/nsViewSourceChannel.h b/netwerk/protocol/viewsource/nsViewSourceChannel.h index e067ba52706..d4c6a4b43ec 100644 --- a/netwerk/protocol/viewsource/nsViewSourceChannel.h +++ b/netwerk/protocol/viewsource/nsViewSourceChannel.h @@ -49,7 +49,14 @@ public: nsresult Init(nsIURI* uri); - nsresult InitSrcdoc(nsIURI* aURI, const nsAString &aSrcdoc); + nsresult InitSrcdoc(nsIURI* aURI, + nsIURI* aBaseURI, + const nsAString &aSrcdoc, + nsINode *aLoadingNode, + nsIPrincipal *aLoadingPrincipal, + nsIPrincipal *aTriggeringPrincipal, + nsSecurityFlags aSecurityFlags, + nsContentPolicyType aContentPolicyType); protected: ~nsViewSourceChannel() {} @@ -63,6 +70,7 @@ protected: nsCOMPtr mUploadChannel; nsCOMPtr mListener; nsCOMPtr mOriginalURI; + nsCOMPtr mBaseURI; nsCString mContentType; bool mIsDocument; // keeps track of the LOAD_DOCUMENT_URI flag bool mOpened; diff --git a/netwerk/protocol/viewsource/nsViewSourceHandler.cpp b/netwerk/protocol/viewsource/nsViewSourceHandler.cpp index 261ee2465e5..a8e24b2d841 100644 --- a/netwerk/protocol/viewsource/nsViewSourceHandler.cpp +++ b/netwerk/protocol/viewsource/nsViewSourceHandler.cpp @@ -124,22 +124,33 @@ nsViewSourceHandler::NewChannel(nsIURI* uri, nsIChannel* *result) } nsresult -nsViewSourceHandler::NewSrcdocChannel(nsIURI* uri, const nsAString &srcdoc, - nsIChannel* *result) +nsViewSourceHandler::NewSrcdocChannel(nsIURI *aURI, + nsIURI *aBaseURI, + const nsAString &aSrcdoc, + nsINode *aLoadingNode, + nsIPrincipal *aLoadingPrincipal, + nsIPrincipal *aTriggeringPrincipal, + nsSecurityFlags aSecurityFlags, + nsContentPolicyType aContentPolicyType, + nsIChannel** outChannel) { - NS_ENSURE_ARG_POINTER(uri); + NS_ENSURE_ARG_POINTER(aURI); nsViewSourceChannel *channel = new nsViewSourceChannel(); - if (!channel) + if (!channel) { return NS_ERROR_OUT_OF_MEMORY; + } NS_ADDREF(channel); - nsresult rv = channel->InitSrcdoc(uri, srcdoc); + nsresult rv = channel->InitSrcdoc(aURI, aBaseURI, aSrcdoc, + aLoadingNode, aLoadingPrincipal, + aTriggeringPrincipal, aSecurityFlags, + aContentPolicyType); if (NS_FAILED(rv)) { NS_RELEASE(channel); return rv; } - *result = static_cast(channel); + *outChannel = static_cast(channel); return NS_OK; } diff --git a/netwerk/protocol/viewsource/nsViewSourceHandler.h b/netwerk/protocol/viewsource/nsViewSourceHandler.h index 46ab12b1ea4..55a1e8774f5 100644 --- a/netwerk/protocol/viewsource/nsViewSourceHandler.h +++ b/netwerk/protocol/viewsource/nsViewSourceHandler.h @@ -19,8 +19,15 @@ public: // Creates a new nsViewSourceChannel to view the source of an about:srcdoc // URI with contents specified by srcdoc. - nsresult NewSrcdocChannel(nsIURI* uri, const nsAString &srcdoc, - nsIChannel** result); + nsresult NewSrcdocChannel(nsIURI *aURI, + nsIURI *aBaseURI, + const nsAString &aSrcdoc, + nsINode *aLoadingNode, + nsIPrincipal *aLoadingPrincipal, + nsIPrincipal *aTriggeringPrincipal, + nsSecurityFlags aSecurityFlags, + nsContentPolicyType aContentPolicyType, + nsIChannel** outChannel); static nsViewSourceHandler* GetInstance(); diff --git a/parser/html/nsHtml5TreeOpExecutor.cpp b/parser/html/nsHtml5TreeOpExecutor.cpp index 1b66f52dc89..f9ef4299362 100644 --- a/parser/html/nsHtml5TreeOpExecutor.cpp +++ b/parser/html/nsHtml5TreeOpExecutor.cpp @@ -29,7 +29,7 @@ #include "nsIScriptContext.h" #include "mozilla/Preferences.h" #include "nsIHTMLDocument.h" -#include "nsILoadInfo.h" +#include "nsIViewSourceChannel.h" using namespace mozilla; @@ -803,15 +803,12 @@ nsHtml5TreeOpExecutor::GetViewSourceBaseURI() // We query the channel for the baseURI because in certain situations it // cannot otherwise be determined. If this process fails, fall back to the // standard method. - nsCOMPtr channel = mDocument->GetChannel(); - if (channel) { - nsCOMPtr loadInfo; - nsresult rv = channel->GetLoadInfo(getter_AddRefs(loadInfo)); - if (NS_SUCCEEDED(rv) && loadInfo) { - rv = loadInfo->GetBaseURI(getter_AddRefs(mViewSourceBaseURI)); - if (NS_SUCCEEDED(rv) && mViewSourceBaseURI) { - return mViewSourceBaseURI; - } + nsCOMPtr vsc = + do_QueryInterface(mDocument->GetChannel()); + if (vsc) { + nsresult rv = vsc->GetBaseURI(getter_AddRefs(mViewSourceBaseURI)); + if (NS_SUCCEEDED(rv) && mViewSourceBaseURI) { + return mViewSourceBaseURI; } }