Bug 652110: Make nsFileDataURI inherit directly from nsSimpleURI. r=sicking

This commit is contained in:
Kyle Huey 2011-04-22 09:03:20 -04:00
parent facde0c632
commit b4bdc7d485
2 changed files with 35 additions and 64 deletions

View File

@ -206,6 +206,7 @@ INCLUDES += \
-I$(topsrcdir)/dom/ipc \
-I$(topsrcdir)/js/src/xpconnect/src \
-I$(topsrcdir)/caps/include \
-I$(topsrcdir)/netwerk/base/src \
$(NULL)
DEFINES += -D_IMPL_NS_LAYOUT

View File

@ -35,7 +35,7 @@
* ***** END LICENSE BLOCK ***** */
#include "nsFileDataProtocolHandler.h"
#include "nsNetCID.h"
#include "nsSimpleURI.h"
#include "nsDOMError.h"
#include "nsCOMPtr.h"
#include "nsClassHashtable.h"
@ -49,8 +49,6 @@
#include "nsIObjectOutputStream.h"
#include "nsIProgrammingLanguage.h"
static NS_DEFINE_CID(kSimpleURICID, NS_SIMPLEURI_CID);
// -----------------------------------------------------------------------
// Hash table
struct FileDataInfo
@ -132,47 +130,19 @@ GetFileDataInfo(const nsACString& aUri)
static NS_DEFINE_CID(kFILEDATAURICID, NS_FILEDATAURI_CID);
// Use an extra base object to avoid having to manually retype all the
// nsIURI methods. I wish we could just inherit from nsSimpleURI instead.
class nsFileDataURI_base : public nsIURI,
public nsIMutable
class nsFileDataURI : public nsSimpleURI,
public nsIURIWithPrincipal
{
public:
nsFileDataURI_base(nsIURI* aSimpleURI) :
mSimpleURI(aSimpleURI)
{
mMutable = do_QueryInterface(mSimpleURI);
NS_ASSERTION(aSimpleURI && mMutable, "This isn't going to work out");
}
virtual ~nsFileDataURI_base() {}
// For use only from deserialization
nsFileDataURI_base() {}
NS_FORWARD_NSIURI(mSimpleURI->)
NS_FORWARD_NSIMUTABLE(mMutable->)
protected:
nsCOMPtr<nsIURI> mSimpleURI;
nsCOMPtr<nsIMutable> mMutable;
};
class nsFileDataURI : public nsFileDataURI_base,
public nsIURIWithPrincipal,
public nsISerializable,
public nsIClassInfo
{
public:
nsFileDataURI(nsIPrincipal* aPrincipal, nsIURI* aSimpleURI) :
nsFileDataURI_base(aSimpleURI), mPrincipal(aPrincipal)
nsFileDataURI(nsIPrincipal* aPrincipal) :
nsSimpleURI(), mPrincipal(aPrincipal)
{}
virtual ~nsFileDataURI() {}
// For use only from deserialization
nsFileDataURI() : nsFileDataURI_base() {}
nsFileDataURI() : nsSimpleURI() {}
NS_DECL_ISUPPORTS
NS_DECL_ISUPPORTS_INHERITED
NS_DECL_NSIURIWITHPRINCIPAL
NS_DECL_NSISERIALIZABLE
NS_DECL_NSICLASSINFO
@ -181,22 +151,21 @@ public:
NS_IMETHOD Clone(nsIURI** aClone);
NS_IMETHOD Equals(nsIURI* aOther, PRBool *aResult);
// Override StartClone to hand back a nsFileDataURI
virtual nsSimpleURI* StartClone()
{ return new nsFileDataURI(); }
nsCOMPtr<nsIPrincipal> mPrincipal;
};
NS_IMPL_ADDREF(nsFileDataURI)
NS_IMPL_RELEASE(nsFileDataURI)
NS_IMPL_ADDREF_INHERITED(nsFileDataURI, nsSimpleURI)
NS_IMPL_RELEASE_INHERITED(nsFileDataURI, nsSimpleURI)
NS_INTERFACE_MAP_BEGIN(nsFileDataURI)
NS_INTERFACE_MAP_ENTRY(nsIURI)
NS_INTERFACE_MAP_ENTRY(nsIURIWithPrincipal)
NS_INTERFACE_MAP_ENTRY(nsISerializable)
NS_INTERFACE_MAP_ENTRY(nsIClassInfo)
NS_INTERFACE_MAP_ENTRY(nsIMutable)
NS_INTERFACE_MAP_ENTRY_AMBIGUOUS(nsISupports, nsIURI)
if (aIID.Equals(kFILEDATAURICID))
foundInterface = static_cast<nsIURI*>(this);
else
NS_INTERFACE_MAP_END
NS_INTERFACE_MAP_END_INHERITING(nsSimpleURI)
// nsIURIWithPrincipal methods:
@ -226,20 +195,16 @@ nsFileDataURI::GetPrincipalUri(nsIURI** aUri)
NS_IMETHODIMP
nsFileDataURI::Read(nsIObjectInputStream* aStream)
{
nsresult rv = aStream->ReadObject(PR_TRUE, getter_AddRefs(mSimpleURI));
nsresult rv = nsSimpleURI::Read(aStream);
NS_ENSURE_SUCCESS(rv, rv);
mMutable = do_QueryInterface(mSimpleURI);
NS_ENSURE_TRUE(mMutable, NS_ERROR_UNEXPECTED);
return NS_ReadOptionalObject(aStream, PR_TRUE, getter_AddRefs(mPrincipal));
}
NS_IMETHODIMP
nsFileDataURI::Write(nsIObjectOutputStream* aStream)
{
nsresult rv = aStream->WriteCompoundObject(mSimpleURI, NS_GET_IID(nsIURI),
PR_TRUE);
nsresult rv = nsSimpleURI::Write(aStream);
NS_ENSURE_SUCCESS(rv, rv);
return NS_WriteOptionalCompoundObject(aStream, mPrincipal,
@ -253,13 +218,21 @@ NS_IMETHODIMP
nsFileDataURI::Clone(nsIURI** aClone)
{
nsCOMPtr<nsIURI> simpleClone;
nsresult rv = mSimpleURI->Clone(getter_AddRefs(simpleClone));
nsresult rv = nsSimpleURI::Clone(getter_AddRefs(simpleClone));
NS_ENSURE_SUCCESS(rv, rv);
nsIURI* newURI = new nsFileDataURI(mPrincipal, simpleClone);
NS_ENSURE_TRUE(newURI, NS_ERROR_OUT_OF_MEMORY);
#ifdef DEBUG
nsRefPtr<nsFileDataURI> uriCheck;
rv = simpleClone->QueryInterface(kFILEDATAURICID, getter_AddRefs(uriCheck));
NS_ABORT_IF_FALSE(NS_SUCCEEDED(rv) && uriCheck,
"Unexpected!");
#endif
NS_ADDREF(*aClone = newURI);
nsFileDataURI* fileDataURI = static_cast<nsFileDataURI*>(simpleClone.get());
fileDataURI->mPrincipal = mPrincipal;
simpleClone.forget(aClone);
return NS_OK;
}
@ -285,7 +258,7 @@ nsFileDataURI::Equals(nsIURI* aOther, PRBool *aResult)
return NS_OK;
}
return mSimpleURI->Equals(otherFileDataUri->mSimpleURI, aResult);
return nsSimpleURI::Equals(otherFileDataUri, aResult);
}
// nsIClassInfo methods:
@ -391,17 +364,14 @@ nsFileDataProtocolHandler::NewURI(const nsACString& aSpec,
FileDataInfo* info =
GetFileDataInfo(aSpec);
nsCOMPtr<nsIURI> inner = do_CreateInstance(kSimpleURICID, &rv);
NS_ENSURE_SUCCESS(rv, rv);
rv = inner->SetSpec(aSpec);
NS_ENSURE_SUCCESS(rv, rv);
nsRefPtr<nsFileDataURI> uri =
new nsFileDataURI(info ? info->mPrincipal.get() : nsnull, inner);
new nsFileDataURI(info ? info->mPrincipal.get() : nsnull);
rv = uri->SetSpec(aSpec);
NS_ENSURE_SUCCESS(rv, rv);
NS_TryToSetImmutable(uri);
*aResult = uri.forget().get();
uri.forget(aResult);
return NS_OK;
}