@angular-wave/angular.ts 0.4.2 → 0.4.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/angular-ts.esm.js +2 -2
- package/dist/angular-ts.umd.js +12 -2
- package/index.html +74 -3
- package/package.json +7 -7
- package/src/angular.spec.js +1 -269
- package/src/animations/animate-css-driver.js +2 -2
- package/src/animations/animate-css.js +12 -21
- package/src/animations/animate-js-driver.js +1 -3
- package/src/animations/animate-js.js +4 -4
- package/src/animations/animate-queue.js +23 -23
- package/src/animations/animate-runner.js +4 -8
- package/src/animations/animate.md +1 -1
- package/src/animations/animate.spec.js +0 -21
- package/src/animations/animation.js +4 -4
- package/src/animations/shared.js +14 -12
- package/src/binding.spec.js +0 -1
- package/src/core/cache/cache.js +2 -29
- package/src/core/compile/attributes.js +2 -3
- package/src/core/compile/compile.js +260 -245
- package/src/core/compile/compile.spec.js +63 -317
- package/src/core/compile/compile.test.js +1 -1
- package/src/core/controller/controller.js +2 -0
- package/src/core/di/injector.md +1 -1
- package/src/core/di/injector.spec.js +0 -2
- package/src/core/di/internal-injector.js +2 -1
- package/src/core/interpolate/interpolate.js +16 -3
- package/src/core/interpolate/interpolate.spec.js +70 -16
- package/src/core/location/location.js +0 -2
- package/src/core/location/location.spec.js +27 -27
- package/src/core/{scope/scope.html → model/model.html} +1 -1
- package/src/core/model/model.js +944 -0
- package/src/core/model/model.spec.js +3012 -0
- package/src/core/on.spec.js +0 -7
- package/src/core/parse/interpreter.js +10 -7
- package/src/core/parse/parse.js +28 -7
- package/src/core/parse/parse.spec.js +95 -91
- package/src/core/prop.spec.js +4 -60
- package/src/core/sce/sce.js +1 -2
- package/src/core/sce/sce.spec.js +0 -8
- package/src/core/scope/scope.js +62 -32
- package/src/core/scope/scope.spec.js +25 -1960
- package/src/directive/aria/aria.js +3 -6
- package/src/directive/aria/aria.spec.js +0 -87
- package/src/directive/attrs/attrs.spec.js +0 -5
- package/src/directive/{list/list.test.js → attrs/attrs.test.js} +1 -1
- package/src/{core/q/q.html → directive/attrs/boolean.html} +1 -1
- package/src/directive/attrs/boolean.spec.js +0 -15
- package/src/{core/q/q.test.js → directive/attrs/boolean.test.js} +1 -2
- package/src/{core/timeout/timeout.html → directive/attrs/element-style.html} +4 -1
- package/src/directive/attrs/element-style.spec.js +0 -8
- package/src/{core/scope/scope.test.js → directive/attrs/element-style.test.js} +1 -2
- package/src/directive/attrs/src.spec.js +0 -7
- package/src/directive/bind/bind.spec.js +0 -33
- package/src/directive/bind/bing-html.spec.js +1 -4
- package/src/{core/interval/interval.html → directive/channel/channel.html} +1 -1
- package/src/directive/channel/channel.js +29 -0
- package/src/directive/channel/channel.spec.js +52 -0
- package/src/directive/channel/channel.test.js +9 -0
- package/src/directive/class/class.js +3 -3
- package/src/directive/class/class.spec.js +9 -75
- package/src/directive/controller/controller.spec.js +0 -13
- package/src/directive/events/click.spec.js +0 -3
- package/src/directive/events/event.spec.js +0 -6
- package/src/directive/form/form.js +14 -22
- package/src/directive/form/form.spec.js +0 -65
- package/src/directive/if/if.spec.js +2 -7
- package/src/directive/if/if.test.js +1 -2
- package/src/directive/include/include.js +2 -2
- package/src/directive/include/include.spec.js +8 -59
- package/src/directive/init/init.js +6 -2
- package/src/directive/init/init.spec.js +0 -2
- package/src/directive/input/input.js +1 -2
- package/src/directive/input/input.spec.js +191 -331
- package/src/directive/messages/messages.spec.js +4 -35
- package/src/directive/model/model.js +30 -42
- package/src/directive/model/model.spec.js +2 -49
- package/src/directive/model-options/model-options.js +22 -26
- package/src/directive/model-options/model-options.spec.js +0 -6
- package/src/directive/non-bindable/non-bindable.spec.js +0 -1
- package/src/directive/observe/observe.js +0 -1
- package/src/directive/observe/observe.spec.js +0 -1
- package/src/directive/options/options.js +1 -3
- package/src/directive/options/options.spec.js +3 -38
- package/src/directive/ref/href.spec.js +0 -15
- package/src/directive/repeat/repeat.js +2 -2
- package/src/directive/repeat/repeat.spec.js +56 -192
- package/src/directive/script/script.spec.js +0 -2
- package/src/directive/select/select.js +3 -3
- package/src/directive/select/select.spec.js +9 -106
- package/src/directive/show-hide/show-hide.js +2 -2
- package/src/directive/show-hide/show-hide.spec.js +8 -19
- package/src/directive/style/style.spec.js +0 -7
- package/src/directive/switch/switch.js +1 -2
- package/src/directive/switch/switch.spec.js +5 -5
- package/src/directive/validators/validators.spec.js +0 -1
- package/src/loader.js +0 -1
- package/src/public.js +75 -80
- package/src/router/common/coreservices.js +0 -2
- package/src/router/directives/state-directives.js +24 -30
- package/src/router/directives/state-directives.spec.js +0 -83
- package/src/router/directives/view-directive.js +6 -15
- package/src/router/directives/view-directive.spec.js +25 -71
- package/src/router/hooks/lazy-load.js +2 -2
- package/src/router/hooks/views.js +3 -5
- package/src/router/resolve/resolvable.js +3 -6
- package/src/router/resolve/resolve-context.js +2 -2
- package/src/router/state/state-service.js +4 -4
- package/src/router/state/state.spec.js +2 -5
- package/src/router/state/views.js +9 -12
- package/src/router/template-factory.js +3 -6
- package/src/router/template-factory.spec.js +0 -4
- package/src/router/transition/transition-hook.js +1 -1
- package/src/router/transition/transition.js +1 -1
- package/src/router/url/url-service.js +2 -8
- package/src/router/url/url-service.spec.js +3 -4
- package/src/router/view-hook.spec.js +2 -2
- package/src/router/view-scroll.js +4 -6
- package/src/services/http/http.js +11 -15
- package/src/services/http/http.spec.js +30 -31
- package/src/services/http/template-request.spec.js +0 -10
- package/src/services/http-backend/http-backend.js +19 -17
- package/src/services/http-backend/http-backend.spec.js +3 -3
- package/src/services/template-request.js +2 -4
- package/src/shared/common.js +6 -10
- package/src/shared/jqlite/jqlite.js +14 -15
- package/src/shared/jqlite/jqlite.spec.js +2 -2
- package/src/shared/utils.js +15 -92
- package/types/core/cache/cache.d.ts +1 -1
- package/types/core/model/model.d.ts +204 -0
- package/types/core/parse/parse.d.ts +26 -0
- package/types/core/scope/scope.d.ts +22 -21
- package/types/directive/channel/channel.d.ts +11 -0
- package/types/directive/form/form.d.ts +1 -0
- package/types/shared/common.d.ts +0 -1
- package/types/shared/utils.d.ts +0 -35
- package/src/core/interval/interval-factory.js +0 -50
- package/src/core/interval/interval.js +0 -77
- package/src/core/interval/interval.md +0 -123
- package/src/core/interval/interval.spec.js +0 -280
- package/src/core/q/q.js +0 -472
- package/src/core/q/q.md +0 -211
- package/src/core/q/q.spec.js +0 -2748
- package/src/core/timeout/timeout.js +0 -109
- package/src/core/timeout/timeout.spec.js +0 -354
- package/src/core/timeout/timout.test.js +0 -12
- package/src/directive/list/list.html +0 -18
- package/src/directive/list/list.js +0 -46
- package/src/directive/list/list.md +0 -22
- package/src/directive/list/list.spec.js +0 -172
- package/types/directive/list/list.d.ts +0 -4
|
@@ -49,8 +49,6 @@ describe("ngModelOptions", () => {
|
|
|
49
49
|
]);
|
|
50
50
|
$compile = injector.get("$compile");
|
|
51
51
|
$rootScope = injector.get("$rootScope");
|
|
52
|
-
$q = injector.get("$q");
|
|
53
|
-
$timeout = injector.get("$timeout");
|
|
54
52
|
});
|
|
55
53
|
|
|
56
54
|
describe("should fall back to `defaultModelOptions`", () => {
|
|
@@ -273,8 +271,6 @@ describe("ngModelOptions", () => {
|
|
|
273
271
|
'<input type="text" ng-model="name" name="alias" />' +
|
|
274
272
|
"</form>",
|
|
275
273
|
)($rootScope);
|
|
276
|
-
$rootScope.$digest();
|
|
277
|
-
|
|
278
274
|
inputElm = doc.find("input");
|
|
279
275
|
changeGivenInputTo(inputElm, "a");
|
|
280
276
|
expect($rootScope.name).toEqual(undefined);
|
|
@@ -935,7 +931,6 @@ describe("ngModelOptions", () => {
|
|
|
935
931
|
expect($rootScope.value).toBe("12345");
|
|
936
932
|
expect($rootScope.form.input.$pending.promiseValidator).toBe(true);
|
|
937
933
|
defer.reject();
|
|
938
|
-
$rootScope.$digest();
|
|
939
934
|
expect($rootScope.value).toBe("12345");
|
|
940
935
|
expect(inputElm[0].classList.contains("ng-invalid")).toBeTrue();
|
|
941
936
|
});
|
|
@@ -958,7 +953,6 @@ describe("ngModelOptions", () => {
|
|
|
958
953
|
expect(inputElm.val()).toBe("12345");
|
|
959
954
|
expect($rootScope.form.input.$pending.promiseValidator).toBe(true);
|
|
960
955
|
defer.reject();
|
|
961
|
-
$rootScope.$digest();
|
|
962
956
|
expect(inputElm.val()).toBe("12345");
|
|
963
957
|
expect(inputElm[0].classList.contains("ng-invalid")).toBeTrue();
|
|
964
958
|
});
|
|
@@ -43,7 +43,6 @@ describe("ngNonBindable", () => {
|
|
|
43
43
|
)($rootScope);
|
|
44
44
|
$rootScope.a = "one";
|
|
45
45
|
$rootScope.b = "two";
|
|
46
|
-
$rootScope.$digest();
|
|
47
46
|
// Bindings not contained by ng-non-bindable should resolve.
|
|
48
47
|
const spans = element.find("span");
|
|
49
48
|
expect(spans.eq(0).text()).toEqual("one");
|
|
@@ -25,7 +25,6 @@ describe("observe", () => {
|
|
|
25
25
|
function createDirective(attributeValue, updateProp) {
|
|
26
26
|
const template = `<div ng-observe="${attributeValue}" data-update="${updateProp}"></div>`;
|
|
27
27
|
element = $compile(template)($scope);
|
|
28
|
-
$scope.$digest();
|
|
29
28
|
}
|
|
30
29
|
|
|
31
30
|
it("should set the scope property to the attribute value before any changes", () => {
|
|
@@ -1,7 +1,6 @@
|
|
|
1
1
|
import { JQLite, removeElement, startingTag } from "../../shared/jqlite/jqlite";
|
|
2
2
|
import {
|
|
3
3
|
equals,
|
|
4
|
-
forEach,
|
|
5
4
|
hashKey,
|
|
6
5
|
includes,
|
|
7
6
|
isArrayLike,
|
|
@@ -328,8 +327,7 @@ export const ngOptionsDirective = [
|
|
|
328
327
|
selectCtrl.readValue = function readNgOptionsMultiple() {
|
|
329
328
|
const selectedValues = selectElement.val() || [];
|
|
330
329
|
const selections = [];
|
|
331
|
-
|
|
332
|
-
forEach(selectedValues, (value) => {
|
|
330
|
+
selectedValues.forEach((value) => {
|
|
333
331
|
const option = options.selectValueMap[value];
|
|
334
332
|
if (option && !option.disabled)
|
|
335
333
|
selections.push(options.getViewValueFromOption(option));
|
|
@@ -2,7 +2,6 @@ import { createInjector } from "../../core/di/injector";
|
|
|
2
2
|
import { JQLite, dealoc } from "../../shared/jqlite/jqlite";
|
|
3
3
|
import { Angular } from "../../loader";
|
|
4
4
|
import {
|
|
5
|
-
forEach,
|
|
6
5
|
isBoolean,
|
|
7
6
|
hashKey,
|
|
8
7
|
equals,
|
|
@@ -232,7 +231,7 @@ describe("ngOptions", () => {
|
|
|
232
231
|
|
|
233
232
|
function createSelect(attrs, blank, unknown) {
|
|
234
233
|
let html = "<select";
|
|
235
|
-
forEach(
|
|
234
|
+
Object.entries(attrs).forEach(([key, value]) => {
|
|
236
235
|
if (isBoolean(value)) {
|
|
237
236
|
if (value) html += ` ${key}`;
|
|
238
237
|
} else {
|
|
@@ -388,8 +387,6 @@ describe("ngOptions", () => {
|
|
|
388
387
|
"ng-model": "selected",
|
|
389
388
|
"ng-options": "option.id as option.display for option in values",
|
|
390
389
|
});
|
|
391
|
-
scope.$digest();
|
|
392
|
-
|
|
393
390
|
const options = element.find("option");
|
|
394
391
|
expect(options.length).toEqual(2);
|
|
395
392
|
expect(options.eq(0)).toEqualOption("FF0000", "red");
|
|
@@ -401,8 +398,6 @@ describe("ngOptions", () => {
|
|
|
401
398
|
expect(options.eq(0)[0].selected).toBe(true);
|
|
402
399
|
|
|
403
400
|
scope.selected = "0000FF";
|
|
404
|
-
scope.$digest();
|
|
405
|
-
|
|
406
401
|
expect(options.eq(1)[0].getAttribute("selected")).toBe("selected");
|
|
407
402
|
expect(options.eq(1).attr("selected")).toBe("selected");
|
|
408
403
|
expect(options.eq(1)[0].selected).toBe(true);
|
|
@@ -439,7 +434,6 @@ describe("ngOptions", () => {
|
|
|
439
434
|
{ id: 0, label: "x" },
|
|
440
435
|
{ id: 1, label: "y" },
|
|
441
436
|
];
|
|
442
|
-
scope.$digest();
|
|
443
437
|
const options = element.find("option");
|
|
444
438
|
expect(options.length).toEqual(2);
|
|
445
439
|
expect(options.eq(0)).toEqualOption(0, "x");
|
|
@@ -613,8 +607,6 @@ describe("ngOptions", () => {
|
|
|
613
607
|
scope.array.other = "do not watch";
|
|
614
608
|
scope.array.fn = function () {};
|
|
615
609
|
scope.selected = "b";
|
|
616
|
-
scope.$digest();
|
|
617
|
-
|
|
618
610
|
expect(scope.createLabel).toHaveBeenCalledWith("a");
|
|
619
611
|
expect(scope.createLabel).toHaveBeenCalledWith("b");
|
|
620
612
|
expect(scope.createLabel).toHaveBeenCalledWith("c");
|
|
@@ -636,8 +628,6 @@ describe("ngOptions", () => {
|
|
|
636
628
|
$property: "invisible",
|
|
637
629
|
};
|
|
638
630
|
scope.selected = "regularProperty";
|
|
639
|
-
scope.$digest();
|
|
640
|
-
|
|
641
631
|
expect(scope.createLabel).toHaveBeenCalledWith("regularProperty");
|
|
642
632
|
expect(scope.createLabel).not.toHaveBeenCalledWith("$$private");
|
|
643
633
|
expect(scope.createLabel).not.toHaveBeenCalledWith("$property");
|
|
@@ -689,8 +679,6 @@ describe("ngOptions", () => {
|
|
|
689
679
|
expect(optionToSelect.text()).toBe("B");
|
|
690
680
|
|
|
691
681
|
optionToSelect[0].selected = true;
|
|
692
|
-
scope.$digest();
|
|
693
|
-
|
|
694
682
|
expect(optionToSelect[0].selected).toBe(true);
|
|
695
683
|
expect(scope.selected).toBe(scope.values[0]);
|
|
696
684
|
});
|
|
@@ -783,7 +771,6 @@ describe("ngOptions", () => {
|
|
|
783
771
|
|
|
784
772
|
// Change the scope but the options should not change
|
|
785
773
|
scope.arr = ["w", "x", "y", "z"];
|
|
786
|
-
scope.$digest();
|
|
787
774
|
options = element.find("option");
|
|
788
775
|
expect(options.length).toEqual(4);
|
|
789
776
|
expect(options.eq(0)).toEqualUnknownOption();
|
|
@@ -812,30 +799,23 @@ describe("ngOptions", () => {
|
|
|
812
799
|
expect(options[2].selected).not.toBe(true);
|
|
813
800
|
|
|
814
801
|
scope.selected = scope.values[0];
|
|
815
|
-
scope.$digest();
|
|
816
|
-
|
|
817
802
|
expect(options[0].selected).not.toBe(true);
|
|
818
803
|
expect(options[1].selected).toBe(true);
|
|
819
804
|
expect(options[2].selected).not.toBe(true);
|
|
820
805
|
|
|
821
806
|
scope.selected = scope.values[1];
|
|
822
|
-
scope.$digest();
|
|
823
|
-
|
|
824
807
|
expect(options[0].selected).not.toBe(true);
|
|
825
808
|
expect(options[1].selected).not.toBe(true);
|
|
826
809
|
expect(options[2].selected).toBe(true);
|
|
827
810
|
|
|
828
811
|
// This will select the empty option
|
|
829
812
|
scope.selected = null;
|
|
830
|
-
scope.$digest();
|
|
831
|
-
|
|
832
813
|
expect(options[0].selected).toBe(true);
|
|
833
814
|
expect(options[1].selected).not.toBe(true);
|
|
834
815
|
expect(options[2].selected).not.toBe(true);
|
|
835
816
|
|
|
836
817
|
// This will add and select the unknown option
|
|
837
818
|
scope.selected = "unmatched value";
|
|
838
|
-
scope.$digest();
|
|
839
819
|
options = element.find("option");
|
|
840
820
|
|
|
841
821
|
expect(options[0].selected).toBe(true);
|
|
@@ -845,7 +825,6 @@ describe("ngOptions", () => {
|
|
|
845
825
|
|
|
846
826
|
// Back to matched value
|
|
847
827
|
scope.selected = scope.values[1];
|
|
848
|
-
scope.$digest();
|
|
849
828
|
options = element.find("option");
|
|
850
829
|
|
|
851
830
|
expect(options[0].selected).not.toBe(true);
|
|
@@ -1531,7 +1510,6 @@ describe("ngOptions", () => {
|
|
|
1531
1510
|
expect(scope.selected).toEqual(scope.arr[1]);
|
|
1532
1511
|
|
|
1533
1512
|
scope.selected = {};
|
|
1534
|
-
scope.$digest();
|
|
1535
1513
|
expect(options[0].selected).toBeTrue();
|
|
1536
1514
|
expect(options[1].selected).not.toBeTrue();
|
|
1537
1515
|
expect(options[2].selected).not.toBeTrue();
|
|
@@ -1869,8 +1847,6 @@ describe("ngOptions", () => {
|
|
|
1869
1847
|
{ cls: "one", name: "Beta" },
|
|
1870
1848
|
{ cls: "two", name: "Gamma" },
|
|
1871
1849
|
];
|
|
1872
|
-
scope.$digest();
|
|
1873
|
-
|
|
1874
1850
|
optgroups = element.find("optgroup");
|
|
1875
1851
|
expect(optgroups.length).toBe(2);
|
|
1876
1852
|
|
|
@@ -1896,8 +1872,6 @@ describe("ngOptions", () => {
|
|
|
1896
1872
|
{ cls: "two", name: "Delta" },
|
|
1897
1873
|
{ cls: "three", name: "Epsilon" },
|
|
1898
1874
|
);
|
|
1899
|
-
scope.$digest();
|
|
1900
|
-
|
|
1901
1875
|
optgroups = element.find("optgroup");
|
|
1902
1876
|
expect(optgroups.length).toBe(3);
|
|
1903
1877
|
|
|
@@ -2355,8 +2329,6 @@ describe("ngOptions", () => {
|
|
|
2355
2329
|
expect(element[0].value).toBe("?");
|
|
2356
2330
|
|
|
2357
2331
|
scope.selected = undefined;
|
|
2358
|
-
scope.$digest();
|
|
2359
|
-
|
|
2360
2332
|
expect(element[0].value).toBe("");
|
|
2361
2333
|
});
|
|
2362
2334
|
|
|
@@ -2615,7 +2587,6 @@ describe("ngOptions", () => {
|
|
|
2615
2587
|
createSingleSelect(true);
|
|
2616
2588
|
// ensure the first option (the blank option) is selected
|
|
2617
2589
|
expect(element[0].selectedIndex).toEqual(0);
|
|
2618
|
-
scope.$digest();
|
|
2619
2590
|
// ensure the option has not changed following the digest
|
|
2620
2591
|
expect(element[0].selectedIndex).toEqual(0);
|
|
2621
2592
|
});
|
|
@@ -2766,7 +2737,6 @@ describe("ngOptions", () => {
|
|
|
2766
2737
|
element = $compile(
|
|
2767
2738
|
'<custom-select ng-model="value" options="options"></custom-select>',
|
|
2768
2739
|
)(scope);
|
|
2769
|
-
scope.$digest();
|
|
2770
2740
|
}).not.toThrow();
|
|
2771
2741
|
|
|
2772
2742
|
dealoc(element);
|
|
@@ -2941,7 +2911,6 @@ describe("ngOptions", () => {
|
|
|
2941
2911
|
scope.values = { 0: "A", 1: "B" };
|
|
2942
2912
|
|
|
2943
2913
|
scope.selected = ["1"];
|
|
2944
|
-
scope.$digest();
|
|
2945
2914
|
expect(element.find("option")[1].selected).toBe(true);
|
|
2946
2915
|
|
|
2947
2916
|
element.find("option")[0].selected = true;
|
|
@@ -2993,7 +2962,7 @@ describe("ngOptions", () => {
|
|
|
2993
2962
|
const addSpiesOnProto =
|
|
2994
2963
|
originalSelectedDescriptor && originalSelectedDescriptor.configurable;
|
|
2995
2964
|
|
|
2996
|
-
forEach(
|
|
2965
|
+
Object.entries(options).forEach(([i, option]) => {
|
|
2997
2966
|
const setSelected = function (value) {
|
|
2998
2967
|
_selected[i] = value;
|
|
2999
2968
|
};
|
|
@@ -3004,7 +2973,7 @@ describe("ngOptions", () => {
|
|
|
3004
2973
|
});
|
|
3005
2974
|
|
|
3006
2975
|
if (!addSpiesOnProto) {
|
|
3007
|
-
forEach(
|
|
2976
|
+
Object.entries(options).forEach(([i, option]) => {
|
|
3008
2977
|
Object.defineProperty(option, "selected", {
|
|
3009
2978
|
get() {
|
|
3010
2979
|
return _selected[i];
|
|
@@ -3429,7 +3398,6 @@ describe("ngOptions", () => {
|
|
|
3429
3398
|
});
|
|
3430
3399
|
|
|
3431
3400
|
it("should fail validation when $asyncValidators fail", () => {
|
|
3432
|
-
let $q = injector.get("$q");
|
|
3433
3401
|
let defer;
|
|
3434
3402
|
createSelect({
|
|
3435
3403
|
name: "select",
|
|
@@ -3448,14 +3416,12 @@ describe("ngOptions", () => {
|
|
|
3448
3416
|
expect(element).toEqualSelectValue("third");
|
|
3449
3417
|
|
|
3450
3418
|
defer.reject();
|
|
3451
|
-
scope.$digest();
|
|
3452
3419
|
expect(scope.form.select.$pending).toBeUndefined();
|
|
3453
3420
|
expect(scope.value).toBeUndefined();
|
|
3454
3421
|
expect(element).toEqualSelectValue("third");
|
|
3455
3422
|
});
|
|
3456
3423
|
|
|
3457
3424
|
it("should pass validation when $asyncValidators pass", () => {
|
|
3458
|
-
let $q = injector.get("$q");
|
|
3459
3425
|
let defer;
|
|
3460
3426
|
createSelect({
|
|
3461
3427
|
name: "select",
|
|
@@ -3474,7 +3440,6 @@ describe("ngOptions", () => {
|
|
|
3474
3440
|
expect(element).toEqualSelectValue("third");
|
|
3475
3441
|
|
|
3476
3442
|
defer.resolve();
|
|
3477
|
-
scope.$digest();
|
|
3478
3443
|
expect(scope.form.select.$pending).toBeUndefined();
|
|
3479
3444
|
expect(scope.value).toBe("third");
|
|
3480
3445
|
expect(element).toEqualSelectValue("third");
|
|
@@ -29,7 +29,6 @@ describe("ngHref", () => {
|
|
|
29
29
|
|
|
30
30
|
it("should interpolate the expression and bind to href", () => {
|
|
31
31
|
element = $compile('<a ng-href="some/{{id}}"></div>')($rootScope);
|
|
32
|
-
$rootScope.$digest();
|
|
33
32
|
expect(element.attr("href")).toEqual("some/");
|
|
34
33
|
|
|
35
34
|
$rootScope.$apply(() => {
|
|
@@ -42,31 +41,25 @@ describe("ngHref", () => {
|
|
|
42
41
|
element = $compile('<a ng-href="{{url}}" rel="{{rel}}"></a>')($rootScope);
|
|
43
42
|
$rootScope.url = "http://server";
|
|
44
43
|
$rootScope.rel = "REL";
|
|
45
|
-
$rootScope.$digest();
|
|
46
44
|
expect(element.attr("href")).toEqual("http://server");
|
|
47
45
|
expect(element.attr("rel")).toEqual("REL");
|
|
48
46
|
});
|
|
49
47
|
|
|
50
48
|
it("should bind href even if no interpolation", () => {
|
|
51
49
|
element = $compile('<a ng-href="http://server"></a>')($rootScope);
|
|
52
|
-
$rootScope.$digest();
|
|
53
50
|
expect(element.attr("href")).toEqual("http://server");
|
|
54
51
|
});
|
|
55
52
|
|
|
56
53
|
it("should not set the href if ng-href is empty", () => {
|
|
57
54
|
$rootScope.url = null;
|
|
58
55
|
element = $compile('<a ng-href="{{url}}">')($rootScope);
|
|
59
|
-
$rootScope.$digest();
|
|
60
56
|
expect(element.attr("href")).toEqual(undefined);
|
|
61
57
|
});
|
|
62
58
|
|
|
63
59
|
it("should remove the href if ng-href changes to empty", () => {
|
|
64
60
|
$rootScope.url = "http://www.google.com/";
|
|
65
61
|
element = $compile('<a ng-href="{{url}}">')($rootScope);
|
|
66
|
-
$rootScope.$digest();
|
|
67
|
-
|
|
68
62
|
$rootScope.url = null;
|
|
69
|
-
$rootScope.$digest();
|
|
70
63
|
expect(element.attr("href")).toEqual(undefined);
|
|
71
64
|
});
|
|
72
65
|
|
|
@@ -74,26 +67,22 @@ describe("ngHref", () => {
|
|
|
74
67
|
/* eslint no-script-url: "off" */
|
|
75
68
|
$rootScope.imageUrl = "javascript:alert(1);";
|
|
76
69
|
element = $compile('<a ng-href="{{imageUrl}}">')($rootScope);
|
|
77
|
-
$rootScope.$digest();
|
|
78
70
|
expect(element.attr("href")).toBe("unsafe:javascript:alert(1);");
|
|
79
71
|
});
|
|
80
72
|
|
|
81
73
|
it("should sanitize non-interpolated url", () => {
|
|
82
74
|
element = $compile('<a ng-href="javascript:alert(1);">')($rootScope);
|
|
83
|
-
$rootScope.$digest();
|
|
84
75
|
expect(element.attr("href")).toBe("unsafe:javascript:alert(1);");
|
|
85
76
|
});
|
|
86
77
|
|
|
87
78
|
it("should bind numbers", () => {
|
|
88
79
|
element = $compile('<a ng-href="{{1234}}"></a>')($rootScope);
|
|
89
|
-
$rootScope.$digest();
|
|
90
80
|
expect(element.attr("href")).toEqual("1234");
|
|
91
81
|
});
|
|
92
82
|
|
|
93
83
|
it("should bind and sanitize the result of a (custom) toString() function", () => {
|
|
94
84
|
$rootScope.value = {};
|
|
95
85
|
element = $compile('<a ng-href="{{value}}"></a>')($rootScope);
|
|
96
|
-
$rootScope.$digest();
|
|
97
86
|
expect(element.attr("href")).toEqual("[object Object]");
|
|
98
87
|
|
|
99
88
|
function SafeClass() {}
|
|
@@ -103,7 +92,6 @@ describe("ngHref", () => {
|
|
|
103
92
|
};
|
|
104
93
|
|
|
105
94
|
$rootScope.value = new SafeClass();
|
|
106
|
-
$rootScope.$digest();
|
|
107
95
|
expect(element.attr("href")).toEqual("custom value");
|
|
108
96
|
|
|
109
97
|
function UnsafeClass() {}
|
|
@@ -113,7 +101,6 @@ describe("ngHref", () => {
|
|
|
113
101
|
};
|
|
114
102
|
|
|
115
103
|
$rootScope.value = new UnsafeClass();
|
|
116
|
-
$rootScope.$digest();
|
|
117
104
|
expect(element.attr("href")).toEqual("unsafe:javascript:alert(1);");
|
|
118
105
|
});
|
|
119
106
|
|
|
@@ -124,7 +111,6 @@ describe("ngHref", () => {
|
|
|
124
111
|
$rootScope,
|
|
125
112
|
);
|
|
126
113
|
const child = element.children("a");
|
|
127
|
-
$rootScope.$digest();
|
|
128
114
|
expect(child.attr("xlink:href")).toEqual("some/");
|
|
129
115
|
|
|
130
116
|
$rootScope.$apply(() => {
|
|
@@ -138,7 +124,6 @@ describe("ngHref", () => {
|
|
|
138
124
|
$rootScope,
|
|
139
125
|
);
|
|
140
126
|
const child = element.children("a");
|
|
141
|
-
$rootScope.$digest();
|
|
142
127
|
expect(child.attr("xlink:href")).toEqual("http://server");
|
|
143
128
|
});
|
|
144
129
|
});
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { minErr, hashKey, isArrayLike } from "../../shared/utils";
|
|
2
2
|
import { getBlockNodes } from "../../shared/jqlite/jqlite";
|
|
3
3
|
|
|
4
4
|
export const ngRepeatDirective = [
|
|
@@ -188,7 +188,7 @@ export const ngRepeatDirective = [
|
|
|
188
188
|
nextBlockOrder[index] = block;
|
|
189
189
|
} else if (nextBlockMap[trackById]) {
|
|
190
190
|
// if collision detected. restore lastBlockMap and throw an error
|
|
191
|
-
|
|
191
|
+
Object.values(nextBlockOrder).forEach((block) => {
|
|
192
192
|
if (block && block.scope) lastBlockMap[block.id] = block;
|
|
193
193
|
});
|
|
194
194
|
throw ngRepeatMinErr(
|