Add a memory actor for collecting memory usage data (bug 923275); r=paul

This commit is contained in:
Panos Astithas 2013-12-03 13:41:02 +02:00
Родитель 7c37d517d7
Коммит c2e5563040
5 изменённых файлов: 169 добавлений и 0 удалений

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

@ -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");

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

@ -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");
};

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

@ -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");

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

@ -35,3 +35,4 @@ support-files =
[test_unsafeDereference.html]
[test_evalInGlobal-outerized_this.html]
[test_inspector_getImageData.html]
[test_memory.html]

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

@ -0,0 +1,70 @@
<!DOCTYPE HTML>
<html>
<!--
Bug 923275 - Add a memory monitor widget to the developer toolbar
-->
<head>
<meta charset="utf-8">
<title>Memory monitoring actor test</title>
<script type="application/javascript" src="chrome://mochikit/content/tests/SimpleTest/SimpleTest.js"></script>
<link rel="stylesheet" type="text/css" href="chrome://mochikit/content/tests/SimpleTest/test.css">
</head>
<body>
<pre id="test">
<script>
window.onload = function() {
var Cu = Components.utils;
var Cc = Components.classes;
var Ci = Components.interfaces;
Cu.import("resource://gre/modules/Services.jsm");
// Always log packets when running tests.
Services.prefs.setBoolPref("devtools.debugger.log", true);
SimpleTest.registerCleanupFunction(function() {
Services.prefs.clearUserPref("devtools.debugger.log");
});
Cu.import("resource://gre/modules/devtools/Loader.jsm");
Cu.import("resource://gre/modules/devtools/dbg-client.jsm");
Cu.import("resource://gre/modules/devtools/dbg-server.jsm");
SimpleTest.waitForExplicitFinish();
var {MemoryFront} = devtools.require("devtools/server/actors/memory");
DebuggerServer.init(function () { return true; });
DebuggerServer.addBrowserActors();
var client = new DebuggerClient(DebuggerServer.connectPipe());
client.connect(function onConnect() {
client.listTabs(function onListTabs(aResponse) {
var form = aResponse.tabs[aResponse.selected];
var front = MemoryFront(client, form);
front.measure().then(measurement => {
ok(measurement.total > 0, "total memory is valid");
ok(measurement.domSize > 0, "domSize is valid");
ok(measurement.styleSize > 0, "styleSize is valid");
ok(measurement.jsObjectsSize > 0, "jsObjectsSize is valid");
ok(measurement.jsStringsSize > 0, "jsStringsSize is valid");
ok(measurement.jsOtherSize > 0, "jsOtherSize is valid");
ok(measurement.otherSize > 0, "otherSize is valid");
ok(measurement.jsMilliseconds, "jsMilliseconds is valid");
ok(measurement.nonJSMilliseconds, "nonJSMilliseconds is valid");
client.close(() => {
DebuggerServer.destroy();
SimpleTest.finish()
});
});
});
});
}
</script>
</pre>
</body>
</html>