diff -r 000000000000 -r 6474c204b198 toolkit/devtools/server/actors/memory.js --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/toolkit/devtools/server/actors/memory.js Wed Dec 31 06:09:35 2014 +0100 @@ -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"); +};