PerformanceInfo DocGroup::ReportPerformanceInfo() { AssertIsOnMainThread(); MOZ_ASSERT(mPerformanceCounter); #if defined(XP_WIN) uint32_t pid = GetCurrentProcessId(); #else uint32_t pid = getpid(); #endif uint64_t wid = 0; uint64_t pwid = 0; uint16_t count = 0; uint64_t duration = 0; nsCString host = NS_LITERAL_CSTRING("None"); for (const auto& document : *this) { // grabbing the host name of the first document nsCOMPtr<nsIDocument> doc = do_QueryInterface(document); MOZ_ASSERT(doc); nsCOMPtr<nsIURI> docURI = doc->GetDocumentURI(); if (!docURI) { continue; } docURI->GetHost(host); wid = doc->OuterWindowID(); // getting the top window id - if not possible // pwid gets the same value than wid pwid = wid; nsPIDOMWindowInner* win = doc->GetInnerWindow(); if (win) { nsPIDOMWindowOuter* outer = win->GetOuterWindow(); if (outer) { nsCOMPtr<nsPIDOMWindowOuter> top = outer->GetTop(); if (top) { pwid = top->WindowID(); } } } } duration = mPerformanceCounter->GetExecutionDuration(); FallibleTArray<CategoryDispatch> items; // now that we have the host and window ids, let's look at the perf counters for (uint32_t index = 0; index < (uint32_t)TaskCategory::Count; index++) { TaskCategory category = static_cast<TaskCategory>(index); count = mPerformanceCounter->GetDispatchCount(DispatchCategory(category)); CategoryDispatch item = CategoryDispatch(index, count); if (!items.AppendElement(item, fallible)) { NS_ERROR("Could not complete the operation"); return PerformanceInfo(host, pid, wid, pwid, duration, false, items); } } // setting back all counters to zero mPerformanceCounter->ResetPerformanceCounters(); return PerformanceInfo(host, pid, wid, pwid, duration, false, items); }
RefPtr<PerformanceInfoPromise> DocGroup::ReportPerformanceInfo() { AssertIsOnMainThread(); MOZ_ASSERT(mPerformanceCounter); #if defined(XP_WIN) uint32_t pid = GetCurrentProcessId(); #else uint32_t pid = getpid(); #endif uint64_t windowID = 0; uint16_t count = 0; uint64_t duration = 0; bool isTopLevel = false; nsCString host; nsCOMPtr<nsPIDOMWindowOuter> top; RefPtr<AbstractThread> mainThread; // iterating on documents until we find the top window for (const auto& document : *this) { nsCOMPtr<Document> doc = document; MOZ_ASSERT(doc); nsCOMPtr<nsIURI> docURI = doc->GetDocumentURI(); if (!docURI) { continue; } docURI->GetHost(host); // If the host is empty, using the url if (host.IsEmpty()) { host = docURI->GetSpecOrDefault(); } // looking for the top level document URI nsPIDOMWindowOuter* win = doc->GetWindow(); if (!win) { continue; } nsPIDOMWindowOuter* outer = win->GetOuterWindow(); if (!outer) { continue; } top = outer->GetTop(); if (!top) { continue; } windowID = top->WindowID(); isTopLevel = outer->IsTopLevelWindow(); mainThread = AbstractMainThreadFor(TaskCategory::Performance); break; } MOZ_ASSERT(!host.IsEmpty()); duration = mPerformanceCounter->GetExecutionDuration(); FallibleTArray<CategoryDispatch> items; // now that we have the host and window ids, let's look at the perf counters for (uint32_t index = 0; index < (uint32_t)TaskCategory::Count; index++) { TaskCategory category = static_cast<TaskCategory>(index); count = mPerformanceCounter->GetDispatchCount(DispatchCategory(category)); CategoryDispatch item = CategoryDispatch(index, count); if (!items.AppendElement(item, fallible)) { NS_ERROR("Could not complete the operation"); break; } } if (!isTopLevel) { return PerformanceInfoPromise::CreateAndResolve( PerformanceInfo(host, pid, windowID, duration, mPerformanceCounter->GetID(), false, isTopLevel, PerformanceMemoryInfo(), // Empty memory info items), __func__); } MOZ_ASSERT(mainThread); RefPtr<DocGroup> self = this; return CollectMemoryInfo(top, mainThread) ->Then( mainThread, __func__, [self, host, pid, windowID, duration, isTopLevel, items](const PerformanceMemoryInfo& aMemoryInfo) { PerformanceInfo info = PerformanceInfo(host, pid, windowID, duration, self->mPerformanceCounter->GetID(), false, isTopLevel, aMemoryInfo, items); return PerformanceInfoPromise::CreateAndResolve(std::move(info), __func__); }, [self](const nsresult rv) { return PerformanceInfoPromise::CreateAndReject(rv, __func__); }); }