tor-browser

The Tor Browser
git clone https://git.dasho.dev/tor-browser.git
Log | Files | Refs | README | LICENSE

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