forked from mirrors/gecko-dev
		
	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
 |