Bug 1593969 Refactor nsWindowMemoryReporter.cpp r=ckerschb

Differential Revision: https://phabricator.services.mozilla.com/D51800

--HG--
extra : moz-landing-system : lando
This commit is contained in:
Sebastian Streich 2019-11-18 15:47:40 +00:00
Родитель 8f46d9d516
Коммит 44ce57c37d
1 изменённых файлов: 35 добавлений и 46 удалений

Просмотреть файл

@ -116,64 +116,60 @@ nsWindowMemoryReporter* nsWindowMemoryReporter::Get() {
return sWindowReporter;
}
static already_AddRefed<nsIURI> GetWindowURI(nsGlobalWindowInner* aWindow) {
NS_ENSURE_TRUE(aWindow, nullptr);
static nsCString GetWindowURISpec(nsGlobalWindowInner* aWindow) {
NS_ENSURE_TRUE(aWindow, NS_LITERAL_CSTRING(""));
nsCOMPtr<Document> doc = aWindow->GetExtantDoc();
nsCOMPtr<nsIURI> uri;
if (doc) {
nsCOMPtr<nsIURI> uri;
uri = doc->GetDocumentURI();
return uri->GetSpecOrDefault();
}
if (!uri) {
nsCOMPtr<nsIScriptObjectPrincipal> scriptObjPrincipal =
do_QueryObject(aWindow);
NS_ENSURE_TRUE(scriptObjPrincipal, nullptr);
NS_ENSURE_TRUE(scriptObjPrincipal, NS_LITERAL_CSTRING(""));
// GetPrincipal() will print a warning if the window does not have an outer
// window, so check here for an outer window first. This code is
// functionally correct if we leave out the GetOuterWindow() check, but we
// end up printing a lot of warnings during debug mochitests.
if (aWindow->GetOuterWindow()) {
if (!aWindow->GetOuterWindow()) {
return NS_LITERAL_CSTRING("");
}
nsIPrincipal* principal = scriptObjPrincipal->GetPrincipal();
if (principal) {
principal->GetURI(getter_AddRefs(uri));
if (!principal) {
return NS_LITERAL_CSTRING("");
}
}
}
return uri.forget();
nsCString spec;
principal->GetAsciiSpec(spec);
return spec;
}
// Forward to the inner window if we need to when getting the window's URI.
static already_AddRefed<nsIURI> GetWindowURI(nsGlobalWindowOuter* aWindow) {
NS_ENSURE_TRUE(aWindow, nullptr);
return GetWindowURI(aWindow->GetCurrentInnerWindowInternal());
static nsCString GetWindowURISpec(nsGlobalWindowOuter* aWindow) {
NS_ENSURE_TRUE(aWindow, NS_LITERAL_CSTRING(""));
return GetWindowURISpec(aWindow->GetCurrentInnerWindowInternal());
}
static void AppendWindowURI(nsGlobalWindowInner* aWindow, nsACString& aStr,
bool aAnonymize) {
nsCOMPtr<nsIURI> uri = GetWindowURI(aWindow);
nsCString spec = GetWindowURISpec(aWindow);
if (uri) {
if (spec.IsEmpty()) {
// If we're unable to find a URI, we're dealing with a chrome window with
// no document in it (or somesuch), so we call this a "system window".
aStr += NS_LITERAL_CSTRING("[system]");
return;
}
if (aAnonymize && !aWindow->IsChromeWindow()) {
aStr.AppendPrintf("<anonymized-%" PRIu64 ">", aWindow->WindowID());
} else {
nsCString spec = uri->GetSpecOrDefault();
return;
}
// A hack: replace forward slashes with '\\' so they aren't
// treated as path separators. Users of the reporters
// (such as about:memory) have to undo this change.
spec.ReplaceChar('/', '\\');
aStr += spec;
}
} else {
// If we're unable to find a URI, we're dealing with a chrome window with
// no document in it (or somesuch), so we call this a "system window".
aStr += NS_LITERAL_CSTRING("[system]");
}
}
MOZ_DEFINE_MALLOC_SIZE_OF(WindowsMallocSizeOf)
@ -227,18 +223,11 @@ static void CollectWindowReports(nsGlobalWindowInner* aWindow,
// Avoid calling aWindow->GetInProcessTop() if there's no outer window. It
// will work just fine, but will spew a lot of warnings.
nsGlobalWindowOuter* top = nullptr;
nsCOMPtr<nsIURI> location;
if (aWindow->GetOuterWindow()) {
// Our window should have a null top iff it has a null docshell.
MOZ_ASSERT(!!aWindow->GetInProcessTopInternal() ==
!!aWindow->GetDocShell());
top = aWindow->GetInProcessTopInternal();
if (top) {
location = GetWindowURI(top);
}
}
if (!location) {
location = GetWindowURI(aWindow);
}
windowPath += NS_LITERAL_CSTRING("window-objects/");