forked from mirrors/gecko-dev
		
	 da45a5a7c1
			
		
	
	
		da45a5a7c1
		
	
	
	
	
		
			
			And use nsID::ToProvidedString(...) method when suitable. This naturally fixes a memory leak in dom/fetch/FetchParent.cpp. Differential Revision: https://phabricator.services.mozilla.com/D167606
		
			
				
	
	
		
			242 lines
		
	
	
	
		
			7.4 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
			
		
		
	
	
			242 lines
		
	
	
	
		
			7.4 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
| /* vim: set ts=8 sts=2 et sw=2 tw=80: */
 | |
| /* This Source Code Form is subject to the terms of the Mozilla Public
 | |
|  * License, v. 2.0. If a copy of the MPL was not distributed with this
 | |
|  * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
 | |
| 
 | |
| #include "ExtensionAPIRequest.h"
 | |
| 
 | |
| #include "mozilla/dom/ClientInfo.h"
 | |
| #include "mozilla/extensions/WebExtensionPolicy.h"
 | |
| #include "mozilla/ipc/BackgroundUtils.h"  // PrincipalInfoToPrincipal
 | |
| 
 | |
| namespace mozilla {
 | |
| namespace extensions {
 | |
| 
 | |
| // mozIExtensionServiceWorkerInfo
 | |
| 
 | |
| NS_IMPL_ISUPPORTS(ExtensionServiceWorkerInfo, mozIExtensionServiceWorkerInfo)
 | |
| 
 | |
| NS_IMETHODIMP
 | |
| ExtensionServiceWorkerInfo::GetPrincipal(nsIPrincipal** aPrincipal) {
 | |
|   MOZ_ASSERT(NS_IsMainThread());
 | |
|   NS_ENSURE_ARG_POINTER(aPrincipal);
 | |
|   auto principalOrErr = PrincipalInfoToPrincipal(mClientInfo.PrincipalInfo());
 | |
|   if (NS_WARN_IF(principalOrErr.isErr())) {
 | |
|     return NS_ERROR_UNEXPECTED;
 | |
|   }
 | |
|   nsCOMPtr<nsIPrincipal> principal = principalOrErr.unwrap();
 | |
|   principal.forget(aPrincipal);
 | |
|   return NS_OK;
 | |
| }
 | |
| 
 | |
| NS_IMETHODIMP
 | |
| ExtensionServiceWorkerInfo::GetScriptURL(nsAString& aScriptURL) {
 | |
|   MOZ_ASSERT(NS_IsMainThread());
 | |
|   aScriptURL = NS_ConvertUTF8toUTF16(mClientInfo.URL());
 | |
|   return NS_OK;
 | |
| }
 | |
| 
 | |
| NS_IMETHODIMP
 | |
| ExtensionServiceWorkerInfo::GetClientInfoId(nsAString& aClientInfoId) {
 | |
|   MOZ_ASSERT(NS_IsMainThread());
 | |
|   aClientInfoId = NS_ConvertUTF8toUTF16(mClientInfo.Id().ToString().get());
 | |
|   return NS_OK;
 | |
| }
 | |
| 
 | |
| NS_IMETHODIMP
 | |
| ExtensionServiceWorkerInfo::GetDescriptorId(uint64_t* aDescriptorId) {
 | |
|   MOZ_ASSERT(NS_IsMainThread());
 | |
|   *aDescriptorId = mDescriptorId;
 | |
|   return NS_OK;
 | |
| }
 | |
| 
 | |
| // mozIExtensionAPIRequest
 | |
| 
 | |
| NS_INTERFACE_MAP_BEGIN_CYCLE_COLLECTION(ExtensionAPIRequest)
 | |
|   NS_INTERFACE_MAP_ENTRY(mozIExtensionAPIRequest)
 | |
|   NS_INTERFACE_MAP_ENTRY(nsISupports)
 | |
| NS_INTERFACE_MAP_END
 | |
| 
 | |
| NS_IMPL_CYCLE_COLLECTION_CLASS(ExtensionAPIRequest)
 | |
| 
 | |
| NS_IMPL_CYCLE_COLLECTING_ADDREF(ExtensionAPIRequest)
 | |
| NS_IMPL_CYCLE_COLLECTING_RELEASE(ExtensionAPIRequest)
 | |
| 
 | |
| NS_IMPL_CYCLE_COLLECTION_TRAVERSE_BEGIN(ExtensionAPIRequest)
 | |
|   NS_IMPL_CYCLE_COLLECTION_TRAVERSE(mEventListener)
 | |
|   NS_IMPL_CYCLE_COLLECTION_TRAVERSE(mSWInfo)
 | |
| NS_IMPL_CYCLE_COLLECTION_TRAVERSE_END
 | |
| 
 | |
| NS_IMPL_CYCLE_COLLECTION_TRACE_BEGIN(ExtensionAPIRequest)
 | |
|   NS_IMPL_CYCLE_COLLECTION_TRACE_JS_MEMBER_CALLBACK(mArgs)
 | |
|   NS_IMPL_CYCLE_COLLECTION_TRACE_JS_MEMBER_CALLBACK(mNormalizedArgs)
 | |
|   NS_IMPL_CYCLE_COLLECTION_TRACE_JS_MEMBER_CALLBACK(mStack)
 | |
| NS_IMPL_CYCLE_COLLECTION_TRACE_END
 | |
| 
 | |
| NS_IMPL_CYCLE_COLLECTION_UNLINK_BEGIN(ExtensionAPIRequest)
 | |
|   NS_IMPL_CYCLE_COLLECTION_UNLINK(mEventListener)
 | |
|   NS_IMPL_CYCLE_COLLECTION_UNLINK(mSWInfo)
 | |
|   tmp->mStack.setUndefined();
 | |
|   tmp->mArgs.setUndefined();
 | |
|   tmp->mNormalizedArgs.setUndefined();
 | |
| NS_IMPL_CYCLE_COLLECTION_UNLINK_END
 | |
| 
 | |
| ExtensionAPIRequest::ExtensionAPIRequest(
 | |
|     const mozIExtensionAPIRequest::RequestType aRequestType,
 | |
|     const ExtensionAPIRequestTarget& aRequestTarget) {
 | |
|   MOZ_ASSERT(NS_IsMainThread());
 | |
|   mRequestType = aRequestType;
 | |
|   mRequestTarget = aRequestTarget;
 | |
|   mozilla::HoldJSObjects(this);
 | |
| }
 | |
| 
 | |
| void ExtensionAPIRequest::Init(Maybe<dom::ClientInfo>& aSWClientInfo,
 | |
|                                const uint64_t aSWDescriptorId,
 | |
|                                JS::Handle<JS::Value> aRequestArgs,
 | |
|                                JS::Handle<JS::Value> aCallerStack) {
 | |
|   MOZ_ASSERT(NS_IsMainThread());
 | |
|   mSWClientInfo = aSWClientInfo;
 | |
|   mSWDescriptorId = aSWDescriptorId;
 | |
|   mArgs.set(aRequestArgs);
 | |
|   mStack.set(aCallerStack);
 | |
|   mNormalizedArgs.setUndefined();
 | |
| }
 | |
| 
 | |
| NS_IMETHODIMP
 | |
| ExtensionAPIRequest::ToString(nsACString& aResult) {
 | |
|   aResult.Truncate();
 | |
| 
 | |
|   nsAutoCString requestType;
 | |
|   nsAutoCString apiNamespace;
 | |
|   nsAutoCString apiName;
 | |
|   GetRequestType(requestType);
 | |
|   GetApiNamespace(apiNamespace);
 | |
|   GetApiName(apiName);
 | |
| 
 | |
|   if (mRequestTarget.mObjectType.IsEmpty()) {
 | |
|     aResult.AppendPrintf("[ExtensionAPIRequest %s %s.%s]", requestType.get(),
 | |
|                          apiNamespace.get(), apiName.get());
 | |
|   } else {
 | |
|     nsAutoCString objectType;
 | |
|     nsAutoCString objectId;
 | |
|     GetApiObjectType(objectType);
 | |
|     GetApiObjectId(objectId);
 | |
| 
 | |
|     aResult.AppendPrintf("[ExtensionAPIRequest %s %s.%s.%s (%s)]",
 | |
|                          requestType.get(), apiNamespace.get(),
 | |
|                          objectType.get(), apiName.get(), objectId.get());
 | |
|   }
 | |
| 
 | |
|   return NS_OK;
 | |
| }
 | |
| 
 | |
| NS_IMETHODIMP
 | |
| ExtensionAPIRequest::GetRequestType(nsACString& aRequestTypeName) {
 | |
|   MOZ_ASSERT(NS_IsMainThread());
 | |
|   switch (mRequestType) {
 | |
|     case mozIExtensionAPIRequest::RequestType::CALL_FUNCTION:
 | |
|       aRequestTypeName = "callFunction"_ns;
 | |
|       break;
 | |
|     case mozIExtensionAPIRequest::RequestType::CALL_FUNCTION_NO_RETURN:
 | |
|       aRequestTypeName = "callFunctionNoReturn"_ns;
 | |
|       break;
 | |
|     case mozIExtensionAPIRequest::RequestType::CALL_FUNCTION_ASYNC:
 | |
|       aRequestTypeName = "callAsyncFunction"_ns;
 | |
|       break;
 | |
|     case mozIExtensionAPIRequest::RequestType::ADD_LISTENER:
 | |
|       aRequestTypeName = "addListener"_ns;
 | |
|       break;
 | |
|     case mozIExtensionAPIRequest::RequestType::REMOVE_LISTENER:
 | |
|       aRequestTypeName = "removeListener"_ns;
 | |
|       break;
 | |
|     case mozIExtensionAPIRequest::RequestType::GET_PROPERTY:
 | |
|       aRequestTypeName = "getProperty"_ns;
 | |
|       break;
 | |
|     default:
 | |
|       return NS_ERROR_UNEXPECTED;
 | |
|   }
 | |
|   return NS_OK;
 | |
| }
 | |
| 
 | |
| NS_IMETHODIMP
 | |
| ExtensionAPIRequest::GetApiNamespace(nsACString& aApiNamespace) {
 | |
|   MOZ_ASSERT(NS_IsMainThread());
 | |
|   aApiNamespace.Assign(NS_ConvertUTF16toUTF8(mRequestTarget.mNamespace));
 | |
|   return NS_OK;
 | |
| }
 | |
| 
 | |
| NS_IMETHODIMP
 | |
| ExtensionAPIRequest::GetApiName(nsACString& aApiName) {
 | |
|   MOZ_ASSERT(NS_IsMainThread());
 | |
|   aApiName.Assign(NS_ConvertUTF16toUTF8(mRequestTarget.mMethod));
 | |
|   return NS_OK;
 | |
| }
 | |
| 
 | |
| NS_IMETHODIMP
 | |
| ExtensionAPIRequest::GetApiObjectType(nsACString& aApiObjectType) {
 | |
|   MOZ_ASSERT(NS_IsMainThread());
 | |
|   aApiObjectType.Assign(NS_ConvertUTF16toUTF8(mRequestTarget.mObjectType));
 | |
|   return NS_OK;
 | |
| }
 | |
| 
 | |
| NS_IMETHODIMP
 | |
| ExtensionAPIRequest::GetApiObjectId(nsACString& aApiObjectId) {
 | |
|   MOZ_ASSERT(NS_IsMainThread());
 | |
|   aApiObjectId.Assign(NS_ConvertUTF16toUTF8(mRequestTarget.mObjectId));
 | |
|   return NS_OK;
 | |
| }
 | |
| 
 | |
| NS_IMETHODIMP
 | |
| ExtensionAPIRequest::GetArgs(JSContext* aCx,
 | |
|                              JS::MutableHandle<JS::Value> aRetval) {
 | |
|   MOZ_ASSERT(NS_IsMainThread());
 | |
|   aRetval.set(mArgs);
 | |
|   return NS_OK;
 | |
| }
 | |
| 
 | |
| NS_IMETHODIMP
 | |
| ExtensionAPIRequest::GetNormalizedArgs(JSContext* aCx,
 | |
|                                        JS::MutableHandle<JS::Value> aRetval) {
 | |
|   MOZ_ASSERT(NS_IsMainThread());
 | |
|   aRetval.set(mNormalizedArgs);
 | |
|   return NS_OK;
 | |
| }
 | |
| 
 | |
| NS_IMETHODIMP
 | |
| ExtensionAPIRequest::SetNormalizedArgs(JSContext* aCx,
 | |
|                                        JS::Handle<JS::Value> aNormalizedArgs) {
 | |
|   MOZ_ASSERT(NS_IsMainThread());
 | |
|   mNormalizedArgs.set(aNormalizedArgs);
 | |
|   return NS_OK;
 | |
| }
 | |
| 
 | |
| NS_IMETHODIMP
 | |
| ExtensionAPIRequest::GetCallerSavedFrame(
 | |
|     JSContext* aCx, JS::MutableHandle<JS::Value> aSavedFrame) {
 | |
|   MOZ_ASSERT(NS_IsMainThread());
 | |
|   aSavedFrame.set(mStack);
 | |
|   return NS_OK;
 | |
| }
 | |
| 
 | |
| NS_IMETHODIMP
 | |
| ExtensionAPIRequest::GetServiceWorkerInfo(
 | |
|     mozIExtensionServiceWorkerInfo** aSWInfo) {
 | |
|   MOZ_ASSERT(NS_IsMainThread());
 | |
|   NS_ENSURE_ARG_POINTER(aSWInfo);
 | |
|   if (mSWClientInfo.isSome() && !mSWInfo) {
 | |
|     mSWInfo = new ExtensionServiceWorkerInfo(*mSWClientInfo, mSWDescriptorId);
 | |
|   }
 | |
|   NS_IF_ADDREF(*aSWInfo = mSWInfo);
 | |
|   return NS_OK;
 | |
| }
 | |
| 
 | |
| NS_IMETHODIMP
 | |
| ExtensionAPIRequest::GetEventListener(mozIExtensionEventListener** aListener) {
 | |
|   MOZ_ASSERT(NS_IsMainThread());
 | |
|   NS_ENSURE_ARG_POINTER(aListener);
 | |
|   NS_IF_ADDREF(*aListener = mEventListener);
 | |
|   return NS_OK;
 | |
| }
 | |
| 
 | |
| }  // namespace extensions
 | |
| }  // namespace mozilla
 |