widget.html revision 6b7baaa39136d411805ffeac06cc81f3af043085
9f4362a04e0f381642ddf86fd81a43f2b56f1b96Christian Maeder<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
89390a303afa9ca380fc9b878cffdd88667fdd25Christian Maeder <!--script src="http://yui.yahooapis.com/3.5.0pr2/build/yui/yui.js"></script-->
<p><input type="button" value="Run Tests" id="btnRun" disabled="true"><span id="automationmsg" class="msg-hidden">Currently running tests, with logging disabled to speed up automation. Button will be enabled once complete.</span></p>
filter: (window.location.search.match(/[?&]filter=([^&]+)/) || [])[1] || 'min'
MyWidget.superclass.constructor.apply(this, arguments);
MyWidget.NAME = "myWidget";
MySingleBoxWidget.superclass.constructor.apply(this, arguments);
MySingleBoxWidget.NAME = "mySingleBoxWidget";
var suite = new Y.Test.Suite("Widget Tests");
return new Y.Widget(cfg);
var w = this.createWidget();
w.destroy();
var w = this.createWidget();
w.destroy();
var w = this.createWidget({
w.set("disabled", true);
w.set("height", 100);
w.set("width", 200);
w.set("visible", false);
w.set("tabIndex", 5);
w.destroy();
var w = this.createWidget();
w.set("focused", true);
w.set("rendered", true);
w.set("render", true);
w.set("tabIndex", "foo");
w.destroy();
var w = this.createWidget();
w.destroy();
var w = this.createWidget();
Y.Assert.areEqual("yui3-widget", w._cssPrefix, "Unexpected Prefix");
w.destroy();
var w = this.createWidget({
w.render();
var bbFromDom = Y.Node.one("#widgetRender");
Y.Assert.isTrue(bbFromDom.get("firstChild").compareTo(w.get("contentBox")), "contentBox not first child of boundingBox");
Y.Assert.isTrue(bbFromDom.compareTo(Y.Node.one("body").get("firstChild")), "widget not inserted to body");
w.destroy();
var w = this.createWidget({
w.render("#widgetRenderContainer");
var bbFromDom = Y.Node.one("#widgetRender");
Y.Assert.isTrue(bbFromDom.get("parentNode").compareTo(Y.Node.one("#widgetRenderContainer")), "widget not rendered to container passed to render()");
Y.Assert.isTrue(bbFromDom.get("firstChild").compareTo(w.get("contentBox")), "contentBox not first child of boundingBox");
w.destroy();
var w = this.createWidget();
w.render();
var bb = w.get("boundingBox");
var cb = w.get("contentBox");
w.destroy();
var w = this.createWidget({
var bb = w.get("boundingBox"),
cb = w.get("contentBox");
w.set("height", "200px");
w.set("height", "50%");
w.destroy();
var w = this.createWidget({
var bb = w.get("boundingBox"),
cb = w.get("contentBox");
w.set("width", "200px");
w.set("width", "50%");
w.destroy();
var w = this.createWidget({render:true});
var bb = w.get("boundingBox");
w.set("disabled", true);
w.set("disabled", false);
w.destroy();
var w = this.createWidget({render:true});
var bb = w.get("boundingBox");
w.disable();
w.enable();
w.destroy();
var w = this.createWidget({render:true});
var bb = w.get("boundingBox");
w.focus();
w.blur();
w.destroy();
var w = this.createWidget({render:true});
var bb = w.get("boundingBox");
Y.Assert.isTrue(bb.get("tabIndex") <= 0, "tabIndex should not be set by default"); // default varies across browsers 0 or -1
w.destroy();
w.destroy();
Y.Assert.areEqual("none", bb.getStyle("display"), "Default CSS should hide widget using display:none");
w.destroy();
w.hide();
Y.Assert.areEqual("none", bb.getStyle("display"), "Default CSS should hide widget using display:none");
w.show();
w.destroy();
Y.Assert.isTrue(w.get("boundingBox").get("parentNode").compareTo(container), "boundingBox moved from it's place in the DOM");
w.destroy();
Y.Assert.isTrue(w.get("boundingBox").get("parentNode").compareTo(container), "contentBox moved from it's place in the DOM");
w.destroy();
Y.Assert.isTrue(w.get("boundingBox").get("parentNode").compareTo(container), "bb moved from it's place in the DOM");
w.destroy();
Y.Assert.isTrue(w.get("boundingBox").get("parentNode").compareTo(container), "boundingBox moved from it's place in the DOM");
w.destroy();
Y.Assert.isTrue(w.get("boundingBox").get("parentNode").compareTo(container), "contentBox moved from it's place in the DOM");
w.destroy();
Y.Assert.isTrue(w.get("boundingBox").get("parentNode").compareTo(container), "bb moved from it's place in the DOM");
w.destroy();
Y.Assert.isTrue(w.get("srcNode").compareTo(sn), "srcNode should still be accessible from srcNode attribute");
Y.Assert.isTrue(w.get("boundingBox").get("parentNode").compareTo(container), "srcNode moved from it's place in the DOM");
o.render();
i.render();
Y.Assert.areSame(o, Y.Widget.getByNode(o.get("contentBox")), "Couldn't find outer widget from outer contentBox");
Y.Assert.areSame(o, Y.Widget.getByNode(o.get("boundingBox")), "Couldn't find outer widget from outer boundingBox");
Y.Assert.areSame(i, Y.Widget.getByNode(i.get("contentBox")), "Couldn't find inner widget from inner contentBox");
Y.Assert.areSame(i, Y.Widget.getByNode(i.get("boundingBox")), "Couldn't find inner widget from inner boundingBox");
w.destroy();
Y.Assert.isTrue(n.hasClass("yui3-widget-loading"), "yui3-widget-loading should not have been removed");
w.render();
w.destroy();
w.render();
w.blur();
n.focus();
w.destroy();
w.render();
w.blur();
w.destroy();
w1.render();
w1.blur();
w2.render();
w2.blur();
var n3 = Y.one("body").insertBefore('<a href="#" id="clickme3">Click Me (non widget)</a>', Y.one("body").get("firstChild"));
n1.focus();
n2.focus();
n3.focus();
w1.focus();
w2.focus();
w1.blur();
w2.blur();
w1.destroy();
w2.destroy();
Y.Assert.isTrue(n.hasClass("yui3-mywidget-loading"), "yui3-mywidget-loading should not have been removed");
w.render();
w.destroy();
Y.Assert.isFalse(cb.hasClass("yui3-widget-content"), "cb shouldn't have yui3-widget-content marker");
w.destroy();
w.destroy();
w.set("disabled", true);
w.set("height", 100);
w.set("width", 200);
w.set("visible", false);
w.set("tabIndex", 5);
Y.Assert.areEqual("span", w.get("boundingBox").get("tagName").toLowerCase());
Y.Assert.areEqual("span", w.get("contentBox").get("tagName").toLowerCase());
Y.Assert.areEqual("bb", w.get("boundingBox").get("id"));
w.destroy();
w.destroy();
w.destroy();
var n = Y.Node.create('<div id="srcNode" class="yui3-mysingleboxwidget-loading">Src Node Content</div>');
Y.Assert.isTrue(n.hasClass("yui3-mysingleboxwidget-loading"), "yui3-mysingleboxwidget-loading should not have been removed");
w.render();
Y.Assert.isFalse(w.get("boundingBox").hasClass("yui3-mysingleboxwidget-loading"), "yui3-mysingleboxwidget-loading should have removed");
w.destroy();
w.render();
w.destroy();
Y.Assert.isTrue(bb.hasClass("yui3-mysingleboxwidget-content"), "cb missing yui3-mysingleboxwidget-content marker");
Y.Assert.isFalse(bb.hasClass("yui3-widget-content"), "cb shouldn't have yui3-widget-content marker");
w.render();
Y.Assert.isTrue(bbFromDom.compareTo(Y.Node.one("body").get("firstChild")), "widget not inserted to body");
w.destroy();
Y.Assert.isTrue(bbFromDom.get("parentNode").compareTo(Y.Node.one("#widgetRenderContainer")), "widget not rendered to container passed to render()");
w.destroy();
Y.Assert.isTrue(w.get("boundingBox").get("parentNode").compareTo(container), "boundingBox moved from it's place in the DOM");
w.destroy();
Y.Assert.isTrue(w.get("boundingBox").get("parentNode").compareTo(container), "contentBox moved from it's place in the DOM");
w.destroy();
Y.Assert.isTrue(w.get("boundingBox").get("parentNode").compareTo(container), "boundingBox moved from it's place in the DOM");
w.destroy();
Y.Assert.isTrue(w.get("boundingBox").get("parentNode").compareTo(container), "contentBox moved from it's place in the DOM");
w.destroy();
Y.Assert.isTrue(w.get("srcNode").compareTo(sn), "srcNode should still be accessible from srcNode attribute");
Y.Assert.isTrue(w.get("boundingBox").get("parentNode").compareTo(container), "srcNode moved from it's place in the DOM");
suite.add(new Y.Test.Case(coreTests));
suite.add(new Y.Test.Case(extendedCoreTests));
suite.add(new Y.Test.Case(singleBoxCoreTests));
return (new Y.Widget(cfg));
var w = this.createWidget({
actual.push("onInit");
actual.push("afterInit");
w.on("render", function() {
actual.push("onRender");
w.after("render", function() {
actual.push("afterRender");
w.on("destroy", function() {
actual.push("onDestroy");
w.after("destroy", function() {
actual.push("afterDestroy");
w.render();
w.render();
w.destroy();
Y.ArrayAssert.itemsAreEqual(expected, actual, "Unexpected Lifecycle Events");
var w = this.createWidget();
w.render();
w.on("init", function() {
actual.push("onInit");
w.after("init", function() {
actual.push("afterInit");
w.on("render", function() {
actual.push("onRender");
w.after("render", function() {
actual.push("afterRender");
w.render();
w.destroy();
listeners.on[attrs[i] + "Change"] = onListener;
listeners.after[attrs[i] + "Change"] = afterListener;
var w = this.createWidget(listeners);
w.render();
w.focus();
w.set("visible", false);
w.set("disabled", true);
w.set("height", "100px");
w.set("width", "100px");
w.set("strings", {newStrings: "foo"});
w.set("tabIndex", 7);
w.destroy();
Y.ArrayAssert.itemsAreEqual(expected, actual, "Unexpected attribute change events");
var w = this.createWidget(),
w.on("contentUpdate", function() {
actual.push("onContentUpdate");
w.after("contentUpdate", function() {
actual.push("afterContentUpdate");
w.fire("contentUpdate");
Y.ArrayAssert.itemsAreEqual(expected, actual, "Unexpected content update events");
w.destroy();
var w1 = this.createWidget({
var w2 = this.createWidget({
w1.addTarget(w2);
var bb1 = w1.get("boundingBox"),
bb2 = w2.get("boundingBox");
w2.set("height", "300px");
w1.set("height", "400px");
w1.destroy(true);
w2.destroy(true);
var extendedEventTests = Y.Object(coreEventTests);
Y.mix(extendedEventTests, {
this.__test.push("preconstructor");
MyLifecycleWidget.superclass.constructor.apply(this, arguments);
this.__test.push("postconstructor");
this.__test.push("renderUI");
this.__test.push("bindUI");
this.__test.push("syncUI");
this.__test.push("initializer");
var attr = this.get("lazyAttr");
this.__test.push("destructor");
this.__test.push("lazySetter");
this.__test.push("nonLazySetter");
MyLifecycleWidget.NAME = "myLifecycleWidget";
this.__test.push("onInit");
this.__test.push("onDestroy");
this.__test.push("onRender");
this.__test.push("afterInit");
this.__test.push("afterDestroy");
this.__test.push("afterRender");
w.destroy();
Y.ArrayAssert.itemsAreEqual(expected, w.__test, "Unexpected phase order");
this.__test.push("onInit");
this.__test.push("onDestroy");
this.__test.push("onRender");
this.__test.push("afterInit");
this.__test.push("afterDestroy");
this.__test.push("afterRender");
w.render();
w.render(); // Only once
w.destroy();
Y.ArrayAssert.itemsAreEqual(expected, w.__test, "Unexpected phase order");
MyCustomWidget.superclass.constructor.apply(this, arguments);
// FIXME: Ideally we should be able to do a this.get("titleNode") here. However,
var labelHolder = srcNode.one("> h1");
return labelHolder.get("text");
MyCustomWidget.NAME = "myCustomWidget";
w.render();
var bbFromDom = Y.Node.one("#customWidget");
Y.Assert.isTrue(bbFromDom.get("parentNode").compareTo(Y.Node.one("#customWidgetRenderContainer")), "Custom widget not rendered to container passed to render()");
Y.Assert.isTrue(bbFromDom.get("firstChild").compareTo(w.get("contentBox")), "contentBox not first child of boundingBox");
w.destroy();
var bbFromDom = Y.Node.one("#customWidget");
Y.Assert.isTrue(bbFromDom.get("parentNode").compareTo(Y.Node.one("#customWidgetRenderContainer")), "Custom widget not rendered to container passed to render()");
Y.Assert.isTrue(bbFromDom.get("firstChild").compareTo(w.get("contentBox")), "contentBox not first child of boundingBox");
w.destroy();
var bb = w.get("boundingBox");
w.destroy();
var bb = w.get("contentBox");
w.destroy();
w.render();
var bb = w.get("boundingBox");
Y.Assert.isTrue(bb.hasClass("yui3-mycustomwidget-hidden"), "custom bb should have a hidden marker class");
Y.Assert.areEqual("hidden", bb.getStyle("visibility"), "custom widget should not be visibility:hidden");
w.destroy();
w.render();
var actual = w.get("strings");
Y.ObjectAssert.areEqual(expected, actual, "Unexpected strings");
Y.ObjectAssert.areEqual(actual, expected, "Unexpected strings");
w.destroy();
w.destroy();
var markup = Y.Node.create('<div id="customWidgetContent"><h1>My Label</h1><ul><li>Item1</li><li>Item2</li></ul></div>');
Y.Node.one("body").append(markup);
Y.Assert.areEqual("h1", w.get("titleNode").get("tagName").toLowerCase(), "titleNode not picked up from markup");
Y.Assert.areSame("li", w.get("listNodes").item(0).get("tagName").toLowerCase(), "listNode 0 not picked up from markup");
Y.Assert.areSame("li", w.get("listNodes").item(1).get("tagName").toLowerCase(), "listNode 1 not picked up from markup");
Y.Assert.areSame("Item1", w.get("listNodes").item(0).get("text"), "listNode 0 not picked up from markup");
Y.Assert.areSame("Item2", w.get("listNodes").item(1).get("text"), "listNode 1 not picked up from markup");
w.destroy();
var markup = Y.Node.create('<div id="staticSrcNode"><h1>My Label</h1><ul><li>Item1</li><li>Item2</li></ul></div>');
Y.Node.one("body").append(markup);
StaticSrcNodeWidget.superclass.constructor.apply(this, arguments);
Y.extend(StaticSrcNodeWidget, MyCustomWidget, null, {
Y.Assert.areEqual("h1", w.get("titleNode").get("tagName").toLowerCase(), "titleNode not picked up from markup");
Y.Assert.areSame("li", w.get("listNodes").item(0).get("tagName").toLowerCase(), "listNode 0 not picked up from markup");
Y.Assert.areSame("li", w.get("listNodes").item(1).get("tagName").toLowerCase(), "listNode 1 not picked up from markup");
Y.Assert.areSame("Item1", w.get("listNodes").item(0).get("text"), "listNode 0 not picked up from markup");
Y.Assert.areSame("Item2", w.get("listNodes").item(1).get("text"), "listNode 1 not picked up from markup");
w.destroy();
var w = new Y.Widget();
cb = bb.one( 'div' ),
w = new Y.Widget( {
var w = new Y.Widget().render(),
body = Y.one( 'body' );
body.removeClass( "yui3-skin-sam" );
body.addClass( "yui3-skin-sam" );
w.destroy();
var w = new Y.Widget().render( '#testbed' ),
body = Y.one( 'body' );
body.addClass( "yui3-skin-sam" );
w.destroy();
var w = new Y.Widget({id:"foo"}).render();
w.destroy();
var w = new Y.Widget({id:"foo"}).render();
w.get("contentBox").appendChild(nref);
w.destroy(true);
var w = new Y.Widget();
w.destroy();
w.render();
w.destroy();
w.render();
w.get("contentBox").appendChild(nref);
w.destroy(true);
w = new Y.Widget();
cb = w.get("contentBox");
w.on("click", h);
w.render();
cb.one(".et").simulate("click");
Y.ArrayAssert.itemsAreEqual(expectedEvents, actualEvents);
w.destroy();
w = new Y.Widget();
cb = w.get("contentBox");
w.on({
w.on("widget:mouseup", h);
w.on("foo|widget:mouseup", h);
w.on("mouseup", h);
w.after("widget:mouseup", h);
w.after("foo|widget:mouseup", h);
w.after("mouseup", h);
w.after({
w.render();
cb.one(".et").simulate("mousedown");
cb.one(".et").simulate("mouseup");
cb.one(".et").simulate("click");
Y.ArrayAssert.itemsAreEqual(expectedEvents, actualEvents);
w.destroy();
var outer = new Y.Widget();
var inner = new Y.Widget();
var ocb = outer.get('contentBox');
var icb = inner.get('contentBox');
outer.render();
inner.render(ocb);
ocb.one(".oet").simulate("click");
ocb.one(".iet").simulate("click");
Y.ArrayAssert.itemsAreEqual(expectedEvents, actualEvents);
w1 = new Y.Widget({render:true});
w1.on('click', function (e) {
actualEvents.push("clickOuter");
w2 = new Y1.Widget({render:".w2-container"});
w2.on('click', function (e) {
actualEvents.push("clickInner");
Y.Node.one(".miouter").simulate("click"); // only outer, once.
Y.Node.one(".miinner").simulate("click"); // inner, bubbled to outer (once each, without JS errors)
Y.ArrayAssert.itemsAreEqual(expectedEvents, actualEvents);
w1.destroy();
w2.destroy();
var a = new Y.Widget();
var b = new Y.Widget();
var c = new Y.Widget();
var a1 = Y.clone(a);
var a2 = Y.clone(a1);
var a3 = Y.clone(a2);
var b1 = Y.clone(b);
var b2 = Y.clone(b1);
var b3 = Y.clone(b2);
var c1 = Y.clone(c);
var c2 = Y.clone(c1);
var c3 = Y.clone(c2);
var a = new Y.Widget();
var b = new Y.Widget();
var c = new Y.Widget();
var o1 = Y.clone(o);
var o2 = Y.clone(o1);
var o3 = Y.clone(o2);
var a = new Y.Base();
var b = new Y.Base();
var c = new Y.Base();
var a1 = Y.clone(a);
var a2 = Y.clone(a1);
var a3 = Y.clone(a2);
var b1 = Y.clone(b);
var b2 = Y.clone(b1);
var b3 = Y.clone(b2);
var c1 = Y.clone(c);
var c2 = Y.clone(c1);
var c3 = Y.clone(c2);
var a = new Y.Base();
var b = new Y.Base();
var c = new Y.Base();
var o1 = Y.clone(o);
var o2 = Y.clone(o1);
var o3 = Y.clone(o2);
Y.Test.Runner.setName("Widget Tests");
Y.Test.Runner.add(suite);
Y.Test.Runner.once("begin", function() {
Y.one("#automationmsg").removeClass("msg-hidden");
Y.Test.Runner.once("complete", function() {
Y.one("#automationmsg").addClass("msg-hidden");
var console, runButton = Y.one("#btnRun");
runButton.set("value", "Run Tests");
runButton.set("disabled", false).on("click", function() {
console = new Y.Console({