tor-browser

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

RuntimeService.h (5752B)


      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_runtimeservice_h__
      8 #define mozilla_dom_workers_runtimeservice_h__
      9 
     10 #include "MainThreadUtils.h"
     11 #include "js/ContextOptions.h"
     12 #include "mozilla/Mutex.h"
     13 #include "mozilla/StaticPtr.h"
     14 #include "mozilla/dom/BindingDeclarations.h"
     15 #include "mozilla/dom/SafeRefPtr.h"
     16 #include "mozilla/dom/WorkerCommon.h"
     17 #include "mozilla/dom/workerinternals/JSSettings.h"
     18 #include "nsClassHashtable.h"
     19 #include "nsHashKeys.h"
     20 #include "nsIObserver.h"
     21 #include "nsTArray.h"
     22 
     23 class nsPIDOMWindowInner;
     24 
     25 namespace mozilla::dom {
     26 struct WorkerLoadInfo;
     27 class WorkerThread;
     28 
     29 namespace workerinternals {
     30 
     31 class RuntimeService final : public nsIObserver {
     32  struct WorkerDomainInfo {
     33    nsCString mDomain;
     34    nsTArray<WorkerPrivate*> mActiveWorkers;
     35    nsTArray<WorkerPrivate*> mActiveServiceWorkers;
     36    nsTArray<WorkerPrivate*> mQueuedWorkers;
     37    uint32_t mChildWorkerCount;
     38 
     39    WorkerDomainInfo() : mActiveWorkers(1), mChildWorkerCount(0) {}
     40 
     41    uint32_t ActiveWorkerCount() const {
     42      return mActiveWorkers.Length() + mChildWorkerCount;
     43    }
     44 
     45    uint32_t ActiveServiceWorkerCount() const {
     46      return mActiveServiceWorkers.Length();
     47    }
     48 
     49    bool HasNoWorkers() const {
     50      return ActiveWorkerCount() == 0 && ActiveServiceWorkerCount() == 0;
     51    }
     52  };
     53 
     54  mozilla::Mutex mMutex;
     55 
     56  // Protected by mMutex.
     57  nsClassHashtable<nsCStringHashKey, WorkerDomainInfo> mDomainMap
     58      MOZ_GUARDED_BY(mMutex);
     59 
     60  // *Not* protected by mMutex.
     61  nsClassHashtable<nsPtrHashKey<const nsPIDOMWindowInner>,
     62                   nsTArray<WorkerPrivate*> >
     63      mWindowMap;
     64 
     65  static StaticAutoPtr<workerinternals::JSSettings> sDefaultJSSettings;
     66 
     67 public:
     68  struct NavigatorProperties {
     69    nsString mAppVersion;
     70    nsString mAppVersionOverridden;
     71    nsString mPlatform;
     72    nsString mPlatformOverridden;
     73    CopyableTArray<nsString> mLanguages;
     74  };
     75 
     76 private:
     77  NavigatorProperties mNavigatorProperties;
     78 
     79  // True when the observer service holds a reference to this object.
     80  bool mObserved;
     81  bool mShuttingDown;
     82  bool mNavigatorPropertiesLoaded;
     83 
     84 public:
     85  NS_DECL_ISUPPORTS
     86  NS_DECL_NSIOBSERVER
     87 
     88  static RuntimeService* GetOrCreateService();
     89 
     90  static RuntimeService* GetService();
     91 
     92  bool RegisterWorker(WorkerPrivate& aWorkerPrivate);
     93 
     94  void UnregisterWorker(WorkerPrivate& aWorkerPrivate);
     95 
     96  void CancelWorkersForWindow(const nsPIDOMWindowInner& aWindow);
     97 
     98  void UpdateWorkersBackgroundState(const nsPIDOMWindowInner& aWindow,
     99                                    bool aIsBackground);
    100 
    101  void UpdateWorkersPeerConnections(const nsPIDOMWindowInner& aWindow,
    102                                    bool aHasPeerConnections);
    103 
    104  void FreezeWorkersForWindow(const nsPIDOMWindowInner& aWindow);
    105 
    106  void ThawWorkersForWindow(const nsPIDOMWindowInner& aWindow);
    107 
    108  void SuspendWorkersForWindow(const nsPIDOMWindowInner& aWindow);
    109 
    110  void ResumeWorkersForWindow(const nsPIDOMWindowInner& aWindow);
    111 
    112  void PropagateStorageAccessPermissionGranted(
    113      const nsPIDOMWindowInner& aWindow);
    114 
    115  const NavigatorProperties& GetNavigatorProperties() const {
    116    return mNavigatorProperties;
    117  }
    118 
    119  static void GetDefaultJSSettings(workerinternals::JSSettings& aSettings) {
    120    AssertIsOnMainThread();
    121    aSettings = *sDefaultJSSettings;
    122  }
    123 
    124  static void SetDefaultContextOptions(
    125      const JS::ContextOptions& aContextOptions) {
    126    AssertIsOnMainThread();
    127    sDefaultJSSettings->contextOptions = aContextOptions;
    128  }
    129 
    130  void UpdateAppVersionOverridePreference(const nsAString& aValue);
    131 
    132  void UpdatePlatformOverridePreference(const nsAString& aValue);
    133 
    134  void UpdateAllWorkerContextOptions();
    135 
    136  void UpdateAllWorkerLanguages(const nsTArray<nsString>& aLanguages);
    137 
    138  static void SetDefaultJSGCSettings(JSGCParamKey aKey,
    139                                     Maybe<uint32_t> aValue) {
    140    AssertIsOnMainThread();
    141    sDefaultJSSettings->ApplyGCSetting(aKey, aValue);
    142  }
    143 
    144  void UpdateAllWorkerMemoryParameter(JSGCParamKey aKey,
    145                                      Maybe<uint32_t> aValue);
    146 
    147 #ifdef JS_GC_ZEAL
    148  static void SetDefaultGCZeal(uint8_t aGCZeal, uint32_t aFrequency) {
    149    AssertIsOnMainThread();
    150    sDefaultJSSettings->gcZeal = aGCZeal;
    151    sDefaultJSSettings->gcZealFrequency = aFrequency;
    152  }
    153 
    154  void UpdateAllWorkerGCZeal();
    155 #endif
    156 
    157  void SetLowMemoryStateAllWorkers(bool aState);
    158 
    159  void GarbageCollectAllWorkers(bool aShrinking);
    160 
    161  void CycleCollectAllWorkers();
    162 
    163  void SendOfflineStatusChangeEventToAllWorkers(bool aIsOffline);
    164 
    165  void MemoryPressureAllWorkers();
    166 
    167  uint32_t ClampedHardwareConcurrency(bool aRFPHardcoded,
    168                                      bool aRFPTiered) const;
    169 
    170  void CrashIfHanging();
    171 
    172  bool IsShuttingDown() const { return mShuttingDown; }
    173 
    174  void DumpRunningWorkers();
    175 
    176  void UpdateWorkersPlaybackState(const nsPIDOMWindowInner& aWindow,
    177                                  bool aIsPlayingAudio);
    178 
    179 private:
    180  RuntimeService();
    181  ~RuntimeService();
    182 
    183  nsresult Init();
    184 
    185  void Shutdown();
    186 
    187  void Cleanup();
    188 
    189  void AddAllTopLevelWorkersToArray(nsTArray<WorkerPrivate*>& aWorkers)
    190      MOZ_REQUIRES(mMutex);
    191 
    192  nsTArray<WorkerPrivate*> GetWorkersForWindow(
    193      const nsPIDOMWindowInner& aWindow) const;
    194 
    195  bool ScheduleWorker(WorkerPrivate& aWorkerPrivate);
    196 
    197  template <typename Func>
    198  void BroadcastAllWorkers(const Func& aFunc);
    199 };
    200 
    201 }  // namespace workerinternals
    202 }  // namespace mozilla::dom
    203 
    204 #endif /* mozilla_dom_workers_runtimeservice_h__ */