Commit aab95359 authored by ggaren@apple.com's avatar ggaren@apple.com

JavaScriptCore:

        Reviewed by Oliver Hunt.
        
        Fixed <rdar://problem/5665251> REGRESSION (r28880-r28886): Global
        variable access (16644)
        
        This bug was caused by var declarations shadowing built-in properties of
        the global object.
        
        To match Firefox, we've decided that var declarations will never shadow
        built-in properties of the global object or its prototypes. We used to
        behave more like IE, which allows shadowing, but walking that line got
        us into trouble with websites that sent us down the Firefox codepath.

        * kjs/JSVariableObject.h:
        (KJS::JSVariableObject::symbolTableGet): New code to support calling
        hasProperty before the variable object is fully initialized (so you
        can call it during initialization).

        * kjs/nodes.cpp:.
        (KJS::ProgramNode::initializeSymbolTable): Always do a full hasProperty
        check when looking for duplicates, not getDirect, since it only checks
        the property map, and not hasOwnProperty, since it doesn't check
        prototypes.
        (KJS::EvalNode::processDeclarations): ditto

        * kjs/property_slot.h:
        (KJS::PropertySlot::ungettableGetter): Best function name evar.

WebCore:

        Reviewed by Oliver Hunt.
        
        Fixed <rdar://problem/5665251> REGRESSION (r28880-r28886): Global
        variable access (16644)
        
        Removed the ReadOnly bit from some properties, to match Firefox. Also
        removed status-related setters, to allow using their names as variable
        names.
        
        * bindings/scripts/CodeGeneratorJS.pm: Added support for properties that
        are one-way across domain boundaries, to match Firefox.

        * bindings/js/kjs_window.cpp: Changed ReadOnly declarations to match FF.

        * bindings/scripts/CodeGeneratorJS.pm: Don't use JSObject:: because
        we don't know that JSObject is our base class.

        * page/DOMWindow.idl: Replaced lots of readonly declarations with
        [Replaceable] declarations.

        * page/DOMWindow.h: Removed interfaces for setting status text via the
        DOM. (They were getting in the way of, e.g., "var status"
        declarations.) By default, IE 7 and FF disable these interfaces in order
        to defend against phishing attacks that try to spoof domain names in the
        statusbar.
        * page/DOMWindow.cpp:

LayoutTests:

        Reviewed by Oliver Hunt.
        
        Fixed <rdar://problem/5665251> REGRESSION (r28880-r28886): Global
        variable access (16644)
        
        Added a test. Updated other tests to match new behavior.
        
        * fast/js/var-declarations-shadowing-expected.txt: Added.
        * fast/js/var-declarations-shadowing.html: Added.

        * fast/dom/HTMLScriptElement/script-load-events.html: Changed this test
        a bit because the original design made it hard to understand why it was failing.
        * fast/dom/HTMLScriptElement/script-load-events-expected.txt:
        
        * fast/dom/Window/get-set-properties.html: Changed this test to expect
        our new behavior, which matches Firefox.
        * fast/dom/Window/get-set-properties-expected.txt:

        * fast/dom/Window/window-property-shadowing.html: Removed some cases
        that differed from Firefox. 
        * fast/dom/Window/window-property-shadowing-expected.txt: 

        * http/tests/security/cross-frame-access-put-expected.txt: This test emits
        more "Unsafe JavaScript attempt" messages now because property sets that
        used to be prohibited (somewhat accidentally) by the ReadOnly attribute
        are now prohibited by security checks.



git-svn-id: http://svn.webkit.org/repository/webkit/trunk@29428 268f45cc-cd09-0410-ab3c-d52691b4dbfc
parent b16ec567
2008-01-11 Geoffrey Garen <ggaren@apple.com>
Reviewed by Oliver Hunt.
Fixed <rdar://problem/5665251> REGRESSION (r28880-r28886): Global
variable access (16644)
This bug was caused by var declarations shadowing built-in properties of
the global object.
To match Firefox, we've decided that var declarations will never shadow
built-in properties of the global object or its prototypes. We used to
behave more like IE, which allows shadowing, but walking that line got
us into trouble with websites that sent us down the Firefox codepath.
* kjs/JSVariableObject.h:
(KJS::JSVariableObject::symbolTableGet): New code to support calling
hasProperty before the variable object is fully initialized (so you
can call it during initialization).
* kjs/nodes.cpp:.
(KJS::ProgramNode::initializeSymbolTable): Always do a full hasProperty
check when looking for duplicates, not getDirect, since it only checks
the property map, and not hasOwnProperty, since it doesn't check
prototypes.
(KJS::EvalNode::processDeclarations): ditto
* kjs/property_slot.h:
(KJS::PropertySlot::ungettableGetter): Best function name evar.
2008-01-11 Cameron Zwarich <cwzwarich@uwaterloo.ca>
Reviewed by Maciej.
......
......@@ -91,6 +91,18 @@ namespace KJS {
{
size_t index = symbolTable().get(propertyName.ustring().rep());
if (index != missingSymbolMarker()) {
#ifndef NDEBUG
// During initialization, the variable object needs to advertise that it has certain
// properties, even if they're not ready for access yet. This check verifies that
// no one tries to access such a property.
// In a release build, we optimize this check away and just return an invalid pointer.
// There's no harm in an invalid pointer, since no one dereferences it.
if (index >= d->localStorage.size()) {
slot.setUngettable(this);
return true;
}
#endif
slot.setValueSlot(this, &d->localStorage[index].value);
return true;
}
......
......@@ -4326,7 +4326,7 @@ void ProgramNode::initializeSymbolTable(ExecState* exec)
m_varIndexes.resize(size);
for (size_t i = 0; i < size; ++i) {
const Identifier& ident = m_varStack[i].first;
if (variableObject->getDirect(ident)) {
if (variableObject->hasProperty(exec, ident)) {
m_varIndexes[i] = missingSymbolMarker(); // Signal not to initialize this declaration.
continue;
}
......@@ -4474,7 +4474,7 @@ void EvalNode::processDeclarations(ExecState* exec)
for (i = 0, size = m_varStack.size(); i < size; ++i) {
Identifier& ident = m_varStack[i].first;
bool isConstant = m_varStack[i].second & DeclarationStacks::IsConstant;
if (variableObject->hasOwnProperty(exec, ident))
if (variableObject->hasProperty(exec, ident))
continue;
int attributes = minAttributes;
if (isConstant)
......
......@@ -32,6 +32,12 @@ JSValue *PropertySlot::undefinedGetter(ExecState*, JSObject*, const Identifier&,
return jsUndefined();
}
JSValue* PropertySlot::ungettableGetter(ExecState*, JSObject*, const Identifier&, const PropertySlot&)
{
ASSERT_NOT_REACHED();
return jsUndefined();
}
JSValue *PropertySlot::functionGetter(ExecState* exec, JSObject* originalObject, const Identifier&, const PropertySlot& slot)
{
return slot.m_data.getterFunc->call(exec, originalObject, exec->emptyList());
......
......@@ -109,6 +109,12 @@ public:
m_getValue = undefinedGetter;
}
void setUngettable(JSObject* slotBase) // Used to signal that you have a property, but trying to get it at this time is an error.
{
m_slotBase = slotBase;
m_getValue = ungettableGetter;
}
JSObject* slotBase() const { return m_slotBase; }
const HashEntry* staticEntry() const { return m_data.staticEntry; }
......@@ -116,6 +122,7 @@ public:
private:
static JSValue* undefinedGetter(ExecState*, JSObject*, const Identifier&, const PropertySlot&);
static JSValue* ungettableGetter(ExecState*, JSObject*, const Identifier&, const PropertySlot&);
static JSValue* functionGetter(ExecState*, JSObject*, const Identifier&, const PropertySlot&);
GetValueFunc m_getValue;
......
2008-01-11 Geoffrey Garen <ggaren@apple.com>
Reviewed by Oliver Hunt.
Fixed <rdar://problem/5665251> REGRESSION (r28880-r28886): Global
variable access (16644)
Added a test. Updated other tests to match new behavior.
* fast/js/var-declarations-shadowing-expected.txt: Added.
* fast/js/var-declarations-shadowing.html: Added.
* fast/dom/HTMLScriptElement/script-load-events.html: Changed this test
a bit because the original design made it hard to understand why it was failing.
* fast/dom/HTMLScriptElement/script-load-events-expected.txt:
* fast/dom/Window/get-set-properties.html: Changed this test to expect
our new behavior, which matches Firefox.
* fast/dom/Window/get-set-properties-expected.txt:
* fast/dom/Window/window-property-shadowing.html: Removed some cases
that differed from Firefox.
* fast/dom/Window/window-property-shadowing-expected.txt:
* http/tests/security/cross-frame-access-put-expected.txt: This test emits
more "Unsafe JavaScript attempt" messages now because property sets that
used to be prohibited (somewhat accidentally) by the ReadOnly attribute
are now prohibited by security checks.
2008-01-11 Anyang Ren <anyang.ren@gmail.com>
Reviewed by Darin Adler.
......
This tests for regressions against http://bugzilla.opendarwin.org/show_bug.cgi?id=5812 Generate load events for <script> elements.
Test result: PASS
PASS
......@@ -6,60 +6,70 @@ var status = new Array();
function loaded(i)
{
status[i-1] = "L";
status[i] = "L";
}
function erred(i)
{
status[i-1] = "E";
status[i] = "E";
}
function endTest()
{
var failures = "";
if (status[0] != "E")
failures += "0 ";
if (status[1] != "E")
failures += "1 ";
if (status[2] != "L")
failures += "2 ";
if (status[3] != "L")
failures += "3 ";
if (status[4] != "L")
failures += "4 ";
if (status[5] != "L")
failures += "5 ";
var results = document.getElementById("results");
if (status[0]=="E" &&
status[1]=="E" &&
status[2]=="L" &&
status[3]=="L" &&
status[4]=="L" &&
status[5]=="L")
results.innerText = "PASS";
if (failures)
results.innerHTML = "FAIL: The following tests failed: " + failures;
else
results.innerText = "FAIL: " + status;
}
results.innerHTML = "PASS";
function loaded6()
{
loaded(6);
endTest();
if (window.layoutTestController)
layoutTestController.notifyDone();
}
function test()
{
if (window.layoutTestController)
if (window.layoutTestController) {
layoutTestController.dumpAsText();
var e = document.createElement( "script" ) ;
e.type = "text/javascript" ;
document.getElementsByTagName("head")[0].appendChild( e ) ;
e.onload = loaded6;
endTest(); // called here in case the load even doesn't fire
e.src = 'resources/script-load.js' ;
layoutTestController.waitUntilDone();
}
var e = document.createElement("script");
e.type = "text/javascript";
e.src = 'resources/script-load.js';
e.onload = function() {
loaded(5);
endTest();
};
document.getElementsByTagName("head")[0].appendChild( e );
}
</script>
</head>
<body onload="test()">
<script type="text/javascript" onload="loaded(0)" onerror="erred(0)" src="resources/certainlydoesnotexist.js"></script>
<script type="text/javascript" onload="loaded(1)" onerror="erred(1)" src="resources/certainlydoesnotexist.js"></script>
<script type="text/javascript" onload="loaded(2)" onerror="erred(2)" src="resources/certainlydoesnotexist.js"></script>
<script type="text/javascript" onload="loaded(2)" onerror="erred(2)" src="resources/script-load.js"></script>
<script type="text/javascript" onload="loaded(3)" onerror="erred(3)" src="resources/script-load.js"></script>
<script type="text/javascript" onload="loaded(4)" onerror="erred(4)" src="resources/script-load.js"></script>
<script type="text/javascript">
document.write('<script type="text/javascript" onload="loaded(5)" onerror="erred(5)" src="resources/script-load.js"></script'+'>');
document.write('<script type="text/javascript" onload="loaded(4)" onerror="erred(4)" src="resources/script-load.js"></script'+'>');
</script>
This tests for regressions against <i><a href="http://bugzilla.opendarwin.org/show_bug.cgi?id=5812">http://bugzilla.opendarwin.org/show_bug.cgi?id=5812</a>
Generate load events for &lt;script&gt; elements</i>.
<hr>
<p>Test result: <span id="results"></span></p>
<p id="results">FAIL: Test never finished.</p>
</body>
</html>
<p>Tests getting and setting window properties and functions.</p>
<p>This page tests getting and setting window properties and functions.</p>
<pre id="console"></pre>
<script>
......@@ -57,46 +57,37 @@ function canSet(keyPath)
}
var windowReadWriteProperties = [
"addEventListener",
"alert",
"atob",
"Attr",
"btoa",
"captureEvents",
"CDATASection",
"CharacterData",
"clearInterval",
"clearTimeout",
"Comment",
"console",
"CSSPrimitiveValue",
"CSSRule",
"CSSStyleDeclaration",
"CSSValue",
"Document",
"DocumentFragment",
"DocumentType",
"CharacterData",
"Comment",
"DOMException",
"DOMImplementation",
"DOMParser",
"Document",
"DocumentFragment",
"DocumentType",
"Element",
"Entity",
"EntityReference",
"EvalError",
"Event",
"event",
"HTMLAnchorElement",
"HTMLAppletElement",
"HTMLAreaElement",
"HTMLBRElement",
"HTMLBaseElement",
"HTMLBaseFontElement",
"HTMLBodyElement",
"HTMLBRElement",
"HTMLButtonElement",
"HTMLCanvasElement",
"HTMLDListElement",
"HTMLDirectoryElement",
"HTMLDivElement",
"HTMLDListElement",
"HTMLDocument",
"HTMLElement",
"HTMLFieldSetElement",
......@@ -104,17 +95,17 @@ var windowReadWriteProperties = [
"HTMLFormElement",
"HTMLFrameElement",
"HTMLFrameSetElement",
"HTMLHRElement",
"HTMLHeadElement",
"HTMLHeadingElement",
"HTMLHRElement",
"HTMLHtmlElement",
"HTMLIFrameElement",
"HTMLImageElement",
"HTMLInputElement",
"HTMLIsIndexElement",
"HTMLLIElement",
"HTMLLabelElement",
"HTMLLegendElement",
"HTMLLIElement",
"HTMLLinkElement",
"HTMLMapElement",
"HTMLMarqueeElement",
......@@ -161,45 +152,54 @@ var windowReadWriteProperties = [
"XPathEvaluator",
"XPathResult",
"XSLTProcessor",
];
var windowReadOnlyProperties = [
"addEventListener",
"alert",
"atob",
"btoa",
"captureEvents",
"clearInterval",
"clearTimeout",
"clientInformation",
"closed",
"console",
"defaultStatus",
"defaultstatus",
"devicePixelRatio",
"document",
"event",
"frames",
"history",
"innerHeight",
"innerWidth",
"length",
"locationbar",
"menubar",
"name",
"navigator",
"offscreenBuffering",
"opener",
"outerHeight",
"outerWidth",
"pageXOffset",
"pageYOffset",
"parent",
"personalbar",
"screen",
"screenLeft",
"screenTop",
"screenX",
"screenY",
"scrollbars",
"scrollX",
"scrollY",
"scrollbars",
"self",
"status",
"statusbar",
"toolbar",
"top",
"top"
];
var windowReadOnlyProperties = [
"closed",
"document",
"history",
"name",
"pageXOffset",
"pageYOffset",
"screen",
"window"
];
......@@ -276,7 +276,7 @@ window.onload = function()
shouldBeFalse("canSet('" + property + "')");
}
log("\n----- tests for getting/setting function -----\n");
log("\n----- tests for getting/setting functions -----\n");
for (var i = 0; i < windowFunctions.length; i++) { //>
var property = windowFunctions[i];
......
PASS: screen successfully shadowed
PASS: history successfully shadowed
PASS: locationbar successfully shadowed
PASS: menubar successfully shadowed
PASS: personalbar successfully shadowed
PASS: statusbar successfully shadowed
PASS: toolbar successfully shadowed
PASS: devicePixelRatio successfully shadowed
PASS: closed successfully shadowed
PASS: crypto successfully shadowed
PASS: defaultStatus successfully shadowed
PASS: defaultstatus successfully shadowed
PASS: status successfully shadowed
......@@ -18,14 +14,11 @@ PASS: innerWidth successfully shadowed
PASS: length successfully shadowed
PASS: name successfully shadowed
PASS: navigator successfully shadowed
PASS: location successfully shadowed
PASS: clientInformation successfully shadowed
PASS: offscreenBuffering successfully shadowed
PASS: opener successfully shadowed
PASS: outerHeight successfully shadowed
PASS: outerWidth successfully shadowed
PASS: pageXOffset successfully shadowed
PASS: pageYOffset successfully shadowed
PASS: parent successfully shadowed
PASS: screenX successfully shadowed
PASS: screenY successfully shadowed
......@@ -35,33 +28,6 @@ PASS: scrollX successfully shadowed
PASS: scrollY successfully shadowed
PASS: self successfully shadowed
PASS: top successfully shadowed
PASS: onabort successfully shadowed
PASS: onblur successfully shadowed
PASS: onchange successfully shadowed
PASS: onclick successfully shadowed
PASS: ondblclick successfully shadowed
PASS: onerror successfully shadowed
PASS: onfocus successfully shadowed
PASS: onkeydown successfully shadowed
PASS: onkeypress successfully shadowed
PASS: onkeyup successfully shadowed
PASS: onload successfully shadowed
PASS: onmousedown successfully shadowed
PASS: onmousemove successfully shadowed
PASS: onmouseout successfully shadowed
PASS: onmouseover successfully shadowed
PASS: onmouseup successfully shadowed
PASS: onmousewheel successfully shadowed
PASS: onreset successfully shadowed
PASS: onresize successfully shadowed
PASS: onscroll successfully shadowed
PASS: onsearch successfully shadowed
PASS: onselect successfully shadowed
PASS: onsubmit successfully shadowed
PASS: onunload successfully shadowed
PASS: onbeforeunload successfully shadowed
PASS: frameElement successfully shadowed
PASS: window successfully shadowed
PASS: getSelection successfully shadowed
PASS: getComputedStyle successfully shadowed
PASS: getMatchedCSSRules successfully shadowed
......
......@@ -15,10 +15,6 @@
layoutTestController.dumpAsText();
// Window Attributes
var screen = 1;
log(screen == 1 ? "PASS: screen successfully shadowed" : "FAIL: screen was not shadowed");
var history = 1;
log(history == 1 ? "PASS: history successfully shadowed" : "FAIL: history was not shadowed");
var locationbar = 1;
log(locationbar == 1 ? "PASS: locationbar successfully shadowed" : "FAIL: locationbar was not shadowed");
var menubar = 1;
......@@ -31,10 +27,6 @@
log(toolbar == 1 ? "PASS: toolbar successfully shadowed" : "FAIL: toolbar was not shadowed");
var devicePixelRatio = 1;
log(devicePixelRatio == 1 ? "PASS: devicePixelRatio successfully shadowed" : "FAIL: devicePixelRatio was not shadowed");
var closed = 1;
log(closed == 1 ? "PASS: closed successfully shadowed" : "FAIL: closed was not shadowed");
var crypto = 1;
log(crypto == 1 ? "PASS: crypto successfully shadowed" : "FAIL: crypto was not shadowed");
var defaultStatus = 1;
log(defaultStatus == 1 ? "PASS: defaultStatus successfully shadowed" : "FAIL: defaultStatus was not shadowed");
var defaultstatus = 1;
......@@ -55,8 +47,6 @@
log(name == 1 ? "PASS: name successfully shadowed" : "FAIL: name was not shadowed");
var navigator = 1;
log(navigator == 1 ? "PASS: navigator successfully shadowed" : "FAIL: navigator was not shadowed");
var location = 1;
log(location == 1 ? "PASS: location successfully shadowed" : "FAIL: location was not shadowed");
var clientInformation = 1;
log(clientInformation == 1 ? "PASS: clientInformation successfully shadowed" : "FAIL: clientInformation was not shadowed");
var offscreenBuffering = 1;
......@@ -67,10 +57,6 @@
log(outerHeight == 1 ? "PASS: outerHeight successfully shadowed" : "FAIL: outerHeight was not shadowed");
var outerWidth = 1;
log(outerWidth == 1 ? "PASS: outerWidth successfully shadowed" : "FAIL: outerWidth was not shadowed");
var pageXOffset = 1;
log(pageXOffset == 1 ? "PASS: pageXOffset successfully shadowed" : "FAIL: pageXOffset was not shadowed");
var pageYOffset = 1;
log(pageYOffset == 1 ? "PASS: pageYOffset successfully shadowed" : "FAIL: pageYOffset was not shadowed");
var parent = 1;
log(parent == 1 ? "PASS: parent successfully shadowed" : "FAIL: parent was not shadowed");
var screenX = 1;
......@@ -89,60 +75,6 @@
log(self == 1 ? "PASS: self successfully shadowed" : "FAIL: self was not shadowed");
var top = 1;
log(top == 1 ? "PASS: top successfully shadowed" : "FAIL: top was not shadowed");
var onabort = 1;
log(onabort == 1 ? "PASS: onabort successfully shadowed" : "FAIL: onabort was not shadowed");
var onblur = 1;
log(onblur == 1 ? "PASS: onblur successfully shadowed" : "FAIL: onblur was not shadowed");
var onchange = 1;
log(onchange == 1 ? "PASS: onchange successfully shadowed" : "FAIL: onchange was not shadowed");
var onclick = 1;
log(onclick == 1 ? "PASS: onclick successfully shadowed" : "FAIL: onclick was not shadowed");
var ondblclick = 1;
log(ondblclick == 1 ? "PASS: ondblclick successfully shadowed" : "FAIL: ondblclick was not shadowed");
var onerror = 1;
log(onerror == 1 ? "PASS: onerror successfully shadowed" : "FAIL: onerror was not shadowed");
var onfocus = 1;
log(onfocus == 1 ? "PASS: onfocus successfully shadowed" : "FAIL: onfocus was not shadowed");
var onkeydown = 1;
log(onkeydown == 1 ? "PASS: onkeydown successfully shadowed" : "FAIL: onkeydown was not shadowed");
var onkeypress = 1;
log(onkeypress == 1 ? "PASS: onkeypress successfully shadowed" : "FAIL: onkeypress was not shadowed");
var onkeyup = 1;
log(onkeyup == 1 ? "PASS: onkeyup successfully shadowed" : "FAIL: onkeyup was not shadowed");
var onload = 1;
log(onload == 1 ? "PASS: onload successfully shadowed" : "FAIL: onload was not shadowed");
var onmousedown = 1;
log(onmousedown == 1 ? "PASS: onmousedown successfully shadowed" : "FAIL: onmousedown was not shadowed");
var onmousemove = 1;
log(onmousemove == 1 ? "PASS: onmousemove successfully shadowed" : "FAIL: onmousemove was not shadowed");
var onmouseout = 1;
log(onmouseout == 1 ? "PASS: onmouseout successfully shadowed" : "FAIL: onmouseout was not shadowed");
var onmouseover = 1;
log(onmouseover == 1 ? "PASS: onmouseover successfully shadowed" : "FAIL: onmouseover was not shadowed");
var onmouseup = 1;
log(onmouseup == 1 ? "PASS: onmouseup successfully shadowed" : "FAIL: onmouseup was not shadowed");
var onmousewheel = 1;
log(onmousewheel == 1 ? "PASS: onmousewheel successfully shadowed" : "FAIL: onmousewheel was not shadowed");
var onreset = 1;
log(onreset == 1 ? "PASS: onreset successfully shadowed" : "FAIL: onreset was not shadowed");
var onresize = 1;
log(onresize == 1 ? "PASS: onresize successfully shadowed" : "FAIL: onresize was not shadowed");
var onscroll = 1;
log(onscroll == 1 ? "PASS: onscroll successfully shadowed" : "FAIL: onscroll was not shadowed");
var onsearch = 1;
log(onsearch == 1 ? "PASS: onsearch successfully shadowed" : "FAIL: onsearch was not shadowed");
var onselect = 1;
log(onselect == 1 ? "PASS: onselect successfully shadowed" : "FAIL: onselect was not shadowed");
var onsubmit = 1;
log(onsubmit == 1 ? "PASS: onsubmit successfully shadowed" : "FAIL: onsubmit was not shadowed");
var onunload = 1;
log(onunload == 1 ? "PASS: onunload successfully shadowed" : "FAIL: onunload was not shadowed");
var onbeforeunload = 1;
log(onbeforeunload == 1 ? "PASS: onbeforeunload successfully shadowed" : "FAIL: onbeforeunload was not shadowed");
var frameElement = 1;
log(frameElement == 1 ? "PASS: frameElement successfully shadowed" : "FAIL: frameElement was not shadowed");
var window = 1;
log(window == 1 ? "PASS: window successfully shadowed" : "FAIL: window was not shadowed");
// Window functions
var getSelection = 1;
......
This page tests var declarations that attempt to shadow interesting global properties in interesting ways. Bug 16644.
If the test passes, you'll see a series of PASS messages below.
PASS: Node == undefined should be false and is.
PASS: eval('Node == undefined') should be false and is.
PASS: Element == undefined should be false and is.
PASS: eval('Element == undefined') should be false and is.
PASS: toString == undefined should be false and is.
PASS: eval('toString == undefined') should be false and is.
PASS: valueOf == undefined should be false and is.
PASS: eval('valueOf == undefined') should be false and is.
-----
PASS: HTMLElement == marker should be true and is.
PASS: eval('HTMLElement == marker') should be true and is.
PASS: HTMLLinkElement == marker should be true and is.
PASS: eval('HTMLLinkElement == marker') should be true and is.
PASS: moveBy == marker should be true and is.
PASS: eval('moveBy == marker') should be true and is.
PASS: find == marker should be true and is.
PASS: eval('find == marker') should be true and is.
-----
PASS: locationbar == marker should be true and is.
PASS: eval('locationbar == marker') should be true and is.
PASS: menubar == marker should be true and is.
PASS: eval('menubar == marker') should be true and is.
PASS: personalbar == marker should be true and is.
PASS: eval('personalbar == marker') should be true and is.
PASS: scrollbars == marker should be true and is.
PASS: eval('scrollbars == marker') should be true and is.
PASS: statusbar == marker should be true and is.
PASS: eval('statusbar == marker') should be true and is.
PASS: toolbar == marker should be true and is.
PASS: eval('toolbar == marker') should be true and is.
PASS: offscreenBuffering == marker should be true and is.
PASS: eval('offscreenBuffering == marker') should be true and is.
PASS: outerHeight == marker should be true and is.
PASS: eval('outerHeight == marker') should be true and is.
PASS: outerWidth == marker should be true and is.
PASS: eval('outerWidth == marker') should be true and is.
PASS: innerHeight == marker should be true and is.
PASS: eval('innerHeight == marker') should be true and is.
PASS: innerWidth == marker should be true and is.
PASS: eval('innerWidth == marker') should be true and is.
PASS: screenX == marker should be true and is.
PASS: eval('screenX == marker') should be true and is.
PASS: screenY == marker should be true and is.
PASS: eval('screenY == marker') should be true and is.
PASS: screenLeft == marker should be true and is.
PASS: eval('screenLeft == marker') should be true and is.
PASS: screenTop == marker should be true and is.
PASS: eval('screenTop == marker') should be true and is.
PASS: scrollX == marker should be true and is.
PASS: eval('scrollX == marker') should be true and is.
PASS: scrollY == marker should be true and is.
PASS: eval('scrollY == marker') should be true and is.
PASS: length == marker should be true and is.
PASS: eval('length == marker') should be true and is.
PASS: self == marker should be true and is.
PASS: eval('self == marker') should be true and is.
PASS: frames == marker should be true and is.
PASS: eval('frames == marker') should be true and is.
PASS: opener == marker should be true and is.
PASS: eval('opener == marker') should be true and is.
PASS: parent == marker should be true and is.
PASS: eval('parent == marker') should be true and is.
PASS: top == marker should be true and is.
PASS: eval('top == marker') should be true and is.
PASS: devicePixelRatio == marker should be true and is.
PASS: eval('devicePixelRatio == marker') should be true and is.
PASS: devicePixelRatio == marker should be true and is.
PASS: eval('devicePixelRatio == marker') should be true and is.
PASS: navigator == marker should be true and is.
PASS: eval('navigator == marker') should be true and is.
PASS: clientInformation == marker should be true and is.
PASS: eval('clientInformation == marker') should be true and is.
PASS: status == marker should be true and is.
PASS: eval('status == marker') should be true and is.
PASS: defaultStatus == marker should be true and is.
PASS: eval('defaultStatus == marker') should be true and is.
PASS: defaultstatus == marker should be true and is.
PASS: eval('defaultstatus == marker') should be true and is.
-----
PASS: screen == marker should be false and is.
PASS: eval('screen == marker') should be false and is.
PASS: history == marker should be false and is.
PASS: eval('history == marker') should be false and is.
PASS: frameElement == marker should be false and is.
PASS: eval('frameElement == marker') should be false and is.