forked from mirrors/gecko-dev
		
	 3ef8b55cef
			
		
	
	
		3ef8b55cef
		
	
	
	
	
		
			
			This patch adds the ServiceWorkerInfo descriptor id to the property available in the mozIExtensionServiceWorkerInfo. The descriptor ID is an integer assigned on the main process to each ServiceWorkerPrivate instance, which will allow us to verify in the main process that the worker running in the child process is part of the expected service worker registration, and it is also still available when the worker is already being destroyed, which makes it useful as the key used in the map of the extension service worker context that we keep in the child extension process. Differential Revision: https://phabricator.services.mozilla.com/D124698
		
			
				
	
	
		
			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());
 | |
|   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::HandleValue aRequestArgs,
 | |
|                                JS::HandleValue 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
 |