mirror of
https://repo.dactyloidae.xyz/Dactyloidae/UXP.git
synced 2026-08-15 08:53:07 +09:00
parent
f9950a2c9c
commit
359afc3ad5
5 changed files with 51 additions and 37 deletions
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -58,7 +58,7 @@ function consoleOpened(hud) {
|
|||
waitForMessages({
|
||||
webconsole: gWebConsole,
|
||||
messages: [{
|
||||
text: "function _pfactory/<.getName()",
|
||||
text: "getName()",
|
||||
category: CATEGORY_OUTPUT,
|
||||
objects: true,
|
||||
}],
|
||||
|
|
|
|||
|
|
@ -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
|
||||
},
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
|
|
|||
|
|
@ -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) {
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue