Issue #1257 - Part 3: Remove/update tests.

This removes a ton of tests that are no longer relevant with (un)watch
removed (e.g. testing stability/bugs in the watchpoint system itself
which has never been the most stable), and updates others that would
previously rely on watch/unwatch, so that they don't unexpectedly fail.
This commit is contained in:
wolfbeast 2019-10-27 02:14:16 +01:00 committed by Roy Tam
commit 3d8d9f95df
141 changed files with 34 additions and 2940 deletions

View file

@ -38,24 +38,5 @@ assertEq(delete a[0], false);
assertArrayIsExpected();
var watchpointCalled = false;
// NOTE: Be careful with the position of this test, since this sparsifies the
// elements and you might not test what you think you're testing otherwise.
a.watch(2, function(prop, oldValue, newValue) {
watchpointCalled = true;
assertEq(prop, 2);
assertEq(oldValue, 1);
assertEq(newValue, "foo");
});
assertArrayIsExpected();
a.length = 5;
a[2] = "foo";
assertEq(watchpointCalled, true);
assertEq(delete a[0], false);
assertArrayIsExpected();
if (typeof reportCompare === "function")
reportCompare(true, true);

View file

@ -1,41 +0,0 @@
/*
* Any copyright is dedicated to the Public Domain.
* http://creativecommons.org/licenses/publicdomain/
*/
var hitCount;
function watcher(p,o,n) { hitCount++; return n; }
var a = [1];
a.watch('length', watcher);
hitCount = 0;
a.length = 0;
reportCompare(1, hitCount, "lenient; configurable: watchpoint hit");
var b = Object.defineProperty([1],'0',{configurable:false});
b.watch('length', watcher);
hitCount = 0;
var result;
try {
b.length = 0;
result = "no error";
} catch (x) {
result = x.toString();
}
reportCompare(1, hitCount, "lenient; non-configurable: watchpoint hit");
reportCompare(1, b.length, "lenient; non-configurable: length unchanged");
reportCompare("no error", result, "lenient; non-configurable: no error thrown");
var c = Object.defineProperty([1],'0',{configurable:false});
c.watch('length', watcher);
hitCount = 0;
var threwTypeError;
try {
(function(){'use strict'; c.length = 0;})();
threwTypeError = false;
} catch (x) {
threwTypeError = x instanceof TypeError;
}
reportCompare(1, hitCount, "strict; non-configurable: watchpoint hit");
reportCompare(1, c.length, "strict; non-configurable: length unchanged");
reportCompare(true, threwTypeError, "strict; non-configurable: TypeError thrown");

View file

@ -1,38 +0,0 @@
/*
* Any copyright is dedicated to the Public Domain.
* http://creativecommons.org/licenses/publicdomain/
*/
/* Create a prototype object with a setter property. */
var protoSetterCount;
var proto = ({ set x(v) { protoSetterCount++; } });
/* Put a watchpoint on that setter. */
var protoWatchCount;
proto.watch('x', function() { protoWatchCount++; });
/* Make an object with the above as its prototype. */
function C() { }
C.prototype = proto;
var o = new C();
/*
* Set a watchpoint on the property in the inheriting object. We have
* defined this to mean "duplicate the property, setter and all, in the
* inheriting object." I don't think debugging observation mechanisms
* should mutate the program being run, but that's what we've got.
*/
var oWatchCount;
o.watch('x', function() { oWatchCount++; });
/*
* Assign to the property. This should trip the watchpoint on the inheriting object and
* the setter.
*/
protoSetterCount = protoWatchCount = oWatchCount = 0;
o.x = 1;
assertEq(protoWatchCount, 0);
assertEq(oWatchCount, 1);
assertEq(protoSetterCount, 1);
reportCompare(true, true);

View file

@ -1,46 +0,0 @@
/*
* Any copyright is dedicated to the Public Domain.
* http://creativecommons.org/licenses/publicdomain/
*/
/* A stock watcher function. */
var watcherCount;
function watcher(id, oldval, newval) { watcherCount++; return newval; }
/* Create an object with a JavaScript setter. */
var setterCount;
var o = { w:2, set x(v) { setterCount++; } };
/*
* Put the object in dictionary mode, so that JSObject::putProperty will
* mutate its shapes instead of creating new ones.
*/
delete o.w;
/*
* Place a watchpoint on the property. The watchpoint structure holds the
* original JavaScript setter, and a pointer to the shape.
*/
o.watch('x', watcher);
/*
* Replace the accessor property with a value property. The shape's setter
* should become a non-JS setter, js_watch_set, and the watchpoint
* structure's saved setter should be updated (in this case, cleared).
*/
Object.defineProperty(o, 'x', { value:3,
writable:true,
enumerable:true,
configurable:true });
/*
* Assign to the property. This should trigger js_watch_set, which should
* call the handler, and then see that there is no JS-level setter to pass
* control on to, and return.
*/
watcherCount = setterCount = 0;
o.x = 3;
assertEq(watcherCount, 1);
assertEq(setterCount, 0);
reportCompare(true, true);

View file

@ -1,44 +0,0 @@
/*
* Any copyright is dedicated to the Public Domain.
* http://creativecommons.org/licenses/publicdomain/
*/
/* Create an object with a JavaScript setter. */
var firstSetterCount;
var o = { w:2, set x(v) { firstSetterCount++; } };
/*
* Put the object in dictionary mode, so that JSObject::putProperty will
* mutate its shapes instead of creating new ones.
*/
delete o.w;
/* A stock watcher function. */
var watcherCount;
function watcher(id, oldval, newval) { watcherCount++; return newval; }
/*
* Place a watchpoint on the property. The property's shape now has the
* watchpoint setter, with the original setter saved in the watchpoint
* structure.
*/
o.watch('x', watcher);
/*
* Replace the setter with a new setter. The shape should get updated to
* refer to the new setter, and then the watchpoint setter should be
* re-established.
*/
var secondSetterCount;
Object.defineProperty(o, 'x', { set: function () { secondSetterCount++ } });
/*
* Assign to the property. This should trigger the watchpoint and the new setter.
*/
watcherCount = firstSetterCount = secondSetterCount = 0;
o.x = 3;
assertEq(watcherCount, 1);
assertEq(firstSetterCount, 0);
assertEq(secondSetterCount, 1);
reportCompare(true, true);

View file

@ -1,43 +0,0 @@
/*
* Any copyright is dedicated to the Public Domain.
* http://creativecommons.org/licenses/publicdomain/
*/
/* A stock watcher function. */
var watcherCount;
function watcher(id, old, newval) {
watcherCount++;
return newval;
}
/* Create an object with a value property. */
var o = { w:2, x:3 };
/*
* Place a watchpoint on the value property. The watchpoint structure holds
* the original JavaScript setter, and a pointer to the shape.
*/
o.watch('x', watcher);
/*
* Put the object in dictionary mode, so that JSObject::putProperty will
* mutate its shapes instead of creating new ones.
*/
delete o.w;
/*
* Replace the value property with a setter.
*/
var setterCount;
o.__defineSetter__('x', function() { setterCount++; });
/*
* Trigger the watchpoint. The watchpoint handler should run, and then the
* setter should run.
*/
watcherCount = setterCount = 0;
o.x = 4;
assertEq(watcherCount, 1);
assertEq(setterCount, 1);
reportCompare(true, true);

View file

@ -1,56 +0,0 @@
/*
* Any copyright is dedicated to the Public Domain.
* http://creativecommons.org/licenses/publicdomain/
*/
function make_watcher(name) {
return function (id, oldv, newv) {
print("watched " + name + "[0]");
};
}
var o, p;
function f(flag) {
if (flag) {
o = arguments;
} else {
p = arguments;
o.watch(0, make_watcher('o'));
p.watch(0, make_watcher('p'));
/*
* Previously, the watchpoint implementation actually substituted its magic setter
* functions for the setters of shared shapes, and then 1) carefully ignored calls
* to its magic setter from unrelated objects, and 2) avoided restoring the
* original setter until all watchpoints on that shape had been removed.
*
* However, when the watchpoint code began using JSObject::changeProperty and
* js_ChangeNativePropertyAttrs to change shapes' setters, the shape tree code
* became conscious of the presence of watchpoints, and shared shapes between
* objects only when their watchpoint nature coincided. Clearing the magic setter
* from one object's shape would not affect other objects, because the
* watchpointed and non-watchpointed shapes were distinct if they were shared.
*
* Thus, the first unwatch call must go ahead and fix p's shape, even though a
* watchpoint exists on the same shape in o. o's watchpoint's presence shouldn't
* cause 'unwatch' to leave p's magic setter in place.
*/
/* DropWatchPointAndUnlock would see o's watchpoint, and not change p's property. */
p.unwatch(0);
/* DropWatchPointAndUnlock would fix o's property, but not p's; p's setter would be gone. */
o.unwatch(0);
/* This would fail to invoke the arguments object's setter. */
p[0] = 4;
/* And the formal parameter would not get updated. */
assertEq(flag, 4);
}
}
f(true);
f(false);
reportCompare(true, true);

View file

@ -1,41 +0,0 @@
/* -*- tab-width: 2; indent-tabs-mode: nil; js-indent-level: 2 -*- */
/* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
//-----------------------------------------------------------------------------
var BUGNUMBER = 362872;
var summary = 'script should not drop watchpoint that is in use';
var actual = 'No Crash';
var expect = 'No Crash';
//-----------------------------------------------------------------------------
test();
//-----------------------------------------------------------------------------
function test()
{
enterFunc ('test');
printBugNumber(BUGNUMBER);
printStatus (summary);
function exploit() {
var rooter = {}, object = {}, filler1 = "", filler2 = "\u5555";
for(var i = 0; i < 32/2-2; i++) { filler1 += "\u5050"; }
object.watch("foo", function(){
object.unwatch("foo");
object.unwatch("foo");
for(var i = 0; i < 8 * 1024; i++) {
rooter[i] = filler1 + filler2;
}
});
object.foo = "bar";
}
exploit();
reportCompare(expect, actual, summary);
exitFunc ('test');
}

View file

@ -1,24 +0,0 @@
/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
/*
* Any copyright is dedicated to the Public Domain.
* http://creativecommons.org/licenses/publicdomain/
* Contributor: Blake Kaplan
*/
//-----------------------------------------------------------------------------
var BUGNUMBER = 362872;
var summary = 'script should not drop watchpoint that is in use';
var actual = 'No Crash';
var expect = 'No Crash';
printBugNumber(BUGNUMBER);
printStatus (summary);
this.watch('x', function f() {
print("before");
x = 3;
print("after");
});
x = 3;
reportCompare(expect, actual, summary);

View file

@ -1,75 +0,0 @@
// |reftest| skip-if(xulRuntime.OS=="WINNT"&&isDebugBuild) slow
/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
/* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
//-----------------------------------------------------------------------------
var BUGNUMBER = 127243;
var summary = 'Do not crash on watch';
var actual = 'No Crash';
var expect = 'No Crash';
printBugNumber(BUGNUMBER);
printStatus (summary);
if (typeof window != 'undefined' && typeof document != 'undefined')
{
// delay test driver end
gDelayTestDriverEnd = true;
window.addEventListener('load', handleLoad, false);
}
else
{
printStatus('This test must be run in the browser');
reportCompare(expect, actual, summary);
}
var div;
function handleLoad()
{
div = document.createElement('div');
document.body.appendChild(div);
div.setAttribute('id', 'id1');
div.style.width = '50px';
div.style.height = '100px';
div.style.overflow = 'auto';
for (var i = 0; i < 5; i++)
{
var p = document.createElement('p');
var t = document.createTextNode('blah');
p.appendChild(t);
div.appendChild(p);
}
div.watch('scrollTop', wee);
setTimeout('setScrollTop()', 1000);
}
function wee(id, oldval, newval)
{
var t = document.createTextNode('setting ' + id +
' value ' + div.scrollTop +
' oldval ' + oldval +
' newval ' + newval);
var p = document.createElement('p');
p.appendChild(t);
document.body.appendChild(p);
return newval;
}
function setScrollTop()
{
div.scrollTop = 42;
reportCompare(expect, actual, summary);
gDelayTestDriverEnd = false;
jsTestDriverEnd();
}

View file

@ -1,29 +0,0 @@
/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
/* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
//-----------------------------------------------------------------------------
var BUGNUMBER = 213482;
var summary = 'Do not crash watching property when watcher sets property';
var actual = 'No Crash';
var expect = 'No Crash';
printBugNumber(BUGNUMBER);
printStatus (summary);
var testobj = {value: 'foo'};
function watched (a, b, c) {
testobj.value = (new Date()).getTime();
}
function setTest() {
testobj.value = 'b';
}
testobj.watch("value", watched);
setTest();
reportCompare(expect, actual, summary);

View file

@ -1,37 +0,0 @@
/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
/*
* Any copyright is dedicated to the Public Domain.
* http://creativecommons.org/licenses/publicdomain/
* Contributor: Bob Clary
*/
//-----------------------------------------------------------------------------
// originally reported by Jens Thiele <karme@unforgettable.com> in
var BUGNUMBER = 240577;
var summary = 'object.watch execution context';
var actual = '';
var expect = '';
printBugNumber(BUGNUMBER);
printStatus (summary);
var createWatcher = function ( watchlabel )
{
var watcher = function (property, oldvalue, newvalue)
{
actual += watchlabel; return newvalue;
};
return watcher;
};
var watcher1 = createWatcher('watcher1');
var object = {property: 'value'};
object.watch('property', watcher1);
object.property = 'newvalue';
expect = 'watcher1';
reportCompare(expect, actual, summary);

View file

@ -1,29 +0,0 @@
/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
/* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
//-----------------------------------------------------------------------------
var BUGNUMBER = 355341;
var summary = 'Do not crash with watch and setter';
var actual = '';
var expect = '';
//-----------------------------------------------------------------------------
test();
//-----------------------------------------------------------------------------
function test()
{
enterFunc ('test');
printBugNumber(BUGNUMBER);
printStatus (summary);
Object.defineProperty(this, "x", { set: Function, enumerable: true, configurable: true });
this.watch('x', function () { }); x = 3;
reportCompare(expect, actual, summary);
exitFunc ('test');
}

View file

@ -1,49 +0,0 @@
/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
/* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
//-----------------------------------------------------------------------------
var BUGNUMBER = 355344;
var summary = 'Exceptions thrown by watch point';
var actual = '';
var expect = '';
//-----------------------------------------------------------------------------
test();
//-----------------------------------------------------------------------------
function test()
{
enterFunc ('test');
printBugNumber(BUGNUMBER);
printStatus (summary);
var o = {};
expect = 'setter: yikes';
o.watch('x', function(){throw 'yikes'});
try
{
o.x = 3;
}
catch(ex)
{
actual = "setter: " + ex;
}
try
{
eval("") ;
}
catch(e)
{
actual = "eval: " + e;
}
reportCompare(expect, actual, summary);
exitFunc ('test');
}

View file

@ -1,32 +0,0 @@
/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
/* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
//-----------------------------------------------------------------------------
var BUGNUMBER = 361467;
var summary = 'Do not crash with certain watchers';
var actual = '';
var expect = '';
//-----------------------------------------------------------------------------
test();
//-----------------------------------------------------------------------------
function test()
{
enterFunc ('test');
printBugNumber(BUGNUMBER);
printStatus (summary);
expect = actual = 'No Crash';
var x;
this.watch('x', print);
x = 5;
reportCompare(expect, actual, summary);
exitFunc ('test');
}

View file

@ -1,35 +0,0 @@
/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
/* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
//-----------------------------------------------------------------------------
var BUGNUMBER = 361617;
var summary = 'Do not crash with getter, watch and gc';
var actual = 'No Crash';
var expect = 'No Crash';
//-----------------------------------------------------------------------------
test();
//-----------------------------------------------------------------------------
function test()
{
enterFunc ('test');
printBugNumber(BUGNUMBER);
printStatus (summary);
(function() {
Object.defineProperty(this, "x", { get: function(){}, enumerable: true, configurable: true });
})();
this.watch('x', print);
Object.defineProperty(this, "x", { get: function(){}, enumerable: true, configurable: true });
gc();
this.unwatch('x');
x;
reportCompare(expect, actual, summary);
exitFunc ('test');
}

View file

@ -1,28 +0,0 @@
/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
/* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
//-----------------------------------------------------------------------------
var BUGNUMBER = 385393;
var summary = 'Regression test for bug 385393';
var actual = 'No Crash';
var expect = 'No Crash';
//-----------------------------------------------------------------------------
test();
//-----------------------------------------------------------------------------
function test()
{
enterFunc ('test');
printBugNumber(BUGNUMBER);
printStatus (summary);
reportCompare(expect, actual, summary);
true.watch("x", function(){});
exitFunc ('test');
}

View file

@ -1,45 +0,0 @@
/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
/* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
//-----------------------------------------------------------------------------
var BUGNUMBER = 506567;
var summary = 'Do not crash with watched variables';
var actual = '';
var expect = '';
//-----------------------------------------------------------------------------
test();
//-----------------------------------------------------------------------------
function test()
{
enterFunc ('test');
printBugNumber(BUGNUMBER);
printStatus (summary);
if (typeof clearInterval == 'undefined')
{
clearInterval = (function () {});
}
var obj = new Object();
obj.test = null;
obj.watch("test", (function(prop, oldval, newval)
{
if(false)
{
var test = newval % oldval;
var func = (function(){clearInterval(myInterval);});
}
}));
obj.test = 'null';
print(obj.test);
reportCompare(expect, actual, summary);
exitFunc ('test');
}

View file

@ -1,19 +0,0 @@
/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
/* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
//-----------------------------------------------------------------------------
var BUGNUMBER = 303277;
var summary = 'Do not crash with crash with a watchpoint for __proto__ property ';
var actual = 'No Crash';
var expect = 'No Crash';
printBugNumber(BUGNUMBER);
printStatus (summary);
var o = {};
o.watch("__proto__", function(){return null;});
o.__proto__ = null;
reportCompare(expect, actual, summary);

View file

@ -1,32 +0,0 @@
/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
/* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
//-----------------------------------------------------------------------------
var BUGNUMBER = 355339;
var summary = 'Do not assert: sprop->setter != js_watch_set';
var actual = '';
var expect = '';
//-----------------------------------------------------------------------------
test();
//-----------------------------------------------------------------------------
function test()
{
enterFunc ('test');
printBugNumber(BUGNUMBER);
printStatus (summary);
expect = actual = 'No Crash';
o = {};
o.watch("j", function(a,b,c) { print("*",a,b,c) });
o.unwatch("j");
o.watch("j", function(a,b,c) { print("*",a,b,c) });
reportCompare(expect, actual, summary);
exitFunc ('test');
}

View file

@ -1,22 +0,0 @@
/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
/* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
//-----------------------------------------------------------------------------
var BUGNUMBER = 361346;
var summary = 'Crash with setter, watch, GC';
var actual = '';
var expect = '';
printBugNumber(BUGNUMBER);
printStatus (summary);
expect = actual = 'No Crash';
Object.defineProperty(this, "x", { set: new Function, enumerable: true, configurable: true });
this.watch('x', function(){});
gc();
x = {};
reportCompare(expect, actual, summary);

View file

@ -1,32 +0,0 @@
/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
/* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
//-----------------------------------------------------------------------------
var BUGNUMBER = 361360;
var summary = 'Do not assert: !caller || caller->pc involving setter and watch';
var actual = '';
var expect = '';
//-----------------------------------------------------------------------------
test();
//-----------------------------------------------------------------------------
function test()
{
enterFunc ('test');
printBugNumber(BUGNUMBER);
printStatus (summary);
expect = actual = 'No Crash';
this.__defineSetter__('x', eval);
this.watch('x', function(){});
x = 3;
reportCompare(expect, actual, summary);
exitFunc ('test');
}

View file

@ -1,27 +0,0 @@
/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
/* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
//-----------------------------------------------------------------------------
var BUGNUMBER = 361552;
var summary = 'Crash with setter, watch, Script';
var actual = '';
var expect = '';
printBugNumber(BUGNUMBER);
printStatus (summary);
expect = actual = 'No Crash';
if (typeof Script == 'undefined')
{
print('Test skipped. Script not defined.');
}
else
{
this.__defineSetter__('x', gc);
this.watch('x', new Script(''));
x = 3;
}
reportCompare(expect, actual, summary);

View file

@ -1,19 +0,0 @@
/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
/* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
//-----------------------------------------------------------------------------
var BUGNUMBER = 361558;
var summary = 'Do not assert: sprop->setter != js_watch_set';
var actual = '';
var expect = '';
printBugNumber(BUGNUMBER);
printStatus (summary);
expect = actual = 'No Crash';
({}.__proto__.watch('x', print)); ({}.watch('x', print));
reportCompare(expect, actual, summary);

View file

@ -1,38 +0,0 @@
/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
/* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
//-----------------------------------------------------------------------------
var BUGNUMBER = 361571;
var summary = 'Do not assert: fp->scopeChain == parent';
var actual = 'No Crash';
var expect = 'No Crash';
//-----------------------------------------------------------------------------
test();
//-----------------------------------------------------------------------------
function test()
{
enterFunc ('test');
printBugNumber(BUGNUMBER);
printStatus (summary);
try
{
o = {};
o.__defineSetter__('y', eval);
o.watch('y', function () { return "";});
o.y = 1;
}
catch(ex)
{
printStatus('Note eval can no longer be called directly');
expect = 'EvalError: function eval must be called directly, and not by way of a function of another name';
actual = ex + '';
}
reportCompare(expect, actual, summary);
exitFunc ('test');
}

View file

@ -1,35 +0,0 @@
/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
/* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
//-----------------------------------------------------------------------------
var BUGNUMBER = 361856;
var summary = 'Do not assert: overwriting @ js_AddScopeProperty';
var actual = '';
var expect = '';
//-----------------------------------------------------------------------------
test();
//-----------------------------------------------------------------------------
function test()
{
enterFunc ('test');
printBugNumber(BUGNUMBER);
printStatus (summary);
function testit() {
var obj = {};
obj.watch("foo", function(){});
delete obj.foo;
obj = null;
gc();
}
testit();
reportCompare(expect, actual, summary);
exitFunc ('test');
}

View file

@ -1,54 +0,0 @@
// |reftest| skip -- slow, alert not dismissed, now busted by harness
/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
/* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
//-----------------------------------------------------------------------------
var BUGNUMBER = 361964;
var summary = 'Crash [@ MarkGCThingChildren] involving watch and setter';
var actual = 'No Crash';
var expect = 'No Crash';
//-----------------------------------------------------------------------------
test();
//-----------------------------------------------------------------------------
function test()
{
enterFunc ('test');
printBugNumber(BUGNUMBER);
printStatus (summary);
var doc;
if (typeof document == 'undefined')
{
doc = {};
}
else
{
doc = document;
}
if (typeof alert == 'undefined')
{
alert = print;
}
// Crash:
doc.watch("title", function(a,b,c,d) {
return { toString : function() { alert(1); } };
});
doc.title = "xxx";
// No crash:
doc.watch("title", function() {
return { toString : function() { alert(1); } };
});
doc.title = "xxx";
reportCompare(expect, actual, summary);
exitFunc ('test');
}

View file

@ -1,38 +0,0 @@
/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
/* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
//-----------------------------------------------------------------------------
var BUGNUMBER = 385134;
var summary = 'Do not crash with setter, watch, uneval';
var actual = 'No Crash';
var expect = 'No Crash';
//-----------------------------------------------------------------------------
test();
//-----------------------------------------------------------------------------
function test()
{
enterFunc ('test');
printBugNumber(BUGNUMBER);
printStatus (summary);
if (typeof this.__defineSetter__ != 'undefined' &&
typeof this.watch != 'undefined' &&
typeof uneval != 'undefined')
{
try {
this.__defineSetter__(0, function(){});
} catch (exc) {
// In the browser, this fails. Ignore the error.
}
this.watch(0, function(){});
uneval(this);
}
reportCompare(expect, actual, summary);
exitFunc ('test');
}

View file

@ -1,18 +0,0 @@
/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
/* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
//-----------------------------------------------------------------------------
var BUGNUMBER = 385393;
var summary = 'Regression test for bug 385393';
var actual = 'No Crash';
var expect = 'No Crash';
printBugNumber(BUGNUMBER);
printStatus (summary);
eval("this.__defineSetter__('x', gc); this.watch('x', [].slice); x = 1;");
reportCompare(expect, actual, summary);

View file

@ -1,42 +0,0 @@
/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
/* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
//-----------------------------------------------------------------------------
var BUGNUMBER = 390597;
var summary = 'watch point + eval-as-setter allows access to dead JSStackFrame';
var actual = 'No Crash';
var expect = 'No Crash';
//-----------------------------------------------------------------------------
test();
//-----------------------------------------------------------------------------
function test()
{
enterFunc ('test');
printBugNumber(BUGNUMBER);
printStatus (summary);
function exploit() {
try
{
var obj = this, args = null;
obj.__defineSetter__("evil", eval);
obj.watch("evil", function() { return "args = arguments;"; });
obj.evil = null;
eval("print(args[0]);");
}
catch(ex)
{
print('Caught ' + ex);
}
}
exploit();
reportCompare(expect, actual, summary);
exitFunc ('test');
}

View file

@ -1,21 +0,0 @@
/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
/* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
//-----------------------------------------------------------------------------
var BUGNUMBER = 420612;
var summary = 'Do not assert: obj == pobj';
var actual = 'No Crash';
var expect = 'No Crash';
printBugNumber(BUGNUMBER);
printStatus (summary);
var obj = Object.create([]);
obj.unwatch("x");
if (typeof reportCompare === "function")
reportCompare(true, true);
print("Tests complete");

View file

@ -1,100 +0,0 @@
// |reftest| fails
/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
/* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
//-----------------------------------------------------------------------------
var BUGNUMBER = 435345;
var summary = 'Watch the length property of arrays';
var actual = '';
var expect = '';
// see http://developer.mozilla.org/en/docs/Core_JavaScript_1.5_Reference:Objects:Object:watch
//-----------------------------------------------------------------------------
test();
//-----------------------------------------------------------------------------
function test()
{
enterFunc ('test');
printBugNumber(BUGNUMBER);
printStatus (summary);
var arr;
try
{
expect = 'watcher: propname=length, oldval=0, newval=1; ';
actual = '';
arr = [];
arr.watch('length', watcher);
arr[0] = '0';
}
catch(ex)
{
actual = ex + '';
}
reportCompare(expect, actual, summary + ': 1');
try
{
expect = 'watcher: propname=length, oldval=1, newval=2; ' +
'watcher: propname=length, oldval=2, newval=2; ';
actual = '';
arr.push(5);
}
catch(ex)
{
actual = ex + '';
}
reportCompare(expect, actual, summary + ': 2');
try
{
expect = 'watcher: propname=length, oldval=2, newval=1; ';
actual = '';
arr.pop();
}
catch(ex)
{
actual = ex + '';
}
reportCompare(expect, actual, summary + ': 3');
try
{
expect = 'watcher: propname=length, oldval=1, newval=2; ';
actual = '';
arr.length++;
}
catch(ex)
{
actual = ex + '';
}
reportCompare(expect, actual, summary + ': 4');
try
{
expect = 'watcher: propname=length, oldval=2, newval=5; ';
actual = '';
arr.length = 5;
}
catch(ex)
{
actual = ex + '';
}
reportCompare(expect, actual, summary + ': 5');
exitFunc ('test');
}
function watcher(propname, oldval, newval)
{
actual += 'watcher: propname=' + propname + ', oldval=' + oldval +
', newval=' + newval + '; ';
return newval;
}

View file

@ -1,25 +0,0 @@
/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
/* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
//-----------------------------------------------------------------------------
var BUGNUMBER = 454040;
var summary = 'Do not crash @ js_ComputeFilename';
var actual = '';
var expect = '';
printBugNumber(BUGNUMBER);
printStatus (summary);
try
{
this.__defineGetter__("x", Function);
this.__defineSetter__("x", Function);
this.watch("x", x.__proto__);
x = 1;
}
catch(ex)
{
}
reportCompare(expect, actual, summary);

View file

@ -1,30 +0,0 @@
// |reftest| skip-if(Android)
/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
/* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
//-----------------------------------------------------------------------------
var BUGNUMBER = 454142;
var summary = 'Do not crash with gczeal, setter, watch';
var actual = '';
var expect = '';
printBugNumber(BUGNUMBER);
printStatus (summary);
this.watch("x", function(){});
delete x;
if (typeof gczeal == 'function')
{
gczeal(2);
}
this.__defineSetter__("x", function(){});
if (typeof gczeal == 'function')
{
gczeal(0);
}
reportCompare(expect, actual, summary);

View file

@ -1,24 +0,0 @@
/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
/* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
//-----------------------------------------------------------------------------
var BUGNUMBER = 455413;
var summary = 'Do not assert with JIT: (m != JSVAL_INT) || isInt32(*vp)';
var actual = 'No Crash';
var expect = 'No Crash';
//-----------------------------------------------------------------------------
test();
//-----------------------------------------------------------------------------
printBugNumber(BUGNUMBER);
printStatus (summary);
this.watch('x', Math.pow); (function() { for(var j=0;j<4;++j){x=1;} })();
reportCompare(expect, actual, summary);

View file

@ -1,24 +0,0 @@
/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
/* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
//-----------------------------------------------------------------------------
var BUGNUMBER = 465145;
var summary = 'Do not crash with watched defined setter';
var actual = '';
var expect = '';
printBugNumber(BUGNUMBER);
printStatus (summary);
this.__defineSetter__("x", function(){});
this.watch("x", function(){});
y = this;
for (var z = 0; z < 2; ++z) { x = y };
this.__defineSetter__("x", function(){});
for (var z = 0; z < 2; ++z) { x = y };
reportCompare(expect, actual, summary);

View file

@ -1,31 +0,0 @@
// |reftest| skip-if(Android)
/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
/* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
//-----------------------------------------------------------------------------
var BUGNUMBER = 472787;
var summary = 'Do not hang with gczeal, watch and concat';
var actual = '';
var expect = '';
printBugNumber(BUGNUMBER);
printStatus (summary);
this.__defineSetter__("x", Math.sin);
this.watch("x", '' .concat);
if (typeof gczeal == 'function')
{
gczeal(2);
}
x = 1;
if (typeof gczeal == 'function')
{
gczeal(0);
}
reportCompare(expect, actual, summary);

View file

@ -1,46 +0,0 @@
/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
/* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
//-----------------------------------------------------------------------------
var BUGNUMBER = 488995;
var summary = 'Do not crash with watch, __defineSetter__ on svg';
var actual = '';
var expect = '';
//-----------------------------------------------------------------------------
test();
//-----------------------------------------------------------------------------
function test()
{
enterFunc ('test');
printBugNumber(BUGNUMBER);
printStatus (summary);
if (typeof document == 'undefined')
{
print('Test skipped: requires browser.');
}
else
{
try
{
var o=document.createElementNS("http://www.w3.org/2000/svg", "svg");
var p=o.y;
p.watch('animVal', function(id, oldvar, newval) {} );
p.type='xxx';
p.__defineSetter__('animVal', function() {});
p.animVal=0;
}
catch(ex)
{
}
}
reportCompare(expect, actual, summary);
exitFunc ('test');
}

View file

@ -1,40 +0,0 @@
/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
/* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
//-----------------------------------------------------------------------------
var BUGNUMBER = 476655;
var summary = 'TM: Do not assert: count <= (size_t) (fp->regs->sp - StackBase(fp) - depth)';
var actual = '';
var expect = '';
//-----------------------------------------------------------------------------
test();
//-----------------------------------------------------------------------------
function test()
{
enterFunc ('test');
printBugNumber(BUGNUMBER);
printStatus (summary);
try
{
eval(
"(function (){ for (var y in this) {} })();" +
"[''.watch(\"\", function(){}) for each (x in ['', '', eval, '', '']) if " +
"(x)].map(Function)"
);
}
catch(ex)
{
}
reportCompare(expect, actual, summary);
exitFunc ('test');
}

View file

@ -1,24 +0,0 @@
/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
/* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
//-----------------------------------------------------------------------------
var BUGNUMBER = 457521;
var summary = 'Do not crash @ js_DecompileValueGenerator';
var actual = '';
var expect = '';
printBugNumber(BUGNUMBER);
printStatus (summary);
try
{
this.__defineSetter__("x", [,,,].map);
this.watch("x", (new Function("var y, eval")));
x = true;
}
catch(ex)
{
}
reportCompare(expect, actual, summary);

View file

@ -1,33 +0,0 @@
/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
/* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
//-----------------------------------------------------------------------------
var BUGNUMBER = 479567;
var summary = 'Do not assert: thing';
var actual = '';
var expect = '';
printBugNumber(BUGNUMBER);
printStatus (summary);
function f()
{
(eval("(function(){for each (y in [false, false, false]);});"))();
}
try
{
this.__defineGetter__("x", gc);
uneval(this.watch("y", this.toSource))
f();
throw x;
}
catch(ex)
{
}
reportCompare(expect, actual, summary);

View file

@ -1,31 +0,0 @@
/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
/* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
//-----------------------------------------------------------------------------
var BUGNUMBER = 453955;
var summary = 'Do not assert: sprop->setter != js_watch_set || pobj != obj';
var actual = '';
var expect = '';
//-----------------------------------------------------------------------------
test();
//-----------------------------------------------------------------------------
function test()
{
enterFunc ('test');
printBugNumber(BUGNUMBER);
printStatus (summary);
for (var z = 0; z < 2; ++z)
{
[].filter.watch("9", function(y) { yield y; });
}
reportCompare(expect, actual, summary);
exitFunc ('test');
}

View file

@ -1,20 +0,0 @@
/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
/* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
//-----------------------------------------------------------------------------
var BUGNUMBER = 473282;
var summary = 'Do not assert: thing';
var actual = '';
var expect = '';
printBugNumber(BUGNUMBER);
printStatus (summary);
this.watch("b", "".substring);
this.__defineGetter__("a", gc);
for each (b in [this, null, null]);
a;
reportCompare(expect, actual, summary);

View file

@ -1,37 +0,0 @@
/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
/* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
//-----------------------------------------------------------------------------
var BUGNUMBER = 385133;
var summary = 'Do not crash due to recursion with watch, setter, delete, generator';
var actual = 'No Crash';
var expect = 'No Crash';
//-----------------------------------------------------------------------------
test();
//-----------------------------------------------------------------------------
function test()
{
enterFunc ('test');
printBugNumber(BUGNUMBER);
printStatus (summary);
try
{
Object.defineProperty(this, "x", { set: {}.watch, enumerable: true, configurable: true });
this.watch('x', 'foo'.split);
delete x;
function g(){ x = 1; yield; }
for (i in g()) { }
}
catch(ex)
{
}
reportCompare(expect, actual, summary);
exitFunc ('test');
}

View file

@ -1,51 +0,0 @@
// |reftest| skip-if(!xulRuntime.shell)
/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
/* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
//-----------------------------------------------------------------------------
var BUGNUMBER = 394709;
var summary = 'Do not leak with object.watch and closure';
var actual = 'No Leak';
var expect = 'No Leak';
//-----------------------------------------------------------------------------
test();
//-----------------------------------------------------------------------------
function test()
{
enterFunc ('test');
printBugNumber(BUGNUMBER);
printStatus (summary);
assertEq(finalizeCount(), 0, "invalid initial state");
runtest();
gc();
assertEq(finalizeCount(), 1, "leaked");
runtest();
gc();
assertEq(finalizeCount(), 2, "leaked");
runtest();
gc();
assertEq(finalizeCount(), 3, "leaked");
function runtest () {
var obj = { b: makeFinalizeObserver() };
obj.watch('b', watcher);
function watcher(id, old, value) {
++obj.n;
return value;
}
}
reportCompare(expect, actual, summary);
exitFunc ('test');
}

View file

@ -1,19 +0,0 @@
/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
/* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
//-----------------------------------------------------------------------------
var BUGNUMBER = 481989;
var summary = 'TM: Do not assert: SPROP_HAS_STUB_SETTER(sprop)';
var actual = '';
var expect = '';
printBugNumber(BUGNUMBER);
printStatus (summary);
y = this.watch("x", function(){}); for each (let y in ['', '']) x = y;
reportCompare(expect, actual, summary);

View file

@ -1,34 +0,0 @@
/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
/* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
//-----------------------------------------------------------------------------
var BUGNUMBER = 452498;
var summary = 'TM: upvar2 regression tests';
var actual = '';
var expect = '';
//------- Comment #193 From Gary Kwong
//-----------------------------------------------------------------------------
test();
//-----------------------------------------------------------------------------
function test()
{
enterFunc ('test');
printBugNumber(BUGNUMBER);
printStatus (summary);
// Assertion failure: afunbox->parent, at ../jsparse.cpp:1912
this.x = undefined;
this.watch("x", Function);
NaN = uneval({ get \u3056 (){ return undefined } });
x+=NaN;
reportCompare(expect, actual, summary);
exitFunc ('test');
}

View file

@ -21,15 +21,6 @@ function test()
printBugNumber(BUGNUMBER);
printStatus (summary);
// Assertion failure: localKind == JSLOCAL_VAR || localKind == JSLOCAL_CONST, at ../jsfun.cpp:916
this.x = undefined;
this.watch("x", Function);
NaN = uneval({ get \u3056 (){ return undefined } });
x+=NaN;
reportCompare(expect, actual, summary + ': 1');
// Assertion failure: lexdep->isLet(), at ../jsparse.cpp:1900
(function (){

View file

@ -1,41 +0,0 @@
/* -*- indent-tabs-mode: nil; js-indent-level: 4 -*- */
/*
* Any copyright is dedicated to the Public Domain.
* http://creativecommons.org/licenses/publicdomain/
* Contributor: Blake Kaplan
*/
//-----------------------------------------------------------------------------
var BUGNUMBER = 520572;
var summary = 'watch should innerize the object being watched';
var actual = 0;
var expect = 2;
//-----------------------------------------------------------------------------
test();
//-----------------------------------------------------------------------------
function test()
{
enterFunc ('test');
printBugNumber(BUGNUMBER);
printStatus (summary);
if ("evalcx" in this) {
// shell
let s = evalcx("lazy");
s.n = 0;
evalcx('this.watch("x", function(){ n++; }); this.x = 4; x = 6', s);
actual = s.n;
reportCompare(expect, actual, summary);
} else {
// browser
this.watch('x', function(){ actual++; });
this.x = 4;
x = 6;
reportCompare(expect, actual, summary);
}
exitFunc ('test');
}

View file

@ -21,11 +21,6 @@ function test()
printBugNumber(BUGNUMBER);
printStatus (summary);
// crash [@ js_Interpret]
(eval("(function(){ this.watch(\"x\", function () { new function ()y } ); const y = undefined });"))();
x = NaN;
reportCompare(expect, actual, summary + ': 2');
// Assertion failure: JOF_OPTYPE(op) == JOF_ATOM, at ../jsemit.cpp:5916
({ set z(v){}, set y(v)--x, set w(v)--w });
reportCompare(expect, actual, summary + ': 3');

View file

@ -1,24 +0,0 @@
// Any copyright is dedicated to the Public Domain.
// http://creativecommons.org/licenses/publicdomain/
var watcherCount, setterCount;
function watcher(id, oldval, newval) { watcherCount++; return newval; }
function setter(newval) { setterCount++; }
var p = { set x(v) { setter(v); } };
p.watch('x', watcher);
watcherCount = setterCount = 0;
p.x = 2;
assertEq(setterCount, 1);
assertEq(watcherCount, 1);
var o = Object.defineProperty({}, 'x', { set:setter, enumerable:true, configurable:true });
o.watch('x', watcher);
watcherCount = setterCount = 0;
o.x = 2;
assertEq(setterCount, 1);
assertEq(watcherCount, 1);
reportCompare(0, 0, 'ok');

View file

@ -1,13 +0,0 @@
// Any copyright is dedicated to the Public Domain.
// http://creativecommons.org/licenses/publicdomain/
var log;
function watcher(id, old, newval) { log += 'watcher'; return newval; }
var o = { set x(v) { log += 'setter'; } };
o.watch('x', watcher);
Object.defineProperty(o, 'x', {value: 3, writable: true});
log = '';
o.x = 3;
assertEq(log, 'watcher');
reportCompare(0, 0, 'ok');

View file

@ -1,16 +0,0 @@
// Any copyright is dedicated to the Public Domain.
// http://creativecommons.org/licenses/publicdomain/
// See bug 627984, comment 17, item 1.
var obj;
var methods = [];
for (var i = 0; i < 2; i++) {
obj = {m: function () { return this.x; }};
obj.watch("m", function (id, oldval, newval) { methods[i] = oldval; });
obj.m = 0;
}
assertEq(typeof methods[0], "function");
assertEq(typeof methods[1], "function");
assertEq(methods[0] !== methods[1], true);
reportCompare(0, 0, 'ok');

View file

@ -1,15 +0,0 @@
// Any copyright is dedicated to the Public Domain.
// http://creativecommons.org/licenses/publicdomain/
// See bug 627984, comment 17, item 2.
var obj = {};
var x;
obj.watch("m", function (id, oldval, newval) {
x = this.m;
return newval;
});
delete obj.m;
obj.m = function () { return this.method; };
obj.m = 2;
reportCompare(0, 0, 'ok');

View file

@ -1,14 +0,0 @@
// Any copyright is dedicated to the Public Domain.
// http://creativecommons.org/licenses/publicdomain/
// Don't write string value to method slot.
// See bug 627984, comment 17, item 2.
var obj = {};
obj.watch("m", function (id, oldval, newval) {
return 'ok';
});
delete obj.m;
obj.m = function () { return this.x; };
assertEq(obj.m, 'ok');
reportCompare(0, 0, 'ok');

View file

@ -1,15 +0,0 @@
// Any copyright is dedicated to the Public Domain.
// http://creativecommons.org/licenses/publicdomain/
// See bug 627984, comment 17, item 3.
var obj = {};
obj.watch("m", function (id, oldval, newval) {
delete obj.m;
obj.m = function () {};
return newval;
});
delete obj.m;
obj.m = 1;
assertEq(obj.m, 1);
reportCompare(0, 0, 'ok');

View file

@ -1,13 +0,0 @@
// Any copyright is dedicated to the Public Domain.
// http://creativecommons.org/licenses/publicdomain/
// Bug 627984 comment 11.
var o = ({});
o.p = function() {};
o.watch('p', function() { });
o.q = function() {}
delete o.p;
o.p = function() {};
assertEq(o.p, void 0);
reportCompare(0, 0, 'ok');

View file

@ -1,15 +0,0 @@
// Any copyright is dedicated to the Public Domain.
// http://creativecommons.org/licenses/publicdomain/
// Bug 627984 description.
var o = Array;
o.p = function() {};
o.watch('p', function() { });
for(var x in o) {
o[x];
}
delete o.p;
o.p = function() {};
assertEq(o.p, void 0);
reportCompare(0, 0, 'ok');

View file

@ -1,9 +0,0 @@
// Any copyright is dedicated to the Public Domain.
// http://creativecommons.org/licenses/publicdomain/
// See bug 627984 comment 20.
var obj = {m: function () {}};
obj.watch("m", function () { throw 'FAIL'; });
var f = obj.m; // don't call the watchpoint
reportCompare(0, 0, 'ok');

View file

@ -1,10 +0,0 @@
// Any copyright is dedicated to the Public Domain.
// http://creativecommons.org/licenses/publicdomain/
var o = {a:1, b:2};
o.watch("p", function() { return 13; });
delete o.p;
o.p = 0;
assertEq(o.p, 13);
reportCompare(0, 0, 'ok');

View file

@ -1,11 +0,0 @@
// Any copyright is dedicated to the Public Domain.
// http://creativecommons.org/licenses/publicdomain/
var a = {set p(x) {}};
a.watch('p', function () {});
var b = Object.create(a);
b.watch('p', function () {});
delete b.p;
b.p = 0;
reportCompare(0, 0, 'ok');

View file

@ -1,8 +0,0 @@
// Any copyright is dedicated to the Public Domain.
// http://creativecommons.org/licenses/publicdomain/
var obj = {};
obj.watch(-1, function(){});
obj.unwatch("-1"); // don't assert
reportCompare(0, 0, 'ok');

View file

@ -1,11 +0,0 @@
// Any copyright is dedicated to the Public Domain.
// http://creativecommons.org/licenses/publicdomain/
var obj = {};
try {
obj.watch(QName(), function () {});
} catch (exc) {
}
gc();
reportCompare(0, 0, 'ok');

View file

@ -1,19 +0,0 @@
/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
/*
* Any copyright is dedicated to the Public Domain.
* http://creativecommons.org/licenses/publicdomain/
* Contributor:
* Gary Kwong
*/
var gTestfile = 'watch-undefined-setter.js';
//-----------------------------------------------------------------------------
var BUGNUMBER = 560277;
var summary =
'Crash [@ JSObject::getParent] or [@ js_WrapWatchedSetter] or ' +
'[@ js_GetClassPrototype]';
this.watch("x", function() { });
Object.defineProperty(this, "x", { set: undefined, configurable: true });
reportCompare(true, true);

View file

@ -1,23 +0,0 @@
/*
* Any copyright is dedicated to the Public Domain.
* http://creativecommons.org/licenses/publicdomain/
* Contributors: Gary Kwong and Jason Orendorff
*/
var savedEval = eval;
var x = [0];
eval();
x.__proto__ = this; // x has non-dictionary scope
try {
DIE;
} catch(e) {
}
delete eval; // force dictionary scope for global
gc();
eval = savedEval;
var f = eval("(function () { return /x/; })");
x.watch('x', f); // clone property from global to x, including SPROP_IN_DICTIONARY flag
reportCompare("ok", "ok", "bug 533876");

View file

@ -1,10 +0,0 @@
// |reftest| skip
/*
* Any copyright is dedicated to the Public Domain.
* http://creativecommons.org/licenses/publicdomain/
* Contributors: Gary Kwong and Jason Orendorff
*/
var obj = {};
obj.__defineSetter__("x", function() {});
obj.watch("x", function() {});
obj.__defineSetter__("x", /a/);

View file

@ -1,16 +0,0 @@
// |reftest| skip
// Any copyright is dedicated to the Public Domain.
// http://creativecommons.org/licenses/publicdomain/
// Contributors: Gary Kwong <gary@rumblingedge.com>
// Jason Orendorff <jorendorff@mozilla.com>
// on a non-global object
var x = {};
x.watch("p", function () { evalcx(''); });
x.p = 0;
// on the global
watch("e", (function () { evalcx(''); }));
e = function () {};
reportCompare(0, 0, "ok");

View file

@ -1,8 +0,0 @@
// Any copyright is dedicated to the Public Domain.
// http://creativecommons.org/licenses/publicdomain/
var obj = {set x(v) {}};
obj.watch("x", function() { delete obj.x; });
obj.x = "hi"; // don't assert
reportCompare(0, 0, 'ok');

View file

@ -1,10 +0,0 @@
// Any copyright is dedicated to the Public Domain.
// http://creativecommons.org/licenses/publicdomain/
var a = {p0: function () {}};
var b = /f/;
b.__proto__ = a;
b.watch("p0", function () {});
b.p0;
reportCompare(0, 0, "ok");