fune/toolkit/components/extensions/webidl-api/ExtensionAPIRequest.cpp
Luca Greco 3ef8b55cef Bug 1728326 - Add ServiceWorkerInfo descriptor id to mozIExtensionServiceWorkerInfo. r=baku
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
2021-11-05 21:27:02 +00:00

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