Closed Bug 938119 Opened 11 years ago Closed 6 years ago

False and Erroneous results of javascript 'delete' in web console

Categories

(DevTools :: Console, defect)

23 Branch
defect
Not set
major

Tracking

(Not tracked)

RESOLVED WORKSFORME

People

(Reporter: g.sravan4u, Unassigned)

References

Details

Attachments

(1 file)

Attached image ff25bug.JPG
User Agent: Mozilla/5.0 (Windows NT 6.1; rv:25.0) Gecko/20100101 Firefox/25.0 (Beta/Release)
Build ID: 20131025151332

Steps to reproduce:

1.Open webconsole in Windows Firefox 25.0
2.Enter var x=2;delete x;
3.Return "true" in console (where as Expected return value of false.)
References:https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/Expressions_and_Operators#delete


Actual results:

var x=2;delete x;
true;


Expected results:

var x=2;delete x;
false;
Severity: normal → major
Component: Untriaged → Developer Tools: Console
Not sure if it's a valid regression.

Regression range:
http://hg.mozilla.org/mozilla-central/pushloghtml?fromchange=b1fb34b07c17&tochange=9db46ddfb517

Suspected bug:
Mihai Sucan — Bug 808370 - Use the VariablesView in webconsole; r=past,vporof,paul
Flags: needinfo?(mihai.sucan)
Version: 25 Branch → 23 Branch
|var x=2| puts |x| on the window object. |delete x| deletes the variable from the window object, hence delete returns true. This is working as expected.
Flags: needinfo?(mihai.sucan)
Its a False result i guess.Because i tested the same javascript on firefox 16.0.2 and chrome.
Both returned false which is just as explained in
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/Expressions_and_Operators#delete
(In reply to Mihai Sucan [:msucan] from comment #2)
> |var x=2| puts |x| on the window object. |delete x| deletes the variable
> from the window object, hence delete returns true. This is working as
> expected.

Its a False result i guess.Because i tested the same javascript on firefox 16.0.2 and chrome.
Both returned false which is just as explained in
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/Expressions_and_Operators#delete
this is bubbling up from the JS engine. Not a webconsole bug.
Status: UNCONFIRMED → RESOLVED
Closed: 11 years ago
Resolution: --- → WONTFIX
(In reply to Rob Campbell [:rc] (:robcee) from comment #5)
> this is bubbling up from the JS engine. Not a webconsole bug.

This works fine in a web page, so this is console-specific bustage.
//code used for test
/*
<html><head><script>function a(){var x=2;alert(delete x);}

</script></head><body><input type="button" onclick="a()" 

value="check"</body></html>
*/
Status: RESOLVED → UNCONFIRMED
Resolution: WONTFIX → ---
Summary: False and Erroneous results of javascript 'delete' → False and Erroneous results of javascript 'delete' in web console
This may well be a bug in whatever APIs the console uses to evaluate script, of course.
Comment 6 uses a different pattern than comment 0, since it deletes a variable local to a function. Did you try running it in the web console? It returns false:

function a(){var x=2;console.log(delete x);}; a()
(In reply to Panos Astithas [:past] from comment #9)
> Comment 6 uses a different pattern than comment 0, since it deletes a
> variable local to a function. Did you try running it in the web console? It
> returns false:
> 
> function a(){var x=2;console.log(delete x);}; a()

Yes in console the code in comment6 returning true
//code in comment6
function a(){var x=2;console.log(delete x);}; a()
(In reply to g.sravan4u from comment #10)
> (In reply to Panos Astithas [:past] from comment #9)
> > Comment 6 uses a different pattern than comment 0, since it deletes a
> > variable local to a function. Did you try running it in the web console? It
> > returns false:
> > 
> > function a(){var x=2;console.log(delete x);}; a()
> 
> Yes in console the code in comment6 returning true
> //code in comment6
> function a(){var x=2;console.log(delete x);}; a()
//sorry mistake
UPDATE:RETURNING false
(In reply to g.sravan4u from comment #10)
> (In reply to Panos Astithas [:past] from comment #9)
> > Comment 6 uses a different pattern than comment 0, since it deletes a
> > variable local to a function. Did you try running it in the web console? It
> > returns false:
> > 
> > function a(){var x=2;console.log(delete x);}; a()
> 
> Yes in console the code in comment6 returning true
> //code in comment6
> function a(){var x=2;console.log(delete x);}; a()
//sorry mistake
UPDATE:RETURNING false in console
OK, so here is a page that demonstrates the difference between content and console:

http://htmlpad.org/delete-var/

Open the web console on it and then execute the following in the console:

var y = 1;
console.dir(Object.getOwnPropertyDescriptor(window, "y"));
console.log("delete y: " + (delete y));

It appears that the window property created using the console is configurable, whereas the one created in content is not. The same thing happens when running the code above as a watch expression in the debugger, so it seems that both Debugger.Frame.prototype.eval and Debugger.Object.prototype.evalInGlobalWithBindings behave the same.
Status: UNCONFIRMED → NEW
Ever confirmed: true
OS: Windows 7 → All
Hardware: x86 → All
OK, so I stepped down into where the property is defined.

We come in via DebuggerGenericEval which lands us in js::EvaluateInEnv, which eventually lands us in Interpret.  And then when we get to the JSOP_DEFVAR case, REGS.fp()->isEvalFrame() is true.

Now if that's true, the interpreter figures we're doing eval("var y").  And the spec says that in that case the property will be configurable (see ES 5 section 10.5 step 2 or ES6 section 18.2.1 where it passes "true" as the deletableBindings argument to "Script Evaluation").

So I guess the only question here is whether these debugger APIs want this eval behavior (as opposed to the behavior of running a new toplevel script?) and if so whether the console wants to be using these APIs.
Debugger.Frame.prototype.eval probably wants to behave like a direct eval in whatever kind of frame 'this' is.

Debugger.Object.prototype.evalInGlobal probably wants to behave like a top-level script.

The console uses one or the other, depending on whether the JS debugger has the debuggee paused or not.

I those (and their 'WithBindings' variants) are the only two ways to get to DebuggerGenericEval.
OK.

So right now js::EvaluateInEnv always calls setForEval(true) on the compile options.  Should we just pass through booleans from its callers indicating whether it should set true or false?
NI? Jim for comment 16.
Flags: needinfo?(jimb)
Wow, would that really work? If it's that easy, then it's definitely worth a try.
Flags: needinfo?(jimb)
Product: Firefox → DevTools
Executing `var x=2;delete x;` does return false now in the Web Console, not sure when this was fixed as the last comments are pretty old.
Status: NEW → RESOLVED
Closed: 11 years ago6 years ago
Resolution: --- → WORKSFORME
You need to log in before you can comment on or make changes to this bug.

Attachment

General

Creator:
Created:
Updated:
Size: