Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion apps/tests/testRunner.ts
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@ import uiTestModule = require("./ui-test");

frameModule.Frame.defaultAnimatedNavigation = false;

function isRunningOnEmulator(): boolean {
export function isRunningOnEmulator(): boolean {
// This checks are not good enough to be added to modules but keeps unittests green.

if (platform.device.os === platform.platformNames.android) {
Expand Down
7 changes: 7 additions & 0 deletions apps/tests/ui/list-view/list-view-tests.ts
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@ import observable = require("data/observable");
import types = require("utils/types");
import platform = require("platform");
import utils = require("utils/utils");
import testRunner = require("../../testRunner");

// <snippet module="ui/list-view" title="list-view">
// # ListView
Expand Down Expand Up @@ -633,6 +634,9 @@ export function test_ConverterIsCalledJustOnce_onAddingItemsToListView() {
}

export function test_no_memory_leak_when_items_is_regular_array() {
if (testRunner.isRunningOnEmulator()) {
return;
}
var createFunc = function (): listViewModule.ListView {
var listView = new listViewModule.ListView();
listView.items = FEW_ITEMS;
Expand All @@ -645,6 +649,9 @@ export function test_no_memory_leak_when_items_is_regular_array() {
}

export function test_no_memory_leak_when_items_is_observable_array() {
if (testRunner.isRunningOnEmulator()) {
return;
}
// Keep the reference to the observable array to test the weakEventListener
var colors = new observableArray.ObservableArray(["red", "green", "blue"]);

Expand Down
27 changes: 27 additions & 0 deletions apps/tests/ui/observable-tests.ts
Original file line number Diff line number Diff line change
Expand Up @@ -378,3 +378,30 @@ export var test_Observable_WhenCreatedWithJSON_PropertyChangedWithBracketsNotati

TKUnit.assert(receivedCount === 1, "PropertyChanged event not raised properly.");
}

export function test_AddingTwoEventHandlersAndRemovingWithinHandlerShouldRaiseAllEvents() {
var observableInstance = new observable.Observable();
var firstHandlerCalled = false;
var secondHandlerCalled= false;

var firstHandler = function (args) {
observableInstance.off(observable.Observable.propertyChangeEvent, firstHandler, firstObserver);
firstHandlerCalled = true;
}

var secondHandler = function (args) {
observableInstance.off(observable.Observable.propertyChangeEvent, secondHandler, secondObserver);
secondHandlerCalled = true;
}

var firstObserver = new observable.Observable();
var secondObserver = new observable.Observable();

observableInstance.on(observable.Observable.propertyChangeEvent, firstHandler, firstObserver);
observableInstance.on(observable.Observable.propertyChangeEvent, secondHandler, secondObserver);

observableInstance.set("someProperty", "some value");

TKUnit.assertEqual(firstHandlerCalled, true);
TKUnit.assertEqual(secondHandlerCalled, true);
}
2 changes: 1 addition & 1 deletion apps/tests/ui/repeater/repeaterItems-bindingToGestures.xml
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@
<Repeater id="repeater" items="{{ items }}">
<Repeater.itemTemplate>
<GridLayout width="94" height="94" >
<Label text="{{ $parents['Page'].parentViewProperty }}" tap="{{ tapItem }}" />
<Label text="{{ sourceProperty = $parents['Page'].parentViewProperty }}" tap="{{ tapItem }}" />
</GridLayout>
</Repeater.itemTemplate>
</Repeater>
Expand Down
4 changes: 4 additions & 0 deletions apps/tests/ui/text-field/text-field-tests.ts
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
import TKUnit = require("../../TKUnit");
import testRunner = require("../../testRunner");
import helper = require("../helper");
import viewModule = require("ui/core/view");
import pagesModule = require("ui/page");
Expand Down Expand Up @@ -427,6 +428,9 @@ export var testNativeTextAlignmentFromLocal = function () {
}

export var testMemoryLeak = function () {
if (testRunner.isRunningOnEmulator()) {
return;
}
helper.buildUIWithWeakRefAndInteract(_createTextFieldFunc, function (textField) {
textFieldTestsNative.typeTextNatively(textField, "Hello, world!");
});
Expand Down
4 changes: 4 additions & 0 deletions apps/tests/ui/text-view/text-view-tests.ts
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
import TKUnit = require("../../TKUnit");
import testRunner = require("../../testRunner");
import helper = require("../helper");
import viewModule = require("ui/core/view");
import pagesModule = require("ui/page");
Expand Down Expand Up @@ -468,6 +469,9 @@ export var testNativeTextAlignmentFromLocal = function () {
}

export var testMemoryLeak = function () {
if (testRunner.isRunningOnEmulator()) {
return;
}
helper.buildUIWithWeakRefAndInteract(_createTextViewFunc, function (textView) {
textViewTestsNative.typeTextNatively(textView, "Hello, world!");
});
Expand Down
2 changes: 1 addition & 1 deletion apps/tests/xml-declaration/xml-declaration-tests.ts
Original file line number Diff line number Diff line change
Expand Up @@ -603,7 +603,7 @@ export function test_parse_ShouldParseNestedListViewInListViewTemplate() {
}

export function test_parse_ShouldEvaluateEventBindingExpressionInListViewTemplate() {
var p = <Page>builder.parse('<Page xmlns="http://www.nativescript.org/tns.xsd"><ListView items="{{ items }}" itemLoading="{{ itemLoading }}"><ListView.itemTemplate><SegmentedBar items="{{ $parents[\'ListView\'].items }}" selectedIndexChanged="{{ $parents[\'ListView\'].changed }}" /></ListView.itemTemplate></ListView></Page>');
var p = <Page>builder.parse('<Page xmlns="http://www.nativescript.org/tns.xsd"><ListView items="{{ items }}" itemLoading="{{ itemLoading }}"><ListView.itemTemplate><SegmentedBar items="{{ sourceProperty = $parents[\'ListView\'].items }}" selectedIndexChanged="{{ sourceProperty = $parents[\'ListView\'].changed }}" /></ListView.itemTemplate></ListView></Page>');

function testAction(views: Array<viewModule.View>) {
var ctrl: segmentedBar.SegmentedBar;
Expand Down
2 changes: 1 addition & 1 deletion data/observable/observable.ts
Original file line number Diff line number Diff line change
Expand Up @@ -136,7 +136,7 @@ export class Observable implements definition.Observable {
var i;
var entry: ListenerEntry;
var observersLength = observers.length;
for (i = 0; i < observersLength; i++) {
for (i = observersLength - 1; i >= 0 ; i--) {
entry = observers[i];
if (entry.thisArg) {
entry.callback.apply(entry.thisArg, [data]);
Expand Down
16 changes: 15 additions & 1 deletion ui/core/bindable.ts
Original file line number Diff line number Diff line change
Expand Up @@ -140,6 +140,15 @@ export class Binding {
source: WeakRef<Object>;
target: WeakRef<Bindable>;

public loadedHandlerVisualTreeBinding(args) {
var targetInstance = args.object;
targetInstance.off(viewModule.View.loadedEvent, this.loadedHandlerVisualTreeBinding, this);
this.unbind();
if (!types.isNullOrUndefined(targetInstance.bindingContext)) {
this.bind(targetInstance.bindingContext);
}
};

private propertyChangeListeners = {};

private sourceOptions: { instance: WeakRef<any>; property: any };
Expand Down Expand Up @@ -213,6 +222,11 @@ export class Binding {
if (parentView) {
currentObject = parentView.bindingContext;
}
else {
var targetInstance = this.target.get();
targetInstance.off(viewModule.View.loadedEvent, this.loadedHandlerVisualTreeBinding, this);
targetInstance.on(viewModule.View.loadedEvent, this.loadedHandlerVisualTreeBinding, this);
}
currentObjectChanged = true;
}
result.push({ instance: currentObject, property: objProp });
Expand Down Expand Up @@ -507,7 +521,7 @@ export class Binding {
indexAsInt--;
}
}
else {
else if (types.isString(index)) {
while (result && result.typeName !== index) {
result = result.parent;
}
Expand Down
3 changes: 1 addition & 2 deletions ui/list-view/list-view.android.ts
Original file line number Diff line number Diff line change
Expand Up @@ -205,6 +205,7 @@ class ListViewAdapter extends android.widget.BaseAdapter {
}

if (args.view) {
this._listView._prepareItem(args.view, index);
if (!args.view.parent) {
if (args.view instanceof layoutBaseModule.LayoutBase) {
this._listView._addView(args.view);
Expand All @@ -221,8 +222,6 @@ class ListViewAdapter extends android.widget.BaseAdapter {
this._listView._realizedItems[convertView.hashCode()] = args.view;
// cache the realized index (used to raise the ItemLoading event upon scroll stop)
args.view[REALIZED_INDEX] = index;

this._listView._prepareItem(args.view, index);
}

return convertView;
Expand Down
2 changes: 1 addition & 1 deletion ui/list-view/list-view.ios.ts
Original file line number Diff line number Diff line change
Expand Up @@ -239,12 +239,12 @@ export class ListView extends common.ListView {
var args = notifyForItemAtIndex(this, cell, ITEMLOADING, indexPath);
var view = cell.view = args.view || this._getDefaultItemContent(indexPath.row);

this._prepareItem(view, indexPath.row);
if (view && !view.parent && view.ios) {
cell.contentView.addSubview(view.ios);
this._addView(view);
}

this._prepareItem(view, indexPath.row);
cellHeight = this._layoutCell(view, indexPath);
}
finally {
Expand Down
2 changes: 1 addition & 1 deletion ui/repeater/repeater.ts
Original file line number Diff line number Diff line change
Expand Up @@ -149,8 +149,8 @@ export class Repeater extends viewModule.CustomLayoutView implements definition.
for (i = 0; i < this.items.length; i++) {
var viewToAdd = !types.isNullOrUndefined(this.itemTemplate) ? builder.parse(this.itemTemplate, this) : this._getDefaultItemContent(i);
if (!types.isNullOrUndefined(viewToAdd)) {
this.itemsLayout.addChild(viewToAdd);
viewToAdd.bindingContext = this._getDataItem(i);
this.itemsLayout.addChild(viewToAdd);
}
}
}
Expand Down