1.1 --- /dev/null Thu Jan 01 00:00:00 1970 +0000 1.2 +++ b/content/base/src/nsHostObjectURI.cpp Wed Dec 31 06:09:35 2014 +0100 1.3 @@ -0,0 +1,204 @@ 1.4 +/* This Source Code Form is subject to the terms of the Mozilla Public 1.5 + * License, v. 2.0. If a copy of the MPL was not distributed with this 1.6 + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ 1.7 + 1.8 +#include "nsHostObjectURI.h" 1.9 + 1.10 +#include "nsAutoPtr.h" 1.11 +#include "nsIObjectInputStream.h" 1.12 +#include "nsIObjectOutputStream.h" 1.13 +#include "nsIProgrammingLanguage.h" 1.14 + 1.15 +static NS_DEFINE_CID(kHOSTOBJECTURICID, NS_HOSTOBJECTURI_CID); 1.16 + 1.17 +static NS_DEFINE_CID(kThisSimpleURIImplementationCID, 1.18 + NS_THIS_SIMPLEURI_IMPLEMENTATION_CID); 1.19 + 1.20 +NS_IMPL_ADDREF_INHERITED(nsHostObjectURI, nsSimpleURI) 1.21 +NS_IMPL_RELEASE_INHERITED(nsHostObjectURI, nsSimpleURI) 1.22 + 1.23 +NS_INTERFACE_MAP_BEGIN(nsHostObjectURI) 1.24 + NS_INTERFACE_MAP_ENTRY(nsIURIWithPrincipal) 1.25 + if (aIID.Equals(kHOSTOBJECTURICID)) 1.26 + foundInterface = static_cast<nsIURI*>(this); 1.27 + else if (aIID.Equals(kThisSimpleURIImplementationCID)) { 1.28 + // Need to return explicitly here, because if we just set foundInterface 1.29 + // to null the NS_INTERFACE_MAP_END_INHERITING will end up calling into 1.30 + // nsSimplURI::QueryInterface and finding something for this CID. 1.31 + *aInstancePtr = nullptr; 1.32 + return NS_NOINTERFACE; 1.33 + } 1.34 + else 1.35 +NS_INTERFACE_MAP_END_INHERITING(nsSimpleURI) 1.36 + 1.37 +// nsIURIWithPrincipal methods: 1.38 + 1.39 +NS_IMETHODIMP 1.40 +nsHostObjectURI::GetPrincipal(nsIPrincipal** aPrincipal) 1.41 +{ 1.42 + NS_IF_ADDREF(*aPrincipal = mPrincipal); 1.43 + 1.44 + return NS_OK; 1.45 +} 1.46 + 1.47 +NS_IMETHODIMP 1.48 +nsHostObjectURI::GetPrincipalUri(nsIURI** aUri) 1.49 +{ 1.50 + if (mPrincipal) { 1.51 + mPrincipal->GetURI(aUri); 1.52 + } 1.53 + else { 1.54 + *aUri = nullptr; 1.55 + } 1.56 + 1.57 + return NS_OK; 1.58 +} 1.59 + 1.60 +// nsISerializable methods: 1.61 + 1.62 +NS_IMETHODIMP 1.63 +nsHostObjectURI::Read(nsIObjectInputStream* aStream) 1.64 +{ 1.65 + nsresult rv = nsSimpleURI::Read(aStream); 1.66 + NS_ENSURE_SUCCESS(rv, rv); 1.67 + 1.68 + nsCOMPtr<nsISupports> supports; 1.69 + rv = NS_ReadOptionalObject(aStream, true, getter_AddRefs(supports)); 1.70 + NS_ENSURE_SUCCESS(rv, rv); 1.71 + 1.72 + mPrincipal = do_QueryInterface(supports, &rv); 1.73 + return rv; 1.74 +} 1.75 + 1.76 +NS_IMETHODIMP 1.77 +nsHostObjectURI::Write(nsIObjectOutputStream* aStream) 1.78 +{ 1.79 + nsresult rv = nsSimpleURI::Write(aStream); 1.80 + NS_ENSURE_SUCCESS(rv, rv); 1.81 + 1.82 + return NS_WriteOptionalCompoundObject(aStream, mPrincipal, 1.83 + NS_GET_IID(nsIPrincipal), 1.84 + true); 1.85 +} 1.86 + 1.87 +// nsIURI methods: 1.88 +nsresult 1.89 +nsHostObjectURI::CloneInternal(nsSimpleURI::RefHandlingEnum aRefHandlingMode, 1.90 + nsIURI** aClone) 1.91 +{ 1.92 + nsCOMPtr<nsIURI> simpleClone; 1.93 + nsresult rv = 1.94 + nsSimpleURI::CloneInternal(aRefHandlingMode, getter_AddRefs(simpleClone)); 1.95 + NS_ENSURE_SUCCESS(rv, rv); 1.96 + 1.97 +#ifdef DEBUG 1.98 + nsRefPtr<nsHostObjectURI> uriCheck; 1.99 + rv = simpleClone->QueryInterface(kHOSTOBJECTURICID, getter_AddRefs(uriCheck)); 1.100 + NS_ABORT_IF_FALSE(NS_SUCCEEDED(rv) && uriCheck, 1.101 + "Unexpected!"); 1.102 +#endif 1.103 + 1.104 + nsHostObjectURI* u = static_cast<nsHostObjectURI*>(simpleClone.get()); 1.105 + 1.106 + u->mPrincipal = mPrincipal; 1.107 + 1.108 + simpleClone.forget(aClone); 1.109 + return NS_OK; 1.110 +} 1.111 + 1.112 +/* virtual */ nsresult 1.113 +nsHostObjectURI::EqualsInternal(nsIURI* aOther, 1.114 + nsSimpleURI::RefHandlingEnum aRefHandlingMode, 1.115 + bool* aResult) 1.116 +{ 1.117 + if (!aOther) { 1.118 + *aResult = false; 1.119 + return NS_OK; 1.120 + } 1.121 + 1.122 + nsRefPtr<nsHostObjectURI> otherUri; 1.123 + aOther->QueryInterface(kHOSTOBJECTURICID, getter_AddRefs(otherUri)); 1.124 + if (!otherUri) { 1.125 + *aResult = false; 1.126 + return NS_OK; 1.127 + } 1.128 + 1.129 + // Compare the member data that our base class knows about. 1.130 + if (!nsSimpleURI::EqualsInternal(otherUri, aRefHandlingMode)) { 1.131 + *aResult = false; 1.132 + return NS_OK; 1.133 + } 1.134 + 1.135 + // Compare the piece of additional member data that we add to base class. 1.136 + if (mPrincipal && otherUri->mPrincipal) { 1.137 + // Both of us have mPrincipals. Compare them. 1.138 + return mPrincipal->Equals(otherUri->mPrincipal, aResult); 1.139 + } 1.140 + // else, at least one of us lacks a principal; only equal if *both* lack it. 1.141 + *aResult = (!mPrincipal && !otherUri->mPrincipal); 1.142 + return NS_OK; 1.143 +} 1.144 + 1.145 +// nsIClassInfo methods: 1.146 +NS_IMETHODIMP 1.147 +nsHostObjectURI::GetInterfaces(uint32_t *count, nsIID * **array) 1.148 +{ 1.149 + *count = 0; 1.150 + *array = nullptr; 1.151 + return NS_OK; 1.152 +} 1.153 + 1.154 +NS_IMETHODIMP 1.155 +nsHostObjectURI::GetHelperForLanguage(uint32_t language, nsISupports **_retval) 1.156 +{ 1.157 + *_retval = nullptr; 1.158 + return NS_OK; 1.159 +} 1.160 + 1.161 +NS_IMETHODIMP 1.162 +nsHostObjectURI::GetContractID(char * *aContractID) 1.163 +{ 1.164 + // Make sure to modify any subclasses as needed if this ever 1.165 + // changes. 1.166 + *aContractID = nullptr; 1.167 + return NS_OK; 1.168 +} 1.169 + 1.170 +NS_IMETHODIMP 1.171 +nsHostObjectURI::GetClassDescription(char * *aClassDescription) 1.172 +{ 1.173 + *aClassDescription = nullptr; 1.174 + return NS_OK; 1.175 +} 1.176 + 1.177 +NS_IMETHODIMP 1.178 +nsHostObjectURI::GetClassID(nsCID * *aClassID) 1.179 +{ 1.180 + // Make sure to modify any subclasses as needed if this ever 1.181 + // changes to not call the virtual GetClassIDNoAlloc. 1.182 + *aClassID = (nsCID*) nsMemory::Alloc(sizeof(nsCID)); 1.183 + NS_ENSURE_TRUE(*aClassID, NS_ERROR_OUT_OF_MEMORY); 1.184 + 1.185 + return GetClassIDNoAlloc(*aClassID); 1.186 +} 1.187 + 1.188 +NS_IMETHODIMP 1.189 +nsHostObjectURI::GetImplementationLanguage(uint32_t *aImplementationLanguage) 1.190 +{ 1.191 + *aImplementationLanguage = nsIProgrammingLanguage::CPLUSPLUS; 1.192 + return NS_OK; 1.193 +} 1.194 + 1.195 +NS_IMETHODIMP 1.196 +nsHostObjectURI::GetFlags(uint32_t *aFlags) 1.197 +{ 1.198 + *aFlags = nsIClassInfo::MAIN_THREAD_ONLY; 1.199 + return NS_OK; 1.200 +} 1.201 + 1.202 +NS_IMETHODIMP 1.203 +nsHostObjectURI::GetClassIDNoAlloc(nsCID *aClassIDNoAlloc) 1.204 +{ 1.205 + *aClassIDNoAlloc = kHOSTOBJECTURICID; 1.206 + return NS_OK; 1.207 +}