зеркало из https://github.com/mozilla/gecko-dev.git
Add a memory actor for collecting memory usage data (bug 923275); r=paul
This commit is contained in:
Родитель
7c37d517d7
Коммит
c2e5563040
|
@ -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>
|
Загрузка…
Ссылка в новой задаче