outlookemailmicrosoft-teamsdiscordmessengercustom-servicesmacoslinuxwindowsinboxwhatsappicloudtweetdeckhipchattelegramhangoutsslackgmailskypefacebook-workplace
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.
3231 lines
118 KiB
3231 lines
118 KiB
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); |
|
}); |
|
}); |
|
}); |
|
}); |
|
}); |
|
});
|
|
|