skypefacebook-workplaceoutlookemailmicrosoft-teamsdiscordmessengercustom-servicesmacoslinuxwindowsinboxwhatsappicloudtweetdeckhipchattelegramhangoutsslackgmail
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
3232 lines
118 KiB
3232 lines
118 KiB
9 years ago
|
describe("Ext.Widget", function() {
|
||
|
var widget;
|
||
|
|
||
|
function defineWidget(first, config) {
|
||
|
Ext.define('spec.Widget', Ext.apply({
|
||
|
extend: 'Ext.Widget'
|
||
|
}, config));
|
||
|
|
||
|
if (!first) {
|
||
|
// The spec wants to run in "not first" mode - this means we need to create
|
||
|
// an instance and throw it away, so that the spec operates on the second
|
||
|
// instance of the Widget ever created.
|
||
|
new spec.Widget();
|
||
|
}
|
||
|
}
|
||
|
|
||
|
afterEach(function() {
|
||
|
if (widget) {
|
||
|
widget.destroy();
|
||
|
}
|
||
|
Ext.undefine('spec.Widget');
|
||
|
});
|
||
|
|
||
|
function makeSuite(first) {
|
||
|
// most specs defined here need to run twice - once as the first instance of a
|
||
|
// Widget that gets created, and once as the second instance. This is needed because
|
||
|
// the first and second instances of a Ext.Widget go down significantly different
|
||
|
// code paths. The first instance creates the Element and caches it as a template
|
||
|
// element that is cloned by successive instances.
|
||
|
describe(first ? "first instance" : "second instance", function() {
|
||
|
it("should have an element when 'element' reference is defined on the main element", function() {
|
||
|
defineWidget(first);
|
||
|
widget = new spec.Widget();
|
||
|
expect(widget.element instanceof Ext.dom.Element).toBe(true);
|
||
|
expect(widget.el).toBe(widget.element);
|
||
|
});
|
||
|
|
||
|
if (first) {
|
||
|
// error thrown on first instance - no need to run these spec for the second instance
|
||
|
it("should throw an error when no 'element' reference is defined", function() {
|
||
|
defineWidget(first, {
|
||
|
element: {}
|
||
|
});
|
||
|
|
||
|
function makeWidget() {
|
||
|
new spec.Widget();
|
||
|
}
|
||
|
|
||
|
expect(makeWidget).toThrow("No 'element' reference found in 'spec.Widget' template.");
|
||
|
});
|
||
|
|
||
|
it("should throw an error if multiple 'element' references are defined", function() {
|
||
|
defineWidget(first, {
|
||
|
element: {
|
||
|
reference: 'element',
|
||
|
children: [{
|
||
|
reference: 'element'
|
||
|
}]
|
||
|
}
|
||
|
});
|
||
|
|
||
|
function makeWidget() {
|
||
|
new spec.Widget();
|
||
|
}
|
||
|
|
||
|
expect(makeWidget).toThrow("Duplicate 'element' reference detected in 'spec.Widget' template.");
|
||
|
});
|
||
|
}
|
||
|
|
||
|
it("should allow the 'element' reference to be a descendant of the main template element", function() {
|
||
|
defineWidget(first, {
|
||
|
element: {
|
||
|
children: [{
|
||
|
cls: 'foo',
|
||
|
reference: 'element'
|
||
|
}]
|
||
|
}
|
||
|
});
|
||
|
|
||
|
widget = new spec.Widget();
|
||
|
|
||
|
expect(widget.element.dom.className).toBe('foo');
|
||
|
});
|
||
|
|
||
|
it("should resolve element references, and remove the 'reference' attributes from the dom", function() {
|
||
|
defineWidget(first, {
|
||
|
element: {
|
||
|
reference: 'element',
|
||
|
children: [{
|
||
|
cls: 'foo',
|
||
|
reference: 'foo',
|
||
|
children: [{
|
||
|
cls: 'baz',
|
||
|
reference: 'baz'
|
||
|
}]
|
||
|
}, {
|
||
|
cls: 'bar',
|
||
|
reference: 'bar'
|
||
|
}]
|
||
|
}
|
||
|
});
|
||
|
|
||
|
widget = new spec.Widget();
|
||
|
|
||
|
expect(widget.foo instanceof Ext.dom.Element).toBe(true);
|
||
|
expect(widget.foo.dom.className).toBe('foo');
|
||
|
expect(widget.foo.dom.getAttribute('reference')).toBeNull();
|
||
|
|
||
|
expect(widget.bar instanceof Ext.dom.Element).toBe(true);
|
||
|
expect(widget.bar.dom.className).toBe('bar');
|
||
|
expect(widget.bar.dom.getAttribute('reference')).toBeNull();
|
||
|
|
||
|
expect(widget.baz instanceof Ext.dom.Element).toBe(true);
|
||
|
expect(widget.baz.dom.className).toBe('baz');
|
||
|
expect(widget.baz.dom.getAttribute('reference')).toBeNull();
|
||
|
|
||
|
expect(widget.element.dom.getAttribute('reference')).toBeNull();
|
||
|
});
|
||
|
|
||
|
it("should set skipGarbageCollection on element references", function() {
|
||
|
defineWidget(first, {
|
||
|
element: {
|
||
|
reference: 'element',
|
||
|
children: [{
|
||
|
reference: 'foo'
|
||
|
}]
|
||
|
}
|
||
|
});
|
||
|
|
||
|
widget = new spec.Widget();
|
||
|
|
||
|
expect(widget.element.skipGarbageCollection).toBe(true);
|
||
|
expect(widget.foo.skipGarbageCollection).toBe(true);
|
||
|
});
|
||
|
|
||
|
it("should generate an id if not configured", function() {
|
||
|
defineWidget(first);
|
||
|
widget = new spec.Widget();
|
||
|
|
||
|
expect(widget.id).toBeDefined();
|
||
|
expect(widget.element.id).toBe(widget.id);
|
||
|
});
|
||
|
|
||
|
it("should use configured id", function() {
|
||
|
var id = 'my-widget';
|
||
|
|
||
|
defineWidget(first);
|
||
|
widget = new spec.Widget({
|
||
|
id: id
|
||
|
});
|
||
|
|
||
|
expect(widget.id).toBe(id);
|
||
|
expect(widget.element.id).toBe(id);
|
||
|
});
|
||
|
|
||
|
it("should add a listener to the main element", function() {
|
||
|
var onClick = jasmine.createSpy();
|
||
|
|
||
|
defineWidget(first, {
|
||
|
element: {
|
||
|
reference: 'element',
|
||
|
listeners: {
|
||
|
click: 'onClick'
|
||
|
}
|
||
|
},
|
||
|
onClick: onClick
|
||
|
});
|
||
|
|
||
|
widget = new spec.Widget();
|
||
|
// must be in the document to receive events
|
||
|
Ext.getBody().appendChild(widget.element);
|
||
|
|
||
|
jasmine.fireMouseEvent(widget.element, 'click');
|
||
|
|
||
|
expect(onClick).toHaveBeenCalled();
|
||
|
expect(onClick.mostRecentCall.object).toBe(widget);
|
||
|
|
||
|
widget.destroy();
|
||
|
});
|
||
|
|
||
|
it("should add listeners to child elements", function() {
|
||
|
var fooScope, barScope, bazScope, jazzScope,
|
||
|
fooClick = jasmine.createSpy(),
|
||
|
barClick = jasmine.createSpy(),
|
||
|
bazClick = jasmine.createSpy(),
|
||
|
jazzClick = jasmine.createSpy();
|
||
|
|
||
|
defineWidget(first, {
|
||
|
element: {
|
||
|
reference: 'element',
|
||
|
children: [{
|
||
|
reference: 'foo',
|
||
|
listeners: {
|
||
|
click: 'fooClick'
|
||
|
}
|
||
|
}, {
|
||
|
cls: 'bar',
|
||
|
reference: 'bar',
|
||
|
listeners: {
|
||
|
// Make sure scope is set correctly for object form
|
||
|
click: {
|
||
|
fn: 'barClick'
|
||
|
}
|
||
|
},
|
||
|
children: [{
|
||
|
reference: 'baz',
|
||
|
listeners: {
|
||
|
click: 'bazClick'
|
||
|
},
|
||
|
scope: {} // make sure this scope is ignored
|
||
|
}, {
|
||
|
reference: 'jazz',
|
||
|
listeners: {
|
||
|
click: {
|
||
|
fn: 'jazzClick',
|
||
|
scope: {} // ignored - scope is always "this"
|
||
|
}
|
||
|
}
|
||
|
}]
|
||
|
}]
|
||
|
},
|
||
|
|
||
|
fooClick: fooClick,
|
||
|
|
||
|
barClick: barClick,
|
||
|
|
||
|
bazClick: bazClick,
|
||
|
|
||
|
jazzClick: jazzClick
|
||
|
});
|
||
|
|
||
|
widget = new spec.Widget();
|
||
|
// must be in the document to receive events
|
||
|
Ext.getBody().appendChild(widget.element);
|
||
|
|
||
|
jasmine.fireMouseEvent(widget.foo, 'click');
|
||
|
expect(fooClick).toHaveBeenCalled();
|
||
|
expect(fooClick.mostRecentCall.object).toBe(widget);
|
||
|
|
||
|
jasmine.fireMouseEvent(widget.bar, 'click');
|
||
|
expect(barClick).toHaveBeenCalled();
|
||
|
expect(barClick.mostRecentCall.object).toBe(widget);
|
||
|
|
||
|
jasmine.fireMouseEvent(widget.baz, 'click');
|
||
|
expect(bazClick).toHaveBeenCalled();
|
||
|
expect(bazClick.mostRecentCall.object).toBe(widget);
|
||
|
|
||
|
jasmine.fireMouseEvent(widget.jazz, 'click');
|
||
|
expect(jazzClick).toHaveBeenCalled();
|
||
|
expect(jazzClick.mostRecentCall.object).toBe(widget);
|
||
|
|
||
|
widget.destroy();
|
||
|
});
|
||
|
});
|
||
|
}
|
||
|
|
||
|
makeSuite(true);
|
||
|
makeSuite(false);
|
||
|
|
||
|
describe("element listener merging", function() {
|
||
|
var SuperWidget, SubWidget, superWidget, subWidget;
|
||
|
|
||
|
it("should not allow listeners declared in a subclass to pollute the superclass cache (no listeners on superclass)", function() {
|
||
|
// https://sencha.jira.com/browse/EXTJS-16984
|
||
|
SuperWidget = Ext.define(null, {
|
||
|
extend: Ext.Widget
|
||
|
});
|
||
|
|
||
|
SubWidget = Ext.define(null, {
|
||
|
extend: SuperWidget,
|
||
|
element: {
|
||
|
reference: 'element',
|
||
|
listeners: {
|
||
|
click: 'onClick'
|
||
|
}
|
||
|
},
|
||
|
onClick: Ext.emptyFn
|
||
|
});
|
||
|
|
||
|
// create an instance of SuperWidget first so that its listener cache gets created
|
||
|
superWidget = new SuperWidget();
|
||
|
|
||
|
// SubWidget should create its own listener cache
|
||
|
subWidget = new SubWidget();
|
||
|
|
||
|
// SubWidget's listeners should not invade SuperWidget's cache
|
||
|
expect(SuperWidget.prototype._elementListeners).toEqual({});
|
||
|
// SubWidget should have its own cache
|
||
|
expect(SubWidget.prototype.hasOwnProperty('_elementListeners')).toBe(true);
|
||
|
});
|
||
|
|
||
|
it("should not allow listeners declared in a subclass to pollute the superclass cache (with listeners on superclass)", function() {
|
||
|
// https://sencha.jira.com/browse/EXTJS-16984
|
||
|
SuperWidget = Ext.define(null, {
|
||
|
extend: Ext.Widget,
|
||
|
element: {
|
||
|
reference: 'element',
|
||
|
listeners: {
|
||
|
mousedown: 'onMouseDown'
|
||
|
}
|
||
|
},
|
||
|
onMouseDown: Ext.emptyFn
|
||
|
});
|
||
|
|
||
|
SubWidget = Ext.define(null, {
|
||
|
extend: SuperWidget,
|
||
|
element: {
|
||
|
reference: 'element',
|
||
|
listeners: {
|
||
|
click: 'onClick'
|
||
|
}
|
||
|
},
|
||
|
onClick: Ext.emptyFn
|
||
|
});
|
||
|
|
||
|
// create an instance of SuperWidget first so that its listener cache gets created
|
||
|
superWidget = new SuperWidget();
|
||
|
|
||
|
// SubWidget should create its own listener cache
|
||
|
subWidget = new SubWidget();
|
||
|
|
||
|
// SubWidget's listeners should not invade SuperWidget's cache
|
||
|
expect(SuperWidget.prototype._elementListeners).toEqual({
|
||
|
element: {
|
||
|
mousedown: 'onMouseDown'
|
||
|
}
|
||
|
});
|
||
|
// SubWidget should have its own cache
|
||
|
expect(SubWidget.prototype.hasOwnProperty('_elementListeners')).toBe(true);
|
||
|
});
|
||
|
|
||
|
describe("when first instance of superclass has already been created", function() {
|
||
|
var superMouseDownSpy, superMouseUpSpy, superClickSpy,
|
||
|
subMouseDownSpy, subMouseUpSpy, subClickSpy;
|
||
|
|
||
|
beforeEach(function() {
|
||
|
superMouseDownSpy = jasmine.createSpy();
|
||
|
superMouseUpSpy = jasmine.createSpy();
|
||
|
superClickSpy = jasmine.createSpy();
|
||
|
|
||
|
subMouseDownSpy = jasmine.createSpy();
|
||
|
subMouseUpSpy = jasmine.createSpy();
|
||
|
subClickSpy = jasmine.createSpy();
|
||
|
});
|
||
|
|
||
|
afterEach(function() {
|
||
|
if (superWidget) {
|
||
|
superWidget.destroy();
|
||
|
}
|
||
|
if (subWidget) {
|
||
|
subWidget.destroy();
|
||
|
}
|
||
|
});
|
||
|
|
||
|
it("should merge subclass element listeners with superclass element listeners", function() {
|
||
|
SuperWidget = Ext.define(null, {
|
||
|
extend: Ext.Widget,
|
||
|
element: {
|
||
|
reference: 'element',
|
||
|
listeners: {
|
||
|
click: 'superOnClick',
|
||
|
mousedown: 'superOnMouseDown'
|
||
|
}
|
||
|
},
|
||
|
superOnClick: superClickSpy,
|
||
|
superOnMouseDown: superMouseDownSpy
|
||
|
});
|
||
|
|
||
|
SubWidget = Ext.define(null, {
|
||
|
extend: SuperWidget,
|
||
|
element: {
|
||
|
reference: 'element',
|
||
|
listeners: {
|
||
|
// inherits mousedown, overrides click, and adds mouseup
|
||
|
click: 'subOnClick',
|
||
|
mouseup: 'subOnMouseUp'
|
||
|
}
|
||
|
},
|
||
|
subOnClick: subClickSpy,
|
||
|
subOnMouseUp: subMouseUpSpy
|
||
|
});
|
||
|
|
||
|
// create an instance of SuperWidget first so that its listener cache gets created
|
||
|
superWidget = new SuperWidget();
|
||
|
|
||
|
subWidget = new SubWidget();
|
||
|
|
||
|
Ext.getBody().appendChild(subWidget.element);
|
||
|
|
||
|
jasmine.fireMouseEvent(subWidget.element, 'click');
|
||
|
|
||
|
expect(superMouseDownSpy.callCount).toBe(1);
|
||
|
expect(superClickSpy).not.toHaveBeenCalled();
|
||
|
expect(subClickSpy.callCount).toBe(1);
|
||
|
expect(subMouseUpSpy.callCount).toBe(1);
|
||
|
});
|
||
|
|
||
|
it("should inherit element listeners from superclass", function() {
|
||
|
SuperWidget = Ext.define(null, {
|
||
|
extend: Ext.Widget,
|
||
|
element: {
|
||
|
reference: 'element',
|
||
|
listeners: {
|
||
|
click: 'superOnClick'
|
||
|
}
|
||
|
},
|
||
|
superOnClick: superClickSpy
|
||
|
});
|
||
|
|
||
|
SubWidget = Ext.define(null, {
|
||
|
extend: SuperWidget
|
||
|
});
|
||
|
|
||
|
// create an instance of SuperWidget first so that its listener cache gets created
|
||
|
superWidget = new SuperWidget();
|
||
|
|
||
|
subWidget = new SubWidget();
|
||
|
|
||
|
Ext.getBody().appendChild(subWidget.element);
|
||
|
|
||
|
jasmine.fireMouseEvent(subWidget.element, 'click');
|
||
|
|
||
|
expect(superClickSpy.callCount).toBe(1);
|
||
|
});
|
||
|
|
||
|
it("should merge subclass child element listeners with superclass child element listeners", function() {
|
||
|
SuperWidget = Ext.define(null, {
|
||
|
extend: Ext.Widget,
|
||
|
element: {
|
||
|
reference: 'element',
|
||
|
children: [{
|
||
|
reference: 'foo',
|
||
|
listeners: {
|
||
|
click: 'superOnClick',
|
||
|
mousedown: 'superOnMouseDown'
|
||
|
}
|
||
|
}]
|
||
|
},
|
||
|
superOnClick: superClickSpy,
|
||
|
superOnMouseDown: superMouseDownSpy
|
||
|
});
|
||
|
|
||
|
SubWidget = Ext.define(null, {
|
||
|
extend: SuperWidget,
|
||
|
element: {
|
||
|
reference: 'element',
|
||
|
children: [{
|
||
|
reference: 'foo',
|
||
|
listeners: {
|
||
|
// inherits mousedown, overrides click, and adds mouseup
|
||
|
click: 'subOnClick',
|
||
|
mouseup: 'subOnMouseUp'
|
||
|
}
|
||
|
}]
|
||
|
},
|
||
|
subOnClick: subClickSpy,
|
||
|
subOnMouseUp: subMouseUpSpy
|
||
|
});
|
||
|
|
||
|
// create an instance of SuperWidget first so that its listener cache gets created
|
||
|
superWidget = new SuperWidget();
|
||
|
|
||
|
subWidget = new SubWidget();
|
||
|
|
||
|
Ext.getBody().appendChild(subWidget.element);
|
||
|
|
||
|
jasmine.fireMouseEvent(subWidget.foo, 'click');
|
||
|
|
||
|
expect(superMouseDownSpy.callCount).toBe(1);
|
||
|
expect(superClickSpy).not.toHaveBeenCalled();
|
||
|
expect(subClickSpy.callCount).toBe(1);
|
||
|
expect(subMouseUpSpy.callCount).toBe(1);
|
||
|
});
|
||
|
|
||
|
it("should inherit child element listeners from superclass", function() {
|
||
|
SuperWidget = Ext.define(null, {
|
||
|
extend: Ext.Widget,
|
||
|
element: {
|
||
|
reference: 'element',
|
||
|
children: [{
|
||
|
reference: 'foo',
|
||
|
listeners: {
|
||
|
click: 'superOnClick'
|
||
|
}
|
||
|
}]
|
||
|
},
|
||
|
superOnClick: superClickSpy
|
||
|
});
|
||
|
|
||
|
SubWidget = Ext.define(null, {
|
||
|
extend: SuperWidget
|
||
|
});
|
||
|
|
||
|
// create an instance of SuperWidget first so that its listener cache gets created
|
||
|
superWidget = new SuperWidget();
|
||
|
|
||
|
subWidget = new SubWidget();
|
||
|
|
||
|
Ext.getBody().appendChild(subWidget.element);
|
||
|
|
||
|
jasmine.fireMouseEvent(subWidget.foo, 'click');
|
||
|
|
||
|
expect(superClickSpy.callCount).toBe(1);
|
||
|
});
|
||
|
|
||
|
it("should add listeners to subclass child elements that do not have a corresponding reference in the superclass template", function() {
|
||
|
SuperWidget = Ext.define(null, {
|
||
|
extend: Ext.Widget,
|
||
|
element: {
|
||
|
reference: 'element',
|
||
|
children: [{
|
||
|
reference: 'foo',
|
||
|
listeners: {
|
||
|
click: 'superOnClick'
|
||
|
}
|
||
|
}]
|
||
|
},
|
||
|
superOnClick: superClickSpy
|
||
|
});
|
||
|
|
||
|
SubWidget = Ext.define(null, {
|
||
|
extend: SuperWidget,
|
||
|
element: {
|
||
|
reference: 'element',
|
||
|
children: [{
|
||
|
reference: 'bar',
|
||
|
listeners: {
|
||
|
click: 'subOnClick'
|
||
|
}
|
||
|
}]
|
||
|
},
|
||
|
subOnClick: subClickSpy
|
||
|
});
|
||
|
|
||
|
// create an instance of SuperWidget first so that its listener cache gets created
|
||
|
superWidget = new SuperWidget();
|
||
|
|
||
|
subWidget = new SubWidget();
|
||
|
|
||
|
Ext.getBody().appendChild(subWidget.element);
|
||
|
|
||
|
jasmine.fireMouseEvent(subWidget.bar, 'click');
|
||
|
|
||
|
expect(superClickSpy.callCount).toBe(0);
|
||
|
expect(subClickSpy.callCount).toBe(1);
|
||
|
});
|
||
|
|
||
|
it("should merge subclass element listeners with superclass element listeners (multiple levels of inheritance)", function() {
|
||
|
var mouseUpSpy = jasmine.createSpy(),
|
||
|
Widget;
|
||
|
|
||
|
SuperWidget = Ext.define(null, {
|
||
|
extend: Ext.Widget,
|
||
|
element: {
|
||
|
reference: 'element',
|
||
|
listeners: {
|
||
|
click: 'superOnClick',
|
||
|
mousedown: 'superOnMouseDown'
|
||
|
}
|
||
|
},
|
||
|
superOnClick: superClickSpy,
|
||
|
superOnMouseDown: superMouseDownSpy
|
||
|
});
|
||
|
|
||
|
SubWidget = Ext.define(null, {
|
||
|
extend: SuperWidget,
|
||
|
element: {
|
||
|
reference: 'element',
|
||
|
listeners: {
|
||
|
// inherits mousedown, overrides click, and adds mouseup
|
||
|
click: 'subOnClick',
|
||
|
mouseup: 'subOnMouseUp'
|
||
|
}
|
||
|
},
|
||
|
subOnClick: subClickSpy,
|
||
|
subOnMouseUp: subMouseUpSpy
|
||
|
});
|
||
|
|
||
|
Widget = Ext.define(null, {
|
||
|
extend: SubWidget,
|
||
|
element: {
|
||
|
reference: 'element',
|
||
|
listeners: {
|
||
|
// overrides mouseup, inherits click/mousedown
|
||
|
mouseup: 'onMouseUp'
|
||
|
}
|
||
|
},
|
||
|
onMouseUp: mouseUpSpy
|
||
|
});
|
||
|
|
||
|
// create an instance of SuperWidget/SubWidget first so that their listener caches get created
|
||
|
superWidget = new SuperWidget();
|
||
|
subWidget = new SubWidget();
|
||
|
widget = new Widget();
|
||
|
|
||
|
Ext.getBody().appendChild(widget.element);
|
||
|
|
||
|
jasmine.fireMouseEvent(widget.element, 'click');
|
||
|
|
||
|
expect(superMouseDownSpy.callCount).toBe(1);
|
||
|
expect(superClickSpy).not.toHaveBeenCalled();
|
||
|
expect(subClickSpy.callCount).toBe(1);
|
||
|
expect(subMouseUpSpy).not.toHaveBeenCalled();
|
||
|
expect(mouseUpSpy.callCount).toBe(1);
|
||
|
});
|
||
|
|
||
|
it("should inherit child element listeners from superclass over multiple inheritance levels", function() {
|
||
|
var Widget;
|
||
|
|
||
|
SuperWidget = Ext.define(null, {
|
||
|
extend: Ext.Widget,
|
||
|
element: {
|
||
|
reference: 'element',
|
||
|
children: [{
|
||
|
reference: 'foo',
|
||
|
listeners: {
|
||
|
click: 'superOnClick'
|
||
|
}
|
||
|
}]
|
||
|
},
|
||
|
superOnClick: superClickSpy
|
||
|
});
|
||
|
|
||
|
SubWidget = Ext.define(null, {
|
||
|
extend: SuperWidget
|
||
|
});
|
||
|
|
||
|
Widget = Ext.define(null, {
|
||
|
extend: SubWidget
|
||
|
});
|
||
|
|
||
|
// create an instance of SuperWidget/SubWidget first so that their listener caches get created
|
||
|
superWidget = new SuperWidget();
|
||
|
subWidget = new SubWidget();
|
||
|
|
||
|
widget = new Widget();
|
||
|
|
||
|
Ext.getBody().appendChild(widget.element);
|
||
|
|
||
|
jasmine.fireMouseEvent(widget.foo, 'click');
|
||
|
|
||
|
expect(superClickSpy.callCount).toBe(1);
|
||
|
});
|
||
|
});
|
||
|
|
||
|
describe("when first instance of superclass has not yet been created", function() {
|
||
|
var superMouseDownSpy, superMouseUpSpy, superClickSpy,
|
||
|
subMouseDownSpy, subMouseUpSpy, subClickSpy;
|
||
|
|
||
|
beforeEach(function() {
|
||
|
superMouseDownSpy = jasmine.createSpy();
|
||
|
superMouseUpSpy = jasmine.createSpy();
|
||
|
superClickSpy = jasmine.createSpy();
|
||
|
|
||
|
subMouseDownSpy = jasmine.createSpy();
|
||
|
subMouseUpSpy = jasmine.createSpy();
|
||
|
subClickSpy = jasmine.createSpy();
|
||
|
});
|
||
|
|
||
|
afterEach(function() {
|
||
|
if (superWidget) {
|
||
|
superWidget.destroy();
|
||
|
}
|
||
|
if (subWidget) {
|
||
|
subWidget.destroy();
|
||
|
}
|
||
|
});
|
||
|
|
||
|
it("should merge subclass element listeners with superclass element listeners", function() {
|
||
|
SuperWidget = Ext.define(null, {
|
||
|
extend: Ext.Widget,
|
||
|
element: {
|
||
|
reference: 'element',
|
||
|
listeners: {
|
||
|
click: 'superOnClick',
|
||
|
mousedown: 'superOnMouseDown'
|
||
|
}
|
||
|
},
|
||
|
superOnClick: superClickSpy,
|
||
|
superOnMouseDown: superMouseDownSpy
|
||
|
});
|
||
|
|
||
|
SubWidget = Ext.define(null, {
|
||
|
extend: SuperWidget,
|
||
|
element: {
|
||
|
reference: 'element',
|
||
|
listeners: {
|
||
|
// inherits mousedown, overrides click, and adds mouseup
|
||
|
click: 'subOnClick',
|
||
|
mouseup: 'subOnMouseUp'
|
||
|
}
|
||
|
},
|
||
|
subOnClick: subClickSpy,
|
||
|
subOnMouseUp: subMouseUpSpy
|
||
|
});
|
||
|
|
||
|
subWidget = new SubWidget();
|
||
|
|
||
|
Ext.getBody().appendChild(subWidget.element);
|
||
|
|
||
|
jasmine.fireMouseEvent(subWidget.element, 'click');
|
||
|
|
||
|
expect(superMouseDownSpy.callCount).toBe(1);
|
||
|
expect(superClickSpy).not.toHaveBeenCalled();
|
||
|
expect(subClickSpy.callCount).toBe(1);
|
||
|
expect(subMouseUpSpy.callCount).toBe(1);
|
||
|
});
|
||
|
|
||
|
it("should inherit element listeners from superclass", function() {
|
||
|
SuperWidget = Ext.define(null, {
|
||
|
extend: Ext.Widget,
|
||
|
element: {
|
||
|
reference: 'element',
|
||
|
listeners: {
|
||
|
click: 'superOnClick'
|
||
|
}
|
||
|
},
|
||
|
superOnClick: superClickSpy
|
||
|
});
|
||
|
|
||
|
SubWidget = Ext.define(null, {
|
||
|
extend: SuperWidget
|
||
|
});
|
||
|
|
||
|
subWidget = new SubWidget();
|
||
|
|
||
|
Ext.getBody().appendChild(subWidget.element);
|
||
|
|
||
|
jasmine.fireMouseEvent(subWidget.element, 'click');
|
||
|
|
||
|
expect(superClickSpy.callCount).toBe(1);
|
||
|
});
|
||
|
|
||
|
it("should merge subclass child element listeners with superclass child element listeners", function() {
|
||
|
SuperWidget = Ext.define(null, {
|
||
|
extend: Ext.Widget,
|
||
|
element: {
|
||
|
reference: 'element',
|
||
|
children: [{
|
||
|
reference: 'foo',
|
||
|
listeners: {
|
||
|
click: 'superOnClick',
|
||
|
mousedown: 'superOnMouseDown'
|
||
|
}
|
||
|
}]
|
||
|
},
|
||
|
superOnClick: superClickSpy,
|
||
|
superOnMouseDown: superMouseDownSpy
|
||
|
});
|
||
|
|
||
|
SubWidget = Ext.define(null, {
|
||
|
extend: SuperWidget,
|
||
|
element: {
|
||
|
reference: 'element',
|
||
|
children: [{
|
||
|
reference: 'foo',
|
||
|
listeners: {
|
||
|
// inherits mousedown, overrides click, and adds mouseup
|
||
|
click: 'subOnClick',
|
||
|
mouseup: 'subOnMouseUp'
|
||
|
}
|
||
|
}]
|
||
|
},
|
||
|
subOnClick: subClickSpy,
|
||
|
subOnMouseUp: subMouseUpSpy
|
||
|
});
|
||
|
|
||
|
subWidget = new SubWidget();
|
||
|
|
||
|
Ext.getBody().appendChild(subWidget.element);
|
||
|
|
||
|
jasmine.fireMouseEvent(subWidget.foo, 'click');
|
||
|
|
||
|
expect(superMouseDownSpy.callCount).toBe(1);
|
||
|
expect(superClickSpy).not.toHaveBeenCalled();
|
||
|
expect(subClickSpy.callCount).toBe(1);
|
||
|
expect(subMouseUpSpy.callCount).toBe(1);
|
||
|
});
|
||
|
|
||
|
it("should inherit child element listeners from superclass", function() {
|
||
|
SuperWidget = Ext.define(null, {
|
||
|
extend: Ext.Widget,
|
||
|
element: {
|
||
|
reference: 'element',
|
||
|
children: [{
|
||
|
reference: 'foo',
|
||
|
listeners: {
|
||
|
click: 'superOnClick'
|
||
|
}
|
||
|
}]
|
||
|
},
|
||
|
superOnClick: superClickSpy
|
||
|
});
|
||
|
|
||
|
SubWidget = Ext.define(null, {
|
||
|
extend: SuperWidget
|
||
|
});
|
||
|
|
||
|
subWidget = new SubWidget();
|
||
|
|
||
|
Ext.getBody().appendChild(subWidget.element);
|
||
|
|
||
|
jasmine.fireMouseEvent(subWidget.foo, 'click');
|
||
|
|
||
|
expect(superClickSpy.callCount).toBe(1);
|
||
|
});
|
||
|
|
||
|
it("should add listeners to subclass child elements that do not have a corresponding reference in the superclass template", function() {
|
||
|
SuperWidget = Ext.define(null, {
|
||
|
extend: Ext.Widget,
|
||
|
element: {
|
||
|
reference: 'element',
|
||
|
children: [{
|
||
|
reference: 'foo',
|
||
|
listeners: {
|
||
|
click: 'superOnClick'
|
||
|
}
|
||
|
}]
|
||
|
},
|
||
|
superOnClick: superClickSpy
|
||
|
});
|
||
|
|
||
|
SubWidget = Ext.define(null, {
|
||
|
extend: SuperWidget,
|
||
|
element: {
|
||
|
reference: 'element',
|
||
|
children: [{
|
||
|
reference: 'bar',
|
||
|
listeners: {
|
||
|
click: 'subOnClick'
|
||
|
}
|
||
|
}]
|
||
|
},
|
||
|
subOnClick: subClickSpy
|
||
|
});
|
||
|
|
||
|
subWidget = new SubWidget();
|
||
|
|
||
|
Ext.getBody().appendChild(subWidget.element);
|
||
|
|
||
|
jasmine.fireMouseEvent(subWidget.bar, 'click');
|
||
|
|
||
|
expect(superClickSpy.callCount).toBe(0);
|
||
|
expect(subClickSpy.callCount).toBe(1);
|
||
|
});
|
||
|
|
||
|
it("should merge subclass element listeners with superclass element listeners (multiple levels of inheritance)", function() {
|
||
|
var mouseUpSpy = jasmine.createSpy(),
|
||
|
Widget;
|
||
|
|
||
|
SuperWidget = Ext.define(null, {
|
||
|
extend: Ext.Widget,
|
||
|
element: {
|
||
|
reference: 'element',
|
||
|
listeners: {
|
||
|
click: 'superOnClick',
|
||
|
mousedown: 'superOnMouseDown'
|
||
|
}
|
||
|
},
|
||
|
superOnClick: superClickSpy,
|
||
|
superOnMouseDown: superMouseDownSpy
|
||
|
});
|
||
|
|
||
|
SubWidget = Ext.define(null, {
|
||
|
extend: SuperWidget,
|
||
|
element: {
|
||
|
reference: 'element',
|
||
|
listeners: {
|
||
|
// inherits mousedown, overrides click, and adds mouseup
|
||
|
click: 'subOnClick',
|
||
|
mouseup: 'subOnMouseUp'
|
||
|
}
|
||
|
},
|
||
|
subOnClick: subClickSpy,
|
||
|
subOnMouseUp: subMouseUpSpy
|
||
|
});
|
||
|
|
||
|
Widget = Ext.define(null, {
|
||
|
extend: SubWidget,
|
||
|
element: {
|
||
|
reference: 'element',
|
||
|
listeners: {
|
||
|
// overrides mouseup, inherits click/mousedown
|
||
|
mouseup: 'onMouseUp'
|
||
|
}
|
||
|
},
|
||
|
onMouseUp: mouseUpSpy
|
||
|
});
|
||
|
|
||
|
widget = new Widget();
|
||
|
|
||
|
Ext.getBody().appendChild(widget.element);
|
||
|
|
||
|
jasmine.fireMouseEvent(widget.element, 'click');
|
||
|
|
||
|
expect(superMouseDownSpy.callCount).toBe(1);
|
||
|
expect(superClickSpy).not.toHaveBeenCalled();
|
||
|
expect(subClickSpy.callCount).toBe(1);
|
||
|
expect(subMouseUpSpy).not.toHaveBeenCalled();
|
||
|
expect(mouseUpSpy.callCount).toBe(1);
|
||
|
});
|
||
|
|
||
|
it("should inherit child element listeners from superclass over multiple inheritance levels", function() {
|
||
|
var Widget;
|
||
|
|
||
|
SuperWidget = Ext.define(null, {
|
||
|
extend: Ext.Widget,
|
||
|
element: {
|
||
|
reference: 'element',
|
||
|
children: [{
|
||
|
reference: 'foo',
|
||
|
listeners: {
|
||
|
click: 'superOnClick'
|
||
|
}
|
||
|
}]
|
||
|
},
|
||
|
superOnClick: superClickSpy
|
||
|
});
|
||
|
|
||
|
SubWidget = Ext.define(null, {
|
||
|
extend: SuperWidget
|
||
|
});
|
||
|
|
||
|
Widget = Ext.define(null, {
|
||
|
extend: SubWidget
|
||
|
});
|
||
|
|
||
|
widget = new Widget();
|
||
|
|
||
|
Ext.getBody().appendChild(widget.element);
|
||
|
|
||
|
jasmine.fireMouseEvent(widget.foo, 'click');
|
||
|
|
||
|
expect(superClickSpy.callCount).toBe(1);
|
||
|
});
|
||
|
});
|
||
|
});
|
||
|
|
||
|
describe("listener scope resolution", function() {
|
||
|
var spies, scopes, Widget, widget, Parent, parent, Grandparent, grandparent,
|
||
|
Controller, ParentController, GrandparentController;
|
||
|
|
||
|
function defineParent(cfg) {
|
||
|
Parent = Ext.define(null, Ext.apply({
|
||
|
extend: 'Ext.Container',
|
||
|
onFoo: spies.parent
|
||
|
}, cfg));
|
||
|
}
|
||
|
|
||
|
function defineGrandparent(cfg) {
|
||
|
Grandparent = Ext.define(null, Ext.apply({
|
||
|
extend: 'Ext.Container',
|
||
|
onFoo: spies.grandparent
|
||
|
}, cfg));
|
||
|
}
|
||
|
|
||
|
function expectScope(scope) {
|
||
|
var scopes = {
|
||
|
widget: widget,
|
||
|
controller: widget.getController(),
|
||
|
parent: parent,
|
||
|
parentController: parent && parent.getController(),
|
||
|
grandparent: grandparent,
|
||
|
grandparentController: grandparent && grandparent.getController()
|
||
|
},
|
||
|
name, spy;
|
||
|
|
||
|
for (name in spies) {
|
||
|
spy = spies[name];
|
||
|
|
||
|
if (name === scope) {
|
||
|
expect(spy).toHaveBeenCalled();
|
||
|
expect(spy.mostRecentCall.object).toBe(scopes[name]);
|
||
|
} else {
|
||
|
expect(spy).not.toHaveBeenCalled();
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
beforeEach(function() {
|
||
|
spies = {
|
||
|
widget: jasmine.createSpy(),
|
||
|
controller: jasmine.createSpy(),
|
||
|
parent: jasmine.createSpy(),
|
||
|
parentController: jasmine.createSpy(),
|
||
|
grandparent: jasmine.createSpy(),
|
||
|
grandparentController: jasmine.createSpy()
|
||
|
};
|
||
|
|
||
|
Controller = Ext.define(null, {
|
||
|
extend: 'Ext.app.ViewController',
|
||
|
onFoo: spies.controller
|
||
|
});
|
||
|
|
||
|
ParentController = Ext.define(null, {
|
||
|
extend: 'Ext.app.ViewController',
|
||
|
onFoo: spies.parentController
|
||
|
});
|
||
|
|
||
|
GrandparentController = Ext.define(null, {
|
||
|
extend: 'Ext.app.ViewController',
|
||
|
onFoo: spies.grandparentController
|
||
|
});
|
||
|
});
|
||
|
|
||
|
afterEach(function() {
|
||
|
if (widget) {
|
||
|
widget.destroy();
|
||
|
}
|
||
|
if (parent) {
|
||
|
parent.destroy();
|
||
|
}
|
||
|
if (grandparent) {
|
||
|
grandparent.destroy();
|
||
|
}
|
||
|
});
|
||
|
|
||
|
describe("listener declared on class body", function() {
|
||
|
function defineWidget(cfg) {
|
||
|
Widget = Ext.define(null, Ext.merge({
|
||
|
extend: 'Ext.Widget',
|
||
|
listeners: {
|
||
|
foo: 'onFoo'
|
||
|
},
|
||
|
onFoo: spies.widget
|
||
|
}, cfg));
|
||
|
}
|
||
|
|
||
|
it("should resolve to the widget with unspecified scope", function() {
|
||
|
defineWidget();
|
||
|
widget = new Widget();
|
||
|
widget.fireEvent('foo');
|
||
|
expectScope('widget');
|
||
|
});
|
||
|
|
||
|
it("should fail with scope:'controller'", function() {
|
||
|
defineWidget({
|
||
|
listeners: {
|
||
|
scope: 'controller'
|
||
|
}
|
||
|
});
|
||
|
widget = new Widget();
|
||
|
expect(function() {
|
||
|
widget.fireEvent('foo');
|
||
|
}).toThrow();
|
||
|
});
|
||
|
|
||
|
it("should resolve to the widget with scope:'this'", function() {
|
||
|
defineWidget({
|
||
|
listeners: {
|
||
|
scope: 'this'
|
||
|
}
|
||
|
});
|
||
|
widget = new Widget();
|
||
|
widget.fireEvent('foo');
|
||
|
expectScope('widget');
|
||
|
});
|
||
|
|
||
|
describe("with view controller", function() {
|
||
|
it("should resolve to the view controller with unspecified scope", function() {
|
||
|
defineWidget({
|
||
|
controller: new Controller()
|
||
|
});
|
||
|
widget = new Widget();
|
||
|
widget.fireEvent('foo');
|
||
|
expectScope('controller');
|
||
|
});
|
||
|
|
||
|
it("should resolve to the view controller with scope:'controller'", function() {
|
||
|
defineWidget({
|
||
|
controller: new Controller(),
|
||
|
listeners: {
|
||
|
scope: 'controller'
|
||
|
}
|
||
|
});
|
||
|
widget = new Widget();
|
||
|
widget.fireEvent('foo');
|
||
|
expectScope('controller');
|
||
|
});
|
||
|
|
||
|
it("should resolve to the widget with scope:'this'", function() {
|
||
|
defineWidget({
|
||
|
controller: new Controller(),
|
||
|
listeners: {
|
||
|
scope: 'this'
|
||
|
}
|
||
|
});
|
||
|
widget = new Widget();
|
||
|
widget.fireEvent('foo');
|
||
|
expectScope('widget');
|
||
|
});
|
||
|
});
|
||
|
|
||
|
describe("with defaultListenerScope", function() {
|
||
|
it("should resolve to the widget with unspecified scope", function() {
|
||
|
defineWidget({
|
||
|
defaultListenerScope: true
|
||
|
});
|
||
|
widget = new Widget();
|
||
|
widget.fireEvent('foo');
|
||
|
expectScope('widget');
|
||
|
});
|
||
|
|
||
|
it("should fail with scope:'controller'", function() {
|
||
|
defineWidget({
|
||
|
defaultListenerScope: true,
|
||
|
listeners: {
|
||
|
scope: 'controller'
|
||
|
}
|
||
|
});
|
||
|
widget = new Widget();
|
||
|
expect(function() {
|
||
|
widget.fireEvent('foo');
|
||
|
}).toThrow();
|
||
|
});
|
||
|
|
||
|
it("should resolve to the widget with scope:'this'", function() {
|
||
|
defineWidget({
|
||
|
defaultListenerScope: true,
|
||
|
listeners: {
|
||
|
scope: 'this'
|
||
|
}
|
||
|
});
|
||
|
widget = new Widget();
|
||
|
widget.fireEvent('foo');
|
||
|
expectScope('widget');
|
||
|
});
|
||
|
});
|
||
|
|
||
|
describe("with view controller and defaultListenerScope", function() {
|
||
|
it("should resolve to the widget with unspecified scope", function() {
|
||
|
defineWidget({
|
||
|
controller: new Controller(),
|
||
|
defaultListenerScope: true
|
||
|
});
|
||
|
widget = new Widget();
|
||
|
widget.fireEvent('foo');
|
||
|
expectScope('widget');
|
||
|
});
|
||
|
|
||
|
it("should resolve to the view controller with scope:'controller'", function() {
|
||
|
defineWidget({
|
||
|
controller: new Controller(),
|
||
|
defaultListenerScope: true,
|
||
|
listeners: {
|
||
|
scope: 'controller'
|
||
|
}
|
||
|
});
|
||
|
widget = new Widget();
|
||
|
widget.fireEvent('foo');
|
||
|
expectScope('controller');
|
||
|
});
|
||
|
|
||
|
it("should resolve to the widget with scope:'this'", function() {
|
||
|
defineWidget({
|
||
|
controller: new Controller(),
|
||
|
defaultListenerScope: true,
|
||
|
listeners: {
|
||
|
scope: 'this'
|
||
|
}
|
||
|
});
|
||
|
widget = new Widget();
|
||
|
widget.fireEvent('foo');
|
||
|
expectScope('widget');
|
||
|
});
|
||
|
});
|
||
|
|
||
|
describe("with defaultListenerScope on parent", function() {
|
||
|
beforeEach(function() {
|
||
|
defineParent({
|
||
|
defaultListenerScope: true
|
||
|
});
|
||
|
});
|
||
|
|
||
|
it("should resolve to the parent with unspecified scope", function() {
|
||
|
defineWidget();
|
||
|
widget = new Widget();
|
||
|
parent = new Parent({
|
||
|
items: widget
|
||
|
});
|
||
|
widget.fireEvent('foo');
|
||
|
expectScope('parent');
|
||
|
});
|
||
|
|
||
|
it("should fail with scope:'controller'", function() {
|
||
|
defineWidget({
|
||
|
listeners: {
|
||
|
scope: 'controller'
|
||
|
}
|
||
|
});
|
||
|
widget = new Widget();
|
||
|
parent = new Parent({
|
||
|
items: widget
|
||
|
});
|
||
|
expect(function() {
|
||
|
widget.fireEvent('foo');
|
||
|
}).toThrow();
|
||
|
});
|
||
|
|
||
|
it("should resolve to the widget with scope:'this'", function() {
|
||
|
defineWidget({
|
||
|
listeners: {
|
||
|
scope: 'this'
|
||
|
}
|
||
|
});
|
||
|
widget = new Widget();
|
||
|
parent = new Parent({
|
||
|
items: widget
|
||
|
});
|
||
|
widget.fireEvent('foo');
|
||
|
expectScope('widget');
|
||
|
});
|
||
|
});
|
||
|
|
||
|
describe("with view controller on parent", function() {
|
||
|
beforeEach(function() {
|
||
|
defineParent({
|
||
|
controller: new ParentController()
|
||
|
});
|
||
|
});
|
||
|
|
||
|
it("should resolve to the parent view controller with unspecified scope", function() {
|
||
|
defineWidget();
|
||
|
widget = new Widget();
|
||
|
parent = new Parent({
|
||
|
items: widget
|
||
|
});
|
||
|
widget.fireEvent('foo');
|
||
|
expectScope('parentController');
|
||
|
});
|
||
|
|
||
|
it("should resolve to the parent view controller with scope:'controller'", function() {
|
||
|
defineWidget({
|
||
|
listeners: {
|
||
|
scope: 'controller'
|
||
|
}
|
||
|
});
|
||
|
widget = new Widget();
|
||
|
parent = new Parent({
|
||
|
items: widget
|
||
|
});
|
||
|
widget.fireEvent('foo');
|
||
|
expectScope('parentController');
|
||
|
});
|
||
|
|
||
|
it("should resolve to the widget with scope:'this'", function() {
|
||
|
defineWidget({
|
||
|
listeners: {
|
||
|
scope: 'this'
|
||
|
}
|
||
|
});
|
||
|
widget = new Widget();
|
||
|
parent = new Parent({
|
||
|
items: widget
|
||
|
});
|
||
|
widget.fireEvent('foo');
|
||
|
expectScope('widget');
|
||
|
});
|
||
|
});
|
||
|
|
||
|
describe("with view controller and defaultListenerScope on parent", function() {
|
||
|
beforeEach(function() {
|
||
|
defineParent({
|
||
|
controller: new ParentController(),
|
||
|
defaultListenerScope: true
|
||
|
})
|
||
|
});
|
||
|
|
||
|
it("should resolve to the parent with unspecified scope", function() {
|
||
|
defineWidget();
|
||
|
widget = new Widget();
|
||
|
parent = new Parent({
|
||
|
items: widget
|
||
|
});
|
||
|
widget.fireEvent('foo');
|
||
|
expectScope('parent');
|
||
|
});
|
||
|
|
||
|
it("should resolve to the parent view controller with scope:'controller'", function() {
|
||
|
defineWidget({
|
||
|
listeners: {
|
||
|
scope: 'controller'
|
||
|
}
|
||
|
});
|
||
|
widget = new Widget();
|
||
|
parent = new Parent({
|
||
|
items: widget
|
||
|
});
|
||
|
widget.fireEvent('foo');
|
||
|
expectScope('parentController');
|
||
|
});
|
||
|
|
||
|
it("should resolve to the widget with scope:'this'", function() {
|
||
|
defineWidget({
|
||
|
listeners: {
|
||
|
scope: 'this'
|
||
|
}
|
||
|
});
|
||
|
widget = new Widget();
|
||
|
parent = new Parent({
|
||
|
items: widget
|
||
|
});
|
||
|
widget.fireEvent('foo');
|
||
|
expectScope('widget');
|
||
|
});
|
||
|
});
|
||
|
|
||
|
describe("with defaultListenerScope on grandparent", function() {
|
||
|
beforeEach(function() {
|
||
|
defineGrandparent({
|
||
|
defaultListenerScope: true
|
||
|
});
|
||
|
});
|
||
|
|
||
|
it("should resolve to the grandparent with unspecified scope", function() {
|
||
|
defineWidget();
|
||
|
widget = new Widget();
|
||
|
grandparent = new Grandparent({
|
||
|
items: {
|
||
|
items: widget
|
||
|
}
|
||
|
});
|
||
|
widget.fireEvent('foo');
|
||
|
expectScope('grandparent');
|
||
|
});
|
||
|
|
||
|
it("should fail with scope:'controller'", function() {
|
||
|
defineWidget({
|
||
|
listeners: {
|
||
|
scope: 'controller'
|
||
|
}
|
||
|
});
|
||
|
widget = new Widget();
|
||
|
grandparent = new Grandparent({
|
||
|
items: {
|
||
|
items: widget
|
||
|
}
|
||
|
});
|
||
|
expect(function() {
|
||
|
widget.fireEvent('foo');
|
||
|
}).toThrow();
|
||
|
});
|
||
|
|
||
|
it("should resolve to the widget with scope:'this'", function() {
|
||
|
defineWidget({
|
||
|
listeners: {
|
||
|
scope: 'this'
|
||
|
}
|
||
|
});
|
||
|
widget = new Widget();
|
||
|
grandparent = new Grandparent({
|
||
|
items: {
|
||
|
items: widget
|
||
|
}
|
||
|
});
|
||
|
widget.fireEvent('foo');
|
||
|
expectScope('widget');
|
||
|
});
|
||
|
});
|
||
|
|
||
|
describe("with view controller on grandparent", function() {
|
||
|
beforeEach(function() {
|
||
|
defineGrandparent({
|
||
|
controller: new GrandparentController()
|
||
|
});
|
||
|
});
|
||
|
|
||
|
it("should resolve to the grandparent view controller with unspecified scope", function() {
|
||
|
defineWidget();
|
||
|
widget = new Widget();
|
||
|
grandparent = new Grandparent({
|
||
|
items: {
|
||
|
items: widget
|
||
|
}
|
||
|
});
|
||
|
widget.fireEvent('foo');
|
||
|
expectScope('grandparentController');
|
||
|
});
|
||
|
|
||
|
it("should resolve to the grandparent view controller with scope:'controller'", function() {
|
||
|
defineWidget({
|
||
|
listeners: {
|
||
|
scope: 'controller'
|
||
|
}
|
||
|
});
|
||
|
widget = new Widget();
|
||
|
grandparent = new Grandparent({
|
||
|
items: {
|
||
|
items: widget
|
||
|
}
|
||
|
});
|
||
|
widget.fireEvent('foo');
|
||
|
expectScope('grandparentController');
|
||
|
});
|
||
|
|
||
|
it("should resolve to the widget with scope:'this'", function() {
|
||
|
defineWidget({
|
||
|
listeners: {
|
||
|
scope: 'this'
|
||
|
}
|
||
|
});
|
||
|
widget = new Widget();
|
||
|
grandparent = new Grandparent({
|
||
|
items: {
|
||
|
items: widget
|
||
|
}
|
||
|
});
|
||
|
widget.fireEvent('foo');
|
||
|
expectScope('widget');
|
||
|
});
|
||
|
});
|
||
|
|
||
|
describe("with view controller and defaultListenerScope on grandparent", function() {
|
||
|
beforeEach(function() {
|
||
|
defineGrandparent({
|
||
|
controller: new GrandparentController(),
|
||
|
defaultListenerScope: true
|
||
|
});
|
||
|
});
|
||
|
|
||
|
it("should resolve to the grandparent with unspecified scope", function() {
|
||
|
defineWidget();
|
||
|
widget = new Widget();
|
||
|
grandparent = new Grandparent({
|
||
|
items: {
|
||
|
items: widget
|
||
|
}
|
||
|
});
|
||
|
widget.fireEvent('foo');
|
||
|
expectScope('grandparent');
|
||
|
});
|
||
|
|
||
|
it("should resolve to the grandparent view controller with scope:'controller'", function() {
|
||
|
defineWidget({
|
||
|
listeners: {
|
||
|
scope: 'controller'
|
||
|
}
|
||
|
});
|
||
|
widget = new Widget();
|
||
|
grandparent = new Grandparent({
|
||
|
items: {
|
||
|
items: widget
|
||
|
}
|
||
|
});
|
||
|
widget.fireEvent('foo');
|
||
|
expectScope('grandparentController');
|
||
|
});
|
||
|
|
||
|
it("should resolve to the widget with scope:'this'", function() {
|
||
|
defineWidget({
|
||
|
listeners: {
|
||
|
scope: 'this'
|
||
|
}
|
||
|
});
|
||
|
widget = new Widget();
|
||
|
grandparent = new Grandparent({
|
||
|
items: {
|
||
|
items: widget
|
||
|
}
|
||
|
});
|
||
|
widget.fireEvent('foo');
|
||
|
expectScope('widget');
|
||
|
});
|
||
|
});
|
||
|
|
||
|
describe("with view controller on child and view controller on parent", function() {
|
||
|
beforeEach(function() {
|
||
|
defineParent({
|
||
|
controller: new ParentController()
|
||
|
});
|
||
|
});
|
||
|
|
||
|
it("should resolve to the child view controller with unspecified scope", function() {
|
||
|
defineWidget({
|
||
|
controller: new Controller()
|
||
|
});
|
||
|
widget = new Widget();
|
||
|
parent = new Parent({
|
||
|
items: widget
|
||
|
});
|
||
|
widget.fireEvent('foo');
|
||
|
expectScope('controller');
|
||
|
});
|
||
|
|
||
|
it("should resolve to the child view controller with scope:'controller'", function() {
|
||
|
defineWidget({
|
||
|
controller: new Controller(),
|
||
|
listeners: {
|
||
|
scope: 'controller'
|
||
|
}
|
||
|
});
|
||
|
widget = new Widget();
|
||
|
parent = new Parent({
|
||
|
items: widget
|
||
|
});
|
||
|
widget.fireEvent('foo');
|
||
|
expectScope('controller');
|
||
|
});
|
||
|
|
||
|
it("should resolve to the widget with scope:'this'", function() {
|
||
|
defineWidget({
|
||
|
controller: new Controller(),
|
||
|
listeners: {
|
||
|
scope: 'this'
|
||
|
}
|
||
|
});
|
||
|
widget = new Widget();
|
||
|
parent = new Parent({
|
||
|
items: widget
|
||
|
});
|
||
|
widget.fireEvent('foo');
|
||
|
expectScope('widget');
|
||
|
});
|
||
|
});
|
||
|
|
||
|
describe("with view controller on child and view controller on grandparent", function() {
|
||
|
beforeEach(function() {
|
||
|
defineGrandparent({
|
||
|
controller: new GrandparentController()
|
||
|
});
|
||
|
});
|
||
|
|
||
|
it("should resolve to the child view controller with unspecified scope", function() {
|
||
|
defineWidget({
|
||
|
controller: new Controller()
|
||
|
});
|
||
|
widget = new Widget();
|
||
|
grandparent = new Grandparent({
|
||
|
items: {
|
||
|
items: widget
|
||
|
}
|
||
|
});
|
||
|
widget.fireEvent('foo');
|
||
|
expectScope('controller');
|
||
|
});
|
||
|
|
||
|
it("should resolve to the child view controller with scope:'controller'", function() {
|
||
|
defineWidget({
|
||
|
controller: new Controller(),
|
||
|
listeners: {
|
||
|
scope: 'controller'
|
||
|
}
|
||
|
});
|
||
|
widget = new Widget();
|
||
|
grandparent = new Grandparent({
|
||
|
items: {
|
||
|
items: widget
|
||
|
}
|
||
|
});
|
||
|
widget.fireEvent('foo');
|
||
|
expectScope('controller');
|
||
|
});
|
||
|
|
||
|
it("should resolve to the widget with scope:'this'", function() {
|
||
|
defineWidget({
|
||
|
controller: new Controller(),
|
||
|
listeners: {
|
||
|
scope: 'this'
|
||
|
}
|
||
|
});
|
||
|
widget = new Widget();
|
||
|
grandparent = new Grandparent({
|
||
|
items: {
|
||
|
items: widget
|
||
|
}
|
||
|
});
|
||
|
widget.fireEvent('foo');
|
||
|
expectScope('widget');
|
||
|
});
|
||
|
});
|
||
|
|
||
|
describe("with view controller on child and defaultListenerScope on parent", function() {
|
||
|
beforeEach(function() {
|
||
|
defineParent({
|
||
|
defaultListenerScope: true
|
||
|
});
|
||
|
});
|
||
|
|
||
|
it("should resolve to the child view controller with unspecified scope", function() {
|
||
|
defineWidget({
|
||
|
controller: new Controller()
|
||
|
});
|
||
|
widget = new Widget();
|
||
|
parent = new Parent({
|
||
|
items: widget
|
||
|
});
|
||
|
widget.fireEvent('foo');
|
||
|
expectScope('controller');
|
||
|
});
|
||
|
|
||
|
it("should resolve to the child view controller with scope:'controller'", function() {
|
||
|
defineWidget({
|
||
|
controller: new Controller(),
|
||
|
listeners: {
|
||
|
scope: 'controller'
|
||
|
}
|
||
|
});
|
||
|
widget = new Widget();
|
||
|
parent = new Parent({
|
||
|
items: widget
|
||
|
});
|
||
|
widget.fireEvent('foo');
|
||
|
expectScope('controller');
|
||
|
});
|
||
|
|
||
|
it("should resolve to the widget with scope:'this'", function() {
|
||
|
defineWidget({
|
||
|
controller: new Controller(),
|
||
|
listeners: {
|
||
|
scope: 'this'
|
||
|
}
|
||
|
});
|
||
|
widget = new Widget();
|
||
|
parent = new Parent({
|
||
|
items: widget
|
||
|
});
|
||
|
widget.fireEvent('foo');
|
||
|
expectScope('widget');
|
||
|
});
|
||
|
});
|
||
|
|
||
|
describe("with view controller on parent and defaultListenerScope on child", function() {
|
||
|
beforeEach(function() {
|
||
|
defineParent({
|
||
|
controller: new ParentController()
|
||
|
});
|
||
|
});
|
||
|
|
||
|
it("should resolve to the widget with unspecified scope", function() {
|
||
|
defineWidget({
|
||
|
defaultListenerScope: true
|
||
|
});
|
||
|
widget = new Widget();
|
||
|
parent = new Parent({
|
||
|
items: widget
|
||
|
});
|
||
|
widget.fireEvent('foo');
|
||
|
expectScope('widget');
|
||
|
});
|
||
|
|
||
|
it("should resolve to the parent view controller with scope:'controller'", function() {
|
||
|
defineWidget({
|
||
|
defaultListenerScope: true,
|
||
|
listeners: {
|
||
|
scope: 'controller'
|
||
|
}
|
||
|
});
|
||
|
widget = new Widget();
|
||
|
parent = new Parent({
|
||
|
items: widget
|
||
|
});
|
||
|
widget.fireEvent('foo');
|
||
|
expectScope('parentController');
|
||
|
});
|
||
|
|
||
|
it("should resolve to the widget with scope:'this'", function() {
|
||
|
defineWidget({
|
||
|
defaultListenerScope: true,
|
||
|
listeners: {
|
||
|
scope: 'this'
|
||
|
}
|
||
|
});
|
||
|
widget = new Widget();
|
||
|
parent = new Parent({
|
||
|
items: widget
|
||
|
});
|
||
|
widget.fireEvent('foo');
|
||
|
expectScope('widget');
|
||
|
});
|
||
|
});
|
||
|
|
||
|
describe("with view controller on child and defaultListenerScope on grandparent", function() {
|
||
|
beforeEach(function() {
|
||
|
defineGrandparent({
|
||
|
defaultListenerScope: true
|
||
|
});
|
||
|
});
|
||
|
|
||
|
it("should resolve to the child view controller with unspecified scope", function() {
|
||
|
defineWidget({
|
||
|
controller: new Controller()
|
||
|
});
|
||
|
widget = new Widget();
|
||
|
grandparent = new Grandparent({
|
||
|
items: {
|
||
|
items: widget
|
||
|
}
|
||
|
});
|
||
|
widget.fireEvent('foo');
|
||
|
expectScope('controller');
|
||
|
});
|
||
|
|
||
|
it("should resolve to the child view controller with scope:'controller'", function() {
|
||
|
defineWidget({
|
||
|
controller: new Controller(),
|
||
|
listeners: {
|
||
|
scope: 'controller'
|
||
|
}
|
||
|
});
|
||
|
widget = new Widget();
|
||
|
grandparent = new Grandparent({
|
||
|
items: {
|
||
|
items: widget
|
||
|
}
|
||
|
});
|
||
|
widget.fireEvent('foo');
|
||
|
expectScope('controller');
|
||
|
});
|
||
|
|
||
|
it("should resolve to the widget with scope:'this'", function() {
|
||
|
defineWidget({
|
||
|
controller: new Controller(),
|
||
|
listeners: {
|
||
|
scope: 'this'
|
||
|
}
|
||
|
});
|
||
|
widget = new Widget();
|
||
|
grandparent = new Grandparent({
|
||
|
items: {
|
||
|
items: widget
|
||
|
}
|
||
|
});
|
||
|
widget.fireEvent('foo');
|
||
|
expectScope('widget');
|
||
|
});
|
||
|
});
|
||
|
|
||
|
describe("with view controller on grandparent and defaultListenerScope on child", function() {
|
||
|
beforeEach(function() {
|
||
|
defineGrandparent({
|
||
|
controller: new GrandparentController()
|
||
|
});
|
||
|
});
|
||
|
|
||
|
it("should resolve to the widget with unspecified scope", function() {
|
||
|
defineWidget({
|
||
|
defaultListenerScope: true
|
||
|
});
|
||
|
widget = new Widget();
|
||
|
grandparent = new Grandparent({
|
||
|
items: {
|
||
|
items: widget
|
||
|
}
|
||
|
});
|
||
|
widget.fireEvent('foo');
|
||
|
expectScope('widget');
|
||
|
});
|
||
|
|
||
|
it("should resolve to the grandparent view controller with scope:'controller'", function() {
|
||
|
defineWidget({
|
||
|
defaultListenerScope: true,
|
||
|
listeners: {
|
||
|
scope: 'controller'
|
||
|
}
|
||
|
});
|
||
|
widget = new Widget();
|
||
|
grandparent = new Grandparent({
|
||
|
items: {
|
||
|
items: widget
|
||
|
}
|
||
|
});
|
||
|
widget.fireEvent('foo');
|
||
|
expectScope('grandparentController');
|
||
|
});
|
||
|
|
||
|
it("should resolve to the widget with scope:'this'", function() {
|
||
|
defineWidget({
|
||
|
defaultListenerScope: true,
|
||
|
listeners: {
|
||
|
scope: 'this'
|
||
|
}
|
||
|
});
|
||
|
widget = new Widget();
|
||
|
grandparent = new Grandparent({
|
||
|
items: {
|
||
|
items: widget
|
||
|
}
|
||
|
});
|
||
|
widget.fireEvent('foo');
|
||
|
expectScope('widget');
|
||
|
});
|
||
|
});
|
||
|
|
||
|
describe("with scope declared on inner object", function() {
|
||
|
it("should resolve to controller with unspecified outer scope", function() {
|
||
|
defineWidget({
|
||
|
defaultListenerScope: true,
|
||
|
controller: new Controller(),
|
||
|
listeners: {
|
||
|
foo: {
|
||
|
fn: 'onFoo',
|
||
|
scope: 'controller'
|
||
|
}
|
||
|
}
|
||
|
});
|
||
|
widget = new Widget();
|
||
|
widget.fireEvent('foo');
|
||
|
expectScope('controller');
|
||
|
});
|
||
|
|
||
|
it("should resolve to controller with outer scope of controller", function() {
|
||
|
defineWidget({
|
||
|
defaultListenerScope: true,
|
||
|
controller: new Controller(),
|
||
|
listeners: {
|
||
|
scope: 'controller',
|
||
|
foo: {
|
||
|
fn: 'onFoo',
|
||
|
scope: 'controller'
|
||
|
}
|
||
|
}
|
||
|
});
|
||
|
widget = new Widget();
|
||
|
widget.fireEvent('foo');
|
||
|
expectScope('controller');
|
||
|
});
|
||
|
});
|
||
|
|
||
|
describe("with handler declared as a function reference", function() {
|
||
|
var handler, scope;
|
||
|
|
||
|
function defineWidget(cfg) {
|
||
|
Widget = Ext.define(null, Ext.merge({
|
||
|
extend: 'Ext.Widget',
|
||
|
listeners: {
|
||
|
foo: handler
|
||
|
}
|
||
|
}, cfg))
|
||
|
}
|
||
|
|
||
|
beforeEach(function() {
|
||
|
handler = jasmine.createSpy();
|
||
|
handler.andCallFake(function() {
|
||
|
scope = this;
|
||
|
});
|
||
|
});
|
||
|
|
||
|
afterEach(function() {
|
||
|
scope = null;
|
||
|
});
|
||
|
|
||
|
it("should use the widget as the default scope", function() {
|
||
|
defineWidget();
|
||
|
widget = new Widget();
|
||
|
widget.fireEvent('foo');
|
||
|
expect(handler).toHaveBeenCalled();
|
||
|
expect(handler.mostRecentCall.object).toBe(widget);
|
||
|
});
|
||
|
|
||
|
it("should use an arbitrary object as the scope", function() {
|
||
|
var obj = {};
|
||
|
|
||
|
defineWidget({
|
||
|
listeners: {
|
||
|
scope: obj
|
||
|
}
|
||
|
});
|
||
|
widget = new Widget();
|
||
|
widget.fireEvent('foo');
|
||
|
expect(scope).toBe(scope);
|
||
|
});
|
||
|
|
||
|
it("should use the widget with scope:'this'", function() {
|
||
|
defineWidget({
|
||
|
listeners: {
|
||
|
scope: 'this'
|
||
|
}
|
||
|
});
|
||
|
widget = new Widget();
|
||
|
widget.fireEvent('foo');
|
||
|
expect(scope).toBe(widget);
|
||
|
});
|
||
|
|
||
|
it("should fail with scope:'controller'", function() {
|
||
|
defineWidget({
|
||
|
listeners: {
|
||
|
scope: 'controller'
|
||
|
}
|
||
|
});
|
||
|
widget = new Widget();
|
||
|
expect(function() {
|
||
|
widget.fireEvent('foo');
|
||
|
}).toThrow();
|
||
|
});
|
||
|
|
||
|
it("should use the widget with scope:'this' specified on an inner object", function() {
|
||
|
defineWidget({
|
||
|
listeners: {
|
||
|
foo: {
|
||
|
fn: handler,
|
||
|
scope: 'this'
|
||
|
}
|
||
|
}
|
||
|
});
|
||
|
widget = new Widget();
|
||
|
widget.fireEvent('foo');
|
||
|
expect(scope).toBe(widget);
|
||
|
});
|
||
|
|
||
|
it("should fail with scope:'controller' specified on an inner object", function() {
|
||
|
defineWidget({
|
||
|
listeners: {
|
||
|
foo: {
|
||
|
fn: handler,
|
||
|
scope: 'controller'
|
||
|
}
|
||
|
}
|
||
|
});
|
||
|
widget = new Widget();
|
||
|
expect(function() {
|
||
|
widget.fireEvent('foo');
|
||
|
}).toThrow();
|
||
|
});
|
||
|
|
||
|
describe("with view controller", function() {
|
||
|
it("should resolve to the widget with unspecified scope", function() {
|
||
|
defineWidget({
|
||
|
controller: new Controller()
|
||
|
});
|
||
|
widget = new Widget();
|
||
|
widget.fireEvent('foo');
|
||
|
expect(scope).toBe(widget);
|
||
|
});
|
||
|
|
||
|
it("should resolve to the view controller with scope:'controller'", function() {
|
||
|
defineWidget({
|
||
|
controller: new Controller(),
|
||
|
listeners: {
|
||
|
scope: 'controller'
|
||
|
}
|
||
|
});
|
||
|
widget = new Widget();
|
||
|
widget.fireEvent('foo');
|
||
|
expect(scope).toBe(widget.getController());
|
||
|
});
|
||
|
|
||
|
it("should resolve to the widget with scope:'this'", function() {
|
||
|
defineWidget({
|
||
|
controller: new Controller(),
|
||
|
listeners: {
|
||
|
scope: 'this'
|
||
|
}
|
||
|
});
|
||
|
widget = new Widget();
|
||
|
widget.fireEvent('foo');
|
||
|
expect(scope).toBe(widget);
|
||
|
});
|
||
|
});
|
||
|
|
||
|
describe("with defaultListenerScope", function() {
|
||
|
it("should resolve to the widget with unspecified scope", function() {
|
||
|
defineWidget({
|
||
|
defaultListenerScope: true
|
||
|
});
|
||
|
widget = new Widget();
|
||
|
widget.fireEvent('foo');
|
||
|
expect(scope).toBe(widget);
|
||
|
});
|
||
|
|
||
|
it("should fail with scope:'controller'", function() {
|
||
|
defineWidget({
|
||
|
defaultListenerScope: true,
|
||
|
listeners: {
|
||
|
scope: 'controller'
|
||
|
}
|
||
|
});
|
||
|
widget = new Widget();
|
||
|
expect(function() {
|
||
|
widget.fireEvent('foo');
|
||
|
}).toThrow();
|
||
|
});
|
||
|
|
||
|
it("should resolve to the widget with scope:'this'", function() {
|
||
|
defineWidget({
|
||
|
defaultListenerScope: true,
|
||
|
listeners: {
|
||
|
scope: 'this'
|
||
|
}
|
||
|
});
|
||
|
widget = new Widget();
|
||
|
widget.fireEvent('foo');
|
||
|
expect(scope).toBe(widget);
|
||
|
});
|
||
|
});
|
||
|
|
||
|
describe("with view controller and defaultListenerScope", function() {
|
||
|
it("should resolve to the widget with unspecified scope", function() {
|
||
|
defineWidget({
|
||
|
controller: new Controller(),
|
||
|
defaultListenerScope: true
|
||
|
});
|
||
|
widget = new Widget();
|
||
|
widget.fireEvent('foo');
|
||
|
expect(scope).toBe(widget);
|
||
|
});
|
||
|
|
||
|
it("should resolve to the view controller with scope:'controller'", function() {
|
||
|
defineWidget({
|
||
|
controller: new Controller(),
|
||
|
defaultListenerScope: true,
|
||
|
listeners: {
|
||
|
scope: 'controller'
|
||
|
}
|
||
|
});
|
||
|
widget = new Widget();
|
||
|
widget.fireEvent('foo');
|
||
|
expect(scope).toBe(widget.getController());
|
||
|
});
|
||
|
|
||
|
it("should resolve to the widget with scope:'this'", function() {
|
||
|
defineWidget({
|
||
|
controller: new Controller(),
|
||
|
defaultListenerScope: true,
|
||
|
listeners: {
|
||
|
scope: 'this'
|
||
|
}
|
||
|
});
|
||
|
widget = new Widget();
|
||
|
widget.fireEvent('foo');
|
||
|
expect(scope).toBe(widget);
|
||
|
});
|
||
|
});
|
||
|
|
||
|
describe("with defaultListenerScope on parent", function() {
|
||
|
beforeEach(function() {
|
||
|
defineParent({
|
||
|
defaultListenerScope: true
|
||
|
});
|
||
|
});
|
||
|
|
||
|
it("should resolve to the widget with unspecified scope", function() {
|
||
|
defineWidget();
|
||
|
widget = new Widget();
|
||
|
parent = new Parent({
|
||
|
items: widget
|
||
|
});
|
||
|
widget.fireEvent('foo');
|
||
|
expect(scope).toBe(widget);
|
||
|
});
|
||
|
|
||
|
it("should fail with scope:'controller'", function() {
|
||
|
defineWidget({
|
||
|
listeners: {
|
||
|
scope: 'controller'
|
||
|
}
|
||
|
});
|
||
|
widget = new Widget();
|
||
|
parent = new Parent({
|
||
|
items: widget
|
||
|
});
|
||
|
expect(function() {
|
||
|
widget.fireEvent('foo');
|
||
|
}).toThrow();
|
||
|
});
|
||
|
|
||
|
it("should resolve to the widget with scope:'this'", function() {
|
||
|
defineWidget({
|
||
|
listeners: {
|
||
|
scope: 'this'
|
||
|
}
|
||
|
});
|
||
|
widget = new Widget();
|
||
|
parent = new Parent({
|
||
|
items: widget
|
||
|
});
|
||
|
widget.fireEvent('foo');
|
||
|
expect(scope).toBe(widget);
|
||
|
});
|
||
|
});
|
||
|
|
||
|
describe("with view controller on parent", function() {
|
||
|
beforeEach(function() {
|
||
|
defineParent({
|
||
|
controller: new ParentController()
|
||
|
});
|
||
|
});
|
||
|
|
||
|
it("should resolve to the widget with unspecified scope", function() {
|
||
|
defineWidget();
|
||
|
widget = new Widget();
|
||
|
parent = new Parent({
|
||
|
items: widget
|
||
|
});
|
||
|
widget.fireEvent('foo');
|
||
|
expect(scope).toBe(widget);
|
||
|
});
|
||
|
|
||
|
it("should resolve to the parent view controller with scope:'controller'", function() {
|
||
|
defineWidget({
|
||
|
listeners: {
|
||
|
scope: 'controller'
|
||
|
}
|
||
|
});
|
||
|
widget = new Widget();
|
||
|
parent = new Parent({
|
||
|
items: widget
|
||
|
});
|
||
|
widget.fireEvent('foo');
|
||
|
expect(scope).toBe(parent.getController());
|
||
|
});
|
||
|
|
||
|
it("should resolve to the widget with scope:'this'", function() {
|
||
|
defineWidget({
|
||
|
listeners: {
|
||
|
scope: 'this'
|
||
|
}
|
||
|
});
|
||
|
widget = new Widget();
|
||
|
parent = new Parent({
|
||
|
items: widget
|
||
|
});
|
||
|
widget.fireEvent('foo');
|
||
|
expect(scope).toBe(widget);
|
||
|
});
|
||
|
});
|
||
|
});
|
||
|
});
|
||
|
|
||
|
describe("listener declared on instance config", function() {
|
||
|
function defineWidget(cfg) {
|
||
|
Widget = Ext.define(null, Ext.merge({
|
||
|
extend: 'Ext.Widget',
|
||
|
onFoo: spies.widget
|
||
|
}, cfg));
|
||
|
}
|
||
|
|
||
|
it("should resolve to the widget with unspecified scope", function() {
|
||
|
defineWidget();
|
||
|
widget = new Widget({
|
||
|
listeners: {
|
||
|
foo: 'onFoo'
|
||
|
}
|
||
|
});
|
||
|
widget.fireEvent('foo');
|
||
|
expectScope('widget');
|
||
|
});
|
||
|
|
||
|
it("should fail with scope:'controller'", function() {
|
||
|
defineWidget();
|
||
|
widget = new Widget({
|
||
|
listeners: {
|
||
|
foo: 'onFoo',
|
||
|
scope: 'controller'
|
||
|
}
|
||
|
});
|
||
|
expect(function() {
|
||
|
widget.fireEvent('foo');
|
||
|
}).toThrow();
|
||
|
});
|
||
|
|
||
|
it("should resolve to the widget with scope:'this'", function() {
|
||
|
defineWidget();
|
||
|
widget = new Widget({
|
||
|
listeners: {
|
||
|
foo: 'onFoo',
|
||
|
scope: 'this'
|
||
|
}
|
||
|
});
|
||
|
widget.fireEvent('foo');
|
||
|
expectScope('widget');
|
||
|
});
|
||
|
|
||
|
describe("with view controller", function() {
|
||
|
beforeEach(function() {
|
||
|
defineWidget({
|
||
|
controller: new Controller()
|
||
|
});
|
||
|
});
|
||
|
|
||
|
it("should resolve to the widget with unspecified scope", function() {
|
||
|
widget = new Widget({
|
||
|
listeners: {
|
||
|
foo: 'onFoo'
|
||
|
}
|
||
|
});
|
||
|
widget.fireEvent('foo');
|
||
|
expectScope('widget');
|
||
|
});
|
||
|
|
||
|
it("should fail with scope:'controller'", function() {
|
||
|
widget = new Widget({
|
||
|
listeners: {
|
||
|
foo: 'onFoo',
|
||
|
scope: 'controller'
|
||
|
}
|
||
|
});
|
||
|
expect(function() {
|
||
|
widget.fireEvent('foo');
|
||
|
}).toThrow();
|
||
|
});
|
||
|
|
||
|
it("should resolve to the widget with scope:'this'", function() {
|
||
|
widget = new Widget({
|
||
|
listeners: {
|
||
|
foo: 'onFoo',
|
||
|
scope: 'this'
|
||
|
}
|
||
|
});
|
||
|
widget.fireEvent('foo');
|
||
|
expectScope('widget');
|
||
|
});
|
||
|
});
|
||
|
|
||
|
describe("with defaultListenerScope", function() {
|
||
|
beforeEach(function() {
|
||
|
defineWidget({
|
||
|
defaultListenerScope: true
|
||
|
});
|
||
|
});
|
||
|
|
||
|
it("should resolve to the widget with unspecified scope", function() {
|
||
|
widget = new Widget({
|
||
|
listeners: {
|
||
|
foo: 'onFoo'
|
||
|
}
|
||
|
});
|
||
|
widget.fireEvent('foo');
|
||
|
expectScope('widget');
|
||
|
});
|
||
|
|
||
|
it("should fail with scope:'controller'", function() {
|
||
|
widget = new Widget({
|
||
|
listeners: {
|
||
|
foo: 'onFoo',
|
||
|
scope: 'controller'
|
||
|
}
|
||
|
});
|
||
|
expect(function() {
|
||
|
widget.fireEvent('foo');
|
||
|
}).toThrow();
|
||
|
});
|
||
|
|
||
|
it("should resolve to the widget with scope:'this'", function() {
|
||
|
widget = new Widget({
|
||
|
listeners: {
|
||
|
foo: 'onFoo',
|
||
|
scope: 'this'
|
||
|
}
|
||
|
});
|
||
|
widget.fireEvent('foo');
|
||
|
expectScope('widget');
|
||
|
});
|
||
|
});
|
||
|
|
||
|
describe("with view controller and defaultListenerScope", function() {
|
||
|
beforeEach(function() {
|
||
|
defineWidget({
|
||
|
controller: new Controller(),
|
||
|
defaultListenerScope: true
|
||
|
});
|
||
|
});
|
||
|
|
||
|
it("should resolve to the widget with unspecified scope", function() {
|
||
|
widget = new Widget({
|
||
|
listeners: {
|
||
|
foo: 'onFoo'
|
||
|
}
|
||
|
});
|
||
|
widget.fireEvent('foo');
|
||
|
expectScope('widget');
|
||
|
});
|
||
|
|
||
|
it("should fail with scope:'controller'", function() {
|
||
|
widget = new Widget({
|
||
|
listeners: {
|
||
|
foo: 'onFoo',
|
||
|
scope: 'controller'
|
||
|
}
|
||
|
});
|
||
|
expect(function() {
|
||
|
widget.fireEvent('foo');
|
||
|
}).toThrow();
|
||
|
});
|
||
|
|
||
|
it("should resolve to the widget with scope:'this'", function() {
|
||
|
widget = new Widget({
|
||
|
listeners: {
|
||
|
foo: 'onFoo',
|
||
|
scope: 'this'
|
||
|
}
|
||
|
});
|
||
|
widget.fireEvent('foo');
|
||
|
expectScope('widget');
|
||
|
});
|
||
|
});
|
||
|
|
||
|
describe("with defaultListenerScope on parent", function() {
|
||
|
beforeEach(function() {
|
||
|
defineParent({
|
||
|
defaultListenerScope: true
|
||
|
});
|
||
|
defineWidget();
|
||
|
});
|
||
|
|
||
|
it("should resolve to the parent with unspecified scope", function() {
|
||
|
widget = new Widget({
|
||
|
listeners: {
|
||
|
foo: 'onFoo'
|
||
|
}
|
||
|
});
|
||
|
parent = new Parent({
|
||
|
items: widget
|
||
|
});
|
||
|
widget.fireEvent('foo');
|
||
|
expectScope('parent');
|
||
|
});
|
||
|
|
||
|
it("should fail with scope:'controller'", function() {
|
||
|
widget = new Widget({
|
||
|
listeners: {
|
||
|
foo: 'onFoo',
|
||
|
scope: 'controller'
|
||
|
}
|
||
|
});
|
||
|
parent = new Parent({
|
||
|
items: widget
|
||
|
});
|
||
|
expect(function() {
|
||
|
widget.fireEvent('foo');
|
||
|
}).toThrow();
|
||
|
});
|
||
|
|
||
|
it("should resolve to the widget with scope:'this'", function() {
|
||
|
widget = new Widget({
|
||
|
listeners: {
|
||
|
foo: 'onFoo',
|
||
|
scope: 'this'
|
||
|
}
|
||
|
});
|
||
|
parent = new Parent({
|
||
|
items: widget
|
||
|
});
|
||
|
widget.fireEvent('foo');
|
||
|
expectScope('widget');
|
||
|
});
|
||
|
});
|
||
|
|
||
|
describe("with view controller on parent", function() {
|
||
|
beforeEach(function() {
|
||
|
defineParent({
|
||
|
controller: new ParentController()
|
||
|
});
|
||
|
defineWidget();
|
||
|
});
|
||
|
|
||
|
it("should resolve to the parent view controller with unspecified scope", function() {
|
||
|
widget = new Widget({
|
||
|
listeners: {
|
||
|
foo: 'onFoo'
|
||
|
}
|
||
|
});
|
||
|
parent = new Parent({
|
||
|
items: widget
|
||
|
});
|
||
|
widget.fireEvent('foo');
|
||
|
expectScope('parentController');
|
||
|
});
|
||
|
|
||
|
it("should resolve to the parent view controller with scope:'controller'", function() {
|
||
|
widget = new Widget({
|
||
|
listeners: {
|
||
|
foo: 'onFoo',
|
||
|
scope: 'controller'
|
||
|
}
|
||
|
});
|
||
|
parent = new Parent({
|
||
|
items: widget
|
||
|
});
|
||
|
widget.fireEvent('foo');
|
||
|
expectScope('parentController');
|
||
|
});
|
||
|
|
||
|
it("should resolve to the widget with scope:'this'", function() {
|
||
|
widget = new Widget({
|
||
|
listeners: {
|
||
|
foo: 'onFoo',
|
||
|
scope: 'this'
|
||
|
}
|
||
|
});
|
||
|
parent = new Parent({
|
||
|
items: widget
|
||
|
});
|
||
|
widget.fireEvent('foo');
|
||
|
expectScope('widget');
|
||
|
});
|
||
|
});
|
||
|
|
||
|
describe("with view controller and defaultListenerScope on parent", function() {
|
||
|
beforeEach(function() {
|
||
|
defineParent({
|
||
|
controller: new ParentController(),
|
||
|
defaultListenerScope: true
|
||
|
});
|
||
|
defineWidget();
|
||
|
});
|
||
|
|
||
|
it("should resolve to the parent with unspecified scope", function() {
|
||
|
widget = new Widget({
|
||
|
listeners: {
|
||
|
foo: 'onFoo'
|
||
|
}
|
||
|
});
|
||
|
parent = new Parent({
|
||
|
items: widget
|
||
|
});
|
||
|
widget.fireEvent('foo');
|
||
|
expectScope('parent');
|
||
|
});
|
||
|
|
||
|
it("should resolve to the parent view controller with scope:'controller'", function() {
|
||
|
widget = new Widget({
|
||
|
listeners: {
|
||
|
foo: 'onFoo',
|
||
|
scope: 'controller'
|
||
|
}
|
||
|
});
|
||
|
parent = new Parent({
|
||
|
items: widget
|
||
|
});
|
||
|
widget.fireEvent('foo');
|
||
|
expectScope('parentController');
|
||
|
});
|
||
|
|
||
|
it("should resolve to the widget with scope:'this'", function() {
|
||
|
widget = new Widget({
|
||
|
listeners: {
|
||
|
foo: 'onFoo',
|
||
|
scope: 'this'
|
||
|
}
|
||
|
});
|
||
|
parent = new Parent({
|
||
|
items: widget
|
||
|
});
|
||
|
widget.fireEvent('foo');
|
||
|
expectScope('widget');
|
||
|
});
|
||
|
});
|
||
|
|
||
|
describe("with defaultListenerScope on grandparent", function() {
|
||
|
beforeEach(function() {
|
||
|
defineGrandparent({
|
||
|
defaultListenerScope: true
|
||
|
});
|
||
|
defineWidget();
|
||
|
});
|
||
|
|
||
|
it("should resolve to the grandparent with unspecified scope", function() {
|
||
|
widget = new Widget({
|
||
|
listeners: {
|
||
|
foo: 'onFoo'
|
||
|
}
|
||
|
});
|
||
|
grandparent = new Grandparent({
|
||
|
items: {
|
||
|
items: widget
|
||
|
}
|
||
|
});
|
||
|
widget.fireEvent('foo');
|
||
|
expectScope('grandparent');
|
||
|
});
|
||
|
|
||
|
it("should fail with scope:'controller'", function() {
|
||
|
widget = new Widget({
|
||
|
listeners: {
|
||
|
foo: 'onFoo',
|
||
|
scope: 'controller'
|
||
|
}
|
||
|
});
|
||
|
grandparent = new Grandparent({
|
||
|
items: {
|
||
|
items: widget
|
||
|
}
|
||
|
});
|
||
|
expect(function() {
|
||
|
widget.fireEvent('foo');
|
||
|
}).toThrow();
|
||
|
});
|
||
|
|
||
|
it("should resolve to the widget with scope:'this'", function() {
|
||
|
widget = new Widget({
|
||
|
listeners: {
|
||
|
foo: 'onFoo',
|
||
|
scope: 'this'
|
||
|
}
|
||
|
});
|
||
|
grandparent = new Grandparent({
|
||
|
items: {
|
||
|
items: widget
|
||
|
}
|
||
|
});
|
||
|
widget.fireEvent('foo');
|
||
|
expectScope('widget');
|
||
|
});
|
||
|
});
|
||
|
|
||
|
describe("with view controller on grandparent", function() {
|
||
|
beforeEach(function() {
|
||
|
defineGrandparent({
|
||
|
controller: new GrandparentController()
|
||
|
});
|
||
|
defineWidget();
|
||
|
});
|
||
|
|
||
|
it("should resolve to the grandparent view controller with unspecified scope", function() {
|
||
|
widget = new Widget({
|
||
|
listeners: {
|
||
|
foo: 'onFoo'
|
||
|
}
|
||
|
});
|
||
|
grandparent = new Grandparent({
|
||
|
items: {
|
||
|
items: widget
|
||
|
}
|
||
|
});
|
||
|
widget.fireEvent('foo');
|
||
|
expectScope('grandparentController');
|
||
|
});
|
||
|
|
||
|
it("should resolve to the grandparent view controller with scope:'controller'", function() {
|
||
|
widget = new Widget({
|
||
|
listeners: {
|
||
|
foo: 'onFoo',
|
||
|
scope: 'controller'
|
||
|
}
|
||
|
});
|
||
|
grandparent = new Grandparent({
|
||
|
items: {
|
||
|
items: widget
|
||
|
}
|
||
|
});
|
||
|
widget.fireEvent('foo');
|
||
|
expectScope('grandparentController');
|
||
|
});
|
||
|
|
||
|
it("should resolve to the widget with scope:'this'", function() {
|
||
|
widget = new Widget({
|
||
|
listeners: {
|
||
|
foo: 'onFoo',
|
||
|
scope: 'this'
|
||
|
}
|
||
|
});
|
||
|
grandparent = new Grandparent({
|
||
|
items: {
|
||
|
items: widget
|
||
|
}
|
||
|
});
|
||
|
widget.fireEvent('foo');
|
||
|
expectScope('widget');
|
||
|
});
|
||
|
});
|
||
|
|
||
|
describe("with view controller and defaultListenerScope on grandparent", function() {
|
||
|
beforeEach(function() {
|
||
|
defineGrandparent({
|
||
|
controller: new GrandparentController(),
|
||
|
defaultListenerScope: true
|
||
|
});
|
||
|
defineWidget();
|
||
|
});
|
||
|
|
||
|
it("should resolve to the grandparent with unspecified scope", function() {
|
||
|
widget = new Widget({
|
||
|
listeners: {
|
||
|
foo: 'onFoo'
|
||
|
}
|
||
|
});
|
||
|
grandparent = new Grandparent({
|
||
|
items: {
|
||
|
items: widget
|
||
|
}
|
||
|
});
|
||
|
widget.fireEvent('foo');
|
||
|
expectScope('grandparent');
|
||
|
});
|
||
|
|
||
|
it("should resolve to the grandparent view controller with scope:'controller'", function() {
|
||
|
widget = new Widget({
|
||
|
listeners: {
|
||
|
foo: 'onFoo',
|
||
|
scope: 'controller'
|
||
|
}
|
||
|
});
|
||
|
grandparent = new Grandparent({
|
||
|
items: {
|
||
|
items: widget
|
||
|
}
|
||
|
});
|
||
|
widget.fireEvent('foo');
|
||
|
expectScope('grandparentController');
|
||
|
});
|
||
|
|
||
|
it("should resolve to the widget with scope:'this'", function() {
|
||
|
widget = new Widget({
|
||
|
listeners: {
|
||
|
foo: 'onFoo',
|
||
|
scope: 'this'
|
||
|
}
|
||
|
});
|
||
|
grandparent = new Grandparent({
|
||
|
items: {
|
||
|
items: widget
|
||
|
}
|
||
|
});
|
||
|
widget.fireEvent('foo');
|
||
|
expectScope('widget');
|
||
|
});
|
||
|
});
|
||
|
|
||
|
describe("with view controller on child and view controller on parent", function() {
|
||
|
beforeEach(function() {
|
||
|
defineParent({
|
||
|
controller: new ParentController()
|
||
|
});
|
||
|
|
||
|
defineWidget({
|
||
|
controller: new Controller()
|
||
|
});
|
||
|
});
|
||
|
|
||
|
it("should resolve to the parent view controller with unspecified scope", function() {
|
||
|
widget = new Widget({
|
||
|
listeners: {
|
||
|
foo: 'onFoo'
|
||
|
}
|
||
|
});
|
||
|
parent = new Parent({
|
||
|
items: widget
|
||
|
});
|
||
|
widget.fireEvent('foo');
|
||
|
expectScope('parentController');
|
||
|
});
|
||
|
|
||
|
it("should resolve to the parent view controller with scope:'controller'", function() {
|
||
|
widget = new Widget({
|
||
|
listeners: {
|
||
|
foo: 'onFoo',
|
||
|
scope: 'controller'
|
||
|
}
|
||
|
});
|
||
|
parent = new Parent({
|
||
|
items: widget
|
||
|
});
|
||
|
widget.fireEvent('foo');
|
||
|
expectScope('parentController');
|
||
|
});
|
||
|
|
||
|
it("should resolve to the widget with scope:'this'", function() {
|
||
|
widget = new Widget({
|
||
|
listeners: {
|
||
|
foo: 'onFoo',
|
||
|
scope: 'this'
|
||
|
}
|
||
|
});
|
||
|
parent = new Parent({
|
||
|
items: widget
|
||
|
});
|
||
|
widget.fireEvent('foo');
|
||
|
expectScope('widget');
|
||
|
});
|
||
|
});
|
||
|
|
||
|
describe("with view controller on child and view controller on grandparent", function() {
|
||
|
beforeEach(function() {
|
||
|
defineGrandparent({
|
||
|
controller: new GrandparentController()
|
||
|
});
|
||
|
|
||
|
defineWidget({
|
||
|
controller: new Controller()
|
||
|
});
|
||
|
});
|
||
|
|
||
|
it("should resolve to the grandparent view controller with unspecified scope", function() {
|
||
|
widget = new Widget({
|
||
|
listeners: {
|
||
|
foo: 'onFoo'
|
||
|
}
|
||
|
});
|
||
|
grandparent = new Grandparent({
|
||
|
items: {
|
||
|
items: widget
|
||
|
}
|
||
|
});
|
||
|
widget.fireEvent('foo');
|
||
|
expectScope('grandparentController');
|
||
|
});
|
||
|
|
||
|
it("should resolve to the grandparent view controller with scope:'controller'", function() {
|
||
|
widget = new Widget({
|
||
|
listeners: {
|
||
|
foo: 'onFoo',
|
||
|
scope: 'controller'
|
||
|
}
|
||
|
});
|
||
|
grandparent = new Grandparent({
|
||
|
items: {
|
||
|
items: widget
|
||
|
}
|
||
|
});
|
||
|
widget.fireEvent('foo');
|
||
|
expectScope('grandparentController');
|
||
|
});
|
||
|
|
||
|
it("should resolve to the widget with scope:'this'", function() {
|
||
|
widget = new Widget({
|
||
|
listeners: {
|
||
|
foo: 'onFoo',
|
||
|
scope: 'this'
|
||
|
}
|
||
|
});
|
||
|
grandparent = new Grandparent({
|
||
|
items: {
|
||
|
items: widget
|
||
|
}
|
||
|
});
|
||
|
widget.fireEvent('foo');
|
||
|
expectScope('widget');
|
||
|
});
|
||
|
});
|
||
|
|
||
|
describe("with view controller on child and defaultListenerScope on parent", function() {
|
||
|
beforeEach(function() {
|
||
|
defineParent({
|
||
|
defaultListenerScope: true
|
||
|
});
|
||
|
|
||
|
defineWidget({
|
||
|
controller: new Controller()
|
||
|
});
|
||
|
});
|
||
|
|
||
|
it("should resolve to the parent with unspecified scope", function() {
|
||
|
widget = new Widget({
|
||
|
listeners: {
|
||
|
foo: 'onFoo'
|
||
|
}
|
||
|
});
|
||
|
parent = new Parent({
|
||
|
items: widget
|
||
|
});
|
||
|
widget.fireEvent('foo');
|
||
|
expectScope('parent');
|
||
|
});
|
||
|
|
||
|
it("should fail with scope:'controller'", function() {
|
||
|
widget = new Widget({
|
||
|
listeners: {
|
||
|
foo: 'onFoo',
|
||
|
scope: 'controller'
|
||
|
}
|
||
|
});
|
||
|
parent = new Parent({
|
||
|
items: widget
|
||
|
});
|
||
|
expect(function() {
|
||
|
widget.fireEvent('foo');
|
||
|
}).toThrow();
|
||
|
});
|
||
|
|
||
|
it("should resolve to the widget with scope:'this'", function() {
|
||
|
widget = new Widget({
|
||
|
listeners: {
|
||
|
foo: 'onFoo',
|
||
|
scope: 'this'
|
||
|
}
|
||
|
});
|
||
|
parent = new Parent({
|
||
|
items: widget
|
||
|
});
|
||
|
widget.fireEvent('foo');
|
||
|
expectScope('widget');
|
||
|
});
|
||
|
});
|
||
|
|
||
|
describe("with view controller on parent and defaultListenerScope on child", function() {
|
||
|
beforeEach(function() {
|
||
|
defineParent({
|
||
|
controller: new ParentController()
|
||
|
});
|
||
|
|
||
|
defineWidget({
|
||
|
defaultListenerScope: true
|
||
|
});
|
||
|
});
|
||
|
|
||
|
it("should resolve to the parent view controller with unspecified scope", function() {
|
||
|
widget = new Widget({
|
||
|
listeners: {
|
||
|
foo: 'onFoo'
|
||
|
}
|
||
|
});
|
||
|
parent = new Parent({
|
||
|
items: widget
|
||
|
});
|
||
|
widget.fireEvent('foo');
|
||
|
expectScope('parentController');
|
||
|
});
|
||
|
|
||
|
it("should resolve to the parent view controller with scope:'controller'", function() {
|
||
|
widget = new Widget({
|
||
|
listeners: {
|
||
|
foo: 'onFoo',
|
||
|
scope: 'controller'
|
||
|
}
|
||
|
});
|
||
|
parent = new Parent({
|
||
|
items: widget
|
||
|
});
|
||
|
widget.fireEvent('foo');
|
||
|
expectScope('parentController');
|
||
|
});
|
||
|
|
||
|
it("should resolve to the widget with scope:'this'", function() {
|
||
|
widget = new Widget({
|
||
|
listeners: {
|
||
|
foo: 'onFoo',
|
||
|
scope: 'this'
|
||
|
}
|
||
|
});
|
||
|
parent = new Parent({
|
||
|
items: widget
|
||
|
});
|
||
|
widget.fireEvent('foo');
|
||
|
expectScope('widget');
|
||
|
});
|
||
|
});
|
||
|
|
||
|
describe("with view controller on child and defaultListenerScope on grandparent", function() {
|
||
|
beforeEach(function() {
|
||
|
defineGrandparent({
|
||
|
defaultListenerScope: true
|
||
|
});
|
||
|
|
||
|
defineWidget({
|
||
|
controller: new Controller()
|
||
|
});
|
||
|
});
|
||
|
|
||
|
it("should resolve to the grandparent with unspecified scope", function() {
|
||
|
widget = new Widget({
|
||
|
listeners: {
|
||
|
foo: 'onFoo'
|
||
|
}
|
||
|
});
|
||
|
grandparent = new Grandparent({
|
||
|
items: {
|
||
|
items: widget
|
||
|
}
|
||
|
});
|
||
|
widget.fireEvent('foo');
|
||
|
expectScope('grandparent');
|
||
|
});
|
||
|
|
||
|
it("should fail with scope:'controller'", function() {
|
||
|
widget = new Widget({
|
||
|
listeners: {
|
||
|
foo: 'onFoo',
|
||
|
scope: 'controller'
|
||
|
}
|
||
|
});
|
||
|
grandparent = new Grandparent({
|
||
|
items: {
|
||
|
items: widget
|
||
|
}
|
||
|
});
|
||
|
expect(function() {
|
||
|
widget.fireEvent('foo');
|
||
|
}).toThrow();
|
||
|
});
|
||
|
|
||
|
it("should resolve to the widget with scope:'this'", function() {
|
||
|
widget = new Widget({
|
||
|
listeners: {
|
||
|
foo: 'onFoo',
|
||
|
scope: 'this'
|
||
|
}
|
||
|
});
|
||
|
grandparent = new Grandparent({
|
||
|
items: {
|
||
|
items: widget
|
||
|
}
|
||
|
});
|
||
|
widget.fireEvent('foo');
|
||
|
expectScope('widget');
|
||
|
});
|
||
|
});
|
||
|
|
||
|
describe("with view controller on grandparent and defaultListenerScope on child", function() {
|
||
|
beforeEach(function() {
|
||
|
defineGrandparent({
|
||
|
controller: new GrandparentController()
|
||
|
});
|
||
|
|
||
|
defineWidget({
|
||
|
defaultListenerScope: true
|
||
|
});
|
||
|
});
|
||
|
|
||
|
it("should resolve to the grandparent view controller with unspecified scope", function() {
|
||
|
widget = new Widget({
|
||
|
listeners: {
|
||
|
foo: 'onFoo'
|
||
|
}
|
||
|
});
|
||
|
grandparent = new Grandparent({
|
||
|
items: {
|
||
|
items: widget
|
||
|
}
|
||
|
});
|
||
|
widget.fireEvent('foo');
|
||
|
expectScope('grandparentController');
|
||
|
});
|
||
|
|
||
|
it("should resolve to the grandparent view controller with scope:'controller'", function() {
|
||
|
widget = new Widget({
|
||
|
listeners: {
|
||
|
foo: 'onFoo',
|
||
|
scope: 'controller'
|
||
|
}
|
||
|
});
|
||
|
grandparent = new Grandparent({
|
||
|
items: {
|
||
|
items: widget
|
||
|
}
|
||
|
});
|
||
|
widget.fireEvent('foo');
|
||
|
expectScope('grandparentController');
|
||
|
});
|
||
|
|
||
|
it("should resolve to the widget with scope:'this'", function() {
|
||
|
widget = new Widget({
|
||
|
listeners: {
|
||
|
foo: 'onFoo',
|
||
|
scope: 'this'
|
||
|
}
|
||
|
});
|
||
|
grandparent = new Grandparent({
|
||
|
items: {
|
||
|
items: widget
|
||
|
}
|
||
|
});
|
||
|
widget.fireEvent('foo');
|
||
|
expectScope('widget');
|
||
|
});
|
||
|
});
|
||
|
|
||
|
describe("with handler declared as a function reference", function() {
|
||
|
var handler, scope;
|
||
|
|
||
|
function defineWidget(cfg) {
|
||
|
Widget = Ext.define(null, Ext.merge({
|
||
|
extend: 'Ext.Widget'
|
||
|
}, cfg));
|
||
|
}
|
||
|
|
||
|
beforeEach(function() {
|
||
|
handler = jasmine.createSpy();
|
||
|
handler.andCallFake(function() {
|
||
|
scope = this;
|
||
|
});
|
||
|
});
|
||
|
|
||
|
afterEach(function() {
|
||
|
scope = null;
|
||
|
});
|
||
|
|
||
|
it("should use the widget as the default scope", function() {
|
||
|
defineWidget();
|
||
|
widget = new Widget({
|
||
|
listeners: {
|
||
|
foo: handler
|
||
|
}
|
||
|
});
|
||
|
widget.fireEvent('foo');
|
||
|
expect(scope).toBe(widget);
|
||
|
});
|
||
|
|
||
|
it("should use an arbitrary object as the scope", function() {
|
||
|
defineWidget();
|
||
|
var scope = {};
|
||
|
|
||
|
widget = new Widget({
|
||
|
listeners: {
|
||
|
foo: handler,
|
||
|
scope: scope
|
||
|
}
|
||
|
});
|
||
|
widget.fireEvent('foo');
|
||
|
expect(scope).toBe(scope);
|
||
|
});
|
||
|
|
||
|
it("should use the widget with scope:'this'", function() {
|
||
|
defineWidget();
|
||
|
widget = new Widget({
|
||
|
listeners: {
|
||
|
foo: handler,
|
||
|
scope: 'this'
|
||
|
}
|
||
|
});
|
||
|
widget.fireEvent('foo');
|
||
|
expect(scope).toBe(widget);
|
||
|
});
|
||
|
|
||
|
it("should fail with scope:'controller'", function() {
|
||
|
defineWidget();
|
||
|
widget = new Widget({
|
||
|
listeners: {
|
||
|
foo: handler,
|
||
|
scope: 'controller'
|
||
|
}
|
||
|
});
|
||
|
expect(function() {
|
||
|
widget.fireEvent('foo');
|
||
|
}).toThrow();
|
||
|
});
|
||
|
|
||
|
it("should use the widget with scope:'this' specified on an inner object", function() {
|
||
|
defineWidget();
|
||
|
widget = new Widget({
|
||
|
listeners: {
|
||
|
foo: {
|
||
|
fn: handler,
|
||
|
scope: 'this'
|
||
|
}
|
||
|
}
|
||
|
});
|
||
|
widget.fireEvent('foo');
|
||
|
expect(scope).toBe(widget);
|
||
|
});
|
||
|
|
||
|
it("should fail with scope:'controller' specified on an inner object", function() {
|
||
|
defineWidget();
|
||
|
widget = new Widget({
|
||
|
listeners: {
|
||
|
foo: {
|
||
|
fn: handler,
|
||
|
scope: 'controller'
|
||
|
}
|
||
|
}
|
||
|
});
|
||
|
expect(function() {
|
||
|
widget.fireEvent('foo');
|
||
|
}).toThrow();
|
||
|
});
|
||
|
|
||
|
describe("with view controller", function() {
|
||
|
beforeEach(function() {
|
||
|
defineWidget({
|
||
|
controller: new Controller()
|
||
|
});
|
||
|
});
|
||
|
|
||
|
it("should resolve to the widget with unspecified scope", function() {
|
||
|
widget = new Widget({
|
||
|
listeners: {
|
||
|
foo: handler
|
||
|
}
|
||
|
});
|
||
|
widget.fireEvent('foo');
|
||
|
expect(scope).toBe(widget);
|
||
|
});
|
||
|
|
||
|
it("should fail with scope:'controller'", function() {
|
||
|
widget = new Widget({
|
||
|
listeners: {
|
||
|
foo: handler,
|
||
|
scope: 'controller'
|
||
|
}
|
||
|
});
|
||
|
expect(function() {
|
||
|
widget.fireEvent('foo');
|
||
|
}).toThrow();
|
||
|
});
|
||
|
|
||
|
it("should resolve to the widget with scope:'this'", function() {
|
||
|
widget = new Widget({
|
||
|
listeners: {
|
||
|
foo: handler,
|
||
|
scope: 'this'
|
||
|
}
|
||
|
});
|
||
|
widget.fireEvent('foo');
|
||
|
expect(scope).toBe(widget);
|
||
|
});
|
||
|
});
|
||
|
|
||
|
describe("with defaultListenerScope", function() {
|
||
|
beforeEach(function() {
|
||
|
defineWidget({
|
||
|
defaultListenerScope: true
|
||
|
});
|
||
|
});
|
||
|
|
||
|
it("should resolve to the widget with unspecified scope", function() {
|
||
|
widget = new Widget({
|
||
|
listeners: {
|
||
|
foo: handler
|
||
|
}
|
||
|
});
|
||
|
widget.fireEvent('foo');
|
||
|
expect(scope).toBe(widget);
|
||
|
});
|
||
|
|
||
|
it("should fail with scope:'controller'", function() {
|
||
|
widget = new Widget({
|
||
|
listeners: {
|
||
|
foo: handler,
|
||
|
scope: 'controller'
|
||
|
}
|
||
|
});
|
||
|
expect(function() {
|
||
|
widget.fireEvent('foo');
|
||
|
}).toThrow();
|
||
|
});
|
||
|
|
||
|
it("should resolve to the widget with scope:'this'", function() {
|
||
|
widget = new Widget({
|
||
|
listeners: {
|
||
|
foo: handler,
|
||
|
scope: 'this'
|
||
|
}
|
||
|
});
|
||
|
widget.fireEvent('foo');
|
||
|
expect(scope).toBe(widget);
|
||
|
});
|
||
|
});
|
||
|
|
||
|
describe("with defaultListenerScope on parent", function() {
|
||
|
beforeEach(function() {
|
||
|
defineParent({
|
||
|
defaultListenerScope: true
|
||
|
});
|
||
|
defineWidget();
|
||
|
});
|
||
|
|
||
|
it("should resolve to the widget with unspecified scope", function() {
|
||
|
widget = new Widget({
|
||
|
listeners: {
|
||
|
foo: handler
|
||
|
}
|
||
|
});
|
||
|
parent = new Parent({
|
||
|
items: widget
|
||
|
});
|
||
|
widget.fireEvent('foo');
|
||
|
expect(scope).toBe(widget);
|
||
|
});
|
||
|
|
||
|
it("should fail with scope:'controller'", function() {
|
||
|
widget = new Widget({
|
||
|
listeners: {
|
||
|
foo: handler,
|
||
|
scope: 'controller'
|
||
|
}
|
||
|
});
|
||
|
parent = new Parent({
|
||
|
items: widget
|
||
|
});
|
||
|
expect(function() {
|
||
|
widget.fireEvent('foo');
|
||
|
}).toThrow();
|
||
|
});
|
||
|
|
||
|
it("should resolve to the widget with scope:'this'", function() {
|
||
|
widget = new Widget({
|
||
|
listeners: {
|
||
|
foo: handler,
|
||
|
scope: 'this'
|
||
|
}
|
||
|
});
|
||
|
parent = new Parent({
|
||
|
items: widget
|
||
|
});
|
||
|
widget.fireEvent('foo');
|
||
|
expect(scope).toBe(widget);
|
||
|
});
|
||
|
});
|
||
|
|
||
|
describe("with view controller on parent", function() {
|
||
|
beforeEach(function() {
|
||
|
defineParent({
|
||
|
controller: new ParentController()
|
||
|
});
|
||
|
defineWidget();
|
||
|
});
|
||
|
|
||
|
it("should resolve to the widget with unspecified scope", function() {
|
||
|
widget = new Widget({
|
||
|
listeners: {
|
||
|
foo: handler
|
||
|
}
|
||
|
});
|
||
|
parent = new Parent({
|
||
|
items: widget
|
||
|
});
|
||
|
widget.fireEvent('foo');
|
||
|
expect(scope).toBe(widget);
|
||
|
});
|
||
|
|
||
|
it("should resolve to the parent view controller with scope:'controller'", function() {
|
||
|
widget = new Widget({
|
||
|
listeners: {
|
||
|
foo: handler,
|
||
|
scope: 'controller'
|
||
|
}
|
||
|
});
|
||
|
parent = new Parent({
|
||
|
items: widget
|
||
|
});
|
||
|
widget.fireEvent('foo');
|
||
|
expect(scope).toBe(parent.getController());
|
||
|
});
|
||
|
|
||
|
it("should resolve to the widget with scope:'this'", function() {
|
||
|
widget = new Widget({
|
||
|
listeners: {
|
||
|
foo: handler,
|
||
|
scope: 'this'
|
||
|
}
|
||
|
});
|
||
|
parent = new Parent({
|
||
|
items: widget
|
||
|
});
|
||
|
widget.fireEvent('foo');
|
||
|
expect(scope).toBe(widget);
|
||
|
});
|
||
|
});
|
||
|
});
|
||
|
});
|
||
|
});
|
||
|
});
|