Closed
Bug 121804
Opened 23 years ago
Closed 23 years ago
JS Variables defined on external JS file cannot be used
Categories
(SeaMonkey :: General, defect)
Tracking
(Not tracked)
VERIFIED
INVALID
People
(Reporter: vicentesalvador, Assigned: asa)
Details
(Whiteboard: [js1.2])
Variables declared on an imported JS file; <script src='test.js'> </script> are
undefined inside the main document.
This is the test case:
test.html
<html>
<head>
<script src='test.js'> </script>
</head>
<body>
hello, an alert with the a variable value should appear...
<script>
alert("m_attributes: " + a);
</script>
</body>
</html>
test.js
a = "12";
The script throws an error because variable a is undefined !!!!
Reporter | ||
Comment 1•23 years ago
|
||
Openning directly the file test.js show me garbage...
▀*яPrttTр╢ФБJT╟UP24R╡ФJ+мK.илоSхHмиивпT╗VЮБ,J-)-йSP▀)$'ФД╓╕ХвZs
Reporter | ||
Comment 2•23 years ago
|
||
This is really a bad issue. After more investigation. I've seen that the sample
code is functional.
The problem is when opening a HTML page importing a lot of JS. Each JS files has
relationships on others because on one file is defined some objects and on
others are defined variables with this object definition.
This complex sample works fine when executed from filesystem files but fails if
executed from a HTTP server.
It seems to be an JS synchonism issue. What can I do to give you more info???
Comment 3•23 years ago
|
||
This is not going to be a problem with the JS Engine itself, but
how external JS files are loaded by the browser. Reassigning to
Browser-General until we can get further information.
Assignee: rogerl → asa
Component: JavaScript Engine → Browser-General
QA Contact: pschwartau → doronr
Comment 4•23 years ago
|
||
Vicente, what URL is not working for you? Could you paste it
in the URL field above? Thanks -
Note: as Vicente says, the reduced testcase in the bug report above
works fine in Mozilla. It's only in certain situations that we see
this bug. I'm pretty sure this is a duplicate of bug 118404,
"External JS files not loading; fixed by making new Profile".
I will mark this as a duplicate and ask Vincente to verify.
Vicente, could you could you try the URL with a new profile?
To do this, launch Mozilla from the command line as follows:
[(path to Mozilla)] ./mozilla.exe -profilemanager
When the Profile Manager comes up, there's a button called "Create Profile".
If that works, you can mark this bug "Verified" as a Duplicate. If it
doesn't work, you can reopen it; thanks.
Vicente: note, you will be cc'ed on bug 118404 so you can follow
its progress -
*** This bug has been marked as a duplicate of 118404 ***
Status: UNCONFIRMED → RESOLVED
Closed: 23 years ago
Resolution: --- → DUPLICATE
Reporter | ||
Comment 5•23 years ago
|
||
I've tested it with a new profile and the problem remains.
I'm trying to create a testcase becasue the URL with the problem is
user-password protected. I've isolated the page with a Page "Save As", putted it
inside the Web Server and loaded and IT WORKS!!!.
So, it seems to be a delay problem when the HTTP server send a external JS that
is generated dinamically by the server.
I'm going to Reopen the bug. If you contact me, I can give you a user-password
to test. I cannot publish here this data for security reasons!!!
Status: RESOLVED → UNCONFIRMED
Resolution: DUPLICATE → ---
Reporter | ||
Comment 6•23 years ago
|
||
OK, I've got it!!! But it's still hard to reproduce. I can give some tips and
request you some help.
I've this command inside the html code:
<script type="text/javascript" language="javascript1.2"
src="/servlet/jrep_js?code=capuntes&lang=en&dbms=demo_sports1"></script>
This is a dynamic generated javascript, but the server redirects this URL to
/servlet/jrep_js?code=capuntes&lang=en&dbms=demo_sports1/user=vsc and the code
sended by the server is not evaluated. This works fine on NS4 and IE.
This is the WebServer Log:
192.168.10.181 - vsc [28/Jan/2002:10:56:30 1000] "GET
/servlet/jrep_js?code=wic_jdic_lbldata&lang=en&dbms=wic_icon HTTP/1.1" 302 654
192.168.10.181 - vsc [28/Jan/2002:10:56:30 1000] "GET
/servlet/jrep_js?code=wic_jdic_lbldata&lang=en&dbms=wic_icon&user=vsc HTTP/1.1"
200 215
Comment 7•23 years ago
|
||
Confirming bug by using private userid/password. The site loads fine
in NN4.7, but in Mozilla we get a series of alertboxes like:
WARNING: field attribute not found in setFieldNoentry('gcompedh.dtogen')
From http://www.mydeister.com/coreutils/jscript/jsql.js:
// ==========================================================
// setFieldNoentry
//
// Cambia el estado NOENTRY de un campo
// ==========================================================
function setFieldNoentry(name, value)
{
var field = getFieldByName(name);
if (field) {
var attr = __getColumnAttribute(name);
if (attr != null)
attr.isNoentrySoft = value;
else
alert("WARNING: field attribute not found in setFieldNoentry('" + name +
etc.
}
where we have:
function __getColumnAttribute(name)
{
if (m_ColumnAttributes)
{
var attr = m_ColumnAttributes[name];
if (attr) {
if (attr.isValid)
return attr;
}
}
// Not found ot not valid
return null;
}
The problem is that in Mozilla, we are falling into the "Not found"
case of this function. By looking at this in the Mozilla JS Debugger,
(Tasks > Tools > JavaScript Debugger), I could see that the variable
m_ColumnAttributes is of type Array, but it is evaluating in Mozilla
to an empty array : [ ]. The logic check
if (m_ColumnAttributes)
is equivalent to
if (m_ColumnAttributes.toString())
Since m_ColumnAttributes is an empty array, m_ColumnAttributes.toString()
is the empty string, and so the if-condition evaluates to false.
Hence __getColumnAttribute() returns null, hence the alertboxes...
Status: UNCONFIRMED → NEW
Ever confirmed: true
Comment 8•23 years ago
|
||
Notes:
1. After all the alertboxes, the site seems to look the same as
in NN4.7, and I see no errors in the Mozilla JavaScript Console
2. In NN4.7, there ARE two errors in the JavaScript Console:
Javascript Error:
http://www.mydeister.com/servlet/jrep_js?code=gcompedh&lang=en&dbms=demo_sports1
Line 1: illegal character
JavaScript Error:
http://www.mydeister.com/coreutils/jscript/jsql.js
line 1679: m_ColumnAttributes is not defined.
3. Vicente informs me that the array variable m_ColumnAttributes
is set in the servlet:
http://www.mydeister.com/servlet/jrep_js?code=gcompedh&lang=en&dbms=demo_sports1
&user=mozilla
Comment 9•23 years ago
|
||
I think I've figured this out. Here is the result of using
javascript: URLS to debug the site, both in IE6 and Mozilla:
IE6 MOZILLA
javascript:alert(m_ColumnAttributes)
(empty alertbox) (empty alertbox)
javascript:alert(m_ColumnAttributes instanceof Array)
true true
javascript:alert(m_ColumnAttributes.length)
0 0
javascript:alert(m_ColumnAttributes.toString() === "")
true true
javascript:if (m_ColumnAttributes.length) {alert('TRUE')} else {alert('FALSE')};
FALSE FALSE
javascript:if (m_ColumnAttributes.toString()) {alert('TRUE')} else
{alert('FALSE')};
FALSE FALSE
javascript:if (m_ColumnAttributes) {alert('TRUE')} else {alert('FALSE')};
TRUE FALSE or TRUE!!!
We see that Mozilla and IE6 both recognize m_ColumnAttributes
as an Array object, both agree that is is empty; i.e. has length 0,
and both agree that m_ColumnAttributes.toString() is the empty string.
However, there is a disagreement on evaluating | if (m_ColumnAttributes) |
IE6 evaluates this as true; Mozilla evaluates it as false or true,
depending on which version of JavaScript the developer is using!!!
The behavior of this changed in versions of JavaScript later than 1.2.
In comment # 7 above, when I said:
The logic check
if (m_ColumnAttributes)
is equivalent to
if (m_ColumnAttributes.toString())
is not generally correct. That is what happens in version 1.2 of the
Mozilla/Netscape implementation of JavaScript. In all later versions,
what I said is not correct, and an empty array will evaluate to true.
So the website must be using, I think
<SCRIPT language="JavaScript1.2"> or something similar.
Thus I have to mark this bug as invalid. The site is very well-designed,
but one should use <SCRIPT language="JavaScript"> to get the current
implementation of the language.
Status: NEW → RESOLVED
Closed: 23 years ago → 23 years ago
Resolution: --- → INVALID
Comment 10•23 years ago
|
||
Marking Verified. Here is an example from the Mozilla standalone
JS shell. You can make a similar HTML example by making a page
with this code inside a tag <SCRIPT language="JavaScript1.2">
then inside a tag <SCRIPT language="JavaScript1.3">, etc. etc.
// make an empty array
js> var arr = []; // or do var arr = new Array();
js> version(120); // don't try this in the browser, use <SCRIPT> versioning
120
js> if (arr) {print('TRUE')} else {print('FALSE')}
FALSE
js> version(130);
130
js> if (arr) {print('TRUE')} else {print('FALSE')}
TRUE
js> version(140);
140
js> if (arr) {print('TRUE')} else {print('FALSE')}
TRUE
js> version(150);
150
js> if (arr) {print('TRUE')} else {print('FALSE')}
TRUE
Status: RESOLVED → VERIFIED
Comment 11•23 years ago
|
||
Confirming my theory; from the site's HTML:
<head>
<title>PURCHASE ORDERS (demo_sports1)</title>
etc.
<script TYPE='text/javascript' LANGUAGE='javascript1.2'
SRC='/coreutils/jscript/load.js'></SCRIPT>
<script TYPE='text/javascript' LANGUAGE='javascript1.2'>
setBrowserStatus('en', 9);
</SCRIPT>
<script TYPE='text/javascript' LANGUAGE='javascript1.2'
SRC='/coreutils/jscript/userfunc.js'></SCRIPT>
<script TYPE='text/javascript' LANGUAGE='javascript1.2'
SRC='/coreutils/jscript/locale.js'></SCRIPT>
<script TYPE='text/javascript' LANGUAGE='javascript1.2'
SRC='/coreutils/jscript/jrep_messages.js'></SCRIPT>
<script TYPE='text/javascript' LANGUAGE='javascript1.2'
SRC='/coreutils/jscript/hide.js'></SCRIPT>
<script TYPE='text/javascript' LANGUAGE='javascript1.2'
SRC='/coreutils/jscript/form.js'></SCRIPT>
<script TYPE='text/javascript' LANGUAGE='javascript1.2'
SRC='/coreutils/jscript/head.js'></SCRIPT>
<script TYPE='text/javascript' LANGUAGE='javascript1.2'
SRC='/coreutils/jscript/head0.js'></SCRIPT>
<script TYPE='text/javascript' LANGUAGE='javascript1.2'
SRC='/coreutils/jscript/jsqlglo.js'></SCRIPT>
<script TYPE='text/javascript' LANGUAGE='javascript1.2'
SRC='/coreutils/jscript/jsql.js'></SCRIPT>
<script TYPE='text/javascript' LANGUAGE='javascript1.2'>
Comment 12•23 years ago
|
||
Better explanation: the comment by me in Comment #7 is INCORRECT
IN ALL VERSIONS of the Netscape/Mozilla implementation of JS:
The logic check
if (m_ColumnAttributes)
is equivalent to
if (m_ColumnAttributes.toString())
These are NOT equivalent in ANY version of JS. What changed
between versions is the behavior of Boolean() on an empty array:
In JS1.2, an empty array has a NON-empty toString(): [].toString() == "[]"
In JS1.2, however, Boolean([]) == false
In JS1.3++, an empty array has an EMPTY toString() : [].toString() == ""
In JS1.3++, however, Boolean([]) == true
Here is a sample from the standalone JS shell:
js> version(120);
120
js> var arr1 = [ ];
js> var arr2 = new Array();
js> arr1.toString();
[ ]
js> arr2.toString();
[ ]
js> Boolean(arr1.toString());
true
js> Boolean(arr1);
false
js> Boolean(arr2.toString());
true
js> Boolean(arr2);
false
--------------------------------------------------------------------------
--------------------------------------------------------------------------
js> version(150);
150
js> var arr1 = [ ];
js> var arr2 = new Array();
js> arr1.toString();
<--- the empty string
js> arr2.toString();
<--- the empty string
js> Boolean(arr1.toString());
false
js> Boolean(arr1);
true
js> Boolean(arr2.toString());
false
js> Boolean(arr2);
true
Updated•20 years ago
|
Whiteboard: [js1.2]
Updated•20 years ago
|
Product: Browser → Seamonkey
You need to log in
before you can comment on or make changes to this bug.
Description
•