forked from mirrors/gecko-dev
		
	
		
			
				
	
	
		
			121 lines
		
	
	
	
		
			3.9 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
			
		
		
	
	
			121 lines
		
	
	
	
		
			3.9 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
| /* -*- 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
 | 
