From c2e556304027efe5cead50da25958e7b1a1760ae Mon Sep 17 00:00:00 2001 From: Panos Astithas Date: Tue, 3 Dec 2013 13:41:02 +0200 Subject: [PATCH] Add a memory actor for collecting memory usage data (bug 923275); r=paul --- b2g/chrome/content/shell.js | 1 + toolkit/devtools/server/actors/memory.js | 95 +++++++++++++++++++ toolkit/devtools/server/main.js | 2 + .../server/tests/mochitest/chrome.ini | 1 + .../server/tests/mochitest/test_memory.html | 70 ++++++++++++++ 5 files changed, 169 insertions(+) create mode 100644 toolkit/devtools/server/actors/memory.js create mode 100644 toolkit/devtools/server/tests/mochitest/test_memory.html diff --git a/b2g/chrome/content/shell.js b/b2g/chrome/content/shell.js index 14ed5d09aefe..45e9a780087f 100644 --- a/b2g/chrome/content/shell.js +++ b/b2g/chrome/content/shell.js @@ -1105,6 +1105,7 @@ let RemoteDebugger = { DebuggerServer.registerModule("devtools/server/actors/stylesheets"); DebuggerServer.registerModule("devtools/server/actors/tracer"); DebuggerServer.registerModule("devtools/server/actors/webgl"); + DebuggerServer.registerModule("devtools/server/actors/memory"); } DebuggerServer.addActors('chrome://browser/content/dbg-browser-actors.js'); DebuggerServer.addActors("resource://gre/modules/devtools/server/actors/webapps.js"); diff --git a/toolkit/devtools/server/actors/memory.js b/toolkit/devtools/server/actors/memory.js new file mode 100644 index 000000000000..1127822ab3da --- /dev/null +++ b/toolkit/devtools/server/actors/memory.js @@ -0,0 +1,95 @@ +/* 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/. */ + +"use strict"; + +const {Cc, Ci, Cu} = require("chrome"); +let protocol = require("devtools/server/protocol"); +let {method, RetVal} = protocol; + +/** + * An actor that returns memory usage data for its parent actor's window. + * A tab-scoped instance of this actor will measure the memory footprint of its + * parent tab. A global-scoped instance however, will measure the memory + * footprint of the chrome window referenced by the root actor. + */ +let MemoryActor = protocol.ActorClass({ + typeName: "memory", + + initialize: function(conn, tabActor) { + protocol.Actor.prototype.initialize.call(this, conn); + this.tabActor = tabActor; + this._mgr = Cc["@mozilla.org/memory-reporter-manager;1"] + .getService(Ci.nsIMemoryReporterManager); + }, + + destroy: function() { + this._mgr = null; + protocol.Actor.prototype.destroy.call(this); + }, + + /** + * A method that returns a detailed breakdown of the memory consumption of the + * associated window. + * + * @returns object + */ + measure: method(function() { + let result = {}; + + let jsObjectsSize = {}; + let jsStringsSize = {}; + let jsOtherSize = {}; + let domSize = {}; + let styleSize = {}; + let otherSize = {}; + let totalSize = {}; + let jsMilliseconds = {}; + let nonJSMilliseconds = {}; + + try { + this._mgr.sizeOfTab(this.tabActor.window, jsObjectsSize, jsStringsSize, jsOtherSize, + domSize, styleSize, otherSize, totalSize, jsMilliseconds, nonJSMilliseconds); + result.total = totalSize.value; + result.domSize = domSize.value; + result.styleSize = styleSize.value; + result.jsObjectsSize = jsObjectsSize.value; + result.jsStringsSize = jsStringsSize.value; + result.jsOtherSize = jsOtherSize.value; + result.otherSize = otherSize.value; + result.jsMilliseconds = jsMilliseconds.value.toFixed(1); + result.nonJSMilliseconds = nonJSMilliseconds.value.toFixed(1); + } catch (e) { + console.error(e); + let url = this.tabActor.url; + console.error("Error getting size of "+url); + } + + return result; + }, { + request: {}, + response: RetVal("json"), + }) +}); + +exports.MemoryActor = MemoryActor; + +exports.MemoryFront = protocol.FrontClass(MemoryActor, { + initialize: function(client, form) { + protocol.Front.prototype.initialize.call(this, client, form); + this.actorID = form.memoryActor; + client.addActorPool(this); + this.manage(this); + } +}); + +exports.register = function(handle) { + handle.addGlobalActor(MemoryActor, "memoryActor"); + handle.addTabActor(MemoryActor, "memoryActor"); +}; + +exports.unregister = function(handle) { + handle.removeGlobalActor(MemoryActor, "memoryActor"); + handle.removeTabActor(MemoryActor, "memoryActor"); +}; diff --git a/toolkit/devtools/server/main.js b/toolkit/devtools/server/main.js index 26554c0c9ce2..3b9dc25e6fe5 100644 --- a/toolkit/devtools/server/main.js +++ b/toolkit/devtools/server/main.js @@ -358,6 +358,7 @@ var DebuggerServer = { this.registerModule("devtools/server/actors/device"); this.registerModule("devtools/server/actors/stylesheets"); this.registerModule("devtools/server/actors/styleeditor"); + this.registerModule("devtools/server/actors/memory"); }, /** @@ -377,6 +378,7 @@ var DebuggerServer = { this.registerModule("devtools/server/actors/stylesheets"); this.registerModule("devtools/server/actors/styleeditor"); this.registerModule("devtools/server/actors/tracer"); + this.registerModule("devtools/server/actors/memory"); } if (!("ContentAppActor" in DebuggerServer)) { this.addActors("resource://gre/modules/devtools/server/actors/childtab.js"); diff --git a/toolkit/devtools/server/tests/mochitest/chrome.ini b/toolkit/devtools/server/tests/mochitest/chrome.ini index a0b67cc24ef8..09c7ea54f026 100644 --- a/toolkit/devtools/server/tests/mochitest/chrome.ini +++ b/toolkit/devtools/server/tests/mochitest/chrome.ini @@ -35,3 +35,4 @@ support-files = [test_unsafeDereference.html] [test_evalInGlobal-outerized_this.html] [test_inspector_getImageData.html] +[test_memory.html] diff --git a/toolkit/devtools/server/tests/mochitest/test_memory.html b/toolkit/devtools/server/tests/mochitest/test_memory.html new file mode 100644 index 000000000000..f73fcfdbbf53 --- /dev/null +++ b/toolkit/devtools/server/tests/mochitest/test_memory.html @@ -0,0 +1,70 @@ + + + + + + Memory monitoring actor test + + + + +
+
+
+ +