PermissionStatusSink.h (2727B)
1 /* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ 2 /* vim: set ts=8 sts=2 et sw=2 tw=80: */ 3 /* This Source Code Form is subject to the terms of the Mozilla Public 4 * License, v. 2.0. If a copy of the MPL was not distributed with this file, 5 * You can obtain one at http://mozilla.org/MPL/2.0/. */ 6 7 #ifndef mozilla_dom_PermissionStatusSink_h 8 #define mozilla_dom_PermissionStatusSink_h 9 10 #include "mozilla/MozPromise.h" 11 #include "mozilla/Mutex.h" 12 #include "mozilla/dom/PermissionStatusBinding.h" 13 #include "mozilla/dom/PermissionsBinding.h" 14 #include "nsIPermission.h" 15 16 class nsPIDOMWindowInner; 17 18 namespace mozilla::dom { 19 20 class PermissionObserver; 21 class PermissionStatus; 22 class ThreadSafeWorkerRef; 23 24 class PermissionStatusSink { 25 public: 26 using PermissionStatePromise = MozPromise<uint32_t, nsresult, true>; 27 28 NS_INLINE_DECL_THREADSAFE_REFCOUNTING(PermissionStatusSink) 29 30 PermissionStatusSink(PermissionStatus* aPermissionStatus, 31 PermissionName aPermissionName, 32 const nsACString& aPermissionType); 33 34 RefPtr<PermissionStatePromise> Init(); 35 36 // These functions should be called when an permission is updated which may 37 // change the state of this PermissionStatus. MaybeUpdatedByOnMainThread 38 // accepts the permission object itself that is update. When the permission's 39 // key is not same-origin with this object's owner window/worker, such as for 40 // secondary-keyed permissions like `3rdPartyFrameStorage^...`, 41 // MaybeUpdatedByNotifyOnlyOnMainThread will be called with the updated 42 // window/worker as an argument. MaybeUpdatedByNotifyOnly must be defined by 43 // PermissionStatus inheritors that are double-keyed. 44 virtual bool MaybeUpdatedByOnMainThread(nsIPermission* aPermission); 45 virtual bool MaybeUpdatedByNotifyOnlyOnMainThread( 46 nsPIDOMWindowInner* aInnerWindow); 47 48 void PermissionChangedOnMainThread(); 49 50 PermissionName Name() const { return mPermissionName; } 51 52 void Disentangle(); 53 54 protected: 55 virtual ~PermissionStatusSink(); 56 57 virtual RefPtr<PermissionStatePromise> ComputeStateOnMainThread(); 58 59 RefPtr<PermissionStatePromise> ComputeStateOnMainThreadInternal( 60 nsPIDOMWindowInner* aWindow); 61 62 nsCOMPtr<nsISerialEventTarget> mSerialEventTarget; 63 nsCOMPtr<nsIPrincipal> mPrincipalForPermission; 64 65 RefPtr<PermissionObserver> mObserver; 66 67 RefPtr<PermissionStatus> mPermissionStatus; 68 69 Mutex mMutex; 70 71 // Protected by mutex. 72 // Created and released on worker-thread. Used also on main-thread. 73 RefPtr<ThreadSafeWorkerRef> mWorkerRef MOZ_GUARDED_BY(mMutex); 74 75 PermissionName mPermissionName; 76 nsCString mPermissionType; 77 }; 78 79 } // namespace mozilla::dom 80 81 #endif // mozilla_dom_permissionstatusSink_h