mirror of
https://github.com/roytam1/palemoon27.git
synced 2026-05-26 14:18:48 +00:00
c4d71010c8
- Bug 1200445 - Expose android native apps trough the navigator.mozApps api r=snorp,ferjm (5f2e5df93a)
- Bug 1199844 - limit webapp debug logging to webapp tests; r=fabrice (59bf73deb2)
- Bug 1199295 - Pass right loadingPrincipal to uriloader/prefetch - dom/apps (r=fabrice) (8bdab29703)
- Bug 1213170 - followup r=bustage on a CLOSED TREE (9ac5f0a677)
- Bug 1194243 - Keep the message manager alive in doUninstall() to be able to signal the result back; r=myk (3093189372)
- Bug 1154864 - Fix getScopeByLocalId use in PushService.jsm r=nsm (0f67e9de60)
- Bug 1196963 - Make extensions work without being in developer mode r=jduell (e120108628)
- Bug 1200851 - DataStoreService should update its permission map when the homescreen changes, r=fabrice (1582ac0320)
- Bug 1200851 - DataStoreService should update its permission map when the homescreen changes, r=fabrice (7949555b43)
- Bug 1186805 - Replace nsBaseHashtable::EnumerateRead() calls in dom/datastore/ with iterators, r=njn (0c6f234576)
- Bug 1208355 - Fix -Wshadow warnings in dom/datastore. r=baku (8b617685d4)
- Bug 1214092 - Part 1 of 1: Exposed WebSpeech API SpeechRecognition Interface to privileged apps. r=smaug (e33c92d4e8)
- Bug 1218337 - Part 1 of 1: Introduced permission 'speech-recognition' and used it in place of the app-check. r=smaug (1cdf67a55f)
- Bug 1051604 - Adapt VAD strategy on SpeechRecognition to be less strict on some devices with poor mics. r=smaug (911258b56e)
- Bug 1111135 - Part 1: Add audio-capture:3gpp perimission. r=fabrice (c98bee92a6)
- bit of 1196988 (a334242521)
- Bug 1193183 - Correctly implement SpeechRecognitionAlternative::confidence using ps_get_prob(). r=anatal (14a881b44f)
- Bug 1197455 - Call ps_set_search() only after successful grammar compilation. r=anatal (55d37ea0fb)
- Bug 1156560 - Prefer old CDMs on update if they are in use - r=cpearce (b763f1044a)
- Bug 1228215 - Add helper to do dir enumeration in GMPServiceParent. r=jwwang (1d3bc1eef0)
- Bug 1228215 - Store each GMP's storage and nodeId salt in separate directories. r=jwwang (20fb2b7a18)
- Bug 1172396 - Update GMP trial creation pref from chrome process - r=cpearce (123d97d03a)
- Bug 1228215 - Add a 'gmpName' parameter to GMPService::GetNodeId(), so each GMP can see a different nodeId for the same origin. r=jwwang (fceaef0c11)
- fixes for no EME (b70879a799)
- Bug 1228215 - Migrate existing GMP storage from post-42 pre-45 location to 45 location. r=jwwang (9da581744d)
- missing crash stuff (b537d416b3)
- Bug 1187193 - Use UserData() instead of Data() in ConstIter loops that used to be EnumerateRead's. r=njn (2a4c297f36)
- Bug 1211337 - Added crash report annotations tracking sync shutdown (60b3004394)
- Bug 1173195 - Don't assert success until successful in GMPSharedMemManager. r=edwin (3844ba6e20)
- Bug 1208289 - Log outstanding frames in GMP DrainComplete() and detect dropped ResetComplete. r=jwwang (eccf4dbecc)
- Bug 1224442: null-check GMP Parent Shmem messages from the Child to handle messages after shutdown r=cpearce (d12b9c57c2)
- add some defines (3c4fc2d5b9)
- Bug 1220929 - RemotePageManager should let us get all ports for a browser. r=Mossop (402fc2a536)
- Bug 1220929 - RemotePageManager should use documentURI and allow special URLs with query params. r=Mossop (9fc73b228e)
- Bug 1144422 - fix lightweight theme code to deal with invalid CSS so we don't mistakenly keep text colors, r=jaws (8b47394d6c)
- Bug 1229519: Fix download managers to pass eslint checks. r=mak (e4a684db58)
- Bug 1180113 - Introducing g2p algorithm inside pocketsphinx to allow out of dictionary words to be added to grammars. r=smaug (b3a23daf56)
- Bug 1202989 - Added check for 0 length phones string in addition to NULL. r=andrenatal (387faeb88c)
- Bug 1171082 - Now _WIN32_WINNT is defined to 0x0400 only if it is not defined, 0x0400 is the minimal version. Also modified update.sh to do this. r=smaug (bb7dd37c00)
- bits of Bug 1165518 - Part 2: Replace prlog.h with Logging.h. (fc0ca3ca20)
- Bug 1188970: Fix usage of forward slash in constructing webrtc trace file path. r=rjesup (8518b84be1)
- Bug 1225682 - Don't use nsAuto{,C}String as class member variables in docshell/. r=bz (839a57580e)
- Bug 1220916 - Remove "WARNING: TimelineConsumers could not be initialized" when running gtests, r=fitzgen (c89330afcc)
- Bug 1217836 - Add a readme file to our timeline backend, r=jsantell (df0ea6b198)
- enable shadow (dcad5bdb7a)
298 lines
9.2 KiB
C++
298 lines
9.2 KiB
C++
/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
|
|
/* vim: set ts=8 sts=2 et sw=2 tw=80: */
|
|
/* This Source Code Form is subject to the terms of the Mozilla Public
|
|
* License, v. 2.0. If a copy of the MPL was not distributed with this
|
|
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
|
|
|
|
#include "TimelineConsumers.h"
|
|
|
|
#include "mozilla/ClearOnShutdown.h"
|
|
#include "nsAppRunner.h" // for XRE_IsContentProcess, XRE_IsParentProcess
|
|
#include "nsDocShell.h"
|
|
|
|
namespace mozilla {
|
|
|
|
NS_IMPL_ISUPPORTS(TimelineConsumers, nsIObserver);
|
|
|
|
StaticMutex TimelineConsumers::sMutex;
|
|
|
|
// Manually manage this singleton's lifetime and destroy it before shutdown.
|
|
// This avoids the leakchecker detecting false-positive memory leaks when
|
|
// using automatic memory management (i.e. statically instantiating this
|
|
// singleton inside the `Get` method), which would automatically destroy it on
|
|
// application shutdown, but too late for the leakchecker. Sigh...
|
|
StaticRefPtr<TimelineConsumers> TimelineConsumers::sInstance;
|
|
|
|
// This flag makes sure the singleton never gets instantiated while a shutdown
|
|
// is in progress. This can actually happen, and `ClearOnShutdown` doesn't work
|
|
// in these cases.
|
|
bool TimelineConsumers::sInShutdown = false;
|
|
|
|
already_AddRefed<TimelineConsumers>
|
|
TimelineConsumers::Get()
|
|
{
|
|
// Using this class is not supported yet for other processes other than
|
|
// parent or content. To avoid accidental checks to methods like `IsEmpty`,
|
|
// which would probably always be true in those cases, assert here.
|
|
// Remember, there will be different singletons available to each process.
|
|
MOZ_ASSERT(XRE_IsContentProcess() || XRE_IsParentProcess());
|
|
|
|
// If we are shutting down, don't bother doing anything. Note: we can only
|
|
// know whether or not we're in shutdown if we're instantiated.
|
|
if (sInShutdown) {
|
|
return nullptr;
|
|
}
|
|
|
|
// Note: We don't simply check `sInstance` for null-ness here, since otherwise
|
|
// this can resurrect the TimelineConsumers pretty late during shutdown.
|
|
// We won't know if we're in shutdown or not though, because the singleton
|
|
// could have been destroyed or just never instantiated, so in the previous
|
|
// conditional `sInShutdown` would be false.
|
|
static bool firstTime = true;
|
|
if (firstTime) {
|
|
firstTime = false;
|
|
|
|
StaticMutexAutoLock lock(sMutex);
|
|
sInstance = new TimelineConsumers();
|
|
|
|
// Make sure the initialization actually suceeds, otherwise don't allow
|
|
// access by destroying the instance immediately.
|
|
if (sInstance->Init()) {
|
|
ClearOnShutdown(&sInstance);
|
|
} else {
|
|
sInstance->RemoveObservers();
|
|
sInstance = nullptr;
|
|
}
|
|
}
|
|
|
|
RefPtr<TimelineConsumers> copy = sInstance.get();
|
|
return copy.forget();
|
|
}
|
|
|
|
bool
|
|
TimelineConsumers::Init()
|
|
{
|
|
nsCOMPtr<nsIObserverService> obs = services::GetObserverService();
|
|
if (!obs) {
|
|
return false;
|
|
}
|
|
if (NS_WARN_IF(NS_FAILED(
|
|
obs->AddObserver(this, NS_XPCOM_SHUTDOWN_OBSERVER_ID, false)))) {
|
|
return false;
|
|
}
|
|
return true;
|
|
}
|
|
|
|
bool
|
|
TimelineConsumers::RemoveObservers()
|
|
{
|
|
nsCOMPtr<nsIObserverService> obs = services::GetObserverService();
|
|
if (!obs) {
|
|
return false;
|
|
}
|
|
if (NS_WARN_IF(NS_FAILED(
|
|
obs->RemoveObserver(this, NS_XPCOM_SHUTDOWN_OBSERVER_ID)))) {
|
|
return false;
|
|
}
|
|
return true;
|
|
}
|
|
|
|
nsresult
|
|
TimelineConsumers::Observe(nsISupports* aSubject,
|
|
const char* aTopic,
|
|
const char16_t* aData)
|
|
{
|
|
if (!nsCRT::strcmp(aTopic, NS_XPCOM_SHUTDOWN_OBSERVER_ID)) {
|
|
sInShutdown = true;
|
|
RemoveObservers();
|
|
return NS_OK;
|
|
}
|
|
|
|
MOZ_ASSERT(false, "TimelineConsumers got unexpected topic!");
|
|
return NS_ERROR_UNEXPECTED;
|
|
}
|
|
|
|
TimelineConsumers::TimelineConsumers()
|
|
: mActiveConsumers(0)
|
|
{
|
|
}
|
|
|
|
void
|
|
TimelineConsumers::AddConsumer(nsDocShell* aDocShell)
|
|
{
|
|
MOZ_ASSERT(NS_IsMainThread());
|
|
StaticMutexAutoLock lock(sMutex); // for `mActiveConsumers` and `mMarkersStores`.
|
|
|
|
UniquePtr<ObservedDocShell>& observed = aDocShell->mObserved;
|
|
MOZ_ASSERT(!observed);
|
|
|
|
mActiveConsumers++;
|
|
|
|
ObservedDocShell* obsDocShell = new ObservedDocShell(aDocShell);
|
|
MarkersStorage* storage = static_cast<MarkersStorage*>(obsDocShell);
|
|
|
|
observed.reset(obsDocShell);
|
|
mMarkersStores.insertFront(storage);
|
|
}
|
|
|
|
void
|
|
TimelineConsumers::RemoveConsumer(nsDocShell* aDocShell)
|
|
{
|
|
MOZ_ASSERT(NS_IsMainThread());
|
|
StaticMutexAutoLock lock(sMutex); // for `mActiveConsumers` and `mMarkersStores`.
|
|
|
|
UniquePtr<ObservedDocShell>& observed = aDocShell->mObserved;
|
|
MOZ_ASSERT(observed);
|
|
|
|
mActiveConsumers--;
|
|
|
|
// Clear all markers from the `mTimelineMarkers` store.
|
|
observed.get()->ClearMarkers();
|
|
// Remove self from the `mMarkersStores` store.
|
|
observed.get()->remove();
|
|
// Prepare for becoming a consumer later.
|
|
observed.reset(nullptr);
|
|
}
|
|
|
|
bool
|
|
TimelineConsumers::HasConsumer(nsIDocShell* aDocShell)
|
|
{
|
|
MOZ_ASSERT(NS_IsMainThread());
|
|
if (!aDocShell) {
|
|
return false;
|
|
}
|
|
bool isTimelineRecording = false;
|
|
aDocShell->GetRecordProfileTimelineMarkers(&isTimelineRecording);
|
|
return isTimelineRecording;
|
|
}
|
|
|
|
bool
|
|
TimelineConsumers::IsEmpty()
|
|
{
|
|
StaticMutexAutoLock lock(sMutex); // for `mActiveConsumers`.
|
|
return mActiveConsumers == 0;
|
|
}
|
|
|
|
void
|
|
TimelineConsumers::AddMarkerForDocShell(nsDocShell* aDocShell,
|
|
const char* aName,
|
|
MarkerTracingType aTracingType)
|
|
{
|
|
MOZ_ASSERT(NS_IsMainThread());
|
|
if (HasConsumer(aDocShell)) {
|
|
aDocShell->mObserved->AddMarker(Move(MakeUnique<TimelineMarker>(aName, aTracingType)));
|
|
}
|
|
}
|
|
|
|
void
|
|
TimelineConsumers::AddMarkerForDocShell(nsDocShell* aDocShell,
|
|
const char* aName,
|
|
const TimeStamp& aTime,
|
|
MarkerTracingType aTracingType)
|
|
{
|
|
MOZ_ASSERT(NS_IsMainThread());
|
|
if (HasConsumer(aDocShell)) {
|
|
aDocShell->mObserved->AddMarker(Move(MakeUnique<TimelineMarker>(aName, aTime, aTracingType)));
|
|
}
|
|
}
|
|
|
|
void
|
|
TimelineConsumers::AddMarkerForDocShell(nsDocShell* aDocShell,
|
|
UniquePtr<AbstractTimelineMarker>&& aMarker)
|
|
{
|
|
MOZ_ASSERT(NS_IsMainThread());
|
|
if (HasConsumer(aDocShell)) {
|
|
aDocShell->mObserved->AddMarker(Move(aMarker));
|
|
}
|
|
}
|
|
|
|
void
|
|
TimelineConsumers::AddMarkerForDocShell(nsIDocShell* aDocShell,
|
|
const char* aName,
|
|
MarkerTracingType aTracingType)
|
|
{
|
|
MOZ_ASSERT(NS_IsMainThread());
|
|
AddMarkerForDocShell(static_cast<nsDocShell*>(aDocShell), aName, aTracingType);
|
|
}
|
|
|
|
void
|
|
TimelineConsumers::AddMarkerForDocShell(nsIDocShell* aDocShell,
|
|
const char* aName,
|
|
const TimeStamp& aTime,
|
|
MarkerTracingType aTracingType)
|
|
{
|
|
MOZ_ASSERT(NS_IsMainThread());
|
|
AddMarkerForDocShell(static_cast<nsDocShell*>(aDocShell), aName, aTime, aTracingType);
|
|
}
|
|
|
|
void
|
|
TimelineConsumers::AddMarkerForDocShell(nsIDocShell* aDocShell,
|
|
UniquePtr<AbstractTimelineMarker>&& aMarker)
|
|
{
|
|
MOZ_ASSERT(NS_IsMainThread());
|
|
AddMarkerForDocShell(static_cast<nsDocShell*>(aDocShell), Move(aMarker));
|
|
}
|
|
|
|
void
|
|
TimelineConsumers::AddMarkerForAllObservedDocShells(const char* aName,
|
|
MarkerTracingType aTracingType,
|
|
MarkerStackRequest aStackRequest /* = STACK */)
|
|
{
|
|
bool isMainThread = NS_IsMainThread();
|
|
StaticMutexAutoLock lock(sMutex); // for `mMarkersStores`.
|
|
|
|
for (MarkersStorage* storage = mMarkersStores.getFirst();
|
|
storage != nullptr;
|
|
storage = storage->getNext()) {
|
|
UniquePtr<AbstractTimelineMarker> marker =
|
|
MakeUnique<TimelineMarker>(aName, aTracingType, aStackRequest);
|
|
if (isMainThread) {
|
|
storage->AddMarker(Move(marker));
|
|
} else {
|
|
storage->AddOTMTMarker(Move(marker));
|
|
}
|
|
}
|
|
}
|
|
|
|
void
|
|
TimelineConsumers::AddMarkerForAllObservedDocShells(const char* aName,
|
|
const TimeStamp& aTime,
|
|
MarkerTracingType aTracingType,
|
|
MarkerStackRequest aStackRequest /* = STACK */)
|
|
{
|
|
bool isMainThread = NS_IsMainThread();
|
|
StaticMutexAutoLock lock(sMutex); // for `mMarkersStores`.
|
|
|
|
for (MarkersStorage* storage = mMarkersStores.getFirst();
|
|
storage != nullptr;
|
|
storage = storage->getNext()) {
|
|
UniquePtr<AbstractTimelineMarker> marker =
|
|
MakeUnique<TimelineMarker>(aName, aTime, aTracingType, aStackRequest);
|
|
if (isMainThread) {
|
|
storage->AddMarker(Move(marker));
|
|
} else {
|
|
storage->AddOTMTMarker(Move(marker));
|
|
}
|
|
}
|
|
}
|
|
|
|
void
|
|
TimelineConsumers::AddMarkerForAllObservedDocShells(UniquePtr<AbstractTimelineMarker>& aMarker)
|
|
{
|
|
bool isMainThread = NS_IsMainThread();
|
|
StaticMutexAutoLock lock(sMutex); // for `mMarkersStores`.
|
|
|
|
for (MarkersStorage* storage = mMarkersStores.getFirst();
|
|
storage != nullptr;
|
|
storage = storage->getNext()) {
|
|
UniquePtr<AbstractTimelineMarker> clone = aMarker->Clone();
|
|
if (isMainThread) {
|
|
storage->AddMarker(Move(clone));
|
|
} else {
|
|
storage->AddOTMTMarker(Move(clone));
|
|
}
|
|
}
|
|
}
|
|
|
|
} // namespace mozilla
|