dom/audiochannel/AudioChannelService.h

Sat, 03 Jan 2015 20:18:00 +0100

author
Michael Schloh von Bennewitz <michael@schloh.com>
date
Sat, 03 Jan 2015 20:18:00 +0100
branch
TOR_BUG_3246
changeset 7
129ffea94266
permissions
-rw-r--r--

Conditionally enable double key logic according to:
private browsing mode or privacy.thirdparty.isolate preference and
implement in GetCookieStringCommon and FindCookie where it counts...
With some reservations of how to convince FindCookie users to test
condition and pass a nullptr when disabling double key logic.

     1 /* -*- Mode: c++; c-basic-offset: 2; indent-tabs-mode: nil; tab-width: 40 -*- */
     2 /* vim: set ts=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/. */
     7 #ifndef mozilla_dom_audiochannelservice_h__
     8 #define mozilla_dom_audiochannelservice_h__
    10 #include "nsAutoPtr.h"
    11 #include "nsIObserver.h"
    12 #include "nsTArray.h"
    13 #include "nsITimer.h"
    15 #include "AudioChannelCommon.h"
    16 #include "AudioChannelAgent.h"
    17 #include "nsAttrValue.h"
    18 #include "nsClassHashtable.h"
    19 #include "mozilla/dom/AudioChannelBinding.h"
    21 class nsPIDOMWindow;
    23 namespace mozilla {
    24 namespace dom {
    25 #ifdef MOZ_WIDGET_GONK
    26 class SpeakerManagerService;
    27 #endif
    28 class AudioChannelService
    29 : public nsIObserver
    30 , public nsITimerCallback
    31 {
    32 public:
    33   NS_DECL_ISUPPORTS
    34   NS_DECL_NSIOBSERVER
    35   NS_DECL_NSITIMERCALLBACK
    37   /**
    38    * Returns the AudioChannelServce singleton. Only to be called from main
    39    * thread.
    40    *
    41    * @return NS_OK on proper assignment, NS_ERROR_FAILURE otherwise.
    42    */
    43   static AudioChannelService* GetAudioChannelService();
    45   /**
    46    * Shutdown the singleton.
    47    */
    48   static void Shutdown();
    50   /**
    51    * Any audio channel agent that starts playing should register itself to
    52    * this service, sharing the AudioChannel.
    53    */
    54   virtual void RegisterAudioChannelAgent(AudioChannelAgent* aAgent,
    55                                          AudioChannel aChannel,
    56                                          bool aWithVideo);
    58   /**
    59    * Any audio channel agent that stops playing should unregister itself to
    60    * this service.
    61    */
    62   virtual void UnregisterAudioChannelAgent(AudioChannelAgent* aAgent);
    64   /**
    65    * Return the state to indicate this agent should keep playing/
    66    * fading volume/muted.
    67    */
    68   virtual AudioChannelState GetState(AudioChannelAgent* aAgent,
    69                                      bool aElementHidden);
    71   /**
    72    * Return true if there is a content channel active in this process
    73    * or one of its subprocesses.
    74    */
    75   virtual bool ContentOrNormalChannelIsActive();
    77   /**
    78    * Return true if a normal or content channel is active for the given
    79    * process ID.
    80    */
    81   virtual bool ProcessContentOrNormalChannelIsActive(uint64_t aChildID);
    83   /***
    84    * AudioChannelManager calls this function to notify the default channel used
    85    * to adjust volume when there is no any active channel. if aChannel is -1,
    86    * the default audio channel will be used. Otherwise aChannel is casted to
    87    * AudioChannel enum.
    88    */
    89   virtual void SetDefaultVolumeControlChannel(int32_t aChannel,
    90                                               bool aHidden);
    92   bool AnyAudioChannelIsActive();
    94   void RefreshAgentsVolume(nsPIDOMWindow* aWindow);
    96 #ifdef MOZ_WIDGET_GONK
    97   void RegisterSpeakerManager(SpeakerManagerService* aSpeakerManager)
    98   {
    99     if (!mSpeakerManager.Contains(aSpeakerManager)) {
   100       mSpeakerManager.AppendElement(aSpeakerManager);
   101     }
   102   }
   104   void UnregisterSpeakerManager(SpeakerManagerService* aSpeakerManager)
   105   {
   106     mSpeakerManager.RemoveElement(aSpeakerManager);
   107   }
   108 #endif
   110   static const nsAttrValue::EnumTable* GetAudioChannelTable();
   111   static AudioChannel GetAudioChannel(const nsAString& aString);
   112   static AudioChannel GetDefaultAudioChannel();
   113   static void GetAudioChannelString(AudioChannel aChannel, nsAString& aString);
   114   static void GetDefaultAudioChannelString(nsAString& aString);
   116 protected:
   117   void Notify();
   119   /**
   120    * Send the audio-channel-changed notification for the given process ID if
   121    * needed.
   122    */
   123   void SendAudioChannelChangedNotification(uint64_t aChildID);
   125   /* Register/Unregister IPC types: */
   126   void RegisterType(AudioChannel aChannel, uint64_t aChildID, bool aWithVideo);
   127   void UnregisterType(AudioChannel aChannel, bool aElementHidden,
   128                       uint64_t aChildID, bool aWithVideo);
   129   void UnregisterTypeInternal(AudioChannel aChannel, bool aElementHidden,
   130                               uint64_t aChildID, bool aWithVideo);
   132   AudioChannelState GetStateInternal(AudioChannel aChannel, uint64_t aChildID,
   133                                      bool aElementHidden,
   134                                      bool aElementWasHidden);
   136   /* Update the internal type value following the visibility changes */
   137   void UpdateChannelType(AudioChannel aChannel, uint64_t aChildID,
   138                          bool aElementHidden, bool aElementWasHidden);
   140   /* Send the default-volume-channel-changed notification */
   141   void SetDefaultVolumeControlChannelInternal(int32_t aChannel,
   142                                               bool aHidden, uint64_t aChildID);
   144   AudioChannelService();
   145   virtual ~AudioChannelService();
   147   enum AudioChannelInternalType {
   148     AUDIO_CHANNEL_INT_NORMAL = 0,
   149     AUDIO_CHANNEL_INT_NORMAL_HIDDEN,
   150     AUDIO_CHANNEL_INT_CONTENT,
   151     AUDIO_CHANNEL_INT_CONTENT_HIDDEN,
   152     AUDIO_CHANNEL_INT_NOTIFICATION,
   153     AUDIO_CHANNEL_INT_NOTIFICATION_HIDDEN,
   154     AUDIO_CHANNEL_INT_ALARM,
   155     AUDIO_CHANNEL_INT_ALARM_HIDDEN,
   156     AUDIO_CHANNEL_INT_TELEPHONY,
   157     AUDIO_CHANNEL_INT_TELEPHONY_HIDDEN,
   158     AUDIO_CHANNEL_INT_RINGER,
   159     AUDIO_CHANNEL_INT_RINGER_HIDDEN,
   160     AUDIO_CHANNEL_INT_PUBLICNOTIFICATION,
   161     AUDIO_CHANNEL_INT_PUBLICNOTIFICATION_HIDDEN,
   162     AUDIO_CHANNEL_INT_LAST
   163   };
   165   bool ChannelsActiveWithHigherPriorityThan(AudioChannelInternalType aType);
   167   bool CheckVolumeFadedCondition(AudioChannelInternalType aType,
   168                                  bool aElementHidden);
   170   AudioChannelInternalType GetInternalType(AudioChannel aChannel,
   171                                            bool aElementHidden);
   173   class AudioChannelAgentData {
   174   public:
   175     AudioChannelAgentData(AudioChannel aChannel,
   176                           bool aElementHidden,
   177                           AudioChannelState aState,
   178                           bool aWithVideo)
   179     : mChannel(aChannel)
   180     , mElementHidden(aElementHidden)
   181     , mState(aState)
   182     , mWithVideo(aWithVideo)
   183     {}
   185     AudioChannel mChannel;
   186     bool mElementHidden;
   187     AudioChannelState mState;
   188     const bool mWithVideo;
   189   };
   191   static PLDHashOperator
   192   NotifyEnumerator(AudioChannelAgent* aAgent,
   193                    AudioChannelAgentData* aData, void *aUnused);
   195   static PLDHashOperator
   196   RefreshAgentsVolumeEnumerator(AudioChannelAgent* aAgent,
   197                                 AudioChannelAgentData* aUnused,
   198                                 void *aPtr);
   200   static PLDHashOperator
   201   CountWindowEnumerator(AudioChannelAgent* aAgent,
   202                         AudioChannelAgentData* aUnused,
   203                         void *aPtr);
   205   // This returns the number of agents from this aWindow.
   206   uint32_t CountWindow(nsIDOMWindow* aWindow);
   208   nsClassHashtable< nsPtrHashKey<AudioChannelAgent>, AudioChannelAgentData > mAgents;
   209 #ifdef MOZ_WIDGET_GONK
   210   nsTArray<SpeakerManagerService*>  mSpeakerManager;
   211 #endif
   212   nsTArray<uint64_t> mChannelCounters[AUDIO_CHANNEL_INT_LAST];
   214   int32_t mCurrentHigherChannel;
   215   int32_t mCurrentVisibleHigherChannel;
   217   nsTArray<uint64_t> mWithVideoChildIDs;
   219   // mPlayableHiddenContentChildID stores the ChildID of the process which can
   220   // play content channel(s) in the background.
   221   // A background process contained content channel(s) will become playable:
   222   //   1. When this background process registers its content channel(s) in
   223   //   AudioChannelService and there is no foreground process with registered
   224   //   content channel(s).
   225   //   2. When this process goes from foreground into background and there is
   226   //   no foreground process with registered content channel(s).
   227   // A background process contained content channel(s) will become non-playable:
   228   //   1. When there is a foreground process registering its content channel(s)
   229   //   in AudioChannelService.
   230   //   ps. Currently this condition is never satisfied because the default value
   231   //   of visibility status of each channel during registering is hidden = true.
   232   //   2. When there is a process with registered content channel(s) goes from
   233   //   background into foreground.
   234   //   3. When this process unregisters all hidden content channels.
   235   //   4. When this process shuts down.
   236   uint64_t mPlayableHiddenContentChildID;
   238   bool mDisabled;
   240   nsCOMPtr<nsITimer> mDeferTelChannelTimer;
   241   bool mTimerElementHidden;
   242   uint64_t mTimerChildID;
   244   uint64_t mDefChannelChildID;
   246   // This is needed for IPC comunication between
   247   // AudioChannelServiceChild and this class.
   248   friend class ContentParent;
   249   friend class ContentChild;
   250 };
   252 } // namespace dom
   253 } // namespace mozilla
   255 #endif

mercurial