diff options
Diffstat (limited to 'toolkit/components/extensions/webidl-api/ExtensionAPIRequest.h')
-rw-r--r-- | toolkit/components/extensions/webidl-api/ExtensionAPIRequest.h | 121 |
1 files changed, 121 insertions, 0 deletions
diff --git a/toolkit/components/extensions/webidl-api/ExtensionAPIRequest.h b/toolkit/components/extensions/webidl-api/ExtensionAPIRequest.h new file mode 100644 index 0000000000..b34d137958 --- /dev/null +++ b/toolkit/components/extensions/webidl-api/ExtensionAPIRequest.h @@ -0,0 +1,121 @@ +/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ +/* 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/. */ + +#ifndef mozilla_extensions_ExtensionAPIRequest_h +#define mozilla_extensions_ExtensionAPIRequest_h + +#include "ExtensionEventListener.h" + +#include "mozIExtensionAPIRequestHandling.h" +#include "mozilla/HoldDropJSObjects.h" +#include "mozilla/dom/ClientInfo.h" +#include "mozilla/extensions/WebExtensionPolicy.h" +#include "nsCycleCollectionParticipant.h" + +namespace mozilla { +namespace extensions { + +class ExtensionAPIRequestForwarder; +class RequestWorkerRunnable; + +// Represent the target of the API request forwarded, mObjectType and mObjectId +// are only expected to be polulated when the API request is originated from API +// object (like an ExtensionPort returned by a call to browser.runtime.connect). +struct ExtensionAPIRequestTarget { + nsString mNamespace; + nsString mMethod; + nsString mObjectType; + nsString mObjectId; +}; + +// A class that represents the service worker that has originated the API +// request. +class ExtensionServiceWorkerInfo : public mozIExtensionServiceWorkerInfo { + public: + NS_DECL_MOZIEXTENSIONSERVICEWORKERINFO + NS_DECL_ISUPPORTS + + explicit ExtensionServiceWorkerInfo(const dom::ClientInfo& aClientInfo, + const uint64_t aDescriptorId) + : mClientInfo(aClientInfo), mDescriptorId(aDescriptorId) {} + + private: + virtual ~ExtensionServiceWorkerInfo() = default; + + dom::ClientInfo mClientInfo; + uint64_t mDescriptorId; +}; + +// A class that represents a WebExtensions API request (a method call, +// add/remote listener or accessing a property getter) forwarded by the +// WebIDL bindings to the mozIExtensionAPIRequestHandler. +class ExtensionAPIRequest : public mozIExtensionAPIRequest { + public: + using APIRequestType = mozIExtensionAPIRequest::RequestType; + + NS_DECL_CYCLE_COLLECTION_SCRIPT_HOLDER_CLASS(ExtensionAPIRequest) + NS_DECL_CYCLE_COLLECTING_ISUPPORTS + NS_DECL_MOZIEXTENSIONAPIREQUEST + + explicit ExtensionAPIRequest( + const mozIExtensionAPIRequest::RequestType aRequestType, + const ExtensionAPIRequestTarget& aRequestTarget); + + void Init(Maybe<dom::ClientInfo>& aSWClientInfo, + const uint64_t aSWDescriptorId, JS::Handle<JS::Value> aRequestArgs, + JS::Handle<JS::Value> aCallerStack); + + static bool ShouldHaveResult(const APIRequestType& aRequestType) { + switch (aRequestType) { + case APIRequestType::GET_PROPERTY: + case APIRequestType::CALL_FUNCTION: + case APIRequestType::CALL_FUNCTION_ASYNC: + return true; + case APIRequestType::CALL_FUNCTION_NO_RETURN: + case APIRequestType::ADD_LISTENER: + case APIRequestType::REMOVE_LISTENER: + break; + default: + MOZ_DIAGNOSTIC_ASSERT(false, "Unexpected APIRequestType"); + } + + return false; + } + + bool ShouldHaveResult() const { return ShouldHaveResult(mRequestType); } + + void SetEventListener(const RefPtr<ExtensionEventListener>& aListener) { + MOZ_ASSERT(!mEventListener); + mEventListener = aListener; + } + + private: + virtual ~ExtensionAPIRequest() { + mSWClientInfo = Nothing(); + mArgs.setUndefined(); + mNormalizedArgs.setUndefined(); + mStack.setUndefined(); + mEventListener = nullptr; + mozilla::DropJSObjects(this); + }; + + APIRequestType mRequestType; + ExtensionAPIRequestTarget mRequestTarget; + JS::Heap<JS::Value> mStack; + JS::Heap<JS::Value> mArgs; + JS::Heap<JS::Value> mNormalizedArgs; + Maybe<dom::ClientInfo> mSWClientInfo; + uint64_t mSWDescriptorId; + RefPtr<ExtensionServiceWorkerInfo> mSWInfo; + + // Only set for addListener/removeListener API requests. + RefPtr<ExtensionEventListener> mEventListener; +}; + +} // namespace extensions +} // namespace mozilla + +#endif // mozilla_extensions_ExtensionAPIRequest_h |