Part 5: Update devtools to follow displayName change

Issue #87
This commit is contained in:
janekptacijarabaci 2018-03-19 16:15:11 +01:00 committed by Roy Tam
commit 359afc3ad5
5 changed files with 51 additions and 37 deletions

View file

@ -53,13 +53,13 @@ function test() {
.getAttribute("value"), "getName",
"Should have the right property name for 'getName' in person.");
is(personNode.get("getName").target.querySelector(".value")
.getAttribute("value"), "_pfactory/<.getName()",
.getAttribute("value"), "getName()",
"'getName' in person should have the right value.");
is(personNode.get("getFoo").target.querySelector(".name")
.getAttribute("value"), "getFoo",
"Should have the right property name for 'getFoo' in person.");
is(personNode.get("getFoo").target.querySelector(".value")
.getAttribute("value"), "_pfactory/<.getFoo()",
.getAttribute("value"), "getFoo()",
"'getFoo' in person should have the right value.");
// Expand the function nodes. This causes their properties to be

View file

@ -58,7 +58,7 @@ function consoleOpened(hud) {
waitForMessages({
webconsole: gWebConsole,
messages: [{
text: "function _pfactory/<.getName()",
text: "getName()",
category: CATEGORY_OUTPUT,
objects: true,
}],

View file

@ -36,10 +36,10 @@ var inputTests = [
suppressClick: true
},
// 3 - anonymous function, but spidermonkey gives us an inferred name.
// 3 - anonymous function, but gets name.
{
input: "testobj1.testfn2",
output: "function testobj1.testfn2()",
output: "function testfn2()",
printOutput: "function () { return 42; }",
suppressClick: true
},

View file

@ -91,44 +91,58 @@ var parsers = [
return jQueryLiveGetListeners(node, false);
},
normalizeHandler: function (handlerDO) {
let paths = [
[".event.proxy/", ".event.proxy/", "*"],
[".proxy/", "*"]
];
function isFunctionInProxy(funcDO) {
// If the anonymous function is inside the |proxy| function and the
// function only has guessed atom, the guessed atom should starts with
// "proxy/".
let displayName = funcDO.displayName;
if (displayName && displayName.startsWith("proxy/")) {
return true;
}
let name = handlerDO.displayName;
// If the anonymous function is inside the |proxy| function and the
// function gets name at compile time by SetFunctionName, its guessed
// atom doesn't contain "proxy/". In that case, check if the caller is
// "proxy" function, as a fallback.
let calleeDO = funcDO.environment.callee;
if (!calleeDO) {
return false;
}
let calleeName = calleeDO.displayName;
return calleeName == "proxy";
}
if (!name) {
function getFirstFunctionVariable(funcDO) {
// The handler function inside the |proxy| function should point the
// unwrapped function via environment variable.
let names = funcDO.environment.names();
for (let varName of names) {
let varDO = handlerDO.environment.getVariable(varName);
if (!varDO) {
continue;
}
if (varDO.class == "Function") {
return varDO;
}
}
return null;
}
if (!isFunctionInProxy(handlerDO)) {
return handlerDO;
}
for (let path of paths) {
if (name.includes(path[0])) {
path.splice(0, 1);
const MAX_NESTED_HANDLER_COUNT = 2;
for (let i = 0; i < MAX_NESTED_HANDLER_COUNT; i++) {
let funcDO = getFirstFunctionVariable(handlerDO);
if (!funcDO)
return handlerDO;
for (let point of path) {
let names = handlerDO.environment.names();
for (let varName of names) {
let temp = handlerDO.environment.getVariable(varName);
if (!temp) {
continue;
}
let displayName = temp.displayName;
if (!displayName) {
continue;
}
if (temp.class === "Function" &&
(displayName.includes(point) || point === "*")) {
handlerDO = temp;
break;
}
}
}
break;
handlerDO = funcDO;
if (isFunctionInProxy(handlerDO)) {
continue;
}
break;
}
return handlerDO;

View file

@ -52,7 +52,7 @@ function test_inferred_name_function() {
do_check_eq(args[0].class, "Function");
// No name for an anonymous function, but it should have an inferred name.
do_check_eq(args[0].name, undefined);
do_check_eq(args[0].displayName, "o.m");
do_check_eq(args[0].displayName, "m");
let objClient = gThreadClient.pauseGrip(args[0]);
objClient.getParameterNames(function (aResponse) {