WorkerDebuggerManager.h (3366B)
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 5 * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ 6 7 #ifndef mozilla_dom_workers_workerdebuggermanager_h 8 #define mozilla_dom_workers_workerdebuggermanager_h 9 10 #include "MainThreadUtils.h" 11 #include "mozilla/AlreadyAddRefed.h" 12 #include "mozilla/Mutex.h" 13 #include "nsCOMPtr.h" 14 #include "nsDebug.h" 15 #include "nsIObserver.h" 16 #include "nsISupports.h" 17 #include "nsIWorkerDebugger.h" 18 #include "nsIWorkerDebuggerManager.h" 19 #include "nsTArray.h" 20 #include "nsXULAppAPI.h" 21 22 #define WORKERDEBUGGERMANAGER_CID \ 23 {0x62ec8731, 0x55ad, 0x4246, {0xb2, 0xea, 0xf2, 0x6c, 0x1f, 0xe1, 0x9d, 0x2d}} 24 #define WORKERDEBUGGERMANAGER_CONTRACTID \ 25 "@mozilla.org/dom/workers/workerdebuggermanager;1" 26 27 namespace mozilla::dom { 28 29 class WorkerDebugger; 30 class WorkerPrivate; 31 32 class WorkerDebuggerManager final : public nsIObserver, 33 public nsIWorkerDebuggerManager { 34 Mutex mMutex MOZ_UNANNOTATED; 35 36 // Protected by mMutex. 37 nsTArray<nsCOMPtr<nsIWorkerDebuggerManagerListener>> mListeners; 38 39 // Only touched on the main thread. 40 nsTArray<nsCOMPtr<nsIWorkerDebugger>> mDebuggers; 41 42 public: 43 static already_AddRefed<WorkerDebuggerManager> GetInstance(); 44 45 static WorkerDebuggerManager* GetOrCreate(); 46 47 static WorkerDebuggerManager* Get(); 48 49 WorkerDebuggerManager(); 50 51 NS_DECL_ISUPPORTS 52 NS_DECL_NSIOBSERVER 53 NS_DECL_NSIWORKERDEBUGGERMANAGER 54 55 nsresult Init(); 56 57 void Shutdown(); 58 59 void RegisterDebugger(WorkerPrivate* aWorkerPrivate); 60 61 void RegisterDebuggerMainThread(WorkerPrivate* aWorkerPrivate, 62 bool aNotifyListeners); 63 64 void RegisterDebugger(nsIWorkerDebugger* aRemoteWorkerDebugger); 65 66 void UnregisterDebugger(WorkerPrivate* aWorkerPrivate); 67 68 void UnregisterDebuggerMainThread(WorkerPrivate* aWorkerPrivate); 69 70 void UnregisterDebugger(nsIWorkerDebugger* aRemoteWorkerDebugger); 71 72 uint32_t GetDebuggersLength() const; 73 74 nsIWorkerDebugger* GetDebuggerAt(uint32_t aIndex) const; 75 76 nsCOMPtr<nsIWorkerDebugger> GetDebuggerById(const nsString& aWorkerId); 77 78 private: 79 nsTArray<nsCOMPtr<nsIWorkerDebuggerManagerListener>> CloneListeners(); 80 81 virtual ~WorkerDebuggerManager(); 82 }; 83 84 inline nsresult RegisterWorkerDebugger(WorkerPrivate* aWorkerPrivate) { 85 WorkerDebuggerManager* manager; 86 87 if (NS_IsMainThread()) { 88 manager = WorkerDebuggerManager::GetOrCreate(); 89 if (!manager) { 90 NS_WARNING("Failed to create worker debugger manager!"); 91 return NS_ERROR_FAILURE; 92 } 93 } else { 94 manager = WorkerDebuggerManager::Get(); 95 } 96 97 manager->RegisterDebugger(aWorkerPrivate); 98 return NS_OK; 99 } 100 101 inline nsresult UnregisterWorkerDebugger(WorkerPrivate* aWorkerPrivate) { 102 WorkerDebuggerManager* manager; 103 104 if (NS_IsMainThread()) { 105 manager = WorkerDebuggerManager::GetOrCreate(); 106 if (!manager) { 107 NS_WARNING("Failed to create worker debugger manager!"); 108 return NS_ERROR_FAILURE; 109 } 110 } else { 111 manager = WorkerDebuggerManager::Get(); 112 } 113 114 manager->UnregisterDebugger(aWorkerPrivate); 115 return NS_OK; 116 } 117 118 } // namespace mozilla::dom 119 120 #endif // mozilla_dom_workers_workerdebuggermanager_h