Bug 1593969 Refactor nsWindowMemoryReporter.cpp r=ckerschb
☠☠ backed out by c0b01b965387 ☠ ☠
authorSebastian Streich <sstreich@mozilla.com>
Mon, 18 Nov 2019 15:47:40 +0000
changeset 502425 f75d3d0846627e3d47efad9e61701f41491fa4be
parent 502424 c2ec766b798c413c44928968edd783fd454be8da
child 502426 eb9eb64782b9c17cb201e96e4d904e8c463d465c
push id114172
push userdluca@mozilla.com
push dateTue, 19 Nov 2019 11:31:10 +0000
treeherdermozilla-inbound@b5c5ba07d3db [default view] [failures only]
perfherder[talos] [build metrics] [platform microbench] (compared to previous push)
reviewersckerschb
bugs1593969
milestone72.0a1
first release with
nightly linux32
nightly linux64
nightly mac
nightly win32
nightly win64
last release without
nightly linux32
nightly linux64
nightly mac
nightly win32
nightly win64
Bug 1593969 Refactor nsWindowMemoryReporter.cpp r=ckerschb Differential Revision: https://phabricator.services.mozilla.com/D51800
dom/base/nsWindowMemoryReporter.cpp
--- a/dom/base/nsWindowMemoryReporter.cpp
+++ b/dom/base/nsWindowMemoryReporter.cpp
@@ -111,74 +111,70 @@ void nsWindowMemoryReporter::Init() {
   RegisterGhostWindowsDistinguishedAmount(GhostWindowsDistinguishedAmount);
 }
 
 /* static */
 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);
+  nsCOMPtr<nsIScriptObjectPrincipal> scriptObjPrincipal =
+      do_QueryObject(aWindow);
+  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()) {
-      nsIPrincipal* principal = scriptObjPrincipal->GetPrincipal();
-      if (principal) {
-        principal->GetURI(getter_AddRefs(uri));
-      }
-    }
+  // 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()) {
+    return NS_LITERAL_CSTRING("");
   }
-
-  return uri.forget();
+  nsIPrincipal* principal = scriptObjPrincipal->GetPrincipal();
+  if (!principal) {
+    return NS_LITERAL_CSTRING("");
+  }
+  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);
-
-  if (uri) {
-    if (aAnonymize && !aWindow->IsChromeWindow()) {
-      aStr.AppendPrintf("<anonymized-%" PRIu64 ">", aWindow->WindowID());
-    } else {
-      nsCString spec = uri->GetSpecOrDefault();
+  nsCString spec = GetWindowURISpec(aWindow);
 
-      // 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 (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());
+    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;
 }
 
 MOZ_DEFINE_MALLOC_SIZE_OF(WindowsMallocSizeOf)
 
 // The key is the window ID.
 typedef nsDataHashtable<nsUint64HashKey, nsCString> WindowPaths;
 
 static void ReportAmount(const nsCString& aBasePath, const char* aPathTail,
@@ -222,28 +218,21 @@ static void CollectWindowReports(nsGloba
                                  WindowPaths* aTopWindowPaths,
                                  nsIHandleReportCallback* aHandleReport,
                                  nsISupports* aData, bool aAnonymize) {
   nsAutoCString windowPath("explicit/");
 
   // 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/");
 
   if (top) {
     windowPath += NS_LITERAL_CSTRING("top(");
     AppendWindowURI(top->GetCurrentInnerWindowInternal(), windowPath,
                     aAnonymize);