/* -*- 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/. */
// Max number of Report objects
constexpr auto MAX_REPORT_RECORDS = 100;
using mozilla::AutoSlowOperation; using mozilla::CycleCollectedJSContext; using mozilla::DOMEventTargetHelper; using mozilla::ErrorResult; using mozilla::GlobalFreezeObserver; using mozilla::GlobalTeardownObserver; using mozilla::IgnoredErrorResult; using mozilla::MallocSizeOf; using mozilla::Maybe; using mozilla::MicroTaskRunnable; using mozilla::dom::BlobURLProtocolHandler; using mozilla::dom::CallerType; using mozilla::dom::ClientInfo; using mozilla::dom::ClientState; using mozilla::dom::Report; using mozilla::dom::ReportingObserver; using mozilla::dom::ServiceWorker; using mozilla::dom::ServiceWorkerContainer; using mozilla::dom::ServiceWorkerDescriptor; using mozilla::dom::ServiceWorkerRegistration; using mozilla::dom::ServiceWorkerRegistrationDescriptor; using mozilla::dom::VoidFunction;
class UnlinkHostObjectURIsRunnable final : public mozilla::Runnable { public: explicit UnlinkHostObjectURIsRunnable(nsTArray<nsCString>&& aURIs)
: mozilla::Runnable("UnlinkHostObjectURIsRunnable"),
mURIs(std::move(aURIs)) {}
void nsIGlobalObject::UnlinkObjectsInGlobal() { if (!mHostObjectURIs.IsEmpty()) { // BlobURLProtocolHandler is main-thread only. if (NS_IsMainThread()) { for (uint32_t index = 0; index < mHostObjectURIs.Length(); ++index) {
BlobURLProtocolHandler::RemoveDataEntry(mHostObjectURIs[index]);
}
mHostObjectURIs.Clear();
} else {
RefPtr<UnlinkHostObjectURIsRunnable> runnable = new UnlinkHostObjectURIsRunnable(std::move(mHostObjectURIs));
MOZ_ASSERT(mHostObjectURIs.IsEmpty());
nsresult rv = NS_DispatchToMainThread(runnable); if (NS_FAILED(rv)) {
NS_WARNING("Failed to dispatch a runnable to the main-thread.");
}
}
}
void nsIGlobalObject::TraverseObjectsInGlobal(
nsCycleCollectionTraversalCallback& cb) { // Currently we only store BlobImpl objects off the the main-thread and they // are not CCed. if (!mHostObjectURIs.IsEmpty() && NS_IsMainThread()) { for (uint32_t index = 0; index < mHostObjectURIs.Length(); ++index) {
BlobURLProtocolHandler::Traverse(mHostObjectURIs[index], cb);
}
}
void nsIGlobalObject::ForEachGlobalTeardownObserver( const std::function<void(GlobalTeardownObserver*, bool* aDoneOut)>& aFunc) const { // Protect against the function call triggering a mutation of the list // while we are iterating by copying the observer references to a temporary // list.
AutoTArray<RefPtr<GlobalTeardownObserver>, 64> targetList; for (const GlobalTeardownObserver* observer : mGlobalTeardownObservers) {
targetList.AppendElement(const_cast<GlobalTeardownObserver*>(observer));
}
// Iterate the target list and call the function on each one. bool done = false; for (auto& target : targetList) { // Check to see if a previous iteration's callback triggered the removal // of this target as a side-effect. If it did, then just ignore it. if (target->GetOwnerGlobal() != this) { continue;
}
aFunc(target, &done); if (done) { break;
}
}
}
// Calling DisconnectFromOwner() should result in // RemoveGlobalTeardownObserver() being called.
MOZ_DIAGNOSTIC_ASSERT(aTarget->GetOwnerGlobal() != this);
});
}
void nsIGlobalObject::ForEachGlobalFreezeObserver( const std::function<void(GlobalFreezeObserver*, bool* aDoneOut)>& aFunc) const { // Protect against the function call triggering a mutation of the list // while we are iterating by copying the observer references to a temporary // list.
AutoTArray<RefPtr<GlobalFreezeObserver>, 64> targetList; for (const GlobalFreezeObserver* observer : mGlobalFreezeObservers) {
targetList.AppendElement(const_cast<GlobalFreezeObserver*>(observer));
}
// Iterate the target list and call the function on each one. bool done = false; for (auto& target : targetList) { // Check to see if a previous iteration's callback triggered the removal // of this target as a side-effect. If it did, then just ignore it. if (!target->Observing()) { continue;
}
aFunc(target, &done); if (done) { break;
}
}
}
Maybe<ClientInfo> nsIGlobalObject::GetClientInfo() const { // By default globals do not expose themselves as a client. Only real // window and worker globals are currently considered clients. return Maybe<ClientInfo>();
}
Maybe<ClientState> nsIGlobalObject::GetClientState() const { // By default globals do not expose themselves as a client. Only real // window and worker globals are currently considered clients. return Maybe<ClientState>();
}
Maybe<nsID> nsIGlobalObject::GetAgentClusterId() const {
Maybe<ClientInfo> ci = GetClientInfo(); if (ci.isSome()) { return ci.value().AgentClusterId();
} return mozilla::Nothing();
}
Maybe<ServiceWorkerDescriptor> nsIGlobalObject::GetController() const { // By default globals do not have a service worker controller. Only real // window and worker globals can currently be controlled as a client. return Maybe<ServiceWorkerDescriptor>();
}
RefPtr<ServiceWorker> nsIGlobalObject::GetOrCreateServiceWorker( const ServiceWorkerDescriptor& aDescriptor) {
MOZ_DIAGNOSTIC_CRASH("this global should not have any service workers"); return nullptr;
}
RefPtr<ServiceWorkerRegistration> nsIGlobalObject::GetServiceWorkerRegistration( const mozilla::dom::ServiceWorkerRegistrationDescriptor& aDescriptor) const {
MOZ_DIAGNOSTIC_CRASH("this global should not have any service workers"); return nullptr;
}
RefPtr<ServiceWorkerRegistration>
nsIGlobalObject::GetOrCreateServiceWorkerRegistration( const ServiceWorkerRegistrationDescriptor& aDescriptor) {
MOZ_DIAGNOSTIC_ASSERT( false, "this global should not have any service worker registrations"); return nullptr;
}
for (ReportingObserver* observer : mReportingObservers) {
observer->MaybeReport(aReport);
}
if (NS_WARN_IF(!mReportRecords.AppendElement(aReport, mozilla::fallible))) { return;
}
while (mReportRecords.Length() > MAX_REPORT_RECORDS) {
mReportRecords.RemoveElementAt(0);
}
}
void nsIGlobalObject::NotifyReportingObservers() { for (auto& observer : mReportingObservers.Clone()) { // MOZ_KnownLive because the clone of 'mReportingObservers' is guaranteed to // keep it alive. // // This can go away once // https://bugzilla.mozilla.org/show_bug.cgi?id=1620312 is fixed.
MOZ_KnownLive(observer)->MaybeNotify();
}
}
void nsIGlobalObject::ReportToConsole(
uint32_t aErrorFlags, const nsCString& aCategory,
nsContentUtils::PropertiesFile aFile, const nsCString& aMessageName, const nsTArray<nsString>& aParams, const mozilla::SourceLocation& aLocation) { // We pass nullptr for the document because nsGlobalWindowInner handles the // case where it should be non-null. We also expect the worker impl to // override.
nsContentUtils::ReportToConsole(aErrorFlags, aCategory, nullptr, aFile,
aMessageName.get(), aParams, aLocation);
}
¤ Dauer der Verarbeitung: 0.15 Sekunden
(vorverarbeitet)
¤
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung ist noch experimentell.