summaryrefslogtreecommitdiffstats
path: root/toolkit/components/extensions/webidl-api/ExtensionAPIRequest.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'toolkit/components/extensions/webidl-api/ExtensionAPIRequest.cpp')
-rw-r--r--toolkit/components/extensions/webidl-api/ExtensionAPIRequest.cpp242
1 files changed, 242 insertions, 0 deletions
diff --git a/toolkit/components/extensions/webidl-api/ExtensionAPIRequest.cpp b/toolkit/components/extensions/webidl-api/ExtensionAPIRequest.cpp
new file mode 100644
index 0000000000..e5dd443695
--- /dev/null
+++ b/toolkit/components/extensions/webidl-api/ExtensionAPIRequest.cpp
@@ -0,0 +1,242 @@
+/* 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