mirror of
https://repo.dactyloidae.xyz/Dactyloidae/UXP.git
synced 2026-10-03 22:07:30 +09:00
parent
f9950a2c9c
commit
359afc3ad5
5 changed files with 51 additions and 37 deletions
|
|
@ -53,13 +53,13 @@ function test() {
|
||||||
.getAttribute("value"), "getName",
|
.getAttribute("value"), "getName",
|
||||||
"Should have the right property name for 'getName' in person.");
|
"Should have the right property name for 'getName' in person.");
|
||||||
is(personNode.get("getName").target.querySelector(".value")
|
is(personNode.get("getName").target.querySelector(".value")
|
||||||
.getAttribute("value"), "_pfactory/<.getName()",
|
.getAttribute("value"), "getName()",
|
||||||
"'getName' in person should have the right value.");
|
"'getName' in person should have the right value.");
|
||||||
is(personNode.get("getFoo").target.querySelector(".name")
|
is(personNode.get("getFoo").target.querySelector(".name")
|
||||||
.getAttribute("value"), "getFoo",
|
.getAttribute("value"), "getFoo",
|
||||||
"Should have the right property name for 'getFoo' in person.");
|
"Should have the right property name for 'getFoo' in person.");
|
||||||
is(personNode.get("getFoo").target.querySelector(".value")
|
is(personNode.get("getFoo").target.querySelector(".value")
|
||||||
.getAttribute("value"), "_pfactory/<.getFoo()",
|
.getAttribute("value"), "getFoo()",
|
||||||
"'getFoo' in person should have the right value.");
|
"'getFoo' in person should have the right value.");
|
||||||
|
|
||||||
// Expand the function nodes. This causes their properties to be
|
// Expand the function nodes. This causes their properties to be
|
||||||
|
|
|
||||||
|
|
@ -58,7 +58,7 @@ function consoleOpened(hud) {
|
||||||
waitForMessages({
|
waitForMessages({
|
||||||
webconsole: gWebConsole,
|
webconsole: gWebConsole,
|
||||||
messages: [{
|
messages: [{
|
||||||
text: "function _pfactory/<.getName()",
|
text: "getName()",
|
||||||
category: CATEGORY_OUTPUT,
|
category: CATEGORY_OUTPUT,
|
||||||
objects: true,
|
objects: true,
|
||||||
}],
|
}],
|
||||||
|
|
|
||||||
|
|
@ -36,10 +36,10 @@ var inputTests = [
|
||||||
suppressClick: true
|
suppressClick: true
|
||||||
},
|
},
|
||||||
|
|
||||||
// 3 - anonymous function, but spidermonkey gives us an inferred name.
|
// 3 - anonymous function, but gets name.
|
||||||
{
|
{
|
||||||
input: "testobj1.testfn2",
|
input: "testobj1.testfn2",
|
||||||
output: "function testobj1.testfn2()",
|
output: "function testfn2()",
|
||||||
printOutput: "function () { return 42; }",
|
printOutput: "function () { return 42; }",
|
||||||
suppressClick: true
|
suppressClick: true
|
||||||
},
|
},
|
||||||
|
|
|
||||||
|
|
@ -91,44 +91,58 @@ var parsers = [
|
||||||
return jQueryLiveGetListeners(node, false);
|
return jQueryLiveGetListeners(node, false);
|
||||||
},
|
},
|
||||||
normalizeHandler: function (handlerDO) {
|
normalizeHandler: function (handlerDO) {
|
||||||
let paths = [
|
function isFunctionInProxy(funcDO) {
|
||||||
[".event.proxy/", ".event.proxy/", "*"],
|
// If the anonymous function is inside the |proxy| function and the
|
||||||
[".proxy/", "*"]
|
// 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;
|
return handlerDO;
|
||||||
}
|
}
|
||||||
|
|
||||||
for (let path of paths) {
|
const MAX_NESTED_HANDLER_COUNT = 2;
|
||||||
if (name.includes(path[0])) {
|
for (let i = 0; i < MAX_NESTED_HANDLER_COUNT; i++) {
|
||||||
path.splice(0, 1);
|
let funcDO = getFirstFunctionVariable(handlerDO);
|
||||||
|
if (!funcDO)
|
||||||
|
return handlerDO;
|
||||||
|
|
||||||
for (let point of path) {
|
handlerDO = funcDO;
|
||||||
let names = handlerDO.environment.names();
|
if (isFunctionInProxy(handlerDO)) {
|
||||||
|
continue;
|
||||||
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;
|
|
||||||
}
|
}
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
return handlerDO;
|
return handlerDO;
|
||||||
|
|
|
||||||
|
|
@ -52,7 +52,7 @@ function test_inferred_name_function() {
|
||||||
do_check_eq(args[0].class, "Function");
|
do_check_eq(args[0].class, "Function");
|
||||||
// No name for an anonymous function, but it should have an inferred name.
|
// 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].name, undefined);
|
||||||
do_check_eq(args[0].displayName, "o.m");
|
do_check_eq(args[0].displayName, "m");
|
||||||
|
|
||||||
let objClient = gThreadClient.pauseGrip(args[0]);
|
let objClient = gThreadClient.pauseGrip(args[0]);
|
||||||
objClient.getParameterNames(function (aResponse) {
|
objClient.getParameterNames(function (aResponse) {
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue