// Copyright (c) Microsoft Corporation. All Rights Reserved. Licensed under the MIT License. See License.txt in the project root for license information.
//
///
///
///
module CorsicaTests {
"use strict";
function onError(e) {
try {
LiveUnit.Assert.fail(e);
} catch (ex) {
}
}
var U = WinJS.Utilities;
export class DOMWeakRefTable {
testBasic(complete) {
var id = "myElement";
var content = "MyElementContent";
// force cleanup on post and always clearing the table by
// pushing the timeout into the future
var previous_sweepPeriod = U._DOMWeakRefTable_sweepPeriod;
var previous_timeout = U._DOMWeakRefTable_timeout;
var previous_noTimeoutUnderDebugger = U._DOMWeakRefTable_noTimeoutUnderDebugger;
U._DOMWeakRefTable_sweepPeriod = 0;
U._DOMWeakRefTable_timeout = -1;
U._DOMWeakRefTable_noTimeoutUnderDebugger = false;
var element = document.createElement("div");
element.id = id;
element.textContent = content;
U._createWeakRef(element, id);
var element2 = U._getWeakRefElement(id);
LiveUnit.Assert.areEqual(id, element2.id);
LiveUnit.Assert.areEqual(content, element2.textContent);
WinJS.Utilities.Scheduler.schedulePromiseIdle().
then(function () {
var element3 = U._getWeakRefElement(id);
LiveUnit.Assert.isNull(element3);
}).
then(null, onError).
then(function () {
U._DOMWeakRefTable_sweepPeriod = previous_sweepPeriod;
U._DOMWeakRefTable_timeout = previous_timeout;
U._DOMWeakRefTable_noTimeoutUnderDebugger = previous_noTimeoutUnderDebugger;
}).
then(complete);
}
testBasicAddingToDOM(complete) {
var id = "myElement";
var content = "MyElementContent";
// force cleanup on post and always clearing the table by
// pushing the timeout into the future
var previous_sweepPeriod = U._DOMWeakRefTable_sweepPeriod;
var previous_timeout = U._DOMWeakRefTable_timeout;
var previous_noTimeoutUnderDebugger = U._DOMWeakRefTable_noTimeoutUnderDebugger;
U._DOMWeakRefTable_sweepPeriod = 0;
U._DOMWeakRefTable_timeout = -1;
U._DOMWeakRefTable_noTimeoutUnderDebugger = false;
var element = document.createElement("div");
element.id = id;
element.textContent = content;
U._createWeakRef(element, id);
LiveUnit.Assert.areEqual(1, U._DOMWeakRefTable_tableSize);
document.body.appendChild(element);
var element2 = U._getWeakRefElement(id);
LiveUnit.Assert.areEqual(id, element2.id);
LiveUnit.Assert.areEqual(content, element2.textContent);
LiveUnit.Assert.areEqual(0, U._DOMWeakRefTable_tableSize);
WinJS.Utilities.Scheduler.schedulePromiseIdle().
then(function () {
var element3 = U._getWeakRefElement(id);
LiveUnit.Assert.areEqual(id, element2.id);
LiveUnit.Assert.areEqual(content, element2.textContent);
LiveUnit.Assert.areEqual(0, U._DOMWeakRefTable_tableSize);
}).
then(null, onError).
then(function () {
document.body.removeChild(element);
U._DOMWeakRefTable_sweepPeriod = previous_sweepPeriod;
U._DOMWeakRefTable_timeout = previous_timeout;
U._DOMWeakRefTable_noTimeoutUnderDebugger = previous_noTimeoutUnderDebugger;
}).
then(complete);
}
testBasicAddingToDOMAndAgingOut(complete) {
var id = "myElement";
var content = "MyElementContent";
// force cleanup on post and always clearing the table by
// pushing the timeout into the future
var previous_sweepPeriod = U._DOMWeakRefTable_sweepPeriod;
var previous_timeout = U._DOMWeakRefTable_timeout;
var previous_noTimeoutUnderDebugger = U._DOMWeakRefTable_noTimeoutUnderDebugger;
U._DOMWeakRefTable_sweepPeriod = 0;
U._DOMWeakRefTable_timeout = -1;
U._DOMWeakRefTable_noTimeoutUnderDebugger = false;
var element = document.createElement("div");
element.id = id;
element.textContent = content;
U._createWeakRef(element, id);
LiveUnit.Assert.areEqual(1, U._DOMWeakRefTable_tableSize);
document.body.appendChild(element);
WinJS.Utilities.Scheduler.schedulePromiseIdle().
then(function () {
// The element should have aged out of the table by now
LiveUnit.Assert.areEqual(0, U._DOMWeakRefTable_tableSize);
var element3 = U._getWeakRefElement(id);
LiveUnit.Assert.areEqual(id, element3.id);
LiveUnit.Assert.areEqual(content, element3.textContent);
}).
then(null, onError).
then(function () {
document.body.removeChild(element);
U._DOMWeakRefTable_sweepPeriod = previous_sweepPeriod;
U._DOMWeakRefTable_timeout = previous_timeout;
U._DOMWeakRefTable_noTimeoutUnderDebugger = previous_noTimeoutUnderDebugger;
}).
then(complete);
}
testBasicAddingToDOMAndAgingOutTimer(complete) {
var id = "myElement";
var content = "MyElementContent";
// force cleanup on post and always clearing the table by
// pushing the timeout into the future
var previous_sweepPeriod = U._DOMWeakRefTable_sweepPeriod;
var previous_timeout = U._DOMWeakRefTable_timeout;
var previous_noTimeoutUnderDebugger = U._DOMWeakRefTable_noTimeoutUnderDebugger;
U._DOMWeakRefTable_sweepPeriod = 4;
U._DOMWeakRefTable_timeout = -1;
U._DOMWeakRefTable_noTimeoutUnderDebugger = false;
var element = document.createElement("div");
element.id = id;
element.textContent = content;
U._createWeakRef(element, id);
LiveUnit.Assert.areEqual(1, U._DOMWeakRefTable_tableSize);
document.body.appendChild(element);
// *4 is to ensure we get into the next frame...
//
WinJS.Promise.timeout(U._DOMWeakRefTable_sweepPeriod * 4).
then(function () {
// The element should have aged out of the table by now
LiveUnit.Assert.areEqual(0, U._DOMWeakRefTable_tableSize);
var element3 = U._getWeakRefElement(id);
LiveUnit.Assert.areEqual(id, element3.id);
LiveUnit.Assert.areEqual(content, element3.textContent);
}).
then(null, onError).
then(function () {
document.body.removeChild(element);
U._DOMWeakRefTable_sweepPeriod = previous_sweepPeriod;
U._DOMWeakRefTable_timeout = previous_timeout;
U._DOMWeakRefTable_noTimeoutUnderDebugger = previous_noTimeoutUnderDebugger;
}).
then(complete);
}
}
}
// If this condition is true we are using the built in weak refs.
if (!(WinJS.Utilities.hasWinRT && window['msSetWeakWinRTProperty'] && window['msGetWeakWinRTProperty'])) {
LiveUnit.registerTestClass("CorsicaTests.DOMWeakRefTable");
}