From 4554edbc68b71381cbf5c117257a71305e851326 Mon Sep 17 00:00:00 2001 From: "Hilmer, Carsten" Date: Thu, 11 Aug 2016 16:55:44 +0200 Subject: [PATCH] =?UTF-8?q?Erste=20lauff=C3=A4hige=20Version?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- config.xml | 77 +- npm-debug.log | 96 + www/img/720.png | Bin 0 -> 127391 bytes www/img/pokemon.gif | Bin 0 -> 1458653 bytes www/index.html | 3 +- www/js/app.js | 41 +- www/js/controllers.js | 211 +- www/js/services.js | 46 +- www/lib/angular-animate/.bower.json | 20 + www/lib/angular-animate/README.md | 68 + www/lib/angular-animate/angular-animate.js | 4115 +++ .../angular-animate/angular-animate.min.js | 56 + .../angular-animate.min.js.map | 8 + www/lib/angular-animate/bower.json | 10 + www/lib/angular-animate/index.js | 2 + www/lib/angular-animate/package.json | 26 + www/lib/angular-sanitize/.bower.json | 20 + www/lib/angular-sanitize/README.md | 68 + www/lib/angular-sanitize/angular-sanitize.js | 717 + .../angular-sanitize/angular-sanitize.min.js | 15 + .../angular-sanitize.min.js.map | 8 + www/lib/angular-sanitize/bower.json | 10 + www/lib/angular-sanitize/index.js | 2 + www/lib/angular-sanitize/package.json | 26 + www/lib/angular-ui-router/.bower.json | 33 + www/lib/angular-ui-router/CHANGELOG.md | 197 + www/lib/angular-ui-router/CONTRIBUTING.md | 65 + www/lib/angular-ui-router/LICENSE | 21 + www/lib/angular-ui-router/README.md | 243 + .../api/angular-ui-router.d.ts | 126 + www/lib/angular-ui-router/bower.json | 23 + .../release/angular-ui-router.js | 4232 +++ .../release/angular-ui-router.min.js | 7 + www/lib/angular-ui-router/src/common.js | 292 + www/lib/angular-ui-router/src/resolve.js | 252 + www/lib/angular-ui-router/src/state.js | 1373 + .../angular-ui-router/src/stateDirectives.js | 268 + www/lib/angular-ui-router/src/stateFilters.js | 39 + .../angular-ui-router/src/templateFactory.js | 110 + .../src/urlMatcherFactory.js | 1036 + www/lib/angular-ui-router/src/urlRouter.js | 413 + www/lib/angular-ui-router/src/view.js | 71 + .../angular-ui-router/src/viewDirective.js | 302 + www/lib/angular-ui-router/src/viewScroll.js | 52 + www/lib/angular/.bower.json | 18 + www/lib/angular/README.md | 64 + www/lib/angular/angular-csp.css | 21 + www/lib/angular/angular.js | 30714 ++++++++++++++++ www/lib/angular/angular.min.js | 311 + www/lib/angular/angular.min.js.gzip | Bin 0 -> 54974 bytes www/lib/angular/angular.min.js.map | 8 + www/lib/angular/bower.json | 9 + www/lib/angular/index.js | 2 + www/lib/angular/package.json | 25 + www/lib/ionic-filter-bar/.bower.json | 54 + www/lib/ionic-filter-bar/bower.json | 43 + .../dist/ionic.filter.bar.css | 224 + .../ionic-filter-bar/dist/ionic.filter.bar.js | 721 + .../dist/ionic.filter.bar.min.css | 1 + .../dist/ionic.filter.bar.min.js | 1 + .../scss/ionic.filter.bar.scss | 179 + www/pokedex.db | Bin 69632 -> 69632 bytes www/templates/firstrun.html | 15 + www/templates/imagedownload.html | 21 + www/templates/init.html | 4 + www/templates/tab-chats.html | 36 +- www/templates/tab-dash.html | 6 + 67 files changed, 47204 insertions(+), 73 deletions(-) create mode 100644 npm-debug.log create mode 100644 www/img/720.png create mode 100644 www/img/pokemon.gif create mode 100644 www/lib/angular-animate/.bower.json create mode 100644 www/lib/angular-animate/README.md create mode 100644 www/lib/angular-animate/angular-animate.js create mode 100644 www/lib/angular-animate/angular-animate.min.js create mode 100644 www/lib/angular-animate/angular-animate.min.js.map create mode 100644 www/lib/angular-animate/bower.json create mode 100644 www/lib/angular-animate/index.js create mode 100644 www/lib/angular-animate/package.json create mode 100644 www/lib/angular-sanitize/.bower.json create mode 100644 www/lib/angular-sanitize/README.md create mode 100644 www/lib/angular-sanitize/angular-sanitize.js create mode 100644 www/lib/angular-sanitize/angular-sanitize.min.js create mode 100644 www/lib/angular-sanitize/angular-sanitize.min.js.map create mode 100644 www/lib/angular-sanitize/bower.json create mode 100644 www/lib/angular-sanitize/index.js create mode 100644 www/lib/angular-sanitize/package.json create mode 100644 www/lib/angular-ui-router/.bower.json create mode 100644 www/lib/angular-ui-router/CHANGELOG.md create mode 100644 www/lib/angular-ui-router/CONTRIBUTING.md create mode 100644 www/lib/angular-ui-router/LICENSE create mode 100644 www/lib/angular-ui-router/README.md create mode 100644 www/lib/angular-ui-router/api/angular-ui-router.d.ts create mode 100644 www/lib/angular-ui-router/bower.json create mode 100644 www/lib/angular-ui-router/release/angular-ui-router.js create mode 100644 www/lib/angular-ui-router/release/angular-ui-router.min.js create mode 100644 www/lib/angular-ui-router/src/common.js create mode 100644 www/lib/angular-ui-router/src/resolve.js create mode 100644 www/lib/angular-ui-router/src/state.js create mode 100644 www/lib/angular-ui-router/src/stateDirectives.js create mode 100644 www/lib/angular-ui-router/src/stateFilters.js create mode 100644 www/lib/angular-ui-router/src/templateFactory.js create mode 100644 www/lib/angular-ui-router/src/urlMatcherFactory.js create mode 100644 www/lib/angular-ui-router/src/urlRouter.js create mode 100644 www/lib/angular-ui-router/src/view.js create mode 100644 www/lib/angular-ui-router/src/viewDirective.js create mode 100644 www/lib/angular-ui-router/src/viewScroll.js create mode 100644 www/lib/angular/.bower.json create mode 100644 www/lib/angular/README.md create mode 100644 www/lib/angular/angular-csp.css create mode 100644 www/lib/angular/angular.js create mode 100644 www/lib/angular/angular.min.js create mode 100644 www/lib/angular/angular.min.js.gzip create mode 100644 www/lib/angular/angular.min.js.map create mode 100644 www/lib/angular/bower.json create mode 100644 www/lib/angular/index.js create mode 100644 www/lib/angular/package.json create mode 100644 www/lib/ionic-filter-bar/.bower.json create mode 100644 www/lib/ionic-filter-bar/bower.json create mode 100644 www/lib/ionic-filter-bar/dist/ionic.filter.bar.css create mode 100644 www/lib/ionic-filter-bar/dist/ionic.filter.bar.js create mode 100644 www/lib/ionic-filter-bar/dist/ionic.filter.bar.min.css create mode 100644 www/lib/ionic-filter-bar/dist/ionic.filter.bar.min.js create mode 100644 www/lib/ionic-filter-bar/scss/ionic.filter.bar.scss create mode 100644 www/templates/firstrun.html create mode 100644 www/templates/imagedownload.html create mode 100644 www/templates/init.html diff --git a/config.xml b/config.xml index ff579e9..5d2d4aa 100644 --- a/config.xml +++ b/config.xml @@ -1,43 +1,44 @@ - + - pokedex - + pokedex + An Ionic Framework and Cordova project. - + Your Name Here - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/npm-debug.log b/npm-debug.log new file mode 100644 index 0000000..ce8ef37 --- /dev/null +++ b/npm-debug.log @@ -0,0 +1,96 @@ +0 info it worked if it ends with ok +1 verbose cli [ 'C:\\Program Files\\nodejs\\node.exe', +1 verbose cli 'C:\\Program Files\\nodejs\\node_modules\\npm\\bin\\npm-cli.js', +1 verbose cli 'install', +1 verbose cli 'ionic-filter-bar' ] +2 info using npm@2.15.8 +3 info using node@v4.4.7 +4 verbose install initial load of C:\_IONIC_\pokedex\package.json +5 warn package.json pokedex@1.1.1 No repository field. +6 warn package.json pokedex@1.1.1 No license field. +7 verbose readDependencies loading dependencies from C:\_IONIC_\pokedex\package.json +8 silly cache add args [ 'ionic-filter-bar', null ] +9 verbose cache add spec ionic-filter-bar +10 silly cache add parsed spec Result { +10 silly cache add raw: 'ionic-filter-bar', +10 silly cache add scope: null, +10 silly cache add name: 'ionic-filter-bar', +10 silly cache add rawSpec: '', +10 silly cache add spec: 'latest', +10 silly cache add type: 'tag' } +11 silly addNamed ionic-filter-bar@latest +12 verbose addNamed "latest" is being treated as a dist-tag for ionic-filter-bar +13 info addNameTag [ 'ionic-filter-bar', 'latest' ] +14 silly mapToRegistry name ionic-filter-bar +15 silly mapToRegistry using default registry +16 silly mapToRegistry registry https://registry.npmjs.org/ +17 silly mapToRegistry data Result { +17 silly mapToRegistry raw: 'ionic-filter-bar', +17 silly mapToRegistry scope: null, +17 silly mapToRegistry name: 'ionic-filter-bar', +17 silly mapToRegistry rawSpec: '', +17 silly mapToRegistry spec: 'latest', +17 silly mapToRegistry type: 'tag' } +18 silly mapToRegistry uri https://registry.npmjs.org/ionic-filter-bar +19 verbose addNameTag registry:https://registry.npmjs.org/ionic-filter-bar not in flight; fetching +20 verbose request uri https://registry.npmjs.org/ionic-filter-bar +21 verbose request no auth needed +22 info attempt registry request try #1 at 13:39:33 +23 verbose request id 858570eea89506d8 +24 http request GET https://registry.npmjs.org/ionic-filter-bar +25 http 404 https://registry.npmjs.org/ionic-filter-bar +26 verbose headers { 'content-type': 'application/json', +26 verbose headers 'cache-control': 'max-age=0', +26 verbose headers 'content-length': '2', +26 verbose headers 'accept-ranges': 'bytes', +26 verbose headers date: 'Tue, 09 Aug 2016 11:39:34 GMT', +26 verbose headers via: '1.1 varnish', +26 verbose headers age: '0', +26 verbose headers connection: 'keep-alive', +26 verbose headers 'x-served-by': 'cache-fra1223-FRA', +26 verbose headers 'x-cache': 'MISS', +26 verbose headers 'x-cache-hits': '0', +26 verbose headers 'x-timer': 'S1470742773.957018,VS0,VE116', +26 verbose headers vary: 'Accept-Encoding' } +27 silly get cb [ 404, +27 silly get { 'content-type': 'application/json', +27 silly get 'cache-control': 'max-age=0', +27 silly get 'content-length': '2', +27 silly get 'accept-ranges': 'bytes', +27 silly get date: 'Tue, 09 Aug 2016 11:39:34 GMT', +27 silly get via: '1.1 varnish', +27 silly get age: '0', +27 silly get connection: 'keep-alive', +27 silly get 'x-served-by': 'cache-fra1223-FRA', +27 silly get 'x-cache': 'MISS', +27 silly get 'x-cache-hits': '0', +27 silly get 'x-timer': 'S1470742773.957018,VS0,VE116', +27 silly get vary: 'Accept-Encoding' } ] +28 verbose stack Error: Registry returned 404 for GET on https://registry.npmjs.org/ionic-filter-bar +28 verbose stack at makeError (C:\Program Files\nodejs\node_modules\npm\node_modules\npm-registry-client\lib\request.js:264:12) +28 verbose stack at CachingRegistryClient. (C:\Program Files\nodejs\node_modules\npm\node_modules\npm-registry-client\lib\request.js:242:14) +28 verbose stack at Request._callback (C:\Program Files\nodejs\node_modules\npm\node_modules\npm-registry-client\lib\request.js:172:14) +28 verbose stack at Request.self.callback (C:\Program Files\nodejs\node_modules\npm\node_modules\request\request.js:200:22) +28 verbose stack at emitTwo (events.js:87:13) +28 verbose stack at Request.emit (events.js:172:7) +28 verbose stack at Request. (C:\Program Files\nodejs\node_modules\npm\node_modules\request\request.js:1067:10) +28 verbose stack at emitOne (events.js:82:20) +28 verbose stack at Request.emit (events.js:169:7) +28 verbose stack at IncomingMessage. (C:\Program Files\nodejs\node_modules\npm\node_modules\request\request.js:988:12) +29 verbose statusCode 404 +30 verbose pkgid ionic-filter-bar +31 verbose cwd C:\_IONIC_\pokedex +32 error Windows_NT 10.0.10586 +33 error argv "C:\\Program Files\\nodejs\\node.exe" "C:\\Program Files\\nodejs\\node_modules\\npm\\bin\\npm-cli.js" "install" "ionic-filter-bar" +34 error node v4.4.7 +35 error npm v2.15.8 +36 error code E404 +37 error 404 Registry returned 404 for GET on https://registry.npmjs.org/ionic-filter-bar +37 error 404 +37 error 404 'ionic-filter-bar' is not in the npm registry. +37 error 404 You should bug the author to publish it (or use the name yourself!) +37 error 404 It was specified as a dependency of 'pokedex' +37 error 404 +37 error 404 Note that you can also install from a +37 error 404 tarball, folder, http url, or git url. +38 verbose exit [ 1, true ] diff --git a/www/img/720.png b/www/img/720.png new file mode 100644 index 0000000000000000000000000000000000000000..ecf6a426052e5b713a30fc7712cad4db6cc5e6ca GIT binary patch literal 127391 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�SAs>SZ{1vG@P#%<}7PkB*KGWUjlWj?Jj2--UHWr9CKuQ|SQ+ zFelUuLS7P|9{%8c7ElQRS@`&J0Us;P-i2W^TF4SXRZ&Ty7>7g$*~wj4+a+yRU5c+2 zen(AWF5Y)`W;MAc*B;xcxPiJgdK8&j6ohO1^k|Nx6#$J~cpL{QP6?A&1bko z%Q7Uri-%lntWZk6GGEhN)|B-4@ZE8K(ljc^4&?7rP=Pjs8ia(k2KfzhD~M^UgU1$K zb{q_kMD=Pm&}8~3NqHJQqfJE(F-h8nU8xrFD4<4NY*N7(M}()j#A;XDyEGv9Kv&GB1Qug5mf^o1dw3;p$}v1evoala-dJ z=Z2F$LKo;@>sJ`05T}$+px0G-(uT$K@H`e2|KbGEoWHoDCr(QAC;5 zt+R&U&yZX034`Xw%*@fl%Olyy#Kc}P3z|4$Zyn4j1_?Mb z4TEr0Q-h9Mv=IPsOhHLj2N}Qd)`D8bQJ`L-)&m?J;T5&pVK;q-_24!`l;fxg|5MYC zJ{r?qviskqH3_Mi7&jb?FrlM15z(}|b}d^$ClsYr0t&HkDc2tc&77g?J|Ku$;nQ1& zt2MDDyGJPcXC2n#dgtC%hg;0e*0FjAQuXh~Y#Ne@N8v|JskuJFUp2Irvl%3UR+(RD%V-Zz zTXKKN!D7V@GfXw3{9BN4x{@$3vn4aZR>TBPIZ?S!q%V`-0qATrf9y`q95_*Ocv;cJ zow`M-M>jlndC(XZV+#7lOhHIO^6C7?E3TDQnENTo7Dt7BwhS(wR$Qmvy zw9NM4%{(RQ>XmXuK&*d+u>(&kFQr{x*+wf7e~vFpZ+WQoc5&VwBDnl({;lVCtx{H- z3^<*^H3g!8e~4T4JrY1;l6zZ$^SE)jtcqR(2cgUjrHxxxe?vRYfsRBwPZ*^w1vIhqZgA1QP~(QUGa#dE-NZw3J|yQh|I5q9|; zrx$e2-(VFb{kEu@3~D~0DH!+6@GLos!zj$^H>H!yu|`Tws(mrzSPZ%D2AkyUYe$Dm}TIv94E3RvDifw-=0!^LCu&3werV*Xb#RY;fV1)nG2JQjY@K6#= zkkJv<@axwka#W-_uRHl$Fzo$lcPD z`#xKPp$!5x;~;=P#3K+Q4@k2AR77Xc!%xUgp2*3O?9G%l!-^))m8vocUR_iD)X}A5 zxw(Js`NU5!7?D<2mmMRAoH6*{8+~w%3b6U27{MXY6{EW)YZKo|XKwN-xz-*XfUrgL zSo7{w1R7v>sRrRxygiF>T1KUq`)RB4-;*J~|M@(@H+f5;zscKC_fOuo?wh=QxPJoK saR13$s^U%lt@!_1CwEzGB literal 0 HcmV?d00001 diff --git a/www/img/pokemon.gif b/www/img/pokemon.gif new file mode 100644 index 0000000000000000000000000000000000000000..235c4edb32ac7a1c8514ba508e8f052d1e4384ef GIT binary patch literal 1458653 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

5ih>mB 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%0Do{f{qlEXx0H3kN{+4w`eDq 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

Hac=tD4m5$ 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�zB08rOI;UuQpmJ)T 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

~F$t%4NfRZ&1~HD_@`G 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 z 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

-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%0AsaYVNaK56BBhUmn!;a}7@0|FhxPex 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�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≠=L>G@3cl!YUgvjS=4-y-t^Rv=&gNn619y(> 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%0AGao|Rh^mW%|;-I00XvFlWypbP_BEkt(J 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 - + + diff --git a/www/js/app.js b/www/js/app.js index bc16f58..7522114 100644 --- a/www/js/app.js +++ b/www/js/app.js @@ -7,9 +7,10 @@ // 'starter.controllers' is found in controllers.js var db; -angular.module('starter', ['ionic', 'ngCordova', 'starter.controllers', 'starter.services']) +angular.module('starter', ['ionic', 'ngCordova', 'jett.ionic.filter.bar','starter.controllers', 'starter.services']) + +.run(function($ionicPlatform, $window, $ionicHistory, $database, $ionicPopup, $state, $window, $rootScope) { -.run(function($ionicPlatform) { $ionicPlatform.ready(function() { @@ -20,7 +21,7 @@ angular.module('starter', ['ionic', 'ngCordova', 'starter.controllers', 'starter $ionicPlatform.registerBackButtonAction(function(event) { // Handle Android back button to avoid the application exits accidentaly - if ($state.current.name=="tab.dash") { + if ($state.current.name=="tab.dash") { $ionicPopup.confirm({ title: 'System-Hinweis', template: 'Möchten Sie die App beenden?' @@ -49,7 +50,7 @@ angular.module('starter', ['ionic', 'ngCordova', 'starter.controllers', 'starter // Mandatory for InAppBrowser plugin if(window.cordova){ - window.open = cordova.InAppBrowser.open; + //window.open = cordova.InAppBrowser.open; } // Copy the populated database to mobile device destination //if (window.sqlitePlugin && window.cordova) { @@ -106,26 +107,48 @@ angular.module('starter', ['ionic', 'ngCordova', 'starter.controllers', 'starter // org.apache.cordova.statusbar required StatusBar.styleDefault(); } + }); }) -.config(function($stateProvider, $urlRouterProvider) { +.config(function($stateProvider, $urlRouterProvider,$ionicConfigProvider,$ionicFilterBarConfigProvider) { // Ionic uses AngularUI Router which uses the concept of states // Learn more here: https://github.com/angular-ui/ui-router // Set up the various states which the app can be in. // Each state's controller can be found in controllers.js + if(ionic.Platform.isAndroid()){ + $ionicConfigProvider.scrolling.jsScrolling(false); + } + $stateProvider + .state('init', { + url: '/init', + templateUrl: 'templates/init.html', + controller: 'InitCtrl' + }) + + .state('firstrun', { + url: '/first', + templateUrl: 'templates/firstrun.html', + controller: 'FirstRunCtrl' + }) + + .state('imagedownload', { + url: '/imagedownload', + templateUrl: 'templates/imagedownload.html', + controller: 'ImageDownloadCtrl' + }) + // setup an abstract state for the tabs directive - .state('tab', { + .state('tab', { url: '/tab', abstract: true, templateUrl: 'templates/tabs.html' }) // Each tab has its own nav history stack: - .state('tab.dash', { url: '/dash', views: { @@ -166,7 +189,7 @@ angular.module('starter', ['ionic', 'ngCordova', 'starter.controllers', 'starter }); // if none of the above states are matched, use this as the fallback - $urlRouterProvider.otherwise('/tab/dash'); - //$ionicConfigProvider.tabs.position('bottom'); + $urlRouterProvider.otherwise('/init'); + $ionicConfigProvider.tabs.position('bottom'); }); diff --git a/www/js/controllers.js b/www/js/controllers.js index 482629e..fcdb69f 100644 --- a/www/js/controllers.js +++ b/www/js/controllers.js @@ -1,11 +1,218 @@ angular.module('starter.controllers', []) -.controller('DashCtrl', function($scope,$ionicPopup,$http, $database, $timeout,$rootScope, $cordovaFileTransfer,$cordovaFile,$ionicLoading,$state,$filter,$ionicModal) { +.controller('DashCtrl', function($scope,$ionicPopup,$http, $database, $timeout,$rootScope, $cordovaFileTransfer,$cordovaFile,$ionicLoading,$state,$filter,$ionicModal,$ionicPlatform,$location) { + + + + $scope.resetdb = function() { + $database.setInitialRun(0); + } + + // Open our new task modal + $scope.downloadImages = function() { + $state.go('imagedownload'); + }; + + + +}) + +.controller('ChatsCtrl', function($scope,$ionicPopup,$http, $database,$window, $timeout,$rootScope, $cordovaFileTransfer,$cordovaFile,$ionicLoading,$state,$filter,$ionicModal,$ionicFilterBar) { + + var filterBarInstance; + + //View wird zum ersten mal geladen + $scope.$on( "$ionicView.loaded", function( scopes, states ) { + $scope.items=[]; + }); + + + + $scope.$on( "$ionicView.enter", function( scopes, states ) { + if ($scope.items.length===0){ + $scope.show($ionicLoading); + $timeout(fill_list, 1000); + } + }); + + + +$scope.showFilterBar = function () { + filterBarInstance = $ionicFilterBar.show({ + items: $scope.items, + update: function (filteredItems, filterText) { + $scope.items = filteredItems; + if (filterText) { + console.log(filterText); + } + } + }); + }; + + $scope.refreshItems = function () { + if (filterBarInstance) { + filterBarInstance(); + filterBarInstance = null; + } + + $timeout(function () { + fill_list(); + $scope.$broadcast('scroll.refreshComplete'); + }, 1000); + }; + +function fill_list(){ + + $database.getAllPokemon().then(function (result) { + + if(result.length>0){ + for(i=0;iLade...

' + }); + }; + +$scope.hide = function(){ + $ionicLoading.hide(); +}; + }) -.controller('ChatsCtrl', function($scope, Chats) { + +.controller('InitCtrl', function($scope, $ionicPlatform, $database,$state) { + + $ionicPlatform.ready(function() { + + $database.isInitialRun().then(function (result) { + + if (result==1) { + $state.go('tab.dash'); + } + else{ + $state.go('firstrun'); + } + + }); + + }); + +}) + + +.controller('FirstRunCtrl', function($scope,$ionicSlideBoxDelegate,$database,$state) { + + +$scope.options = { + loop: false, + effect: 'fade', + speed: 500, +} + +$scope.$on("$ionicSlides.sliderInitialized", function(event, data){ + // data.slider is the instance of Swiper + $scope.slider = data.slider; +}); + +$scope.$on("$ionicSlides.slideChangeStart", function(event, data){ + console.log('Slide change is beginning'); +}); + +$scope.$on("$ionicSlides.slideChangeEnd", function(event, data){ + // note: the indexes are 0-based + $scope.activeIndex = data.activeIndex; + $scope.previousIndex = data.previousIndex; +}); + + $scope.firstruncomplete = function() { + $database.setInitialRun(1); + $state.go('tab.dash'); + }; + +}) + + +.controller('ImageDownloadCtrl', function($scope, $database, $timeout, $cordovaFileTransfer,$cordovaFile,$state,$ionicPlatform) { + + $scope.progressval = 0; + $scope.currentfile = ''; + $scope.progressprozent = 0; + + + // Open our new task modal + $scope.downloadImages = function() { + $ionicPlatform.ready(function() { + //$scope.taskModal.show(); + var baseurl = "http://assets.pokemon.com/assets/cms2/img/pokedex/full/"; + var url=""; + var filename=""; + var targetPath = ""; + var downloadprogress = 0; + var pokedexid=1; + + //Ordner erstellen auf SD-Karte + $cordovaFile.createDir(cordova.file.externalRootDirectory, "PokedexHelperBilder", false) + .then(function (success) { + // success + console.log('Erfolg bei Ordnererstellung. ' + success); + }, function (error) { + // error + console.log('Error bei Ordnererstellung. ' + error); + }); + + do { + filename=pokedexid + ".png"; + + if (filename.length==5){ + filename='00' + filename; + } + + if (filename.length==6){ + filename='0' + filename; + } + + url=baseurl; + url=encodeURI(url + filename); + targetPath = cordova.file.externalRootDirectory + "/PokedexHelperBilder/" + filename; + + //Bild Download + $cordovaFileTransfer.download(url, targetPath, {Connection: "close"}, true).then(function (result) { + $scope.currentfile=filename; + console.log(filename + ' heruntergeladen.' + result); + pokedexid=pokedexid + 1; + console.log(result); + }, function (error) { + console.log('Error. ' + error.code + ' ' + error.constant); + }, function (progress) { + downloadprogress=(progress.loaded / progress.total) * 100; + $scope.progressval = pokedexid; + $scope.currentfile=filename + downloadprogress; + }); + console.log(pokedexid); + } while (pokedexid <= 720); + + console.log(pokedexid); + }); + }; + + + +}) + +.controller('Dummy', function($scope) { }); diff --git a/www/js/services.js b/www/js/services.js index 5d1f802..4226f0b 100644 --- a/www/js/services.js +++ b/www/js/services.js @@ -29,7 +29,7 @@ angular.module('starter.services', []) initDB: function() { if(window.cordova){ //self.db = sqlitePlugin.openDatabase({name: "data.db", location: 2, createFromLocation: 1}); - self.db = $cordovaSQLite.openDB("pokedex.db"); + self.db = $cordovaSQLite.openDB({name:"pokedex.db", iosDatabaseLocation:'default'}); } else { self.db = window.openDatabase('pokedex.db','1','my',800*1024); // only available when WebSQL is available in Browser } @@ -56,21 +56,43 @@ angular.module('starter.services', []) console.error(error); }); }, - getAllBuys: function(){ + isInitialRun: function(){ + var InitilaRun; + query="SELECT InitialRun FROM InitialRun"; + return $cordovaSQLite.execute(self.db,query). + then(function(result) { + for(j=0;j` to your `index.html`: + +```html + +``` + +Then add `ngAnimate` as a dependency for your app: + +```javascript +angular.module('myApp', ['ngAnimate']); +``` + +## Documentation + +Documentation is available on the +[AngularJS docs site](http://docs.angularjs.org/api/ngAnimate). + +## License + +The MIT License + +Copyright (c) 2010-2015 Google, Inc. http://angularjs.org + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. diff --git a/www/lib/angular-animate/angular-animate.js b/www/lib/angular-animate/angular-animate.js new file mode 100644 index 0000000..c30fed7 --- /dev/null +++ b/www/lib/angular-animate/angular-animate.js @@ -0,0 +1,4115 @@ +/** + * @license AngularJS v1.5.3 + * (c) 2010-2016 Google, Inc. http://angularjs.org + * License: MIT + */ +(function(window, angular, undefined) {'use strict'; + +/* jshint ignore:start */ +var noop = angular.noop; +var copy = angular.copy; +var extend = angular.extend; +var jqLite = angular.element; +var forEach = angular.forEach; +var isArray = angular.isArray; +var isString = angular.isString; +var isObject = angular.isObject; +var isUndefined = angular.isUndefined; +var isDefined = angular.isDefined; +var isFunction = angular.isFunction; +var isElement = angular.isElement; + +var ELEMENT_NODE = 1; +var COMMENT_NODE = 8; + +var ADD_CLASS_SUFFIX = '-add'; +var REMOVE_CLASS_SUFFIX = '-remove'; +var EVENT_CLASS_PREFIX = 'ng-'; +var ACTIVE_CLASS_SUFFIX = '-active'; +var PREPARE_CLASS_SUFFIX = '-prepare'; + +var NG_ANIMATE_CLASSNAME = 'ng-animate'; +var NG_ANIMATE_CHILDREN_DATA = '$$ngAnimateChildren'; + +// Detect proper transitionend/animationend event names. +var CSS_PREFIX = '', TRANSITION_PROP, TRANSITIONEND_EVENT, ANIMATION_PROP, ANIMATIONEND_EVENT; + +// If unprefixed events are not supported but webkit-prefixed are, use the latter. +// Otherwise, just use W3C names, browsers not supporting them at all will just ignore them. +// Note: Chrome implements `window.onwebkitanimationend` and doesn't implement `window.onanimationend` +// but at the same time dispatches the `animationend` event and not `webkitAnimationEnd`. +// Register both events in case `window.onanimationend` is not supported because of that, +// do the same for `transitionend` as Safari is likely to exhibit similar behavior. +// Also, the only modern browser that uses vendor prefixes for transitions/keyframes is webkit +// therefore there is no reason to test anymore for other vendor prefixes: +// http://caniuse.com/#search=transition +if (isUndefined(window.ontransitionend) && isDefined(window.onwebkittransitionend)) { + CSS_PREFIX = '-webkit-'; + TRANSITION_PROP = 'WebkitTransition'; + TRANSITIONEND_EVENT = 'webkitTransitionEnd transitionend'; +} else { + TRANSITION_PROP = 'transition'; + TRANSITIONEND_EVENT = 'transitionend'; +} + +if (isUndefined(window.onanimationend) && isDefined(window.onwebkitanimationend)) { + CSS_PREFIX = '-webkit-'; + ANIMATION_PROP = 'WebkitAnimation'; + ANIMATIONEND_EVENT = 'webkitAnimationEnd animationend'; +} else { + ANIMATION_PROP = 'animation'; + ANIMATIONEND_EVENT = 'animationend'; +} + +var DURATION_KEY = 'Duration'; +var PROPERTY_KEY = 'Property'; +var DELAY_KEY = 'Delay'; +var TIMING_KEY = 'TimingFunction'; +var ANIMATION_ITERATION_COUNT_KEY = 'IterationCount'; +var ANIMATION_PLAYSTATE_KEY = 'PlayState'; +var SAFE_FAST_FORWARD_DURATION_VALUE = 9999; + +var ANIMATION_DELAY_PROP = ANIMATION_PROP + DELAY_KEY; +var ANIMATION_DURATION_PROP = ANIMATION_PROP + DURATION_KEY; +var TRANSITION_DELAY_PROP = TRANSITION_PROP + DELAY_KEY; +var TRANSITION_DURATION_PROP = TRANSITION_PROP + DURATION_KEY; + +var isPromiseLike = function(p) { + return p && p.then ? true : false; +}; + +var ngMinErr = angular.$$minErr('ng'); +function assertArg(arg, name, reason) { + if (!arg) { + throw ngMinErr('areq', "Argument '{0}' is {1}", (name || '?'), (reason || "required")); + } + return arg; +} + +function mergeClasses(a,b) { + if (!a && !b) return ''; + if (!a) return b; + if (!b) return a; + if (isArray(a)) a = a.join(' '); + if (isArray(b)) b = b.join(' '); + return a + ' ' + b; +} + +function packageStyles(options) { + var styles = {}; + if (options && (options.to || options.from)) { + styles.to = options.to; + styles.from = options.from; + } + return styles; +} + +function pendClasses(classes, fix, isPrefix) { + var className = ''; + classes = isArray(classes) + ? classes + : classes && isString(classes) && classes.length + ? classes.split(/\s+/) + : []; + forEach(classes, function(klass, i) { + if (klass && klass.length > 0) { + className += (i > 0) ? ' ' : ''; + className += isPrefix ? fix + klass + : klass + fix; + } + }); + return className; +} + +function removeFromArray(arr, val) { + var index = arr.indexOf(val); + if (val >= 0) { + arr.splice(index, 1); + } +} + +function stripCommentsFromElement(element) { + if (element instanceof jqLite) { + switch (element.length) { + case 0: + return []; + break; + + case 1: + // there is no point of stripping anything if the element + // is the only element within the jqLite wrapper. + // (it's important that we retain the element instance.) + if (element[0].nodeType === ELEMENT_NODE) { + return element; + } + break; + + default: + return jqLite(extractElementNode(element)); + break; + } + } + + if (element.nodeType === ELEMENT_NODE) { + return jqLite(element); + } +} + +function extractElementNode(element) { + if (!element[0]) return element; + for (var i = 0; i < element.length; i++) { + var elm = element[i]; + if (elm.nodeType == ELEMENT_NODE) { + return elm; + } + } +} + +function $$addClass($$jqLite, element, className) { + forEach(element, function(elm) { + $$jqLite.addClass(elm, className); + }); +} + +function $$removeClass($$jqLite, element, className) { + forEach(element, function(elm) { + $$jqLite.removeClass(elm, className); + }); +} + +function applyAnimationClassesFactory($$jqLite) { + return function(element, options) { + if (options.addClass) { + $$addClass($$jqLite, element, options.addClass); + options.addClass = null; + } + if (options.removeClass) { + $$removeClass($$jqLite, element, options.removeClass); + options.removeClass = null; + } + } +} + +function prepareAnimationOptions(options) { + options = options || {}; + if (!options.$$prepared) { + var domOperation = options.domOperation || noop; + options.domOperation = function() { + options.$$domOperationFired = true; + domOperation(); + domOperation = noop; + }; + options.$$prepared = true; + } + return options; +} + +function applyAnimationStyles(element, options) { + applyAnimationFromStyles(element, options); + applyAnimationToStyles(element, options); +} + +function applyAnimationFromStyles(element, options) { + if (options.from) { + element.css(options.from); + options.from = null; + } +} + +function applyAnimationToStyles(element, options) { + if (options.to) { + element.css(options.to); + options.to = null; + } +} + +function mergeAnimationDetails(element, oldAnimation, newAnimation) { + var target = oldAnimation.options || {}; + var newOptions = newAnimation.options || {}; + + var toAdd = (target.addClass || '') + ' ' + (newOptions.addClass || ''); + var toRemove = (target.removeClass || '') + ' ' + (newOptions.removeClass || ''); + var classes = resolveElementClasses(element.attr('class'), toAdd, toRemove); + + if (newOptions.preparationClasses) { + target.preparationClasses = concatWithSpace(newOptions.preparationClasses, target.preparationClasses); + delete newOptions.preparationClasses; + } + + // noop is basically when there is no callback; otherwise something has been set + var realDomOperation = target.domOperation !== noop ? target.domOperation : null; + + extend(target, newOptions); + + // TODO(matsko or sreeramu): proper fix is to maintain all animation callback in array and call at last,but now only leave has the callback so no issue with this. + if (realDomOperation) { + target.domOperation = realDomOperation; + } + + if (classes.addClass) { + target.addClass = classes.addClass; + } else { + target.addClass = null; + } + + if (classes.removeClass) { + target.removeClass = classes.removeClass; + } else { + target.removeClass = null; + } + + oldAnimation.addClass = target.addClass; + oldAnimation.removeClass = target.removeClass; + + return target; +} + +function resolveElementClasses(existing, toAdd, toRemove) { + var ADD_CLASS = 1; + var REMOVE_CLASS = -1; + + var flags = {}; + existing = splitClassesToLookup(existing); + + toAdd = splitClassesToLookup(toAdd); + forEach(toAdd, function(value, key) { + flags[key] = ADD_CLASS; + }); + + toRemove = splitClassesToLookup(toRemove); + forEach(toRemove, function(value, key) { + flags[key] = flags[key] === ADD_CLASS ? null : REMOVE_CLASS; + }); + + var classes = { + addClass: '', + removeClass: '' + }; + + forEach(flags, function(val, klass) { + var prop, allow; + if (val === ADD_CLASS) { + prop = 'addClass'; + allow = !existing[klass]; + } else if (val === REMOVE_CLASS) { + prop = 'removeClass'; + allow = existing[klass]; + } + if (allow) { + if (classes[prop].length) { + classes[prop] += ' '; + } + classes[prop] += klass; + } + }); + + function splitClassesToLookup(classes) { + if (isString(classes)) { + classes = classes.split(' '); + } + + var obj = {}; + forEach(classes, function(klass) { + // sometimes the split leaves empty string values + // incase extra spaces were applied to the options + if (klass.length) { + obj[klass] = true; + } + }); + return obj; + } + + return classes; +} + +function getDomNode(element) { + return (element instanceof angular.element) ? element[0] : element; +} + +function applyGeneratedPreparationClasses(element, event, options) { + var classes = ''; + if (event) { + classes = pendClasses(event, EVENT_CLASS_PREFIX, true); + } + if (options.addClass) { + classes = concatWithSpace(classes, pendClasses(options.addClass, ADD_CLASS_SUFFIX)); + } + if (options.removeClass) { + classes = concatWithSpace(classes, pendClasses(options.removeClass, REMOVE_CLASS_SUFFIX)); + } + if (classes.length) { + options.preparationClasses = classes; + element.addClass(classes); + } +} + +function clearGeneratedClasses(element, options) { + if (options.preparationClasses) { + element.removeClass(options.preparationClasses); + options.preparationClasses = null; + } + if (options.activeClasses) { + element.removeClass(options.activeClasses); + options.activeClasses = null; + } +} + +function blockTransitions(node, duration) { + // we use a negative delay value since it performs blocking + // yet it doesn't kill any existing transitions running on the + // same element which makes this safe for class-based animations + var value = duration ? '-' + duration + 's' : ''; + applyInlineStyle(node, [TRANSITION_DELAY_PROP, value]); + return [TRANSITION_DELAY_PROP, value]; +} + +function blockKeyframeAnimations(node, applyBlock) { + var value = applyBlock ? 'paused' : ''; + var key = ANIMATION_PROP + ANIMATION_PLAYSTATE_KEY; + applyInlineStyle(node, [key, value]); + return [key, value]; +} + +function applyInlineStyle(node, styleTuple) { + var prop = styleTuple[0]; + var value = styleTuple[1]; + node.style[prop] = value; +} + +function concatWithSpace(a,b) { + if (!a) return b; + if (!b) return a; + return a + ' ' + b; +} + +var $$rAFSchedulerFactory = ['$$rAF', function($$rAF) { + var queue, cancelFn; + + function scheduler(tasks) { + // we make a copy since RAFScheduler mutates the state + // of the passed in array variable and this would be difficult + // to track down on the outside code + queue = queue.concat(tasks); + nextTick(); + } + + queue = scheduler.queue = []; + + /* waitUntilQuiet does two things: + * 1. It will run the FINAL `fn` value only when an uncanceled RAF has passed through + * 2. It will delay the next wave of tasks from running until the quiet `fn` has run. + * + * The motivation here is that animation code can request more time from the scheduler + * before the next wave runs. This allows for certain DOM properties such as classes to + * be resolved in time for the next animation to run. + */ + scheduler.waitUntilQuiet = function(fn) { + if (cancelFn) cancelFn(); + + cancelFn = $$rAF(function() { + cancelFn = null; + fn(); + nextTick(); + }); + }; + + return scheduler; + + function nextTick() { + if (!queue.length) return; + + var items = queue.shift(); + for (var i = 0; i < items.length; i++) { + items[i](); + } + + if (!cancelFn) { + $$rAF(function() { + if (!cancelFn) nextTick(); + }); + } + } +}]; + +/** + * @ngdoc directive + * @name ngAnimateChildren + * @restrict AE + * @element ANY + * + * @description + * + * ngAnimateChildren allows you to specify that children of this element should animate even if any + * of the children's parents are currently animating. By default, when an element has an active `enter`, `leave`, or `move` + * (structural) animation, child elements that also have an active structural animation are not animated. + * + * Note that even if `ngAnimteChildren` is set, no child animations will run when the parent element is removed from the DOM (`leave` animation). + * + * + * @param {string} ngAnimateChildren If the value is empty, `true` or `on`, + * then child animations are allowed. If the value is `false`, child animations are not allowed. + * + * @example + * + +
+ + +
+
+
+ List of items: +
Item {{item}}
+
+
+
+
+ + + .container.ng-enter, + .container.ng-leave { + transition: all ease 1.5s; + } + + .container.ng-enter, + .container.ng-leave-active { + opacity: 0; + } + + .container.ng-leave, + .container.ng-enter-active { + opacity: 1; + } + + .item { + background: firebrick; + color: #FFF; + margin-bottom: 10px; + } + + .item.ng-enter, + .item.ng-leave { + transition: transform 1.5s ease; + } + + .item.ng-enter { + transform: translateX(50px); + } + + .item.ng-enter-active { + transform: translateX(0); + } + + + angular.module('ngAnimateChildren', ['ngAnimate']) + .controller('mainController', function() { + this.animateChildren = false; + this.enterElement = false; + }); + +
+ */ +var $$AnimateChildrenDirective = ['$interpolate', function($interpolate) { + return { + link: function(scope, element, attrs) { + var val = attrs.ngAnimateChildren; + if (angular.isString(val) && val.length === 0) { //empty attribute + element.data(NG_ANIMATE_CHILDREN_DATA, true); + } else { + // Interpolate and set the value, so that it is available to + // animations that run right after compilation + setData($interpolate(val)(scope)); + attrs.$observe('ngAnimateChildren', setData); + } + + function setData(value) { + value = value === 'on' || value === 'true'; + element.data(NG_ANIMATE_CHILDREN_DATA, value); + } + } + }; +}]; + +var ANIMATE_TIMER_KEY = '$$animateCss'; + +/** + * @ngdoc service + * @name $animateCss + * @kind object + * + * @description + * The `$animateCss` service is a useful utility to trigger customized CSS-based transitions/keyframes + * from a JavaScript-based animation or directly from a directive. The purpose of `$animateCss` is NOT + * to side-step how `$animate` and ngAnimate work, but the goal is to allow pre-existing animations or + * directives to create more complex animations that can be purely driven using CSS code. + * + * Note that only browsers that support CSS transitions and/or keyframe animations are capable of + * rendering animations triggered via `$animateCss` (bad news for IE9 and lower). + * + * ## Usage + * Once again, `$animateCss` is designed to be used inside of a registered JavaScript animation that + * is powered by ngAnimate. It is possible to use `$animateCss` directly inside of a directive, however, + * any automatic control over cancelling animations and/or preventing animations from being run on + * child elements will not be handled by Angular. For this to work as expected, please use `$animate` to + * trigger the animation and then setup a JavaScript animation that injects `$animateCss` to trigger + * the CSS animation. + * + * The example below shows how we can create a folding animation on an element using `ng-if`: + * + * ```html + * + *
+ * This element will go BOOM + *
+ * + * ``` + * + * Now we create the **JavaScript animation** that will trigger the CSS transition: + * + * ```js + * ngModule.animation('.fold-animation', ['$animateCss', function($animateCss) { + * return { + * enter: function(element, doneFn) { + * var height = element[0].offsetHeight; + * return $animateCss(element, { + * from: { height:'0px' }, + * to: { height:height + 'px' }, + * duration: 1 // one second + * }); + * } + * } + * }]); + * ``` + * + * ## More Advanced Uses + * + * `$animateCss` is the underlying code that ngAnimate uses to power **CSS-based animations** behind the scenes. Therefore CSS hooks + * like `.ng-EVENT`, `.ng-EVENT-active`, `.ng-EVENT-stagger` are all features that can be triggered using `$animateCss` via JavaScript code. + * + * This also means that just about any combination of adding classes, removing classes, setting styles, dynamically setting a keyframe animation, + * applying a hardcoded duration or delay value, changing the animation easing or applying a stagger animation are all options that work with + * `$animateCss`. The service itself is smart enough to figure out the combination of options and examine the element styling properties in order + * to provide a working animation that will run in CSS. + * + * The example below showcases a more advanced version of the `.fold-animation` from the example above: + * + * ```js + * ngModule.animation('.fold-animation', ['$animateCss', function($animateCss) { + * return { + * enter: function(element, doneFn) { + * var height = element[0].offsetHeight; + * return $animateCss(element, { + * addClass: 'red large-text pulse-twice', + * easing: 'ease-out', + * from: { height:'0px' }, + * to: { height:height + 'px' }, + * duration: 1 // one second + * }); + * } + * } + * }]); + * ``` + * + * Since we're adding/removing CSS classes then the CSS transition will also pick those up: + * + * ```css + * /* since a hardcoded duration value of 1 was provided in the JavaScript animation code, + * the CSS classes below will be transitioned despite them being defined as regular CSS classes */ + * .red { background:red; } + * .large-text { font-size:20px; } + * + * /* we can also use a keyframe animation and $animateCss will make it work alongside the transition */ + * .pulse-twice { + * animation: 0.5s pulse linear 2; + * -webkit-animation: 0.5s pulse linear 2; + * } + * + * @keyframes pulse { + * from { transform: scale(0.5); } + * to { transform: scale(1.5); } + * } + * + * @-webkit-keyframes pulse { + * from { -webkit-transform: scale(0.5); } + * to { -webkit-transform: scale(1.5); } + * } + * ``` + * + * Given this complex combination of CSS classes, styles and options, `$animateCss` will figure everything out and make the animation happen. + * + * ## How the Options are handled + * + * `$animateCss` is very versatile and intelligent when it comes to figuring out what configurations to apply to the element to ensure the animation + * works with the options provided. Say for example we were adding a class that contained a keyframe value and we wanted to also animate some inline + * styles using the `from` and `to` properties. + * + * ```js + * var animator = $animateCss(element, { + * from: { background:'red' }, + * to: { background:'blue' } + * }); + * animator.start(); + * ``` + * + * ```css + * .rotating-animation { + * animation:0.5s rotate linear; + * -webkit-animation:0.5s rotate linear; + * } + * + * @keyframes rotate { + * from { transform: rotate(0deg); } + * to { transform: rotate(360deg); } + * } + * + * @-webkit-keyframes rotate { + * from { -webkit-transform: rotate(0deg); } + * to { -webkit-transform: rotate(360deg); } + * } + * ``` + * + * The missing pieces here are that we do not have a transition set (within the CSS code nor within the `$animateCss` options) and the duration of the animation is + * going to be detected from what the keyframe styles on the CSS class are. In this event, `$animateCss` will automatically create an inline transition + * style matching the duration detected from the keyframe style (which is present in the CSS class that is being added) and then prepare both the transition + * and keyframe animations to run in parallel on the element. Then when the animation is underway the provided `from` and `to` CSS styles will be applied + * and spread across the transition and keyframe animation. + * + * ## What is returned + * + * `$animateCss` works in two stages: a preparation phase and an animation phase. Therefore when `$animateCss` is first called it will NOT actually + * start the animation. All that is going on here is that the element is being prepared for the animation (which means that the generated CSS classes are + * added and removed on the element). Once `$animateCss` is called it will return an object with the following properties: + * + * ```js + * var animator = $animateCss(element, { ... }); + * ``` + * + * Now what do the contents of our `animator` variable look like: + * + * ```js + * { + * // starts the animation + * start: Function, + * + * // ends (aborts) the animation + * end: Function + * } + * ``` + * + * To actually start the animation we need to run `animation.start()` which will then return a promise that we can hook into to detect when the animation ends. + * If we choose not to run the animation then we MUST run `animation.end()` to perform a cleanup on the element (since some CSS classes and styles may have been + * applied to the element during the preparation phase). Note that all other properties such as duration, delay, transitions and keyframes are just properties + * and that changing them will not reconfigure the parameters of the animation. + * + * ### runner.done() vs runner.then() + * It is documented that `animation.start()` will return a promise object and this is true, however, there is also an additional method available on the + * runner called `.done(callbackFn)`. The done method works the same as `.finally(callbackFn)`, however, it does **not trigger a digest to occur**. + * Therefore, for performance reasons, it's always best to use `runner.done(callback)` instead of `runner.then()`, `runner.catch()` or `runner.finally()` + * unless you really need a digest to kick off afterwards. + * + * Keep in mind that, to make this easier, ngAnimate has tweaked the JS animations API to recognize when a runner instance is returned from $animateCss + * (so there is no need to call `runner.done(doneFn)` inside of your JavaScript animation code). + * Check the {@link ngAnimate.$animateCss#usage animation code above} to see how this works. + * + * @param {DOMElement} element the element that will be animated + * @param {object} options the animation-related options that will be applied during the animation + * + * * `event` - The DOM event (e.g. enter, leave, move). When used, a generated CSS class of `ng-EVENT` and `ng-EVENT-active` will be applied + * to the element during the animation. Multiple events can be provided when spaces are used as a separator. (Note that this will not perform any DOM operation.) + * * `structural` - Indicates that the `ng-` prefix will be added to the event class. Setting to `false` or omitting will turn `ng-EVENT` and + * `ng-EVENT-active` in `EVENT` and `EVENT-active`. Unused if `event` is omitted. + * * `easing` - The CSS easing value that will be applied to the transition or keyframe animation (or both). + * * `transitionStyle` - The raw CSS transition style that will be used (e.g. `1s linear all`). + * * `keyframeStyle` - The raw CSS keyframe animation style that will be used (e.g. `1s my_animation linear`). + * * `from` - The starting CSS styles (a key/value object) that will be applied at the start of the animation. + * * `to` - The ending CSS styles (a key/value object) that will be applied across the animation via a CSS transition. + * * `addClass` - A space separated list of CSS classes that will be added to the element and spread across the animation. + * * `removeClass` - A space separated list of CSS classes that will be removed from the element and spread across the animation. + * * `duration` - A number value representing the total duration of the transition and/or keyframe (note that a value of 1 is 1000ms). If a value of `0` + * is provided then the animation will be skipped entirely. + * * `delay` - A number value representing the total delay of the transition and/or keyframe (note that a value of 1 is 1000ms). If a value of `true` is + * used then whatever delay value is detected from the CSS classes will be mirrored on the elements styles (e.g. by setting delay true then the style value + * of the element will be `transition-delay: DETECTED_VALUE`). Using `true` is useful when you want the CSS classes and inline styles to all share the same + * CSS delay value. + * * `stagger` - A numeric time value representing the delay between successively animated elements + * ({@link ngAnimate#css-staggering-animations Click here to learn how CSS-based staggering works in ngAnimate.}) + * * `staggerIndex` - The numeric index representing the stagger item (e.g. a value of 5 is equal to the sixth item in the stagger; therefore when a + * `stagger` option value of `0.1` is used then there will be a stagger delay of `600ms`) + * * `applyClassesEarly` - Whether or not the classes being added or removed will be used when detecting the animation. This is set by `$animate` when enter/leave/move animations are fired to ensure that the CSS classes are resolved in time. (Note that this will prevent any transitions from occurring on the classes being added and removed.) + * * `cleanupStyles` - Whether or not the provided `from` and `to` styles will be removed once + * the animation is closed. This is useful for when the styles are used purely for the sake of + * the animation and do not have a lasting visual effect on the element (e.g. a collapse and open animation). + * By default this value is set to `false`. + * + * @return {object} an object with start and end methods and details about the animation. + * + * * `start` - The method to start the animation. This will return a `Promise` when called. + * * `end` - This method will cancel the animation and remove all applied CSS classes and styles. + */ +var ONE_SECOND = 1000; +var BASE_TEN = 10; + +var ELAPSED_TIME_MAX_DECIMAL_PLACES = 3; +var CLOSING_TIME_BUFFER = 1.5; + +var DETECT_CSS_PROPERTIES = { + transitionDuration: TRANSITION_DURATION_PROP, + transitionDelay: TRANSITION_DELAY_PROP, + transitionProperty: TRANSITION_PROP + PROPERTY_KEY, + animationDuration: ANIMATION_DURATION_PROP, + animationDelay: ANIMATION_DELAY_PROP, + animationIterationCount: ANIMATION_PROP + ANIMATION_ITERATION_COUNT_KEY +}; + +var DETECT_STAGGER_CSS_PROPERTIES = { + transitionDuration: TRANSITION_DURATION_PROP, + transitionDelay: TRANSITION_DELAY_PROP, + animationDuration: ANIMATION_DURATION_PROP, + animationDelay: ANIMATION_DELAY_PROP +}; + +function getCssKeyframeDurationStyle(duration) { + return [ANIMATION_DURATION_PROP, duration + 's']; +} + +function getCssDelayStyle(delay, isKeyframeAnimation) { + var prop = isKeyframeAnimation ? ANIMATION_DELAY_PROP : TRANSITION_DELAY_PROP; + return [prop, delay + 's']; +} + +function computeCssStyles($window, element, properties) { + var styles = Object.create(null); + var detectedStyles = $window.getComputedStyle(element) || {}; + forEach(properties, function(formalStyleName, actualStyleName) { + var val = detectedStyles[formalStyleName]; + if (val) { + var c = val.charAt(0); + + // only numerical-based values have a negative sign or digit as the first value + if (c === '-' || c === '+' || c >= 0) { + val = parseMaxTime(val); + } + + // by setting this to null in the event that the delay is not set or is set directly as 0 + // then we can still allow for negative values to be used later on and not mistake this + // value for being greater than any other negative value. + if (val === 0) { + val = null; + } + styles[actualStyleName] = val; + } + }); + + return styles; +} + +function parseMaxTime(str) { + var maxValue = 0; + var values = str.split(/\s*,\s*/); + forEach(values, function(value) { + // it's always safe to consider only second values and omit `ms` values since + // getComputedStyle will always handle the conversion for us + if (value.charAt(value.length - 1) == 's') { + value = value.substring(0, value.length - 1); + } + value = parseFloat(value) || 0; + maxValue = maxValue ? Math.max(value, maxValue) : value; + }); + return maxValue; +} + +function truthyTimingValue(val) { + return val === 0 || val != null; +} + +function getCssTransitionDurationStyle(duration, applyOnlyDuration) { + var style = TRANSITION_PROP; + var value = duration + 's'; + if (applyOnlyDuration) { + style += DURATION_KEY; + } else { + value += ' linear all'; + } + return [style, value]; +} + +function createLocalCacheLookup() { + var cache = Object.create(null); + return { + flush: function() { + cache = Object.create(null); + }, + + count: function(key) { + var entry = cache[key]; + return entry ? entry.total : 0; + }, + + get: function(key) { + var entry = cache[key]; + return entry && entry.value; + }, + + put: function(key, value) { + if (!cache[key]) { + cache[key] = { total: 1, value: value }; + } else { + cache[key].total++; + } + } + }; +} + +// we do not reassign an already present style value since +// if we detect the style property value again we may be +// detecting styles that were added via the `from` styles. +// We make use of `isDefined` here since an empty string +// or null value (which is what getPropertyValue will return +// for a non-existing style) will still be marked as a valid +// value for the style (a falsy value implies that the style +// is to be removed at the end of the animation). If we had a simple +// "OR" statement then it would not be enough to catch that. +function registerRestorableStyles(backup, node, properties) { + forEach(properties, function(prop) { + backup[prop] = isDefined(backup[prop]) + ? backup[prop] + : node.style.getPropertyValue(prop); + }); +} + +var $AnimateCssProvider = ['$animateProvider', function($animateProvider) { + var gcsLookup = createLocalCacheLookup(); + var gcsStaggerLookup = createLocalCacheLookup(); + + this.$get = ['$window', '$$jqLite', '$$AnimateRunner', '$timeout', + '$$forceReflow', '$sniffer', '$$rAFScheduler', '$$animateQueue', + function($window, $$jqLite, $$AnimateRunner, $timeout, + $$forceReflow, $sniffer, $$rAFScheduler, $$animateQueue) { + + var applyAnimationClasses = applyAnimationClassesFactory($$jqLite); + + var parentCounter = 0; + function gcsHashFn(node, extraClasses) { + var KEY = "$$ngAnimateParentKey"; + var parentNode = node.parentNode; + var parentID = parentNode[KEY] || (parentNode[KEY] = ++parentCounter); + return parentID + '-' + node.getAttribute('class') + '-' + extraClasses; + } + + function computeCachedCssStyles(node, className, cacheKey, properties) { + var timings = gcsLookup.get(cacheKey); + + if (!timings) { + timings = computeCssStyles($window, node, properties); + if (timings.animationIterationCount === 'infinite') { + timings.animationIterationCount = 1; + } + } + + // we keep putting this in multiple times even though the value and the cacheKey are the same + // because we're keeping an internal tally of how many duplicate animations are detected. + gcsLookup.put(cacheKey, timings); + return timings; + } + + function computeCachedCssStaggerStyles(node, className, cacheKey, properties) { + var stagger; + + // if we have one or more existing matches of matching elements + // containing the same parent + CSS styles (which is how cacheKey works) + // then staggering is possible + if (gcsLookup.count(cacheKey) > 0) { + stagger = gcsStaggerLookup.get(cacheKey); + + if (!stagger) { + var staggerClassName = pendClasses(className, '-stagger'); + + $$jqLite.addClass(node, staggerClassName); + + stagger = computeCssStyles($window, node, properties); + + // force the conversion of a null value to zero incase not set + stagger.animationDuration = Math.max(stagger.animationDuration, 0); + stagger.transitionDuration = Math.max(stagger.transitionDuration, 0); + + $$jqLite.removeClass(node, staggerClassName); + + gcsStaggerLookup.put(cacheKey, stagger); + } + } + + return stagger || {}; + } + + var cancelLastRAFRequest; + var rafWaitQueue = []; + function waitUntilQuiet(callback) { + rafWaitQueue.push(callback); + $$rAFScheduler.waitUntilQuiet(function() { + gcsLookup.flush(); + gcsStaggerLookup.flush(); + + // DO NOT REMOVE THIS LINE OR REFACTOR OUT THE `pageWidth` variable. + // PLEASE EXAMINE THE `$$forceReflow` service to understand why. + var pageWidth = $$forceReflow(); + + // we use a for loop to ensure that if the queue is changed + // during this looping then it will consider new requests + for (var i = 0; i < rafWaitQueue.length; i++) { + rafWaitQueue[i](pageWidth); + } + rafWaitQueue.length = 0; + }); + } + + function computeTimings(node, className, cacheKey) { + var timings = computeCachedCssStyles(node, className, cacheKey, DETECT_CSS_PROPERTIES); + var aD = timings.animationDelay; + var tD = timings.transitionDelay; + timings.maxDelay = aD && tD + ? Math.max(aD, tD) + : (aD || tD); + timings.maxDuration = Math.max( + timings.animationDuration * timings.animationIterationCount, + timings.transitionDuration); + + return timings; + } + + return function init(element, initialOptions) { + // all of the animation functions should create + // a copy of the options data, however, if a + // parent service has already created a copy then + // we should stick to using that + var options = initialOptions || {}; + if (!options.$$prepared) { + options = prepareAnimationOptions(copy(options)); + } + + var restoreStyles = {}; + var node = getDomNode(element); + if (!node + || !node.parentNode + || !$$animateQueue.enabled()) { + return closeAndReturnNoopAnimator(); + } + + var temporaryStyles = []; + var classes = element.attr('class'); + var styles = packageStyles(options); + var animationClosed; + var animationPaused; + var animationCompleted; + var runner; + var runnerHost; + var maxDelay; + var maxDelayTime; + var maxDuration; + var maxDurationTime; + var startTime; + var events = []; + + if (options.duration === 0 || (!$sniffer.animations && !$sniffer.transitions)) { + return closeAndReturnNoopAnimator(); + } + + var method = options.event && isArray(options.event) + ? options.event.join(' ') + : options.event; + + var isStructural = method && options.structural; + var structuralClassName = ''; + var addRemoveClassName = ''; + + if (isStructural) { + structuralClassName = pendClasses(method, EVENT_CLASS_PREFIX, true); + } else if (method) { + structuralClassName = method; + } + + if (options.addClass) { + addRemoveClassName += pendClasses(options.addClass, ADD_CLASS_SUFFIX); + } + + if (options.removeClass) { + if (addRemoveClassName.length) { + addRemoveClassName += ' '; + } + addRemoveClassName += pendClasses(options.removeClass, REMOVE_CLASS_SUFFIX); + } + + // there may be a situation where a structural animation is combined together + // with CSS classes that need to resolve before the animation is computed. + // However this means that there is no explicit CSS code to block the animation + // from happening (by setting 0s none in the class name). If this is the case + // we need to apply the classes before the first rAF so we know to continue if + // there actually is a detected transition or keyframe animation + if (options.applyClassesEarly && addRemoveClassName.length) { + applyAnimationClasses(element, options); + } + + var preparationClasses = [structuralClassName, addRemoveClassName].join(' ').trim(); + var fullClassName = classes + ' ' + preparationClasses; + var activeClasses = pendClasses(preparationClasses, ACTIVE_CLASS_SUFFIX); + var hasToStyles = styles.to && Object.keys(styles.to).length > 0; + var containsKeyframeAnimation = (options.keyframeStyle || '').length > 0; + + // there is no way we can trigger an animation if no styles and + // no classes are being applied which would then trigger a transition, + // unless there a is raw keyframe value that is applied to the element. + if (!containsKeyframeAnimation + && !hasToStyles + && !preparationClasses) { + return closeAndReturnNoopAnimator(); + } + + var cacheKey, stagger; + if (options.stagger > 0) { + var staggerVal = parseFloat(options.stagger); + stagger = { + transitionDelay: staggerVal, + animationDelay: staggerVal, + transitionDuration: 0, + animationDuration: 0 + }; + } else { + cacheKey = gcsHashFn(node, fullClassName); + stagger = computeCachedCssStaggerStyles(node, preparationClasses, cacheKey, DETECT_STAGGER_CSS_PROPERTIES); + } + + if (!options.$$skipPreparationClasses) { + $$jqLite.addClass(element, preparationClasses); + } + + var applyOnlyDuration; + + if (options.transitionStyle) { + var transitionStyle = [TRANSITION_PROP, options.transitionStyle]; + applyInlineStyle(node, transitionStyle); + temporaryStyles.push(transitionStyle); + } + + if (options.duration >= 0) { + applyOnlyDuration = node.style[TRANSITION_PROP].length > 0; + var durationStyle = getCssTransitionDurationStyle(options.duration, applyOnlyDuration); + + // we set the duration so that it will be picked up by getComputedStyle later + applyInlineStyle(node, durationStyle); + temporaryStyles.push(durationStyle); + } + + if (options.keyframeStyle) { + var keyframeStyle = [ANIMATION_PROP, options.keyframeStyle]; + applyInlineStyle(node, keyframeStyle); + temporaryStyles.push(keyframeStyle); + } + + var itemIndex = stagger + ? options.staggerIndex >= 0 + ? options.staggerIndex + : gcsLookup.count(cacheKey) + : 0; + + var isFirst = itemIndex === 0; + + // this is a pre-emptive way of forcing the setup classes to be added and applied INSTANTLY + // without causing any combination of transitions to kick in. By adding a negative delay value + // it forces the setup class' transition to end immediately. We later then remove the negative + // transition delay to allow for the transition to naturally do it's thing. The beauty here is + // that if there is no transition defined then nothing will happen and this will also allow + // other transitions to be stacked on top of each other without any chopping them out. + if (isFirst && !options.skipBlocking) { + blockTransitions(node, SAFE_FAST_FORWARD_DURATION_VALUE); + } + + var timings = computeTimings(node, fullClassName, cacheKey); + var relativeDelay = timings.maxDelay; + maxDelay = Math.max(relativeDelay, 0); + maxDuration = timings.maxDuration; + + var flags = {}; + flags.hasTransitions = timings.transitionDuration > 0; + flags.hasAnimations = timings.animationDuration > 0; + flags.hasTransitionAll = flags.hasTransitions && timings.transitionProperty == 'all'; + flags.applyTransitionDuration = hasToStyles && ( + (flags.hasTransitions && !flags.hasTransitionAll) + || (flags.hasAnimations && !flags.hasTransitions)); + flags.applyAnimationDuration = options.duration && flags.hasAnimations; + flags.applyTransitionDelay = truthyTimingValue(options.delay) && (flags.applyTransitionDuration || flags.hasTransitions); + flags.applyAnimationDelay = truthyTimingValue(options.delay) && flags.hasAnimations; + flags.recalculateTimingStyles = addRemoveClassName.length > 0; + + if (flags.applyTransitionDuration || flags.applyAnimationDuration) { + maxDuration = options.duration ? parseFloat(options.duration) : maxDuration; + + if (flags.applyTransitionDuration) { + flags.hasTransitions = true; + timings.transitionDuration = maxDuration; + applyOnlyDuration = node.style[TRANSITION_PROP + PROPERTY_KEY].length > 0; + temporaryStyles.push(getCssTransitionDurationStyle(maxDuration, applyOnlyDuration)); + } + + if (flags.applyAnimationDuration) { + flags.hasAnimations = true; + timings.animationDuration = maxDuration; + temporaryStyles.push(getCssKeyframeDurationStyle(maxDuration)); + } + } + + if (maxDuration === 0 && !flags.recalculateTimingStyles) { + return closeAndReturnNoopAnimator(); + } + + if (options.delay != null) { + var delayStyle; + if (typeof options.delay !== "boolean") { + delayStyle = parseFloat(options.delay); + // number in options.delay means we have to recalculate the delay for the closing timeout + maxDelay = Math.max(delayStyle, 0); + } + + if (flags.applyTransitionDelay) { + temporaryStyles.push(getCssDelayStyle(delayStyle)); + } + + if (flags.applyAnimationDelay) { + temporaryStyles.push(getCssDelayStyle(delayStyle, true)); + } + } + + // we need to recalculate the delay value since we used a pre-emptive negative + // delay value and the delay value is required for the final event checking. This + // property will ensure that this will happen after the RAF phase has passed. + if (options.duration == null && timings.transitionDuration > 0) { + flags.recalculateTimingStyles = flags.recalculateTimingStyles || isFirst; + } + + maxDelayTime = maxDelay * ONE_SECOND; + maxDurationTime = maxDuration * ONE_SECOND; + if (!options.skipBlocking) { + flags.blockTransition = timings.transitionDuration > 0; + flags.blockKeyframeAnimation = timings.animationDuration > 0 && + stagger.animationDelay > 0 && + stagger.animationDuration === 0; + } + + if (options.from) { + if (options.cleanupStyles) { + registerRestorableStyles(restoreStyles, node, Object.keys(options.from)); + } + applyAnimationFromStyles(element, options); + } + + if (flags.blockTransition || flags.blockKeyframeAnimation) { + applyBlocking(maxDuration); + } else if (!options.skipBlocking) { + blockTransitions(node, false); + } + + // TODO(matsko): for 1.5 change this code to have an animator object for better debugging + return { + $$willAnimate: true, + end: endFn, + start: function() { + if (animationClosed) return; + + runnerHost = { + end: endFn, + cancel: cancelFn, + resume: null, //this will be set during the start() phase + pause: null + }; + + runner = new $$AnimateRunner(runnerHost); + + waitUntilQuiet(start); + + // we don't have access to pause/resume the animation + // since it hasn't run yet. AnimateRunner will therefore + // set noop functions for resume and pause and they will + // later be overridden once the animation is triggered + return runner; + } + }; + + function endFn() { + close(); + } + + function cancelFn() { + close(true); + } + + function close(rejected) { // jshint ignore:line + // if the promise has been called already then we shouldn't close + // the animation again + if (animationClosed || (animationCompleted && animationPaused)) return; + animationClosed = true; + animationPaused = false; + + if (!options.$$skipPreparationClasses) { + $$jqLite.removeClass(element, preparationClasses); + } + $$jqLite.removeClass(element, activeClasses); + + blockKeyframeAnimations(node, false); + blockTransitions(node, false); + + forEach(temporaryStyles, function(entry) { + // There is only one way to remove inline style properties entirely from elements. + // By using `removeProperty` this works, but we need to convert camel-cased CSS + // styles down to hyphenated values. + node.style[entry[0]] = ''; + }); + + applyAnimationClasses(element, options); + applyAnimationStyles(element, options); + + if (Object.keys(restoreStyles).length) { + forEach(restoreStyles, function(value, prop) { + value ? node.style.setProperty(prop, value) + : node.style.removeProperty(prop); + }); + } + + // the reason why we have this option is to allow a synchronous closing callback + // that is fired as SOON as the animation ends (when the CSS is removed) or if + // the animation never takes off at all. A good example is a leave animation since + // the element must be removed just after the animation is over or else the element + // will appear on screen for one animation frame causing an overbearing flicker. + if (options.onDone) { + options.onDone(); + } + + if (events && events.length) { + // Remove the transitionend / animationend listener(s) + element.off(events.join(' '), onAnimationProgress); + } + + //Cancel the fallback closing timeout and remove the timer data + var animationTimerData = element.data(ANIMATE_TIMER_KEY); + if (animationTimerData) { + $timeout.cancel(animationTimerData[0].timer); + element.removeData(ANIMATE_TIMER_KEY); + } + + // if the preparation function fails then the promise is not setup + if (runner) { + runner.complete(!rejected); + } + } + + function applyBlocking(duration) { + if (flags.blockTransition) { + blockTransitions(node, duration); + } + + if (flags.blockKeyframeAnimation) { + blockKeyframeAnimations(node, !!duration); + } + } + + function closeAndReturnNoopAnimator() { + runner = new $$AnimateRunner({ + end: endFn, + cancel: cancelFn + }); + + // should flush the cache animation + waitUntilQuiet(noop); + close(); + + return { + $$willAnimate: false, + start: function() { + return runner; + }, + end: endFn + }; + } + + function onAnimationProgress(event) { + event.stopPropagation(); + var ev = event.originalEvent || event; + + // we now always use `Date.now()` due to the recent changes with + // event.timeStamp in Firefox, Webkit and Chrome (see #13494 for more info) + var timeStamp = ev.$manualTimeStamp || Date.now(); + + /* Firefox (or possibly just Gecko) likes to not round values up + * when a ms measurement is used for the animation */ + var elapsedTime = parseFloat(ev.elapsedTime.toFixed(ELAPSED_TIME_MAX_DECIMAL_PLACES)); + + /* $manualTimeStamp is a mocked timeStamp value which is set + * within browserTrigger(). This is only here so that tests can + * mock animations properly. Real events fallback to event.timeStamp, + * or, if they don't, then a timeStamp is automatically created for them. + * We're checking to see if the timeStamp surpasses the expected delay, + * but we're using elapsedTime instead of the timeStamp on the 2nd + * pre-condition since animationPauseds sometimes close off early */ + if (Math.max(timeStamp - startTime, 0) >= maxDelayTime && elapsedTime >= maxDuration) { + // we set this flag to ensure that if the transition is paused then, when resumed, + // the animation will automatically close itself since transitions cannot be paused. + animationCompleted = true; + close(); + } + } + + function start() { + if (animationClosed) return; + if (!node.parentNode) { + close(); + return; + } + + // even though we only pause keyframe animations here the pause flag + // will still happen when transitions are used. Only the transition will + // not be paused since that is not possible. If the animation ends when + // paused then it will not complete until unpaused or cancelled. + var playPause = function(playAnimation) { + if (!animationCompleted) { + animationPaused = !playAnimation; + if (timings.animationDuration) { + var value = blockKeyframeAnimations(node, animationPaused); + animationPaused + ? temporaryStyles.push(value) + : removeFromArray(temporaryStyles, value); + } + } else if (animationPaused && playAnimation) { + animationPaused = false; + close(); + } + }; + + // checking the stagger duration prevents an accidentally cascade of the CSS delay style + // being inherited from the parent. If the transition duration is zero then we can safely + // rely that the delay value is an intentional stagger delay style. + var maxStagger = itemIndex > 0 + && ((timings.transitionDuration && stagger.transitionDuration === 0) || + (timings.animationDuration && stagger.animationDuration === 0)) + && Math.max(stagger.animationDelay, stagger.transitionDelay); + if (maxStagger) { + $timeout(triggerAnimationStart, + Math.floor(maxStagger * itemIndex * ONE_SECOND), + false); + } else { + triggerAnimationStart(); + } + + // this will decorate the existing promise runner with pause/resume methods + runnerHost.resume = function() { + playPause(true); + }; + + runnerHost.pause = function() { + playPause(false); + }; + + function triggerAnimationStart() { + // just incase a stagger animation kicks in when the animation + // itself was cancelled entirely + if (animationClosed) return; + + applyBlocking(false); + + forEach(temporaryStyles, function(entry) { + var key = entry[0]; + var value = entry[1]; + node.style[key] = value; + }); + + applyAnimationClasses(element, options); + $$jqLite.addClass(element, activeClasses); + + if (flags.recalculateTimingStyles) { + fullClassName = node.className + ' ' + preparationClasses; + cacheKey = gcsHashFn(node, fullClassName); + + timings = computeTimings(node, fullClassName, cacheKey); + relativeDelay = timings.maxDelay; + maxDelay = Math.max(relativeDelay, 0); + maxDuration = timings.maxDuration; + + if (maxDuration === 0) { + close(); + return; + } + + flags.hasTransitions = timings.transitionDuration > 0; + flags.hasAnimations = timings.animationDuration > 0; + } + + if (flags.applyAnimationDelay) { + relativeDelay = typeof options.delay !== "boolean" && truthyTimingValue(options.delay) + ? parseFloat(options.delay) + : relativeDelay; + + maxDelay = Math.max(relativeDelay, 0); + timings.animationDelay = relativeDelay; + delayStyle = getCssDelayStyle(relativeDelay, true); + temporaryStyles.push(delayStyle); + node.style[delayStyle[0]] = delayStyle[1]; + } + + maxDelayTime = maxDelay * ONE_SECOND; + maxDurationTime = maxDuration * ONE_SECOND; + + if (options.easing) { + var easeProp, easeVal = options.easing; + if (flags.hasTransitions) { + easeProp = TRANSITION_PROP + TIMING_KEY; + temporaryStyles.push([easeProp, easeVal]); + node.style[easeProp] = easeVal; + } + if (flags.hasAnimations) { + easeProp = ANIMATION_PROP + TIMING_KEY; + temporaryStyles.push([easeProp, easeVal]); + node.style[easeProp] = easeVal; + } + } + + if (timings.transitionDuration) { + events.push(TRANSITIONEND_EVENT); + } + + if (timings.animationDuration) { + events.push(ANIMATIONEND_EVENT); + } + + startTime = Date.now(); + var timerTime = maxDelayTime + CLOSING_TIME_BUFFER * maxDurationTime; + var endTime = startTime + timerTime; + + var animationsData = element.data(ANIMATE_TIMER_KEY) || []; + var setupFallbackTimer = true; + if (animationsData.length) { + var currentTimerData = animationsData[0]; + setupFallbackTimer = endTime > currentTimerData.expectedEndTime; + if (setupFallbackTimer) { + $timeout.cancel(currentTimerData.timer); + } else { + animationsData.push(close); + } + } + + if (setupFallbackTimer) { + var timer = $timeout(onAnimationExpired, timerTime, false); + animationsData[0] = { + timer: timer, + expectedEndTime: endTime + }; + animationsData.push(close); + element.data(ANIMATE_TIMER_KEY, animationsData); + } + + if (events.length) { + element.on(events.join(' '), onAnimationProgress); + } + + if (options.to) { + if (options.cleanupStyles) { + registerRestorableStyles(restoreStyles, node, Object.keys(options.to)); + } + applyAnimationToStyles(element, options); + } + } + + function onAnimationExpired() { + var animationsData = element.data(ANIMATE_TIMER_KEY); + + // this will be false in the event that the element was + // removed from the DOM (via a leave animation or something + // similar) + if (animationsData) { + for (var i = 1; i < animationsData.length; i++) { + animationsData[i](); + } + element.removeData(ANIMATE_TIMER_KEY); + } + } + } + }; + }]; +}]; + +var $$AnimateCssDriverProvider = ['$$animationProvider', function($$animationProvider) { + $$animationProvider.drivers.push('$$animateCssDriver'); + + var NG_ANIMATE_SHIM_CLASS_NAME = 'ng-animate-shim'; + var NG_ANIMATE_ANCHOR_CLASS_NAME = 'ng-anchor'; + + var NG_OUT_ANCHOR_CLASS_NAME = 'ng-anchor-out'; + var NG_IN_ANCHOR_CLASS_NAME = 'ng-anchor-in'; + + function isDocumentFragment(node) { + return node.parentNode && node.parentNode.nodeType === 11; + } + + this.$get = ['$animateCss', '$rootScope', '$$AnimateRunner', '$rootElement', '$sniffer', '$$jqLite', '$document', + function($animateCss, $rootScope, $$AnimateRunner, $rootElement, $sniffer, $$jqLite, $document) { + + // only browsers that support these properties can render animations + if (!$sniffer.animations && !$sniffer.transitions) return noop; + + var bodyNode = $document[0].body; + var rootNode = getDomNode($rootElement); + + var rootBodyElement = jqLite( + // this is to avoid using something that exists outside of the body + // we also special case the doc fragment case because our unit test code + // appends the $rootElement to the body after the app has been bootstrapped + isDocumentFragment(rootNode) || bodyNode.contains(rootNode) ? rootNode : bodyNode + ); + + var applyAnimationClasses = applyAnimationClassesFactory($$jqLite); + + return function initDriverFn(animationDetails) { + return animationDetails.from && animationDetails.to + ? prepareFromToAnchorAnimation(animationDetails.from, + animationDetails.to, + animationDetails.classes, + animationDetails.anchors) + : prepareRegularAnimation(animationDetails); + }; + + function filterCssClasses(classes) { + //remove all the `ng-` stuff + return classes.replace(/\bng-\S+\b/g, ''); + } + + function getUniqueValues(a, b) { + if (isString(a)) a = a.split(' '); + if (isString(b)) b = b.split(' '); + return a.filter(function(val) { + return b.indexOf(val) === -1; + }).join(' '); + } + + function prepareAnchoredAnimation(classes, outAnchor, inAnchor) { + var clone = jqLite(getDomNode(outAnchor).cloneNode(true)); + var startingClasses = filterCssClasses(getClassVal(clone)); + + outAnchor.addClass(NG_ANIMATE_SHIM_CLASS_NAME); + inAnchor.addClass(NG_ANIMATE_SHIM_CLASS_NAME); + + clone.addClass(NG_ANIMATE_ANCHOR_CLASS_NAME); + + rootBodyElement.append(clone); + + var animatorIn, animatorOut = prepareOutAnimation(); + + // the user may not end up using the `out` animation and + // only making use of the `in` animation or vice-versa. + // In either case we should allow this and not assume the + // animation is over unless both animations are not used. + if (!animatorOut) { + animatorIn = prepareInAnimation(); + if (!animatorIn) { + return end(); + } + } + + var startingAnimator = animatorOut || animatorIn; + + return { + start: function() { + var runner; + + var currentAnimation = startingAnimator.start(); + currentAnimation.done(function() { + currentAnimation = null; + if (!animatorIn) { + animatorIn = prepareInAnimation(); + if (animatorIn) { + currentAnimation = animatorIn.start(); + currentAnimation.done(function() { + currentAnimation = null; + end(); + runner.complete(); + }); + return currentAnimation; + } + } + // in the event that there is no `in` animation + end(); + runner.complete(); + }); + + runner = new $$AnimateRunner({ + end: endFn, + cancel: endFn + }); + + return runner; + + function endFn() { + if (currentAnimation) { + currentAnimation.end(); + } + } + } + }; + + function calculateAnchorStyles(anchor) { + var styles = {}; + + var coords = getDomNode(anchor).getBoundingClientRect(); + + // we iterate directly since safari messes up and doesn't return + // all the keys for the coords object when iterated + forEach(['width','height','top','left'], function(key) { + var value = coords[key]; + switch (key) { + case 'top': + value += bodyNode.scrollTop; + break; + case 'left': + value += bodyNode.scrollLeft; + break; + } + styles[key] = Math.floor(value) + 'px'; + }); + return styles; + } + + function prepareOutAnimation() { + var animator = $animateCss(clone, { + addClass: NG_OUT_ANCHOR_CLASS_NAME, + delay: true, + from: calculateAnchorStyles(outAnchor) + }); + + // read the comment within `prepareRegularAnimation` to understand + // why this check is necessary + return animator.$$willAnimate ? animator : null; + } + + function getClassVal(element) { + return element.attr('class') || ''; + } + + function prepareInAnimation() { + var endingClasses = filterCssClasses(getClassVal(inAnchor)); + var toAdd = getUniqueValues(endingClasses, startingClasses); + var toRemove = getUniqueValues(startingClasses, endingClasses); + + var animator = $animateCss(clone, { + to: calculateAnchorStyles(inAnchor), + addClass: NG_IN_ANCHOR_CLASS_NAME + ' ' + toAdd, + removeClass: NG_OUT_ANCHOR_CLASS_NAME + ' ' + toRemove, + delay: true + }); + + // read the comment within `prepareRegularAnimation` to understand + // why this check is necessary + return animator.$$willAnimate ? animator : null; + } + + function end() { + clone.remove(); + outAnchor.removeClass(NG_ANIMATE_SHIM_CLASS_NAME); + inAnchor.removeClass(NG_ANIMATE_SHIM_CLASS_NAME); + } + } + + function prepareFromToAnchorAnimation(from, to, classes, anchors) { + var fromAnimation = prepareRegularAnimation(from, noop); + var toAnimation = prepareRegularAnimation(to, noop); + + var anchorAnimations = []; + forEach(anchors, function(anchor) { + var outElement = anchor['out']; + var inElement = anchor['in']; + var animator = prepareAnchoredAnimation(classes, outElement, inElement); + if (animator) { + anchorAnimations.push(animator); + } + }); + + // no point in doing anything when there are no elements to animate + if (!fromAnimation && !toAnimation && anchorAnimations.length === 0) return; + + return { + start: function() { + var animationRunners = []; + + if (fromAnimation) { + animationRunners.push(fromAnimation.start()); + } + + if (toAnimation) { + animationRunners.push(toAnimation.start()); + } + + forEach(anchorAnimations, function(animation) { + animationRunners.push(animation.start()); + }); + + var runner = new $$AnimateRunner({ + end: endFn, + cancel: endFn // CSS-driven animations cannot be cancelled, only ended + }); + + $$AnimateRunner.all(animationRunners, function(status) { + runner.complete(status); + }); + + return runner; + + function endFn() { + forEach(animationRunners, function(runner) { + runner.end(); + }); + } + } + }; + } + + function prepareRegularAnimation(animationDetails) { + var element = animationDetails.element; + var options = animationDetails.options || {}; + + if (animationDetails.structural) { + options.event = animationDetails.event; + options.structural = true; + options.applyClassesEarly = true; + + // we special case the leave animation since we want to ensure that + // the element is removed as soon as the animation is over. Otherwise + // a flicker might appear or the element may not be removed at all + if (animationDetails.event === 'leave') { + options.onDone = options.domOperation; + } + } + + // We assign the preparationClasses as the actual animation event since + // the internals of $animateCss will just suffix the event token values + // with `-active` to trigger the animation. + if (options.preparationClasses) { + options.event = concatWithSpace(options.event, options.preparationClasses); + } + + var animator = $animateCss(element, options); + + // the driver lookup code inside of $$animation attempts to spawn a + // driver one by one until a driver returns a.$$willAnimate animator object. + // $animateCss will always return an object, however, it will pass in + // a flag as a hint as to whether an animation was detected or not + return animator.$$willAnimate ? animator : null; + } + }]; +}]; + +// TODO(matsko): use caching here to speed things up for detection +// TODO(matsko): add documentation +// by the time... + +var $$AnimateJsProvider = ['$animateProvider', function($animateProvider) { + this.$get = ['$injector', '$$AnimateRunner', '$$jqLite', + function($injector, $$AnimateRunner, $$jqLite) { + + var applyAnimationClasses = applyAnimationClassesFactory($$jqLite); + // $animateJs(element, 'enter'); + return function(element, event, classes, options) { + var animationClosed = false; + + // the `classes` argument is optional and if it is not used + // then the classes will be resolved from the element's className + // property as well as options.addClass/options.removeClass. + if (arguments.length === 3 && isObject(classes)) { + options = classes; + classes = null; + } + + options = prepareAnimationOptions(options); + if (!classes) { + classes = element.attr('class') || ''; + if (options.addClass) { + classes += ' ' + options.addClass; + } + if (options.removeClass) { + classes += ' ' + options.removeClass; + } + } + + var classesToAdd = options.addClass; + var classesToRemove = options.removeClass; + + // the lookupAnimations function returns a series of animation objects that are + // matched up with one or more of the CSS classes. These animation objects are + // defined via the module.animation factory function. If nothing is detected then + // we don't return anything which then makes $animation query the next driver. + var animations = lookupAnimations(classes); + var before, after; + if (animations.length) { + var afterFn, beforeFn; + if (event == 'leave') { + beforeFn = 'leave'; + afterFn = 'afterLeave'; // TODO(matsko): get rid of this + } else { + beforeFn = 'before' + event.charAt(0).toUpperCase() + event.substr(1); + afterFn = event; + } + + if (event !== 'enter' && event !== 'move') { + before = packageAnimations(element, event, options, animations, beforeFn); + } + after = packageAnimations(element, event, options, animations, afterFn); + } + + // no matching animations + if (!before && !after) return; + + function applyOptions() { + options.domOperation(); + applyAnimationClasses(element, options); + } + + function close() { + animationClosed = true; + applyOptions(); + applyAnimationStyles(element, options); + } + + var runner; + + return { + $$willAnimate: true, + end: function() { + if (runner) { + runner.end(); + } else { + close(); + runner = new $$AnimateRunner(); + runner.complete(true); + } + return runner; + }, + start: function() { + if (runner) { + return runner; + } + + runner = new $$AnimateRunner(); + var closeActiveAnimations; + var chain = []; + + if (before) { + chain.push(function(fn) { + closeActiveAnimations = before(fn); + }); + } + + if (chain.length) { + chain.push(function(fn) { + applyOptions(); + fn(true); + }); + } else { + applyOptions(); + } + + if (after) { + chain.push(function(fn) { + closeActiveAnimations = after(fn); + }); + } + + runner.setHost({ + end: function() { + endAnimations(); + }, + cancel: function() { + endAnimations(true); + } + }); + + $$AnimateRunner.chain(chain, onComplete); + return runner; + + function onComplete(success) { + close(success); + runner.complete(success); + } + + function endAnimations(cancelled) { + if (!animationClosed) { + (closeActiveAnimations || noop)(cancelled); + onComplete(cancelled); + } + } + } + }; + + function executeAnimationFn(fn, element, event, options, onDone) { + var args; + switch (event) { + case 'animate': + args = [element, options.from, options.to, onDone]; + break; + + case 'setClass': + args = [element, classesToAdd, classesToRemove, onDone]; + break; + + case 'addClass': + args = [element, classesToAdd, onDone]; + break; + + case 'removeClass': + args = [element, classesToRemove, onDone]; + break; + + default: + args = [element, onDone]; + break; + } + + args.push(options); + + var value = fn.apply(fn, args); + if (value) { + if (isFunction(value.start)) { + value = value.start(); + } + + if (value instanceof $$AnimateRunner) { + value.done(onDone); + } else if (isFunction(value)) { + // optional onEnd / onCancel callback + return value; + } + } + + return noop; + } + + function groupEventedAnimations(element, event, options, animations, fnName) { + var operations = []; + forEach(animations, function(ani) { + var animation = ani[fnName]; + if (!animation) return; + + // note that all of these animations will run in parallel + operations.push(function() { + var runner; + var endProgressCb; + + var resolved = false; + var onAnimationComplete = function(rejected) { + if (!resolved) { + resolved = true; + (endProgressCb || noop)(rejected); + runner.complete(!rejected); + } + }; + + runner = new $$AnimateRunner({ + end: function() { + onAnimationComplete(); + }, + cancel: function() { + onAnimationComplete(true); + } + }); + + endProgressCb = executeAnimationFn(animation, element, event, options, function(result) { + var cancelled = result === false; + onAnimationComplete(cancelled); + }); + + return runner; + }); + }); + + return operations; + } + + function packageAnimations(element, event, options, animations, fnName) { + var operations = groupEventedAnimations(element, event, options, animations, fnName); + if (operations.length === 0) { + var a,b; + if (fnName === 'beforeSetClass') { + a = groupEventedAnimations(element, 'removeClass', options, animations, 'beforeRemoveClass'); + b = groupEventedAnimations(element, 'addClass', options, animations, 'beforeAddClass'); + } else if (fnName === 'setClass') { + a = groupEventedAnimations(element, 'removeClass', options, animations, 'removeClass'); + b = groupEventedAnimations(element, 'addClass', options, animations, 'addClass'); + } + + if (a) { + operations = operations.concat(a); + } + if (b) { + operations = operations.concat(b); + } + } + + if (operations.length === 0) return; + + // TODO(matsko): add documentation + return function startAnimation(callback) { + var runners = []; + if (operations.length) { + forEach(operations, function(animateFn) { + runners.push(animateFn()); + }); + } + + runners.length ? $$AnimateRunner.all(runners, callback) : callback(); + + return function endFn(reject) { + forEach(runners, function(runner) { + reject ? runner.cancel() : runner.end(); + }); + }; + }; + } + }; + + function lookupAnimations(classes) { + classes = isArray(classes) ? classes : classes.split(' '); + var matches = [], flagMap = {}; + for (var i=0; i < classes.length; i++) { + var klass = classes[i], + animationFactory = $animateProvider.$$registeredAnimations[klass]; + if (animationFactory && !flagMap[klass]) { + matches.push($injector.get(animationFactory)); + flagMap[klass] = true; + } + } + return matches; + } + }]; +}]; + +var $$AnimateJsDriverProvider = ['$$animationProvider', function($$animationProvider) { + $$animationProvider.drivers.push('$$animateJsDriver'); + this.$get = ['$$animateJs', '$$AnimateRunner', function($$animateJs, $$AnimateRunner) { + return function initDriverFn(animationDetails) { + if (animationDetails.from && animationDetails.to) { + var fromAnimation = prepareAnimation(animationDetails.from); + var toAnimation = prepareAnimation(animationDetails.to); + if (!fromAnimation && !toAnimation) return; + + return { + start: function() { + var animationRunners = []; + + if (fromAnimation) { + animationRunners.push(fromAnimation.start()); + } + + if (toAnimation) { + animationRunners.push(toAnimation.start()); + } + + $$AnimateRunner.all(animationRunners, done); + + var runner = new $$AnimateRunner({ + end: endFnFactory(), + cancel: endFnFactory() + }); + + return runner; + + function endFnFactory() { + return function() { + forEach(animationRunners, function(runner) { + // at this point we cannot cancel animations for groups just yet. 1.5+ + runner.end(); + }); + }; + } + + function done(status) { + runner.complete(status); + } + } + }; + } else { + return prepareAnimation(animationDetails); + } + }; + + function prepareAnimation(animationDetails) { + // TODO(matsko): make sure to check for grouped animations and delegate down to normal animations + var element = animationDetails.element; + var event = animationDetails.event; + var options = animationDetails.options; + var classes = animationDetails.classes; + return $$animateJs(element, event, classes, options); + } + }]; +}]; + +var NG_ANIMATE_ATTR_NAME = 'data-ng-animate'; +var NG_ANIMATE_PIN_DATA = '$ngAnimatePin'; +var $$AnimateQueueProvider = ['$animateProvider', function($animateProvider) { + var PRE_DIGEST_STATE = 1; + var RUNNING_STATE = 2; + var ONE_SPACE = ' '; + + var rules = this.rules = { + skip: [], + cancel: [], + join: [] + }; + + function makeTruthyCssClassMap(classString) { + if (!classString) { + return null; + } + + var keys = classString.split(ONE_SPACE); + var map = Object.create(null); + + forEach(keys, function(key) { + map[key] = true; + }); + return map; + } + + function hasMatchingClasses(newClassString, currentClassString) { + if (newClassString && currentClassString) { + var currentClassMap = makeTruthyCssClassMap(currentClassString); + return newClassString.split(ONE_SPACE).some(function(className) { + return currentClassMap[className]; + }); + } + } + + function isAllowed(ruleType, element, currentAnimation, previousAnimation) { + return rules[ruleType].some(function(fn) { + return fn(element, currentAnimation, previousAnimation); + }); + } + + function hasAnimationClasses(animation, and) { + var a = (animation.addClass || '').length > 0; + var b = (animation.removeClass || '').length > 0; + return and ? a && b : a || b; + } + + rules.join.push(function(element, newAnimation, currentAnimation) { + // if the new animation is class-based then we can just tack that on + return !newAnimation.structural && hasAnimationClasses(newAnimation); + }); + + rules.skip.push(function(element, newAnimation, currentAnimation) { + // there is no need to animate anything if no classes are being added and + // there is no structural animation that will be triggered + return !newAnimation.structural && !hasAnimationClasses(newAnimation); + }); + + rules.skip.push(function(element, newAnimation, currentAnimation) { + // why should we trigger a new structural animation if the element will + // be removed from the DOM anyway? + return currentAnimation.event == 'leave' && newAnimation.structural; + }); + + rules.skip.push(function(element, newAnimation, currentAnimation) { + // if there is an ongoing current animation then don't even bother running the class-based animation + return currentAnimation.structural && currentAnimation.state === RUNNING_STATE && !newAnimation.structural; + }); + + rules.cancel.push(function(element, newAnimation, currentAnimation) { + // there can never be two structural animations running at the same time + return currentAnimation.structural && newAnimation.structural; + }); + + rules.cancel.push(function(element, newAnimation, currentAnimation) { + // if the previous animation is already running, but the new animation will + // be triggered, but the new animation is structural + return currentAnimation.state === RUNNING_STATE && newAnimation.structural; + }); + + rules.cancel.push(function(element, newAnimation, currentAnimation) { + // cancel the animation if classes added / removed in both animation cancel each other out, + // but only if the current animation isn't structural + + if (currentAnimation.structural) return false; + + var nA = newAnimation.addClass; + var nR = newAnimation.removeClass; + var cA = currentAnimation.addClass; + var cR = currentAnimation.removeClass; + + // early detection to save the global CPU shortage :) + if ((isUndefined(nA) && isUndefined(nR)) || (isUndefined(cA) && isUndefined(cR))) { + return false; + } + + return hasMatchingClasses(nA, cR) || hasMatchingClasses(nR, cA); + }); + + this.$get = ['$$rAF', '$rootScope', '$rootElement', '$document', '$$HashMap', + '$$animation', '$$AnimateRunner', '$templateRequest', '$$jqLite', '$$forceReflow', + function($$rAF, $rootScope, $rootElement, $document, $$HashMap, + $$animation, $$AnimateRunner, $templateRequest, $$jqLite, $$forceReflow) { + + var activeAnimationsLookup = new $$HashMap(); + var disabledElementsLookup = new $$HashMap(); + var animationsEnabled = null; + + function postDigestTaskFactory() { + var postDigestCalled = false; + return function(fn) { + // we only issue a call to postDigest before + // it has first passed. This prevents any callbacks + // from not firing once the animation has completed + // since it will be out of the digest cycle. + if (postDigestCalled) { + fn(); + } else { + $rootScope.$$postDigest(function() { + postDigestCalled = true; + fn(); + }); + } + }; + } + + // Wait until all directive and route-related templates are downloaded and + // compiled. The $templateRequest.totalPendingRequests variable keeps track of + // all of the remote templates being currently downloaded. If there are no + // templates currently downloading then the watcher will still fire anyway. + var deregisterWatch = $rootScope.$watch( + function() { return $templateRequest.totalPendingRequests === 0; }, + function(isEmpty) { + if (!isEmpty) return; + deregisterWatch(); + + // Now that all templates have been downloaded, $animate will wait until + // the post digest queue is empty before enabling animations. By having two + // calls to $postDigest calls we can ensure that the flag is enabled at the + // very end of the post digest queue. Since all of the animations in $animate + // use $postDigest, it's important that the code below executes at the end. + // This basically means that the page is fully downloaded and compiled before + // any animations are triggered. + $rootScope.$$postDigest(function() { + $rootScope.$$postDigest(function() { + // we check for null directly in the event that the application already called + // .enabled() with whatever arguments that it provided it with + if (animationsEnabled === null) { + animationsEnabled = true; + } + }); + }); + } + ); + + var callbackRegistry = {}; + + // remember that the classNameFilter is set during the provider/config + // stage therefore we can optimize here and setup a helper function + var classNameFilter = $animateProvider.classNameFilter(); + var isAnimatableClassName = !classNameFilter + ? function() { return true; } + : function(className) { + return classNameFilter.test(className); + }; + + var applyAnimationClasses = applyAnimationClassesFactory($$jqLite); + + function normalizeAnimationDetails(element, animation) { + return mergeAnimationDetails(element, animation, {}); + } + + // IE9-11 has no method "contains" in SVG element and in Node.prototype. Bug #10259. + var contains = Node.prototype.contains || function(arg) { + // jshint bitwise: false + return this === arg || !!(this.compareDocumentPosition(arg) & 16); + // jshint bitwise: true + }; + + function findCallbacks(parent, element, event) { + var targetNode = getDomNode(element); + var targetParentNode = getDomNode(parent); + + var matches = []; + var entries = callbackRegistry[event]; + if (entries) { + forEach(entries, function(entry) { + if (contains.call(entry.node, targetNode)) { + matches.push(entry.callback); + } else if (event === 'leave' && contains.call(entry.node, targetParentNode)) { + matches.push(entry.callback); + } + }); + } + + return matches; + } + + var $animate = { + on: function(event, container, callback) { + var node = extractElementNode(container); + callbackRegistry[event] = callbackRegistry[event] || []; + callbackRegistry[event].push({ + node: node, + callback: callback + }); + + // Remove the callback when the element is removed from the DOM + jqLite(container).on('$destroy', function() { + $animate.off(event, container, callback); + }); + }, + + off: function(event, container, callback) { + var entries = callbackRegistry[event]; + if (!entries) return; + + callbackRegistry[event] = arguments.length === 1 + ? null + : filterFromRegistry(entries, container, callback); + + function filterFromRegistry(list, matchContainer, matchCallback) { + var containerNode = extractElementNode(matchContainer); + return list.filter(function(entry) { + var isMatch = entry.node === containerNode && + (!matchCallback || entry.callback === matchCallback); + return !isMatch; + }); + } + }, + + pin: function(element, parentElement) { + assertArg(isElement(element), 'element', 'not an element'); + assertArg(isElement(parentElement), 'parentElement', 'not an element'); + element.data(NG_ANIMATE_PIN_DATA, parentElement); + }, + + push: function(element, event, options, domOperation) { + options = options || {}; + options.domOperation = domOperation; + return queueAnimation(element, event, options); + }, + + // this method has four signatures: + // () - global getter + // (bool) - global setter + // (element) - element getter + // (element, bool) - element setter + enabled: function(element, bool) { + var argCount = arguments.length; + + if (argCount === 0) { + // () - Global getter + bool = !!animationsEnabled; + } else { + var hasElement = isElement(element); + + if (!hasElement) { + // (bool) - Global setter + bool = animationsEnabled = !!element; + } else { + var node = getDomNode(element); + var recordExists = disabledElementsLookup.get(node); + + if (argCount === 1) { + // (element) - Element getter + bool = !recordExists; + } else { + // (element, bool) - Element setter + disabledElementsLookup.put(node, !bool); + } + } + } + + return bool; + } + }; + + return $animate; + + function queueAnimation(element, event, initialOptions) { + // we always make a copy of the options since + // there should never be any side effects on + // the input data when running `$animateCss`. + var options = copy(initialOptions); + + var node, parent; + element = stripCommentsFromElement(element); + if (element) { + node = getDomNode(element); + parent = element.parent(); + } + + options = prepareAnimationOptions(options); + + // we create a fake runner with a working promise. + // These methods will become available after the digest has passed + var runner = new $$AnimateRunner(); + + // this is used to trigger callbacks in postDigest mode + var runInNextPostDigestOrNow = postDigestTaskFactory(); + + if (isArray(options.addClass)) { + options.addClass = options.addClass.join(' '); + } + + if (options.addClass && !isString(options.addClass)) { + options.addClass = null; + } + + if (isArray(options.removeClass)) { + options.removeClass = options.removeClass.join(' '); + } + + if (options.removeClass && !isString(options.removeClass)) { + options.removeClass = null; + } + + if (options.from && !isObject(options.from)) { + options.from = null; + } + + if (options.to && !isObject(options.to)) { + options.to = null; + } + + // there are situations where a directive issues an animation for + // a jqLite wrapper that contains only comment nodes... If this + // happens then there is no way we can perform an animation + if (!node) { + close(); + return runner; + } + + var className = [node.className, options.addClass, options.removeClass].join(' '); + if (!isAnimatableClassName(className)) { + close(); + return runner; + } + + var isStructural = ['enter', 'move', 'leave'].indexOf(event) >= 0; + + // this is a hard disable of all animations for the application or on + // the element itself, therefore there is no need to continue further + // past this point if not enabled + // Animations are also disabled if the document is currently hidden (page is not visible + // to the user), because browsers slow down or do not flush calls to requestAnimationFrame + var skipAnimations = !animationsEnabled || $document[0].hidden || disabledElementsLookup.get(node); + var existingAnimation = (!skipAnimations && activeAnimationsLookup.get(node)) || {}; + var hasExistingAnimation = !!existingAnimation.state; + + // there is no point in traversing the same collection of parent ancestors if a followup + // animation will be run on the same element that already did all that checking work + if (!skipAnimations && (!hasExistingAnimation || existingAnimation.state != PRE_DIGEST_STATE)) { + skipAnimations = !areAnimationsAllowed(element, parent, event); + } + + if (skipAnimations) { + close(); + return runner; + } + + if (isStructural) { + closeChildAnimations(element); + } + + var newAnimation = { + structural: isStructural, + element: element, + event: event, + addClass: options.addClass, + removeClass: options.removeClass, + close: close, + options: options, + runner: runner + }; + + if (hasExistingAnimation) { + var skipAnimationFlag = isAllowed('skip', element, newAnimation, existingAnimation); + if (skipAnimationFlag) { + if (existingAnimation.state === RUNNING_STATE) { + close(); + return runner; + } else { + mergeAnimationDetails(element, existingAnimation, newAnimation); + return existingAnimation.runner; + } + } + var cancelAnimationFlag = isAllowed('cancel', element, newAnimation, existingAnimation); + if (cancelAnimationFlag) { + if (existingAnimation.state === RUNNING_STATE) { + // this will end the animation right away and it is safe + // to do so since the animation is already running and the + // runner callback code will run in async + existingAnimation.runner.end(); + } else if (existingAnimation.structural) { + // this means that the animation is queued into a digest, but + // hasn't started yet. Therefore it is safe to run the close + // method which will call the runner methods in async. + existingAnimation.close(); + } else { + // this will merge the new animation options into existing animation options + mergeAnimationDetails(element, existingAnimation, newAnimation); + + return existingAnimation.runner; + } + } else { + // a joined animation means that this animation will take over the existing one + // so an example would involve a leave animation taking over an enter. Then when + // the postDigest kicks in the enter will be ignored. + var joinAnimationFlag = isAllowed('join', element, newAnimation, existingAnimation); + if (joinAnimationFlag) { + if (existingAnimation.state === RUNNING_STATE) { + normalizeAnimationDetails(element, newAnimation); + } else { + applyGeneratedPreparationClasses(element, isStructural ? event : null, options); + + event = newAnimation.event = existingAnimation.event; + options = mergeAnimationDetails(element, existingAnimation, newAnimation); + + //we return the same runner since only the option values of this animation will + //be fed into the `existingAnimation`. + return existingAnimation.runner; + } + } + } + } else { + // normalization in this case means that it removes redundant CSS classes that + // already exist (addClass) or do not exist (removeClass) on the element + normalizeAnimationDetails(element, newAnimation); + } + + // when the options are merged and cleaned up we may end up not having to do + // an animation at all, therefore we should check this before issuing a post + // digest callback. Structural animations will always run no matter what. + var isValidAnimation = newAnimation.structural; + if (!isValidAnimation) { + // animate (from/to) can be quickly checked first, otherwise we check if any classes are present + isValidAnimation = (newAnimation.event === 'animate' && Object.keys(newAnimation.options.to || {}).length > 0) + || hasAnimationClasses(newAnimation); + } + + if (!isValidAnimation) { + close(); + clearElementAnimationState(element); + return runner; + } + + // the counter keeps track of cancelled animations + var counter = (existingAnimation.counter || 0) + 1; + newAnimation.counter = counter; + + markElementAnimationState(element, PRE_DIGEST_STATE, newAnimation); + + $rootScope.$$postDigest(function() { + var animationDetails = activeAnimationsLookup.get(node); + var animationCancelled = !animationDetails; + animationDetails = animationDetails || {}; + + // if addClass/removeClass is called before something like enter then the + // registered parent element may not be present. The code below will ensure + // that a final value for parent element is obtained + var parentElement = element.parent() || []; + + // animate/structural/class-based animations all have requirements. Otherwise there + // is no point in performing an animation. The parent node must also be set. + var isValidAnimation = parentElement.length > 0 + && (animationDetails.event === 'animate' + || animationDetails.structural + || hasAnimationClasses(animationDetails)); + + // this means that the previous animation was cancelled + // even if the follow-up animation is the same event + if (animationCancelled || animationDetails.counter !== counter || !isValidAnimation) { + // if another animation did not take over then we need + // to make sure that the domOperation and options are + // handled accordingly + if (animationCancelled) { + applyAnimationClasses(element, options); + applyAnimationStyles(element, options); + } + + // if the event changed from something like enter to leave then we do + // it, otherwise if it's the same then the end result will be the same too + if (animationCancelled || (isStructural && animationDetails.event !== event)) { + options.domOperation(); + runner.end(); + } + + // in the event that the element animation was not cancelled or a follow-up animation + // isn't allowed to animate from here then we need to clear the state of the element + // so that any future animations won't read the expired animation data. + if (!isValidAnimation) { + clearElementAnimationState(element); + } + + return; + } + + // this combined multiple class to addClass / removeClass into a setClass event + // so long as a structural event did not take over the animation + event = !animationDetails.structural && hasAnimationClasses(animationDetails, true) + ? 'setClass' + : animationDetails.event; + + markElementAnimationState(element, RUNNING_STATE); + var realRunner = $$animation(element, event, animationDetails.options); + + realRunner.done(function(status) { + close(!status); + var animationDetails = activeAnimationsLookup.get(node); + if (animationDetails && animationDetails.counter === counter) { + clearElementAnimationState(getDomNode(element)); + } + notifyProgress(runner, event, 'close', {}); + }); + + // this will update the runner's flow-control events based on + // the `realRunner` object. + runner.setHost(realRunner); + notifyProgress(runner, event, 'start', {}); + }); + + return runner; + + function notifyProgress(runner, event, phase, data) { + runInNextPostDigestOrNow(function() { + var callbacks = findCallbacks(parent, element, event); + if (callbacks.length) { + // do not optimize this call here to RAF because + // we don't know how heavy the callback code here will + // be and if this code is buffered then this can + // lead to a performance regression. + $$rAF(function() { + forEach(callbacks, function(callback) { + callback(element, phase, data); + }); + }); + } + }); + runner.progress(event, phase, data); + } + + function close(reject) { // jshint ignore:line + clearGeneratedClasses(element, options); + applyAnimationClasses(element, options); + applyAnimationStyles(element, options); + options.domOperation(); + runner.complete(!reject); + } + } + + function closeChildAnimations(element) { + var node = getDomNode(element); + var children = node.querySelectorAll('[' + NG_ANIMATE_ATTR_NAME + ']'); + forEach(children, function(child) { + var state = parseInt(child.getAttribute(NG_ANIMATE_ATTR_NAME)); + var animationDetails = activeAnimationsLookup.get(child); + if (animationDetails) { + switch (state) { + case RUNNING_STATE: + animationDetails.runner.end(); + /* falls through */ + case PRE_DIGEST_STATE: + activeAnimationsLookup.remove(child); + break; + } + } + }); + } + + function clearElementAnimationState(element) { + var node = getDomNode(element); + node.removeAttribute(NG_ANIMATE_ATTR_NAME); + activeAnimationsLookup.remove(node); + } + + function isMatchingElement(nodeOrElmA, nodeOrElmB) { + return getDomNode(nodeOrElmA) === getDomNode(nodeOrElmB); + } + + /** + * This fn returns false if any of the following is true: + * a) animations on any parent element are disabled, and animations on the element aren't explicitly allowed + * b) a parent element has an ongoing structural animation, and animateChildren is false + * c) the element is not a child of the body + * d) the element is not a child of the $rootElement + */ + function areAnimationsAllowed(element, parentElement, event) { + var bodyElement = jqLite($document[0].body); + var bodyElementDetected = isMatchingElement(element, bodyElement) || element[0].nodeName === 'HTML'; + var rootElementDetected = isMatchingElement(element, $rootElement); + var parentAnimationDetected = false; + var animateChildren; + var elementDisabled = disabledElementsLookup.get(getDomNode(element)); + + var parentHost = jqLite.data(element[0], NG_ANIMATE_PIN_DATA); + if (parentHost) { + parentElement = parentHost; + } + + parentElement = getDomNode(parentElement); + + while (parentElement) { + if (!rootElementDetected) { + // angular doesn't want to attempt to animate elements outside of the application + // therefore we need to ensure that the rootElement is an ancestor of the current element + rootElementDetected = isMatchingElement(parentElement, $rootElement); + } + + if (parentElement.nodeType !== ELEMENT_NODE) { + // no point in inspecting the #document element + break; + } + + var details = activeAnimationsLookup.get(parentElement) || {}; + // either an enter, leave or move animation will commence + // therefore we can't allow any animations to take place + // but if a parent animation is class-based then that's ok + if (!parentAnimationDetected) { + var parentElementDisabled = disabledElementsLookup.get(parentElement); + + if (parentElementDisabled === true && elementDisabled !== false) { + // disable animations if the user hasn't explicitly enabled animations on the + // current element + elementDisabled = true; + // element is disabled via parent element, no need to check anything else + break; + } else if (parentElementDisabled === false) { + elementDisabled = false; + } + parentAnimationDetected = details.structural; + } + + if (isUndefined(animateChildren) || animateChildren === true) { + var value = jqLite.data(parentElement, NG_ANIMATE_CHILDREN_DATA); + if (isDefined(value)) { + animateChildren = value; + } + } + + // there is no need to continue traversing at this point + if (parentAnimationDetected && animateChildren === false) break; + + if (!bodyElementDetected) { + // we also need to ensure that the element is or will be a part of the body element + // otherwise it is pointless to even issue an animation to be rendered + bodyElementDetected = isMatchingElement(parentElement, bodyElement); + } + + if (bodyElementDetected && rootElementDetected) { + // If both body and root have been found, any other checks are pointless, + // as no animation data should live outside the application + break; + } + + if (!rootElementDetected) { + // If no rootElement is detected, check if the parentElement is pinned to another element + parentHost = jqLite.data(parentElement, NG_ANIMATE_PIN_DATA); + if (parentHost) { + // The pin target element becomes the next parent element + parentElement = getDomNode(parentHost); + continue; + } + } + + parentElement = parentElement.parentNode; + } + + var allowAnimation = (!parentAnimationDetected || animateChildren) && elementDisabled !== true; + return allowAnimation && rootElementDetected && bodyElementDetected; + } + + function markElementAnimationState(element, state, details) { + details = details || {}; + details.state = state; + + var node = getDomNode(element); + node.setAttribute(NG_ANIMATE_ATTR_NAME, state); + + var oldValue = activeAnimationsLookup.get(node); + var newValue = oldValue + ? extend(oldValue, details) + : details; + activeAnimationsLookup.put(node, newValue); + } + }]; +}]; + +var $$AnimationProvider = ['$animateProvider', function($animateProvider) { + var NG_ANIMATE_REF_ATTR = 'ng-animate-ref'; + + var drivers = this.drivers = []; + + var RUNNER_STORAGE_KEY = '$$animationRunner'; + + function setRunner(element, runner) { + element.data(RUNNER_STORAGE_KEY, runner); + } + + function removeRunner(element) { + element.removeData(RUNNER_STORAGE_KEY); + } + + function getRunner(element) { + return element.data(RUNNER_STORAGE_KEY); + } + + this.$get = ['$$jqLite', '$rootScope', '$injector', '$$AnimateRunner', '$$HashMap', '$$rAFScheduler', + function($$jqLite, $rootScope, $injector, $$AnimateRunner, $$HashMap, $$rAFScheduler) { + + var animationQueue = []; + var applyAnimationClasses = applyAnimationClassesFactory($$jqLite); + + function sortAnimations(animations) { + var tree = { children: [] }; + var i, lookup = new $$HashMap(); + + // this is done first beforehand so that the hashmap + // is filled with a list of the elements that will be animated + for (i = 0; i < animations.length; i++) { + var animation = animations[i]; + lookup.put(animation.domNode, animations[i] = { + domNode: animation.domNode, + fn: animation.fn, + children: [] + }); + } + + for (i = 0; i < animations.length; i++) { + processNode(animations[i]); + } + + return flatten(tree); + + function processNode(entry) { + if (entry.processed) return entry; + entry.processed = true; + + var elementNode = entry.domNode; + var parentNode = elementNode.parentNode; + lookup.put(elementNode, entry); + + var parentEntry; + while (parentNode) { + parentEntry = lookup.get(parentNode); + if (parentEntry) { + if (!parentEntry.processed) { + parentEntry = processNode(parentEntry); + } + break; + } + parentNode = parentNode.parentNode; + } + + (parentEntry || tree).children.push(entry); + return entry; + } + + function flatten(tree) { + var result = []; + var queue = []; + var i; + + for (i = 0; i < tree.children.length; i++) { + queue.push(tree.children[i]); + } + + var remainingLevelEntries = queue.length; + var nextLevelEntries = 0; + var row = []; + + for (i = 0; i < queue.length; i++) { + var entry = queue[i]; + if (remainingLevelEntries <= 0) { + remainingLevelEntries = nextLevelEntries; + nextLevelEntries = 0; + result.push(row); + row = []; + } + row.push(entry.fn); + entry.children.forEach(function(childEntry) { + nextLevelEntries++; + queue.push(childEntry); + }); + remainingLevelEntries--; + } + + if (row.length) { + result.push(row); + } + + return result; + } + } + + // TODO(matsko): document the signature in a better way + return function(element, event, options) { + options = prepareAnimationOptions(options); + var isStructural = ['enter', 'move', 'leave'].indexOf(event) >= 0; + + // there is no animation at the current moment, however + // these runner methods will get later updated with the + // methods leading into the driver's end/cancel methods + // for now they just stop the animation from starting + var runner = new $$AnimateRunner({ + end: function() { close(); }, + cancel: function() { close(true); } + }); + + if (!drivers.length) { + close(); + return runner; + } + + setRunner(element, runner); + + var classes = mergeClasses(element.attr('class'), mergeClasses(options.addClass, options.removeClass)); + var tempClasses = options.tempClasses; + if (tempClasses) { + classes += ' ' + tempClasses; + options.tempClasses = null; + } + + var prepareClassName; + if (isStructural) { + prepareClassName = 'ng-' + event + PREPARE_CLASS_SUFFIX; + $$jqLite.addClass(element, prepareClassName); + } + + animationQueue.push({ + // this data is used by the postDigest code and passed into + // the driver step function + element: element, + classes: classes, + event: event, + structural: isStructural, + options: options, + beforeStart: beforeStart, + close: close + }); + + element.on('$destroy', handleDestroyedElement); + + // we only want there to be one function called within the post digest + // block. This way we can group animations for all the animations that + // were apart of the same postDigest flush call. + if (animationQueue.length > 1) return runner; + + $rootScope.$$postDigest(function() { + var animations = []; + forEach(animationQueue, function(entry) { + // the element was destroyed early on which removed the runner + // form its storage. This means we can't animate this element + // at all and it already has been closed due to destruction. + if (getRunner(entry.element)) { + animations.push(entry); + } else { + entry.close(); + } + }); + + // now any future animations will be in another postDigest + animationQueue.length = 0; + + var groupedAnimations = groupAnimations(animations); + var toBeSortedAnimations = []; + + forEach(groupedAnimations, function(animationEntry) { + toBeSortedAnimations.push({ + domNode: getDomNode(animationEntry.from ? animationEntry.from.element : animationEntry.element), + fn: function triggerAnimationStart() { + // it's important that we apply the `ng-animate` CSS class and the + // temporary classes before we do any driver invoking since these + // CSS classes may be required for proper CSS detection. + animationEntry.beforeStart(); + + var startAnimationFn, closeFn = animationEntry.close; + + // in the event that the element was removed before the digest runs or + // during the RAF sequencing then we should not trigger the animation. + var targetElement = animationEntry.anchors + ? (animationEntry.from.element || animationEntry.to.element) + : animationEntry.element; + + if (getRunner(targetElement)) { + var operation = invokeFirstDriver(animationEntry); + if (operation) { + startAnimationFn = operation.start; + } + } + + if (!startAnimationFn) { + closeFn(); + } else { + var animationRunner = startAnimationFn(); + animationRunner.done(function(status) { + closeFn(!status); + }); + updateAnimationRunners(animationEntry, animationRunner); + } + } + }); + }); + + // we need to sort each of the animations in order of parent to child + // relationships. This ensures that the child classes are applied at the + // right time. + $$rAFScheduler(sortAnimations(toBeSortedAnimations)); + }); + + return runner; + + // TODO(matsko): change to reference nodes + function getAnchorNodes(node) { + var SELECTOR = '[' + NG_ANIMATE_REF_ATTR + ']'; + var items = node.hasAttribute(NG_ANIMATE_REF_ATTR) + ? [node] + : node.querySelectorAll(SELECTOR); + var anchors = []; + forEach(items, function(node) { + var attr = node.getAttribute(NG_ANIMATE_REF_ATTR); + if (attr && attr.length) { + anchors.push(node); + } + }); + return anchors; + } + + function groupAnimations(animations) { + var preparedAnimations = []; + var refLookup = {}; + forEach(animations, function(animation, index) { + var element = animation.element; + var node = getDomNode(element); + var event = animation.event; + var enterOrMove = ['enter', 'move'].indexOf(event) >= 0; + var anchorNodes = animation.structural ? getAnchorNodes(node) : []; + + if (anchorNodes.length) { + var direction = enterOrMove ? 'to' : 'from'; + + forEach(anchorNodes, function(anchor) { + var key = anchor.getAttribute(NG_ANIMATE_REF_ATTR); + refLookup[key] = refLookup[key] || {}; + refLookup[key][direction] = { + animationID: index, + element: jqLite(anchor) + }; + }); + } else { + preparedAnimations.push(animation); + } + }); + + var usedIndicesLookup = {}; + var anchorGroups = {}; + forEach(refLookup, function(operations, key) { + var from = operations.from; + var to = operations.to; + + if (!from || !to) { + // only one of these is set therefore we can't have an + // anchor animation since all three pieces are required + var index = from ? from.animationID : to.animationID; + var indexKey = index.toString(); + if (!usedIndicesLookup[indexKey]) { + usedIndicesLookup[indexKey] = true; + preparedAnimations.push(animations[index]); + } + return; + } + + var fromAnimation = animations[from.animationID]; + var toAnimation = animations[to.animationID]; + var lookupKey = from.animationID.toString(); + if (!anchorGroups[lookupKey]) { + var group = anchorGroups[lookupKey] = { + structural: true, + beforeStart: function() { + fromAnimation.beforeStart(); + toAnimation.beforeStart(); + }, + close: function() { + fromAnimation.close(); + toAnimation.close(); + }, + classes: cssClassesIntersection(fromAnimation.classes, toAnimation.classes), + from: fromAnimation, + to: toAnimation, + anchors: [] // TODO(matsko): change to reference nodes + }; + + // the anchor animations require that the from and to elements both have at least + // one shared CSS class which effectively marries the two elements together to use + // the same animation driver and to properly sequence the anchor animation. + if (group.classes.length) { + preparedAnimations.push(group); + } else { + preparedAnimations.push(fromAnimation); + preparedAnimations.push(toAnimation); + } + } + + anchorGroups[lookupKey].anchors.push({ + 'out': from.element, 'in': to.element + }); + }); + + return preparedAnimations; + } + + function cssClassesIntersection(a,b) { + a = a.split(' '); + b = b.split(' '); + var matches = []; + + for (var i = 0; i < a.length; i++) { + var aa = a[i]; + if (aa.substring(0,3) === 'ng-') continue; + + for (var j = 0; j < b.length; j++) { + if (aa === b[j]) { + matches.push(aa); + break; + } + } + } + + return matches.join(' '); + } + + function invokeFirstDriver(animationDetails) { + // we loop in reverse order since the more general drivers (like CSS and JS) + // may attempt more elements, but custom drivers are more particular + for (var i = drivers.length - 1; i >= 0; i--) { + var driverName = drivers[i]; + if (!$injector.has(driverName)) continue; // TODO(matsko): remove this check + + var factory = $injector.get(driverName); + var driver = factory(animationDetails); + if (driver) { + return driver; + } + } + } + + function beforeStart() { + element.addClass(NG_ANIMATE_CLASSNAME); + if (tempClasses) { + $$jqLite.addClass(element, tempClasses); + } + if (prepareClassName) { + $$jqLite.removeClass(element, prepareClassName); + prepareClassName = null; + } + } + + function updateAnimationRunners(animation, newRunner) { + if (animation.from && animation.to) { + update(animation.from.element); + update(animation.to.element); + } else { + update(animation.element); + } + + function update(element) { + getRunner(element).setHost(newRunner); + } + } + + function handleDestroyedElement() { + var runner = getRunner(element); + if (runner && (event !== 'leave' || !options.$$domOperationFired)) { + runner.end(); + } + } + + function close(rejected) { // jshint ignore:line + element.off('$destroy', handleDestroyedElement); + removeRunner(element); + + applyAnimationClasses(element, options); + applyAnimationStyles(element, options); + options.domOperation(); + + if (tempClasses) { + $$jqLite.removeClass(element, tempClasses); + } + + element.removeClass(NG_ANIMATE_CLASSNAME); + runner.complete(!rejected); + } + }; + }]; +}]; + +/** + * @ngdoc directive + * @name ngAnimateSwap + * @restrict A + * @scope + * + * @description + * + * ngAnimateSwap is a animation-oriented directive that allows for the container to + * be removed and entered in whenever the associated expression changes. A + * common usecase for this directive is a rotating banner or slider component which + * contains one image being present at a time. When the active image changes + * then the old image will perform a `leave` animation and the new element + * will be inserted via an `enter` animation. + * + * @animations + * | Animation | Occurs | + * |----------------------------------|--------------------------------------| + * | {@link ng.$animate#enter enter} | when the new element is inserted to the DOM | + * | {@link ng.$animate#leave leave} | when the old element is removed from the DOM | + * + * @example + * + * + *
+ *
+ * {{ number }} + *
+ *
+ *
+ * + * angular.module('ngAnimateSwapExample', ['ngAnimate']) + * .controller('AppCtrl', ['$scope', '$interval', function($scope, $interval) { + * $scope.number = 0; + * $interval(function() { + * $scope.number++; + * }, 1000); + * + * var colors = ['red','blue','green','yellow','orange']; + * $scope.colorClass = function(number) { + * return colors[number % colors.length]; + * }; + * }]); + * + * + * .container { + * height:250px; + * width:250px; + * position:relative; + * overflow:hidden; + * border:2px solid black; + * } + * .container .cell { + * font-size:150px; + * text-align:center; + * line-height:250px; + * position:absolute; + * top:0; + * left:0; + * right:0; + * border-bottom:2px solid black; + * } + * .swap-animation.ng-enter, .swap-animation.ng-leave { + * transition:0.5s linear all; + * } + * .swap-animation.ng-enter { + * top:-250px; + * } + * .swap-animation.ng-enter-active { + * top:0px; + * } + * .swap-animation.ng-leave { + * top:0px; + * } + * .swap-animation.ng-leave-active { + * top:250px; + * } + * .red { background:red; } + * .green { background:green; } + * .blue { background:blue; } + * .yellow { background:yellow; } + * .orange { background:orange; } + * + *
+ */ +var ngAnimateSwapDirective = ['$animate', '$rootScope', function($animate, $rootScope) { + return { + restrict: 'A', + transclude: 'element', + terminal: true, + priority: 600, // we use 600 here to ensure that the directive is caught before others + link: function(scope, $element, attrs, ctrl, $transclude) { + var previousElement, previousScope; + scope.$watchCollection(attrs.ngAnimateSwap || attrs['for'], function(value) { + if (previousElement) { + $animate.leave(previousElement); + } + if (previousScope) { + previousScope.$destroy(); + previousScope = null; + } + if (value || value === 0) { + previousScope = scope.$new(); + $transclude(previousScope, function(element) { + previousElement = element; + $animate.enter(element, null, $element); + }); + } + }); + } + }; +}]; + +/* global angularAnimateModule: true, + + ngAnimateSwapDirective, + $$AnimateAsyncRunFactory, + $$rAFSchedulerFactory, + $$AnimateChildrenDirective, + $$AnimateQueueProvider, + $$AnimationProvider, + $AnimateCssProvider, + $$AnimateCssDriverProvider, + $$AnimateJsProvider, + $$AnimateJsDriverProvider, +*/ + +/** + * @ngdoc module + * @name ngAnimate + * @description + * + * The `ngAnimate` module provides support for CSS-based animations (keyframes and transitions) as well as JavaScript-based animations via + * callback hooks. Animations are not enabled by default, however, by including `ngAnimate` the animation hooks are enabled for an Angular app. + * + *
+ * + * # Usage + * Simply put, there are two ways to make use of animations when ngAnimate is used: by using **CSS** and **JavaScript**. The former works purely based + * using CSS (by using matching CSS selectors/styles) and the latter triggers animations that are registered via `module.animation()`. For + * both CSS and JS animations the sole requirement is to have a matching `CSS class` that exists both in the registered animation and within + * the HTML element that the animation will be triggered on. + * + * ## Directive Support + * The following directives are "animation aware": + * + * | Directive | Supported Animations | + * |----------------------------------------------------------------------------------------------------------|--------------------------------------------------------------------------| + * | {@link ng.directive:ngRepeat#animations ngRepeat} | enter, leave and move | + * | {@link ngRoute.directive:ngView#animations ngView} | enter and leave | + * | {@link ng.directive:ngInclude#animations ngInclude} | enter and leave | + * | {@link ng.directive:ngSwitch#animations ngSwitch} | enter and leave | + * | {@link ng.directive:ngIf#animations ngIf} | enter and leave | + * | {@link ng.directive:ngClass#animations ngClass} | add and remove (the CSS class(es) present) | + * | {@link ng.directive:ngShow#animations ngShow} & {@link ng.directive:ngHide#animations ngHide} | add and remove (the ng-hide class value) | + * | {@link ng.directive:form#animation-hooks form} & {@link ng.directive:ngModel#animation-hooks ngModel} | add and remove (dirty, pristine, valid, invalid & all other validations) | + * | {@link module:ngMessages#animations ngMessages} | add and remove (ng-active & ng-inactive) | + * | {@link module:ngMessages#animations ngMessage} | enter and leave | + * + * (More information can be found by visiting each the documentation associated with each directive.) + * + * ## CSS-based Animations + * + * CSS-based animations with ngAnimate are unique since they require no JavaScript code at all. By using a CSS class that we reference between our HTML + * and CSS code we can create an animation that will be picked up by Angular when an the underlying directive performs an operation. + * + * The example below shows how an `enter` animation can be made possible on an element using `ng-if`: + * + * ```html + *
+ * Fade me in out + *
+ * + * + * ``` + * + * Notice the CSS class **fade**? We can now create the CSS transition code that references this class: + * + * ```css + * /* The starting CSS styles for the enter animation */ + * .fade.ng-enter { + * transition:0.5s linear all; + * opacity:0; + * } + * + * /* The finishing CSS styles for the enter animation */ + * .fade.ng-enter.ng-enter-active { + * opacity:1; + * } + * ``` + * + * The key thing to remember here is that, depending on the animation event (which each of the directives above trigger depending on what's going on) two + * generated CSS classes will be applied to the element; in the example above we have `.ng-enter` and `.ng-enter-active`. For CSS transitions, the transition + * code **must** be defined within the starting CSS class (in this case `.ng-enter`). The destination class is what the transition will animate towards. + * + * If for example we wanted to create animations for `leave` and `move` (ngRepeat triggers move) then we can do so using the same CSS naming conventions: + * + * ```css + * /* now the element will fade out before it is removed from the DOM */ + * .fade.ng-leave { + * transition:0.5s linear all; + * opacity:1; + * } + * .fade.ng-leave.ng-leave-active { + * opacity:0; + * } + * ``` + * + * We can also make use of **CSS Keyframes** by referencing the keyframe animation within the starting CSS class: + * + * ```css + * /* there is no need to define anything inside of the destination + * CSS class since the keyframe will take charge of the animation */ + * .fade.ng-leave { + * animation: my_fade_animation 0.5s linear; + * -webkit-animation: my_fade_animation 0.5s linear; + * } + * + * @keyframes my_fade_animation { + * from { opacity:1; } + * to { opacity:0; } + * } + * + * @-webkit-keyframes my_fade_animation { + * from { opacity:1; } + * to { opacity:0; } + * } + * ``` + * + * Feel free also mix transitions and keyframes together as well as any other CSS classes on the same element. + * + * ### CSS Class-based Animations + * + * Class-based animations (animations that are triggered via `ngClass`, `ngShow`, `ngHide` and some other directives) have a slightly different + * naming convention. Class-based animations are basic enough that a standard transition or keyframe can be referenced on the class being added + * and removed. + * + * For example if we wanted to do a CSS animation for `ngHide` then we place an animation on the `.ng-hide` CSS class: + * + * ```html + *
+ * Show and hide me + *
+ * + * + * + * ``` + * + * All that is going on here with ngShow/ngHide behind the scenes is the `.ng-hide` class is added/removed (when the hidden state is valid). Since + * ngShow and ngHide are animation aware then we can match up a transition and ngAnimate handles the rest. + * + * In addition the addition and removal of the CSS class, ngAnimate also provides two helper methods that we can use to further decorate the animation + * with CSS styles. + * + * ```html + *
+ * Highlight this box + *
+ * + * + * + * ``` + * + * We can also make use of CSS keyframes by placing them within the CSS classes. + * + * + * ### CSS Staggering Animations + * A Staggering animation is a collection of animations that are issued with a slight delay in between each successive operation resulting in a + * curtain-like effect. The ngAnimate module (versions >=1.2) supports staggering animations and the stagger effect can be + * performed by creating a **ng-EVENT-stagger** CSS class and attaching that class to the base CSS class used for + * the animation. The style property expected within the stagger class can either be a **transition-delay** or an + * **animation-delay** property (or both if your animation contains both transitions and keyframe animations). + * + * ```css + * .my-animation.ng-enter { + * /* standard transition code */ + * transition: 1s linear all; + * opacity:0; + * } + * .my-animation.ng-enter-stagger { + * /* this will have a 100ms delay between each successive leave animation */ + * transition-delay: 0.1s; + * + * /* As of 1.4.4, this must always be set: it signals ngAnimate + * to not accidentally inherit a delay property from another CSS class */ + * transition-duration: 0s; + * } + * .my-animation.ng-enter.ng-enter-active { + * /* standard transition styles */ + * opacity:1; + * } + * ``` + * + * Staggering animations work by default in ngRepeat (so long as the CSS class is defined). Outside of ngRepeat, to use staggering animations + * on your own, they can be triggered by firing multiple calls to the same event on $animate. However, the restrictions surrounding this + * are that each of the elements must have the same CSS className value as well as the same parent element. A stagger operation + * will also be reset if one or more animation frames have passed since the multiple calls to `$animate` were fired. + * + * The following code will issue the **ng-leave-stagger** event on the element provided: + * + * ```js + * var kids = parent.children(); + * + * $animate.leave(kids[0]); //stagger index=0 + * $animate.leave(kids[1]); //stagger index=1 + * $animate.leave(kids[2]); //stagger index=2 + * $animate.leave(kids[3]); //stagger index=3 + * $animate.leave(kids[4]); //stagger index=4 + * + * window.requestAnimationFrame(function() { + * //stagger has reset itself + * $animate.leave(kids[5]); //stagger index=0 + * $animate.leave(kids[6]); //stagger index=1 + * + * $scope.$digest(); + * }); + * ``` + * + * Stagger animations are currently only supported within CSS-defined animations. + * + * ### The `ng-animate` CSS class + * + * When ngAnimate is animating an element it will apply the `ng-animate` CSS class to the element for the duration of the animation. + * This is a temporary CSS class and it will be removed once the animation is over (for both JavaScript and CSS-based animations). + * + * Therefore, animations can be applied to an element using this temporary class directly via CSS. + * + * ```css + * .zipper.ng-animate { + * transition:0.5s linear all; + * } + * .zipper.ng-enter { + * opacity:0; + * } + * .zipper.ng-enter.ng-enter-active { + * opacity:1; + * } + * .zipper.ng-leave { + * opacity:1; + * } + * .zipper.ng-leave.ng-leave-active { + * opacity:0; + * } + * ``` + * + * (Note that the `ng-animate` CSS class is reserved and it cannot be applied on an element directly since ngAnimate will always remove + * the CSS class once an animation has completed.) + * + * + * ### The `ng-[event]-prepare` class + * + * This is a special class that can be used to prevent unwanted flickering / flash of content before + * the actual animation starts. The class is added as soon as an animation is initialized, but removed + * before the actual animation starts (after waiting for a $digest). + * It is also only added for *structural* animations (`enter`, `move`, and `leave`). + * + * In practice, flickering can appear when nesting elements with structural animations such as `ngIf` + * into elements that have class-based animations such as `ngClass`. + * + * ```html + *
+ *
+ *
+ *
+ *
+ * ``` + * + * It is possible that during the `enter` animation, the `.message` div will be briefly visible before it starts animating. + * In that case, you can add styles to the CSS that make sure the element stays hidden before the animation starts: + * + * ```css + * .message.ng-enter-prepare { + * opacity: 0; + * } + * + * ``` + * + * ## JavaScript-based Animations + * + * ngAnimate also allows for animations to be consumed by JavaScript code. The approach is similar to CSS-based animations (where there is a shared + * CSS class that is referenced in our HTML code) but in addition we need to register the JavaScript animation on the module. By making use of the + * `module.animation()` module function we can register the animation. + * + * Let's see an example of a enter/leave animation using `ngRepeat`: + * + * ```html + *
+ * {{ item }} + *
+ * ``` + * + * See the **slide** CSS class? Let's use that class to define an animation that we'll structure in our module code by using `module.animation`: + * + * ```js + * myModule.animation('.slide', [function() { + * return { + * // make note that other events (like addClass/removeClass) + * // have different function input parameters + * enter: function(element, doneFn) { + * jQuery(element).fadeIn(1000, doneFn); + * + * // remember to call doneFn so that angular + * // knows that the animation has concluded + * }, + * + * move: function(element, doneFn) { + * jQuery(element).fadeIn(1000, doneFn); + * }, + * + * leave: function(element, doneFn) { + * jQuery(element).fadeOut(1000, doneFn); + * } + * } + * }]); + * ``` + * + * The nice thing about JS-based animations is that we can inject other services and make use of advanced animation libraries such as + * greensock.js and velocity.js. + * + * If our animation code class-based (meaning that something like `ngClass`, `ngHide` and `ngShow` triggers it) then we can still define + * our animations inside of the same registered animation, however, the function input arguments are a bit different: + * + * ```html + *
+ * this box is moody + *
+ * + * + * + * ``` + * + * ```js + * myModule.animation('.colorful', [function() { + * return { + * addClass: function(element, className, doneFn) { + * // do some cool animation and call the doneFn + * }, + * removeClass: function(element, className, doneFn) { + * // do some cool animation and call the doneFn + * }, + * setClass: function(element, addedClass, removedClass, doneFn) { + * // do some cool animation and call the doneFn + * } + * } + * }]); + * ``` + * + * ## CSS + JS Animations Together + * + * AngularJS 1.4 and higher has taken steps to make the amalgamation of CSS and JS animations more flexible. However, unlike earlier versions of Angular, + * defining CSS and JS animations to work off of the same CSS class will not work anymore. Therefore the example below will only result in **JS animations taking + * charge of the animation**: + * + * ```html + *
+ * Slide in and out + *
+ * ``` + * + * ```js + * myModule.animation('.slide', [function() { + * return { + * enter: function(element, doneFn) { + * jQuery(element).slideIn(1000, doneFn); + * } + * } + * }]); + * ``` + * + * ```css + * .slide.ng-enter { + * transition:0.5s linear all; + * transform:translateY(-100px); + * } + * .slide.ng-enter.ng-enter-active { + * transform:translateY(0); + * } + * ``` + * + * Does this mean that CSS and JS animations cannot be used together? Do JS-based animations always have higher priority? We can make up for the + * lack of CSS animations by using the `$animateCss` service to trigger our own tweaked-out, CSS-based animations directly from + * our own JS-based animation code: + * + * ```js + * myModule.animation('.slide', ['$animateCss', function($animateCss) { + * return { + * enter: function(element) { +* // this will trigger `.slide.ng-enter` and `.slide.ng-enter-active`. + * return $animateCss(element, { + * event: 'enter', + * structural: true + * }); + * } + * } + * }]); + * ``` + * + * The nice thing here is that we can save bandwidth by sticking to our CSS-based animation code and we don't need to rely on a 3rd-party animation framework. + * + * The `$animateCss` service is very powerful since we can feed in all kinds of extra properties that will be evaluated and fed into a CSS transition or + * keyframe animation. For example if we wanted to animate the height of an element while adding and removing classes then we can do so by providing that + * data into `$animateCss` directly: + * + * ```js + * myModule.animation('.slide', ['$animateCss', function($animateCss) { + * return { + * enter: function(element) { + * return $animateCss(element, { + * event: 'enter', + * structural: true, + * addClass: 'maroon-setting', + * from: { height:0 }, + * to: { height: 200 } + * }); + * } + * } + * }]); + * ``` + * + * Now we can fill in the rest via our transition CSS code: + * + * ```css + * /* the transition tells ngAnimate to make the animation happen */ + * .slide.ng-enter { transition:0.5s linear all; } + * + * /* this extra CSS class will be absorbed into the transition + * since the $animateCss code is adding the class */ + * .maroon-setting { background:red; } + * ``` + * + * And `$animateCss` will figure out the rest. Just make sure to have the `done()` callback fire the `doneFn` function to signal when the animation is over. + * + * To learn more about what's possible be sure to visit the {@link ngAnimate.$animateCss $animateCss service}. + * + * ## Animation Anchoring (via `ng-animate-ref`) + * + * ngAnimate in AngularJS 1.4 comes packed with the ability to cross-animate elements between + * structural areas of an application (like views) by pairing up elements using an attribute + * called `ng-animate-ref`. + * + * Let's say for example we have two views that are managed by `ng-view` and we want to show + * that there is a relationship between two components situated in within these views. By using the + * `ng-animate-ref` attribute we can identify that the two components are paired together and we + * can then attach an animation, which is triggered when the view changes. + * + * Say for example we have the following template code: + * + * ```html + * + *
+ *
+ * + * + *
+ * + * + * + * + * + * ``` + * + * Now, when the view changes (once the link is clicked), ngAnimate will examine the + * HTML contents to see if there is a match reference between any components in the view + * that is leaving and the view that is entering. It will scan both the view which is being + * removed (leave) and inserted (enter) to see if there are any paired DOM elements that + * contain a matching ref value. + * + * The two images match since they share the same ref value. ngAnimate will now create a + * transport element (which is a clone of the first image element) and it will then attempt + * to animate to the position of the second image element in the next view. For the animation to + * work a special CSS class called `ng-anchor` will be added to the transported element. + * + * We can now attach a transition onto the `.banner.ng-anchor` CSS class and then + * ngAnimate will handle the entire transition for us as well as the addition and removal of + * any changes of CSS classes between the elements: + * + * ```css + * .banner.ng-anchor { + * /* this animation will last for 1 second since there are + * two phases to the animation (an `in` and an `out` phase) */ + * transition:0.5s linear all; + * } + * ``` + * + * We also **must** include animations for the views that are being entered and removed + * (otherwise anchoring wouldn't be possible since the new view would be inserted right away). + * + * ```css + * .view-animation.ng-enter, .view-animation.ng-leave { + * transition:0.5s linear all; + * position:fixed; + * left:0; + * top:0; + * width:100%; + * } + * .view-animation.ng-enter { + * transform:translateX(100%); + * } + * .view-animation.ng-leave, + * .view-animation.ng-enter.ng-enter-active { + * transform:translateX(0%); + * } + * .view-animation.ng-leave.ng-leave-active { + * transform:translateX(-100%); + * } + * ``` + * + * Now we can jump back to the anchor animation. When the animation happens, there are two stages that occur: + * an `out` and an `in` stage. The `out` stage happens first and that is when the element is animated away + * from its origin. Once that animation is over then the `in` stage occurs which animates the + * element to its destination. The reason why there are two animations is to give enough time + * for the enter animation on the new element to be ready. + * + * The example above sets up a transition for both the in and out phases, but we can also target the out or + * in phases directly via `ng-anchor-out` and `ng-anchor-in`. + * + * ```css + * .banner.ng-anchor-out { + * transition: 0.5s linear all; + * + * /* the scale will be applied during the out animation, + * but will be animated away when the in animation runs */ + * transform: scale(1.2); + * } + * + * .banner.ng-anchor-in { + * transition: 1s linear all; + * } + * ``` + * + * + * + * + * ### Anchoring Demo + * + + + Home +
+
+
+
+
+ + angular.module('anchoringExample', ['ngAnimate', 'ngRoute']) + .config(['$routeProvider', function($routeProvider) { + $routeProvider.when('/', { + templateUrl: 'home.html', + controller: 'HomeController as home' + }); + $routeProvider.when('/profile/:id', { + templateUrl: 'profile.html', + controller: 'ProfileController as profile' + }); + }]) + .run(['$rootScope', function($rootScope) { + $rootScope.records = [ + { id:1, title: "Miss Beulah Roob" }, + { id:2, title: "Trent Morissette" }, + { id:3, title: "Miss Ava Pouros" }, + { id:4, title: "Rod Pouros" }, + { id:5, title: "Abdul Rice" }, + { id:6, title: "Laurie Rutherford Sr." }, + { id:7, title: "Nakia McLaughlin" }, + { id:8, title: "Jordon Blanda DVM" }, + { id:9, title: "Rhoda Hand" }, + { id:10, title: "Alexandrea Sauer" } + ]; + }]) + .controller('HomeController', [function() { + //empty + }]) + .controller('ProfileController', ['$rootScope', '$routeParams', function($rootScope, $routeParams) { + var index = parseInt($routeParams.id, 10); + var record = $rootScope.records[index - 1]; + + this.title = record.title; + this.id = record.id; + }]); + + +

Welcome to the home page

+

Please click on an element

+ + {{ record.title }} + +
+ +
+ {{ profile.title }} +
+
+ + .record { + display:block; + font-size:20px; + } + .profile { + background:black; + color:white; + font-size:100px; + } + .view-container { + position:relative; + } + .view-container > .view.ng-animate { + position:absolute; + top:0; + left:0; + width:100%; + min-height:500px; + } + .view.ng-enter, .view.ng-leave, + .record.ng-anchor { + transition:0.5s linear all; + } + .view.ng-enter { + transform:translateX(100%); + } + .view.ng-enter.ng-enter-active, .view.ng-leave { + transform:translateX(0%); + } + .view.ng-leave.ng-leave-active { + transform:translateX(-100%); + } + .record.ng-anchor-out { + background:red; + } + +
+ * + * ### How is the element transported? + * + * When an anchor animation occurs, ngAnimate will clone the starting element and position it exactly where the starting + * element is located on screen via absolute positioning. The cloned element will be placed inside of the root element + * of the application (where ng-app was defined) and all of the CSS classes of the starting element will be applied. The + * element will then animate into the `out` and `in` animations and will eventually reach the coordinates and match + * the dimensions of the destination element. During the entire animation a CSS class of `.ng-animate-shim` will be applied + * to both the starting and destination elements in order to hide them from being visible (the CSS styling for the class + * is: `visibility:hidden`). Once the anchor reaches its destination then it will be removed and the destination element + * will become visible since the shim class will be removed. + * + * ### How is the morphing handled? + * + * CSS Anchoring relies on transitions and keyframes and the internal code is intelligent enough to figure out + * what CSS classes differ between the starting element and the destination element. These different CSS classes + * will be added/removed on the anchor element and a transition will be applied (the transition that is provided + * in the anchor class). Long story short, ngAnimate will figure out what classes to add and remove which will + * make the transition of the element as smooth and automatic as possible. Be sure to use simple CSS classes that + * do not rely on DOM nesting structure so that the anchor element appears the same as the starting element (since + * the cloned element is placed inside of root element which is likely close to the body element). + * + * Note that if the root element is on the `` element then the cloned node will be placed inside of body. + * + * + * ## Using $animate in your directive code + * + * So far we've explored how to feed in animations into an Angular application, but how do we trigger animations within our own directives in our application? + * By injecting the `$animate` service into our directive code, we can trigger structural and class-based hooks which can then be consumed by animations. Let's + * imagine we have a greeting box that shows and hides itself when the data changes + * + * ```html + * Hi there + * ``` + * + * ```js + * ngModule.directive('greetingBox', ['$animate', function($animate) { + * return function(scope, element, attrs) { + * attrs.$observe('active', function(value) { + * value ? $animate.addClass(element, 'on') : $animate.removeClass(element, 'on'); + * }); + * }); + * }]); + * ``` + * + * Now the `on` CSS class is added and removed on the greeting box component. Now if we add a CSS class on top of the greeting box element + * in our HTML code then we can trigger a CSS or JS animation to happen. + * + * ```css + * /* normally we would create a CSS class to reference on the element */ + * greeting-box.on { transition:0.5s linear all; background:green; color:white; } + * ``` + * + * The `$animate` service contains a variety of other methods like `enter`, `leave`, `animate` and `setClass`. To learn more about what's + * possible be sure to visit the {@link ng.$animate $animate service API page}. + * + * + * ## Callbacks and Promises + * + * When `$animate` is called it returns a promise that can be used to capture when the animation has ended. Therefore if we were to trigger + * an animation (within our directive code) then we can continue performing directive and scope related activities after the animation has + * ended by chaining onto the returned promise that animation method returns. + * + * ```js + * // somewhere within the depths of the directive + * $animate.enter(element, parent).then(function() { + * //the animation has completed + * }); + * ``` + * + * (Note that earlier versions of Angular prior to v1.4 required the promise code to be wrapped using `$scope.$apply(...)`. This is not the case + * anymore.) + * + * In addition to the animation promise, we can also make use of animation-related callbacks within our directives and controller code by registering + * an event listener using the `$animate` service. Let's say for example that an animation was triggered on our view + * routing controller to hook into that: + * + * ```js + * ngModule.controller('HomePageController', ['$animate', function($animate) { + * $animate.on('enter', ngViewElement, function(element) { + * // the animation for this route has completed + * }]); + * }]) + * ``` + * + * (Note that you will need to trigger a digest within the callback to get angular to notice any scope-related changes.) + */ + +/** + * @ngdoc service + * @name $animate + * @kind object + * + * @description + * The ngAnimate `$animate` service documentation is the same for the core `$animate` service. + * + * Click here {@link ng.$animate to learn more about animations with `$animate`}. + */ +angular.module('ngAnimate', []) + .directive('ngAnimateSwap', ngAnimateSwapDirective) + + .directive('ngAnimateChildren', $$AnimateChildrenDirective) + .factory('$$rAFScheduler', $$rAFSchedulerFactory) + + .provider('$$animateQueue', $$AnimateQueueProvider) + .provider('$$animation', $$AnimationProvider) + + .provider('$animateCss', $AnimateCssProvider) + .provider('$$animateCssDriver', $$AnimateCssDriverProvider) + + .provider('$$animateJs', $$AnimateJsProvider) + .provider('$$animateJsDriver', $$AnimateJsDriverProvider); + + +})(window, window.angular); diff --git a/www/lib/angular-animate/angular-animate.min.js b/www/lib/angular-animate/angular-animate.min.js new file mode 100644 index 0000000..57108b2 --- /dev/null +++ b/www/lib/angular-animate/angular-animate.min.js @@ -0,0 +1,56 @@ +/* + AngularJS v1.5.3 + (c) 2010-2016 Google, Inc. http://angularjs.org + License: MIT +*/ +(function(E,w,Va){'use strict';function ya(a,b,c){if(!a)throw Ka("areq",b||"?",c||"required");return a}function za(a,b){if(!a&&!b)return"";if(!a)return b;if(!b)return a;ba(a)&&(a=a.join(" "));ba(b)&&(b=b.join(" "));return a+" "+b}function La(a){var b={};a&&(a.to||a.from)&&(b.to=a.to,b.from=a.from);return b}function V(a,b,c){var d="";a=ba(a)?a:a&&I(a)&&a.length?a.split(/\s+/):[];q(a,function(a,f){a&&0=a&&(a=h,h=0,b.push(e),e=[]);e.push(f.fn);f.children.forEach(function(a){h++;c.push(a)});a--}e.length&&b.push(e);return b}(c)}var l=[],w=Q(a);return function(s,x,v){function h(a){a=a.hasAttribute("ng-animate-ref")?[a]:a.querySelectorAll("[ng-animate-ref]");var b=[];q(a,function(a){var c=a.getAttribute("ng-animate-ref");c&&c.length&&b.push(a)});return b}function P(a){var b=[],c={};q(a,function(a,g){var d=A(a.element),k=0<=["enter","move"].indexOf(a.event),d=a.structural? +h(d):[];if(d.length){var e=k?"to":"from";q(d,function(a){var b=a.getAttribute("ng-animate-ref");c[b]=c[b]||{};c[b][e]={animationID:g,element:H(a)}})}else b.push(a)});var d={},k={};q(c,function(c,h){var e=c.from,f=c.to;if(e&&f){var m=a[e.animationID],C=a[f.animationID],n=e.animationID.toString();if(!k[n]){var D=k[n]={structural:!0,beforeStart:function(){m.beforeStart();C.beforeStart()},close:function(){m.close();C.close()},classes:y(m.classes,C.classes),from:m,to:C,anchors:[]};D.classes.length?b.push(D): +(b.push(m),b.push(C))}k[n].anchors.push({out:e.element,"in":f.element})}else e=e?e.animationID:f.animationID,f=e.toString(),d[f]||(d[f]=!0,b.push(a[e]))});return b}function y(a,b){a=a.split(" ");b=b.split(" ");for(var c=[],d=0;d=Q&&b>=L&&(H=!0,n())}function K(){function b(){if(!P){D(!1);q(y,function(a){m.style[a[0]]=a[1]});h(a,g);e.addClass(a,ga);if(p.recalculateTimingStyles){na=m.className+" "+fa;ia=w(m,na);B=v(m,na,ia);$=B.maxDelay;I=Math.max($,0);L=B.maxDuration;if(0===L){n();return}p.hasTransitions=0z.expectedEndTime)?r.cancel(z.timer):f.push(n)}K&&(l=r(c,l,!1),f[0]={timer:l,expectedEndTime:d},f.push(n),a.data("$$animateCss",f)); +if(ea.length)a.on(ea.join(" "),C);g.to&&(g.cleanupStyles&&Ga(G,m,Object.keys(g.to)),Ba(a,g))}}function c(){var b=a.data("$$animateCss");if(b){for(var d=1;d", + "license": "MIT", + "bugs": { + "url": "https://github.com/angular/angular.js/issues" + }, + "homepage": "http://angularjs.org" +} diff --git a/www/lib/angular-sanitize/.bower.json b/www/lib/angular-sanitize/.bower.json new file mode 100644 index 0000000..3bf3f2d --- /dev/null +++ b/www/lib/angular-sanitize/.bower.json @@ -0,0 +1,20 @@ +{ + "name": "angular-sanitize", + "version": "1.5.3", + "license": "MIT", + "main": "./angular-sanitize.js", + "ignore": [], + "dependencies": { + "angular": "1.5.3" + }, + "homepage": "https://github.com/angular/bower-angular-sanitize", + "_release": "1.5.3", + "_resolution": { + "type": "version", + "tag": "v1.5.3", + "commit": "d62a5eecedc71828f6f935fbde6c07217a95988a" + }, + "_source": "https://github.com/angular/bower-angular-sanitize.git", + "_target": "1.5.3", + "_originalSource": "angular-sanitize" +} \ No newline at end of file diff --git a/www/lib/angular-sanitize/README.md b/www/lib/angular-sanitize/README.md new file mode 100644 index 0000000..b84aaf6 --- /dev/null +++ b/www/lib/angular-sanitize/README.md @@ -0,0 +1,68 @@ +# packaged angular-sanitize + +This repo is for distribution on `npm` and `bower`. The source for this module is in the +[main AngularJS repo](https://github.com/angular/angular.js/tree/master/src/ngSanitize). +Please file issues and pull requests against that repo. + +## Install + +You can install this package either with `npm` or with `bower`. + +### npm + +```shell +npm install angular-sanitize +``` + +Then add `ngSanitize` as a dependency for your app: + +```javascript +angular.module('myApp', [require('angular-sanitize')]); +``` + +### bower + +```shell +bower install angular-sanitize +``` + +Add a ` +``` + +Then add `ngSanitize` as a dependency for your app: + +```javascript +angular.module('myApp', ['ngSanitize']); +``` + +## Documentation + +Documentation is available on the +[AngularJS docs site](http://docs.angularjs.org/api/ngSanitize). + +## License + +The MIT License + +Copyright (c) 2010-2015 Google, Inc. http://angularjs.org + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. diff --git a/www/lib/angular-sanitize/angular-sanitize.js b/www/lib/angular-sanitize/angular-sanitize.js new file mode 100644 index 0000000..f4e2523 --- /dev/null +++ b/www/lib/angular-sanitize/angular-sanitize.js @@ -0,0 +1,717 @@ +/** + * @license AngularJS v1.5.3 + * (c) 2010-2016 Google, Inc. http://angularjs.org + * License: MIT + */ +(function(window, angular, undefined) {'use strict'; + +/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * + * Any commits to this file should be reviewed with security in mind. * + * Changes to this file can potentially create security vulnerabilities. * + * An approval from 2 Core members with history of modifying * + * this file is required. * + * * + * Does the change somehow allow for arbitrary javascript to be executed? * + * Or allows for someone to change the prototype of built-in objects? * + * Or gives undesired access to variables likes document or window? * + * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ + +var $sanitizeMinErr = angular.$$minErr('$sanitize'); + +/** + * @ngdoc module + * @name ngSanitize + * @description + * + * # ngSanitize + * + * The `ngSanitize` module provides functionality to sanitize HTML. + * + * + *
+ * + * See {@link ngSanitize.$sanitize `$sanitize`} for usage. + */ + +/** + * @ngdoc service + * @name $sanitize + * @kind function + * + * @description + * Sanitizes an html string by stripping all potentially dangerous tokens. + * + * The input is sanitized by parsing the HTML into tokens. All safe tokens (from a whitelist) are + * then serialized back to properly escaped html string. This means that no unsafe input can make + * it into the returned string. + * + * The whitelist for URL sanitization of attribute values is configured using the functions + * `aHrefSanitizationWhitelist` and `imgSrcSanitizationWhitelist` of {@link ng.$compileProvider + * `$compileProvider`}. + * + * The input may also contain SVG markup if this is enabled via {@link $sanitizeProvider}. + * + * @param {string} html HTML input. + * @returns {string} Sanitized HTML. + * + * @example + + + +
+ Snippet: + + + + + + + + + + + + + + + + + + + + + + + + + +
DirectiveHowSourceRendered
ng-bind-htmlAutomatically uses $sanitize
<div ng-bind-html="snippet">
</div>
ng-bind-htmlBypass $sanitize by explicitly trusting the dangerous value +
<div ng-bind-html="deliberatelyTrustDangerousSnippet()">
+</div>
+
ng-bindAutomatically escapes
<div ng-bind="snippet">
</div>
+
+
+ + it('should sanitize the html snippet by default', function() { + expect(element(by.css('#bind-html-with-sanitize div')).getInnerHtml()). + toBe('

an html\nclick here\nsnippet

'); + }); + + it('should inline raw snippet if bound to a trusted value', function() { + expect(element(by.css('#bind-html-with-trust div')).getInnerHtml()). + toBe("

an html\n" + + "click here\n" + + "snippet

"); + }); + + it('should escape snippet without any filter', function() { + expect(element(by.css('#bind-default div')).getInnerHtml()). + toBe("<p style=\"color:blue\">an html\n" + + "<em onmouseover=\"this.textContent='PWN3D!'\">click here</em>\n" + + "snippet</p>"); + }); + + it('should update', function() { + element(by.model('snippet')).clear(); + element(by.model('snippet')).sendKeys('new text'); + expect(element(by.css('#bind-html-with-sanitize div')).getInnerHtml()). + toBe('new text'); + expect(element(by.css('#bind-html-with-trust div')).getInnerHtml()).toBe( + 'new text'); + expect(element(by.css('#bind-default div')).getInnerHtml()).toBe( + "new <b onclick=\"alert(1)\">text</b>"); + }); +
+
+ */ + + +/** + * @ngdoc provider + * @name $sanitizeProvider + * + * @description + * Creates and configures {@link $sanitize} instance. + */ +function $SanitizeProvider() { + var svgEnabled = false; + + this.$get = ['$$sanitizeUri', function($$sanitizeUri) { + if (svgEnabled) { + angular.extend(validElements, svgElements); + } + return function(html) { + var buf = []; + htmlParser(html, htmlSanitizeWriter(buf, function(uri, isImage) { + return !/^unsafe:/.test($$sanitizeUri(uri, isImage)); + })); + return buf.join(''); + }; + }]; + + + /** + * @ngdoc method + * @name $sanitizeProvider#enableSvg + * @kind function + * + * @description + * Enables a subset of svg to be supported by the sanitizer. + * + *
+ *

By enabling this setting without taking other precautions, you might expose your + * application to click-hijacking attacks. In these attacks, sanitized svg elements could be positioned + * outside of the containing element and be rendered over other elements on the page (e.g. a login + * link). Such behavior can then result in phishing incidents.

+ * + *

To protect against these, explicitly setup `overflow: hidden` css rule for all potential svg + * tags within the sanitized content:

+ * + *
+ * + *

+   *   .rootOfTheIncludedContent svg {
+   *     overflow: hidden !important;
+   *   }
+   *   
+ *
+ * + * @param {boolean=} regexp New regexp to whitelist urls with. + * @returns {boolean|ng.$sanitizeProvider} Returns the currently configured value if called + * without an argument or self for chaining otherwise. + */ + this.enableSvg = function(enableSvg) { + if (angular.isDefined(enableSvg)) { + svgEnabled = enableSvg; + return this; + } else { + return svgEnabled; + } + }; +} + +function sanitizeText(chars) { + var buf = []; + var writer = htmlSanitizeWriter(buf, angular.noop); + writer.chars(chars); + return buf.join(''); +} + + +// Regular Expressions for parsing tags and attributes +var SURROGATE_PAIR_REGEXP = /[\uD800-\uDBFF][\uDC00-\uDFFF]/g, + // Match everything outside of normal chars and " (quote character) + NON_ALPHANUMERIC_REGEXP = /([^\#-~ |!])/g; + + +// Good source of info about elements and attributes +// http://dev.w3.org/html5/spec/Overview.html#semantics +// http://simon.html5.org/html-elements + +// Safe Void Elements - HTML5 +// http://dev.w3.org/html5/spec/Overview.html#void-elements +var voidElements = toMap("area,br,col,hr,img,wbr"); + +// Elements that you can, intentionally, leave open (and which close themselves) +// http://dev.w3.org/html5/spec/Overview.html#optional-tags +var optionalEndTagBlockElements = toMap("colgroup,dd,dt,li,p,tbody,td,tfoot,th,thead,tr"), + optionalEndTagInlineElements = toMap("rp,rt"), + optionalEndTagElements = angular.extend({}, + optionalEndTagInlineElements, + optionalEndTagBlockElements); + +// Safe Block Elements - HTML5 +var blockElements = angular.extend({}, optionalEndTagBlockElements, toMap("address,article," + + "aside,blockquote,caption,center,del,dir,div,dl,figure,figcaption,footer,h1,h2,h3,h4,h5," + + "h6,header,hgroup,hr,ins,map,menu,nav,ol,pre,section,table,ul")); + +// Inline Elements - HTML5 +var inlineElements = angular.extend({}, optionalEndTagInlineElements, toMap("a,abbr,acronym,b," + + "bdi,bdo,big,br,cite,code,del,dfn,em,font,i,img,ins,kbd,label,map,mark,q,ruby,rp,rt,s," + + "samp,small,span,strike,strong,sub,sup,time,tt,u,var")); + +// SVG Elements +// https://wiki.whatwg.org/wiki/Sanitization_rules#svg_Elements +// Note: the elements animate,animateColor,animateMotion,animateTransform,set are intentionally omitted. +// They can potentially allow for arbitrary javascript to be executed. See #11290 +var svgElements = toMap("circle,defs,desc,ellipse,font-face,font-face-name,font-face-src,g,glyph," + + "hkern,image,linearGradient,line,marker,metadata,missing-glyph,mpath,path,polygon,polyline," + + "radialGradient,rect,stop,svg,switch,text,title,tspan"); + +// Blocked Elements (will be stripped) +var blockedElements = toMap("script,style"); + +var validElements = angular.extend({}, + voidElements, + blockElements, + inlineElements, + optionalEndTagElements); + +//Attributes that have href and hence need to be sanitized +var uriAttrs = toMap("background,cite,href,longdesc,src,xlink:href"); + +var htmlAttrs = toMap('abbr,align,alt,axis,bgcolor,border,cellpadding,cellspacing,class,clear,' + + 'color,cols,colspan,compact,coords,dir,face,headers,height,hreflang,hspace,' + + 'ismap,lang,language,nohref,nowrap,rel,rev,rows,rowspan,rules,' + + 'scope,scrolling,shape,size,span,start,summary,tabindex,target,title,type,' + + 'valign,value,vspace,width'); + +// SVG attributes (without "id" and "name" attributes) +// https://wiki.whatwg.org/wiki/Sanitization_rules#svg_Attributes +var svgAttrs = toMap('accent-height,accumulate,additive,alphabetic,arabic-form,ascent,' + + 'baseProfile,bbox,begin,by,calcMode,cap-height,class,color,color-rendering,content,' + + 'cx,cy,d,dx,dy,descent,display,dur,end,fill,fill-rule,font-family,font-size,font-stretch,' + + 'font-style,font-variant,font-weight,from,fx,fy,g1,g2,glyph-name,gradientUnits,hanging,' + + 'height,horiz-adv-x,horiz-origin-x,ideographic,k,keyPoints,keySplines,keyTimes,lang,' + + 'marker-end,marker-mid,marker-start,markerHeight,markerUnits,markerWidth,mathematical,' + + 'max,min,offset,opacity,orient,origin,overline-position,overline-thickness,panose-1,' + + 'path,pathLength,points,preserveAspectRatio,r,refX,refY,repeatCount,repeatDur,' + + 'requiredExtensions,requiredFeatures,restart,rotate,rx,ry,slope,stemh,stemv,stop-color,' + + 'stop-opacity,strikethrough-position,strikethrough-thickness,stroke,stroke-dasharray,' + + 'stroke-dashoffset,stroke-linecap,stroke-linejoin,stroke-miterlimit,stroke-opacity,' + + 'stroke-width,systemLanguage,target,text-anchor,to,transform,type,u1,u2,underline-position,' + + 'underline-thickness,unicode,unicode-range,units-per-em,values,version,viewBox,visibility,' + + 'width,widths,x,x-height,x1,x2,xlink:actuate,xlink:arcrole,xlink:role,xlink:show,xlink:title,' + + 'xlink:type,xml:base,xml:lang,xml:space,xmlns,xmlns:xlink,y,y1,y2,zoomAndPan', true); + +var validAttrs = angular.extend({}, + uriAttrs, + svgAttrs, + htmlAttrs); + +function toMap(str, lowercaseKeys) { + var obj = {}, items = str.split(','), i; + for (i = 0; i < items.length; i++) { + obj[lowercaseKeys ? angular.lowercase(items[i]) : items[i]] = true; + } + return obj; +} + +var inertBodyElement; +(function(window) { + var doc; + if (window.document && window.document.implementation) { + doc = window.document.implementation.createHTMLDocument("inert"); + } else { + throw $sanitizeMinErr('noinert', "Can't create an inert html document"); + } + var docElement = doc.documentElement || doc.getDocumentElement(); + var bodyElements = docElement.getElementsByTagName('body'); + + // usually there should be only one body element in the document, but IE doesn't have any, so we need to create one + if (bodyElements.length === 1) { + inertBodyElement = bodyElements[0]; + } else { + var html = doc.createElement('html'); + inertBodyElement = doc.createElement('body'); + html.appendChild(inertBodyElement); + doc.appendChild(html); + } +})(window); + +/** + * @example + * htmlParser(htmlString, { + * start: function(tag, attrs) {}, + * end: function(tag) {}, + * chars: function(text) {}, + * comment: function(text) {} + * }); + * + * @param {string} html string + * @param {object} handler + */ +function htmlParser(html, handler) { + if (html === null || html === undefined) { + html = ''; + } else if (typeof html !== 'string') { + html = '' + html; + } + inertBodyElement.innerHTML = html; + + //mXSS protection + var mXSSAttempts = 5; + do { + if (mXSSAttempts === 0) { + throw $sanitizeMinErr('uinput', "Failed to sanitize html because the input is unstable"); + } + mXSSAttempts--; + + // strip custom-namespaced attributes on IE<=11 + if (document.documentMode <= 11) { + stripCustomNsAttrs(inertBodyElement); + } + html = inertBodyElement.innerHTML; //trigger mXSS + inertBodyElement.innerHTML = html; + } while (html !== inertBodyElement.innerHTML); + + var node = inertBodyElement.firstChild; + while (node) { + switch (node.nodeType) { + case 1: // ELEMENT_NODE + handler.start(node.nodeName.toLowerCase(), attrToMap(node.attributes)); + break; + case 3: // TEXT NODE + handler.chars(node.textContent); + break; + } + + var nextNode; + if (!(nextNode = node.firstChild)) { + if (node.nodeType == 1) { + handler.end(node.nodeName.toLowerCase()); + } + nextNode = node.nextSibling; + if (!nextNode) { + while (nextNode == null) { + node = node.parentNode; + if (node === inertBodyElement) break; + nextNode = node.nextSibling; + if (node.nodeType == 1) { + handler.end(node.nodeName.toLowerCase()); + } + } + } + } + node = nextNode; + } + + while (node = inertBodyElement.firstChild) { + inertBodyElement.removeChild(node); + } +} + +function attrToMap(attrs) { + var map = {}; + for (var i = 0, ii = attrs.length; i < ii; i++) { + var attr = attrs[i]; + map[attr.name] = attr.value; + } + return map; +} + + +/** + * Escapes all potentially dangerous characters, so that the + * resulting string can be safely inserted into attribute or + * element text. + * @param value + * @returns {string} escaped text + */ +function encodeEntities(value) { + return value. + replace(/&/g, '&'). + replace(SURROGATE_PAIR_REGEXP, function(value) { + var hi = value.charCodeAt(0); + var low = value.charCodeAt(1); + return '&#' + (((hi - 0xD800) * 0x400) + (low - 0xDC00) + 0x10000) + ';'; + }). + replace(NON_ALPHANUMERIC_REGEXP, function(value) { + return '&#' + value.charCodeAt(0) + ';'; + }). + replace(//g, '>'); +} + +/** + * create an HTML/XML writer which writes to buffer + * @param {Array} buf use buf.join('') to get out sanitized html string + * @returns {object} in the form of { + * start: function(tag, attrs) {}, + * end: function(tag) {}, + * chars: function(text) {}, + * comment: function(text) {} + * } + */ +function htmlSanitizeWriter(buf, uriValidator) { + var ignoreCurrentElement = false; + var out = angular.bind(buf, buf.push); + return { + start: function(tag, attrs) { + tag = angular.lowercase(tag); + if (!ignoreCurrentElement && blockedElements[tag]) { + ignoreCurrentElement = tag; + } + if (!ignoreCurrentElement && validElements[tag] === true) { + out('<'); + out(tag); + angular.forEach(attrs, function(value, key) { + var lkey=angular.lowercase(key); + var isImage = (tag === 'img' && lkey === 'src') || (lkey === 'background'); + if (validAttrs[lkey] === true && + (uriAttrs[lkey] !== true || uriValidator(value, isImage))) { + out(' '); + out(key); + out('="'); + out(encodeEntities(value)); + out('"'); + } + }); + out('>'); + } + }, + end: function(tag) { + tag = angular.lowercase(tag); + if (!ignoreCurrentElement && validElements[tag] === true && voidElements[tag] !== true) { + out(''); + } + if (tag == ignoreCurrentElement) { + ignoreCurrentElement = false; + } + }, + chars: function(chars) { + if (!ignoreCurrentElement) { + out(encodeEntities(chars)); + } + } + }; +} + + +/** + * When IE9-11 comes across an unknown namespaced attribute e.g. 'xlink:foo' it adds 'xmlns:ns1' attribute to declare + * ns1 namespace and prefixes the attribute with 'ns1' (e.g. 'ns1:xlink:foo'). This is undesirable since we don't want + * to allow any of these custom attributes. This method strips them all. + * + * @param node Root element to process + */ +function stripCustomNsAttrs(node) { + if (node.nodeType === Node.ELEMENT_NODE) { + var attrs = node.attributes; + for (var i = 0, l = attrs.length; i < l; i++) { + var attrNode = attrs[i]; + var attrName = attrNode.name.toLowerCase(); + if (attrName === 'xmlns:ns1' || attrName.indexOf('ns1:') === 0) { + node.removeAttributeNode(attrNode); + i--; + l--; + } + } + } + + var nextNode = node.firstChild; + if (nextNode) { + stripCustomNsAttrs(nextNode); + } + + nextNode = node.nextSibling; + if (nextNode) { + stripCustomNsAttrs(nextNode); + } +} + + + +// define ngSanitize module and register $sanitize service +angular.module('ngSanitize', []).provider('$sanitize', $SanitizeProvider); + +/* global sanitizeText: false */ + +/** + * @ngdoc filter + * @name linky + * @kind function + * + * @description + * Finds links in text input and turns them into html links. Supports `http/https/ftp/mailto` and + * plain email address links. + * + * Requires the {@link ngSanitize `ngSanitize`} module to be installed. + * + * @param {string} text Input text. + * @param {string} target Window (`_blank|_self|_parent|_top`) or named frame to open links in. + * @param {object|function(url)} [attributes] Add custom attributes to the link element. + * + * Can be one of: + * + * - `object`: A map of attributes + * - `function`: Takes the url as a parameter and returns a map of attributes + * + * If the map of attributes contains a value for `target`, it overrides the value of + * the target parameter. + * + * + * @returns {string} Html-linkified and {@link $sanitize sanitized} text. + * + * @usage + + * + * @example + + +
+ Snippet: + + + + + + + + + + + + + + + + + + + + + + + + + + +
FilterSourceRendered
linky filter +
<div ng-bind-html="snippet | linky">
</div>
+
+
+
linky target +
<div ng-bind-html="snippetWithSingleURL | linky:'_blank'">
</div>
+
+
+
linky custom attributes +
<div ng-bind-html="snippetWithSingleURL | linky:'_self':{rel: 'nofollow'}">
</div>
+
+
+
no filter
<div ng-bind="snippet">
</div>
+ + + angular.module('linkyExample', ['ngSanitize']) + .controller('ExampleController', ['$scope', function($scope) { + $scope.snippet = + 'Pretty text with some links:\n'+ + 'http://angularjs.org/,\n'+ + 'mailto:us@somewhere.org,\n'+ + 'another@somewhere.org,\n'+ + 'and one more: ftp://127.0.0.1/.'; + $scope.snippetWithSingleURL = 'http://angularjs.org/'; + }]); + + + it('should linkify the snippet with urls', function() { + expect(element(by.id('linky-filter')).element(by.binding('snippet | linky')).getText()). + toBe('Pretty text with some links: http://angularjs.org/, us@somewhere.org, ' + + 'another@somewhere.org, and one more: ftp://127.0.0.1/.'); + expect(element.all(by.css('#linky-filter a')).count()).toEqual(4); + }); + + it('should not linkify snippet without the linky filter', function() { + expect(element(by.id('escaped-html')).element(by.binding('snippet')).getText()). + toBe('Pretty text with some links: http://angularjs.org/, mailto:us@somewhere.org, ' + + 'another@somewhere.org, and one more: ftp://127.0.0.1/.'); + expect(element.all(by.css('#escaped-html a')).count()).toEqual(0); + }); + + it('should update', function() { + element(by.model('snippet')).clear(); + element(by.model('snippet')).sendKeys('new http://link.'); + expect(element(by.id('linky-filter')).element(by.binding('snippet | linky')).getText()). + toBe('new http://link.'); + expect(element.all(by.css('#linky-filter a')).count()).toEqual(1); + expect(element(by.id('escaped-html')).element(by.binding('snippet')).getText()) + .toBe('new http://link.'); + }); + + it('should work with the target property', function() { + expect(element(by.id('linky-target')). + element(by.binding("snippetWithSingleURL | linky:'_blank'")).getText()). + toBe('http://angularjs.org/'); + expect(element(by.css('#linky-target a')).getAttribute('target')).toEqual('_blank'); + }); + + it('should optionally add custom attributes', function() { + expect(element(by.id('linky-custom-attributes')). + element(by.binding("snippetWithSingleURL | linky:'_self':{rel: 'nofollow'}")).getText()). + toBe('http://angularjs.org/'); + expect(element(by.css('#linky-custom-attributes a')).getAttribute('rel')).toEqual('nofollow'); + }); + + + */ +angular.module('ngSanitize').filter('linky', ['$sanitize', function($sanitize) { + var LINKY_URL_REGEXP = + /((ftp|https?):\/\/|(www\.)|(mailto:)?[A-Za-z0-9._%+-]+@)\S*[^\s.;,(){}<>"\u201d\u2019]/i, + MAILTO_REGEXP = /^mailto:/i; + + var linkyMinErr = angular.$$minErr('linky'); + var isString = angular.isString; + + return function(text, target, attributes) { + if (text == null || text === '') return text; + if (!isString(text)) throw linkyMinErr('notstring', 'Expected string but received: {0}', text); + + var match; + var raw = text; + var html = []; + var url; + var i; + while ((match = raw.match(LINKY_URL_REGEXP))) { + // We can not end in these as they are sometimes found at the end of the sentence + url = match[0]; + // if we did not match ftp/http/www/mailto then assume mailto + if (!match[2] && !match[4]) { + url = (match[3] ? 'http://' : 'mailto:') + url; + } + i = match.index; + addText(raw.substr(0, i)); + addLink(url, match[0].replace(MAILTO_REGEXP, '')); + raw = raw.substring(i + match[0].length); + } + addText(raw); + return $sanitize(html.join('')); + + function addText(text) { + if (!text) { + return; + } + html.push(sanitizeText(text)); + } + + function addLink(url, text) { + var key; + html.push(''); + addText(text); + html.push(''); + } + }; +}]); + + +})(window, window.angular); diff --git a/www/lib/angular-sanitize/angular-sanitize.min.js b/www/lib/angular-sanitize/angular-sanitize.min.js new file mode 100644 index 0000000..2e96280 --- /dev/null +++ b/www/lib/angular-sanitize/angular-sanitize.min.js @@ -0,0 +1,15 @@ +/* + AngularJS v1.5.3 + (c) 2010-2016 Google, Inc. http://angularjs.org + License: MIT +*/ +(function(A,e,B){'use strict';function C(a){var c=[];v(c,e.noop).chars(a);return c.join("")}function h(a,c){var b={},d=a.split(","),l;for(l=0;l=document.documentMode&&n(g);a=g.innerHTML;g.innerHTML=a}while(a!==g.innerHTML);for(b=g.firstChild;b;){switch(b.nodeType){case 1:c.start(b.nodeName.toLowerCase(),E(b.attributes)); +break;case 3:c.chars(b.textContent)}var d;if(!(d=b.firstChild)&&(1==b.nodeType&&c.end(b.nodeName.toLowerCase()),d=b.nextSibling,!d))for(;null==d;){b=b.parentNode;if(b===g)break;d=b.nextSibling;1==b.nodeType&&c.end(b.nodeName.toLowerCase())}b=d}for(;b=g.firstChild;)g.removeChild(b)}function E(a){for(var c={},b=0,d=a.length;b/g,">")}function v(a,c){var b=!1,d=e.bind(a,a.push);return{start:function(a,f){a=e.lowercase(a);!b&&H[a]&&(b=a);b||!0!==t[a]||(d("<"),d(a),e.forEach(f,function(b,f){var g=e.lowercase(f),h="img"===a&&"src"===g||"background"===g;!0!==I[g]||!0===y[g]&&!c(b,h)||(d(" "),d(f),d('="'),d(x(b)),d('"'))}),d(">"))},end:function(a){a=e.lowercase(a);b||!0!==t[a]||!0===z[a]||(d(""));a== +b&&(b=!1)},chars:function(a){b||d(x(a))}}}function n(a){if(a.nodeType===Node.ELEMENT_NODE)for(var c=a.attributes,b=0,d=c.length;b"\u201d\u2019]/i,b=/^mailto:/i,d=e.$$minErr("linky"),g=e.isString;return function(f,h,m){function k(a){a&&p.push(C(a))}function q(a,b){var c;p.push("');k(b);p.push("")}if(null==f||""===f)return f;if(!g(f))throw d("notstring",f);for(var r=f,p=[],s,n;f=r.match(c);)s=f[0],f[2]||f[4]||(s=(f[3]?"http://":"mailto:")+s),n=f.index,k(r.substr(0,n)),q(s,f[0].replace(b,"")),r=r.substring(n+f[0].length);k(r);return a(p.join(""))}}])})(window,window.angular); +//# sourceMappingURL=angular-sanitize.min.js.map diff --git a/www/lib/angular-sanitize/angular-sanitize.min.js.map b/www/lib/angular-sanitize/angular-sanitize.min.js.map new file mode 100644 index 0000000..7276abd --- /dev/null +++ b/www/lib/angular-sanitize/angular-sanitize.min.js.map @@ -0,0 +1,8 @@ +{ +"version":3, +"file":"angular-sanitize.min.js", +"lineCount":14, +"mappings":"A;;;;;aAKC,SAAQ,CAACA,CAAD,CAASC,CAAT,CAAkBC,CAAlB,CAA6B,CAsMtCC,QAASA,EAAY,CAACC,CAAD,CAAQ,CAC3B,IAAIC,EAAM,EACGC,EAAAC,CAAmBF,CAAnBE,CAAwBN,CAAAO,KAAxBD,CACbH,MAAA,CAAaA,CAAb,CACA,OAAOC,EAAAI,KAAA,CAAS,EAAT,CAJoB,CAyF7BC,QAASA,EAAK,CAACC,CAAD,CAAMC,CAAN,CAAqB,CAAA,IAC7BC,EAAM,EADuB,CACnBC,EAAQH,CAAAI,MAAA,CAAU,GAAV,CADW,CACKC,CACtC,KAAKA,CAAL,CAAS,CAAT,CAAYA,CAAZ,CAAgBF,CAAAG,OAAhB,CAA8BD,CAAA,EAA9B,CACEH,CAAA,CAAID,CAAA,CAAgBX,CAAAiB,UAAA,CAAkBJ,CAAA,CAAME,CAAN,CAAlB,CAAhB,CAA8CF,CAAA,CAAME,CAAN,CAAlD,CAAA,CAA8D,CAAA,CAEhE,OAAOH,EAL0B,CA0CnCM,QAASA,EAAU,CAACC,CAAD,CAAOC,CAAP,CAAgB,CACpB,IAAb,GAAID,CAAJ,EAAqBA,CAArB,GAA8BlB,CAA9B,CACEkB,CADF,CACS,EADT,CAE2B,QAF3B,GAEW,MAAOA,EAFlB,GAGEA,CAHF,CAGS,EAHT,CAGcA,CAHd,CAKAE,EAAAC,UAAA,CAA6BH,CAG7B,KAAII,EAAe,CACnB,GAAG,CACD,GAAqB,CAArB,GAAIA,CAAJ,CACE,KAAMC,EAAA,CAAgB,QAAhB,CAAN,CAEFD,CAAA,EAG6B,GAA7B,EAAIE,QAAAC,aAAJ,EACEC,CAAA,CAAmBN,CAAnB,CAEFF,EAAA,CAAOE,CAAAC,UACPD,EAAAC,UAAA,CAA6BH,CAX5B,CAAH,MAYSA,CAZT,GAYkBE,CAAAC,UAZlB,CAeA,KADIM,CACJ,CADWP,CAAAQ,WACX,CAAOD,CAAP,CAAA,CAAa,CACX,OAAQA,CAAAE,SAAR,EACE,KAAK,CAAL,CACEV,CAAAW,MAAA,CAAcH,CAAAI,SAAAC,YAAA,EAAd,CAA2CC,CAAA,CAAUN,CAAAO,WAAV,CAA3C,CACA;KACF,MAAK,CAAL,CACEf,CAAAjB,MAAA,CAAcyB,CAAAQ,YAAd,CALJ,CASA,IAAIC,CACJ,IAAM,EAAAA,CAAA,CAAWT,CAAAC,WAAX,CAAN,GACuB,CAIhBQ,EAJDT,CAAAE,SAICO,EAHHjB,CAAAkB,IAAA,CAAYV,CAAAI,SAAAC,YAAA,EAAZ,CAGGI,CADLA,CACKA,CADMT,CAAAW,YACNF,CAAAA,CAAAA,CALP,EAMI,IAAA,CAAmB,IAAnB,EAAOA,CAAP,CAAA,CAAyB,CACvBT,CAAA,CAAOA,CAAAY,WACP,IAAIZ,CAAJ,GAAaP,CAAb,CAA+B,KAC/BgB,EAAA,CAAWT,CAAAW,YACU,EAArB,EAAIX,CAAAE,SAAJ,EACEV,CAAAkB,IAAA,CAAYV,CAAAI,SAAAC,YAAA,EAAZ,CALqB,CAU7BL,CAAA,CAAOS,CA3BI,CA8Bb,IAAA,CAAOT,CAAP,CAAcP,CAAAQ,WAAd,CAAA,CACER,CAAAoB,YAAA,CAA6Bb,CAA7B,CAxD+B,CA4DnCM,QAASA,EAAS,CAACQ,CAAD,CAAQ,CAExB,IADA,IAAIC,EAAM,EAAV,CACS5B,EAAI,CADb,CACgB6B,EAAKF,CAAA1B,OAArB,CAAmCD,CAAnC,CAAuC6B,CAAvC,CAA2C7B,CAAA,EAA3C,CAAgD,CAC9C,IAAI8B,EAAOH,CAAA,CAAM3B,CAAN,CACX4B,EAAA,CAAIE,CAAAC,KAAJ,CAAA,CAAiBD,CAAAE,MAF6B,CAIhD,MAAOJ,EANiB,CAiB1BK,QAASA,EAAc,CAACD,CAAD,CAAQ,CAC7B,MAAOA,EAAAE,QAAA,CACG,IADH,CACS,OADT,CAAAA,QAAA,CAEGC,CAFH,CAE0B,QAAQ,CAACH,CAAD,CAAQ,CAC7C,IAAII,EAAKJ,CAAAK,WAAA,CAAiB,CAAjB,CACLC,EAAAA,CAAMN,CAAAK,WAAA,CAAiB,CAAjB,CACV,OAAO,IAAP,EAAgC,IAAhC,EAAiBD,CAAjB,CAAsB,KAAtB;CAA0CE,CAA1C,CAAgD,KAAhD,EAA0D,KAA1D,EAAqE,GAHxB,CAF1C,CAAAJ,QAAA,CAOGK,CAPH,CAO4B,QAAQ,CAACP,CAAD,CAAQ,CAC/C,MAAO,IAAP,CAAcA,CAAAK,WAAA,CAAiB,CAAjB,CAAd,CAAoC,GADW,CAP5C,CAAAH,QAAA,CAUG,IAVH,CAUS,MAVT,CAAAA,QAAA,CAWG,IAXH,CAWS,MAXT,CADsB,CAyB/B5C,QAASA,EAAkB,CAACD,CAAD,CAAMmD,CAAN,CAAoB,CAC7C,IAAIC,EAAuB,CAAA,CAA3B,CACIC,EAAMzD,CAAA0D,KAAA,CAAatD,CAAb,CAAkBA,CAAAuD,KAAlB,CACV,OAAO,CACL5B,MAAOA,QAAQ,CAAC6B,CAAD,CAAMlB,CAAN,CAAa,CAC1BkB,CAAA,CAAM5D,CAAAiB,UAAA,CAAkB2C,CAAlB,CACDJ,EAAAA,CAAL,EAA6BK,CAAA,CAAgBD,CAAhB,CAA7B,GACEJ,CADF,CACyBI,CADzB,CAGKJ,EAAL,EAAoD,CAAA,CAApD,GAA6BM,CAAA,CAAcF,CAAd,CAA7B,GACEH,CAAA,CAAI,GAAJ,CAcA,CAbAA,CAAA,CAAIG,CAAJ,CAaA,CAZA5D,CAAA+D,QAAA,CAAgBrB,CAAhB,CAAuB,QAAQ,CAACK,CAAD,CAAQiB,CAAR,CAAa,CAC1C,IAAIC,EAAKjE,CAAAiB,UAAA,CAAkB+C,CAAlB,CAAT,CACIE,EAAmB,KAAnBA,GAAWN,CAAXM,EAAqC,KAArCA,GAA4BD,CAA5BC,EAAyD,YAAzDA,GAAgDD,CAC3B,EAAA,CAAzB,GAAIE,CAAA,CAAWF,CAAX,CAAJ,EACsB,CAAA,CADtB,GACGG,CAAA,CAASH,CAAT,CADH,EAC8B,CAAAV,CAAA,CAAaR,CAAb,CAAoBmB,CAApB,CAD9B,GAEET,CAAA,CAAI,GAAJ,CAIA,CAHAA,CAAA,CAAIO,CAAJ,CAGA,CAFAP,CAAA,CAAI,IAAJ,CAEA,CADAA,CAAA,CAAIT,CAAA,CAAeD,CAAf,CAAJ,CACA,CAAAU,CAAA,CAAI,GAAJ,CANF,CAH0C,CAA5C,CAYA,CAAAA,CAAA,CAAI,GAAJ,CAfF,CAL0B,CADvB,CAwBLnB,IAAKA,QAAQ,CAACsB,CAAD,CAAM,CACjBA,CAAA,CAAM5D,CAAAiB,UAAA,CAAkB2C,CAAlB,CACDJ,EAAL,EAAoD,CAAA,CAApD,GAA6BM,CAAA,CAAcF,CAAd,CAA7B,EAAkF,CAAA,CAAlF,GAA4DS,CAAA,CAAaT,CAAb,CAA5D,GACEH,CAAA,CAAI,IAAJ,CAEA,CADAA,CAAA,CAAIG,CAAJ,CACA,CAAAH,CAAA,CAAI,GAAJ,CAHF,CAKIG,EAAJ;AAAWJ,CAAX,GACEA,CADF,CACyB,CAAA,CADzB,CAPiB,CAxBd,CAmCLrD,MAAOA,QAAQ,CAACA,CAAD,CAAQ,CAChBqD,CAAL,EACEC,CAAA,CAAIT,CAAA,CAAe7C,CAAf,CAAJ,CAFmB,CAnClB,CAHsC,CAsD/CwB,QAASA,EAAkB,CAACC,CAAD,CAAO,CAChC,GAAIA,CAAAE,SAAJ,GAAsBwC,IAAAC,aAAtB,CAEE,IADA,IAAI7B,EAAQd,CAAAO,WAAZ,CACSpB,EAAI,CADb,CACgByD,EAAI9B,CAAA1B,OAApB,CAAkCD,CAAlC,CAAsCyD,CAAtC,CAAyCzD,CAAA,EAAzC,CAA8C,CAC5C,IAAI0D,EAAW/B,CAAA,CAAM3B,CAAN,CAAf,CACI2D,EAAWD,CAAA3B,KAAAb,YAAA,EACf,IAAiB,WAAjB,GAAIyC,CAAJ,EAA6D,CAA7D,GAAgCA,CAAAC,QAAA,CAAiB,MAAjB,CAAhC,CACE/C,CAAAgD,oBAAA,CAAyBH,CAAzB,CAEA,CADA1D,CAAA,EACA,CAAAyD,CAAA,EAN0C,CAYhD,CADInC,CACJ,CADeT,CAAAC,WACf,GACEF,CAAA,CAAmBU,CAAnB,CAIF,EADAA,CACA,CADWT,CAAAW,YACX,GACEZ,CAAA,CAAmBU,CAAnB,CArB8B,CAxdlC,IAAIb,EAAkBxB,CAAA6E,SAAA,CAAiB,WAAjB,CAAtB,CAkMI3B,EAAwB,iCAlM5B,CAoMEI,EAA0B,eApM5B,CA6MIe,EAAe5D,CAAA,CAAM,wBAAN,CA7MnB,CAiNIqE,EAA8BrE,CAAA,CAAM,gDAAN,CAjNlC,CAkNIsE,EAA+BtE,CAAA,CAAM,OAAN,CAlNnC,CAmNIuE,EAAyBhF,CAAAiF,OAAA,CAAe,EAAf,CACeF,CADf,CAEeD,CAFf,CAnN7B,CAwNII,EAAgBlF,CAAAiF,OAAA,CAAe,EAAf;AAAmBH,CAAnB,CAAgDrE,CAAA,CAAM,qKAAN,CAAhD,CAxNpB,CA6NI0E,EAAiBnF,CAAAiF,OAAA,CAAe,EAAf,CAAmBF,CAAnB,CAAiDtE,CAAA,CAAM,2JAAN,CAAjD,CA7NrB,CAqOI2E,EAAc3E,CAAA,CAAM,wNAAN,CArOlB;AA0OIoD,EAAkBpD,CAAA,CAAM,cAAN,CA1OtB,CA4OIqD,EAAgB9D,CAAAiF,OAAA,CAAe,EAAf,CACeZ,CADf,CAEea,CAFf,CAGeC,CAHf,CAIeH,CAJf,CA5OpB,CAmPIZ,EAAW3D,CAAA,CAAM,8CAAN,CAnPf,CAqPI4E,EAAY5E,CAAA,CAAM,kTAAN,CArPhB,CA6PI6E,EAAW7E,CAAA,CAAM,guCAAN;AAcoE,CAAA,CAdpE,CA7Pf,CA6QI0D,EAAanE,CAAAiF,OAAA,CAAe,EAAf,CACeb,CADf,CAEekB,CAFf,CAGeD,CAHf,CA7QjB,CA0RIhE,CACH,UAAQ,CAACtB,CAAD,CAAS,CAEhB,GAAIA,CAAA0B,SAAJ,EAAuB1B,CAAA0B,SAAA8D,eAAvB,CACEC,CAAA,CAAMzF,CAAA0B,SAAA8D,eAAAE,mBAAA,CAAkD,OAAlD,CADR,KAGE,MAAMjE,EAAA,CAAgB,SAAhB,CAAN,CAGF,IAAIkE,EAAeC,CADFH,CAAAI,gBACED,EADqBH,CAAAK,mBAAA,EACrBF,sBAAA,CAAgC,MAAhC,CAGS,EAA5B,GAAID,CAAA1E,OAAJ,CACEK,CADF,CACqBqE,CAAA,CAAa,CAAb,CADrB,EAGMvE,CAGJ,CAHWqE,CAAAM,cAAA,CAAkB,MAAlB,CAGX,CAFAzE,CAEA,CAFmBmE,CAAAM,cAAA,CAAkB,MAAlB,CAEnB,CADA3E,CAAA4E,YAAA,CAAiB1E,CAAjB,CACA,CAAAmE,CAAAO,YAAA,CAAgB5E,CAAhB,CANF,CAXgB,CAAjB,CAAD,CAmBGpB,CAnBH,CAyNAC,EAAAgG,OAAA,CAAe,YAAf,CAA6B,EAA7B,CAAAC,SAAA,CAA0C,WAA1C,CApXAC,QAA0B,EAAG,CAC3B,IAAIC,EAAa,CAAA,CAEjB,KAAAC,KAAA,CAAY,CAAC,eAAD,CAAkB,QAAQ,CAACC,CAAD,CAAgB,CAChDF,CAAJ,EACEnG,CAAAiF,OAAA,CAAenB,CAAf,CAA8BsB,CAA9B,CAEF,OAAO,SAAQ,CAACjE,CAAD,CAAO,CACpB,IAAIf;AAAM,EACVc,EAAA,CAAWC,CAAX,CAAiBd,CAAA,CAAmBD,CAAnB,CAAwB,QAAQ,CAACkG,CAAD,CAAMpC,CAAN,CAAe,CAC9D,MAAO,CAAC,UAAAqC,KAAA,CAAgBF,CAAA,CAAcC,CAAd,CAAmBpC,CAAnB,CAAhB,CADsD,CAA/C,CAAjB,CAGA,OAAO9D,EAAAI,KAAA,CAAS,EAAT,CALa,CAJ8B,CAA1C,CA4CZ,KAAAgG,UAAA,CAAiBC,QAAQ,CAACD,CAAD,CAAY,CACnC,MAAIxG,EAAA0G,UAAA,CAAkBF,CAAlB,CAAJ,EACEL,CACO,CADMK,CACN,CAAA,IAFT,EAISL,CAL0B,CA/CV,CAoX7B,CAmIAnG,EAAAgG,OAAA,CAAe,YAAf,CAAAW,OAAA,CAAoC,OAApC,CAA6C,CAAC,WAAD,CAAc,QAAQ,CAACC,CAAD,CAAY,CAAA,IACzEC,EACE,yFAFuE,CAGzEC,EAAgB,WAHyD,CAKzEC,EAAc/G,CAAA6E,SAAA,CAAiB,OAAjB,CAL2D,CAMzEmC,EAAWhH,CAAAgH,SAEf,OAAO,SAAQ,CAACC,CAAD,CAAOC,CAAP,CAAe/E,CAAf,CAA2B,CAwBxCgF,QAASA,EAAO,CAACF,CAAD,CAAO,CAChBA,CAAL,EAGA9F,CAAAwC,KAAA,CAAUzD,CAAA,CAAa+G,CAAb,CAAV,CAJqB,CAOvBG,QAASA,EAAO,CAACC,CAAD,CAAMJ,CAAN,CAAY,CAC1B,IAAIjD,CACJ7C,EAAAwC,KAAA,CAAU,KAAV,CACI3D,EAAAsH,WAAA,CAAmBnF,CAAnB,CAAJ,GACEA,CADF,CACeA,CAAA,CAAWkF,CAAX,CADf,CAGA,IAAIrH,CAAAuH,SAAA,CAAiBpF,CAAjB,CAAJ,CACE,IAAK6B,CAAL,GAAY7B,EAAZ,CACEhB,CAAAwC,KAAA,CAAUK,CAAV;AAAgB,IAAhB,CAAuB7B,CAAA,CAAW6B,CAAX,CAAvB,CAAyC,IAAzC,CAFJ,KAKE7B,EAAA,CAAa,EAEX,EAAAnC,CAAA0G,UAAA,CAAkBQ,CAAlB,CAAJ,EAAmC,QAAnC,EAA+C/E,EAA/C,EACEhB,CAAAwC,KAAA,CAAU,UAAV,CACUuD,CADV,CAEU,IAFV,CAIF/F,EAAAwC,KAAA,CAAU,QAAV,CACU0D,CAAApE,QAAA,CAAY,IAAZ,CAAkB,QAAlB,CADV,CAEU,IAFV,CAGAkE,EAAA,CAAQF,CAAR,CACA9F,EAAAwC,KAAA,CAAU,MAAV,CAtB0B,CA9B5B,GAAY,IAAZ,EAAIsD,CAAJ,EAA6B,EAA7B,GAAoBA,CAApB,CAAiC,MAAOA,EACxC,IAAK,CAAAD,CAAA,CAASC,CAAT,CAAL,CAAqB,KAAMF,EAAA,CAAY,WAAZ,CAA8DE,CAA9D,CAAN,CAOrB,IAJA,IAAIO,EAAMP,CAAV,CACI9F,EAAO,EADX,CAEIkG,CAFJ,CAGItG,CACJ,CAAQ0G,CAAR,CAAgBD,CAAAC,MAAA,CAAUZ,CAAV,CAAhB,CAAA,CAEEQ,CAQA,CARMI,CAAA,CAAM,CAAN,CAQN,CANKA,CAAA,CAAM,CAAN,CAML,EANkBA,CAAA,CAAM,CAAN,CAMlB,GALEJ,CAKF,EALSI,CAAA,CAAM,CAAN,CAAA,CAAW,SAAX,CAAuB,SAKhC,EAL6CJ,CAK7C,EAHAtG,CAGA,CAHI0G,CAAAC,MAGJ,CAFAP,CAAA,CAAQK,CAAAG,OAAA,CAAW,CAAX,CAAc5G,CAAd,CAAR,CAEA,CADAqG,CAAA,CAAQC,CAAR,CAAaI,CAAA,CAAM,CAAN,CAAAxE,QAAA,CAAiB6D,CAAjB,CAAgC,EAAhC,CAAb,CACA,CAAAU,CAAA,CAAMA,CAAAI,UAAA,CAAc7G,CAAd,CAAkB0G,CAAA,CAAM,CAAN,CAAAzG,OAAlB,CAERmG,EAAA,CAAQK,CAAR,CACA,OAAOZ,EAAA,CAAUzF,CAAAX,KAAA,CAAU,EAAV,CAAV,CAtBiC,CARmC,CAAlC,CAA7C,CApoBsC,CAArC,CAAD,CAusBGT,MAvsBH,CAusBWA,MAAAC,QAvsBX;", +"sources":["angular-sanitize.js"], +"names":["window","angular","undefined","sanitizeText","chars","buf","htmlSanitizeWriter","writer","noop","join","toMap","str","lowercaseKeys","obj","items","split","i","length","lowercase","htmlParser","html","handler","inertBodyElement","innerHTML","mXSSAttempts","$sanitizeMinErr","document","documentMode","stripCustomNsAttrs","node","firstChild","nodeType","start","nodeName","toLowerCase","attrToMap","attributes","textContent","nextNode","end","nextSibling","parentNode","removeChild","attrs","map","ii","attr","name","value","encodeEntities","replace","SURROGATE_PAIR_REGEXP","hi","charCodeAt","low","NON_ALPHANUMERIC_REGEXP","uriValidator","ignoreCurrentElement","out","bind","push","tag","blockedElements","validElements","forEach","key","lkey","isImage","validAttrs","uriAttrs","voidElements","Node","ELEMENT_NODE","l","attrNode","attrName","indexOf","removeAttributeNode","$$minErr","optionalEndTagBlockElements","optionalEndTagInlineElements","optionalEndTagElements","extend","blockElements","inlineElements","svgElements","htmlAttrs","svgAttrs","implementation","doc","createHTMLDocument","bodyElements","getElementsByTagName","documentElement","getDocumentElement","createElement","appendChild","module","provider","$SanitizeProvider","svgEnabled","$get","$$sanitizeUri","uri","test","enableSvg","this.enableSvg","isDefined","filter","$sanitize","LINKY_URL_REGEXP","MAILTO_REGEXP","linkyMinErr","isString","text","target","addText","addLink","url","isFunction","isObject","raw","match","index","substr","substring"] +} diff --git a/www/lib/angular-sanitize/bower.json b/www/lib/angular-sanitize/bower.json new file mode 100644 index 0000000..008752d --- /dev/null +++ b/www/lib/angular-sanitize/bower.json @@ -0,0 +1,10 @@ +{ + "name": "angular-sanitize", + "version": "1.5.3", + "license": "MIT", + "main": "./angular-sanitize.js", + "ignore": [], + "dependencies": { + "angular": "1.5.3" + } +} diff --git a/www/lib/angular-sanitize/index.js b/www/lib/angular-sanitize/index.js new file mode 100644 index 0000000..dd5d22e --- /dev/null +++ b/www/lib/angular-sanitize/index.js @@ -0,0 +1,2 @@ +require('./angular-sanitize'); +module.exports = 'ngSanitize'; diff --git a/www/lib/angular-sanitize/package.json b/www/lib/angular-sanitize/package.json new file mode 100644 index 0000000..3be0b4f --- /dev/null +++ b/www/lib/angular-sanitize/package.json @@ -0,0 +1,26 @@ +{ + "name": "angular-sanitize", + "version": "1.5.3", + "description": "AngularJS module for sanitizing HTML", + "main": "index.js", + "scripts": { + "test": "echo \"Error: no test specified\" && exit 1" + }, + "repository": { + "type": "git", + "url": "https://github.com/angular/angular.js.git" + }, + "keywords": [ + "angular", + "framework", + "browser", + "html", + "client-side" + ], + "author": "Angular Core Team ", + "license": "MIT", + "bugs": { + "url": "https://github.com/angular/angular.js/issues" + }, + "homepage": "http://angularjs.org" +} diff --git a/www/lib/angular-ui-router/.bower.json b/www/lib/angular-ui-router/.bower.json new file mode 100644 index 0000000..879b42f --- /dev/null +++ b/www/lib/angular-ui-router/.bower.json @@ -0,0 +1,33 @@ +{ + "name": "angular-ui-router", + "version": "0.2.13", + "main": "./release/angular-ui-router.js", + "dependencies": { + "angular": ">= 1.0.8" + }, + "ignore": [ + "**/.*", + "node_modules", + "bower_components", + "component.json", + "package.json", + "lib", + "config", + "sample", + "test", + "tests", + "ngdoc_assets", + "Gruntfile.js", + "files.js" + ], + "homepage": "https://github.com/angular-ui/angular-ui-router-bower", + "_release": "0.2.13", + "_resolution": { + "type": "version", + "tag": "0.2.13", + "commit": "2e580f271defdec34f464aab0cca519e41d1ee33" + }, + "_source": "https://github.com/angular-ui/angular-ui-router-bower.git", + "_target": "0.2.13", + "_originalSource": "angular-ui-router" +} \ No newline at end of file diff --git a/www/lib/angular-ui-router/CHANGELOG.md b/www/lib/angular-ui-router/CHANGELOG.md new file mode 100644 index 0000000..e0848c3 --- /dev/null +++ b/www/lib/angular-ui-router/CHANGELOG.md @@ -0,0 +1,197 @@ + +### 0.2.13 (2014-11-20) + +This release primarily fixes issues reported against 0.2.12 + +#### Bug Fixes + +* **$state:** fix $state.includes/.is to apply param types before comparisions fix(uiSref): ma ([19715d15](https://github.com/angular-ui/ui-router/commit/19715d15e3cbfff724519e9febedd05b49c75baa), closes [#1513](https://github.com/angular-ui/ui-router/issues/1513)) + * Avoid re-synchronizing from url after .transitionTo ([b267ecd3](https://github.com/angular-ui/ui-router/commit/b267ecd348e5c415233573ef95ebdbd051875f52), closes [#1573](https://github.com/angular-ui/ui-router/issues/1573)) +* **$urlMatcherFactory:** + * Built-in date type uses local time zone ([d726bedc](https://github.com/angular-ui/ui-router/commit/d726bedcbb5f70a5660addf43fd52ec730790293)) + * make date type fn check .is before running ([aa94ce3b](https://github.com/angular-ui/ui-router/commit/aa94ce3b86632ad05301530a2213099da73a3dc0), closes [#1564](https://github.com/angular-ui/ui-router/issues/1564)) + * early binding of array handler bypasses type resolution ([ada4bc27](https://github.com/angular-ui/ui-router/commit/ada4bc27df5eff3ba3ab0de94a09bd91b0f7a28c)) + * add 'any' Type for non-encoding non-url params ([3bfd75ab](https://github.com/angular-ui/ui-router/commit/3bfd75ab445ee2f1dd55275465059ed116b10b27), closes [#1562](https://github.com/angular-ui/ui-router/issues/1562)) + * fix encoding slashes in params ([0c983a08](https://github.com/angular-ui/ui-router/commit/0c983a08e2947f999683571477debd73038e95cf), closes [#1119](https://github.com/angular-ui/ui-router/issues/1119)) + * fix mixed path/query params ordering problem ([a479fbd0](https://github.com/angular-ui/ui-router/commit/a479fbd0b8eb393a94320973e5b9a62d83912ee2), closes [#1543](https://github.com/angular-ui/ui-router/issues/1543)) +* **ArrayType:** + * specify empty array mapping corner case ([74aa6091](https://github.com/angular-ui/ui-router/commit/74aa60917e996b0b4e27bbb4eb88c3c03832021d), closes [#1511](https://github.com/angular-ui/ui-router/issues/1511)) + * fix .equals for array types ([5e6783b7](https://github.com/angular-ui/ui-router/commit/5e6783b77af9a90ddff154f990b43dbb17eeda6e), closes [#1538](https://github.com/angular-ui/ui-router/issues/1538)) +* **Param:** fix default value shorthand declaration ([831d812a](https://github.com/angular-ui/ui-router/commit/831d812a524524c71f0ee1c9afaf0487a5a66230), closes [#1554](https://github.com/angular-ui/ui-router/issues/1554)) +* **common:** fixed the _.filter clone to not create sparse arrays ([750f5cf5](https://github.com/angular-ui/ui-router/commit/750f5cf5fd91f9ada96f39e50d39aceb2caf22b6), closes [#1563](https://github.com/angular-ui/ui-router/issues/1563)) +* **ie8:** fix calls to indexOf and filter ([dcb31b84](https://github.com/angular-ui/ui-router/commit/dcb31b843391b3e61dee4de13f368c109541813e), closes [#1556](https://github.com/angular-ui/ui-router/issues/1556)) + + +#### Features + +* add json parameter Type ([027f1fcf](https://github.com/angular-ui/ui-router/commit/027f1fcf9c0916cea651e88981345da6f9ff214a)) + + + +### 0.2.12 (2014-11-13) + +#### Bug Fixes + +* **$resolve:** use resolve fn result, not parent resolved value of same name ([67f5e00c](https://github.com/angular-ui/ui-router/commit/67f5e00cc9aa006ce3fe6cde9dff261c28eab70a), closes [#1317], [#1353]) +* **$state:** + * populate default params in .transitionTo. ([3f60fbe6](https://github.com/angular-ui/ui-router/commit/3f60fbe6d65ebeca8d97952c05aa1d269f1b7ba1), closes [#1396]) + * reload() now reinvokes controllers ([73443420](https://github.com/angular-ui/ui-router/commit/7344342018847902594dc1fc62d30a5c30f01763), closes [#582]) + * do not emit $viewContentLoading if notify: false ([74255feb](https://github.com/angular-ui/ui-router/commit/74255febdf48ae082a02ca1e735165f2c369a463), closes [#1387](https://github.com/angular-ui/ui-router/issues/1387)) + * register states at config-time ([4533fe36](https://github.com/angular-ui/ui-router/commit/4533fe36e0ab2f0143edd854a4145deaa013915a)) + * handle parent.name when parent is obj ([4533fe36](https://github.com/angular-ui/ui-router/commit/4533fe36e0ab2f0143edd854a4145deaa013915a)) +* **$urlMatcherFactory:** + * register types at config ([4533fe36](https://github.com/angular-ui/ui-router/commit/4533fe36e0ab2f0143edd854a4145deaa013915a), closes [#1476]) + * made path params default value "" for backwards compat ([8f998e71](https://github.com/angular-ui/ui-router/commit/8f998e71e43a0b31293331c981f5db0f0097b8ba)) + * Pre-replace certain param values for better mapping ([6374a3e2](https://github.com/angular-ui/ui-router/commit/6374a3e29ab932014a7c77d2e1ab884cc841a2e3)) + * fixed ParamSet.$$keys() ordering ([9136fecb](https://github.com/angular-ui/ui-router/commit/9136fecbc2bfd4fda748a9914f0225a46c933860)) + * empty string policy now respected in Param.value() ([db12c85c](https://github.com/angular-ui/ui-router/commit/db12c85c16f2d105415f9bbbdeb11863f64728e0)) + * "string" type now encodes/decodes slashes ([3045e415](https://github.com/angular-ui/ui-router/commit/3045e41577a8b8b8afc6039f42adddf5f3c061ec), closes [#1119]) + * allow arrays in both path and query params ([fdd2f2c1](https://github.com/angular-ui/ui-router/commit/fdd2f2c191c4a67c874fdb9ec9a34f8dde9ad180), closes [#1073], [#1045], [#1486], [#1394]) + * typed params in search ([8d4cab69](https://github.com/angular-ui/ui-router/commit/8d4cab69dd67058e1a716892cc37b7d80a57037f), closes [#1488](https://github.com/angular-ui/ui-router/issues/1488)) + * no longer generate unroutable urls ([cb9fd9d8](https://github.com/angular-ui/ui-router/commit/cb9fd9d8943cb26c7223f6990db29c82ae8740f8), closes [#1487](https://github.com/angular-ui/ui-router/issues/1487)) + * handle optional parameter followed by required parameter in url format. ([efc72106](https://github.com/angular-ui/ui-router/commit/efc72106ddcc4774b48ea176a505ef9e95193b41)) + * default to parameter string coersion. ([13a468a7](https://github.com/angular-ui/ui-router/commit/13a468a7d54c2fb0751b94c0c1841d580b71e6dc), closes [#1414](https://github.com/angular-ui/ui-router/issues/1414)) + * concat respects strictMode/caseInsensitive ([dd72e103](https://github.com/angular-ui/ui-router/commit/dd72e103edb342d9cf802816fe127e1bbd68fd5f), closes [#1395]) +* **ui-sref:** + * Allow sref state options to take a scope object ([b5f7b596](https://github.com/angular-ui/ui-router/commit/b5f7b59692ce4933e2d63eb5df3f50a4ba68ccc0)) + * replace raw href modification with attrs. ([08c96782](https://github.com/angular-ui/ui-router/commit/08c96782faf881b0c7ab00afc233ee6729548fa0)) + * nagivate to state when url is "" fix($state.href): generate href for state with ([656b5aab](https://github.com/angular-ui/ui-router/commit/656b5aab906e5749db9b5a080c6a83b95f50fd91), closes [#1363](https://github.com/angular-ui/ui-router/issues/1363)) + * Check that state is defined in isMatch() ([92aebc75](https://github.com/angular-ui/ui-router/commit/92aebc7520f88babdc6e266536086e07263514c3), closes [#1314](https://github.com/angular-ui/ui-router/issues/1314), [#1332](https://github.com/angular-ui/ui-router/issues/1332)) +* **uiView:** + * allow inteprolated ui-view names ([81f6a19a](https://github.com/angular-ui/ui-router/commit/81f6a19a432dac9198fd33243855bfd3b4fea8c0), closes [#1324](https://github.com/angular-ui/ui-router/issues/1324)) + * Made anim work with angular 1.3 ([c3bb7ad9](https://github.com/angular-ui/ui-router/commit/c3bb7ad903da1e1f3c91019cfd255be8489ff4ef), closes [#1367](https://github.com/angular-ui/ui-router/issues/1367), [#1345](https://github.com/angular-ui/ui-router/issues/1345)) +* **urlRouter:** html5Mode accepts an object from angular v1.3.0-rc.3 ([7fea1e9d](https://github.com/angular-ui/ui-router/commit/7fea1e9d0d8c6e09cc6c895ecb93d4221e9adf48)) +* **stateFilters:** mark state filters as stateful. ([a00b353e](https://github.com/angular-ui/ui-router/commit/a00b353e3036f64a81245c4e7898646ba218f833), closes [#1479]) +* **ui-router:** re-add IE8 compatibility for map/filter/keys ([8ce69d9f](https://github.com/angular-ui/ui-router/commit/8ce69d9f7c886888ab53eca7e53536f36b428aae), closes [#1518], [#1383]) +* **package:** point 'main' to a valid filename ([ac903350](https://github.com/angular-ui/ui-router/commit/ac9033501debb63364539d91fbf3a0cba4579f8e)) +* **travis:** make CI build faster ([0531de05](https://github.com/angular-ui/ui-router/commit/0531de052e414a8d839fbb4e7635e923e94865b3)) + + +#### Features + +##### Default and Typed params + +This release includes a lot of bug fixes around default/optional and typed parameters. As such, 0.2.12 is the first release where we recommend those features be used. + +* **$state:** + * add state params validation ([b1379e6a](https://github.com/angular-ui/ui-router/commit/b1379e6a4d38f7ed7436e05873932d7c279af578), closes [#1433](https://github.com/angular-ui/ui-router/issues/1433)) + * is/includes/get work on relative stateOrName ([232e94b3](https://github.com/angular-ui/ui-router/commit/232e94b3c2ca2c764bb9510046e4b61690c87852)) + * .reload() returns state transition promise ([639e0565](https://github.com/angular-ui/ui-router/commit/639e0565dece9d5544cc93b3eee6e11c99bd7373)) +* **$templateFactory:** request templateURL as text/html ([ccd60769](https://github.com/angular-ui/ui-router/commit/ccd6076904a4b801d77b47f6e2de4c06ce9962f8), closes [#1287]) +* **$urlMatcherFactory:** Made a Params and ParamSet class ([0cc1e6cc](https://github.com/angular-ui/ui-router/commit/0cc1e6cc461a4640618e2bb594566551c54834e2)) + + + + +### 0.2.11 (2014-08-26) + + +#### Bug Fixes + +* **$resolve:** Resolves only inherit from immediate parent fixes #702 ([df34e20c](https://github.com/angular-ui/ui-router/commit/df34e20c576299e7a3c8bd4ebc68d42341c0ace9)) +* **$state:** + * change $state.href default options.inherit to true ([deea695f](https://github.com/angular-ui/ui-router/commit/deea695f5cacc55de351ab985144fd233c02a769)) + * sanity-check state lookups ([456fd5ae](https://github.com/angular-ui/ui-router/commit/456fd5aec9ea507518927bfabd62b4afad4cf714), closes [#980](https://github.com/angular-ui/ui-router/issues/980)) + * didn't comply to inherit parameter ([09836781](https://github.com/angular-ui/ui-router/commit/09836781f126c1c485b06551eb9cfd4fa0f45c35)) + * allow view content loading broadcast ([7b78edee](https://github.com/angular-ui/ui-router/commit/7b78edeeb52a74abf4d3f00f79534033d5a08d1a)) +* **$urlMatcherFactory:** + * detect injected functions ([91f75ae6](https://github.com/angular-ui/ui-router/commit/91f75ae66c4d129f6f69e53bd547594e9661f5d5)) + * syntax ([1ebed370](https://github.com/angular-ui/ui-router/commit/1ebed37069bae8614d41541d56521f5c45f703f3)) +* **UrlMatcher:** + * query param function defaults ([f9c20530](https://github.com/angular-ui/ui-router/commit/f9c205304f10d8a4ebe7efe9025e642016479a51)) + * don't decode default values ([63607bdb](https://github.com/angular-ui/ui-router/commit/63607bdbbcb432d3fb37856a1cb3da0cd496804e)) +* **travis:** update Node version to fix build ([d6b95ef2](https://github.com/angular-ui/ui-router/commit/d6b95ef23d9dacb4eba08897f5190a0bcddb3a48)) +* **uiSref:** + * Generate an href for states with a blank url. closes #1293 ([691745b1](https://github.com/angular-ui/ui-router/commit/691745b12fa05d3700dd28f0c8d25f8a105074ad)) + * should inherit params by default ([b973dad1](https://github.com/angular-ui/ui-router/commit/b973dad155ad09a7975e1476bd096f7b2c758eeb)) + * cancel transition if preventDefault() has been called ([2e6d9167](https://github.com/angular-ui/ui-router/commit/2e6d9167d3afbfbca6427e53e012f94fb5fb8022)) +* **uiView:** Fixed infinite loop when is called .go() from a controller. ([e13988b8](https://github.com/angular-ui/ui-router/commit/e13988b8cd6231d75c78876ee9d012cc87f4a8d9), closes [#1194](https://github.com/angular-ui/ui-router/issues/1194)) +* **docs:** + * Fixed link to milestones ([6c0ae500](https://github.com/angular-ui/ui-router/commit/6c0ae500cc238ea9fc95adcc15415c55fc9e1f33)) + * fix bug in decorator example ([4bd00af5](https://github.com/angular-ui/ui-router/commit/4bd00af50b8b88a49d1545a76290731cb8e0feb1)) + * Removed an incorrect semi-colon ([af97cef8](https://github.com/angular-ui/ui-router/commit/af97cef8b967f2e32177e539ef41450dca131a7d)) + * Explain return value of rule as function ([5e887890](https://github.com/angular-ui/ui-router/commit/5e8878900a6ffe59a81aed531a3925e34a297377)) + + +#### Features + +* **$state:** + * allow parameters to pass unharmed ([8939d057](https://github.com/angular-ui/ui-router/commit/8939d0572ab1316e458ef016317ecff53131a822)) + * **BREAKING CHANGE**: state parameters are no longer automatically coerced to strings, and unspecified parameter values are now set to undefined rather than null. + * allow prevent syncUrl on failure ([753060b9](https://github.com/angular-ui/ui-router/commit/753060b910d5d2da600a6fa0757976e401c33172)) +* **typescript:** Add typescript definitions for component builds ([521ceb3f](https://github.com/angular-ui/ui-router/commit/521ceb3fd7850646422f411921e21ce5e7d82e0f)) +* **uiSref:** extend syntax for ui-sref ([71cad3d6](https://github.com/angular-ui/ui-router/commit/71cad3d636508b5a9fe004775ad1f1adc0c80c3e)) +* **uiSrefActive:** + * Also activate for child states. ([bf163ad6](https://github.com/angular-ui/ui-router/commit/bf163ad6ce176ce28792696c8302d7cdf5c05a01), closes [#818](https://github.com/angular-ui/ui-router/issues/818)) + * **BREAKING CHANGE** Since ui-sref-active now activates even when child states are active you may need to swap out your ui-sref-active with ui-sref-active-eq, thought typically we think devs want the auto inheritance. + + * uiSrefActiveEq: new directive with old ui-sref-active behavior +* **$urlRouter:** + * defer URL change interception ([c72d8ce1](https://github.com/angular-ui/ui-router/commit/c72d8ce11916d0ac22c81b409c9e61d7048554d7)) + * force URLs to have valid params ([d48505cd](https://github.com/angular-ui/ui-router/commit/d48505cd328d83e39d5706e085ba319715f999a6)) + * abstract $location handling ([08b4636b](https://github.com/angular-ui/ui-router/commit/08b4636b294611f08db35f00641eb5211686fb50)) +* **$urlMatcherFactory:** + * fail on bad parameters ([d8f124c1](https://github.com/angular-ui/ui-router/commit/d8f124c10d00c7e5dde88c602d966db261aea221)) + * date type support ([b7f074ff](https://github.com/angular-ui/ui-router/commit/b7f074ff65ca150a3cdbda4d5ad6cb17107300eb)) + * implement type support ([450b1f0e](https://github.com/angular-ui/ui-router/commit/450b1f0e8e03c738174ff967f688b9a6373290f4)) +* **UrlMatcher:** + * handle query string arrays ([9cf764ef](https://github.com/angular-ui/ui-router/commit/9cf764efab45fa9309368688d535ddf6e96d6449), closes [#373](https://github.com/angular-ui/ui-router/issues/373)) + * injectable functions as defaults ([00966ecd](https://github.com/angular-ui/ui-router/commit/00966ecd91fb745846039160cab707bfca8b3bec)) + * default values & type decoding for query params ([a472b301](https://github.com/angular-ui/ui-router/commit/a472b301389fbe84d1c1fa9f24852b492a569d11)) + * allow shorthand definitions ([5b724304](https://github.com/angular-ui/ui-router/commit/5b7243049793505e44b6608ea09878c37c95b1f5)) + * validates whole interface ([32b27db1](https://github.com/angular-ui/ui-router/commit/32b27db173722e9194ef1d5c0ea7d93f25a98d11)) + * implement non-strict matching ([a3e21366](https://github.com/angular-ui/ui-router/commit/a3e21366bee0475c9795a1ec76f70eec41c5b4e3)) + * add per-param config support ([07b3029f](https://github.com/angular-ui/ui-router/commit/07b3029f4d409cf955780113df92e36401b47580)) + * **BREAKING CHANGE**: the `params` option in state configurations must now be an object keyed by parameter name. + +### 0.2.10 (2014-03-12) + + +#### Bug Fixes + +* **$state:** use $browser.baseHref() when generating urls with .href() ([cbcc8488](https://github.com/angular-ui/ui-router/commit/cbcc84887d6b6d35258adabb97c714cd9c1e272d)) +* **bower.json:** JS files should not be ignored ([ccdab193](https://github.com/angular-ui/ui-router/commit/ccdab193315f304eb3be5f5b97c47a926c79263e)) +* **dev:** karma:background task is missing, can't run grunt:dev. ([d9f7b898](https://github.com/angular-ui/ui-router/commit/d9f7b898e8e3abb8c846b0faa16a382913d7b22b)) +* **sample:** Contacts menu button not staying active when navigating to detail states. Need t ([2fcb8443](https://github.com/angular-ui/ui-router/commit/2fcb84437cb43ade12682a92b764f13cac77dfe7)) +* **uiSref:** support mock-clicks/events with no data ([717d3ff7](https://github.com/angular-ui/ui-router/commit/717d3ff7d0ba72d239892dee562b401cdf90e418)) +* **uiView:** + * Do NOT autoscroll when autoscroll attr is missing ([affe5bd7](https://github.com/angular-ui/ui-router/commit/affe5bd785cdc3f02b7a9f64a52e3900386ec3a0), closes [#807](https://github.com/angular-ui/ui-router/issues/807)) + * Refactoring uiView directive to copy ngView logic ([548fab6a](https://github.com/angular-ui/ui-router/commit/548fab6ab9debc9904c5865c8bc68b4fc3271dd0), closes [#857](https://github.com/angular-ui/ui-router/issues/857), [#552](https://github.com/angular-ui/ui-router/issues/552)) + + +#### Features + +* **$state:** includes() allows glob patterns for state matching. ([2d5f6b37](https://github.com/angular-ui/ui-router/commit/2d5f6b37191a3135f4a6d9e8f344c54edcdc065b)) +* **UrlMatcher:** Add support for case insensitive url matching ([642d5247](https://github.com/angular-ui/ui-router/commit/642d524799f604811e680331002feec7199a1fb5)) +* **uiSref:** add support for transition options ([2ed7a728](https://github.com/angular-ui/ui-router/commit/2ed7a728cee6854b38501fbc1df6139d3de5b28a)) +* **uiView:** add controllerAs config with function ([1ee7334a](https://github.com/angular-ui/ui-router/commit/1ee7334a73efeccc9b95340e315cdfd59944762d)) + + +### 0.2.9 (2014-01-17) + + +This release is identical to 0.2.8. 0.2.8 was re-tagged in git to fix a problem with bower. + + +### 0.2.8 (2014-01-16) + + +#### Bug Fixes + +* **$state:** allow null to be passed as 'params' param ([094dc30e](https://github.com/angular-ui/ui-router/commit/094dc30e883e1bd14e50a475553bafeaade3b178)) +* **$state.go:** param inheritance shouldn't inherit from siblings ([aea872e0](https://github.com/angular-ui/ui-router/commit/aea872e0b983cb433436ce5875df10c838fccedb)) +* **bower.json:** fixes bower.json ([eed3cc4d](https://github.com/angular-ui/ui-router/commit/eed3cc4d4dfef1d3ef84b9fd063127538ebf59d3)) +* **uiSrefActive:** annotate controller injection ([85921422](https://github.com/angular-ui/ui-router/commit/85921422ff7fb0effed358136426d616cce3d583), closes [#671](https://github.com/angular-ui/ui-router/issues/671)) +* **uiView:** + * autoscroll tests pass on 1.2.4 & 1.1.5 ([86eacac0](https://github.com/angular-ui/ui-router/commit/86eacac09ca5e9000bd3b9c7ba6e2cc95d883a3a)) + * don't animate initial load ([83b6634d](https://github.com/angular-ui/ui-router/commit/83b6634d27942ca74766b2b1244a7fc52c5643d9)) + * test pass against 1.0.8 and 1.2.4 ([a402415a](https://github.com/angular-ui/ui-router/commit/a402415a2a28b360c43b9fe8f4f54c540f6c33de)) + * it should autoscroll when expr is missing. ([8bb9e27a](https://github.com/angular-ui/ui-router/commit/8bb9e27a2986725f45daf44c4c9f846385095aff)) + + +#### Features + +* **uiSref:** add target attribute behaviour ([c12bf9a5](https://github.com/angular-ui/ui-router/commit/c12bf9a520d30d70294e3d82de7661900f8e394e)) +* **uiView:** + * merge autoscroll expression test. ([b89e0f87](https://github.com/angular-ui/ui-router/commit/b89e0f871d5cc35c10925ede986c10684d5c9252)) + * cache and test autoscroll expression ([ee262282](https://github.com/angular-ui/ui-router/commit/ee2622828c2ce83807f006a459ac4e11406d9258)) diff --git a/www/lib/angular-ui-router/CONTRIBUTING.md b/www/lib/angular-ui-router/CONTRIBUTING.md new file mode 100644 index 0000000..63829a5 --- /dev/null +++ b/www/lib/angular-ui-router/CONTRIBUTING.md @@ -0,0 +1,65 @@ + +# Report an Issue + +Help us make UI-Router better! If you think you might have found a bug, or some other weirdness, start by making sure +it hasn't already been reported. You can [search through existing issues](https://github.com/angular-ui/ui-router/search?q=wat%3F&type=Issues) +to see if someone's reported one similar to yours. + +If not, then [create a plunkr](http://bit.ly/UIR-Plunk) that demonstrates the problem (try to use as little code +as possible: the more minimalist, the faster we can debug it). + +Next, [create a new issue](https://github.com/angular-ui/ui-router/issues/new) that briefly explains the problem, +and provides a bit of background as to the circumstances that triggered it. Don't forget to include the link to +that plunkr you created! + +**Note**: If you're unsure how a feature is used, or are encountering some unexpected behavior that you aren't sure +is a bug, it's best to talk it out on +[StackOverflow](http://stackoverflow.com/questions/ask?tags=angularjs,angular-ui-router) before reporting it. This +keeps development streamlined, and helps us focus on building great software. + + +Issues only! | +-------------| +Please keep in mind that the issue tracker is for *issues*. Please do *not* post an issue if you need help or support. Instead, see one of the above-mentioned forums or [IRC](irc://irc.freenode.net/#angularjs). | + +####Purple Labels +A purple label means that **you** need to take some further action. + - ![Not Actionable - Need Info](http://angular-ui.github.io/ui-router/images/notactionable.png): Your issue is not specific enough, or there is no clear action that we can take. Please clarify and refine your issue. + - ![Plunkr Please](http://angular-ui.github.io/ui-router/images/plunkrplease.png): Please [create a plunkr](http://bit.ly/UIR-Plunk) + - ![StackOverflow](http://angular-ui.github.io/ui-router/images/stackoverflow.png): We suspect your issue is really a help request, or could be answered by the community. Please ask your question on [StackOverflow](http://stackoverflow.com/questions/ask?tags=angularjs,angular-ui-router). If you determine that is an actual issue, please explain why. + +If your issue gets labeled with purple label, no further action will be taken until you respond to the label appropriately. + +# Contribute + +**(1)** See the **[Developing](#developing)** section below, to get the development version of UI-Router up and running on your local machine. + +**(2)** Check out the [roadmap](https://github.com/angular-ui/ui-router/milestones) to see where the project is headed, and if your feature idea fits with where we're headed. + +**(3)** If you're not sure, [open an RFC](https://github.com/angular-ui/ui-router/issues/new?title=RFC:%20My%20idea) to get some feedback on your idea. + +**(4)** Finally, commit some code and open a pull request. Code & commits should abide by the following rules: + +- *Always* have test coverage for new features (or regression tests for bug fixes), and *never* break existing tests +- Commits should represent one logical change each; if a feature goes through multiple iterations, squash your commits down to one +- Make sure to follow the [Angular commit message format](https://github.com/angular/angular.js/blob/master/CONTRIBUTING.md#commit-message-format) so your change will appear in the changelog of the next release. +- Changes should always respect the coding style of the project + + + +# Developing + +UI-Router uses grunt >= 0.4.x. Make sure to upgrade your environment and read the +[Migration Guide](http://gruntjs.com/upgrading-from-0.3-to-0.4). + +Dependencies for building from source and running tests: + +* [grunt-cli](https://github.com/gruntjs/grunt-cli) - run: `$ npm install -g grunt-cli` +* Then, install the development dependencies by running `$ npm install` from the project directory + +There are a number of targets in the gruntfile that are used to generating different builds: + +* `grunt`: Perform a normal build, runs jshint and karma tests +* `grunt build`: Perform a normal build +* `grunt dist`: Perform a clean build and generate documentation +* `grunt dev`: Run dev server (sample app) and watch for changes, builds and runs karma tests on changes. diff --git a/www/lib/angular-ui-router/LICENSE b/www/lib/angular-ui-router/LICENSE new file mode 100644 index 0000000..939f8f8 --- /dev/null +++ b/www/lib/angular-ui-router/LICENSE @@ -0,0 +1,21 @@ +The MIT License + +Copyright (c) 2014 The AngularUI Team, Karsten Sperling + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. diff --git a/www/lib/angular-ui-router/README.md b/www/lib/angular-ui-router/README.md new file mode 100644 index 0000000..f02d83b --- /dev/null +++ b/www/lib/angular-ui-router/README.md @@ -0,0 +1,243 @@ +# AngularUI Router  [![Build Status](https://travis-ci.org/angular-ui/ui-router.svg?branch=master)](https://travis-ci.org/angular-ui/ui-router) + +#### The de-facto solution to flexible routing with nested views +--- +**[Download 0.2.11](http://angular-ui.github.io/ui-router/release/angular-ui-router.js)** (or **[Minified](http://angular-ui.github.io/ui-router/release/angular-ui-router.min.js)**) **|** +**[Guide](https://github.com/angular-ui/ui-router/wiki) |** +**[API](http://angular-ui.github.io/ui-router/site) |** +**[Sample](http://angular-ui.github.com/ui-router/sample/) ([Src](https://github.com/angular-ui/ui-router/tree/gh-pages/sample)) |** +**[FAQ](https://github.com/angular-ui/ui-router/wiki/Frequently-Asked-Questions) |** +**[Resources](#resources) |** +**[Report an Issue](https://github.com/angular-ui/ui-router/blob/master/CONTRIBUTING.md#report-an-issue) |** +**[Contribute](https://github.com/angular-ui/ui-router/blob/master/CONTRIBUTING.md#contribute) |** +**[Help!](http://stackoverflow.com/questions/ask?tags=angularjs,angular-ui-router) |** +**[Discuss](https://groups.google.com/forum/#!categories/angular-ui/router)** + +--- + +AngularUI Router is a routing framework for [AngularJS](http://angularjs.org), which allows you to organize the +parts of your interface into a [*state machine*](https://en.wikipedia.org/wiki/Finite-state_machine). Unlike the +[`$route` service](http://docs.angularjs.org/api/ngRoute.$route) in the Angular ngRoute module, which is organized around URL +routes, UI-Router is organized around [*states*](https://github.com/angular-ui/ui-router/wiki), +which may optionally have routes, as well as other behavior, attached. + +States are bound to *named*, *nested* and *parallel views*, allowing you to powerfully manage your application's interface. + +Check out the sample app: http://angular-ui.github.io/ui-router/sample/ + +- +**Note:** *UI-Router is under active development. As such, while this library is well-tested, the API may change. Consider using it in production applications only if you're comfortable following a changelog and updating your usage accordingly.* + + +## Get Started + +**(1)** Get UI-Router in one of the following ways: + - clone & [build](CONTRIBUTING.md#developing) this repository + - [download the release](http://angular-ui.github.io/ui-router/release/angular-ui-router.js) (or [minified](http://angular-ui.github.io/ui-router/release/angular-ui-router.min.js)) + - via **[Bower](http://bower.io/)**: by running `$ bower install angular-ui-router` from your console + - or via **[npm](https://www.npmjs.org/)**: by running `$ npm install angular-ui-router` from your console + - or via **[Component](https://github.com/component/component)**: by running `$ component install angular-ui/ui-router` from your console + +**(2)** Include `angular-ui-router.js` (or `angular-ui-router.min.js`) in your `index.html`, after including Angular itself (For Component users: ignore this step) + +**(3)** Add `'ui.router'` to your main module's list of dependencies (For Component users: replace `'ui.router'` with `require('angular-ui-router')`) + +When you're done, your setup should look similar to the following: + +> +```html + + + + + + + ... + + + ... + + +``` + +### [Nested States & Views](http://plnkr.co/edit/u18KQc?p=preview) + +The majority of UI-Router's power is in its ability to nest states & views. + +**(1)** First, follow the [setup](#get-started) instructions detailed above. + +**(2)** Then, add a [`ui-view` directive](https://github.com/angular-ui/ui-router/wiki/Quick-Reference#ui-view) to the `` of your app. + +> +```html + + +
+ + State 1 + State 2 + +``` + +**(3)** You'll notice we also added some links with [`ui-sref` directives](https://github.com/angular-ui/ui-router/wiki/Quick-Reference#ui-sref). In addition to managing state transitions, this directive auto-generates the `href` attribute of the `` element it's attached to, if the corresponding state has a URL. Next we'll add some templates. These will plug into the `ui-view` within `index.html`. Notice that they have their own `ui-view` as well! That is the key to nesting states and views. + +> +```html + +

State 1

+
+
Show List +
+``` +```html + +

State 2

+
+Show List +
+``` + +**(4)** Next, we'll add some child templates. *These* will get plugged into the `ui-view` of their parent state templates. + +> +```html + +

List of State 1 Items

+
    +
  • {{ item }}
  • +
+``` + +> +```html + +

List of State 2 Things

+
    +
  • {{ thing }}
  • +
+``` + +**(5)** Finally, we'll wire it all up with `$stateProvider`. Set up your states in the module config, as in the following: + + +> +```javascript +myApp.config(function($stateProvider, $urlRouterProvider) { + // + // For any unmatched url, redirect to /state1 + $urlRouterProvider.otherwise("/state1"); + // + // Now set up the states + $stateProvider + .state('state1', { + url: "/state1", + templateUrl: "partials/state1.html" + }) + .state('state1.list', { + url: "/list", + templateUrl: "partials/state1.list.html", + controller: function($scope) { + $scope.items = ["A", "List", "Of", "Items"]; + } + }) + .state('state2', { + url: "/state2", + templateUrl: "partials/state2.html" + }) + .state('state2.list', { + url: "/list", + templateUrl: "partials/state2.list.html", + controller: function($scope) { + $scope.things = ["A", "Set", "Of", "Things"]; + } + }); +}); +``` + +**(6)** See this quick start example in action. +>**[Go to Quick Start Plunker for Nested States & Views](http://plnkr.co/edit/u18KQc?p=preview)** + +**(7)** This only scratches the surface +>**[Dive Deeper!](https://github.com/angular-ui/ui-router/wiki)** + + +### [Multiple & Named Views](http://plnkr.co/edit/SDOcGS?p=preview) + +Another great feature is the ability to have multiple `ui-view`s view per template. + +**Pro Tip:** *While multiple parallel views are a powerful feature, you'll often be able to manage your +interfaces more effectively by nesting your views, and pairing those views with nested states.* + +**(1)** Follow the [setup](#get-started) instructions detailed above. + +**(2)** Add one or more `ui-view` to your app, give them names. +> +```html + + +
+
+ + Route 1 + Route 2 + +``` + +**(3)** Set up your states in the module config: +> +```javascript +myApp.config(function($stateProvider) { + $stateProvider + .state('index', { + url: "", + views: { + "viewA": { template: "index.viewA" }, + "viewB": { template: "index.viewB" } + } + }) + .state('route1', { + url: "/route1", + views: { + "viewA": { template: "route1.viewA" }, + "viewB": { template: "route1.viewB" } + } + }) + .state('route2', { + url: "/route2", + views: { + "viewA": { template: "route2.viewA" }, + "viewB": { template: "route2.viewB" } + } + }) +}); +``` + +**(4)** See this quick start example in action. +>**[Go to Quick Start Plunker for Multiple & Named Views](http://plnkr.co/edit/SDOcGS?p=preview)** + + +## Resources + +* [In-Depth Guide](https://github.com/angular-ui/ui-router/wiki) +* [API Reference](http://angular-ui.github.io/ui-router/site) +* [Sample App](http://angular-ui.github.com/ui-router/sample/) ([Source](https://github.com/angular-ui/ui-router/tree/gh-pages/sample)) +* [FAQ](https://github.com/angular-ui/ui-router/wiki/Frequently-Asked-Questions) +* [Slides comparing ngRoute to ui-router](http://slid.es/timkindberg/ui-router#/) +* [UI-Router Extras / Addons](http://christopherthielen.github.io/ui-router-extras/#/home) (@christopherthielen) + +### Videos + +* [Introduction Video](https://egghead.io/lessons/angularjs-introduction-ui-router) (egghead.io) +* [Tim Kindberg on Angular UI-Router](https://www.youtube.com/watch?v=lBqiZSemrqg) +* [Activating States](https://egghead.io/lessons/angularjs-ui-router-activating-states) (egghead.io) +* [Learn Angular.js using UI-Router](http://youtu.be/QETUuZ27N0w) (LearnCode.academy) + + + +## Reporting issues and Contributing + +Please read our [Contributor guidelines](CONTRIBUTING.md) before reporting an issue or creating a pull request. diff --git a/www/lib/angular-ui-router/api/angular-ui-router.d.ts b/www/lib/angular-ui-router/api/angular-ui-router.d.ts new file mode 100644 index 0000000..55c5d5e --- /dev/null +++ b/www/lib/angular-ui-router/api/angular-ui-router.d.ts @@ -0,0 +1,126 @@ +// Type definitions for Angular JS 1.1.5+ (ui.router module) +// Project: https://github.com/angular-ui/ui-router +// Definitions by: Michel Salib +// Definitions: https://github.com/borisyankov/DefinitelyTyped + +declare module ng.ui { + + interface IState { + name?: string; + template?: string; + templateUrl?: any; // string || () => string + templateProvider?: any; // () => string || IPromise + controller?: any; + controllerAs?: string; + controllerProvider?: any; + resolve?: {}; + url?: string; + params?: any; + views?: {}; + abstract?: boolean; + onEnter?: (...args: any[]) => void; + onExit?: (...args: any[]) => void; + data?: any; + reloadOnSearch?: boolean; + } + + interface ITypedState extends IState { + data?: T; + } + + interface IStateProvider extends IServiceProvider { + state(name: string, config: IState): IStateProvider; + state(config: IState): IStateProvider; + decorator(name?: string, decorator?: (state: IState, parent: Function) => any): any; + } + + interface IUrlMatcher { + concat(pattern: string): IUrlMatcher; + exec(path: string, searchParams: {}): {}; + parameters(): string[]; + format(values: {}): string; + } + + interface IUrlMatcherFactory { + compile(pattern: string): IUrlMatcher; + isMatcher(o: any): boolean; + } + + interface IUrlRouterProvider extends IServiceProvider { + when(whenPath: RegExp, handler: Function): IUrlRouterProvider; + when(whenPath: RegExp, handler: any[]): IUrlRouterProvider; + when(whenPath: RegExp, toPath: string): IUrlRouterProvider; + when(whenPath: IUrlMatcher, hanlder: Function): IUrlRouterProvider; + when(whenPath: IUrlMatcher, handler: any[]): IUrlRouterProvider; + when(whenPath: IUrlMatcher, toPath: string): IUrlRouterProvider; + when(whenPath: string, handler: Function): IUrlRouterProvider; + when(whenPath: string, handler: any[]): IUrlRouterProvider; + when(whenPath: string, toPath: string): IUrlRouterProvider; + otherwise(handler: Function): IUrlRouterProvider; + otherwise(handler: any[]): IUrlRouterProvider; + otherwise(path: string): IUrlRouterProvider; + rule(handler: Function): IUrlRouterProvider; + rule(handler: any[]): IUrlRouterProvider; + } + + interface IStateOptions { + location?: any; + inherit?: boolean; + relative?: IState; + notify?: boolean; + reload?: boolean; + } + + interface IHrefOptions { + lossy?: boolean; + inherit?: boolean; + relative?: IState; + absolute?: boolean; + } + + interface IStateService { + go(to: string, params?: {}, options?: IStateOptions): IPromise; + transitionTo(state: string, params?: {}, updateLocation?: boolean): void; + transitionTo(state: string, params?: {}, options?: IStateOptions): void; + includes(state: string, params?: {}): boolean; + is(state:string, params?: {}): boolean; + is(state: IState, params?: {}): boolean; + href(state: IState, params?: {}, options?: IHrefOptions): string; + href(state: string, params?: {}, options?: IHrefOptions): string; + get(state: string): IState; + get(): IState[]; + current: IState; + params: any; + reload(): void; + } + + interface IStateParamsService { + [key: string]: any; + } + + interface IStateParams { + [key: string]: any; + } + + interface IUrlRouterService { + /* + * Triggers an update; the same update that happens when the address bar + * url changes, aka $locationChangeSuccess. + * + * This method is useful when you need to use preventDefault() on the + * $locationChangeSuccess event, perform some custom logic (route protection, + * auth, config, redirection, etc) and then finally proceed with the transition + * by calling $urlRouter.sync(). + * + */ + sync(): void; + } + + interface IUiViewScrollProvider { + /* + * Reverts back to using the core $anchorScroll service for scrolling + * based on the url anchor. + */ + useAnchorScroll(): void; + } +} diff --git a/www/lib/angular-ui-router/bower.json b/www/lib/angular-ui-router/bower.json new file mode 100644 index 0000000..45e802a --- /dev/null +++ b/www/lib/angular-ui-router/bower.json @@ -0,0 +1,23 @@ +{ + "name": "angular-ui-router", + "version": "0.2.13", + "main": "./release/angular-ui-router.js", + "dependencies": { + "angular": ">= 1.0.8" + }, + "ignore": [ + "**/.*", + "node_modules", + "bower_components", + "component.json", + "package.json", + "lib", + "config", + "sample", + "test", + "tests", + "ngdoc_assets", + "Gruntfile.js", + "files.js" + ] +} diff --git a/www/lib/angular-ui-router/release/angular-ui-router.js b/www/lib/angular-ui-router/release/angular-ui-router.js new file mode 100644 index 0000000..d2636f8 --- /dev/null +++ b/www/lib/angular-ui-router/release/angular-ui-router.js @@ -0,0 +1,4232 @@ +/** + * State-based routing for AngularJS + * @version v0.2.13 + * @link http://angular-ui.github.com/ + * @license MIT License, http://www.opensource.org/licenses/MIT + */ + +/* commonjs package manager support (eg componentjs) */ +if (typeof module !== "undefined" && typeof exports !== "undefined" && module.exports === exports){ + module.exports = 'ui.router'; +} + +(function (window, angular, undefined) { +/*jshint globalstrict:true*/ +/*global angular:false*/ +'use strict'; + +var isDefined = angular.isDefined, + isFunction = angular.isFunction, + isString = angular.isString, + isObject = angular.isObject, + isArray = angular.isArray, + forEach = angular.forEach, + extend = angular.extend, + copy = angular.copy; + +function inherit(parent, extra) { + return extend(new (extend(function() {}, { prototype: parent }))(), extra); +} + +function merge(dst) { + forEach(arguments, function(obj) { + if (obj !== dst) { + forEach(obj, function(value, key) { + if (!dst.hasOwnProperty(key)) dst[key] = value; + }); + } + }); + return dst; +} + +/** + * Finds the common ancestor path between two states. + * + * @param {Object} first The first state. + * @param {Object} second The second state. + * @return {Array} Returns an array of state names in descending order, not including the root. + */ +function ancestors(first, second) { + var path = []; + + for (var n in first.path) { + if (first.path[n] !== second.path[n]) break; + path.push(first.path[n]); + } + return path; +} + +/** + * IE8-safe wrapper for `Object.keys()`. + * + * @param {Object} object A JavaScript object. + * @return {Array} Returns the keys of the object as an array. + */ +function objectKeys(object) { + if (Object.keys) { + return Object.keys(object); + } + var result = []; + + angular.forEach(object, function(val, key) { + result.push(key); + }); + return result; +} + +/** + * IE8-safe wrapper for `Array.prototype.indexOf()`. + * + * @param {Array} array A JavaScript array. + * @param {*} value A value to search the array for. + * @return {Number} Returns the array index value of `value`, or `-1` if not present. + */ +function indexOf(array, value) { + if (Array.prototype.indexOf) { + return array.indexOf(value, Number(arguments[2]) || 0); + } + var len = array.length >>> 0, from = Number(arguments[2]) || 0; + from = (from < 0) ? Math.ceil(from) : Math.floor(from); + + if (from < 0) from += len; + + for (; from < len; from++) { + if (from in array && array[from] === value) return from; + } + return -1; +} + +/** + * Merges a set of parameters with all parameters inherited between the common parents of the + * current state and a given destination state. + * + * @param {Object} currentParams The value of the current state parameters ($stateParams). + * @param {Object} newParams The set of parameters which will be composited with inherited params. + * @param {Object} $current Internal definition of object representing the current state. + * @param {Object} $to Internal definition of object representing state to transition to. + */ +function inheritParams(currentParams, newParams, $current, $to) { + var parents = ancestors($current, $to), parentParams, inherited = {}, inheritList = []; + + for (var i in parents) { + if (!parents[i].params) continue; + parentParams = objectKeys(parents[i].params); + if (!parentParams.length) continue; + + for (var j in parentParams) { + if (indexOf(inheritList, parentParams[j]) >= 0) continue; + inheritList.push(parentParams[j]); + inherited[parentParams[j]] = currentParams[parentParams[j]]; + } + } + return extend({}, inherited, newParams); +} + +/** + * Performs a non-strict comparison of the subset of two objects, defined by a list of keys. + * + * @param {Object} a The first object. + * @param {Object} b The second object. + * @param {Array} keys The list of keys within each object to compare. If the list is empty or not specified, + * it defaults to the list of keys in `a`. + * @return {Boolean} Returns `true` if the keys match, otherwise `false`. + */ +function equalForKeys(a, b, keys) { + if (!keys) { + keys = []; + for (var n in a) keys.push(n); // Used instead of Object.keys() for IE8 compatibility + } + + for (var i=0; i + * + * + * + * + * + * + * + * + * + * + * + * + */ +angular.module('ui.router', ['ui.router.state']); + +angular.module('ui.router.compat', ['ui.router']); + +/** + * @ngdoc object + * @name ui.router.util.$resolve + * + * @requires $q + * @requires $injector + * + * @description + * Manages resolution of (acyclic) graphs of promises. + */ +$Resolve.$inject = ['$q', '$injector']; +function $Resolve( $q, $injector) { + + var VISIT_IN_PROGRESS = 1, + VISIT_DONE = 2, + NOTHING = {}, + NO_DEPENDENCIES = [], + NO_LOCALS = NOTHING, + NO_PARENT = extend($q.when(NOTHING), { $$promises: NOTHING, $$values: NOTHING }); + + + /** + * @ngdoc function + * @name ui.router.util.$resolve#study + * @methodOf ui.router.util.$resolve + * + * @description + * Studies a set of invocables that are likely to be used multiple times. + *
+   * $resolve.study(invocables)(locals, parent, self)
+   * 
+ * is equivalent to + *
+   * $resolve.resolve(invocables, locals, parent, self)
+   * 
+ * but the former is more efficient (in fact `resolve` just calls `study` + * internally). + * + * @param {object} invocables Invocable objects + * @return {function} a function to pass in locals, parent and self + */ + this.study = function (invocables) { + if (!isObject(invocables)) throw new Error("'invocables' must be an object"); + var invocableKeys = objectKeys(invocables || {}); + + // Perform a topological sort of invocables to build an ordered plan + var plan = [], cycle = [], visited = {}; + function visit(value, key) { + if (visited[key] === VISIT_DONE) return; + + cycle.push(key); + if (visited[key] === VISIT_IN_PROGRESS) { + cycle.splice(0, indexOf(cycle, key)); + throw new Error("Cyclic dependency: " + cycle.join(" -> ")); + } + visited[key] = VISIT_IN_PROGRESS; + + if (isString(value)) { + plan.push(key, [ function() { return $injector.get(value); }], NO_DEPENDENCIES); + } else { + var params = $injector.annotate(value); + forEach(params, function (param) { + if (param !== key && invocables.hasOwnProperty(param)) visit(invocables[param], param); + }); + plan.push(key, value, params); + } + + cycle.pop(); + visited[key] = VISIT_DONE; + } + forEach(invocables, visit); + invocables = cycle = visited = null; // plan is all that's required + + function isResolve(value) { + return isObject(value) && value.then && value.$$promises; + } + + return function (locals, parent, self) { + if (isResolve(locals) && self === undefined) { + self = parent; parent = locals; locals = null; + } + if (!locals) locals = NO_LOCALS; + else if (!isObject(locals)) { + throw new Error("'locals' must be an object"); + } + if (!parent) parent = NO_PARENT; + else if (!isResolve(parent)) { + throw new Error("'parent' must be a promise returned by $resolve.resolve()"); + } + + // To complete the overall resolution, we have to wait for the parent + // promise and for the promise for each invokable in our plan. + var resolution = $q.defer(), + result = resolution.promise, + promises = result.$$promises = {}, + values = extend({}, locals), + wait = 1 + plan.length/3, + merged = false; + + function done() { + // Merge parent values we haven't got yet and publish our own $$values + if (!--wait) { + if (!merged) merge(values, parent.$$values); + result.$$values = values; + result.$$promises = result.$$promises || true; // keep for isResolve() + delete result.$$inheritedValues; + resolution.resolve(values); + } + } + + function fail(reason) { + result.$$failure = reason; + resolution.reject(reason); + } + + // Short-circuit if parent has already failed + if (isDefined(parent.$$failure)) { + fail(parent.$$failure); + return result; + } + + if (parent.$$inheritedValues) { + merge(values, omit(parent.$$inheritedValues, invocableKeys)); + } + + // Merge parent values if the parent has already resolved, or merge + // parent promises and wait if the parent resolve is still in progress. + extend(promises, parent.$$promises); + if (parent.$$values) { + merged = merge(values, omit(parent.$$values, invocableKeys)); + result.$$inheritedValues = omit(parent.$$values, invocableKeys); + done(); + } else { + if (parent.$$inheritedValues) { + result.$$inheritedValues = omit(parent.$$inheritedValues, invocableKeys); + } + parent.then(done, fail); + } + + // Process each invocable in the plan, but ignore any where a local of the same name exists. + for (var i=0, ii=plan.length; i} The template html as a string, or a promise + * for that string. + */ + this.fromUrl = function (url, params) { + if (isFunction(url)) url = url(params); + if (url == null) return null; + else return $http + .get(url, { cache: $templateCache, headers: { Accept: 'text/html' }}) + .then(function(response) { return response.data; }); + }; + + /** + * @ngdoc function + * @name ui.router.util.$templateFactory#fromProvider + * @methodOf ui.router.util.$templateFactory + * + * @description + * Creates a template by invoking an injectable provider function. + * + * @param {Function} provider Function to invoke via `$injector.invoke` + * @param {Object} params Parameters for the template. + * @param {Object} locals Locals to pass to `invoke`. Defaults to + * `{ params: params }`. + * @return {string|Promise.} The template html as a string, or a promise + * for that string. + */ + this.fromProvider = function (provider, params, locals) { + return $injector.invoke(provider, null, locals || { params: params }); + }; +} + +angular.module('ui.router.util').service('$templateFactory', $TemplateFactory); + +var $$UMFP; // reference to $UrlMatcherFactoryProvider + +/** + * @ngdoc object + * @name ui.router.util.type:UrlMatcher + * + * @description + * Matches URLs against patterns and extracts named parameters from the path or the search + * part of the URL. A URL pattern consists of a path pattern, optionally followed by '?' and a list + * of search parameters. Multiple search parameter names are separated by '&'. Search parameters + * do not influence whether or not a URL is matched, but their values are passed through into + * the matched parameters returned by {@link ui.router.util.type:UrlMatcher#methods_exec exec}. + * + * Path parameter placeholders can be specified using simple colon/catch-all syntax or curly brace + * syntax, which optionally allows a regular expression for the parameter to be specified: + * + * * `':'` name - colon placeholder + * * `'*'` name - catch-all placeholder + * * `'{' name '}'` - curly placeholder + * * `'{' name ':' regexp|type '}'` - curly placeholder with regexp or type name. Should the + * regexp itself contain curly braces, they must be in matched pairs or escaped with a backslash. + * + * Parameter names may contain only word characters (latin letters, digits, and underscore) and + * must be unique within the pattern (across both path and search parameters). For colon + * placeholders or curly placeholders without an explicit regexp, a path parameter matches any + * number of characters other than '/'. For catch-all placeholders the path parameter matches + * any number of characters. + * + * Examples: + * + * * `'/hello/'` - Matches only if the path is exactly '/hello/'. There is no special treatment for + * trailing slashes, and patterns have to match the entire path, not just a prefix. + * * `'/user/:id'` - Matches '/user/bob' or '/user/1234!!!' or even '/user/' but not '/user' or + * '/user/bob/details'. The second path segment will be captured as the parameter 'id'. + * * `'/user/{id}'` - Same as the previous example, but using curly brace syntax. + * * `'/user/{id:[^/]*}'` - Same as the previous example. + * * `'/user/{id:[0-9a-fA-F]{1,8}}'` - Similar to the previous example, but only matches if the id + * parameter consists of 1 to 8 hex digits. + * * `'/files/{path:.*}'` - Matches any URL starting with '/files/' and captures the rest of the + * path into the parameter 'path'. + * * `'/files/*path'` - ditto. + * * `'/calendar/{start:date}'` - Matches "/calendar/2014-11-12" (because the pattern defined + * in the built-in `date` Type matches `2014-11-12`) and provides a Date object in $stateParams.start + * + * @param {string} pattern The pattern to compile into a matcher. + * @param {Object} config A configuration object hash: + * @param {Object=} parentMatcher Used to concatenate the pattern/config onto + * an existing UrlMatcher + * + * * `caseInsensitive` - `true` if URL matching should be case insensitive, otherwise `false`, the default value (for backward compatibility) is `false`. + * * `strict` - `false` if matching against a URL with a trailing slash should be treated as equivalent to a URL without a trailing slash, the default value is `true`. + * + * @property {string} prefix A static prefix of this pattern. The matcher guarantees that any + * URL matching this matcher (i.e. any string for which {@link ui.router.util.type:UrlMatcher#methods_exec exec()} returns + * non-null) will start with this prefix. + * + * @property {string} source The pattern that was passed into the constructor + * + * @property {string} sourcePath The path portion of the source property + * + * @property {string} sourceSearch The search portion of the source property + * + * @property {string} regex The constructed regex that will be used to match against the url when + * it is time to determine which url will match. + * + * @returns {Object} New `UrlMatcher` object + */ +function UrlMatcher(pattern, config, parentMatcher) { + config = extend({ params: {} }, isObject(config) ? config : {}); + + // Find all placeholders and create a compiled pattern, using either classic or curly syntax: + // '*' name + // ':' name + // '{' name '}' + // '{' name ':' regexp '}' + // The regular expression is somewhat complicated due to the need to allow curly braces + // inside the regular expression. The placeholder regexp breaks down as follows: + // ([:*])([\w\[\]]+) - classic placeholder ($1 / $2) (search version has - for snake-case) + // \{([\w\[\]]+)(?:\:( ... ))?\} - curly brace placeholder ($3) with optional regexp/type ... ($4) (search version has - for snake-case + // (?: ... | ... | ... )+ - the regexp consists of any number of atoms, an atom being either + // [^{}\\]+ - anything other than curly braces or backslash + // \\. - a backslash escape + // \{(?:[^{}\\]+|\\.)*\} - a matched set of curly braces containing other atoms + var placeholder = /([:*])([\w\[\]]+)|\{([\w\[\]]+)(?:\:((?:[^{}\\]+|\\.|\{(?:[^{}\\]+|\\.)*\})+))?\}/g, + searchPlaceholder = /([:]?)([\w\[\]-]+)|\{([\w\[\]-]+)(?:\:((?:[^{}\\]+|\\.|\{(?:[^{}\\]+|\\.)*\})+))?\}/g, + compiled = '^', last = 0, m, + segments = this.segments = [], + parentParams = parentMatcher ? parentMatcher.params : {}, + params = this.params = parentMatcher ? parentMatcher.params.$$new() : new $$UMFP.ParamSet(), + paramNames = []; + + function addParameter(id, type, config, location) { + paramNames.push(id); + if (parentParams[id]) return parentParams[id]; + if (!/^\w+(-+\w+)*(?:\[\])?$/.test(id)) throw new Error("Invalid parameter name '" + id + "' in pattern '" + pattern + "'"); + if (params[id]) throw new Error("Duplicate parameter name '" + id + "' in pattern '" + pattern + "'"); + params[id] = new $$UMFP.Param(id, type, config, location); + return params[id]; + } + + function quoteRegExp(string, pattern, squash) { + var surroundPattern = ['',''], result = string.replace(/[\\\[\]\^$*+?.()|{}]/g, "\\$&"); + if (!pattern) return result; + switch(squash) { + case false: surroundPattern = ['(', ')']; break; + case true: surroundPattern = ['?(', ')?']; break; + default: surroundPattern = ['(' + squash + "|", ')?']; break; + } + return result + surroundPattern[0] + pattern + surroundPattern[1]; + } + + this.source = pattern; + + // Split into static segments separated by path parameter placeholders. + // The number of segments is always 1 more than the number of parameters. + function matchDetails(m, isSearch) { + var id, regexp, segment, type, cfg, arrayMode; + id = m[2] || m[3]; // IE[78] returns '' for unmatched groups instead of null + cfg = config.params[id]; + segment = pattern.substring(last, m.index); + regexp = isSearch ? m[4] : m[4] || (m[1] == '*' ? '.*' : null); + type = $$UMFP.type(regexp || "string") || inherit($$UMFP.type("string"), { pattern: new RegExp(regexp) }); + return { + id: id, regexp: regexp, segment: segment, type: type, cfg: cfg + }; + } + + var p, param, segment; + while ((m = placeholder.exec(pattern))) { + p = matchDetails(m, false); + if (p.segment.indexOf('?') >= 0) break; // we're into the search part + + param = addParameter(p.id, p.type, p.cfg, "path"); + compiled += quoteRegExp(p.segment, param.type.pattern.source, param.squash); + segments.push(p.segment); + last = placeholder.lastIndex; + } + segment = pattern.substring(last); + + // Find any search parameter names and remove them from the last segment + var i = segment.indexOf('?'); + + if (i >= 0) { + var search = this.sourceSearch = segment.substring(i); + segment = segment.substring(0, i); + this.sourcePath = pattern.substring(0, last + i); + + if (search.length > 0) { + last = 0; + while ((m = searchPlaceholder.exec(search))) { + p = matchDetails(m, true); + param = addParameter(p.id, p.type, p.cfg, "search"); + last = placeholder.lastIndex; + // check if ?& + } + } + } else { + this.sourcePath = pattern; + this.sourceSearch = ''; + } + + compiled += quoteRegExp(segment) + (config.strict === false ? '\/?' : '') + '$'; + segments.push(segment); + + this.regexp = new RegExp(compiled, config.caseInsensitive ? 'i' : undefined); + this.prefix = segments[0]; + this.$$paramNames = paramNames; +} + +/** + * @ngdoc function + * @name ui.router.util.type:UrlMatcher#concat + * @methodOf ui.router.util.type:UrlMatcher + * + * @description + * Returns a new matcher for a pattern constructed by appending the path part and adding the + * search parameters of the specified pattern to this pattern. The current pattern is not + * modified. This can be understood as creating a pattern for URLs that are relative to (or + * suffixes of) the current pattern. + * + * @example + * The following two matchers are equivalent: + *
+ * new UrlMatcher('/user/{id}?q').concat('/details?date');
+ * new UrlMatcher('/user/{id}/details?q&date');
+ * 
+ * + * @param {string} pattern The pattern to append. + * @param {Object} config An object hash of the configuration for the matcher. + * @returns {UrlMatcher} A matcher for the concatenated pattern. + */ +UrlMatcher.prototype.concat = function (pattern, config) { + // Because order of search parameters is irrelevant, we can add our own search + // parameters to the end of the new pattern. Parse the new pattern by itself + // and then join the bits together, but it's much easier to do this on a string level. + var defaultConfig = { + caseInsensitive: $$UMFP.caseInsensitive(), + strict: $$UMFP.strictMode(), + squash: $$UMFP.defaultSquashPolicy() + }; + return new UrlMatcher(this.sourcePath + pattern + this.sourceSearch, extend(defaultConfig, config), this); +}; + +UrlMatcher.prototype.toString = function () { + return this.source; +}; + +/** + * @ngdoc function + * @name ui.router.util.type:UrlMatcher#exec + * @methodOf ui.router.util.type:UrlMatcher + * + * @description + * Tests the specified path against this matcher, and returns an object containing the captured + * parameter values, or null if the path does not match. The returned object contains the values + * of any search parameters that are mentioned in the pattern, but their value may be null if + * they are not present in `searchParams`. This means that search parameters are always treated + * as optional. + * + * @example + *
+ * new UrlMatcher('/user/{id}?q&r').exec('/user/bob', {
+ *   x: '1', q: 'hello'
+ * });
+ * // returns { id: 'bob', q: 'hello', r: null }
+ * 
+ * + * @param {string} path The URL path to match, e.g. `$location.path()`. + * @param {Object} searchParams URL search parameters, e.g. `$location.search()`. + * @returns {Object} The captured parameter values. + */ +UrlMatcher.prototype.exec = function (path, searchParams) { + var m = this.regexp.exec(path); + if (!m) return null; + searchParams = searchParams || {}; + + var paramNames = this.parameters(), nTotal = paramNames.length, + nPath = this.segments.length - 1, + values = {}, i, j, cfg, paramName; + + if (nPath !== m.length - 1) throw new Error("Unbalanced capture group in route '" + this.source + "'"); + + function decodePathArray(string) { + function reverseString(str) { return str.split("").reverse().join(""); } + function unquoteDashes(str) { return str.replace(/\\-/, "-"); } + + var split = reverseString(string).split(/-(?!\\)/); + var allReversed = map(split, reverseString); + return map(allReversed, unquoteDashes).reverse(); + } + + for (i = 0; i < nPath; i++) { + paramName = paramNames[i]; + var param = this.params[paramName]; + var paramVal = m[i+1]; + // if the param value matches a pre-replace pair, replace the value before decoding. + for (j = 0; j < param.replace; j++) { + if (param.replace[j].from === paramVal) paramVal = param.replace[j].to; + } + if (paramVal && param.array === true) paramVal = decodePathArray(paramVal); + values[paramName] = param.value(paramVal); + } + for (/**/; i < nTotal; i++) { + paramName = paramNames[i]; + values[paramName] = this.params[paramName].value(searchParams[paramName]); + } + + return values; +}; + +/** + * @ngdoc function + * @name ui.router.util.type:UrlMatcher#parameters + * @methodOf ui.router.util.type:UrlMatcher + * + * @description + * Returns the names of all path and search parameters of this pattern in an unspecified order. + * + * @returns {Array.} An array of parameter names. Must be treated as read-only. If the + * pattern has no parameters, an empty array is returned. + */ +UrlMatcher.prototype.parameters = function (param) { + if (!isDefined(param)) return this.$$paramNames; + return this.params[param] || null; +}; + +/** + * @ngdoc function + * @name ui.router.util.type:UrlMatcher#validate + * @methodOf ui.router.util.type:UrlMatcher + * + * @description + * Checks an object hash of parameters to validate their correctness according to the parameter + * types of this `UrlMatcher`. + * + * @param {Object} params The object hash of parameters to validate. + * @returns {boolean} Returns `true` if `params` validates, otherwise `false`. + */ +UrlMatcher.prototype.validates = function (params) { + return this.params.$$validates(params); +}; + +/** + * @ngdoc function + * @name ui.router.util.type:UrlMatcher#format + * @methodOf ui.router.util.type:UrlMatcher + * + * @description + * Creates a URL that matches this pattern by substituting the specified values + * for the path and search parameters. Null values for path parameters are + * treated as empty strings. + * + * @example + *
+ * new UrlMatcher('/user/{id}?q').format({ id:'bob', q:'yes' });
+ * // returns '/user/bob?q=yes'
+ * 
+ * + * @param {Object} values the values to substitute for the parameters in this pattern. + * @returns {string} the formatted URL (path and optionally search part). + */ +UrlMatcher.prototype.format = function (values) { + values = values || {}; + var segments = this.segments, params = this.parameters(), paramset = this.params; + if (!this.validates(values)) return null; + + var i, search = false, nPath = segments.length - 1, nTotal = params.length, result = segments[0]; + + function encodeDashes(str) { // Replace dashes with encoded "\-" + return encodeURIComponent(str).replace(/-/g, function(c) { return '%5C%' + c.charCodeAt(0).toString(16).toUpperCase(); }); + } + + for (i = 0; i < nTotal; i++) { + var isPathParam = i < nPath; + var name = params[i], param = paramset[name], value = param.value(values[name]); + var isDefaultValue = param.isOptional && param.type.equals(param.value(), value); + var squash = isDefaultValue ? param.squash : false; + var encoded = param.type.encode(value); + + if (isPathParam) { + var nextSegment = segments[i + 1]; + if (squash === false) { + if (encoded != null) { + if (isArray(encoded)) { + result += map(encoded, encodeDashes).join("-"); + } else { + result += encodeURIComponent(encoded); + } + } + result += nextSegment; + } else if (squash === true) { + var capture = result.match(/\/$/) ? /\/?(.*)/ : /(.*)/; + result += nextSegment.match(capture)[1]; + } else if (isString(squash)) { + result += squash + nextSegment; + } + } else { + if (encoded == null || (isDefaultValue && squash !== false)) continue; + if (!isArray(encoded)) encoded = [ encoded ]; + encoded = map(encoded, encodeURIComponent).join('&' + name + '='); + result += (search ? '&' : '?') + (name + '=' + encoded); + search = true; + } + } + + return result; +}; + +/** + * @ngdoc object + * @name ui.router.util.type:Type + * + * @description + * Implements an interface to define custom parameter types that can be decoded from and encoded to + * string parameters matched in a URL. Used by {@link ui.router.util.type:UrlMatcher `UrlMatcher`} + * objects when matching or formatting URLs, or comparing or validating parameter values. + * + * See {@link ui.router.util.$urlMatcherFactory#methods_type `$urlMatcherFactory#type()`} for more + * information on registering custom types. + * + * @param {Object} config A configuration object which contains the custom type definition. The object's + * properties will override the default methods and/or pattern in `Type`'s public interface. + * @example + *
+ * {
+ *   decode: function(val) { return parseInt(val, 10); },
+ *   encode: function(val) { return val && val.toString(); },
+ *   equals: function(a, b) { return this.is(a) && a === b; },
+ *   is: function(val) { return angular.isNumber(val) isFinite(val) && val % 1 === 0; },
+ *   pattern: /\d+/
+ * }
+ * 
+ * + * @property {RegExp} pattern The regular expression pattern used to match values of this type when + * coming from a substring of a URL. + * + * @returns {Object} Returns a new `Type` object. + */ +function Type(config) { + extend(this, config); +} + +/** + * @ngdoc function + * @name ui.router.util.type:Type#is + * @methodOf ui.router.util.type:Type + * + * @description + * Detects whether a value is of a particular type. Accepts a native (decoded) value + * and determines whether it matches the current `Type` object. + * + * @param {*} val The value to check. + * @param {string} key Optional. If the type check is happening in the context of a specific + * {@link ui.router.util.type:UrlMatcher `UrlMatcher`} object, this is the name of the + * parameter in which `val` is stored. Can be used for meta-programming of `Type` objects. + * @returns {Boolean} Returns `true` if the value matches the type, otherwise `false`. + */ +Type.prototype.is = function(val, key) { + return true; +}; + +/** + * @ngdoc function + * @name ui.router.util.type:Type#encode + * @methodOf ui.router.util.type:Type + * + * @description + * Encodes a custom/native type value to a string that can be embedded in a URL. Note that the + * return value does *not* need to be URL-safe (i.e. passed through `encodeURIComponent()`), it + * only needs to be a representation of `val` that has been coerced to a string. + * + * @param {*} val The value to encode. + * @param {string} key The name of the parameter in which `val` is stored. Can be used for + * meta-programming of `Type` objects. + * @returns {string} Returns a string representation of `val` that can be encoded in a URL. + */ +Type.prototype.encode = function(val, key) { + return val; +}; + +/** + * @ngdoc function + * @name ui.router.util.type:Type#decode + * @methodOf ui.router.util.type:Type + * + * @description + * Converts a parameter value (from URL string or transition param) to a custom/native value. + * + * @param {string} val The URL parameter value to decode. + * @param {string} key The name of the parameter in which `val` is stored. Can be used for + * meta-programming of `Type` objects. + * @returns {*} Returns a custom representation of the URL parameter value. + */ +Type.prototype.decode = function(val, key) { + return val; +}; + +/** + * @ngdoc function + * @name ui.router.util.type:Type#equals + * @methodOf ui.router.util.type:Type + * + * @description + * Determines whether two decoded values are equivalent. + * + * @param {*} a A value to compare against. + * @param {*} b A value to compare against. + * @returns {Boolean} Returns `true` if the values are equivalent/equal, otherwise `false`. + */ +Type.prototype.equals = function(a, b) { + return a == b; +}; + +Type.prototype.$subPattern = function() { + var sub = this.pattern.toString(); + return sub.substr(1, sub.length - 2); +}; + +Type.prototype.pattern = /.*/; + +Type.prototype.toString = function() { return "{Type:" + this.name + "}"; }; + +/* + * Wraps an existing custom Type as an array of Type, depending on 'mode'. + * e.g.: + * - urlmatcher pattern "/path?{queryParam[]:int}" + * - url: "/path?queryParam=1&queryParam=2 + * - $stateParams.queryParam will be [1, 2] + * if `mode` is "auto", then + * - url: "/path?queryParam=1 will create $stateParams.queryParam: 1 + * - url: "/path?queryParam=1&queryParam=2 will create $stateParams.queryParam: [1, 2] + */ +Type.prototype.$asArray = function(mode, isSearch) { + if (!mode) return this; + if (mode === "auto" && !isSearch) throw new Error("'auto' array mode is for query parameters only"); + return new ArrayType(this, mode); + + function ArrayType(type, mode) { + function bindTo(type, callbackName) { + return function() { + return type[callbackName].apply(type, arguments); + }; + } + + // Wrap non-array value as array + function arrayWrap(val) { return isArray(val) ? val : (isDefined(val) ? [ val ] : []); } + // Unwrap array value for "auto" mode. Return undefined for empty array. + function arrayUnwrap(val) { + switch(val.length) { + case 0: return undefined; + case 1: return mode === "auto" ? val[0] : val; + default: return val; + } + } + function falsey(val) { return !val; } + + // Wraps type (.is/.encode/.decode) functions to operate on each value of an array + function arrayHandler(callback, allTruthyMode) { + return function handleArray(val) { + val = arrayWrap(val); + var result = map(val, callback); + if (allTruthyMode === true) + return filter(result, falsey).length === 0; + return arrayUnwrap(result); + }; + } + + // Wraps type (.equals) functions to operate on each value of an array + function arrayEqualsHandler(callback) { + return function handleArray(val1, val2) { + var left = arrayWrap(val1), right = arrayWrap(val2); + if (left.length !== right.length) return false; + for (var i = 0; i < left.length; i++) { + if (!callback(left[i], right[i])) return false; + } + return true; + }; + } + + this.encode = arrayHandler(bindTo(type, 'encode')); + this.decode = arrayHandler(bindTo(type, 'decode')); + this.is = arrayHandler(bindTo(type, 'is'), true); + this.equals = arrayEqualsHandler(bindTo(type, 'equals')); + this.pattern = type.pattern; + this.$arrayMode = mode; + } +}; + + + +/** + * @ngdoc object + * @name ui.router.util.$urlMatcherFactory + * + * @description + * Factory for {@link ui.router.util.type:UrlMatcher `UrlMatcher`} instances. The factory + * is also available to providers under the name `$urlMatcherFactoryProvider`. + */ +function $UrlMatcherFactory() { + $$UMFP = this; + + var isCaseInsensitive = false, isStrictMode = true, defaultSquashPolicy = false; + + function valToString(val) { return val != null ? val.toString().replace(/\//g, "%2F") : val; } + function valFromString(val) { return val != null ? val.toString().replace(/%2F/g, "/") : val; } +// TODO: in 1.0, make string .is() return false if value is undefined by default. +// function regexpMatches(val) { /*jshint validthis:true */ return isDefined(val) && this.pattern.test(val); } + function regexpMatches(val) { /*jshint validthis:true */ return this.pattern.test(val); } + + var $types = {}, enqueue = true, typeQueue = [], injector, defaultTypes = { + string: { + encode: valToString, + decode: valFromString, + is: regexpMatches, + pattern: /[^/]*/ + }, + int: { + encode: valToString, + decode: function(val) { return parseInt(val, 10); }, + is: function(val) { return isDefined(val) && this.decode(val.toString()) === val; }, + pattern: /\d+/ + }, + bool: { + encode: function(val) { return val ? 1 : 0; }, + decode: function(val) { return parseInt(val, 10) !== 0; }, + is: function(val) { return val === true || val === false; }, + pattern: /0|1/ + }, + date: { + encode: function (val) { + if (!this.is(val)) + return undefined; + return [ val.getFullYear(), + ('0' + (val.getMonth() + 1)).slice(-2), + ('0' + val.getDate()).slice(-2) + ].join("-"); + }, + decode: function (val) { + if (this.is(val)) return val; + var match = this.capture.exec(val); + return match ? new Date(match[1], match[2] - 1, match[3]) : undefined; + }, + is: function(val) { return val instanceof Date && !isNaN(val.valueOf()); }, + equals: function (a, b) { return this.is(a) && this.is(b) && a.toISOString() === b.toISOString(); }, + pattern: /[0-9]{4}-(?:0[1-9]|1[0-2])-(?:0[1-9]|[1-2][0-9]|3[0-1])/, + capture: /([0-9]{4})-(0[1-9]|1[0-2])-(0[1-9]|[1-2][0-9]|3[0-1])/ + }, + json: { + encode: angular.toJson, + decode: angular.fromJson, + is: angular.isObject, + equals: angular.equals, + pattern: /[^/]*/ + }, + any: { // does not encode/decode + encode: angular.identity, + decode: angular.identity, + is: angular.identity, + equals: angular.equals, + pattern: /.*/ + } + }; + + function getDefaultConfig() { + return { + strict: isStrictMode, + caseInsensitive: isCaseInsensitive + }; + } + + function isInjectable(value) { + return (isFunction(value) || (isArray(value) && isFunction(value[value.length - 1]))); + } + + /** + * [Internal] Get the default value of a parameter, which may be an injectable function. + */ + $UrlMatcherFactory.$$getDefaultValue = function(config) { + if (!isInjectable(config.value)) return config.value; + if (!injector) throw new Error("Injectable functions cannot be called at configuration time"); + return injector.invoke(config.value); + }; + + /** + * @ngdoc function + * @name ui.router.util.$urlMatcherFactory#caseInsensitive + * @methodOf ui.router.util.$urlMatcherFactory + * + * @description + * Defines whether URL matching should be case sensitive (the default behavior), or not. + * + * @param {boolean} value `false` to match URL in a case sensitive manner; otherwise `true`; + * @returns {boolean} the current value of caseInsensitive + */ + this.caseInsensitive = function(value) { + if (isDefined(value)) + isCaseInsensitive = value; + return isCaseInsensitive; + }; + + /** + * @ngdoc function + * @name ui.router.util.$urlMatcherFactory#strictMode + * @methodOf ui.router.util.$urlMatcherFactory + * + * @description + * Defines whether URLs should match trailing slashes, or not (the default behavior). + * + * @param {boolean=} value `false` to match trailing slashes in URLs, otherwise `true`. + * @returns {boolean} the current value of strictMode + */ + this.strictMode = function(value) { + if (isDefined(value)) + isStrictMode = value; + return isStrictMode; + }; + + /** + * @ngdoc function + * @name ui.router.util.$urlMatcherFactory#defaultSquashPolicy + * @methodOf ui.router.util.$urlMatcherFactory + * + * @description + * Sets the default behavior when generating or matching URLs with default parameter values. + * + * @param {string} value A string that defines the default parameter URL squashing behavior. + * `nosquash`: When generating an href with a default parameter value, do not squash the parameter value from the URL + * `slash`: When generating an href with a default parameter value, squash (remove) the parameter value, and, if the + * parameter is surrounded by slashes, squash (remove) one slash from the URL + * any other string, e.g. "~": When generating an href with a default parameter value, squash (remove) + * the parameter value from the URL and replace it with this string. + */ + this.defaultSquashPolicy = function(value) { + if (!isDefined(value)) return defaultSquashPolicy; + if (value !== true && value !== false && !isString(value)) + throw new Error("Invalid squash policy: " + value + ". Valid policies: false, true, arbitrary-string"); + defaultSquashPolicy = value; + return value; + }; + + /** + * @ngdoc function + * @name ui.router.util.$urlMatcherFactory#compile + * @methodOf ui.router.util.$urlMatcherFactory + * + * @description + * Creates a {@link ui.router.util.type:UrlMatcher `UrlMatcher`} for the specified pattern. + * + * @param {string} pattern The URL pattern. + * @param {Object} config The config object hash. + * @returns {UrlMatcher} The UrlMatcher. + */ + this.compile = function (pattern, config) { + return new UrlMatcher(pattern, extend(getDefaultConfig(), config)); + }; + + /** + * @ngdoc function + * @name ui.router.util.$urlMatcherFactory#isMatcher + * @methodOf ui.router.util.$urlMatcherFactory + * + * @description + * Returns true if the specified object is a `UrlMatcher`, or false otherwise. + * + * @param {Object} object The object to perform the type check against. + * @returns {Boolean} Returns `true` if the object matches the `UrlMatcher` interface, by + * implementing all the same methods. + */ + this.isMatcher = function (o) { + if (!isObject(o)) return false; + var result = true; + + forEach(UrlMatcher.prototype, function(val, name) { + if (isFunction(val)) { + result = result && (isDefined(o[name]) && isFunction(o[name])); + } + }); + return result; + }; + + /** + * @ngdoc function + * @name ui.router.util.$urlMatcherFactory#type + * @methodOf ui.router.util.$urlMatcherFactory + * + * @description + * Registers a custom {@link ui.router.util.type:Type `Type`} object that can be used to + * generate URLs with typed parameters. + * + * @param {string} name The type name. + * @param {Object|Function} definition The type definition. See + * {@link ui.router.util.type:Type `Type`} for information on the values accepted. + * @param {Object|Function} definitionFn (optional) A function that is injected before the app + * runtime starts. The result of this function is merged into the existing `definition`. + * See {@link ui.router.util.type:Type `Type`} for information on the values accepted. + * + * @returns {Object} Returns `$urlMatcherFactoryProvider`. + * + * @example + * This is a simple example of a custom type that encodes and decodes items from an + * array, using the array index as the URL-encoded value: + * + *
+   * var list = ['John', 'Paul', 'George', 'Ringo'];
+   *
+   * $urlMatcherFactoryProvider.type('listItem', {
+   *   encode: function(item) {
+   *     // Represent the list item in the URL using its corresponding index
+   *     return list.indexOf(item);
+   *   },
+   *   decode: function(item) {
+   *     // Look up the list item by index
+   *     return list[parseInt(item, 10)];
+   *   },
+   *   is: function(item) {
+   *     // Ensure the item is valid by checking to see that it appears
+   *     // in the list
+   *     return list.indexOf(item) > -1;
+   *   }
+   * });
+   *
+   * $stateProvider.state('list', {
+   *   url: "/list/{item:listItem}",
+   *   controller: function($scope, $stateParams) {
+   *     console.log($stateParams.item);
+   *   }
+   * });
+   *
+   * // ...
+   *
+   * // Changes URL to '/list/3', logs "Ringo" to the console
+   * $state.go('list', { item: "Ringo" });
+   * 
+ * + * This is a more complex example of a type that relies on dependency injection to + * interact with services, and uses the parameter name from the URL to infer how to + * handle encoding and decoding parameter values: + * + *
+   * // Defines a custom type that gets a value from a service,
+   * // where each service gets different types of values from
+   * // a backend API:
+   * $urlMatcherFactoryProvider.type('dbObject', {}, function(Users, Posts) {
+   *
+   *   // Matches up services to URL parameter names
+   *   var services = {
+   *     user: Users,
+   *     post: Posts
+   *   };
+   *
+   *   return {
+   *     encode: function(object) {
+   *       // Represent the object in the URL using its unique ID
+   *       return object.id;
+   *     },
+   *     decode: function(value, key) {
+   *       // Look up the object by ID, using the parameter
+   *       // name (key) to call the correct service
+   *       return services[key].findById(value);
+   *     },
+   *     is: function(object, key) {
+   *       // Check that object is a valid dbObject
+   *       return angular.isObject(object) && object.id && services[key];
+   *     }
+   *     equals: function(a, b) {
+   *       // Check the equality of decoded objects by comparing
+   *       // their unique IDs
+   *       return a.id === b.id;
+   *     }
+   *   };
+   * });
+   *
+   * // In a config() block, you can then attach URLs with
+   * // type-annotated parameters:
+   * $stateProvider.state('users', {
+   *   url: "/users",
+   *   // ...
+   * }).state('users.item', {
+   *   url: "/{user:dbObject}",
+   *   controller: function($scope, $stateParams) {
+   *     // $stateParams.user will now be an object returned from
+   *     // the Users service
+   *   },
+   *   // ...
+   * });
+   * 
+ */ + this.type = function (name, definition, definitionFn) { + if (!isDefined(definition)) return $types[name]; + if ($types.hasOwnProperty(name)) throw new Error("A type named '" + name + "' has already been defined."); + + $types[name] = new Type(extend({ name: name }, definition)); + if (definitionFn) { + typeQueue.push({ name: name, def: definitionFn }); + if (!enqueue) flushTypeQueue(); + } + return this; + }; + + // `flushTypeQueue()` waits until `$urlMatcherFactory` is injected before invoking the queued `definitionFn`s + function flushTypeQueue() { + while(typeQueue.length) { + var type = typeQueue.shift(); + if (type.pattern) throw new Error("You cannot override a type's .pattern at runtime."); + angular.extend($types[type.name], injector.invoke(type.def)); + } + } + + // Register default types. Store them in the prototype of $types. + forEach(defaultTypes, function(type, name) { $types[name] = new Type(extend({name: name}, type)); }); + $types = inherit($types, {}); + + /* No need to document $get, since it returns this */ + this.$get = ['$injector', function ($injector) { + injector = $injector; + enqueue = false; + flushTypeQueue(); + + forEach(defaultTypes, function(type, name) { + if (!$types[name]) $types[name] = new Type(type); + }); + return this; + }]; + + this.Param = function Param(id, type, config, location) { + var self = this; + config = unwrapShorthand(config); + type = getType(config, type, location); + var arrayMode = getArrayMode(); + type = arrayMode ? type.$asArray(arrayMode, location === "search") : type; + if (type.name === "string" && !arrayMode && location === "path" && config.value === undefined) + config.value = ""; // for 0.2.x; in 0.3.0+ do not automatically default to "" + var isOptional = config.value !== undefined; + var squash = getSquashPolicy(config, isOptional); + var replace = getReplace(config, arrayMode, isOptional, squash); + + function unwrapShorthand(config) { + var keys = isObject(config) ? objectKeys(config) : []; + var isShorthand = indexOf(keys, "value") === -1 && indexOf(keys, "type") === -1 && + indexOf(keys, "squash") === -1 && indexOf(keys, "array") === -1; + if (isShorthand) config = { value: config }; + config.$$fn = isInjectable(config.value) ? config.value : function () { return config.value; }; + return config; + } + + function getType(config, urlType, location) { + if (config.type && urlType) throw new Error("Param '"+id+"' has two type configurations."); + if (urlType) return urlType; + if (!config.type) return (location === "config" ? $types.any : $types.string); + return config.type instanceof Type ? config.type : new Type(config.type); + } + + // array config: param name (param[]) overrides default settings. explicit config overrides param name. + function getArrayMode() { + var arrayDefaults = { array: (location === "search" ? "auto" : false) }; + var arrayParamNomenclature = id.match(/\[\]$/) ? { array: true } : {}; + return extend(arrayDefaults, arrayParamNomenclature, config).array; + } + + /** + * returns false, true, or the squash value to indicate the "default parameter url squash policy". + */ + function getSquashPolicy(config, isOptional) { + var squash = config.squash; + if (!isOptional || squash === false) return false; + if (!isDefined(squash) || squash == null) return defaultSquashPolicy; + if (squash === true || isString(squash)) return squash; + throw new Error("Invalid squash policy: '" + squash + "'. Valid policies: false, true, or arbitrary string"); + } + + function getReplace(config, arrayMode, isOptional, squash) { + var replace, configuredKeys, defaultPolicy = [ + { from: "", to: (isOptional || arrayMode ? undefined : "") }, + { from: null, to: (isOptional || arrayMode ? undefined : "") } + ]; + replace = isArray(config.replace) ? config.replace : []; + if (isString(squash)) + replace.push({ from: squash, to: undefined }); + configuredKeys = map(replace, function(item) { return item.from; } ); + return filter(defaultPolicy, function(item) { return indexOf(configuredKeys, item.from) === -1; }).concat(replace); + } + + /** + * [Internal] Get the default value of a parameter, which may be an injectable function. + */ + function $$getDefaultValue() { + if (!injector) throw new Error("Injectable functions cannot be called at configuration time"); + return injector.invoke(config.$$fn); + } + + /** + * [Internal] Gets the decoded representation of a value if the value is defined, otherwise, returns the + * default value, which may be the result of an injectable function. + */ + function $value(value) { + function hasReplaceVal(val) { return function(obj) { return obj.from === val; }; } + function $replace(value) { + var replacement = map(filter(self.replace, hasReplaceVal(value)), function(obj) { return obj.to; }); + return replacement.length ? replacement[0] : value; + } + value = $replace(value); + return isDefined(value) ? self.type.decode(value) : $$getDefaultValue(); + } + + function toString() { return "{Param:" + id + " " + type + " squash: '" + squash + "' optional: " + isOptional + "}"; } + + extend(this, { + id: id, + type: type, + location: location, + array: arrayMode, + squash: squash, + replace: replace, + isOptional: isOptional, + value: $value, + dynamic: undefined, + config: config, + toString: toString + }); + }; + + function ParamSet(params) { + extend(this, params || {}); + } + + ParamSet.prototype = { + $$new: function() { + return inherit(this, extend(new ParamSet(), { $$parent: this})); + }, + $$keys: function () { + var keys = [], chain = [], parent = this, + ignore = objectKeys(ParamSet.prototype); + while (parent) { chain.push(parent); parent = parent.$$parent; } + chain.reverse(); + forEach(chain, function(paramset) { + forEach(objectKeys(paramset), function(key) { + if (indexOf(keys, key) === -1 && indexOf(ignore, key) === -1) keys.push(key); + }); + }); + return keys; + }, + $$values: function(paramValues) { + var values = {}, self = this; + forEach(self.$$keys(), function(key) { + values[key] = self[key].value(paramValues && paramValues[key]); + }); + return values; + }, + $$equals: function(paramValues1, paramValues2) { + var equal = true, self = this; + forEach(self.$$keys(), function(key) { + var left = paramValues1 && paramValues1[key], right = paramValues2 && paramValues2[key]; + if (!self[key].type.equals(left, right)) equal = false; + }); + return equal; + }, + $$validates: function $$validate(paramValues) { + var result = true, isOptional, val, param, self = this; + + forEach(this.$$keys(), function(key) { + param = self[key]; + val = paramValues[key]; + isOptional = !val && param.isOptional; + result = result && (isOptional || !!param.type.is(val)); + }); + return result; + }, + $$parent: undefined + }; + + this.ParamSet = ParamSet; +} + +// Register as a provider so it's available to other providers +angular.module('ui.router.util').provider('$urlMatcherFactory', $UrlMatcherFactory); +angular.module('ui.router.util').run(['$urlMatcherFactory', function($urlMatcherFactory) { }]); + +/** + * @ngdoc object + * @name ui.router.router.$urlRouterProvider + * + * @requires ui.router.util.$urlMatcherFactoryProvider + * @requires $locationProvider + * + * @description + * `$urlRouterProvider` has the responsibility of watching `$location`. + * When `$location` changes it runs through a list of rules one by one until a + * match is found. `$urlRouterProvider` is used behind the scenes anytime you specify + * a url in a state configuration. All urls are compiled into a UrlMatcher object. + * + * There are several methods on `$urlRouterProvider` that make it useful to use directly + * in your module config. + */ +$UrlRouterProvider.$inject = ['$locationProvider', '$urlMatcherFactoryProvider']; +function $UrlRouterProvider( $locationProvider, $urlMatcherFactory) { + var rules = [], otherwise = null, interceptDeferred = false, listener; + + // Returns a string that is a prefix of all strings matching the RegExp + function regExpPrefix(re) { + var prefix = /^\^((?:\\[^a-zA-Z0-9]|[^\\\[\]\^$*+?.()|{}]+)*)/.exec(re.source); + return (prefix != null) ? prefix[1].replace(/\\(.)/g, "$1") : ''; + } + + // Interpolates matched values into a String.replace()-style pattern + function interpolate(pattern, match) { + return pattern.replace(/\$(\$|\d{1,2})/, function (m, what) { + return match[what === '$' ? 0 : Number(what)]; + }); + } + + /** + * @ngdoc function + * @name ui.router.router.$urlRouterProvider#rule + * @methodOf ui.router.router.$urlRouterProvider + * + * @description + * Defines rules that are used by `$urlRouterProvider` to find matches for + * specific URLs. + * + * @example + *
+   * var app = angular.module('app', ['ui.router.router']);
+   *
+   * app.config(function ($urlRouterProvider) {
+   *   // Here's an example of how you might allow case insensitive urls
+   *   $urlRouterProvider.rule(function ($injector, $location) {
+   *     var path = $location.path(),
+   *         normalized = path.toLowerCase();
+   *
+   *     if (path !== normalized) {
+   *       return normalized;
+   *     }
+   *   });
+   * });
+   * 
+ * + * @param {object} rule Handler function that takes `$injector` and `$location` + * services as arguments. You can use them to return a valid path as a string. + * + * @return {object} `$urlRouterProvider` - `$urlRouterProvider` instance + */ + this.rule = function (rule) { + if (!isFunction(rule)) throw new Error("'rule' must be a function"); + rules.push(rule); + return this; + }; + + /** + * @ngdoc object + * @name ui.router.router.$urlRouterProvider#otherwise + * @methodOf ui.router.router.$urlRouterProvider + * + * @description + * Defines a path that is used when an invalid route is requested. + * + * @example + *
+   * var app = angular.module('app', ['ui.router.router']);
+   *
+   * app.config(function ($urlRouterProvider) {
+   *   // if the path doesn't match any of the urls you configured
+   *   // otherwise will take care of routing the user to the
+   *   // specified url
+   *   $urlRouterProvider.otherwise('/index');
+   *
+   *   // Example of using function rule as param
+   *   $urlRouterProvider.otherwise(function ($injector, $location) {
+   *     return '/a/valid/url';
+   *   });
+   * });
+   * 
+ * + * @param {string|object} rule The url path you want to redirect to or a function + * rule that returns the url path. The function version is passed two params: + * `$injector` and `$location` services, and must return a url string. + * + * @return {object} `$urlRouterProvider` - `$urlRouterProvider` instance + */ + this.otherwise = function (rule) { + if (isString(rule)) { + var redirect = rule; + rule = function () { return redirect; }; + } + else if (!isFunction(rule)) throw new Error("'rule' must be a function"); + otherwise = rule; + return this; + }; + + + function handleIfMatch($injector, handler, match) { + if (!match) return false; + var result = $injector.invoke(handler, handler, { $match: match }); + return isDefined(result) ? result : true; + } + + /** + * @ngdoc function + * @name ui.router.router.$urlRouterProvider#when + * @methodOf ui.router.router.$urlRouterProvider + * + * @description + * Registers a handler for a given url matching. if handle is a string, it is + * treated as a redirect, and is interpolated according to the syntax of match + * (i.e. like `String.replace()` for `RegExp`, or like a `UrlMatcher` pattern otherwise). + * + * If the handler is a function, it is injectable. It gets invoked if `$location` + * matches. You have the option of inject the match object as `$match`. + * + * The handler can return + * + * - **falsy** to indicate that the rule didn't match after all, then `$urlRouter` + * will continue trying to find another one that matches. + * - **string** which is treated as a redirect and passed to `$location.url()` + * - **void** or any **truthy** value tells `$urlRouter` that the url was handled. + * + * @example + *
+   * var app = angular.module('app', ['ui.router.router']);
+   *
+   * app.config(function ($urlRouterProvider) {
+   *   $urlRouterProvider.when($state.url, function ($match, $stateParams) {
+   *     if ($state.$current.navigable !== state ||
+   *         !equalForKeys($match, $stateParams) {
+   *      $state.transitionTo(state, $match, false);
+   *     }
+   *   });
+   * });
+   * 
+ * + * @param {string|object} what The incoming path that you want to redirect. + * @param {string|object} handler The path you want to redirect your user to. + */ + this.when = function (what, handler) { + var redirect, handlerIsString = isString(handler); + if (isString(what)) what = $urlMatcherFactory.compile(what); + + if (!handlerIsString && !isFunction(handler) && !isArray(handler)) + throw new Error("invalid 'handler' in when()"); + + var strategies = { + matcher: function (what, handler) { + if (handlerIsString) { + redirect = $urlMatcherFactory.compile(handler); + handler = ['$match', function ($match) { return redirect.format($match); }]; + } + return extend(function ($injector, $location) { + return handleIfMatch($injector, handler, what.exec($location.path(), $location.search())); + }, { + prefix: isString(what.prefix) ? what.prefix : '' + }); + }, + regex: function (what, handler) { + if (what.global || what.sticky) throw new Error("when() RegExp must not be global or sticky"); + + if (handlerIsString) { + redirect = handler; + handler = ['$match', function ($match) { return interpolate(redirect, $match); }]; + } + return extend(function ($injector, $location) { + return handleIfMatch($injector, handler, what.exec($location.path())); + }, { + prefix: regExpPrefix(what) + }); + } + }; + + var check = { matcher: $urlMatcherFactory.isMatcher(what), regex: what instanceof RegExp }; + + for (var n in check) { + if (check[n]) return this.rule(strategies[n](what, handler)); + } + + throw new Error("invalid 'what' in when()"); + }; + + /** + * @ngdoc function + * @name ui.router.router.$urlRouterProvider#deferIntercept + * @methodOf ui.router.router.$urlRouterProvider + * + * @description + * Disables (or enables) deferring location change interception. + * + * If you wish to customize the behavior of syncing the URL (for example, if you wish to + * defer a transition but maintain the current URL), call this method at configuration time. + * Then, at run time, call `$urlRouter.listen()` after you have configured your own + * `$locationChangeSuccess` event handler. + * + * @example + *
+   * var app = angular.module('app', ['ui.router.router']);
+   *
+   * app.config(function ($urlRouterProvider) {
+   *
+   *   // Prevent $urlRouter from automatically intercepting URL changes;
+   *   // this allows you to configure custom behavior in between
+   *   // location changes and route synchronization:
+   *   $urlRouterProvider.deferIntercept();
+   *
+   * }).run(function ($rootScope, $urlRouter, UserService) {
+   *
+   *   $rootScope.$on('$locationChangeSuccess', function(e) {
+   *     // UserService is an example service for managing user state
+   *     if (UserService.isLoggedIn()) return;
+   *
+   *     // Prevent $urlRouter's default handler from firing
+   *     e.preventDefault();
+   *
+   *     UserService.handleLogin().then(function() {
+   *       // Once the user has logged in, sync the current URL
+   *       // to the router:
+   *       $urlRouter.sync();
+   *     });
+   *   });
+   *
+   *   // Configures $urlRouter's listener *after* your custom listener
+   *   $urlRouter.listen();
+   * });
+   * 
+ * + * @param {boolean} defer Indicates whether to defer location change interception. Passing + no parameter is equivalent to `true`. + */ + this.deferIntercept = function (defer) { + if (defer === undefined) defer = true; + interceptDeferred = defer; + }; + + /** + * @ngdoc object + * @name ui.router.router.$urlRouter + * + * @requires $location + * @requires $rootScope + * @requires $injector + * @requires $browser + * + * @description + * + */ + this.$get = $get; + $get.$inject = ['$location', '$rootScope', '$injector', '$browser']; + function $get( $location, $rootScope, $injector, $browser) { + + var baseHref = $browser.baseHref(), location = $location.url(), lastPushedUrl; + + function appendBasePath(url, isHtml5, absolute) { + if (baseHref === '/') return url; + if (isHtml5) return baseHref.slice(0, -1) + url; + if (absolute) return baseHref.slice(1) + url; + return url; + } + + // TODO: Optimize groups of rules with non-empty prefix into some sort of decision tree + function update(evt) { + if (evt && evt.defaultPrevented) return; + var ignoreUpdate = lastPushedUrl && $location.url() === lastPushedUrl; + lastPushedUrl = undefined; + if (ignoreUpdate) return true; + + function check(rule) { + var handled = rule($injector, $location); + + if (!handled) return false; + if (isString(handled)) $location.replace().url(handled); + return true; + } + var n = rules.length, i; + + for (i = 0; i < n; i++) { + if (check(rules[i])) return; + } + // always check otherwise last to allow dynamic updates to the set of rules + if (otherwise) check(otherwise); + } + + function listen() { + listener = listener || $rootScope.$on('$locationChangeSuccess', update); + return listener; + } + + if (!interceptDeferred) listen(); + + return { + /** + * @ngdoc function + * @name ui.router.router.$urlRouter#sync + * @methodOf ui.router.router.$urlRouter + * + * @description + * Triggers an update; the same update that happens when the address bar url changes, aka `$locationChangeSuccess`. + * This method is useful when you need to use `preventDefault()` on the `$locationChangeSuccess` event, + * perform some custom logic (route protection, auth, config, redirection, etc) and then finally proceed + * with the transition by calling `$urlRouter.sync()`. + * + * @example + *
+       * angular.module('app', ['ui.router'])
+       *   .run(function($rootScope, $urlRouter) {
+       *     $rootScope.$on('$locationChangeSuccess', function(evt) {
+       *       // Halt state change from even starting
+       *       evt.preventDefault();
+       *       // Perform custom logic
+       *       var meetsRequirement = ...
+       *       // Continue with the update and state transition if logic allows
+       *       if (meetsRequirement) $urlRouter.sync();
+       *     });
+       * });
+       * 
+ */ + sync: function() { + update(); + }, + + listen: function() { + return listen(); + }, + + update: function(read) { + if (read) { + location = $location.url(); + return; + } + if ($location.url() === location) return; + + $location.url(location); + $location.replace(); + }, + + push: function(urlMatcher, params, options) { + $location.url(urlMatcher.format(params || {})); + lastPushedUrl = options && options.$$avoidResync ? $location.url() : undefined; + if (options && options.replace) $location.replace(); + }, + + /** + * @ngdoc function + * @name ui.router.router.$urlRouter#href + * @methodOf ui.router.router.$urlRouter + * + * @description + * A URL generation method that returns the compiled URL for a given + * {@link ui.router.util.type:UrlMatcher `UrlMatcher`}, populated with the provided parameters. + * + * @example + *
+       * $bob = $urlRouter.href(new UrlMatcher("/about/:person"), {
+       *   person: "bob"
+       * });
+       * // $bob == "/about/bob";
+       * 
+ * + * @param {UrlMatcher} urlMatcher The `UrlMatcher` object which is used as the template of the URL to generate. + * @param {object=} params An object of parameter values to fill the matcher's required parameters. + * @param {object=} options Options object. The options are: + * + * - **`absolute`** - {boolean=false}, If true will generate an absolute url, e.g. "http://www.example.com/fullurl". + * + * @returns {string} Returns the fully compiled URL, or `null` if `params` fail validation against `urlMatcher` + */ + href: function(urlMatcher, params, options) { + if (!urlMatcher.validates(params)) return null; + + var isHtml5 = $locationProvider.html5Mode(); + if (angular.isObject(isHtml5)) { + isHtml5 = isHtml5.enabled; + } + + var url = urlMatcher.format(params); + options = options || {}; + + if (!isHtml5 && url !== null) { + url = "#" + $locationProvider.hashPrefix() + url; + } + url = appendBasePath(url, isHtml5, options.absolute); + + if (!options.absolute || !url) { + return url; + } + + var slash = (!isHtml5 && url ? '/' : ''), port = $location.port(); + port = (port === 80 || port === 443 ? '' : ':' + port); + + return [$location.protocol(), '://', $location.host(), port, slash, url].join(''); + } + }; + } +} + +angular.module('ui.router.router').provider('$urlRouter', $UrlRouterProvider); + +/** + * @ngdoc object + * @name ui.router.state.$stateProvider + * + * @requires ui.router.router.$urlRouterProvider + * @requires ui.router.util.$urlMatcherFactoryProvider + * + * @description + * The new `$stateProvider` works similar to Angular's v1 router, but it focuses purely + * on state. + * + * A state corresponds to a "place" in the application in terms of the overall UI and + * navigation. A state describes (via the controller / template / view properties) what + * the UI looks like and does at that place. + * + * States often have things in common, and the primary way of factoring out these + * commonalities in this model is via the state hierarchy, i.e. parent/child states aka + * nested states. + * + * The `$stateProvider` provides interfaces to declare these states for your app. + */ +$StateProvider.$inject = ['$urlRouterProvider', '$urlMatcherFactoryProvider']; +function $StateProvider( $urlRouterProvider, $urlMatcherFactory) { + + var root, states = {}, $state, queue = {}, abstractKey = 'abstract'; + + // Builds state properties from definition passed to registerState() + var stateBuilder = { + + // Derive parent state from a hierarchical name only if 'parent' is not explicitly defined. + // state.children = []; + // if (parent) parent.children.push(state); + parent: function(state) { + if (isDefined(state.parent) && state.parent) return findState(state.parent); + // regex matches any valid composite state name + // would match "contact.list" but not "contacts" + var compositeName = /^(.+)\.[^.]+$/.exec(state.name); + return compositeName ? findState(compositeName[1]) : root; + }, + + // inherit 'data' from parent and override by own values (if any) + data: function(state) { + if (state.parent && state.parent.data) { + state.data = state.self.data = extend({}, state.parent.data, state.data); + } + return state.data; + }, + + // Build a URLMatcher if necessary, either via a relative or absolute URL + url: function(state) { + var url = state.url, config = { params: state.params || {} }; + + if (isString(url)) { + if (url.charAt(0) == '^') return $urlMatcherFactory.compile(url.substring(1), config); + return (state.parent.navigable || root).url.concat(url, config); + } + + if (!url || $urlMatcherFactory.isMatcher(url)) return url; + throw new Error("Invalid url '" + url + "' in state '" + state + "'"); + }, + + // Keep track of the closest ancestor state that has a URL (i.e. is navigable) + navigable: function(state) { + return state.url ? state : (state.parent ? state.parent.navigable : null); + }, + + // Own parameters for this state. state.url.params is already built at this point. Create and add non-url params + ownParams: function(state) { + var params = state.url && state.url.params || new $$UMFP.ParamSet(); + forEach(state.params || {}, function(config, id) { + if (!params[id]) params[id] = new $$UMFP.Param(id, null, config, "config"); + }); + return params; + }, + + // Derive parameters for this state and ensure they're a super-set of parent's parameters + params: function(state) { + return state.parent && state.parent.params ? extend(state.parent.params.$$new(), state.ownParams) : new $$UMFP.ParamSet(); + }, + + // If there is no explicit multi-view configuration, make one up so we don't have + // to handle both cases in the view directive later. Note that having an explicit + // 'views' property will mean the default unnamed view properties are ignored. This + // is also a good time to resolve view names to absolute names, so everything is a + // straight lookup at link time. + views: function(state) { + var views = {}; + + forEach(isDefined(state.views) ? state.views : { '': state }, function (view, name) { + if (name.indexOf('@') < 0) name += '@' + state.parent.name; + views[name] = view; + }); + return views; + }, + + // Keep a full path from the root down to this state as this is needed for state activation. + path: function(state) { + return state.parent ? state.parent.path.concat(state) : []; // exclude root from path + }, + + // Speed up $state.contains() as it's used a lot + includes: function(state) { + var includes = state.parent ? extend({}, state.parent.includes) : {}; + includes[state.name] = true; + return includes; + }, + + $delegates: {} + }; + + function isRelative(stateName) { + return stateName.indexOf(".") === 0 || stateName.indexOf("^") === 0; + } + + function findState(stateOrName, base) { + if (!stateOrName) return undefined; + + var isStr = isString(stateOrName), + name = isStr ? stateOrName : stateOrName.name, + path = isRelative(name); + + if (path) { + if (!base) throw new Error("No reference point given for path '" + name + "'"); + base = findState(base); + + var rel = name.split("."), i = 0, pathLength = rel.length, current = base; + + for (; i < pathLength; i++) { + if (rel[i] === "" && i === 0) { + current = base; + continue; + } + if (rel[i] === "^") { + if (!current.parent) throw new Error("Path '" + name + "' not valid for state '" + base.name + "'"); + current = current.parent; + continue; + } + break; + } + rel = rel.slice(i).join("."); + name = current.name + (current.name && rel ? "." : "") + rel; + } + var state = states[name]; + + if (state && (isStr || (!isStr && (state === stateOrName || state.self === stateOrName)))) { + return state; + } + return undefined; + } + + function queueState(parentName, state) { + if (!queue[parentName]) { + queue[parentName] = []; + } + queue[parentName].push(state); + } + + function flushQueuedChildren(parentName) { + var queued = queue[parentName] || []; + while(queued.length) { + registerState(queued.shift()); + } + } + + function registerState(state) { + // Wrap a new object around the state so we can store our private details easily. + state = inherit(state, { + self: state, + resolve: state.resolve || {}, + toString: function() { return this.name; } + }); + + var name = state.name; + if (!isString(name) || name.indexOf('@') >= 0) throw new Error("State must have a valid name"); + if (states.hasOwnProperty(name)) throw new Error("State '" + name + "'' is already defined"); + + // Get parent name + var parentName = (name.indexOf('.') !== -1) ? name.substring(0, name.lastIndexOf('.')) + : (isString(state.parent)) ? state.parent + : (isObject(state.parent) && isString(state.parent.name)) ? state.parent.name + : ''; + + // If parent is not registered yet, add state to queue and register later + if (parentName && !states[parentName]) { + return queueState(parentName, state.self); + } + + for (var key in stateBuilder) { + if (isFunction(stateBuilder[key])) state[key] = stateBuilder[key](state, stateBuilder.$delegates[key]); + } + states[name] = state; + + // Register the state in the global state list and with $urlRouter if necessary. + if (!state[abstractKey] && state.url) { + $urlRouterProvider.when(state.url, ['$match', '$stateParams', function ($match, $stateParams) { + if ($state.$current.navigable != state || !equalForKeys($match, $stateParams)) { + $state.transitionTo(state, $match, { inherit: true, location: false }); + } + }]); + } + + // Register any queued children + flushQueuedChildren(name); + + return state; + } + + // Checks text to see if it looks like a glob. + function isGlob (text) { + return text.indexOf('*') > -1; + } + + // Returns true if glob matches current $state name. + function doesStateMatchGlob (glob) { + var globSegments = glob.split('.'), + segments = $state.$current.name.split('.'); + + //match greedy starts + if (globSegments[0] === '**') { + segments = segments.slice(indexOf(segments, globSegments[1])); + segments.unshift('**'); + } + //match greedy ends + if (globSegments[globSegments.length - 1] === '**') { + segments.splice(indexOf(segments, globSegments[globSegments.length - 2]) + 1, Number.MAX_VALUE); + segments.push('**'); + } + + if (globSegments.length != segments.length) { + return false; + } + + //match single stars + for (var i = 0, l = globSegments.length; i < l; i++) { + if (globSegments[i] === '*') { + segments[i] = '*'; + } + } + + return segments.join('') === globSegments.join(''); + } + + + // Implicit root state that is always active + root = registerState({ + name: '', + url: '^', + views: null, + 'abstract': true + }); + root.navigable = null; + + + /** + * @ngdoc function + * @name ui.router.state.$stateProvider#decorator + * @methodOf ui.router.state.$stateProvider + * + * @description + * Allows you to extend (carefully) or override (at your own peril) the + * `stateBuilder` object used internally by `$stateProvider`. This can be used + * to add custom functionality to ui-router, for example inferring templateUrl + * based on the state name. + * + * When passing only a name, it returns the current (original or decorated) builder + * function that matches `name`. + * + * The builder functions that can be decorated are listed below. Though not all + * necessarily have a good use case for decoration, that is up to you to decide. + * + * In addition, users can attach custom decorators, which will generate new + * properties within the state's internal definition. There is currently no clear + * use-case for this beyond accessing internal states (i.e. $state.$current), + * however, expect this to become increasingly relevant as we introduce additional + * meta-programming features. + * + * **Warning**: Decorators should not be interdependent because the order of + * execution of the builder functions in non-deterministic. Builder functions + * should only be dependent on the state definition object and super function. + * + * + * Existing builder functions and current return values: + * + * - **parent** `{object}` - returns the parent state object. + * - **data** `{object}` - returns state data, including any inherited data that is not + * overridden by own values (if any). + * - **url** `{object}` - returns a {@link ui.router.util.type:UrlMatcher UrlMatcher} + * or `null`. + * - **navigable** `{object}` - returns closest ancestor state that has a URL (aka is + * navigable). + * - **params** `{object}` - returns an array of state params that are ensured to + * be a super-set of parent's params. + * - **views** `{object}` - returns a views object where each key is an absolute view + * name (i.e. "viewName@stateName") and each value is the config object + * (template, controller) for the view. Even when you don't use the views object + * explicitly on a state config, one is still created for you internally. + * So by decorating this builder function you have access to decorating template + * and controller properties. + * - **ownParams** `{object}` - returns an array of params that belong to the state, + * not including any params defined by ancestor states. + * - **path** `{string}` - returns the full path from the root down to this state. + * Needed for state activation. + * - **includes** `{object}` - returns an object that includes every state that + * would pass a `$state.includes()` test. + * + * @example + *
+   * // Override the internal 'views' builder with a function that takes the state
+   * // definition, and a reference to the internal function being overridden:
+   * $stateProvider.decorator('views', function (state, parent) {
+   *   var result = {},
+   *       views = parent(state);
+   *
+   *   angular.forEach(views, function (config, name) {
+   *     var autoName = (state.name + '.' + name).replace('.', '/');
+   *     config.templateUrl = config.templateUrl || '/partials/' + autoName + '.html';
+   *     result[name] = config;
+   *   });
+   *   return result;
+   * });
+   *
+   * $stateProvider.state('home', {
+   *   views: {
+   *     'contact.list': { controller: 'ListController' },
+   *     'contact.item': { controller: 'ItemController' }
+   *   }
+   * });
+   *
+   * // ...
+   *
+   * $state.go('home');
+   * // Auto-populates list and item views with /partials/home/contact/list.html,
+   * // and /partials/home/contact/item.html, respectively.
+   * 
+ * + * @param {string} name The name of the builder function to decorate. + * @param {object} func A function that is responsible for decorating the original + * builder function. The function receives two parameters: + * + * - `{object}` - state - The state config object. + * - `{object}` - super - The original builder function. + * + * @return {object} $stateProvider - $stateProvider instance + */ + this.decorator = decorator; + function decorator(name, func) { + /*jshint validthis: true */ + if (isString(name) && !isDefined(func)) { + return stateBuilder[name]; + } + if (!isFunction(func) || !isString(name)) { + return this; + } + if (stateBuilder[name] && !stateBuilder.$delegates[name]) { + stateBuilder.$delegates[name] = stateBuilder[name]; + } + stateBuilder[name] = func; + return this; + } + + /** + * @ngdoc function + * @name ui.router.state.$stateProvider#state + * @methodOf ui.router.state.$stateProvider + * + * @description + * Registers a state configuration under a given state name. The stateConfig object + * has the following acceptable properties. + * + * @param {string} name A unique state name, e.g. "home", "about", "contacts". + * To create a parent/child state use a dot, e.g. "about.sales", "home.newest". + * @param {object} stateConfig State configuration object. + * @param {string|function=} stateConfig.template + * + * html template as a string or a function that returns + * an html template as a string which should be used by the uiView directives. This property + * takes precedence over templateUrl. + * + * If `template` is a function, it will be called with the following parameters: + * + * - {array.<object>} - state parameters extracted from the current $location.path() by + * applying the current state + * + *
template:
+   *   "

inline template definition

" + + * "
"
+ *
template: function(params) {
+   *       return "

generated template

"; }
+ *
+ * + * @param {string|function=} stateConfig.templateUrl + * + * + * path or function that returns a path to an html + * template that should be used by uiView. + * + * If `templateUrl` is a function, it will be called with the following parameters: + * + * - {array.<object>} - state parameters extracted from the current $location.path() by + * applying the current state + * + *
templateUrl: "home.html"
+ *
templateUrl: function(params) {
+   *     return myTemplates[params.pageId]; }
+ * + * @param {function=} stateConfig.templateProvider + * + * Provider function that returns HTML content string. + *
 templateProvider:
+   *       function(MyTemplateService, params) {
+   *         return MyTemplateService.getTemplate(params.pageId);
+   *       }
+ * + * @param {string|function=} stateConfig.controller + * + * + * Controller fn that should be associated with newly + * related scope or the name of a registered controller if passed as a string. + * Optionally, the ControllerAs may be declared here. + *
controller: "MyRegisteredController"
+ *
controller:
+   *     "MyRegisteredController as fooCtrl"}
+ *
controller: function($scope, MyService) {
+   *     $scope.data = MyService.getData(); }
+ * + * @param {function=} stateConfig.controllerProvider + * + * + * Injectable provider function that returns the actual controller or string. + *
controllerProvider:
+   *   function(MyResolveData) {
+   *     if (MyResolveData.foo)
+   *       return "FooCtrl"
+   *     else if (MyResolveData.bar)
+   *       return "BarCtrl";
+   *     else return function($scope) {
+   *       $scope.baz = "Qux";
+   *     }
+   *   }
+ * + * @param {string=} stateConfig.controllerAs + * + * + * A controller alias name. If present the controller will be + * published to scope under the controllerAs name. + *
controllerAs: "myCtrl"
+ * + * @param {object=} stateConfig.resolve + * + * + * An optional map<string, function> of dependencies which + * should be injected into the controller. If any of these dependencies are promises, + * the router will wait for them all to be resolved before the controller is instantiated. + * If all the promises are resolved successfully, the $stateChangeSuccess event is fired + * and the values of the resolved promises are injected into any controllers that reference them. + * If any of the promises are rejected the $stateChangeError event is fired. + * + * The map object is: + * + * - key - {string}: name of dependency to be injected into controller + * - factory - {string|function}: If string then it is alias for service. Otherwise if function, + * it is injected and return value it treated as dependency. If result is a promise, it is + * resolved before its value is injected into controller. + * + *
resolve: {
+   *     myResolve1:
+   *       function($http, $stateParams) {
+   *         return $http.get("/api/foos/"+stateParams.fooID);
+   *       }
+   *     }
+ * + * @param {string=} stateConfig.url + * + * + * A url fragment with optional parameters. When a state is navigated or + * transitioned to, the `$stateParams` service will be populated with any + * parameters that were passed. + * + * examples: + *
url: "/home"
+   * url: "/users/:userid"
+   * url: "/books/{bookid:[a-zA-Z_-]}"
+   * url: "/books/{categoryid:int}"
+   * url: "/books/{publishername:string}/{categoryid:int}"
+   * url: "/messages?before&after"
+   * url: "/messages?{before:date}&{after:date}"
+ * url: "/messages/:mailboxid?{before:date}&{after:date}" + * + * @param {object=} stateConfig.views + * + * an optional map<string, object> which defined multiple views, or targets views + * manually/explicitly. + * + * Examples: + * + * Targets three named `ui-view`s in the parent state's template + *
views: {
+   *     header: {
+   *       controller: "headerCtrl",
+   *       templateUrl: "header.html"
+   *     }, body: {
+   *       controller: "bodyCtrl",
+   *       templateUrl: "body.html"
+   *     }, footer: {
+   *       controller: "footCtrl",
+   *       templateUrl: "footer.html"
+   *     }
+   *   }
+ * + * Targets named `ui-view="header"` from grandparent state 'top''s template, and named `ui-view="body" from parent state's template. + *
views: {
+   *     'header@top': {
+   *       controller: "msgHeaderCtrl",
+   *       templateUrl: "msgHeader.html"
+   *     }, 'body': {
+   *       controller: "messagesCtrl",
+   *       templateUrl: "messages.html"
+   *     }
+   *   }
+ * + * @param {boolean=} [stateConfig.abstract=false] + * + * An abstract state will never be directly activated, + * but can provide inherited properties to its common children states. + *
abstract: true
+ * + * @param {function=} stateConfig.onEnter + * + * + * Callback function for when a state is entered. Good way + * to trigger an action or dispatch an event, such as opening a dialog. + * If minifying your scripts, make sure to explictly annotate this function, + * because it won't be automatically annotated by your build tools. + * + *
onEnter: function(MyService, $stateParams) {
+   *     MyService.foo($stateParams.myParam);
+   * }
+ * + * @param {function=} stateConfig.onExit + * + * + * Callback function for when a state is exited. Good way to + * trigger an action or dispatch an event, such as opening a dialog. + * If minifying your scripts, make sure to explictly annotate this function, + * because it won't be automatically annotated by your build tools. + * + *
onExit: function(MyService, $stateParams) {
+   *     MyService.cleanup($stateParams.myParam);
+   * }
+ * + * @param {boolean=} [stateConfig.reloadOnSearch=true] + * + * + * If `false`, will not retrigger the same state + * just because a search/query parameter has changed (via $location.search() or $location.hash()). + * Useful for when you'd like to modify $location.search() without triggering a reload. + *
reloadOnSearch: false
+ * + * @param {object=} stateConfig.data + * + * + * Arbitrary data object, useful for custom configuration. The parent state's `data` is + * prototypally inherited. In other words, adding a data property to a state adds it to + * the entire subtree via prototypal inheritance. + * + *
data: {
+   *     requiredRole: 'foo'
+   * } 
+ * + * @param {object=} stateConfig.params + * + * + * A map which optionally configures parameters declared in the `url`, or + * defines additional non-url parameters. For each parameter being + * configured, add a configuration object keyed to the name of the parameter. + * + * Each parameter configuration object may contain the following properties: + * + * - ** value ** - {object|function=}: specifies the default value for this + * parameter. This implicitly sets this parameter as optional. + * + * When UI-Router routes to a state and no value is + * specified for this parameter in the URL or transition, the + * default value will be used instead. If `value` is a function, + * it will be injected and invoked, and the return value used. + * + * *Note*: `undefined` is treated as "no default value" while `null` + * is treated as "the default value is `null`". + * + * *Shorthand*: If you only need to configure the default value of the + * parameter, you may use a shorthand syntax. In the **`params`** + * map, instead mapping the param name to a full parameter configuration + * object, simply set map it to the default parameter value, e.g.: + * + *
// define a parameter's default value
+   * params: {
+   *     param1: { value: "defaultValue" }
+   * }
+   * // shorthand default values
+   * params: {
+   *     param1: "defaultValue",
+   *     param2: "param2Default"
+   * }
+ * + * - ** array ** - {boolean=}: *(default: false)* If true, the param value will be + * treated as an array of values. If you specified a Type, the value will be + * treated as an array of the specified Type. Note: query parameter values + * default to a special `"auto"` mode. + * + * For query parameters in `"auto"` mode, if multiple values for a single parameter + * are present in the URL (e.g.: `/foo?bar=1&bar=2&bar=3`) then the values + * are mapped to an array (e.g.: `{ foo: [ '1', '2', '3' ] }`). However, if + * only one value is present (e.g.: `/foo?bar=1`) then the value is treated as single + * value (e.g.: `{ foo: '1' }`). + * + *
params: {
+   *     param1: { array: true }
+   * }
+ * + * - ** squash ** - {bool|string=}: `squash` configures how a default parameter value is represented in the URL when + * the current parameter value is the same as the default value. If `squash` is not set, it uses the + * configured default squash policy. + * (See {@link ui.router.util.$urlMatcherFactory#methods_defaultSquashPolicy `defaultSquashPolicy()`}) + * + * There are three squash settings: + * + * - false: The parameter's default value is not squashed. It is encoded and included in the URL + * - true: The parameter's default value is omitted from the URL. If the parameter is preceeded and followed + * by slashes in the state's `url` declaration, then one of those slashes are omitted. + * This can allow for cleaner looking URLs. + * - `""`: The parameter's default value is replaced with an arbitrary placeholder of your choice. + * + *
params: {
+   *     param1: {
+   *       value: "defaultId",
+   *       squash: true
+   * } }
+   * // squash "defaultValue" to "~"
+   * params: {
+   *     param1: {
+   *       value: "defaultValue",
+   *       squash: "~"
+   * } }
+   * 
+ * + * + * @example + *
+   * // Some state name examples
+   *
+   * // stateName can be a single top-level name (must be unique).
+   * $stateProvider.state("home", {});
+   *
+   * // Or it can be a nested state name. This state is a child of the
+   * // above "home" state.
+   * $stateProvider.state("home.newest", {});
+   *
+   * // Nest states as deeply as needed.
+   * $stateProvider.state("home.newest.abc.xyz.inception", {});
+   *
+   * // state() returns $stateProvider, so you can chain state declarations.
+   * $stateProvider
+   *   .state("home", {})
+   *   .state("about", {})
+   *   .state("contacts", {});
+   * 
+ * + */ + this.state = state; + function state(name, definition) { + /*jshint validthis: true */ + if (isObject(name)) definition = name; + else definition.name = name; + registerState(definition); + return this; + } + + /** + * @ngdoc object + * @name ui.router.state.$state + * + * @requires $rootScope + * @requires $q + * @requires ui.router.state.$view + * @requires $injector + * @requires ui.router.util.$resolve + * @requires ui.router.state.$stateParams + * @requires ui.router.router.$urlRouter + * + * @property {object} params A param object, e.g. {sectionId: section.id)}, that + * you'd like to test against the current active state. + * @property {object} current A reference to the state's config object. However + * you passed it in. Useful for accessing custom data. + * @property {object} transition Currently pending transition. A promise that'll + * resolve or reject. + * + * @description + * `$state` service is responsible for representing states as well as transitioning + * between them. It also provides interfaces to ask for current state or even states + * you're coming from. + */ + this.$get = $get; + $get.$inject = ['$rootScope', '$q', '$view', '$injector', '$resolve', '$stateParams', '$urlRouter', '$location', '$urlMatcherFactory']; + function $get( $rootScope, $q, $view, $injector, $resolve, $stateParams, $urlRouter, $location, $urlMatcherFactory) { + + var TransitionSuperseded = $q.reject(new Error('transition superseded')); + var TransitionPrevented = $q.reject(new Error('transition prevented')); + var TransitionAborted = $q.reject(new Error('transition aborted')); + var TransitionFailed = $q.reject(new Error('transition failed')); + + // Handles the case where a state which is the target of a transition is not found, and the user + // can optionally retry or defer the transition + function handleRedirect(redirect, state, params, options) { + /** + * @ngdoc event + * @name ui.router.state.$state#$stateNotFound + * @eventOf ui.router.state.$state + * @eventType broadcast on root scope + * @description + * Fired when a requested state **cannot be found** using the provided state name during transition. + * The event is broadcast allowing any handlers a single chance to deal with the error (usually by + * lazy-loading the unfound state). A special `unfoundState` object is passed to the listener handler, + * you can see its three properties in the example. You can use `event.preventDefault()` to abort the + * transition and the promise returned from `go` will be rejected with a `'transition aborted'` value. + * + * @param {Object} event Event object. + * @param {Object} unfoundState Unfound State information. Contains: `to, toParams, options` properties. + * @param {State} fromState Current state object. + * @param {Object} fromParams Current state params. + * + * @example + * + *
+       * // somewhere, assume lazy.state has not been defined
+       * $state.go("lazy.state", {a:1, b:2}, {inherit:false});
+       *
+       * // somewhere else
+       * $scope.$on('$stateNotFound',
+       * function(event, unfoundState, fromState, fromParams){
+       *     console.log(unfoundState.to); // "lazy.state"
+       *     console.log(unfoundState.toParams); // {a:1, b:2}
+       *     console.log(unfoundState.options); // {inherit:false} + default options
+       * })
+       * 
+ */ + var evt = $rootScope.$broadcast('$stateNotFound', redirect, state, params); + + if (evt.defaultPrevented) { + $urlRouter.update(); + return TransitionAborted; + } + + if (!evt.retry) { + return null; + } + + // Allow the handler to return a promise to defer state lookup retry + if (options.$retry) { + $urlRouter.update(); + return TransitionFailed; + } + var retryTransition = $state.transition = $q.when(evt.retry); + + retryTransition.then(function() { + if (retryTransition !== $state.transition) return TransitionSuperseded; + redirect.options.$retry = true; + return $state.transitionTo(redirect.to, redirect.toParams, redirect.options); + }, function() { + return TransitionAborted; + }); + $urlRouter.update(); + + return retryTransition; + } + + root.locals = { resolve: null, globals: { $stateParams: {} } }; + + $state = { + params: {}, + current: root.self, + $current: root, + transition: null + }; + + /** + * @ngdoc function + * @name ui.router.state.$state#reload + * @methodOf ui.router.state.$state + * + * @description + * A method that force reloads the current state. All resolves are re-resolved, events are not re-fired, + * and controllers reinstantiated (bug with controllers reinstantiating right now, fixing soon). + * + * @example + *
+     * var app angular.module('app', ['ui.router']);
+     *
+     * app.controller('ctrl', function ($scope, $state) {
+     *   $scope.reload = function(){
+     *     $state.reload();
+     *   }
+     * });
+     * 
+ * + * `reload()` is just an alias for: + *
+     * $state.transitionTo($state.current, $stateParams, { 
+     *   reload: true, inherit: false, notify: true
+     * });
+     * 
+ * + * @returns {promise} A promise representing the state of the new transition. See + * {@link ui.router.state.$state#methods_go $state.go}. + */ + $state.reload = function reload() { + return $state.transitionTo($state.current, $stateParams, { reload: true, inherit: false, notify: true }); + }; + + /** + * @ngdoc function + * @name ui.router.state.$state#go + * @methodOf ui.router.state.$state + * + * @description + * Convenience method for transitioning to a new state. `$state.go` calls + * `$state.transitionTo` internally but automatically sets options to + * `{ location: true, inherit: true, relative: $state.$current, notify: true }`. + * This allows you to easily use an absolute or relative to path and specify + * only the parameters you'd like to update (while letting unspecified parameters + * inherit from the currently active ancestor states). + * + * @example + *
+     * var app = angular.module('app', ['ui.router']);
+     *
+     * app.controller('ctrl', function ($scope, $state) {
+     *   $scope.changeState = function () {
+     *     $state.go('contact.detail');
+     *   };
+     * });
+     * 
+ * + * + * @param {string} to Absolute state name or relative state path. Some examples: + * + * - `$state.go('contact.detail')` - will go to the `contact.detail` state + * - `$state.go('^')` - will go to a parent state + * - `$state.go('^.sibling')` - will go to a sibling state + * - `$state.go('.child.grandchild')` - will go to grandchild state + * + * @param {object=} params A map of the parameters that will be sent to the state, + * will populate $stateParams. Any parameters that are not specified will be inherited from currently + * defined parameters. This allows, for example, going to a sibling state that shares parameters + * specified in a parent state. Parameter inheritance only works between common ancestor states, I.e. + * transitioning to a sibling will get you the parameters for all parents, transitioning to a child + * will get you all current parameters, etc. + * @param {object=} options Options object. The options are: + * + * - **`location`** - {boolean=true|string=} - If `true` will update the url in the location bar, if `false` + * will not. If string, must be `"replace"`, which will update url and also replace last history record. + * - **`inherit`** - {boolean=true}, If `true` will inherit url parameters from current url. + * - **`relative`** - {object=$state.$current}, When transitioning with relative path (e.g '^'), + * defines which state to be relative from. + * - **`notify`** - {boolean=true}, If `true` will broadcast $stateChangeStart and $stateChangeSuccess events. + * - **`reload`** (v0.2.5) - {boolean=false}, If `true` will force transition even if the state or params + * have not changed, aka a reload of the same state. It differs from reloadOnSearch because you'd + * use this when you want to force a reload when *everything* is the same, including search params. + * + * @returns {promise} A promise representing the state of the new transition. + * + * Possible success values: + * + * - $state.current + * + *
Possible rejection values: + * + * - 'transition superseded' - when a newer transition has been started after this one + * - 'transition prevented' - when `event.preventDefault()` has been called in a `$stateChangeStart` listener + * - 'transition aborted' - when `event.preventDefault()` has been called in a `$stateNotFound` listener or + * when a `$stateNotFound` `event.retry` promise errors. + * - 'transition failed' - when a state has been unsuccessfully found after 2 tries. + * - *resolve error* - when an error has occurred with a `resolve` + * + */ + $state.go = function go(to, params, options) { + return $state.transitionTo(to, params, extend({ inherit: true, relative: $state.$current }, options)); + }; + + /** + * @ngdoc function + * @name ui.router.state.$state#transitionTo + * @methodOf ui.router.state.$state + * + * @description + * Low-level method for transitioning to a new state. {@link ui.router.state.$state#methods_go $state.go} + * uses `transitionTo` internally. `$state.go` is recommended in most situations. + * + * @example + *
+     * var app = angular.module('app', ['ui.router']);
+     *
+     * app.controller('ctrl', function ($scope, $state) {
+     *   $scope.changeState = function () {
+     *     $state.transitionTo('contact.detail');
+     *   };
+     * });
+     * 
+ * + * @param {string} to State name. + * @param {object=} toParams A map of the parameters that will be sent to the state, + * will populate $stateParams. + * @param {object=} options Options object. The options are: + * + * - **`location`** - {boolean=true|string=} - If `true` will update the url in the location bar, if `false` + * will not. If string, must be `"replace"`, which will update url and also replace last history record. + * - **`inherit`** - {boolean=false}, If `true` will inherit url parameters from current url. + * - **`relative`** - {object=}, When transitioning with relative path (e.g '^'), + * defines which state to be relative from. + * - **`notify`** - {boolean=true}, If `true` will broadcast $stateChangeStart and $stateChangeSuccess events. + * - **`reload`** (v0.2.5) - {boolean=false}, If `true` will force transition even if the state or params + * have not changed, aka a reload of the same state. It differs from reloadOnSearch because you'd + * use this when you want to force a reload when *everything* is the same, including search params. + * + * @returns {promise} A promise representing the state of the new transition. See + * {@link ui.router.state.$state#methods_go $state.go}. + */ + $state.transitionTo = function transitionTo(to, toParams, options) { + toParams = toParams || {}; + options = extend({ + location: true, inherit: false, relative: null, notify: true, reload: false, $retry: false + }, options || {}); + + var from = $state.$current, fromParams = $state.params, fromPath = from.path; + var evt, toState = findState(to, options.relative); + + if (!isDefined(toState)) { + var redirect = { to: to, toParams: toParams, options: options }; + var redirectResult = handleRedirect(redirect, from.self, fromParams, options); + + if (redirectResult) { + return redirectResult; + } + + // Always retry once if the $stateNotFound was not prevented + // (handles either redirect changed or state lazy-definition) + to = redirect.to; + toParams = redirect.toParams; + options = redirect.options; + toState = findState(to, options.relative); + + if (!isDefined(toState)) { + if (!options.relative) throw new Error("No such state '" + to + "'"); + throw new Error("Could not resolve '" + to + "' from state '" + options.relative + "'"); + } + } + if (toState[abstractKey]) throw new Error("Cannot transition to abstract state '" + to + "'"); + if (options.inherit) toParams = inheritParams($stateParams, toParams || {}, $state.$current, toState); + if (!toState.params.$$validates(toParams)) return TransitionFailed; + + toParams = toState.params.$$values(toParams); + to = toState; + + var toPath = to.path; + + // Starting from the root of the path, keep all levels that haven't changed + var keep = 0, state = toPath[keep], locals = root.locals, toLocals = []; + + if (!options.reload) { + while (state && state === fromPath[keep] && state.ownParams.$$equals(toParams, fromParams)) { + locals = toLocals[keep] = state.locals; + keep++; + state = toPath[keep]; + } + } + + // If we're going to the same state and all locals are kept, we've got nothing to do. + // But clear 'transition', as we still want to cancel any other pending transitions. + // TODO: We may not want to bump 'transition' if we're called from a location change + // that we've initiated ourselves, because we might accidentally abort a legitimate + // transition initiated from code? + if (shouldTriggerReload(to, from, locals, options)) { + if (to.self.reloadOnSearch !== false) $urlRouter.update(); + $state.transition = null; + return $q.when($state.current); + } + + // Filter parameters before we pass them to event handlers etc. + toParams = filterByKeys(to.params.$$keys(), toParams || {}); + + // Broadcast start event and cancel the transition if requested + if (options.notify) { + /** + * @ngdoc event + * @name ui.router.state.$state#$stateChangeStart + * @eventOf ui.router.state.$state + * @eventType broadcast on root scope + * @description + * Fired when the state transition **begins**. You can use `event.preventDefault()` + * to prevent the transition from happening and then the transition promise will be + * rejected with a `'transition prevented'` value. + * + * @param {Object} event Event object. + * @param {State} toState The state being transitioned to. + * @param {Object} toParams The params supplied to the `toState`. + * @param {State} fromState The current state, pre-transition. + * @param {Object} fromParams The params supplied to the `fromState`. + * + * @example + * + *
+         * $rootScope.$on('$stateChangeStart',
+         * function(event, toState, toParams, fromState, fromParams){
+         *     event.preventDefault();
+         *     // transitionTo() promise will be rejected with
+         *     // a 'transition prevented' error
+         * })
+         * 
+ */ + if ($rootScope.$broadcast('$stateChangeStart', to.self, toParams, from.self, fromParams).defaultPrevented) { + $urlRouter.update(); + return TransitionPrevented; + } + } + + // Resolve locals for the remaining states, but don't update any global state just + // yet -- if anything fails to resolve the current state needs to remain untouched. + // We also set up an inheritance chain for the locals here. This allows the view directive + // to quickly look up the correct definition for each view in the current state. Even + // though we create the locals object itself outside resolveState(), it is initially + // empty and gets filled asynchronously. We need to keep track of the promise for the + // (fully resolved) current locals, and pass this down the chain. + var resolved = $q.when(locals); + + for (var l = keep; l < toPath.length; l++, state = toPath[l]) { + locals = toLocals[l] = inherit(locals); + resolved = resolveState(state, toParams, state === to, resolved, locals, options); + } + + // Once everything is resolved, we are ready to perform the actual transition + // and return a promise for the new state. We also keep track of what the + // current promise is, so that we can detect overlapping transitions and + // keep only the outcome of the last transition. + var transition = $state.transition = resolved.then(function () { + var l, entering, exiting; + + if ($state.transition !== transition) return TransitionSuperseded; + + // Exit 'from' states not kept + for (l = fromPath.length - 1; l >= keep; l--) { + exiting = fromPath[l]; + if (exiting.self.onExit) { + $injector.invoke(exiting.self.onExit, exiting.self, exiting.locals.globals); + } + exiting.locals = null; + } + + // Enter 'to' states not kept + for (l = keep; l < toPath.length; l++) { + entering = toPath[l]; + entering.locals = toLocals[l]; + if (entering.self.onEnter) { + $injector.invoke(entering.self.onEnter, entering.self, entering.locals.globals); + } + } + + // Run it again, to catch any transitions in callbacks + if ($state.transition !== transition) return TransitionSuperseded; + + // Update globals in $state + $state.$current = to; + $state.current = to.self; + $state.params = toParams; + copy($state.params, $stateParams); + $state.transition = null; + + if (options.location && to.navigable) { + $urlRouter.push(to.navigable.url, to.navigable.locals.globals.$stateParams, { + $$avoidResync: true, replace: options.location === 'replace' + }); + } + + if (options.notify) { + /** + * @ngdoc event + * @name ui.router.state.$state#$stateChangeSuccess + * @eventOf ui.router.state.$state + * @eventType broadcast on root scope + * @description + * Fired once the state transition is **complete**. + * + * @param {Object} event Event object. + * @param {State} toState The state being transitioned to. + * @param {Object} toParams The params supplied to the `toState`. + * @param {State} fromState The current state, pre-transition. + * @param {Object} fromParams The params supplied to the `fromState`. + */ + $rootScope.$broadcast('$stateChangeSuccess', to.self, toParams, from.self, fromParams); + } + $urlRouter.update(true); + + return $state.current; + }, function (error) { + if ($state.transition !== transition) return TransitionSuperseded; + + $state.transition = null; + /** + * @ngdoc event + * @name ui.router.state.$state#$stateChangeError + * @eventOf ui.router.state.$state + * @eventType broadcast on root scope + * @description + * Fired when an **error occurs** during transition. It's important to note that if you + * have any errors in your resolve functions (javascript errors, non-existent services, etc) + * they will not throw traditionally. You must listen for this $stateChangeError event to + * catch **ALL** errors. + * + * @param {Object} event Event object. + * @param {State} toState The state being transitioned to. + * @param {Object} toParams The params supplied to the `toState`. + * @param {State} fromState The current state, pre-transition. + * @param {Object} fromParams The params supplied to the `fromState`. + * @param {Error} error The resolve error object. + */ + evt = $rootScope.$broadcast('$stateChangeError', to.self, toParams, from.self, fromParams, error); + + if (!evt.defaultPrevented) { + $urlRouter.update(); + } + + return $q.reject(error); + }); + + return transition; + }; + + /** + * @ngdoc function + * @name ui.router.state.$state#is + * @methodOf ui.router.state.$state + * + * @description + * Similar to {@link ui.router.state.$state#methods_includes $state.includes}, + * but only checks for the full state name. If params is supplied then it will be + * tested for strict equality against the current active params object, so all params + * must match with none missing and no extras. + * + * @example + *
+     * $state.$current.name = 'contacts.details.item';
+     *
+     * // absolute name
+     * $state.is('contact.details.item'); // returns true
+     * $state.is(contactDetailItemStateObject); // returns true
+     *
+     * // relative name (. and ^), typically from a template
+     * // E.g. from the 'contacts.details' template
+     * 
Item
+ *
+ * + * @param {string|object} stateOrName The state name (absolute or relative) or state object you'd like to check. + * @param {object=} params A param object, e.g. `{sectionId: section.id}`, that you'd like + * to test against the current active state. + * @param {object=} options An options object. The options are: + * + * - **`relative`** - {string|object} - If `stateOrName` is a relative state name and `options.relative` is set, .is will + * test relative to `options.relative` state (or name). + * + * @returns {boolean} Returns true if it is the state. + */ + $state.is = function is(stateOrName, params, options) { + options = extend({ relative: $state.$current }, options || {}); + var state = findState(stateOrName, options.relative); + + if (!isDefined(state)) { return undefined; } + if ($state.$current !== state) { return false; } + return params ? equalForKeys(state.params.$$values(params), $stateParams) : true; + }; + + /** + * @ngdoc function + * @name ui.router.state.$state#includes + * @methodOf ui.router.state.$state + * + * @description + * A method to determine if the current active state is equal to or is the child of the + * state stateName. If any params are passed then they will be tested for a match as well. + * Not all the parameters need to be passed, just the ones you'd like to test for equality. + * + * @example + * Partial and relative names + *
+     * $state.$current.name = 'contacts.details.item';
+     *
+     * // Using partial names
+     * $state.includes("contacts"); // returns true
+     * $state.includes("contacts.details"); // returns true
+     * $state.includes("contacts.details.item"); // returns true
+     * $state.includes("contacts.list"); // returns false
+     * $state.includes("about"); // returns false
+     *
+     * // Using relative names (. and ^), typically from a template
+     * // E.g. from the 'contacts.details' template
+     * 
Item
+ *
+ * + * Basic globbing patterns + *
+     * $state.$current.name = 'contacts.details.item.url';
+     *
+     * $state.includes("*.details.*.*"); // returns true
+     * $state.includes("*.details.**"); // returns true
+     * $state.includes("**.item.**"); // returns true
+     * $state.includes("*.details.item.url"); // returns true
+     * $state.includes("*.details.*.url"); // returns true
+     * $state.includes("*.details.*"); // returns false
+     * $state.includes("item.**"); // returns false
+     * 
+ * + * @param {string} stateOrName A partial name, relative name, or glob pattern + * to be searched for within the current state name. + * @param {object=} params A param object, e.g. `{sectionId: section.id}`, + * that you'd like to test against the current active state. + * @param {object=} options An options object. The options are: + * + * - **`relative`** - {string|object=} - If `stateOrName` is a relative state reference and `options.relative` is set, + * .includes will test relative to `options.relative` state (or name). + * + * @returns {boolean} Returns true if it does include the state + */ + $state.includes = function includes(stateOrName, params, options) { + options = extend({ relative: $state.$current }, options || {}); + if (isString(stateOrName) && isGlob(stateOrName)) { + if (!doesStateMatchGlob(stateOrName)) { + return false; + } + stateOrName = $state.$current.name; + } + + var state = findState(stateOrName, options.relative); + if (!isDefined(state)) { return undefined; } + if (!isDefined($state.$current.includes[state.name])) { return false; } + return params ? equalForKeys(state.params.$$values(params), $stateParams, objectKeys(params)) : true; + }; + + + /** + * @ngdoc function + * @name ui.router.state.$state#href + * @methodOf ui.router.state.$state + * + * @description + * A url generation method that returns the compiled url for the given state populated with the given params. + * + * @example + *
+     * expect($state.href("about.person", { person: "bob" })).toEqual("/about/bob");
+     * 
+ * + * @param {string|object} stateOrName The state name or state object you'd like to generate a url from. + * @param {object=} params An object of parameter values to fill the state's required parameters. + * @param {object=} options Options object. The options are: + * + * - **`lossy`** - {boolean=true} - If true, and if there is no url associated with the state provided in the + * first parameter, then the constructed href url will be built from the first navigable ancestor (aka + * ancestor with a valid url). + * - **`inherit`** - {boolean=true}, If `true` will inherit url parameters from current url. + * - **`relative`** - {object=$state.$current}, When transitioning with relative path (e.g '^'), + * defines which state to be relative from. + * - **`absolute`** - {boolean=false}, If true will generate an absolute url, e.g. "http://www.example.com/fullurl". + * + * @returns {string} compiled state url + */ + $state.href = function href(stateOrName, params, options) { + options = extend({ + lossy: true, + inherit: true, + absolute: false, + relative: $state.$current + }, options || {}); + + var state = findState(stateOrName, options.relative); + + if (!isDefined(state)) return null; + if (options.inherit) params = inheritParams($stateParams, params || {}, $state.$current, state); + + var nav = (state && options.lossy) ? state.navigable : state; + + if (!nav || nav.url === undefined || nav.url === null) { + return null; + } + return $urlRouter.href(nav.url, filterByKeys(state.params.$$keys(), params || {}), { + absolute: options.absolute + }); + }; + + /** + * @ngdoc function + * @name ui.router.state.$state#get + * @methodOf ui.router.state.$state + * + * @description + * Returns the state configuration object for any specific state or all states. + * + * @param {string|object=} stateOrName (absolute or relative) If provided, will only get the config for + * the requested state. If not provided, returns an array of ALL state configs. + * @param {string|object=} context When stateOrName is a relative state reference, the state will be retrieved relative to context. + * @returns {Object|Array} State configuration object or array of all objects. + */ + $state.get = function (stateOrName, context) { + if (arguments.length === 0) return map(objectKeys(states), function(name) { return states[name].self; }); + var state = findState(stateOrName, context || $state.$current); + return (state && state.self) ? state.self : null; + }; + + function resolveState(state, params, paramsAreFiltered, inherited, dst, options) { + // Make a restricted $stateParams with only the parameters that apply to this state if + // necessary. In addition to being available to the controller and onEnter/onExit callbacks, + // we also need $stateParams to be available for any $injector calls we make during the + // dependency resolution process. + var $stateParams = (paramsAreFiltered) ? params : filterByKeys(state.params.$$keys(), params); + var locals = { $stateParams: $stateParams }; + + // Resolve 'global' dependencies for the state, i.e. those not specific to a view. + // We're also including $stateParams in this; that way the parameters are restricted + // to the set that should be visible to the state, and are independent of when we update + // the global $state and $stateParams values. + dst.resolve = $resolve.resolve(state.resolve, locals, dst.resolve, state); + var promises = [dst.resolve.then(function (globals) { + dst.globals = globals; + })]; + if (inherited) promises.push(inherited); + + // Resolve template and dependencies for all views. + forEach(state.views, function (view, name) { + var injectables = (view.resolve && view.resolve !== state.resolve ? view.resolve : {}); + injectables.$template = [ function () { + return $view.load(name, { view: view, locals: locals, params: $stateParams, notify: options.notify }) || ''; + }]; + + promises.push($resolve.resolve(injectables, locals, dst.resolve, state).then(function (result) { + // References to the controller (only instantiated at link time) + if (isFunction(view.controllerProvider) || isArray(view.controllerProvider)) { + var injectLocals = angular.extend({}, injectables, locals); + result.$$controller = $injector.invoke(view.controllerProvider, null, injectLocals); + } else { + result.$$controller = view.controller; + } + // Provide access to the state itself for internal use + result.$$state = state; + result.$$controllerAs = view.controllerAs; + dst[name] = result; + })); + }); + + // Wait for all the promises and then return the activation object + return $q.all(promises).then(function (values) { + return dst; + }); + } + + return $state; + } + + function shouldTriggerReload(to, from, locals, options) { + if (to === from && ((locals === from.locals && !options.reload) || (to.self.reloadOnSearch === false))) { + return true; + } + } +} + +angular.module('ui.router.state') + .value('$stateParams', {}) + .provider('$state', $StateProvider); + + +$ViewProvider.$inject = []; +function $ViewProvider() { + + this.$get = $get; + /** + * @ngdoc object + * @name ui.router.state.$view + * + * @requires ui.router.util.$templateFactory + * @requires $rootScope + * + * @description + * + */ + $get.$inject = ['$rootScope', '$templateFactory']; + function $get( $rootScope, $templateFactory) { + return { + // $view.load('full.viewName', { template: ..., controller: ..., resolve: ..., async: false, params: ... }) + /** + * @ngdoc function + * @name ui.router.state.$view#load + * @methodOf ui.router.state.$view + * + * @description + * + * @param {string} name name + * @param {object} options option object. + */ + load: function load(name, options) { + var result, defaults = { + template: null, controller: null, view: null, locals: null, notify: true, async: true, params: {} + }; + options = extend(defaults, options); + + if (options.view) { + result = $templateFactory.fromConfig(options.view, options.params, options.locals); + } + if (result && options.notify) { + /** + * @ngdoc event + * @name ui.router.state.$state#$viewContentLoading + * @eventOf ui.router.state.$view + * @eventType broadcast on root scope + * @description + * + * Fired once the view **begins loading**, *before* the DOM is rendered. + * + * @param {Object} event Event object. + * @param {Object} viewConfig The view config properties (template, controller, etc). + * + * @example + * + *
+         * $scope.$on('$viewContentLoading',
+         * function(event, viewConfig){
+         *     // Access to all the view config properties.
+         *     // and one special property 'targetView'
+         *     // viewConfig.targetView
+         * });
+         * 
+ */ + $rootScope.$broadcast('$viewContentLoading', options); + } + return result; + } + }; + } +} + +angular.module('ui.router.state').provider('$view', $ViewProvider); + +/** + * @ngdoc object + * @name ui.router.state.$uiViewScrollProvider + * + * @description + * Provider that returns the {@link ui.router.state.$uiViewScroll} service function. + */ +function $ViewScrollProvider() { + + var useAnchorScroll = false; + + /** + * @ngdoc function + * @name ui.router.state.$uiViewScrollProvider#useAnchorScroll + * @methodOf ui.router.state.$uiViewScrollProvider + * + * @description + * Reverts back to using the core [`$anchorScroll`](http://docs.angularjs.org/api/ng.$anchorScroll) service for + * scrolling based on the url anchor. + */ + this.useAnchorScroll = function () { + useAnchorScroll = true; + }; + + /** + * @ngdoc object + * @name ui.router.state.$uiViewScroll + * + * @requires $anchorScroll + * @requires $timeout + * + * @description + * When called with a jqLite element, it scrolls the element into view (after a + * `$timeout` so the DOM has time to refresh). + * + * If you prefer to rely on `$anchorScroll` to scroll the view to the anchor, + * this can be enabled by calling {@link ui.router.state.$uiViewScrollProvider#methods_useAnchorScroll `$uiViewScrollProvider.useAnchorScroll()`}. + */ + this.$get = ['$anchorScroll', '$timeout', function ($anchorScroll, $timeout) { + if (useAnchorScroll) { + return $anchorScroll; + } + + return function ($element) { + $timeout(function () { + $element[0].scrollIntoView(); + }, 0, false); + }; + }]; +} + +angular.module('ui.router.state').provider('$uiViewScroll', $ViewScrollProvider); + +/** + * @ngdoc directive + * @name ui.router.state.directive:ui-view + * + * @requires ui.router.state.$state + * @requires $compile + * @requires $controller + * @requires $injector + * @requires ui.router.state.$uiViewScroll + * @requires $document + * + * @restrict ECA + * + * @description + * The ui-view directive tells $state where to place your templates. + * + * @param {string=} name A view name. The name should be unique amongst the other views in the + * same state. You can have views of the same name that live in different states. + * + * @param {string=} autoscroll It allows you to set the scroll behavior of the browser window + * when a view is populated. By default, $anchorScroll is overridden by ui-router's custom scroll + * service, {@link ui.router.state.$uiViewScroll}. This custom service let's you + * scroll ui-view elements into view when they are populated during a state activation. + * + * *Note: To revert back to old [`$anchorScroll`](http://docs.angularjs.org/api/ng.$anchorScroll) + * functionality, call `$uiViewScrollProvider.useAnchorScroll()`.* + * + * @param {string=} onload Expression to evaluate whenever the view updates. + * + * @example + * A view can be unnamed or named. + *
+ * 
+ * 
+ * + * + *
+ *
+ * + * You can only have one unnamed view within any template (or root html). If you are only using a + * single view and it is unnamed then you can populate it like so: + *
+ * 
+ * $stateProvider.state("home", { + * template: "

HELLO!

" + * }) + *
+ * + * The above is a convenient shortcut equivalent to specifying your view explicitly with the {@link ui.router.state.$stateProvider#views `views`} + * config property, by name, in this case an empty name: + *
+ * $stateProvider.state("home", {
+ *   views: {
+ *     "": {
+ *       template: "

HELLO!

" + * } + * } + * }) + *
+ * + * But typically you'll only use the views property if you name your view or have more than one view + * in the same template. There's not really a compelling reason to name a view if its the only one, + * but you could if you wanted, like so: + *
+ * 
+ *
+ *
+ * $stateProvider.state("home", {
+ *   views: {
+ *     "main": {
+ *       template: "

HELLO!

" + * } + * } + * }) + *
+ * + * Really though, you'll use views to set up multiple views: + *
+ * 
+ *
+ *
+ *
+ * + *
+ * $stateProvider.state("home", {
+ *   views: {
+ *     "": {
+ *       template: "

HELLO!

" + * }, + * "chart": { + * template: "" + * }, + * "data": { + * template: "" + * } + * } + * }) + *
+ * + * Examples for `autoscroll`: + * + *
+ * 
+ * 
+ *
+ * 
+ * 
+ * 
+ * 
+ * 
+ */ +$ViewDirective.$inject = ['$state', '$injector', '$uiViewScroll', '$interpolate']; +function $ViewDirective( $state, $injector, $uiViewScroll, $interpolate) { + + function getService() { + return ($injector.has) ? function(service) { + return $injector.has(service) ? $injector.get(service) : null; + } : function(service) { + try { + return $injector.get(service); + } catch (e) { + return null; + } + }; + } + + var service = getService(), + $animator = service('$animator'), + $animate = service('$animate'); + + // Returns a set of DOM manipulation functions based on which Angular version + // it should use + function getRenderer(attrs, scope) { + var statics = function() { + return { + enter: function (element, target, cb) { target.after(element); cb(); }, + leave: function (element, cb) { element.remove(); cb(); } + }; + }; + + if ($animate) { + return { + enter: function(element, target, cb) { + var promise = $animate.enter(element, null, target, cb); + if (promise && promise.then) promise.then(cb); + }, + leave: function(element, cb) { + var promise = $animate.leave(element, cb); + if (promise && promise.then) promise.then(cb); + } + }; + } + + if ($animator) { + var animate = $animator && $animator(scope, attrs); + + return { + enter: function(element, target, cb) {animate.enter(element, null, target); cb(); }, + leave: function(element, cb) { animate.leave(element); cb(); } + }; + } + + return statics(); + } + + var directive = { + restrict: 'ECA', + terminal: true, + priority: 400, + transclude: 'element', + compile: function (tElement, tAttrs, $transclude) { + return function (scope, $element, attrs) { + var previousEl, currentEl, currentScope, latestLocals, + onloadExp = attrs.onload || '', + autoScrollExp = attrs.autoscroll, + renderer = getRenderer(attrs, scope); + + scope.$on('$stateChangeSuccess', function() { + updateView(false); + }); + scope.$on('$viewContentLoading', function() { + updateView(false); + }); + + updateView(true); + + function cleanupLastView() { + if (previousEl) { + previousEl.remove(); + previousEl = null; + } + + if (currentScope) { + currentScope.$destroy(); + currentScope = null; + } + + if (currentEl) { + renderer.leave(currentEl, function() { + previousEl = null; + }); + + previousEl = currentEl; + currentEl = null; + } + } + + function updateView(firstTime) { + var newScope, + name = getUiViewName(scope, attrs, $element, $interpolate), + previousLocals = name && $state.$current && $state.$current.locals[name]; + + if (!firstTime && previousLocals === latestLocals) return; // nothing to do + newScope = scope.$new(); + latestLocals = $state.$current.locals[name]; + + var clone = $transclude(newScope, function(clone) { + renderer.enter(clone, $element, function onUiViewEnter() { + if(currentScope) { + currentScope.$emit('$viewContentAnimationEnded'); + } + + if (angular.isDefined(autoScrollExp) && !autoScrollExp || scope.$eval(autoScrollExp)) { + $uiViewScroll(clone); + } + }); + cleanupLastView(); + }); + + currentEl = clone; + currentScope = newScope; + /** + * @ngdoc event + * @name ui.router.state.directive:ui-view#$viewContentLoaded + * @eventOf ui.router.state.directive:ui-view + * @eventType emits on ui-view directive scope + * @description * + * Fired once the view is **loaded**, *after* the DOM is rendered. + * + * @param {Object} event Event object. + */ + currentScope.$emit('$viewContentLoaded'); + currentScope.$eval(onloadExp); + } + }; + } + }; + + return directive; +} + +$ViewDirectiveFill.$inject = ['$compile', '$controller', '$state', '$interpolate']; +function $ViewDirectiveFill ( $compile, $controller, $state, $interpolate) { + return { + restrict: 'ECA', + priority: -400, + compile: function (tElement) { + var initial = tElement.html(); + return function (scope, $element, attrs) { + var current = $state.$current, + name = getUiViewName(scope, attrs, $element, $interpolate), + locals = current && current.locals[name]; + + if (! locals) { + return; + } + + $element.data('$uiView', { name: name, state: locals.$$state }); + $element.html(locals.$template ? locals.$template : initial); + + var link = $compile($element.contents()); + + if (locals.$$controller) { + locals.$scope = scope; + var controller = $controller(locals.$$controller, locals); + if (locals.$$controllerAs) { + scope[locals.$$controllerAs] = controller; + } + $element.data('$ngControllerController', controller); + $element.children().data('$ngControllerController', controller); + } + + link(scope); + }; + } + }; +} + +/** + * Shared ui-view code for both directives: + * Given scope, element, and its attributes, return the view's name + */ +function getUiViewName(scope, attrs, element, $interpolate) { + var name = $interpolate(attrs.uiView || attrs.name || '')(scope); + var inherited = element.inheritedData('$uiView'); + return name.indexOf('@') >= 0 ? name : (name + '@' + (inherited ? inherited.state.name : '')); +} + +angular.module('ui.router.state').directive('uiView', $ViewDirective); +angular.module('ui.router.state').directive('uiView', $ViewDirectiveFill); + +function parseStateRef(ref, current) { + var preparsed = ref.match(/^\s*({[^}]*})\s*$/), parsed; + if (preparsed) ref = current + '(' + preparsed[1] + ')'; + parsed = ref.replace(/\n/g, " ").match(/^([^(]+?)\s*(\((.*)\))?$/); + if (!parsed || parsed.length !== 4) throw new Error("Invalid state ref '" + ref + "'"); + return { state: parsed[1], paramExpr: parsed[3] || null }; +} + +function stateContext(el) { + var stateData = el.parent().inheritedData('$uiView'); + + if (stateData && stateData.state && stateData.state.name) { + return stateData.state; + } +} + +/** + * @ngdoc directive + * @name ui.router.state.directive:ui-sref + * + * @requires ui.router.state.$state + * @requires $timeout + * + * @restrict A + * + * @description + * A directive that binds a link (`` tag) to a state. If the state has an associated + * URL, the directive will automatically generate & update the `href` attribute via + * the {@link ui.router.state.$state#methods_href $state.href()} method. Clicking + * the link will trigger a state transition with optional parameters. + * + * Also middle-clicking, right-clicking, and ctrl-clicking on the link will be + * handled natively by the browser. + * + * You can also use relative state paths within ui-sref, just like the relative + * paths passed to `$state.go()`. You just need to be aware that the path is relative + * to the state that the link lives in, in other words the state that loaded the + * template containing the link. + * + * You can specify options to pass to {@link ui.router.state.$state#go $state.go()} + * using the `ui-sref-opts` attribute. Options are restricted to `location`, `inherit`, + * and `reload`. + * + * @example + * Here's an example of how you'd use ui-sref and how it would compile. If you have the + * following template: + *
+ * Home | About | Next page
+ * 
+ * 
+ * 
+ * + * Then the compiled html would be (assuming Html5Mode is off and current state is contacts): + *
+ * Home | About | Next page
+ * 
+ * 
    + *
  • + * Joe + *
  • + *
  • + * Alice + *
  • + *
  • + * Bob + *
  • + *
+ * + * Home + *
+ * + * @param {string} ui-sref 'stateName' can be any valid absolute or relative state + * @param {Object} ui-sref-opts options to pass to {@link ui.router.state.$state#go $state.go()} + */ +$StateRefDirective.$inject = ['$state', '$timeout']; +function $StateRefDirective($state, $timeout) { + var allowedOptions = ['location', 'inherit', 'reload']; + + return { + restrict: 'A', + require: ['?^uiSrefActive', '?^uiSrefActiveEq'], + link: function(scope, element, attrs, uiSrefActive) { + var ref = parseStateRef(attrs.uiSref, $state.current.name); + var params = null, url = null, base = stateContext(element) || $state.$current; + var newHref = null, isAnchor = element.prop("tagName") === "A"; + var isForm = element[0].nodeName === "FORM"; + var attr = isForm ? "action" : "href", nav = true; + + var options = { relative: base, inherit: true }; + var optionsOverride = scope.$eval(attrs.uiSrefOpts) || {}; + + angular.forEach(allowedOptions, function(option) { + if (option in optionsOverride) { + options[option] = optionsOverride[option]; + } + }); + + var update = function(newVal) { + if (newVal) params = angular.copy(newVal); + if (!nav) return; + + newHref = $state.href(ref.state, params, options); + + var activeDirective = uiSrefActive[1] || uiSrefActive[0]; + if (activeDirective) { + activeDirective.$$setStateInfo(ref.state, params); + } + if (newHref === null) { + nav = false; + return false; + } + attrs.$set(attr, newHref); + }; + + if (ref.paramExpr) { + scope.$watch(ref.paramExpr, function(newVal, oldVal) { + if (newVal !== params) update(newVal); + }, true); + params = angular.copy(scope.$eval(ref.paramExpr)); + } + update(); + + if (isForm) return; + + element.bind("click", function(e) { + var button = e.which || e.button; + if ( !(button > 1 || e.ctrlKey || e.metaKey || e.shiftKey || element.attr('target')) ) { + // HACK: This is to allow ng-clicks to be processed before the transition is initiated: + var transition = $timeout(function() { + $state.go(ref.state, params, options); + }); + e.preventDefault(); + + // if the state has no URL, ignore one preventDefault from the directive. + var ignorePreventDefaultCount = isAnchor && !newHref ? 1: 0; + e.preventDefault = function() { + if (ignorePreventDefaultCount-- <= 0) + $timeout.cancel(transition); + }; + } + }); + } + }; +} + +/** + * @ngdoc directive + * @name ui.router.state.directive:ui-sref-active + * + * @requires ui.router.state.$state + * @requires ui.router.state.$stateParams + * @requires $interpolate + * + * @restrict A + * + * @description + * A directive working alongside ui-sref to add classes to an element when the + * related ui-sref directive's state is active, and removing them when it is inactive. + * The primary use-case is to simplify the special appearance of navigation menus + * relying on `ui-sref`, by having the "active" state's menu button appear different, + * distinguishing it from the inactive menu items. + * + * ui-sref-active can live on the same element as ui-sref or on a parent element. The first + * ui-sref-active found at the same level or above the ui-sref will be used. + * + * Will activate when the ui-sref's target state or any child state is active. If you + * need to activate only when the ui-sref target state is active and *not* any of + * it's children, then you will use + * {@link ui.router.state.directive:ui-sref-active-eq ui-sref-active-eq} + * + * @example + * Given the following template: + *
+ * 
+ * 
+ * + * + * When the app state is "app.user" (or any children states), and contains the state parameter "user" with value "bilbobaggins", + * the resulting HTML will appear as (note the 'active' class): + *
+ * 
+ * 
+ * + * The class name is interpolated **once** during the directives link time (any further changes to the + * interpolated value are ignored). + * + * Multiple classes may be specified in a space-separated format: + *
+ * 
    + *
  • + * link + *
  • + *
+ *
+ */ + +/** + * @ngdoc directive + * @name ui.router.state.directive:ui-sref-active-eq + * + * @requires ui.router.state.$state + * @requires ui.router.state.$stateParams + * @requires $interpolate + * + * @restrict A + * + * @description + * The same as {@link ui.router.state.directive:ui-sref-active ui-sref-active} but will only activate + * when the exact target state used in the `ui-sref` is active; no child states. + * + */ +$StateRefActiveDirective.$inject = ['$state', '$stateParams', '$interpolate']; +function $StateRefActiveDirective($state, $stateParams, $interpolate) { + return { + restrict: "A", + controller: ['$scope', '$element', '$attrs', function ($scope, $element, $attrs) { + var state, params, activeClass; + + // There probably isn't much point in $observing this + // uiSrefActive and uiSrefActiveEq share the same directive object with some + // slight difference in logic routing + activeClass = $interpolate($attrs.uiSrefActiveEq || $attrs.uiSrefActive || '', false)($scope); + + // Allow uiSref to communicate with uiSrefActive[Equals] + this.$$setStateInfo = function (newState, newParams) { + state = $state.get(newState, stateContext($element)); + params = newParams; + update(); + }; + + $scope.$on('$stateChangeSuccess', update); + + // Update route state + function update() { + if (isMatch()) { + $element.addClass(activeClass); + } else { + $element.removeClass(activeClass); + } + } + + function isMatch() { + if (typeof $attrs.uiSrefActiveEq !== 'undefined') { + return state && $state.is(state.name, params); + } else { + return state && $state.includes(state.name, params); + } + } + }] + }; +} + +angular.module('ui.router.state') + .directive('uiSref', $StateRefDirective) + .directive('uiSrefActive', $StateRefActiveDirective) + .directive('uiSrefActiveEq', $StateRefActiveDirective); + +/** + * @ngdoc filter + * @name ui.router.state.filter:isState + * + * @requires ui.router.state.$state + * + * @description + * Translates to {@link ui.router.state.$state#methods_is $state.is("stateName")}. + */ +$IsStateFilter.$inject = ['$state']; +function $IsStateFilter($state) { + var isFilter = function (state) { + return $state.is(state); + }; + isFilter.$stateful = true; + return isFilter; +} + +/** + * @ngdoc filter + * @name ui.router.state.filter:includedByState + * + * @requires ui.router.state.$state + * + * @description + * Translates to {@link ui.router.state.$state#methods_includes $state.includes('fullOrPartialStateName')}. + */ +$IncludedByStateFilter.$inject = ['$state']; +function $IncludedByStateFilter($state) { + var includesFilter = function (state) { + return $state.includes(state); + }; + includesFilter.$stateful = true; + return includesFilter; +} + +angular.module('ui.router.state') + .filter('isState', $IsStateFilter) + .filter('includedByState', $IncludedByStateFilter); +})(window, window.angular); \ No newline at end of file diff --git a/www/lib/angular-ui-router/release/angular-ui-router.min.js b/www/lib/angular-ui-router/release/angular-ui-router.min.js new file mode 100644 index 0000000..be06fb5 --- /dev/null +++ b/www/lib/angular-ui-router/release/angular-ui-router.min.js @@ -0,0 +1,7 @@ +/** + * State-based routing for AngularJS + * @version v0.2.13 + * @link http://angular-ui.github.com/ + * @license MIT License, http://www.opensource.org/licenses/MIT + */ +"undefined"!=typeof module&&"undefined"!=typeof exports&&module.exports===exports&&(module.exports="ui.router"),function(a,b,c){"use strict";function d(a,b){return M(new(M(function(){},{prototype:a})),b)}function e(a){return L(arguments,function(b){b!==a&&L(b,function(b,c){a.hasOwnProperty(c)||(a[c]=b)})}),a}function f(a,b){var c=[];for(var d in a.path){if(a.path[d]!==b.path[d])break;c.push(a.path[d])}return c}function g(a){if(Object.keys)return Object.keys(a);var c=[];return b.forEach(a,function(a,b){c.push(b)}),c}function h(a,b){if(Array.prototype.indexOf)return a.indexOf(b,Number(arguments[2])||0);var c=a.length>>>0,d=Number(arguments[2])||0;for(d=0>d?Math.ceil(d):Math.floor(d),0>d&&(d+=c);c>d;d++)if(d in a&&a[d]===b)return d;return-1}function i(a,b,c,d){var e,i=f(c,d),j={},k=[];for(var l in i)if(i[l].params&&(e=g(i[l].params),e.length))for(var m in e)h(k,e[m])>=0||(k.push(e[m]),j[e[m]]=a[e[m]]);return M({},j,b)}function j(a,b,c){if(!c){c=[];for(var d in a)c.push(d)}for(var e=0;e "));if(s[c]=d,I(a))q.push(c,[function(){return b.get(a)}],j);else{var e=b.annotate(a);L(e,function(a){a!==c&&i.hasOwnProperty(a)&&n(i[a],a)}),q.push(c,a,e)}r.pop(),s[c]=f}}function o(a){return J(a)&&a.then&&a.$$promises}if(!J(i))throw new Error("'invocables' must be an object");var p=g(i||{}),q=[],r=[],s={};return L(i,n),i=r=s=null,function(d,f,g){function h(){--u||(v||e(t,f.$$values),r.$$values=t,r.$$promises=r.$$promises||!0,delete r.$$inheritedValues,n.resolve(t))}function i(a){r.$$failure=a,n.reject(a)}function j(c,e,f){function j(a){l.reject(a),i(a)}function k(){if(!G(r.$$failure))try{l.resolve(b.invoke(e,g,t)),l.promise.then(function(a){t[c]=a,h()},j)}catch(a){j(a)}}var l=a.defer(),m=0;L(f,function(a){s.hasOwnProperty(a)&&!d.hasOwnProperty(a)&&(m++,s[a].then(function(b){t[a]=b,--m||k()},j))}),m||k(),s[c]=l.promise}if(o(d)&&g===c&&(g=f,f=d,d=null),d){if(!J(d))throw new Error("'locals' must be an object")}else d=k;if(f){if(!o(f))throw new Error("'parent' must be a promise returned by $resolve.resolve()")}else f=m;var n=a.defer(),r=n.promise,s=r.$$promises={},t=M({},d),u=1+q.length/3,v=!1;if(G(f.$$failure))return i(f.$$failure),r;f.$$inheritedValues&&e(t,l(f.$$inheritedValues,p)),M(s,f.$$promises),f.$$values?(v=e(t,l(f.$$values,p)),r.$$inheritedValues=l(f.$$values,p),h()):(f.$$inheritedValues&&(r.$$inheritedValues=l(f.$$inheritedValues,p)),f.then(h,i));for(var w=0,x=q.length;x>w;w+=3)d.hasOwnProperty(q[w])?h():j(q[w],q[w+1],q[w+2]);return r}},this.resolve=function(a,b,c,d){return this.study(a)(b,c,d)}}function p(a,b,c){this.fromConfig=function(a,b,c){return G(a.template)?this.fromString(a.template,b):G(a.templateUrl)?this.fromUrl(a.templateUrl,b):G(a.templateProvider)?this.fromProvider(a.templateProvider,b,c):null},this.fromString=function(a,b){return H(a)?a(b):a},this.fromUrl=function(c,d){return H(c)&&(c=c(d)),null==c?null:a.get(c,{cache:b,headers:{Accept:"text/html"}}).then(function(a){return a.data})},this.fromProvider=function(a,b,d){return c.invoke(a,null,d||{params:b})}}function q(a,b,e){function f(b,c,d,e){if(q.push(b),o[b])return o[b];if(!/^\w+(-+\w+)*(?:\[\])?$/.test(b))throw new Error("Invalid parameter name '"+b+"' in pattern '"+a+"'");if(p[b])throw new Error("Duplicate parameter name '"+b+"' in pattern '"+a+"'");return p[b]=new O.Param(b,c,d,e),p[b]}function g(a,b,c){var d=["",""],e=a.replace(/[\\\[\]\^$*+?.()|{}]/g,"\\$&");if(!b)return e;switch(c){case!1:d=["(",")"];break;case!0:d=["?(",")?"];break;default:d=["("+c+"|",")?"]}return e+d[0]+b+d[1]}function h(c,e){var f,g,h,i,j;return f=c[2]||c[3],j=b.params[f],h=a.substring(m,c.index),g=e?c[4]:c[4]||("*"==c[1]?".*":null),i=O.type(g||"string")||d(O.type("string"),{pattern:new RegExp(g)}),{id:f,regexp:g,segment:h,type:i,cfg:j}}b=M({params:{}},J(b)?b:{});var i,j=/([:*])([\w\[\]]+)|\{([\w\[\]]+)(?:\:((?:[^{}\\]+|\\.|\{(?:[^{}\\]+|\\.)*\})+))?\}/g,k=/([:]?)([\w\[\]-]+)|\{([\w\[\]-]+)(?:\:((?:[^{}\\]+|\\.|\{(?:[^{}\\]+|\\.)*\})+))?\}/g,l="^",m=0,n=this.segments=[],o=e?e.params:{},p=this.params=e?e.params.$$new():new O.ParamSet,q=[];this.source=a;for(var r,s,t;(i=j.exec(a))&&(r=h(i,!1),!(r.segment.indexOf("?")>=0));)s=f(r.id,r.type,r.cfg,"path"),l+=g(r.segment,s.type.pattern.source,s.squash),n.push(r.segment),m=j.lastIndex;t=a.substring(m);var u=t.indexOf("?");if(u>=0){var v=this.sourceSearch=t.substring(u);if(t=t.substring(0,u),this.sourcePath=a.substring(0,m+u),v.length>0)for(m=0;i=k.exec(v);)r=h(i,!0),s=f(r.id,r.type,r.cfg,"search"),m=j.lastIndex}else this.sourcePath=a,this.sourceSearch="";l+=g(t)+(b.strict===!1?"/?":"")+"$",n.push(t),this.regexp=new RegExp(l,b.caseInsensitive?"i":c),this.prefix=n[0],this.$$paramNames=q}function r(a){M(this,a)}function s(){function a(a){return null!=a?a.toString().replace(/\//g,"%2F"):a}function e(a){return null!=a?a.toString().replace(/%2F/g,"/"):a}function f(a){return this.pattern.test(a)}function i(){return{strict:t,caseInsensitive:p}}function j(a){return H(a)||K(a)&&H(a[a.length-1])}function k(){for(;x.length;){var a=x.shift();if(a.pattern)throw new Error("You cannot override a type's .pattern at runtime.");b.extend(v[a.name],o.invoke(a.def))}}function l(a){M(this,a||{})}O=this;var o,p=!1,t=!0,u=!1,v={},w=!0,x=[],y={string:{encode:a,decode:e,is:f,pattern:/[^/]*/},"int":{encode:a,decode:function(a){return parseInt(a,10)},is:function(a){return G(a)&&this.decode(a.toString())===a},pattern:/\d+/},bool:{encode:function(a){return a?1:0},decode:function(a){return 0!==parseInt(a,10)},is:function(a){return a===!0||a===!1},pattern:/0|1/},date:{encode:function(a){return this.is(a)?[a.getFullYear(),("0"+(a.getMonth()+1)).slice(-2),("0"+a.getDate()).slice(-2)].join("-"):c},decode:function(a){if(this.is(a))return a;var b=this.capture.exec(a);return b?new Date(b[1],b[2]-1,b[3]):c},is:function(a){return a instanceof Date&&!isNaN(a.valueOf())},equals:function(a,b){return this.is(a)&&this.is(b)&&a.toISOString()===b.toISOString()},pattern:/[0-9]{4}-(?:0[1-9]|1[0-2])-(?:0[1-9]|[1-2][0-9]|3[0-1])/,capture:/([0-9]{4})-(0[1-9]|1[0-2])-(0[1-9]|[1-2][0-9]|3[0-1])/},json:{encode:b.toJson,decode:b.fromJson,is:b.isObject,equals:b.equals,pattern:/[^/]*/},any:{encode:b.identity,decode:b.identity,is:b.identity,equals:b.equals,pattern:/.*/}};s.$$getDefaultValue=function(a){if(!j(a.value))return a.value;if(!o)throw new Error("Injectable functions cannot be called at configuration time");return o.invoke(a.value)},this.caseInsensitive=function(a){return G(a)&&(p=a),p},this.strictMode=function(a){return G(a)&&(t=a),t},this.defaultSquashPolicy=function(a){if(!G(a))return u;if(a!==!0&&a!==!1&&!I(a))throw new Error("Invalid squash policy: "+a+". Valid policies: false, true, arbitrary-string");return u=a,a},this.compile=function(a,b){return new q(a,M(i(),b))},this.isMatcher=function(a){if(!J(a))return!1;var b=!0;return L(q.prototype,function(c,d){H(c)&&(b=b&&G(a[d])&&H(a[d]))}),b},this.type=function(a,b,c){if(!G(b))return v[a];if(v.hasOwnProperty(a))throw new Error("A type named '"+a+"' has already been defined.");return v[a]=new r(M({name:a},b)),c&&(x.push({name:a,def:c}),w||k()),this},L(y,function(a,b){v[b]=new r(M({name:b},a))}),v=d(v,{}),this.$get=["$injector",function(a){return o=a,w=!1,k(),L(y,function(a,b){v[b]||(v[b]=new r(a))}),this}],this.Param=function(a,b,d,e){function f(a){var b=J(a)?g(a):[],c=-1===h(b,"value")&&-1===h(b,"type")&&-1===h(b,"squash")&&-1===h(b,"array");return c&&(a={value:a}),a.$$fn=j(a.value)?a.value:function(){return a.value},a}function i(b,c,d){if(b.type&&c)throw new Error("Param '"+a+"' has two type configurations.");return c?c:b.type?b.type instanceof r?b.type:new r(b.type):"config"===d?v.any:v.string}function k(){var b={array:"search"===e?"auto":!1},c=a.match(/\[\]$/)?{array:!0}:{};return M(b,c,d).array}function l(a,b){var c=a.squash;if(!b||c===!1)return!1;if(!G(c)||null==c)return u;if(c===!0||I(c))return c;throw new Error("Invalid squash policy: '"+c+"'. Valid policies: false, true, or arbitrary string")}function p(a,b,d,e){var f,g,i=[{from:"",to:d||b?c:""},{from:null,to:d||b?c:""}];return f=K(a.replace)?a.replace:[],I(e)&&f.push({from:e,to:c}),g=n(f,function(a){return a.from}),m(i,function(a){return-1===h(g,a.from)}).concat(f)}function q(){if(!o)throw new Error("Injectable functions cannot be called at configuration time");return o.invoke(d.$$fn)}function s(a){function b(a){return function(b){return b.from===a}}function c(a){var c=n(m(w.replace,b(a)),function(a){return a.to});return c.length?c[0]:a}return a=c(a),G(a)?w.type.decode(a):q()}function t(){return"{Param:"+a+" "+b+" squash: '"+z+"' optional: "+y+"}"}var w=this;d=f(d),b=i(d,b,e);var x=k();b=x?b.$asArray(x,"search"===e):b,"string"!==b.name||x||"path"!==e||d.value!==c||(d.value="");var y=d.value!==c,z=l(d,y),A=p(d,x,y,z);M(this,{id:a,type:b,location:e,array:x,squash:z,replace:A,isOptional:y,value:s,dynamic:c,config:d,toString:t})},l.prototype={$$new:function(){return d(this,M(new l,{$$parent:this}))},$$keys:function(){for(var a=[],b=[],c=this,d=g(l.prototype);c;)b.push(c),c=c.$$parent;return b.reverse(),L(b,function(b){L(g(b),function(b){-1===h(a,b)&&-1===h(d,b)&&a.push(b)})}),a},$$values:function(a){var b={},c=this;return L(c.$$keys(),function(d){b[d]=c[d].value(a&&a[d])}),b},$$equals:function(a,b){var c=!0,d=this;return L(d.$$keys(),function(e){var f=a&&a[e],g=b&&b[e];d[e].type.equals(f,g)||(c=!1)}),c},$$validates:function(a){var b,c,d,e=!0,f=this;return L(this.$$keys(),function(g){d=f[g],c=a[g],b=!c&&d.isOptional,e=e&&(b||!!d.type.is(c))}),e},$$parent:c},this.ParamSet=l}function t(a,d){function e(a){var b=/^\^((?:\\[^a-zA-Z0-9]|[^\\\[\]\^$*+?.()|{}]+)*)/.exec(a.source);return null!=b?b[1].replace(/\\(.)/g,"$1"):""}function f(a,b){return a.replace(/\$(\$|\d{1,2})/,function(a,c){return b["$"===c?0:Number(c)]})}function g(a,b,c){if(!c)return!1;var d=a.invoke(b,b,{$match:c});return G(d)?d:!0}function h(d,e,f,g){function h(a,b,c){return"/"===p?a:b?p.slice(0,-1)+a:c?p.slice(1)+a:a}function m(a){function b(a){var b=a(f,d);return b?(I(b)&&d.replace().url(b),!0):!1}if(!a||!a.defaultPrevented){var e=o&&d.url()===o;if(o=c,e)return!0;var g,h=j.length;for(g=0;h>g;g++)if(b(j[g]))return;k&&b(k)}}function n(){return i=i||e.$on("$locationChangeSuccess",m)}var o,p=g.baseHref(),q=d.url();return l||n(),{sync:function(){m()},listen:function(){return n()},update:function(a){return a?void(q=d.url()):void(d.url()!==q&&(d.url(q),d.replace()))},push:function(a,b,e){d.url(a.format(b||{})),o=e&&e.$$avoidResync?d.url():c,e&&e.replace&&d.replace()},href:function(c,e,f){if(!c.validates(e))return null;var g=a.html5Mode();b.isObject(g)&&(g=g.enabled);var i=c.format(e);if(f=f||{},g||null===i||(i="#"+a.hashPrefix()+i),i=h(i,g,f.absolute),!f.absolute||!i)return i;var j=!g&&i?"/":"",k=d.port();return k=80===k||443===k?"":":"+k,[d.protocol(),"://",d.host(),k,j,i].join("")}}}var i,j=[],k=null,l=!1;this.rule=function(a){if(!H(a))throw new Error("'rule' must be a function");return j.push(a),this},this.otherwise=function(a){if(I(a)){var b=a;a=function(){return b}}else if(!H(a))throw new Error("'rule' must be a function");return k=a,this},this.when=function(a,b){var c,h=I(b);if(I(a)&&(a=d.compile(a)),!h&&!H(b)&&!K(b))throw new Error("invalid 'handler' in when()");var i={matcher:function(a,b){return h&&(c=d.compile(b),b=["$match",function(a){return c.format(a)}]),M(function(c,d){return g(c,b,a.exec(d.path(),d.search()))},{prefix:I(a.prefix)?a.prefix:""})},regex:function(a,b){if(a.global||a.sticky)throw new Error("when() RegExp must not be global or sticky");return h&&(c=b,b=["$match",function(a){return f(c,a)}]),M(function(c,d){return g(c,b,a.exec(d.path()))},{prefix:e(a)})}},j={matcher:d.isMatcher(a),regex:a instanceof RegExp};for(var k in j)if(j[k])return this.rule(i[k](a,b));throw new Error("invalid 'what' in when()")},this.deferIntercept=function(a){a===c&&(a=!0),l=a},this.$get=h,h.$inject=["$location","$rootScope","$injector","$browser"]}function u(a,e){function f(a){return 0===a.indexOf(".")||0===a.indexOf("^")}function l(a,b){if(!a)return c;var d=I(a),e=d?a:a.name,g=f(e);if(g){if(!b)throw new Error("No reference point given for path '"+e+"'");b=l(b);for(var h=e.split("."),i=0,j=h.length,k=b;j>i;i++)if(""!==h[i]||0!==i){if("^"!==h[i])break;if(!k.parent)throw new Error("Path '"+e+"' not valid for state '"+b.name+"'");k=k.parent}else k=b;h=h.slice(i).join("."),e=k.name+(k.name&&h?".":"")+h}var m=y[e];return!m||!d&&(d||m!==a&&m.self!==a)?c:m}function m(a,b){z[a]||(z[a]=[]),z[a].push(b)}function o(a){for(var b=z[a]||[];b.length;)p(b.shift())}function p(b){b=d(b,{self:b,resolve:b.resolve||{},toString:function(){return this.name}});var c=b.name;if(!I(c)||c.indexOf("@")>=0)throw new Error("State must have a valid name");if(y.hasOwnProperty(c))throw new Error("State '"+c+"'' is already defined");var e=-1!==c.indexOf(".")?c.substring(0,c.lastIndexOf(".")):I(b.parent)?b.parent:J(b.parent)&&I(b.parent.name)?b.parent.name:"";if(e&&!y[e])return m(e,b.self);for(var f in B)H(B[f])&&(b[f]=B[f](b,B.$delegates[f]));return y[c]=b,!b[A]&&b.url&&a.when(b.url,["$match","$stateParams",function(a,c){x.$current.navigable==b&&j(a,c)||x.transitionTo(b,a,{inherit:!0,location:!1})}]),o(c),b}function q(a){return a.indexOf("*")>-1}function r(a){var b=a.split("."),c=x.$current.name.split(".");if("**"===b[0]&&(c=c.slice(h(c,b[1])),c.unshift("**")),"**"===b[b.length-1]&&(c.splice(h(c,b[b.length-2])+1,Number.MAX_VALUE),c.push("**")),b.length!=c.length)return!1;for(var d=0,e=b.length;e>d;d++)"*"===b[d]&&(c[d]="*");return c.join("")===b.join("")}function s(a,b){return I(a)&&!G(b)?B[a]:H(b)&&I(a)?(B[a]&&!B.$delegates[a]&&(B.$delegates[a]=B[a]),B[a]=b,this):this}function t(a,b){return J(a)?b=a:b.name=a,p(b),this}function u(a,e,f,h,m,o,p){function s(b,c,d,f){var g=a.$broadcast("$stateNotFound",b,c,d);if(g.defaultPrevented)return p.update(),B;if(!g.retry)return null;if(f.$retry)return p.update(),C;var h=x.transition=e.when(g.retry);return h.then(function(){return h!==x.transition?u:(b.options.$retry=!0,x.transitionTo(b.to,b.toParams,b.options))},function(){return B}),p.update(),h}function t(a,c,d,g,i,j){var l=d?c:k(a.params.$$keys(),c),n={$stateParams:l};i.resolve=m.resolve(a.resolve,n,i.resolve,a);var o=[i.resolve.then(function(a){i.globals=a})];return g&&o.push(g),L(a.views,function(c,d){var e=c.resolve&&c.resolve!==a.resolve?c.resolve:{};e.$template=[function(){return f.load(d,{view:c,locals:n,params:l,notify:j.notify})||""}],o.push(m.resolve(e,n,i.resolve,a).then(function(f){if(H(c.controllerProvider)||K(c.controllerProvider)){var g=b.extend({},e,n);f.$$controller=h.invoke(c.controllerProvider,null,g)}else f.$$controller=c.controller;f.$$state=a,f.$$controllerAs=c.controllerAs,i[d]=f}))}),e.all(o).then(function(){return i})}var u=e.reject(new Error("transition superseded")),z=e.reject(new Error("transition prevented")),B=e.reject(new Error("transition aborted")),C=e.reject(new Error("transition failed"));return w.locals={resolve:null,globals:{$stateParams:{}}},x={params:{},current:w.self,$current:w,transition:null},x.reload=function(){return x.transitionTo(x.current,o,{reload:!0,inherit:!1,notify:!0})},x.go=function(a,b,c){return x.transitionTo(a,b,M({inherit:!0,relative:x.$current},c))},x.transitionTo=function(b,c,f){c=c||{},f=M({location:!0,inherit:!1,relative:null,notify:!0,reload:!1,$retry:!1},f||{});var g,j=x.$current,m=x.params,n=j.path,q=l(b,f.relative);if(!G(q)){var r={to:b,toParams:c,options:f},y=s(r,j.self,m,f);if(y)return y;if(b=r.to,c=r.toParams,f=r.options,q=l(b,f.relative),!G(q)){if(!f.relative)throw new Error("No such state '"+b+"'");throw new Error("Could not resolve '"+b+"' from state '"+f.relative+"'")}}if(q[A])throw new Error("Cannot transition to abstract state '"+b+"'");if(f.inherit&&(c=i(o,c||{},x.$current,q)),!q.params.$$validates(c))return C;c=q.params.$$values(c),b=q;var B=b.path,D=0,E=B[D],F=w.locals,H=[];if(!f.reload)for(;E&&E===n[D]&&E.ownParams.$$equals(c,m);)F=H[D]=E.locals,D++,E=B[D];if(v(b,j,F,f))return b.self.reloadOnSearch!==!1&&p.update(),x.transition=null,e.when(x.current);if(c=k(b.params.$$keys(),c||{}),f.notify&&a.$broadcast("$stateChangeStart",b.self,c,j.self,m).defaultPrevented)return p.update(),z;for(var I=e.when(F),J=D;J=D;d--)g=n[d],g.self.onExit&&h.invoke(g.self.onExit,g.self,g.locals.globals),g.locals=null;for(d=D;d=0?e:e+"@"+(f?f.state.name:"")}function A(a,b){var c,d=a.match(/^\s*({[^}]*})\s*$/);if(d&&(a=b+"("+d[1]+")"),c=a.replace(/\n/g," ").match(/^([^(]+?)\s*(\((.*)\))?$/),!c||4!==c.length)throw new Error("Invalid state ref '"+a+"'");return{state:c[1],paramExpr:c[3]||null}}function B(a){var b=a.parent().inheritedData("$uiView");return b&&b.state&&b.state.name?b.state:void 0}function C(a,c){var d=["location","inherit","reload"];return{restrict:"A",require:["?^uiSrefActive","?^uiSrefActiveEq"],link:function(e,f,g,h){var i=A(g.uiSref,a.current.name),j=null,k=B(f)||a.$current,l=null,m="A"===f.prop("tagName"),n="FORM"===f[0].nodeName,o=n?"action":"href",p=!0,q={relative:k,inherit:!0},r=e.$eval(g.uiSrefOpts)||{};b.forEach(d,function(a){a in r&&(q[a]=r[a])});var s=function(c){if(c&&(j=b.copy(c)),p){l=a.href(i.state,j,q);var d=h[1]||h[0];return d&&d.$$setStateInfo(i.state,j),null===l?(p=!1,!1):void g.$set(o,l)}};i.paramExpr&&(e.$watch(i.paramExpr,function(a){a!==j&&s(a)},!0),j=b.copy(e.$eval(i.paramExpr))),s(),n||f.bind("click",function(b){var d=b.which||b.button;if(!(d>1||b.ctrlKey||b.metaKey||b.shiftKey||f.attr("target"))){var e=c(function(){a.go(i.state,j,q)});b.preventDefault();var g=m&&!l?1:0;b.preventDefault=function(){g--<=0&&c.cancel(e)}}})}}}function D(a,b,c){return{restrict:"A",controller:["$scope","$element","$attrs",function(b,d,e){function f(){g()?d.addClass(j):d.removeClass(j)}function g(){return"undefined"!=typeof e.uiSrefActiveEq?h&&a.is(h.name,i):h&&a.includes(h.name,i)}var h,i,j;j=c(e.uiSrefActiveEq||e.uiSrefActive||"",!1)(b),this.$$setStateInfo=function(b,c){h=a.get(b,B(d)),i=c,f()},b.$on("$stateChangeSuccess",f)}]}}function E(a){var b=function(b){return a.is(b)};return b.$stateful=!0,b}function F(a){var b=function(b){return a.includes(b)};return b.$stateful=!0,b}var G=b.isDefined,H=b.isFunction,I=b.isString,J=b.isObject,K=b.isArray,L=b.forEach,M=b.extend,N=b.copy;b.module("ui.router.util",["ng"]),b.module("ui.router.router",["ui.router.util"]),b.module("ui.router.state",["ui.router.router","ui.router.util"]),b.module("ui.router",["ui.router.state"]),b.module("ui.router.compat",["ui.router"]),o.$inject=["$q","$injector"],b.module("ui.router.util").service("$resolve",o),p.$inject=["$http","$templateCache","$injector"],b.module("ui.router.util").service("$templateFactory",p);var O;q.prototype.concat=function(a,b){var c={caseInsensitive:O.caseInsensitive(),strict:O.strictMode(),squash:O.defaultSquashPolicy()};return new q(this.sourcePath+a+this.sourceSearch,M(c,b),this)},q.prototype.toString=function(){return this.source},q.prototype.exec=function(a,b){function c(a){function b(a){return a.split("").reverse().join("")}function c(a){return a.replace(/\\-/,"-")}var d=b(a).split(/-(?!\\)/),e=n(d,b);return n(e,c).reverse()}var d=this.regexp.exec(a);if(!d)return null;b=b||{};var e,f,g,h=this.parameters(),i=h.length,j=this.segments.length-1,k={};if(j!==d.length-1)throw new Error("Unbalanced capture group in route '"+this.source+"'");for(e=0;j>e;e++){g=h[e];var l=this.params[g],m=d[e+1];for(f=0;fe;e++)g=h[e],k[g]=this.params[g].value(b[g]);return k},q.prototype.parameters=function(a){return G(a)?this.params[a]||null:this.$$paramNames},q.prototype.validates=function(a){return this.params.$$validates(a)},q.prototype.format=function(a){function b(a){return encodeURIComponent(a).replace(/-/g,function(a){return"%5C%"+a.charCodeAt(0).toString(16).toUpperCase()})}a=a||{};var c=this.segments,d=this.parameters(),e=this.params;if(!this.validates(a))return null;var f,g=!1,h=c.length-1,i=d.length,j=c[0];for(f=0;i>f;f++){var k=h>f,l=d[f],m=e[l],o=m.value(a[l]),p=m.isOptional&&m.type.equals(m.value(),o),q=p?m.squash:!1,r=m.type.encode(o);if(k){var s=c[f+1];if(q===!1)null!=r&&(j+=K(r)?n(r,b).join("-"):encodeURIComponent(r)),j+=s;else if(q===!0){var t=j.match(/\/$/)?/\/?(.*)/:/(.*)/;j+=s.match(t)[1]}else I(q)&&(j+=q+s)}else{if(null==r||p&&q!==!1)continue;K(r)||(r=[r]),r=n(r,encodeURIComponent).join("&"+l+"="),j+=(g?"&":"?")+(l+"="+r),g=!0}}return j},r.prototype.is=function(){return!0},r.prototype.encode=function(a){return a},r.prototype.decode=function(a){return a},r.prototype.equals=function(a,b){return a==b},r.prototype.$subPattern=function(){var a=this.pattern.toString();return a.substr(1,a.length-2)},r.prototype.pattern=/.*/,r.prototype.toString=function(){return"{Type:"+this.name+"}"},r.prototype.$asArray=function(a,b){function d(a,b){function d(a,b){return function(){return a[b].apply(a,arguments)}}function e(a){return K(a)?a:G(a)?[a]:[]}function f(a){switch(a.length){case 0:return c;case 1:return"auto"===b?a[0]:a;default:return a}}function g(a){return!a}function h(a,b){return function(c){c=e(c);var d=n(c,a);return b===!0?0===m(d,g).length:f(d)}}function i(a){return function(b,c){var d=e(b),f=e(c);if(d.length!==f.length)return!1;for(var g=0;g>> 0, from = Number(arguments[2]) || 0; + from = (from < 0) ? Math.ceil(from) : Math.floor(from); + + if (from < 0) from += len; + + for (; from < len; from++) { + if (from in array && array[from] === value) return from; + } + return -1; +} + +/** + * Merges a set of parameters with all parameters inherited between the common parents of the + * current state and a given destination state. + * + * @param {Object} currentParams The value of the current state parameters ($stateParams). + * @param {Object} newParams The set of parameters which will be composited with inherited params. + * @param {Object} $current Internal definition of object representing the current state. + * @param {Object} $to Internal definition of object representing state to transition to. + */ +function inheritParams(currentParams, newParams, $current, $to) { + var parents = ancestors($current, $to), parentParams, inherited = {}, inheritList = []; + + for (var i in parents) { + if (!parents[i].params) continue; + parentParams = objectKeys(parents[i].params); + if (!parentParams.length) continue; + + for (var j in parentParams) { + if (indexOf(inheritList, parentParams[j]) >= 0) continue; + inheritList.push(parentParams[j]); + inherited[parentParams[j]] = currentParams[parentParams[j]]; + } + } + return extend({}, inherited, newParams); +} + +/** + * Performs a non-strict comparison of the subset of two objects, defined by a list of keys. + * + * @param {Object} a The first object. + * @param {Object} b The second object. + * @param {Array} keys The list of keys within each object to compare. If the list is empty or not specified, + * it defaults to the list of keys in `a`. + * @return {Boolean} Returns `true` if the keys match, otherwise `false`. + */ +function equalForKeys(a, b, keys) { + if (!keys) { + keys = []; + for (var n in a) keys.push(n); // Used instead of Object.keys() for IE8 compatibility + } + + for (var i=0; i + * + * + * + * + * + * + * + * + * + * + * + * + */ +angular.module('ui.router', ['ui.router.state']); + +angular.module('ui.router.compat', ['ui.router']); diff --git a/www/lib/angular-ui-router/src/resolve.js b/www/lib/angular-ui-router/src/resolve.js new file mode 100644 index 0000000..f1c1790 --- /dev/null +++ b/www/lib/angular-ui-router/src/resolve.js @@ -0,0 +1,252 @@ +/** + * @ngdoc object + * @name ui.router.util.$resolve + * + * @requires $q + * @requires $injector + * + * @description + * Manages resolution of (acyclic) graphs of promises. + */ +$Resolve.$inject = ['$q', '$injector']; +function $Resolve( $q, $injector) { + + var VISIT_IN_PROGRESS = 1, + VISIT_DONE = 2, + NOTHING = {}, + NO_DEPENDENCIES = [], + NO_LOCALS = NOTHING, + NO_PARENT = extend($q.when(NOTHING), { $$promises: NOTHING, $$values: NOTHING }); + + + /** + * @ngdoc function + * @name ui.router.util.$resolve#study + * @methodOf ui.router.util.$resolve + * + * @description + * Studies a set of invocables that are likely to be used multiple times. + *
+   * $resolve.study(invocables)(locals, parent, self)
+   * 
+ * is equivalent to + *
+   * $resolve.resolve(invocables, locals, parent, self)
+   * 
+ * but the former is more efficient (in fact `resolve` just calls `study` + * internally). + * + * @param {object} invocables Invocable objects + * @return {function} a function to pass in locals, parent and self + */ + this.study = function (invocables) { + if (!isObject(invocables)) throw new Error("'invocables' must be an object"); + var invocableKeys = objectKeys(invocables || {}); + + // Perform a topological sort of invocables to build an ordered plan + var plan = [], cycle = [], visited = {}; + function visit(value, key) { + if (visited[key] === VISIT_DONE) return; + + cycle.push(key); + if (visited[key] === VISIT_IN_PROGRESS) { + cycle.splice(0, indexOf(cycle, key)); + throw new Error("Cyclic dependency: " + cycle.join(" -> ")); + } + visited[key] = VISIT_IN_PROGRESS; + + if (isString(value)) { + plan.push(key, [ function() { return $injector.get(value); }], NO_DEPENDENCIES); + } else { + var params = $injector.annotate(value); + forEach(params, function (param) { + if (param !== key && invocables.hasOwnProperty(param)) visit(invocables[param], param); + }); + plan.push(key, value, params); + } + + cycle.pop(); + visited[key] = VISIT_DONE; + } + forEach(invocables, visit); + invocables = cycle = visited = null; // plan is all that's required + + function isResolve(value) { + return isObject(value) && value.then && value.$$promises; + } + + return function (locals, parent, self) { + if (isResolve(locals) && self === undefined) { + self = parent; parent = locals; locals = null; + } + if (!locals) locals = NO_LOCALS; + else if (!isObject(locals)) { + throw new Error("'locals' must be an object"); + } + if (!parent) parent = NO_PARENT; + else if (!isResolve(parent)) { + throw new Error("'parent' must be a promise returned by $resolve.resolve()"); + } + + // To complete the overall resolution, we have to wait for the parent + // promise and for the promise for each invokable in our plan. + var resolution = $q.defer(), + result = resolution.promise, + promises = result.$$promises = {}, + values = extend({}, locals), + wait = 1 + plan.length/3, + merged = false; + + function done() { + // Merge parent values we haven't got yet and publish our own $$values + if (!--wait) { + if (!merged) merge(values, parent.$$values); + result.$$values = values; + result.$$promises = result.$$promises || true; // keep for isResolve() + delete result.$$inheritedValues; + resolution.resolve(values); + } + } + + function fail(reason) { + result.$$failure = reason; + resolution.reject(reason); + } + + // Short-circuit if parent has already failed + if (isDefined(parent.$$failure)) { + fail(parent.$$failure); + return result; + } + + if (parent.$$inheritedValues) { + merge(values, omit(parent.$$inheritedValues, invocableKeys)); + } + + // Merge parent values if the parent has already resolved, or merge + // parent promises and wait if the parent resolve is still in progress. + extend(promises, parent.$$promises); + if (parent.$$values) { + merged = merge(values, omit(parent.$$values, invocableKeys)); + result.$$inheritedValues = omit(parent.$$values, invocableKeys); + done(); + } else { + if (parent.$$inheritedValues) { + result.$$inheritedValues = omit(parent.$$inheritedValues, invocableKeys); + } + parent.then(done, fail); + } + + // Process each invocable in the plan, but ignore any where a local of the same name exists. + for (var i=0, ii=plan.length; i= 0) throw new Error("State must have a valid name"); + if (states.hasOwnProperty(name)) throw new Error("State '" + name + "'' is already defined"); + + // Get parent name + var parentName = (name.indexOf('.') !== -1) ? name.substring(0, name.lastIndexOf('.')) + : (isString(state.parent)) ? state.parent + : (isObject(state.parent) && isString(state.parent.name)) ? state.parent.name + : ''; + + // If parent is not registered yet, add state to queue and register later + if (parentName && !states[parentName]) { + return queueState(parentName, state.self); + } + + for (var key in stateBuilder) { + if (isFunction(stateBuilder[key])) state[key] = stateBuilder[key](state, stateBuilder.$delegates[key]); + } + states[name] = state; + + // Register the state in the global state list and with $urlRouter if necessary. + if (!state[abstractKey] && state.url) { + $urlRouterProvider.when(state.url, ['$match', '$stateParams', function ($match, $stateParams) { + if ($state.$current.navigable != state || !equalForKeys($match, $stateParams)) { + $state.transitionTo(state, $match, { inherit: true, location: false }); + } + }]); + } + + // Register any queued children + flushQueuedChildren(name); + + return state; + } + + // Checks text to see if it looks like a glob. + function isGlob (text) { + return text.indexOf('*') > -1; + } + + // Returns true if glob matches current $state name. + function doesStateMatchGlob (glob) { + var globSegments = glob.split('.'), + segments = $state.$current.name.split('.'); + + //match greedy starts + if (globSegments[0] === '**') { + segments = segments.slice(indexOf(segments, globSegments[1])); + segments.unshift('**'); + } + //match greedy ends + if (globSegments[globSegments.length - 1] === '**') { + segments.splice(indexOf(segments, globSegments[globSegments.length - 2]) + 1, Number.MAX_VALUE); + segments.push('**'); + } + + if (globSegments.length != segments.length) { + return false; + } + + //match single stars + for (var i = 0, l = globSegments.length; i < l; i++) { + if (globSegments[i] === '*') { + segments[i] = '*'; + } + } + + return segments.join('') === globSegments.join(''); + } + + + // Implicit root state that is always active + root = registerState({ + name: '', + url: '^', + views: null, + 'abstract': true + }); + root.navigable = null; + + + /** + * @ngdoc function + * @name ui.router.state.$stateProvider#decorator + * @methodOf ui.router.state.$stateProvider + * + * @description + * Allows you to extend (carefully) or override (at your own peril) the + * `stateBuilder` object used internally by `$stateProvider`. This can be used + * to add custom functionality to ui-router, for example inferring templateUrl + * based on the state name. + * + * When passing only a name, it returns the current (original or decorated) builder + * function that matches `name`. + * + * The builder functions that can be decorated are listed below. Though not all + * necessarily have a good use case for decoration, that is up to you to decide. + * + * In addition, users can attach custom decorators, which will generate new + * properties within the state's internal definition. There is currently no clear + * use-case for this beyond accessing internal states (i.e. $state.$current), + * however, expect this to become increasingly relevant as we introduce additional + * meta-programming features. + * + * **Warning**: Decorators should not be interdependent because the order of + * execution of the builder functions in non-deterministic. Builder functions + * should only be dependent on the state definition object and super function. + * + * + * Existing builder functions and current return values: + * + * - **parent** `{object}` - returns the parent state object. + * - **data** `{object}` - returns state data, including any inherited data that is not + * overridden by own values (if any). + * - **url** `{object}` - returns a {@link ui.router.util.type:UrlMatcher UrlMatcher} + * or `null`. + * - **navigable** `{object}` - returns closest ancestor state that has a URL (aka is + * navigable). + * - **params** `{object}` - returns an array of state params that are ensured to + * be a super-set of parent's params. + * - **views** `{object}` - returns a views object where each key is an absolute view + * name (i.e. "viewName@stateName") and each value is the config object + * (template, controller) for the view. Even when you don't use the views object + * explicitly on a state config, one is still created for you internally. + * So by decorating this builder function you have access to decorating template + * and controller properties. + * - **ownParams** `{object}` - returns an array of params that belong to the state, + * not including any params defined by ancestor states. + * - **path** `{string}` - returns the full path from the root down to this state. + * Needed for state activation. + * - **includes** `{object}` - returns an object that includes every state that + * would pass a `$state.includes()` test. + * + * @example + *
+   * // Override the internal 'views' builder with a function that takes the state
+   * // definition, and a reference to the internal function being overridden:
+   * $stateProvider.decorator('views', function (state, parent) {
+   *   var result = {},
+   *       views = parent(state);
+   *
+   *   angular.forEach(views, function (config, name) {
+   *     var autoName = (state.name + '.' + name).replace('.', '/');
+   *     config.templateUrl = config.templateUrl || '/partials/' + autoName + '.html';
+   *     result[name] = config;
+   *   });
+   *   return result;
+   * });
+   *
+   * $stateProvider.state('home', {
+   *   views: {
+   *     'contact.list': { controller: 'ListController' },
+   *     'contact.item': { controller: 'ItemController' }
+   *   }
+   * });
+   *
+   * // ...
+   *
+   * $state.go('home');
+   * // Auto-populates list and item views with /partials/home/contact/list.html,
+   * // and /partials/home/contact/item.html, respectively.
+   * 
+ * + * @param {string} name The name of the builder function to decorate. + * @param {object} func A function that is responsible for decorating the original + * builder function. The function receives two parameters: + * + * - `{object}` - state - The state config object. + * - `{object}` - super - The original builder function. + * + * @return {object} $stateProvider - $stateProvider instance + */ + this.decorator = decorator; + function decorator(name, func) { + /*jshint validthis: true */ + if (isString(name) && !isDefined(func)) { + return stateBuilder[name]; + } + if (!isFunction(func) || !isString(name)) { + return this; + } + if (stateBuilder[name] && !stateBuilder.$delegates[name]) { + stateBuilder.$delegates[name] = stateBuilder[name]; + } + stateBuilder[name] = func; + return this; + } + + /** + * @ngdoc function + * @name ui.router.state.$stateProvider#state + * @methodOf ui.router.state.$stateProvider + * + * @description + * Registers a state configuration under a given state name. The stateConfig object + * has the following acceptable properties. + * + * @param {string} name A unique state name, e.g. "home", "about", "contacts". + * To create a parent/child state use a dot, e.g. "about.sales", "home.newest". + * @param {object} stateConfig State configuration object. + * @param {string|function=} stateConfig.template + * + * html template as a string or a function that returns + * an html template as a string which should be used by the uiView directives. This property + * takes precedence over templateUrl. + * + * If `template` is a function, it will be called with the following parameters: + * + * - {array.<object>} - state parameters extracted from the current $location.path() by + * applying the current state + * + *
template:
+   *   "

inline template definition

" + + * "
"
+ *
template: function(params) {
+   *       return "

generated template

"; }
+ * + * + * @param {string|function=} stateConfig.templateUrl + * + * + * path or function that returns a path to an html + * template that should be used by uiView. + * + * If `templateUrl` is a function, it will be called with the following parameters: + * + * - {array.<object>} - state parameters extracted from the current $location.path() by + * applying the current state + * + *
templateUrl: "home.html"
+ *
templateUrl: function(params) {
+   *     return myTemplates[params.pageId]; }
+ * + * @param {function=} stateConfig.templateProvider + * + * Provider function that returns HTML content string. + *
 templateProvider:
+   *       function(MyTemplateService, params) {
+   *         return MyTemplateService.getTemplate(params.pageId);
+   *       }
+ * + * @param {string|function=} stateConfig.controller + * + * + * Controller fn that should be associated with newly + * related scope or the name of a registered controller if passed as a string. + * Optionally, the ControllerAs may be declared here. + *
controller: "MyRegisteredController"
+ *
controller:
+   *     "MyRegisteredController as fooCtrl"}
+ *
controller: function($scope, MyService) {
+   *     $scope.data = MyService.getData(); }
+ * + * @param {function=} stateConfig.controllerProvider + * + * + * Injectable provider function that returns the actual controller or string. + *
controllerProvider:
+   *   function(MyResolveData) {
+   *     if (MyResolveData.foo)
+   *       return "FooCtrl"
+   *     else if (MyResolveData.bar)
+   *       return "BarCtrl";
+   *     else return function($scope) {
+   *       $scope.baz = "Qux";
+   *     }
+   *   }
+ * + * @param {string=} stateConfig.controllerAs + * + * + * A controller alias name. If present the controller will be + * published to scope under the controllerAs name. + *
controllerAs: "myCtrl"
+ * + * @param {object=} stateConfig.resolve + * + * + * An optional map<string, function> of dependencies which + * should be injected into the controller. If any of these dependencies are promises, + * the router will wait for them all to be resolved before the controller is instantiated. + * If all the promises are resolved successfully, the $stateChangeSuccess event is fired + * and the values of the resolved promises are injected into any controllers that reference them. + * If any of the promises are rejected the $stateChangeError event is fired. + * + * The map object is: + * + * - key - {string}: name of dependency to be injected into controller + * - factory - {string|function}: If string then it is alias for service. Otherwise if function, + * it is injected and return value it treated as dependency. If result is a promise, it is + * resolved before its value is injected into controller. + * + *
resolve: {
+   *     myResolve1:
+   *       function($http, $stateParams) {
+   *         return $http.get("/api/foos/"+stateParams.fooID);
+   *       }
+   *     }
+ * + * @param {string=} stateConfig.url + * + * + * A url fragment with optional parameters. When a state is navigated or + * transitioned to, the `$stateParams` service will be populated with any + * parameters that were passed. + * + * examples: + *
url: "/home"
+   * url: "/users/:userid"
+   * url: "/books/{bookid:[a-zA-Z_-]}"
+   * url: "/books/{categoryid:int}"
+   * url: "/books/{publishername:string}/{categoryid:int}"
+   * url: "/messages?before&after"
+   * url: "/messages?{before:date}&{after:date}"
+ * url: "/messages/:mailboxid?{before:date}&{after:date}" + * + * @param {object=} stateConfig.views + * + * an optional map<string, object> which defined multiple views, or targets views + * manually/explicitly. + * + * Examples: + * + * Targets three named `ui-view`s in the parent state's template + *
views: {
+   *     header: {
+   *       controller: "headerCtrl",
+   *       templateUrl: "header.html"
+   *     }, body: {
+   *       controller: "bodyCtrl",
+   *       templateUrl: "body.html"
+   *     }, footer: {
+   *       controller: "footCtrl",
+   *       templateUrl: "footer.html"
+   *     }
+   *   }
+ * + * Targets named `ui-view="header"` from grandparent state 'top''s template, and named `ui-view="body" from parent state's template. + *
views: {
+   *     'header@top': {
+   *       controller: "msgHeaderCtrl",
+   *       templateUrl: "msgHeader.html"
+   *     }, 'body': {
+   *       controller: "messagesCtrl",
+   *       templateUrl: "messages.html"
+   *     }
+   *   }
+ * + * @param {boolean=} [stateConfig.abstract=false] + * + * An abstract state will never be directly activated, + * but can provide inherited properties to its common children states. + *
abstract: true
+ * + * @param {function=} stateConfig.onEnter + * + * + * Callback function for when a state is entered. Good way + * to trigger an action or dispatch an event, such as opening a dialog. + * If minifying your scripts, make sure to explictly annotate this function, + * because it won't be automatically annotated by your build tools. + * + *
onEnter: function(MyService, $stateParams) {
+   *     MyService.foo($stateParams.myParam);
+   * }
+ * + * @param {function=} stateConfig.onExit + * + * + * Callback function for when a state is exited. Good way to + * trigger an action or dispatch an event, such as opening a dialog. + * If minifying your scripts, make sure to explictly annotate this function, + * because it won't be automatically annotated by your build tools. + * + *
onExit: function(MyService, $stateParams) {
+   *     MyService.cleanup($stateParams.myParam);
+   * }
+ * + * @param {boolean=} [stateConfig.reloadOnSearch=true] + * + * + * If `false`, will not retrigger the same state + * just because a search/query parameter has changed (via $location.search() or $location.hash()). + * Useful for when you'd like to modify $location.search() without triggering a reload. + *
reloadOnSearch: false
+ * + * @param {object=} stateConfig.data + * + * + * Arbitrary data object, useful for custom configuration. The parent state's `data` is + * prototypally inherited. In other words, adding a data property to a state adds it to + * the entire subtree via prototypal inheritance. + * + *
data: {
+   *     requiredRole: 'foo'
+   * } 
+ * + * @param {object=} stateConfig.params + * + * + * A map which optionally configures parameters declared in the `url`, or + * defines additional non-url parameters. For each parameter being + * configured, add a configuration object keyed to the name of the parameter. + * + * Each parameter configuration object may contain the following properties: + * + * - ** value ** - {object|function=}: specifies the default value for this + * parameter. This implicitly sets this parameter as optional. + * + * When UI-Router routes to a state and no value is + * specified for this parameter in the URL or transition, the + * default value will be used instead. If `value` is a function, + * it will be injected and invoked, and the return value used. + * + * *Note*: `undefined` is treated as "no default value" while `null` + * is treated as "the default value is `null`". + * + * *Shorthand*: If you only need to configure the default value of the + * parameter, you may use a shorthand syntax. In the **`params`** + * map, instead mapping the param name to a full parameter configuration + * object, simply set map it to the default parameter value, e.g.: + * + *
// define a parameter's default value
+   * params: {
+   *     param1: { value: "defaultValue" }
+   * }
+   * // shorthand default values
+   * params: {
+   *     param1: "defaultValue",
+   *     param2: "param2Default"
+   * }
+ * + * - ** array ** - {boolean=}: *(default: false)* If true, the param value will be + * treated as an array of values. If you specified a Type, the value will be + * treated as an array of the specified Type. Note: query parameter values + * default to a special `"auto"` mode. + * + * For query parameters in `"auto"` mode, if multiple values for a single parameter + * are present in the URL (e.g.: `/foo?bar=1&bar=2&bar=3`) then the values + * are mapped to an array (e.g.: `{ foo: [ '1', '2', '3' ] }`). However, if + * only one value is present (e.g.: `/foo?bar=1`) then the value is treated as single + * value (e.g.: `{ foo: '1' }`). + * + *
params: {
+   *     param1: { array: true }
+   * }
+ * + * - ** squash ** - {bool|string=}: `squash` configures how a default parameter value is represented in the URL when + * the current parameter value is the same as the default value. If `squash` is not set, it uses the + * configured default squash policy. + * (See {@link ui.router.util.$urlMatcherFactory#methods_defaultSquashPolicy `defaultSquashPolicy()`}) + * + * There are three squash settings: + * + * - false: The parameter's default value is not squashed. It is encoded and included in the URL + * - true: The parameter's default value is omitted from the URL. If the parameter is preceeded and followed + * by slashes in the state's `url` declaration, then one of those slashes are omitted. + * This can allow for cleaner looking URLs. + * - `""`: The parameter's default value is replaced with an arbitrary placeholder of your choice. + * + *
params: {
+   *     param1: {
+   *       value: "defaultId",
+   *       squash: true
+   * } }
+   * // squash "defaultValue" to "~"
+   * params: {
+   *     param1: {
+   *       value: "defaultValue",
+   *       squash: "~"
+   * } }
+   * 
+ * + * + * @example + *
+   * // Some state name examples
+   *
+   * // stateName can be a single top-level name (must be unique).
+   * $stateProvider.state("home", {});
+   *
+   * // Or it can be a nested state name. This state is a child of the
+   * // above "home" state.
+   * $stateProvider.state("home.newest", {});
+   *
+   * // Nest states as deeply as needed.
+   * $stateProvider.state("home.newest.abc.xyz.inception", {});
+   *
+   * // state() returns $stateProvider, so you can chain state declarations.
+   * $stateProvider
+   *   .state("home", {})
+   *   .state("about", {})
+   *   .state("contacts", {});
+   * 
+ * + */ + this.state = state; + function state(name, definition) { + /*jshint validthis: true */ + if (isObject(name)) definition = name; + else definition.name = name; + registerState(definition); + return this; + } + + /** + * @ngdoc object + * @name ui.router.state.$state + * + * @requires $rootScope + * @requires $q + * @requires ui.router.state.$view + * @requires $injector + * @requires ui.router.util.$resolve + * @requires ui.router.state.$stateParams + * @requires ui.router.router.$urlRouter + * + * @property {object} params A param object, e.g. {sectionId: section.id)}, that + * you'd like to test against the current active state. + * @property {object} current A reference to the state's config object. However + * you passed it in. Useful for accessing custom data. + * @property {object} transition Currently pending transition. A promise that'll + * resolve or reject. + * + * @description + * `$state` service is responsible for representing states as well as transitioning + * between them. It also provides interfaces to ask for current state or even states + * you're coming from. + */ + this.$get = $get; + $get.$inject = ['$rootScope', '$q', '$view', '$injector', '$resolve', '$stateParams', '$urlRouter', '$location', '$urlMatcherFactory']; + function $get( $rootScope, $q, $view, $injector, $resolve, $stateParams, $urlRouter, $location, $urlMatcherFactory) { + + var TransitionSuperseded = $q.reject(new Error('transition superseded')); + var TransitionPrevented = $q.reject(new Error('transition prevented')); + var TransitionAborted = $q.reject(new Error('transition aborted')); + var TransitionFailed = $q.reject(new Error('transition failed')); + + // Handles the case where a state which is the target of a transition is not found, and the user + // can optionally retry or defer the transition + function handleRedirect(redirect, state, params, options) { + /** + * @ngdoc event + * @name ui.router.state.$state#$stateNotFound + * @eventOf ui.router.state.$state + * @eventType broadcast on root scope + * @description + * Fired when a requested state **cannot be found** using the provided state name during transition. + * The event is broadcast allowing any handlers a single chance to deal with the error (usually by + * lazy-loading the unfound state). A special `unfoundState` object is passed to the listener handler, + * you can see its three properties in the example. You can use `event.preventDefault()` to abort the + * transition and the promise returned from `go` will be rejected with a `'transition aborted'` value. + * + * @param {Object} event Event object. + * @param {Object} unfoundState Unfound State information. Contains: `to, toParams, options` properties. + * @param {State} fromState Current state object. + * @param {Object} fromParams Current state params. + * + * @example + * + *
+       * // somewhere, assume lazy.state has not been defined
+       * $state.go("lazy.state", {a:1, b:2}, {inherit:false});
+       *
+       * // somewhere else
+       * $scope.$on('$stateNotFound',
+       * function(event, unfoundState, fromState, fromParams){
+       *     console.log(unfoundState.to); // "lazy.state"
+       *     console.log(unfoundState.toParams); // {a:1, b:2}
+       *     console.log(unfoundState.options); // {inherit:false} + default options
+       * })
+       * 
+ */ + var evt = $rootScope.$broadcast('$stateNotFound', redirect, state, params); + + if (evt.defaultPrevented) { + $urlRouter.update(); + return TransitionAborted; + } + + if (!evt.retry) { + return null; + } + + // Allow the handler to return a promise to defer state lookup retry + if (options.$retry) { + $urlRouter.update(); + return TransitionFailed; + } + var retryTransition = $state.transition = $q.when(evt.retry); + + retryTransition.then(function() { + if (retryTransition !== $state.transition) return TransitionSuperseded; + redirect.options.$retry = true; + return $state.transitionTo(redirect.to, redirect.toParams, redirect.options); + }, function() { + return TransitionAborted; + }); + $urlRouter.update(); + + return retryTransition; + } + + root.locals = { resolve: null, globals: { $stateParams: {} } }; + + $state = { + params: {}, + current: root.self, + $current: root, + transition: null + }; + + /** + * @ngdoc function + * @name ui.router.state.$state#reload + * @methodOf ui.router.state.$state + * + * @description + * A method that force reloads the current state. All resolves are re-resolved, events are not re-fired, + * and controllers reinstantiated (bug with controllers reinstantiating right now, fixing soon). + * + * @example + *
+     * var app angular.module('app', ['ui.router']);
+     *
+     * app.controller('ctrl', function ($scope, $state) {
+     *   $scope.reload = function(){
+     *     $state.reload();
+     *   }
+     * });
+     * 
+ * + * `reload()` is just an alias for: + *
+     * $state.transitionTo($state.current, $stateParams, { 
+     *   reload: true, inherit: false, notify: true
+     * });
+     * 
+ * + * @returns {promise} A promise representing the state of the new transition. See + * {@link ui.router.state.$state#methods_go $state.go}. + */ + $state.reload = function reload() { + return $state.transitionTo($state.current, $stateParams, { reload: true, inherit: false, notify: true }); + }; + + /** + * @ngdoc function + * @name ui.router.state.$state#go + * @methodOf ui.router.state.$state + * + * @description + * Convenience method for transitioning to a new state. `$state.go` calls + * `$state.transitionTo` internally but automatically sets options to + * `{ location: true, inherit: true, relative: $state.$current, notify: true }`. + * This allows you to easily use an absolute or relative to path and specify + * only the parameters you'd like to update (while letting unspecified parameters + * inherit from the currently active ancestor states). + * + * @example + *
+     * var app = angular.module('app', ['ui.router']);
+     *
+     * app.controller('ctrl', function ($scope, $state) {
+     *   $scope.changeState = function () {
+     *     $state.go('contact.detail');
+     *   };
+     * });
+     * 
+ * + * + * @param {string} to Absolute state name or relative state path. Some examples: + * + * - `$state.go('contact.detail')` - will go to the `contact.detail` state + * - `$state.go('^')` - will go to a parent state + * - `$state.go('^.sibling')` - will go to a sibling state + * - `$state.go('.child.grandchild')` - will go to grandchild state + * + * @param {object=} params A map of the parameters that will be sent to the state, + * will populate $stateParams. Any parameters that are not specified will be inherited from currently + * defined parameters. This allows, for example, going to a sibling state that shares parameters + * specified in a parent state. Parameter inheritance only works between common ancestor states, I.e. + * transitioning to a sibling will get you the parameters for all parents, transitioning to a child + * will get you all current parameters, etc. + * @param {object=} options Options object. The options are: + * + * - **`location`** - {boolean=true|string=} - If `true` will update the url in the location bar, if `false` + * will not. If string, must be `"replace"`, which will update url and also replace last history record. + * - **`inherit`** - {boolean=true}, If `true` will inherit url parameters from current url. + * - **`relative`** - {object=$state.$current}, When transitioning with relative path (e.g '^'), + * defines which state to be relative from. + * - **`notify`** - {boolean=true}, If `true` will broadcast $stateChangeStart and $stateChangeSuccess events. + * - **`reload`** (v0.2.5) - {boolean=false}, If `true` will force transition even if the state or params + * have not changed, aka a reload of the same state. It differs from reloadOnSearch because you'd + * use this when you want to force a reload when *everything* is the same, including search params. + * + * @returns {promise} A promise representing the state of the new transition. + * + * Possible success values: + * + * - $state.current + * + *
Possible rejection values: + * + * - 'transition superseded' - when a newer transition has been started after this one + * - 'transition prevented' - when `event.preventDefault()` has been called in a `$stateChangeStart` listener + * - 'transition aborted' - when `event.preventDefault()` has been called in a `$stateNotFound` listener or + * when a `$stateNotFound` `event.retry` promise errors. + * - 'transition failed' - when a state has been unsuccessfully found after 2 tries. + * - *resolve error* - when an error has occurred with a `resolve` + * + */ + $state.go = function go(to, params, options) { + return $state.transitionTo(to, params, extend({ inherit: true, relative: $state.$current }, options)); + }; + + /** + * @ngdoc function + * @name ui.router.state.$state#transitionTo + * @methodOf ui.router.state.$state + * + * @description + * Low-level method for transitioning to a new state. {@link ui.router.state.$state#methods_go $state.go} + * uses `transitionTo` internally. `$state.go` is recommended in most situations. + * + * @example + *
+     * var app = angular.module('app', ['ui.router']);
+     *
+     * app.controller('ctrl', function ($scope, $state) {
+     *   $scope.changeState = function () {
+     *     $state.transitionTo('contact.detail');
+     *   };
+     * });
+     * 
+ * + * @param {string} to State name. + * @param {object=} toParams A map of the parameters that will be sent to the state, + * will populate $stateParams. + * @param {object=} options Options object. The options are: + * + * - **`location`** - {boolean=true|string=} - If `true` will update the url in the location bar, if `false` + * will not. If string, must be `"replace"`, which will update url and also replace last history record. + * - **`inherit`** - {boolean=false}, If `true` will inherit url parameters from current url. + * - **`relative`** - {object=}, When transitioning with relative path (e.g '^'), + * defines which state to be relative from. + * - **`notify`** - {boolean=true}, If `true` will broadcast $stateChangeStart and $stateChangeSuccess events. + * - **`reload`** (v0.2.5) - {boolean=false}, If `true` will force transition even if the state or params + * have not changed, aka a reload of the same state. It differs from reloadOnSearch because you'd + * use this when you want to force a reload when *everything* is the same, including search params. + * + * @returns {promise} A promise representing the state of the new transition. See + * {@link ui.router.state.$state#methods_go $state.go}. + */ + $state.transitionTo = function transitionTo(to, toParams, options) { + toParams = toParams || {}; + options = extend({ + location: true, inherit: false, relative: null, notify: true, reload: false, $retry: false + }, options || {}); + + var from = $state.$current, fromParams = $state.params, fromPath = from.path; + var evt, toState = findState(to, options.relative); + + if (!isDefined(toState)) { + var redirect = { to: to, toParams: toParams, options: options }; + var redirectResult = handleRedirect(redirect, from.self, fromParams, options); + + if (redirectResult) { + return redirectResult; + } + + // Always retry once if the $stateNotFound was not prevented + // (handles either redirect changed or state lazy-definition) + to = redirect.to; + toParams = redirect.toParams; + options = redirect.options; + toState = findState(to, options.relative); + + if (!isDefined(toState)) { + if (!options.relative) throw new Error("No such state '" + to + "'"); + throw new Error("Could not resolve '" + to + "' from state '" + options.relative + "'"); + } + } + if (toState[abstractKey]) throw new Error("Cannot transition to abstract state '" + to + "'"); + if (options.inherit) toParams = inheritParams($stateParams, toParams || {}, $state.$current, toState); + if (!toState.params.$$validates(toParams)) return TransitionFailed; + + toParams = toState.params.$$values(toParams); + to = toState; + + var toPath = to.path; + + // Starting from the root of the path, keep all levels that haven't changed + var keep = 0, state = toPath[keep], locals = root.locals, toLocals = []; + + if (!options.reload) { + while (state && state === fromPath[keep] && state.ownParams.$$equals(toParams, fromParams)) { + locals = toLocals[keep] = state.locals; + keep++; + state = toPath[keep]; + } + } + + // If we're going to the same state and all locals are kept, we've got nothing to do. + // But clear 'transition', as we still want to cancel any other pending transitions. + // TODO: We may not want to bump 'transition' if we're called from a location change + // that we've initiated ourselves, because we might accidentally abort a legitimate + // transition initiated from code? + if (shouldTriggerReload(to, from, locals, options)) { + if (to.self.reloadOnSearch !== false) $urlRouter.update(); + $state.transition = null; + return $q.when($state.current); + } + + // Filter parameters before we pass them to event handlers etc. + toParams = filterByKeys(to.params.$$keys(), toParams || {}); + + // Broadcast start event and cancel the transition if requested + if (options.notify) { + /** + * @ngdoc event + * @name ui.router.state.$state#$stateChangeStart + * @eventOf ui.router.state.$state + * @eventType broadcast on root scope + * @description + * Fired when the state transition **begins**. You can use `event.preventDefault()` + * to prevent the transition from happening and then the transition promise will be + * rejected with a `'transition prevented'` value. + * + * @param {Object} event Event object. + * @param {State} toState The state being transitioned to. + * @param {Object} toParams The params supplied to the `toState`. + * @param {State} fromState The current state, pre-transition. + * @param {Object} fromParams The params supplied to the `fromState`. + * + * @example + * + *
+         * $rootScope.$on('$stateChangeStart',
+         * function(event, toState, toParams, fromState, fromParams){
+         *     event.preventDefault();
+         *     // transitionTo() promise will be rejected with
+         *     // a 'transition prevented' error
+         * })
+         * 
+ */ + if ($rootScope.$broadcast('$stateChangeStart', to.self, toParams, from.self, fromParams).defaultPrevented) { + $urlRouter.update(); + return TransitionPrevented; + } + } + + // Resolve locals for the remaining states, but don't update any global state just + // yet -- if anything fails to resolve the current state needs to remain untouched. + // We also set up an inheritance chain for the locals here. This allows the view directive + // to quickly look up the correct definition for each view in the current state. Even + // though we create the locals object itself outside resolveState(), it is initially + // empty and gets filled asynchronously. We need to keep track of the promise for the + // (fully resolved) current locals, and pass this down the chain. + var resolved = $q.when(locals); + + for (var l = keep; l < toPath.length; l++, state = toPath[l]) { + locals = toLocals[l] = inherit(locals); + resolved = resolveState(state, toParams, state === to, resolved, locals, options); + } + + // Once everything is resolved, we are ready to perform the actual transition + // and return a promise for the new state. We also keep track of what the + // current promise is, so that we can detect overlapping transitions and + // keep only the outcome of the last transition. + var transition = $state.transition = resolved.then(function () { + var l, entering, exiting; + + if ($state.transition !== transition) return TransitionSuperseded; + + // Exit 'from' states not kept + for (l = fromPath.length - 1; l >= keep; l--) { + exiting = fromPath[l]; + if (exiting.self.onExit) { + $injector.invoke(exiting.self.onExit, exiting.self, exiting.locals.globals); + } + exiting.locals = null; + } + + // Enter 'to' states not kept + for (l = keep; l < toPath.length; l++) { + entering = toPath[l]; + entering.locals = toLocals[l]; + if (entering.self.onEnter) { + $injector.invoke(entering.self.onEnter, entering.self, entering.locals.globals); + } + } + + // Run it again, to catch any transitions in callbacks + if ($state.transition !== transition) return TransitionSuperseded; + + // Update globals in $state + $state.$current = to; + $state.current = to.self; + $state.params = toParams; + copy($state.params, $stateParams); + $state.transition = null; + + if (options.location && to.navigable) { + $urlRouter.push(to.navigable.url, to.navigable.locals.globals.$stateParams, { + $$avoidResync: true, replace: options.location === 'replace' + }); + } + + if (options.notify) { + /** + * @ngdoc event + * @name ui.router.state.$state#$stateChangeSuccess + * @eventOf ui.router.state.$state + * @eventType broadcast on root scope + * @description + * Fired once the state transition is **complete**. + * + * @param {Object} event Event object. + * @param {State} toState The state being transitioned to. + * @param {Object} toParams The params supplied to the `toState`. + * @param {State} fromState The current state, pre-transition. + * @param {Object} fromParams The params supplied to the `fromState`. + */ + $rootScope.$broadcast('$stateChangeSuccess', to.self, toParams, from.self, fromParams); + } + $urlRouter.update(true); + + return $state.current; + }, function (error) { + if ($state.transition !== transition) return TransitionSuperseded; + + $state.transition = null; + /** + * @ngdoc event + * @name ui.router.state.$state#$stateChangeError + * @eventOf ui.router.state.$state + * @eventType broadcast on root scope + * @description + * Fired when an **error occurs** during transition. It's important to note that if you + * have any errors in your resolve functions (javascript errors, non-existent services, etc) + * they will not throw traditionally. You must listen for this $stateChangeError event to + * catch **ALL** errors. + * + * @param {Object} event Event object. + * @param {State} toState The state being transitioned to. + * @param {Object} toParams The params supplied to the `toState`. + * @param {State} fromState The current state, pre-transition. + * @param {Object} fromParams The params supplied to the `fromState`. + * @param {Error} error The resolve error object. + */ + evt = $rootScope.$broadcast('$stateChangeError', to.self, toParams, from.self, fromParams, error); + + if (!evt.defaultPrevented) { + $urlRouter.update(); + } + + return $q.reject(error); + }); + + return transition; + }; + + /** + * @ngdoc function + * @name ui.router.state.$state#is + * @methodOf ui.router.state.$state + * + * @description + * Similar to {@link ui.router.state.$state#methods_includes $state.includes}, + * but only checks for the full state name. If params is supplied then it will be + * tested for strict equality against the current active params object, so all params + * must match with none missing and no extras. + * + * @example + *
+     * $state.$current.name = 'contacts.details.item';
+     *
+     * // absolute name
+     * $state.is('contact.details.item'); // returns true
+     * $state.is(contactDetailItemStateObject); // returns true
+     *
+     * // relative name (. and ^), typically from a template
+     * // E.g. from the 'contacts.details' template
+     * 
Item
+ *
+ * + * @param {string|object} stateOrName The state name (absolute or relative) or state object you'd like to check. + * @param {object=} params A param object, e.g. `{sectionId: section.id}`, that you'd like + * to test against the current active state. + * @param {object=} options An options object. The options are: + * + * - **`relative`** - {string|object} - If `stateOrName` is a relative state name and `options.relative` is set, .is will + * test relative to `options.relative` state (or name). + * + * @returns {boolean} Returns true if it is the state. + */ + $state.is = function is(stateOrName, params, options) { + options = extend({ relative: $state.$current }, options || {}); + var state = findState(stateOrName, options.relative); + + if (!isDefined(state)) { return undefined; } + if ($state.$current !== state) { return false; } + return params ? equalForKeys(state.params.$$values(params), $stateParams) : true; + }; + + /** + * @ngdoc function + * @name ui.router.state.$state#includes + * @methodOf ui.router.state.$state + * + * @description + * A method to determine if the current active state is equal to or is the child of the + * state stateName. If any params are passed then they will be tested for a match as well. + * Not all the parameters need to be passed, just the ones you'd like to test for equality. + * + * @example + * Partial and relative names + *
+     * $state.$current.name = 'contacts.details.item';
+     *
+     * // Using partial names
+     * $state.includes("contacts"); // returns true
+     * $state.includes("contacts.details"); // returns true
+     * $state.includes("contacts.details.item"); // returns true
+     * $state.includes("contacts.list"); // returns false
+     * $state.includes("about"); // returns false
+     *
+     * // Using relative names (. and ^), typically from a template
+     * // E.g. from the 'contacts.details' template
+     * 
Item
+ *
+ * + * Basic globbing patterns + *
+     * $state.$current.name = 'contacts.details.item.url';
+     *
+     * $state.includes("*.details.*.*"); // returns true
+     * $state.includes("*.details.**"); // returns true
+     * $state.includes("**.item.**"); // returns true
+     * $state.includes("*.details.item.url"); // returns true
+     * $state.includes("*.details.*.url"); // returns true
+     * $state.includes("*.details.*"); // returns false
+     * $state.includes("item.**"); // returns false
+     * 
+ * + * @param {string} stateOrName A partial name, relative name, or glob pattern + * to be searched for within the current state name. + * @param {object=} params A param object, e.g. `{sectionId: section.id}`, + * that you'd like to test against the current active state. + * @param {object=} options An options object. The options are: + * + * - **`relative`** - {string|object=} - If `stateOrName` is a relative state reference and `options.relative` is set, + * .includes will test relative to `options.relative` state (or name). + * + * @returns {boolean} Returns true if it does include the state + */ + $state.includes = function includes(stateOrName, params, options) { + options = extend({ relative: $state.$current }, options || {}); + if (isString(stateOrName) && isGlob(stateOrName)) { + if (!doesStateMatchGlob(stateOrName)) { + return false; + } + stateOrName = $state.$current.name; + } + + var state = findState(stateOrName, options.relative); + if (!isDefined(state)) { return undefined; } + if (!isDefined($state.$current.includes[state.name])) { return false; } + return params ? equalForKeys(state.params.$$values(params), $stateParams, objectKeys(params)) : true; + }; + + + /** + * @ngdoc function + * @name ui.router.state.$state#href + * @methodOf ui.router.state.$state + * + * @description + * A url generation method that returns the compiled url for the given state populated with the given params. + * + * @example + *
+     * expect($state.href("about.person", { person: "bob" })).toEqual("/about/bob");
+     * 
+ * + * @param {string|object} stateOrName The state name or state object you'd like to generate a url from. + * @param {object=} params An object of parameter values to fill the state's required parameters. + * @param {object=} options Options object. The options are: + * + * - **`lossy`** - {boolean=true} - If true, and if there is no url associated with the state provided in the + * first parameter, then the constructed href url will be built from the first navigable ancestor (aka + * ancestor with a valid url). + * - **`inherit`** - {boolean=true}, If `true` will inherit url parameters from current url. + * - **`relative`** - {object=$state.$current}, When transitioning with relative path (e.g '^'), + * defines which state to be relative from. + * - **`absolute`** - {boolean=false}, If true will generate an absolute url, e.g. "http://www.example.com/fullurl". + * + * @returns {string} compiled state url + */ + $state.href = function href(stateOrName, params, options) { + options = extend({ + lossy: true, + inherit: true, + absolute: false, + relative: $state.$current + }, options || {}); + + var state = findState(stateOrName, options.relative); + + if (!isDefined(state)) return null; + if (options.inherit) params = inheritParams($stateParams, params || {}, $state.$current, state); + + var nav = (state && options.lossy) ? state.navigable : state; + + if (!nav || nav.url === undefined || nav.url === null) { + return null; + } + return $urlRouter.href(nav.url, filterByKeys(state.params.$$keys(), params || {}), { + absolute: options.absolute + }); + }; + + /** + * @ngdoc function + * @name ui.router.state.$state#get + * @methodOf ui.router.state.$state + * + * @description + * Returns the state configuration object for any specific state or all states. + * + * @param {string|object=} stateOrName (absolute or relative) If provided, will only get the config for + * the requested state. If not provided, returns an array of ALL state configs. + * @param {string|object=} context When stateOrName is a relative state reference, the state will be retrieved relative to context. + * @returns {Object|Array} State configuration object or array of all objects. + */ + $state.get = function (stateOrName, context) { + if (arguments.length === 0) return map(objectKeys(states), function(name) { return states[name].self; }); + var state = findState(stateOrName, context || $state.$current); + return (state && state.self) ? state.self : null; + }; + + function resolveState(state, params, paramsAreFiltered, inherited, dst, options) { + // Make a restricted $stateParams with only the parameters that apply to this state if + // necessary. In addition to being available to the controller and onEnter/onExit callbacks, + // we also need $stateParams to be available for any $injector calls we make during the + // dependency resolution process. + var $stateParams = (paramsAreFiltered) ? params : filterByKeys(state.params.$$keys(), params); + var locals = { $stateParams: $stateParams }; + + // Resolve 'global' dependencies for the state, i.e. those not specific to a view. + // We're also including $stateParams in this; that way the parameters are restricted + // to the set that should be visible to the state, and are independent of when we update + // the global $state and $stateParams values. + dst.resolve = $resolve.resolve(state.resolve, locals, dst.resolve, state); + var promises = [dst.resolve.then(function (globals) { + dst.globals = globals; + })]; + if (inherited) promises.push(inherited); + + // Resolve template and dependencies for all views. + forEach(state.views, function (view, name) { + var injectables = (view.resolve && view.resolve !== state.resolve ? view.resolve : {}); + injectables.$template = [ function () { + return $view.load(name, { view: view, locals: locals, params: $stateParams, notify: options.notify }) || ''; + }]; + + promises.push($resolve.resolve(injectables, locals, dst.resolve, state).then(function (result) { + // References to the controller (only instantiated at link time) + if (isFunction(view.controllerProvider) || isArray(view.controllerProvider)) { + var injectLocals = angular.extend({}, injectables, locals); + result.$$controller = $injector.invoke(view.controllerProvider, null, injectLocals); + } else { + result.$$controller = view.controller; + } + // Provide access to the state itself for internal use + result.$$state = state; + result.$$controllerAs = view.controllerAs; + dst[name] = result; + })); + }); + + // Wait for all the promises and then return the activation object + return $q.all(promises).then(function (values) { + return dst; + }); + } + + return $state; + } + + function shouldTriggerReload(to, from, locals, options) { + if (to === from && ((locals === from.locals && !options.reload) || (to.self.reloadOnSearch === false))) { + return true; + } + } +} + +angular.module('ui.router.state') + .value('$stateParams', {}) + .provider('$state', $StateProvider); diff --git a/www/lib/angular-ui-router/src/stateDirectives.js b/www/lib/angular-ui-router/src/stateDirectives.js new file mode 100644 index 0000000..4d9d527 --- /dev/null +++ b/www/lib/angular-ui-router/src/stateDirectives.js @@ -0,0 +1,268 @@ +function parseStateRef(ref, current) { + var preparsed = ref.match(/^\s*({[^}]*})\s*$/), parsed; + if (preparsed) ref = current + '(' + preparsed[1] + ')'; + parsed = ref.replace(/\n/g, " ").match(/^([^(]+?)\s*(\((.*)\))?$/); + if (!parsed || parsed.length !== 4) throw new Error("Invalid state ref '" + ref + "'"); + return { state: parsed[1], paramExpr: parsed[3] || null }; +} + +function stateContext(el) { + var stateData = el.parent().inheritedData('$uiView'); + + if (stateData && stateData.state && stateData.state.name) { + return stateData.state; + } +} + +/** + * @ngdoc directive + * @name ui.router.state.directive:ui-sref + * + * @requires ui.router.state.$state + * @requires $timeout + * + * @restrict A + * + * @description + * A directive that binds a link (`` tag) to a state. If the state has an associated + * URL, the directive will automatically generate & update the `href` attribute via + * the {@link ui.router.state.$state#methods_href $state.href()} method. Clicking + * the link will trigger a state transition with optional parameters. + * + * Also middle-clicking, right-clicking, and ctrl-clicking on the link will be + * handled natively by the browser. + * + * You can also use relative state paths within ui-sref, just like the relative + * paths passed to `$state.go()`. You just need to be aware that the path is relative + * to the state that the link lives in, in other words the state that loaded the + * template containing the link. + * + * You can specify options to pass to {@link ui.router.state.$state#go $state.go()} + * using the `ui-sref-opts` attribute. Options are restricted to `location`, `inherit`, + * and `reload`. + * + * @example + * Here's an example of how you'd use ui-sref and how it would compile. If you have the + * following template: + *
+ * Home | About | Next page
+ * 
+ * 
+ * 
+ * + * Then the compiled html would be (assuming Html5Mode is off and current state is contacts): + *
+ * Home | About | Next page
+ * 
+ * 
    + *
  • + * Joe + *
  • + *
  • + * Alice + *
  • + *
  • + * Bob + *
  • + *
+ * + * Home + *
+ * + * @param {string} ui-sref 'stateName' can be any valid absolute or relative state + * @param {Object} ui-sref-opts options to pass to {@link ui.router.state.$state#go $state.go()} + */ +$StateRefDirective.$inject = ['$state', '$timeout']; +function $StateRefDirective($state, $timeout) { + var allowedOptions = ['location', 'inherit', 'reload']; + + return { + restrict: 'A', + require: ['?^uiSrefActive', '?^uiSrefActiveEq'], + link: function(scope, element, attrs, uiSrefActive) { + var ref = parseStateRef(attrs.uiSref, $state.current.name); + var params = null, url = null, base = stateContext(element) || $state.$current; + var newHref = null, isAnchor = element.prop("tagName") === "A"; + var isForm = element[0].nodeName === "FORM"; + var attr = isForm ? "action" : "href", nav = true; + + var options = { relative: base, inherit: true }; + var optionsOverride = scope.$eval(attrs.uiSrefOpts) || {}; + + angular.forEach(allowedOptions, function(option) { + if (option in optionsOverride) { + options[option] = optionsOverride[option]; + } + }); + + var update = function(newVal) { + if (newVal) params = angular.copy(newVal); + if (!nav) return; + + newHref = $state.href(ref.state, params, options); + + var activeDirective = uiSrefActive[1] || uiSrefActive[0]; + if (activeDirective) { + activeDirective.$$setStateInfo(ref.state, params); + } + if (newHref === null) { + nav = false; + return false; + } + attrs.$set(attr, newHref); + }; + + if (ref.paramExpr) { + scope.$watch(ref.paramExpr, function(newVal, oldVal) { + if (newVal !== params) update(newVal); + }, true); + params = angular.copy(scope.$eval(ref.paramExpr)); + } + update(); + + if (isForm) return; + + element.bind("click", function(e) { + var button = e.which || e.button; + if ( !(button > 1 || e.ctrlKey || e.metaKey || e.shiftKey || element.attr('target')) ) { + // HACK: This is to allow ng-clicks to be processed before the transition is initiated: + var transition = $timeout(function() { + $state.go(ref.state, params, options); + }); + e.preventDefault(); + + // if the state has no URL, ignore one preventDefault from the directive. + var ignorePreventDefaultCount = isAnchor && !newHref ? 1: 0; + e.preventDefault = function() { + if (ignorePreventDefaultCount-- <= 0) + $timeout.cancel(transition); + }; + } + }); + } + }; +} + +/** + * @ngdoc directive + * @name ui.router.state.directive:ui-sref-active + * + * @requires ui.router.state.$state + * @requires ui.router.state.$stateParams + * @requires $interpolate + * + * @restrict A + * + * @description + * A directive working alongside ui-sref to add classes to an element when the + * related ui-sref directive's state is active, and removing them when it is inactive. + * The primary use-case is to simplify the special appearance of navigation menus + * relying on `ui-sref`, by having the "active" state's menu button appear different, + * distinguishing it from the inactive menu items. + * + * ui-sref-active can live on the same element as ui-sref or on a parent element. The first + * ui-sref-active found at the same level or above the ui-sref will be used. + * + * Will activate when the ui-sref's target state or any child state is active. If you + * need to activate only when the ui-sref target state is active and *not* any of + * it's children, then you will use + * {@link ui.router.state.directive:ui-sref-active-eq ui-sref-active-eq} + * + * @example + * Given the following template: + *
+ * 
+ * 
+ * + * + * When the app state is "app.user" (or any children states), and contains the state parameter "user" with value "bilbobaggins", + * the resulting HTML will appear as (note the 'active' class): + *
+ * 
+ * 
+ * + * The class name is interpolated **once** during the directives link time (any further changes to the + * interpolated value are ignored). + * + * Multiple classes may be specified in a space-separated format: + *
+ * 
    + *
  • + * link + *
  • + *
+ *
+ */ + +/** + * @ngdoc directive + * @name ui.router.state.directive:ui-sref-active-eq + * + * @requires ui.router.state.$state + * @requires ui.router.state.$stateParams + * @requires $interpolate + * + * @restrict A + * + * @description + * The same as {@link ui.router.state.directive:ui-sref-active ui-sref-active} but will only activate + * when the exact target state used in the `ui-sref` is active; no child states. + * + */ +$StateRefActiveDirective.$inject = ['$state', '$stateParams', '$interpolate']; +function $StateRefActiveDirective($state, $stateParams, $interpolate) { + return { + restrict: "A", + controller: ['$scope', '$element', '$attrs', function ($scope, $element, $attrs) { + var state, params, activeClass; + + // There probably isn't much point in $observing this + // uiSrefActive and uiSrefActiveEq share the same directive object with some + // slight difference in logic routing + activeClass = $interpolate($attrs.uiSrefActiveEq || $attrs.uiSrefActive || '', false)($scope); + + // Allow uiSref to communicate with uiSrefActive[Equals] + this.$$setStateInfo = function (newState, newParams) { + state = $state.get(newState, stateContext($element)); + params = newParams; + update(); + }; + + $scope.$on('$stateChangeSuccess', update); + + // Update route state + function update() { + if (isMatch()) { + $element.addClass(activeClass); + } else { + $element.removeClass(activeClass); + } + } + + function isMatch() { + if (typeof $attrs.uiSrefActiveEq !== 'undefined') { + return state && $state.is(state.name, params); + } else { + return state && $state.includes(state.name, params); + } + } + }] + }; +} + +angular.module('ui.router.state') + .directive('uiSref', $StateRefDirective) + .directive('uiSrefActive', $StateRefActiveDirective) + .directive('uiSrefActiveEq', $StateRefActiveDirective); diff --git a/www/lib/angular-ui-router/src/stateFilters.js b/www/lib/angular-ui-router/src/stateFilters.js new file mode 100644 index 0000000..e0a1175 --- /dev/null +++ b/www/lib/angular-ui-router/src/stateFilters.js @@ -0,0 +1,39 @@ +/** + * @ngdoc filter + * @name ui.router.state.filter:isState + * + * @requires ui.router.state.$state + * + * @description + * Translates to {@link ui.router.state.$state#methods_is $state.is("stateName")}. + */ +$IsStateFilter.$inject = ['$state']; +function $IsStateFilter($state) { + var isFilter = function (state) { + return $state.is(state); + }; + isFilter.$stateful = true; + return isFilter; +} + +/** + * @ngdoc filter + * @name ui.router.state.filter:includedByState + * + * @requires ui.router.state.$state + * + * @description + * Translates to {@link ui.router.state.$state#methods_includes $state.includes('fullOrPartialStateName')}. + */ +$IncludedByStateFilter.$inject = ['$state']; +function $IncludedByStateFilter($state) { + var includesFilter = function (state) { + return $state.includes(state); + }; + includesFilter.$stateful = true; + return includesFilter; +} + +angular.module('ui.router.state') + .filter('isState', $IsStateFilter) + .filter('includedByState', $IncludedByStateFilter); diff --git a/www/lib/angular-ui-router/src/templateFactory.js b/www/lib/angular-ui-router/src/templateFactory.js new file mode 100644 index 0000000..ca491a9 --- /dev/null +++ b/www/lib/angular-ui-router/src/templateFactory.js @@ -0,0 +1,110 @@ +/** + * @ngdoc object + * @name ui.router.util.$templateFactory + * + * @requires $http + * @requires $templateCache + * @requires $injector + * + * @description + * Service. Manages loading of templates. + */ +$TemplateFactory.$inject = ['$http', '$templateCache', '$injector']; +function $TemplateFactory( $http, $templateCache, $injector) { + + /** + * @ngdoc function + * @name ui.router.util.$templateFactory#fromConfig + * @methodOf ui.router.util.$templateFactory + * + * @description + * Creates a template from a configuration object. + * + * @param {object} config Configuration object for which to load a template. + * The following properties are search in the specified order, and the first one + * that is defined is used to create the template: + * + * @param {string|object} config.template html string template or function to + * load via {@link ui.router.util.$templateFactory#fromString fromString}. + * @param {string|object} config.templateUrl url to load or a function returning + * the url to load via {@link ui.router.util.$templateFactory#fromUrl fromUrl}. + * @param {Function} config.templateProvider function to invoke via + * {@link ui.router.util.$templateFactory#fromProvider fromProvider}. + * @param {object} params Parameters to pass to the template function. + * @param {object} locals Locals to pass to `invoke` if the template is loaded + * via a `templateProvider`. Defaults to `{ params: params }`. + * + * @return {string|object} The template html as a string, or a promise for + * that string,or `null` if no template is configured. + */ + this.fromConfig = function (config, params, locals) { + return ( + isDefined(config.template) ? this.fromString(config.template, params) : + isDefined(config.templateUrl) ? this.fromUrl(config.templateUrl, params) : + isDefined(config.templateProvider) ? this.fromProvider(config.templateProvider, params, locals) : + null + ); + }; + + /** + * @ngdoc function + * @name ui.router.util.$templateFactory#fromString + * @methodOf ui.router.util.$templateFactory + * + * @description + * Creates a template from a string or a function returning a string. + * + * @param {string|object} template html template as a string or function that + * returns an html template as a string. + * @param {object} params Parameters to pass to the template function. + * + * @return {string|object} The template html as a string, or a promise for that + * string. + */ + this.fromString = function (template, params) { + return isFunction(template) ? template(params) : template; + }; + + /** + * @ngdoc function + * @name ui.router.util.$templateFactory#fromUrl + * @methodOf ui.router.util.$templateFactory + * + * @description + * Loads a template from the a URL via `$http` and `$templateCache`. + * + * @param {string|Function} url url of the template to load, or a function + * that returns a url. + * @param {Object} params Parameters to pass to the url function. + * @return {string|Promise.} The template html as a string, or a promise + * for that string. + */ + this.fromUrl = function (url, params) { + if (isFunction(url)) url = url(params); + if (url == null) return null; + else return $http + .get(url, { cache: $templateCache, headers: { Accept: 'text/html' }}) + .then(function(response) { return response.data; }); + }; + + /** + * @ngdoc function + * @name ui.router.util.$templateFactory#fromProvider + * @methodOf ui.router.util.$templateFactory + * + * @description + * Creates a template by invoking an injectable provider function. + * + * @param {Function} provider Function to invoke via `$injector.invoke` + * @param {Object} params Parameters for the template. + * @param {Object} locals Locals to pass to `invoke`. Defaults to + * `{ params: params }`. + * @return {string|Promise.} The template html as a string, or a promise + * for that string. + */ + this.fromProvider = function (provider, params, locals) { + return $injector.invoke(provider, null, locals || { params: params }); + }; +} + +angular.module('ui.router.util').service('$templateFactory', $TemplateFactory); diff --git a/www/lib/angular-ui-router/src/urlMatcherFactory.js b/www/lib/angular-ui-router/src/urlMatcherFactory.js new file mode 100644 index 0000000..a16e728 --- /dev/null +++ b/www/lib/angular-ui-router/src/urlMatcherFactory.js @@ -0,0 +1,1036 @@ +var $$UMFP; // reference to $UrlMatcherFactoryProvider + +/** + * @ngdoc object + * @name ui.router.util.type:UrlMatcher + * + * @description + * Matches URLs against patterns and extracts named parameters from the path or the search + * part of the URL. A URL pattern consists of a path pattern, optionally followed by '?' and a list + * of search parameters. Multiple search parameter names are separated by '&'. Search parameters + * do not influence whether or not a URL is matched, but their values are passed through into + * the matched parameters returned by {@link ui.router.util.type:UrlMatcher#methods_exec exec}. + * + * Path parameter placeholders can be specified using simple colon/catch-all syntax or curly brace + * syntax, which optionally allows a regular expression for the parameter to be specified: + * + * * `':'` name - colon placeholder + * * `'*'` name - catch-all placeholder + * * `'{' name '}'` - curly placeholder + * * `'{' name ':' regexp|type '}'` - curly placeholder with regexp or type name. Should the + * regexp itself contain curly braces, they must be in matched pairs or escaped with a backslash. + * + * Parameter names may contain only word characters (latin letters, digits, and underscore) and + * must be unique within the pattern (across both path and search parameters). For colon + * placeholders or curly placeholders without an explicit regexp, a path parameter matches any + * number of characters other than '/'. For catch-all placeholders the path parameter matches + * any number of characters. + * + * Examples: + * + * * `'/hello/'` - Matches only if the path is exactly '/hello/'. There is no special treatment for + * trailing slashes, and patterns have to match the entire path, not just a prefix. + * * `'/user/:id'` - Matches '/user/bob' or '/user/1234!!!' or even '/user/' but not '/user' or + * '/user/bob/details'. The second path segment will be captured as the parameter 'id'. + * * `'/user/{id}'` - Same as the previous example, but using curly brace syntax. + * * `'/user/{id:[^/]*}'` - Same as the previous example. + * * `'/user/{id:[0-9a-fA-F]{1,8}}'` - Similar to the previous example, but only matches if the id + * parameter consists of 1 to 8 hex digits. + * * `'/files/{path:.*}'` - Matches any URL starting with '/files/' and captures the rest of the + * path into the parameter 'path'. + * * `'/files/*path'` - ditto. + * * `'/calendar/{start:date}'` - Matches "/calendar/2014-11-12" (because the pattern defined + * in the built-in `date` Type matches `2014-11-12`) and provides a Date object in $stateParams.start + * + * @param {string} pattern The pattern to compile into a matcher. + * @param {Object} config A configuration object hash: + * @param {Object=} parentMatcher Used to concatenate the pattern/config onto + * an existing UrlMatcher + * + * * `caseInsensitive` - `true` if URL matching should be case insensitive, otherwise `false`, the default value (for backward compatibility) is `false`. + * * `strict` - `false` if matching against a URL with a trailing slash should be treated as equivalent to a URL without a trailing slash, the default value is `true`. + * + * @property {string} prefix A static prefix of this pattern. The matcher guarantees that any + * URL matching this matcher (i.e. any string for which {@link ui.router.util.type:UrlMatcher#methods_exec exec()} returns + * non-null) will start with this prefix. + * + * @property {string} source The pattern that was passed into the constructor + * + * @property {string} sourcePath The path portion of the source property + * + * @property {string} sourceSearch The search portion of the source property + * + * @property {string} regex The constructed regex that will be used to match against the url when + * it is time to determine which url will match. + * + * @returns {Object} New `UrlMatcher` object + */ +function UrlMatcher(pattern, config, parentMatcher) { + config = extend({ params: {} }, isObject(config) ? config : {}); + + // Find all placeholders and create a compiled pattern, using either classic or curly syntax: + // '*' name + // ':' name + // '{' name '}' + // '{' name ':' regexp '}' + // The regular expression is somewhat complicated due to the need to allow curly braces + // inside the regular expression. The placeholder regexp breaks down as follows: + // ([:*])([\w\[\]]+) - classic placeholder ($1 / $2) (search version has - for snake-case) + // \{([\w\[\]]+)(?:\:( ... ))?\} - curly brace placeholder ($3) with optional regexp/type ... ($4) (search version has - for snake-case + // (?: ... | ... | ... )+ - the regexp consists of any number of atoms, an atom being either + // [^{}\\]+ - anything other than curly braces or backslash + // \\. - a backslash escape + // \{(?:[^{}\\]+|\\.)*\} - a matched set of curly braces containing other atoms + var placeholder = /([:*])([\w\[\]]+)|\{([\w\[\]]+)(?:\:((?:[^{}\\]+|\\.|\{(?:[^{}\\]+|\\.)*\})+))?\}/g, + searchPlaceholder = /([:]?)([\w\[\]-]+)|\{([\w\[\]-]+)(?:\:((?:[^{}\\]+|\\.|\{(?:[^{}\\]+|\\.)*\})+))?\}/g, + compiled = '^', last = 0, m, + segments = this.segments = [], + parentParams = parentMatcher ? parentMatcher.params : {}, + params = this.params = parentMatcher ? parentMatcher.params.$$new() : new $$UMFP.ParamSet(), + paramNames = []; + + function addParameter(id, type, config, location) { + paramNames.push(id); + if (parentParams[id]) return parentParams[id]; + if (!/^\w+(-+\w+)*(?:\[\])?$/.test(id)) throw new Error("Invalid parameter name '" + id + "' in pattern '" + pattern + "'"); + if (params[id]) throw new Error("Duplicate parameter name '" + id + "' in pattern '" + pattern + "'"); + params[id] = new $$UMFP.Param(id, type, config, location); + return params[id]; + } + + function quoteRegExp(string, pattern, squash) { + var surroundPattern = ['',''], result = string.replace(/[\\\[\]\^$*+?.()|{}]/g, "\\$&"); + if (!pattern) return result; + switch(squash) { + case false: surroundPattern = ['(', ')']; break; + case true: surroundPattern = ['?(', ')?']; break; + default: surroundPattern = ['(' + squash + "|", ')?']; break; + } + return result + surroundPattern[0] + pattern + surroundPattern[1]; + } + + this.source = pattern; + + // Split into static segments separated by path parameter placeholders. + // The number of segments is always 1 more than the number of parameters. + function matchDetails(m, isSearch) { + var id, regexp, segment, type, cfg, arrayMode; + id = m[2] || m[3]; // IE[78] returns '' for unmatched groups instead of null + cfg = config.params[id]; + segment = pattern.substring(last, m.index); + regexp = isSearch ? m[4] : m[4] || (m[1] == '*' ? '.*' : null); + type = $$UMFP.type(regexp || "string") || inherit($$UMFP.type("string"), { pattern: new RegExp(regexp) }); + return { + id: id, regexp: regexp, segment: segment, type: type, cfg: cfg + }; + } + + var p, param, segment; + while ((m = placeholder.exec(pattern))) { + p = matchDetails(m, false); + if (p.segment.indexOf('?') >= 0) break; // we're into the search part + + param = addParameter(p.id, p.type, p.cfg, "path"); + compiled += quoteRegExp(p.segment, param.type.pattern.source, param.squash); + segments.push(p.segment); + last = placeholder.lastIndex; + } + segment = pattern.substring(last); + + // Find any search parameter names and remove them from the last segment + var i = segment.indexOf('?'); + + if (i >= 0) { + var search = this.sourceSearch = segment.substring(i); + segment = segment.substring(0, i); + this.sourcePath = pattern.substring(0, last + i); + + if (search.length > 0) { + last = 0; + while ((m = searchPlaceholder.exec(search))) { + p = matchDetails(m, true); + param = addParameter(p.id, p.type, p.cfg, "search"); + last = placeholder.lastIndex; + // check if ?& + } + } + } else { + this.sourcePath = pattern; + this.sourceSearch = ''; + } + + compiled += quoteRegExp(segment) + (config.strict === false ? '\/?' : '') + '$'; + segments.push(segment); + + this.regexp = new RegExp(compiled, config.caseInsensitive ? 'i' : undefined); + this.prefix = segments[0]; + this.$$paramNames = paramNames; +} + +/** + * @ngdoc function + * @name ui.router.util.type:UrlMatcher#concat + * @methodOf ui.router.util.type:UrlMatcher + * + * @description + * Returns a new matcher for a pattern constructed by appending the path part and adding the + * search parameters of the specified pattern to this pattern. The current pattern is not + * modified. This can be understood as creating a pattern for URLs that are relative to (or + * suffixes of) the current pattern. + * + * @example + * The following two matchers are equivalent: + *
+ * new UrlMatcher('/user/{id}?q').concat('/details?date');
+ * new UrlMatcher('/user/{id}/details?q&date');
+ * 
+ * + * @param {string} pattern The pattern to append. + * @param {Object} config An object hash of the configuration for the matcher. + * @returns {UrlMatcher} A matcher for the concatenated pattern. + */ +UrlMatcher.prototype.concat = function (pattern, config) { + // Because order of search parameters is irrelevant, we can add our own search + // parameters to the end of the new pattern. Parse the new pattern by itself + // and then join the bits together, but it's much easier to do this on a string level. + var defaultConfig = { + caseInsensitive: $$UMFP.caseInsensitive(), + strict: $$UMFP.strictMode(), + squash: $$UMFP.defaultSquashPolicy() + }; + return new UrlMatcher(this.sourcePath + pattern + this.sourceSearch, extend(defaultConfig, config), this); +}; + +UrlMatcher.prototype.toString = function () { + return this.source; +}; + +/** + * @ngdoc function + * @name ui.router.util.type:UrlMatcher#exec + * @methodOf ui.router.util.type:UrlMatcher + * + * @description + * Tests the specified path against this matcher, and returns an object containing the captured + * parameter values, or null if the path does not match. The returned object contains the values + * of any search parameters that are mentioned in the pattern, but their value may be null if + * they are not present in `searchParams`. This means that search parameters are always treated + * as optional. + * + * @example + *
+ * new UrlMatcher('/user/{id}?q&r').exec('/user/bob', {
+ *   x: '1', q: 'hello'
+ * });
+ * // returns { id: 'bob', q: 'hello', r: null }
+ * 
+ * + * @param {string} path The URL path to match, e.g. `$location.path()`. + * @param {Object} searchParams URL search parameters, e.g. `$location.search()`. + * @returns {Object} The captured parameter values. + */ +UrlMatcher.prototype.exec = function (path, searchParams) { + var m = this.regexp.exec(path); + if (!m) return null; + searchParams = searchParams || {}; + + var paramNames = this.parameters(), nTotal = paramNames.length, + nPath = this.segments.length - 1, + values = {}, i, j, cfg, paramName; + + if (nPath !== m.length - 1) throw new Error("Unbalanced capture group in route '" + this.source + "'"); + + function decodePathArray(string) { + function reverseString(str) { return str.split("").reverse().join(""); } + function unquoteDashes(str) { return str.replace(/\\-/, "-"); } + + var split = reverseString(string).split(/-(?!\\)/); + var allReversed = map(split, reverseString); + return map(allReversed, unquoteDashes).reverse(); + } + + for (i = 0; i < nPath; i++) { + paramName = paramNames[i]; + var param = this.params[paramName]; + var paramVal = m[i+1]; + // if the param value matches a pre-replace pair, replace the value before decoding. + for (j = 0; j < param.replace; j++) { + if (param.replace[j].from === paramVal) paramVal = param.replace[j].to; + } + if (paramVal && param.array === true) paramVal = decodePathArray(paramVal); + values[paramName] = param.value(paramVal); + } + for (/**/; i < nTotal; i++) { + paramName = paramNames[i]; + values[paramName] = this.params[paramName].value(searchParams[paramName]); + } + + return values; +}; + +/** + * @ngdoc function + * @name ui.router.util.type:UrlMatcher#parameters + * @methodOf ui.router.util.type:UrlMatcher + * + * @description + * Returns the names of all path and search parameters of this pattern in an unspecified order. + * + * @returns {Array.} An array of parameter names. Must be treated as read-only. If the + * pattern has no parameters, an empty array is returned. + */ +UrlMatcher.prototype.parameters = function (param) { + if (!isDefined(param)) return this.$$paramNames; + return this.params[param] || null; +}; + +/** + * @ngdoc function + * @name ui.router.util.type:UrlMatcher#validate + * @methodOf ui.router.util.type:UrlMatcher + * + * @description + * Checks an object hash of parameters to validate their correctness according to the parameter + * types of this `UrlMatcher`. + * + * @param {Object} params The object hash of parameters to validate. + * @returns {boolean} Returns `true` if `params` validates, otherwise `false`. + */ +UrlMatcher.prototype.validates = function (params) { + return this.params.$$validates(params); +}; + +/** + * @ngdoc function + * @name ui.router.util.type:UrlMatcher#format + * @methodOf ui.router.util.type:UrlMatcher + * + * @description + * Creates a URL that matches this pattern by substituting the specified values + * for the path and search parameters. Null values for path parameters are + * treated as empty strings. + * + * @example + *
+ * new UrlMatcher('/user/{id}?q').format({ id:'bob', q:'yes' });
+ * // returns '/user/bob?q=yes'
+ * 
+ * + * @param {Object} values the values to substitute for the parameters in this pattern. + * @returns {string} the formatted URL (path and optionally search part). + */ +UrlMatcher.prototype.format = function (values) { + values = values || {}; + var segments = this.segments, params = this.parameters(), paramset = this.params; + if (!this.validates(values)) return null; + + var i, search = false, nPath = segments.length - 1, nTotal = params.length, result = segments[0]; + + function encodeDashes(str) { // Replace dashes with encoded "\-" + return encodeURIComponent(str).replace(/-/g, function(c) { return '%5C%' + c.charCodeAt(0).toString(16).toUpperCase(); }); + } + + for (i = 0; i < nTotal; i++) { + var isPathParam = i < nPath; + var name = params[i], param = paramset[name], value = param.value(values[name]); + var isDefaultValue = param.isOptional && param.type.equals(param.value(), value); + var squash = isDefaultValue ? param.squash : false; + var encoded = param.type.encode(value); + + if (isPathParam) { + var nextSegment = segments[i + 1]; + if (squash === false) { + if (encoded != null) { + if (isArray(encoded)) { + result += map(encoded, encodeDashes).join("-"); + } else { + result += encodeURIComponent(encoded); + } + } + result += nextSegment; + } else if (squash === true) { + var capture = result.match(/\/$/) ? /\/?(.*)/ : /(.*)/; + result += nextSegment.match(capture)[1]; + } else if (isString(squash)) { + result += squash + nextSegment; + } + } else { + if (encoded == null || (isDefaultValue && squash !== false)) continue; + if (!isArray(encoded)) encoded = [ encoded ]; + encoded = map(encoded, encodeURIComponent).join('&' + name + '='); + result += (search ? '&' : '?') + (name + '=' + encoded); + search = true; + } + } + + return result; +}; + +/** + * @ngdoc object + * @name ui.router.util.type:Type + * + * @description + * Implements an interface to define custom parameter types that can be decoded from and encoded to + * string parameters matched in a URL. Used by {@link ui.router.util.type:UrlMatcher `UrlMatcher`} + * objects when matching or formatting URLs, or comparing or validating parameter values. + * + * See {@link ui.router.util.$urlMatcherFactory#methods_type `$urlMatcherFactory#type()`} for more + * information on registering custom types. + * + * @param {Object} config A configuration object which contains the custom type definition. The object's + * properties will override the default methods and/or pattern in `Type`'s public interface. + * @example + *
+ * {
+ *   decode: function(val) { return parseInt(val, 10); },
+ *   encode: function(val) { return val && val.toString(); },
+ *   equals: function(a, b) { return this.is(a) && a === b; },
+ *   is: function(val) { return angular.isNumber(val) isFinite(val) && val % 1 === 0; },
+ *   pattern: /\d+/
+ * }
+ * 
+ * + * @property {RegExp} pattern The regular expression pattern used to match values of this type when + * coming from a substring of a URL. + * + * @returns {Object} Returns a new `Type` object. + */ +function Type(config) { + extend(this, config); +} + +/** + * @ngdoc function + * @name ui.router.util.type:Type#is + * @methodOf ui.router.util.type:Type + * + * @description + * Detects whether a value is of a particular type. Accepts a native (decoded) value + * and determines whether it matches the current `Type` object. + * + * @param {*} val The value to check. + * @param {string} key Optional. If the type check is happening in the context of a specific + * {@link ui.router.util.type:UrlMatcher `UrlMatcher`} object, this is the name of the + * parameter in which `val` is stored. Can be used for meta-programming of `Type` objects. + * @returns {Boolean} Returns `true` if the value matches the type, otherwise `false`. + */ +Type.prototype.is = function(val, key) { + return true; +}; + +/** + * @ngdoc function + * @name ui.router.util.type:Type#encode + * @methodOf ui.router.util.type:Type + * + * @description + * Encodes a custom/native type value to a string that can be embedded in a URL. Note that the + * return value does *not* need to be URL-safe (i.e. passed through `encodeURIComponent()`), it + * only needs to be a representation of `val` that has been coerced to a string. + * + * @param {*} val The value to encode. + * @param {string} key The name of the parameter in which `val` is stored. Can be used for + * meta-programming of `Type` objects. + * @returns {string} Returns a string representation of `val` that can be encoded in a URL. + */ +Type.prototype.encode = function(val, key) { + return val; +}; + +/** + * @ngdoc function + * @name ui.router.util.type:Type#decode + * @methodOf ui.router.util.type:Type + * + * @description + * Converts a parameter value (from URL string or transition param) to a custom/native value. + * + * @param {string} val The URL parameter value to decode. + * @param {string} key The name of the parameter in which `val` is stored. Can be used for + * meta-programming of `Type` objects. + * @returns {*} Returns a custom representation of the URL parameter value. + */ +Type.prototype.decode = function(val, key) { + return val; +}; + +/** + * @ngdoc function + * @name ui.router.util.type:Type#equals + * @methodOf ui.router.util.type:Type + * + * @description + * Determines whether two decoded values are equivalent. + * + * @param {*} a A value to compare against. + * @param {*} b A value to compare against. + * @returns {Boolean} Returns `true` if the values are equivalent/equal, otherwise `false`. + */ +Type.prototype.equals = function(a, b) { + return a == b; +}; + +Type.prototype.$subPattern = function() { + var sub = this.pattern.toString(); + return sub.substr(1, sub.length - 2); +}; + +Type.prototype.pattern = /.*/; + +Type.prototype.toString = function() { return "{Type:" + this.name + "}"; }; + +/* + * Wraps an existing custom Type as an array of Type, depending on 'mode'. + * e.g.: + * - urlmatcher pattern "/path?{queryParam[]:int}" + * - url: "/path?queryParam=1&queryParam=2 + * - $stateParams.queryParam will be [1, 2] + * if `mode` is "auto", then + * - url: "/path?queryParam=1 will create $stateParams.queryParam: 1 + * - url: "/path?queryParam=1&queryParam=2 will create $stateParams.queryParam: [1, 2] + */ +Type.prototype.$asArray = function(mode, isSearch) { + if (!mode) return this; + if (mode === "auto" && !isSearch) throw new Error("'auto' array mode is for query parameters only"); + return new ArrayType(this, mode); + + function ArrayType(type, mode) { + function bindTo(type, callbackName) { + return function() { + return type[callbackName].apply(type, arguments); + }; + } + + // Wrap non-array value as array + function arrayWrap(val) { return isArray(val) ? val : (isDefined(val) ? [ val ] : []); } + // Unwrap array value for "auto" mode. Return undefined for empty array. + function arrayUnwrap(val) { + switch(val.length) { + case 0: return undefined; + case 1: return mode === "auto" ? val[0] : val; + default: return val; + } + } + function falsey(val) { return !val; } + + // Wraps type (.is/.encode/.decode) functions to operate on each value of an array + function arrayHandler(callback, allTruthyMode) { + return function handleArray(val) { + val = arrayWrap(val); + var result = map(val, callback); + if (allTruthyMode === true) + return filter(result, falsey).length === 0; + return arrayUnwrap(result); + }; + } + + // Wraps type (.equals) functions to operate on each value of an array + function arrayEqualsHandler(callback) { + return function handleArray(val1, val2) { + var left = arrayWrap(val1), right = arrayWrap(val2); + if (left.length !== right.length) return false; + for (var i = 0; i < left.length; i++) { + if (!callback(left[i], right[i])) return false; + } + return true; + }; + } + + this.encode = arrayHandler(bindTo(type, 'encode')); + this.decode = arrayHandler(bindTo(type, 'decode')); + this.is = arrayHandler(bindTo(type, 'is'), true); + this.equals = arrayEqualsHandler(bindTo(type, 'equals')); + this.pattern = type.pattern; + this.$arrayMode = mode; + } +}; + + + +/** + * @ngdoc object + * @name ui.router.util.$urlMatcherFactory + * + * @description + * Factory for {@link ui.router.util.type:UrlMatcher `UrlMatcher`} instances. The factory + * is also available to providers under the name `$urlMatcherFactoryProvider`. + */ +function $UrlMatcherFactory() { + $$UMFP = this; + + var isCaseInsensitive = false, isStrictMode = true, defaultSquashPolicy = false; + + function valToString(val) { return val != null ? val.toString().replace(/\//g, "%2F") : val; } + function valFromString(val) { return val != null ? val.toString().replace(/%2F/g, "/") : val; } +// TODO: in 1.0, make string .is() return false if value is undefined by default. +// function regexpMatches(val) { /*jshint validthis:true */ return isDefined(val) && this.pattern.test(val); } + function regexpMatches(val) { /*jshint validthis:true */ return this.pattern.test(val); } + + var $types = {}, enqueue = true, typeQueue = [], injector, defaultTypes = { + string: { + encode: valToString, + decode: valFromString, + is: regexpMatches, + pattern: /[^/]*/ + }, + int: { + encode: valToString, + decode: function(val) { return parseInt(val, 10); }, + is: function(val) { return isDefined(val) && this.decode(val.toString()) === val; }, + pattern: /\d+/ + }, + bool: { + encode: function(val) { return val ? 1 : 0; }, + decode: function(val) { return parseInt(val, 10) !== 0; }, + is: function(val) { return val === true || val === false; }, + pattern: /0|1/ + }, + date: { + encode: function (val) { + if (!this.is(val)) + return undefined; + return [ val.getFullYear(), + ('0' + (val.getMonth() + 1)).slice(-2), + ('0' + val.getDate()).slice(-2) + ].join("-"); + }, + decode: function (val) { + if (this.is(val)) return val; + var match = this.capture.exec(val); + return match ? new Date(match[1], match[2] - 1, match[3]) : undefined; + }, + is: function(val) { return val instanceof Date && !isNaN(val.valueOf()); }, + equals: function (a, b) { return this.is(a) && this.is(b) && a.toISOString() === b.toISOString(); }, + pattern: /[0-9]{4}-(?:0[1-9]|1[0-2])-(?:0[1-9]|[1-2][0-9]|3[0-1])/, + capture: /([0-9]{4})-(0[1-9]|1[0-2])-(0[1-9]|[1-2][0-9]|3[0-1])/ + }, + json: { + encode: angular.toJson, + decode: angular.fromJson, + is: angular.isObject, + equals: angular.equals, + pattern: /[^/]*/ + }, + any: { // does not encode/decode + encode: angular.identity, + decode: angular.identity, + is: angular.identity, + equals: angular.equals, + pattern: /.*/ + } + }; + + function getDefaultConfig() { + return { + strict: isStrictMode, + caseInsensitive: isCaseInsensitive + }; + } + + function isInjectable(value) { + return (isFunction(value) || (isArray(value) && isFunction(value[value.length - 1]))); + } + + /** + * [Internal] Get the default value of a parameter, which may be an injectable function. + */ + $UrlMatcherFactory.$$getDefaultValue = function(config) { + if (!isInjectable(config.value)) return config.value; + if (!injector) throw new Error("Injectable functions cannot be called at configuration time"); + return injector.invoke(config.value); + }; + + /** + * @ngdoc function + * @name ui.router.util.$urlMatcherFactory#caseInsensitive + * @methodOf ui.router.util.$urlMatcherFactory + * + * @description + * Defines whether URL matching should be case sensitive (the default behavior), or not. + * + * @param {boolean} value `false` to match URL in a case sensitive manner; otherwise `true`; + * @returns {boolean} the current value of caseInsensitive + */ + this.caseInsensitive = function(value) { + if (isDefined(value)) + isCaseInsensitive = value; + return isCaseInsensitive; + }; + + /** + * @ngdoc function + * @name ui.router.util.$urlMatcherFactory#strictMode + * @methodOf ui.router.util.$urlMatcherFactory + * + * @description + * Defines whether URLs should match trailing slashes, or not (the default behavior). + * + * @param {boolean=} value `false` to match trailing slashes in URLs, otherwise `true`. + * @returns {boolean} the current value of strictMode + */ + this.strictMode = function(value) { + if (isDefined(value)) + isStrictMode = value; + return isStrictMode; + }; + + /** + * @ngdoc function + * @name ui.router.util.$urlMatcherFactory#defaultSquashPolicy + * @methodOf ui.router.util.$urlMatcherFactory + * + * @description + * Sets the default behavior when generating or matching URLs with default parameter values. + * + * @param {string} value A string that defines the default parameter URL squashing behavior. + * `nosquash`: When generating an href with a default parameter value, do not squash the parameter value from the URL + * `slash`: When generating an href with a default parameter value, squash (remove) the parameter value, and, if the + * parameter is surrounded by slashes, squash (remove) one slash from the URL + * any other string, e.g. "~": When generating an href with a default parameter value, squash (remove) + * the parameter value from the URL and replace it with this string. + */ + this.defaultSquashPolicy = function(value) { + if (!isDefined(value)) return defaultSquashPolicy; + if (value !== true && value !== false && !isString(value)) + throw new Error("Invalid squash policy: " + value + ". Valid policies: false, true, arbitrary-string"); + defaultSquashPolicy = value; + return value; + }; + + /** + * @ngdoc function + * @name ui.router.util.$urlMatcherFactory#compile + * @methodOf ui.router.util.$urlMatcherFactory + * + * @description + * Creates a {@link ui.router.util.type:UrlMatcher `UrlMatcher`} for the specified pattern. + * + * @param {string} pattern The URL pattern. + * @param {Object} config The config object hash. + * @returns {UrlMatcher} The UrlMatcher. + */ + this.compile = function (pattern, config) { + return new UrlMatcher(pattern, extend(getDefaultConfig(), config)); + }; + + /** + * @ngdoc function + * @name ui.router.util.$urlMatcherFactory#isMatcher + * @methodOf ui.router.util.$urlMatcherFactory + * + * @description + * Returns true if the specified object is a `UrlMatcher`, or false otherwise. + * + * @param {Object} object The object to perform the type check against. + * @returns {Boolean} Returns `true` if the object matches the `UrlMatcher` interface, by + * implementing all the same methods. + */ + this.isMatcher = function (o) { + if (!isObject(o)) return false; + var result = true; + + forEach(UrlMatcher.prototype, function(val, name) { + if (isFunction(val)) { + result = result && (isDefined(o[name]) && isFunction(o[name])); + } + }); + return result; + }; + + /** + * @ngdoc function + * @name ui.router.util.$urlMatcherFactory#type + * @methodOf ui.router.util.$urlMatcherFactory + * + * @description + * Registers a custom {@link ui.router.util.type:Type `Type`} object that can be used to + * generate URLs with typed parameters. + * + * @param {string} name The type name. + * @param {Object|Function} definition The type definition. See + * {@link ui.router.util.type:Type `Type`} for information on the values accepted. + * @param {Object|Function} definitionFn (optional) A function that is injected before the app + * runtime starts. The result of this function is merged into the existing `definition`. + * See {@link ui.router.util.type:Type `Type`} for information on the values accepted. + * + * @returns {Object} Returns `$urlMatcherFactoryProvider`. + * + * @example + * This is a simple example of a custom type that encodes and decodes items from an + * array, using the array index as the URL-encoded value: + * + *
+   * var list = ['John', 'Paul', 'George', 'Ringo'];
+   *
+   * $urlMatcherFactoryProvider.type('listItem', {
+   *   encode: function(item) {
+   *     // Represent the list item in the URL using its corresponding index
+   *     return list.indexOf(item);
+   *   },
+   *   decode: function(item) {
+   *     // Look up the list item by index
+   *     return list[parseInt(item, 10)];
+   *   },
+   *   is: function(item) {
+   *     // Ensure the item is valid by checking to see that it appears
+   *     // in the list
+   *     return list.indexOf(item) > -1;
+   *   }
+   * });
+   *
+   * $stateProvider.state('list', {
+   *   url: "/list/{item:listItem}",
+   *   controller: function($scope, $stateParams) {
+   *     console.log($stateParams.item);
+   *   }
+   * });
+   *
+   * // ...
+   *
+   * // Changes URL to '/list/3', logs "Ringo" to the console
+   * $state.go('list', { item: "Ringo" });
+   * 
+ * + * This is a more complex example of a type that relies on dependency injection to + * interact with services, and uses the parameter name from the URL to infer how to + * handle encoding and decoding parameter values: + * + *
+   * // Defines a custom type that gets a value from a service,
+   * // where each service gets different types of values from
+   * // a backend API:
+   * $urlMatcherFactoryProvider.type('dbObject', {}, function(Users, Posts) {
+   *
+   *   // Matches up services to URL parameter names
+   *   var services = {
+   *     user: Users,
+   *     post: Posts
+   *   };
+   *
+   *   return {
+   *     encode: function(object) {
+   *       // Represent the object in the URL using its unique ID
+   *       return object.id;
+   *     },
+   *     decode: function(value, key) {
+   *       // Look up the object by ID, using the parameter
+   *       // name (key) to call the correct service
+   *       return services[key].findById(value);
+   *     },
+   *     is: function(object, key) {
+   *       // Check that object is a valid dbObject
+   *       return angular.isObject(object) && object.id && services[key];
+   *     }
+   *     equals: function(a, b) {
+   *       // Check the equality of decoded objects by comparing
+   *       // their unique IDs
+   *       return a.id === b.id;
+   *     }
+   *   };
+   * });
+   *
+   * // In a config() block, you can then attach URLs with
+   * // type-annotated parameters:
+   * $stateProvider.state('users', {
+   *   url: "/users",
+   *   // ...
+   * }).state('users.item', {
+   *   url: "/{user:dbObject}",
+   *   controller: function($scope, $stateParams) {
+   *     // $stateParams.user will now be an object returned from
+   *     // the Users service
+   *   },
+   *   // ...
+   * });
+   * 
+ */ + this.type = function (name, definition, definitionFn) { + if (!isDefined(definition)) return $types[name]; + if ($types.hasOwnProperty(name)) throw new Error("A type named '" + name + "' has already been defined."); + + $types[name] = new Type(extend({ name: name }, definition)); + if (definitionFn) { + typeQueue.push({ name: name, def: definitionFn }); + if (!enqueue) flushTypeQueue(); + } + return this; + }; + + // `flushTypeQueue()` waits until `$urlMatcherFactory` is injected before invoking the queued `definitionFn`s + function flushTypeQueue() { + while(typeQueue.length) { + var type = typeQueue.shift(); + if (type.pattern) throw new Error("You cannot override a type's .pattern at runtime."); + angular.extend($types[type.name], injector.invoke(type.def)); + } + } + + // Register default types. Store them in the prototype of $types. + forEach(defaultTypes, function(type, name) { $types[name] = new Type(extend({name: name}, type)); }); + $types = inherit($types, {}); + + /* No need to document $get, since it returns this */ + this.$get = ['$injector', function ($injector) { + injector = $injector; + enqueue = false; + flushTypeQueue(); + + forEach(defaultTypes, function(type, name) { + if (!$types[name]) $types[name] = new Type(type); + }); + return this; + }]; + + this.Param = function Param(id, type, config, location) { + var self = this; + config = unwrapShorthand(config); + type = getType(config, type, location); + var arrayMode = getArrayMode(); + type = arrayMode ? type.$asArray(arrayMode, location === "search") : type; + if (type.name === "string" && !arrayMode && location === "path" && config.value === undefined) + config.value = ""; // for 0.2.x; in 0.3.0+ do not automatically default to "" + var isOptional = config.value !== undefined; + var squash = getSquashPolicy(config, isOptional); + var replace = getReplace(config, arrayMode, isOptional, squash); + + function unwrapShorthand(config) { + var keys = isObject(config) ? objectKeys(config) : []; + var isShorthand = indexOf(keys, "value") === -1 && indexOf(keys, "type") === -1 && + indexOf(keys, "squash") === -1 && indexOf(keys, "array") === -1; + if (isShorthand) config = { value: config }; + config.$$fn = isInjectable(config.value) ? config.value : function () { return config.value; }; + return config; + } + + function getType(config, urlType, location) { + if (config.type && urlType) throw new Error("Param '"+id+"' has two type configurations."); + if (urlType) return urlType; + if (!config.type) return (location === "config" ? $types.any : $types.string); + return config.type instanceof Type ? config.type : new Type(config.type); + } + + // array config: param name (param[]) overrides default settings. explicit config overrides param name. + function getArrayMode() { + var arrayDefaults = { array: (location === "search" ? "auto" : false) }; + var arrayParamNomenclature = id.match(/\[\]$/) ? { array: true } : {}; + return extend(arrayDefaults, arrayParamNomenclature, config).array; + } + + /** + * returns false, true, or the squash value to indicate the "default parameter url squash policy". + */ + function getSquashPolicy(config, isOptional) { + var squash = config.squash; + if (!isOptional || squash === false) return false; + if (!isDefined(squash) || squash == null) return defaultSquashPolicy; + if (squash === true || isString(squash)) return squash; + throw new Error("Invalid squash policy: '" + squash + "'. Valid policies: false, true, or arbitrary string"); + } + + function getReplace(config, arrayMode, isOptional, squash) { + var replace, configuredKeys, defaultPolicy = [ + { from: "", to: (isOptional || arrayMode ? undefined : "") }, + { from: null, to: (isOptional || arrayMode ? undefined : "") } + ]; + replace = isArray(config.replace) ? config.replace : []; + if (isString(squash)) + replace.push({ from: squash, to: undefined }); + configuredKeys = map(replace, function(item) { return item.from; } ); + return filter(defaultPolicy, function(item) { return indexOf(configuredKeys, item.from) === -1; }).concat(replace); + } + + /** + * [Internal] Get the default value of a parameter, which may be an injectable function. + */ + function $$getDefaultValue() { + if (!injector) throw new Error("Injectable functions cannot be called at configuration time"); + return injector.invoke(config.$$fn); + } + + /** + * [Internal] Gets the decoded representation of a value if the value is defined, otherwise, returns the + * default value, which may be the result of an injectable function. + */ + function $value(value) { + function hasReplaceVal(val) { return function(obj) { return obj.from === val; }; } + function $replace(value) { + var replacement = map(filter(self.replace, hasReplaceVal(value)), function(obj) { return obj.to; }); + return replacement.length ? replacement[0] : value; + } + value = $replace(value); + return isDefined(value) ? self.type.decode(value) : $$getDefaultValue(); + } + + function toString() { return "{Param:" + id + " " + type + " squash: '" + squash + "' optional: " + isOptional + "}"; } + + extend(this, { + id: id, + type: type, + location: location, + array: arrayMode, + squash: squash, + replace: replace, + isOptional: isOptional, + value: $value, + dynamic: undefined, + config: config, + toString: toString + }); + }; + + function ParamSet(params) { + extend(this, params || {}); + } + + ParamSet.prototype = { + $$new: function() { + return inherit(this, extend(new ParamSet(), { $$parent: this})); + }, + $$keys: function () { + var keys = [], chain = [], parent = this, + ignore = objectKeys(ParamSet.prototype); + while (parent) { chain.push(parent); parent = parent.$$parent; } + chain.reverse(); + forEach(chain, function(paramset) { + forEach(objectKeys(paramset), function(key) { + if (indexOf(keys, key) === -1 && indexOf(ignore, key) === -1) keys.push(key); + }); + }); + return keys; + }, + $$values: function(paramValues) { + var values = {}, self = this; + forEach(self.$$keys(), function(key) { + values[key] = self[key].value(paramValues && paramValues[key]); + }); + return values; + }, + $$equals: function(paramValues1, paramValues2) { + var equal = true, self = this; + forEach(self.$$keys(), function(key) { + var left = paramValues1 && paramValues1[key], right = paramValues2 && paramValues2[key]; + if (!self[key].type.equals(left, right)) equal = false; + }); + return equal; + }, + $$validates: function $$validate(paramValues) { + var result = true, isOptional, val, param, self = this; + + forEach(this.$$keys(), function(key) { + param = self[key]; + val = paramValues[key]; + isOptional = !val && param.isOptional; + result = result && (isOptional || !!param.type.is(val)); + }); + return result; + }, + $$parent: undefined + }; + + this.ParamSet = ParamSet; +} + +// Register as a provider so it's available to other providers +angular.module('ui.router.util').provider('$urlMatcherFactory', $UrlMatcherFactory); +angular.module('ui.router.util').run(['$urlMatcherFactory', function($urlMatcherFactory) { }]); diff --git a/www/lib/angular-ui-router/src/urlRouter.js b/www/lib/angular-ui-router/src/urlRouter.js new file mode 100644 index 0000000..2b22937 --- /dev/null +++ b/www/lib/angular-ui-router/src/urlRouter.js @@ -0,0 +1,413 @@ +/** + * @ngdoc object + * @name ui.router.router.$urlRouterProvider + * + * @requires ui.router.util.$urlMatcherFactoryProvider + * @requires $locationProvider + * + * @description + * `$urlRouterProvider` has the responsibility of watching `$location`. + * When `$location` changes it runs through a list of rules one by one until a + * match is found. `$urlRouterProvider` is used behind the scenes anytime you specify + * a url in a state configuration. All urls are compiled into a UrlMatcher object. + * + * There are several methods on `$urlRouterProvider` that make it useful to use directly + * in your module config. + */ +$UrlRouterProvider.$inject = ['$locationProvider', '$urlMatcherFactoryProvider']; +function $UrlRouterProvider( $locationProvider, $urlMatcherFactory) { + var rules = [], otherwise = null, interceptDeferred = false, listener; + + // Returns a string that is a prefix of all strings matching the RegExp + function regExpPrefix(re) { + var prefix = /^\^((?:\\[^a-zA-Z0-9]|[^\\\[\]\^$*+?.()|{}]+)*)/.exec(re.source); + return (prefix != null) ? prefix[1].replace(/\\(.)/g, "$1") : ''; + } + + // Interpolates matched values into a String.replace()-style pattern + function interpolate(pattern, match) { + return pattern.replace(/\$(\$|\d{1,2})/, function (m, what) { + return match[what === '$' ? 0 : Number(what)]; + }); + } + + /** + * @ngdoc function + * @name ui.router.router.$urlRouterProvider#rule + * @methodOf ui.router.router.$urlRouterProvider + * + * @description + * Defines rules that are used by `$urlRouterProvider` to find matches for + * specific URLs. + * + * @example + *
+   * var app = angular.module('app', ['ui.router.router']);
+   *
+   * app.config(function ($urlRouterProvider) {
+   *   // Here's an example of how you might allow case insensitive urls
+   *   $urlRouterProvider.rule(function ($injector, $location) {
+   *     var path = $location.path(),
+   *         normalized = path.toLowerCase();
+   *
+   *     if (path !== normalized) {
+   *       return normalized;
+   *     }
+   *   });
+   * });
+   * 
+ * + * @param {object} rule Handler function that takes `$injector` and `$location` + * services as arguments. You can use them to return a valid path as a string. + * + * @return {object} `$urlRouterProvider` - `$urlRouterProvider` instance + */ + this.rule = function (rule) { + if (!isFunction(rule)) throw new Error("'rule' must be a function"); + rules.push(rule); + return this; + }; + + /** + * @ngdoc object + * @name ui.router.router.$urlRouterProvider#otherwise + * @methodOf ui.router.router.$urlRouterProvider + * + * @description + * Defines a path that is used when an invalid route is requested. + * + * @example + *
+   * var app = angular.module('app', ['ui.router.router']);
+   *
+   * app.config(function ($urlRouterProvider) {
+   *   // if the path doesn't match any of the urls you configured
+   *   // otherwise will take care of routing the user to the
+   *   // specified url
+   *   $urlRouterProvider.otherwise('/index');
+   *
+   *   // Example of using function rule as param
+   *   $urlRouterProvider.otherwise(function ($injector, $location) {
+   *     return '/a/valid/url';
+   *   });
+   * });
+   * 
+ * + * @param {string|object} rule The url path you want to redirect to or a function + * rule that returns the url path. The function version is passed two params: + * `$injector` and `$location` services, and must return a url string. + * + * @return {object} `$urlRouterProvider` - `$urlRouterProvider` instance + */ + this.otherwise = function (rule) { + if (isString(rule)) { + var redirect = rule; + rule = function () { return redirect; }; + } + else if (!isFunction(rule)) throw new Error("'rule' must be a function"); + otherwise = rule; + return this; + }; + + + function handleIfMatch($injector, handler, match) { + if (!match) return false; + var result = $injector.invoke(handler, handler, { $match: match }); + return isDefined(result) ? result : true; + } + + /** + * @ngdoc function + * @name ui.router.router.$urlRouterProvider#when + * @methodOf ui.router.router.$urlRouterProvider + * + * @description + * Registers a handler for a given url matching. if handle is a string, it is + * treated as a redirect, and is interpolated according to the syntax of match + * (i.e. like `String.replace()` for `RegExp`, or like a `UrlMatcher` pattern otherwise). + * + * If the handler is a function, it is injectable. It gets invoked if `$location` + * matches. You have the option of inject the match object as `$match`. + * + * The handler can return + * + * - **falsy** to indicate that the rule didn't match after all, then `$urlRouter` + * will continue trying to find another one that matches. + * - **string** which is treated as a redirect and passed to `$location.url()` + * - **void** or any **truthy** value tells `$urlRouter` that the url was handled. + * + * @example + *
+   * var app = angular.module('app', ['ui.router.router']);
+   *
+   * app.config(function ($urlRouterProvider) {
+   *   $urlRouterProvider.when($state.url, function ($match, $stateParams) {
+   *     if ($state.$current.navigable !== state ||
+   *         !equalForKeys($match, $stateParams) {
+   *      $state.transitionTo(state, $match, false);
+   *     }
+   *   });
+   * });
+   * 
+ * + * @param {string|object} what The incoming path that you want to redirect. + * @param {string|object} handler The path you want to redirect your user to. + */ + this.when = function (what, handler) { + var redirect, handlerIsString = isString(handler); + if (isString(what)) what = $urlMatcherFactory.compile(what); + + if (!handlerIsString && !isFunction(handler) && !isArray(handler)) + throw new Error("invalid 'handler' in when()"); + + var strategies = { + matcher: function (what, handler) { + if (handlerIsString) { + redirect = $urlMatcherFactory.compile(handler); + handler = ['$match', function ($match) { return redirect.format($match); }]; + } + return extend(function ($injector, $location) { + return handleIfMatch($injector, handler, what.exec($location.path(), $location.search())); + }, { + prefix: isString(what.prefix) ? what.prefix : '' + }); + }, + regex: function (what, handler) { + if (what.global || what.sticky) throw new Error("when() RegExp must not be global or sticky"); + + if (handlerIsString) { + redirect = handler; + handler = ['$match', function ($match) { return interpolate(redirect, $match); }]; + } + return extend(function ($injector, $location) { + return handleIfMatch($injector, handler, what.exec($location.path())); + }, { + prefix: regExpPrefix(what) + }); + } + }; + + var check = { matcher: $urlMatcherFactory.isMatcher(what), regex: what instanceof RegExp }; + + for (var n in check) { + if (check[n]) return this.rule(strategies[n](what, handler)); + } + + throw new Error("invalid 'what' in when()"); + }; + + /** + * @ngdoc function + * @name ui.router.router.$urlRouterProvider#deferIntercept + * @methodOf ui.router.router.$urlRouterProvider + * + * @description + * Disables (or enables) deferring location change interception. + * + * If you wish to customize the behavior of syncing the URL (for example, if you wish to + * defer a transition but maintain the current URL), call this method at configuration time. + * Then, at run time, call `$urlRouter.listen()` after you have configured your own + * `$locationChangeSuccess` event handler. + * + * @example + *
+   * var app = angular.module('app', ['ui.router.router']);
+   *
+   * app.config(function ($urlRouterProvider) {
+   *
+   *   // Prevent $urlRouter from automatically intercepting URL changes;
+   *   // this allows you to configure custom behavior in between
+   *   // location changes and route synchronization:
+   *   $urlRouterProvider.deferIntercept();
+   *
+   * }).run(function ($rootScope, $urlRouter, UserService) {
+   *
+   *   $rootScope.$on('$locationChangeSuccess', function(e) {
+   *     // UserService is an example service for managing user state
+   *     if (UserService.isLoggedIn()) return;
+   *
+   *     // Prevent $urlRouter's default handler from firing
+   *     e.preventDefault();
+   *
+   *     UserService.handleLogin().then(function() {
+   *       // Once the user has logged in, sync the current URL
+   *       // to the router:
+   *       $urlRouter.sync();
+   *     });
+   *   });
+   *
+   *   // Configures $urlRouter's listener *after* your custom listener
+   *   $urlRouter.listen();
+   * });
+   * 
+ * + * @param {boolean} defer Indicates whether to defer location change interception. Passing + no parameter is equivalent to `true`. + */ + this.deferIntercept = function (defer) { + if (defer === undefined) defer = true; + interceptDeferred = defer; + }; + + /** + * @ngdoc object + * @name ui.router.router.$urlRouter + * + * @requires $location + * @requires $rootScope + * @requires $injector + * @requires $browser + * + * @description + * + */ + this.$get = $get; + $get.$inject = ['$location', '$rootScope', '$injector', '$browser']; + function $get( $location, $rootScope, $injector, $browser) { + + var baseHref = $browser.baseHref(), location = $location.url(), lastPushedUrl; + + function appendBasePath(url, isHtml5, absolute) { + if (baseHref === '/') return url; + if (isHtml5) return baseHref.slice(0, -1) + url; + if (absolute) return baseHref.slice(1) + url; + return url; + } + + // TODO: Optimize groups of rules with non-empty prefix into some sort of decision tree + function update(evt) { + if (evt && evt.defaultPrevented) return; + var ignoreUpdate = lastPushedUrl && $location.url() === lastPushedUrl; + lastPushedUrl = undefined; + if (ignoreUpdate) return true; + + function check(rule) { + var handled = rule($injector, $location); + + if (!handled) return false; + if (isString(handled)) $location.replace().url(handled); + return true; + } + var n = rules.length, i; + + for (i = 0; i < n; i++) { + if (check(rules[i])) return; + } + // always check otherwise last to allow dynamic updates to the set of rules + if (otherwise) check(otherwise); + } + + function listen() { + listener = listener || $rootScope.$on('$locationChangeSuccess', update); + return listener; + } + + if (!interceptDeferred) listen(); + + return { + /** + * @ngdoc function + * @name ui.router.router.$urlRouter#sync + * @methodOf ui.router.router.$urlRouter + * + * @description + * Triggers an update; the same update that happens when the address bar url changes, aka `$locationChangeSuccess`. + * This method is useful when you need to use `preventDefault()` on the `$locationChangeSuccess` event, + * perform some custom logic (route protection, auth, config, redirection, etc) and then finally proceed + * with the transition by calling `$urlRouter.sync()`. + * + * @example + *
+       * angular.module('app', ['ui.router'])
+       *   .run(function($rootScope, $urlRouter) {
+       *     $rootScope.$on('$locationChangeSuccess', function(evt) {
+       *       // Halt state change from even starting
+       *       evt.preventDefault();
+       *       // Perform custom logic
+       *       var meetsRequirement = ...
+       *       // Continue with the update and state transition if logic allows
+       *       if (meetsRequirement) $urlRouter.sync();
+       *     });
+       * });
+       * 
+ */ + sync: function() { + update(); + }, + + listen: function() { + return listen(); + }, + + update: function(read) { + if (read) { + location = $location.url(); + return; + } + if ($location.url() === location) return; + + $location.url(location); + $location.replace(); + }, + + push: function(urlMatcher, params, options) { + $location.url(urlMatcher.format(params || {})); + lastPushedUrl = options && options.$$avoidResync ? $location.url() : undefined; + if (options && options.replace) $location.replace(); + }, + + /** + * @ngdoc function + * @name ui.router.router.$urlRouter#href + * @methodOf ui.router.router.$urlRouter + * + * @description + * A URL generation method that returns the compiled URL for a given + * {@link ui.router.util.type:UrlMatcher `UrlMatcher`}, populated with the provided parameters. + * + * @example + *
+       * $bob = $urlRouter.href(new UrlMatcher("/about/:person"), {
+       *   person: "bob"
+       * });
+       * // $bob == "/about/bob";
+       * 
+ * + * @param {UrlMatcher} urlMatcher The `UrlMatcher` object which is used as the template of the URL to generate. + * @param {object=} params An object of parameter values to fill the matcher's required parameters. + * @param {object=} options Options object. The options are: + * + * - **`absolute`** - {boolean=false}, If true will generate an absolute url, e.g. "http://www.example.com/fullurl". + * + * @returns {string} Returns the fully compiled URL, or `null` if `params` fail validation against `urlMatcher` + */ + href: function(urlMatcher, params, options) { + if (!urlMatcher.validates(params)) return null; + + var isHtml5 = $locationProvider.html5Mode(); + if (angular.isObject(isHtml5)) { + isHtml5 = isHtml5.enabled; + } + + var url = urlMatcher.format(params); + options = options || {}; + + if (!isHtml5 && url !== null) { + url = "#" + $locationProvider.hashPrefix() + url; + } + url = appendBasePath(url, isHtml5, options.absolute); + + if (!options.absolute || !url) { + return url; + } + + var slash = (!isHtml5 && url ? '/' : ''), port = $location.port(); + port = (port === 80 || port === 443 ? '' : ':' + port); + + return [$location.protocol(), '://', $location.host(), port, slash, url].join(''); + } + }; + } +} + +angular.module('ui.router.router').provider('$urlRouter', $UrlRouterProvider); diff --git a/www/lib/angular-ui-router/src/view.js b/www/lib/angular-ui-router/src/view.js new file mode 100644 index 0000000..f19a3c5 --- /dev/null +++ b/www/lib/angular-ui-router/src/view.js @@ -0,0 +1,71 @@ + +$ViewProvider.$inject = []; +function $ViewProvider() { + + this.$get = $get; + /** + * @ngdoc object + * @name ui.router.state.$view + * + * @requires ui.router.util.$templateFactory + * @requires $rootScope + * + * @description + * + */ + $get.$inject = ['$rootScope', '$templateFactory']; + function $get( $rootScope, $templateFactory) { + return { + // $view.load('full.viewName', { template: ..., controller: ..., resolve: ..., async: false, params: ... }) + /** + * @ngdoc function + * @name ui.router.state.$view#load + * @methodOf ui.router.state.$view + * + * @description + * + * @param {string} name name + * @param {object} options option object. + */ + load: function load(name, options) { + var result, defaults = { + template: null, controller: null, view: null, locals: null, notify: true, async: true, params: {} + }; + options = extend(defaults, options); + + if (options.view) { + result = $templateFactory.fromConfig(options.view, options.params, options.locals); + } + if (result && options.notify) { + /** + * @ngdoc event + * @name ui.router.state.$state#$viewContentLoading + * @eventOf ui.router.state.$view + * @eventType broadcast on root scope + * @description + * + * Fired once the view **begins loading**, *before* the DOM is rendered. + * + * @param {Object} event Event object. + * @param {Object} viewConfig The view config properties (template, controller, etc). + * + * @example + * + *
+         * $scope.$on('$viewContentLoading',
+         * function(event, viewConfig){
+         *     // Access to all the view config properties.
+         *     // and one special property 'targetView'
+         *     // viewConfig.targetView
+         * });
+         * 
+ */ + $rootScope.$broadcast('$viewContentLoading', options); + } + return result; + } + }; + } +} + +angular.module('ui.router.state').provider('$view', $ViewProvider); diff --git a/www/lib/angular-ui-router/src/viewDirective.js b/www/lib/angular-ui-router/src/viewDirective.js new file mode 100644 index 0000000..d3cf100 --- /dev/null +++ b/www/lib/angular-ui-router/src/viewDirective.js @@ -0,0 +1,302 @@ +/** + * @ngdoc directive + * @name ui.router.state.directive:ui-view + * + * @requires ui.router.state.$state + * @requires $compile + * @requires $controller + * @requires $injector + * @requires ui.router.state.$uiViewScroll + * @requires $document + * + * @restrict ECA + * + * @description + * The ui-view directive tells $state where to place your templates. + * + * @param {string=} name A view name. The name should be unique amongst the other views in the + * same state. You can have views of the same name that live in different states. + * + * @param {string=} autoscroll It allows you to set the scroll behavior of the browser window + * when a view is populated. By default, $anchorScroll is overridden by ui-router's custom scroll + * service, {@link ui.router.state.$uiViewScroll}. This custom service let's you + * scroll ui-view elements into view when they are populated during a state activation. + * + * *Note: To revert back to old [`$anchorScroll`](http://docs.angularjs.org/api/ng.$anchorScroll) + * functionality, call `$uiViewScrollProvider.useAnchorScroll()`.* + * + * @param {string=} onload Expression to evaluate whenever the view updates. + * + * @example + * A view can be unnamed or named. + *
+ * 
+ * 
+ * + * + *
+ *
+ * + * You can only have one unnamed view within any template (or root html). If you are only using a + * single view and it is unnamed then you can populate it like so: + *
+ * 
+ * $stateProvider.state("home", { + * template: "

HELLO!

" + * }) + *
+ * + * The above is a convenient shortcut equivalent to specifying your view explicitly with the {@link ui.router.state.$stateProvider#views `views`} + * config property, by name, in this case an empty name: + *
+ * $stateProvider.state("home", {
+ *   views: {
+ *     "": {
+ *       template: "

HELLO!

" + * } + * } + * }) + *
+ * + * But typically you'll only use the views property if you name your view or have more than one view + * in the same template. There's not really a compelling reason to name a view if its the only one, + * but you could if you wanted, like so: + *
+ * 
+ *
+ *
+ * $stateProvider.state("home", {
+ *   views: {
+ *     "main": {
+ *       template: "

HELLO!

" + * } + * } + * }) + *
+ * + * Really though, you'll use views to set up multiple views: + *
+ * 
+ *
+ *
+ *
+ * + *
+ * $stateProvider.state("home", {
+ *   views: {
+ *     "": {
+ *       template: "

HELLO!

" + * }, + * "chart": { + * template: "" + * }, + * "data": { + * template: "" + * } + * } + * }) + *
+ * + * Examples for `autoscroll`: + * + *
+ * 
+ * 
+ *
+ * 
+ * 
+ * 
+ * 
+ * 
+ */ +$ViewDirective.$inject = ['$state', '$injector', '$uiViewScroll', '$interpolate']; +function $ViewDirective( $state, $injector, $uiViewScroll, $interpolate) { + + function getService() { + return ($injector.has) ? function(service) { + return $injector.has(service) ? $injector.get(service) : null; + } : function(service) { + try { + return $injector.get(service); + } catch (e) { + return null; + } + }; + } + + var service = getService(), + $animator = service('$animator'), + $animate = service('$animate'); + + // Returns a set of DOM manipulation functions based on which Angular version + // it should use + function getRenderer(attrs, scope) { + var statics = function() { + return { + enter: function (element, target, cb) { target.after(element); cb(); }, + leave: function (element, cb) { element.remove(); cb(); } + }; + }; + + if ($animate) { + return { + enter: function(element, target, cb) { + var promise = $animate.enter(element, null, target, cb); + if (promise && promise.then) promise.then(cb); + }, + leave: function(element, cb) { + var promise = $animate.leave(element, cb); + if (promise && promise.then) promise.then(cb); + } + }; + } + + if ($animator) { + var animate = $animator && $animator(scope, attrs); + + return { + enter: function(element, target, cb) {animate.enter(element, null, target); cb(); }, + leave: function(element, cb) { animate.leave(element); cb(); } + }; + } + + return statics(); + } + + var directive = { + restrict: 'ECA', + terminal: true, + priority: 400, + transclude: 'element', + compile: function (tElement, tAttrs, $transclude) { + return function (scope, $element, attrs) { + var previousEl, currentEl, currentScope, latestLocals, + onloadExp = attrs.onload || '', + autoScrollExp = attrs.autoscroll, + renderer = getRenderer(attrs, scope); + + scope.$on('$stateChangeSuccess', function() { + updateView(false); + }); + scope.$on('$viewContentLoading', function() { + updateView(false); + }); + + updateView(true); + + function cleanupLastView() { + if (previousEl) { + previousEl.remove(); + previousEl = null; + } + + if (currentScope) { + currentScope.$destroy(); + currentScope = null; + } + + if (currentEl) { + renderer.leave(currentEl, function() { + previousEl = null; + }); + + previousEl = currentEl; + currentEl = null; + } + } + + function updateView(firstTime) { + var newScope, + name = getUiViewName(scope, attrs, $element, $interpolate), + previousLocals = name && $state.$current && $state.$current.locals[name]; + + if (!firstTime && previousLocals === latestLocals) return; // nothing to do + newScope = scope.$new(); + latestLocals = $state.$current.locals[name]; + + var clone = $transclude(newScope, function(clone) { + renderer.enter(clone, $element, function onUiViewEnter() { + if(currentScope) { + currentScope.$emit('$viewContentAnimationEnded'); + } + + if (angular.isDefined(autoScrollExp) && !autoScrollExp || scope.$eval(autoScrollExp)) { + $uiViewScroll(clone); + } + }); + cleanupLastView(); + }); + + currentEl = clone; + currentScope = newScope; + /** + * @ngdoc event + * @name ui.router.state.directive:ui-view#$viewContentLoaded + * @eventOf ui.router.state.directive:ui-view + * @eventType emits on ui-view directive scope + * @description * + * Fired once the view is **loaded**, *after* the DOM is rendered. + * + * @param {Object} event Event object. + */ + currentScope.$emit('$viewContentLoaded'); + currentScope.$eval(onloadExp); + } + }; + } + }; + + return directive; +} + +$ViewDirectiveFill.$inject = ['$compile', '$controller', '$state', '$interpolate']; +function $ViewDirectiveFill ( $compile, $controller, $state, $interpolate) { + return { + restrict: 'ECA', + priority: -400, + compile: function (tElement) { + var initial = tElement.html(); + return function (scope, $element, attrs) { + var current = $state.$current, + name = getUiViewName(scope, attrs, $element, $interpolate), + locals = current && current.locals[name]; + + if (! locals) { + return; + } + + $element.data('$uiView', { name: name, state: locals.$$state }); + $element.html(locals.$template ? locals.$template : initial); + + var link = $compile($element.contents()); + + if (locals.$$controller) { + locals.$scope = scope; + var controller = $controller(locals.$$controller, locals); + if (locals.$$controllerAs) { + scope[locals.$$controllerAs] = controller; + } + $element.data('$ngControllerController', controller); + $element.children().data('$ngControllerController', controller); + } + + link(scope); + }; + } + }; +} + +/** + * Shared ui-view code for both directives: + * Given scope, element, and its attributes, return the view's name + */ +function getUiViewName(scope, attrs, element, $interpolate) { + var name = $interpolate(attrs.uiView || attrs.name || '')(scope); + var inherited = element.inheritedData('$uiView'); + return name.indexOf('@') >= 0 ? name : (name + '@' + (inherited ? inherited.state.name : '')); +} + +angular.module('ui.router.state').directive('uiView', $ViewDirective); +angular.module('ui.router.state').directive('uiView', $ViewDirectiveFill); diff --git a/www/lib/angular-ui-router/src/viewScroll.js b/www/lib/angular-ui-router/src/viewScroll.js new file mode 100644 index 0000000..dfe0a03 --- /dev/null +++ b/www/lib/angular-ui-router/src/viewScroll.js @@ -0,0 +1,52 @@ +/** + * @ngdoc object + * @name ui.router.state.$uiViewScrollProvider + * + * @description + * Provider that returns the {@link ui.router.state.$uiViewScroll} service function. + */ +function $ViewScrollProvider() { + + var useAnchorScroll = false; + + /** + * @ngdoc function + * @name ui.router.state.$uiViewScrollProvider#useAnchorScroll + * @methodOf ui.router.state.$uiViewScrollProvider + * + * @description + * Reverts back to using the core [`$anchorScroll`](http://docs.angularjs.org/api/ng.$anchorScroll) service for + * scrolling based on the url anchor. + */ + this.useAnchorScroll = function () { + useAnchorScroll = true; + }; + + /** + * @ngdoc object + * @name ui.router.state.$uiViewScroll + * + * @requires $anchorScroll + * @requires $timeout + * + * @description + * When called with a jqLite element, it scrolls the element into view (after a + * `$timeout` so the DOM has time to refresh). + * + * If you prefer to rely on `$anchorScroll` to scroll the view to the anchor, + * this can be enabled by calling {@link ui.router.state.$uiViewScrollProvider#methods_useAnchorScroll `$uiViewScrollProvider.useAnchorScroll()`}. + */ + this.$get = ['$anchorScroll', '$timeout', function ($anchorScroll, $timeout) { + if (useAnchorScroll) { + return $anchorScroll; + } + + return function ($element) { + $timeout(function () { + $element[0].scrollIntoView(); + }, 0, false); + }; + }]; +} + +angular.module('ui.router.state').provider('$uiViewScroll', $ViewScrollProvider); diff --git a/www/lib/angular/.bower.json b/www/lib/angular/.bower.json new file mode 100644 index 0000000..15b19d6 --- /dev/null +++ b/www/lib/angular/.bower.json @@ -0,0 +1,18 @@ +{ + "name": "angular", + "version": "1.5.3", + "license": "MIT", + "main": "./angular.js", + "ignore": [], + "dependencies": {}, + "homepage": "https://github.com/angular/bower-angular", + "_release": "1.5.3", + "_resolution": { + "type": "version", + "tag": "v1.5.3", + "commit": "5a07c5107b4d24f41744a02b07717d55bad88e70" + }, + "_source": "https://github.com/angular/bower-angular.git", + "_target": "1.5.3", + "_originalSource": "angular" +} \ No newline at end of file diff --git a/www/lib/angular/README.md b/www/lib/angular/README.md new file mode 100644 index 0000000..d1bc0ed --- /dev/null +++ b/www/lib/angular/README.md @@ -0,0 +1,64 @@ +# packaged angular + +This repo is for distribution on `npm` and `bower`. The source for this module is in the +[main AngularJS repo](https://github.com/angular/angular.js). +Please file issues and pull requests against that repo. + +## Install + +You can install this package either with `npm` or with `bower`. + +### npm + +```shell +npm install angular +``` + +Then add a ` +``` + +Or `require('angular')` from your code. + +### bower + +```shell +bower install angular +``` + +Then add a ` +``` + +## Documentation + +Documentation is available on the +[AngularJS docs site](http://docs.angularjs.org/). + +## License + +The MIT License + +Copyright (c) 2010-2015 Google, Inc. http://angularjs.org + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. diff --git a/www/lib/angular/angular-csp.css b/www/lib/angular/angular-csp.css new file mode 100644 index 0000000..f3cd926 --- /dev/null +++ b/www/lib/angular/angular-csp.css @@ -0,0 +1,21 @@ +/* Include this file in your html if you are using the CSP mode. */ + +@charset "UTF-8"; + +[ng\:cloak], [ng-cloak], [data-ng-cloak], [x-ng-cloak], +.ng-cloak, .x-ng-cloak, +.ng-hide:not(.ng-hide-animate) { + display: none !important; +} + +ng\:form { + display: block; +} + +.ng-animate-shim { + visibility:hidden; +} + +.ng-anchor { + position:absolute; +} diff --git a/www/lib/angular/angular.js b/www/lib/angular/angular.js new file mode 100644 index 0000000..5e6fb2c --- /dev/null +++ b/www/lib/angular/angular.js @@ -0,0 +1,30714 @@ +/** + * @license AngularJS v1.5.3 + * (c) 2010-2016 Google, Inc. http://angularjs.org + * License: MIT + */ +(function(window, document, undefined) {'use strict'; + +/** + * @description + * + * This object provides a utility for producing rich Error messages within + * Angular. It can be called as follows: + * + * var exampleMinErr = minErr('example'); + * throw exampleMinErr('one', 'This {0} is {1}', foo, bar); + * + * The above creates an instance of minErr in the example namespace. The + * resulting error will have a namespaced error code of example.one. The + * resulting error will replace {0} with the value of foo, and {1} with the + * value of bar. The object is not restricted in the number of arguments it can + * take. + * + * If fewer arguments are specified than necessary for interpolation, the extra + * interpolation markers will be preserved in the final string. + * + * Since data will be parsed statically during a build step, some restrictions + * are applied with respect to how minErr instances are created and called. + * Instances should have names of the form namespaceMinErr for a minErr created + * using minErr('namespace') . Error codes, namespaces and template strings + * should all be static strings, not variables or general expressions. + * + * @param {string} module The namespace to use for the new minErr instance. + * @param {function} ErrorConstructor Custom error constructor to be instantiated when returning + * error from returned function, for cases when a particular type of error is useful. + * @returns {function(code:string, template:string, ...templateArgs): Error} minErr instance + */ + +function minErr(module, ErrorConstructor) { + ErrorConstructor = ErrorConstructor || Error; + return function() { + var SKIP_INDEXES = 2; + + var templateArgs = arguments, + code = templateArgs[0], + message = '[' + (module ? module + ':' : '') + code + '] ', + template = templateArgs[1], + paramPrefix, i; + + message += template.replace(/\{\d+\}/g, function(match) { + var index = +match.slice(1, -1), + shiftedIndex = index + SKIP_INDEXES; + + if (shiftedIndex < templateArgs.length) { + return toDebugString(templateArgs[shiftedIndex]); + } + + return match; + }); + + message += '\nhttp://errors.angularjs.org/1.5.3/' + + (module ? module + '/' : '') + code; + + for (i = SKIP_INDEXES, paramPrefix = '?'; i < templateArgs.length; i++, paramPrefix = '&') { + message += paramPrefix + 'p' + (i - SKIP_INDEXES) + '=' + + encodeURIComponent(toDebugString(templateArgs[i])); + } + + return new ErrorConstructor(message); + }; +} + +/* We need to tell jshint what variables are being exported */ +/* global angular: true, + msie: true, + jqLite: true, + jQuery: true, + slice: true, + splice: true, + push: true, + toString: true, + ngMinErr: true, + angularModule: true, + uid: true, + REGEX_STRING_REGEXP: true, + VALIDITY_STATE_PROPERTY: true, + + lowercase: true, + uppercase: true, + manualLowercase: true, + manualUppercase: true, + nodeName_: true, + isArrayLike: true, + forEach: true, + forEachSorted: true, + reverseParams: true, + nextUid: true, + setHashKey: true, + extend: true, + toInt: true, + inherit: true, + merge: true, + noop: true, + identity: true, + valueFn: true, + isUndefined: true, + isDefined: true, + isObject: true, + isBlankObject: true, + isString: true, + isNumber: true, + isDate: true, + isArray: true, + isFunction: true, + isRegExp: true, + isWindow: true, + isScope: true, + isFile: true, + isFormData: true, + isBlob: true, + isBoolean: true, + isPromiseLike: true, + trim: true, + escapeForRegexp: true, + isElement: true, + makeMap: true, + includes: true, + arrayRemove: true, + copy: true, + shallowCopy: true, + equals: true, + csp: true, + jq: true, + concat: true, + sliceArgs: true, + bind: true, + toJsonReplacer: true, + toJson: true, + fromJson: true, + convertTimezoneToLocal: true, + timezoneToOffset: true, + startingTag: true, + tryDecodeURIComponent: true, + parseKeyValue: true, + toKeyValue: true, + encodeUriSegment: true, + encodeUriQuery: true, + angularInit: true, + bootstrap: true, + getTestability: true, + snake_case: true, + bindJQuery: true, + assertArg: true, + assertArgFn: true, + assertNotHasOwnProperty: true, + getter: true, + getBlockNodes: true, + hasOwnProperty: true, + createMap: true, + + NODE_TYPE_ELEMENT: true, + NODE_TYPE_ATTRIBUTE: true, + NODE_TYPE_TEXT: true, + NODE_TYPE_COMMENT: true, + NODE_TYPE_DOCUMENT: true, + NODE_TYPE_DOCUMENT_FRAGMENT: true, +*/ + +//////////////////////////////////// + +/** + * @ngdoc module + * @name ng + * @module ng + * @description + * + * # ng (core module) + * The ng module is loaded by default when an AngularJS application is started. The module itself + * contains the essential components for an AngularJS application to function. The table below + * lists a high level breakdown of each of the services/factories, filters, directives and testing + * components available within this core module. + * + *
+ */ + +var REGEX_STRING_REGEXP = /^\/(.+)\/([a-z]*)$/; + +// The name of a form control's ValidityState property. +// This is used so that it's possible for internal tests to create mock ValidityStates. +var VALIDITY_STATE_PROPERTY = 'validity'; + +var hasOwnProperty = Object.prototype.hasOwnProperty; + +var lowercase = function(string) {return isString(string) ? string.toLowerCase() : string;}; +var uppercase = function(string) {return isString(string) ? string.toUpperCase() : string;}; + + +var manualLowercase = function(s) { + /* jshint bitwise: false */ + return isString(s) + ? s.replace(/[A-Z]/g, function(ch) {return String.fromCharCode(ch.charCodeAt(0) | 32);}) + : s; +}; +var manualUppercase = function(s) { + /* jshint bitwise: false */ + return isString(s) + ? s.replace(/[a-z]/g, function(ch) {return String.fromCharCode(ch.charCodeAt(0) & ~32);}) + : s; +}; + + +// String#toLowerCase and String#toUpperCase don't produce correct results in browsers with Turkish +// locale, for this reason we need to detect this case and redefine lowercase/uppercase methods +// with correct but slower alternatives. See https://github.com/angular/angular.js/issues/11387 +if ('i' !== 'I'.toLowerCase()) { + lowercase = manualLowercase; + uppercase = manualUppercase; +} + + +var + msie, // holds major version number for IE, or NaN if UA is not IE. + jqLite, // delay binding since jQuery could be loaded after us. + jQuery, // delay binding + slice = [].slice, + splice = [].splice, + push = [].push, + toString = Object.prototype.toString, + getPrototypeOf = Object.getPrototypeOf, + ngMinErr = minErr('ng'), + + /** @name angular */ + angular = window.angular || (window.angular = {}), + angularModule, + uid = 0; + +/** + * documentMode is an IE-only property + * http://msdn.microsoft.com/en-us/library/ie/cc196988(v=vs.85).aspx + */ +msie = document.documentMode; + + +/** + * @private + * @param {*} obj + * @return {boolean} Returns true if `obj` is an array or array-like object (NodeList, Arguments, + * String ...) + */ +function isArrayLike(obj) { + + // `null`, `undefined` and `window` are not array-like + if (obj == null || isWindow(obj)) return false; + + // arrays, strings and jQuery/jqLite objects are array like + // * jqLite is either the jQuery or jqLite constructor function + // * we have to check the existence of jqLite first as this method is called + // via the forEach method when constructing the jqLite object in the first place + if (isArray(obj) || isString(obj) || (jqLite && obj instanceof jqLite)) return true; + + // Support: iOS 8.2 (not reproducible in simulator) + // "length" in obj used to prevent JIT error (gh-11508) + var length = "length" in Object(obj) && obj.length; + + // NodeList objects (with `item` method) and + // other objects with suitable length characteristics are array-like + return isNumber(length) && + (length >= 0 && ((length - 1) in obj || obj instanceof Array) || typeof obj.item == 'function'); + +} + +/** + * @ngdoc function + * @name angular.forEach + * @module ng + * @kind function + * + * @description + * Invokes the `iterator` function once for each item in `obj` collection, which can be either an + * object or an array. The `iterator` function is invoked with `iterator(value, key, obj)`, where `value` + * is the value of an object property or an array element, `key` is the object property key or + * array element index and obj is the `obj` itself. Specifying a `context` for the function is optional. + * + * It is worth noting that `.forEach` does not iterate over inherited properties because it filters + * using the `hasOwnProperty` method. + * + * Unlike ES262's + * [Array.prototype.forEach](http://www.ecma-international.org/ecma-262/5.1/#sec-15.4.4.18), + * providing 'undefined' or 'null' values for `obj` will not throw a TypeError, but rather just + * return the value provided. + * + ```js + var values = {name: 'misko', gender: 'male'}; + var log = []; + angular.forEach(values, function(value, key) { + this.push(key + ': ' + value); + }, log); + expect(log).toEqual(['name: misko', 'gender: male']); + ``` + * + * @param {Object|Array} obj Object to iterate over. + * @param {Function} iterator Iterator function. + * @param {Object=} context Object to become context (`this`) for the iterator function. + * @returns {Object|Array} Reference to `obj`. + */ + +function forEach(obj, iterator, context) { + var key, length; + if (obj) { + if (isFunction(obj)) { + for (key in obj) { + // Need to check if hasOwnProperty exists, + // as on IE8 the result of querySelectorAll is an object without a hasOwnProperty function + if (key != 'prototype' && key != 'length' && key != 'name' && (!obj.hasOwnProperty || obj.hasOwnProperty(key))) { + iterator.call(context, obj[key], key, obj); + } + } + } else if (isArray(obj) || isArrayLike(obj)) { + var isPrimitive = typeof obj !== 'object'; + for (key = 0, length = obj.length; key < length; key++) { + if (isPrimitive || key in obj) { + iterator.call(context, obj[key], key, obj); + } + } + } else if (obj.forEach && obj.forEach !== forEach) { + obj.forEach(iterator, context, obj); + } else if (isBlankObject(obj)) { + // createMap() fast path --- Safe to avoid hasOwnProperty check because prototype chain is empty + for (key in obj) { + iterator.call(context, obj[key], key, obj); + } + } else if (typeof obj.hasOwnProperty === 'function') { + // Slow path for objects inheriting Object.prototype, hasOwnProperty check needed + for (key in obj) { + if (obj.hasOwnProperty(key)) { + iterator.call(context, obj[key], key, obj); + } + } + } else { + // Slow path for objects which do not have a method `hasOwnProperty` + for (key in obj) { + if (hasOwnProperty.call(obj, key)) { + iterator.call(context, obj[key], key, obj); + } + } + } + } + return obj; +} + +function forEachSorted(obj, iterator, context) { + var keys = Object.keys(obj).sort(); + for (var i = 0; i < keys.length; i++) { + iterator.call(context, obj[keys[i]], keys[i]); + } + return keys; +} + + +/** + * when using forEach the params are value, key, but it is often useful to have key, value. + * @param {function(string, *)} iteratorFn + * @returns {function(*, string)} + */ +function reverseParams(iteratorFn) { + return function(value, key) {iteratorFn(key, value);}; +} + +/** + * A consistent way of creating unique IDs in angular. + * + * Using simple numbers allows us to generate 28.6 million unique ids per second for 10 years before + * we hit number precision issues in JavaScript. + * + * Math.pow(2,53) / 60 / 60 / 24 / 365 / 10 = 28.6M + * + * @returns {number} an unique alpha-numeric string + */ +function nextUid() { + return ++uid; +} + + +/** + * Set or clear the hashkey for an object. + * @param obj object + * @param h the hashkey (!truthy to delete the hashkey) + */ +function setHashKey(obj, h) { + if (h) { + obj.$$hashKey = h; + } else { + delete obj.$$hashKey; + } +} + + +function baseExtend(dst, objs, deep) { + var h = dst.$$hashKey; + + for (var i = 0, ii = objs.length; i < ii; ++i) { + var obj = objs[i]; + if (!isObject(obj) && !isFunction(obj)) continue; + var keys = Object.keys(obj); + for (var j = 0, jj = keys.length; j < jj; j++) { + var key = keys[j]; + var src = obj[key]; + + if (deep && isObject(src)) { + if (isDate(src)) { + dst[key] = new Date(src.valueOf()); + } else if (isRegExp(src)) { + dst[key] = new RegExp(src); + } else if (src.nodeName) { + dst[key] = src.cloneNode(true); + } else if (isElement(src)) { + dst[key] = src.clone(); + } else { + if (!isObject(dst[key])) dst[key] = isArray(src) ? [] : {}; + baseExtend(dst[key], [src], true); + } + } else { + dst[key] = src; + } + } + } + + setHashKey(dst, h); + return dst; +} + +/** + * @ngdoc function + * @name angular.extend + * @module ng + * @kind function + * + * @description + * Extends the destination object `dst` by copying own enumerable properties from the `src` object(s) + * to `dst`. You can specify multiple `src` objects. If you want to preserve original objects, you can do so + * by passing an empty object as the target: `var object = angular.extend({}, object1, object2)`. + * + * **Note:** Keep in mind that `angular.extend` does not support recursive merge (deep copy). Use + * {@link angular.merge} for this. + * + * @param {Object} dst Destination object. + * @param {...Object} src Source object(s). + * @returns {Object} Reference to `dst`. + */ +function extend(dst) { + return baseExtend(dst, slice.call(arguments, 1), false); +} + + +/** +* @ngdoc function +* @name angular.merge +* @module ng +* @kind function +* +* @description +* Deeply extends the destination object `dst` by copying own enumerable properties from the `src` object(s) +* to `dst`. You can specify multiple `src` objects. If you want to preserve original objects, you can do so +* by passing an empty object as the target: `var object = angular.merge({}, object1, object2)`. +* +* Unlike {@link angular.extend extend()}, `merge()` recursively descends into object properties of source +* objects, performing a deep copy. +* +* @param {Object} dst Destination object. +* @param {...Object} src Source object(s). +* @returns {Object} Reference to `dst`. +*/ +function merge(dst) { + return baseExtend(dst, slice.call(arguments, 1), true); +} + + + +function toInt(str) { + return parseInt(str, 10); +} + + +function inherit(parent, extra) { + return extend(Object.create(parent), extra); +} + +/** + * @ngdoc function + * @name angular.noop + * @module ng + * @kind function + * + * @description + * A function that performs no operations. This function can be useful when writing code in the + * functional style. + ```js + function foo(callback) { + var result = calculateResult(); + (callback || angular.noop)(result); + } + ``` + */ +function noop() {} +noop.$inject = []; + + +/** + * @ngdoc function + * @name angular.identity + * @module ng + * @kind function + * + * @description + * A function that returns its first argument. This function is useful when writing code in the + * functional style. + * + ```js + function transformer(transformationFn, value) { + return (transformationFn || angular.identity)(value); + }; + ``` + * @param {*} value to be returned. + * @returns {*} the value passed in. + */ +function identity($) {return $;} +identity.$inject = []; + + +function valueFn(value) {return function valueRef() {return value;};} + +function hasCustomToString(obj) { + return isFunction(obj.toString) && obj.toString !== toString; +} + + +/** + * @ngdoc function + * @name angular.isUndefined + * @module ng + * @kind function + * + * @description + * Determines if a reference is undefined. + * + * @param {*} value Reference to check. + * @returns {boolean} True if `value` is undefined. + */ +function isUndefined(value) {return typeof value === 'undefined';} + + +/** + * @ngdoc function + * @name angular.isDefined + * @module ng + * @kind function + * + * @description + * Determines if a reference is defined. + * + * @param {*} value Reference to check. + * @returns {boolean} True if `value` is defined. + */ +function isDefined(value) {return typeof value !== 'undefined';} + + +/** + * @ngdoc function + * @name angular.isObject + * @module ng + * @kind function + * + * @description + * Determines if a reference is an `Object`. Unlike `typeof` in JavaScript, `null`s are not + * considered to be objects. Note that JavaScript arrays are objects. + * + * @param {*} value Reference to check. + * @returns {boolean} True if `value` is an `Object` but not `null`. + */ +function isObject(value) { + // http://jsperf.com/isobject4 + return value !== null && typeof value === 'object'; +} + + +/** + * Determine if a value is an object with a null prototype + * + * @returns {boolean} True if `value` is an `Object` with a null prototype + */ +function isBlankObject(value) { + return value !== null && typeof value === 'object' && !getPrototypeOf(value); +} + + +/** + * @ngdoc function + * @name angular.isString + * @module ng + * @kind function + * + * @description + * Determines if a reference is a `String`. + * + * @param {*} value Reference to check. + * @returns {boolean} True if `value` is a `String`. + */ +function isString(value) {return typeof value === 'string';} + + +/** + * @ngdoc function + * @name angular.isNumber + * @module ng + * @kind function + * + * @description + * Determines if a reference is a `Number`. + * + * This includes the "special" numbers `NaN`, `+Infinity` and `-Infinity`. + * + * If you wish to exclude these then you can use the native + * [`isFinite'](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/isFinite) + * method. + * + * @param {*} value Reference to check. + * @returns {boolean} True if `value` is a `Number`. + */ +function isNumber(value) {return typeof value === 'number';} + + +/** + * @ngdoc function + * @name angular.isDate + * @module ng + * @kind function + * + * @description + * Determines if a value is a date. + * + * @param {*} value Reference to check. + * @returns {boolean} True if `value` is a `Date`. + */ +function isDate(value) { + return toString.call(value) === '[object Date]'; +} + + +/** + * @ngdoc function + * @name angular.isArray + * @module ng + * @kind function + * + * @description + * Determines if a reference is an `Array`. + * + * @param {*} value Reference to check. + * @returns {boolean} True if `value` is an `Array`. + */ +var isArray = Array.isArray; + +/** + * @ngdoc function + * @name angular.isFunction + * @module ng + * @kind function + * + * @description + * Determines if a reference is a `Function`. + * + * @param {*} value Reference to check. + * @returns {boolean} True if `value` is a `Function`. + */ +function isFunction(value) {return typeof value === 'function';} + + +/** + * Determines if a value is a regular expression object. + * + * @private + * @param {*} value Reference to check. + * @returns {boolean} True if `value` is a `RegExp`. + */ +function isRegExp(value) { + return toString.call(value) === '[object RegExp]'; +} + + +/** + * Checks if `obj` is a window object. + * + * @private + * @param {*} obj Object to check + * @returns {boolean} True if `obj` is a window obj. + */ +function isWindow(obj) { + return obj && obj.window === obj; +} + + +function isScope(obj) { + return obj && obj.$evalAsync && obj.$watch; +} + + +function isFile(obj) { + return toString.call(obj) === '[object File]'; +} + + +function isFormData(obj) { + return toString.call(obj) === '[object FormData]'; +} + + +function isBlob(obj) { + return toString.call(obj) === '[object Blob]'; +} + + +function isBoolean(value) { + return typeof value === 'boolean'; +} + + +function isPromiseLike(obj) { + return obj && isFunction(obj.then); +} + + +var TYPED_ARRAY_REGEXP = /^\[object (?:Uint8|Uint8Clamped|Uint16|Uint32|Int8|Int16|Int32|Float32|Float64)Array\]$/; +function isTypedArray(value) { + return value && isNumber(value.length) && TYPED_ARRAY_REGEXP.test(toString.call(value)); +} + +function isArrayBuffer(obj) { + return toString.call(obj) === '[object ArrayBuffer]'; +} + + +var trim = function(value) { + return isString(value) ? value.trim() : value; +}; + +// Copied from: +// http://docs.closure-library.googlecode.com/git/local_closure_goog_string_string.js.source.html#line1021 +// Prereq: s is a string. +var escapeForRegexp = function(s) { + return s.replace(/([-()\[\]{}+?*.$\^|,:#= 0) { + array.splice(index, 1); + } + return index; +} + +/** + * @ngdoc function + * @name angular.copy + * @module ng + * @kind function + * + * @description + * Creates a deep copy of `source`, which should be an object or an array. + * + * * If no destination is supplied, a copy of the object or array is created. + * * If a destination is provided, all of its elements (for arrays) or properties (for objects) + * are deleted and then all elements/properties from the source are copied to it. + * * If `source` is not an object or array (inc. `null` and `undefined`), `source` is returned. + * * If `source` is identical to 'destination' an exception will be thrown. + * + * @param {*} source The source that will be used to make a copy. + * Can be any type, including primitives, `null`, and `undefined`. + * @param {(Object|Array)=} destination Destination into which the source is copied. If + * provided, must be of the same type as `source`. + * @returns {*} The copy or updated `destination`, if `destination` was specified. + * + * @example + + +
+
+ Name:
+ E-mail:
+ Gender: male + female
+ + +
+
form = {{user | json}}
+
master = {{master | json}}
+
+ + +
+
+ */ +function copy(source, destination) { + var stackSource = []; + var stackDest = []; + + if (destination) { + if (isTypedArray(destination) || isArrayBuffer(destination)) { + throw ngMinErr('cpta', "Can't copy! TypedArray destination cannot be mutated."); + } + if (source === destination) { + throw ngMinErr('cpi', "Can't copy! Source and destination are identical."); + } + + // Empty the destination object + if (isArray(destination)) { + destination.length = 0; + } else { + forEach(destination, function(value, key) { + if (key !== '$$hashKey') { + delete destination[key]; + } + }); + } + + stackSource.push(source); + stackDest.push(destination); + return copyRecurse(source, destination); + } + + return copyElement(source); + + function copyRecurse(source, destination) { + var h = destination.$$hashKey; + var key; + if (isArray(source)) { + for (var i = 0, ii = source.length; i < ii; i++) { + destination.push(copyElement(source[i])); + } + } else if (isBlankObject(source)) { + // createMap() fast path --- Safe to avoid hasOwnProperty check because prototype chain is empty + for (key in source) { + destination[key] = copyElement(source[key]); + } + } else if (source && typeof source.hasOwnProperty === 'function') { + // Slow path, which must rely on hasOwnProperty + for (key in source) { + if (source.hasOwnProperty(key)) { + destination[key] = copyElement(source[key]); + } + } + } else { + // Slowest path --- hasOwnProperty can't be called as a method + for (key in source) { + if (hasOwnProperty.call(source, key)) { + destination[key] = copyElement(source[key]); + } + } + } + setHashKey(destination, h); + return destination; + } + + function copyElement(source) { + // Simple values + if (!isObject(source)) { + return source; + } + + // Already copied values + var index = stackSource.indexOf(source); + if (index !== -1) { + return stackDest[index]; + } + + if (isWindow(source) || isScope(source)) { + throw ngMinErr('cpws', + "Can't copy! Making copies of Window or Scope instances is not supported."); + } + + var needsRecurse = false; + var destination = copyType(source); + + if (destination === undefined) { + destination = isArray(source) ? [] : Object.create(getPrototypeOf(source)); + needsRecurse = true; + } + + stackSource.push(source); + stackDest.push(destination); + + return needsRecurse + ? copyRecurse(source, destination) + : destination; + } + + function copyType(source) { + switch (toString.call(source)) { + case '[object Int8Array]': + case '[object Int16Array]': + case '[object Int32Array]': + case '[object Float32Array]': + case '[object Float64Array]': + case '[object Uint8Array]': + case '[object Uint8ClampedArray]': + case '[object Uint16Array]': + case '[object Uint32Array]': + return new source.constructor(copyElement(source.buffer)); + + case '[object ArrayBuffer]': + //Support: IE10 + if (!source.slice) { + var copied = new ArrayBuffer(source.byteLength); + new Uint8Array(copied).set(new Uint8Array(source)); + return copied; + } + return source.slice(0); + + case '[object Boolean]': + case '[object Number]': + case '[object String]': + case '[object Date]': + return new source.constructor(source.valueOf()); + + case '[object RegExp]': + var re = new RegExp(source.source, source.toString().match(/[^\/]*$/)[0]); + re.lastIndex = source.lastIndex; + return re; + + case '[object Blob]': + return new source.constructor([source], {type: source.type}); + } + + if (isFunction(source.cloneNode)) { + return source.cloneNode(true); + } + } +} + +/** + * Creates a shallow copy of an object, an array or a primitive. + * + * Assumes that there are no proto properties for objects. + */ +function shallowCopy(src, dst) { + if (isArray(src)) { + dst = dst || []; + + for (var i = 0, ii = src.length; i < ii; i++) { + dst[i] = src[i]; + } + } else if (isObject(src)) { + dst = dst || {}; + + for (var key in src) { + if (!(key.charAt(0) === '$' && key.charAt(1) === '$')) { + dst[key] = src[key]; + } + } + } + + return dst || src; +} + + +/** + * @ngdoc function + * @name angular.equals + * @module ng + * @kind function + * + * @description + * Determines if two objects or two values are equivalent. Supports value types, regular + * expressions, arrays and objects. + * + * Two objects or values are considered equivalent if at least one of the following is true: + * + * * Both objects or values pass `===` comparison. + * * Both objects or values are of the same type and all of their properties are equal by + * comparing them with `angular.equals`. + * * Both values are NaN. (In JavaScript, NaN == NaN => false. But we consider two NaN as equal) + * * Both values represent the same regular expression (In JavaScript, + * /abc/ == /abc/ => false. But we consider two regular expressions as equal when their textual + * representation matches). + * + * During a property comparison, properties of `function` type and properties with names + * that begin with `$` are ignored. + * + * Scope and DOMWindow objects are being compared only by identify (`===`). + * + * @param {*} o1 Object or value to compare. + * @param {*} o2 Object or value to compare. + * @returns {boolean} True if arguments are equal. + */ +function equals(o1, o2) { + if (o1 === o2) return true; + if (o1 === null || o2 === null) return false; + if (o1 !== o1 && o2 !== o2) return true; // NaN === NaN + var t1 = typeof o1, t2 = typeof o2, length, key, keySet; + if (t1 == t2 && t1 == 'object') { + if (isArray(o1)) { + if (!isArray(o2)) return false; + if ((length = o1.length) == o2.length) { + for (key = 0; key < length; key++) { + if (!equals(o1[key], o2[key])) return false; + } + return true; + } + } else if (isDate(o1)) { + if (!isDate(o2)) return false; + return equals(o1.getTime(), o2.getTime()); + } else if (isRegExp(o1)) { + if (!isRegExp(o2)) return false; + return o1.toString() == o2.toString(); + } else { + if (isScope(o1) || isScope(o2) || isWindow(o1) || isWindow(o2) || + isArray(o2) || isDate(o2) || isRegExp(o2)) return false; + keySet = createMap(); + for (key in o1) { + if (key.charAt(0) === '$' || isFunction(o1[key])) continue; + if (!equals(o1[key], o2[key])) return false; + keySet[key] = true; + } + for (key in o2) { + if (!(key in keySet) && + key.charAt(0) !== '$' && + isDefined(o2[key]) && + !isFunction(o2[key])) return false; + } + return true; + } + } + return false; +} + +var csp = function() { + if (!isDefined(csp.rules)) { + + + var ngCspElement = (document.querySelector('[ng-csp]') || + document.querySelector('[data-ng-csp]')); + + if (ngCspElement) { + var ngCspAttribute = ngCspElement.getAttribute('ng-csp') || + ngCspElement.getAttribute('data-ng-csp'); + csp.rules = { + noUnsafeEval: !ngCspAttribute || (ngCspAttribute.indexOf('no-unsafe-eval') !== -1), + noInlineStyle: !ngCspAttribute || (ngCspAttribute.indexOf('no-inline-style') !== -1) + }; + } else { + csp.rules = { + noUnsafeEval: noUnsafeEval(), + noInlineStyle: false + }; + } + } + + return csp.rules; + + function noUnsafeEval() { + try { + /* jshint -W031, -W054 */ + new Function(''); + /* jshint +W031, +W054 */ + return false; + } catch (e) { + return true; + } + } +}; + +/** + * @ngdoc directive + * @module ng + * @name ngJq + * + * @element ANY + * @param {string=} ngJq the name of the library available under `window` + * to be used for angular.element + * @description + * Use this directive to force the angular.element library. This should be + * used to force either jqLite by leaving ng-jq blank or setting the name of + * the jquery variable under window (eg. jQuery). + * + * Since angular looks for this directive when it is loaded (doesn't wait for the + * DOMContentLoaded event), it must be placed on an element that comes before the script + * which loads angular. Also, only the first instance of `ng-jq` will be used and all + * others ignored. + * + * @example + * This example shows how to force jqLite using the `ngJq` directive to the `html` tag. + ```html + + + ... + ... + + ``` + * @example + * This example shows how to use a jQuery based library of a different name. + * The library name must be available at the top most 'window'. + ```html + + + ... + ... + + ``` + */ +var jq = function() { + if (isDefined(jq.name_)) return jq.name_; + var el; + var i, ii = ngAttrPrefixes.length, prefix, name; + for (i = 0; i < ii; ++i) { + prefix = ngAttrPrefixes[i]; + if (el = document.querySelector('[' + prefix.replace(':', '\\:') + 'jq]')) { + name = el.getAttribute(prefix + 'jq'); + break; + } + } + + return (jq.name_ = name); +}; + +function concat(array1, array2, index) { + return array1.concat(slice.call(array2, index)); +} + +function sliceArgs(args, startIndex) { + return slice.call(args, startIndex || 0); +} + + +/* jshint -W101 */ +/** + * @ngdoc function + * @name angular.bind + * @module ng + * @kind function + * + * @description + * Returns a function which calls function `fn` bound to `self` (`self` becomes the `this` for + * `fn`). You can supply optional `args` that are prebound to the function. This feature is also + * known as [partial application](http://en.wikipedia.org/wiki/Partial_application), as + * distinguished from [function currying](http://en.wikipedia.org/wiki/Currying#Contrast_with_partial_function_application). + * + * @param {Object} self Context which `fn` should be evaluated in. + * @param {function()} fn Function to be bound. + * @param {...*} args Optional arguments to be prebound to the `fn` function call. + * @returns {function()} Function that wraps the `fn` with all the specified bindings. + */ +/* jshint +W101 */ +function bind(self, fn) { + var curryArgs = arguments.length > 2 ? sliceArgs(arguments, 2) : []; + if (isFunction(fn) && !(fn instanceof RegExp)) { + return curryArgs.length + ? function() { + return arguments.length + ? fn.apply(self, concat(curryArgs, arguments, 0)) + : fn.apply(self, curryArgs); + } + : function() { + return arguments.length + ? fn.apply(self, arguments) + : fn.call(self); + }; + } else { + // in IE, native methods are not functions so they cannot be bound (note: they don't need to be) + return fn; + } +} + + +function toJsonReplacer(key, value) { + var val = value; + + if (typeof key === 'string' && key.charAt(0) === '$' && key.charAt(1) === '$') { + val = undefined; + } else if (isWindow(value)) { + val = '$WINDOW'; + } else if (value && document === value) { + val = '$DOCUMENT'; + } else if (isScope(value)) { + val = '$SCOPE'; + } + + return val; +} + + +/** + * @ngdoc function + * @name angular.toJson + * @module ng + * @kind function + * + * @description + * Serializes input into a JSON-formatted string. Properties with leading $$ characters will be + * stripped since angular uses this notation internally. + * + * @param {Object|Array|Date|string|number} obj Input to be serialized into JSON. + * @param {boolean|number} [pretty=2] If set to true, the JSON output will contain newlines and whitespace. + * If set to an integer, the JSON output will contain that many spaces per indentation. + * @returns {string|undefined} JSON-ified string representing `obj`. + */ +function toJson(obj, pretty) { + if (isUndefined(obj)) return undefined; + if (!isNumber(pretty)) { + pretty = pretty ? 2 : null; + } + return JSON.stringify(obj, toJsonReplacer, pretty); +} + + +/** + * @ngdoc function + * @name angular.fromJson + * @module ng + * @kind function + * + * @description + * Deserializes a JSON string. + * + * @param {string} json JSON string to deserialize. + * @returns {Object|Array|string|number} Deserialized JSON string. + */ +function fromJson(json) { + return isString(json) + ? JSON.parse(json) + : json; +} + + +var ALL_COLONS = /:/g; +function timezoneToOffset(timezone, fallback) { + // IE/Edge do not "understand" colon (`:`) in timezone + timezone = timezone.replace(ALL_COLONS, ''); + var requestedTimezoneOffset = Date.parse('Jan 01, 1970 00:00:00 ' + timezone) / 60000; + return isNaN(requestedTimezoneOffset) ? fallback : requestedTimezoneOffset; +} + + +function addDateMinutes(date, minutes) { + date = new Date(date.getTime()); + date.setMinutes(date.getMinutes() + minutes); + return date; +} + + +function convertTimezoneToLocal(date, timezone, reverse) { + reverse = reverse ? -1 : 1; + var dateTimezoneOffset = date.getTimezoneOffset(); + var timezoneOffset = timezoneToOffset(timezone, dateTimezoneOffset); + return addDateMinutes(date, reverse * (timezoneOffset - dateTimezoneOffset)); +} + + +/** + * @returns {string} Returns the string representation of the element. + */ +function startingTag(element) { + element = jqLite(element).clone(); + try { + // turns out IE does not let you set .html() on elements which + // are not allowed to have children. So we just ignore it. + element.empty(); + } catch (e) {} + var elemHtml = jqLite('
').append(element).html(); + try { + return element[0].nodeType === NODE_TYPE_TEXT ? lowercase(elemHtml) : + elemHtml. + match(/^(<[^>]+>)/)[1]. + replace(/^<([\w\-]+)/, function(match, nodeName) {return '<' + lowercase(nodeName);}); + } catch (e) { + return lowercase(elemHtml); + } + +} + + +///////////////////////////////////////////////// + +/** + * Tries to decode the URI component without throwing an exception. + * + * @private + * @param str value potential URI component to check. + * @returns {boolean} True if `value` can be decoded + * with the decodeURIComponent function. + */ +function tryDecodeURIComponent(value) { + try { + return decodeURIComponent(value); + } catch (e) { + // Ignore any invalid uri component + } +} + + +/** + * Parses an escaped url query string into key-value pairs. + * @returns {Object.} + */ +function parseKeyValue(/**string*/keyValue) { + var obj = {}; + forEach((keyValue || "").split('&'), function(keyValue) { + var splitPoint, key, val; + if (keyValue) { + key = keyValue = keyValue.replace(/\+/g,'%20'); + splitPoint = keyValue.indexOf('='); + if (splitPoint !== -1) { + key = keyValue.substring(0, splitPoint); + val = keyValue.substring(splitPoint + 1); + } + key = tryDecodeURIComponent(key); + if (isDefined(key)) { + val = isDefined(val) ? tryDecodeURIComponent(val) : true; + if (!hasOwnProperty.call(obj, key)) { + obj[key] = val; + } else if (isArray(obj[key])) { + obj[key].push(val); + } else { + obj[key] = [obj[key],val]; + } + } + } + }); + return obj; +} + +function toKeyValue(obj) { + var parts = []; + forEach(obj, function(value, key) { + if (isArray(value)) { + forEach(value, function(arrayValue) { + parts.push(encodeUriQuery(key, true) + + (arrayValue === true ? '' : '=' + encodeUriQuery(arrayValue, true))); + }); + } else { + parts.push(encodeUriQuery(key, true) + + (value === true ? '' : '=' + encodeUriQuery(value, true))); + } + }); + return parts.length ? parts.join('&') : ''; +} + + +/** + * We need our custom method because encodeURIComponent is too aggressive and doesn't follow + * http://www.ietf.org/rfc/rfc3986.txt with regards to the character set (pchar) allowed in path + * segments: + * segment = *pchar + * pchar = unreserved / pct-encoded / sub-delims / ":" / "@" + * pct-encoded = "%" HEXDIG HEXDIG + * unreserved = ALPHA / DIGIT / "-" / "." / "_" / "~" + * sub-delims = "!" / "$" / "&" / "'" / "(" / ")" + * / "*" / "+" / "," / ";" / "=" + */ +function encodeUriSegment(val) { + return encodeUriQuery(val, true). + replace(/%26/gi, '&'). + replace(/%3D/gi, '='). + replace(/%2B/gi, '+'); +} + + +/** + * This method is intended for encoding *key* or *value* parts of query component. We need a custom + * method because encodeURIComponent is too aggressive and encodes stuff that doesn't have to be + * encoded per http://tools.ietf.org/html/rfc3986: + * query = *( pchar / "/" / "?" ) + * pchar = unreserved / pct-encoded / sub-delims / ":" / "@" + * unreserved = ALPHA / DIGIT / "-" / "." / "_" / "~" + * pct-encoded = "%" HEXDIG HEXDIG + * sub-delims = "!" / "$" / "&" / "'" / "(" / ")" + * / "*" / "+" / "," / ";" / "=" + */ +function encodeUriQuery(val, pctEncodeSpaces) { + return encodeURIComponent(val). + replace(/%40/gi, '@'). + replace(/%3A/gi, ':'). + replace(/%24/g, '$'). + replace(/%2C/gi, ','). + replace(/%3B/gi, ';'). + replace(/%20/g, (pctEncodeSpaces ? '%20' : '+')); +} + +var ngAttrPrefixes = ['ng-', 'data-ng-', 'ng:', 'x-ng-']; + +function getNgAttribute(element, ngAttr) { + var attr, i, ii = ngAttrPrefixes.length; + for (i = 0; i < ii; ++i) { + attr = ngAttrPrefixes[i] + ngAttr; + if (isString(attr = element.getAttribute(attr))) { + return attr; + } + } + return null; +} + +/** + * @ngdoc directive + * @name ngApp + * @module ng + * + * @element ANY + * @param {angular.Module} ngApp an optional application + * {@link angular.module module} name to load. + * @param {boolean=} ngStrictDi if this attribute is present on the app element, the injector will be + * created in "strict-di" mode. This means that the application will fail to invoke functions which + * do not use explicit function annotation (and are thus unsuitable for minification), as described + * in {@link guide/di the Dependency Injection guide}, and useful debugging info will assist in + * tracking down the root of these bugs. + * + * @description + * + * Use this directive to **auto-bootstrap** an AngularJS application. The `ngApp` directive + * designates the **root element** of the application and is typically placed near the root element + * of the page - e.g. on the `` or `` tags. + * + * There are a few things to keep in mind when using `ngApp`: + * - only one AngularJS application can be auto-bootstrapped per HTML document. The first `ngApp` + * found in the document will be used to define the root element to auto-bootstrap as an + * application. To run multiple applications in an HTML document you must manually bootstrap them using + * {@link angular.bootstrap} instead. + * - AngularJS applications cannot be nested within each other. + * - Do not use a directive that uses {@link ng.$compile#transclusion transclusion} on the same element as `ngApp`. + * This includes directives such as {@link ng.ngIf `ngIf`}, {@link ng.ngInclude `ngInclude`} and + * {@link ngRoute.ngView `ngView`}. + * Doing this misplaces the app {@link ng.$rootElement `$rootElement`} and the app's {@link auto.$injector injector}, + * causing animations to stop working and making the injector inaccessible from outside the app. + * + * You can specify an **AngularJS module** to be used as the root module for the application. This + * module will be loaded into the {@link auto.$injector} when the application is bootstrapped. It + * should contain the application code needed or have dependencies on other modules that will + * contain the code. See {@link angular.module} for more information. + * + * In the example below if the `ngApp` directive were not placed on the `html` element then the + * document would not be compiled, the `AppController` would not be instantiated and the `{{ a+b }}` + * would not be resolved to `3`. + * + * `ngApp` is the easiest, and most common way to bootstrap an application. + * + + +
+ I can add: {{a}} + {{b}} = {{ a+b }} +
+
+ + angular.module('ngAppDemo', []).controller('ngAppDemoController', function($scope) { + $scope.a = 1; + $scope.b = 2; + }); + +
+ * + * Using `ngStrictDi`, you would see something like this: + * + + +
+
+ I can add: {{a}} + {{b}} = {{ a+b }} + +

This renders because the controller does not fail to + instantiate, by using explicit annotation style (see + script.js for details) +

+
+ +
+ Name:
+ Hello, {{name}}! + +

This renders because the controller does not fail to + instantiate, by using explicit annotation style + (see script.js for details) +

+
+ +
+ I can add: {{a}} + {{b}} = {{ a+b }} + +

The controller could not be instantiated, due to relying + on automatic function annotations (which are disabled in + strict mode). As such, the content of this section is not + interpolated, and there should be an error in your web console. +

+
+
+
+ + angular.module('ngAppStrictDemo', []) + // BadController will fail to instantiate, due to relying on automatic function annotation, + // rather than an explicit annotation + .controller('BadController', function($scope) { + $scope.a = 1; + $scope.b = 2; + }) + // Unlike BadController, GoodController1 and GoodController2 will not fail to be instantiated, + // due to using explicit annotations using the array style and $inject property, respectively. + .controller('GoodController1', ['$scope', function($scope) { + $scope.a = 1; + $scope.b = 2; + }]) + .controller('GoodController2', GoodController2); + function GoodController2($scope) { + $scope.name = "World"; + } + GoodController2.$inject = ['$scope']; + + + div[ng-controller] { + margin-bottom: 1em; + -webkit-border-radius: 4px; + border-radius: 4px; + border: 1px solid; + padding: .5em; + } + div[ng-controller^=Good] { + border-color: #d6e9c6; + background-color: #dff0d8; + color: #3c763d; + } + div[ng-controller^=Bad] { + border-color: #ebccd1; + background-color: #f2dede; + color: #a94442; + margin-bottom: 0; + } + +
+ */ +function angularInit(element, bootstrap) { + var appElement, + module, + config = {}; + + // The element `element` has priority over any other element + forEach(ngAttrPrefixes, function(prefix) { + var name = prefix + 'app'; + + if (!appElement && element.hasAttribute && element.hasAttribute(name)) { + appElement = element; + module = element.getAttribute(name); + } + }); + forEach(ngAttrPrefixes, function(prefix) { + var name = prefix + 'app'; + var candidate; + + if (!appElement && (candidate = element.querySelector('[' + name.replace(':', '\\:') + ']'))) { + appElement = candidate; + module = candidate.getAttribute(name); + } + }); + if (appElement) { + config.strictDi = getNgAttribute(appElement, "strict-di") !== null; + bootstrap(appElement, module ? [module] : [], config); + } +} + +/** + * @ngdoc function + * @name angular.bootstrap + * @module ng + * @description + * Use this function to manually start up angular application. + * + * For more information, see the {@link guide/bootstrap Bootstrap guide}. + * + * Angular will detect if it has been loaded into the browser more than once and only allow the + * first loaded script to be bootstrapped and will report a warning to the browser console for + * each of the subsequent scripts. This prevents strange results in applications, where otherwise + * multiple instances of Angular try to work on the DOM. + * + *
+ * **Note:** Protractor based end-to-end tests cannot use this function to bootstrap manually. + * They must use {@link ng.directive:ngApp ngApp}. + *
+ * + *
+ * **Note:** Do not bootstrap the app on an element with a directive that uses {@link ng.$compile#transclusion transclusion}, + * such as {@link ng.ngIf `ngIf`}, {@link ng.ngInclude `ngInclude`} and {@link ngRoute.ngView `ngView`}. + * Doing this misplaces the app {@link ng.$rootElement `$rootElement`} and the app's {@link auto.$injector injector}, + * causing animations to stop working and making the injector inaccessible from outside the app. + *
+ * + * ```html + * + * + * + *
+ * {{greeting}} + *
+ * + * + * + * + * + * ``` + * + * @param {DOMElement} element DOM element which is the root of angular application. + * @param {Array=} modules an array of modules to load into the application. + * Each item in the array should be the name of a predefined module or a (DI annotated) + * function that will be invoked by the injector as a `config` block. + * See: {@link angular.module modules} + * @param {Object=} config an object for defining configuration options for the application. The + * following keys are supported: + * + * * `strictDi` - disable automatic function annotation for the application. This is meant to + * assist in finding bugs which break minified code. Defaults to `false`. + * + * @returns {auto.$injector} Returns the newly created injector for this app. + */ +function bootstrap(element, modules, config) { + if (!isObject(config)) config = {}; + var defaultConfig = { + strictDi: false + }; + config = extend(defaultConfig, config); + var doBootstrap = function() { + element = jqLite(element); + + if (element.injector()) { + var tag = (element[0] === document) ? 'document' : startingTag(element); + //Encode angle brackets to prevent input from being sanitized to empty string #8683 + throw ngMinErr( + 'btstrpd', + "App Already Bootstrapped with this Element '{0}'", + tag.replace(//,'>')); + } + + modules = modules || []; + modules.unshift(['$provide', function($provide) { + $provide.value('$rootElement', element); + }]); + + if (config.debugInfoEnabled) { + // Pushing so that this overrides `debugInfoEnabled` setting defined in user's `modules`. + modules.push(['$compileProvider', function($compileProvider) { + $compileProvider.debugInfoEnabled(true); + }]); + } + + modules.unshift('ng'); + var injector = createInjector(modules, config.strictDi); + injector.invoke(['$rootScope', '$rootElement', '$compile', '$injector', + function bootstrapApply(scope, element, compile, injector) { + scope.$apply(function() { + element.data('$injector', injector); + compile(element)(scope); + }); + }] + ); + return injector; + }; + + var NG_ENABLE_DEBUG_INFO = /^NG_ENABLE_DEBUG_INFO!/; + var NG_DEFER_BOOTSTRAP = /^NG_DEFER_BOOTSTRAP!/; + + if (window && NG_ENABLE_DEBUG_INFO.test(window.name)) { + config.debugInfoEnabled = true; + window.name = window.name.replace(NG_ENABLE_DEBUG_INFO, ''); + } + + if (window && !NG_DEFER_BOOTSTRAP.test(window.name)) { + return doBootstrap(); + } + + window.name = window.name.replace(NG_DEFER_BOOTSTRAP, ''); + angular.resumeBootstrap = function(extraModules) { + forEach(extraModules, function(module) { + modules.push(module); + }); + return doBootstrap(); + }; + + if (isFunction(angular.resumeDeferredBootstrap)) { + angular.resumeDeferredBootstrap(); + } +} + +/** + * @ngdoc function + * @name angular.reloadWithDebugInfo + * @module ng + * @description + * Use this function to reload the current application with debug information turned on. + * This takes precedence over a call to `$compileProvider.debugInfoEnabled(false)`. + * + * See {@link ng.$compileProvider#debugInfoEnabled} for more. + */ +function reloadWithDebugInfo() { + window.name = 'NG_ENABLE_DEBUG_INFO!' + window.name; + window.location.reload(); +} + +/** + * @name angular.getTestability + * @module ng + * @description + * Get the testability service for the instance of Angular on the given + * element. + * @param {DOMElement} element DOM element which is the root of angular application. + */ +function getTestability(rootElement) { + var injector = angular.element(rootElement).injector(); + if (!injector) { + throw ngMinErr('test', + 'no injector found for element argument to getTestability'); + } + return injector.get('$$testability'); +} + +var SNAKE_CASE_REGEXP = /[A-Z]/g; +function snake_case(name, separator) { + separator = separator || '_'; + return name.replace(SNAKE_CASE_REGEXP, function(letter, pos) { + return (pos ? separator : '') + letter.toLowerCase(); + }); +} + +var bindJQueryFired = false; +function bindJQuery() { + var originalCleanData; + + if (bindJQueryFired) { + return; + } + + // bind to jQuery if present; + var jqName = jq(); + jQuery = isUndefined(jqName) ? window.jQuery : // use jQuery (if present) + !jqName ? undefined : // use jqLite + window[jqName]; // use jQuery specified by `ngJq` + + // Use jQuery if it exists with proper functionality, otherwise default to us. + // Angular 1.2+ requires jQuery 1.7+ for on()/off() support. + // Angular 1.3+ technically requires at least jQuery 2.1+ but it may work with older + // versions. It will not work for sure with jQuery <1.7, though. + if (jQuery && jQuery.fn.on) { + jqLite = jQuery; + extend(jQuery.fn, { + scope: JQLitePrototype.scope, + isolateScope: JQLitePrototype.isolateScope, + controller: JQLitePrototype.controller, + injector: JQLitePrototype.injector, + inheritedData: JQLitePrototype.inheritedData + }); + + // All nodes removed from the DOM via various jQuery APIs like .remove() + // are passed through jQuery.cleanData. Monkey-patch this method to fire + // the $destroy event on all removed nodes. + originalCleanData = jQuery.cleanData; + jQuery.cleanData = function(elems) { + var events; + for (var i = 0, elem; (elem = elems[i]) != null; i++) { + events = jQuery._data(elem, "events"); + if (events && events.$destroy) { + jQuery(elem).triggerHandler('$destroy'); + } + } + originalCleanData(elems); + }; + } else { + jqLite = JQLite; + } + + angular.element = jqLite; + + // Prevent double-proxying. + bindJQueryFired = true; +} + +/** + * throw error if the argument is falsy. + */ +function assertArg(arg, name, reason) { + if (!arg) { + throw ngMinErr('areq', "Argument '{0}' is {1}", (name || '?'), (reason || "required")); + } + return arg; +} + +function assertArgFn(arg, name, acceptArrayAnnotation) { + if (acceptArrayAnnotation && isArray(arg)) { + arg = arg[arg.length - 1]; + } + + assertArg(isFunction(arg), name, 'not a function, got ' + + (arg && typeof arg === 'object' ? arg.constructor.name || 'Object' : typeof arg)); + return arg; +} + +/** + * throw error if the name given is hasOwnProperty + * @param {String} name the name to test + * @param {String} context the context in which the name is used, such as module or directive + */ +function assertNotHasOwnProperty(name, context) { + if (name === 'hasOwnProperty') { + throw ngMinErr('badname', "hasOwnProperty is not a valid {0} name", context); + } +} + +/** + * Return the value accessible from the object by path. Any undefined traversals are ignored + * @param {Object} obj starting object + * @param {String} path path to traverse + * @param {boolean} [bindFnToScope=true] + * @returns {Object} value as accessible by path + */ +//TODO(misko): this function needs to be removed +function getter(obj, path, bindFnToScope) { + if (!path) return obj; + var keys = path.split('.'); + var key; + var lastInstance = obj; + var len = keys.length; + + for (var i = 0; i < len; i++) { + key = keys[i]; + if (obj) { + obj = (lastInstance = obj)[key]; + } + } + if (!bindFnToScope && isFunction(obj)) { + return bind(lastInstance, obj); + } + return obj; +} + +/** + * Return the DOM siblings between the first and last node in the given array. + * @param {Array} array like object + * @returns {Array} the inputted object or a jqLite collection containing the nodes + */ +function getBlockNodes(nodes) { + // TODO(perf): update `nodes` instead of creating a new object? + var node = nodes[0]; + var endNode = nodes[nodes.length - 1]; + var blockNodes; + + for (var i = 1; node !== endNode && (node = node.nextSibling); i++) { + if (blockNodes || nodes[i] !== node) { + if (!blockNodes) { + blockNodes = jqLite(slice.call(nodes, 0, i)); + } + blockNodes.push(node); + } + } + + return blockNodes || nodes; +} + + +/** + * Creates a new object without a prototype. This object is useful for lookup without having to + * guard against prototypically inherited properties via hasOwnProperty. + * + * Related micro-benchmarks: + * - http://jsperf.com/object-create2 + * - http://jsperf.com/proto-map-lookup/2 + * - http://jsperf.com/for-in-vs-object-keys2 + * + * @returns {Object} + */ +function createMap() { + return Object.create(null); +} + +var NODE_TYPE_ELEMENT = 1; +var NODE_TYPE_ATTRIBUTE = 2; +var NODE_TYPE_TEXT = 3; +var NODE_TYPE_COMMENT = 8; +var NODE_TYPE_DOCUMENT = 9; +var NODE_TYPE_DOCUMENT_FRAGMENT = 11; + +/** + * @ngdoc type + * @name angular.Module + * @module ng + * @description + * + * Interface for configuring angular {@link angular.module modules}. + */ + +function setupModuleLoader(window) { + + var $injectorMinErr = minErr('$injector'); + var ngMinErr = minErr('ng'); + + function ensure(obj, name, factory) { + return obj[name] || (obj[name] = factory()); + } + + var angular = ensure(window, 'angular', Object); + + // We need to expose `angular.$$minErr` to modules such as `ngResource` that reference it during bootstrap + angular.$$minErr = angular.$$minErr || minErr; + + return ensure(angular, 'module', function() { + /** @type {Object.} */ + var modules = {}; + + /** + * @ngdoc function + * @name angular.module + * @module ng + * @description + * + * The `angular.module` is a global place for creating, registering and retrieving Angular + * modules. + * All modules (angular core or 3rd party) that should be available to an application must be + * registered using this mechanism. + * + * Passing one argument retrieves an existing {@link angular.Module}, + * whereas passing more than one argument creates a new {@link angular.Module} + * + * + * # Module + * + * A module is a collection of services, directives, controllers, filters, and configuration information. + * `angular.module` is used to configure the {@link auto.$injector $injector}. + * + * ```js + * // Create a new module + * var myModule = angular.module('myModule', []); + * + * // register a new service + * myModule.value('appName', 'MyCoolApp'); + * + * // configure existing services inside initialization blocks. + * myModule.config(['$locationProvider', function($locationProvider) { + * // Configure existing providers + * $locationProvider.hashPrefix('!'); + * }]); + * ``` + * + * Then you can create an injector and load your modules like this: + * + * ```js + * var injector = angular.injector(['ng', 'myModule']) + * ``` + * + * However it's more likely that you'll just use + * {@link ng.directive:ngApp ngApp} or + * {@link angular.bootstrap} to simplify this process for you. + * + * @param {!string} name The name of the module to create or retrieve. + * @param {!Array.=} requires If specified then new module is being created. If + * unspecified then the module is being retrieved for further configuration. + * @param {Function=} configFn Optional configuration function for the module. Same as + * {@link angular.Module#config Module#config()}. + * @returns {angular.Module} new module with the {@link angular.Module} api. + */ + return function module(name, requires, configFn) { + var assertNotHasOwnProperty = function(name, context) { + if (name === 'hasOwnProperty') { + throw ngMinErr('badname', 'hasOwnProperty is not a valid {0} name', context); + } + }; + + assertNotHasOwnProperty(name, 'module'); + if (requires && modules.hasOwnProperty(name)) { + modules[name] = null; + } + return ensure(modules, name, function() { + if (!requires) { + throw $injectorMinErr('nomod', "Module '{0}' is not available! You either misspelled " + + "the module name or forgot to load it. If registering a module ensure that you " + + "specify the dependencies as the second argument.", name); + } + + /** @type {!Array.>} */ + var invokeQueue = []; + + /** @type {!Array.} */ + var configBlocks = []; + + /** @type {!Array.} */ + var runBlocks = []; + + var config = invokeLater('$injector', 'invoke', 'push', configBlocks); + + /** @type {angular.Module} */ + var moduleInstance = { + // Private state + _invokeQueue: invokeQueue, + _configBlocks: configBlocks, + _runBlocks: runBlocks, + + /** + * @ngdoc property + * @name angular.Module#requires + * @module ng + * + * @description + * Holds the list of modules which the injector will load before the current module is + * loaded. + */ + requires: requires, + + /** + * @ngdoc property + * @name angular.Module#name + * @module ng + * + * @description + * Name of the module. + */ + name: name, + + + /** + * @ngdoc method + * @name angular.Module#provider + * @module ng + * @param {string} name service name + * @param {Function} providerType Construction function for creating new instance of the + * service. + * @description + * See {@link auto.$provide#provider $provide.provider()}. + */ + provider: invokeLaterAndSetModuleName('$provide', 'provider'), + + /** + * @ngdoc method + * @name angular.Module#factory + * @module ng + * @param {string} name service name + * @param {Function} providerFunction Function for creating new instance of the service. + * @description + * See {@link auto.$provide#factory $provide.factory()}. + */ + factory: invokeLaterAndSetModuleName('$provide', 'factory'), + + /** + * @ngdoc method + * @name angular.Module#service + * @module ng + * @param {string} name service name + * @param {Function} constructor A constructor function that will be instantiated. + * @description + * See {@link auto.$provide#service $provide.service()}. + */ + service: invokeLaterAndSetModuleName('$provide', 'service'), + + /** + * @ngdoc method + * @name angular.Module#value + * @module ng + * @param {string} name service name + * @param {*} object Service instance object. + * @description + * See {@link auto.$provide#value $provide.value()}. + */ + value: invokeLater('$provide', 'value'), + + /** + * @ngdoc method + * @name angular.Module#constant + * @module ng + * @param {string} name constant name + * @param {*} object Constant value. + * @description + * Because the constants are fixed, they get applied before other provide methods. + * See {@link auto.$provide#constant $provide.constant()}. + */ + constant: invokeLater('$provide', 'constant', 'unshift'), + + /** + * @ngdoc method + * @name angular.Module#decorator + * @module ng + * @param {string} The name of the service to decorate. + * @param {Function} This function will be invoked when the service needs to be + * instantiated and should return the decorated service instance. + * @description + * See {@link auto.$provide#decorator $provide.decorator()}. + */ + decorator: invokeLaterAndSetModuleName('$provide', 'decorator'), + + /** + * @ngdoc method + * @name angular.Module#animation + * @module ng + * @param {string} name animation name + * @param {Function} animationFactory Factory function for creating new instance of an + * animation. + * @description + * + * **NOTE**: animations take effect only if the **ngAnimate** module is loaded. + * + * + * Defines an animation hook that can be later used with + * {@link $animate $animate} service and directives that use this service. + * + * ```js + * module.animation('.animation-name', function($inject1, $inject2) { + * return { + * eventName : function(element, done) { + * //code to run the animation + * //once complete, then run done() + * return function cancellationFunction(element) { + * //code to cancel the animation + * } + * } + * } + * }) + * ``` + * + * See {@link ng.$animateProvider#register $animateProvider.register()} and + * {@link ngAnimate ngAnimate module} for more information. + */ + animation: invokeLaterAndSetModuleName('$animateProvider', 'register'), + + /** + * @ngdoc method + * @name angular.Module#filter + * @module ng + * @param {string} name Filter name - this must be a valid angular expression identifier + * @param {Function} filterFactory Factory function for creating new instance of filter. + * @description + * See {@link ng.$filterProvider#register $filterProvider.register()}. + * + *
+ * **Note:** Filter names must be valid angular {@link expression} identifiers, such as `uppercase` or `orderBy`. + * Names with special characters, such as hyphens and dots, are not allowed. If you wish to namespace + * your filters, then you can use capitalization (`myappSubsectionFilterx`) or underscores + * (`myapp_subsection_filterx`). + *
+ */ + filter: invokeLaterAndSetModuleName('$filterProvider', 'register'), + + /** + * @ngdoc method + * @name angular.Module#controller + * @module ng + * @param {string|Object} name Controller name, or an object map of controllers where the + * keys are the names and the values are the constructors. + * @param {Function} constructor Controller constructor function. + * @description + * See {@link ng.$controllerProvider#register $controllerProvider.register()}. + */ + controller: invokeLaterAndSetModuleName('$controllerProvider', 'register'), + + /** + * @ngdoc method + * @name angular.Module#directive + * @module ng + * @param {string|Object} name Directive name, or an object map of directives where the + * keys are the names and the values are the factories. + * @param {Function} directiveFactory Factory function for creating new instance of + * directives. + * @description + * See {@link ng.$compileProvider#directive $compileProvider.directive()}. + */ + directive: invokeLaterAndSetModuleName('$compileProvider', 'directive'), + + /** + * @ngdoc method + * @name angular.Module#component + * @module ng + * @param {string} name Name of the component in camel-case (i.e. myComp which will match as my-comp) + * @param {Object} options Component definition object (a simplified + * {@link ng.$compile#directive-definition-object directive definition object}) + * + * @description + * See {@link ng.$compileProvider#component $compileProvider.component()}. + */ + component: invokeLaterAndSetModuleName('$compileProvider', 'component'), + + /** + * @ngdoc method + * @name angular.Module#config + * @module ng + * @param {Function} configFn Execute this function on module load. Useful for service + * configuration. + * @description + * Use this method to register work which needs to be performed on module loading. + * For more about how to configure services, see + * {@link providers#provider-recipe Provider Recipe}. + */ + config: config, + + /** + * @ngdoc method + * @name angular.Module#run + * @module ng + * @param {Function} initializationFn Execute this function after injector creation. + * Useful for application initialization. + * @description + * Use this method to register work which should be performed when the injector is done + * loading all modules. + */ + run: function(block) { + runBlocks.push(block); + return this; + } + }; + + if (configFn) { + config(configFn); + } + + return moduleInstance; + + /** + * @param {string} provider + * @param {string} method + * @param {String=} insertMethod + * @returns {angular.Module} + */ + function invokeLater(provider, method, insertMethod, queue) { + if (!queue) queue = invokeQueue; + return function() { + queue[insertMethod || 'push']([provider, method, arguments]); + return moduleInstance; + }; + } + + /** + * @param {string} provider + * @param {string} method + * @returns {angular.Module} + */ + function invokeLaterAndSetModuleName(provider, method) { + return function(recipeName, factoryFunction) { + if (factoryFunction && isFunction(factoryFunction)) factoryFunction.$$moduleName = name; + invokeQueue.push([provider, method, arguments]); + return moduleInstance; + }; + } + }); + }; + }); + +} + +/* global: toDebugString: true */ + +function serializeObject(obj) { + var seen = []; + + return JSON.stringify(obj, function(key, val) { + val = toJsonReplacer(key, val); + if (isObject(val)) { + + if (seen.indexOf(val) >= 0) return '...'; + + seen.push(val); + } + return val; + }); +} + +function toDebugString(obj) { + if (typeof obj === 'function') { + return obj.toString().replace(/ \{[\s\S]*$/, ''); + } else if (isUndefined(obj)) { + return 'undefined'; + } else if (typeof obj !== 'string') { + return serializeObject(obj); + } + return obj; +} + +/* global angularModule: true, + version: true, + + $CompileProvider, + + htmlAnchorDirective, + inputDirective, + inputDirective, + formDirective, + scriptDirective, + selectDirective, + styleDirective, + optionDirective, + ngBindDirective, + ngBindHtmlDirective, + ngBindTemplateDirective, + ngClassDirective, + ngClassEvenDirective, + ngClassOddDirective, + ngCloakDirective, + ngControllerDirective, + ngFormDirective, + ngHideDirective, + ngIfDirective, + ngIncludeDirective, + ngIncludeFillContentDirective, + ngInitDirective, + ngNonBindableDirective, + ngPluralizeDirective, + ngRepeatDirective, + ngShowDirective, + ngStyleDirective, + ngSwitchDirective, + ngSwitchWhenDirective, + ngSwitchDefaultDirective, + ngOptionsDirective, + ngTranscludeDirective, + ngModelDirective, + ngListDirective, + ngChangeDirective, + patternDirective, + patternDirective, + requiredDirective, + requiredDirective, + minlengthDirective, + minlengthDirective, + maxlengthDirective, + maxlengthDirective, + ngValueDirective, + ngModelOptionsDirective, + ngAttributeAliasDirectives, + ngEventDirectives, + + $AnchorScrollProvider, + $AnimateProvider, + $CoreAnimateCssProvider, + $$CoreAnimateJsProvider, + $$CoreAnimateQueueProvider, + $$AnimateRunnerFactoryProvider, + $$AnimateAsyncRunFactoryProvider, + $BrowserProvider, + $CacheFactoryProvider, + $ControllerProvider, + $DateProvider, + $DocumentProvider, + $ExceptionHandlerProvider, + $FilterProvider, + $$ForceReflowProvider, + $InterpolateProvider, + $IntervalProvider, + $$HashMapProvider, + $HttpProvider, + $HttpParamSerializerProvider, + $HttpParamSerializerJQLikeProvider, + $HttpBackendProvider, + $xhrFactoryProvider, + $LocationProvider, + $LogProvider, + $ParseProvider, + $RootScopeProvider, + $QProvider, + $$QProvider, + $$SanitizeUriProvider, + $SceProvider, + $SceDelegateProvider, + $SnifferProvider, + $TemplateCacheProvider, + $TemplateRequestProvider, + $$TestabilityProvider, + $TimeoutProvider, + $$RAFProvider, + $WindowProvider, + $$jqLiteProvider, + $$CookieReaderProvider +*/ + + +/** + * @ngdoc object + * @name angular.version + * @module ng + * @description + * An object that contains information about the current AngularJS version. + * + * This object has the following properties: + * + * - `full` – `{string}` – Full version string, such as "0.9.18". + * - `major` – `{number}` – Major version number, such as "0". + * - `minor` – `{number}` – Minor version number, such as "9". + * - `dot` – `{number}` – Dot version number, such as "18". + * - `codeName` – `{string}` – Code name of the release, such as "jiggling-armfat". + */ +var version = { + full: '1.5.3', // all of these placeholder strings will be replaced by grunt's + major: 1, // package task + minor: 5, + dot: 3, + codeName: 'diplohaplontic-meiosis' +}; + + +function publishExternalAPI(angular) { + extend(angular, { + 'bootstrap': bootstrap, + 'copy': copy, + 'extend': extend, + 'merge': merge, + 'equals': equals, + 'element': jqLite, + 'forEach': forEach, + 'injector': createInjector, + 'noop': noop, + 'bind': bind, + 'toJson': toJson, + 'fromJson': fromJson, + 'identity': identity, + 'isUndefined': isUndefined, + 'isDefined': isDefined, + 'isString': isString, + 'isFunction': isFunction, + 'isObject': isObject, + 'isNumber': isNumber, + 'isElement': isElement, + 'isArray': isArray, + 'version': version, + 'isDate': isDate, + 'lowercase': lowercase, + 'uppercase': uppercase, + 'callbacks': {counter: 0}, + 'getTestability': getTestability, + '$$minErr': minErr, + '$$csp': csp, + 'reloadWithDebugInfo': reloadWithDebugInfo + }); + + angularModule = setupModuleLoader(window); + + angularModule('ng', ['ngLocale'], ['$provide', + function ngModule($provide) { + // $$sanitizeUriProvider needs to be before $compileProvider as it is used by it. + $provide.provider({ + $$sanitizeUri: $$SanitizeUriProvider + }); + $provide.provider('$compile', $CompileProvider). + directive({ + a: htmlAnchorDirective, + input: inputDirective, + textarea: inputDirective, + form: formDirective, + script: scriptDirective, + select: selectDirective, + style: styleDirective, + option: optionDirective, + ngBind: ngBindDirective, + ngBindHtml: ngBindHtmlDirective, + ngBindTemplate: ngBindTemplateDirective, + ngClass: ngClassDirective, + ngClassEven: ngClassEvenDirective, + ngClassOdd: ngClassOddDirective, + ngCloak: ngCloakDirective, + ngController: ngControllerDirective, + ngForm: ngFormDirective, + ngHide: ngHideDirective, + ngIf: ngIfDirective, + ngInclude: ngIncludeDirective, + ngInit: ngInitDirective, + ngNonBindable: ngNonBindableDirective, + ngPluralize: ngPluralizeDirective, + ngRepeat: ngRepeatDirective, + ngShow: ngShowDirective, + ngStyle: ngStyleDirective, + ngSwitch: ngSwitchDirective, + ngSwitchWhen: ngSwitchWhenDirective, + ngSwitchDefault: ngSwitchDefaultDirective, + ngOptions: ngOptionsDirective, + ngTransclude: ngTranscludeDirective, + ngModel: ngModelDirective, + ngList: ngListDirective, + ngChange: ngChangeDirective, + pattern: patternDirective, + ngPattern: patternDirective, + required: requiredDirective, + ngRequired: requiredDirective, + minlength: minlengthDirective, + ngMinlength: minlengthDirective, + maxlength: maxlengthDirective, + ngMaxlength: maxlengthDirective, + ngValue: ngValueDirective, + ngModelOptions: ngModelOptionsDirective + }). + directive({ + ngInclude: ngIncludeFillContentDirective + }). + directive(ngAttributeAliasDirectives). + directive(ngEventDirectives); + $provide.provider({ + $anchorScroll: $AnchorScrollProvider, + $animate: $AnimateProvider, + $animateCss: $CoreAnimateCssProvider, + $$animateJs: $$CoreAnimateJsProvider, + $$animateQueue: $$CoreAnimateQueueProvider, + $$AnimateRunner: $$AnimateRunnerFactoryProvider, + $$animateAsyncRun: $$AnimateAsyncRunFactoryProvider, + $browser: $BrowserProvider, + $cacheFactory: $CacheFactoryProvider, + $controller: $ControllerProvider, + $document: $DocumentProvider, + $exceptionHandler: $ExceptionHandlerProvider, + $filter: $FilterProvider, + $$forceReflow: $$ForceReflowProvider, + $interpolate: $InterpolateProvider, + $interval: $IntervalProvider, + $http: $HttpProvider, + $httpParamSerializer: $HttpParamSerializerProvider, + $httpParamSerializerJQLike: $HttpParamSerializerJQLikeProvider, + $httpBackend: $HttpBackendProvider, + $xhrFactory: $xhrFactoryProvider, + $location: $LocationProvider, + $log: $LogProvider, + $parse: $ParseProvider, + $rootScope: $RootScopeProvider, + $q: $QProvider, + $$q: $$QProvider, + $sce: $SceProvider, + $sceDelegate: $SceDelegateProvider, + $sniffer: $SnifferProvider, + $templateCache: $TemplateCacheProvider, + $templateRequest: $TemplateRequestProvider, + $$testability: $$TestabilityProvider, + $timeout: $TimeoutProvider, + $window: $WindowProvider, + $$rAF: $$RAFProvider, + $$jqLite: $$jqLiteProvider, + $$HashMap: $$HashMapProvider, + $$cookieReader: $$CookieReaderProvider + }); + } + ]); +} + +/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * + * Any commits to this file should be reviewed with security in mind. * + * Changes to this file can potentially create security vulnerabilities. * + * An approval from 2 Core members with history of modifying * + * this file is required. * + * * + * Does the change somehow allow for arbitrary javascript to be executed? * + * Or allows for someone to change the prototype of built-in objects? * + * Or gives undesired access to variables likes document or window? * + * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ + +/* global JQLitePrototype: true, + addEventListenerFn: true, + removeEventListenerFn: true, + BOOLEAN_ATTR: true, + ALIASED_ATTR: true, +*/ + +////////////////////////////////// +//JQLite +////////////////////////////////// + +/** + * @ngdoc function + * @name angular.element + * @module ng + * @kind function + * + * @description + * Wraps a raw DOM element or HTML string as a [jQuery](http://jquery.com) element. + * + * If jQuery is available, `angular.element` is an alias for the + * [jQuery](http://api.jquery.com/jQuery/) function. If jQuery is not available, `angular.element` + * delegates to Angular's built-in subset of jQuery, called "jQuery lite" or **jqLite**. + * + * jqLite is a tiny, API-compatible subset of jQuery that allows + * Angular to manipulate the DOM in a cross-browser compatible way. jqLite implements only the most + * commonly needed functionality with the goal of having a very small footprint. + * + * To use `jQuery`, simply ensure it is loaded before the `angular.js` file. You can also use the + * {@link ngJq `ngJq`} directive to specify that jqlite should be used over jQuery, or to use a + * specific version of jQuery if multiple versions exist on the page. + * + *
**Note:** All element references in Angular are always wrapped with jQuery or + * jqLite (such as the element argument in a directive's compile / link function). They are never raw DOM references.
+ * + *
**Note:** Keep in mind that this function will not find elements + * by tag name / CSS selector. For lookups by tag name, try instead `angular.element(document).find(...)` + * or `$document.find()`, or use the standard DOM APIs, e.g. `document.querySelectorAll()`.
+ * + * ## Angular's jqLite + * jqLite provides only the following jQuery methods: + * + * - [`addClass()`](http://api.jquery.com/addClass/) + * - [`after()`](http://api.jquery.com/after/) + * - [`append()`](http://api.jquery.com/append/) + * - [`attr()`](http://api.jquery.com/attr/) - Does not support functions as parameters + * - [`bind()`](http://api.jquery.com/bind/) - Does not support namespaces, selectors or eventData + * - [`children()`](http://api.jquery.com/children/) - Does not support selectors + * - [`clone()`](http://api.jquery.com/clone/) + * - [`contents()`](http://api.jquery.com/contents/) + * - [`css()`](http://api.jquery.com/css/) - Only retrieves inline-styles, does not call `getComputedStyle()`. + * As a setter, does not convert numbers to strings or append 'px', and also does not have automatic property prefixing. + * - [`data()`](http://api.jquery.com/data/) + * - [`detach()`](http://api.jquery.com/detach/) + * - [`empty()`](http://api.jquery.com/empty/) + * - [`eq()`](http://api.jquery.com/eq/) + * - [`find()`](http://api.jquery.com/find/) - Limited to lookups by tag name + * - [`hasClass()`](http://api.jquery.com/hasClass/) + * - [`html()`](http://api.jquery.com/html/) + * - [`next()`](http://api.jquery.com/next/) - Does not support selectors + * - [`on()`](http://api.jquery.com/on/) - Does not support namespaces, selectors or eventData + * - [`off()`](http://api.jquery.com/off/) - Does not support namespaces, selectors or event object as parameter + * - [`one()`](http://api.jquery.com/one/) - Does not support namespaces or selectors + * - [`parent()`](http://api.jquery.com/parent/) - Does not support selectors + * - [`prepend()`](http://api.jquery.com/prepend/) + * - [`prop()`](http://api.jquery.com/prop/) + * - [`ready()`](http://api.jquery.com/ready/) + * - [`remove()`](http://api.jquery.com/remove/) + * - [`removeAttr()`](http://api.jquery.com/removeAttr/) + * - [`removeClass()`](http://api.jquery.com/removeClass/) + * - [`removeData()`](http://api.jquery.com/removeData/) + * - [`replaceWith()`](http://api.jquery.com/replaceWith/) + * - [`text()`](http://api.jquery.com/text/) + * - [`toggleClass()`](http://api.jquery.com/toggleClass/) + * - [`triggerHandler()`](http://api.jquery.com/triggerHandler/) - Passes a dummy event object to handlers. + * - [`unbind()`](http://api.jquery.com/unbind/) - Does not support namespaces or event object as parameter + * - [`val()`](http://api.jquery.com/val/) + * - [`wrap()`](http://api.jquery.com/wrap/) + * + * ## jQuery/jqLite Extras + * Angular also provides the following additional methods and events to both jQuery and jqLite: + * + * ### Events + * - `$destroy` - AngularJS intercepts all jqLite/jQuery's DOM destruction apis and fires this event + * on all DOM nodes being removed. This can be used to clean up any 3rd party bindings to the DOM + * element before it is removed. + * + * ### Methods + * - `controller(name)` - retrieves the controller of the current element or its parent. By default + * retrieves controller associated with the `ngController` directive. If `name` is provided as + * camelCase directive name, then the controller for this directive will be retrieved (e.g. + * `'ngModel'`). + * - `injector()` - retrieves the injector of the current element or its parent. + * - `scope()` - retrieves the {@link ng.$rootScope.Scope scope} of the current + * element or its parent. Requires {@link guide/production#disabling-debug-data Debug Data} to + * be enabled. + * - `isolateScope()` - retrieves an isolate {@link ng.$rootScope.Scope scope} if one is attached directly to the + * current element. This getter should be used only on elements that contain a directive which starts a new isolate + * scope. Calling `scope()` on this element always returns the original non-isolate scope. + * Requires {@link guide/production#disabling-debug-data Debug Data} to be enabled. + * - `inheritedData()` - same as `data()`, but walks up the DOM until a value is found or the top + * parent element is reached. + * + * @param {string|DOMElement} element HTML string or DOMElement to be wrapped into jQuery. + * @returns {Object} jQuery object. + */ + +JQLite.expando = 'ng339'; + +var jqCache = JQLite.cache = {}, + jqId = 1, + addEventListenerFn = function(element, type, fn) { + element.addEventListener(type, fn, false); + }, + removeEventListenerFn = function(element, type, fn) { + element.removeEventListener(type, fn, false); + }; + +/* + * !!! This is an undocumented "private" function !!! + */ +JQLite._data = function(node) { + //jQuery always returns an object on cache miss + return this.cache[node[this.expando]] || {}; +}; + +function jqNextId() { return ++jqId; } + + +var SPECIAL_CHARS_REGEXP = /([\:\-\_]+(.))/g; +var MOZ_HACK_REGEXP = /^moz([A-Z])/; +var MOUSE_EVENT_MAP= { mouseleave: "mouseout", mouseenter: "mouseover"}; +var jqLiteMinErr = minErr('jqLite'); + +/** + * Converts snake_case to camelCase. + * Also there is special case for Moz prefix starting with upper case letter. + * @param name Name to normalize + */ +function camelCase(name) { + return name. + replace(SPECIAL_CHARS_REGEXP, function(_, separator, letter, offset) { + return offset ? letter.toUpperCase() : letter; + }). + replace(MOZ_HACK_REGEXP, 'Moz$1'); +} + +var SINGLE_TAG_REGEXP = /^<([\w-]+)\s*\/?>(?:<\/\1>|)$/; +var HTML_REGEXP = /<|&#?\w+;/; +var TAG_NAME_REGEXP = /<([\w:-]+)/; +var XHTML_TAG_REGEXP = /<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:-]+)[^>]*)\/>/gi; + +var wrapMap = { + 'option': [1, ''], + + 'thead': [1, '', '
'], + 'col': [2, '', '
'], + 'tr': [2, '', '
'], + 'td': [3, '', '
'], + '_default': [0, "", ""] +}; + +wrapMap.optgroup = wrapMap.option; +wrapMap.tbody = wrapMap.tfoot = wrapMap.colgroup = wrapMap.caption = wrapMap.thead; +wrapMap.th = wrapMap.td; + + +function jqLiteIsTextNode(html) { + return !HTML_REGEXP.test(html); +} + +function jqLiteAcceptsData(node) { + // The window object can accept data but has no nodeType + // Otherwise we are only interested in elements (1) and documents (9) + var nodeType = node.nodeType; + return nodeType === NODE_TYPE_ELEMENT || !nodeType || nodeType === NODE_TYPE_DOCUMENT; +} + +function jqLiteHasData(node) { + for (var key in jqCache[node.ng339]) { + return true; + } + return false; +} + +function jqLiteCleanData(nodes) { + for (var i = 0, ii = nodes.length; i < ii; i++) { + jqLiteRemoveData(nodes[i]); + } +} + +function jqLiteBuildFragment(html, context) { + var tmp, tag, wrap, + fragment = context.createDocumentFragment(), + nodes = [], i; + + if (jqLiteIsTextNode(html)) { + // Convert non-html into a text node + nodes.push(context.createTextNode(html)); + } else { + // Convert html into DOM nodes + tmp = tmp || fragment.appendChild(context.createElement("div")); + tag = (TAG_NAME_REGEXP.exec(html) || ["", ""])[1].toLowerCase(); + wrap = wrapMap[tag] || wrapMap._default; + tmp.innerHTML = wrap[1] + html.replace(XHTML_TAG_REGEXP, "<$1>") + wrap[2]; + + // Descend through wrappers to the right content + i = wrap[0]; + while (i--) { + tmp = tmp.lastChild; + } + + nodes = concat(nodes, tmp.childNodes); + + tmp = fragment.firstChild; + tmp.textContent = ""; + } + + // Remove wrapper from fragment + fragment.textContent = ""; + fragment.innerHTML = ""; // Clear inner HTML + forEach(nodes, function(node) { + fragment.appendChild(node); + }); + + return fragment; +} + +function jqLiteParseHTML(html, context) { + context = context || document; + var parsed; + + if ((parsed = SINGLE_TAG_REGEXP.exec(html))) { + return [context.createElement(parsed[1])]; + } + + if ((parsed = jqLiteBuildFragment(html, context))) { + return parsed.childNodes; + } + + return []; +} + +function jqLiteWrapNode(node, wrapper) { + var parent = node.parentNode; + + if (parent) { + parent.replaceChild(wrapper, node); + } + + wrapper.appendChild(node); +} + + +// IE9-11 has no method "contains" in SVG element and in Node.prototype. Bug #10259. +var jqLiteContains = Node.prototype.contains || function(arg) { + // jshint bitwise: false + return !!(this.compareDocumentPosition(arg) & 16); + // jshint bitwise: true +}; + +///////////////////////////////////////////// +function JQLite(element) { + if (element instanceof JQLite) { + return element; + } + + var argIsString; + + if (isString(element)) { + element = trim(element); + argIsString = true; + } + if (!(this instanceof JQLite)) { + if (argIsString && element.charAt(0) != '<') { + throw jqLiteMinErr('nosel', 'Looking up elements via selectors is not supported by jqLite! See: http://docs.angularjs.org/api/angular.element'); + } + return new JQLite(element); + } + + if (argIsString) { + jqLiteAddNodes(this, jqLiteParseHTML(element)); + } else { + jqLiteAddNodes(this, element); + } +} + +function jqLiteClone(element) { + return element.cloneNode(true); +} + +function jqLiteDealoc(element, onlyDescendants) { + if (!onlyDescendants) jqLiteRemoveData(element); + + if (element.querySelectorAll) { + var descendants = element.querySelectorAll('*'); + for (var i = 0, l = descendants.length; i < l; i++) { + jqLiteRemoveData(descendants[i]); + } + } +} + +function jqLiteOff(element, type, fn, unsupported) { + if (isDefined(unsupported)) throw jqLiteMinErr('offargs', 'jqLite#off() does not support the `selector` argument'); + + var expandoStore = jqLiteExpandoStore(element); + var events = expandoStore && expandoStore.events; + var handle = expandoStore && expandoStore.handle; + + if (!handle) return; //no listeners registered + + if (!type) { + for (type in events) { + if (type !== '$destroy') { + removeEventListenerFn(element, type, handle); + } + delete events[type]; + } + } else { + + var removeHandler = function(type) { + var listenerFns = events[type]; + if (isDefined(fn)) { + arrayRemove(listenerFns || [], fn); + } + if (!(isDefined(fn) && listenerFns && listenerFns.length > 0)) { + removeEventListenerFn(element, type, handle); + delete events[type]; + } + }; + + forEach(type.split(' '), function(type) { + removeHandler(type); + if (MOUSE_EVENT_MAP[type]) { + removeHandler(MOUSE_EVENT_MAP[type]); + } + }); + } +} + +function jqLiteRemoveData(element, name) { + var expandoId = element.ng339; + var expandoStore = expandoId && jqCache[expandoId]; + + if (expandoStore) { + if (name) { + delete expandoStore.data[name]; + return; + } + + if (expandoStore.handle) { + if (expandoStore.events.$destroy) { + expandoStore.handle({}, '$destroy'); + } + jqLiteOff(element); + } + delete jqCache[expandoId]; + element.ng339 = undefined; // don't delete DOM expandos. IE and Chrome don't like it + } +} + + +function jqLiteExpandoStore(element, createIfNecessary) { + var expandoId = element.ng339, + expandoStore = expandoId && jqCache[expandoId]; + + if (createIfNecessary && !expandoStore) { + element.ng339 = expandoId = jqNextId(); + expandoStore = jqCache[expandoId] = {events: {}, data: {}, handle: undefined}; + } + + return expandoStore; +} + + +function jqLiteData(element, key, value) { + if (jqLiteAcceptsData(element)) { + + var isSimpleSetter = isDefined(value); + var isSimpleGetter = !isSimpleSetter && key && !isObject(key); + var massGetter = !key; + var expandoStore = jqLiteExpandoStore(element, !isSimpleGetter); + var data = expandoStore && expandoStore.data; + + if (isSimpleSetter) { // data('key', value) + data[key] = value; + } else { + if (massGetter) { // data() + return data; + } else { + if (isSimpleGetter) { // data('key') + // don't force creation of expandoStore if it doesn't exist yet + return data && data[key]; + } else { // mass-setter: data({key1: val1, key2: val2}) + extend(data, key); + } + } + } + } +} + +function jqLiteHasClass(element, selector) { + if (!element.getAttribute) return false; + return ((" " + (element.getAttribute('class') || '') + " ").replace(/[\n\t]/g, " "). + indexOf(" " + selector + " ") > -1); +} + +function jqLiteRemoveClass(element, cssClasses) { + if (cssClasses && element.setAttribute) { + forEach(cssClasses.split(' '), function(cssClass) { + element.setAttribute('class', trim( + (" " + (element.getAttribute('class') || '') + " ") + .replace(/[\n\t]/g, " ") + .replace(" " + trim(cssClass) + " ", " ")) + ); + }); + } +} + +function jqLiteAddClass(element, cssClasses) { + if (cssClasses && element.setAttribute) { + var existingClasses = (' ' + (element.getAttribute('class') || '') + ' ') + .replace(/[\n\t]/g, " "); + + forEach(cssClasses.split(' '), function(cssClass) { + cssClass = trim(cssClass); + if (existingClasses.indexOf(' ' + cssClass + ' ') === -1) { + existingClasses += cssClass + ' '; + } + }); + + element.setAttribute('class', trim(existingClasses)); + } +} + + +function jqLiteAddNodes(root, elements) { + // THIS CODE IS VERY HOT. Don't make changes without benchmarking. + + if (elements) { + + // if a Node (the most common case) + if (elements.nodeType) { + root[root.length++] = elements; + } else { + var length = elements.length; + + // if an Array or NodeList and not a Window + if (typeof length === 'number' && elements.window !== elements) { + if (length) { + for (var i = 0; i < length; i++) { + root[root.length++] = elements[i]; + } + } + } else { + root[root.length++] = elements; + } + } + } +} + + +function jqLiteController(element, name) { + return jqLiteInheritedData(element, '$' + (name || 'ngController') + 'Controller'); +} + +function jqLiteInheritedData(element, name, value) { + // if element is the document object work with the html element instead + // this makes $(document).scope() possible + if (element.nodeType == NODE_TYPE_DOCUMENT) { + element = element.documentElement; + } + var names = isArray(name) ? name : [name]; + + while (element) { + for (var i = 0, ii = names.length; i < ii; i++) { + if (isDefined(value = jqLite.data(element, names[i]))) return value; + } + + // If dealing with a document fragment node with a host element, and no parent, use the host + // element as the parent. This enables directives within a Shadow DOM or polyfilled Shadow DOM + // to lookup parent controllers. + element = element.parentNode || (element.nodeType === NODE_TYPE_DOCUMENT_FRAGMENT && element.host); + } +} + +function jqLiteEmpty(element) { + jqLiteDealoc(element, true); + while (element.firstChild) { + element.removeChild(element.firstChild); + } +} + +function jqLiteRemove(element, keepData) { + if (!keepData) jqLiteDealoc(element); + var parent = element.parentNode; + if (parent) parent.removeChild(element); +} + + +function jqLiteDocumentLoaded(action, win) { + win = win || window; + if (win.document.readyState === 'complete') { + // Force the action to be run async for consistent behavior + // from the action's point of view + // i.e. it will definitely not be in a $apply + win.setTimeout(action); + } else { + // No need to unbind this handler as load is only ever called once + jqLite(win).on('load', action); + } +} + +////////////////////////////////////////// +// Functions which are declared directly. +////////////////////////////////////////// +var JQLitePrototype = JQLite.prototype = { + ready: function(fn) { + var fired = false; + + function trigger() { + if (fired) return; + fired = true; + fn(); + } + + // check if document is already loaded + if (document.readyState === 'complete') { + setTimeout(trigger); + } else { + this.on('DOMContentLoaded', trigger); // works for modern browsers and IE9 + // we can not use jqLite since we are not done loading and jQuery could be loaded later. + // jshint -W064 + JQLite(window).on('load', trigger); // fallback to window.onload for others + // jshint +W064 + } + }, + toString: function() { + var value = []; + forEach(this, function(e) { value.push('' + e);}); + return '[' + value.join(', ') + ']'; + }, + + eq: function(index) { + return (index >= 0) ? jqLite(this[index]) : jqLite(this[this.length + index]); + }, + + length: 0, + push: push, + sort: [].sort, + splice: [].splice +}; + +////////////////////////////////////////// +// Functions iterating getter/setters. +// these functions return self on setter and +// value on get. +////////////////////////////////////////// +var BOOLEAN_ATTR = {}; +forEach('multiple,selected,checked,disabled,readOnly,required,open'.split(','), function(value) { + BOOLEAN_ATTR[lowercase(value)] = value; +}); +var BOOLEAN_ELEMENTS = {}; +forEach('input,select,option,textarea,button,form,details'.split(','), function(value) { + BOOLEAN_ELEMENTS[value] = true; +}); +var ALIASED_ATTR = { + 'ngMinlength': 'minlength', + 'ngMaxlength': 'maxlength', + 'ngMin': 'min', + 'ngMax': 'max', + 'ngPattern': 'pattern' +}; + +function getBooleanAttrName(element, name) { + // check dom last since we will most likely fail on name + var booleanAttr = BOOLEAN_ATTR[name.toLowerCase()]; + + // booleanAttr is here twice to minimize DOM access + return booleanAttr && BOOLEAN_ELEMENTS[nodeName_(element)] && booleanAttr; +} + +function getAliasedAttrName(name) { + return ALIASED_ATTR[name]; +} + +forEach({ + data: jqLiteData, + removeData: jqLiteRemoveData, + hasData: jqLiteHasData, + cleanData: jqLiteCleanData +}, function(fn, name) { + JQLite[name] = fn; +}); + +forEach({ + data: jqLiteData, + inheritedData: jqLiteInheritedData, + + scope: function(element) { + // Can't use jqLiteData here directly so we stay compatible with jQuery! + return jqLite.data(element, '$scope') || jqLiteInheritedData(element.parentNode || element, ['$isolateScope', '$scope']); + }, + + isolateScope: function(element) { + // Can't use jqLiteData here directly so we stay compatible with jQuery! + return jqLite.data(element, '$isolateScope') || jqLite.data(element, '$isolateScopeNoTemplate'); + }, + + controller: jqLiteController, + + injector: function(element) { + return jqLiteInheritedData(element, '$injector'); + }, + + removeAttr: function(element, name) { + element.removeAttribute(name); + }, + + hasClass: jqLiteHasClass, + + css: function(element, name, value) { + name = camelCase(name); + + if (isDefined(value)) { + element.style[name] = value; + } else { + return element.style[name]; + } + }, + + attr: function(element, name, value) { + var nodeType = element.nodeType; + if (nodeType === NODE_TYPE_TEXT || nodeType === NODE_TYPE_ATTRIBUTE || nodeType === NODE_TYPE_COMMENT) { + return; + } + var lowercasedName = lowercase(name); + if (BOOLEAN_ATTR[lowercasedName]) { + if (isDefined(value)) { + if (!!value) { + element[name] = true; + element.setAttribute(name, lowercasedName); + } else { + element[name] = false; + element.removeAttribute(lowercasedName); + } + } else { + return (element[name] || + (element.attributes.getNamedItem(name) || noop).specified) + ? lowercasedName + : undefined; + } + } else if (isDefined(value)) { + element.setAttribute(name, value); + } else if (element.getAttribute) { + // the extra argument "2" is to get the right thing for a.href in IE, see jQuery code + // some elements (e.g. Document) don't have get attribute, so return undefined + var ret = element.getAttribute(name, 2); + // normalize non-existing attributes to undefined (as jQuery) + return ret === null ? undefined : ret; + } + }, + + prop: function(element, name, value) { + if (isDefined(value)) { + element[name] = value; + } else { + return element[name]; + } + }, + + text: (function() { + getText.$dv = ''; + return getText; + + function getText(element, value) { + if (isUndefined(value)) { + var nodeType = element.nodeType; + return (nodeType === NODE_TYPE_ELEMENT || nodeType === NODE_TYPE_TEXT) ? element.textContent : ''; + } + element.textContent = value; + } + })(), + + val: function(element, value) { + if (isUndefined(value)) { + if (element.multiple && nodeName_(element) === 'select') { + var result = []; + forEach(element.options, function(option) { + if (option.selected) { + result.push(option.value || option.text); + } + }); + return result.length === 0 ? null : result; + } + return element.value; + } + element.value = value; + }, + + html: function(element, value) { + if (isUndefined(value)) { + return element.innerHTML; + } + jqLiteDealoc(element, true); + element.innerHTML = value; + }, + + empty: jqLiteEmpty +}, function(fn, name) { + /** + * Properties: writes return selection, reads return first value + */ + JQLite.prototype[name] = function(arg1, arg2) { + var i, key; + var nodeCount = this.length; + + // jqLiteHasClass has only two arguments, but is a getter-only fn, so we need to special-case it + // in a way that survives minification. + // jqLiteEmpty takes no arguments but is a setter. + if (fn !== jqLiteEmpty && + (isUndefined((fn.length == 2 && (fn !== jqLiteHasClass && fn !== jqLiteController)) ? arg1 : arg2))) { + if (isObject(arg1)) { + + // we are a write, but the object properties are the key/values + for (i = 0; i < nodeCount; i++) { + if (fn === jqLiteData) { + // data() takes the whole object in jQuery + fn(this[i], arg1); + } else { + for (key in arg1) { + fn(this[i], key, arg1[key]); + } + } + } + // return self for chaining + return this; + } else { + // we are a read, so read the first child. + // TODO: do we still need this? + var value = fn.$dv; + // Only if we have $dv do we iterate over all, otherwise it is just the first element. + var jj = (isUndefined(value)) ? Math.min(nodeCount, 1) : nodeCount; + for (var j = 0; j < jj; j++) { + var nodeValue = fn(this[j], arg1, arg2); + value = value ? value + nodeValue : nodeValue; + } + return value; + } + } else { + // we are a write, so apply to all children + for (i = 0; i < nodeCount; i++) { + fn(this[i], arg1, arg2); + } + // return self for chaining + return this; + } + }; +}); + +function createEventHandler(element, events) { + var eventHandler = function(event, type) { + // jQuery specific api + event.isDefaultPrevented = function() { + return event.defaultPrevented; + }; + + var eventFns = events[type || event.type]; + var eventFnsLength = eventFns ? eventFns.length : 0; + + if (!eventFnsLength) return; + + if (isUndefined(event.immediatePropagationStopped)) { + var originalStopImmediatePropagation = event.stopImmediatePropagation; + event.stopImmediatePropagation = function() { + event.immediatePropagationStopped = true; + + if (event.stopPropagation) { + event.stopPropagation(); + } + + if (originalStopImmediatePropagation) { + originalStopImmediatePropagation.call(event); + } + }; + } + + event.isImmediatePropagationStopped = function() { + return event.immediatePropagationStopped === true; + }; + + // Some events have special handlers that wrap the real handler + var handlerWrapper = eventFns.specialHandlerWrapper || defaultHandlerWrapper; + + // Copy event handlers in case event handlers array is modified during execution. + if ((eventFnsLength > 1)) { + eventFns = shallowCopy(eventFns); + } + + for (var i = 0; i < eventFnsLength; i++) { + if (!event.isImmediatePropagationStopped()) { + handlerWrapper(element, event, eventFns[i]); + } + } + }; + + // TODO: this is a hack for angularMocks/clearDataCache that makes it possible to deregister all + // events on `element` + eventHandler.elem = element; + return eventHandler; +} + +function defaultHandlerWrapper(element, event, handler) { + handler.call(element, event); +} + +function specialMouseHandlerWrapper(target, event, handler) { + // Refer to jQuery's implementation of mouseenter & mouseleave + // Read about mouseenter and mouseleave: + // http://www.quirksmode.org/js/events_mouse.html#link8 + var related = event.relatedTarget; + // For mousenter/leave call the handler if related is outside the target. + // NB: No relatedTarget if the mouse left/entered the browser window + if (!related || (related !== target && !jqLiteContains.call(target, related))) { + handler.call(target, event); + } +} + +////////////////////////////////////////// +// Functions iterating traversal. +// These functions chain results into a single +// selector. +////////////////////////////////////////// +forEach({ + removeData: jqLiteRemoveData, + + on: function jqLiteOn(element, type, fn, unsupported) { + if (isDefined(unsupported)) throw jqLiteMinErr('onargs', 'jqLite#on() does not support the `selector` or `eventData` parameters'); + + // Do not add event handlers to non-elements because they will not be cleaned up. + if (!jqLiteAcceptsData(element)) { + return; + } + + var expandoStore = jqLiteExpandoStore(element, true); + var events = expandoStore.events; + var handle = expandoStore.handle; + + if (!handle) { + handle = expandoStore.handle = createEventHandler(element, events); + } + + // http://jsperf.com/string-indexof-vs-split + var types = type.indexOf(' ') >= 0 ? type.split(' ') : [type]; + var i = types.length; + + var addHandler = function(type, specialHandlerWrapper, noEventListener) { + var eventFns = events[type]; + + if (!eventFns) { + eventFns = events[type] = []; + eventFns.specialHandlerWrapper = specialHandlerWrapper; + if (type !== '$destroy' && !noEventListener) { + addEventListenerFn(element, type, handle); + } + } + + eventFns.push(fn); + }; + + while (i--) { + type = types[i]; + if (MOUSE_EVENT_MAP[type]) { + addHandler(MOUSE_EVENT_MAP[type], specialMouseHandlerWrapper); + addHandler(type, undefined, true); + } else { + addHandler(type); + } + } + }, + + off: jqLiteOff, + + one: function(element, type, fn) { + element = jqLite(element); + + //add the listener twice so that when it is called + //you can remove the original function and still be + //able to call element.off(ev, fn) normally + element.on(type, function onFn() { + element.off(type, fn); + element.off(type, onFn); + }); + element.on(type, fn); + }, + + replaceWith: function(element, replaceNode) { + var index, parent = element.parentNode; + jqLiteDealoc(element); + forEach(new JQLite(replaceNode), function(node) { + if (index) { + parent.insertBefore(node, index.nextSibling); + } else { + parent.replaceChild(node, element); + } + index = node; + }); + }, + + children: function(element) { + var children = []; + forEach(element.childNodes, function(element) { + if (element.nodeType === NODE_TYPE_ELEMENT) { + children.push(element); + } + }); + return children; + }, + + contents: function(element) { + return element.contentDocument || element.childNodes || []; + }, + + append: function(element, node) { + var nodeType = element.nodeType; + if (nodeType !== NODE_TYPE_ELEMENT && nodeType !== NODE_TYPE_DOCUMENT_FRAGMENT) return; + + node = new JQLite(node); + + for (var i = 0, ii = node.length; i < ii; i++) { + var child = node[i]; + element.appendChild(child); + } + }, + + prepend: function(element, node) { + if (element.nodeType === NODE_TYPE_ELEMENT) { + var index = element.firstChild; + forEach(new JQLite(node), function(child) { + element.insertBefore(child, index); + }); + } + }, + + wrap: function(element, wrapNode) { + jqLiteWrapNode(element, jqLite(wrapNode).eq(0).clone()[0]); + }, + + remove: jqLiteRemove, + + detach: function(element) { + jqLiteRemove(element, true); + }, + + after: function(element, newElement) { + var index = element, parent = element.parentNode; + newElement = new JQLite(newElement); + + for (var i = 0, ii = newElement.length; i < ii; i++) { + var node = newElement[i]; + parent.insertBefore(node, index.nextSibling); + index = node; + } + }, + + addClass: jqLiteAddClass, + removeClass: jqLiteRemoveClass, + + toggleClass: function(element, selector, condition) { + if (selector) { + forEach(selector.split(' '), function(className) { + var classCondition = condition; + if (isUndefined(classCondition)) { + classCondition = !jqLiteHasClass(element, className); + } + (classCondition ? jqLiteAddClass : jqLiteRemoveClass)(element, className); + }); + } + }, + + parent: function(element) { + var parent = element.parentNode; + return parent && parent.nodeType !== NODE_TYPE_DOCUMENT_FRAGMENT ? parent : null; + }, + + next: function(element) { + return element.nextElementSibling; + }, + + find: function(element, selector) { + if (element.getElementsByTagName) { + return element.getElementsByTagName(selector); + } else { + return []; + } + }, + + clone: jqLiteClone, + + triggerHandler: function(element, event, extraParameters) { + + var dummyEvent, eventFnsCopy, handlerArgs; + var eventName = event.type || event; + var expandoStore = jqLiteExpandoStore(element); + var events = expandoStore && expandoStore.events; + var eventFns = events && events[eventName]; + + if (eventFns) { + // Create a dummy event to pass to the handlers + dummyEvent = { + preventDefault: function() { this.defaultPrevented = true; }, + isDefaultPrevented: function() { return this.defaultPrevented === true; }, + stopImmediatePropagation: function() { this.immediatePropagationStopped = true; }, + isImmediatePropagationStopped: function() { return this.immediatePropagationStopped === true; }, + stopPropagation: noop, + type: eventName, + target: element + }; + + // If a custom event was provided then extend our dummy event with it + if (event.type) { + dummyEvent = extend(dummyEvent, event); + } + + // Copy event handlers in case event handlers array is modified during execution. + eventFnsCopy = shallowCopy(eventFns); + handlerArgs = extraParameters ? [dummyEvent].concat(extraParameters) : [dummyEvent]; + + forEach(eventFnsCopy, function(fn) { + if (!dummyEvent.isImmediatePropagationStopped()) { + fn.apply(element, handlerArgs); + } + }); + } + } +}, function(fn, name) { + /** + * chaining functions + */ + JQLite.prototype[name] = function(arg1, arg2, arg3) { + var value; + + for (var i = 0, ii = this.length; i < ii; i++) { + if (isUndefined(value)) { + value = fn(this[i], arg1, arg2, arg3); + if (isDefined(value)) { + // any function which returns a value needs to be wrapped + value = jqLite(value); + } + } else { + jqLiteAddNodes(value, fn(this[i], arg1, arg2, arg3)); + } + } + return isDefined(value) ? value : this; + }; + + // bind legacy bind/unbind to on/off + JQLite.prototype.bind = JQLite.prototype.on; + JQLite.prototype.unbind = JQLite.prototype.off; +}); + + +// Provider for private $$jqLite service +function $$jqLiteProvider() { + this.$get = function $$jqLite() { + return extend(JQLite, { + hasClass: function(node, classes) { + if (node.attr) node = node[0]; + return jqLiteHasClass(node, classes); + }, + addClass: function(node, classes) { + if (node.attr) node = node[0]; + return jqLiteAddClass(node, classes); + }, + removeClass: function(node, classes) { + if (node.attr) node = node[0]; + return jqLiteRemoveClass(node, classes); + } + }); + }; +} + +/** + * Computes a hash of an 'obj'. + * Hash of a: + * string is string + * number is number as string + * object is either result of calling $$hashKey function on the object or uniquely generated id, + * that is also assigned to the $$hashKey property of the object. + * + * @param obj + * @returns {string} hash string such that the same input will have the same hash string. + * The resulting string key is in 'type:hashKey' format. + */ +function hashKey(obj, nextUidFn) { + var key = obj && obj.$$hashKey; + + if (key) { + if (typeof key === 'function') { + key = obj.$$hashKey(); + } + return key; + } + + var objType = typeof obj; + if (objType == 'function' || (objType == 'object' && obj !== null)) { + key = obj.$$hashKey = objType + ':' + (nextUidFn || nextUid)(); + } else { + key = objType + ':' + obj; + } + + return key; +} + +/** + * HashMap which can use objects as keys + */ +function HashMap(array, isolatedUid) { + if (isolatedUid) { + var uid = 0; + this.nextUid = function() { + return ++uid; + }; + } + forEach(array, this.put, this); +} +HashMap.prototype = { + /** + * Store key value pair + * @param key key to store can be any type + * @param value value to store can be any type + */ + put: function(key, value) { + this[hashKey(key, this.nextUid)] = value; + }, + + /** + * @param key + * @returns {Object} the value for the key + */ + get: function(key) { + return this[hashKey(key, this.nextUid)]; + }, + + /** + * Remove the key/value pair + * @param key + */ + remove: function(key) { + var value = this[key = hashKey(key, this.nextUid)]; + delete this[key]; + return value; + } +}; + +var $$HashMapProvider = [function() { + this.$get = [function() { + return HashMap; + }]; +}]; + +/** + * @ngdoc function + * @module ng + * @name angular.injector + * @kind function + * + * @description + * Creates an injector object that can be used for retrieving services as well as for + * dependency injection (see {@link guide/di dependency injection}). + * + * @param {Array.} modules A list of module functions or their aliases. See + * {@link angular.module}. The `ng` module must be explicitly added. + * @param {boolean=} [strictDi=false] Whether the injector should be in strict mode, which + * disallows argument name annotation inference. + * @returns {injector} Injector object. See {@link auto.$injector $injector}. + * + * @example + * Typical usage + * ```js + * // create an injector + * var $injector = angular.injector(['ng']); + * + * // use the injector to kick off your application + * // use the type inference to auto inject arguments, or use implicit injection + * $injector.invoke(function($rootScope, $compile, $document) { + * $compile($document)($rootScope); + * $rootScope.$digest(); + * }); + * ``` + * + * Sometimes you want to get access to the injector of a currently running Angular app + * from outside Angular. Perhaps, you want to inject and compile some markup after the + * application has been bootstrapped. You can do this using the extra `injector()` added + * to JQuery/jqLite elements. See {@link angular.element}. + * + * *This is fairly rare but could be the case if a third party library is injecting the + * markup.* + * + * In the following example a new block of HTML containing a `ng-controller` + * directive is added to the end of the document body by JQuery. We then compile and link + * it into the current AngularJS scope. + * + * ```js + * var $div = $('
{{content.label}}
'); + * $(document.body).append($div); + * + * angular.element(document).injector().invoke(function($compile) { + * var scope = angular.element($div).scope(); + * $compile($div)(scope); + * }); + * ``` + */ + + +/** + * @ngdoc module + * @name auto + * @description + * + * Implicit module which gets automatically added to each {@link auto.$injector $injector}. + */ + +var ARROW_ARG = /^([^\(]+?)=>/; +var FN_ARGS = /^[^\(]*\(\s*([^\)]*)\)/m; +var FN_ARG_SPLIT = /,/; +var FN_ARG = /^\s*(_?)(\S+?)\1\s*$/; +var STRIP_COMMENTS = /((\/\/.*$)|(\/\*[\s\S]*?\*\/))/mg; +var $injectorMinErr = minErr('$injector'); + +function extractArgs(fn) { + var fnText = fn.toString().replace(STRIP_COMMENTS, ''), + args = fnText.match(ARROW_ARG) || fnText.match(FN_ARGS); + return args; +} + +function anonFn(fn) { + // For anonymous functions, showing at the very least the function signature can help in + // debugging. + var args = extractArgs(fn); + if (args) { + return 'function(' + (args[1] || '').replace(/[\s\r\n]+/, ' ') + ')'; + } + return 'fn'; +} + +function annotate(fn, strictDi, name) { + var $inject, + argDecl, + last; + + if (typeof fn === 'function') { + if (!($inject = fn.$inject)) { + $inject = []; + if (fn.length) { + if (strictDi) { + if (!isString(name) || !name) { + name = fn.name || anonFn(fn); + } + throw $injectorMinErr('strictdi', + '{0} is not using explicit annotation and cannot be invoked in strict mode', name); + } + argDecl = extractArgs(fn); + forEach(argDecl[1].split(FN_ARG_SPLIT), function(arg) { + arg.replace(FN_ARG, function(all, underscore, name) { + $inject.push(name); + }); + }); + } + fn.$inject = $inject; + } + } else if (isArray(fn)) { + last = fn.length - 1; + assertArgFn(fn[last], 'fn'); + $inject = fn.slice(0, last); + } else { + assertArgFn(fn, 'fn', true); + } + return $inject; +} + +/////////////////////////////////////// + +/** + * @ngdoc service + * @name $injector + * + * @description + * + * `$injector` is used to retrieve object instances as defined by + * {@link auto.$provide provider}, instantiate types, invoke methods, + * and load modules. + * + * The following always holds true: + * + * ```js + * var $injector = angular.injector(); + * expect($injector.get('$injector')).toBe($injector); + * expect($injector.invoke(function($injector) { + * return $injector; + * })).toBe($injector); + * ``` + * + * # Injection Function Annotation + * + * JavaScript does not have annotations, and annotations are needed for dependency injection. The + * following are all valid ways of annotating function with injection arguments and are equivalent. + * + * ```js + * // inferred (only works if code not minified/obfuscated) + * $injector.invoke(function(serviceA){}); + * + * // annotated + * function explicit(serviceA) {}; + * explicit.$inject = ['serviceA']; + * $injector.invoke(explicit); + * + * // inline + * $injector.invoke(['serviceA', function(serviceA){}]); + * ``` + * + * ## Inference + * + * In JavaScript calling `toString()` on a function returns the function definition. The definition + * can then be parsed and the function arguments can be extracted. This method of discovering + * annotations is disallowed when the injector is in strict mode. + * *NOTE:* This does not work with minification, and obfuscation tools since these tools change the + * argument names. + * + * ## `$inject` Annotation + * By adding an `$inject` property onto a function the injection parameters can be specified. + * + * ## Inline + * As an array of injection names, where the last item in the array is the function to call. + */ + +/** + * @ngdoc method + * @name $injector#get + * + * @description + * Return an instance of the service. + * + * @param {string} name The name of the instance to retrieve. + * @param {string=} caller An optional string to provide the origin of the function call for error messages. + * @return {*} The instance. + */ + +/** + * @ngdoc method + * @name $injector#invoke + * + * @description + * Invoke the method and supply the method arguments from the `$injector`. + * + * @param {Function|Array.} fn The injectable function to invoke. Function parameters are + * injected according to the {@link guide/di $inject Annotation} rules. + * @param {Object=} self The `this` for the invoked method. + * @param {Object=} locals Optional object. If preset then any argument names are read from this + * object first, before the `$injector` is consulted. + * @returns {*} the value returned by the invoked `fn` function. + */ + +/** + * @ngdoc method + * @name $injector#has + * + * @description + * Allows the user to query if the particular service exists. + * + * @param {string} name Name of the service to query. + * @returns {boolean} `true` if injector has given service. + */ + +/** + * @ngdoc method + * @name $injector#instantiate + * @description + * Create a new instance of JS type. The method takes a constructor function, invokes the new + * operator, and supplies all of the arguments to the constructor function as specified by the + * constructor annotation. + * + * @param {Function} Type Annotated constructor function. + * @param {Object=} locals Optional object. If preset then any argument names are read from this + * object first, before the `$injector` is consulted. + * @returns {Object} new instance of `Type`. + */ + +/** + * @ngdoc method + * @name $injector#annotate + * + * @description + * Returns an array of service names which the function is requesting for injection. This API is + * used by the injector to determine which services need to be injected into the function when the + * function is invoked. There are three ways in which the function can be annotated with the needed + * dependencies. + * + * # Argument names + * + * The simplest form is to extract the dependencies from the arguments of the function. This is done + * by converting the function into a string using `toString()` method and extracting the argument + * names. + * ```js + * // Given + * function MyController($scope, $route) { + * // ... + * } + * + * // Then + * expect(injector.annotate(MyController)).toEqual(['$scope', '$route']); + * ``` + * + * You can disallow this method by using strict injection mode. + * + * This method does not work with code minification / obfuscation. For this reason the following + * annotation strategies are supported. + * + * # The `$inject` property + * + * If a function has an `$inject` property and its value is an array of strings, then the strings + * represent names of services to be injected into the function. + * ```js + * // Given + * var MyController = function(obfuscatedScope, obfuscatedRoute) { + * // ... + * } + * // Define function dependencies + * MyController['$inject'] = ['$scope', '$route']; + * + * // Then + * expect(injector.annotate(MyController)).toEqual(['$scope', '$route']); + * ``` + * + * # The array notation + * + * It is often desirable to inline Injected functions and that's when setting the `$inject` property + * is very inconvenient. In these situations using the array notation to specify the dependencies in + * a way that survives minification is a better choice: + * + * ```js + * // We wish to write this (not minification / obfuscation safe) + * injector.invoke(function($compile, $rootScope) { + * // ... + * }); + * + * // We are forced to write break inlining + * var tmpFn = function(obfuscatedCompile, obfuscatedRootScope) { + * // ... + * }; + * tmpFn.$inject = ['$compile', '$rootScope']; + * injector.invoke(tmpFn); + * + * // To better support inline function the inline annotation is supported + * injector.invoke(['$compile', '$rootScope', function(obfCompile, obfRootScope) { + * // ... + * }]); + * + * // Therefore + * expect(injector.annotate( + * ['$compile', '$rootScope', function(obfus_$compile, obfus_$rootScope) {}]) + * ).toEqual(['$compile', '$rootScope']); + * ``` + * + * @param {Function|Array.} fn Function for which dependent service names need to + * be retrieved as described above. + * + * @param {boolean=} [strictDi=false] Disallow argument name annotation inference. + * + * @returns {Array.} The names of the services which the function requires. + */ + + + + +/** + * @ngdoc service + * @name $provide + * + * @description + * + * The {@link auto.$provide $provide} service has a number of methods for registering components + * with the {@link auto.$injector $injector}. Many of these functions are also exposed on + * {@link angular.Module}. + * + * An Angular **service** is a singleton object created by a **service factory**. These **service + * factories** are functions which, in turn, are created by a **service provider**. + * The **service providers** are constructor functions. When instantiated they must contain a + * property called `$get`, which holds the **service factory** function. + * + * When you request a service, the {@link auto.$injector $injector} is responsible for finding the + * correct **service provider**, instantiating it and then calling its `$get` **service factory** + * function to get the instance of the **service**. + * + * Often services have no configuration options and there is no need to add methods to the service + * provider. The provider will be no more than a constructor function with a `$get` property. For + * these cases the {@link auto.$provide $provide} service has additional helper methods to register + * services without specifying a provider. + * + * * {@link auto.$provide#provider provider(provider)} - registers a **service provider** with the + * {@link auto.$injector $injector} + * * {@link auto.$provide#constant constant(obj)} - registers a value/object that can be accessed by + * providers and services. + * * {@link auto.$provide#value value(obj)} - registers a value/object that can only be accessed by + * services, not providers. + * * {@link auto.$provide#factory factory(fn)} - registers a service **factory function**, `fn`, + * that will be wrapped in a **service provider** object, whose `$get` property will contain the + * given factory function. + * * {@link auto.$provide#service service(class)} - registers a **constructor function**, `class` + * that will be wrapped in a **service provider** object, whose `$get` property will instantiate + * a new object using the given constructor function. + * + * See the individual methods for more information and examples. + */ + +/** + * @ngdoc method + * @name $provide#provider + * @description + * + * Register a **provider function** with the {@link auto.$injector $injector}. Provider functions + * are constructor functions, whose instances are responsible for "providing" a factory for a + * service. + * + * Service provider names start with the name of the service they provide followed by `Provider`. + * For example, the {@link ng.$log $log} service has a provider called + * {@link ng.$logProvider $logProvider}. + * + * Service provider objects can have additional methods which allow configuration of the provider + * and its service. Importantly, you can configure what kind of service is created by the `$get` + * method, or how that service will act. For example, the {@link ng.$logProvider $logProvider} has a + * method {@link ng.$logProvider#debugEnabled debugEnabled} + * which lets you specify whether the {@link ng.$log $log} service will log debug messages to the + * console or not. + * + * @param {string} name The name of the instance. NOTE: the provider will be available under `name + + 'Provider'` key. + * @param {(Object|function())} provider If the provider is: + * + * - `Object`: then it should have a `$get` method. The `$get` method will be invoked using + * {@link auto.$injector#invoke $injector.invoke()} when an instance needs to be created. + * - `Constructor`: a new instance of the provider will be created using + * {@link auto.$injector#instantiate $injector.instantiate()}, then treated as `object`. + * + * @returns {Object} registered provider instance + + * @example + * + * The following example shows how to create a simple event tracking service and register it using + * {@link auto.$provide#provider $provide.provider()}. + * + * ```js + * // Define the eventTracker provider + * function EventTrackerProvider() { + * var trackingUrl = '/track'; + * + * // A provider method for configuring where the tracked events should been saved + * this.setTrackingUrl = function(url) { + * trackingUrl = url; + * }; + * + * // The service factory function + * this.$get = ['$http', function($http) { + * var trackedEvents = {}; + * return { + * // Call this to track an event + * event: function(event) { + * var count = trackedEvents[event] || 0; + * count += 1; + * trackedEvents[event] = count; + * return count; + * }, + * // Call this to save the tracked events to the trackingUrl + * save: function() { + * $http.post(trackingUrl, trackedEvents); + * } + * }; + * }]; + * } + * + * describe('eventTracker', function() { + * var postSpy; + * + * beforeEach(module(function($provide) { + * // Register the eventTracker provider + * $provide.provider('eventTracker', EventTrackerProvider); + * })); + * + * beforeEach(module(function(eventTrackerProvider) { + * // Configure eventTracker provider + * eventTrackerProvider.setTrackingUrl('/custom-track'); + * })); + * + * it('tracks events', inject(function(eventTracker) { + * expect(eventTracker.event('login')).toEqual(1); + * expect(eventTracker.event('login')).toEqual(2); + * })); + * + * it('saves to the tracking url', inject(function(eventTracker, $http) { + * postSpy = spyOn($http, 'post'); + * eventTracker.event('login'); + * eventTracker.save(); + * expect(postSpy).toHaveBeenCalled(); + * expect(postSpy.mostRecentCall.args[0]).not.toEqual('/track'); + * expect(postSpy.mostRecentCall.args[0]).toEqual('/custom-track'); + * expect(postSpy.mostRecentCall.args[1]).toEqual({ 'login': 1 }); + * })); + * }); + * ``` + */ + +/** + * @ngdoc method + * @name $provide#factory + * @description + * + * Register a **service factory**, which will be called to return the service instance. + * This is short for registering a service where its provider consists of only a `$get` property, + * which is the given service factory function. + * You should use {@link auto.$provide#factory $provide.factory(getFn)} if you do not need to + * configure your service in a provider. + * + * @param {string} name The name of the instance. + * @param {Function|Array.} $getFn The injectable $getFn for the instance creation. + * Internally this is a short hand for `$provide.provider(name, {$get: $getFn})`. + * @returns {Object} registered provider instance + * + * @example + * Here is an example of registering a service + * ```js + * $provide.factory('ping', ['$http', function($http) { + * return function ping() { + * return $http.send('/ping'); + * }; + * }]); + * ``` + * You would then inject and use this service like this: + * ```js + * someModule.controller('Ctrl', ['ping', function(ping) { + * ping(); + * }]); + * ``` + */ + + +/** + * @ngdoc method + * @name $provide#service + * @description + * + * Register a **service constructor**, which will be invoked with `new` to create the service + * instance. + * This is short for registering a service where its provider's `$get` property is a factory + * function that returns an instance instantiated by the injector from the service constructor + * function. + * + * Internally it looks a bit like this: + * + * ``` + * { + * $get: function() { + * return $injector.instantiate(constructor); + * } + * } + * ``` + * + * + * You should use {@link auto.$provide#service $provide.service(class)} if you define your service + * as a type/class. + * + * @param {string} name The name of the instance. + * @param {Function|Array.} constructor An injectable class (constructor function) + * that will be instantiated. + * @returns {Object} registered provider instance + * + * @example + * Here is an example of registering a service using + * {@link auto.$provide#service $provide.service(class)}. + * ```js + * var Ping = function($http) { + * this.$http = $http; + * }; + * + * Ping.$inject = ['$http']; + * + * Ping.prototype.send = function() { + * return this.$http.get('/ping'); + * }; + * $provide.service('ping', Ping); + * ``` + * You would then inject and use this service like this: + * ```js + * someModule.controller('Ctrl', ['ping', function(ping) { + * ping.send(); + * }]); + * ``` + */ + + +/** + * @ngdoc method + * @name $provide#value + * @description + * + * Register a **value service** with the {@link auto.$injector $injector}, such as a string, a + * number, an array, an object or a function. This is short for registering a service where its + * provider's `$get` property is a factory function that takes no arguments and returns the **value + * service**. That also means it is not possible to inject other services into a value service. + * + * Value services are similar to constant services, except that they cannot be injected into a + * module configuration function (see {@link angular.Module#config}) but they can be overridden by + * an Angular {@link auto.$provide#decorator decorator}. + * + * @param {string} name The name of the instance. + * @param {*} value The value. + * @returns {Object} registered provider instance + * + * @example + * Here are some examples of creating value services. + * ```js + * $provide.value('ADMIN_USER', 'admin'); + * + * $provide.value('RoleLookup', { admin: 0, writer: 1, reader: 2 }); + * + * $provide.value('halfOf', function(value) { + * return value / 2; + * }); + * ``` + */ + + +/** + * @ngdoc method + * @name $provide#constant + * @description + * + * Register a **constant service** with the {@link auto.$injector $injector}, such as a string, + * a number, an array, an object or a function. Like the {@link auto.$provide#value value}, it is not + * possible to inject other services into a constant. + * + * But unlike {@link auto.$provide#value value}, a constant can be + * injected into a module configuration function (see {@link angular.Module#config}) and it cannot + * be overridden by an Angular {@link auto.$provide#decorator decorator}. + * + * @param {string} name The name of the constant. + * @param {*} value The constant value. + * @returns {Object} registered instance + * + * @example + * Here a some examples of creating constants: + * ```js + * $provide.constant('SHARD_HEIGHT', 306); + * + * $provide.constant('MY_COLOURS', ['red', 'blue', 'grey']); + * + * $provide.constant('double', function(value) { + * return value * 2; + * }); + * ``` + */ + + +/** + * @ngdoc method + * @name $provide#decorator + * @description + * + * Register a **service decorator** with the {@link auto.$injector $injector}. A service decorator + * intercepts the creation of a service, allowing it to override or modify the behavior of the + * service. The object returned by the decorator may be the original service, or a new service + * object which replaces or wraps and delegates to the original service. + * + * @param {string} name The name of the service to decorate. + * @param {Function|Array.} decorator This function will be invoked when the service needs to be + * instantiated and should return the decorated service instance. The function is called using + * the {@link auto.$injector#invoke injector.invoke} method and is therefore fully injectable. + * Local injection arguments: + * + * * `$delegate` - The original service instance, which can be monkey patched, configured, + * decorated or delegated to. + * + * @example + * Here we decorate the {@link ng.$log $log} service to convert warnings to errors by intercepting + * calls to {@link ng.$log#error $log.warn()}. + * ```js + * $provide.decorator('$log', ['$delegate', function($delegate) { + * $delegate.warn = $delegate.error; + * return $delegate; + * }]); + * ``` + */ + + +function createInjector(modulesToLoad, strictDi) { + strictDi = (strictDi === true); + var INSTANTIATING = {}, + providerSuffix = 'Provider', + path = [], + loadedModules = new HashMap([], true), + providerCache = { + $provide: { + provider: supportObject(provider), + factory: supportObject(factory), + service: supportObject(service), + value: supportObject(value), + constant: supportObject(constant), + decorator: decorator + } + }, + providerInjector = (providerCache.$injector = + createInternalInjector(providerCache, function(serviceName, caller) { + if (angular.isString(caller)) { + path.push(caller); + } + throw $injectorMinErr('unpr', "Unknown provider: {0}", path.join(' <- ')); + })), + instanceCache = {}, + protoInstanceInjector = + createInternalInjector(instanceCache, function(serviceName, caller) { + var provider = providerInjector.get(serviceName + providerSuffix, caller); + return instanceInjector.invoke( + provider.$get, provider, undefined, serviceName); + }), + instanceInjector = protoInstanceInjector; + + providerCache['$injector' + providerSuffix] = { $get: valueFn(protoInstanceInjector) }; + var runBlocks = loadModules(modulesToLoad); + instanceInjector = protoInstanceInjector.get('$injector'); + instanceInjector.strictDi = strictDi; + forEach(runBlocks, function(fn) { if (fn) instanceInjector.invoke(fn); }); + + return instanceInjector; + + //////////////////////////////////// + // $provider + //////////////////////////////////// + + function supportObject(delegate) { + return function(key, value) { + if (isObject(key)) { + forEach(key, reverseParams(delegate)); + } else { + return delegate(key, value); + } + }; + } + + function provider(name, provider_) { + assertNotHasOwnProperty(name, 'service'); + if (isFunction(provider_) || isArray(provider_)) { + provider_ = providerInjector.instantiate(provider_); + } + if (!provider_.$get) { + throw $injectorMinErr('pget', "Provider '{0}' must define $get factory method.", name); + } + return providerCache[name + providerSuffix] = provider_; + } + + function enforceReturnValue(name, factory) { + return function enforcedReturnValue() { + var result = instanceInjector.invoke(factory, this); + if (isUndefined(result)) { + throw $injectorMinErr('undef', "Provider '{0}' must return a value from $get factory method.", name); + } + return result; + }; + } + + function factory(name, factoryFn, enforce) { + return provider(name, { + $get: enforce !== false ? enforceReturnValue(name, factoryFn) : factoryFn + }); + } + + function service(name, constructor) { + return factory(name, ['$injector', function($injector) { + return $injector.instantiate(constructor); + }]); + } + + function value(name, val) { return factory(name, valueFn(val), false); } + + function constant(name, value) { + assertNotHasOwnProperty(name, 'constant'); + providerCache[name] = value; + instanceCache[name] = value; + } + + function decorator(serviceName, decorFn) { + var origProvider = providerInjector.get(serviceName + providerSuffix), + orig$get = origProvider.$get; + + origProvider.$get = function() { + var origInstance = instanceInjector.invoke(orig$get, origProvider); + return instanceInjector.invoke(decorFn, null, {$delegate: origInstance}); + }; + } + + //////////////////////////////////// + // Module Loading + //////////////////////////////////// + function loadModules(modulesToLoad) { + assertArg(isUndefined(modulesToLoad) || isArray(modulesToLoad), 'modulesToLoad', 'not an array'); + var runBlocks = [], moduleFn; + forEach(modulesToLoad, function(module) { + if (loadedModules.get(module)) return; + loadedModules.put(module, true); + + function runInvokeQueue(queue) { + var i, ii; + for (i = 0, ii = queue.length; i < ii; i++) { + var invokeArgs = queue[i], + provider = providerInjector.get(invokeArgs[0]); + + provider[invokeArgs[1]].apply(provider, invokeArgs[2]); + } + } + + try { + if (isString(module)) { + moduleFn = angularModule(module); + runBlocks = runBlocks.concat(loadModules(moduleFn.requires)).concat(moduleFn._runBlocks); + runInvokeQueue(moduleFn._invokeQueue); + runInvokeQueue(moduleFn._configBlocks); + } else if (isFunction(module)) { + runBlocks.push(providerInjector.invoke(module)); + } else if (isArray(module)) { + runBlocks.push(providerInjector.invoke(module)); + } else { + assertArgFn(module, 'module'); + } + } catch (e) { + if (isArray(module)) { + module = module[module.length - 1]; + } + if (e.message && e.stack && e.stack.indexOf(e.message) == -1) { + // Safari & FF's stack traces don't contain error.message content + // unlike those of Chrome and IE + // So if stack doesn't contain message, we create a new string that contains both. + // Since error.stack is read-only in Safari, I'm overriding e and not e.stack here. + /* jshint -W022 */ + e = e.message + '\n' + e.stack; + } + throw $injectorMinErr('modulerr', "Failed to instantiate module {0} due to:\n{1}", + module, e.stack || e.message || e); + } + }); + return runBlocks; + } + + //////////////////////////////////// + // internal Injector + //////////////////////////////////// + + function createInternalInjector(cache, factory) { + + function getService(serviceName, caller) { + if (cache.hasOwnProperty(serviceName)) { + if (cache[serviceName] === INSTANTIATING) { + throw $injectorMinErr('cdep', 'Circular dependency found: {0}', + serviceName + ' <- ' + path.join(' <- ')); + } + return cache[serviceName]; + } else { + try { + path.unshift(serviceName); + cache[serviceName] = INSTANTIATING; + return cache[serviceName] = factory(serviceName, caller); + } catch (err) { + if (cache[serviceName] === INSTANTIATING) { + delete cache[serviceName]; + } + throw err; + } finally { + path.shift(); + } + } + } + + + function injectionArgs(fn, locals, serviceName) { + var args = [], + $inject = createInjector.$$annotate(fn, strictDi, serviceName); + + for (var i = 0, length = $inject.length; i < length; i++) { + var key = $inject[i]; + if (typeof key !== 'string') { + throw $injectorMinErr('itkn', + 'Incorrect injection token! Expected service name as string, got {0}', key); + } + args.push(locals && locals.hasOwnProperty(key) ? locals[key] : + getService(key, serviceName)); + } + return args; + } + + function isClass(func) { + // IE 9-11 do not support classes and IE9 leaks with the code below. + if (msie <= 11) { + return false; + } + // Workaround for MS Edge. + // Check https://connect.microsoft.com/IE/Feedback/Details/2211653 + return typeof func === 'function' + && /^(?:class\s|constructor\()/.test(Function.prototype.toString.call(func)); + } + + function invoke(fn, self, locals, serviceName) { + if (typeof locals === 'string') { + serviceName = locals; + locals = null; + } + + var args = injectionArgs(fn, locals, serviceName); + if (isArray(fn)) { + fn = fn[fn.length - 1]; + } + + if (!isClass(fn)) { + // http://jsperf.com/angularjs-invoke-apply-vs-switch + // #5388 + return fn.apply(self, args); + } else { + args.unshift(null); + return new (Function.prototype.bind.apply(fn, args))(); + } + } + + + function instantiate(Type, locals, serviceName) { + // Check if Type is annotated and use just the given function at n-1 as parameter + // e.g. someModule.factory('greeter', ['$window', function(renamed$window) {}]); + var ctor = (isArray(Type) ? Type[Type.length - 1] : Type); + var args = injectionArgs(Type, locals, serviceName); + // Empty object at position 0 is ignored for invocation with `new`, but required. + args.unshift(null); + return new (Function.prototype.bind.apply(ctor, args))(); + } + + + return { + invoke: invoke, + instantiate: instantiate, + get: getService, + annotate: createInjector.$$annotate, + has: function(name) { + return providerCache.hasOwnProperty(name + providerSuffix) || cache.hasOwnProperty(name); + } + }; + } +} + +createInjector.$$annotate = annotate; + +/** + * @ngdoc provider + * @name $anchorScrollProvider + * + * @description + * Use `$anchorScrollProvider` to disable automatic scrolling whenever + * {@link ng.$location#hash $location.hash()} changes. + */ +function $AnchorScrollProvider() { + + var autoScrollingEnabled = true; + + /** + * @ngdoc method + * @name $anchorScrollProvider#disableAutoScrolling + * + * @description + * By default, {@link ng.$anchorScroll $anchorScroll()} will automatically detect changes to + * {@link ng.$location#hash $location.hash()} and scroll to the element matching the new hash.
+ * Use this method to disable automatic scrolling. + * + * If automatic scrolling is disabled, one must explicitly call + * {@link ng.$anchorScroll $anchorScroll()} in order to scroll to the element related to the + * current hash. + */ + this.disableAutoScrolling = function() { + autoScrollingEnabled = false; + }; + + /** + * @ngdoc service + * @name $anchorScroll + * @kind function + * @requires $window + * @requires $location + * @requires $rootScope + * + * @description + * When called, it scrolls to the element related to the specified `hash` or (if omitted) to the + * current value of {@link ng.$location#hash $location.hash()}, according to the rules specified + * in the + * [HTML5 spec](http://www.w3.org/html/wg/drafts/html/master/browsers.html#the-indicated-part-of-the-document). + * + * It also watches the {@link ng.$location#hash $location.hash()} and automatically scrolls to + * match any anchor whenever it changes. This can be disabled by calling + * {@link ng.$anchorScrollProvider#disableAutoScrolling $anchorScrollProvider.disableAutoScrolling()}. + * + * Additionally, you can use its {@link ng.$anchorScroll#yOffset yOffset} property to specify a + * vertical scroll-offset (either fixed or dynamic). + * + * @param {string=} hash The hash specifying the element to scroll to. If omitted, the value of + * {@link ng.$location#hash $location.hash()} will be used. + * + * @property {(number|function|jqLite)} yOffset + * If set, specifies a vertical scroll-offset. This is often useful when there are fixed + * positioned elements at the top of the page, such as navbars, headers etc. + * + * `yOffset` can be specified in various ways: + * - **number**: A fixed number of pixels to be used as offset.

+ * - **function**: A getter function called everytime `$anchorScroll()` is executed. Must return + * a number representing the offset (in pixels).

+ * - **jqLite**: A jqLite/jQuery element to be used for specifying the offset. The distance from + * the top of the page to the element's bottom will be used as offset.
+ * **Note**: The element will be taken into account only as long as its `position` is set to + * `fixed`. This option is useful, when dealing with responsive navbars/headers that adjust + * their height and/or positioning according to the viewport's size. + * + *
+ *
+ * In order for `yOffset` to work properly, scrolling should take place on the document's root and + * not some child element. + *
+ * + * @example + + +
+ Go to bottom + You're at the bottom! +
+
+ + angular.module('anchorScrollExample', []) + .controller('ScrollController', ['$scope', '$location', '$anchorScroll', + function ($scope, $location, $anchorScroll) { + $scope.gotoBottom = function() { + // set the location.hash to the id of + // the element you wish to scroll to. + $location.hash('bottom'); + + // call $anchorScroll() + $anchorScroll(); + }; + }]); + + + #scrollArea { + height: 280px; + overflow: auto; + } + + #bottom { + display: block; + margin-top: 2000px; + } + +
+ * + *
+ * The example below illustrates the use of a vertical scroll-offset (specified as a fixed value). + * See {@link ng.$anchorScroll#yOffset $anchorScroll.yOffset} for more details. + * + * @example + + + +
+ Anchor {{x}} of 5 +
+
+ + angular.module('anchorScrollOffsetExample', []) + .run(['$anchorScroll', function($anchorScroll) { + $anchorScroll.yOffset = 50; // always scroll by 50 extra pixels + }]) + .controller('headerCtrl', ['$anchorScroll', '$location', '$scope', + function ($anchorScroll, $location, $scope) { + $scope.gotoAnchor = function(x) { + var newHash = 'anchor' + x; + if ($location.hash() !== newHash) { + // set the $location.hash to `newHash` and + // $anchorScroll will automatically scroll to it + $location.hash('anchor' + x); + } else { + // call $anchorScroll() explicitly, + // since $location.hash hasn't changed + $anchorScroll(); + } + }; + } + ]); + + + body { + padding-top: 50px; + } + + .anchor { + border: 2px dashed DarkOrchid; + padding: 10px 10px 200px 10px; + } + + .fixed-header { + background-color: rgba(0, 0, 0, 0.2); + height: 50px; + position: fixed; + top: 0; left: 0; right: 0; + } + + .fixed-header > a { + display: inline-block; + margin: 5px 15px; + } + +
+ */ + this.$get = ['$window', '$location', '$rootScope', function($window, $location, $rootScope) { + var document = $window.document; + + // Helper function to get first anchor from a NodeList + // (using `Array#some()` instead of `angular#forEach()` since it's more performant + // and working in all supported browsers.) + function getFirstAnchor(list) { + var result = null; + Array.prototype.some.call(list, function(element) { + if (nodeName_(element) === 'a') { + result = element; + return true; + } + }); + return result; + } + + function getYOffset() { + + var offset = scroll.yOffset; + + if (isFunction(offset)) { + offset = offset(); + } else if (isElement(offset)) { + var elem = offset[0]; + var style = $window.getComputedStyle(elem); + if (style.position !== 'fixed') { + offset = 0; + } else { + offset = elem.getBoundingClientRect().bottom; + } + } else if (!isNumber(offset)) { + offset = 0; + } + + return offset; + } + + function scrollTo(elem) { + if (elem) { + elem.scrollIntoView(); + + var offset = getYOffset(); + + if (offset) { + // `offset` is the number of pixels we should scroll UP in order to align `elem` properly. + // This is true ONLY if the call to `elem.scrollIntoView()` initially aligns `elem` at the + // top of the viewport. + // + // IF the number of pixels from the top of `elem` to the end of the page's content is less + // than the height of the viewport, then `elem.scrollIntoView()` will align the `elem` some + // way down the page. + // + // This is often the case for elements near the bottom of the page. + // + // In such cases we do not need to scroll the whole `offset` up, just the difference between + // the top of the element and the offset, which is enough to align the top of `elem` at the + // desired position. + var elemTop = elem.getBoundingClientRect().top; + $window.scrollBy(0, elemTop - offset); + } + } else { + $window.scrollTo(0, 0); + } + } + + function scroll(hash) { + hash = isString(hash) ? hash : $location.hash(); + var elm; + + // empty hash, scroll to the top of the page + if (!hash) scrollTo(null); + + // element with given id + else if ((elm = document.getElementById(hash))) scrollTo(elm); + + // first anchor with given name :-D + else if ((elm = getFirstAnchor(document.getElementsByName(hash)))) scrollTo(elm); + + // no element and hash == 'top', scroll to the top of the page + else if (hash === 'top') scrollTo(null); + } + + // does not scroll when user clicks on anchor link that is currently on + // (no url change, no $location.hash() change), browser native does scroll + if (autoScrollingEnabled) { + $rootScope.$watch(function autoScrollWatch() {return $location.hash();}, + function autoScrollWatchAction(newVal, oldVal) { + // skip the initial scroll if $location.hash is empty + if (newVal === oldVal && newVal === '') return; + + jqLiteDocumentLoaded(function() { + $rootScope.$evalAsync(scroll); + }); + }); + } + + return scroll; + }]; +} + +var $animateMinErr = minErr('$animate'); +var ELEMENT_NODE = 1; +var NG_ANIMATE_CLASSNAME = 'ng-animate'; + +function mergeClasses(a,b) { + if (!a && !b) return ''; + if (!a) return b; + if (!b) return a; + if (isArray(a)) a = a.join(' '); + if (isArray(b)) b = b.join(' '); + return a + ' ' + b; +} + +function extractElementNode(element) { + for (var i = 0; i < element.length; i++) { + var elm = element[i]; + if (elm.nodeType === ELEMENT_NODE) { + return elm; + } + } +} + +function splitClasses(classes) { + if (isString(classes)) { + classes = classes.split(' '); + } + + // Use createMap() to prevent class assumptions involving property names in + // Object.prototype + var obj = createMap(); + forEach(classes, function(klass) { + // sometimes the split leaves empty string values + // incase extra spaces were applied to the options + if (klass.length) { + obj[klass] = true; + } + }); + return obj; +} + +// if any other type of options value besides an Object value is +// passed into the $animate.method() animation then this helper code +// will be run which will ignore it. While this patch is not the +// greatest solution to this, a lot of existing plugins depend on +// $animate to either call the callback (< 1.2) or return a promise +// that can be changed. This helper function ensures that the options +// are wiped clean incase a callback function is provided. +function prepareAnimateOptions(options) { + return isObject(options) + ? options + : {}; +} + +var $$CoreAnimateJsProvider = function() { + this.$get = noop; +}; + +// this is prefixed with Core since it conflicts with +// the animateQueueProvider defined in ngAnimate/animateQueue.js +var $$CoreAnimateQueueProvider = function() { + var postDigestQueue = new HashMap(); + var postDigestElements = []; + + this.$get = ['$$AnimateRunner', '$rootScope', + function($$AnimateRunner, $rootScope) { + return { + enabled: noop, + on: noop, + off: noop, + pin: noop, + + push: function(element, event, options, domOperation) { + domOperation && domOperation(); + + options = options || {}; + options.from && element.css(options.from); + options.to && element.css(options.to); + + if (options.addClass || options.removeClass) { + addRemoveClassesPostDigest(element, options.addClass, options.removeClass); + } + + var runner = new $$AnimateRunner(); // jshint ignore:line + + // since there are no animations to run the runner needs to be + // notified that the animation call is complete. + runner.complete(); + return runner; + } + }; + + + function updateData(data, classes, value) { + var changed = false; + if (classes) { + classes = isString(classes) ? classes.split(' ') : + isArray(classes) ? classes : []; + forEach(classes, function(className) { + if (className) { + changed = true; + data[className] = value; + } + }); + } + return changed; + } + + function handleCSSClassChanges() { + forEach(postDigestElements, function(element) { + var data = postDigestQueue.get(element); + if (data) { + var existing = splitClasses(element.attr('class')); + var toAdd = ''; + var toRemove = ''; + forEach(data, function(status, className) { + var hasClass = !!existing[className]; + if (status !== hasClass) { + if (status) { + toAdd += (toAdd.length ? ' ' : '') + className; + } else { + toRemove += (toRemove.length ? ' ' : '') + className; + } + } + }); + + forEach(element, function(elm) { + toAdd && jqLiteAddClass(elm, toAdd); + toRemove && jqLiteRemoveClass(elm, toRemove); + }); + postDigestQueue.remove(element); + } + }); + postDigestElements.length = 0; + } + + + function addRemoveClassesPostDigest(element, add, remove) { + var data = postDigestQueue.get(element) || {}; + + var classesAdded = updateData(data, add, true); + var classesRemoved = updateData(data, remove, false); + + if (classesAdded || classesRemoved) { + + postDigestQueue.put(element, data); + postDigestElements.push(element); + + if (postDigestElements.length === 1) { + $rootScope.$$postDigest(handleCSSClassChanges); + } + } + } + }]; +}; + +/** + * @ngdoc provider + * @name $animateProvider + * + * @description + * Default implementation of $animate that doesn't perform any animations, instead just + * synchronously performs DOM updates and resolves the returned runner promise. + * + * In order to enable animations the `ngAnimate` module has to be loaded. + * + * To see the functional implementation check out `src/ngAnimate/animate.js`. + */ +var $AnimateProvider = ['$provide', function($provide) { + var provider = this; + + this.$$registeredAnimations = Object.create(null); + + /** + * @ngdoc method + * @name $animateProvider#register + * + * @description + * Registers a new injectable animation factory function. The factory function produces the + * animation object which contains callback functions for each event that is expected to be + * animated. + * + * * `eventFn`: `function(element, ... , doneFunction, options)` + * The element to animate, the `doneFunction` and the options fed into the animation. Depending + * on the type of animation additional arguments will be injected into the animation function. The + * list below explains the function signatures for the different animation methods: + * + * - setClass: function(element, addedClasses, removedClasses, doneFunction, options) + * - addClass: function(element, addedClasses, doneFunction, options) + * - removeClass: function(element, removedClasses, doneFunction, options) + * - enter, leave, move: function(element, doneFunction, options) + * - animate: function(element, fromStyles, toStyles, doneFunction, options) + * + * Make sure to trigger the `doneFunction` once the animation is fully complete. + * + * ```js + * return { + * //enter, leave, move signature + * eventFn : function(element, done, options) { + * //code to run the animation + * //once complete, then run done() + * return function endFunction(wasCancelled) { + * //code to cancel the animation + * } + * } + * } + * ``` + * + * @param {string} name The name of the animation (this is what the class-based CSS value will be compared to). + * @param {Function} factory The factory function that will be executed to return the animation + * object. + */ + this.register = function(name, factory) { + if (name && name.charAt(0) !== '.') { + throw $animateMinErr('notcsel', "Expecting class selector starting with '.' got '{0}'.", name); + } + + var key = name + '-animation'; + provider.$$registeredAnimations[name.substr(1)] = key; + $provide.factory(key, factory); + }; + + /** + * @ngdoc method + * @name $animateProvider#classNameFilter + * + * @description + * Sets and/or returns the CSS class regular expression that is checked when performing + * an animation. Upon bootstrap the classNameFilter value is not set at all and will + * therefore enable $animate to attempt to perform an animation on any element that is triggered. + * When setting the `classNameFilter` value, animations will only be performed on elements + * that successfully match the filter expression. This in turn can boost performance + * for low-powered devices as well as applications containing a lot of structural operations. + * @param {RegExp=} expression The className expression which will be checked against all animations + * @return {RegExp} The current CSS className expression value. If null then there is no expression value + */ + this.classNameFilter = function(expression) { + if (arguments.length === 1) { + this.$$classNameFilter = (expression instanceof RegExp) ? expression : null; + if (this.$$classNameFilter) { + var reservedRegex = new RegExp("(\\s+|\\/)" + NG_ANIMATE_CLASSNAME + "(\\s+|\\/)"); + if (reservedRegex.test(this.$$classNameFilter.toString())) { + throw $animateMinErr('nongcls','$animateProvider.classNameFilter(regex) prohibits accepting a regex value which matches/contains the "{0}" CSS class.', NG_ANIMATE_CLASSNAME); + + } + } + } + return this.$$classNameFilter; + }; + + this.$get = ['$$animateQueue', function($$animateQueue) { + function domInsert(element, parentElement, afterElement) { + // if for some reason the previous element was removed + // from the dom sometime before this code runs then let's + // just stick to using the parent element as the anchor + if (afterElement) { + var afterNode = extractElementNode(afterElement); + if (afterNode && !afterNode.parentNode && !afterNode.previousElementSibling) { + afterElement = null; + } + } + afterElement ? afterElement.after(element) : parentElement.prepend(element); + } + + /** + * @ngdoc service + * @name $animate + * @description The $animate service exposes a series of DOM utility methods that provide support + * for animation hooks. The default behavior is the application of DOM operations, however, + * when an animation is detected (and animations are enabled), $animate will do the heavy lifting + * to ensure that animation runs with the triggered DOM operation. + * + * By default $animate doesn't trigger any animations. This is because the `ngAnimate` module isn't + * included and only when it is active then the animation hooks that `$animate` triggers will be + * functional. Once active then all structural `ng-` directives will trigger animations as they perform + * their DOM-related operations (enter, leave and move). Other directives such as `ngClass`, + * `ngShow`, `ngHide` and `ngMessages` also provide support for animations. + * + * It is recommended that the`$animate` service is always used when executing DOM-related procedures within directives. + * + * To learn more about enabling animation support, click here to visit the + * {@link ngAnimate ngAnimate module page}. + */ + return { + // we don't call it directly since non-existant arguments may + // be interpreted as null within the sub enabled function + + /** + * + * @ngdoc method + * @name $animate#on + * @kind function + * @description Sets up an event listener to fire whenever the animation event (enter, leave, move, etc...) + * has fired on the given element or among any of its children. Once the listener is fired, the provided callback + * is fired with the following params: + * + * ```js + * $animate.on('enter', container, + * function callback(element, phase) { + * // cool we detected an enter animation within the container + * } + * ); + * ``` + * + * @param {string} event the animation event that will be captured (e.g. enter, leave, move, addClass, removeClass, etc...) + * @param {DOMElement} container the container element that will capture each of the animation events that are fired on itself + * as well as among its children + * @param {Function} callback the callback function that will be fired when the listener is triggered + * + * The arguments present in the callback function are: + * * `element` - The captured DOM element that the animation was fired on. + * * `phase` - The phase of the animation. The two possible phases are **start** (when the animation starts) and **close** (when it ends). + */ + on: $$animateQueue.on, + + /** + * + * @ngdoc method + * @name $animate#off + * @kind function + * @description Deregisters an event listener based on the event which has been associated with the provided element. This method + * can be used in three different ways depending on the arguments: + * + * ```js + * // remove all the animation event listeners listening for `enter` + * $animate.off('enter'); + * + * // remove all the animation event listeners listening for `enter` on the given element and its children + * $animate.off('enter', container); + * + * // remove the event listener function provided by `callback` that is set + * // to listen for `enter` on the given `container` as well as its children + * $animate.off('enter', container, callback); + * ``` + * + * @param {string} event the animation event (e.g. enter, leave, move, addClass, removeClass, etc...) + * @param {DOMElement=} container the container element the event listener was placed on + * @param {Function=} callback the callback function that was registered as the listener + */ + off: $$animateQueue.off, + + /** + * @ngdoc method + * @name $animate#pin + * @kind function + * @description Associates the provided element with a host parent element to allow the element to be animated even if it exists + * outside of the DOM structure of the Angular application. By doing so, any animation triggered via `$animate` can be issued on the + * element despite being outside the realm of the application or within another application. Say for example if the application + * was bootstrapped on an element that is somewhere inside of the `` tag, but we wanted to allow for an element to be situated + * as a direct child of `document.body`, then this can be achieved by pinning the element via `$animate.pin(element)`. Keep in mind + * that calling `$animate.pin(element, parentElement)` will not actually insert into the DOM anywhere; it will just create the association. + * + * Note that this feature is only active when the `ngAnimate` module is used. + * + * @param {DOMElement} element the external element that will be pinned + * @param {DOMElement} parentElement the host parent element that will be associated with the external element + */ + pin: $$animateQueue.pin, + + /** + * + * @ngdoc method + * @name $animate#enabled + * @kind function + * @description Used to get and set whether animations are enabled or not on the entire application or on an element and its children. This + * function can be called in four ways: + * + * ```js + * // returns true or false + * $animate.enabled(); + * + * // changes the enabled state for all animations + * $animate.enabled(false); + * $animate.enabled(true); + * + * // returns true or false if animations are enabled for an element + * $animate.enabled(element); + * + * // changes the enabled state for an element and its children + * $animate.enabled(element, true); + * $animate.enabled(element, false); + * ``` + * + * @param {DOMElement=} element the element that will be considered for checking/setting the enabled state + * @param {boolean=} enabled whether or not the animations will be enabled for the element + * + * @return {boolean} whether or not animations are enabled + */ + enabled: $$animateQueue.enabled, + + /** + * @ngdoc method + * @name $animate#cancel + * @kind function + * @description Cancels the provided animation. + * + * @param {Promise} animationPromise The animation promise that is returned when an animation is started. + */ + cancel: function(runner) { + runner.end && runner.end(); + }, + + /** + * + * @ngdoc method + * @name $animate#enter + * @kind function + * @description Inserts the element into the DOM either after the `after` element (if provided) or + * as the first child within the `parent` element and then triggers an animation. + * A promise is returned that will be resolved during the next digest once the animation + * has completed. + * + * @param {DOMElement} element the element which will be inserted into the DOM + * @param {DOMElement} parent the parent element which will append the element as + * a child (so long as the after element is not present) + * @param {DOMElement=} after the sibling element after which the element will be appended + * @param {object=} options an optional collection of options/styles that will be applied to the element + * + * @return {Promise} the animation callback promise + */ + enter: function(element, parent, after, options) { + parent = parent && jqLite(parent); + after = after && jqLite(after); + parent = parent || after.parent(); + domInsert(element, parent, after); + return $$animateQueue.push(element, 'enter', prepareAnimateOptions(options)); + }, + + /** + * + * @ngdoc method + * @name $animate#move + * @kind function + * @description Inserts (moves) the element into its new position in the DOM either after + * the `after` element (if provided) or as the first child within the `parent` element + * and then triggers an animation. A promise is returned that will be resolved + * during the next digest once the animation has completed. + * + * @param {DOMElement} element the element which will be moved into the new DOM position + * @param {DOMElement} parent the parent element which will append the element as + * a child (so long as the after element is not present) + * @param {DOMElement=} after the sibling element after which the element will be appended + * @param {object=} options an optional collection of options/styles that will be applied to the element + * + * @return {Promise} the animation callback promise + */ + move: function(element, parent, after, options) { + parent = parent && jqLite(parent); + after = after && jqLite(after); + parent = parent || after.parent(); + domInsert(element, parent, after); + return $$animateQueue.push(element, 'move', prepareAnimateOptions(options)); + }, + + /** + * @ngdoc method + * @name $animate#leave + * @kind function + * @description Triggers an animation and then removes the element from the DOM. + * When the function is called a promise is returned that will be resolved during the next + * digest once the animation has completed. + * + * @param {DOMElement} element the element which will be removed from the DOM + * @param {object=} options an optional collection of options/styles that will be applied to the element + * + * @return {Promise} the animation callback promise + */ + leave: function(element, options) { + return $$animateQueue.push(element, 'leave', prepareAnimateOptions(options), function() { + element.remove(); + }); + }, + + /** + * @ngdoc method + * @name $animate#addClass + * @kind function + * + * @description Triggers an addClass animation surrounding the addition of the provided CSS class(es). Upon + * execution, the addClass operation will only be handled after the next digest and it will not trigger an + * animation if element already contains the CSS class or if the class is removed at a later step. + * Note that class-based animations are treated differently compared to structural animations + * (like enter, move and leave) since the CSS classes may be added/removed at different points + * depending if CSS or JavaScript animations are used. + * + * @param {DOMElement} element the element which the CSS classes will be applied to + * @param {string} className the CSS class(es) that will be added (multiple classes are separated via spaces) + * @param {object=} options an optional collection of options/styles that will be applied to the element + * + * @return {Promise} the animation callback promise + */ + addClass: function(element, className, options) { + options = prepareAnimateOptions(options); + options.addClass = mergeClasses(options.addclass, className); + return $$animateQueue.push(element, 'addClass', options); + }, + + /** + * @ngdoc method + * @name $animate#removeClass + * @kind function + * + * @description Triggers a removeClass animation surrounding the removal of the provided CSS class(es). Upon + * execution, the removeClass operation will only be handled after the next digest and it will not trigger an + * animation if element does not contain the CSS class or if the class is added at a later step. + * Note that class-based animations are treated differently compared to structural animations + * (like enter, move and leave) since the CSS classes may be added/removed at different points + * depending if CSS or JavaScript animations are used. + * + * @param {DOMElement} element the element which the CSS classes will be applied to + * @param {string} className the CSS class(es) that will be removed (multiple classes are separated via spaces) + * @param {object=} options an optional collection of options/styles that will be applied to the element + * + * @return {Promise} the animation callback promise + */ + removeClass: function(element, className, options) { + options = prepareAnimateOptions(options); + options.removeClass = mergeClasses(options.removeClass, className); + return $$animateQueue.push(element, 'removeClass', options); + }, + + /** + * @ngdoc method + * @name $animate#setClass + * @kind function + * + * @description Performs both the addition and removal of a CSS classes on an element and (during the process) + * triggers an animation surrounding the class addition/removal. Much like `$animate.addClass` and + * `$animate.removeClass`, `setClass` will only evaluate the classes being added/removed once a digest has + * passed. Note that class-based animations are treated differently compared to structural animations + * (like enter, move and leave) since the CSS classes may be added/removed at different points + * depending if CSS or JavaScript animations are used. + * + * @param {DOMElement} element the element which the CSS classes will be applied to + * @param {string} add the CSS class(es) that will be added (multiple classes are separated via spaces) + * @param {string} remove the CSS class(es) that will be removed (multiple classes are separated via spaces) + * @param {object=} options an optional collection of options/styles that will be applied to the element + * + * @return {Promise} the animation callback promise + */ + setClass: function(element, add, remove, options) { + options = prepareAnimateOptions(options); + options.addClass = mergeClasses(options.addClass, add); + options.removeClass = mergeClasses(options.removeClass, remove); + return $$animateQueue.push(element, 'setClass', options); + }, + + /** + * @ngdoc method + * @name $animate#animate + * @kind function + * + * @description Performs an inline animation on the element which applies the provided to and from CSS styles to the element. + * If any detected CSS transition, keyframe or JavaScript matches the provided className value, then the animation will take + * on the provided styles. For example, if a transition animation is set for the given classNamem, then the provided `from` and + * `to` styles will be applied alongside the given transition. If the CSS style provided in `from` does not have a corresponding + * style in `to`, the style in `from` is applied immediately, and no animation is run. + * If a JavaScript animation is detected then the provided styles will be given in as function parameters into the `animate` + * method (or as part of the `options` parameter): + * + * ```js + * ngModule.animation('.my-inline-animation', function() { + * return { + * animate : function(element, from, to, done, options) { + * //animation + * done(); + * } + * } + * }); + * ``` + * + * @param {DOMElement} element the element which the CSS styles will be applied to + * @param {object} from the from (starting) CSS styles that will be applied to the element and across the animation. + * @param {object} to the to (destination) CSS styles that will be applied to the element and across the animation. + * @param {string=} className an optional CSS class that will be applied to the element for the duration of the animation. If + * this value is left as empty then a CSS class of `ng-inline-animate` will be applied to the element. + * (Note that if no animation is detected then this value will not be applied to the element.) + * @param {object=} options an optional collection of options/styles that will be applied to the element + * + * @return {Promise} the animation callback promise + */ + animate: function(element, from, to, className, options) { + options = prepareAnimateOptions(options); + options.from = options.from ? extend(options.from, from) : from; + options.to = options.to ? extend(options.to, to) : to; + + className = className || 'ng-inline-animate'; + options.tempClasses = mergeClasses(options.tempClasses, className); + return $$animateQueue.push(element, 'animate', options); + } + }; + }]; +}]; + +var $$AnimateAsyncRunFactoryProvider = function() { + this.$get = ['$$rAF', function($$rAF) { + var waitQueue = []; + + function waitForTick(fn) { + waitQueue.push(fn); + if (waitQueue.length > 1) return; + $$rAF(function() { + for (var i = 0; i < waitQueue.length; i++) { + waitQueue[i](); + } + waitQueue = []; + }); + } + + return function() { + var passed = false; + waitForTick(function() { + passed = true; + }); + return function(callback) { + passed ? callback() : waitForTick(callback); + }; + }; + }]; +}; + +var $$AnimateRunnerFactoryProvider = function() { + this.$get = ['$q', '$sniffer', '$$animateAsyncRun', '$document', '$timeout', + function($q, $sniffer, $$animateAsyncRun, $document, $timeout) { + + var INITIAL_STATE = 0; + var DONE_PENDING_STATE = 1; + var DONE_COMPLETE_STATE = 2; + + AnimateRunner.chain = function(chain, callback) { + var index = 0; + + next(); + function next() { + if (index === chain.length) { + callback(true); + return; + } + + chain[index](function(response) { + if (response === false) { + callback(false); + return; + } + index++; + next(); + }); + } + }; + + AnimateRunner.all = function(runners, callback) { + var count = 0; + var status = true; + forEach(runners, function(runner) { + runner.done(onProgress); + }); + + function onProgress(response) { + status = status && response; + if (++count === runners.length) { + callback(status); + } + } + }; + + function AnimateRunner(host) { + this.setHost(host); + + var rafTick = $$animateAsyncRun(); + var timeoutTick = function(fn) { + $timeout(fn, 0, false); + }; + + this._doneCallbacks = []; + this._tick = function(fn) { + var doc = $document[0]; + + // the document may not be ready or attached + // to the module for some internal tests + if (doc && doc.hidden) { + timeoutTick(fn); + } else { + rafTick(fn); + } + }; + this._state = 0; + } + + AnimateRunner.prototype = { + setHost: function(host) { + this.host = host || {}; + }, + + done: function(fn) { + if (this._state === DONE_COMPLETE_STATE) { + fn(); + } else { + this._doneCallbacks.push(fn); + } + }, + + progress: noop, + + getPromise: function() { + if (!this.promise) { + var self = this; + this.promise = $q(function(resolve, reject) { + self.done(function(status) { + status === false ? reject() : resolve(); + }); + }); + } + return this.promise; + }, + + then: function(resolveHandler, rejectHandler) { + return this.getPromise().then(resolveHandler, rejectHandler); + }, + + 'catch': function(handler) { + return this.getPromise()['catch'](handler); + }, + + 'finally': function(handler) { + return this.getPromise()['finally'](handler); + }, + + pause: function() { + if (this.host.pause) { + this.host.pause(); + } + }, + + resume: function() { + if (this.host.resume) { + this.host.resume(); + } + }, + + end: function() { + if (this.host.end) { + this.host.end(); + } + this._resolve(true); + }, + + cancel: function() { + if (this.host.cancel) { + this.host.cancel(); + } + this._resolve(false); + }, + + complete: function(response) { + var self = this; + if (self._state === INITIAL_STATE) { + self._state = DONE_PENDING_STATE; + self._tick(function() { + self._resolve(response); + }); + } + }, + + _resolve: function(response) { + if (this._state !== DONE_COMPLETE_STATE) { + forEach(this._doneCallbacks, function(fn) { + fn(response); + }); + this._doneCallbacks.length = 0; + this._state = DONE_COMPLETE_STATE; + } + } + }; + + return AnimateRunner; + }]; +}; + +/** + * @ngdoc service + * @name $animateCss + * @kind object + * + * @description + * This is the core version of `$animateCss`. By default, only when the `ngAnimate` is included, + * then the `$animateCss` service will actually perform animations. + * + * Click here {@link ngAnimate.$animateCss to read the documentation for $animateCss}. + */ +var $CoreAnimateCssProvider = function() { + this.$get = ['$$rAF', '$q', '$$AnimateRunner', function($$rAF, $q, $$AnimateRunner) { + + return function(element, initialOptions) { + // all of the animation functions should create + // a copy of the options data, however, if a + // parent service has already created a copy then + // we should stick to using that + var options = initialOptions || {}; + if (!options.$$prepared) { + options = copy(options); + } + + // there is no point in applying the styles since + // there is no animation that goes on at all in + // this version of $animateCss. + if (options.cleanupStyles) { + options.from = options.to = null; + } + + if (options.from) { + element.css(options.from); + options.from = null; + } + + /* jshint newcap: false */ + var closed, runner = new $$AnimateRunner(); + return { + start: run, + end: run + }; + + function run() { + $$rAF(function() { + applyAnimationContents(); + if (!closed) { + runner.complete(); + } + closed = true; + }); + return runner; + } + + function applyAnimationContents() { + if (options.addClass) { + element.addClass(options.addClass); + options.addClass = null; + } + if (options.removeClass) { + element.removeClass(options.removeClass); + options.removeClass = null; + } + if (options.to) { + element.css(options.to); + options.to = null; + } + } + }; + }]; +}; + +/* global stripHash: true */ + +/** + * ! This is a private undocumented service ! + * + * @name $browser + * @requires $log + * @description + * This object has two goals: + * + * - hide all the global state in the browser caused by the window object + * - abstract away all the browser specific features and inconsistencies + * + * For tests we provide {@link ngMock.$browser mock implementation} of the `$browser` + * service, which can be used for convenient testing of the application without the interaction with + * the real browser apis. + */ +/** + * @param {object} window The global window object. + * @param {object} document jQuery wrapped document. + * @param {object} $log window.console or an object with the same interface. + * @param {object} $sniffer $sniffer service + */ +function Browser(window, document, $log, $sniffer) { + var self = this, + location = window.location, + history = window.history, + setTimeout = window.setTimeout, + clearTimeout = window.clearTimeout, + pendingDeferIds = {}; + + self.isMock = false; + + var outstandingRequestCount = 0; + var outstandingRequestCallbacks = []; + + // TODO(vojta): remove this temporary api + self.$$completeOutstandingRequest = completeOutstandingRequest; + self.$$incOutstandingRequestCount = function() { outstandingRequestCount++; }; + + /** + * Executes the `fn` function(supports currying) and decrements the `outstandingRequestCallbacks` + * counter. If the counter reaches 0, all the `outstandingRequestCallbacks` are executed. + */ + function completeOutstandingRequest(fn) { + try { + fn.apply(null, sliceArgs(arguments, 1)); + } finally { + outstandingRequestCount--; + if (outstandingRequestCount === 0) { + while (outstandingRequestCallbacks.length) { + try { + outstandingRequestCallbacks.pop()(); + } catch (e) { + $log.error(e); + } + } + } + } + } + + function getHash(url) { + var index = url.indexOf('#'); + return index === -1 ? '' : url.substr(index); + } + + /** + * @private + * Note: this method is used only by scenario runner + * TODO(vojta): prefix this method with $$ ? + * @param {function()} callback Function that will be called when no outstanding request + */ + self.notifyWhenNoOutstandingRequests = function(callback) { + if (outstandingRequestCount === 0) { + callback(); + } else { + outstandingRequestCallbacks.push(callback); + } + }; + + ////////////////////////////////////////////////////////////// + // URL API + ////////////////////////////////////////////////////////////// + + var cachedState, lastHistoryState, + lastBrowserUrl = location.href, + baseElement = document.find('base'), + pendingLocation = null, + getCurrentState = !$sniffer.history ? noop : function getCurrentState() { + try { + return history.state; + } catch (e) { + // MSIE can reportedly throw when there is no state (UNCONFIRMED). + } + }; + + cacheState(); + lastHistoryState = cachedState; + + /** + * @name $browser#url + * + * @description + * GETTER: + * Without any argument, this method just returns current value of location.href. + * + * SETTER: + * With at least one argument, this method sets url to new value. + * If html5 history api supported, pushState/replaceState is used, otherwise + * location.href/location.replace is used. + * Returns its own instance to allow chaining + * + * NOTE: this api is intended for use only by the $location service. Please use the + * {@link ng.$location $location service} to change url. + * + * @param {string} url New url (when used as setter) + * @param {boolean=} replace Should new url replace current history record? + * @param {object=} state object to use with pushState/replaceState + */ + self.url = function(url, replace, state) { + // In modern browsers `history.state` is `null` by default; treating it separately + // from `undefined` would cause `$browser.url('/foo')` to change `history.state` + // to undefined via `pushState`. Instead, let's change `undefined` to `null` here. + if (isUndefined(state)) { + state = null; + } + + // Android Browser BFCache causes location, history reference to become stale. + if (location !== window.location) location = window.location; + if (history !== window.history) history = window.history; + + // setter + if (url) { + var sameState = lastHistoryState === state; + + // Don't change anything if previous and current URLs and states match. This also prevents + // IE<10 from getting into redirect loop when in LocationHashbangInHtml5Url mode. + // See https://github.com/angular/angular.js/commit/ffb2701 + if (lastBrowserUrl === url && (!$sniffer.history || sameState)) { + return self; + } + var sameBase = lastBrowserUrl && stripHash(lastBrowserUrl) === stripHash(url); + lastBrowserUrl = url; + lastHistoryState = state; + // Don't use history API if only the hash changed + // due to a bug in IE10/IE11 which leads + // to not firing a `hashchange` nor `popstate` event + // in some cases (see #9143). + if ($sniffer.history && (!sameBase || !sameState)) { + history[replace ? 'replaceState' : 'pushState'](state, '', url); + cacheState(); + // Do the assignment again so that those two variables are referentially identical. + lastHistoryState = cachedState; + } else { + if (!sameBase || pendingLocation) { + pendingLocation = url; + } + if (replace) { + location.replace(url); + } else if (!sameBase) { + location.href = url; + } else { + location.hash = getHash(url); + } + if (location.href !== url) { + pendingLocation = url; + } + } + return self; + // getter + } else { + // - pendingLocation is needed as browsers don't allow to read out + // the new location.href if a reload happened or if there is a bug like in iOS 9 (see + // https://openradar.appspot.com/22186109). + // - the replacement is a workaround for https://bugzilla.mozilla.org/show_bug.cgi?id=407172 + return pendingLocation || location.href.replace(/%27/g,"'"); + } + }; + + /** + * @name $browser#state + * + * @description + * This method is a getter. + * + * Return history.state or null if history.state is undefined. + * + * @returns {object} state + */ + self.state = function() { + return cachedState; + }; + + var urlChangeListeners = [], + urlChangeInit = false; + + function cacheStateAndFireUrlChange() { + pendingLocation = null; + cacheState(); + fireUrlChange(); + } + + // This variable should be used *only* inside the cacheState function. + var lastCachedState = null; + function cacheState() { + // This should be the only place in $browser where `history.state` is read. + cachedState = getCurrentState(); + cachedState = isUndefined(cachedState) ? null : cachedState; + + // Prevent callbacks fo fire twice if both hashchange & popstate were fired. + if (equals(cachedState, lastCachedState)) { + cachedState = lastCachedState; + } + lastCachedState = cachedState; + } + + function fireUrlChange() { + if (lastBrowserUrl === self.url() && lastHistoryState === cachedState) { + return; + } + + lastBrowserUrl = self.url(); + lastHistoryState = cachedState; + forEach(urlChangeListeners, function(listener) { + listener(self.url(), cachedState); + }); + } + + /** + * @name $browser#onUrlChange + * + * @description + * Register callback function that will be called, when url changes. + * + * It's only called when the url is changed from outside of angular: + * - user types different url into address bar + * - user clicks on history (forward/back) button + * - user clicks on a link + * + * It's not called when url is changed by $browser.url() method + * + * The listener gets called with new url as parameter. + * + * NOTE: this api is intended for use only by the $location service. Please use the + * {@link ng.$location $location service} to monitor url changes in angular apps. + * + * @param {function(string)} listener Listener function to be called when url changes. + * @return {function(string)} Returns the registered listener fn - handy if the fn is anonymous. + */ + self.onUrlChange = function(callback) { + // TODO(vojta): refactor to use node's syntax for events + if (!urlChangeInit) { + // We listen on both (hashchange/popstate) when available, as some browsers (e.g. Opera) + // don't fire popstate when user change the address bar and don't fire hashchange when url + // changed by push/replaceState + + // html5 history api - popstate event + if ($sniffer.history) jqLite(window).on('popstate', cacheStateAndFireUrlChange); + // hashchange event + jqLite(window).on('hashchange', cacheStateAndFireUrlChange); + + urlChangeInit = true; + } + + urlChangeListeners.push(callback); + return callback; + }; + + /** + * @private + * Remove popstate and hashchange handler from window. + * + * NOTE: this api is intended for use only by $rootScope. + */ + self.$$applicationDestroyed = function() { + jqLite(window).off('hashchange popstate', cacheStateAndFireUrlChange); + }; + + /** + * Checks whether the url has changed outside of Angular. + * Needs to be exported to be able to check for changes that have been done in sync, + * as hashchange/popstate events fire in async. + */ + self.$$checkUrlChange = fireUrlChange; + + ////////////////////////////////////////////////////////////// + // Misc API + ////////////////////////////////////////////////////////////// + + /** + * @name $browser#baseHref + * + * @description + * Returns current + * (always relative - without domain) + * + * @returns {string} The current base href + */ + self.baseHref = function() { + var href = baseElement.attr('href'); + return href ? href.replace(/^(https?\:)?\/\/[^\/]*/, '') : ''; + }; + + /** + * @name $browser#defer + * @param {function()} fn A function, who's execution should be deferred. + * @param {number=} [delay=0] of milliseconds to defer the function execution. + * @returns {*} DeferId that can be used to cancel the task via `$browser.defer.cancel()`. + * + * @description + * Executes a fn asynchronously via `setTimeout(fn, delay)`. + * + * Unlike when calling `setTimeout` directly, in test this function is mocked and instead of using + * `setTimeout` in tests, the fns are queued in an array, which can be programmatically flushed + * via `$browser.defer.flush()`. + * + */ + self.defer = function(fn, delay) { + var timeoutId; + outstandingRequestCount++; + timeoutId = setTimeout(function() { + delete pendingDeferIds[timeoutId]; + completeOutstandingRequest(fn); + }, delay || 0); + pendingDeferIds[timeoutId] = true; + return timeoutId; + }; + + + /** + * @name $browser#defer.cancel + * + * @description + * Cancels a deferred task identified with `deferId`. + * + * @param {*} deferId Token returned by the `$browser.defer` function. + * @returns {boolean} Returns `true` if the task hasn't executed yet and was successfully + * canceled. + */ + self.defer.cancel = function(deferId) { + if (pendingDeferIds[deferId]) { + delete pendingDeferIds[deferId]; + clearTimeout(deferId); + completeOutstandingRequest(noop); + return true; + } + return false; + }; + +} + +function $BrowserProvider() { + this.$get = ['$window', '$log', '$sniffer', '$document', + function($window, $log, $sniffer, $document) { + return new Browser($window, $document, $log, $sniffer); + }]; +} + +/** + * @ngdoc service + * @name $cacheFactory + * + * @description + * Factory that constructs {@link $cacheFactory.Cache Cache} objects and gives access to + * them. + * + * ```js + * + * var cache = $cacheFactory('cacheId'); + * expect($cacheFactory.get('cacheId')).toBe(cache); + * expect($cacheFactory.get('noSuchCacheId')).not.toBeDefined(); + * + * cache.put("key", "value"); + * cache.put("another key", "another value"); + * + * // We've specified no options on creation + * expect(cache.info()).toEqual({id: 'cacheId', size: 2}); + * + * ``` + * + * + * @param {string} cacheId Name or id of the newly created cache. + * @param {object=} options Options object that specifies the cache behavior. Properties: + * + * - `{number=}` `capacity` — turns the cache into LRU cache. + * + * @returns {object} Newly created cache object with the following set of methods: + * + * - `{object}` `info()` — Returns id, size, and options of cache. + * - `{{*}}` `put({string} key, {*} value)` — Puts a new key-value pair into the cache and returns + * it. + * - `{{*}}` `get({string} key)` — Returns cached value for `key` or undefined for cache miss. + * - `{void}` `remove({string} key)` — Removes a key-value pair from the cache. + * - `{void}` `removeAll()` — Removes all cached values. + * - `{void}` `destroy()` — Removes references to this cache from $cacheFactory. + * + * @example + + +
+ + + + +

Cached Values

+
+ + : + +
+ +

Cache Info

+
+ + : + +
+
+
+ + angular.module('cacheExampleApp', []). + controller('CacheController', ['$scope', '$cacheFactory', function($scope, $cacheFactory) { + $scope.keys = []; + $scope.cache = $cacheFactory('cacheId'); + $scope.put = function(key, value) { + if (angular.isUndefined($scope.cache.get(key))) { + $scope.keys.push(key); + } + $scope.cache.put(key, angular.isUndefined(value) ? null : value); + }; + }]); + + + p { + margin: 10px 0 3px; + } + +
+ */ +function $CacheFactoryProvider() { + + this.$get = function() { + var caches = {}; + + function cacheFactory(cacheId, options) { + if (cacheId in caches) { + throw minErr('$cacheFactory')('iid', "CacheId '{0}' is already taken!", cacheId); + } + + var size = 0, + stats = extend({}, options, {id: cacheId}), + data = createMap(), + capacity = (options && options.capacity) || Number.MAX_VALUE, + lruHash = createMap(), + freshEnd = null, + staleEnd = null; + + /** + * @ngdoc type + * @name $cacheFactory.Cache + * + * @description + * A cache object used to store and retrieve data, primarily used by + * {@link $http $http} and the {@link ng.directive:script script} directive to cache + * templates and other data. + * + * ```js + * angular.module('superCache') + * .factory('superCache', ['$cacheFactory', function($cacheFactory) { + * return $cacheFactory('super-cache'); + * }]); + * ``` + * + * Example test: + * + * ```js + * it('should behave like a cache', inject(function(superCache) { + * superCache.put('key', 'value'); + * superCache.put('another key', 'another value'); + * + * expect(superCache.info()).toEqual({ + * id: 'super-cache', + * size: 2 + * }); + * + * superCache.remove('another key'); + * expect(superCache.get('another key')).toBeUndefined(); + * + * superCache.removeAll(); + * expect(superCache.info()).toEqual({ + * id: 'super-cache', + * size: 0 + * }); + * })); + * ``` + */ + return caches[cacheId] = { + + /** + * @ngdoc method + * @name $cacheFactory.Cache#put + * @kind function + * + * @description + * Inserts a named entry into the {@link $cacheFactory.Cache Cache} object to be + * retrieved later, and incrementing the size of the cache if the key was not already + * present in the cache. If behaving like an LRU cache, it will also remove stale + * entries from the set. + * + * It will not insert undefined values into the cache. + * + * @param {string} key the key under which the cached data is stored. + * @param {*} value the value to store alongside the key. If it is undefined, the key + * will not be stored. + * @returns {*} the value stored. + */ + put: function(key, value) { + if (isUndefined(value)) return; + if (capacity < Number.MAX_VALUE) { + var lruEntry = lruHash[key] || (lruHash[key] = {key: key}); + + refresh(lruEntry); + } + + if (!(key in data)) size++; + data[key] = value; + + if (size > capacity) { + this.remove(staleEnd.key); + } + + return value; + }, + + /** + * @ngdoc method + * @name $cacheFactory.Cache#get + * @kind function + * + * @description + * Retrieves named data stored in the {@link $cacheFactory.Cache Cache} object. + * + * @param {string} key the key of the data to be retrieved + * @returns {*} the value stored. + */ + get: function(key) { + if (capacity < Number.MAX_VALUE) { + var lruEntry = lruHash[key]; + + if (!lruEntry) return; + + refresh(lruEntry); + } + + return data[key]; + }, + + + /** + * @ngdoc method + * @name $cacheFactory.Cache#remove + * @kind function + * + * @description + * Removes an entry from the {@link $cacheFactory.Cache Cache} object. + * + * @param {string} key the key of the entry to be removed + */ + remove: function(key) { + if (capacity < Number.MAX_VALUE) { + var lruEntry = lruHash[key]; + + if (!lruEntry) return; + + if (lruEntry == freshEnd) freshEnd = lruEntry.p; + if (lruEntry == staleEnd) staleEnd = lruEntry.n; + link(lruEntry.n,lruEntry.p); + + delete lruHash[key]; + } + + if (!(key in data)) return; + + delete data[key]; + size--; + }, + + + /** + * @ngdoc method + * @name $cacheFactory.Cache#removeAll + * @kind function + * + * @description + * Clears the cache object of any entries. + */ + removeAll: function() { + data = createMap(); + size = 0; + lruHash = createMap(); + freshEnd = staleEnd = null; + }, + + + /** + * @ngdoc method + * @name $cacheFactory.Cache#destroy + * @kind function + * + * @description + * Destroys the {@link $cacheFactory.Cache Cache} object entirely, + * removing it from the {@link $cacheFactory $cacheFactory} set. + */ + destroy: function() { + data = null; + stats = null; + lruHash = null; + delete caches[cacheId]; + }, + + + /** + * @ngdoc method + * @name $cacheFactory.Cache#info + * @kind function + * + * @description + * Retrieve information regarding a particular {@link $cacheFactory.Cache Cache}. + * + * @returns {object} an object with the following properties: + *
    + *
  • **id**: the id of the cache instance
  • + *
  • **size**: the number of entries kept in the cache instance
  • + *
  • **...**: any additional properties from the options object when creating the + * cache.
  • + *
+ */ + info: function() { + return extend({}, stats, {size: size}); + } + }; + + + /** + * makes the `entry` the freshEnd of the LRU linked list + */ + function refresh(entry) { + if (entry != freshEnd) { + if (!staleEnd) { + staleEnd = entry; + } else if (staleEnd == entry) { + staleEnd = entry.n; + } + + link(entry.n, entry.p); + link(entry, freshEnd); + freshEnd = entry; + freshEnd.n = null; + } + } + + + /** + * bidirectionally links two entries of the LRU linked list + */ + function link(nextEntry, prevEntry) { + if (nextEntry != prevEntry) { + if (nextEntry) nextEntry.p = prevEntry; //p stands for previous, 'prev' didn't minify + if (prevEntry) prevEntry.n = nextEntry; //n stands for next, 'next' didn't minify + } + } + } + + + /** + * @ngdoc method + * @name $cacheFactory#info + * + * @description + * Get information about all the caches that have been created + * + * @returns {Object} - key-value map of `cacheId` to the result of calling `cache#info` + */ + cacheFactory.info = function() { + var info = {}; + forEach(caches, function(cache, cacheId) { + info[cacheId] = cache.info(); + }); + return info; + }; + + + /** + * @ngdoc method + * @name $cacheFactory#get + * + * @description + * Get access to a cache object by the `cacheId` used when it was created. + * + * @param {string} cacheId Name or id of a cache to access. + * @returns {object} Cache object identified by the cacheId or undefined if no such cache. + */ + cacheFactory.get = function(cacheId) { + return caches[cacheId]; + }; + + + return cacheFactory; + }; +} + +/** + * @ngdoc service + * @name $templateCache + * + * @description + * The first time a template is used, it is loaded in the template cache for quick retrieval. You + * can load templates directly into the cache in a `script` tag, or by consuming the + * `$templateCache` service directly. + * + * Adding via the `script` tag: + * + * ```html + * + * ``` + * + * **Note:** the `script` tag containing the template does not need to be included in the `head` of + * the document, but it must be a descendent of the {@link ng.$rootElement $rootElement} (IE, + * element with ng-app attribute), otherwise the template will be ignored. + * + * Adding via the `$templateCache` service: + * + * ```js + * var myApp = angular.module('myApp', []); + * myApp.run(function($templateCache) { + * $templateCache.put('templateId.html', 'This is the content of the template'); + * }); + * ``` + * + * To retrieve the template later, simply use it in your HTML: + * ```html + *
+ * ``` + * + * or get it via Javascript: + * ```js + * $templateCache.get('templateId.html') + * ``` + * + * See {@link ng.$cacheFactory $cacheFactory}. + * + */ +function $TemplateCacheProvider() { + this.$get = ['$cacheFactory', function($cacheFactory) { + return $cacheFactory('templates'); + }]; +} + +/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * + * Any commits to this file should be reviewed with security in mind. * + * Changes to this file can potentially create security vulnerabilities. * + * An approval from 2 Core members with history of modifying * + * this file is required. * + * * + * Does the change somehow allow for arbitrary javascript to be executed? * + * Or allows for someone to change the prototype of built-in objects? * + * Or gives undesired access to variables likes document or window? * + * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ + +/* ! VARIABLE/FUNCTION NAMING CONVENTIONS THAT APPLY TO THIS FILE! + * + * DOM-related variables: + * + * - "node" - DOM Node + * - "element" - DOM Element or Node + * - "$node" or "$element" - jqLite-wrapped node or element + * + * + * Compiler related stuff: + * + * - "linkFn" - linking fn of a single directive + * - "nodeLinkFn" - function that aggregates all linking fns for a particular node + * - "childLinkFn" - function that aggregates all linking fns for child nodes of a particular node + * - "compositeLinkFn" - function that aggregates all linking fns for a compilation root (nodeList) + */ + + +/** + * @ngdoc service + * @name $compile + * @kind function + * + * @description + * Compiles an HTML string or DOM into a template and produces a template function, which + * can then be used to link {@link ng.$rootScope.Scope `scope`} and the template together. + * + * The compilation is a process of walking the DOM tree and matching DOM elements to + * {@link ng.$compileProvider#directive directives}. + * + *
+ * **Note:** This document is an in-depth reference of all directive options. + * For a gentle introduction to directives with examples of common use cases, + * see the {@link guide/directive directive guide}. + *
+ * + * ## Comprehensive Directive API + * + * There are many different options for a directive. + * + * The difference resides in the return value of the factory function. + * You can either return a "Directive Definition Object" (see below) that defines the directive properties, + * or just the `postLink` function (all other properties will have the default values). + * + *
+ * **Best Practice:** It's recommended to use the "directive definition object" form. + *
+ * + * Here's an example directive declared with a Directive Definition Object: + * + * ```js + * var myModule = angular.module(...); + * + * myModule.directive('directiveName', function factory(injectables) { + * var directiveDefinitionObject = { + * priority: 0, + * template: '
', // or // function(tElement, tAttrs) { ... }, + * // or + * // templateUrl: 'directive.html', // or // function(tElement, tAttrs) { ... }, + * transclude: false, + * restrict: 'A', + * templateNamespace: 'html', + * scope: false, + * controller: function($scope, $element, $attrs, $transclude, otherInjectables) { ... }, + * controllerAs: 'stringIdentifier', + * bindToController: false, + * require: 'siblingDirectiveName', // or // ['^parentDirectiveName', '?optionalDirectiveName', '?^optionalParent'], + * compile: function compile(tElement, tAttrs, transclude) { + * return { + * pre: function preLink(scope, iElement, iAttrs, controller) { ... }, + * post: function postLink(scope, iElement, iAttrs, controller) { ... } + * } + * // or + * // return function postLink( ... ) { ... } + * }, + * // or + * // link: { + * // pre: function preLink(scope, iElement, iAttrs, controller) { ... }, + * // post: function postLink(scope, iElement, iAttrs, controller) { ... } + * // } + * // or + * // link: function postLink( ... ) { ... } + * }; + * return directiveDefinitionObject; + * }); + * ``` + * + *
+ * **Note:** Any unspecified options will use the default value. You can see the default values below. + *
+ * + * Therefore the above can be simplified as: + * + * ```js + * var myModule = angular.module(...); + * + * myModule.directive('directiveName', function factory(injectables) { + * var directiveDefinitionObject = { + * link: function postLink(scope, iElement, iAttrs) { ... } + * }; + * return directiveDefinitionObject; + * // or + * // return function postLink(scope, iElement, iAttrs) { ... } + * }); + * ``` + * + * + * + * ### Directive Definition Object + * + * The directive definition object provides instructions to the {@link ng.$compile + * compiler}. The attributes are: + * + * #### `multiElement` + * When this property is set to true, the HTML compiler will collect DOM nodes between + * nodes with the attributes `directive-name-start` and `directive-name-end`, and group them + * together as the directive elements. It is recommended that this feature be used on directives + * which are not strictly behavioral (such as {@link ngClick}), and which + * do not manipulate or replace child nodes (such as {@link ngInclude}). + * + * #### `priority` + * When there are multiple directives defined on a single DOM element, sometimes it + * is necessary to specify the order in which the directives are applied. The `priority` is used + * to sort the directives before their `compile` functions get called. Priority is defined as a + * number. Directives with greater numerical `priority` are compiled first. Pre-link functions + * are also run in priority order, but post-link functions are run in reverse order. The order + * of directives with the same priority is undefined. The default priority is `0`. + * + * #### `terminal` + * If set to true then the current `priority` will be the last set of directives + * which will execute (any directives at the current priority will still execute + * as the order of execution on same `priority` is undefined). Note that expressions + * and other directives used in the directive's template will also be excluded from execution. + * + * #### `scope` + * The scope property can be `true`, an object or a falsy value: + * + * * **falsy:** No scope will be created for the directive. The directive will use its parent's scope. + * + * * **`true`:** A new child scope that prototypically inherits from its parent will be created for + * the directive's element. If multiple directives on the same element request a new scope, + * only one new scope is created. The new scope rule does not apply for the root of the template + * since the root of the template always gets a new scope. + * + * * **`{...}` (an object hash):** A new "isolate" scope is created for the directive's element. The + * 'isolate' scope differs from normal scope in that it does not prototypically inherit from its parent + * scope. This is useful when creating reusable components, which should not accidentally read or modify + * data in the parent scope. + * + * The 'isolate' scope object hash defines a set of local scope properties derived from attributes on the + * directive's element. These local properties are useful for aliasing values for templates. The keys in + * the object hash map to the name of the property on the isolate scope; the values define how the property + * is bound to the parent scope, via matching attributes on the directive's element: + * + * * `@` or `@attr` - bind a local scope property to the value of DOM attribute. The result is + * always a string since DOM attributes are strings. If no `attr` name is specified then the + * attribute name is assumed to be the same as the local name. Given `` and the isolate scope definition `scope: { localName:'@myAttr' }`, + * the directive's scope property `localName` will reflect the interpolated value of `hello + * {{name}}`. As the `name` attribute changes so will the `localName` property on the directive's + * scope. The `name` is read from the parent scope (not the directive's scope). + * + * * `=` or `=attr` - set up a bidirectional binding between a local scope property and an expression + * passed via the attribute `attr`. The expression is evaluated in the context of the parent scope. + * If no `attr` name is specified then the attribute name is assumed to be the same as the local + * name. Given `` and the isolate scope definition `scope: { + * localModel: '=myAttr' }`, the property `localModel` on the directive's scope will reflect the + * value of `parentModel` on the parent scope. Changes to `parentModel` will be reflected in + * `localModel` and vice versa. Optional attributes should be marked as such with a question mark: + * `=?` or `=?attr`. If the binding expression is non-assignable, or if the attribute isn't + * optional and doesn't exist, an exception ({@link error/$compile/nonassign `$compile:nonassign`}) + * will be thrown upon discovering changes to the local value, since it will be impossible to sync + * them back to the parent scope. By default, the {@link ng.$rootScope.Scope#$watch `$watch`} + * method is used for tracking changes, and the equality check is based on object identity. + * However, if an object literal or an array literal is passed as the binding expression, the + * equality check is done by value (using the {@link angular.equals} function). It's also possible + * to watch the evaluated value shallowly with {@link ng.$rootScope.Scope#$watchCollection + * `$watchCollection`}: use `=*` or `=*attr` (`=*?` or `=*?attr` if the attribute is optional). + * + * * `<` or `` and directive definition of + * `scope: { localModel:'` and the isolate scope definition `scope: { + * localFn:'&myAttr' }`, the isolate scope property `localFn` will point to a function wrapper for + * the `count = count + value` expression. Often it's desirable to pass data from the isolated scope + * via an expression to the parent scope. This can be done by passing a map of local variable names + * and values into the expression wrapper fn. For example, if the expression is `increment(amount)` + * then we can specify the amount value by calling the `localFn` as `localFn({amount: 22})`. + * + * In general it's possible to apply more than one directive to one element, but there might be limitations + * depending on the type of scope required by the directives. The following points will help explain these limitations. + * For simplicity only two directives are taken into account, but it is also applicable for several directives: + * + * * **no scope** + **no scope** => Two directives which don't require their own scope will use their parent's scope + * * **child scope** + **no scope** => Both directives will share one single child scope + * * **child scope** + **child scope** => Both directives will share one single child scope + * * **isolated scope** + **no scope** => The isolated directive will use it's own created isolated scope. The other directive will use + * its parent's scope + * * **isolated scope** + **child scope** => **Won't work!** Only one scope can be related to one element. Therefore these directives cannot + * be applied to the same element. + * * **isolated scope** + **isolated scope** => **Won't work!** Only one scope can be related to one element. Therefore these directives + * cannot be applied to the same element. + * + * + * #### `bindToController` + * This property is used to bind scope properties directly to the controller. It can be either + * `true` or an object hash with the same format as the `scope` property. Additionally, a controller + * alias must be set, either by using `controllerAs: 'myAlias'` or by specifying the alias in the controller + * definition: `controller: 'myCtrl as myAlias'`. + * + * When an isolate scope is used for a directive (see above), `bindToController: true` will + * allow a component to have its properties bound to the controller, rather than to scope. + * + * After the controller is instantiated, the initial values of the isolate scope bindings will be bound to the controller + * properties. You can access these bindings once they have been initialized by providing a controller method called + * `$onInit`, which is called after all the controllers on an element have been constructed and had their bindings + * initialized. + * + *
+ * **Deprecation warning:** although bindings for non-ES6 class controllers are currently + * bound to `this` before the controller constructor is called, this use is now deprecated. Please place initialization + * code that relies upon bindings inside a `$onInit` method on the controller, instead. + *
+ * + * It is also possible to set `bindToController` to an object hash with the same format as the `scope` property. + * This will set up the scope bindings to the controller directly. Note that `scope` can still be used + * to define which kind of scope is created. By default, no scope is created. Use `scope: {}` to create an isolate + * scope (useful for component directives). + * + * If both `bindToController` and `scope` are defined and have object hashes, `bindToController` overrides `scope`. + * + * + * #### `controller` + * Controller constructor function. The controller is instantiated before the + * pre-linking phase and can be accessed by other directives (see + * `require` attribute). This allows the directives to communicate with each other and augment + * each other's behavior. The controller is injectable (and supports bracket notation) with the following locals: + * + * * `$scope` - Current scope associated with the element + * * `$element` - Current element + * * `$attrs` - Current attributes object for the element + * * `$transclude` - A transclude linking function pre-bound to the correct transclusion scope: + * `function([scope], cloneLinkingFn, futureParentElement, slotName)`: + * * `scope`: (optional) override the scope. + * * `cloneLinkingFn`: (optional) argument to create clones of the original transcluded content. + * * `futureParentElement` (optional): + * * defines the parent to which the `cloneLinkingFn` will add the cloned elements. + * * default: `$element.parent()` resp. `$element` for `transclude:'element'` resp. `transclude:true`. + * * only needed for transcludes that are allowed to contain non html elements (e.g. SVG elements) + * and when the `cloneLinkinFn` is passed, + * as those elements need to created and cloned in a special way when they are defined outside their + * usual containers (e.g. like ``). + * * See also the `directive.templateNamespace` property. + * * `slotName`: (optional) the name of the slot to transclude. If falsy (e.g. `null`, `undefined` or `''`) + * then the default translusion is provided. + * The `$transclude` function also has a method on it, `$transclude.isSlotFilled(slotName)`, which returns + * `true` if the specified slot contains content (i.e. one or more DOM nodes). + * + * The controller can provide the following methods that act as life-cycle hooks: + * * `$onInit()` - Called on each controller after all the controllers on an element have been constructed and + * had their bindings initialized (and before the pre & post linking functions for the directives on + * this element). This is a good place to put initialization code for your controller. + * * `$onChanges(changesObj)` - Called whenever one-way (`<`) or interpolation (`@`) bindings are updated. The + * `changesObj` is a hash whose keys are the names of the bound properties that have changed, and the values are an + * object of the form `{ currentValue: ..., previousValue: ... }`. Use this hook to trigger updates within a component + * such as cloning the bound value to prevent accidental mutation of the outer value. + * * `$onDestroy()` - Called on a controller when its containing scope is destroyed. Use this hook for releasing + * external resources, watches and event handlers. Note that components have their `$onDestroy()` hooks called in + * the same order as the `$scope.$broadcast` events are triggered, which is top down. This means that parent + * components will have their `$onDestroy()` hook called before child components. + * * `$postLink()` - Called after this controller's element and its children have been linked. Similar to the post-link + * function this hook can be used to set up DOM event handlers and do direct DOM manipulation. + * Note that child elements that contain `templateUrl` directives will not have been compiled and linked since + * they are waiting for their template to load asynchronously and their own compilation and linking has been + * suspended until that occurs. + * + * + * #### `require` + * Require another directive and inject its controller as the fourth argument to the linking function. The + * `require` property can be a string, an array or an object: + * * a **string** containing the name of the directive to pass to the linking function + * * an **array** containing the names of directives to pass to the linking function. The argument passed to the + * linking function will be an array of controllers in the same order as the names in the `require` property + * * an **object** whose property values are the names of the directives to pass to the linking function. The argument + * passed to the linking function will also be an object with matching keys, whose values will hold the corresponding + * controllers. + * + * If the `require` property is an object and `bindToController` is truthy, then the required controllers are + * bound to the controller using the keys of the `require` property. This binding occurs after all the controllers + * have been constructed but before `$onInit` is called. + * See the {@link $compileProvider#component} helper for an example of how this can be used. + * + * If no such required directive(s) can be found, or if the directive does not have a controller, then an error is + * raised (unless no link function is specified and the required controllers are not being bound to the directive + * controller, in which case error checking is skipped). The name can be prefixed with: + * + * * (no prefix) - Locate the required controller on the current element. Throw an error if not found. + * * `?` - Attempt to locate the required controller or pass `null` to the `link` fn if not found. + * * `^` - Locate the required controller by searching the element and its parents. Throw an error if not found. + * * `^^` - Locate the required controller by searching the element's parents. Throw an error if not found. + * * `?^` - Attempt to locate the required controller by searching the element and its parents or pass + * `null` to the `link` fn if not found. + * * `?^^` - Attempt to locate the required controller by searching the element's parents, or pass + * `null` to the `link` fn if not found. + * + * + * #### `controllerAs` + * Identifier name for a reference to the controller in the directive's scope. + * This allows the controller to be referenced from the directive template. This is especially + * useful when a directive is used as component, i.e. with an `isolate` scope. It's also possible + * to use it in a directive without an `isolate` / `new` scope, but you need to be aware that the + * `controllerAs` reference might overwrite a property that already exists on the parent scope. + * + * + * #### `restrict` + * String of subset of `EACM` which restricts the directive to a specific directive + * declaration style. If omitted, the defaults (elements and attributes) are used. + * + * * `E` - Element name (default): `` + * * `A` - Attribute (default): `
` + * * `C` - Class: `
` + * * `M` - Comment: `` + * + * + * #### `templateNamespace` + * String representing the document type used by the markup in the template. + * AngularJS needs this information as those elements need to be created and cloned + * in a special way when they are defined outside their usual containers like `` and ``. + * + * * `html` - All root nodes in the template are HTML. Root nodes may also be + * top-level elements such as `` or ``. + * * `svg` - The root nodes in the template are SVG elements (excluding ``). + * * `math` - The root nodes in the template are MathML elements (excluding ``). + * + * If no `templateNamespace` is specified, then the namespace is considered to be `html`. + * + * #### `template` + * HTML markup that may: + * * Replace the contents of the directive's element (default). + * * Replace the directive's element itself (if `replace` is true - DEPRECATED). + * * Wrap the contents of the directive's element (if `transclude` is true). + * + * Value may be: + * + * * A string. For example `
{{delete_str}}
`. + * * A function which takes two arguments `tElement` and `tAttrs` (described in the `compile` + * function api below) and returns a string value. + * + * + * #### `templateUrl` + * This is similar to `template` but the template is loaded from the specified URL, asynchronously. + * + * Because template loading is asynchronous the compiler will suspend compilation of directives on that element + * for later when the template has been resolved. In the meantime it will continue to compile and link + * sibling and parent elements as though this element had not contained any directives. + * + * The compiler does not suspend the entire compilation to wait for templates to be loaded because this + * would result in the whole app "stalling" until all templates are loaded asynchronously - even in the + * case when only one deeply nested directive has `templateUrl`. + * + * Template loading is asynchronous even if the template has been preloaded into the {@link $templateCache} + * + * You can specify `templateUrl` as a string representing the URL or as a function which takes two + * arguments `tElement` and `tAttrs` (described in the `compile` function api below) and returns + * a string value representing the url. In either case, the template URL is passed through {@link + * $sce#getTrustedResourceUrl $sce.getTrustedResourceUrl}. + * + * + * #### `replace` ([*DEPRECATED*!], will be removed in next major release - i.e. v2.0) + * specify what the template should replace. Defaults to `false`. + * + * * `true` - the template will replace the directive's element. + * * `false` - the template will replace the contents of the directive's element. + * + * The replacement process migrates all of the attributes / classes from the old element to the new + * one. See the {@link guide/directive#template-expanding-directive + * Directives Guide} for an example. + * + * There are very few scenarios where element replacement is required for the application function, + * the main one being reusable custom components that are used within SVG contexts + * (because SVG doesn't work with custom elements in the DOM tree). + * + * #### `transclude` + * Extract the contents of the element where the directive appears and make it available to the directive. + * The contents are compiled and provided to the directive as a **transclusion function**. See the + * {@link $compile#transclusion Transclusion} section below. + * + * + * #### `compile` + * + * ```js + * function compile(tElement, tAttrs, transclude) { ... } + * ``` + * + * The compile function deals with transforming the template DOM. Since most directives do not do + * template transformation, it is not used often. The compile function takes the following arguments: + * + * * `tElement` - template element - The element where the directive has been declared. It is + * safe to do template transformation on the element and child elements only. + * + * * `tAttrs` - template attributes - Normalized list of attributes declared on this element shared + * between all directive compile functions. + * + * * `transclude` - [*DEPRECATED*!] A transclude linking function: `function(scope, cloneLinkingFn)` + * + *
+ * **Note:** The template instance and the link instance may be different objects if the template has + * been cloned. For this reason it is **not** safe to do anything other than DOM transformations that + * apply to all cloned DOM nodes within the compile function. Specifically, DOM listener registration + * should be done in a linking function rather than in a compile function. + *
+ + *
+ * **Note:** The compile function cannot handle directives that recursively use themselves in their + * own templates or compile functions. Compiling these directives results in an infinite loop and + * stack overflow errors. + * + * This can be avoided by manually using $compile in the postLink function to imperatively compile + * a directive's template instead of relying on automatic template compilation via `template` or + * `templateUrl` declaration or manual compilation inside the compile function. + *
+ * + *
+ * **Note:** The `transclude` function that is passed to the compile function is deprecated, as it + * e.g. does not know about the right outer scope. Please use the transclude function that is passed + * to the link function instead. + *
+ + * A compile function can have a return value which can be either a function or an object. + * + * * returning a (post-link) function - is equivalent to registering the linking function via the + * `link` property of the config object when the compile function is empty. + * + * * returning an object with function(s) registered via `pre` and `post` properties - allows you to + * control when a linking function should be called during the linking phase. See info about + * pre-linking and post-linking functions below. + * + * + * #### `link` + * This property is used only if the `compile` property is not defined. + * + * ```js + * function link(scope, iElement, iAttrs, controller, transcludeFn) { ... } + * ``` + * + * The link function is responsible for registering DOM listeners as well as updating the DOM. It is + * executed after the template has been cloned. This is where most of the directive logic will be + * put. + * + * * `scope` - {@link ng.$rootScope.Scope Scope} - The scope to be used by the + * directive for registering {@link ng.$rootScope.Scope#$watch watches}. + * + * * `iElement` - instance element - The element where the directive is to be used. It is safe to + * manipulate the children of the element only in `postLink` function since the children have + * already been linked. + * + * * `iAttrs` - instance attributes - Normalized list of attributes declared on this element shared + * between all directive linking functions. + * + * * `controller` - the directive's required controller instance(s) - Instances are shared + * among all directives, which allows the directives to use the controllers as a communication + * channel. The exact value depends on the directive's `require` property: + * * no controller(s) required: the directive's own controller, or `undefined` if it doesn't have one + * * `string`: the controller instance + * * `array`: array of controller instances + * + * If a required controller cannot be found, and it is optional, the instance is `null`, + * otherwise the {@link error:$compile:ctreq Missing Required Controller} error is thrown. + * + * Note that you can also require the directive's own controller - it will be made available like + * any other controller. + * + * * `transcludeFn` - A transclude linking function pre-bound to the correct transclusion scope. + * This is the same as the `$transclude` + * parameter of directive controllers, see there for details. + * `function([scope], cloneLinkingFn, futureParentElement)`. + * + * #### Pre-linking function + * + * Executed before the child elements are linked. Not safe to do DOM transformation since the + * compiler linking function will fail to locate the correct elements for linking. + * + * #### Post-linking function + * + * Executed after the child elements are linked. + * + * Note that child elements that contain `templateUrl` directives will not have been compiled + * and linked since they are waiting for their template to load asynchronously and their own + * compilation and linking has been suspended until that occurs. + * + * It is safe to do DOM transformation in the post-linking function on elements that are not waiting + * for their async templates to be resolved. + * + * + * ### Transclusion + * + * Transclusion is the process of extracting a collection of DOM elements from one part of the DOM and + * copying them to another part of the DOM, while maintaining their connection to the original AngularJS + * scope from where they were taken. + * + * Transclusion is used (often with {@link ngTransclude}) to insert the + * original contents of a directive's element into a specified place in the template of the directive. + * The benefit of transclusion, over simply moving the DOM elements manually, is that the transcluded + * content has access to the properties on the scope from which it was taken, even if the directive + * has isolated scope. + * See the {@link guide/directive#creating-a-directive-that-wraps-other-elements Directives Guide}. + * + * This makes it possible for the widget to have private state for its template, while the transcluded + * content has access to its originating scope. + * + *
+ * **Note:** When testing an element transclude directive you must not place the directive at the root of the + * DOM fragment that is being compiled. See {@link guide/unit-testing#testing-transclusion-directives + * Testing Transclusion Directives}. + *
+ * + * There are three kinds of transclusion depending upon whether you want to transclude just the contents of the + * directive's element, the entire element or multiple parts of the element contents: + * + * * `true` - transclude the content (i.e. the child nodes) of the directive's element. + * * `'element'` - transclude the whole of the directive's element including any directives on this + * element that defined at a lower priority than this directive. When used, the `template` + * property is ignored. + * * **`{...}` (an object hash):** - map elements of the content onto transclusion "slots" in the template. + * + * **Mult-slot transclusion** is declared by providing an object for the `transclude` property. + * + * This object is a map where the keys are the name of the slot to fill and the value is an element selector + * used to match the HTML to the slot. The element selector should be in normalized form (e.g. `myElement`) + * and will match the standard element variants (e.g. `my-element`, `my:element`, `data-my-element`, etc). + * + * For further information check out the guide on {@link guide/directive#matching-directives Matching Directives} + * + * If the element selector is prefixed with a `?` then that slot is optional. + * + * For example, the transclude object `{ slotA: '?myCustomElement' }` maps `` elements to + * the `slotA` slot, which can be accessed via the `$transclude` function or via the {@link ngTransclude} directive. + * + * Slots that are not marked as optional (`?`) will trigger a compile time error if there are no matching elements + * in the transclude content. If you wish to know if an optional slot was filled with content, then you can call + * `$transclude.isSlotFilled(slotName)` on the transclude function passed to the directive's link function and + * injectable into the directive's controller. + * + * + * #### Transclusion Functions + * + * When a directive requests transclusion, the compiler extracts its contents and provides a **transclusion + * function** to the directive's `link` function and `controller`. This transclusion function is a special + * **linking function** that will return the compiled contents linked to a new transclusion scope. + * + *
+ * If you are just using {@link ngTransclude} then you don't need to worry about this function, since + * ngTransclude will deal with it for us. + *
+ * + * If you want to manually control the insertion and removal of the transcluded content in your directive + * then you must use this transclude function. When you call a transclude function it returns a a jqLite/JQuery + * object that contains the compiled DOM, which is linked to the correct transclusion scope. + * + * When you call a transclusion function you can pass in a **clone attach function**. This function accepts + * two parameters, `function(clone, scope) { ... }`, where the `clone` is a fresh compiled copy of your transcluded + * content and the `scope` is the newly created transclusion scope, to which the clone is bound. + * + *
+ * **Best Practice**: Always provide a `cloneFn` (clone attach function) when you call a transclude function + * since you then get a fresh clone of the original DOM and also have access to the new transclusion scope. + *
+ * + * It is normal practice to attach your transcluded content (`clone`) to the DOM inside your **clone + * attach function**: + * + * ```js + * var transcludedContent, transclusionScope; + * + * $transclude(function(clone, scope) { + * element.append(clone); + * transcludedContent = clone; + * transclusionScope = scope; + * }); + * ``` + * + * Later, if you want to remove the transcluded content from your DOM then you should also destroy the + * associated transclusion scope: + * + * ```js + * transcludedContent.remove(); + * transclusionScope.$destroy(); + * ``` + * + *
+ * **Best Practice**: if you intend to add and remove transcluded content manually in your directive + * (by calling the transclude function to get the DOM and calling `element.remove()` to remove it), + * then you are also responsible for calling `$destroy` on the transclusion scope. + *
+ * + * The built-in DOM manipulation directives, such as {@link ngIf}, {@link ngSwitch} and {@link ngRepeat} + * automatically destroy their transcluded clones as necessary so you do not need to worry about this if + * you are simply using {@link ngTransclude} to inject the transclusion into your directive. + * + * + * #### Transclusion Scopes + * + * When you call a transclude function it returns a DOM fragment that is pre-bound to a **transclusion + * scope**. This scope is special, in that it is a child of the directive's scope (and so gets destroyed + * when the directive's scope gets destroyed) but it inherits the properties of the scope from which it + * was taken. + * + * For example consider a directive that uses transclusion and isolated scope. The DOM hierarchy might look + * like this: + * + * ```html + *
+ *
+ *
+ *
+ *
+ *
+ * ``` + * + * The `$parent` scope hierarchy will look like this: + * + ``` + - $rootScope + - isolate + - transclusion + ``` + * + * but the scopes will inherit prototypically from different scopes to their `$parent`. + * + ``` + - $rootScope + - transclusion + - isolate + ``` + * + * + * ### Attributes + * + * The {@link ng.$compile.directive.Attributes Attributes} object - passed as a parameter in the + * `link()` or `compile()` functions. It has a variety of uses. + * + * * *Accessing normalized attribute names:* Directives like 'ngBind' can be expressed in many ways: + * 'ng:bind', `data-ng-bind`, or 'x-ng-bind'. The attributes object allows for normalized access + * to the attributes. + * + * * *Directive inter-communication:* All directives share the same instance of the attributes + * object which allows the directives to use the attributes object as inter directive + * communication. + * + * * *Supports interpolation:* Interpolation attributes are assigned to the attribute object + * allowing other directives to read the interpolated value. + * + * * *Observing interpolated attributes:* Use `$observe` to observe the value changes of attributes + * that contain interpolation (e.g. `src="{{bar}}"`). Not only is this very efficient but it's also + * the only way to easily get the actual value because during the linking phase the interpolation + * hasn't been evaluated yet and so the value is at this time set to `undefined`. + * + * ```js + * function linkingFn(scope, elm, attrs, ctrl) { + * // get the attribute value + * console.log(attrs.ngModel); + * + * // change the attribute + * attrs.$set('ngModel', 'new value'); + * + * // observe changes to interpolated attribute + * attrs.$observe('ngModel', function(value) { + * console.log('ngModel has changed value to ' + value); + * }); + * } + * ``` + * + * ## Example + * + *
+ * **Note**: Typically directives are registered with `module.directive`. The example below is + * to illustrate how `$compile` works. + *
+ * + + + +
+
+
+
+
+
+ + it('should auto compile', function() { + var textarea = $('textarea'); + var output = $('div[compile]'); + // The initial state reads 'Hello Angular'. + expect(output.getText()).toBe('Hello Angular'); + textarea.clear(); + textarea.sendKeys('{{name}}!'); + expect(output.getText()).toBe('Angular!'); + }); + +
+ + * + * + * @param {string|DOMElement} element Element or HTML string to compile into a template function. + * @param {function(angular.Scope, cloneAttachFn=)} transclude function available to directives - DEPRECATED. + * + *
+ * **Note:** Passing a `transclude` function to the $compile function is deprecated, as it + * e.g. will not use the right outer scope. Please pass the transclude function as a + * `parentBoundTranscludeFn` to the link function instead. + *
+ * + * @param {number} maxPriority only apply directives lower than given priority (Only effects the + * root element(s), not their children) + * @returns {function(scope, cloneAttachFn=, options=)} a link function which is used to bind template + * (a DOM element/tree) to a scope. Where: + * + * * `scope` - A {@link ng.$rootScope.Scope Scope} to bind to. + * * `cloneAttachFn` - If `cloneAttachFn` is provided, then the link function will clone the + * `template` and call the `cloneAttachFn` function allowing the caller to attach the + * cloned elements to the DOM document at the appropriate place. The `cloneAttachFn` is + * called as:
`cloneAttachFn(clonedElement, scope)` where: + * + * * `clonedElement` - is a clone of the original `element` passed into the compiler. + * * `scope` - is the current scope with which the linking function is working with. + * + * * `options` - An optional object hash with linking options. If `options` is provided, then the following + * keys may be used to control linking behavior: + * + * * `parentBoundTranscludeFn` - the transclude function made available to + * directives; if given, it will be passed through to the link functions of + * directives found in `element` during compilation. + * * `transcludeControllers` - an object hash with keys that map controller names + * to a hash with the key `instance`, which maps to the controller instance; + * if given, it will make the controllers available to directives on the compileNode: + * ``` + * { + * parent: { + * instance: parentControllerInstance + * } + * } + * ``` + * * `futureParentElement` - defines the parent to which the `cloneAttachFn` will add + * the cloned elements; only needed for transcludes that are allowed to contain non html + * elements (e.g. SVG elements). See also the directive.controller property. + * + * Calling the linking function returns the element of the template. It is either the original + * element passed in, or the clone of the element if the `cloneAttachFn` is provided. + * + * After linking the view is not updated until after a call to $digest which typically is done by + * Angular automatically. + * + * If you need access to the bound view, there are two ways to do it: + * + * - If you are not asking the linking function to clone the template, create the DOM element(s) + * before you send them to the compiler and keep this reference around. + * ```js + * var element = $compile('

{{total}}

')(scope); + * ``` + * + * - if on the other hand, you need the element to be cloned, the view reference from the original + * example would not point to the clone, but rather to the original template that was cloned. In + * this case, you can access the clone via the cloneAttachFn: + * ```js + * var templateElement = angular.element('

{{total}}

'), + * scope = ....; + * + * var clonedElement = $compile(templateElement)(scope, function(clonedElement, scope) { + * //attach the clone to DOM document at the right place + * }); + * + * //now we have reference to the cloned DOM via `clonedElement` + * ``` + * + * + * For information on how the compiler works, see the + * {@link guide/compiler Angular HTML Compiler} section of the Developer Guide. + */ + +var $compileMinErr = minErr('$compile'); + +/** + * @ngdoc provider + * @name $compileProvider + * + * @description + */ +$CompileProvider.$inject = ['$provide', '$$sanitizeUriProvider']; +function $CompileProvider($provide, $$sanitizeUriProvider) { + var hasDirectives = {}, + Suffix = 'Directive', + COMMENT_DIRECTIVE_REGEXP = /^\s*directive\:\s*([\w\-]+)\s+(.*)$/, + CLASS_DIRECTIVE_REGEXP = /(([\w\-]+)(?:\:([^;]+))?;?)/, + ALL_OR_NOTHING_ATTRS = makeMap('ngSrc,ngSrcset,src,srcset'), + REQUIRE_PREFIX_REGEXP = /^(?:(\^\^?)?(\?)?(\^\^?)?)?/; + + // Ref: http://developers.whatwg.org/webappapis.html#event-handler-idl-attributes + // The assumption is that future DOM event attribute names will begin with + // 'on' and be composed of only English letters. + var EVENT_HANDLER_ATTR_REGEXP = /^(on[a-z]+|formaction)$/; + var bindingCache = createMap(); + + function parseIsolateBindings(scope, directiveName, isController) { + var LOCAL_REGEXP = /^\s*([@&<]|=(\*?))(\??)\s*(\w*)\s*$/; + + var bindings = {}; + + forEach(scope, function(definition, scopeName) { + if (definition in bindingCache) { + bindings[scopeName] = bindingCache[definition]; + return; + } + var match = definition.match(LOCAL_REGEXP); + + if (!match) { + throw $compileMinErr('iscp', + "Invalid {3} for directive '{0}'." + + " Definition: {... {1}: '{2}' ...}", + directiveName, scopeName, definition, + (isController ? "controller bindings definition" : + "isolate scope definition")); + } + + bindings[scopeName] = { + mode: match[1][0], + collection: match[2] === '*', + optional: match[3] === '?', + attrName: match[4] || scopeName + }; + if (match[4]) { + bindingCache[definition] = bindings[scopeName]; + } + }); + + return bindings; + } + + function parseDirectiveBindings(directive, directiveName) { + var bindings = { + isolateScope: null, + bindToController: null + }; + if (isObject(directive.scope)) { + if (directive.bindToController === true) { + bindings.bindToController = parseIsolateBindings(directive.scope, + directiveName, true); + bindings.isolateScope = {}; + } else { + bindings.isolateScope = parseIsolateBindings(directive.scope, + directiveName, false); + } + } + if (isObject(directive.bindToController)) { + bindings.bindToController = + parseIsolateBindings(directive.bindToController, directiveName, true); + } + if (isObject(bindings.bindToController)) { + var controller = directive.controller; + var controllerAs = directive.controllerAs; + if (!controller) { + // There is no controller, there may or may not be a controllerAs property + throw $compileMinErr('noctrl', + "Cannot bind to controller without directive '{0}'s controller.", + directiveName); + } else if (!identifierForController(controller, controllerAs)) { + // There is a controller, but no identifier or controllerAs property + throw $compileMinErr('noident', + "Cannot bind to controller without identifier for directive '{0}'.", + directiveName); + } + } + return bindings; + } + + function assertValidDirectiveName(name) { + var letter = name.charAt(0); + if (!letter || letter !== lowercase(letter)) { + throw $compileMinErr('baddir', "Directive/Component name '{0}' is invalid. The first character must be a lowercase letter", name); + } + if (name !== name.trim()) { + throw $compileMinErr('baddir', + "Directive/Component name '{0}' is invalid. The name should not contain leading or trailing whitespaces", + name); + } + } + + /** + * @ngdoc method + * @name $compileProvider#directive + * @kind function + * + * @description + * Register a new directive with the compiler. + * + * @param {string|Object} name Name of the directive in camel-case (i.e. ngBind which + * will match as ng-bind), or an object map of directives where the keys are the + * names and the values are the factories. + * @param {Function|Array} directiveFactory An injectable directive factory function. See the + * {@link guide/directive directive guide} and the {@link $compile compile API} for more info. + * @returns {ng.$compileProvider} Self for chaining. + */ + this.directive = function registerDirective(name, directiveFactory) { + assertNotHasOwnProperty(name, 'directive'); + if (isString(name)) { + assertValidDirectiveName(name); + assertArg(directiveFactory, 'directiveFactory'); + if (!hasDirectives.hasOwnProperty(name)) { + hasDirectives[name] = []; + $provide.factory(name + Suffix, ['$injector', '$exceptionHandler', + function($injector, $exceptionHandler) { + var directives = []; + forEach(hasDirectives[name], function(directiveFactory, index) { + try { + var directive = $injector.invoke(directiveFactory); + if (isFunction(directive)) { + directive = { compile: valueFn(directive) }; + } else if (!directive.compile && directive.link) { + directive.compile = valueFn(directive.link); + } + directive.priority = directive.priority || 0; + directive.index = index; + directive.name = directive.name || name; + directive.require = directive.require || (directive.controller && directive.name); + directive.restrict = directive.restrict || 'EA'; + directive.$$moduleName = directiveFactory.$$moduleName; + directives.push(directive); + } catch (e) { + $exceptionHandler(e); + } + }); + return directives; + }]); + } + hasDirectives[name].push(directiveFactory); + } else { + forEach(name, reverseParams(registerDirective)); + } + return this; + }; + + /** + * @ngdoc method + * @name $compileProvider#component + * @module ng + * @param {string} name Name of the component in camelCase (i.e. `myComp` which will match ``) + * @param {Object} options Component definition object (a simplified + * {@link ng.$compile#directive-definition-object directive definition object}), + * with the following properties (all optional): + * + * - `controller` – `{(string|function()=}` – controller constructor function that should be + * associated with newly created scope or the name of a {@link ng.$compile#-controller- + * registered controller} if passed as a string. An empty `noop` function by default. + * - `controllerAs` – `{string=}` – identifier name for to reference the controller in the component's scope. + * If present, the controller will be published to scope under the `controllerAs` name. + * If not present, this will default to be `$ctrl`. + * - `template` – `{string=|function()=}` – html template as a string or a function that + * returns an html template as a string which should be used as the contents of this component. + * Empty string by default. + * + * If `template` is a function, then it is {@link auto.$injector#invoke injected} with + * the following locals: + * + * - `$element` - Current element + * - `$attrs` - Current attributes object for the element + * + * - `templateUrl` – `{string=|function()=}` – path or function that returns a path to an html + * template that should be used as the contents of this component. + * + * If `templateUrl` is a function, then it is {@link auto.$injector#invoke injected} with + * the following locals: + * + * - `$element` - Current element + * - `$attrs` - Current attributes object for the element + * + * - `bindings` – `{object=}` – defines bindings between DOM attributes and component properties. + * Component properties are always bound to the component controller and not to the scope. + * See {@link ng.$compile#-bindtocontroller- `bindToController`}. + * - `transclude` – `{boolean=}` – whether {@link $compile#transclusion content transclusion} is enabled. + * Disabled by default. + * - `$...` – additional properties to attach to the directive factory function and the controller + * constructor function. (This is used by the component router to annotate) + * + * @returns {ng.$compileProvider} the compile provider itself, for chaining of function calls. + * @description + * Register a **component definition** with the compiler. This is a shorthand for registering a special + * type of directive, which represents a self-contained UI component in your application. Such components + * are always isolated (i.e. `scope: {}`) and are always restricted to elements (i.e. `restrict: 'E'`). + * + * Component definitions are very simple and do not require as much configuration as defining general + * directives. Component definitions usually consist only of a template and a controller backing it. + * + * In order to make the definition easier, components enforce best practices like use of `controllerAs`, + * `bindToController`. They always have **isolate scope** and are restricted to elements. + * + * Here are a few examples of how you would usually define components: + * + * ```js + * var myMod = angular.module(...); + * myMod.component('myComp', { + * template: '
My name is {{$ctrl.name}}
', + * controller: function() { + * this.name = 'shahar'; + * } + * }); + * + * myMod.component('myComp', { + * template: '
My name is {{$ctrl.name}}
', + * bindings: {name: '@'} + * }); + * + * myMod.component('myComp', { + * templateUrl: 'views/my-comp.html', + * controller: 'MyCtrl', + * controllerAs: 'ctrl', + * bindings: {name: '@'} + * }); + * + * ``` + * For more examples, and an in-depth guide, see the {@link guide/component component guide}. + * + *
+ * See also {@link ng.$compileProvider#directive $compileProvider.directive()}. + */ + this.component = function registerComponent(name, options) { + var controller = options.controller || noop; + + function factory($injector) { + function makeInjectable(fn) { + if (isFunction(fn) || isArray(fn)) { + return function(tElement, tAttrs) { + return $injector.invoke(fn, this, {$element: tElement, $attrs: tAttrs}); + }; + } else { + return fn; + } + } + + var template = (!options.template && !options.templateUrl ? '' : options.template); + return { + controller: controller, + controllerAs: identifierForController(options.controller) || options.controllerAs || '$ctrl', + template: makeInjectable(template), + templateUrl: makeInjectable(options.templateUrl), + transclude: options.transclude, + scope: {}, + bindToController: options.bindings || {}, + restrict: 'E', + require: options.require + }; + } + + // Copy any annotation properties (starting with $) over to the factory function + // These could be used by libraries such as the new component router + forEach(options, function(val, key) { + if (key.charAt(0) === '$') { + factory[key] = val; + controller[key] = val; + } + }); + + factory.$inject = ['$injector']; + + return this.directive(name, factory); + }; + + + /** + * @ngdoc method + * @name $compileProvider#aHrefSanitizationWhitelist + * @kind function + * + * @description + * Retrieves or overrides the default regular expression that is used for whitelisting of safe + * urls during a[href] sanitization. + * + * The sanitization is a security measure aimed at preventing XSS attacks via html links. + * + * Any url about to be assigned to a[href] via data-binding is first normalized and turned into + * an absolute url. Afterwards, the url is matched against the `aHrefSanitizationWhitelist` + * regular expression. If a match is found, the original url is written into the dom. Otherwise, + * the absolute url is prefixed with `'unsafe:'` string and only then is it written into the DOM. + * + * @param {RegExp=} regexp New regexp to whitelist urls with. + * @returns {RegExp|ng.$compileProvider} Current RegExp if called without value or self for + * chaining otherwise. + */ + this.aHrefSanitizationWhitelist = function(regexp) { + if (isDefined(regexp)) { + $$sanitizeUriProvider.aHrefSanitizationWhitelist(regexp); + return this; + } else { + return $$sanitizeUriProvider.aHrefSanitizationWhitelist(); + } + }; + + + /** + * @ngdoc method + * @name $compileProvider#imgSrcSanitizationWhitelist + * @kind function + * + * @description + * Retrieves or overrides the default regular expression that is used for whitelisting of safe + * urls during img[src] sanitization. + * + * The sanitization is a security measure aimed at prevent XSS attacks via html links. + * + * Any url about to be assigned to img[src] via data-binding is first normalized and turned into + * an absolute url. Afterwards, the url is matched against the `imgSrcSanitizationWhitelist` + * regular expression. If a match is found, the original url is written into the dom. Otherwise, + * the absolute url is prefixed with `'unsafe:'` string and only then is it written into the DOM. + * + * @param {RegExp=} regexp New regexp to whitelist urls with. + * @returns {RegExp|ng.$compileProvider} Current RegExp if called without value or self for + * chaining otherwise. + */ + this.imgSrcSanitizationWhitelist = function(regexp) { + if (isDefined(regexp)) { + $$sanitizeUriProvider.imgSrcSanitizationWhitelist(regexp); + return this; + } else { + return $$sanitizeUriProvider.imgSrcSanitizationWhitelist(); + } + }; + + /** + * @ngdoc method + * @name $compileProvider#debugInfoEnabled + * + * @param {boolean=} enabled update the debugInfoEnabled state if provided, otherwise just return the + * current debugInfoEnabled state + * @returns {*} current value if used as getter or itself (chaining) if used as setter + * + * @kind function + * + * @description + * Call this method to enable/disable various debug runtime information in the compiler such as adding + * binding information and a reference to the current scope on to DOM elements. + * If enabled, the compiler will add the following to DOM elements that have been bound to the scope + * * `ng-binding` CSS class + * * `$binding` data property containing an array of the binding expressions + * + * You may want to disable this in production for a significant performance boost. See + * {@link guide/production#disabling-debug-data Disabling Debug Data} for more. + * + * The default value is true. + */ + var debugInfoEnabled = true; + this.debugInfoEnabled = function(enabled) { + if (isDefined(enabled)) { + debugInfoEnabled = enabled; + return this; + } + return debugInfoEnabled; + }; + + + var TTL = 10; + /** + * @ngdoc method + * @name $compileProvider#onChangesTtl + * @description + * + * Sets the number of times `$onChanges` hooks can trigger new changes before giving up and + * assuming that the model is unstable. + * + * The current default is 10 iterations. + * + * In complex applications it's possible that dependencies between `$onChanges` hooks and bindings will result + * in several iterations of calls to these hooks. However if an application needs more than the default 10 + * iterations to stabilize then you should investigate what is causing the model to continuously change during + * the `$onChanges` hook execution. + * + * Increasing the TTL could have performance implications, so you should not change it without proper justification. + * + * @param {number} limit The number of `$onChanges` hook iterations. + * @returns {number|object} the current limit (or `this` if called as a setter for chaining) + */ + this.onChangesTtl = function(value) { + if (arguments.length) { + TTL = value; + return this; + } + return TTL; + }; + + this.$get = [ + '$injector', '$interpolate', '$exceptionHandler', '$templateRequest', '$parse', + '$controller', '$rootScope', '$sce', '$animate', '$$sanitizeUri', + function($injector, $interpolate, $exceptionHandler, $templateRequest, $parse, + $controller, $rootScope, $sce, $animate, $$sanitizeUri) { + + var SIMPLE_ATTR_NAME = /^\w/; + var specialAttrHolder = document.createElement('div'); + + + + var onChangesTtl = TTL; + // The onChanges hooks should all be run together in a single digest + // When changes occur, the call to trigger their hooks will be added to this queue + var onChangesQueue; + + // This function is called in a $$postDigest to trigger all the onChanges hooks in a single digest + function flushOnChangesQueue() { + try { + if (!(--onChangesTtl)) { + // We have hit the TTL limit so reset everything + onChangesQueue = undefined; + throw $compileMinErr('infchng', '{0} $onChanges() iterations reached. Aborting!\n', TTL); + } + // We must run this hook in an apply since the $$postDigest runs outside apply + $rootScope.$apply(function() { + for (var i = 0, ii = onChangesQueue.length; i < ii; ++i) { + onChangesQueue[i](); + } + // Reset the queue to trigger a new schedule next time there is a change + onChangesQueue = undefined; + }); + } finally { + onChangesTtl++; + } + } + + + function Attributes(element, attributesToCopy) { + if (attributesToCopy) { + var keys = Object.keys(attributesToCopy); + var i, l, key; + + for (i = 0, l = keys.length; i < l; i++) { + key = keys[i]; + this[key] = attributesToCopy[key]; + } + } else { + this.$attr = {}; + } + + this.$$element = element; + } + + Attributes.prototype = { + /** + * @ngdoc method + * @name $compile.directive.Attributes#$normalize + * @kind function + * + * @description + * Converts an attribute name (e.g. dash/colon/underscore-delimited string, optionally prefixed with `x-` or + * `data-`) to its normalized, camelCase form. + * + * Also there is special case for Moz prefix starting with upper case letter. + * + * For further information check out the guide on {@link guide/directive#matching-directives Matching Directives} + * + * @param {string} name Name to normalize + */ + $normalize: directiveNormalize, + + + /** + * @ngdoc method + * @name $compile.directive.Attributes#$addClass + * @kind function + * + * @description + * Adds the CSS class value specified by the classVal parameter to the element. If animations + * are enabled then an animation will be triggered for the class addition. + * + * @param {string} classVal The className value that will be added to the element + */ + $addClass: function(classVal) { + if (classVal && classVal.length > 0) { + $animate.addClass(this.$$element, classVal); + } + }, + + /** + * @ngdoc method + * @name $compile.directive.Attributes#$removeClass + * @kind function + * + * @description + * Removes the CSS class value specified by the classVal parameter from the element. If + * animations are enabled then an animation will be triggered for the class removal. + * + * @param {string} classVal The className value that will be removed from the element + */ + $removeClass: function(classVal) { + if (classVal && classVal.length > 0) { + $animate.removeClass(this.$$element, classVal); + } + }, + + /** + * @ngdoc method + * @name $compile.directive.Attributes#$updateClass + * @kind function + * + * @description + * Adds and removes the appropriate CSS class values to the element based on the difference + * between the new and old CSS class values (specified as newClasses and oldClasses). + * + * @param {string} newClasses The current CSS className value + * @param {string} oldClasses The former CSS className value + */ + $updateClass: function(newClasses, oldClasses) { + var toAdd = tokenDifference(newClasses, oldClasses); + if (toAdd && toAdd.length) { + $animate.addClass(this.$$element, toAdd); + } + + var toRemove = tokenDifference(oldClasses, newClasses); + if (toRemove && toRemove.length) { + $animate.removeClass(this.$$element, toRemove); + } + }, + + /** + * Set a normalized attribute on the element in a way such that all directives + * can share the attribute. This function properly handles boolean attributes. + * @param {string} key Normalized key. (ie ngAttribute) + * @param {string|boolean} value The value to set. If `null` attribute will be deleted. + * @param {boolean=} writeAttr If false, does not write the value to DOM element attribute. + * Defaults to true. + * @param {string=} attrName Optional none normalized name. Defaults to key. + */ + $set: function(key, value, writeAttr, attrName) { + // TODO: decide whether or not to throw an error if "class" + //is set through this function since it may cause $updateClass to + //become unstable. + + var node = this.$$element[0], + booleanKey = getBooleanAttrName(node, key), + aliasedKey = getAliasedAttrName(key), + observer = key, + nodeName; + + if (booleanKey) { + this.$$element.prop(key, value); + attrName = booleanKey; + } else if (aliasedKey) { + this[aliasedKey] = value; + observer = aliasedKey; + } + + this[key] = value; + + // translate normalized key to actual key + if (attrName) { + this.$attr[key] = attrName; + } else { + attrName = this.$attr[key]; + if (!attrName) { + this.$attr[key] = attrName = snake_case(key, '-'); + } + } + + nodeName = nodeName_(this.$$element); + + if ((nodeName === 'a' && (key === 'href' || key === 'xlinkHref')) || + (nodeName === 'img' && key === 'src')) { + // sanitize a[href] and img[src] values + this[key] = value = $$sanitizeUri(value, key === 'src'); + } else if (nodeName === 'img' && key === 'srcset') { + // sanitize img[srcset] values + var result = ""; + + // first check if there are spaces because it's not the same pattern + var trimmedSrcset = trim(value); + // ( 999x ,| 999w ,| ,|, ) + var srcPattern = /(\s+\d+x\s*,|\s+\d+w\s*,|\s+,|,\s+)/; + var pattern = /\s/.test(trimmedSrcset) ? srcPattern : /(,)/; + + // split srcset into tuple of uri and descriptor except for the last item + var rawUris = trimmedSrcset.split(pattern); + + // for each tuples + var nbrUrisWith2parts = Math.floor(rawUris.length / 2); + for (var i = 0; i < nbrUrisWith2parts; i++) { + var innerIdx = i * 2; + // sanitize the uri + result += $$sanitizeUri(trim(rawUris[innerIdx]), true); + // add the descriptor + result += (" " + trim(rawUris[innerIdx + 1])); + } + + // split the last item into uri and descriptor + var lastTuple = trim(rawUris[i * 2]).split(/\s/); + + // sanitize the last uri + result += $$sanitizeUri(trim(lastTuple[0]), true); + + // and add the last descriptor if any + if (lastTuple.length === 2) { + result += (" " + trim(lastTuple[1])); + } + this[key] = value = result; + } + + if (writeAttr !== false) { + if (value === null || isUndefined(value)) { + this.$$element.removeAttr(attrName); + } else { + if (SIMPLE_ATTR_NAME.test(attrName)) { + this.$$element.attr(attrName, value); + } else { + setSpecialAttr(this.$$element[0], attrName, value); + } + } + } + + // fire observers + var $$observers = this.$$observers; + $$observers && forEach($$observers[observer], function(fn) { + try { + fn(value); + } catch (e) { + $exceptionHandler(e); + } + }); + }, + + + /** + * @ngdoc method + * @name $compile.directive.Attributes#$observe + * @kind function + * + * @description + * Observes an interpolated attribute. + * + * The observer function will be invoked once during the next `$digest` following + * compilation. The observer is then invoked whenever the interpolated value + * changes. + * + * @param {string} key Normalized key. (ie ngAttribute) . + * @param {function(interpolatedValue)} fn Function that will be called whenever + the interpolated value of the attribute changes. + * See the {@link guide/interpolation#how-text-and-attribute-bindings-work Interpolation + * guide} for more info. + * @returns {function()} Returns a deregistration function for this observer. + */ + $observe: function(key, fn) { + var attrs = this, + $$observers = (attrs.$$observers || (attrs.$$observers = createMap())), + listeners = ($$observers[key] || ($$observers[key] = [])); + + listeners.push(fn); + $rootScope.$evalAsync(function() { + if (!listeners.$$inter && attrs.hasOwnProperty(key) && !isUndefined(attrs[key])) { + // no one registered attribute interpolation function, so lets call it manually + fn(attrs[key]); + } + }); + + return function() { + arrayRemove(listeners, fn); + }; + } + }; + + function setSpecialAttr(element, attrName, value) { + // Attributes names that do not start with letters (such as `(click)`) cannot be set using `setAttribute` + // so we have to jump through some hoops to get such an attribute + // https://github.com/angular/angular.js/pull/13318 + specialAttrHolder.innerHTML = ""; + var attributes = specialAttrHolder.firstChild.attributes; + var attribute = attributes[0]; + // We have to remove the attribute from its container element before we can add it to the destination element + attributes.removeNamedItem(attribute.name); + attribute.value = value; + element.attributes.setNamedItem(attribute); + } + + function safeAddClass($element, className) { + try { + $element.addClass(className); + } catch (e) { + // ignore, since it means that we are trying to set class on + // SVG element, where class name is read-only. + } + } + + + var startSymbol = $interpolate.startSymbol(), + endSymbol = $interpolate.endSymbol(), + denormalizeTemplate = (startSymbol == '{{' && endSymbol == '}}') + ? identity + : function denormalizeTemplate(template) { + return template.replace(/\{\{/g, startSymbol).replace(/}}/g, endSymbol); + }, + NG_ATTR_BINDING = /^ngAttr[A-Z]/; + var MULTI_ELEMENT_DIR_RE = /^(.+)Start$/; + + compile.$$addBindingInfo = debugInfoEnabled ? function $$addBindingInfo($element, binding) { + var bindings = $element.data('$binding') || []; + + if (isArray(binding)) { + bindings = bindings.concat(binding); + } else { + bindings.push(binding); + } + + $element.data('$binding', bindings); + } : noop; + + compile.$$addBindingClass = debugInfoEnabled ? function $$addBindingClass($element) { + safeAddClass($element, 'ng-binding'); + } : noop; + + compile.$$addScopeInfo = debugInfoEnabled ? function $$addScopeInfo($element, scope, isolated, noTemplate) { + var dataName = isolated ? (noTemplate ? '$isolateScopeNoTemplate' : '$isolateScope') : '$scope'; + $element.data(dataName, scope); + } : noop; + + compile.$$addScopeClass = debugInfoEnabled ? function $$addScopeClass($element, isolated) { + safeAddClass($element, isolated ? 'ng-isolate-scope' : 'ng-scope'); + } : noop; + + compile.$$createComment = function(directiveName, comment) { + var content = ''; + if (debugInfoEnabled) { + content = ' ' + (directiveName || '') + ': ' + (comment || '') + ' '; + } + return document.createComment(content); + }; + + return compile; + + //================================ + + function compile($compileNodes, transcludeFn, maxPriority, ignoreDirective, + previousCompileContext) { + if (!($compileNodes instanceof jqLite)) { + // jquery always rewraps, whereas we need to preserve the original selector so that we can + // modify it. + $compileNodes = jqLite($compileNodes); + } + + var NOT_EMPTY = /\S+/; + + // We can not compile top level text elements since text nodes can be merged and we will + // not be able to attach scope data to them, so we will wrap them in + for (var i = 0, len = $compileNodes.length; i < len; i++) { + var domNode = $compileNodes[i]; + + if (domNode.nodeType === NODE_TYPE_TEXT && domNode.nodeValue.match(NOT_EMPTY) /* non-empty */) { + jqLiteWrapNode(domNode, $compileNodes[i] = document.createElement('span')); + } + } + + var compositeLinkFn = + compileNodes($compileNodes, transcludeFn, $compileNodes, + maxPriority, ignoreDirective, previousCompileContext); + compile.$$addScopeClass($compileNodes); + var namespace = null; + return function publicLinkFn(scope, cloneConnectFn, options) { + assertArg(scope, 'scope'); + + if (previousCompileContext && previousCompileContext.needsNewScope) { + // A parent directive did a replace and a directive on this element asked + // for transclusion, which caused us to lose a layer of element on which + // we could hold the new transclusion scope, so we will create it manually + // here. + scope = scope.$parent.$new(); + } + + options = options || {}; + var parentBoundTranscludeFn = options.parentBoundTranscludeFn, + transcludeControllers = options.transcludeControllers, + futureParentElement = options.futureParentElement; + + // When `parentBoundTranscludeFn` is passed, it is a + // `controllersBoundTransclude` function (it was previously passed + // as `transclude` to directive.link) so we must unwrap it to get + // its `boundTranscludeFn` + if (parentBoundTranscludeFn && parentBoundTranscludeFn.$$boundTransclude) { + parentBoundTranscludeFn = parentBoundTranscludeFn.$$boundTransclude; + } + + if (!namespace) { + namespace = detectNamespaceForChildElements(futureParentElement); + } + var $linkNode; + if (namespace !== 'html') { + // When using a directive with replace:true and templateUrl the $compileNodes + // (or a child element inside of them) + // might change, so we need to recreate the namespace adapted compileNodes + // for call to the link function. + // Note: This will already clone the nodes... + $linkNode = jqLite( + wrapTemplate(namespace, jqLite('
').append($compileNodes).html()) + ); + } else if (cloneConnectFn) { + // important!!: we must call our jqLite.clone() since the jQuery one is trying to be smart + // and sometimes changes the structure of the DOM. + $linkNode = JQLitePrototype.clone.call($compileNodes); + } else { + $linkNode = $compileNodes; + } + + if (transcludeControllers) { + for (var controllerName in transcludeControllers) { + $linkNode.data('$' + controllerName + 'Controller', transcludeControllers[controllerName].instance); + } + } + + compile.$$addScopeInfo($linkNode, scope); + + if (cloneConnectFn) cloneConnectFn($linkNode, scope); + if (compositeLinkFn) compositeLinkFn(scope, $linkNode, $linkNode, parentBoundTranscludeFn); + return $linkNode; + }; + } + + function detectNamespaceForChildElements(parentElement) { + // TODO: Make this detect MathML as well... + var node = parentElement && parentElement[0]; + if (!node) { + return 'html'; + } else { + return nodeName_(node) !== 'foreignobject' && toString.call(node).match(/SVG/) ? 'svg' : 'html'; + } + } + + /** + * Compile function matches each node in nodeList against the directives. Once all directives + * for a particular node are collected their compile functions are executed. The compile + * functions return values - the linking functions - are combined into a composite linking + * function, which is the a linking function for the node. + * + * @param {NodeList} nodeList an array of nodes or NodeList to compile + * @param {function(angular.Scope, cloneAttachFn=)} transcludeFn A linking function, where the + * scope argument is auto-generated to the new child of the transcluded parent scope. + * @param {DOMElement=} $rootElement If the nodeList is the root of the compilation tree then + * the rootElement must be set the jqLite collection of the compile root. This is + * needed so that the jqLite collection items can be replaced with widgets. + * @param {number=} maxPriority Max directive priority. + * @returns {Function} A composite linking function of all of the matched directives or null. + */ + function compileNodes(nodeList, transcludeFn, $rootElement, maxPriority, ignoreDirective, + previousCompileContext) { + var linkFns = [], + attrs, directives, nodeLinkFn, childNodes, childLinkFn, linkFnFound, nodeLinkFnFound; + + for (var i = 0; i < nodeList.length; i++) { + attrs = new Attributes(); + + // we must always refer to nodeList[i] since the nodes can be replaced underneath us. + directives = collectDirectives(nodeList[i], [], attrs, i === 0 ? maxPriority : undefined, + ignoreDirective); + + nodeLinkFn = (directives.length) + ? applyDirectivesToNode(directives, nodeList[i], attrs, transcludeFn, $rootElement, + null, [], [], previousCompileContext) + : null; + + if (nodeLinkFn && nodeLinkFn.scope) { + compile.$$addScopeClass(attrs.$$element); + } + + childLinkFn = (nodeLinkFn && nodeLinkFn.terminal || + !(childNodes = nodeList[i].childNodes) || + !childNodes.length) + ? null + : compileNodes(childNodes, + nodeLinkFn ? ( + (nodeLinkFn.transcludeOnThisElement || !nodeLinkFn.templateOnThisElement) + && nodeLinkFn.transclude) : transcludeFn); + + if (nodeLinkFn || childLinkFn) { + linkFns.push(i, nodeLinkFn, childLinkFn); + linkFnFound = true; + nodeLinkFnFound = nodeLinkFnFound || nodeLinkFn; + } + + //use the previous context only for the first element in the virtual group + previousCompileContext = null; + } + + // return a linking function if we have found anything, null otherwise + return linkFnFound ? compositeLinkFn : null; + + function compositeLinkFn(scope, nodeList, $rootElement, parentBoundTranscludeFn) { + var nodeLinkFn, childLinkFn, node, childScope, i, ii, idx, childBoundTranscludeFn; + var stableNodeList; + + + if (nodeLinkFnFound) { + // copy nodeList so that if a nodeLinkFn removes or adds an element at this DOM level our + // offsets don't get screwed up + var nodeListLength = nodeList.length; + stableNodeList = new Array(nodeListLength); + + // create a sparse array by only copying the elements which have a linkFn + for (i = 0; i < linkFns.length; i+=3) { + idx = linkFns[i]; + stableNodeList[idx] = nodeList[idx]; + } + } else { + stableNodeList = nodeList; + } + + for (i = 0, ii = linkFns.length; i < ii;) { + node = stableNodeList[linkFns[i++]]; + nodeLinkFn = linkFns[i++]; + childLinkFn = linkFns[i++]; + + if (nodeLinkFn) { + if (nodeLinkFn.scope) { + childScope = scope.$new(); + compile.$$addScopeInfo(jqLite(node), childScope); + } else { + childScope = scope; + } + + if (nodeLinkFn.transcludeOnThisElement) { + childBoundTranscludeFn = createBoundTranscludeFn( + scope, nodeLinkFn.transclude, parentBoundTranscludeFn); + + } else if (!nodeLinkFn.templateOnThisElement && parentBoundTranscludeFn) { + childBoundTranscludeFn = parentBoundTranscludeFn; + + } else if (!parentBoundTranscludeFn && transcludeFn) { + childBoundTranscludeFn = createBoundTranscludeFn(scope, transcludeFn); + + } else { + childBoundTranscludeFn = null; + } + + nodeLinkFn(childLinkFn, childScope, node, $rootElement, childBoundTranscludeFn); + + } else if (childLinkFn) { + childLinkFn(scope, node.childNodes, undefined, parentBoundTranscludeFn); + } + } + } + } + + function createBoundTranscludeFn(scope, transcludeFn, previousBoundTranscludeFn) { + function boundTranscludeFn(transcludedScope, cloneFn, controllers, futureParentElement, containingScope) { + + if (!transcludedScope) { + transcludedScope = scope.$new(false, containingScope); + transcludedScope.$$transcluded = true; + } + + return transcludeFn(transcludedScope, cloneFn, { + parentBoundTranscludeFn: previousBoundTranscludeFn, + transcludeControllers: controllers, + futureParentElement: futureParentElement + }); + } + + // We need to attach the transclusion slots onto the `boundTranscludeFn` + // so that they are available inside the `controllersBoundTransclude` function + var boundSlots = boundTranscludeFn.$$slots = createMap(); + for (var slotName in transcludeFn.$$slots) { + if (transcludeFn.$$slots[slotName]) { + boundSlots[slotName] = createBoundTranscludeFn(scope, transcludeFn.$$slots[slotName], previousBoundTranscludeFn); + } else { + boundSlots[slotName] = null; + } + } + + return boundTranscludeFn; + } + + /** + * Looks for directives on the given node and adds them to the directive collection which is + * sorted. + * + * @param node Node to search. + * @param directives An array to which the directives are added to. This array is sorted before + * the function returns. + * @param attrs The shared attrs object which is used to populate the normalized attributes. + * @param {number=} maxPriority Max directive priority. + */ + function collectDirectives(node, directives, attrs, maxPriority, ignoreDirective) { + var nodeType = node.nodeType, + attrsMap = attrs.$attr, + match, + className; + + switch (nodeType) { + case NODE_TYPE_ELEMENT: /* Element */ + // use the node name: + addDirective(directives, + directiveNormalize(nodeName_(node)), 'E', maxPriority, ignoreDirective); + + // iterate over the attributes + for (var attr, name, nName, ngAttrName, value, isNgAttr, nAttrs = node.attributes, + j = 0, jj = nAttrs && nAttrs.length; j < jj; j++) { + var attrStartName = false; + var attrEndName = false; + + attr = nAttrs[j]; + name = attr.name; + value = trim(attr.value); + + // support ngAttr attribute binding + ngAttrName = directiveNormalize(name); + if (isNgAttr = NG_ATTR_BINDING.test(ngAttrName)) { + name = name.replace(PREFIX_REGEXP, '') + .substr(8).replace(/_(.)/g, function(match, letter) { + return letter.toUpperCase(); + }); + } + + var multiElementMatch = ngAttrName.match(MULTI_ELEMENT_DIR_RE); + if (multiElementMatch && directiveIsMultiElement(multiElementMatch[1])) { + attrStartName = name; + attrEndName = name.substr(0, name.length - 5) + 'end'; + name = name.substr(0, name.length - 6); + } + + nName = directiveNormalize(name.toLowerCase()); + attrsMap[nName] = name; + if (isNgAttr || !attrs.hasOwnProperty(nName)) { + attrs[nName] = value; + if (getBooleanAttrName(node, nName)) { + attrs[nName] = true; // presence means true + } + } + addAttrInterpolateDirective(node, directives, value, nName, isNgAttr); + addDirective(directives, nName, 'A', maxPriority, ignoreDirective, attrStartName, + attrEndName); + } + + // use class as directive + className = node.className; + if (isObject(className)) { + // Maybe SVGAnimatedString + className = className.animVal; + } + if (isString(className) && className !== '') { + while (match = CLASS_DIRECTIVE_REGEXP.exec(className)) { + nName = directiveNormalize(match[2]); + if (addDirective(directives, nName, 'C', maxPriority, ignoreDirective)) { + attrs[nName] = trim(match[3]); + } + className = className.substr(match.index + match[0].length); + } + } + break; + case NODE_TYPE_TEXT: /* Text Node */ + if (msie === 11) { + // Workaround for #11781 + while (node.parentNode && node.nextSibling && node.nextSibling.nodeType === NODE_TYPE_TEXT) { + node.nodeValue = node.nodeValue + node.nextSibling.nodeValue; + node.parentNode.removeChild(node.nextSibling); + } + } + addTextInterpolateDirective(directives, node.nodeValue); + break; + case NODE_TYPE_COMMENT: /* Comment */ + try { + match = COMMENT_DIRECTIVE_REGEXP.exec(node.nodeValue); + if (match) { + nName = directiveNormalize(match[1]); + if (addDirective(directives, nName, 'M', maxPriority, ignoreDirective)) { + attrs[nName] = trim(match[2]); + } + } + } catch (e) { + // turns out that under some circumstances IE9 throws errors when one attempts to read + // comment's node value. + // Just ignore it and continue. (Can't seem to reproduce in test case.) + } + break; + } + + directives.sort(byPriority); + return directives; + } + + /** + * Given a node with an directive-start it collects all of the siblings until it finds + * directive-end. + * @param node + * @param attrStart + * @param attrEnd + * @returns {*} + */ + function groupScan(node, attrStart, attrEnd) { + var nodes = []; + var depth = 0; + if (attrStart && node.hasAttribute && node.hasAttribute(attrStart)) { + do { + if (!node) { + throw $compileMinErr('uterdir', + "Unterminated attribute, found '{0}' but no matching '{1}' found.", + attrStart, attrEnd); + } + if (node.nodeType == NODE_TYPE_ELEMENT) { + if (node.hasAttribute(attrStart)) depth++; + if (node.hasAttribute(attrEnd)) depth--; + } + nodes.push(node); + node = node.nextSibling; + } while (depth > 0); + } else { + nodes.push(node); + } + + return jqLite(nodes); + } + + /** + * Wrapper for linking function which converts normal linking function into a grouped + * linking function. + * @param linkFn + * @param attrStart + * @param attrEnd + * @returns {Function} + */ + function groupElementsLinkFnWrapper(linkFn, attrStart, attrEnd) { + return function groupedElementsLink(scope, element, attrs, controllers, transcludeFn) { + element = groupScan(element[0], attrStart, attrEnd); + return linkFn(scope, element, attrs, controllers, transcludeFn); + }; + } + + /** + * A function generator that is used to support both eager and lazy compilation + * linking function. + * @param eager + * @param $compileNodes + * @param transcludeFn + * @param maxPriority + * @param ignoreDirective + * @param previousCompileContext + * @returns {Function} + */ + function compilationGenerator(eager, $compileNodes, transcludeFn, maxPriority, ignoreDirective, previousCompileContext) { + var compiled; + + if (eager) { + return compile($compileNodes, transcludeFn, maxPriority, ignoreDirective, previousCompileContext); + } + return function lazyCompilation() { + if (!compiled) { + compiled = compile($compileNodes, transcludeFn, maxPriority, ignoreDirective, previousCompileContext); + + // Null out all of these references in order to make them eligible for garbage collection + // since this is a potentially long lived closure + $compileNodes = transcludeFn = previousCompileContext = null; + } + return compiled.apply(this, arguments); + }; + } + + /** + * Once the directives have been collected, their compile functions are executed. This method + * is responsible for inlining directive templates as well as terminating the application + * of the directives if the terminal directive has been reached. + * + * @param {Array} directives Array of collected directives to execute their compile function. + * this needs to be pre-sorted by priority order. + * @param {Node} compileNode The raw DOM node to apply the compile functions to + * @param {Object} templateAttrs The shared attribute function + * @param {function(angular.Scope, cloneAttachFn=)} transcludeFn A linking function, where the + * scope argument is auto-generated to the new + * child of the transcluded parent scope. + * @param {JQLite} jqCollection If we are working on the root of the compile tree then this + * argument has the root jqLite array so that we can replace nodes + * on it. + * @param {Object=} originalReplaceDirective An optional directive that will be ignored when + * compiling the transclusion. + * @param {Array.} preLinkFns + * @param {Array.} postLinkFns + * @param {Object} previousCompileContext Context used for previous compilation of the current + * node + * @returns {Function} linkFn + */ + function applyDirectivesToNode(directives, compileNode, templateAttrs, transcludeFn, + jqCollection, originalReplaceDirective, preLinkFns, postLinkFns, + previousCompileContext) { + previousCompileContext = previousCompileContext || {}; + + var terminalPriority = -Number.MAX_VALUE, + newScopeDirective = previousCompileContext.newScopeDirective, + controllerDirectives = previousCompileContext.controllerDirectives, + newIsolateScopeDirective = previousCompileContext.newIsolateScopeDirective, + templateDirective = previousCompileContext.templateDirective, + nonTlbTranscludeDirective = previousCompileContext.nonTlbTranscludeDirective, + hasTranscludeDirective = false, + hasTemplate = false, + hasElementTranscludeDirective = previousCompileContext.hasElementTranscludeDirective, + $compileNode = templateAttrs.$$element = jqLite(compileNode), + directive, + directiveName, + $template, + replaceDirective = originalReplaceDirective, + childTranscludeFn = transcludeFn, + linkFn, + didScanForMultipleTransclusion = false, + mightHaveMultipleTransclusionError = false, + directiveValue; + + // executes all directives on the current element + for (var i = 0, ii = directives.length; i < ii; i++) { + directive = directives[i]; + var attrStart = directive.$$start; + var attrEnd = directive.$$end; + + // collect multiblock sections + if (attrStart) { + $compileNode = groupScan(compileNode, attrStart, attrEnd); + } + $template = undefined; + + if (terminalPriority > directive.priority) { + break; // prevent further processing of directives + } + + if (directiveValue = directive.scope) { + + // skip the check for directives with async templates, we'll check the derived sync + // directive when the template arrives + if (!directive.templateUrl) { + if (isObject(directiveValue)) { + // This directive is trying to add an isolated scope. + // Check that there is no scope of any kind already + assertNoDuplicate('new/isolated scope', newIsolateScopeDirective || newScopeDirective, + directive, $compileNode); + newIsolateScopeDirective = directive; + } else { + // This directive is trying to add a child scope. + // Check that there is no isolated scope already + assertNoDuplicate('new/isolated scope', newIsolateScopeDirective, directive, + $compileNode); + } + } + + newScopeDirective = newScopeDirective || directive; + } + + directiveName = directive.name; + + // If we encounter a condition that can result in transclusion on the directive, + // then scan ahead in the remaining directives for others that may cause a multiple + // transclusion error to be thrown during the compilation process. If a matching directive + // is found, then we know that when we encounter a transcluded directive, we need to eagerly + // compile the `transclude` function rather than doing it lazily in order to throw + // exceptions at the correct time + if (!didScanForMultipleTransclusion && ((directive.replace && (directive.templateUrl || directive.template)) + || (directive.transclude && !directive.$$tlb))) { + var candidateDirective; + + for (var scanningIndex = i + 1; candidateDirective = directives[scanningIndex++];) { + if ((candidateDirective.transclude && !candidateDirective.$$tlb) + || (candidateDirective.replace && (candidateDirective.templateUrl || candidateDirective.template))) { + mightHaveMultipleTransclusionError = true; + break; + } + } + + didScanForMultipleTransclusion = true; + } + + if (!directive.templateUrl && directive.controller) { + directiveValue = directive.controller; + controllerDirectives = controllerDirectives || createMap(); + assertNoDuplicate("'" + directiveName + "' controller", + controllerDirectives[directiveName], directive, $compileNode); + controllerDirectives[directiveName] = directive; + } + + if (directiveValue = directive.transclude) { + hasTranscludeDirective = true; + + // Special case ngIf and ngRepeat so that we don't complain about duplicate transclusion. + // This option should only be used by directives that know how to safely handle element transclusion, + // where the transcluded nodes are added or replaced after linking. + if (!directive.$$tlb) { + assertNoDuplicate('transclusion', nonTlbTranscludeDirective, directive, $compileNode); + nonTlbTranscludeDirective = directive; + } + + if (directiveValue == 'element') { + hasElementTranscludeDirective = true; + terminalPriority = directive.priority; + $template = $compileNode; + $compileNode = templateAttrs.$$element = + jqLite(compile.$$createComment(directiveName, templateAttrs[directiveName])); + compileNode = $compileNode[0]; + replaceWith(jqCollection, sliceArgs($template), compileNode); + + // Support: Chrome < 50 + // https://github.com/angular/angular.js/issues/14041 + + // In the versions of V8 prior to Chrome 50, the document fragment that is created + // in the `replaceWith` function is improperly garbage collected despite still + // being referenced by the `parentNode` property of all of the child nodes. By adding + // a reference to the fragment via a different property, we can avoid that incorrect + // behavior. + // TODO: remove this line after Chrome 50 has been released + $template[0].$$parentNode = $template[0].parentNode; + + childTranscludeFn = compilationGenerator(mightHaveMultipleTransclusionError, $template, transcludeFn, terminalPriority, + replaceDirective && replaceDirective.name, { + // Don't pass in: + // - controllerDirectives - otherwise we'll create duplicates controllers + // - newIsolateScopeDirective or templateDirective - combining templates with + // element transclusion doesn't make sense. + // + // We need only nonTlbTranscludeDirective so that we prevent putting transclusion + // on the same element more than once. + nonTlbTranscludeDirective: nonTlbTranscludeDirective + }); + } else { + + var slots = createMap(); + + $template = jqLite(jqLiteClone(compileNode)).contents(); + + if (isObject(directiveValue)) { + + // We have transclusion slots, + // collect them up, compile them and store their transclusion functions + $template = []; + + var slotMap = createMap(); + var filledSlots = createMap(); + + // Parse the element selectors + forEach(directiveValue, function(elementSelector, slotName) { + // If an element selector starts with a ? then it is optional + var optional = (elementSelector.charAt(0) === '?'); + elementSelector = optional ? elementSelector.substring(1) : elementSelector; + + slotMap[elementSelector] = slotName; + + // We explicitly assign `null` since this implies that a slot was defined but not filled. + // Later when calling boundTransclusion functions with a slot name we only error if the + // slot is `undefined` + slots[slotName] = null; + + // filledSlots contains `true` for all slots that are either optional or have been + // filled. This is used to check that we have not missed any required slots + filledSlots[slotName] = optional; + }); + + // Add the matching elements into their slot + forEach($compileNode.contents(), function(node) { + var slotName = slotMap[directiveNormalize(nodeName_(node))]; + if (slotName) { + filledSlots[slotName] = true; + slots[slotName] = slots[slotName] || []; + slots[slotName].push(node); + } else { + $template.push(node); + } + }); + + // Check for required slots that were not filled + forEach(filledSlots, function(filled, slotName) { + if (!filled) { + throw $compileMinErr('reqslot', 'Required transclusion slot `{0}` was not filled.', slotName); + } + }); + + for (var slotName in slots) { + if (slots[slotName]) { + // Only define a transclusion function if the slot was filled + slots[slotName] = compilationGenerator(mightHaveMultipleTransclusionError, slots[slotName], transcludeFn); + } + } + } + + $compileNode.empty(); // clear contents + childTranscludeFn = compilationGenerator(mightHaveMultipleTransclusionError, $template, transcludeFn, undefined, + undefined, { needsNewScope: directive.$$isolateScope || directive.$$newScope}); + childTranscludeFn.$$slots = slots; + } + } + + if (directive.template) { + hasTemplate = true; + assertNoDuplicate('template', templateDirective, directive, $compileNode); + templateDirective = directive; + + directiveValue = (isFunction(directive.template)) + ? directive.template($compileNode, templateAttrs) + : directive.template; + + directiveValue = denormalizeTemplate(directiveValue); + + if (directive.replace) { + replaceDirective = directive; + if (jqLiteIsTextNode(directiveValue)) { + $template = []; + } else { + $template = removeComments(wrapTemplate(directive.templateNamespace, trim(directiveValue))); + } + compileNode = $template[0]; + + if ($template.length != 1 || compileNode.nodeType !== NODE_TYPE_ELEMENT) { + throw $compileMinErr('tplrt', + "Template for directive '{0}' must have exactly one root element. {1}", + directiveName, ''); + } + + replaceWith(jqCollection, $compileNode, compileNode); + + var newTemplateAttrs = {$attr: {}}; + + // combine directives from the original node and from the template: + // - take the array of directives for this element + // - split it into two parts, those that already applied (processed) and those that weren't (unprocessed) + // - collect directives from the template and sort them by priority + // - combine directives as: processed + template + unprocessed + var templateDirectives = collectDirectives(compileNode, [], newTemplateAttrs); + var unprocessedDirectives = directives.splice(i + 1, directives.length - (i + 1)); + + if (newIsolateScopeDirective || newScopeDirective) { + // The original directive caused the current element to be replaced but this element + // also needs to have a new scope, so we need to tell the template directives + // that they would need to get their scope from further up, if they require transclusion + markDirectiveScope(templateDirectives, newIsolateScopeDirective, newScopeDirective); + } + directives = directives.concat(templateDirectives).concat(unprocessedDirectives); + mergeTemplateAttributes(templateAttrs, newTemplateAttrs); + + ii = directives.length; + } else { + $compileNode.html(directiveValue); + } + } + + if (directive.templateUrl) { + hasTemplate = true; + assertNoDuplicate('template', templateDirective, directive, $compileNode); + templateDirective = directive; + + if (directive.replace) { + replaceDirective = directive; + } + + nodeLinkFn = compileTemplateUrl(directives.splice(i, directives.length - i), $compileNode, + templateAttrs, jqCollection, hasTranscludeDirective && childTranscludeFn, preLinkFns, postLinkFns, { + controllerDirectives: controllerDirectives, + newScopeDirective: (newScopeDirective !== directive) && newScopeDirective, + newIsolateScopeDirective: newIsolateScopeDirective, + templateDirective: templateDirective, + nonTlbTranscludeDirective: nonTlbTranscludeDirective + }); + ii = directives.length; + } else if (directive.compile) { + try { + linkFn = directive.compile($compileNode, templateAttrs, childTranscludeFn); + if (isFunction(linkFn)) { + addLinkFns(null, linkFn, attrStart, attrEnd); + } else if (linkFn) { + addLinkFns(linkFn.pre, linkFn.post, attrStart, attrEnd); + } + } catch (e) { + $exceptionHandler(e, startingTag($compileNode)); + } + } + + if (directive.terminal) { + nodeLinkFn.terminal = true; + terminalPriority = Math.max(terminalPriority, directive.priority); + } + + } + + nodeLinkFn.scope = newScopeDirective && newScopeDirective.scope === true; + nodeLinkFn.transcludeOnThisElement = hasTranscludeDirective; + nodeLinkFn.templateOnThisElement = hasTemplate; + nodeLinkFn.transclude = childTranscludeFn; + + previousCompileContext.hasElementTranscludeDirective = hasElementTranscludeDirective; + + // might be normal or delayed nodeLinkFn depending on if templateUrl is present + return nodeLinkFn; + + //////////////////// + + function addLinkFns(pre, post, attrStart, attrEnd) { + if (pre) { + if (attrStart) pre = groupElementsLinkFnWrapper(pre, attrStart, attrEnd); + pre.require = directive.require; + pre.directiveName = directiveName; + if (newIsolateScopeDirective === directive || directive.$$isolateScope) { + pre = cloneAndAnnotateFn(pre, {isolateScope: true}); + } + preLinkFns.push(pre); + } + if (post) { + if (attrStart) post = groupElementsLinkFnWrapper(post, attrStart, attrEnd); + post.require = directive.require; + post.directiveName = directiveName; + if (newIsolateScopeDirective === directive || directive.$$isolateScope) { + post = cloneAndAnnotateFn(post, {isolateScope: true}); + } + postLinkFns.push(post); + } + } + + function nodeLinkFn(childLinkFn, scope, linkNode, $rootElement, boundTranscludeFn) { + var i, ii, linkFn, isolateScope, controllerScope, elementControllers, transcludeFn, $element, + attrs, removeScopeBindingWatches, removeControllerBindingWatches; + + if (compileNode === linkNode) { + attrs = templateAttrs; + $element = templateAttrs.$$element; + } else { + $element = jqLite(linkNode); + attrs = new Attributes($element, templateAttrs); + } + + controllerScope = scope; + if (newIsolateScopeDirective) { + isolateScope = scope.$new(true); + } else if (newScopeDirective) { + controllerScope = scope.$parent; + } + + if (boundTranscludeFn) { + // track `boundTranscludeFn` so it can be unwrapped if `transcludeFn` + // is later passed as `parentBoundTranscludeFn` to `publicLinkFn` + transcludeFn = controllersBoundTransclude; + transcludeFn.$$boundTransclude = boundTranscludeFn; + // expose the slots on the `$transclude` function + transcludeFn.isSlotFilled = function(slotName) { + return !!boundTranscludeFn.$$slots[slotName]; + }; + } + + if (controllerDirectives) { + elementControllers = setupControllers($element, attrs, transcludeFn, controllerDirectives, isolateScope, scope, newIsolateScopeDirective); + } + + if (newIsolateScopeDirective) { + // Initialize isolate scope bindings for new isolate scope directive. + compile.$$addScopeInfo($element, isolateScope, true, !(templateDirective && (templateDirective === newIsolateScopeDirective || + templateDirective === newIsolateScopeDirective.$$originalDirective))); + compile.$$addScopeClass($element, true); + isolateScope.$$isolateBindings = + newIsolateScopeDirective.$$isolateBindings; + removeScopeBindingWatches = initializeDirectiveBindings(scope, attrs, isolateScope, + isolateScope.$$isolateBindings, + newIsolateScopeDirective); + if (removeScopeBindingWatches) { + isolateScope.$on('$destroy', removeScopeBindingWatches); + } + } + + // Initialize bindToController bindings + for (var name in elementControllers) { + var controllerDirective = controllerDirectives[name]; + var controller = elementControllers[name]; + var bindings = controllerDirective.$$bindings.bindToController; + + if (controller.identifier && bindings) { + removeControllerBindingWatches = + initializeDirectiveBindings(controllerScope, attrs, controller.instance, bindings, controllerDirective); + } + + var controllerResult = controller(); + if (controllerResult !== controller.instance) { + // If the controller constructor has a return value, overwrite the instance + // from setupControllers + controller.instance = controllerResult; + $element.data('$' + controllerDirective.name + 'Controller', controllerResult); + removeControllerBindingWatches && removeControllerBindingWatches(); + removeControllerBindingWatches = + initializeDirectiveBindings(controllerScope, attrs, controller.instance, bindings, controllerDirective); + } + } + + // Bind the required controllers to the controller, if `require` is an object and `bindToController` is truthy + forEach(controllerDirectives, function(controllerDirective, name) { + var require = controllerDirective.require; + if (controllerDirective.bindToController && !isArray(require) && isObject(require)) { + extend(elementControllers[name].instance, getControllers(name, require, $element, elementControllers)); + } + }); + + // Handle the init and destroy lifecycle hooks on all controllers that have them + forEach(elementControllers, function(controller) { + var controllerInstance = controller.instance; + if (isFunction(controllerInstance.$onInit)) { + controllerInstance.$onInit(); + } + if (isFunction(controllerInstance.$onDestroy)) { + controllerScope.$on('$destroy', function callOnDestroyHook() { + controllerInstance.$onDestroy(); + }); + } + }); + + // PRELINKING + for (i = 0, ii = preLinkFns.length; i < ii; i++) { + linkFn = preLinkFns[i]; + invokeLinkFn(linkFn, + linkFn.isolateScope ? isolateScope : scope, + $element, + attrs, + linkFn.require && getControllers(linkFn.directiveName, linkFn.require, $element, elementControllers), + transcludeFn + ); + } + + // RECURSION + // We only pass the isolate scope, if the isolate directive has a template, + // otherwise the child elements do not belong to the isolate directive. + var scopeToChild = scope; + if (newIsolateScopeDirective && (newIsolateScopeDirective.template || newIsolateScopeDirective.templateUrl === null)) { + scopeToChild = isolateScope; + } + childLinkFn && childLinkFn(scopeToChild, linkNode.childNodes, undefined, boundTranscludeFn); + + // POSTLINKING + for (i = postLinkFns.length - 1; i >= 0; i--) { + linkFn = postLinkFns[i]; + invokeLinkFn(linkFn, + linkFn.isolateScope ? isolateScope : scope, + $element, + attrs, + linkFn.require && getControllers(linkFn.directiveName, linkFn.require, $element, elementControllers), + transcludeFn + ); + } + + // Trigger $postLink lifecycle hooks + forEach(elementControllers, function(controller) { + var controllerInstance = controller.instance; + if (isFunction(controllerInstance.$postLink)) { + controllerInstance.$postLink(); + } + }); + + // This is the function that is injected as `$transclude`. + // Note: all arguments are optional! + function controllersBoundTransclude(scope, cloneAttachFn, futureParentElement, slotName) { + var transcludeControllers; + // No scope passed in: + if (!isScope(scope)) { + slotName = futureParentElement; + futureParentElement = cloneAttachFn; + cloneAttachFn = scope; + scope = undefined; + } + + if (hasElementTranscludeDirective) { + transcludeControllers = elementControllers; + } + if (!futureParentElement) { + futureParentElement = hasElementTranscludeDirective ? $element.parent() : $element; + } + if (slotName) { + // slotTranscludeFn can be one of three things: + // * a transclude function - a filled slot + // * `null` - an optional slot that was not filled + // * `undefined` - a slot that was not declared (i.e. invalid) + var slotTranscludeFn = boundTranscludeFn.$$slots[slotName]; + if (slotTranscludeFn) { + return slotTranscludeFn(scope, cloneAttachFn, transcludeControllers, futureParentElement, scopeToChild); + } else if (isUndefined(slotTranscludeFn)) { + throw $compileMinErr('noslot', + 'No parent directive that requires a transclusion with slot name "{0}". ' + + 'Element: {1}', + slotName, startingTag($element)); + } + } else { + return boundTranscludeFn(scope, cloneAttachFn, transcludeControllers, futureParentElement, scopeToChild); + } + } + } + } + + function getControllers(directiveName, require, $element, elementControllers) { + var value; + + if (isString(require)) { + var match = require.match(REQUIRE_PREFIX_REGEXP); + var name = require.substring(match[0].length); + var inheritType = match[1] || match[3]; + var optional = match[2] === '?'; + + //If only parents then start at the parent element + if (inheritType === '^^') { + $element = $element.parent(); + //Otherwise attempt getting the controller from elementControllers in case + //the element is transcluded (and has no data) and to avoid .data if possible + } else { + value = elementControllers && elementControllers[name]; + value = value && value.instance; + } + + if (!value) { + var dataName = '$' + name + 'Controller'; + value = inheritType ? $element.inheritedData(dataName) : $element.data(dataName); + } + + if (!value && !optional) { + throw $compileMinErr('ctreq', + "Controller '{0}', required by directive '{1}', can't be found!", + name, directiveName); + } + } else if (isArray(require)) { + value = []; + for (var i = 0, ii = require.length; i < ii; i++) { + value[i] = getControllers(directiveName, require[i], $element, elementControllers); + } + } else if (isObject(require)) { + value = {}; + forEach(require, function(controller, property) { + value[property] = getControllers(directiveName, controller, $element, elementControllers); + }); + } + + return value || null; + } + + function setupControllers($element, attrs, transcludeFn, controllerDirectives, isolateScope, scope, newIsolateScopeDirective) { + var elementControllers = createMap(); + for (var controllerKey in controllerDirectives) { + var directive = controllerDirectives[controllerKey]; + var locals = { + $scope: directive === newIsolateScopeDirective || directive.$$isolateScope ? isolateScope : scope, + $element: $element, + $attrs: attrs, + $transclude: transcludeFn + }; + + var controller = directive.controller; + if (controller == '@') { + controller = attrs[directive.name]; + } + + var controllerInstance = $controller(controller, locals, true, directive.controllerAs); + + // For directives with element transclusion the element is a comment. + // In this case .data will not attach any data. + // Instead, we save the controllers for the element in a local hash and attach to .data + // later, once we have the actual element. + elementControllers[directive.name] = controllerInstance; + $element.data('$' + directive.name + 'Controller', controllerInstance.instance); + } + return elementControllers; + } + + // Depending upon the context in which a directive finds itself it might need to have a new isolated + // or child scope created. For instance: + // * if the directive has been pulled into a template because another directive with a higher priority + // asked for element transclusion + // * if the directive itself asks for transclusion but it is at the root of a template and the original + // element was replaced. See https://github.com/angular/angular.js/issues/12936 + function markDirectiveScope(directives, isolateScope, newScope) { + for (var j = 0, jj = directives.length; j < jj; j++) { + directives[j] = inherit(directives[j], {$$isolateScope: isolateScope, $$newScope: newScope}); + } + } + + /** + * looks up the directive and decorates it with exception handling and proper parameters. We + * call this the boundDirective. + * + * @param {string} name name of the directive to look up. + * @param {string} location The directive must be found in specific format. + * String containing any of theses characters: + * + * * `E`: element name + * * `A': attribute + * * `C`: class + * * `M`: comment + * @returns {boolean} true if directive was added. + */ + function addDirective(tDirectives, name, location, maxPriority, ignoreDirective, startAttrName, + endAttrName) { + if (name === ignoreDirective) return null; + var match = null; + if (hasDirectives.hasOwnProperty(name)) { + for (var directive, directives = $injector.get(name + Suffix), + i = 0, ii = directives.length; i < ii; i++) { + try { + directive = directives[i]; + if ((isUndefined(maxPriority) || maxPriority > directive.priority) && + directive.restrict.indexOf(location) != -1) { + if (startAttrName) { + directive = inherit(directive, {$$start: startAttrName, $$end: endAttrName}); + } + if (!directive.$$bindings) { + var bindings = directive.$$bindings = + parseDirectiveBindings(directive, directive.name); + if (isObject(bindings.isolateScope)) { + directive.$$isolateBindings = bindings.isolateScope; + } + } + tDirectives.push(directive); + match = directive; + } + } catch (e) { $exceptionHandler(e); } + } + } + return match; + } + + + /** + * looks up the directive and returns true if it is a multi-element directive, + * and therefore requires DOM nodes between -start and -end markers to be grouped + * together. + * + * @param {string} name name of the directive to look up. + * @returns true if directive was registered as multi-element. + */ + function directiveIsMultiElement(name) { + if (hasDirectives.hasOwnProperty(name)) { + for (var directive, directives = $injector.get(name + Suffix), + i = 0, ii = directives.length; i < ii; i++) { + directive = directives[i]; + if (directive.multiElement) { + return true; + } + } + } + return false; + } + + /** + * When the element is replaced with HTML template then the new attributes + * on the template need to be merged with the existing attributes in the DOM. + * The desired effect is to have both of the attributes present. + * + * @param {object} dst destination attributes (original DOM) + * @param {object} src source attributes (from the directive template) + */ + function mergeTemplateAttributes(dst, src) { + var srcAttr = src.$attr, + dstAttr = dst.$attr, + $element = dst.$$element; + + // reapply the old attributes to the new element + forEach(dst, function(value, key) { + if (key.charAt(0) != '$') { + if (src[key] && src[key] !== value) { + value += (key === 'style' ? ';' : ' ') + src[key]; + } + dst.$set(key, value, true, srcAttr[key]); + } + }); + + // copy the new attributes on the old attrs object + forEach(src, function(value, key) { + if (key == 'class') { + safeAddClass($element, value); + dst['class'] = (dst['class'] ? dst['class'] + ' ' : '') + value; + } else if (key == 'style') { + $element.attr('style', $element.attr('style') + ';' + value); + dst['style'] = (dst['style'] ? dst['style'] + ';' : '') + value; + // `dst` will never contain hasOwnProperty as DOM parser won't let it. + // You will get an "InvalidCharacterError: DOM Exception 5" error if you + // have an attribute like "has-own-property" or "data-has-own-property", etc. + } else if (key.charAt(0) != '$' && !dst.hasOwnProperty(key)) { + dst[key] = value; + dstAttr[key] = srcAttr[key]; + } + }); + } + + + function compileTemplateUrl(directives, $compileNode, tAttrs, + $rootElement, childTranscludeFn, preLinkFns, postLinkFns, previousCompileContext) { + var linkQueue = [], + afterTemplateNodeLinkFn, + afterTemplateChildLinkFn, + beforeTemplateCompileNode = $compileNode[0], + origAsyncDirective = directives.shift(), + derivedSyncDirective = inherit(origAsyncDirective, { + templateUrl: null, transclude: null, replace: null, $$originalDirective: origAsyncDirective + }), + templateUrl = (isFunction(origAsyncDirective.templateUrl)) + ? origAsyncDirective.templateUrl($compileNode, tAttrs) + : origAsyncDirective.templateUrl, + templateNamespace = origAsyncDirective.templateNamespace; + + $compileNode.empty(); + + $templateRequest(templateUrl) + .then(function(content) { + var compileNode, tempTemplateAttrs, $template, childBoundTranscludeFn; + + content = denormalizeTemplate(content); + + if (origAsyncDirective.replace) { + if (jqLiteIsTextNode(content)) { + $template = []; + } else { + $template = removeComments(wrapTemplate(templateNamespace, trim(content))); + } + compileNode = $template[0]; + + if ($template.length != 1 || compileNode.nodeType !== NODE_TYPE_ELEMENT) { + throw $compileMinErr('tplrt', + "Template for directive '{0}' must have exactly one root element. {1}", + origAsyncDirective.name, templateUrl); + } + + tempTemplateAttrs = {$attr: {}}; + replaceWith($rootElement, $compileNode, compileNode); + var templateDirectives = collectDirectives(compileNode, [], tempTemplateAttrs); + + if (isObject(origAsyncDirective.scope)) { + // the original directive that caused the template to be loaded async required + // an isolate scope + markDirectiveScope(templateDirectives, true); + } + directives = templateDirectives.concat(directives); + mergeTemplateAttributes(tAttrs, tempTemplateAttrs); + } else { + compileNode = beforeTemplateCompileNode; + $compileNode.html(content); + } + + directives.unshift(derivedSyncDirective); + + afterTemplateNodeLinkFn = applyDirectivesToNode(directives, compileNode, tAttrs, + childTranscludeFn, $compileNode, origAsyncDirective, preLinkFns, postLinkFns, + previousCompileContext); + forEach($rootElement, function(node, i) { + if (node == compileNode) { + $rootElement[i] = $compileNode[0]; + } + }); + afterTemplateChildLinkFn = compileNodes($compileNode[0].childNodes, childTranscludeFn); + + while (linkQueue.length) { + var scope = linkQueue.shift(), + beforeTemplateLinkNode = linkQueue.shift(), + linkRootElement = linkQueue.shift(), + boundTranscludeFn = linkQueue.shift(), + linkNode = $compileNode[0]; + + if (scope.$$destroyed) continue; + + if (beforeTemplateLinkNode !== beforeTemplateCompileNode) { + var oldClasses = beforeTemplateLinkNode.className; + + if (!(previousCompileContext.hasElementTranscludeDirective && + origAsyncDirective.replace)) { + // it was cloned therefore we have to clone as well. + linkNode = jqLiteClone(compileNode); + } + replaceWith(linkRootElement, jqLite(beforeTemplateLinkNode), linkNode); + + // Copy in CSS classes from original node + safeAddClass(jqLite(linkNode), oldClasses); + } + if (afterTemplateNodeLinkFn.transcludeOnThisElement) { + childBoundTranscludeFn = createBoundTranscludeFn(scope, afterTemplateNodeLinkFn.transclude, boundTranscludeFn); + } else { + childBoundTranscludeFn = boundTranscludeFn; + } + afterTemplateNodeLinkFn(afterTemplateChildLinkFn, scope, linkNode, $rootElement, + childBoundTranscludeFn); + } + linkQueue = null; + }); + + return function delayedNodeLinkFn(ignoreChildLinkFn, scope, node, rootElement, boundTranscludeFn) { + var childBoundTranscludeFn = boundTranscludeFn; + if (scope.$$destroyed) return; + if (linkQueue) { + linkQueue.push(scope, + node, + rootElement, + childBoundTranscludeFn); + } else { + if (afterTemplateNodeLinkFn.transcludeOnThisElement) { + childBoundTranscludeFn = createBoundTranscludeFn(scope, afterTemplateNodeLinkFn.transclude, boundTranscludeFn); + } + afterTemplateNodeLinkFn(afterTemplateChildLinkFn, scope, node, rootElement, childBoundTranscludeFn); + } + }; + } + + + /** + * Sorting function for bound directives. + */ + function byPriority(a, b) { + var diff = b.priority - a.priority; + if (diff !== 0) return diff; + if (a.name !== b.name) return (a.name < b.name) ? -1 : 1; + return a.index - b.index; + } + + function assertNoDuplicate(what, previousDirective, directive, element) { + + function wrapModuleNameIfDefined(moduleName) { + return moduleName ? + (' (module: ' + moduleName + ')') : + ''; + } + + if (previousDirective) { + throw $compileMinErr('multidir', 'Multiple directives [{0}{1}, {2}{3}] asking for {4} on: {5}', + previousDirective.name, wrapModuleNameIfDefined(previousDirective.$$moduleName), + directive.name, wrapModuleNameIfDefined(directive.$$moduleName), what, startingTag(element)); + } + } + + + function addTextInterpolateDirective(directives, text) { + var interpolateFn = $interpolate(text, true); + if (interpolateFn) { + directives.push({ + priority: 0, + compile: function textInterpolateCompileFn(templateNode) { + var templateNodeParent = templateNode.parent(), + hasCompileParent = !!templateNodeParent.length; + + // When transcluding a template that has bindings in the root + // we don't have a parent and thus need to add the class during linking fn. + if (hasCompileParent) compile.$$addBindingClass(templateNodeParent); + + return function textInterpolateLinkFn(scope, node) { + var parent = node.parent(); + if (!hasCompileParent) compile.$$addBindingClass(parent); + compile.$$addBindingInfo(parent, interpolateFn.expressions); + scope.$watch(interpolateFn, function interpolateFnWatchAction(value) { + node[0].nodeValue = value; + }); + }; + } + }); + } + } + + + function wrapTemplate(type, template) { + type = lowercase(type || 'html'); + switch (type) { + case 'svg': + case 'math': + var wrapper = document.createElement('div'); + wrapper.innerHTML = '<' + type + '>' + template + ''; + return wrapper.childNodes[0].childNodes; + default: + return template; + } + } + + + function getTrustedContext(node, attrNormalizedName) { + if (attrNormalizedName == "srcdoc") { + return $sce.HTML; + } + var tag = nodeName_(node); + // maction[xlink:href] can source SVG. It's not limited to . + if (attrNormalizedName == "xlinkHref" || + (tag == "form" && attrNormalizedName == "action") || + (tag != "img" && (attrNormalizedName == "src" || + attrNormalizedName == "ngSrc"))) { + return $sce.RESOURCE_URL; + } + } + + + function addAttrInterpolateDirective(node, directives, value, name, allOrNothing) { + var trustedContext = getTrustedContext(node, name); + allOrNothing = ALL_OR_NOTHING_ATTRS[name] || allOrNothing; + + var interpolateFn = $interpolate(value, true, trustedContext, allOrNothing); + + // no interpolation found -> ignore + if (!interpolateFn) return; + + + if (name === "multiple" && nodeName_(node) === "select") { + throw $compileMinErr("selmulti", + "Binding to the 'multiple' attribute is not supported. Element: {0}", + startingTag(node)); + } + + directives.push({ + priority: 100, + compile: function() { + return { + pre: function attrInterpolatePreLinkFn(scope, element, attr) { + var $$observers = (attr.$$observers || (attr.$$observers = createMap())); + + if (EVENT_HANDLER_ATTR_REGEXP.test(name)) { + throw $compileMinErr('nodomevents', + "Interpolations for HTML DOM event attributes are disallowed. Please use the " + + "ng- versions (such as ng-click instead of onclick) instead."); + } + + // If the attribute has changed since last $interpolate()ed + var newValue = attr[name]; + if (newValue !== value) { + // we need to interpolate again since the attribute value has been updated + // (e.g. by another directive's compile function) + // ensure unset/empty values make interpolateFn falsy + interpolateFn = newValue && $interpolate(newValue, true, trustedContext, allOrNothing); + value = newValue; + } + + // if attribute was updated so that there is no interpolation going on we don't want to + // register any observers + if (!interpolateFn) return; + + // initialize attr object so that it's ready in case we need the value for isolate + // scope initialization, otherwise the value would not be available from isolate + // directive's linking fn during linking phase + attr[name] = interpolateFn(scope); + + ($$observers[name] || ($$observers[name] = [])).$$inter = true; + (attr.$$observers && attr.$$observers[name].$$scope || scope). + $watch(interpolateFn, function interpolateFnWatchAction(newValue, oldValue) { + //special case for class attribute addition + removal + //so that class changes can tap into the animation + //hooks provided by the $animate service. Be sure to + //skip animations when the first digest occurs (when + //both the new and the old values are the same) since + //the CSS classes are the non-interpolated values + if (name === 'class' && newValue != oldValue) { + attr.$updateClass(newValue, oldValue); + } else { + attr.$set(name, newValue); + } + }); + } + }; + } + }); + } + + + /** + * This is a special jqLite.replaceWith, which can replace items which + * have no parents, provided that the containing jqLite collection is provided. + * + * @param {JqLite=} $rootElement The root of the compile tree. Used so that we can replace nodes + * in the root of the tree. + * @param {JqLite} elementsToRemove The jqLite element which we are going to replace. We keep + * the shell, but replace its DOM node reference. + * @param {Node} newNode The new DOM node. + */ + function replaceWith($rootElement, elementsToRemove, newNode) { + var firstElementToRemove = elementsToRemove[0], + removeCount = elementsToRemove.length, + parent = firstElementToRemove.parentNode, + i, ii; + + if ($rootElement) { + for (i = 0, ii = $rootElement.length; i < ii; i++) { + if ($rootElement[i] == firstElementToRemove) { + $rootElement[i++] = newNode; + for (var j = i, j2 = j + removeCount - 1, + jj = $rootElement.length; + j < jj; j++, j2++) { + if (j2 < jj) { + $rootElement[j] = $rootElement[j2]; + } else { + delete $rootElement[j]; + } + } + $rootElement.length -= removeCount - 1; + + // If the replaced element is also the jQuery .context then replace it + // .context is a deprecated jQuery api, so we should set it only when jQuery set it + // http://api.jquery.com/context/ + if ($rootElement.context === firstElementToRemove) { + $rootElement.context = newNode; + } + break; + } + } + } + + if (parent) { + parent.replaceChild(newNode, firstElementToRemove); + } + + // Append all the `elementsToRemove` to a fragment. This will... + // - remove them from the DOM + // - allow them to still be traversed with .nextSibling + // - allow a single fragment.qSA to fetch all elements being removed + var fragment = document.createDocumentFragment(); + for (i = 0; i < removeCount; i++) { + fragment.appendChild(elementsToRemove[i]); + } + + if (jqLite.hasData(firstElementToRemove)) { + // Copy over user data (that includes Angular's $scope etc.). Don't copy private + // data here because there's no public interface in jQuery to do that and copying over + // event listeners (which is the main use of private data) wouldn't work anyway. + jqLite.data(newNode, jqLite.data(firstElementToRemove)); + + // Remove $destroy event listeners from `firstElementToRemove` + jqLite(firstElementToRemove).off('$destroy'); + } + + // Cleanup any data/listeners on the elements and children. + // This includes invoking the $destroy event on any elements with listeners. + jqLite.cleanData(fragment.querySelectorAll('*')); + + // Update the jqLite collection to only contain the `newNode` + for (i = 1; i < removeCount; i++) { + delete elementsToRemove[i]; + } + elementsToRemove[0] = newNode; + elementsToRemove.length = 1; + } + + + function cloneAndAnnotateFn(fn, annotation) { + return extend(function() { return fn.apply(null, arguments); }, fn, annotation); + } + + + function invokeLinkFn(linkFn, scope, $element, attrs, controllers, transcludeFn) { + try { + linkFn(scope, $element, attrs, controllers, transcludeFn); + } catch (e) { + $exceptionHandler(e, startingTag($element)); + } + } + + + // Set up $watches for isolate scope and controller bindings. This process + // only occurs for isolate scopes and new scopes with controllerAs. + function initializeDirectiveBindings(scope, attrs, destination, bindings, directive) { + var removeWatchCollection = []; + var changes; + forEach(bindings, function initializeBinding(definition, scopeName) { + var attrName = definition.attrName, + optional = definition.optional, + mode = definition.mode, // @, =, or & + lastValue, + parentGet, parentSet, compare, removeWatch; + + switch (mode) { + + case '@': + if (!optional && !hasOwnProperty.call(attrs, attrName)) { + destination[scopeName] = attrs[attrName] = void 0; + } + attrs.$observe(attrName, function(value) { + if (isString(value)) { + var oldValue = destination[scopeName]; + recordChanges(scopeName, value, oldValue); + destination[scopeName] = value; + } + }); + attrs.$$observers[attrName].$$scope = scope; + lastValue = attrs[attrName]; + if (isString(lastValue)) { + // If the attribute has been provided then we trigger an interpolation to ensure + // the value is there for use in the link fn + destination[scopeName] = $interpolate(lastValue)(scope); + } else if (isBoolean(lastValue)) { + // If the attributes is one of the BOOLEAN_ATTR then Angular will have converted + // the value to boolean rather than a string, so we special case this situation + destination[scopeName] = lastValue; + } + break; + + case '=': + if (!hasOwnProperty.call(attrs, attrName)) { + if (optional) break; + attrs[attrName] = void 0; + } + if (optional && !attrs[attrName]) break; + + parentGet = $parse(attrs[attrName]); + if (parentGet.literal) { + compare = equals; + } else { + compare = function simpleCompare(a, b) { return a === b || (a !== a && b !== b); }; + } + parentSet = parentGet.assign || function() { + // reset the change, or we will throw this exception on every $digest + lastValue = destination[scopeName] = parentGet(scope); + throw $compileMinErr('nonassign', + "Expression '{0}' in attribute '{1}' used with directive '{2}' is non-assignable!", + attrs[attrName], attrName, directive.name); + }; + lastValue = destination[scopeName] = parentGet(scope); + var parentValueWatch = function parentValueWatch(parentValue) { + if (!compare(parentValue, destination[scopeName])) { + // we are out of sync and need to copy + if (!compare(parentValue, lastValue)) { + // parent changed and it has precedence + destination[scopeName] = parentValue; + } else { + // if the parent can be assigned then do so + parentSet(scope, parentValue = destination[scopeName]); + } + } + return lastValue = parentValue; + }; + parentValueWatch.$stateful = true; + if (definition.collection) { + removeWatch = scope.$watchCollection(attrs[attrName], parentValueWatch); + } else { + removeWatch = scope.$watch($parse(attrs[attrName], parentValueWatch), null, parentGet.literal); + } + removeWatchCollection.push(removeWatch); + break; + + case '<': + if (!hasOwnProperty.call(attrs, attrName)) { + if (optional) break; + attrs[attrName] = void 0; + } + if (optional && !attrs[attrName]) break; + + parentGet = $parse(attrs[attrName]); + + destination[scopeName] = parentGet(scope); + + removeWatch = scope.$watch(parentGet, function parentValueWatchAction(newParentValue) { + var oldValue = destination[scopeName]; + recordChanges(scopeName, newParentValue, oldValue); + destination[scopeName] = newParentValue; + }, parentGet.literal); + + removeWatchCollection.push(removeWatch); + break; + + case '&': + // Don't assign Object.prototype method to scope + parentGet = attrs.hasOwnProperty(attrName) ? $parse(attrs[attrName]) : noop; + + // Don't assign noop to destination if expression is not valid + if (parentGet === noop && optional) break; + + destination[scopeName] = function(locals) { + return parentGet(scope, locals); + }; + break; + } + }); + + function recordChanges(key, currentValue, previousValue) { + if (isFunction(destination.$onChanges) && currentValue !== previousValue) { + // If we have not already scheduled the top level onChangesQueue handler then do so now + if (!onChangesQueue) { + scope.$$postDigest(flushOnChangesQueue); + onChangesQueue = []; + } + // If we have not already queued a trigger of onChanges for this controller then do so now + if (!changes) { + changes = {}; + onChangesQueue.push(triggerOnChangesHook); + } + // If the has been a change on this property already then we need to reuse the previous value + if (changes[key]) { + previousValue = changes[key].previousValue; + } + // Store this change + changes[key] = {previousValue: previousValue, currentValue: currentValue}; + } + } + + function triggerOnChangesHook() { + destination.$onChanges(changes); + // Now clear the changes so that we schedule onChanges when more changes arrive + changes = undefined; + } + + return removeWatchCollection.length && function removeWatches() { + for (var i = 0, ii = removeWatchCollection.length; i < ii; ++i) { + removeWatchCollection[i](); + } + }; + } + }]; +} + +var PREFIX_REGEXP = /^((?:x|data)[\:\-_])/i; +/** + * Converts all accepted directives format into proper directive name. + * @param name Name to normalize + */ +function directiveNormalize(name) { + return camelCase(name.replace(PREFIX_REGEXP, '')); +} + +/** + * @ngdoc type + * @name $compile.directive.Attributes + * + * @description + * A shared object between directive compile / linking functions which contains normalized DOM + * element attributes. The values reflect current binding state `{{ }}`. The normalization is + * needed since all of these are treated as equivalent in Angular: + * + * ``` + * + * ``` + */ + +/** + * @ngdoc property + * @name $compile.directive.Attributes#$attr + * + * @description + * A map of DOM element attribute names to the normalized name. This is + * needed to do reverse lookup from normalized name back to actual name. + */ + + +/** + * @ngdoc method + * @name $compile.directive.Attributes#$set + * @kind function + * + * @description + * Set DOM element attribute value. + * + * + * @param {string} name Normalized element attribute name of the property to modify. The name is + * reverse-translated using the {@link ng.$compile.directive.Attributes#$attr $attr} + * property to the original name. + * @param {string} value Value to set the attribute to. The value can be an interpolated string. + */ + + + +/** + * Closure compiler type information + */ + +function nodesetLinkingFn( + /* angular.Scope */ scope, + /* NodeList */ nodeList, + /* Element */ rootElement, + /* function(Function) */ boundTranscludeFn +) {} + +function directiveLinkingFn( + /* nodesetLinkingFn */ nodesetLinkingFn, + /* angular.Scope */ scope, + /* Node */ node, + /* Element */ rootElement, + /* function(Function) */ boundTranscludeFn +) {} + +function tokenDifference(str1, str2) { + var values = '', + tokens1 = str1.split(/\s+/), + tokens2 = str2.split(/\s+/); + + outer: + for (var i = 0; i < tokens1.length; i++) { + var token = tokens1[i]; + for (var j = 0; j < tokens2.length; j++) { + if (token == tokens2[j]) continue outer; + } + values += (values.length > 0 ? ' ' : '') + token; + } + return values; +} + +function removeComments(jqNodes) { + jqNodes = jqLite(jqNodes); + var i = jqNodes.length; + + if (i <= 1) { + return jqNodes; + } + + while (i--) { + var node = jqNodes[i]; + if (node.nodeType === NODE_TYPE_COMMENT) { + splice.call(jqNodes, i, 1); + } + } + return jqNodes; +} + +var $controllerMinErr = minErr('$controller'); + + +var CNTRL_REG = /^(\S+)(\s+as\s+([\w$]+))?$/; +function identifierForController(controller, ident) { + if (ident && isString(ident)) return ident; + if (isString(controller)) { + var match = CNTRL_REG.exec(controller); + if (match) return match[3]; + } +} + + +/** + * @ngdoc provider + * @name $controllerProvider + * @description + * The {@link ng.$controller $controller service} is used by Angular to create new + * controllers. + * + * This provider allows controller registration via the + * {@link ng.$controllerProvider#register register} method. + */ +function $ControllerProvider() { + var controllers = {}, + globals = false; + + /** + * @ngdoc method + * @name $controllerProvider#has + * @param {string} name Controller name to check. + */ + this.has = function(name) { + return controllers.hasOwnProperty(name); + }; + + /** + * @ngdoc method + * @name $controllerProvider#register + * @param {string|Object} name Controller name, or an object map of controllers where the keys are + * the names and the values are the constructors. + * @param {Function|Array} constructor Controller constructor fn (optionally decorated with DI + * annotations in the array notation). + */ + this.register = function(name, constructor) { + assertNotHasOwnProperty(name, 'controller'); + if (isObject(name)) { + extend(controllers, name); + } else { + controllers[name] = constructor; + } + }; + + /** + * @ngdoc method + * @name $controllerProvider#allowGlobals + * @description If called, allows `$controller` to find controller constructors on `window` + */ + this.allowGlobals = function() { + globals = true; + }; + + + this.$get = ['$injector', '$window', function($injector, $window) { + + /** + * @ngdoc service + * @name $controller + * @requires $injector + * + * @param {Function|string} constructor If called with a function then it's considered to be the + * controller constructor function. Otherwise it's considered to be a string which is used + * to retrieve the controller constructor using the following steps: + * + * * check if a controller with given name is registered via `$controllerProvider` + * * check if evaluating the string on the current scope returns a constructor + * * if $controllerProvider#allowGlobals, check `window[constructor]` on the global + * `window` object (not recommended) + * + * The string can use the `controller as property` syntax, where the controller instance is published + * as the specified property on the `scope`; the `scope` must be injected into `locals` param for this + * to work correctly. + * + * @param {Object} locals Injection locals for Controller. + * @return {Object} Instance of given controller. + * + * @description + * `$controller` service is responsible for instantiating controllers. + * + * It's just a simple call to {@link auto.$injector $injector}, but extracted into + * a service, so that one can override this service with [BC version](https://gist.github.com/1649788). + */ + return function $controller(expression, locals, later, ident) { + // PRIVATE API: + // param `later` --- indicates that the controller's constructor is invoked at a later time. + // If true, $controller will allocate the object with the correct + // prototype chain, but will not invoke the controller until a returned + // callback is invoked. + // param `ident` --- An optional label which overrides the label parsed from the controller + // expression, if any. + var instance, match, constructor, identifier; + later = later === true; + if (ident && isString(ident)) { + identifier = ident; + } + + if (isString(expression)) { + match = expression.match(CNTRL_REG); + if (!match) { + throw $controllerMinErr('ctrlfmt', + "Badly formed controller string '{0}'. " + + "Must match `__name__ as __id__` or `__name__`.", expression); + } + constructor = match[1], + identifier = identifier || match[3]; + expression = controllers.hasOwnProperty(constructor) + ? controllers[constructor] + : getter(locals.$scope, constructor, true) || + (globals ? getter($window, constructor, true) : undefined); + + assertArgFn(expression, constructor, true); + } + + if (later) { + // Instantiate controller later: + // This machinery is used to create an instance of the object before calling the + // controller's constructor itself. + // + // This allows properties to be added to the controller before the constructor is + // invoked. Primarily, this is used for isolate scope bindings in $compile. + // + // This feature is not intended for use by applications, and is thus not documented + // publicly. + // Object creation: http://jsperf.com/create-constructor/2 + var controllerPrototype = (isArray(expression) ? + expression[expression.length - 1] : expression).prototype; + instance = Object.create(controllerPrototype || null); + + if (identifier) { + addIdentifier(locals, identifier, instance, constructor || expression.name); + } + + var instantiate; + return instantiate = extend(function $controllerInit() { + var result = $injector.invoke(expression, instance, locals, constructor); + if (result !== instance && (isObject(result) || isFunction(result))) { + instance = result; + if (identifier) { + // If result changed, re-assign controllerAs value to scope. + addIdentifier(locals, identifier, instance, constructor || expression.name); + } + } + return instance; + }, { + instance: instance, + identifier: identifier + }); + } + + instance = $injector.instantiate(expression, locals, constructor); + + if (identifier) { + addIdentifier(locals, identifier, instance, constructor || expression.name); + } + + return instance; + }; + + function addIdentifier(locals, identifier, instance, name) { + if (!(locals && isObject(locals.$scope))) { + throw minErr('$controller')('noscp', + "Cannot export controller '{0}' as '{1}'! No $scope object provided via `locals`.", + name, identifier); + } + + locals.$scope[identifier] = instance; + } + }]; +} + +/** + * @ngdoc service + * @name $document + * @requires $window + * + * @description + * A {@link angular.element jQuery or jqLite} wrapper for the browser's `window.document` object. + * + * @example + + +
+

$document title:

+

window.document title:

+
+
+ + angular.module('documentExample', []) + .controller('ExampleController', ['$scope', '$document', function($scope, $document) { + $scope.title = $document[0].title; + $scope.windowTitle = angular.element(window.document)[0].title; + }]); + +
+ */ +function $DocumentProvider() { + this.$get = ['$window', function(window) { + return jqLite(window.document); + }]; +} + +/** + * @ngdoc service + * @name $exceptionHandler + * @requires ng.$log + * + * @description + * Any uncaught exception in angular expressions is delegated to this service. + * The default implementation simply delegates to `$log.error` which logs it into + * the browser console. + * + * In unit tests, if `angular-mocks.js` is loaded, this service is overridden by + * {@link ngMock.$exceptionHandler mock $exceptionHandler} which aids in testing. + * + * ## Example: + * + * ```js + * angular.module('exceptionOverride', []).factory('$exceptionHandler', function() { + * return function(exception, cause) { + * exception.message += ' (caused by "' + cause + '")'; + * throw exception; + * }; + * }); + * ``` + * + * This example will override the normal action of `$exceptionHandler`, to make angular + * exceptions fail hard when they happen, instead of just logging to the console. + * + *
+ * Note, that code executed in event-listeners (even those registered using jqLite's `on`/`bind` + * methods) does not delegate exceptions to the {@link ng.$exceptionHandler $exceptionHandler} + * (unless executed during a digest). + * + * If you wish, you can manually delegate exceptions, e.g. + * `try { ... } catch(e) { $exceptionHandler(e); }` + * + * @param {Error} exception Exception associated with the error. + * @param {string=} cause optional information about the context in which + * the error was thrown. + * + */ +function $ExceptionHandlerProvider() { + this.$get = ['$log', function($log) { + return function(exception, cause) { + $log.error.apply($log, arguments); + }; + }]; +} + +var $$ForceReflowProvider = function() { + this.$get = ['$document', function($document) { + return function(domNode) { + //the line below will force the browser to perform a repaint so + //that all the animated elements within the animation frame will + //be properly updated and drawn on screen. This is required to + //ensure that the preparation animation is properly flushed so that + //the active state picks up from there. DO NOT REMOVE THIS LINE. + //DO NOT OPTIMIZE THIS LINE. THE MINIFIER WILL REMOVE IT OTHERWISE WHICH + //WILL RESULT IN AN UNPREDICTABLE BUG THAT IS VERY HARD TO TRACK DOWN AND + //WILL TAKE YEARS AWAY FROM YOUR LIFE. + if (domNode) { + if (!domNode.nodeType && domNode instanceof jqLite) { + domNode = domNode[0]; + } + } else { + domNode = $document[0].body; + } + return domNode.offsetWidth + 1; + }; + }]; +}; + +var APPLICATION_JSON = 'application/json'; +var CONTENT_TYPE_APPLICATION_JSON = {'Content-Type': APPLICATION_JSON + ';charset=utf-8'}; +var JSON_START = /^\[|^\{(?!\{)/; +var JSON_ENDS = { + '[': /]$/, + '{': /}$/ +}; +var JSON_PROTECTION_PREFIX = /^\)\]\}',?\n/; +var $httpMinErr = minErr('$http'); +var $httpMinErrLegacyFn = function(method) { + return function() { + throw $httpMinErr('legacy', 'The method `{0}` on the promise returned from `$http` has been disabled.', method); + }; +}; + +function serializeValue(v) { + if (isObject(v)) { + return isDate(v) ? v.toISOString() : toJson(v); + } + return v; +} + + +function $HttpParamSerializerProvider() { + /** + * @ngdoc service + * @name $httpParamSerializer + * @description + * + * Default {@link $http `$http`} params serializer that converts objects to strings + * according to the following rules: + * + * * `{'foo': 'bar'}` results in `foo=bar` + * * `{'foo': Date.now()}` results in `foo=2015-04-01T09%3A50%3A49.262Z` (`toISOString()` and encoded representation of a Date object) + * * `{'foo': ['bar', 'baz']}` results in `foo=bar&foo=baz` (repeated key for each array element) + * * `{'foo': {'bar':'baz'}}` results in `foo=%7B%22bar%22%3A%22baz%22%7D"` (stringified and encoded representation of an object) + * + * Note that serializer will sort the request parameters alphabetically. + * */ + + this.$get = function() { + return function ngParamSerializer(params) { + if (!params) return ''; + var parts = []; + forEachSorted(params, function(value, key) { + if (value === null || isUndefined(value)) return; + if (isArray(value)) { + forEach(value, function(v) { + parts.push(encodeUriQuery(key) + '=' + encodeUriQuery(serializeValue(v))); + }); + } else { + parts.push(encodeUriQuery(key) + '=' + encodeUriQuery(serializeValue(value))); + } + }); + + return parts.join('&'); + }; + }; +} + +function $HttpParamSerializerJQLikeProvider() { + /** + * @ngdoc service + * @name $httpParamSerializerJQLike + * @description + * + * Alternative {@link $http `$http`} params serializer that follows + * jQuery's [`param()`](http://api.jquery.com/jquery.param/) method logic. + * The serializer will also sort the params alphabetically. + * + * To use it for serializing `$http` request parameters, set it as the `paramSerializer` property: + * + * ```js + * $http({ + * url: myUrl, + * method: 'GET', + * params: myParams, + * paramSerializer: '$httpParamSerializerJQLike' + * }); + * ``` + * + * It is also possible to set it as the default `paramSerializer` in the + * {@link $httpProvider#defaults `$httpProvider`}. + * + * Additionally, you can inject the serializer and use it explicitly, for example to serialize + * form data for submission: + * + * ```js + * .controller(function($http, $httpParamSerializerJQLike) { + * //... + * + * $http({ + * url: myUrl, + * method: 'POST', + * data: $httpParamSerializerJQLike(myData), + * headers: { + * 'Content-Type': 'application/x-www-form-urlencoded' + * } + * }); + * + * }); + * ``` + * + * */ + this.$get = function() { + return function jQueryLikeParamSerializer(params) { + if (!params) return ''; + var parts = []; + serialize(params, '', true); + return parts.join('&'); + + function serialize(toSerialize, prefix, topLevel) { + if (toSerialize === null || isUndefined(toSerialize)) return; + if (isArray(toSerialize)) { + forEach(toSerialize, function(value, index) { + serialize(value, prefix + '[' + (isObject(value) ? index : '') + ']'); + }); + } else if (isObject(toSerialize) && !isDate(toSerialize)) { + forEachSorted(toSerialize, function(value, key) { + serialize(value, prefix + + (topLevel ? '' : '[') + + key + + (topLevel ? '' : ']')); + }); + } else { + parts.push(encodeUriQuery(prefix) + '=' + encodeUriQuery(serializeValue(toSerialize))); + } + } + }; + }; +} + +function defaultHttpResponseTransform(data, headers) { + if (isString(data)) { + // Strip json vulnerability protection prefix and trim whitespace + var tempData = data.replace(JSON_PROTECTION_PREFIX, '').trim(); + + if (tempData) { + var contentType = headers('Content-Type'); + if ((contentType && (contentType.indexOf(APPLICATION_JSON) === 0)) || isJsonLike(tempData)) { + data = fromJson(tempData); + } + } + } + + return data; +} + +function isJsonLike(str) { + var jsonStart = str.match(JSON_START); + return jsonStart && JSON_ENDS[jsonStart[0]].test(str); +} + +/** + * Parse headers into key value object + * + * @param {string} headers Raw headers as a string + * @returns {Object} Parsed headers as key value object + */ +function parseHeaders(headers) { + var parsed = createMap(), i; + + function fillInParsed(key, val) { + if (key) { + parsed[key] = parsed[key] ? parsed[key] + ', ' + val : val; + } + } + + if (isString(headers)) { + forEach(headers.split('\n'), function(line) { + i = line.indexOf(':'); + fillInParsed(lowercase(trim(line.substr(0, i))), trim(line.substr(i + 1))); + }); + } else if (isObject(headers)) { + forEach(headers, function(headerVal, headerKey) { + fillInParsed(lowercase(headerKey), trim(headerVal)); + }); + } + + return parsed; +} + + +/** + * Returns a function that provides access to parsed headers. + * + * Headers are lazy parsed when first requested. + * @see parseHeaders + * + * @param {(string|Object)} headers Headers to provide access to. + * @returns {function(string=)} Returns a getter function which if called with: + * + * - if called with single an argument returns a single header value or null + * - if called with no arguments returns an object containing all headers. + */ +function headersGetter(headers) { + var headersObj; + + return function(name) { + if (!headersObj) headersObj = parseHeaders(headers); + + if (name) { + var value = headersObj[lowercase(name)]; + if (value === void 0) { + value = null; + } + return value; + } + + return headersObj; + }; +} + + +/** + * Chain all given functions + * + * This function is used for both request and response transforming + * + * @param {*} data Data to transform. + * @param {function(string=)} headers HTTP headers getter fn. + * @param {number} status HTTP status code of the response. + * @param {(Function|Array.)} fns Function or an array of functions. + * @returns {*} Transformed data. + */ +function transformData(data, headers, status, fns) { + if (isFunction(fns)) { + return fns(data, headers, status); + } + + forEach(fns, function(fn) { + data = fn(data, headers, status); + }); + + return data; +} + + +function isSuccess(status) { + return 200 <= status && status < 300; +} + + +/** + * @ngdoc provider + * @name $httpProvider + * @description + * Use `$httpProvider` to change the default behavior of the {@link ng.$http $http} service. + * */ +function $HttpProvider() { + /** + * @ngdoc property + * @name $httpProvider#defaults + * @description + * + * Object containing default values for all {@link ng.$http $http} requests. + * + * - **`defaults.cache`** - {boolean|Object} - A boolean value or object created with + * {@link ng.$cacheFactory `$cacheFactory`} to enable or disable caching of HTTP responses + * by default. See {@link $http#caching $http Caching} for more information. + * + * - **`defaults.xsrfCookieName`** - {string} - Name of cookie containing the XSRF token. + * Defaults value is `'XSRF-TOKEN'`. + * + * - **`defaults.xsrfHeaderName`** - {string} - Name of HTTP header to populate with the + * XSRF token. Defaults value is `'X-XSRF-TOKEN'`. + * + * - **`defaults.headers`** - {Object} - Default headers for all $http requests. + * Refer to {@link ng.$http#setting-http-headers $http} for documentation on + * setting default headers. + * - **`defaults.headers.common`** + * - **`defaults.headers.post`** + * - **`defaults.headers.put`** + * - **`defaults.headers.patch`** + * + * + * - **`defaults.paramSerializer`** - `{string|function(Object):string}` - A function + * used to the prepare string representation of request parameters (specified as an object). + * If specified as string, it is interpreted as a function registered with the {@link auto.$injector $injector}. + * Defaults to {@link ng.$httpParamSerializer $httpParamSerializer}. + * + **/ + var defaults = this.defaults = { + // transform incoming response data + transformResponse: [defaultHttpResponseTransform], + + // transform outgoing request data + transformRequest: [function(d) { + return isObject(d) && !isFile(d) && !isBlob(d) && !isFormData(d) ? toJson(d) : d; + }], + + // default headers + headers: { + common: { + 'Accept': 'application/json, text/plain, */*' + }, + post: shallowCopy(CONTENT_TYPE_APPLICATION_JSON), + put: shallowCopy(CONTENT_TYPE_APPLICATION_JSON), + patch: shallowCopy(CONTENT_TYPE_APPLICATION_JSON) + }, + + xsrfCookieName: 'XSRF-TOKEN', + xsrfHeaderName: 'X-XSRF-TOKEN', + + paramSerializer: '$httpParamSerializer' + }; + + var useApplyAsync = false; + /** + * @ngdoc method + * @name $httpProvider#useApplyAsync + * @description + * + * Configure $http service to combine processing of multiple http responses received at around + * the same time via {@link ng.$rootScope.Scope#$applyAsync $rootScope.$applyAsync}. This can result in + * significant performance improvement for bigger applications that make many HTTP requests + * concurrently (common during application bootstrap). + * + * Defaults to false. If no value is specified, returns the current configured value. + * + * @param {boolean=} value If true, when requests are loaded, they will schedule a deferred + * "apply" on the next tick, giving time for subsequent requests in a roughly ~10ms window + * to load and share the same digest cycle. + * + * @returns {boolean|Object} If a value is specified, returns the $httpProvider for chaining. + * otherwise, returns the current configured value. + **/ + this.useApplyAsync = function(value) { + if (isDefined(value)) { + useApplyAsync = !!value; + return this; + } + return useApplyAsync; + }; + + var useLegacyPromise = true; + /** + * @ngdoc method + * @name $httpProvider#useLegacyPromiseExtensions + * @description + * + * Configure `$http` service to return promises without the shorthand methods `success` and `error`. + * This should be used to make sure that applications work without these methods. + * + * Defaults to true. If no value is specified, returns the current configured value. + * + * @param {boolean=} value If true, `$http` will return a promise with the deprecated legacy `success` and `error` methods. + * + * @returns {boolean|Object} If a value is specified, returns the $httpProvider for chaining. + * otherwise, returns the current configured value. + **/ + this.useLegacyPromiseExtensions = function(value) { + if (isDefined(value)) { + useLegacyPromise = !!value; + return this; + } + return useLegacyPromise; + }; + + /** + * @ngdoc property + * @name $httpProvider#interceptors + * @description + * + * Array containing service factories for all synchronous or asynchronous {@link ng.$http $http} + * pre-processing of request or postprocessing of responses. + * + * These service factories are ordered by request, i.e. they are applied in the same order as the + * array, on request, but reverse order, on response. + * + * {@link ng.$http#interceptors Interceptors detailed info} + **/ + var interceptorFactories = this.interceptors = []; + + this.$get = ['$httpBackend', '$$cookieReader', '$cacheFactory', '$rootScope', '$q', '$injector', + function($httpBackend, $$cookieReader, $cacheFactory, $rootScope, $q, $injector) { + + var defaultCache = $cacheFactory('$http'); + + /** + * Make sure that default param serializer is exposed as a function + */ + defaults.paramSerializer = isString(defaults.paramSerializer) ? + $injector.get(defaults.paramSerializer) : defaults.paramSerializer; + + /** + * Interceptors stored in reverse order. Inner interceptors before outer interceptors. + * The reversal is needed so that we can build up the interception chain around the + * server request. + */ + var reversedInterceptors = []; + + forEach(interceptorFactories, function(interceptorFactory) { + reversedInterceptors.unshift(isString(interceptorFactory) + ? $injector.get(interceptorFactory) : $injector.invoke(interceptorFactory)); + }); + + /** + * @ngdoc service + * @kind function + * @name $http + * @requires ng.$httpBackend + * @requires $cacheFactory + * @requires $rootScope + * @requires $q + * @requires $injector + * + * @description + * The `$http` service is a core Angular service that facilitates communication with the remote + * HTTP servers via the browser's [XMLHttpRequest](https://developer.mozilla.org/en/xmlhttprequest) + * object or via [JSONP](http://en.wikipedia.org/wiki/JSONP). + * + * For unit testing applications that use `$http` service, see + * {@link ngMock.$httpBackend $httpBackend mock}. + * + * For a higher level of abstraction, please check out the {@link ngResource.$resource + * $resource} service. + * + * The $http API is based on the {@link ng.$q deferred/promise APIs} exposed by + * the $q service. While for simple usage patterns this doesn't matter much, for advanced usage + * it is important to familiarize yourself with these APIs and the guarantees they provide. + * + * + * ## General usage + * The `$http` service is a function which takes a single argument — a {@link $http#usage configuration object} — + * that is used to generate an HTTP request and returns a {@link ng.$q promise}. + * + * ```js + * // Simple GET request example: + * $http({ + * method: 'GET', + * url: '/someUrl' + * }).then(function successCallback(response) { + * // this callback will be called asynchronously + * // when the response is available + * }, function errorCallback(response) { + * // called asynchronously if an error occurs + * // or server returns response with an error status. + * }); + * ``` + * + * The response object has these properties: + * + * - **data** – `{string|Object}` – The response body transformed with the transform + * functions. + * - **status** – `{number}` – HTTP status code of the response. + * - **headers** – `{function([headerName])}` – Header getter function. + * - **config** – `{Object}` – The configuration object that was used to generate the request. + * - **statusText** – `{string}` – HTTP status text of the response. + * + * A response status code between 200 and 299 is considered a success status and + * will result in the success callback being called. Note that if the response is a redirect, + * XMLHttpRequest will transparently follow it, meaning that the error callback will not be + * called for such responses. + * + * + * ## Shortcut methods + * + * Shortcut methods are also available. All shortcut methods require passing in the URL, and + * request data must be passed in for POST/PUT requests. An optional config can be passed as the + * last argument. + * + * ```js + * $http.get('/someUrl', config).then(successCallback, errorCallback); + * $http.post('/someUrl', data, config).then(successCallback, errorCallback); + * ``` + * + * Complete list of shortcut methods: + * + * - {@link ng.$http#get $http.get} + * - {@link ng.$http#head $http.head} + * - {@link ng.$http#post $http.post} + * - {@link ng.$http#put $http.put} + * - {@link ng.$http#delete $http.delete} + * - {@link ng.$http#jsonp $http.jsonp} + * - {@link ng.$http#patch $http.patch} + * + * + * ## Writing Unit Tests that use $http + * When unit testing (using {@link ngMock ngMock}), it is necessary to call + * {@link ngMock.$httpBackend#flush $httpBackend.flush()} to flush each pending + * request using trained responses. + * + * ``` + * $httpBackend.expectGET(...); + * $http.get(...); + * $httpBackend.flush(); + * ``` + * + * ## Deprecation Notice + *
+ * The `$http` legacy promise methods `success` and `error` have been deprecated. + * Use the standard `then` method instead. + * If {@link $httpProvider#useLegacyPromiseExtensions `$httpProvider.useLegacyPromiseExtensions`} is set to + * `false` then these methods will throw {@link $http:legacy `$http/legacy`} error. + *
+ * + * ## Setting HTTP Headers + * + * The $http service will automatically add certain HTTP headers to all requests. These defaults + * can be fully configured by accessing the `$httpProvider.defaults.headers` configuration + * object, which currently contains this default configuration: + * + * - `$httpProvider.defaults.headers.common` (headers that are common for all requests): + * - `Accept: application/json, text/plain, * / *` + * - `$httpProvider.defaults.headers.post`: (header defaults for POST requests) + * - `Content-Type: application/json` + * - `$httpProvider.defaults.headers.put` (header defaults for PUT requests) + * - `Content-Type: application/json` + * + * To add or overwrite these defaults, simply add or remove a property from these configuration + * objects. To add headers for an HTTP method other than POST or PUT, simply add a new object + * with the lowercased HTTP method name as the key, e.g. + * `$httpProvider.defaults.headers.get = { 'My-Header' : 'value' }`. + * + * The defaults can also be set at runtime via the `$http.defaults` object in the same + * fashion. For example: + * + * ``` + * module.run(function($http) { + * $http.defaults.headers.common.Authorization = 'Basic YmVlcDpib29w'; + * }); + * ``` + * + * In addition, you can supply a `headers` property in the config object passed when + * calling `$http(config)`, which overrides the defaults without changing them globally. + * + * To explicitly remove a header automatically added via $httpProvider.defaults.headers on a per request basis, + * Use the `headers` property, setting the desired header to `undefined`. For example: + * + * ```js + * var req = { + * method: 'POST', + * url: 'http://example.com', + * headers: { + * 'Content-Type': undefined + * }, + * data: { test: 'test' } + * } + * + * $http(req).then(function(){...}, function(){...}); + * ``` + * + * ## Transforming Requests and Responses + * + * Both requests and responses can be transformed using transformation functions: `transformRequest` + * and `transformResponse`. These properties can be a single function that returns + * the transformed value (`function(data, headersGetter, status)`) or an array of such transformation functions, + * which allows you to `push` or `unshift` a new transformation function into the transformation chain. + * + *
+ * **Note:** Angular does not make a copy of the `data` parameter before it is passed into the `transformRequest` pipeline. + * That means changes to the properties of `data` are not local to the transform function (since Javascript passes objects by reference). + * For example, when calling `$http.get(url, $scope.myObject)`, modifications to the object's properties in a transformRequest + * function will be reflected on the scope and in any templates where the object is data-bound. + * To prevent his, transform functions should have no side-effects. + * If you need to modify properties, it is recommended to make a copy of the data, or create new object to return. + *
+ * + * ### Default Transformations + * + * The `$httpProvider` provider and `$http` service expose `defaults.transformRequest` and + * `defaults.transformResponse` properties. If a request does not provide its own transformations + * then these will be applied. + * + * You can augment or replace the default transformations by modifying these properties by adding to or + * replacing the array. + * + * Angular provides the following default transformations: + * + * Request transformations (`$httpProvider.defaults.transformRequest` and `$http.defaults.transformRequest`): + * + * - If the `data` property of the request configuration object contains an object, serialize it + * into JSON format. + * + * Response transformations (`$httpProvider.defaults.transformResponse` and `$http.defaults.transformResponse`): + * + * - If XSRF prefix is detected, strip it (see Security Considerations section below). + * - If JSON response is detected, deserialize it using a JSON parser. + * + * + * ### Overriding the Default Transformations Per Request + * + * If you wish override the request/response transformations only for a single request then provide + * `transformRequest` and/or `transformResponse` properties on the configuration object passed + * into `$http`. + * + * Note that if you provide these properties on the config object the default transformations will be + * overwritten. If you wish to augment the default transformations then you must include them in your + * local transformation array. + * + * The following code demonstrates adding a new response transformation to be run after the default response + * transformations have been run. + * + * ```js + * function appendTransform(defaults, transform) { + * + * // We can't guarantee that the default transformation is an array + * defaults = angular.isArray(defaults) ? defaults : [defaults]; + * + * // Append the new transformation to the defaults + * return defaults.concat(transform); + * } + * + * $http({ + * url: '...', + * method: 'GET', + * transformResponse: appendTransform($http.defaults.transformResponse, function(value) { + * return doTransform(value); + * }) + * }); + * ``` + * + * + * ## Caching + * + * {@link ng.$http `$http`} responses are not cached by default. To enable caching, you must + * set the config.cache value or the default cache value to TRUE or to a cache object (created + * with {@link ng.$cacheFactory `$cacheFactory`}). If defined, the value of config.cache takes + * precedence over the default cache value. + * + * In order to: + * * cache all responses - set the default cache value to TRUE or to a cache object + * * cache a specific response - set config.cache value to TRUE or to a cache object + * + * If caching is enabled, but neither the default cache nor config.cache are set to a cache object, + * then the default `$cacheFactory($http)` object is used. + * + * The default cache value can be set by updating the + * {@link ng.$http#defaults `$http.defaults.cache`} property or the + * {@link $httpProvider#defaults `$httpProvider.defaults.cache`} property. + * + * When caching is enabled, {@link ng.$http `$http`} stores the response from the server using + * the relevant cache object. The next time the same request is made, the response is returned + * from the cache without sending a request to the server. + * + * Take note that: + * + * * Only GET and JSONP requests are cached. + * * The cache key is the request URL including search parameters; headers are not considered. + * * Cached responses are returned asynchronously, in the same way as responses from the server. + * * If multiple identical requests are made using the same cache, which is not yet populated, + * one request will be made to the server and remaining requests will return the same response. + * * A cache-control header on the response does not affect if or how responses are cached. + * + * + * ## Interceptors + * + * Before you start creating interceptors, be sure to understand the + * {@link ng.$q $q and deferred/promise APIs}. + * + * For purposes of global error handling, authentication, or any kind of synchronous or + * asynchronous pre-processing of request or postprocessing of responses, it is desirable to be + * able to intercept requests before they are handed to the server and + * responses before they are handed over to the application code that + * initiated these requests. The interceptors leverage the {@link ng.$q + * promise APIs} to fulfill this need for both synchronous and asynchronous pre-processing. + * + * The interceptors are service factories that are registered with the `$httpProvider` by + * adding them to the `$httpProvider.interceptors` array. The factory is called and + * injected with dependencies (if specified) and returns the interceptor. + * + * There are two kinds of interceptors (and two kinds of rejection interceptors): + * + * * `request`: interceptors get called with a http {@link $http#usage config} object. The function is free to + * modify the `config` object or create a new one. The function needs to return the `config` + * object directly, or a promise containing the `config` or a new `config` object. + * * `requestError`: interceptor gets called when a previous interceptor threw an error or + * resolved with a rejection. + * * `response`: interceptors get called with http `response` object. The function is free to + * modify the `response` object or create a new one. The function needs to return the `response` + * object directly, or as a promise containing the `response` or a new `response` object. + * * `responseError`: interceptor gets called when a previous interceptor threw an error or + * resolved with a rejection. + * + * + * ```js + * // register the interceptor as a service + * $provide.factory('myHttpInterceptor', function($q, dependency1, dependency2) { + * return { + * // optional method + * 'request': function(config) { + * // do something on success + * return config; + * }, + * + * // optional method + * 'requestError': function(rejection) { + * // do something on error + * if (canRecover(rejection)) { + * return responseOrNewPromise + * } + * return $q.reject(rejection); + * }, + * + * + * + * // optional method + * 'response': function(response) { + * // do something on success + * return response; + * }, + * + * // optional method + * 'responseError': function(rejection) { + * // do something on error + * if (canRecover(rejection)) { + * return responseOrNewPromise + * } + * return $q.reject(rejection); + * } + * }; + * }); + * + * $httpProvider.interceptors.push('myHttpInterceptor'); + * + * + * // alternatively, register the interceptor via an anonymous factory + * $httpProvider.interceptors.push(function($q, dependency1, dependency2) { + * return { + * 'request': function(config) { + * // same as above + * }, + * + * 'response': function(response) { + * // same as above + * } + * }; + * }); + * ``` + * + * ## Security Considerations + * + * When designing web applications, consider security threats from: + * + * - [JSON vulnerability](http://haacked.com/archive/2008/11/20/anatomy-of-a-subtle-json-vulnerability.aspx) + * - [XSRF](http://en.wikipedia.org/wiki/Cross-site_request_forgery) + * + * Both server and the client must cooperate in order to eliminate these threats. Angular comes + * pre-configured with strategies that address these issues, but for this to work backend server + * cooperation is required. + * + * ### JSON Vulnerability Protection + * + * A [JSON vulnerability](http://haacked.com/archive/2008/11/20/anatomy-of-a-subtle-json-vulnerability.aspx) + * allows third party website to turn your JSON resource URL into + * [JSONP](http://en.wikipedia.org/wiki/JSONP) request under some conditions. To + * counter this your server can prefix all JSON requests with following string `")]}',\n"`. + * Angular will automatically strip the prefix before processing it as JSON. + * + * For example if your server needs to return: + * ```js + * ['one','two'] + * ``` + * + * which is vulnerable to attack, your server can return: + * ```js + * )]}', + * ['one','two'] + * ``` + * + * Angular will strip the prefix, before processing the JSON. + * + * + * ### Cross Site Request Forgery (XSRF) Protection + * + * [XSRF](http://en.wikipedia.org/wiki/Cross-site_request_forgery) is an attack technique by + * which the attacker can trick an authenticated user into unknowingly executing actions on your + * website. Angular provides a mechanism to counter XSRF. When performing XHR requests, the + * $http service reads a token from a cookie (by default, `XSRF-TOKEN`) and sets it as an HTTP + * header (`X-XSRF-TOKEN`). Since only JavaScript that runs on your domain could read the + * cookie, your server can be assured that the XHR came from JavaScript running on your domain. + * The header will not be set for cross-domain requests. + * + * To take advantage of this, your server needs to set a token in a JavaScript readable session + * cookie called `XSRF-TOKEN` on the first HTTP GET request. On subsequent XHR requests the + * server can verify that the cookie matches `X-XSRF-TOKEN` HTTP header, and therefore be sure + * that only JavaScript running on your domain could have sent the request. The token must be + * unique for each user and must be verifiable by the server (to prevent the JavaScript from + * making up its own tokens). We recommend that the token is a digest of your site's + * authentication cookie with a [salt](https://en.wikipedia.org/wiki/Salt_(cryptography)) + * for added security. + * + * The name of the headers can be specified using the xsrfHeaderName and xsrfCookieName + * properties of either $httpProvider.defaults at config-time, $http.defaults at run-time, + * or the per-request config object. + * + * In order to prevent collisions in environments where multiple Angular apps share the + * same domain or subdomain, we recommend that each application uses unique cookie name. + * + * @param {object} config Object describing the request to be made and how it should be + * processed. The object has following properties: + * + * - **method** – `{string}` – HTTP method (e.g. 'GET', 'POST', etc) + * - **url** – `{string}` – Absolute or relative URL of the resource that is being requested. + * - **params** – `{Object.}` – Map of strings or objects which will be serialized + * with the `paramSerializer` and appended as GET parameters. + * - **data** – `{string|Object}` – Data to be sent as the request message data. + * - **headers** – `{Object}` – Map of strings or functions which return strings representing + * HTTP headers to send to the server. If the return value of a function is null, the + * header will not be sent. Functions accept a config object as an argument. + * - **xsrfHeaderName** – `{string}` – Name of HTTP header to populate with the XSRF token. + * - **xsrfCookieName** – `{string}` – Name of cookie containing the XSRF token. + * - **transformRequest** – + * `{function(data, headersGetter)|Array.}` – + * transform function or an array of such functions. The transform function takes the http + * request body and headers and returns its transformed (typically serialized) version. + * See {@link ng.$http#overriding-the-default-transformations-per-request + * Overriding the Default Transformations} + * - **transformResponse** – + * `{function(data, headersGetter, status)|Array.}` – + * transform function or an array of such functions. The transform function takes the http + * response body, headers and status and returns its transformed (typically deserialized) version. + * See {@link ng.$http#overriding-the-default-transformations-per-request + * Overriding the Default Transformations} + * - **paramSerializer** - `{string|function(Object):string}` - A function used to + * prepare the string representation of request parameters (specified as an object). + * If specified as string, it is interpreted as function registered with the + * {@link $injector $injector}, which means you can create your own serializer + * by registering it as a {@link auto.$provide#service service}. + * The default serializer is the {@link $httpParamSerializer $httpParamSerializer}; + * alternatively, you can use the {@link $httpParamSerializerJQLike $httpParamSerializerJQLike} + * - **cache** – `{boolean|Object}` – A boolean value or object created with + * {@link ng.$cacheFactory `$cacheFactory`} to enable or disable caching of the HTTP response. + * See {@link $http#caching $http Caching} for more information. + * - **timeout** – `{number|Promise}` – timeout in milliseconds, or {@link ng.$q promise} + * that should abort the request when resolved. + * - **withCredentials** - `{boolean}` - whether to set the `withCredentials` flag on the + * XHR object. See [requests with credentials](https://developer.mozilla.org/docs/Web/HTTP/Access_control_CORS#Requests_with_credentials) + * for more information. + * - **responseType** - `{string}` - see + * [XMLHttpRequest.responseType](https://developer.mozilla.org/en-US/docs/Web/API/XMLHttpRequest#xmlhttprequest-responsetype). + * + * @returns {HttpPromise} Returns a {@link ng.$q `Promise}` that will be resolved to a response object + * when the request succeeds or fails. + * + * + * @property {Array.} pendingRequests Array of config objects for currently pending + * requests. This is primarily meant to be used for debugging purposes. + * + * + * @example + + +
+ + +
+ + + +
http status code: {{status}}
+
http response data: {{data}}
+
+
+ + angular.module('httpExample', []) + .controller('FetchController', ['$scope', '$http', '$templateCache', + function($scope, $http, $templateCache) { + $scope.method = 'GET'; + $scope.url = 'http-hello.html'; + + $scope.fetch = function() { + $scope.code = null; + $scope.response = null; + + $http({method: $scope.method, url: $scope.url, cache: $templateCache}). + then(function(response) { + $scope.status = response.status; + $scope.data = response.data; + }, function(response) { + $scope.data = response.data || "Request failed"; + $scope.status = response.status; + }); + }; + + $scope.updateModel = function(method, url) { + $scope.method = method; + $scope.url = url; + }; + }]); + + + Hello, $http! + + + var status = element(by.binding('status')); + var data = element(by.binding('data')); + var fetchBtn = element(by.id('fetchbtn')); + var sampleGetBtn = element(by.id('samplegetbtn')); + var sampleJsonpBtn = element(by.id('samplejsonpbtn')); + var invalidJsonpBtn = element(by.id('invalidjsonpbtn')); + + it('should make an xhr GET request', function() { + sampleGetBtn.click(); + fetchBtn.click(); + expect(status.getText()).toMatch('200'); + expect(data.getText()).toMatch(/Hello, \$http!/); + }); + +// Commented out due to flakes. See https://github.com/angular/angular.js/issues/9185 +// it('should make a JSONP request to angularjs.org', function() { +// sampleJsonpBtn.click(); +// fetchBtn.click(); +// expect(status.getText()).toMatch('200'); +// expect(data.getText()).toMatch(/Super Hero!/); +// }); + + it('should make JSONP request to invalid URL and invoke the error handler', + function() { + invalidJsonpBtn.click(); + fetchBtn.click(); + expect(status.getText()).toMatch('0'); + expect(data.getText()).toMatch('Request failed'); + }); + +
+ */ + function $http(requestConfig) { + + if (!isObject(requestConfig)) { + throw minErr('$http')('badreq', 'Http request configuration must be an object. Received: {0}', requestConfig); + } + + if (!isString(requestConfig.url)) { + throw minErr('$http')('badreq', 'Http request configuration url must be a string. Received: {0}', requestConfig.url); + } + + var config = extend({ + method: 'get', + transformRequest: defaults.transformRequest, + transformResponse: defaults.transformResponse, + paramSerializer: defaults.paramSerializer + }, requestConfig); + + config.headers = mergeHeaders(requestConfig); + config.method = uppercase(config.method); + config.paramSerializer = isString(config.paramSerializer) ? + $injector.get(config.paramSerializer) : config.paramSerializer; + + var serverRequest = function(config) { + var headers = config.headers; + var reqData = transformData(config.data, headersGetter(headers), undefined, config.transformRequest); + + // strip content-type if data is undefined + if (isUndefined(reqData)) { + forEach(headers, function(value, header) { + if (lowercase(header) === 'content-type') { + delete headers[header]; + } + }); + } + + if (isUndefined(config.withCredentials) && !isUndefined(defaults.withCredentials)) { + config.withCredentials = defaults.withCredentials; + } + + // send request + return sendReq(config, reqData).then(transformResponse, transformResponse); + }; + + var chain = [serverRequest, undefined]; + var promise = $q.when(config); + + // apply interceptors + forEach(reversedInterceptors, function(interceptor) { + if (interceptor.request || interceptor.requestError) { + chain.unshift(interceptor.request, interceptor.requestError); + } + if (interceptor.response || interceptor.responseError) { + chain.push(interceptor.response, interceptor.responseError); + } + }); + + while (chain.length) { + var thenFn = chain.shift(); + var rejectFn = chain.shift(); + + promise = promise.then(thenFn, rejectFn); + } + + if (useLegacyPromise) { + promise.success = function(fn) { + assertArgFn(fn, 'fn'); + + promise.then(function(response) { + fn(response.data, response.status, response.headers, config); + }); + return promise; + }; + + promise.error = function(fn) { + assertArgFn(fn, 'fn'); + + promise.then(null, function(response) { + fn(response.data, response.status, response.headers, config); + }); + return promise; + }; + } else { + promise.success = $httpMinErrLegacyFn('success'); + promise.error = $httpMinErrLegacyFn('error'); + } + + return promise; + + function transformResponse(response) { + // make a copy since the response must be cacheable + var resp = extend({}, response); + resp.data = transformData(response.data, response.headers, response.status, + config.transformResponse); + return (isSuccess(response.status)) + ? resp + : $q.reject(resp); + } + + function executeHeaderFns(headers, config) { + var headerContent, processedHeaders = {}; + + forEach(headers, function(headerFn, header) { + if (isFunction(headerFn)) { + headerContent = headerFn(config); + if (headerContent != null) { + processedHeaders[header] = headerContent; + } + } else { + processedHeaders[header] = headerFn; + } + }); + + return processedHeaders; + } + + function mergeHeaders(config) { + var defHeaders = defaults.headers, + reqHeaders = extend({}, config.headers), + defHeaderName, lowercaseDefHeaderName, reqHeaderName; + + defHeaders = extend({}, defHeaders.common, defHeaders[lowercase(config.method)]); + + // using for-in instead of forEach to avoid unnecessary iteration after header has been found + defaultHeadersIteration: + for (defHeaderName in defHeaders) { + lowercaseDefHeaderName = lowercase(defHeaderName); + + for (reqHeaderName in reqHeaders) { + if (lowercase(reqHeaderName) === lowercaseDefHeaderName) { + continue defaultHeadersIteration; + } + } + + reqHeaders[defHeaderName] = defHeaders[defHeaderName]; + } + + // execute if header value is a function for merged headers + return executeHeaderFns(reqHeaders, shallowCopy(config)); + } + } + + $http.pendingRequests = []; + + /** + * @ngdoc method + * @name $http#get + * + * @description + * Shortcut method to perform `GET` request. + * + * @param {string} url Relative or absolute URL specifying the destination of the request + * @param {Object=} config Optional configuration object + * @returns {HttpPromise} Future object + */ + + /** + * @ngdoc method + * @name $http#delete + * + * @description + * Shortcut method to perform `DELETE` request. + * + * @param {string} url Relative or absolute URL specifying the destination of the request + * @param {Object=} config Optional configuration object + * @returns {HttpPromise} Future object + */ + + /** + * @ngdoc method + * @name $http#head + * + * @description + * Shortcut method to perform `HEAD` request. + * + * @param {string} url Relative or absolute URL specifying the destination of the request + * @param {Object=} config Optional configuration object + * @returns {HttpPromise} Future object + */ + + /** + * @ngdoc method + * @name $http#jsonp + * + * @description + * Shortcut method to perform `JSONP` request. + * + * @param {string} url Relative or absolute URL specifying the destination of the request. + * The name of the callback should be the string `JSON_CALLBACK`. + * @param {Object=} config Optional configuration object + * @returns {HttpPromise} Future object + */ + createShortMethods('get', 'delete', 'head', 'jsonp'); + + /** + * @ngdoc method + * @name $http#post + * + * @description + * Shortcut method to perform `POST` request. + * + * @param {string} url Relative or absolute URL specifying the destination of the request + * @param {*} data Request content + * @param {Object=} config Optional configuration object + * @returns {HttpPromise} Future object + */ + + /** + * @ngdoc method + * @name $http#put + * + * @description + * Shortcut method to perform `PUT` request. + * + * @param {string} url Relative or absolute URL specifying the destination of the request + * @param {*} data Request content + * @param {Object=} config Optional configuration object + * @returns {HttpPromise} Future object + */ + + /** + * @ngdoc method + * @name $http#patch + * + * @description + * Shortcut method to perform `PATCH` request. + * + * @param {string} url Relative or absolute URL specifying the destination of the request + * @param {*} data Request content + * @param {Object=} config Optional configuration object + * @returns {HttpPromise} Future object + */ + createShortMethodsWithData('post', 'put', 'patch'); + + /** + * @ngdoc property + * @name $http#defaults + * + * @description + * Runtime equivalent of the `$httpProvider.defaults` property. Allows configuration of + * default headers, withCredentials as well as request and response transformations. + * + * See "Setting HTTP Headers" and "Transforming Requests and Responses" sections above. + */ + $http.defaults = defaults; + + + return $http; + + + function createShortMethods(names) { + forEach(arguments, function(name) { + $http[name] = function(url, config) { + return $http(extend({}, config || {}, { + method: name, + url: url + })); + }; + }); + } + + + function createShortMethodsWithData(name) { + forEach(arguments, function(name) { + $http[name] = function(url, data, config) { + return $http(extend({}, config || {}, { + method: name, + url: url, + data: data + })); + }; + }); + } + + + /** + * Makes the request. + * + * !!! ACCESSES CLOSURE VARS: + * $httpBackend, defaults, $log, $rootScope, defaultCache, $http.pendingRequests + */ + function sendReq(config, reqData) { + var deferred = $q.defer(), + promise = deferred.promise, + cache, + cachedResp, + reqHeaders = config.headers, + url = buildUrl(config.url, config.paramSerializer(config.params)); + + $http.pendingRequests.push(config); + promise.then(removePendingReq, removePendingReq); + + + if ((config.cache || defaults.cache) && config.cache !== false && + (config.method === 'GET' || config.method === 'JSONP')) { + cache = isObject(config.cache) ? config.cache + : isObject(defaults.cache) ? defaults.cache + : defaultCache; + } + + if (cache) { + cachedResp = cache.get(url); + if (isDefined(cachedResp)) { + if (isPromiseLike(cachedResp)) { + // cached request has already been sent, but there is no response yet + cachedResp.then(resolvePromiseWithResult, resolvePromiseWithResult); + } else { + // serving from cache + if (isArray(cachedResp)) { + resolvePromise(cachedResp[1], cachedResp[0], shallowCopy(cachedResp[2]), cachedResp[3]); + } else { + resolvePromise(cachedResp, 200, {}, 'OK'); + } + } + } else { + // put the promise for the non-transformed response into cache as a placeholder + cache.put(url, promise); + } + } + + + // if we won't have the response in cache, set the xsrf headers and + // send the request to the backend + if (isUndefined(cachedResp)) { + var xsrfValue = urlIsSameOrigin(config.url) + ? $$cookieReader()[config.xsrfCookieName || defaults.xsrfCookieName] + : undefined; + if (xsrfValue) { + reqHeaders[(config.xsrfHeaderName || defaults.xsrfHeaderName)] = xsrfValue; + } + + $httpBackend(config.method, url, reqData, done, reqHeaders, config.timeout, + config.withCredentials, config.responseType); + } + + return promise; + + + /** + * Callback registered to $httpBackend(): + * - caches the response if desired + * - resolves the raw $http promise + * - calls $apply + */ + function done(status, response, headersString, statusText) { + if (cache) { + if (isSuccess(status)) { + cache.put(url, [status, response, parseHeaders(headersString), statusText]); + } else { + // remove promise from the cache + cache.remove(url); + } + } + + function resolveHttpPromise() { + resolvePromise(response, status, headersString, statusText); + } + + if (useApplyAsync) { + $rootScope.$applyAsync(resolveHttpPromise); + } else { + resolveHttpPromise(); + if (!$rootScope.$$phase) $rootScope.$apply(); + } + } + + + /** + * Resolves the raw $http promise. + */ + function resolvePromise(response, status, headers, statusText) { + //status: HTTP response status code, 0, -1 (aborted by timeout / promise) + status = status >= -1 ? status : 0; + + (isSuccess(status) ? deferred.resolve : deferred.reject)({ + data: response, + status: status, + headers: headersGetter(headers), + config: config, + statusText: statusText + }); + } + + function resolvePromiseWithResult(result) { + resolvePromise(result.data, result.status, shallowCopy(result.headers()), result.statusText); + } + + function removePendingReq() { + var idx = $http.pendingRequests.indexOf(config); + if (idx !== -1) $http.pendingRequests.splice(idx, 1); + } + } + + + function buildUrl(url, serializedParams) { + if (serializedParams.length > 0) { + url += ((url.indexOf('?') == -1) ? '?' : '&') + serializedParams; + } + return url; + } + }]; +} + +/** + * @ngdoc service + * @name $xhrFactory + * + * @description + * Factory function used to create XMLHttpRequest objects. + * + * Replace or decorate this service to create your own custom XMLHttpRequest objects. + * + * ``` + * angular.module('myApp', []) + * .factory('$xhrFactory', function() { + * return function createXhr(method, url) { + * return new window.XMLHttpRequest({mozSystem: true}); + * }; + * }); + * ``` + * + * @param {string} method HTTP method of the request (GET, POST, PUT, ..) + * @param {string} url URL of the request. + */ +function $xhrFactoryProvider() { + this.$get = function() { + return function createXhr() { + return new window.XMLHttpRequest(); + }; + }; +} + +/** + * @ngdoc service + * @name $httpBackend + * @requires $window + * @requires $document + * @requires $xhrFactory + * + * @description + * HTTP backend used by the {@link ng.$http service} that delegates to + * XMLHttpRequest object or JSONP and deals with browser incompatibilities. + * + * You should never need to use this service directly, instead use the higher-level abstractions: + * {@link ng.$http $http} or {@link ngResource.$resource $resource}. + * + * During testing this implementation is swapped with {@link ngMock.$httpBackend mock + * $httpBackend} which can be trained with responses. + */ +function $HttpBackendProvider() { + this.$get = ['$browser', '$window', '$document', '$xhrFactory', function($browser, $window, $document, $xhrFactory) { + return createHttpBackend($browser, $xhrFactory, $browser.defer, $window.angular.callbacks, $document[0]); + }]; +} + +function createHttpBackend($browser, createXhr, $browserDefer, callbacks, rawDocument) { + // TODO(vojta): fix the signature + return function(method, url, post, callback, headers, timeout, withCredentials, responseType) { + $browser.$$incOutstandingRequestCount(); + url = url || $browser.url(); + + if (lowercase(method) == 'jsonp') { + var callbackId = '_' + (callbacks.counter++).toString(36); + callbacks[callbackId] = function(data) { + callbacks[callbackId].data = data; + callbacks[callbackId].called = true; + }; + + var jsonpDone = jsonpReq(url.replace('JSON_CALLBACK', 'angular.callbacks.' + callbackId), + callbackId, function(status, text) { + completeRequest(callback, status, callbacks[callbackId].data, "", text); + callbacks[callbackId] = noop; + }); + } else { + + var xhr = createXhr(method, url); + + xhr.open(method, url, true); + forEach(headers, function(value, key) { + if (isDefined(value)) { + xhr.setRequestHeader(key, value); + } + }); + + xhr.onload = function requestLoaded() { + var statusText = xhr.statusText || ''; + + // responseText is the old-school way of retrieving response (supported by IE9) + // response/responseType properties were introduced in XHR Level2 spec (supported by IE10) + var response = ('response' in xhr) ? xhr.response : xhr.responseText; + + // normalize IE9 bug (http://bugs.jquery.com/ticket/1450) + var status = xhr.status === 1223 ? 204 : xhr.status; + + // fix status code when it is 0 (0 status is undocumented). + // Occurs when accessing file resources or on Android 4.1 stock browser + // while retrieving files from application cache. + if (status === 0) { + status = response ? 200 : urlResolve(url).protocol == 'file' ? 404 : 0; + } + + completeRequest(callback, + status, + response, + xhr.getAllResponseHeaders(), + statusText); + }; + + var requestError = function() { + // The response is always empty + // See https://xhr.spec.whatwg.org/#request-error-steps and https://fetch.spec.whatwg.org/#concept-network-error + completeRequest(callback, -1, null, null, ''); + }; + + xhr.onerror = requestError; + xhr.onabort = requestError; + + if (withCredentials) { + xhr.withCredentials = true; + } + + if (responseType) { + try { + xhr.responseType = responseType; + } catch (e) { + // WebKit added support for the json responseType value on 09/03/2013 + // https://bugs.webkit.org/show_bug.cgi?id=73648. Versions of Safari prior to 7 are + // known to throw when setting the value "json" as the response type. Other older + // browsers implementing the responseType + // + // The json response type can be ignored if not supported, because JSON payloads are + // parsed on the client-side regardless. + if (responseType !== 'json') { + throw e; + } + } + } + + xhr.send(isUndefined(post) ? null : post); + } + + if (timeout > 0) { + var timeoutId = $browserDefer(timeoutRequest, timeout); + } else if (isPromiseLike(timeout)) { + timeout.then(timeoutRequest); + } + + + function timeoutRequest() { + jsonpDone && jsonpDone(); + xhr && xhr.abort(); + } + + function completeRequest(callback, status, response, headersString, statusText) { + // cancel timeout and subsequent timeout promise resolution + if (isDefined(timeoutId)) { + $browserDefer.cancel(timeoutId); + } + jsonpDone = xhr = null; + + callback(status, response, headersString, statusText); + $browser.$$completeOutstandingRequest(noop); + } + }; + + function jsonpReq(url, callbackId, done) { + // we can't use jQuery/jqLite here because jQuery does crazy stuff with script elements, e.g.: + // - fetches local scripts via XHR and evals them + // - adds and immediately removes script elements from the document + var script = rawDocument.createElement('script'), callback = null; + script.type = "text/javascript"; + script.src = url; + script.async = true; + + callback = function(event) { + removeEventListenerFn(script, "load", callback); + removeEventListenerFn(script, "error", callback); + rawDocument.body.removeChild(script); + script = null; + var status = -1; + var text = "unknown"; + + if (event) { + if (event.type === "load" && !callbacks[callbackId].called) { + event = { type: "error" }; + } + text = event.type; + status = event.type === "error" ? 404 : 200; + } + + if (done) { + done(status, text); + } + }; + + addEventListenerFn(script, "load", callback); + addEventListenerFn(script, "error", callback); + rawDocument.body.appendChild(script); + return callback; + } +} + +var $interpolateMinErr = angular.$interpolateMinErr = minErr('$interpolate'); +$interpolateMinErr.throwNoconcat = function(text) { + throw $interpolateMinErr('noconcat', + "Error while interpolating: {0}\nStrict Contextual Escaping disallows " + + "interpolations that concatenate multiple expressions when a trusted value is " + + "required. See http://docs.angularjs.org/api/ng.$sce", text); +}; + +$interpolateMinErr.interr = function(text, err) { + return $interpolateMinErr('interr', "Can't interpolate: {0}\n{1}", text, err.toString()); +}; + +/** + * @ngdoc provider + * @name $interpolateProvider + * + * @description + * + * Used for configuring the interpolation markup. Defaults to `{{` and `}}`. + * + *
+ * This feature is sometimes used to mix different markup languages, e.g. to wrap an Angular + * template within a Python Jinja template (or any other template language). Mixing templating + * languages is **very dangerous**. The embedding template language will not safely escape Angular + * expressions, so any user-controlled values in the template will cause Cross Site Scripting (XSS) + * security bugs! + *
+ * + * @example + + + +
+ //demo.label// +
+
+ + it('should interpolate binding with custom symbols', function() { + expect(element(by.binding('demo.label')).getText()).toBe('This binding is brought you by // interpolation symbols.'); + }); + +
+ */ +function $InterpolateProvider() { + var startSymbol = '{{'; + var endSymbol = '}}'; + + /** + * @ngdoc method + * @name $interpolateProvider#startSymbol + * @description + * Symbol to denote start of expression in the interpolated string. Defaults to `{{`. + * + * @param {string=} value new value to set the starting symbol to. + * @returns {string|self} Returns the symbol when used as getter and self if used as setter. + */ + this.startSymbol = function(value) { + if (value) { + startSymbol = value; + return this; + } else { + return startSymbol; + } + }; + + /** + * @ngdoc method + * @name $interpolateProvider#endSymbol + * @description + * Symbol to denote the end of expression in the interpolated string. Defaults to `}}`. + * + * @param {string=} value new value to set the ending symbol to. + * @returns {string|self} Returns the symbol when used as getter and self if used as setter. + */ + this.endSymbol = function(value) { + if (value) { + endSymbol = value; + return this; + } else { + return endSymbol; + } + }; + + + this.$get = ['$parse', '$exceptionHandler', '$sce', function($parse, $exceptionHandler, $sce) { + var startSymbolLength = startSymbol.length, + endSymbolLength = endSymbol.length, + escapedStartRegexp = new RegExp(startSymbol.replace(/./g, escape), 'g'), + escapedEndRegexp = new RegExp(endSymbol.replace(/./g, escape), 'g'); + + function escape(ch) { + return '\\\\\\' + ch; + } + + function unescapeText(text) { + return text.replace(escapedStartRegexp, startSymbol). + replace(escapedEndRegexp, endSymbol); + } + + function stringify(value) { + if (value == null) { // null || undefined + return ''; + } + switch (typeof value) { + case 'string': + break; + case 'number': + value = '' + value; + break; + default: + value = toJson(value); + } + + return value; + } + + //TODO: this is the same as the constantWatchDelegate in parse.js + function constantWatchDelegate(scope, listener, objectEquality, constantInterp) { + var unwatch; + return unwatch = scope.$watch(function constantInterpolateWatch(scope) { + unwatch(); + return constantInterp(scope); + }, listener, objectEquality); + } + + /** + * @ngdoc service + * @name $interpolate + * @kind function + * + * @requires $parse + * @requires $sce + * + * @description + * + * Compiles a string with markup into an interpolation function. This service is used by the + * HTML {@link ng.$compile $compile} service for data binding. See + * {@link ng.$interpolateProvider $interpolateProvider} for configuring the + * interpolation markup. + * + * + * ```js + * var $interpolate = ...; // injected + * var exp = $interpolate('Hello {{name | uppercase}}!'); + * expect(exp({name:'Angular'})).toEqual('Hello ANGULAR!'); + * ``` + * + * `$interpolate` takes an optional fourth argument, `allOrNothing`. If `allOrNothing` is + * `true`, the interpolation function will return `undefined` unless all embedded expressions + * evaluate to a value other than `undefined`. + * + * ```js + * var $interpolate = ...; // injected + * var context = {greeting: 'Hello', name: undefined }; + * + * // default "forgiving" mode + * var exp = $interpolate('{{greeting}} {{name}}!'); + * expect(exp(context)).toEqual('Hello !'); + * + * // "allOrNothing" mode + * exp = $interpolate('{{greeting}} {{name}}!', false, null, true); + * expect(exp(context)).toBeUndefined(); + * context.name = 'Angular'; + * expect(exp(context)).toEqual('Hello Angular!'); + * ``` + * + * `allOrNothing` is useful for interpolating URLs. `ngSrc` and `ngSrcset` use this behavior. + * + * ####Escaped Interpolation + * $interpolate provides a mechanism for escaping interpolation markers. Start and end markers + * can be escaped by preceding each of their characters with a REVERSE SOLIDUS U+005C (backslash). + * It will be rendered as a regular start/end marker, and will not be interpreted as an expression + * or binding. + * + * This enables web-servers to prevent script injection attacks and defacing attacks, to some + * degree, while also enabling code examples to work without relying on the + * {@link ng.directive:ngNonBindable ngNonBindable} directive. + * + * **For security purposes, it is strongly encouraged that web servers escape user-supplied data, + * replacing angle brackets (<, >) with &lt; and &gt; respectively, and replacing all + * interpolation start/end markers with their escaped counterparts.** + * + * Escaped interpolation markers are only replaced with the actual interpolation markers in rendered + * output when the $interpolate service processes the text. So, for HTML elements interpolated + * by {@link ng.$compile $compile}, or otherwise interpolated with the `mustHaveExpression` parameter + * set to `true`, the interpolated text must contain an unescaped interpolation expression. As such, + * this is typically useful only when user-data is used in rendering a template from the server, or + * when otherwise untrusted data is used by a directive. + * + * + * + *
+ *

{{apptitle}}: \{\{ username = "defaced value"; \}\} + *

+ *

{{username}} attempts to inject code which will deface the + * application, but fails to accomplish their task, because the server has correctly + * escaped the interpolation start/end markers with REVERSE SOLIDUS U+005C (backslash) + * characters.

+ *

Instead, the result of the attempted script injection is visible, and can be removed + * from the database by an administrator.

+ *
+ *
+ *
+ * + * @param {string} text The text with markup to interpolate. + * @param {boolean=} mustHaveExpression if set to true then the interpolation string must have + * embedded expression in order to return an interpolation function. Strings with no + * embedded expression will return null for the interpolation function. + * @param {string=} trustedContext when provided, the returned function passes the interpolated + * result through {@link ng.$sce#getTrusted $sce.getTrusted(interpolatedResult, + * trustedContext)} before returning it. Refer to the {@link ng.$sce $sce} service that + * provides Strict Contextual Escaping for details. + * @param {boolean=} allOrNothing if `true`, then the returned function returns undefined + * unless all embedded expressions evaluate to a value other than `undefined`. + * @returns {function(context)} an interpolation function which is used to compute the + * interpolated string. The function has these parameters: + * + * - `context`: evaluation context for all expressions embedded in the interpolated text + */ + function $interpolate(text, mustHaveExpression, trustedContext, allOrNothing) { + // Provide a quick exit and simplified result function for text with no interpolation + if (!text.length || text.indexOf(startSymbol) === -1) { + var constantInterp; + if (!mustHaveExpression) { + var unescapedText = unescapeText(text); + constantInterp = valueFn(unescapedText); + constantInterp.exp = text; + constantInterp.expressions = []; + constantInterp.$$watchDelegate = constantWatchDelegate; + } + return constantInterp; + } + + allOrNothing = !!allOrNothing; + var startIndex, + endIndex, + index = 0, + expressions = [], + parseFns = [], + textLength = text.length, + exp, + concat = [], + expressionPositions = []; + + while (index < textLength) { + if (((startIndex = text.indexOf(startSymbol, index)) != -1) && + ((endIndex = text.indexOf(endSymbol, startIndex + startSymbolLength)) != -1)) { + if (index !== startIndex) { + concat.push(unescapeText(text.substring(index, startIndex))); + } + exp = text.substring(startIndex + startSymbolLength, endIndex); + expressions.push(exp); + parseFns.push($parse(exp, parseStringifyInterceptor)); + index = endIndex + endSymbolLength; + expressionPositions.push(concat.length); + concat.push(''); + } else { + // we did not find an interpolation, so we have to add the remainder to the separators array + if (index !== textLength) { + concat.push(unescapeText(text.substring(index))); + } + break; + } + } + + // Concatenating expressions makes it hard to reason about whether some combination of + // concatenated values are unsafe to use and could easily lead to XSS. By requiring that a + // single expression be used for iframe[src], object[src], etc., we ensure that the value + // that's used is assigned or constructed by some JS code somewhere that is more testable or + // make it obvious that you bound the value to some user controlled value. This helps reduce + // the load when auditing for XSS issues. + if (trustedContext && concat.length > 1) { + $interpolateMinErr.throwNoconcat(text); + } + + if (!mustHaveExpression || expressions.length) { + var compute = function(values) { + for (var i = 0, ii = expressions.length; i < ii; i++) { + if (allOrNothing && isUndefined(values[i])) return; + concat[expressionPositions[i]] = values[i]; + } + return concat.join(''); + }; + + var getValue = function(value) { + return trustedContext ? + $sce.getTrusted(trustedContext, value) : + $sce.valueOf(value); + }; + + return extend(function interpolationFn(context) { + var i = 0; + var ii = expressions.length; + var values = new Array(ii); + + try { + for (; i < ii; i++) { + values[i] = parseFns[i](context); + } + + return compute(values); + } catch (err) { + $exceptionHandler($interpolateMinErr.interr(text, err)); + } + + }, { + // all of these properties are undocumented for now + exp: text, //just for compatibility with regular watchers created via $watch + expressions: expressions, + $$watchDelegate: function(scope, listener) { + var lastValue; + return scope.$watchGroup(parseFns, function interpolateFnWatcher(values, oldValues) { + var currValue = compute(values); + if (isFunction(listener)) { + listener.call(this, currValue, values !== oldValues ? lastValue : currValue, scope); + } + lastValue = currValue; + }); + } + }); + } + + function parseStringifyInterceptor(value) { + try { + value = getValue(value); + return allOrNothing && !isDefined(value) ? value : stringify(value); + } catch (err) { + $exceptionHandler($interpolateMinErr.interr(text, err)); + } + } + } + + + /** + * @ngdoc method + * @name $interpolate#startSymbol + * @description + * Symbol to denote the start of expression in the interpolated string. Defaults to `{{`. + * + * Use {@link ng.$interpolateProvider#startSymbol `$interpolateProvider.startSymbol`} to change + * the symbol. + * + * @returns {string} start symbol. + */ + $interpolate.startSymbol = function() { + return startSymbol; + }; + + + /** + * @ngdoc method + * @name $interpolate#endSymbol + * @description + * Symbol to denote the end of expression in the interpolated string. Defaults to `}}`. + * + * Use {@link ng.$interpolateProvider#endSymbol `$interpolateProvider.endSymbol`} to change + * the symbol. + * + * @returns {string} end symbol. + */ + $interpolate.endSymbol = function() { + return endSymbol; + }; + + return $interpolate; + }]; +} + +function $IntervalProvider() { + this.$get = ['$rootScope', '$window', '$q', '$$q', '$browser', + function($rootScope, $window, $q, $$q, $browser) { + var intervals = {}; + + + /** + * @ngdoc service + * @name $interval + * + * @description + * Angular's wrapper for `window.setInterval`. The `fn` function is executed every `delay` + * milliseconds. + * + * The return value of registering an interval function is a promise. This promise will be + * notified upon each tick of the interval, and will be resolved after `count` iterations, or + * run indefinitely if `count` is not defined. The value of the notification will be the + * number of iterations that have run. + * To cancel an interval, call `$interval.cancel(promise)`. + * + * In tests you can use {@link ngMock.$interval#flush `$interval.flush(millis)`} to + * move forward by `millis` milliseconds and trigger any functions scheduled to run in that + * time. + * + *
+ * **Note**: Intervals created by this service must be explicitly destroyed when you are finished + * with them. In particular they are not automatically destroyed when a controller's scope or a + * directive's element are destroyed. + * You should take this into consideration and make sure to always cancel the interval at the + * appropriate moment. See the example below for more details on how and when to do this. + *
+ * + * @param {function()} fn A function that should be called repeatedly. + * @param {number} delay Number of milliseconds between each function call. + * @param {number=} [count=0] Number of times to repeat. If not set, or 0, will repeat + * indefinitely. + * @param {boolean=} [invokeApply=true] If set to `false` skips model dirty checking, otherwise + * will invoke `fn` within the {@link ng.$rootScope.Scope#$apply $apply} block. + * @param {...*=} Pass additional parameters to the executed function. + * @returns {promise} A promise which will be notified on each iteration. + * + * @example + * + * + * + * + *
+ *
+ *
+ * Current time is: + *
+ * Blood 1 : {{blood_1}} + * Blood 2 : {{blood_2}} + * + * + * + *
+ *
+ * + *
+ *
+ */ + function interval(fn, delay, count, invokeApply) { + var hasParams = arguments.length > 4, + args = hasParams ? sliceArgs(arguments, 4) : [], + setInterval = $window.setInterval, + clearInterval = $window.clearInterval, + iteration = 0, + skipApply = (isDefined(invokeApply) && !invokeApply), + deferred = (skipApply ? $$q : $q).defer(), + promise = deferred.promise; + + count = isDefined(count) ? count : 0; + + promise.$$intervalId = setInterval(function tick() { + if (skipApply) { + $browser.defer(callback); + } else { + $rootScope.$evalAsync(callback); + } + deferred.notify(iteration++); + + if (count > 0 && iteration >= count) { + deferred.resolve(iteration); + clearInterval(promise.$$intervalId); + delete intervals[promise.$$intervalId]; + } + + if (!skipApply) $rootScope.$apply(); + + }, delay); + + intervals[promise.$$intervalId] = deferred; + + return promise; + + function callback() { + if (!hasParams) { + fn(iteration); + } else { + fn.apply(null, args); + } + } + } + + + /** + * @ngdoc method + * @name $interval#cancel + * + * @description + * Cancels a task associated with the `promise`. + * + * @param {Promise=} promise returned by the `$interval` function. + * @returns {boolean} Returns `true` if the task was successfully canceled. + */ + interval.cancel = function(promise) { + if (promise && promise.$$intervalId in intervals) { + intervals[promise.$$intervalId].reject('canceled'); + $window.clearInterval(promise.$$intervalId); + delete intervals[promise.$$intervalId]; + return true; + } + return false; + }; + + return interval; + }]; +} + +/** + * @ngdoc service + * @name $locale + * + * @description + * $locale service provides localization rules for various Angular components. As of right now the + * only public api is: + * + * * `id` – `{string}` – locale id formatted as `languageId-countryId` (e.g. `en-us`) + */ + +var PATH_MATCH = /^([^\?#]*)(\?([^#]*))?(#(.*))?$/, + DEFAULT_PORTS = {'http': 80, 'https': 443, 'ftp': 21}; +var $locationMinErr = minErr('$location'); + + +/** + * Encode path using encodeUriSegment, ignoring forward slashes + * + * @param {string} path Path to encode + * @returns {string} + */ +function encodePath(path) { + var segments = path.split('/'), + i = segments.length; + + while (i--) { + segments[i] = encodeUriSegment(segments[i]); + } + + return segments.join('/'); +} + +function parseAbsoluteUrl(absoluteUrl, locationObj) { + var parsedUrl = urlResolve(absoluteUrl); + + locationObj.$$protocol = parsedUrl.protocol; + locationObj.$$host = parsedUrl.hostname; + locationObj.$$port = toInt(parsedUrl.port) || DEFAULT_PORTS[parsedUrl.protocol] || null; +} + + +function parseAppUrl(relativeUrl, locationObj) { + var prefixed = (relativeUrl.charAt(0) !== '/'); + if (prefixed) { + relativeUrl = '/' + relativeUrl; + } + var match = urlResolve(relativeUrl); + locationObj.$$path = decodeURIComponent(prefixed && match.pathname.charAt(0) === '/' ? + match.pathname.substring(1) : match.pathname); + locationObj.$$search = parseKeyValue(match.search); + locationObj.$$hash = decodeURIComponent(match.hash); + + // make sure path starts with '/'; + if (locationObj.$$path && locationObj.$$path.charAt(0) != '/') { + locationObj.$$path = '/' + locationObj.$$path; + } +} + + +/** + * + * @param {string} begin + * @param {string} whole + * @returns {string} returns text from whole after begin or undefined if it does not begin with + * expected string. + */ +function beginsWith(begin, whole) { + if (whole.indexOf(begin) === 0) { + return whole.substr(begin.length); + } +} + + +function stripHash(url) { + var index = url.indexOf('#'); + return index == -1 ? url : url.substr(0, index); +} + +function trimEmptyHash(url) { + return url.replace(/(#.+)|#$/, '$1'); +} + + +function stripFile(url) { + return url.substr(0, stripHash(url).lastIndexOf('/') + 1); +} + +/* return the server only (scheme://host:port) */ +function serverBase(url) { + return url.substring(0, url.indexOf('/', url.indexOf('//') + 2)); +} + + +/** + * LocationHtml5Url represents an url + * This object is exposed as $location service when HTML5 mode is enabled and supported + * + * @constructor + * @param {string} appBase application base URL + * @param {string} appBaseNoFile application base URL stripped of any filename + * @param {string} basePrefix url path prefix + */ +function LocationHtml5Url(appBase, appBaseNoFile, basePrefix) { + this.$$html5 = true; + basePrefix = basePrefix || ''; + parseAbsoluteUrl(appBase, this); + + + /** + * Parse given html5 (regular) url string into properties + * @param {string} url HTML5 url + * @private + */ + this.$$parse = function(url) { + var pathUrl = beginsWith(appBaseNoFile, url); + if (!isString(pathUrl)) { + throw $locationMinErr('ipthprfx', 'Invalid url "{0}", missing path prefix "{1}".', url, + appBaseNoFile); + } + + parseAppUrl(pathUrl, this); + + if (!this.$$path) { + this.$$path = '/'; + } + + this.$$compose(); + }; + + /** + * Compose url and update `absUrl` property + * @private + */ + this.$$compose = function() { + var search = toKeyValue(this.$$search), + hash = this.$$hash ? '#' + encodeUriSegment(this.$$hash) : ''; + + this.$$url = encodePath(this.$$path) + (search ? '?' + search : '') + hash; + this.$$absUrl = appBaseNoFile + this.$$url.substr(1); // first char is always '/' + }; + + this.$$parseLinkUrl = function(url, relHref) { + if (relHref && relHref[0] === '#') { + // special case for links to hash fragments: + // keep the old url and only replace the hash fragment + this.hash(relHref.slice(1)); + return true; + } + var appUrl, prevAppUrl; + var rewrittenUrl; + + if (isDefined(appUrl = beginsWith(appBase, url))) { + prevAppUrl = appUrl; + if (isDefined(appUrl = beginsWith(basePrefix, appUrl))) { + rewrittenUrl = appBaseNoFile + (beginsWith('/', appUrl) || appUrl); + } else { + rewrittenUrl = appBase + prevAppUrl; + } + } else if (isDefined(appUrl = beginsWith(appBaseNoFile, url))) { + rewrittenUrl = appBaseNoFile + appUrl; + } else if (appBaseNoFile == url + '/') { + rewrittenUrl = appBaseNoFile; + } + if (rewrittenUrl) { + this.$$parse(rewrittenUrl); + } + return !!rewrittenUrl; + }; +} + + +/** + * LocationHashbangUrl represents url + * This object is exposed as $location service when developer doesn't opt into html5 mode. + * It also serves as the base class for html5 mode fallback on legacy browsers. + * + * @constructor + * @param {string} appBase application base URL + * @param {string} appBaseNoFile application base URL stripped of any filename + * @param {string} hashPrefix hashbang prefix + */ +function LocationHashbangUrl(appBase, appBaseNoFile, hashPrefix) { + + parseAbsoluteUrl(appBase, this); + + + /** + * Parse given hashbang url into properties + * @param {string} url Hashbang url + * @private + */ + this.$$parse = function(url) { + var withoutBaseUrl = beginsWith(appBase, url) || beginsWith(appBaseNoFile, url); + var withoutHashUrl; + + if (!isUndefined(withoutBaseUrl) && withoutBaseUrl.charAt(0) === '#') { + + // The rest of the url starts with a hash so we have + // got either a hashbang path or a plain hash fragment + withoutHashUrl = beginsWith(hashPrefix, withoutBaseUrl); + if (isUndefined(withoutHashUrl)) { + // There was no hashbang prefix so we just have a hash fragment + withoutHashUrl = withoutBaseUrl; + } + + } else { + // There was no hashbang path nor hash fragment: + // If we are in HTML5 mode we use what is left as the path; + // Otherwise we ignore what is left + if (this.$$html5) { + withoutHashUrl = withoutBaseUrl; + } else { + withoutHashUrl = ''; + if (isUndefined(withoutBaseUrl)) { + appBase = url; + this.replace(); + } + } + } + + parseAppUrl(withoutHashUrl, this); + + this.$$path = removeWindowsDriveName(this.$$path, withoutHashUrl, appBase); + + this.$$compose(); + + /* + * In Windows, on an anchor node on documents loaded from + * the filesystem, the browser will return a pathname + * prefixed with the drive name ('/C:/path') when a + * pathname without a drive is set: + * * a.setAttribute('href', '/foo') + * * a.pathname === '/C:/foo' //true + * + * Inside of Angular, we're always using pathnames that + * do not include drive names for routing. + */ + function removeWindowsDriveName(path, url, base) { + /* + Matches paths for file protocol on windows, + such as /C:/foo/bar, and captures only /foo/bar. + */ + var windowsFilePathExp = /^\/[A-Z]:(\/.*)/; + + var firstPathSegmentMatch; + + //Get the relative path from the input URL. + if (url.indexOf(base) === 0) { + url = url.replace(base, ''); + } + + // The input URL intentionally contains a first path segment that ends with a colon. + if (windowsFilePathExp.exec(url)) { + return path; + } + + firstPathSegmentMatch = windowsFilePathExp.exec(path); + return firstPathSegmentMatch ? firstPathSegmentMatch[1] : path; + } + }; + + /** + * Compose hashbang url and update `absUrl` property + * @private + */ + this.$$compose = function() { + var search = toKeyValue(this.$$search), + hash = this.$$hash ? '#' + encodeUriSegment(this.$$hash) : ''; + + this.$$url = encodePath(this.$$path) + (search ? '?' + search : '') + hash; + this.$$absUrl = appBase + (this.$$url ? hashPrefix + this.$$url : ''); + }; + + this.$$parseLinkUrl = function(url, relHref) { + if (stripHash(appBase) == stripHash(url)) { + this.$$parse(url); + return true; + } + return false; + }; +} + + +/** + * LocationHashbangUrl represents url + * This object is exposed as $location service when html5 history api is enabled but the browser + * does not support it. + * + * @constructor + * @param {string} appBase application base URL + * @param {string} appBaseNoFile application base URL stripped of any filename + * @param {string} hashPrefix hashbang prefix + */ +function LocationHashbangInHtml5Url(appBase, appBaseNoFile, hashPrefix) { + this.$$html5 = true; + LocationHashbangUrl.apply(this, arguments); + + this.$$parseLinkUrl = function(url, relHref) { + if (relHref && relHref[0] === '#') { + // special case for links to hash fragments: + // keep the old url and only replace the hash fragment + this.hash(relHref.slice(1)); + return true; + } + + var rewrittenUrl; + var appUrl; + + if (appBase == stripHash(url)) { + rewrittenUrl = url; + } else if ((appUrl = beginsWith(appBaseNoFile, url))) { + rewrittenUrl = appBase + hashPrefix + appUrl; + } else if (appBaseNoFile === url + '/') { + rewrittenUrl = appBaseNoFile; + } + if (rewrittenUrl) { + this.$$parse(rewrittenUrl); + } + return !!rewrittenUrl; + }; + + this.$$compose = function() { + var search = toKeyValue(this.$$search), + hash = this.$$hash ? '#' + encodeUriSegment(this.$$hash) : ''; + + this.$$url = encodePath(this.$$path) + (search ? '?' + search : '') + hash; + // include hashPrefix in $$absUrl when $$url is empty so IE9 does not reload page because of removal of '#' + this.$$absUrl = appBase + hashPrefix + this.$$url; + }; + +} + + +var locationPrototype = { + + /** + * Are we in html5 mode? + * @private + */ + $$html5: false, + + /** + * Has any change been replacing? + * @private + */ + $$replace: false, + + /** + * @ngdoc method + * @name $location#absUrl + * + * @description + * This method is getter only. + * + * Return full url representation with all segments encoded according to rules specified in + * [RFC 3986](http://www.ietf.org/rfc/rfc3986.txt). + * + * + * ```js + * // given url http://example.com/#/some/path?foo=bar&baz=xoxo + * var absUrl = $location.absUrl(); + * // => "http://example.com/#/some/path?foo=bar&baz=xoxo" + * ``` + * + * @return {string} full url + */ + absUrl: locationGetter('$$absUrl'), + + /** + * @ngdoc method + * @name $location#url + * + * @description + * This method is getter / setter. + * + * Return url (e.g. `/path?a=b#hash`) when called without any parameter. + * + * Change path, search and hash, when called with parameter and return `$location`. + * + * + * ```js + * // given url http://example.com/#/some/path?foo=bar&baz=xoxo + * var url = $location.url(); + * // => "/some/path?foo=bar&baz=xoxo" + * ``` + * + * @param {string=} url New url without base prefix (e.g. `/path?a=b#hash`) + * @return {string} url + */ + url: function(url) { + if (isUndefined(url)) { + return this.$$url; + } + + var match = PATH_MATCH.exec(url); + if (match[1] || url === '') this.path(decodeURIComponent(match[1])); + if (match[2] || match[1] || url === '') this.search(match[3] || ''); + this.hash(match[5] || ''); + + return this; + }, + + /** + * @ngdoc method + * @name $location#protocol + * + * @description + * This method is getter only. + * + * Return protocol of current url. + * + * + * ```js + * // given url http://example.com/#/some/path?foo=bar&baz=xoxo + * var protocol = $location.protocol(); + * // => "http" + * ``` + * + * @return {string} protocol of current url + */ + protocol: locationGetter('$$protocol'), + + /** + * @ngdoc method + * @name $location#host + * + * @description + * This method is getter only. + * + * Return host of current url. + * + * Note: compared to the non-angular version `location.host` which returns `hostname:port`, this returns the `hostname` portion only. + * + * + * ```js + * // given url http://example.com/#/some/path?foo=bar&baz=xoxo + * var host = $location.host(); + * // => "example.com" + * + * // given url http://user:password@example.com:8080/#/some/path?foo=bar&baz=xoxo + * host = $location.host(); + * // => "example.com" + * host = location.host; + * // => "example.com:8080" + * ``` + * + * @return {string} host of current url. + */ + host: locationGetter('$$host'), + + /** + * @ngdoc method + * @name $location#port + * + * @description + * This method is getter only. + * + * Return port of current url. + * + * + * ```js + * // given url http://example.com/#/some/path?foo=bar&baz=xoxo + * var port = $location.port(); + * // => 80 + * ``` + * + * @return {Number} port + */ + port: locationGetter('$$port'), + + /** + * @ngdoc method + * @name $location#path + * + * @description + * This method is getter / setter. + * + * Return path of current url when called without any parameter. + * + * Change path when called with parameter and return `$location`. + * + * Note: Path should always begin with forward slash (/), this method will add the forward slash + * if it is missing. + * + * + * ```js + * // given url http://example.com/#/some/path?foo=bar&baz=xoxo + * var path = $location.path(); + * // => "/some/path" + * ``` + * + * @param {(string|number)=} path New path + * @return {string} path + */ + path: locationGetterSetter('$$path', function(path) { + path = path !== null ? path.toString() : ''; + return path.charAt(0) == '/' ? path : '/' + path; + }), + + /** + * @ngdoc method + * @name $location#search + * + * @description + * This method is getter / setter. + * + * Return search part (as object) of current url when called without any parameter. + * + * Change search part when called with parameter and return `$location`. + * + * + * ```js + * // given url http://example.com/#/some/path?foo=bar&baz=xoxo + * var searchObject = $location.search(); + * // => {foo: 'bar', baz: 'xoxo'} + * + * // set foo to 'yipee' + * $location.search('foo', 'yipee'); + * // $location.search() => {foo: 'yipee', baz: 'xoxo'} + * ``` + * + * @param {string|Object.|Object.>} search New search params - string or + * hash object. + * + * When called with a single argument the method acts as a setter, setting the `search` component + * of `$location` to the specified value. + * + * If the argument is a hash object containing an array of values, these values will be encoded + * as duplicate search parameters in the url. + * + * @param {(string|Number|Array|boolean)=} paramValue If `search` is a string or number, then `paramValue` + * will override only a single search property. + * + * If `paramValue` is an array, it will override the property of the `search` component of + * `$location` specified via the first argument. + * + * If `paramValue` is `null`, the property specified via the first argument will be deleted. + * + * If `paramValue` is `true`, the property specified via the first argument will be added with no + * value nor trailing equal sign. + * + * @return {Object} If called with no arguments returns the parsed `search` object. If called with + * one or more arguments returns `$location` object itself. + */ + search: function(search, paramValue) { + switch (arguments.length) { + case 0: + return this.$$search; + case 1: + if (isString(search) || isNumber(search)) { + search = search.toString(); + this.$$search = parseKeyValue(search); + } else if (isObject(search)) { + search = copy(search, {}); + // remove object undefined or null properties + forEach(search, function(value, key) { + if (value == null) delete search[key]; + }); + + this.$$search = search; + } else { + throw $locationMinErr('isrcharg', + 'The first argument of the `$location#search()` call must be a string or an object.'); + } + break; + default: + if (isUndefined(paramValue) || paramValue === null) { + delete this.$$search[search]; + } else { + this.$$search[search] = paramValue; + } + } + + this.$$compose(); + return this; + }, + + /** + * @ngdoc method + * @name $location#hash + * + * @description + * This method is getter / setter. + * + * Returns the hash fragment when called without any parameters. + * + * Changes the hash fragment when called with a parameter and returns `$location`. + * + * + * ```js + * // given url http://example.com/#/some/path?foo=bar&baz=xoxo#hashValue + * var hash = $location.hash(); + * // => "hashValue" + * ``` + * + * @param {(string|number)=} hash New hash fragment + * @return {string} hash + */ + hash: locationGetterSetter('$$hash', function(hash) { + return hash !== null ? hash.toString() : ''; + }), + + /** + * @ngdoc method + * @name $location#replace + * + * @description + * If called, all changes to $location during the current `$digest` will replace the current history + * record, instead of adding a new one. + */ + replace: function() { + this.$$replace = true; + return this; + } +}; + +forEach([LocationHashbangInHtml5Url, LocationHashbangUrl, LocationHtml5Url], function(Location) { + Location.prototype = Object.create(locationPrototype); + + /** + * @ngdoc method + * @name $location#state + * + * @description + * This method is getter / setter. + * + * Return the history state object when called without any parameter. + * + * Change the history state object when called with one parameter and return `$location`. + * The state object is later passed to `pushState` or `replaceState`. + * + * NOTE: This method is supported only in HTML5 mode and only in browsers supporting + * the HTML5 History API (i.e. methods `pushState` and `replaceState`). If you need to support + * older browsers (like IE9 or Android < 4.0), don't use this method. + * + * @param {object=} state State object for pushState or replaceState + * @return {object} state + */ + Location.prototype.state = function(state) { + if (!arguments.length) { + return this.$$state; + } + + if (Location !== LocationHtml5Url || !this.$$html5) { + throw $locationMinErr('nostate', 'History API state support is available only ' + + 'in HTML5 mode and only in browsers supporting HTML5 History API'); + } + // The user might modify `stateObject` after invoking `$location.state(stateObject)` + // but we're changing the $$state reference to $browser.state() during the $digest + // so the modification window is narrow. + this.$$state = isUndefined(state) ? null : state; + + return this; + }; +}); + + +function locationGetter(property) { + return function() { + return this[property]; + }; +} + + +function locationGetterSetter(property, preprocess) { + return function(value) { + if (isUndefined(value)) { + return this[property]; + } + + this[property] = preprocess(value); + this.$$compose(); + + return this; + }; +} + + +/** + * @ngdoc service + * @name $location + * + * @requires $rootElement + * + * @description + * The $location service parses the URL in the browser address bar (based on the + * [window.location](https://developer.mozilla.org/en/window.location)) and makes the URL + * available to your application. Changes to the URL in the address bar are reflected into + * $location service and changes to $location are reflected into the browser address bar. + * + * **The $location service:** + * + * - Exposes the current URL in the browser address bar, so you can + * - Watch and observe the URL. + * - Change the URL. + * - Synchronizes the URL with the browser when the user + * - Changes the address bar. + * - Clicks the back or forward button (or clicks a History link). + * - Clicks on a link. + * - Represents the URL object as a set of methods (protocol, host, port, path, search, hash). + * + * For more information see {@link guide/$location Developer Guide: Using $location} + */ + +/** + * @ngdoc provider + * @name $locationProvider + * @description + * Use the `$locationProvider` to configure how the application deep linking paths are stored. + */ +function $LocationProvider() { + var hashPrefix = '', + html5Mode = { + enabled: false, + requireBase: true, + rewriteLinks: true + }; + + /** + * @ngdoc method + * @name $locationProvider#hashPrefix + * @description + * @param {string=} prefix Prefix for hash part (containing path and search) + * @returns {*} current value if used as getter or itself (chaining) if used as setter + */ + this.hashPrefix = function(prefix) { + if (isDefined(prefix)) { + hashPrefix = prefix; + return this; + } else { + return hashPrefix; + } + }; + + /** + * @ngdoc method + * @name $locationProvider#html5Mode + * @description + * @param {(boolean|Object)=} mode If boolean, sets `html5Mode.enabled` to value. + * If object, sets `enabled`, `requireBase` and `rewriteLinks` to respective values. Supported + * properties: + * - **enabled** – `{boolean}` – (default: false) If true, will rely on `history.pushState` to + * change urls where supported. Will fall back to hash-prefixed paths in browsers that do not + * support `pushState`. + * - **requireBase** - `{boolean}` - (default: `true`) When html5Mode is enabled, specifies + * whether or not a tag is required to be present. If `enabled` and `requireBase` are + * true, and a base tag is not present, an error will be thrown when `$location` is injected. + * See the {@link guide/$location $location guide for more information} + * - **rewriteLinks** - `{boolean}` - (default: `true`) When html5Mode is enabled, + * enables/disables url rewriting for relative links. + * + * @returns {Object} html5Mode object if used as getter or itself (chaining) if used as setter + */ + this.html5Mode = function(mode) { + if (isBoolean(mode)) { + html5Mode.enabled = mode; + return this; + } else if (isObject(mode)) { + + if (isBoolean(mode.enabled)) { + html5Mode.enabled = mode.enabled; + } + + if (isBoolean(mode.requireBase)) { + html5Mode.requireBase = mode.requireBase; + } + + if (isBoolean(mode.rewriteLinks)) { + html5Mode.rewriteLinks = mode.rewriteLinks; + } + + return this; + } else { + return html5Mode; + } + }; + + /** + * @ngdoc event + * @name $location#$locationChangeStart + * @eventType broadcast on root scope + * @description + * Broadcasted before a URL will change. + * + * This change can be prevented by calling + * `preventDefault` method of the event. See {@link ng.$rootScope.Scope#$on} for more + * details about event object. Upon successful change + * {@link ng.$location#$locationChangeSuccess $locationChangeSuccess} is fired. + * + * The `newState` and `oldState` parameters may be defined only in HTML5 mode and when + * the browser supports the HTML5 History API. + * + * @param {Object} angularEvent Synthetic event object. + * @param {string} newUrl New URL + * @param {string=} oldUrl URL that was before it was changed. + * @param {string=} newState New history state object + * @param {string=} oldState History state object that was before it was changed. + */ + + /** + * @ngdoc event + * @name $location#$locationChangeSuccess + * @eventType broadcast on root scope + * @description + * Broadcasted after a URL was changed. + * + * The `newState` and `oldState` parameters may be defined only in HTML5 mode and when + * the browser supports the HTML5 History API. + * + * @param {Object} angularEvent Synthetic event object. + * @param {string} newUrl New URL + * @param {string=} oldUrl URL that was before it was changed. + * @param {string=} newState New history state object + * @param {string=} oldState History state object that was before it was changed. + */ + + this.$get = ['$rootScope', '$browser', '$sniffer', '$rootElement', '$window', + function($rootScope, $browser, $sniffer, $rootElement, $window) { + var $location, + LocationMode, + baseHref = $browser.baseHref(), // if base[href] is undefined, it defaults to '' + initialUrl = $browser.url(), + appBase; + + if (html5Mode.enabled) { + if (!baseHref && html5Mode.requireBase) { + throw $locationMinErr('nobase', + "$location in HTML5 mode requires a tag to be present!"); + } + appBase = serverBase(initialUrl) + (baseHref || '/'); + LocationMode = $sniffer.history ? LocationHtml5Url : LocationHashbangInHtml5Url; + } else { + appBase = stripHash(initialUrl); + LocationMode = LocationHashbangUrl; + } + var appBaseNoFile = stripFile(appBase); + + $location = new LocationMode(appBase, appBaseNoFile, '#' + hashPrefix); + $location.$$parseLinkUrl(initialUrl, initialUrl); + + $location.$$state = $browser.state(); + + var IGNORE_URI_REGEXP = /^\s*(javascript|mailto):/i; + + function setBrowserUrlWithFallback(url, replace, state) { + var oldUrl = $location.url(); + var oldState = $location.$$state; + try { + $browser.url(url, replace, state); + + // Make sure $location.state() returns referentially identical (not just deeply equal) + // state object; this makes possible quick checking if the state changed in the digest + // loop. Checking deep equality would be too expensive. + $location.$$state = $browser.state(); + } catch (e) { + // Restore old values if pushState fails + $location.url(oldUrl); + $location.$$state = oldState; + + throw e; + } + } + + $rootElement.on('click', function(event) { + // TODO(vojta): rewrite link when opening in new tab/window (in legacy browser) + // currently we open nice url link and redirect then + + if (!html5Mode.rewriteLinks || event.ctrlKey || event.metaKey || event.shiftKey || event.which == 2 || event.button == 2) return; + + var elm = jqLite(event.target); + + // traverse the DOM up to find first A tag + while (nodeName_(elm[0]) !== 'a') { + // ignore rewriting if no A tag (reached root element, or no parent - removed from document) + if (elm[0] === $rootElement[0] || !(elm = elm.parent())[0]) return; + } + + var absHref = elm.prop('href'); + // get the actual href attribute - see + // http://msdn.microsoft.com/en-us/library/ie/dd347148(v=vs.85).aspx + var relHref = elm.attr('href') || elm.attr('xlink:href'); + + if (isObject(absHref) && absHref.toString() === '[object SVGAnimatedString]') { + // SVGAnimatedString.animVal should be identical to SVGAnimatedString.baseVal, unless during + // an animation. + absHref = urlResolve(absHref.animVal).href; + } + + // Ignore when url is started with javascript: or mailto: + if (IGNORE_URI_REGEXP.test(absHref)) return; + + if (absHref && !elm.attr('target') && !event.isDefaultPrevented()) { + if ($location.$$parseLinkUrl(absHref, relHref)) { + // We do a preventDefault for all urls that are part of the angular application, + // in html5mode and also without, so that we are able to abort navigation without + // getting double entries in the location history. + event.preventDefault(); + // update location manually + if ($location.absUrl() != $browser.url()) { + $rootScope.$apply(); + // hack to work around FF6 bug 684208 when scenario runner clicks on links + $window.angular['ff-684208-preventDefault'] = true; + } + } + } + }); + + + // rewrite hashbang url <> html5 url + if (trimEmptyHash($location.absUrl()) != trimEmptyHash(initialUrl)) { + $browser.url($location.absUrl(), true); + } + + var initializing = true; + + // update $location when $browser url changes + $browser.onUrlChange(function(newUrl, newState) { + + if (isUndefined(beginsWith(appBaseNoFile, newUrl))) { + // If we are navigating outside of the app then force a reload + $window.location.href = newUrl; + return; + } + + $rootScope.$evalAsync(function() { + var oldUrl = $location.absUrl(); + var oldState = $location.$$state; + var defaultPrevented; + newUrl = trimEmptyHash(newUrl); + $location.$$parse(newUrl); + $location.$$state = newState; + + defaultPrevented = $rootScope.$broadcast('$locationChangeStart', newUrl, oldUrl, + newState, oldState).defaultPrevented; + + // if the location was changed by a `$locationChangeStart` handler then stop + // processing this location change + if ($location.absUrl() !== newUrl) return; + + if (defaultPrevented) { + $location.$$parse(oldUrl); + $location.$$state = oldState; + setBrowserUrlWithFallback(oldUrl, false, oldState); + } else { + initializing = false; + afterLocationChange(oldUrl, oldState); + } + }); + if (!$rootScope.$$phase) $rootScope.$digest(); + }); + + // update browser + $rootScope.$watch(function $locationWatch() { + var oldUrl = trimEmptyHash($browser.url()); + var newUrl = trimEmptyHash($location.absUrl()); + var oldState = $browser.state(); + var currentReplace = $location.$$replace; + var urlOrStateChanged = oldUrl !== newUrl || + ($location.$$html5 && $sniffer.history && oldState !== $location.$$state); + + if (initializing || urlOrStateChanged) { + initializing = false; + + $rootScope.$evalAsync(function() { + var newUrl = $location.absUrl(); + var defaultPrevented = $rootScope.$broadcast('$locationChangeStart', newUrl, oldUrl, + $location.$$state, oldState).defaultPrevented; + + // if the location was changed by a `$locationChangeStart` handler then stop + // processing this location change + if ($location.absUrl() !== newUrl) return; + + if (defaultPrevented) { + $location.$$parse(oldUrl); + $location.$$state = oldState; + } else { + if (urlOrStateChanged) { + setBrowserUrlWithFallback(newUrl, currentReplace, + oldState === $location.$$state ? null : $location.$$state); + } + afterLocationChange(oldUrl, oldState); + } + }); + } + + $location.$$replace = false; + + // we don't need to return anything because $evalAsync will make the digest loop dirty when + // there is a change + }); + + return $location; + + function afterLocationChange(oldUrl, oldState) { + $rootScope.$broadcast('$locationChangeSuccess', $location.absUrl(), oldUrl, + $location.$$state, oldState); + } +}]; +} + +/** + * @ngdoc service + * @name $log + * @requires $window + * + * @description + * Simple service for logging. Default implementation safely writes the message + * into the browser's console (if present). + * + * The main purpose of this service is to simplify debugging and troubleshooting. + * + * The default is to log `debug` messages. You can use + * {@link ng.$logProvider ng.$logProvider#debugEnabled} to change this. + * + * @example + + + angular.module('logExample', []) + .controller('LogController', ['$scope', '$log', function($scope, $log) { + $scope.$log = $log; + $scope.message = 'Hello World!'; + }]); + + +
+

Reload this page with open console, enter text and hit the log button...

+ + + + + + +
+
+
+ */ + +/** + * @ngdoc provider + * @name $logProvider + * @description + * Use the `$logProvider` to configure how the application logs messages + */ +function $LogProvider() { + var debug = true, + self = this; + + /** + * @ngdoc method + * @name $logProvider#debugEnabled + * @description + * @param {boolean=} flag enable or disable debug level messages + * @returns {*} current value if used as getter or itself (chaining) if used as setter + */ + this.debugEnabled = function(flag) { + if (isDefined(flag)) { + debug = flag; + return this; + } else { + return debug; + } + }; + + this.$get = ['$window', function($window) { + return { + /** + * @ngdoc method + * @name $log#log + * + * @description + * Write a log message + */ + log: consoleLog('log'), + + /** + * @ngdoc method + * @name $log#info + * + * @description + * Write an information message + */ + info: consoleLog('info'), + + /** + * @ngdoc method + * @name $log#warn + * + * @description + * Write a warning message + */ + warn: consoleLog('warn'), + + /** + * @ngdoc method + * @name $log#error + * + * @description + * Write an error message + */ + error: consoleLog('error'), + + /** + * @ngdoc method + * @name $log#debug + * + * @description + * Write a debug message + */ + debug: (function() { + var fn = consoleLog('debug'); + + return function() { + if (debug) { + fn.apply(self, arguments); + } + }; + }()) + }; + + function formatError(arg) { + if (arg instanceof Error) { + if (arg.stack) { + arg = (arg.message && arg.stack.indexOf(arg.message) === -1) + ? 'Error: ' + arg.message + '\n' + arg.stack + : arg.stack; + } else if (arg.sourceURL) { + arg = arg.message + '\n' + arg.sourceURL + ':' + arg.line; + } + } + return arg; + } + + function consoleLog(type) { + var console = $window.console || {}, + logFn = console[type] || console.log || noop, + hasApply = false; + + // Note: reading logFn.apply throws an error in IE11 in IE8 document mode. + // The reason behind this is that console.log has type "object" in IE8... + try { + hasApply = !!logFn.apply; + } catch (e) {} + + if (hasApply) { + return function() { + var args = []; + forEach(arguments, function(arg) { + args.push(formatError(arg)); + }); + return logFn.apply(console, args); + }; + } + + // we are IE which either doesn't have window.console => this is noop and we do nothing, + // or we are IE where console.log doesn't have apply so we log at least first 2 args + return function(arg1, arg2) { + logFn(arg1, arg2 == null ? '' : arg2); + }; + } + }]; +} + +/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * + * Any commits to this file should be reviewed with security in mind. * + * Changes to this file can potentially create security vulnerabilities. * + * An approval from 2 Core members with history of modifying * + * this file is required. * + * * + * Does the change somehow allow for arbitrary javascript to be executed? * + * Or allows for someone to change the prototype of built-in objects? * + * Or gives undesired access to variables likes document or window? * + * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ + +var $parseMinErr = minErr('$parse'); + +// Sandboxing Angular Expressions +// ------------------------------ +// Angular expressions are generally considered safe because these expressions only have direct +// access to `$scope` and locals. However, one can obtain the ability to execute arbitrary JS code by +// obtaining a reference to native JS functions such as the Function constructor. +// +// As an example, consider the following Angular expression: +// +// {}.toString.constructor('alert("evil JS code")') +// +// This sandboxing technique is not perfect and doesn't aim to be. The goal is to prevent exploits +// against the expression language, but not to prevent exploits that were enabled by exposing +// sensitive JavaScript or browser APIs on Scope. Exposing such objects on a Scope is never a good +// practice and therefore we are not even trying to protect against interaction with an object +// explicitly exposed in this way. +// +// In general, it is not possible to access a Window object from an angular expression unless a +// window or some DOM object that has a reference to window is published onto a Scope. +// Similarly we prevent invocations of function known to be dangerous, as well as assignments to +// native objects. +// +// See https://docs.angularjs.org/guide/security + + +function ensureSafeMemberName(name, fullExpression) { + if (name === "__defineGetter__" || name === "__defineSetter__" + || name === "__lookupGetter__" || name === "__lookupSetter__" + || name === "__proto__") { + throw $parseMinErr('isecfld', + 'Attempting to access a disallowed field in Angular expressions! ' + + 'Expression: {0}', fullExpression); + } + return name; +} + +function getStringValue(name) { + // Property names must be strings. This means that non-string objects cannot be used + // as keys in an object. Any non-string object, including a number, is typecasted + // into a string via the toString method. + // -- MDN, https://developer.mozilla.org/en/docs/Web/JavaScript/Reference/Operators/Property_accessors#Property_names + // + // So, to ensure that we are checking the same `name` that JavaScript would use, we cast it + // to a string. It's not always possible. If `name` is an object and its `toString` method is + // 'broken' (doesn't return a string, isn't a function, etc.), an error will be thrown: + // + // TypeError: Cannot convert object to primitive value + // + // For performance reasons, we don't catch this error here and allow it to propagate up the call + // stack. Note that you'll get the same error in JavaScript if you try to access a property using + // such a 'broken' object as a key. + return name + ''; +} + +function ensureSafeObject(obj, fullExpression) { + // nifty check if obj is Function that is fast and works across iframes and other contexts + if (obj) { + if (obj.constructor === obj) { + throw $parseMinErr('isecfn', + 'Referencing Function in Angular expressions is disallowed! Expression: {0}', + fullExpression); + } else if (// isWindow(obj) + obj.window === obj) { + throw $parseMinErr('isecwindow', + 'Referencing the Window in Angular expressions is disallowed! Expression: {0}', + fullExpression); + } else if (// isElement(obj) + obj.children && (obj.nodeName || (obj.prop && obj.attr && obj.find))) { + throw $parseMinErr('isecdom', + 'Referencing DOM nodes in Angular expressions is disallowed! Expression: {0}', + fullExpression); + } else if (// block Object so that we can't get hold of dangerous Object.* methods + obj === Object) { + throw $parseMinErr('isecobj', + 'Referencing Object in Angular expressions is disallowed! Expression: {0}', + fullExpression); + } + } + return obj; +} + +var CALL = Function.prototype.call; +var APPLY = Function.prototype.apply; +var BIND = Function.prototype.bind; + +function ensureSafeFunction(obj, fullExpression) { + if (obj) { + if (obj.constructor === obj) { + throw $parseMinErr('isecfn', + 'Referencing Function in Angular expressions is disallowed! Expression: {0}', + fullExpression); + } else if (obj === CALL || obj === APPLY || obj === BIND) { + throw $parseMinErr('isecff', + 'Referencing call, apply or bind in Angular expressions is disallowed! Expression: {0}', + fullExpression); + } + } +} + +function ensureSafeAssignContext(obj, fullExpression) { + if (obj) { + if (obj === (0).constructor || obj === (false).constructor || obj === ''.constructor || + obj === {}.constructor || obj === [].constructor || obj === Function.constructor) { + throw $parseMinErr('isecaf', + 'Assigning to a constructor is disallowed! Expression: {0}', fullExpression); + } + } +} + +var OPERATORS = createMap(); +forEach('+ - * / % === !== == != < > <= >= && || ! = |'.split(' '), function(operator) { OPERATORS[operator] = true; }); +var ESCAPE = {"n":"\n", "f":"\f", "r":"\r", "t":"\t", "v":"\v", "'":"'", '"':'"'}; + + +///////////////////////////////////////// + + +/** + * @constructor + */ +var Lexer = function(options) { + this.options = options; +}; + +Lexer.prototype = { + constructor: Lexer, + + lex: function(text) { + this.text = text; + this.index = 0; + this.tokens = []; + + while (this.index < this.text.length) { + var ch = this.text.charAt(this.index); + if (ch === '"' || ch === "'") { + this.readString(ch); + } else if (this.isNumber(ch) || ch === '.' && this.isNumber(this.peek())) { + this.readNumber(); + } else if (this.isIdent(ch)) { + this.readIdent(); + } else if (this.is(ch, '(){}[].,;:?')) { + this.tokens.push({index: this.index, text: ch}); + this.index++; + } else if (this.isWhitespace(ch)) { + this.index++; + } else { + var ch2 = ch + this.peek(); + var ch3 = ch2 + this.peek(2); + var op1 = OPERATORS[ch]; + var op2 = OPERATORS[ch2]; + var op3 = OPERATORS[ch3]; + if (op1 || op2 || op3) { + var token = op3 ? ch3 : (op2 ? ch2 : ch); + this.tokens.push({index: this.index, text: token, operator: true}); + this.index += token.length; + } else { + this.throwError('Unexpected next character ', this.index, this.index + 1); + } + } + } + return this.tokens; + }, + + is: function(ch, chars) { + return chars.indexOf(ch) !== -1; + }, + + peek: function(i) { + var num = i || 1; + return (this.index + num < this.text.length) ? this.text.charAt(this.index + num) : false; + }, + + isNumber: function(ch) { + return ('0' <= ch && ch <= '9') && typeof ch === "string"; + }, + + isWhitespace: function(ch) { + // IE treats non-breaking space as \u00A0 + return (ch === ' ' || ch === '\r' || ch === '\t' || + ch === '\n' || ch === '\v' || ch === '\u00A0'); + }, + + isIdent: function(ch) { + return ('a' <= ch && ch <= 'z' || + 'A' <= ch && ch <= 'Z' || + '_' === ch || ch === '$'); + }, + + isExpOperator: function(ch) { + return (ch === '-' || ch === '+' || this.isNumber(ch)); + }, + + throwError: function(error, start, end) { + end = end || this.index; + var colStr = (isDefined(start) + ? 's ' + start + '-' + this.index + ' [' + this.text.substring(start, end) + ']' + : ' ' + end); + throw $parseMinErr('lexerr', 'Lexer Error: {0} at column{1} in expression [{2}].', + error, colStr, this.text); + }, + + readNumber: function() { + var number = ''; + var start = this.index; + while (this.index < this.text.length) { + var ch = lowercase(this.text.charAt(this.index)); + if (ch == '.' || this.isNumber(ch)) { + number += ch; + } else { + var peekCh = this.peek(); + if (ch == 'e' && this.isExpOperator(peekCh)) { + number += ch; + } else if (this.isExpOperator(ch) && + peekCh && this.isNumber(peekCh) && + number.charAt(number.length - 1) == 'e') { + number += ch; + } else if (this.isExpOperator(ch) && + (!peekCh || !this.isNumber(peekCh)) && + number.charAt(number.length - 1) == 'e') { + this.throwError('Invalid exponent'); + } else { + break; + } + } + this.index++; + } + this.tokens.push({ + index: start, + text: number, + constant: true, + value: Number(number) + }); + }, + + readIdent: function() { + var start = this.index; + while (this.index < this.text.length) { + var ch = this.text.charAt(this.index); + if (!(this.isIdent(ch) || this.isNumber(ch))) { + break; + } + this.index++; + } + this.tokens.push({ + index: start, + text: this.text.slice(start, this.index), + identifier: true + }); + }, + + readString: function(quote) { + var start = this.index; + this.index++; + var string = ''; + var rawString = quote; + var escape = false; + while (this.index < this.text.length) { + var ch = this.text.charAt(this.index); + rawString += ch; + if (escape) { + if (ch === 'u') { + var hex = this.text.substring(this.index + 1, this.index + 5); + if (!hex.match(/[\da-f]{4}/i)) { + this.throwError('Invalid unicode escape [\\u' + hex + ']'); + } + this.index += 4; + string += String.fromCharCode(parseInt(hex, 16)); + } else { + var rep = ESCAPE[ch]; + string = string + (rep || ch); + } + escape = false; + } else if (ch === '\\') { + escape = true; + } else if (ch === quote) { + this.index++; + this.tokens.push({ + index: start, + text: rawString, + constant: true, + value: string + }); + return; + } else { + string += ch; + } + this.index++; + } + this.throwError('Unterminated quote', start); + } +}; + +var AST = function(lexer, options) { + this.lexer = lexer; + this.options = options; +}; + +AST.Program = 'Program'; +AST.ExpressionStatement = 'ExpressionStatement'; +AST.AssignmentExpression = 'AssignmentExpression'; +AST.ConditionalExpression = 'ConditionalExpression'; +AST.LogicalExpression = 'LogicalExpression'; +AST.BinaryExpression = 'BinaryExpression'; +AST.UnaryExpression = 'UnaryExpression'; +AST.CallExpression = 'CallExpression'; +AST.MemberExpression = 'MemberExpression'; +AST.Identifier = 'Identifier'; +AST.Literal = 'Literal'; +AST.ArrayExpression = 'ArrayExpression'; +AST.Property = 'Property'; +AST.ObjectExpression = 'ObjectExpression'; +AST.ThisExpression = 'ThisExpression'; +AST.LocalsExpression = 'LocalsExpression'; + +// Internal use only +AST.NGValueParameter = 'NGValueParameter'; + +AST.prototype = { + ast: function(text) { + this.text = text; + this.tokens = this.lexer.lex(text); + + var value = this.program(); + + if (this.tokens.length !== 0) { + this.throwError('is an unexpected token', this.tokens[0]); + } + + return value; + }, + + program: function() { + var body = []; + while (true) { + if (this.tokens.length > 0 && !this.peek('}', ')', ';', ']')) + body.push(this.expressionStatement()); + if (!this.expect(';')) { + return { type: AST.Program, body: body}; + } + } + }, + + expressionStatement: function() { + return { type: AST.ExpressionStatement, expression: this.filterChain() }; + }, + + filterChain: function() { + var left = this.expression(); + var token; + while ((token = this.expect('|'))) { + left = this.filter(left); + } + return left; + }, + + expression: function() { + return this.assignment(); + }, + + assignment: function() { + var result = this.ternary(); + if (this.expect('=')) { + result = { type: AST.AssignmentExpression, left: result, right: this.assignment(), operator: '='}; + } + return result; + }, + + ternary: function() { + var test = this.logicalOR(); + var alternate; + var consequent; + if (this.expect('?')) { + alternate = this.expression(); + if (this.consume(':')) { + consequent = this.expression(); + return { type: AST.ConditionalExpression, test: test, alternate: alternate, consequent: consequent}; + } + } + return test; + }, + + logicalOR: function() { + var left = this.logicalAND(); + while (this.expect('||')) { + left = { type: AST.LogicalExpression, operator: '||', left: left, right: this.logicalAND() }; + } + return left; + }, + + logicalAND: function() { + var left = this.equality(); + while (this.expect('&&')) { + left = { type: AST.LogicalExpression, operator: '&&', left: left, right: this.equality()}; + } + return left; + }, + + equality: function() { + var left = this.relational(); + var token; + while ((token = this.expect('==','!=','===','!=='))) { + left = { type: AST.BinaryExpression, operator: token.text, left: left, right: this.relational() }; + } + return left; + }, + + relational: function() { + var left = this.additive(); + var token; + while ((token = this.expect('<', '>', '<=', '>='))) { + left = { type: AST.BinaryExpression, operator: token.text, left: left, right: this.additive() }; + } + return left; + }, + + additive: function() { + var left = this.multiplicative(); + var token; + while ((token = this.expect('+','-'))) { + left = { type: AST.BinaryExpression, operator: token.text, left: left, right: this.multiplicative() }; + } + return left; + }, + + multiplicative: function() { + var left = this.unary(); + var token; + while ((token = this.expect('*','/','%'))) { + left = { type: AST.BinaryExpression, operator: token.text, left: left, right: this.unary() }; + } + return left; + }, + + unary: function() { + var token; + if ((token = this.expect('+', '-', '!'))) { + return { type: AST.UnaryExpression, operator: token.text, prefix: true, argument: this.unary() }; + } else { + return this.primary(); + } + }, + + primary: function() { + var primary; + if (this.expect('(')) { + primary = this.filterChain(); + this.consume(')'); + } else if (this.expect('[')) { + primary = this.arrayDeclaration(); + } else if (this.expect('{')) { + primary = this.object(); + } else if (this.selfReferential.hasOwnProperty(this.peek().text)) { + primary = copy(this.selfReferential[this.consume().text]); + } else if (this.options.literals.hasOwnProperty(this.peek().text)) { + primary = { type: AST.Literal, value: this.options.literals[this.consume().text]}; + } else if (this.peek().identifier) { + primary = this.identifier(); + } else if (this.peek().constant) { + primary = this.constant(); + } else { + this.throwError('not a primary expression', this.peek()); + } + + var next; + while ((next = this.expect('(', '[', '.'))) { + if (next.text === '(') { + primary = {type: AST.CallExpression, callee: primary, arguments: this.parseArguments() }; + this.consume(')'); + } else if (next.text === '[') { + primary = { type: AST.MemberExpression, object: primary, property: this.expression(), computed: true }; + this.consume(']'); + } else if (next.text === '.') { + primary = { type: AST.MemberExpression, object: primary, property: this.identifier(), computed: false }; + } else { + this.throwError('IMPOSSIBLE'); + } + } + return primary; + }, + + filter: function(baseExpression) { + var args = [baseExpression]; + var result = {type: AST.CallExpression, callee: this.identifier(), arguments: args, filter: true}; + + while (this.expect(':')) { + args.push(this.expression()); + } + + return result; + }, + + parseArguments: function() { + var args = []; + if (this.peekToken().text !== ')') { + do { + args.push(this.expression()); + } while (this.expect(',')); + } + return args; + }, + + identifier: function() { + var token = this.consume(); + if (!token.identifier) { + this.throwError('is not a valid identifier', token); + } + return { type: AST.Identifier, name: token.text }; + }, + + constant: function() { + // TODO check that it is a constant + return { type: AST.Literal, value: this.consume().value }; + }, + + arrayDeclaration: function() { + var elements = []; + if (this.peekToken().text !== ']') { + do { + if (this.peek(']')) { + // Support trailing commas per ES5.1. + break; + } + elements.push(this.expression()); + } while (this.expect(',')); + } + this.consume(']'); + + return { type: AST.ArrayExpression, elements: elements }; + }, + + object: function() { + var properties = [], property; + if (this.peekToken().text !== '}') { + do { + if (this.peek('}')) { + // Support trailing commas per ES5.1. + break; + } + property = {type: AST.Property, kind: 'init'}; + if (this.peek().constant) { + property.key = this.constant(); + } else if (this.peek().identifier) { + property.key = this.identifier(); + } else { + this.throwError("invalid key", this.peek()); + } + this.consume(':'); + property.value = this.expression(); + properties.push(property); + } while (this.expect(',')); + } + this.consume('}'); + + return {type: AST.ObjectExpression, properties: properties }; + }, + + throwError: function(msg, token) { + throw $parseMinErr('syntax', + 'Syntax Error: Token \'{0}\' {1} at column {2} of the expression [{3}] starting at [{4}].', + token.text, msg, (token.index + 1), this.text, this.text.substring(token.index)); + }, + + consume: function(e1) { + if (this.tokens.length === 0) { + throw $parseMinErr('ueoe', 'Unexpected end of expression: {0}', this.text); + } + + var token = this.expect(e1); + if (!token) { + this.throwError('is unexpected, expecting [' + e1 + ']', this.peek()); + } + return token; + }, + + peekToken: function() { + if (this.tokens.length === 0) { + throw $parseMinErr('ueoe', 'Unexpected end of expression: {0}', this.text); + } + return this.tokens[0]; + }, + + peek: function(e1, e2, e3, e4) { + return this.peekAhead(0, e1, e2, e3, e4); + }, + + peekAhead: function(i, e1, e2, e3, e4) { + if (this.tokens.length > i) { + var token = this.tokens[i]; + var t = token.text; + if (t === e1 || t === e2 || t === e3 || t === e4 || + (!e1 && !e2 && !e3 && !e4)) { + return token; + } + } + return false; + }, + + expect: function(e1, e2, e3, e4) { + var token = this.peek(e1, e2, e3, e4); + if (token) { + this.tokens.shift(); + return token; + } + return false; + }, + + selfReferential: { + 'this': {type: AST.ThisExpression }, + '$locals': {type: AST.LocalsExpression } + } +}; + +function ifDefined(v, d) { + return typeof v !== 'undefined' ? v : d; +} + +function plusFn(l, r) { + if (typeof l === 'undefined') return r; + if (typeof r === 'undefined') return l; + return l + r; +} + +function isStateless($filter, filterName) { + var fn = $filter(filterName); + return !fn.$stateful; +} + +function findConstantAndWatchExpressions(ast, $filter) { + var allConstants; + var argsToWatch; + switch (ast.type) { + case AST.Program: + allConstants = true; + forEach(ast.body, function(expr) { + findConstantAndWatchExpressions(expr.expression, $filter); + allConstants = allConstants && expr.expression.constant; + }); + ast.constant = allConstants; + break; + case AST.Literal: + ast.constant = true; + ast.toWatch = []; + break; + case AST.UnaryExpression: + findConstantAndWatchExpressions(ast.argument, $filter); + ast.constant = ast.argument.constant; + ast.toWatch = ast.argument.toWatch; + break; + case AST.BinaryExpression: + findConstantAndWatchExpressions(ast.left, $filter); + findConstantAndWatchExpressions(ast.right, $filter); + ast.constant = ast.left.constant && ast.right.constant; + ast.toWatch = ast.left.toWatch.concat(ast.right.toWatch); + break; + case AST.LogicalExpression: + findConstantAndWatchExpressions(ast.left, $filter); + findConstantAndWatchExpressions(ast.right, $filter); + ast.constant = ast.left.constant && ast.right.constant; + ast.toWatch = ast.constant ? [] : [ast]; + break; + case AST.ConditionalExpression: + findConstantAndWatchExpressions(ast.test, $filter); + findConstantAndWatchExpressions(ast.alternate, $filter); + findConstantAndWatchExpressions(ast.consequent, $filter); + ast.constant = ast.test.constant && ast.alternate.constant && ast.consequent.constant; + ast.toWatch = ast.constant ? [] : [ast]; + break; + case AST.Identifier: + ast.constant = false; + ast.toWatch = [ast]; + break; + case AST.MemberExpression: + findConstantAndWatchExpressions(ast.object, $filter); + if (ast.computed) { + findConstantAndWatchExpressions(ast.property, $filter); + } + ast.constant = ast.object.constant && (!ast.computed || ast.property.constant); + ast.toWatch = [ast]; + break; + case AST.CallExpression: + allConstants = ast.filter ? isStateless($filter, ast.callee.name) : false; + argsToWatch = []; + forEach(ast.arguments, function(expr) { + findConstantAndWatchExpressions(expr, $filter); + allConstants = allConstants && expr.constant; + if (!expr.constant) { + argsToWatch.push.apply(argsToWatch, expr.toWatch); + } + }); + ast.constant = allConstants; + ast.toWatch = ast.filter && isStateless($filter, ast.callee.name) ? argsToWatch : [ast]; + break; + case AST.AssignmentExpression: + findConstantAndWatchExpressions(ast.left, $filter); + findConstantAndWatchExpressions(ast.right, $filter); + ast.constant = ast.left.constant && ast.right.constant; + ast.toWatch = [ast]; + break; + case AST.ArrayExpression: + allConstants = true; + argsToWatch = []; + forEach(ast.elements, function(expr) { + findConstantAndWatchExpressions(expr, $filter); + allConstants = allConstants && expr.constant; + if (!expr.constant) { + argsToWatch.push.apply(argsToWatch, expr.toWatch); + } + }); + ast.constant = allConstants; + ast.toWatch = argsToWatch; + break; + case AST.ObjectExpression: + allConstants = true; + argsToWatch = []; + forEach(ast.properties, function(property) { + findConstantAndWatchExpressions(property.value, $filter); + allConstants = allConstants && property.value.constant; + if (!property.value.constant) { + argsToWatch.push.apply(argsToWatch, property.value.toWatch); + } + }); + ast.constant = allConstants; + ast.toWatch = argsToWatch; + break; + case AST.ThisExpression: + ast.constant = false; + ast.toWatch = []; + break; + case AST.LocalsExpression: + ast.constant = false; + ast.toWatch = []; + break; + } +} + +function getInputs(body) { + if (body.length != 1) return; + var lastExpression = body[0].expression; + var candidate = lastExpression.toWatch; + if (candidate.length !== 1) return candidate; + return candidate[0] !== lastExpression ? candidate : undefined; +} + +function isAssignable(ast) { + return ast.type === AST.Identifier || ast.type === AST.MemberExpression; +} + +function assignableAST(ast) { + if (ast.body.length === 1 && isAssignable(ast.body[0].expression)) { + return {type: AST.AssignmentExpression, left: ast.body[0].expression, right: {type: AST.NGValueParameter}, operator: '='}; + } +} + +function isLiteral(ast) { + return ast.body.length === 0 || + ast.body.length === 1 && ( + ast.body[0].expression.type === AST.Literal || + ast.body[0].expression.type === AST.ArrayExpression || + ast.body[0].expression.type === AST.ObjectExpression); +} + +function isConstant(ast) { + return ast.constant; +} + +function ASTCompiler(astBuilder, $filter) { + this.astBuilder = astBuilder; + this.$filter = $filter; +} + +ASTCompiler.prototype = { + compile: function(expression, expensiveChecks) { + var self = this; + var ast = this.astBuilder.ast(expression); + this.state = { + nextId: 0, + filters: {}, + expensiveChecks: expensiveChecks, + fn: {vars: [], body: [], own: {}}, + assign: {vars: [], body: [], own: {}}, + inputs: [] + }; + findConstantAndWatchExpressions(ast, self.$filter); + var extra = ''; + var assignable; + this.stage = 'assign'; + if ((assignable = assignableAST(ast))) { + this.state.computing = 'assign'; + var result = this.nextId(); + this.recurse(assignable, result); + this.return_(result); + extra = 'fn.assign=' + this.generateFunction('assign', 's,v,l'); + } + var toWatch = getInputs(ast.body); + self.stage = 'inputs'; + forEach(toWatch, function(watch, key) { + var fnKey = 'fn' + key; + self.state[fnKey] = {vars: [], body: [], own: {}}; + self.state.computing = fnKey; + var intoId = self.nextId(); + self.recurse(watch, intoId); + self.return_(intoId); + self.state.inputs.push(fnKey); + watch.watchId = key; + }); + this.state.computing = 'fn'; + this.stage = 'main'; + this.recurse(ast); + var fnString = + // The build and minification steps remove the string "use strict" from the code, but this is done using a regex. + // This is a workaround for this until we do a better job at only removing the prefix only when we should. + '"' + this.USE + ' ' + this.STRICT + '";\n' + + this.filterPrefix() + + 'var fn=' + this.generateFunction('fn', 's,l,a,i') + + extra + + this.watchFns() + + 'return fn;'; + + /* jshint -W054 */ + var fn = (new Function('$filter', + 'ensureSafeMemberName', + 'ensureSafeObject', + 'ensureSafeFunction', + 'getStringValue', + 'ensureSafeAssignContext', + 'ifDefined', + 'plus', + 'text', + fnString))( + this.$filter, + ensureSafeMemberName, + ensureSafeObject, + ensureSafeFunction, + getStringValue, + ensureSafeAssignContext, + ifDefined, + plusFn, + expression); + /* jshint +W054 */ + this.state = this.stage = undefined; + fn.literal = isLiteral(ast); + fn.constant = isConstant(ast); + return fn; + }, + + USE: 'use', + + STRICT: 'strict', + + watchFns: function() { + var result = []; + var fns = this.state.inputs; + var self = this; + forEach(fns, function(name) { + result.push('var ' + name + '=' + self.generateFunction(name, 's')); + }); + if (fns.length) { + result.push('fn.inputs=[' + fns.join(',') + '];'); + } + return result.join(''); + }, + + generateFunction: function(name, params) { + return 'function(' + params + '){' + + this.varsPrefix(name) + + this.body(name) + + '};'; + }, + + filterPrefix: function() { + var parts = []; + var self = this; + forEach(this.state.filters, function(id, filter) { + parts.push(id + '=$filter(' + self.escape(filter) + ')'); + }); + if (parts.length) return 'var ' + parts.join(',') + ';'; + return ''; + }, + + varsPrefix: function(section) { + return this.state[section].vars.length ? 'var ' + this.state[section].vars.join(',') + ';' : ''; + }, + + body: function(section) { + return this.state[section].body.join(''); + }, + + recurse: function(ast, intoId, nameId, recursionFn, create, skipWatchIdCheck) { + var left, right, self = this, args, expression; + recursionFn = recursionFn || noop; + if (!skipWatchIdCheck && isDefined(ast.watchId)) { + intoId = intoId || this.nextId(); + this.if_('i', + this.lazyAssign(intoId, this.computedMember('i', ast.watchId)), + this.lazyRecurse(ast, intoId, nameId, recursionFn, create, true) + ); + return; + } + switch (ast.type) { + case AST.Program: + forEach(ast.body, function(expression, pos) { + self.recurse(expression.expression, undefined, undefined, function(expr) { right = expr; }); + if (pos !== ast.body.length - 1) { + self.current().body.push(right, ';'); + } else { + self.return_(right); + } + }); + break; + case AST.Literal: + expression = this.escape(ast.value); + this.assign(intoId, expression); + recursionFn(expression); + break; + case AST.UnaryExpression: + this.recurse(ast.argument, undefined, undefined, function(expr) { right = expr; }); + expression = ast.operator + '(' + this.ifDefined(right, 0) + ')'; + this.assign(intoId, expression); + recursionFn(expression); + break; + case AST.BinaryExpression: + this.recurse(ast.left, undefined, undefined, function(expr) { left = expr; }); + this.recurse(ast.right, undefined, undefined, function(expr) { right = expr; }); + if (ast.operator === '+') { + expression = this.plus(left, right); + } else if (ast.operator === '-') { + expression = this.ifDefined(left, 0) + ast.operator + this.ifDefined(right, 0); + } else { + expression = '(' + left + ')' + ast.operator + '(' + right + ')'; + } + this.assign(intoId, expression); + recursionFn(expression); + break; + case AST.LogicalExpression: + intoId = intoId || this.nextId(); + self.recurse(ast.left, intoId); + self.if_(ast.operator === '&&' ? intoId : self.not(intoId), self.lazyRecurse(ast.right, intoId)); + recursionFn(intoId); + break; + case AST.ConditionalExpression: + intoId = intoId || this.nextId(); + self.recurse(ast.test, intoId); + self.if_(intoId, self.lazyRecurse(ast.alternate, intoId), self.lazyRecurse(ast.consequent, intoId)); + recursionFn(intoId); + break; + case AST.Identifier: + intoId = intoId || this.nextId(); + if (nameId) { + nameId.context = self.stage === 'inputs' ? 's' : this.assign(this.nextId(), this.getHasOwnProperty('l', ast.name) + '?l:s'); + nameId.computed = false; + nameId.name = ast.name; + } + ensureSafeMemberName(ast.name); + self.if_(self.stage === 'inputs' || self.not(self.getHasOwnProperty('l', ast.name)), + function() { + self.if_(self.stage === 'inputs' || 's', function() { + if (create && create !== 1) { + self.if_( + self.not(self.nonComputedMember('s', ast.name)), + self.lazyAssign(self.nonComputedMember('s', ast.name), '{}')); + } + self.assign(intoId, self.nonComputedMember('s', ast.name)); + }); + }, intoId && self.lazyAssign(intoId, self.nonComputedMember('l', ast.name)) + ); + if (self.state.expensiveChecks || isPossiblyDangerousMemberName(ast.name)) { + self.addEnsureSafeObject(intoId); + } + recursionFn(intoId); + break; + case AST.MemberExpression: + left = nameId && (nameId.context = this.nextId()) || this.nextId(); + intoId = intoId || this.nextId(); + self.recurse(ast.object, left, undefined, function() { + self.if_(self.notNull(left), function() { + if (create && create !== 1) { + self.addEnsureSafeAssignContext(left); + } + if (ast.computed) { + right = self.nextId(); + self.recurse(ast.property, right); + self.getStringValue(right); + self.addEnsureSafeMemberName(right); + if (create && create !== 1) { + self.if_(self.not(self.computedMember(left, right)), self.lazyAssign(self.computedMember(left, right), '{}')); + } + expression = self.ensureSafeObject(self.computedMember(left, right)); + self.assign(intoId, expression); + if (nameId) { + nameId.computed = true; + nameId.name = right; + } + } else { + ensureSafeMemberName(ast.property.name); + if (create && create !== 1) { + self.if_(self.not(self.nonComputedMember(left, ast.property.name)), self.lazyAssign(self.nonComputedMember(left, ast.property.name), '{}')); + } + expression = self.nonComputedMember(left, ast.property.name); + if (self.state.expensiveChecks || isPossiblyDangerousMemberName(ast.property.name)) { + expression = self.ensureSafeObject(expression); + } + self.assign(intoId, expression); + if (nameId) { + nameId.computed = false; + nameId.name = ast.property.name; + } + } + }, function() { + self.assign(intoId, 'undefined'); + }); + recursionFn(intoId); + }, !!create); + break; + case AST.CallExpression: + intoId = intoId || this.nextId(); + if (ast.filter) { + right = self.filter(ast.callee.name); + args = []; + forEach(ast.arguments, function(expr) { + var argument = self.nextId(); + self.recurse(expr, argument); + args.push(argument); + }); + expression = right + '(' + args.join(',') + ')'; + self.assign(intoId, expression); + recursionFn(intoId); + } else { + right = self.nextId(); + left = {}; + args = []; + self.recurse(ast.callee, right, left, function() { + self.if_(self.notNull(right), function() { + self.addEnsureSafeFunction(right); + forEach(ast.arguments, function(expr) { + self.recurse(expr, self.nextId(), undefined, function(argument) { + args.push(self.ensureSafeObject(argument)); + }); + }); + if (left.name) { + if (!self.state.expensiveChecks) { + self.addEnsureSafeObject(left.context); + } + expression = self.member(left.context, left.name, left.computed) + '(' + args.join(',') + ')'; + } else { + expression = right + '(' + args.join(',') + ')'; + } + expression = self.ensureSafeObject(expression); + self.assign(intoId, expression); + }, function() { + self.assign(intoId, 'undefined'); + }); + recursionFn(intoId); + }); + } + break; + case AST.AssignmentExpression: + right = this.nextId(); + left = {}; + if (!isAssignable(ast.left)) { + throw $parseMinErr('lval', 'Trying to assign a value to a non l-value'); + } + this.recurse(ast.left, undefined, left, function() { + self.if_(self.notNull(left.context), function() { + self.recurse(ast.right, right); + self.addEnsureSafeObject(self.member(left.context, left.name, left.computed)); + self.addEnsureSafeAssignContext(left.context); + expression = self.member(left.context, left.name, left.computed) + ast.operator + right; + self.assign(intoId, expression); + recursionFn(intoId || expression); + }); + }, 1); + break; + case AST.ArrayExpression: + args = []; + forEach(ast.elements, function(expr) { + self.recurse(expr, self.nextId(), undefined, function(argument) { + args.push(argument); + }); + }); + expression = '[' + args.join(',') + ']'; + this.assign(intoId, expression); + recursionFn(expression); + break; + case AST.ObjectExpression: + args = []; + forEach(ast.properties, function(property) { + self.recurse(property.value, self.nextId(), undefined, function(expr) { + args.push(self.escape( + property.key.type === AST.Identifier ? property.key.name : + ('' + property.key.value)) + + ':' + expr); + }); + }); + expression = '{' + args.join(',') + '}'; + this.assign(intoId, expression); + recursionFn(expression); + break; + case AST.ThisExpression: + this.assign(intoId, 's'); + recursionFn('s'); + break; + case AST.LocalsExpression: + this.assign(intoId, 'l'); + recursionFn('l'); + break; + case AST.NGValueParameter: + this.assign(intoId, 'v'); + recursionFn('v'); + break; + } + }, + + getHasOwnProperty: function(element, property) { + var key = element + '.' + property; + var own = this.current().own; + if (!own.hasOwnProperty(key)) { + own[key] = this.nextId(false, element + '&&(' + this.escape(property) + ' in ' + element + ')'); + } + return own[key]; + }, + + assign: function(id, value) { + if (!id) return; + this.current().body.push(id, '=', value, ';'); + return id; + }, + + filter: function(filterName) { + if (!this.state.filters.hasOwnProperty(filterName)) { + this.state.filters[filterName] = this.nextId(true); + } + return this.state.filters[filterName]; + }, + + ifDefined: function(id, defaultValue) { + return 'ifDefined(' + id + ',' + this.escape(defaultValue) + ')'; + }, + + plus: function(left, right) { + return 'plus(' + left + ',' + right + ')'; + }, + + return_: function(id) { + this.current().body.push('return ', id, ';'); + }, + + if_: function(test, alternate, consequent) { + if (test === true) { + alternate(); + } else { + var body = this.current().body; + body.push('if(', test, '){'); + alternate(); + body.push('}'); + if (consequent) { + body.push('else{'); + consequent(); + body.push('}'); + } + } + }, + + not: function(expression) { + return '!(' + expression + ')'; + }, + + notNull: function(expression) { + return expression + '!=null'; + }, + + nonComputedMember: function(left, right) { + return left + '.' + right; + }, + + computedMember: function(left, right) { + return left + '[' + right + ']'; + }, + + member: function(left, right, computed) { + if (computed) return this.computedMember(left, right); + return this.nonComputedMember(left, right); + }, + + addEnsureSafeObject: function(item) { + this.current().body.push(this.ensureSafeObject(item), ';'); + }, + + addEnsureSafeMemberName: function(item) { + this.current().body.push(this.ensureSafeMemberName(item), ';'); + }, + + addEnsureSafeFunction: function(item) { + this.current().body.push(this.ensureSafeFunction(item), ';'); + }, + + addEnsureSafeAssignContext: function(item) { + this.current().body.push(this.ensureSafeAssignContext(item), ';'); + }, + + ensureSafeObject: function(item) { + return 'ensureSafeObject(' + item + ',text)'; + }, + + ensureSafeMemberName: function(item) { + return 'ensureSafeMemberName(' + item + ',text)'; + }, + + ensureSafeFunction: function(item) { + return 'ensureSafeFunction(' + item + ',text)'; + }, + + getStringValue: function(item) { + this.assign(item, 'getStringValue(' + item + ')'); + }, + + ensureSafeAssignContext: function(item) { + return 'ensureSafeAssignContext(' + item + ',text)'; + }, + + lazyRecurse: function(ast, intoId, nameId, recursionFn, create, skipWatchIdCheck) { + var self = this; + return function() { + self.recurse(ast, intoId, nameId, recursionFn, create, skipWatchIdCheck); + }; + }, + + lazyAssign: function(id, value) { + var self = this; + return function() { + self.assign(id, value); + }; + }, + + stringEscapeRegex: /[^ a-zA-Z0-9]/g, + + stringEscapeFn: function(c) { + return '\\u' + ('0000' + c.charCodeAt(0).toString(16)).slice(-4); + }, + + escape: function(value) { + if (isString(value)) return "'" + value.replace(this.stringEscapeRegex, this.stringEscapeFn) + "'"; + if (isNumber(value)) return value.toString(); + if (value === true) return 'true'; + if (value === false) return 'false'; + if (value === null) return 'null'; + if (typeof value === 'undefined') return 'undefined'; + + throw $parseMinErr('esc', 'IMPOSSIBLE'); + }, + + nextId: function(skip, init) { + var id = 'v' + (this.state.nextId++); + if (!skip) { + this.current().vars.push(id + (init ? '=' + init : '')); + } + return id; + }, + + current: function() { + return this.state[this.state.computing]; + } +}; + + +function ASTInterpreter(astBuilder, $filter) { + this.astBuilder = astBuilder; + this.$filter = $filter; +} + +ASTInterpreter.prototype = { + compile: function(expression, expensiveChecks) { + var self = this; + var ast = this.astBuilder.ast(expression); + this.expression = expression; + this.expensiveChecks = expensiveChecks; + findConstantAndWatchExpressions(ast, self.$filter); + var assignable; + var assign; + if ((assignable = assignableAST(ast))) { + assign = this.recurse(assignable); + } + var toWatch = getInputs(ast.body); + var inputs; + if (toWatch) { + inputs = []; + forEach(toWatch, function(watch, key) { + var input = self.recurse(watch); + watch.input = input; + inputs.push(input); + watch.watchId = key; + }); + } + var expressions = []; + forEach(ast.body, function(expression) { + expressions.push(self.recurse(expression.expression)); + }); + var fn = ast.body.length === 0 ? noop : + ast.body.length === 1 ? expressions[0] : + function(scope, locals) { + var lastValue; + forEach(expressions, function(exp) { + lastValue = exp(scope, locals); + }); + return lastValue; + }; + if (assign) { + fn.assign = function(scope, value, locals) { + return assign(scope, locals, value); + }; + } + if (inputs) { + fn.inputs = inputs; + } + fn.literal = isLiteral(ast); + fn.constant = isConstant(ast); + return fn; + }, + + recurse: function(ast, context, create) { + var left, right, self = this, args, expression; + if (ast.input) { + return this.inputs(ast.input, ast.watchId); + } + switch (ast.type) { + case AST.Literal: + return this.value(ast.value, context); + case AST.UnaryExpression: + right = this.recurse(ast.argument); + return this['unary' + ast.operator](right, context); + case AST.BinaryExpression: + left = this.recurse(ast.left); + right = this.recurse(ast.right); + return this['binary' + ast.operator](left, right, context); + case AST.LogicalExpression: + left = this.recurse(ast.left); + right = this.recurse(ast.right); + return this['binary' + ast.operator](left, right, context); + case AST.ConditionalExpression: + return this['ternary?:']( + this.recurse(ast.test), + this.recurse(ast.alternate), + this.recurse(ast.consequent), + context + ); + case AST.Identifier: + ensureSafeMemberName(ast.name, self.expression); + return self.identifier(ast.name, + self.expensiveChecks || isPossiblyDangerousMemberName(ast.name), + context, create, self.expression); + case AST.MemberExpression: + left = this.recurse(ast.object, false, !!create); + if (!ast.computed) { + ensureSafeMemberName(ast.property.name, self.expression); + right = ast.property.name; + } + if (ast.computed) right = this.recurse(ast.property); + return ast.computed ? + this.computedMember(left, right, context, create, self.expression) : + this.nonComputedMember(left, right, self.expensiveChecks, context, create, self.expression); + case AST.CallExpression: + args = []; + forEach(ast.arguments, function(expr) { + args.push(self.recurse(expr)); + }); + if (ast.filter) right = this.$filter(ast.callee.name); + if (!ast.filter) right = this.recurse(ast.callee, true); + return ast.filter ? + function(scope, locals, assign, inputs) { + var values = []; + for (var i = 0; i < args.length; ++i) { + values.push(args[i](scope, locals, assign, inputs)); + } + var value = right.apply(undefined, values, inputs); + return context ? {context: undefined, name: undefined, value: value} : value; + } : + function(scope, locals, assign, inputs) { + var rhs = right(scope, locals, assign, inputs); + var value; + if (rhs.value != null) { + ensureSafeObject(rhs.context, self.expression); + ensureSafeFunction(rhs.value, self.expression); + var values = []; + for (var i = 0; i < args.length; ++i) { + values.push(ensureSafeObject(args[i](scope, locals, assign, inputs), self.expression)); + } + value = ensureSafeObject(rhs.value.apply(rhs.context, values), self.expression); + } + return context ? {value: value} : value; + }; + case AST.AssignmentExpression: + left = this.recurse(ast.left, true, 1); + right = this.recurse(ast.right); + return function(scope, locals, assign, inputs) { + var lhs = left(scope, locals, assign, inputs); + var rhs = right(scope, locals, assign, inputs); + ensureSafeObject(lhs.value, self.expression); + ensureSafeAssignContext(lhs.context); + lhs.context[lhs.name] = rhs; + return context ? {value: rhs} : rhs; + }; + case AST.ArrayExpression: + args = []; + forEach(ast.elements, function(expr) { + args.push(self.recurse(expr)); + }); + return function(scope, locals, assign, inputs) { + var value = []; + for (var i = 0; i < args.length; ++i) { + value.push(args[i](scope, locals, assign, inputs)); + } + return context ? {value: value} : value; + }; + case AST.ObjectExpression: + args = []; + forEach(ast.properties, function(property) { + args.push({key: property.key.type === AST.Identifier ? + property.key.name : + ('' + property.key.value), + value: self.recurse(property.value) + }); + }); + return function(scope, locals, assign, inputs) { + var value = {}; + for (var i = 0; i < args.length; ++i) { + value[args[i].key] = args[i].value(scope, locals, assign, inputs); + } + return context ? {value: value} : value; + }; + case AST.ThisExpression: + return function(scope) { + return context ? {value: scope} : scope; + }; + case AST.LocalsExpression: + return function(scope, locals) { + return context ? {value: locals} : locals; + }; + case AST.NGValueParameter: + return function(scope, locals, assign) { + return context ? {value: assign} : assign; + }; + } + }, + + 'unary+': function(argument, context) { + return function(scope, locals, assign, inputs) { + var arg = argument(scope, locals, assign, inputs); + if (isDefined(arg)) { + arg = +arg; + } else { + arg = 0; + } + return context ? {value: arg} : arg; + }; + }, + 'unary-': function(argument, context) { + return function(scope, locals, assign, inputs) { + var arg = argument(scope, locals, assign, inputs); + if (isDefined(arg)) { + arg = -arg; + } else { + arg = 0; + } + return context ? {value: arg} : arg; + }; + }, + 'unary!': function(argument, context) { + return function(scope, locals, assign, inputs) { + var arg = !argument(scope, locals, assign, inputs); + return context ? {value: arg} : arg; + }; + }, + 'binary+': function(left, right, context) { + return function(scope, locals, assign, inputs) { + var lhs = left(scope, locals, assign, inputs); + var rhs = right(scope, locals, assign, inputs); + var arg = plusFn(lhs, rhs); + return context ? {value: arg} : arg; + }; + }, + 'binary-': function(left, right, context) { + return function(scope, locals, assign, inputs) { + var lhs = left(scope, locals, assign, inputs); + var rhs = right(scope, locals, assign, inputs); + var arg = (isDefined(lhs) ? lhs : 0) - (isDefined(rhs) ? rhs : 0); + return context ? {value: arg} : arg; + }; + }, + 'binary*': function(left, right, context) { + return function(scope, locals, assign, inputs) { + var arg = left(scope, locals, assign, inputs) * right(scope, locals, assign, inputs); + return context ? {value: arg} : arg; + }; + }, + 'binary/': function(left, right, context) { + return function(scope, locals, assign, inputs) { + var arg = left(scope, locals, assign, inputs) / right(scope, locals, assign, inputs); + return context ? {value: arg} : arg; + }; + }, + 'binary%': function(left, right, context) { + return function(scope, locals, assign, inputs) { + var arg = left(scope, locals, assign, inputs) % right(scope, locals, assign, inputs); + return context ? {value: arg} : arg; + }; + }, + 'binary===': function(left, right, context) { + return function(scope, locals, assign, inputs) { + var arg = left(scope, locals, assign, inputs) === right(scope, locals, assign, inputs); + return context ? {value: arg} : arg; + }; + }, + 'binary!==': function(left, right, context) { + return function(scope, locals, assign, inputs) { + var arg = left(scope, locals, assign, inputs) !== right(scope, locals, assign, inputs); + return context ? {value: arg} : arg; + }; + }, + 'binary==': function(left, right, context) { + return function(scope, locals, assign, inputs) { + var arg = left(scope, locals, assign, inputs) == right(scope, locals, assign, inputs); + return context ? {value: arg} : arg; + }; + }, + 'binary!=': function(left, right, context) { + return function(scope, locals, assign, inputs) { + var arg = left(scope, locals, assign, inputs) != right(scope, locals, assign, inputs); + return context ? {value: arg} : arg; + }; + }, + 'binary<': function(left, right, context) { + return function(scope, locals, assign, inputs) { + var arg = left(scope, locals, assign, inputs) < right(scope, locals, assign, inputs); + return context ? {value: arg} : arg; + }; + }, + 'binary>': function(left, right, context) { + return function(scope, locals, assign, inputs) { + var arg = left(scope, locals, assign, inputs) > right(scope, locals, assign, inputs); + return context ? {value: arg} : arg; + }; + }, + 'binary<=': function(left, right, context) { + return function(scope, locals, assign, inputs) { + var arg = left(scope, locals, assign, inputs) <= right(scope, locals, assign, inputs); + return context ? {value: arg} : arg; + }; + }, + 'binary>=': function(left, right, context) { + return function(scope, locals, assign, inputs) { + var arg = left(scope, locals, assign, inputs) >= right(scope, locals, assign, inputs); + return context ? {value: arg} : arg; + }; + }, + 'binary&&': function(left, right, context) { + return function(scope, locals, assign, inputs) { + var arg = left(scope, locals, assign, inputs) && right(scope, locals, assign, inputs); + return context ? {value: arg} : arg; + }; + }, + 'binary||': function(left, right, context) { + return function(scope, locals, assign, inputs) { + var arg = left(scope, locals, assign, inputs) || right(scope, locals, assign, inputs); + return context ? {value: arg} : arg; + }; + }, + 'ternary?:': function(test, alternate, consequent, context) { + return function(scope, locals, assign, inputs) { + var arg = test(scope, locals, assign, inputs) ? alternate(scope, locals, assign, inputs) : consequent(scope, locals, assign, inputs); + return context ? {value: arg} : arg; + }; + }, + value: function(value, context) { + return function() { return context ? {context: undefined, name: undefined, value: value} : value; }; + }, + identifier: function(name, expensiveChecks, context, create, expression) { + return function(scope, locals, assign, inputs) { + var base = locals && (name in locals) ? locals : scope; + if (create && create !== 1 && base && !(base[name])) { + base[name] = {}; + } + var value = base ? base[name] : undefined; + if (expensiveChecks) { + ensureSafeObject(value, expression); + } + if (context) { + return {context: base, name: name, value: value}; + } else { + return value; + } + }; + }, + computedMember: function(left, right, context, create, expression) { + return function(scope, locals, assign, inputs) { + var lhs = left(scope, locals, assign, inputs); + var rhs; + var value; + if (lhs != null) { + rhs = right(scope, locals, assign, inputs); + rhs = getStringValue(rhs); + ensureSafeMemberName(rhs, expression); + if (create && create !== 1) { + ensureSafeAssignContext(lhs); + if (lhs && !(lhs[rhs])) { + lhs[rhs] = {}; + } + } + value = lhs[rhs]; + ensureSafeObject(value, expression); + } + if (context) { + return {context: lhs, name: rhs, value: value}; + } else { + return value; + } + }; + }, + nonComputedMember: function(left, right, expensiveChecks, context, create, expression) { + return function(scope, locals, assign, inputs) { + var lhs = left(scope, locals, assign, inputs); + if (create && create !== 1) { + ensureSafeAssignContext(lhs); + if (lhs && !(lhs[right])) { + lhs[right] = {}; + } + } + var value = lhs != null ? lhs[right] : undefined; + if (expensiveChecks || isPossiblyDangerousMemberName(right)) { + ensureSafeObject(value, expression); + } + if (context) { + return {context: lhs, name: right, value: value}; + } else { + return value; + } + }; + }, + inputs: function(input, watchId) { + return function(scope, value, locals, inputs) { + if (inputs) return inputs[watchId]; + return input(scope, value, locals); + }; + } +}; + +/** + * @constructor + */ +var Parser = function(lexer, $filter, options) { + this.lexer = lexer; + this.$filter = $filter; + this.options = options; + this.ast = new AST(lexer, options); + this.astCompiler = options.csp ? new ASTInterpreter(this.ast, $filter) : + new ASTCompiler(this.ast, $filter); +}; + +Parser.prototype = { + constructor: Parser, + + parse: function(text) { + return this.astCompiler.compile(text, this.options.expensiveChecks); + } +}; + +function isPossiblyDangerousMemberName(name) { + return name == 'constructor'; +} + +var objectValueOf = Object.prototype.valueOf; + +function getValueOf(value) { + return isFunction(value.valueOf) ? value.valueOf() : objectValueOf.call(value); +} + +/////////////////////////////////// + +/** + * @ngdoc service + * @name $parse + * @kind function + * + * @description + * + * Converts Angular {@link guide/expression expression} into a function. + * + * ```js + * var getter = $parse('user.name'); + * var setter = getter.assign; + * var context = {user:{name:'angular'}}; + * var locals = {user:{name:'local'}}; + * + * expect(getter(context)).toEqual('angular'); + * setter(context, 'newValue'); + * expect(context.user.name).toEqual('newValue'); + * expect(getter(context, locals)).toEqual('local'); + * ``` + * + * + * @param {string} expression String expression to compile. + * @returns {function(context, locals)} a function which represents the compiled expression: + * + * * `context` – `{object}` – an object against which any expressions embedded in the strings + * are evaluated against (typically a scope object). + * * `locals` – `{object=}` – local variables context object, useful for overriding values in + * `context`. + * + * The returned function also has the following properties: + * * `literal` – `{boolean}` – whether the expression's top-level node is a JavaScript + * literal. + * * `constant` – `{boolean}` – whether the expression is made entirely of JavaScript + * constant literals. + * * `assign` – `{?function(context, value)}` – if the expression is assignable, this will be + * set to a function to change its value on the given context. + * + */ + + +/** + * @ngdoc provider + * @name $parseProvider + * + * @description + * `$parseProvider` can be used for configuring the default behavior of the {@link ng.$parse $parse} + * service. + */ +function $ParseProvider() { + var cacheDefault = createMap(); + var cacheExpensive = createMap(); + var literals = { + 'true': true, + 'false': false, + 'null': null, + 'undefined': undefined + }; + + /** + * @ngdoc method + * @name $parseProvider#addLiteral + * @description + * + * Configure $parse service to add literal values that will be present as literal at expressions. + * + * @param {string} literalName Token for the literal value. The literal name value must be a valid literal name. + * @param {*} literalValue Value for this literal. All literal values must be primitives or `undefined`. + * + **/ + this.addLiteral = function(literalName, literalValue) { + literals[literalName] = literalValue; + }; + + this.$get = ['$filter', function($filter) { + var noUnsafeEval = csp().noUnsafeEval; + var $parseOptions = { + csp: noUnsafeEval, + expensiveChecks: false, + literals: copy(literals) + }, + $parseOptionsExpensive = { + csp: noUnsafeEval, + expensiveChecks: true, + literals: copy(literals) + }; + var runningChecksEnabled = false; + + $parse.$$runningExpensiveChecks = function() { + return runningChecksEnabled; + }; + + return $parse; + + function $parse(exp, interceptorFn, expensiveChecks) { + var parsedExpression, oneTime, cacheKey; + + expensiveChecks = expensiveChecks || runningChecksEnabled; + + switch (typeof exp) { + case 'string': + exp = exp.trim(); + cacheKey = exp; + + var cache = (expensiveChecks ? cacheExpensive : cacheDefault); + parsedExpression = cache[cacheKey]; + + if (!parsedExpression) { + if (exp.charAt(0) === ':' && exp.charAt(1) === ':') { + oneTime = true; + exp = exp.substring(2); + } + var parseOptions = expensiveChecks ? $parseOptionsExpensive : $parseOptions; + var lexer = new Lexer(parseOptions); + var parser = new Parser(lexer, $filter, parseOptions); + parsedExpression = parser.parse(exp); + if (parsedExpression.constant) { + parsedExpression.$$watchDelegate = constantWatchDelegate; + } else if (oneTime) { + parsedExpression.$$watchDelegate = parsedExpression.literal ? + oneTimeLiteralWatchDelegate : oneTimeWatchDelegate; + } else if (parsedExpression.inputs) { + parsedExpression.$$watchDelegate = inputsWatchDelegate; + } + if (expensiveChecks) { + parsedExpression = expensiveChecksInterceptor(parsedExpression); + } + cache[cacheKey] = parsedExpression; + } + return addInterceptor(parsedExpression, interceptorFn); + + case 'function': + return addInterceptor(exp, interceptorFn); + + default: + return addInterceptor(noop, interceptorFn); + } + } + + function expensiveChecksInterceptor(fn) { + if (!fn) return fn; + expensiveCheckFn.$$watchDelegate = fn.$$watchDelegate; + expensiveCheckFn.assign = expensiveChecksInterceptor(fn.assign); + expensiveCheckFn.constant = fn.constant; + expensiveCheckFn.literal = fn.literal; + for (var i = 0; fn.inputs && i < fn.inputs.length; ++i) { + fn.inputs[i] = expensiveChecksInterceptor(fn.inputs[i]); + } + expensiveCheckFn.inputs = fn.inputs; + + return expensiveCheckFn; + + function expensiveCheckFn(scope, locals, assign, inputs) { + var expensiveCheckOldValue = runningChecksEnabled; + runningChecksEnabled = true; + try { + return fn(scope, locals, assign, inputs); + } finally { + runningChecksEnabled = expensiveCheckOldValue; + } + } + } + + function expressionInputDirtyCheck(newValue, oldValueOfValue) { + + if (newValue == null || oldValueOfValue == null) { // null/undefined + return newValue === oldValueOfValue; + } + + if (typeof newValue === 'object') { + + // attempt to convert the value to a primitive type + // TODO(docs): add a note to docs that by implementing valueOf even objects and arrays can + // be cheaply dirty-checked + newValue = getValueOf(newValue); + + if (typeof newValue === 'object') { + // objects/arrays are not supported - deep-watching them would be too expensive + return false; + } + + // fall-through to the primitive equality check + } + + //Primitive or NaN + return newValue === oldValueOfValue || (newValue !== newValue && oldValueOfValue !== oldValueOfValue); + } + + function inputsWatchDelegate(scope, listener, objectEquality, parsedExpression, prettyPrintExpression) { + var inputExpressions = parsedExpression.inputs; + var lastResult; + + if (inputExpressions.length === 1) { + var oldInputValueOf = expressionInputDirtyCheck; // init to something unique so that equals check fails + inputExpressions = inputExpressions[0]; + return scope.$watch(function expressionInputWatch(scope) { + var newInputValue = inputExpressions(scope); + if (!expressionInputDirtyCheck(newInputValue, oldInputValueOf)) { + lastResult = parsedExpression(scope, undefined, undefined, [newInputValue]); + oldInputValueOf = newInputValue && getValueOf(newInputValue); + } + return lastResult; + }, listener, objectEquality, prettyPrintExpression); + } + + var oldInputValueOfValues = []; + var oldInputValues = []; + for (var i = 0, ii = inputExpressions.length; i < ii; i++) { + oldInputValueOfValues[i] = expressionInputDirtyCheck; // init to something unique so that equals check fails + oldInputValues[i] = null; + } + + return scope.$watch(function expressionInputsWatch(scope) { + var changed = false; + + for (var i = 0, ii = inputExpressions.length; i < ii; i++) { + var newInputValue = inputExpressions[i](scope); + if (changed || (changed = !expressionInputDirtyCheck(newInputValue, oldInputValueOfValues[i]))) { + oldInputValues[i] = newInputValue; + oldInputValueOfValues[i] = newInputValue && getValueOf(newInputValue); + } + } + + if (changed) { + lastResult = parsedExpression(scope, undefined, undefined, oldInputValues); + } + + return lastResult; + }, listener, objectEquality, prettyPrintExpression); + } + + function oneTimeWatchDelegate(scope, listener, objectEquality, parsedExpression) { + var unwatch, lastValue; + return unwatch = scope.$watch(function oneTimeWatch(scope) { + return parsedExpression(scope); + }, function oneTimeListener(value, old, scope) { + lastValue = value; + if (isFunction(listener)) { + listener.apply(this, arguments); + } + if (isDefined(value)) { + scope.$$postDigest(function() { + if (isDefined(lastValue)) { + unwatch(); + } + }); + } + }, objectEquality); + } + + function oneTimeLiteralWatchDelegate(scope, listener, objectEquality, parsedExpression) { + var unwatch, lastValue; + return unwatch = scope.$watch(function oneTimeWatch(scope) { + return parsedExpression(scope); + }, function oneTimeListener(value, old, scope) { + lastValue = value; + if (isFunction(listener)) { + listener.call(this, value, old, scope); + } + if (isAllDefined(value)) { + scope.$$postDigest(function() { + if (isAllDefined(lastValue)) unwatch(); + }); + } + }, objectEquality); + + function isAllDefined(value) { + var allDefined = true; + forEach(value, function(val) { + if (!isDefined(val)) allDefined = false; + }); + return allDefined; + } + } + + function constantWatchDelegate(scope, listener, objectEquality, parsedExpression) { + var unwatch; + return unwatch = scope.$watch(function constantWatch(scope) { + unwatch(); + return parsedExpression(scope); + }, listener, objectEquality); + } + + function addInterceptor(parsedExpression, interceptorFn) { + if (!interceptorFn) return parsedExpression; + var watchDelegate = parsedExpression.$$watchDelegate; + var useInputs = false; + + var regularWatch = + watchDelegate !== oneTimeLiteralWatchDelegate && + watchDelegate !== oneTimeWatchDelegate; + + var fn = regularWatch ? function regularInterceptedExpression(scope, locals, assign, inputs) { + var value = useInputs && inputs ? inputs[0] : parsedExpression(scope, locals, assign, inputs); + return interceptorFn(value, scope, locals); + } : function oneTimeInterceptedExpression(scope, locals, assign, inputs) { + var value = parsedExpression(scope, locals, assign, inputs); + var result = interceptorFn(value, scope, locals); + // we only return the interceptor's result if the + // initial value is defined (for bind-once) + return isDefined(value) ? result : value; + }; + + // Propagate $$watchDelegates other then inputsWatchDelegate + if (parsedExpression.$$watchDelegate && + parsedExpression.$$watchDelegate !== inputsWatchDelegate) { + fn.$$watchDelegate = parsedExpression.$$watchDelegate; + } else if (!interceptorFn.$stateful) { + // If there is an interceptor, but no watchDelegate then treat the interceptor like + // we treat filters - it is assumed to be a pure function unless flagged with $stateful + fn.$$watchDelegate = inputsWatchDelegate; + useInputs = !parsedExpression.inputs; + fn.inputs = parsedExpression.inputs ? parsedExpression.inputs : [parsedExpression]; + } + + return fn; + } + }]; +} + +/** + * @ngdoc service + * @name $q + * @requires $rootScope + * + * @description + * A service that helps you run functions asynchronously, and use their return values (or exceptions) + * when they are done processing. + * + * This is an implementation of promises/deferred objects inspired by + * [Kris Kowal's Q](https://github.com/kriskowal/q). + * + * $q can be used in two fashions --- one which is more similar to Kris Kowal's Q or jQuery's Deferred + * implementations, and the other which resembles ES6 (ES2015) promises to some degree. + * + * # $q constructor + * + * The streamlined ES6 style promise is essentially just using $q as a constructor which takes a `resolver` + * function as the first argument. This is similar to the native Promise implementation from ES6, + * see [MDN](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Promise). + * + * While the constructor-style use is supported, not all of the supporting methods from ES6 promises are + * available yet. + * + * It can be used like so: + * + * ```js + * // for the purpose of this example let's assume that variables `$q` and `okToGreet` + * // are available in the current lexical scope (they could have been injected or passed in). + * + * function asyncGreet(name) { + * // perform some asynchronous operation, resolve or reject the promise when appropriate. + * return $q(function(resolve, reject) { + * setTimeout(function() { + * if (okToGreet(name)) { + * resolve('Hello, ' + name + '!'); + * } else { + * reject('Greeting ' + name + ' is not allowed.'); + * } + * }, 1000); + * }); + * } + * + * var promise = asyncGreet('Robin Hood'); + * promise.then(function(greeting) { + * alert('Success: ' + greeting); + * }, function(reason) { + * alert('Failed: ' + reason); + * }); + * ``` + * + * Note: progress/notify callbacks are not currently supported via the ES6-style interface. + * + * Note: unlike ES6 behavior, an exception thrown in the constructor function will NOT implicitly reject the promise. + * + * However, the more traditional CommonJS-style usage is still available, and documented below. + * + * [The CommonJS Promise proposal](http://wiki.commonjs.org/wiki/Promises) describes a promise as an + * interface for interacting with an object that represents the result of an action that is + * performed asynchronously, and may or may not be finished at any given point in time. + * + * From the perspective of dealing with error handling, deferred and promise APIs are to + * asynchronous programming what `try`, `catch` and `throw` keywords are to synchronous programming. + * + * ```js + * // for the purpose of this example let's assume that variables `$q` and `okToGreet` + * // are available in the current lexical scope (they could have been injected or passed in). + * + * function asyncGreet(name) { + * var deferred = $q.defer(); + * + * setTimeout(function() { + * deferred.notify('About to greet ' + name + '.'); + * + * if (okToGreet(name)) { + * deferred.resolve('Hello, ' + name + '!'); + * } else { + * deferred.reject('Greeting ' + name + ' is not allowed.'); + * } + * }, 1000); + * + * return deferred.promise; + * } + * + * var promise = asyncGreet('Robin Hood'); + * promise.then(function(greeting) { + * alert('Success: ' + greeting); + * }, function(reason) { + * alert('Failed: ' + reason); + * }, function(update) { + * alert('Got notification: ' + update); + * }); + * ``` + * + * At first it might not be obvious why this extra complexity is worth the trouble. The payoff + * comes in the way of guarantees that promise and deferred APIs make, see + * https://github.com/kriskowal/uncommonjs/blob/master/promises/specification.md. + * + * Additionally the promise api allows for composition that is very hard to do with the + * traditional callback ([CPS](http://en.wikipedia.org/wiki/Continuation-passing_style)) approach. + * For more on this please see the [Q documentation](https://github.com/kriskowal/q) especially the + * section on serial or parallel joining of promises. + * + * # The Deferred API + * + * A new instance of deferred is constructed by calling `$q.defer()`. + * + * The purpose of the deferred object is to expose the associated Promise instance as well as APIs + * that can be used for signaling the successful or unsuccessful completion, as well as the status + * of the task. + * + * **Methods** + * + * - `resolve(value)` – resolves the derived promise with the `value`. If the value is a rejection + * constructed via `$q.reject`, the promise will be rejected instead. + * - `reject(reason)` – rejects the derived promise with the `reason`. This is equivalent to + * resolving it with a rejection constructed via `$q.reject`. + * - `notify(value)` - provides updates on the status of the promise's execution. This may be called + * multiple times before the promise is either resolved or rejected. + * + * **Properties** + * + * - promise – `{Promise}` – promise object associated with this deferred. + * + * + * # The Promise API + * + * A new promise instance is created when a deferred instance is created and can be retrieved by + * calling `deferred.promise`. + * + * The purpose of the promise object is to allow for interested parties to get access to the result + * of the deferred task when it completes. + * + * **Methods** + * + * - `then(successCallback, errorCallback, notifyCallback)` – regardless of when the promise was or + * will be resolved or rejected, `then` calls one of the success or error callbacks asynchronously + * as soon as the result is available. The callbacks are called with a single argument: the result + * or rejection reason. Additionally, the notify callback may be called zero or more times to + * provide a progress indication, before the promise is resolved or rejected. + * + * This method *returns a new promise* which is resolved or rejected via the return value of the + * `successCallback`, `errorCallback` (unless that value is a promise, in which case it is resolved + * with the value which is resolved in that promise using + * [promise chaining](http://www.html5rocks.com/en/tutorials/es6/promises/#toc-promises-queues)). + * It also notifies via the return value of the `notifyCallback` method. The promise cannot be + * resolved or rejected from the notifyCallback method. + * + * - `catch(errorCallback)` – shorthand for `promise.then(null, errorCallback)` + * + * - `finally(callback, notifyCallback)` – allows you to observe either the fulfillment or rejection of a promise, + * but to do so without modifying the final value. This is useful to release resources or do some + * clean-up that needs to be done whether the promise was rejected or resolved. See the [full + * specification](https://github.com/kriskowal/q/wiki/API-Reference#promisefinallycallback) for + * more information. + * + * # Chaining promises + * + * Because calling the `then` method of a promise returns a new derived promise, it is easily + * possible to create a chain of promises: + * + * ```js + * promiseB = promiseA.then(function(result) { + * return result + 1; + * }); + * + * // promiseB will be resolved immediately after promiseA is resolved and its value + * // will be the result of promiseA incremented by 1 + * ``` + * + * It is possible to create chains of any length and since a promise can be resolved with another + * promise (which will defer its resolution further), it is possible to pause/defer resolution of + * the promises at any point in the chain. This makes it possible to implement powerful APIs like + * $http's response interceptors. + * + * + * # Differences between Kris Kowal's Q and $q + * + * There are two main differences: + * + * - $q is integrated with the {@link ng.$rootScope.Scope} Scope model observation + * mechanism in angular, which means faster propagation of resolution or rejection into your + * models and avoiding unnecessary browser repaints, which would result in flickering UI. + * - Q has many more features than $q, but that comes at a cost of bytes. $q is tiny, but contains + * all the important functionality needed for common async tasks. + * + * # Testing + * + * ```js + * it('should simulate promise', inject(function($q, $rootScope) { + * var deferred = $q.defer(); + * var promise = deferred.promise; + * var resolvedValue; + * + * promise.then(function(value) { resolvedValue = value; }); + * expect(resolvedValue).toBeUndefined(); + * + * // Simulate resolving of promise + * deferred.resolve(123); + * // Note that the 'then' function does not get called synchronously. + * // This is because we want the promise API to always be async, whether or not + * // it got called synchronously or asynchronously. + * expect(resolvedValue).toBeUndefined(); + * + * // Propagate promise resolution to 'then' functions using $apply(). + * $rootScope.$apply(); + * expect(resolvedValue).toEqual(123); + * })); + * ``` + * + * @param {function(function, function)} resolver Function which is responsible for resolving or + * rejecting the newly created promise. The first parameter is a function which resolves the + * promise, the second parameter is a function which rejects the promise. + * + * @returns {Promise} The newly created promise. + */ +function $QProvider() { + + this.$get = ['$rootScope', '$exceptionHandler', function($rootScope, $exceptionHandler) { + return qFactory(function(callback) { + $rootScope.$evalAsync(callback); + }, $exceptionHandler); + }]; +} + +function $$QProvider() { + this.$get = ['$browser', '$exceptionHandler', function($browser, $exceptionHandler) { + return qFactory(function(callback) { + $browser.defer(callback); + }, $exceptionHandler); + }]; +} + +/** + * Constructs a promise manager. + * + * @param {function(function)} nextTick Function for executing functions in the next turn. + * @param {function(...*)} exceptionHandler Function into which unexpected exceptions are passed for + * debugging purposes. + * @returns {object} Promise manager. + */ +function qFactory(nextTick, exceptionHandler) { + var $qMinErr = minErr('$q', TypeError); + + /** + * @ngdoc method + * @name ng.$q#defer + * @kind function + * + * @description + * Creates a `Deferred` object which represents a task which will finish in the future. + * + * @returns {Deferred} Returns a new instance of deferred. + */ + var defer = function() { + var d = new Deferred(); + //Necessary to support unbound execution :/ + d.resolve = simpleBind(d, d.resolve); + d.reject = simpleBind(d, d.reject); + d.notify = simpleBind(d, d.notify); + return d; + }; + + function Promise() { + this.$$state = { status: 0 }; + } + + extend(Promise.prototype, { + then: function(onFulfilled, onRejected, progressBack) { + if (isUndefined(onFulfilled) && isUndefined(onRejected) && isUndefined(progressBack)) { + return this; + } + var result = new Deferred(); + + this.$$state.pending = this.$$state.pending || []; + this.$$state.pending.push([result, onFulfilled, onRejected, progressBack]); + if (this.$$state.status > 0) scheduleProcessQueue(this.$$state); + + return result.promise; + }, + + "catch": function(callback) { + return this.then(null, callback); + }, + + "finally": function(callback, progressBack) { + return this.then(function(value) { + return handleCallback(value, true, callback); + }, function(error) { + return handleCallback(error, false, callback); + }, progressBack); + } + }); + + //Faster, more basic than angular.bind http://jsperf.com/angular-bind-vs-custom-vs-native + function simpleBind(context, fn) { + return function(value) { + fn.call(context, value); + }; + } + + function processQueue(state) { + var fn, deferred, pending; + + pending = state.pending; + state.processScheduled = false; + state.pending = undefined; + for (var i = 0, ii = pending.length; i < ii; ++i) { + deferred = pending[i][0]; + fn = pending[i][state.status]; + try { + if (isFunction(fn)) { + deferred.resolve(fn(state.value)); + } else if (state.status === 1) { + deferred.resolve(state.value); + } else { + deferred.reject(state.value); + } + } catch (e) { + deferred.reject(e); + exceptionHandler(e); + } + } + } + + function scheduleProcessQueue(state) { + if (state.processScheduled || !state.pending) return; + state.processScheduled = true; + nextTick(function() { processQueue(state); }); + } + + function Deferred() { + this.promise = new Promise(); + } + + extend(Deferred.prototype, { + resolve: function(val) { + if (this.promise.$$state.status) return; + if (val === this.promise) { + this.$$reject($qMinErr( + 'qcycle', + "Expected promise to be resolved with value other than itself '{0}'", + val)); + } else { + this.$$resolve(val); + } + + }, + + $$resolve: function(val) { + var then; + var that = this; + var done = false; + try { + if ((isObject(val) || isFunction(val))) then = val && val.then; + if (isFunction(then)) { + this.promise.$$state.status = -1; + then.call(val, resolvePromise, rejectPromise, simpleBind(this, this.notify)); + } else { + this.promise.$$state.value = val; + this.promise.$$state.status = 1; + scheduleProcessQueue(this.promise.$$state); + } + } catch (e) { + rejectPromise(e); + exceptionHandler(e); + } + + function resolvePromise(val) { + if (done) return; + done = true; + that.$$resolve(val); + } + function rejectPromise(val) { + if (done) return; + done = true; + that.$$reject(val); + } + }, + + reject: function(reason) { + if (this.promise.$$state.status) return; + this.$$reject(reason); + }, + + $$reject: function(reason) { + this.promise.$$state.value = reason; + this.promise.$$state.status = 2; + scheduleProcessQueue(this.promise.$$state); + }, + + notify: function(progress) { + var callbacks = this.promise.$$state.pending; + + if ((this.promise.$$state.status <= 0) && callbacks && callbacks.length) { + nextTick(function() { + var callback, result; + for (var i = 0, ii = callbacks.length; i < ii; i++) { + result = callbacks[i][0]; + callback = callbacks[i][3]; + try { + result.notify(isFunction(callback) ? callback(progress) : progress); + } catch (e) { + exceptionHandler(e); + } + } + }); + } + } + }); + + /** + * @ngdoc method + * @name $q#reject + * @kind function + * + * @description + * Creates a promise that is resolved as rejected with the specified `reason`. This api should be + * used to forward rejection in a chain of promises. If you are dealing with the last promise in + * a promise chain, you don't need to worry about it. + * + * When comparing deferreds/promises to the familiar behavior of try/catch/throw, think of + * `reject` as the `throw` keyword in JavaScript. This also means that if you "catch" an error via + * a promise error callback and you want to forward the error to the promise derived from the + * current promise, you have to "rethrow" the error by returning a rejection constructed via + * `reject`. + * + * ```js + * promiseB = promiseA.then(function(result) { + * // success: do something and resolve promiseB + * // with the old or a new result + * return result; + * }, function(reason) { + * // error: handle the error if possible and + * // resolve promiseB with newPromiseOrValue, + * // otherwise forward the rejection to promiseB + * if (canHandle(reason)) { + * // handle the error and recover + * return newPromiseOrValue; + * } + * return $q.reject(reason); + * }); + * ``` + * + * @param {*} reason Constant, message, exception or an object representing the rejection reason. + * @returns {Promise} Returns a promise that was already resolved as rejected with the `reason`. + */ + var reject = function(reason) { + var result = new Deferred(); + result.reject(reason); + return result.promise; + }; + + var makePromise = function makePromise(value, resolved) { + var result = new Deferred(); + if (resolved) { + result.resolve(value); + } else { + result.reject(value); + } + return result.promise; + }; + + var handleCallback = function handleCallback(value, isResolved, callback) { + var callbackOutput = null; + try { + if (isFunction(callback)) callbackOutput = callback(); + } catch (e) { + return makePromise(e, false); + } + if (isPromiseLike(callbackOutput)) { + return callbackOutput.then(function() { + return makePromise(value, isResolved); + }, function(error) { + return makePromise(error, false); + }); + } else { + return makePromise(value, isResolved); + } + }; + + /** + * @ngdoc method + * @name $q#when + * @kind function + * + * @description + * Wraps an object that might be a value or a (3rd party) then-able promise into a $q promise. + * This is useful when you are dealing with an object that might or might not be a promise, or if + * the promise comes from a source that can't be trusted. + * + * @param {*} value Value or a promise + * @param {Function=} successCallback + * @param {Function=} errorCallback + * @param {Function=} progressCallback + * @returns {Promise} Returns a promise of the passed value or promise + */ + + + var when = function(value, callback, errback, progressBack) { + var result = new Deferred(); + result.resolve(value); + return result.promise.then(callback, errback, progressBack); + }; + + /** + * @ngdoc method + * @name $q#resolve + * @kind function + * + * @description + * Alias of {@link ng.$q#when when} to maintain naming consistency with ES6. + * + * @param {*} value Value or a promise + * @param {Function=} successCallback + * @param {Function=} errorCallback + * @param {Function=} progressCallback + * @returns {Promise} Returns a promise of the passed value or promise + */ + var resolve = when; + + /** + * @ngdoc method + * @name $q#all + * @kind function + * + * @description + * Combines multiple promises into a single promise that is resolved when all of the input + * promises are resolved. + * + * @param {Array.|Object.} promises An array or hash of promises. + * @returns {Promise} Returns a single promise that will be resolved with an array/hash of values, + * each value corresponding to the promise at the same index/key in the `promises` array/hash. + * If any of the promises is resolved with a rejection, this resulting promise will be rejected + * with the same rejection value. + */ + + function all(promises) { + var deferred = new Deferred(), + counter = 0, + results = isArray(promises) ? [] : {}; + + forEach(promises, function(promise, key) { + counter++; + when(promise).then(function(value) { + if (results.hasOwnProperty(key)) return; + results[key] = value; + if (!(--counter)) deferred.resolve(results); + }, function(reason) { + if (results.hasOwnProperty(key)) return; + deferred.reject(reason); + }); + }); + + if (counter === 0) { + deferred.resolve(results); + } + + return deferred.promise; + } + + var $Q = function Q(resolver) { + if (!isFunction(resolver)) { + throw $qMinErr('norslvr', "Expected resolverFn, got '{0}'", resolver); + } + + var deferred = new Deferred(); + + function resolveFn(value) { + deferred.resolve(value); + } + + function rejectFn(reason) { + deferred.reject(reason); + } + + resolver(resolveFn, rejectFn); + + return deferred.promise; + }; + + // Let's make the instanceof operator work for promises, so that + // `new $q(fn) instanceof $q` would evaluate to true. + $Q.prototype = Promise.prototype; + + $Q.defer = defer; + $Q.reject = reject; + $Q.when = when; + $Q.resolve = resolve; + $Q.all = all; + + return $Q; +} + +function $$RAFProvider() { //rAF + this.$get = ['$window', '$timeout', function($window, $timeout) { + var requestAnimationFrame = $window.requestAnimationFrame || + $window.webkitRequestAnimationFrame; + + var cancelAnimationFrame = $window.cancelAnimationFrame || + $window.webkitCancelAnimationFrame || + $window.webkitCancelRequestAnimationFrame; + + var rafSupported = !!requestAnimationFrame; + var raf = rafSupported + ? function(fn) { + var id = requestAnimationFrame(fn); + return function() { + cancelAnimationFrame(id); + }; + } + : function(fn) { + var timer = $timeout(fn, 16.66, false); // 1000 / 60 = 16.666 + return function() { + $timeout.cancel(timer); + }; + }; + + raf.supported = rafSupported; + + return raf; + }]; +} + +/** + * DESIGN NOTES + * + * The design decisions behind the scope are heavily favored for speed and memory consumption. + * + * The typical use of scope is to watch the expressions, which most of the time return the same + * value as last time so we optimize the operation. + * + * Closures construction is expensive in terms of speed as well as memory: + * - No closures, instead use prototypical inheritance for API + * - Internal state needs to be stored on scope directly, which means that private state is + * exposed as $$____ properties + * + * Loop operations are optimized by using while(count--) { ... } + * - This means that in order to keep the same order of execution as addition we have to add + * items to the array at the beginning (unshift) instead of at the end (push) + * + * Child scopes are created and removed often + * - Using an array would be slow since inserts in the middle are expensive; so we use linked lists + * + * There are fewer watches than observers. This is why you don't want the observer to be implemented + * in the same way as watch. Watch requires return of the initialization function which is expensive + * to construct. + */ + + +/** + * @ngdoc provider + * @name $rootScopeProvider + * @description + * + * Provider for the $rootScope service. + */ + +/** + * @ngdoc method + * @name $rootScopeProvider#digestTtl + * @description + * + * Sets the number of `$digest` iterations the scope should attempt to execute before giving up and + * assuming that the model is unstable. + * + * The current default is 10 iterations. + * + * In complex applications it's possible that the dependencies between `$watch`s will result in + * several digest iterations. However if an application needs more than the default 10 digest + * iterations for its model to stabilize then you should investigate what is causing the model to + * continuously change during the digest. + * + * Increasing the TTL could have performance implications, so you should not change it without + * proper justification. + * + * @param {number} limit The number of digest iterations. + */ + + +/** + * @ngdoc service + * @name $rootScope + * @description + * + * Every application has a single root {@link ng.$rootScope.Scope scope}. + * All other scopes are descendant scopes of the root scope. Scopes provide separation + * between the model and the view, via a mechanism for watching the model for changes. + * They also provide event emission/broadcast and subscription facility. See the + * {@link guide/scope developer guide on scopes}. + */ +function $RootScopeProvider() { + var TTL = 10; + var $rootScopeMinErr = minErr('$rootScope'); + var lastDirtyWatch = null; + var applyAsyncId = null; + + this.digestTtl = function(value) { + if (arguments.length) { + TTL = value; + } + return TTL; + }; + + function createChildScopeClass(parent) { + function ChildScope() { + this.$$watchers = this.$$nextSibling = + this.$$childHead = this.$$childTail = null; + this.$$listeners = {}; + this.$$listenerCount = {}; + this.$$watchersCount = 0; + this.$id = nextUid(); + this.$$ChildScope = null; + } + ChildScope.prototype = parent; + return ChildScope; + } + + this.$get = ['$exceptionHandler', '$parse', '$browser', + function($exceptionHandler, $parse, $browser) { + + function destroyChildScope($event) { + $event.currentScope.$$destroyed = true; + } + + function cleanUpScope($scope) { + + if (msie === 9) { + // There is a memory leak in IE9 if all child scopes are not disconnected + // completely when a scope is destroyed. So this code will recurse up through + // all this scopes children + // + // See issue https://github.com/angular/angular.js/issues/10706 + $scope.$$childHead && cleanUpScope($scope.$$childHead); + $scope.$$nextSibling && cleanUpScope($scope.$$nextSibling); + } + + // The code below works around IE9 and V8's memory leaks + // + // See: + // - https://code.google.com/p/v8/issues/detail?id=2073#c26 + // - https://github.com/angular/angular.js/issues/6794#issuecomment-38648909 + // - https://github.com/angular/angular.js/issues/1313#issuecomment-10378451 + + $scope.$parent = $scope.$$nextSibling = $scope.$$prevSibling = $scope.$$childHead = + $scope.$$childTail = $scope.$root = $scope.$$watchers = null; + } + + /** + * @ngdoc type + * @name $rootScope.Scope + * + * @description + * A root scope can be retrieved using the {@link ng.$rootScope $rootScope} key from the + * {@link auto.$injector $injector}. Child scopes are created using the + * {@link ng.$rootScope.Scope#$new $new()} method. (Most scopes are created automatically when + * compiled HTML template is executed.) See also the {@link guide/scope Scopes guide} for + * an in-depth introduction and usage examples. + * + * + * # Inheritance + * A scope can inherit from a parent scope, as in this example: + * ```js + var parent = $rootScope; + var child = parent.$new(); + + parent.salutation = "Hello"; + expect(child.salutation).toEqual('Hello'); + + child.salutation = "Welcome"; + expect(child.salutation).toEqual('Welcome'); + expect(parent.salutation).toEqual('Hello'); + * ``` + * + * When interacting with `Scope` in tests, additional helper methods are available on the + * instances of `Scope` type. See {@link ngMock.$rootScope.Scope ngMock Scope} for additional + * details. + * + * + * @param {Object.=} providers Map of service factory which need to be + * provided for the current scope. Defaults to {@link ng}. + * @param {Object.=} instanceCache Provides pre-instantiated services which should + * append/override services provided by `providers`. This is handy + * when unit-testing and having the need to override a default + * service. + * @returns {Object} Newly created scope. + * + */ + function Scope() { + this.$id = nextUid(); + this.$$phase = this.$parent = this.$$watchers = + this.$$nextSibling = this.$$prevSibling = + this.$$childHead = this.$$childTail = null; + this.$root = this; + this.$$destroyed = false; + this.$$listeners = {}; + this.$$listenerCount = {}; + this.$$watchersCount = 0; + this.$$isolateBindings = null; + } + + /** + * @ngdoc property + * @name $rootScope.Scope#$id + * + * @description + * Unique scope ID (monotonically increasing) useful for debugging. + */ + + /** + * @ngdoc property + * @name $rootScope.Scope#$parent + * + * @description + * Reference to the parent scope. + */ + + /** + * @ngdoc property + * @name $rootScope.Scope#$root + * + * @description + * Reference to the root scope. + */ + + Scope.prototype = { + constructor: Scope, + /** + * @ngdoc method + * @name $rootScope.Scope#$new + * @kind function + * + * @description + * Creates a new child {@link ng.$rootScope.Scope scope}. + * + * The parent scope will propagate the {@link ng.$rootScope.Scope#$digest $digest()} event. + * The scope can be removed from the scope hierarchy using {@link ng.$rootScope.Scope#$destroy $destroy()}. + * + * {@link ng.$rootScope.Scope#$destroy $destroy()} must be called on a scope when it is + * desired for the scope and its child scopes to be permanently detached from the parent and + * thus stop participating in model change detection and listener notification by invoking. + * + * @param {boolean} isolate If true, then the scope does not prototypically inherit from the + * parent scope. The scope is isolated, as it can not see parent scope properties. + * When creating widgets, it is useful for the widget to not accidentally read parent + * state. + * + * @param {Scope} [parent=this] The {@link ng.$rootScope.Scope `Scope`} that will be the `$parent` + * of the newly created scope. Defaults to `this` scope if not provided. + * This is used when creating a transclude scope to correctly place it + * in the scope hierarchy while maintaining the correct prototypical + * inheritance. + * + * @returns {Object} The newly created child scope. + * + */ + $new: function(isolate, parent) { + var child; + + parent = parent || this; + + if (isolate) { + child = new Scope(); + child.$root = this.$root; + } else { + // Only create a child scope class if somebody asks for one, + // but cache it to allow the VM to optimize lookups. + if (!this.$$ChildScope) { + this.$$ChildScope = createChildScopeClass(this); + } + child = new this.$$ChildScope(); + } + child.$parent = parent; + child.$$prevSibling = parent.$$childTail; + if (parent.$$childHead) { + parent.$$childTail.$$nextSibling = child; + parent.$$childTail = child; + } else { + parent.$$childHead = parent.$$childTail = child; + } + + // When the new scope is not isolated or we inherit from `this`, and + // the parent scope is destroyed, the property `$$destroyed` is inherited + // prototypically. In all other cases, this property needs to be set + // when the parent scope is destroyed. + // The listener needs to be added after the parent is set + if (isolate || parent != this) child.$on('$destroy', destroyChildScope); + + return child; + }, + + /** + * @ngdoc method + * @name $rootScope.Scope#$watch + * @kind function + * + * @description + * Registers a `listener` callback to be executed whenever the `watchExpression` changes. + * + * - The `watchExpression` is called on every call to {@link ng.$rootScope.Scope#$digest + * $digest()} and should return the value that will be watched. (`watchExpression` should not change + * its value when executed multiple times with the same input because it may be executed multiple + * times by {@link ng.$rootScope.Scope#$digest $digest()}. That is, `watchExpression` should be + * [idempotent](http://en.wikipedia.org/wiki/Idempotence). + * - The `listener` is called only when the value from the current `watchExpression` and the + * previous call to `watchExpression` are not equal (with the exception of the initial run, + * see below). Inequality is determined according to reference inequality, + * [strict comparison](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Comparison_Operators) + * via the `!==` Javascript operator, unless `objectEquality == true` + * (see next point) + * - When `objectEquality == true`, inequality of the `watchExpression` is determined + * according to the {@link angular.equals} function. To save the value of the object for + * later comparison, the {@link angular.copy} function is used. This therefore means that + * watching complex objects will have adverse memory and performance implications. + * - The watch `listener` may change the model, which may trigger other `listener`s to fire. + * This is achieved by rerunning the watchers until no changes are detected. The rerun + * iteration limit is 10 to prevent an infinite loop deadlock. + * + * + * If you want to be notified whenever {@link ng.$rootScope.Scope#$digest $digest} is called, + * you can register a `watchExpression` function with no `listener`. (Be prepared for + * multiple calls to your `watchExpression` because it will execute multiple times in a + * single {@link ng.$rootScope.Scope#$digest $digest} cycle if a change is detected.) + * + * After a watcher is registered with the scope, the `listener` fn is called asynchronously + * (via {@link ng.$rootScope.Scope#$evalAsync $evalAsync}) to initialize the + * watcher. In rare cases, this is undesirable because the listener is called when the result + * of `watchExpression` didn't change. To detect this scenario within the `listener` fn, you + * can compare the `newVal` and `oldVal`. If these two values are identical (`===`) then the + * listener was called due to initialization. + * + * + * + * # Example + * ```js + // let's assume that scope was dependency injected as the $rootScope + var scope = $rootScope; + scope.name = 'misko'; + scope.counter = 0; + + expect(scope.counter).toEqual(0); + scope.$watch('name', function(newValue, oldValue) { + scope.counter = scope.counter + 1; + }); + expect(scope.counter).toEqual(0); + + scope.$digest(); + // the listener is always called during the first $digest loop after it was registered + expect(scope.counter).toEqual(1); + + scope.$digest(); + // but now it will not be called unless the value changes + expect(scope.counter).toEqual(1); + + scope.name = 'adam'; + scope.$digest(); + expect(scope.counter).toEqual(2); + + + + // Using a function as a watchExpression + var food; + scope.foodCounter = 0; + expect(scope.foodCounter).toEqual(0); + scope.$watch( + // This function returns the value being watched. It is called for each turn of the $digest loop + function() { return food; }, + // This is the change listener, called when the value returned from the above function changes + function(newValue, oldValue) { + if ( newValue !== oldValue ) { + // Only increment the counter if the value changed + scope.foodCounter = scope.foodCounter + 1; + } + } + ); + // No digest has been run so the counter will be zero + expect(scope.foodCounter).toEqual(0); + + // Run the digest but since food has not changed count will still be zero + scope.$digest(); + expect(scope.foodCounter).toEqual(0); + + // Update food and run digest. Now the counter will increment + food = 'cheeseburger'; + scope.$digest(); + expect(scope.foodCounter).toEqual(1); + + * ``` + * + * + * + * @param {(function()|string)} watchExpression Expression that is evaluated on each + * {@link ng.$rootScope.Scope#$digest $digest} cycle. A change in the return value triggers + * a call to the `listener`. + * + * - `string`: Evaluated as {@link guide/expression expression} + * - `function(scope)`: called with current `scope` as a parameter. + * @param {function(newVal, oldVal, scope)} listener Callback called whenever the value + * of `watchExpression` changes. + * + * - `newVal` contains the current value of the `watchExpression` + * - `oldVal` contains the previous value of the `watchExpression` + * - `scope` refers to the current scope + * @param {boolean=} [objectEquality=false] Compare for object equality using {@link angular.equals} instead of + * comparing for reference equality. + * @returns {function()} Returns a deregistration function for this listener. + */ + $watch: function(watchExp, listener, objectEquality, prettyPrintExpression) { + var get = $parse(watchExp); + + if (get.$$watchDelegate) { + return get.$$watchDelegate(this, listener, objectEquality, get, watchExp); + } + var scope = this, + array = scope.$$watchers, + watcher = { + fn: listener, + last: initWatchVal, + get: get, + exp: prettyPrintExpression || watchExp, + eq: !!objectEquality + }; + + lastDirtyWatch = null; + + if (!isFunction(listener)) { + watcher.fn = noop; + } + + if (!array) { + array = scope.$$watchers = []; + } + // we use unshift since we use a while loop in $digest for speed. + // the while loop reads in reverse order. + array.unshift(watcher); + incrementWatchersCount(this, 1); + + return function deregisterWatch() { + if (arrayRemove(array, watcher) >= 0) { + incrementWatchersCount(scope, -1); + } + lastDirtyWatch = null; + }; + }, + + /** + * @ngdoc method + * @name $rootScope.Scope#$watchGroup + * @kind function + * + * @description + * A variant of {@link ng.$rootScope.Scope#$watch $watch()} where it watches an array of `watchExpressions`. + * If any one expression in the collection changes the `listener` is executed. + * + * - The items in the `watchExpressions` array are observed via standard $watch operation and are examined on every + * call to $digest() to see if any items changes. + * - The `listener` is called whenever any expression in the `watchExpressions` array changes. + * + * @param {Array.} watchExpressions Array of expressions that will be individually + * watched using {@link ng.$rootScope.Scope#$watch $watch()} + * + * @param {function(newValues, oldValues, scope)} listener Callback called whenever the return value of any + * expression in `watchExpressions` changes + * The `newValues` array contains the current values of the `watchExpressions`, with the indexes matching + * those of `watchExpression` + * and the `oldValues` array contains the previous values of the `watchExpressions`, with the indexes matching + * those of `watchExpression` + * The `scope` refers to the current scope. + * @returns {function()} Returns a de-registration function for all listeners. + */ + $watchGroup: function(watchExpressions, listener) { + var oldValues = new Array(watchExpressions.length); + var newValues = new Array(watchExpressions.length); + var deregisterFns = []; + var self = this; + var changeReactionScheduled = false; + var firstRun = true; + + if (!watchExpressions.length) { + // No expressions means we call the listener ASAP + var shouldCall = true; + self.$evalAsync(function() { + if (shouldCall) listener(newValues, newValues, self); + }); + return function deregisterWatchGroup() { + shouldCall = false; + }; + } + + if (watchExpressions.length === 1) { + // Special case size of one + return this.$watch(watchExpressions[0], function watchGroupAction(value, oldValue, scope) { + newValues[0] = value; + oldValues[0] = oldValue; + listener(newValues, (value === oldValue) ? newValues : oldValues, scope); + }); + } + + forEach(watchExpressions, function(expr, i) { + var unwatchFn = self.$watch(expr, function watchGroupSubAction(value, oldValue) { + newValues[i] = value; + oldValues[i] = oldValue; + if (!changeReactionScheduled) { + changeReactionScheduled = true; + self.$evalAsync(watchGroupAction); + } + }); + deregisterFns.push(unwatchFn); + }); + + function watchGroupAction() { + changeReactionScheduled = false; + + if (firstRun) { + firstRun = false; + listener(newValues, newValues, self); + } else { + listener(newValues, oldValues, self); + } + } + + return function deregisterWatchGroup() { + while (deregisterFns.length) { + deregisterFns.shift()(); + } + }; + }, + + + /** + * @ngdoc method + * @name $rootScope.Scope#$watchCollection + * @kind function + * + * @description + * Shallow watches the properties of an object and fires whenever any of the properties change + * (for arrays, this implies watching the array items; for object maps, this implies watching + * the properties). If a change is detected, the `listener` callback is fired. + * + * - The `obj` collection is observed via standard $watch operation and is examined on every + * call to $digest() to see if any items have been added, removed, or moved. + * - The `listener` is called whenever anything within the `obj` has changed. Examples include + * adding, removing, and moving items belonging to an object or array. + * + * + * # Example + * ```js + $scope.names = ['igor', 'matias', 'misko', 'james']; + $scope.dataCount = 4; + + $scope.$watchCollection('names', function(newNames, oldNames) { + $scope.dataCount = newNames.length; + }); + + expect($scope.dataCount).toEqual(4); + $scope.$digest(); + + //still at 4 ... no changes + expect($scope.dataCount).toEqual(4); + + $scope.names.pop(); + $scope.$digest(); + + //now there's been a change + expect($scope.dataCount).toEqual(3); + * ``` + * + * + * @param {string|function(scope)} obj Evaluated as {@link guide/expression expression}. The + * expression value should evaluate to an object or an array which is observed on each + * {@link ng.$rootScope.Scope#$digest $digest} cycle. Any shallow change within the + * collection will trigger a call to the `listener`. + * + * @param {function(newCollection, oldCollection, scope)} listener a callback function called + * when a change is detected. + * - The `newCollection` object is the newly modified data obtained from the `obj` expression + * - The `oldCollection` object is a copy of the former collection data. + * Due to performance considerations, the`oldCollection` value is computed only if the + * `listener` function declares two or more arguments. + * - The `scope` argument refers to the current scope. + * + * @returns {function()} Returns a de-registration function for this listener. When the + * de-registration function is executed, the internal watch operation is terminated. + */ + $watchCollection: function(obj, listener) { + $watchCollectionInterceptor.$stateful = true; + + var self = this; + // the current value, updated on each dirty-check run + var newValue; + // a shallow copy of the newValue from the last dirty-check run, + // updated to match newValue during dirty-check run + var oldValue; + // a shallow copy of the newValue from when the last change happened + var veryOldValue; + // only track veryOldValue if the listener is asking for it + var trackVeryOldValue = (listener.length > 1); + var changeDetected = 0; + var changeDetector = $parse(obj, $watchCollectionInterceptor); + var internalArray = []; + var internalObject = {}; + var initRun = true; + var oldLength = 0; + + function $watchCollectionInterceptor(_value) { + newValue = _value; + var newLength, key, bothNaN, newItem, oldItem; + + // If the new value is undefined, then return undefined as the watch may be a one-time watch + if (isUndefined(newValue)) return; + + if (!isObject(newValue)) { // if primitive + if (oldValue !== newValue) { + oldValue = newValue; + changeDetected++; + } + } else if (isArrayLike(newValue)) { + if (oldValue !== internalArray) { + // we are transitioning from something which was not an array into array. + oldValue = internalArray; + oldLength = oldValue.length = 0; + changeDetected++; + } + + newLength = newValue.length; + + if (oldLength !== newLength) { + // if lengths do not match we need to trigger change notification + changeDetected++; + oldValue.length = oldLength = newLength; + } + // copy the items to oldValue and look for changes. + for (var i = 0; i < newLength; i++) { + oldItem = oldValue[i]; + newItem = newValue[i]; + + bothNaN = (oldItem !== oldItem) && (newItem !== newItem); + if (!bothNaN && (oldItem !== newItem)) { + changeDetected++; + oldValue[i] = newItem; + } + } + } else { + if (oldValue !== internalObject) { + // we are transitioning from something which was not an object into object. + oldValue = internalObject = {}; + oldLength = 0; + changeDetected++; + } + // copy the items to oldValue and look for changes. + newLength = 0; + for (key in newValue) { + if (hasOwnProperty.call(newValue, key)) { + newLength++; + newItem = newValue[key]; + oldItem = oldValue[key]; + + if (key in oldValue) { + bothNaN = (oldItem !== oldItem) && (newItem !== newItem); + if (!bothNaN && (oldItem !== newItem)) { + changeDetected++; + oldValue[key] = newItem; + } + } else { + oldLength++; + oldValue[key] = newItem; + changeDetected++; + } + } + } + if (oldLength > newLength) { + // we used to have more keys, need to find them and destroy them. + changeDetected++; + for (key in oldValue) { + if (!hasOwnProperty.call(newValue, key)) { + oldLength--; + delete oldValue[key]; + } + } + } + } + return changeDetected; + } + + function $watchCollectionAction() { + if (initRun) { + initRun = false; + listener(newValue, newValue, self); + } else { + listener(newValue, veryOldValue, self); + } + + // make a copy for the next time a collection is changed + if (trackVeryOldValue) { + if (!isObject(newValue)) { + //primitive + veryOldValue = newValue; + } else if (isArrayLike(newValue)) { + veryOldValue = new Array(newValue.length); + for (var i = 0; i < newValue.length; i++) { + veryOldValue[i] = newValue[i]; + } + } else { // if object + veryOldValue = {}; + for (var key in newValue) { + if (hasOwnProperty.call(newValue, key)) { + veryOldValue[key] = newValue[key]; + } + } + } + } + } + + return this.$watch(changeDetector, $watchCollectionAction); + }, + + /** + * @ngdoc method + * @name $rootScope.Scope#$digest + * @kind function + * + * @description + * Processes all of the {@link ng.$rootScope.Scope#$watch watchers} of the current scope and + * its children. Because a {@link ng.$rootScope.Scope#$watch watcher}'s listener can change + * the model, the `$digest()` keeps calling the {@link ng.$rootScope.Scope#$watch watchers} + * until no more listeners are firing. This means that it is possible to get into an infinite + * loop. This function will throw `'Maximum iteration limit exceeded.'` if the number of + * iterations exceeds 10. + * + * Usually, you don't call `$digest()` directly in + * {@link ng.directive:ngController controllers} or in + * {@link ng.$compileProvider#directive directives}. + * Instead, you should call {@link ng.$rootScope.Scope#$apply $apply()} (typically from within + * a {@link ng.$compileProvider#directive directive}), which will force a `$digest()`. + * + * If you want to be notified whenever `$digest()` is called, + * you can register a `watchExpression` function with + * {@link ng.$rootScope.Scope#$watch $watch()} with no `listener`. + * + * In unit tests, you may need to call `$digest()` to simulate the scope life cycle. + * + * # Example + * ```js + var scope = ...; + scope.name = 'misko'; + scope.counter = 0; + + expect(scope.counter).toEqual(0); + scope.$watch('name', function(newValue, oldValue) { + scope.counter = scope.counter + 1; + }); + expect(scope.counter).toEqual(0); + + scope.$digest(); + // the listener is always called during the first $digest loop after it was registered + expect(scope.counter).toEqual(1); + + scope.$digest(); + // but now it will not be called unless the value changes + expect(scope.counter).toEqual(1); + + scope.name = 'adam'; + scope.$digest(); + expect(scope.counter).toEqual(2); + * ``` + * + */ + $digest: function() { + var watch, value, last, fn, get, + watchers, + length, + dirty, ttl = TTL, + next, current, target = this, + watchLog = [], + logIdx, asyncTask; + + beginPhase('$digest'); + // Check for changes to browser url that happened in sync before the call to $digest + $browser.$$checkUrlChange(); + + if (this === $rootScope && applyAsyncId !== null) { + // If this is the root scope, and $applyAsync has scheduled a deferred $apply(), then + // cancel the scheduled $apply and flush the queue of expressions to be evaluated. + $browser.defer.cancel(applyAsyncId); + flushApplyAsync(); + } + + lastDirtyWatch = null; + + do { // "while dirty" loop + dirty = false; + current = target; + + while (asyncQueue.length) { + try { + asyncTask = asyncQueue.shift(); + asyncTask.scope.$eval(asyncTask.expression, asyncTask.locals); + } catch (e) { + $exceptionHandler(e); + } + lastDirtyWatch = null; + } + + traverseScopesLoop: + do { // "traverse the scopes" loop + if ((watchers = current.$$watchers)) { + // process our watches + length = watchers.length; + while (length--) { + try { + watch = watchers[length]; + // Most common watches are on primitives, in which case we can short + // circuit it with === operator, only when === fails do we use .equals + if (watch) { + get = watch.get; + if ((value = get(current)) !== (last = watch.last) && + !(watch.eq + ? equals(value, last) + : (typeof value === 'number' && typeof last === 'number' + && isNaN(value) && isNaN(last)))) { + dirty = true; + lastDirtyWatch = watch; + watch.last = watch.eq ? copy(value, null) : value; + fn = watch.fn; + fn(value, ((last === initWatchVal) ? value : last), current); + if (ttl < 5) { + logIdx = 4 - ttl; + if (!watchLog[logIdx]) watchLog[logIdx] = []; + watchLog[logIdx].push({ + msg: isFunction(watch.exp) ? 'fn: ' + (watch.exp.name || watch.exp.toString()) : watch.exp, + newVal: value, + oldVal: last + }); + } + } else if (watch === lastDirtyWatch) { + // If the most recently dirty watcher is now clean, short circuit since the remaining watchers + // have already been tested. + dirty = false; + break traverseScopesLoop; + } + } + } catch (e) { + $exceptionHandler(e); + } + } + } + + // Insanity Warning: scope depth-first traversal + // yes, this code is a bit crazy, but it works and we have tests to prove it! + // this piece should be kept in sync with the traversal in $broadcast + if (!(next = ((current.$$watchersCount && current.$$childHead) || + (current !== target && current.$$nextSibling)))) { + while (current !== target && !(next = current.$$nextSibling)) { + current = current.$parent; + } + } + } while ((current = next)); + + // `break traverseScopesLoop;` takes us to here + + if ((dirty || asyncQueue.length) && !(ttl--)) { + clearPhase(); + throw $rootScopeMinErr('infdig', + '{0} $digest() iterations reached. Aborting!\n' + + 'Watchers fired in the last 5 iterations: {1}', + TTL, watchLog); + } + + } while (dirty || asyncQueue.length); + + clearPhase(); + + while (postDigestQueue.length) { + try { + postDigestQueue.shift()(); + } catch (e) { + $exceptionHandler(e); + } + } + }, + + + /** + * @ngdoc event + * @name $rootScope.Scope#$destroy + * @eventType broadcast on scope being destroyed + * + * @description + * Broadcasted when a scope and its children are being destroyed. + * + * Note that, in AngularJS, there is also a `$destroy` jQuery event, which can be used to + * clean up DOM bindings before an element is removed from the DOM. + */ + + /** + * @ngdoc method + * @name $rootScope.Scope#$destroy + * @kind function + * + * @description + * Removes the current scope (and all of its children) from the parent scope. Removal implies + * that calls to {@link ng.$rootScope.Scope#$digest $digest()} will no longer + * propagate to the current scope and its children. Removal also implies that the current + * scope is eligible for garbage collection. + * + * The `$destroy()` is usually used by directives such as + * {@link ng.directive:ngRepeat ngRepeat} for managing the + * unrolling of the loop. + * + * Just before a scope is destroyed, a `$destroy` event is broadcasted on this scope. + * Application code can register a `$destroy` event handler that will give it a chance to + * perform any necessary cleanup. + * + * Note that, in AngularJS, there is also a `$destroy` jQuery event, which can be used to + * clean up DOM bindings before an element is removed from the DOM. + */ + $destroy: function() { + // We can't destroy a scope that has been already destroyed. + if (this.$$destroyed) return; + var parent = this.$parent; + + this.$broadcast('$destroy'); + this.$$destroyed = true; + + if (this === $rootScope) { + //Remove handlers attached to window when $rootScope is removed + $browser.$$applicationDestroyed(); + } + + incrementWatchersCount(this, -this.$$watchersCount); + for (var eventName in this.$$listenerCount) { + decrementListenerCount(this, this.$$listenerCount[eventName], eventName); + } + + // sever all the references to parent scopes (after this cleanup, the current scope should + // not be retained by any of our references and should be eligible for garbage collection) + if (parent && parent.$$childHead == this) parent.$$childHead = this.$$nextSibling; + if (parent && parent.$$childTail == this) parent.$$childTail = this.$$prevSibling; + if (this.$$prevSibling) this.$$prevSibling.$$nextSibling = this.$$nextSibling; + if (this.$$nextSibling) this.$$nextSibling.$$prevSibling = this.$$prevSibling; + + // Disable listeners, watchers and apply/digest methods + this.$destroy = this.$digest = this.$apply = this.$evalAsync = this.$applyAsync = noop; + this.$on = this.$watch = this.$watchGroup = function() { return noop; }; + this.$$listeners = {}; + + // Disconnect the next sibling to prevent `cleanUpScope` destroying those too + this.$$nextSibling = null; + cleanUpScope(this); + }, + + /** + * @ngdoc method + * @name $rootScope.Scope#$eval + * @kind function + * + * @description + * Executes the `expression` on the current scope and returns the result. Any exceptions in + * the expression are propagated (uncaught). This is useful when evaluating Angular + * expressions. + * + * # Example + * ```js + var scope = ng.$rootScope.Scope(); + scope.a = 1; + scope.b = 2; + + expect(scope.$eval('a+b')).toEqual(3); + expect(scope.$eval(function(scope){ return scope.a + scope.b; })).toEqual(3); + * ``` + * + * @param {(string|function())=} expression An angular expression to be executed. + * + * - `string`: execute using the rules as defined in {@link guide/expression expression}. + * - `function(scope)`: execute the function with the current `scope` parameter. + * + * @param {(object)=} locals Local variables object, useful for overriding values in scope. + * @returns {*} The result of evaluating the expression. + */ + $eval: function(expr, locals) { + return $parse(expr)(this, locals); + }, + + /** + * @ngdoc method + * @name $rootScope.Scope#$evalAsync + * @kind function + * + * @description + * Executes the expression on the current scope at a later point in time. + * + * The `$evalAsync` makes no guarantees as to when the `expression` will be executed, only + * that: + * + * - it will execute after the function that scheduled the evaluation (preferably before DOM + * rendering). + * - at least one {@link ng.$rootScope.Scope#$digest $digest cycle} will be performed after + * `expression` execution. + * + * Any exceptions from the execution of the expression are forwarded to the + * {@link ng.$exceptionHandler $exceptionHandler} service. + * + * __Note:__ if this function is called outside of a `$digest` cycle, a new `$digest` cycle + * will be scheduled. However, it is encouraged to always call code that changes the model + * from within an `$apply` call. That includes code evaluated via `$evalAsync`. + * + * @param {(string|function())=} expression An angular expression to be executed. + * + * - `string`: execute using the rules as defined in {@link guide/expression expression}. + * - `function(scope)`: execute the function with the current `scope` parameter. + * + * @param {(object)=} locals Local variables object, useful for overriding values in scope. + */ + $evalAsync: function(expr, locals) { + // if we are outside of an $digest loop and this is the first time we are scheduling async + // task also schedule async auto-flush + if (!$rootScope.$$phase && !asyncQueue.length) { + $browser.defer(function() { + if (asyncQueue.length) { + $rootScope.$digest(); + } + }); + } + + asyncQueue.push({scope: this, expression: $parse(expr), locals: locals}); + }, + + $$postDigest: function(fn) { + postDigestQueue.push(fn); + }, + + /** + * @ngdoc method + * @name $rootScope.Scope#$apply + * @kind function + * + * @description + * `$apply()` is used to execute an expression in angular from outside of the angular + * framework. (For example from browser DOM events, setTimeout, XHR or third party libraries). + * Because we are calling into the angular framework we need to perform proper scope life + * cycle of {@link ng.$exceptionHandler exception handling}, + * {@link ng.$rootScope.Scope#$digest executing watches}. + * + * ## Life cycle + * + * # Pseudo-Code of `$apply()` + * ```js + function $apply(expr) { + try { + return $eval(expr); + } catch (e) { + $exceptionHandler(e); + } finally { + $root.$digest(); + } + } + * ``` + * + * + * Scope's `$apply()` method transitions through the following stages: + * + * 1. The {@link guide/expression expression} is executed using the + * {@link ng.$rootScope.Scope#$eval $eval()} method. + * 2. Any exceptions from the execution of the expression are forwarded to the + * {@link ng.$exceptionHandler $exceptionHandler} service. + * 3. The {@link ng.$rootScope.Scope#$watch watch} listeners are fired immediately after the + * expression was executed using the {@link ng.$rootScope.Scope#$digest $digest()} method. + * + * + * @param {(string|function())=} exp An angular expression to be executed. + * + * - `string`: execute using the rules as defined in {@link guide/expression expression}. + * - `function(scope)`: execute the function with current `scope` parameter. + * + * @returns {*} The result of evaluating the expression. + */ + $apply: function(expr) { + try { + beginPhase('$apply'); + try { + return this.$eval(expr); + } finally { + clearPhase(); + } + } catch (e) { + $exceptionHandler(e); + } finally { + try { + $rootScope.$digest(); + } catch (e) { + $exceptionHandler(e); + throw e; + } + } + }, + + /** + * @ngdoc method + * @name $rootScope.Scope#$applyAsync + * @kind function + * + * @description + * Schedule the invocation of $apply to occur at a later time. The actual time difference + * varies across browsers, but is typically around ~10 milliseconds. + * + * This can be used to queue up multiple expressions which need to be evaluated in the same + * digest. + * + * @param {(string|function())=} exp An angular expression to be executed. + * + * - `string`: execute using the rules as defined in {@link guide/expression expression}. + * - `function(scope)`: execute the function with current `scope` parameter. + */ + $applyAsync: function(expr) { + var scope = this; + expr && applyAsyncQueue.push($applyAsyncExpression); + expr = $parse(expr); + scheduleApplyAsync(); + + function $applyAsyncExpression() { + scope.$eval(expr); + } + }, + + /** + * @ngdoc method + * @name $rootScope.Scope#$on + * @kind function + * + * @description + * Listens on events of a given type. See {@link ng.$rootScope.Scope#$emit $emit} for + * discussion of event life cycle. + * + * The event listener function format is: `function(event, args...)`. The `event` object + * passed into the listener has the following attributes: + * + * - `targetScope` - `{Scope}`: the scope on which the event was `$emit`-ed or + * `$broadcast`-ed. + * - `currentScope` - `{Scope}`: the scope that is currently handling the event. Once the + * event propagates through the scope hierarchy, this property is set to null. + * - `name` - `{string}`: name of the event. + * - `stopPropagation` - `{function=}`: calling `stopPropagation` function will cancel + * further event propagation (available only for events that were `$emit`-ed). + * - `preventDefault` - `{function}`: calling `preventDefault` sets `defaultPrevented` flag + * to true. + * - `defaultPrevented` - `{boolean}`: true if `preventDefault` was called. + * + * @param {string} name Event name to listen on. + * @param {function(event, ...args)} listener Function to call when the event is emitted. + * @returns {function()} Returns a deregistration function for this listener. + */ + $on: function(name, listener) { + var namedListeners = this.$$listeners[name]; + if (!namedListeners) { + this.$$listeners[name] = namedListeners = []; + } + namedListeners.push(listener); + + var current = this; + do { + if (!current.$$listenerCount[name]) { + current.$$listenerCount[name] = 0; + } + current.$$listenerCount[name]++; + } while ((current = current.$parent)); + + var self = this; + return function() { + var indexOfListener = namedListeners.indexOf(listener); + if (indexOfListener !== -1) { + namedListeners[indexOfListener] = null; + decrementListenerCount(self, 1, name); + } + }; + }, + + + /** + * @ngdoc method + * @name $rootScope.Scope#$emit + * @kind function + * + * @description + * Dispatches an event `name` upwards through the scope hierarchy notifying the + * registered {@link ng.$rootScope.Scope#$on} listeners. + * + * The event life cycle starts at the scope on which `$emit` was called. All + * {@link ng.$rootScope.Scope#$on listeners} listening for `name` event on this scope get + * notified. Afterwards, the event traverses upwards toward the root scope and calls all + * registered listeners along the way. The event will stop propagating if one of the listeners + * cancels it. + * + * Any exception emitted from the {@link ng.$rootScope.Scope#$on listeners} will be passed + * onto the {@link ng.$exceptionHandler $exceptionHandler} service. + * + * @param {string} name Event name to emit. + * @param {...*} args Optional one or more arguments which will be passed onto the event listeners. + * @return {Object} Event object (see {@link ng.$rootScope.Scope#$on}). + */ + $emit: function(name, args) { + var empty = [], + namedListeners, + scope = this, + stopPropagation = false, + event = { + name: name, + targetScope: scope, + stopPropagation: function() {stopPropagation = true;}, + preventDefault: function() { + event.defaultPrevented = true; + }, + defaultPrevented: false + }, + listenerArgs = concat([event], arguments, 1), + i, length; + + do { + namedListeners = scope.$$listeners[name] || empty; + event.currentScope = scope; + for (i = 0, length = namedListeners.length; i < length; i++) { + + // if listeners were deregistered, defragment the array + if (!namedListeners[i]) { + namedListeners.splice(i, 1); + i--; + length--; + continue; + } + try { + //allow all listeners attached to the current scope to run + namedListeners[i].apply(null, listenerArgs); + } catch (e) { + $exceptionHandler(e); + } + } + //if any listener on the current scope stops propagation, prevent bubbling + if (stopPropagation) { + event.currentScope = null; + return event; + } + //traverse upwards + scope = scope.$parent; + } while (scope); + + event.currentScope = null; + + return event; + }, + + + /** + * @ngdoc method + * @name $rootScope.Scope#$broadcast + * @kind function + * + * @description + * Dispatches an event `name` downwards to all child scopes (and their children) notifying the + * registered {@link ng.$rootScope.Scope#$on} listeners. + * + * The event life cycle starts at the scope on which `$broadcast` was called. All + * {@link ng.$rootScope.Scope#$on listeners} listening for `name` event on this scope get + * notified. Afterwards, the event propagates to all direct and indirect scopes of the current + * scope and calls all registered listeners along the way. The event cannot be canceled. + * + * Any exception emitted from the {@link ng.$rootScope.Scope#$on listeners} will be passed + * onto the {@link ng.$exceptionHandler $exceptionHandler} service. + * + * @param {string} name Event name to broadcast. + * @param {...*} args Optional one or more arguments which will be passed onto the event listeners. + * @return {Object} Event object, see {@link ng.$rootScope.Scope#$on} + */ + $broadcast: function(name, args) { + var target = this, + current = target, + next = target, + event = { + name: name, + targetScope: target, + preventDefault: function() { + event.defaultPrevented = true; + }, + defaultPrevented: false + }; + + if (!target.$$listenerCount[name]) return event; + + var listenerArgs = concat([event], arguments, 1), + listeners, i, length; + + //down while you can, then up and next sibling or up and next sibling until back at root + while ((current = next)) { + event.currentScope = current; + listeners = current.$$listeners[name] || []; + for (i = 0, length = listeners.length; i < length; i++) { + // if listeners were deregistered, defragment the array + if (!listeners[i]) { + listeners.splice(i, 1); + i--; + length--; + continue; + } + + try { + listeners[i].apply(null, listenerArgs); + } catch (e) { + $exceptionHandler(e); + } + } + + // Insanity Warning: scope depth-first traversal + // yes, this code is a bit crazy, but it works and we have tests to prove it! + // this piece should be kept in sync with the traversal in $digest + // (though it differs due to having the extra check for $$listenerCount) + if (!(next = ((current.$$listenerCount[name] && current.$$childHead) || + (current !== target && current.$$nextSibling)))) { + while (current !== target && !(next = current.$$nextSibling)) { + current = current.$parent; + } + } + } + + event.currentScope = null; + return event; + } + }; + + var $rootScope = new Scope(); + + //The internal queues. Expose them on the $rootScope for debugging/testing purposes. + var asyncQueue = $rootScope.$$asyncQueue = []; + var postDigestQueue = $rootScope.$$postDigestQueue = []; + var applyAsyncQueue = $rootScope.$$applyAsyncQueue = []; + + return $rootScope; + + + function beginPhase(phase) { + if ($rootScope.$$phase) { + throw $rootScopeMinErr('inprog', '{0} already in progress', $rootScope.$$phase); + } + + $rootScope.$$phase = phase; + } + + function clearPhase() { + $rootScope.$$phase = null; + } + + function incrementWatchersCount(current, count) { + do { + current.$$watchersCount += count; + } while ((current = current.$parent)); + } + + function decrementListenerCount(current, count, name) { + do { + current.$$listenerCount[name] -= count; + + if (current.$$listenerCount[name] === 0) { + delete current.$$listenerCount[name]; + } + } while ((current = current.$parent)); + } + + /** + * function used as an initial value for watchers. + * because it's unique we can easily tell it apart from other values + */ + function initWatchVal() {} + + function flushApplyAsync() { + while (applyAsyncQueue.length) { + try { + applyAsyncQueue.shift()(); + } catch (e) { + $exceptionHandler(e); + } + } + applyAsyncId = null; + } + + function scheduleApplyAsync() { + if (applyAsyncId === null) { + applyAsyncId = $browser.defer(function() { + $rootScope.$apply(flushApplyAsync); + }); + } + } + }]; +} + +/** + * @ngdoc service + * @name $rootElement + * + * @description + * The root element of Angular application. This is either the element where {@link + * ng.directive:ngApp ngApp} was declared or the element passed into + * {@link angular.bootstrap}. The element represents the root element of application. It is also the + * location where the application's {@link auto.$injector $injector} service gets + * published, and can be retrieved using `$rootElement.injector()`. + */ + + +// the implementation is in angular.bootstrap + +/** + * @description + * Private service to sanitize uris for links and images. Used by $compile and $sanitize. + */ +function $$SanitizeUriProvider() { + var aHrefSanitizationWhitelist = /^\s*(https?|ftp|mailto|tel|file):/, + imgSrcSanitizationWhitelist = /^\s*((https?|ftp|file|blob):|data:image\/)/; + + /** + * @description + * Retrieves or overrides the default regular expression that is used for whitelisting of safe + * urls during a[href] sanitization. + * + * The sanitization is a security measure aimed at prevent XSS attacks via html links. + * + * Any url about to be assigned to a[href] via data-binding is first normalized and turned into + * an absolute url. Afterwards, the url is matched against the `aHrefSanitizationWhitelist` + * regular expression. If a match is found, the original url is written into the dom. Otherwise, + * the absolute url is prefixed with `'unsafe:'` string and only then is it written into the DOM. + * + * @param {RegExp=} regexp New regexp to whitelist urls with. + * @returns {RegExp|ng.$compileProvider} Current RegExp if called without value or self for + * chaining otherwise. + */ + this.aHrefSanitizationWhitelist = function(regexp) { + if (isDefined(regexp)) { + aHrefSanitizationWhitelist = regexp; + return this; + } + return aHrefSanitizationWhitelist; + }; + + + /** + * @description + * Retrieves or overrides the default regular expression that is used for whitelisting of safe + * urls during img[src] sanitization. + * + * The sanitization is a security measure aimed at prevent XSS attacks via html links. + * + * Any url about to be assigned to img[src] via data-binding is first normalized and turned into + * an absolute url. Afterwards, the url is matched against the `imgSrcSanitizationWhitelist` + * regular expression. If a match is found, the original url is written into the dom. Otherwise, + * the absolute url is prefixed with `'unsafe:'` string and only then is it written into the DOM. + * + * @param {RegExp=} regexp New regexp to whitelist urls with. + * @returns {RegExp|ng.$compileProvider} Current RegExp if called without value or self for + * chaining otherwise. + */ + this.imgSrcSanitizationWhitelist = function(regexp) { + if (isDefined(regexp)) { + imgSrcSanitizationWhitelist = regexp; + return this; + } + return imgSrcSanitizationWhitelist; + }; + + this.$get = function() { + return function sanitizeUri(uri, isImage) { + var regex = isImage ? imgSrcSanitizationWhitelist : aHrefSanitizationWhitelist; + var normalizedVal; + normalizedVal = urlResolve(uri).href; + if (normalizedVal !== '' && !normalizedVal.match(regex)) { + return 'unsafe:' + normalizedVal; + } + return uri; + }; + }; +} + +/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * + * Any commits to this file should be reviewed with security in mind. * + * Changes to this file can potentially create security vulnerabilities. * + * An approval from 2 Core members with history of modifying * + * this file is required. * + * * + * Does the change somehow allow for arbitrary javascript to be executed? * + * Or allows for someone to change the prototype of built-in objects? * + * Or gives undesired access to variables likes document or window? * + * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ + +var $sceMinErr = minErr('$sce'); + +var SCE_CONTEXTS = { + HTML: 'html', + CSS: 'css', + URL: 'url', + // RESOURCE_URL is a subtype of URL used in contexts where a privileged resource is sourced from a + // url. (e.g. ng-include, script src, templateUrl) + RESOURCE_URL: 'resourceUrl', + JS: 'js' +}; + +// Helper functions follow. + +function adjustMatcher(matcher) { + if (matcher === 'self') { + return matcher; + } else if (isString(matcher)) { + // Strings match exactly except for 2 wildcards - '*' and '**'. + // '*' matches any character except those from the set ':/.?&'. + // '**' matches any character (like .* in a RegExp). + // More than 2 *'s raises an error as it's ill defined. + if (matcher.indexOf('***') > -1) { + throw $sceMinErr('iwcard', + 'Illegal sequence *** in string matcher. String: {0}', matcher); + } + matcher = escapeForRegexp(matcher). + replace('\\*\\*', '.*'). + replace('\\*', '[^:/.?&;]*'); + return new RegExp('^' + matcher + '$'); + } else if (isRegExp(matcher)) { + // The only other type of matcher allowed is a Regexp. + // Match entire URL / disallow partial matches. + // Flags are reset (i.e. no global, ignoreCase or multiline) + return new RegExp('^' + matcher.source + '$'); + } else { + throw $sceMinErr('imatcher', + 'Matchers may only be "self", string patterns or RegExp objects'); + } +} + + +function adjustMatchers(matchers) { + var adjustedMatchers = []; + if (isDefined(matchers)) { + forEach(matchers, function(matcher) { + adjustedMatchers.push(adjustMatcher(matcher)); + }); + } + return adjustedMatchers; +} + + +/** + * @ngdoc service + * @name $sceDelegate + * @kind function + * + * @description + * + * `$sceDelegate` is a service that is used by the `$sce` service to provide {@link ng.$sce Strict + * Contextual Escaping (SCE)} services to AngularJS. + * + * Typically, you would configure or override the {@link ng.$sceDelegate $sceDelegate} instead of + * the `$sce` service to customize the way Strict Contextual Escaping works in AngularJS. This is + * because, while the `$sce` provides numerous shorthand methods, etc., you really only need to + * override 3 core functions (`trustAs`, `getTrusted` and `valueOf`) to replace the way things + * work because `$sce` delegates to `$sceDelegate` for these operations. + * + * Refer {@link ng.$sceDelegateProvider $sceDelegateProvider} to configure this service. + * + * The default instance of `$sceDelegate` should work out of the box with little pain. While you + * can override it completely to change the behavior of `$sce`, the common case would + * involve configuring the {@link ng.$sceDelegateProvider $sceDelegateProvider} instead by setting + * your own whitelists and blacklists for trusting URLs used for loading AngularJS resources such as + * templates. Refer {@link ng.$sceDelegateProvider#resourceUrlWhitelist + * $sceDelegateProvider.resourceUrlWhitelist} and {@link + * ng.$sceDelegateProvider#resourceUrlBlacklist $sceDelegateProvider.resourceUrlBlacklist} + */ + +/** + * @ngdoc provider + * @name $sceDelegateProvider + * @description + * + * The `$sceDelegateProvider` provider allows developers to configure the {@link ng.$sceDelegate + * $sceDelegate} service. This allows one to get/set the whitelists and blacklists used to ensure + * that the URLs used for sourcing Angular templates are safe. Refer {@link + * ng.$sceDelegateProvider#resourceUrlWhitelist $sceDelegateProvider.resourceUrlWhitelist} and + * {@link ng.$sceDelegateProvider#resourceUrlBlacklist $sceDelegateProvider.resourceUrlBlacklist} + * + * For the general details about this service in Angular, read the main page for {@link ng.$sce + * Strict Contextual Escaping (SCE)}. + * + * **Example**: Consider the following case. + * + * - your app is hosted at url `http://myapp.example.com/` + * - but some of your templates are hosted on other domains you control such as + * `http://srv01.assets.example.com/`,  `http://srv02.assets.example.com/`, etc. + * - and you have an open redirect at `http://myapp.example.com/clickThru?...`. + * + * Here is what a secure configuration for this scenario might look like: + * + * ``` + * angular.module('myApp', []).config(function($sceDelegateProvider) { + * $sceDelegateProvider.resourceUrlWhitelist([ + * // Allow same origin resource loads. + * 'self', + * // Allow loading from our assets domain. Notice the difference between * and **. + * 'http://srv*.assets.example.com/**' + * ]); + * + * // The blacklist overrides the whitelist so the open redirect here is blocked. + * $sceDelegateProvider.resourceUrlBlacklist([ + * 'http://myapp.example.com/clickThru**' + * ]); + * }); + * ``` + */ + +function $SceDelegateProvider() { + this.SCE_CONTEXTS = SCE_CONTEXTS; + + // Resource URLs can also be trusted by policy. + var resourceUrlWhitelist = ['self'], + resourceUrlBlacklist = []; + + /** + * @ngdoc method + * @name $sceDelegateProvider#resourceUrlWhitelist + * @kind function + * + * @param {Array=} whitelist When provided, replaces the resourceUrlWhitelist with the value + * provided. This must be an array or null. A snapshot of this array is used so further + * changes to the array are ignored. + * + * Follow {@link ng.$sce#resourceUrlPatternItem this link} for a description of the items + * allowed in this array. + * + *
+ * **Note:** an empty whitelist array will block all URLs! + *
+ * + * @return {Array} the currently set whitelist array. + * + * The **default value** when no whitelist has been explicitly set is `['self']` allowing only + * same origin resource requests. + * + * @description + * Sets/Gets the whitelist of trusted resource URLs. + */ + this.resourceUrlWhitelist = function(value) { + if (arguments.length) { + resourceUrlWhitelist = adjustMatchers(value); + } + return resourceUrlWhitelist; + }; + + /** + * @ngdoc method + * @name $sceDelegateProvider#resourceUrlBlacklist + * @kind function + * + * @param {Array=} blacklist When provided, replaces the resourceUrlBlacklist with the value + * provided. This must be an array or null. A snapshot of this array is used so further + * changes to the array are ignored. + * + * Follow {@link ng.$sce#resourceUrlPatternItem this link} for a description of the items + * allowed in this array. + * + * The typical usage for the blacklist is to **block + * [open redirects](http://cwe.mitre.org/data/definitions/601.html)** served by your domain as + * these would otherwise be trusted but actually return content from the redirected domain. + * + * Finally, **the blacklist overrides the whitelist** and has the final say. + * + * @return {Array} the currently set blacklist array. + * + * The **default value** when no whitelist has been explicitly set is the empty array (i.e. there + * is no blacklist.) + * + * @description + * Sets/Gets the blacklist of trusted resource URLs. + */ + + this.resourceUrlBlacklist = function(value) { + if (arguments.length) { + resourceUrlBlacklist = adjustMatchers(value); + } + return resourceUrlBlacklist; + }; + + this.$get = ['$injector', function($injector) { + + var htmlSanitizer = function htmlSanitizer(html) { + throw $sceMinErr('unsafe', 'Attempting to use an unsafe value in a safe context.'); + }; + + if ($injector.has('$sanitize')) { + htmlSanitizer = $injector.get('$sanitize'); + } + + + function matchUrl(matcher, parsedUrl) { + if (matcher === 'self') { + return urlIsSameOrigin(parsedUrl); + } else { + // definitely a regex. See adjustMatchers() + return !!matcher.exec(parsedUrl.href); + } + } + + function isResourceUrlAllowedByPolicy(url) { + var parsedUrl = urlResolve(url.toString()); + var i, n, allowed = false; + // Ensure that at least one item from the whitelist allows this url. + for (i = 0, n = resourceUrlWhitelist.length; i < n; i++) { + if (matchUrl(resourceUrlWhitelist[i], parsedUrl)) { + allowed = true; + break; + } + } + if (allowed) { + // Ensure that no item from the blacklist blocked this url. + for (i = 0, n = resourceUrlBlacklist.length; i < n; i++) { + if (matchUrl(resourceUrlBlacklist[i], parsedUrl)) { + allowed = false; + break; + } + } + } + return allowed; + } + + function generateHolderType(Base) { + var holderType = function TrustedValueHolderType(trustedValue) { + this.$$unwrapTrustedValue = function() { + return trustedValue; + }; + }; + if (Base) { + holderType.prototype = new Base(); + } + holderType.prototype.valueOf = function sceValueOf() { + return this.$$unwrapTrustedValue(); + }; + holderType.prototype.toString = function sceToString() { + return this.$$unwrapTrustedValue().toString(); + }; + return holderType; + } + + var trustedValueHolderBase = generateHolderType(), + byType = {}; + + byType[SCE_CONTEXTS.HTML] = generateHolderType(trustedValueHolderBase); + byType[SCE_CONTEXTS.CSS] = generateHolderType(trustedValueHolderBase); + byType[SCE_CONTEXTS.URL] = generateHolderType(trustedValueHolderBase); + byType[SCE_CONTEXTS.JS] = generateHolderType(trustedValueHolderBase); + byType[SCE_CONTEXTS.RESOURCE_URL] = generateHolderType(byType[SCE_CONTEXTS.URL]); + + /** + * @ngdoc method + * @name $sceDelegate#trustAs + * + * @description + * Returns an object that is trusted by angular for use in specified strict + * contextual escaping contexts (such as ng-bind-html, ng-include, any src + * attribute interpolation, any dom event binding attribute interpolation + * such as for onclick, etc.) that uses the provided value. + * See {@link ng.$sce $sce} for enabling strict contextual escaping. + * + * @param {string} type The kind of context in which this value is safe for use. e.g. url, + * resourceUrl, html, js and css. + * @param {*} value The value that that should be considered trusted/safe. + * @returns {*} A value that can be used to stand in for the provided `value` in places + * where Angular expects a $sce.trustAs() return value. + */ + function trustAs(type, trustedValue) { + var Constructor = (byType.hasOwnProperty(type) ? byType[type] : null); + if (!Constructor) { + throw $sceMinErr('icontext', + 'Attempted to trust a value in invalid context. Context: {0}; Value: {1}', + type, trustedValue); + } + if (trustedValue === null || isUndefined(trustedValue) || trustedValue === '') { + return trustedValue; + } + // All the current contexts in SCE_CONTEXTS happen to be strings. In order to avoid trusting + // mutable objects, we ensure here that the value passed in is actually a string. + if (typeof trustedValue !== 'string') { + throw $sceMinErr('itype', + 'Attempted to trust a non-string value in a content requiring a string: Context: {0}', + type); + } + return new Constructor(trustedValue); + } + + /** + * @ngdoc method + * @name $sceDelegate#valueOf + * + * @description + * If the passed parameter had been returned by a prior call to {@link ng.$sceDelegate#trustAs + * `$sceDelegate.trustAs`}, returns the value that had been passed to {@link + * ng.$sceDelegate#trustAs `$sceDelegate.trustAs`}. + * + * If the passed parameter is not a value that had been returned by {@link + * ng.$sceDelegate#trustAs `$sceDelegate.trustAs`}, returns it as-is. + * + * @param {*} value The result of a prior {@link ng.$sceDelegate#trustAs `$sceDelegate.trustAs`} + * call or anything else. + * @returns {*} The `value` that was originally provided to {@link ng.$sceDelegate#trustAs + * `$sceDelegate.trustAs`} if `value` is the result of such a call. Otherwise, returns + * `value` unchanged. + */ + function valueOf(maybeTrusted) { + if (maybeTrusted instanceof trustedValueHolderBase) { + return maybeTrusted.$$unwrapTrustedValue(); + } else { + return maybeTrusted; + } + } + + /** + * @ngdoc method + * @name $sceDelegate#getTrusted + * + * @description + * Takes the result of a {@link ng.$sceDelegate#trustAs `$sceDelegate.trustAs`} call and + * returns the originally supplied value if the queried context type is a supertype of the + * created type. If this condition isn't satisfied, throws an exception. + * + *
+ * Disabling auto-escaping is extremely dangerous, it usually creates a Cross Site Scripting + * (XSS) vulnerability in your application. + *
+ * + * @param {string} type The kind of context in which this value is to be used. + * @param {*} maybeTrusted The result of a prior {@link ng.$sceDelegate#trustAs + * `$sceDelegate.trustAs`} call. + * @returns {*} The value the was originally provided to {@link ng.$sceDelegate#trustAs + * `$sceDelegate.trustAs`} if valid in this context. Otherwise, throws an exception. + */ + function getTrusted(type, maybeTrusted) { + if (maybeTrusted === null || isUndefined(maybeTrusted) || maybeTrusted === '') { + return maybeTrusted; + } + var constructor = (byType.hasOwnProperty(type) ? byType[type] : null); + if (constructor && maybeTrusted instanceof constructor) { + return maybeTrusted.$$unwrapTrustedValue(); + } + // If we get here, then we may only take one of two actions. + // 1. sanitize the value for the requested type, or + // 2. throw an exception. + if (type === SCE_CONTEXTS.RESOURCE_URL) { + if (isResourceUrlAllowedByPolicy(maybeTrusted)) { + return maybeTrusted; + } else { + throw $sceMinErr('insecurl', + 'Blocked loading resource from url not allowed by $sceDelegate policy. URL: {0}', + maybeTrusted.toString()); + } + } else if (type === SCE_CONTEXTS.HTML) { + return htmlSanitizer(maybeTrusted); + } + throw $sceMinErr('unsafe', 'Attempting to use an unsafe value in a safe context.'); + } + + return { trustAs: trustAs, + getTrusted: getTrusted, + valueOf: valueOf }; + }]; +} + + +/** + * @ngdoc provider + * @name $sceProvider + * @description + * + * The $sceProvider provider allows developers to configure the {@link ng.$sce $sce} service. + * - enable/disable Strict Contextual Escaping (SCE) in a module + * - override the default implementation with a custom delegate + * + * Read more about {@link ng.$sce Strict Contextual Escaping (SCE)}. + */ + +/* jshint maxlen: false*/ + +/** + * @ngdoc service + * @name $sce + * @kind function + * + * @description + * + * `$sce` is a service that provides Strict Contextual Escaping services to AngularJS. + * + * # Strict Contextual Escaping + * + * Strict Contextual Escaping (SCE) is a mode in which AngularJS requires bindings in certain + * contexts to result in a value that is marked as safe to use for that context. One example of + * such a context is binding arbitrary html controlled by the user via `ng-bind-html`. We refer + * to these contexts as privileged or SCE contexts. + * + * As of version 1.2, Angular ships with SCE enabled by default. + * + * Note: When enabled (the default), IE<11 in quirks mode is not supported. In this mode, IE<11 allow + * one to execute arbitrary javascript by the use of the expression() syntax. Refer + * to learn more about them. + * You can ensure your document is in standards mode and not quirks mode by adding `` + * to the top of your HTML document. + * + * SCE assists in writing code in way that (a) is secure by default and (b) makes auditing for + * security vulnerabilities such as XSS, clickjacking, etc. a lot easier. + * + * Here's an example of a binding in a privileged context: + * + * ``` + * + *
+ * ``` + * + * Notice that `ng-bind-html` is bound to `userHtml` controlled by the user. With SCE + * disabled, this application allows the user to render arbitrary HTML into the DIV. + * In a more realistic example, one may be rendering user comments, blog articles, etc. via + * bindings. (HTML is just one example of a context where rendering user controlled input creates + * security vulnerabilities.) + * + * For the case of HTML, you might use a library, either on the client side, or on the server side, + * to sanitize unsafe HTML before binding to the value and rendering it in the document. + * + * How would you ensure that every place that used these types of bindings was bound to a value that + * was sanitized by your library (or returned as safe for rendering by your server?) How can you + * ensure that you didn't accidentally delete the line that sanitized the value, or renamed some + * properties/fields and forgot to update the binding to the sanitized value? + * + * To be secure by default, you want to ensure that any such bindings are disallowed unless you can + * determine that something explicitly says it's safe to use a value for binding in that + * context. You can then audit your code (a simple grep would do) to ensure that this is only done + * for those values that you can easily tell are safe - because they were received from your server, + * sanitized by your library, etc. You can organize your codebase to help with this - perhaps + * allowing only the files in a specific directory to do this. Ensuring that the internal API + * exposed by that code doesn't markup arbitrary values as safe then becomes a more manageable task. + * + * In the case of AngularJS' SCE service, one uses {@link ng.$sce#trustAs $sce.trustAs} + * (and shorthand methods such as {@link ng.$sce#trustAsHtml $sce.trustAsHtml}, etc.) to + * obtain values that will be accepted by SCE / privileged contexts. + * + * + * ## How does it work? + * + * In privileged contexts, directives and code will bind to the result of {@link ng.$sce#getTrusted + * $sce.getTrusted(context, value)} rather than to the value directly. Directives use {@link + * ng.$sce#parseAs $sce.parseAs} rather than `$parse` to watch attribute bindings, which performs the + * {@link ng.$sce#getTrusted $sce.getTrusted} behind the scenes on non-constant literals. + * + * As an example, {@link ng.directive:ngBindHtml ngBindHtml} uses {@link + * ng.$sce#parseAsHtml $sce.parseAsHtml(binding expression)}. Here's the actual code (slightly + * simplified): + * + * ``` + * var ngBindHtmlDirective = ['$sce', function($sce) { + * return function(scope, element, attr) { + * scope.$watch($sce.parseAsHtml(attr.ngBindHtml), function(value) { + * element.html(value || ''); + * }); + * }; + * }]; + * ``` + * + * ## Impact on loading templates + * + * This applies both to the {@link ng.directive:ngInclude `ng-include`} directive as well as + * `templateUrl`'s specified by {@link guide/directive directives}. + * + * By default, Angular only loads templates from the same domain and protocol as the application + * document. This is done by calling {@link ng.$sce#getTrustedResourceUrl + * $sce.getTrustedResourceUrl} on the template URL. To load templates from other domains and/or + * protocols, you may either {@link ng.$sceDelegateProvider#resourceUrlWhitelist whitelist + * them} or {@link ng.$sce#trustAsResourceUrl wrap it} into a trusted value. + * + * *Please note*: + * The browser's + * [Same Origin Policy](https://code.google.com/p/browsersec/wiki/Part2#Same-origin_policy_for_XMLHttpRequest) + * and [Cross-Origin Resource Sharing (CORS)](http://www.w3.org/TR/cors/) + * policy apply in addition to this and may further restrict whether the template is successfully + * loaded. This means that without the right CORS policy, loading templates from a different domain + * won't work on all browsers. Also, loading templates from `file://` URL does not work on some + * browsers. + * + * ## This feels like too much overhead + * + * It's important to remember that SCE only applies to interpolation expressions. + * + * If your expressions are constant literals, they're automatically trusted and you don't need to + * call `$sce.trustAs` on them (remember to include the `ngSanitize` module) (e.g. + * `
`) just works. + * + * Additionally, `a[href]` and `img[src]` automatically sanitize their URLs and do not pass them + * through {@link ng.$sce#getTrusted $sce.getTrusted}. SCE doesn't play a role here. + * + * The included {@link ng.$sceDelegate $sceDelegate} comes with sane defaults to allow you to load + * templates in `ng-include` from your application's domain without having to even know about SCE. + * It blocks loading templates from other domains or loading templates over http from an https + * served document. You can change these by setting your own custom {@link + * ng.$sceDelegateProvider#resourceUrlWhitelist whitelists} and {@link + * ng.$sceDelegateProvider#resourceUrlBlacklist blacklists} for matching such URLs. + * + * This significantly reduces the overhead. It is far easier to pay the small overhead and have an + * application that's secure and can be audited to verify that with much more ease than bolting + * security onto an application later. + * + * + * ## What trusted context types are supported? + * + * | Context | Notes | + * |---------------------|----------------| + * | `$sce.HTML` | For HTML that's safe to source into the application. The {@link ng.directive:ngBindHtml ngBindHtml} directive uses this context for bindings. If an unsafe value is encountered and the {@link ngSanitize $sanitize} module is present this will sanitize the value instead of throwing an error. | + * | `$sce.CSS` | For CSS that's safe to source into the application. Currently unused. Feel free to use it in your own directives. | + * | `$sce.URL` | For URLs that are safe to follow as links. Currently unused (`
Note that `$sce.RESOURCE_URL` makes a stronger statement about the URL than `$sce.URL` does and therefore contexts requiring values trusted for `$sce.RESOURCE_URL` can be used anywhere that values trusted for `$sce.URL` are required. | + * | `$sce.JS` | For JavaScript that is safe to execute in your application's context. Currently unused. Feel free to use it in your own directives. | + * + * ## Format of items in {@link ng.$sceDelegateProvider#resourceUrlWhitelist resourceUrlWhitelist}/{@link ng.$sceDelegateProvider#resourceUrlBlacklist Blacklist}
+ * + * Each element in these arrays must be one of the following: + * + * - **'self'** + * - The special **string**, `'self'`, can be used to match against all URLs of the **same + * domain** as the application document using the **same protocol**. + * - **String** (except the special value `'self'`) + * - The string is matched against the full *normalized / absolute URL* of the resource + * being tested (substring matches are not good enough.) + * - There are exactly **two wildcard sequences** - `*` and `**`. All other characters + * match themselves. + * - `*`: matches zero or more occurrences of any character other than one of the following 6 + * characters: '`:`', '`/`', '`.`', '`?`', '`&`' and '`;`'. It's a useful wildcard for use + * in a whitelist. + * - `**`: matches zero or more occurrences of *any* character. As such, it's not + * appropriate for use in a scheme, domain, etc. as it would match too much. (e.g. + * http://**.example.com/ would match http://evil.com/?ignore=.example.com/ and that might + * not have been the intention.) Its usage at the very end of the path is ok. (e.g. + * http://foo.example.com/templates/**). + * - **RegExp** (*see caveat below*) + * - *Caveat*: While regular expressions are powerful and offer great flexibility, their syntax + * (and all the inevitable escaping) makes them *harder to maintain*. It's easy to + * accidentally introduce a bug when one updates a complex expression (imho, all regexes should + * have good test coverage). For instance, the use of `.` in the regex is correct only in a + * small number of cases. A `.` character in the regex used when matching the scheme or a + * subdomain could be matched against a `:` or literal `.` that was likely not intended. It + * is highly recommended to use the string patterns and only fall back to regular expressions + * as a last resort. + * - The regular expression must be an instance of RegExp (i.e. not a string.) It is + * matched against the **entire** *normalized / absolute URL* of the resource being tested + * (even when the RegExp did not have the `^` and `$` codes.) In addition, any flags + * present on the RegExp (such as multiline, global, ignoreCase) are ignored. + * - If you are generating your JavaScript from some other templating engine (not + * recommended, e.g. in issue [#4006](https://github.com/angular/angular.js/issues/4006)), + * remember to escape your regular expression (and be aware that you might need more than + * one level of escaping depending on your templating engine and the way you interpolated + * the value.) Do make use of your platform's escaping mechanism as it might be good + * enough before coding your own. E.g. Ruby has + * [Regexp.escape(str)](http://www.ruby-doc.org/core-2.0.0/Regexp.html#method-c-escape) + * and Python has [re.escape](http://docs.python.org/library/re.html#re.escape). + * Javascript lacks a similar built in function for escaping. Take a look at Google + * Closure library's [goog.string.regExpEscape(s)]( + * http://docs.closure-library.googlecode.com/git/closure_goog_string_string.js.source.html#line962). + * + * Refer {@link ng.$sceDelegateProvider $sceDelegateProvider} for an example. + * + * ## Show me an example using SCE. + * + * + * + *
+ *

+ * User comments
+ * By default, HTML that isn't explicitly trusted (e.g. Alice's comment) is sanitized when + * $sanitize is available. If $sanitize isn't available, this results in an error instead of an + * exploit. + *
+ *
+ * {{userComment.name}}: + * + *
+ *
+ *
+ *
+ *
+ * + * + * angular.module('mySceApp', ['ngSanitize']) + * .controller('AppController', ['$http', '$templateCache', '$sce', + * function($http, $templateCache, $sce) { + * var self = this; + * $http.get("test_data.json", {cache: $templateCache}).success(function(userComments) { + * self.userComments = userComments; + * }); + * self.explicitlyTrustedHtml = $sce.trustAsHtml( + * 'Hover over this text.'); + * }]); + * + * + * + * [ + * { "name": "Alice", + * "htmlComment": + * "Is anyone reading this?" + * }, + * { "name": "Bob", + * "htmlComment": "Yes! Am I the only other one?" + * } + * ] + * + * + * + * describe('SCE doc demo', function() { + * it('should sanitize untrusted values', function() { + * expect(element.all(by.css('.htmlComment')).first().getInnerHtml()) + * .toBe('Is anyone reading this?'); + * }); + * + * it('should NOT sanitize explicitly trusted values', function() { + * expect(element(by.id('explicitlyTrustedHtml')).getInnerHtml()).toBe( + * 'Hover over this text.'); + * }); + * }); + * + *
+ * + * + * + * ## Can I disable SCE completely? + * + * Yes, you can. However, this is strongly discouraged. SCE gives you a lot of security benefits + * for little coding overhead. It will be much harder to take an SCE disabled application and + * either secure it on your own or enable SCE at a later stage. It might make sense to disable SCE + * for cases where you have a lot of existing code that was written before SCE was introduced and + * you're migrating them a module at a time. + * + * That said, here's how you can completely disable SCE: + * + * ``` + * angular.module('myAppWithSceDisabledmyApp', []).config(function($sceProvider) { + * // Completely disable SCE. For demonstration purposes only! + * // Do not use in new projects. + * $sceProvider.enabled(false); + * }); + * ``` + * + */ +/* jshint maxlen: 100 */ + +function $SceProvider() { + var enabled = true; + + /** + * @ngdoc method + * @name $sceProvider#enabled + * @kind function + * + * @param {boolean=} value If provided, then enables/disables SCE. + * @return {boolean} true if SCE is enabled, false otherwise. + * + * @description + * Enables/disables SCE and returns the current value. + */ + this.enabled = function(value) { + if (arguments.length) { + enabled = !!value; + } + return enabled; + }; + + + /* Design notes on the default implementation for SCE. + * + * The API contract for the SCE delegate + * ------------------------------------- + * The SCE delegate object must provide the following 3 methods: + * + * - trustAs(contextEnum, value) + * This method is used to tell the SCE service that the provided value is OK to use in the + * contexts specified by contextEnum. It must return an object that will be accepted by + * getTrusted() for a compatible contextEnum and return this value. + * + * - valueOf(value) + * For values that were not produced by trustAs(), return them as is. For values that were + * produced by trustAs(), return the corresponding input value to trustAs. Basically, if + * trustAs is wrapping the given values into some type, this operation unwraps it when given + * such a value. + * + * - getTrusted(contextEnum, value) + * This function should return the a value that is safe to use in the context specified by + * contextEnum or throw and exception otherwise. + * + * NOTE: This contract deliberately does NOT state that values returned by trustAs() must be + * opaque or wrapped in some holder object. That happens to be an implementation detail. For + * instance, an implementation could maintain a registry of all trusted objects by context. In + * such a case, trustAs() would return the same object that was passed in. getTrusted() would + * return the same object passed in if it was found in the registry under a compatible context or + * throw an exception otherwise. An implementation might only wrap values some of the time based + * on some criteria. getTrusted() might return a value and not throw an exception for special + * constants or objects even if not wrapped. All such implementations fulfill this contract. + * + * + * A note on the inheritance model for SCE contexts + * ------------------------------------------------ + * I've used inheritance and made RESOURCE_URL wrapped types a subtype of URL wrapped types. This + * is purely an implementation details. + * + * The contract is simply this: + * + * getTrusted($sce.RESOURCE_URL, value) succeeding implies that getTrusted($sce.URL, value) + * will also succeed. + * + * Inheritance happens to capture this in a natural way. In some future, we + * may not use inheritance anymore. That is OK because no code outside of + * sce.js and sceSpecs.js would need to be aware of this detail. + */ + + this.$get = ['$parse', '$sceDelegate', function( + $parse, $sceDelegate) { + // Prereq: Ensure that we're not running in IE<11 quirks mode. In that mode, IE < 11 allow + // the "expression(javascript expression)" syntax which is insecure. + if (enabled && msie < 8) { + throw $sceMinErr('iequirks', + 'Strict Contextual Escaping does not support Internet Explorer version < 11 in quirks ' + + 'mode. You can fix this by adding the text to the top of your HTML ' + + 'document. See http://docs.angularjs.org/api/ng.$sce for more information.'); + } + + var sce = shallowCopy(SCE_CONTEXTS); + + /** + * @ngdoc method + * @name $sce#isEnabled + * @kind function + * + * @return {Boolean} true if SCE is enabled, false otherwise. If you want to set the value, you + * have to do it at module config time on {@link ng.$sceProvider $sceProvider}. + * + * @description + * Returns a boolean indicating if SCE is enabled. + */ + sce.isEnabled = function() { + return enabled; + }; + sce.trustAs = $sceDelegate.trustAs; + sce.getTrusted = $sceDelegate.getTrusted; + sce.valueOf = $sceDelegate.valueOf; + + if (!enabled) { + sce.trustAs = sce.getTrusted = function(type, value) { return value; }; + sce.valueOf = identity; + } + + /** + * @ngdoc method + * @name $sce#parseAs + * + * @description + * Converts Angular {@link guide/expression expression} into a function. This is like {@link + * ng.$parse $parse} and is identical when the expression is a literal constant. Otherwise, it + * wraps the expression in a call to {@link ng.$sce#getTrusted $sce.getTrusted(*type*, + * *result*)} + * + * @param {string} type The kind of SCE context in which this result will be used. + * @param {string} expression String expression to compile. + * @returns {function(context, locals)} a function which represents the compiled expression: + * + * * `context` – `{object}` – an object against which any expressions embedded in the strings + * are evaluated against (typically a scope object). + * * `locals` – `{object=}` – local variables context object, useful for overriding values in + * `context`. + */ + sce.parseAs = function sceParseAs(type, expr) { + var parsed = $parse(expr); + if (parsed.literal && parsed.constant) { + return parsed; + } else { + return $parse(expr, function(value) { + return sce.getTrusted(type, value); + }); + } + }; + + /** + * @ngdoc method + * @name $sce#trustAs + * + * @description + * Delegates to {@link ng.$sceDelegate#trustAs `$sceDelegate.trustAs`}. As such, + * returns an object that is trusted by angular for use in specified strict contextual + * escaping contexts (such as ng-bind-html, ng-include, any src attribute + * interpolation, any dom event binding attribute interpolation such as for onclick, etc.) + * that uses the provided value. See * {@link ng.$sce $sce} for enabling strict contextual + * escaping. + * + * @param {string} type The kind of context in which this value is safe for use. e.g. url, + * resourceUrl, html, js and css. + * @param {*} value The value that that should be considered trusted/safe. + * @returns {*} A value that can be used to stand in for the provided `value` in places + * where Angular expects a $sce.trustAs() return value. + */ + + /** + * @ngdoc method + * @name $sce#trustAsHtml + * + * @description + * Shorthand method. `$sce.trustAsHtml(value)` → + * {@link ng.$sceDelegate#trustAs `$sceDelegate.trustAs($sce.HTML, value)`} + * + * @param {*} value The value to trustAs. + * @returns {*} An object that can be passed to {@link ng.$sce#getTrustedHtml + * $sce.getTrustedHtml(value)} to obtain the original value. (privileged directives + * only accept expressions that are either literal constants or are the + * return value of {@link ng.$sce#trustAs $sce.trustAs}.) + */ + + /** + * @ngdoc method + * @name $sce#trustAsUrl + * + * @description + * Shorthand method. `$sce.trustAsUrl(value)` → + * {@link ng.$sceDelegate#trustAs `$sceDelegate.trustAs($sce.URL, value)`} + * + * @param {*} value The value to trustAs. + * @returns {*} An object that can be passed to {@link ng.$sce#getTrustedUrl + * $sce.getTrustedUrl(value)} to obtain the original value. (privileged directives + * only accept expressions that are either literal constants or are the + * return value of {@link ng.$sce#trustAs $sce.trustAs}.) + */ + + /** + * @ngdoc method + * @name $sce#trustAsResourceUrl + * + * @description + * Shorthand method. `$sce.trustAsResourceUrl(value)` → + * {@link ng.$sceDelegate#trustAs `$sceDelegate.trustAs($sce.RESOURCE_URL, value)`} + * + * @param {*} value The value to trustAs. + * @returns {*} An object that can be passed to {@link ng.$sce#getTrustedResourceUrl + * $sce.getTrustedResourceUrl(value)} to obtain the original value. (privileged directives + * only accept expressions that are either literal constants or are the return + * value of {@link ng.$sce#trustAs $sce.trustAs}.) + */ + + /** + * @ngdoc method + * @name $sce#trustAsJs + * + * @description + * Shorthand method. `$sce.trustAsJs(value)` → + * {@link ng.$sceDelegate#trustAs `$sceDelegate.trustAs($sce.JS, value)`} + * + * @param {*} value The value to trustAs. + * @returns {*} An object that can be passed to {@link ng.$sce#getTrustedJs + * $sce.getTrustedJs(value)} to obtain the original value. (privileged directives + * only accept expressions that are either literal constants or are the + * return value of {@link ng.$sce#trustAs $sce.trustAs}.) + */ + + /** + * @ngdoc method + * @name $sce#getTrusted + * + * @description + * Delegates to {@link ng.$sceDelegate#getTrusted `$sceDelegate.getTrusted`}. As such, + * takes the result of a {@link ng.$sce#trustAs `$sce.trustAs`}() call and returns the + * originally supplied value if the queried context type is a supertype of the created type. + * If this condition isn't satisfied, throws an exception. + * + * @param {string} type The kind of context in which this value is to be used. + * @param {*} maybeTrusted The result of a prior {@link ng.$sce#trustAs `$sce.trustAs`} + * call. + * @returns {*} The value the was originally provided to + * {@link ng.$sce#trustAs `$sce.trustAs`} if valid in this context. + * Otherwise, throws an exception. + */ + + /** + * @ngdoc method + * @name $sce#getTrustedHtml + * + * @description + * Shorthand method. `$sce.getTrustedHtml(value)` → + * {@link ng.$sceDelegate#getTrusted `$sceDelegate.getTrusted($sce.HTML, value)`} + * + * @param {*} value The value to pass to `$sce.getTrusted`. + * @returns {*} The return value of `$sce.getTrusted($sce.HTML, value)` + */ + + /** + * @ngdoc method + * @name $sce#getTrustedCss + * + * @description + * Shorthand method. `$sce.getTrustedCss(value)` → + * {@link ng.$sceDelegate#getTrusted `$sceDelegate.getTrusted($sce.CSS, value)`} + * + * @param {*} value The value to pass to `$sce.getTrusted`. + * @returns {*} The return value of `$sce.getTrusted($sce.CSS, value)` + */ + + /** + * @ngdoc method + * @name $sce#getTrustedUrl + * + * @description + * Shorthand method. `$sce.getTrustedUrl(value)` → + * {@link ng.$sceDelegate#getTrusted `$sceDelegate.getTrusted($sce.URL, value)`} + * + * @param {*} value The value to pass to `$sce.getTrusted`. + * @returns {*} The return value of `$sce.getTrusted($sce.URL, value)` + */ + + /** + * @ngdoc method + * @name $sce#getTrustedResourceUrl + * + * @description + * Shorthand method. `$sce.getTrustedResourceUrl(value)` → + * {@link ng.$sceDelegate#getTrusted `$sceDelegate.getTrusted($sce.RESOURCE_URL, value)`} + * + * @param {*} value The value to pass to `$sceDelegate.getTrusted`. + * @returns {*} The return value of `$sce.getTrusted($sce.RESOURCE_URL, value)` + */ + + /** + * @ngdoc method + * @name $sce#getTrustedJs + * + * @description + * Shorthand method. `$sce.getTrustedJs(value)` → + * {@link ng.$sceDelegate#getTrusted `$sceDelegate.getTrusted($sce.JS, value)`} + * + * @param {*} value The value to pass to `$sce.getTrusted`. + * @returns {*} The return value of `$sce.getTrusted($sce.JS, value)` + */ + + /** + * @ngdoc method + * @name $sce#parseAsHtml + * + * @description + * Shorthand method. `$sce.parseAsHtml(expression string)` → + * {@link ng.$sce#parseAs `$sce.parseAs($sce.HTML, value)`} + * + * @param {string} expression String expression to compile. + * @returns {function(context, locals)} a function which represents the compiled expression: + * + * * `context` – `{object}` – an object against which any expressions embedded in the strings + * are evaluated against (typically a scope object). + * * `locals` – `{object=}` – local variables context object, useful for overriding values in + * `context`. + */ + + /** + * @ngdoc method + * @name $sce#parseAsCss + * + * @description + * Shorthand method. `$sce.parseAsCss(value)` → + * {@link ng.$sce#parseAs `$sce.parseAs($sce.CSS, value)`} + * + * @param {string} expression String expression to compile. + * @returns {function(context, locals)} a function which represents the compiled expression: + * + * * `context` – `{object}` – an object against which any expressions embedded in the strings + * are evaluated against (typically a scope object). + * * `locals` – `{object=}` – local variables context object, useful for overriding values in + * `context`. + */ + + /** + * @ngdoc method + * @name $sce#parseAsUrl + * + * @description + * Shorthand method. `$sce.parseAsUrl(value)` → + * {@link ng.$sce#parseAs `$sce.parseAs($sce.URL, value)`} + * + * @param {string} expression String expression to compile. + * @returns {function(context, locals)} a function which represents the compiled expression: + * + * * `context` – `{object}` – an object against which any expressions embedded in the strings + * are evaluated against (typically a scope object). + * * `locals` – `{object=}` – local variables context object, useful for overriding values in + * `context`. + */ + + /** + * @ngdoc method + * @name $sce#parseAsResourceUrl + * + * @description + * Shorthand method. `$sce.parseAsResourceUrl(value)` → + * {@link ng.$sce#parseAs `$sce.parseAs($sce.RESOURCE_URL, value)`} + * + * @param {string} expression String expression to compile. + * @returns {function(context, locals)} a function which represents the compiled expression: + * + * * `context` – `{object}` – an object against which any expressions embedded in the strings + * are evaluated against (typically a scope object). + * * `locals` – `{object=}` – local variables context object, useful for overriding values in + * `context`. + */ + + /** + * @ngdoc method + * @name $sce#parseAsJs + * + * @description + * Shorthand method. `$sce.parseAsJs(value)` → + * {@link ng.$sce#parseAs `$sce.parseAs($sce.JS, value)`} + * + * @param {string} expression String expression to compile. + * @returns {function(context, locals)} a function which represents the compiled expression: + * + * * `context` – `{object}` – an object against which any expressions embedded in the strings + * are evaluated against (typically a scope object). + * * `locals` – `{object=}` – local variables context object, useful for overriding values in + * `context`. + */ + + // Shorthand delegations. + var parse = sce.parseAs, + getTrusted = sce.getTrusted, + trustAs = sce.trustAs; + + forEach(SCE_CONTEXTS, function(enumValue, name) { + var lName = lowercase(name); + sce[camelCase("parse_as_" + lName)] = function(expr) { + return parse(enumValue, expr); + }; + sce[camelCase("get_trusted_" + lName)] = function(value) { + return getTrusted(enumValue, value); + }; + sce[camelCase("trust_as_" + lName)] = function(value) { + return trustAs(enumValue, value); + }; + }); + + return sce; + }]; +} + +/** + * !!! This is an undocumented "private" service !!! + * + * @name $sniffer + * @requires $window + * @requires $document + * + * @property {boolean} history Does the browser support html5 history api ? + * @property {boolean} transitions Does the browser support CSS transition events ? + * @property {boolean} animations Does the browser support CSS animation events ? + * + * @description + * This is very simple implementation of testing browser's features. + */ +function $SnifferProvider() { + this.$get = ['$window', '$document', function($window, $document) { + var eventSupport = {}, + // Chrome Packaged Apps are not allowed to access `history.pushState`. They can be detected by + // the presence of `chrome.app.runtime` (see https://developer.chrome.com/apps/api_index) + isChromePackagedApp = $window.chrome && $window.chrome.app && $window.chrome.app.runtime, + hasHistoryPushState = !isChromePackagedApp && $window.history && $window.history.pushState, + android = + toInt((/android (\d+)/.exec(lowercase(($window.navigator || {}).userAgent)) || [])[1]), + boxee = /Boxee/i.test(($window.navigator || {}).userAgent), + document = $document[0] || {}, + vendorPrefix, + vendorRegex = /^(Moz|webkit|ms)(?=[A-Z])/, + bodyStyle = document.body && document.body.style, + transitions = false, + animations = false, + match; + + if (bodyStyle) { + for (var prop in bodyStyle) { + if (match = vendorRegex.exec(prop)) { + vendorPrefix = match[0]; + vendorPrefix = vendorPrefix.substr(0, 1).toUpperCase() + vendorPrefix.substr(1); + break; + } + } + + if (!vendorPrefix) { + vendorPrefix = ('WebkitOpacity' in bodyStyle) && 'webkit'; + } + + transitions = !!(('transition' in bodyStyle) || (vendorPrefix + 'Transition' in bodyStyle)); + animations = !!(('animation' in bodyStyle) || (vendorPrefix + 'Animation' in bodyStyle)); + + if (android && (!transitions || !animations)) { + transitions = isString(bodyStyle.webkitTransition); + animations = isString(bodyStyle.webkitAnimation); + } + } + + + return { + // Android has history.pushState, but it does not update location correctly + // so let's not use the history API at all. + // http://code.google.com/p/android/issues/detail?id=17471 + // https://github.com/angular/angular.js/issues/904 + + // older webkit browser (533.9) on Boxee box has exactly the same problem as Android has + // so let's not use the history API also + // We are purposefully using `!(android < 4)` to cover the case when `android` is undefined + // jshint -W018 + history: !!(hasHistoryPushState && !(android < 4) && !boxee), + // jshint +W018 + hasEvent: function(event) { + // IE9 implements 'input' event it's so fubared that we rather pretend that it doesn't have + // it. In particular the event is not fired when backspace or delete key are pressed or + // when cut operation is performed. + // IE10+ implements 'input' event but it erroneously fires under various situations, + // e.g. when placeholder changes, or a form is focused. + if (event === 'input' && msie <= 11) return false; + + if (isUndefined(eventSupport[event])) { + var divElm = document.createElement('div'); + eventSupport[event] = 'on' + event in divElm; + } + + return eventSupport[event]; + }, + csp: csp(), + vendorPrefix: vendorPrefix, + transitions: transitions, + animations: animations, + android: android + }; + }]; +} + +var $templateRequestMinErr = minErr('$compile'); + +/** + * @ngdoc provider + * @name $templateRequestProvider + * @description + * Used to configure the options passed to the {@link $http} service when making a template request. + * + * For example, it can be used for specifying the "Accept" header that is sent to the server, when + * requesting a template. + */ +function $TemplateRequestProvider() { + + var httpOptions; + + /** + * @ngdoc method + * @name $templateRequestProvider#httpOptions + * @description + * The options to be passed to the {@link $http} service when making the request. + * You can use this to override options such as the "Accept" header for template requests. + * + * The {@link $templateRequest} will set the `cache` and the `transformResponse` properties of the + * options if not overridden here. + * + * @param {string=} value new value for the {@link $http} options. + * @returns {string|self} Returns the {@link $http} options when used as getter and self if used as setter. + */ + this.httpOptions = function(val) { + if (val) { + httpOptions = val; + return this; + } + return httpOptions; + }; + + /** + * @ngdoc service + * @name $templateRequest + * + * @description + * The `$templateRequest` service runs security checks then downloads the provided template using + * `$http` and, upon success, stores the contents inside of `$templateCache`. If the HTTP request + * fails or the response data of the HTTP request is empty, a `$compile` error will be thrown (the + * exception can be thwarted by setting the 2nd parameter of the function to true). Note that the + * contents of `$templateCache` are trusted, so the call to `$sce.getTrustedUrl(tpl)` is omitted + * when `tpl` is of type string and `$templateCache` has the matching entry. + * + * If you want to pass custom options to the `$http` service, such as setting the Accept header you + * can configure this via {@link $templateRequestProvider#httpOptions}. + * + * @param {string|TrustedResourceUrl} tpl The HTTP request template URL + * @param {boolean=} ignoreRequestError Whether or not to ignore the exception when the request fails or the template is empty + * + * @return {Promise} a promise for the HTTP response data of the given URL. + * + * @property {number} totalPendingRequests total amount of pending template requests being downloaded. + */ + this.$get = ['$templateCache', '$http', '$q', '$sce', function($templateCache, $http, $q, $sce) { + + function handleRequestFn(tpl, ignoreRequestError) { + handleRequestFn.totalPendingRequests++; + + // We consider the template cache holds only trusted templates, so + // there's no need to go through whitelisting again for keys that already + // are included in there. This also makes Angular accept any script + // directive, no matter its name. However, we still need to unwrap trusted + // types. + if (!isString(tpl) || !$templateCache.get(tpl)) { + tpl = $sce.getTrustedResourceUrl(tpl); + } + + var transformResponse = $http.defaults && $http.defaults.transformResponse; + + if (isArray(transformResponse)) { + transformResponse = transformResponse.filter(function(transformer) { + return transformer !== defaultHttpResponseTransform; + }); + } else if (transformResponse === defaultHttpResponseTransform) { + transformResponse = null; + } + + return $http.get(tpl, extend({ + cache: $templateCache, + transformResponse: transformResponse + }, httpOptions)) + ['finally'](function() { + handleRequestFn.totalPendingRequests--; + }) + .then(function(response) { + $templateCache.put(tpl, response.data); + return response.data; + }, handleError); + + function handleError(resp) { + if (!ignoreRequestError) { + throw $templateRequestMinErr('tpload', 'Failed to load template: {0} (HTTP status: {1} {2})', + tpl, resp.status, resp.statusText); + } + return $q.reject(resp); + } + } + + handleRequestFn.totalPendingRequests = 0; + + return handleRequestFn; + }]; +} + +function $$TestabilityProvider() { + this.$get = ['$rootScope', '$browser', '$location', + function($rootScope, $browser, $location) { + + /** + * @name $testability + * + * @description + * The private $$testability service provides a collection of methods for use when debugging + * or by automated test and debugging tools. + */ + var testability = {}; + + /** + * @name $$testability#findBindings + * + * @description + * Returns an array of elements that are bound (via ng-bind or {{}}) + * to expressions matching the input. + * + * @param {Element} element The element root to search from. + * @param {string} expression The binding expression to match. + * @param {boolean} opt_exactMatch If true, only returns exact matches + * for the expression. Filters and whitespace are ignored. + */ + testability.findBindings = function(element, expression, opt_exactMatch) { + var bindings = element.getElementsByClassName('ng-binding'); + var matches = []; + forEach(bindings, function(binding) { + var dataBinding = angular.element(binding).data('$binding'); + if (dataBinding) { + forEach(dataBinding, function(bindingName) { + if (opt_exactMatch) { + var matcher = new RegExp('(^|\\s)' + escapeForRegexp(expression) + '(\\s|\\||$)'); + if (matcher.test(bindingName)) { + matches.push(binding); + } + } else { + if (bindingName.indexOf(expression) != -1) { + matches.push(binding); + } + } + }); + } + }); + return matches; + }; + + /** + * @name $$testability#findModels + * + * @description + * Returns an array of elements that are two-way found via ng-model to + * expressions matching the input. + * + * @param {Element} element The element root to search from. + * @param {string} expression The model expression to match. + * @param {boolean} opt_exactMatch If true, only returns exact matches + * for the expression. + */ + testability.findModels = function(element, expression, opt_exactMatch) { + var prefixes = ['ng-', 'data-ng-', 'ng\\:']; + for (var p = 0; p < prefixes.length; ++p) { + var attributeEquals = opt_exactMatch ? '=' : '*='; + var selector = '[' + prefixes[p] + 'model' + attributeEquals + '"' + expression + '"]'; + var elements = element.querySelectorAll(selector); + if (elements.length) { + return elements; + } + } + }; + + /** + * @name $$testability#getLocation + * + * @description + * Shortcut for getting the location in a browser agnostic way. Returns + * the path, search, and hash. (e.g. /path?a=b#hash) + */ + testability.getLocation = function() { + return $location.url(); + }; + + /** + * @name $$testability#setLocation + * + * @description + * Shortcut for navigating to a location without doing a full page reload. + * + * @param {string} url The location url (path, search and hash, + * e.g. /path?a=b#hash) to go to. + */ + testability.setLocation = function(url) { + if (url !== $location.url()) { + $location.url(url); + $rootScope.$digest(); + } + }; + + /** + * @name $$testability#whenStable + * + * @description + * Calls the callback when $timeout and $http requests are completed. + * + * @param {function} callback + */ + testability.whenStable = function(callback) { + $browser.notifyWhenNoOutstandingRequests(callback); + }; + + return testability; + }]; +} + +function $TimeoutProvider() { + this.$get = ['$rootScope', '$browser', '$q', '$$q', '$exceptionHandler', + function($rootScope, $browser, $q, $$q, $exceptionHandler) { + + var deferreds = {}; + + + /** + * @ngdoc service + * @name $timeout + * + * @description + * Angular's wrapper for `window.setTimeout`. The `fn` function is wrapped into a try/catch + * block and delegates any exceptions to + * {@link ng.$exceptionHandler $exceptionHandler} service. + * + * The return value of calling `$timeout` is a promise, which will be resolved when + * the delay has passed and the timeout function, if provided, is executed. + * + * To cancel a timeout request, call `$timeout.cancel(promise)`. + * + * In tests you can use {@link ngMock.$timeout `$timeout.flush()`} to + * synchronously flush the queue of deferred functions. + * + * If you only want a promise that will be resolved after some specified delay + * then you can call `$timeout` without the `fn` function. + * + * @param {function()=} fn A function, whose execution should be delayed. + * @param {number=} [delay=0] Delay in milliseconds. + * @param {boolean=} [invokeApply=true] If set to `false` skips model dirty checking, otherwise + * will invoke `fn` within the {@link ng.$rootScope.Scope#$apply $apply} block. + * @param {...*=} Pass additional parameters to the executed function. + * @returns {Promise} Promise that will be resolved when the timeout is reached. The promise + * will be resolved with the return value of the `fn` function. + * + */ + function timeout(fn, delay, invokeApply) { + if (!isFunction(fn)) { + invokeApply = delay; + delay = fn; + fn = noop; + } + + var args = sliceArgs(arguments, 3), + skipApply = (isDefined(invokeApply) && !invokeApply), + deferred = (skipApply ? $$q : $q).defer(), + promise = deferred.promise, + timeoutId; + + timeoutId = $browser.defer(function() { + try { + deferred.resolve(fn.apply(null, args)); + } catch (e) { + deferred.reject(e); + $exceptionHandler(e); + } + finally { + delete deferreds[promise.$$timeoutId]; + } + + if (!skipApply) $rootScope.$apply(); + }, delay); + + promise.$$timeoutId = timeoutId; + deferreds[timeoutId] = deferred; + + return promise; + } + + + /** + * @ngdoc method + * @name $timeout#cancel + * + * @description + * Cancels a task associated with the `promise`. As a result of this, the promise will be + * resolved with a rejection. + * + * @param {Promise=} promise Promise returned by the `$timeout` function. + * @returns {boolean} Returns `true` if the task hasn't executed yet and was successfully + * canceled. + */ + timeout.cancel = function(promise) { + if (promise && promise.$$timeoutId in deferreds) { + deferreds[promise.$$timeoutId].reject('canceled'); + delete deferreds[promise.$$timeoutId]; + return $browser.defer.cancel(promise.$$timeoutId); + } + return false; + }; + + return timeout; + }]; +} + +// NOTE: The usage of window and document instead of $window and $document here is +// deliberate. This service depends on the specific behavior of anchor nodes created by the +// browser (resolving and parsing URLs) that is unlikely to be provided by mock objects and +// cause us to break tests. In addition, when the browser resolves a URL for XHR, it +// doesn't know about mocked locations and resolves URLs to the real document - which is +// exactly the behavior needed here. There is little value is mocking these out for this +// service. +var urlParsingNode = document.createElement("a"); +var originUrl = urlResolve(window.location.href); + + +/** + * + * Implementation Notes for non-IE browsers + * ---------------------------------------- + * Assigning a URL to the href property of an anchor DOM node, even one attached to the DOM, + * results both in the normalizing and parsing of the URL. Normalizing means that a relative + * URL will be resolved into an absolute URL in the context of the application document. + * Parsing means that the anchor node's host, hostname, protocol, port, pathname and related + * properties are all populated to reflect the normalized URL. This approach has wide + * compatibility - Safari 1+, Mozilla 1+, Opera 7+,e etc. See + * http://www.aptana.com/reference/html/api/HTMLAnchorElement.html + * + * Implementation Notes for IE + * --------------------------- + * IE <= 10 normalizes the URL when assigned to the anchor node similar to the other + * browsers. However, the parsed components will not be set if the URL assigned did not specify + * them. (e.g. if you assign a.href = "foo", then a.protocol, a.host, etc. will be empty.) We + * work around that by performing the parsing in a 2nd step by taking a previously normalized + * URL (e.g. by assigning to a.href) and assigning it a.href again. This correctly populates the + * properties such as protocol, hostname, port, etc. + * + * References: + * http://developer.mozilla.org/en-US/docs/Web/API/HTMLAnchorElement + * http://www.aptana.com/reference/html/api/HTMLAnchorElement.html + * http://url.spec.whatwg.org/#urlutils + * https://github.com/angular/angular.js/pull/2902 + * http://james.padolsey.com/javascript/parsing-urls-with-the-dom/ + * + * @kind function + * @param {string} url The URL to be parsed. + * @description Normalizes and parses a URL. + * @returns {object} Returns the normalized URL as a dictionary. + * + * | member name | Description | + * |---------------|----------------| + * | href | A normalized version of the provided URL if it was not an absolute URL | + * | protocol | The protocol including the trailing colon | + * | host | The host and port (if the port is non-default) of the normalizedUrl | + * | search | The search params, minus the question mark | + * | hash | The hash string, minus the hash symbol + * | hostname | The hostname + * | port | The port, without ":" + * | pathname | The pathname, beginning with "/" + * + */ +function urlResolve(url) { + var href = url; + + if (msie) { + // Normalize before parse. Refer Implementation Notes on why this is + // done in two steps on IE. + urlParsingNode.setAttribute("href", href); + href = urlParsingNode.href; + } + + urlParsingNode.setAttribute('href', href); + + // urlParsingNode provides the UrlUtils interface - http://url.spec.whatwg.org/#urlutils + return { + href: urlParsingNode.href, + protocol: urlParsingNode.protocol ? urlParsingNode.protocol.replace(/:$/, '') : '', + host: urlParsingNode.host, + search: urlParsingNode.search ? urlParsingNode.search.replace(/^\?/, '') : '', + hash: urlParsingNode.hash ? urlParsingNode.hash.replace(/^#/, '') : '', + hostname: urlParsingNode.hostname, + port: urlParsingNode.port, + pathname: (urlParsingNode.pathname.charAt(0) === '/') + ? urlParsingNode.pathname + : '/' + urlParsingNode.pathname + }; +} + +/** + * Parse a request URL and determine whether this is a same-origin request as the application document. + * + * @param {string|object} requestUrl The url of the request as a string that will be resolved + * or a parsed URL object. + * @returns {boolean} Whether the request is for the same origin as the application document. + */ +function urlIsSameOrigin(requestUrl) { + var parsed = (isString(requestUrl)) ? urlResolve(requestUrl) : requestUrl; + return (parsed.protocol === originUrl.protocol && + parsed.host === originUrl.host); +} + +/** + * @ngdoc service + * @name $window + * + * @description + * A reference to the browser's `window` object. While `window` + * is globally available in JavaScript, it causes testability problems, because + * it is a global variable. In angular we always refer to it through the + * `$window` service, so it may be overridden, removed or mocked for testing. + * + * Expressions, like the one defined for the `ngClick` directive in the example + * below, are evaluated with respect to the current scope. Therefore, there is + * no risk of inadvertently coding in a dependency on a global value in such an + * expression. + * + * @example + + + +
+ + +
+
+ + it('should display the greeting in the input box', function() { + element(by.model('greeting')).sendKeys('Hello, E2E Tests'); + // If we click the button it will block the test runner + // element(':button').click(); + }); + +
+ */ +function $WindowProvider() { + this.$get = valueFn(window); +} + +/** + * @name $$cookieReader + * @requires $document + * + * @description + * This is a private service for reading cookies used by $http and ngCookies + * + * @return {Object} a key/value map of the current cookies + */ +function $$CookieReader($document) { + var rawDocument = $document[0] || {}; + var lastCookies = {}; + var lastCookieString = ''; + + function safeDecodeURIComponent(str) { + try { + return decodeURIComponent(str); + } catch (e) { + return str; + } + } + + return function() { + var cookieArray, cookie, i, index, name; + var currentCookieString = rawDocument.cookie || ''; + + if (currentCookieString !== lastCookieString) { + lastCookieString = currentCookieString; + cookieArray = lastCookieString.split('; '); + lastCookies = {}; + + for (i = 0; i < cookieArray.length; i++) { + cookie = cookieArray[i]; + index = cookie.indexOf('='); + if (index > 0) { //ignore nameless cookies + name = safeDecodeURIComponent(cookie.substring(0, index)); + // the first value that is seen for a cookie is the most + // specific one. values for the same cookie name that + // follow are for less specific paths. + if (isUndefined(lastCookies[name])) { + lastCookies[name] = safeDecodeURIComponent(cookie.substring(index + 1)); + } + } + } + } + return lastCookies; + }; +} + +$$CookieReader.$inject = ['$document']; + +function $$CookieReaderProvider() { + this.$get = $$CookieReader; +} + +/* global currencyFilter: true, + dateFilter: true, + filterFilter: true, + jsonFilter: true, + limitToFilter: true, + lowercaseFilter: true, + numberFilter: true, + orderByFilter: true, + uppercaseFilter: true, + */ + +/** + * @ngdoc provider + * @name $filterProvider + * @description + * + * Filters are just functions which transform input to an output. However filters need to be + * Dependency Injected. To achieve this a filter definition consists of a factory function which is + * annotated with dependencies and is responsible for creating a filter function. + * + *
+ * **Note:** Filter names must be valid angular {@link expression} identifiers, such as `uppercase` or `orderBy`. + * Names with special characters, such as hyphens and dots, are not allowed. If you wish to namespace + * your filters, then you can use capitalization (`myappSubsectionFilterx`) or underscores + * (`myapp_subsection_filterx`). + *
+ * + * ```js + * // Filter registration + * function MyModule($provide, $filterProvider) { + * // create a service to demonstrate injection (not always needed) + * $provide.value('greet', function(name){ + * return 'Hello ' + name + '!'; + * }); + * + * // register a filter factory which uses the + * // greet service to demonstrate DI. + * $filterProvider.register('greet', function(greet){ + * // return the filter function which uses the greet service + * // to generate salutation + * return function(text) { + * // filters need to be forgiving so check input validity + * return text && greet(text) || text; + * }; + * }); + * } + * ``` + * + * The filter function is registered with the `$injector` under the filter name suffix with + * `Filter`. + * + * ```js + * it('should be the same instance', inject( + * function($filterProvider) { + * $filterProvider.register('reverse', function(){ + * return ...; + * }); + * }, + * function($filter, reverseFilter) { + * expect($filter('reverse')).toBe(reverseFilter); + * }); + * ``` + * + * + * For more information about how angular filters work, and how to create your own filters, see + * {@link guide/filter Filters} in the Angular Developer Guide. + */ + +/** + * @ngdoc service + * @name $filter + * @kind function + * @description + * Filters are used for formatting data displayed to the user. + * + * The general syntax in templates is as follows: + * + * {{ expression [| filter_name[:parameter_value] ... ] }} + * + * @param {String} name Name of the filter function to retrieve + * @return {Function} the filter function + * @example + + +
+

{{ originalText }}

+

{{ filteredText }}

+
+
+ + + angular.module('filterExample', []) + .controller('MainCtrl', function($scope, $filter) { + $scope.originalText = 'hello'; + $scope.filteredText = $filter('uppercase')($scope.originalText); + }); + +
+ */ +$FilterProvider.$inject = ['$provide']; +function $FilterProvider($provide) { + var suffix = 'Filter'; + + /** + * @ngdoc method + * @name $filterProvider#register + * @param {string|Object} name Name of the filter function, or an object map of filters where + * the keys are the filter names and the values are the filter factories. + * + *
+ * **Note:** Filter names must be valid angular {@link expression} identifiers, such as `uppercase` or `orderBy`. + * Names with special characters, such as hyphens and dots, are not allowed. If you wish to namespace + * your filters, then you can use capitalization (`myappSubsectionFilterx`) or underscores + * (`myapp_subsection_filterx`). + *
+ * @param {Function} factory If the first argument was a string, a factory function for the filter to be registered. + * @returns {Object} Registered filter instance, or if a map of filters was provided then a map + * of the registered filter instances. + */ + function register(name, factory) { + if (isObject(name)) { + var filters = {}; + forEach(name, function(filter, key) { + filters[key] = register(key, filter); + }); + return filters; + } else { + return $provide.factory(name + suffix, factory); + } + } + this.register = register; + + this.$get = ['$injector', function($injector) { + return function(name) { + return $injector.get(name + suffix); + }; + }]; + + //////////////////////////////////////// + + /* global + currencyFilter: false, + dateFilter: false, + filterFilter: false, + jsonFilter: false, + limitToFilter: false, + lowercaseFilter: false, + numberFilter: false, + orderByFilter: false, + uppercaseFilter: false, + */ + + register('currency', currencyFilter); + register('date', dateFilter); + register('filter', filterFilter); + register('json', jsonFilter); + register('limitTo', limitToFilter); + register('lowercase', lowercaseFilter); + register('number', numberFilter); + register('orderBy', orderByFilter); + register('uppercase', uppercaseFilter); +} + +/** + * @ngdoc filter + * @name filter + * @kind function + * + * @description + * Selects a subset of items from `array` and returns it as a new array. + * + * @param {Array} array The source array. + * @param {string|Object|function()} expression The predicate to be used for selecting items from + * `array`. + * + * Can be one of: + * + * - `string`: The string is used for matching against the contents of the `array`. All strings or + * objects with string properties in `array` that match this string will be returned. This also + * applies to nested object properties. + * The predicate can be negated by prefixing the string with `!`. + * + * - `Object`: A pattern object can be used to filter specific properties on objects contained + * by `array`. For example `{name:"M", phone:"1"}` predicate will return an array of items + * which have property `name` containing "M" and property `phone` containing "1". A special + * property name `$` can be used (as in `{$:"text"}`) to accept a match against any + * property of the object or its nested object properties. That's equivalent to the simple + * substring match with a `string` as described above. The predicate can be negated by prefixing + * the string with `!`. + * For example `{name: "!M"}` predicate will return an array of items which have property `name` + * not containing "M". + * + * Note that a named property will match properties on the same level only, while the special + * `$` property will match properties on the same level or deeper. E.g. an array item like + * `{name: {first: 'John', last: 'Doe'}}` will **not** be matched by `{name: 'John'}`, but + * **will** be matched by `{$: 'John'}`. + * + * - `function(value, index, array)`: A predicate function can be used to write arbitrary filters. + * The function is called for each element of the array, with the element, its index, and + * the entire array itself as arguments. + * + * The final result is an array of those elements that the predicate returned true for. + * + * @param {function(actual, expected)|true|undefined} comparator Comparator which is used in + * determining if the expected value (from the filter expression) and actual value (from + * the object in the array) should be considered a match. + * + * Can be one of: + * + * - `function(actual, expected)`: + * The function will be given the object value and the predicate value to compare and + * should return true if both values should be considered equal. + * + * - `true`: A shorthand for `function(actual, expected) { return angular.equals(actual, expected)}`. + * This is essentially strict comparison of expected and actual. + * + * - `false|undefined`: A short hand for a function which will look for a substring match in case + * insensitive way. + * + * Primitive values are converted to strings. Objects are not compared against primitives, + * unless they have a custom `toString` method (e.g. `Date` objects). + * + * @example + + +
+ + + + + + + + +
NamePhone
{{friend.name}}{{friend.phone}}
+
+
+
+
+
+ + + + + + +
NamePhone
{{friendObj.name}}{{friendObj.phone}}
+
+ + var expectFriendNames = function(expectedNames, key) { + element.all(by.repeater(key + ' in friends').column(key + '.name')).then(function(arr) { + arr.forEach(function(wd, i) { + expect(wd.getText()).toMatch(expectedNames[i]); + }); + }); + }; + + it('should search across all fields when filtering with a string', function() { + var searchText = element(by.model('searchText')); + searchText.clear(); + searchText.sendKeys('m'); + expectFriendNames(['Mary', 'Mike', 'Adam'], 'friend'); + + searchText.clear(); + searchText.sendKeys('76'); + expectFriendNames(['John', 'Julie'], 'friend'); + }); + + it('should search in specific fields when filtering with a predicate object', function() { + var searchAny = element(by.model('search.$')); + searchAny.clear(); + searchAny.sendKeys('i'); + expectFriendNames(['Mary', 'Mike', 'Julie', 'Juliette'], 'friendObj'); + }); + it('should use a equal comparison when comparator is true', function() { + var searchName = element(by.model('search.name')); + var strict = element(by.model('strict')); + searchName.clear(); + searchName.sendKeys('Julie'); + strict.click(); + expectFriendNames(['Julie'], 'friendObj'); + }); + +
+ */ +function filterFilter() { + return function(array, expression, comparator) { + if (!isArrayLike(array)) { + if (array == null) { + return array; + } else { + throw minErr('filter')('notarray', 'Expected array but received: {0}', array); + } + } + + var expressionType = getTypeForFilter(expression); + var predicateFn; + var matchAgainstAnyProp; + + switch (expressionType) { + case 'function': + predicateFn = expression; + break; + case 'boolean': + case 'null': + case 'number': + case 'string': + matchAgainstAnyProp = true; + //jshint -W086 + case 'object': + //jshint +W086 + predicateFn = createPredicateFn(expression, comparator, matchAgainstAnyProp); + break; + default: + return array; + } + + return Array.prototype.filter.call(array, predicateFn); + }; +} + +// Helper functions for `filterFilter` +function createPredicateFn(expression, comparator, matchAgainstAnyProp) { + var shouldMatchPrimitives = isObject(expression) && ('$' in expression); + var predicateFn; + + if (comparator === true) { + comparator = equals; + } else if (!isFunction(comparator)) { + comparator = function(actual, expected) { + if (isUndefined(actual)) { + // No substring matching against `undefined` + return false; + } + if ((actual === null) || (expected === null)) { + // No substring matching against `null`; only match against `null` + return actual === expected; + } + if (isObject(expected) || (isObject(actual) && !hasCustomToString(actual))) { + // Should not compare primitives against objects, unless they have custom `toString` method + return false; + } + + actual = lowercase('' + actual); + expected = lowercase('' + expected); + return actual.indexOf(expected) !== -1; + }; + } + + predicateFn = function(item) { + if (shouldMatchPrimitives && !isObject(item)) { + return deepCompare(item, expression.$, comparator, false); + } + return deepCompare(item, expression, comparator, matchAgainstAnyProp); + }; + + return predicateFn; +} + +function deepCompare(actual, expected, comparator, matchAgainstAnyProp, dontMatchWholeObject) { + var actualType = getTypeForFilter(actual); + var expectedType = getTypeForFilter(expected); + + if ((expectedType === 'string') && (expected.charAt(0) === '!')) { + return !deepCompare(actual, expected.substring(1), comparator, matchAgainstAnyProp); + } else if (isArray(actual)) { + // In case `actual` is an array, consider it a match + // if ANY of it's items matches `expected` + return actual.some(function(item) { + return deepCompare(item, expected, comparator, matchAgainstAnyProp); + }); + } + + switch (actualType) { + case 'object': + var key; + if (matchAgainstAnyProp) { + for (key in actual) { + if ((key.charAt(0) !== '$') && deepCompare(actual[key], expected, comparator, true)) { + return true; + } + } + return dontMatchWholeObject ? false : deepCompare(actual, expected, comparator, false); + } else if (expectedType === 'object') { + for (key in expected) { + var expectedVal = expected[key]; + if (isFunction(expectedVal) || isUndefined(expectedVal)) { + continue; + } + + var matchAnyProperty = key === '$'; + var actualVal = matchAnyProperty ? actual : actual[key]; + if (!deepCompare(actualVal, expectedVal, comparator, matchAnyProperty, matchAnyProperty)) { + return false; + } + } + return true; + } else { + return comparator(actual, expected); + } + break; + case 'function': + return false; + default: + return comparator(actual, expected); + } +} + +// Used for easily differentiating between `null` and actual `object` +function getTypeForFilter(val) { + return (val === null) ? 'null' : typeof val; +} + +var MAX_DIGITS = 22; +var DECIMAL_SEP = '.'; +var ZERO_CHAR = '0'; + +/** + * @ngdoc filter + * @name currency + * @kind function + * + * @description + * Formats a number as a currency (ie $1,234.56). When no currency symbol is provided, default + * symbol for current locale is used. + * + * @param {number} amount Input to filter. + * @param {string=} symbol Currency symbol or identifier to be displayed. + * @param {number=} fractionSize Number of decimal places to round the amount to, defaults to default max fraction size for current locale + * @returns {string} Formatted number. + * + * + * @example + + + +
+
+ default currency symbol ($): {{amount | currency}}
+ custom currency identifier (USD$): {{amount | currency:"USD$"}} + no fractions (0): {{amount | currency:"USD$":0}} +
+
+ + it('should init with 1234.56', function() { + expect(element(by.id('currency-default')).getText()).toBe('$1,234.56'); + expect(element(by.id('currency-custom')).getText()).toBe('USD$1,234.56'); + expect(element(by.id('currency-no-fractions')).getText()).toBe('USD$1,235'); + }); + it('should update', function() { + if (browser.params.browser == 'safari') { + // Safari does not understand the minus key. See + // https://github.com/angular/protractor/issues/481 + return; + } + element(by.model('amount')).clear(); + element(by.model('amount')).sendKeys('-1234'); + expect(element(by.id('currency-default')).getText()).toBe('-$1,234.00'); + expect(element(by.id('currency-custom')).getText()).toBe('-USD$1,234.00'); + expect(element(by.id('currency-no-fractions')).getText()).toBe('-USD$1,234'); + }); + +
+ */ +currencyFilter.$inject = ['$locale']; +function currencyFilter($locale) { + var formats = $locale.NUMBER_FORMATS; + return function(amount, currencySymbol, fractionSize) { + if (isUndefined(currencySymbol)) { + currencySymbol = formats.CURRENCY_SYM; + } + + if (isUndefined(fractionSize)) { + fractionSize = formats.PATTERNS[1].maxFrac; + } + + // if null or undefined pass it through + return (amount == null) + ? amount + : formatNumber(amount, formats.PATTERNS[1], formats.GROUP_SEP, formats.DECIMAL_SEP, fractionSize). + replace(/\u00A4/g, currencySymbol); + }; +} + +/** + * @ngdoc filter + * @name number + * @kind function + * + * @description + * Formats a number as text. + * + * If the input is null or undefined, it will just be returned. + * If the input is infinite (Infinity or -Infinity), the Infinity symbol '∞' or '-∞' is returned, respectively. + * If the input is not a number an empty string is returned. + * + * + * @param {number|string} number Number to format. + * @param {(number|string)=} fractionSize Number of decimal places to round the number to. + * If this is not provided then the fraction size is computed from the current locale's number + * formatting pattern. In the case of the default locale, it will be 3. + * @returns {string} Number rounded to fractionSize and places a “,” after each third digit. + * + * @example + + + +
+
+ Default formatting: {{val | number}}
+ No fractions: {{val | number:0}}
+ Negative number: {{-val | number:4}} +
+
+ + it('should format numbers', function() { + expect(element(by.id('number-default')).getText()).toBe('1,234.568'); + expect(element(by.binding('val | number:0')).getText()).toBe('1,235'); + expect(element(by.binding('-val | number:4')).getText()).toBe('-1,234.5679'); + }); + + it('should update', function() { + element(by.model('val')).clear(); + element(by.model('val')).sendKeys('3374.333'); + expect(element(by.id('number-default')).getText()).toBe('3,374.333'); + expect(element(by.binding('val | number:0')).getText()).toBe('3,374'); + expect(element(by.binding('-val | number:4')).getText()).toBe('-3,374.3330'); + }); + +
+ */ +numberFilter.$inject = ['$locale']; +function numberFilter($locale) { + var formats = $locale.NUMBER_FORMATS; + return function(number, fractionSize) { + + // if null or undefined pass it through + return (number == null) + ? number + : formatNumber(number, formats.PATTERNS[0], formats.GROUP_SEP, formats.DECIMAL_SEP, + fractionSize); + }; +} + +/** + * Parse a number (as a string) into three components that can be used + * for formatting the number. + * + * (Significant bits of this parse algorithm came from https://github.com/MikeMcl/big.js/) + * + * @param {string} numStr The number to parse + * @return {object} An object describing this number, containing the following keys: + * - d : an array of digits containing leading zeros as necessary + * - i : the number of the digits in `d` that are to the left of the decimal point + * - e : the exponent for numbers that would need more than `MAX_DIGITS` digits in `d` + * + */ +function parse(numStr) { + var exponent = 0, digits, numberOfIntegerDigits; + var i, j, zeros; + + // Decimal point? + if ((numberOfIntegerDigits = numStr.indexOf(DECIMAL_SEP)) > -1) { + numStr = numStr.replace(DECIMAL_SEP, ''); + } + + // Exponential form? + if ((i = numStr.search(/e/i)) > 0) { + // Work out the exponent. + if (numberOfIntegerDigits < 0) numberOfIntegerDigits = i; + numberOfIntegerDigits += +numStr.slice(i + 1); + numStr = numStr.substring(0, i); + } else if (numberOfIntegerDigits < 0) { + // There was no decimal point or exponent so it is an integer. + numberOfIntegerDigits = numStr.length; + } + + // Count the number of leading zeros. + for (i = 0; numStr.charAt(i) == ZERO_CHAR; i++) {/* jshint noempty: false */} + + if (i == (zeros = numStr.length)) { + // The digits are all zero. + digits = [0]; + numberOfIntegerDigits = 1; + } else { + // Count the number of trailing zeros + zeros--; + while (numStr.charAt(zeros) == ZERO_CHAR) zeros--; + + // Trailing zeros are insignificant so ignore them + numberOfIntegerDigits -= i; + digits = []; + // Convert string to array of digits without leading/trailing zeros. + for (j = 0; i <= zeros; i++, j++) { + digits[j] = +numStr.charAt(i); + } + } + + // If the number overflows the maximum allowed digits then use an exponent. + if (numberOfIntegerDigits > MAX_DIGITS) { + digits = digits.splice(0, MAX_DIGITS - 1); + exponent = numberOfIntegerDigits - 1; + numberOfIntegerDigits = 1; + } + + return { d: digits, e: exponent, i: numberOfIntegerDigits }; +} + +/** + * Round the parsed number to the specified number of decimal places + * This function changed the parsedNumber in-place + */ +function roundNumber(parsedNumber, fractionSize, minFrac, maxFrac) { + var digits = parsedNumber.d; + var fractionLen = digits.length - parsedNumber.i; + + // determine fractionSize if it is not specified; `+fractionSize` converts it to a number + fractionSize = (isUndefined(fractionSize)) ? Math.min(Math.max(minFrac, fractionLen), maxFrac) : +fractionSize; + + // The index of the digit to where rounding is to occur + var roundAt = fractionSize + parsedNumber.i; + var digit = digits[roundAt]; + + if (roundAt > 0) { + // Drop fractional digits beyond `roundAt` + digits.splice(Math.max(parsedNumber.i, roundAt)); + + // Set non-fractional digits beyond `roundAt` to 0 + for (var j = roundAt; j < digits.length; j++) { + digits[j] = 0; + } + } else { + // We rounded to zero so reset the parsedNumber + fractionLen = Math.max(0, fractionLen); + parsedNumber.i = 1; + digits.length = Math.max(1, roundAt = fractionSize + 1); + digits[0] = 0; + for (var i = 1; i < roundAt; i++) digits[i] = 0; + } + + if (digit >= 5) { + if (roundAt - 1 < 0) { + for (var k = 0; k > roundAt; k--) { + digits.unshift(0); + parsedNumber.i++; + } + digits.unshift(1); + parsedNumber.i++; + } else { + digits[roundAt - 1]++; + } + } + + // Pad out with zeros to get the required fraction length + for (; fractionLen < Math.max(0, fractionSize); fractionLen++) digits.push(0); + + + // Do any carrying, e.g. a digit was rounded up to 10 + var carry = digits.reduceRight(function(carry, d, i, digits) { + d = d + carry; + digits[i] = d % 10; + return Math.floor(d / 10); + }, 0); + if (carry) { + digits.unshift(carry); + parsedNumber.i++; + } +} + +/** + * Format a number into a string + * @param {number} number The number to format + * @param {{ + * minFrac, // the minimum number of digits required in the fraction part of the number + * maxFrac, // the maximum number of digits required in the fraction part of the number + * gSize, // number of digits in each group of separated digits + * lgSize, // number of digits in the last group of digits before the decimal separator + * negPre, // the string to go in front of a negative number (e.g. `-` or `(`)) + * posPre, // the string to go in front of a positive number + * negSuf, // the string to go after a negative number (e.g. `)`) + * posSuf // the string to go after a positive number + * }} pattern + * @param {string} groupSep The string to separate groups of number (e.g. `,`) + * @param {string} decimalSep The string to act as the decimal separator (e.g. `.`) + * @param {[type]} fractionSize The size of the fractional part of the number + * @return {string} The number formatted as a string + */ +function formatNumber(number, pattern, groupSep, decimalSep, fractionSize) { + + if (!(isString(number) || isNumber(number)) || isNaN(number)) return ''; + + var isInfinity = !isFinite(number); + var isZero = false; + var numStr = Math.abs(number) + '', + formattedText = '', + parsedNumber; + + if (isInfinity) { + formattedText = '\u221e'; + } else { + parsedNumber = parse(numStr); + + roundNumber(parsedNumber, fractionSize, pattern.minFrac, pattern.maxFrac); + + var digits = parsedNumber.d; + var integerLen = parsedNumber.i; + var exponent = parsedNumber.e; + var decimals = []; + isZero = digits.reduce(function(isZero, d) { return isZero && !d; }, true); + + // pad zeros for small numbers + while (integerLen < 0) { + digits.unshift(0); + integerLen++; + } + + // extract decimals digits + if (integerLen > 0) { + decimals = digits.splice(integerLen); + } else { + decimals = digits; + digits = [0]; + } + + // format the integer digits with grouping separators + var groups = []; + if (digits.length >= pattern.lgSize) { + groups.unshift(digits.splice(-pattern.lgSize).join('')); + } + while (digits.length > pattern.gSize) { + groups.unshift(digits.splice(-pattern.gSize).join('')); + } + if (digits.length) { + groups.unshift(digits.join('')); + } + formattedText = groups.join(groupSep); + + // append the decimal digits + if (decimals.length) { + formattedText += decimalSep + decimals.join(''); + } + + if (exponent) { + formattedText += 'e+' + exponent; + } + } + if (number < 0 && !isZero) { + return pattern.negPre + formattedText + pattern.negSuf; + } else { + return pattern.posPre + formattedText + pattern.posSuf; + } +} + +function padNumber(num, digits, trim, negWrap) { + var neg = ''; + if (num < 0 || (negWrap && num <= 0)) { + if (negWrap) { + num = -num + 1; + } else { + num = -num; + neg = '-'; + } + } + num = '' + num; + while (num.length < digits) num = ZERO_CHAR + num; + if (trim) { + num = num.substr(num.length - digits); + } + return neg + num; +} + + +function dateGetter(name, size, offset, trim, negWrap) { + offset = offset || 0; + return function(date) { + var value = date['get' + name](); + if (offset > 0 || value > -offset) { + value += offset; + } + if (value === 0 && offset == -12) value = 12; + return padNumber(value, size, trim, negWrap); + }; +} + +function dateStrGetter(name, shortForm, standAlone) { + return function(date, formats) { + var value = date['get' + name](); + var propPrefix = (standAlone ? 'STANDALONE' : '') + (shortForm ? 'SHORT' : ''); + var get = uppercase(propPrefix + name); + + return formats[get][value]; + }; +} + +function timeZoneGetter(date, formats, offset) { + var zone = -1 * offset; + var paddedZone = (zone >= 0) ? "+" : ""; + + paddedZone += padNumber(Math[zone > 0 ? 'floor' : 'ceil'](zone / 60), 2) + + padNumber(Math.abs(zone % 60), 2); + + return paddedZone; +} + +function getFirstThursdayOfYear(year) { + // 0 = index of January + var dayOfWeekOnFirst = (new Date(year, 0, 1)).getDay(); + // 4 = index of Thursday (+1 to account for 1st = 5) + // 11 = index of *next* Thursday (+1 account for 1st = 12) + return new Date(year, 0, ((dayOfWeekOnFirst <= 4) ? 5 : 12) - dayOfWeekOnFirst); +} + +function getThursdayThisWeek(datetime) { + return new Date(datetime.getFullYear(), datetime.getMonth(), + // 4 = index of Thursday + datetime.getDate() + (4 - datetime.getDay())); +} + +function weekGetter(size) { + return function(date) { + var firstThurs = getFirstThursdayOfYear(date.getFullYear()), + thisThurs = getThursdayThisWeek(date); + + var diff = +thisThurs - +firstThurs, + result = 1 + Math.round(diff / 6.048e8); // 6.048e8 ms per week + + return padNumber(result, size); + }; +} + +function ampmGetter(date, formats) { + return date.getHours() < 12 ? formats.AMPMS[0] : formats.AMPMS[1]; +} + +function eraGetter(date, formats) { + return date.getFullYear() <= 0 ? formats.ERAS[0] : formats.ERAS[1]; +} + +function longEraGetter(date, formats) { + return date.getFullYear() <= 0 ? formats.ERANAMES[0] : formats.ERANAMES[1]; +} + +var DATE_FORMATS = { + yyyy: dateGetter('FullYear', 4, 0, false, true), + yy: dateGetter('FullYear', 2, 0, true, true), + y: dateGetter('FullYear', 1, 0, false, true), + MMMM: dateStrGetter('Month'), + MMM: dateStrGetter('Month', true), + MM: dateGetter('Month', 2, 1), + M: dateGetter('Month', 1, 1), + LLLL: dateStrGetter('Month', false, true), + dd: dateGetter('Date', 2), + d: dateGetter('Date', 1), + HH: dateGetter('Hours', 2), + H: dateGetter('Hours', 1), + hh: dateGetter('Hours', 2, -12), + h: dateGetter('Hours', 1, -12), + mm: dateGetter('Minutes', 2), + m: dateGetter('Minutes', 1), + ss: dateGetter('Seconds', 2), + s: dateGetter('Seconds', 1), + // while ISO 8601 requires fractions to be prefixed with `.` or `,` + // we can be just safely rely on using `sss` since we currently don't support single or two digit fractions + sss: dateGetter('Milliseconds', 3), + EEEE: dateStrGetter('Day'), + EEE: dateStrGetter('Day', true), + a: ampmGetter, + Z: timeZoneGetter, + ww: weekGetter(2), + w: weekGetter(1), + G: eraGetter, + GG: eraGetter, + GGG: eraGetter, + GGGG: longEraGetter +}; + +var DATE_FORMATS_SPLIT = /((?:[^yMLdHhmsaZEwG']+)|(?:'(?:[^']|'')*')|(?:E+|y+|M+|L+|d+|H+|h+|m+|s+|a|Z|G+|w+))(.*)/, + NUMBER_STRING = /^\-?\d+$/; + +/** + * @ngdoc filter + * @name date + * @kind function + * + * @description + * Formats `date` to a string based on the requested `format`. + * + * `format` string can be composed of the following elements: + * + * * `'yyyy'`: 4 digit representation of year (e.g. AD 1 => 0001, AD 2010 => 2010) + * * `'yy'`: 2 digit representation of year, padded (00-99). (e.g. AD 2001 => 01, AD 2010 => 10) + * * `'y'`: 1 digit representation of year, e.g. (AD 1 => 1, AD 199 => 199) + * * `'MMMM'`: Month in year (January-December) + * * `'MMM'`: Month in year (Jan-Dec) + * * `'MM'`: Month in year, padded (01-12) + * * `'M'`: Month in year (1-12) + * * `'LLLL'`: Stand-alone month in year (January-December) + * * `'dd'`: Day in month, padded (01-31) + * * `'d'`: Day in month (1-31) + * * `'EEEE'`: Day in Week,(Sunday-Saturday) + * * `'EEE'`: Day in Week, (Sun-Sat) + * * `'HH'`: Hour in day, padded (00-23) + * * `'H'`: Hour in day (0-23) + * * `'hh'`: Hour in AM/PM, padded (01-12) + * * `'h'`: Hour in AM/PM, (1-12) + * * `'mm'`: Minute in hour, padded (00-59) + * * `'m'`: Minute in hour (0-59) + * * `'ss'`: Second in minute, padded (00-59) + * * `'s'`: Second in minute (0-59) + * * `'sss'`: Millisecond in second, padded (000-999) + * * `'a'`: AM/PM marker + * * `'Z'`: 4 digit (+sign) representation of the timezone offset (-1200-+1200) + * * `'ww'`: Week of year, padded (00-53). Week 01 is the week with the first Thursday of the year + * * `'w'`: Week of year (0-53). Week 1 is the week with the first Thursday of the year + * * `'G'`, `'GG'`, `'GGG'`: The abbreviated form of the era string (e.g. 'AD') + * * `'GGGG'`: The long form of the era string (e.g. 'Anno Domini') + * + * `format` string can also be one of the following predefined + * {@link guide/i18n localizable formats}: + * + * * `'medium'`: equivalent to `'MMM d, y h:mm:ss a'` for en_US locale + * (e.g. Sep 3, 2010 12:05:08 PM) + * * `'short'`: equivalent to `'M/d/yy h:mm a'` for en_US locale (e.g. 9/3/10 12:05 PM) + * * `'fullDate'`: equivalent to `'EEEE, MMMM d, y'` for en_US locale + * (e.g. Friday, September 3, 2010) + * * `'longDate'`: equivalent to `'MMMM d, y'` for en_US locale (e.g. September 3, 2010) + * * `'mediumDate'`: equivalent to `'MMM d, y'` for en_US locale (e.g. Sep 3, 2010) + * * `'shortDate'`: equivalent to `'M/d/yy'` for en_US locale (e.g. 9/3/10) + * * `'mediumTime'`: equivalent to `'h:mm:ss a'` for en_US locale (e.g. 12:05:08 PM) + * * `'shortTime'`: equivalent to `'h:mm a'` for en_US locale (e.g. 12:05 PM) + * + * `format` string can contain literal values. These need to be escaped by surrounding with single quotes (e.g. + * `"h 'in the morning'"`). In order to output a single quote, escape it - i.e., two single quotes in a sequence + * (e.g. `"h 'o''clock'"`). + * + * @param {(Date|number|string)} date Date to format either as Date object, milliseconds (string or + * number) or various ISO 8601 datetime string formats (e.g. yyyy-MM-ddTHH:mm:ss.sssZ and its + * shorter versions like yyyy-MM-ddTHH:mmZ, yyyy-MM-dd or yyyyMMddTHHmmssZ). If no timezone is + * specified in the string input, the time is considered to be in the local timezone. + * @param {string=} format Formatting rules (see Description). If not specified, + * `mediumDate` is used. + * @param {string=} timezone Timezone to be used for formatting. It understands UTC/GMT and the + * continental US time zone abbreviations, but for general use, use a time zone offset, for + * example, `'+0430'` (4 hours, 30 minutes east of the Greenwich meridian) + * If not specified, the timezone of the browser will be used. + * @returns {string} Formatted string or the input if input is not recognized as date/millis. + * + * @example + + + {{1288323623006 | date:'medium'}}: + {{1288323623006 | date:'medium'}}
+ {{1288323623006 | date:'yyyy-MM-dd HH:mm:ss Z'}}: + {{1288323623006 | date:'yyyy-MM-dd HH:mm:ss Z'}}
+ {{1288323623006 | date:'MM/dd/yyyy @ h:mma'}}: + {{'1288323623006' | date:'MM/dd/yyyy @ h:mma'}}
+ {{1288323623006 | date:"MM/dd/yyyy 'at' h:mma"}}: + {{'1288323623006' | date:"MM/dd/yyyy 'at' h:mma"}}
+
+ + it('should format date', function() { + expect(element(by.binding("1288323623006 | date:'medium'")).getText()). + toMatch(/Oct 2\d, 2010 \d{1,2}:\d{2}:\d{2} (AM|PM)/); + expect(element(by.binding("1288323623006 | date:'yyyy-MM-dd HH:mm:ss Z'")).getText()). + toMatch(/2010\-10\-2\d \d{2}:\d{2}:\d{2} (\-|\+)?\d{4}/); + expect(element(by.binding("'1288323623006' | date:'MM/dd/yyyy @ h:mma'")).getText()). + toMatch(/10\/2\d\/2010 @ \d{1,2}:\d{2}(AM|PM)/); + expect(element(by.binding("'1288323623006' | date:\"MM/dd/yyyy 'at' h:mma\"")).getText()). + toMatch(/10\/2\d\/2010 at \d{1,2}:\d{2}(AM|PM)/); + }); + +
+ */ +dateFilter.$inject = ['$locale']; +function dateFilter($locale) { + + + var R_ISO8601_STR = /^(\d{4})-?(\d\d)-?(\d\d)(?:T(\d\d)(?::?(\d\d)(?::?(\d\d)(?:\.(\d+))?)?)?(Z|([+-])(\d\d):?(\d\d))?)?$/; + // 1 2 3 4 5 6 7 8 9 10 11 + function jsonStringToDate(string) { + var match; + if (match = string.match(R_ISO8601_STR)) { + var date = new Date(0), + tzHour = 0, + tzMin = 0, + dateSetter = match[8] ? date.setUTCFullYear : date.setFullYear, + timeSetter = match[8] ? date.setUTCHours : date.setHours; + + if (match[9]) { + tzHour = toInt(match[9] + match[10]); + tzMin = toInt(match[9] + match[11]); + } + dateSetter.call(date, toInt(match[1]), toInt(match[2]) - 1, toInt(match[3])); + var h = toInt(match[4] || 0) - tzHour; + var m = toInt(match[5] || 0) - tzMin; + var s = toInt(match[6] || 0); + var ms = Math.round(parseFloat('0.' + (match[7] || 0)) * 1000); + timeSetter.call(date, h, m, s, ms); + return date; + } + return string; + } + + + return function(date, format, timezone) { + var text = '', + parts = [], + fn, match; + + format = format || 'mediumDate'; + format = $locale.DATETIME_FORMATS[format] || format; + if (isString(date)) { + date = NUMBER_STRING.test(date) ? toInt(date) : jsonStringToDate(date); + } + + if (isNumber(date)) { + date = new Date(date); + } + + if (!isDate(date) || !isFinite(date.getTime())) { + return date; + } + + while (format) { + match = DATE_FORMATS_SPLIT.exec(format); + if (match) { + parts = concat(parts, match, 1); + format = parts.pop(); + } else { + parts.push(format); + format = null; + } + } + + var dateTimezoneOffset = date.getTimezoneOffset(); + if (timezone) { + dateTimezoneOffset = timezoneToOffset(timezone, dateTimezoneOffset); + date = convertTimezoneToLocal(date, timezone, true); + } + forEach(parts, function(value) { + fn = DATE_FORMATS[value]; + text += fn ? fn(date, $locale.DATETIME_FORMATS, dateTimezoneOffset) + : value === "''" ? "'" : value.replace(/(^'|'$)/g, '').replace(/''/g, "'"); + }); + + return text; + }; +} + + +/** + * @ngdoc filter + * @name json + * @kind function + * + * @description + * Allows you to convert a JavaScript object into JSON string. + * + * This filter is mostly useful for debugging. When using the double curly {{value}} notation + * the binding is automatically converted to JSON. + * + * @param {*} object Any JavaScript object (including arrays and primitive types) to filter. + * @param {number=} spacing The number of spaces to use per indentation, defaults to 2. + * @returns {string} JSON string. + * + * + * @example + + +
{{ {'name':'value'} | json }}
+
{{ {'name':'value'} | json:4 }}
+
+ + it('should jsonify filtered objects', function() { + expect(element(by.id('default-spacing')).getText()).toMatch(/\{\n "name": ?"value"\n}/); + expect(element(by.id('custom-spacing')).getText()).toMatch(/\{\n "name": ?"value"\n}/); + }); + +
+ * + */ +function jsonFilter() { + return function(object, spacing) { + if (isUndefined(spacing)) { + spacing = 2; + } + return toJson(object, spacing); + }; +} + + +/** + * @ngdoc filter + * @name lowercase + * @kind function + * @description + * Converts string to lowercase. + * @see angular.lowercase + */ +var lowercaseFilter = valueFn(lowercase); + + +/** + * @ngdoc filter + * @name uppercase + * @kind function + * @description + * Converts string to uppercase. + * @see angular.uppercase + */ +var uppercaseFilter = valueFn(uppercase); + +/** + * @ngdoc filter + * @name limitTo + * @kind function + * + * @description + * Creates a new array or string containing only a specified number of elements. The elements + * are taken from either the beginning or the end of the source array, string or number, as specified by + * the value and sign (positive or negative) of `limit`. If a number is used as input, it is + * converted to a string. + * + * @param {Array|string|number} input Source array, string or number to be limited. + * @param {string|number} limit The length of the returned array or string. If the `limit` number + * is positive, `limit` number of items from the beginning of the source array/string are copied. + * If the number is negative, `limit` number of items from the end of the source array/string + * are copied. The `limit` will be trimmed if it exceeds `array.length`. If `limit` is undefined, + * the input will be returned unchanged. + * @param {(string|number)=} begin Index at which to begin limitation. As a negative index, `begin` + * indicates an offset from the end of `input`. Defaults to `0`. + * @returns {Array|string} A new sub-array or substring of length `limit` or less if input array + * had less than `limit` elements. + * + * @example + + + +
+ +

Output numbers: {{ numbers | limitTo:numLimit }}

+ +

Output letters: {{ letters | limitTo:letterLimit }}

+ +

Output long number: {{ longNumber | limitTo:longNumberLimit }}

+
+
+ + var numLimitInput = element(by.model('numLimit')); + var letterLimitInput = element(by.model('letterLimit')); + var longNumberLimitInput = element(by.model('longNumberLimit')); + var limitedNumbers = element(by.binding('numbers | limitTo:numLimit')); + var limitedLetters = element(by.binding('letters | limitTo:letterLimit')); + var limitedLongNumber = element(by.binding('longNumber | limitTo:longNumberLimit')); + + it('should limit the number array to first three items', function() { + expect(numLimitInput.getAttribute('value')).toBe('3'); + expect(letterLimitInput.getAttribute('value')).toBe('3'); + expect(longNumberLimitInput.getAttribute('value')).toBe('3'); + expect(limitedNumbers.getText()).toEqual('Output numbers: [1,2,3]'); + expect(limitedLetters.getText()).toEqual('Output letters: abc'); + expect(limitedLongNumber.getText()).toEqual('Output long number: 234'); + }); + + // There is a bug in safari and protractor that doesn't like the minus key + // it('should update the output when -3 is entered', function() { + // numLimitInput.clear(); + // numLimitInput.sendKeys('-3'); + // letterLimitInput.clear(); + // letterLimitInput.sendKeys('-3'); + // longNumberLimitInput.clear(); + // longNumberLimitInput.sendKeys('-3'); + // expect(limitedNumbers.getText()).toEqual('Output numbers: [7,8,9]'); + // expect(limitedLetters.getText()).toEqual('Output letters: ghi'); + // expect(limitedLongNumber.getText()).toEqual('Output long number: 342'); + // }); + + it('should not exceed the maximum size of input array', function() { + numLimitInput.clear(); + numLimitInput.sendKeys('100'); + letterLimitInput.clear(); + letterLimitInput.sendKeys('100'); + longNumberLimitInput.clear(); + longNumberLimitInput.sendKeys('100'); + expect(limitedNumbers.getText()).toEqual('Output numbers: [1,2,3,4,5,6,7,8,9]'); + expect(limitedLetters.getText()).toEqual('Output letters: abcdefghi'); + expect(limitedLongNumber.getText()).toEqual('Output long number: 2345432342'); + }); + +
+*/ +function limitToFilter() { + return function(input, limit, begin) { + if (Math.abs(Number(limit)) === Infinity) { + limit = Number(limit); + } else { + limit = toInt(limit); + } + if (isNaN(limit)) return input; + + if (isNumber(input)) input = input.toString(); + if (!isArray(input) && !isString(input)) return input; + + begin = (!begin || isNaN(begin)) ? 0 : toInt(begin); + begin = (begin < 0) ? Math.max(0, input.length + begin) : begin; + + if (limit >= 0) { + return input.slice(begin, begin + limit); + } else { + if (begin === 0) { + return input.slice(limit, input.length); + } else { + return input.slice(Math.max(0, begin + limit), begin); + } + } + }; +} + +/** + * @ngdoc filter + * @name orderBy + * @kind function + * + * @description + * Orders a specified `array` by the `expression` predicate. It is ordered alphabetically + * for strings and numerically for numbers. Note: if you notice numbers are not being sorted + * as expected, make sure they are actually being saved as numbers and not strings. + * Array-like values (e.g. NodeLists, jQuery objects, TypedArrays, Strings, etc) are also supported. + * + * @param {Array} array The array (or array-like object) to sort. + * @param {function(*)|string|Array.<(function(*)|string)>=} expression A predicate to be + * used by the comparator to determine the order of elements. + * + * Can be one of: + * + * - `function`: Getter function. The result of this function will be sorted using the + * `<`, `===`, `>` operator. + * - `string`: An Angular expression. The result of this expression is used to compare elements + * (for example `name` to sort by a property called `name` or `name.substr(0, 3)` to sort by + * 3 first characters of a property called `name`). The result of a constant expression + * is interpreted as a property name to be used in comparisons (for example `"special name"` + * to sort object by the value of their `special name` property). An expression can be + * optionally prefixed with `+` or `-` to control ascending or descending sort order + * (for example, `+name` or `-name`). If no property is provided, (e.g. `'+'`) then the array + * element itself is used to compare where sorting. + * - `Array`: An array of function or string predicates. The first predicate in the array + * is used for sorting, but when two items are equivalent, the next predicate is used. + * + * If the predicate is missing or empty then it defaults to `'+'`. + * + * @param {boolean=} reverse Reverse the order of the array. + * @returns {Array} Sorted copy of the source array. + * + * + * @example + * The example below demonstrates a simple ngRepeat, where the data is sorted + * by age in descending order (predicate is set to `'-age'`). + * `reverse` is not set, which means it defaults to `false`. + + +
+ + + + + + + + + + + +
NamePhone NumberAge
{{friend.name}}{{friend.phone}}{{friend.age}}
+
+
+ + angular.module('orderByExample', []) + .controller('ExampleController', ['$scope', function($scope) { + $scope.friends = + [{name:'John', phone:'555-1212', age:10}, + {name:'Mary', phone:'555-9876', age:19}, + {name:'Mike', phone:'555-4321', age:21}, + {name:'Adam', phone:'555-5678', age:35}, + {name:'Julie', phone:'555-8765', age:29}]; + }]); + +
+ * + * The predicate and reverse parameters can be controlled dynamically through scope properties, + * as shown in the next example. + * @example + + +
+
Sorting predicate = {{predicate}}; reverse = {{reverse}}
+
+ + + + + + + + + + + + +
+ + + + + + + + +
{{friend.name}}{{friend.phone}}{{friend.age}}
+
+
+ + angular.module('orderByExample', []) + .controller('ExampleController', ['$scope', function($scope) { + $scope.friends = + [{name:'John', phone:'555-1212', age:10}, + {name:'Mary', phone:'555-9876', age:19}, + {name:'Mike', phone:'555-4321', age:21}, + {name:'Adam', phone:'555-5678', age:35}, + {name:'Julie', phone:'555-8765', age:29}]; + $scope.predicate = 'age'; + $scope.reverse = true; + $scope.order = function(predicate) { + $scope.reverse = ($scope.predicate === predicate) ? !$scope.reverse : false; + $scope.predicate = predicate; + }; + }]); + + + .sortorder:after { + content: '\25b2'; + } + .sortorder.reverse:after { + content: '\25bc'; + } + +
+ * + * It's also possible to call the orderBy filter manually, by injecting `$filter`, retrieving the + * filter routine with `$filter('orderBy')`, and calling the returned filter routine with the + * desired parameters. + * + * Example: + * + * @example + + +
+
Sorting predicate = {{predicate}}; reverse = {{reverse}}
+ + + + + + + + + + + +
+ + + + + + + + +
{{friend.name}}{{friend.phone}}{{friend.age}}
+
+
+ + + angular.module('orderByExample', []) + .controller('ExampleController', ['$scope', '$filter', function($scope, $filter) { + var orderBy = $filter('orderBy'); + $scope.friends = [ + { name: 'John', phone: '555-1212', age: 10 }, + { name: 'Mary', phone: '555-9876', age: 19 }, + { name: 'Mike', phone: '555-4321', age: 21 }, + { name: 'Adam', phone: '555-5678', age: 35 }, + { name: 'Julie', phone: '555-8765', age: 29 } + ]; + $scope.order = function(predicate) { + $scope.predicate = predicate; + $scope.reverse = ($scope.predicate === predicate) ? !$scope.reverse : false; + $scope.friends = orderBy($scope.friends, predicate, $scope.reverse); + }; + $scope.order('age', true); + }]); + + + + .sortorder:after { + content: '\25b2'; + } + .sortorder.reverse:after { + content: '\25bc'; + } + +
+ */ +orderByFilter.$inject = ['$parse']; +function orderByFilter($parse) { + return function(array, sortPredicate, reverseOrder) { + + if (array == null) return array; + if (!isArrayLike(array)) { + throw minErr('orderBy')('notarray', 'Expected array but received: {0}', array); + } + + if (!isArray(sortPredicate)) { sortPredicate = [sortPredicate]; } + if (sortPredicate.length === 0) { sortPredicate = ['+']; } + + var predicates = processPredicates(sortPredicate, reverseOrder); + // Add a predicate at the end that evaluates to the element index. This makes the + // sort stable as it works as a tie-breaker when all the input predicates cannot + // distinguish between two elements. + predicates.push({ get: function() { return {}; }, descending: reverseOrder ? -1 : 1}); + + // The next three lines are a version of a Swartzian Transform idiom from Perl + // (sometimes called the Decorate-Sort-Undecorate idiom) + // See https://en.wikipedia.org/wiki/Schwartzian_transform + var compareValues = Array.prototype.map.call(array, getComparisonObject); + compareValues.sort(doComparison); + array = compareValues.map(function(item) { return item.value; }); + + return array; + + function getComparisonObject(value, index) { + return { + value: value, + predicateValues: predicates.map(function(predicate) { + return getPredicateValue(predicate.get(value), index); + }) + }; + } + + function doComparison(v1, v2) { + var result = 0; + for (var index=0, length = predicates.length; index < length; ++index) { + result = compare(v1.predicateValues[index], v2.predicateValues[index]) * predicates[index].descending; + if (result) break; + } + return result; + } + }; + + function processPredicates(sortPredicate, reverseOrder) { + reverseOrder = reverseOrder ? -1 : 1; + return sortPredicate.map(function(predicate) { + var descending = 1, get = identity; + + if (isFunction(predicate)) { + get = predicate; + } else if (isString(predicate)) { + if ((predicate.charAt(0) == '+' || predicate.charAt(0) == '-')) { + descending = predicate.charAt(0) == '-' ? -1 : 1; + predicate = predicate.substring(1); + } + if (predicate !== '') { + get = $parse(predicate); + if (get.constant) { + var key = get(); + get = function(value) { return value[key]; }; + } + } + } + return { get: get, descending: descending * reverseOrder }; + }); + } + + function isPrimitive(value) { + switch (typeof value) { + case 'number': /* falls through */ + case 'boolean': /* falls through */ + case 'string': + return true; + default: + return false; + } + } + + function objectValue(value, index) { + // If `valueOf` is a valid function use that + if (typeof value.valueOf === 'function') { + value = value.valueOf(); + if (isPrimitive(value)) return value; + } + // If `toString` is a valid function and not the one from `Object.prototype` use that + if (hasCustomToString(value)) { + value = value.toString(); + if (isPrimitive(value)) return value; + } + // We have a basic object so we use the position of the object in the collection + return index; + } + + function getPredicateValue(value, index) { + var type = typeof value; + if (value === null) { + type = 'string'; + value = 'null'; + } else if (type === 'string') { + value = value.toLowerCase(); + } else if (type === 'object') { + value = objectValue(value, index); + } + return { value: value, type: type }; + } + + function compare(v1, v2) { + var result = 0; + if (v1.type === v2.type) { + if (v1.value !== v2.value) { + result = v1.value < v2.value ? -1 : 1; + } + } else { + result = v1.type < v2.type ? -1 : 1; + } + return result; + } +} + +function ngDirective(directive) { + if (isFunction(directive)) { + directive = { + link: directive + }; + } + directive.restrict = directive.restrict || 'AC'; + return valueFn(directive); +} + +/** + * @ngdoc directive + * @name a + * @restrict E + * + * @description + * Modifies the default behavior of the html A tag so that the default action is prevented when + * the href attribute is empty. + * + * This change permits the easy creation of action links with the `ngClick` directive + * without changing the location or causing page reloads, e.g.: + * `Add Item` + */ +var htmlAnchorDirective = valueFn({ + restrict: 'E', + compile: function(element, attr) { + if (!attr.href && !attr.xlinkHref) { + return function(scope, element) { + // If the linked element is not an anchor tag anymore, do nothing + if (element[0].nodeName.toLowerCase() !== 'a') return; + + // SVGAElement does not use the href attribute, but rather the 'xlinkHref' attribute. + var href = toString.call(element.prop('href')) === '[object SVGAnimatedString]' ? + 'xlink:href' : 'href'; + element.on('click', function(event) { + // if we have no href url, then don't navigate anywhere. + if (!element.attr(href)) { + event.preventDefault(); + } + }); + }; + } + } +}); + +/** + * @ngdoc directive + * @name ngHref + * @restrict A + * @priority 99 + * + * @description + * Using Angular markup like `{{hash}}` in an href attribute will + * make the link go to the wrong URL if the user clicks it before + * Angular has a chance to replace the `{{hash}}` markup with its + * value. Until Angular replaces the markup the link will be broken + * and will most likely return a 404 error. The `ngHref` directive + * solves this problem. + * + * The wrong way to write it: + * ```html + * link1 + * ``` + * + * The correct way to write it: + * ```html + * link1 + * ``` + * + * @element A + * @param {template} ngHref any string which can contain `{{}}` markup. + * + * @example + * This example shows various combinations of `href`, `ng-href` and `ng-click` attributes + * in links and their different behaviors: + + +
+ link 1 (link, don't reload)
+ link 2 (link, don't reload)
+ link 3 (link, reload!)
+ anchor (link, don't reload)
+ anchor (no link)
+ link (link, change location) +
+ + it('should execute ng-click but not reload when href without value', function() { + element(by.id('link-1')).click(); + expect(element(by.model('value')).getAttribute('value')).toEqual('1'); + expect(element(by.id('link-1')).getAttribute('href')).toBe(''); + }); + + it('should execute ng-click but not reload when href empty string', function() { + element(by.id('link-2')).click(); + expect(element(by.model('value')).getAttribute('value')).toEqual('2'); + expect(element(by.id('link-2')).getAttribute('href')).toBe(''); + }); + + it('should execute ng-click and change url when ng-href specified', function() { + expect(element(by.id('link-3')).getAttribute('href')).toMatch(/\/123$/); + + element(by.id('link-3')).click(); + + // At this point, we navigate away from an Angular page, so we need + // to use browser.driver to get the base webdriver. + + browser.wait(function() { + return browser.driver.getCurrentUrl().then(function(url) { + return url.match(/\/123$/); + }); + }, 5000, 'page should navigate to /123'); + }); + + it('should execute ng-click but not reload when href empty string and name specified', function() { + element(by.id('link-4')).click(); + expect(element(by.model('value')).getAttribute('value')).toEqual('4'); + expect(element(by.id('link-4')).getAttribute('href')).toBe(''); + }); + + it('should execute ng-click but not reload when no href but name specified', function() { + element(by.id('link-5')).click(); + expect(element(by.model('value')).getAttribute('value')).toEqual('5'); + expect(element(by.id('link-5')).getAttribute('href')).toBe(null); + }); + + it('should only change url when only ng-href', function() { + element(by.model('value')).clear(); + element(by.model('value')).sendKeys('6'); + expect(element(by.id('link-6')).getAttribute('href')).toMatch(/\/6$/); + + element(by.id('link-6')).click(); + + // At this point, we navigate away from an Angular page, so we need + // to use browser.driver to get the base webdriver. + browser.wait(function() { + return browser.driver.getCurrentUrl().then(function(url) { + return url.match(/\/6$/); + }); + }, 5000, 'page should navigate to /6'); + }); + +
+ */ + +/** + * @ngdoc directive + * @name ngSrc + * @restrict A + * @priority 99 + * + * @description + * Using Angular markup like `{{hash}}` in a `src` attribute doesn't + * work right: The browser will fetch from the URL with the literal + * text `{{hash}}` until Angular replaces the expression inside + * `{{hash}}`. The `ngSrc` directive solves this problem. + * + * The buggy way to write it: + * ```html + * Description + * ``` + * + * The correct way to write it: + * ```html + * Description + * ``` + * + * @element IMG + * @param {template} ngSrc any string which can contain `{{}}` markup. + */ + +/** + * @ngdoc directive + * @name ngSrcset + * @restrict A + * @priority 99 + * + * @description + * Using Angular markup like `{{hash}}` in a `srcset` attribute doesn't + * work right: The browser will fetch from the URL with the literal + * text `{{hash}}` until Angular replaces the expression inside + * `{{hash}}`. The `ngSrcset` directive solves this problem. + * + * The buggy way to write it: + * ```html + * Description + * ``` + * + * The correct way to write it: + * ```html + * Description + * ``` + * + * @element IMG + * @param {template} ngSrcset any string which can contain `{{}}` markup. + */ + +/** + * @ngdoc directive + * @name ngDisabled + * @restrict A + * @priority 100 + * + * @description + * + * This directive sets the `disabled` attribute on the element if the + * {@link guide/expression expression} inside `ngDisabled` evaluates to truthy. + * + * A special directive is necessary because we cannot use interpolation inside the `disabled` + * attribute. See the {@link guide/interpolation interpolation guide} for more info. + * + * @example + + +
+ +
+ + it('should toggle button', function() { + expect(element(by.css('button')).getAttribute('disabled')).toBeFalsy(); + element(by.model('checked')).click(); + expect(element(by.css('button')).getAttribute('disabled')).toBeTruthy(); + }); + +
+ * + * @element INPUT + * @param {expression} ngDisabled If the {@link guide/expression expression} is truthy, + * then the `disabled` attribute will be set on the element + */ + + +/** + * @ngdoc directive + * @name ngChecked + * @restrict A + * @priority 100 + * + * @description + * Sets the `checked` attribute on the element, if the expression inside `ngChecked` is truthy. + * + * Note that this directive should not be used together with {@link ngModel `ngModel`}, + * as this can lead to unexpected behavior. + * + * A special directive is necessary because we cannot use interpolation inside the `checked` + * attribute. See the {@link guide/interpolation interpolation guide} for more info. + * + * @example + + +
+ +
+ + it('should check both checkBoxes', function() { + expect(element(by.id('checkSlave')).getAttribute('checked')).toBeFalsy(); + element(by.model('master')).click(); + expect(element(by.id('checkSlave')).getAttribute('checked')).toBeTruthy(); + }); + +
+ * + * @element INPUT + * @param {expression} ngChecked If the {@link guide/expression expression} is truthy, + * then the `checked` attribute will be set on the element + */ + + +/** + * @ngdoc directive + * @name ngReadonly + * @restrict A + * @priority 100 + * + * @description + * + * Sets the `readOnly` attribute on the element, if the expression inside `ngReadonly` is truthy. + * + * A special directive is necessary because we cannot use interpolation inside the `readOnly` + * attribute. See the {@link guide/interpolation interpolation guide} for more info. + * + * @example + + +
+ +
+ + it('should toggle readonly attr', function() { + expect(element(by.css('[type="text"]')).getAttribute('readonly')).toBeFalsy(); + element(by.model('checked')).click(); + expect(element(by.css('[type="text"]')).getAttribute('readonly')).toBeTruthy(); + }); + +
+ * + * @element INPUT + * @param {expression} ngReadonly If the {@link guide/expression expression} is truthy, + * then special attribute "readonly" will be set on the element + */ + + +/** + * @ngdoc directive + * @name ngSelected + * @restrict A + * @priority 100 + * + * @description + * + * Sets the `selected` attribute on the element, if the expression inside `ngSelected` is truthy. + * + * A special directive is necessary because we cannot use interpolation inside the `selected` + * attribute. See the {@link guide/interpolation interpolation guide} for more info. + * + * @example + + +
+ +
+ + it('should select Greetings!', function() { + expect(element(by.id('greet')).getAttribute('selected')).toBeFalsy(); + element(by.model('selected')).click(); + expect(element(by.id('greet')).getAttribute('selected')).toBeTruthy(); + }); + +
+ * + * @element OPTION + * @param {expression} ngSelected If the {@link guide/expression expression} is truthy, + * then special attribute "selected" will be set on the element + */ + +/** + * @ngdoc directive + * @name ngOpen + * @restrict A + * @priority 100 + * + * @description + * + * Sets the `open` attribute on the element, if the expression inside `ngOpen` is truthy. + * + * A special directive is necessary because we cannot use interpolation inside the `open` + * attribute. See the {@link guide/interpolation interpolation guide} for more info. + * + * @example + + +
+
+ Show/Hide me +
+
+ + it('should toggle open', function() { + expect(element(by.id('details')).getAttribute('open')).toBeFalsy(); + element(by.model('open')).click(); + expect(element(by.id('details')).getAttribute('open')).toBeTruthy(); + }); + +
+ * + * @element DETAILS + * @param {expression} ngOpen If the {@link guide/expression expression} is truthy, + * then special attribute "open" will be set on the element + */ + +var ngAttributeAliasDirectives = {}; + +// boolean attrs are evaluated +forEach(BOOLEAN_ATTR, function(propName, attrName) { + // binding to multiple is not supported + if (propName == "multiple") return; + + function defaultLinkFn(scope, element, attr) { + scope.$watch(attr[normalized], function ngBooleanAttrWatchAction(value) { + attr.$set(attrName, !!value); + }); + } + + var normalized = directiveNormalize('ng-' + attrName); + var linkFn = defaultLinkFn; + + if (propName === 'checked') { + linkFn = function(scope, element, attr) { + // ensuring ngChecked doesn't interfere with ngModel when both are set on the same input + if (attr.ngModel !== attr[normalized]) { + defaultLinkFn(scope, element, attr); + } + }; + } + + ngAttributeAliasDirectives[normalized] = function() { + return { + restrict: 'A', + priority: 100, + link: linkFn + }; + }; +}); + +// aliased input attrs are evaluated +forEach(ALIASED_ATTR, function(htmlAttr, ngAttr) { + ngAttributeAliasDirectives[ngAttr] = function() { + return { + priority: 100, + link: function(scope, element, attr) { + //special case ngPattern when a literal regular expression value + //is used as the expression (this way we don't have to watch anything). + if (ngAttr === "ngPattern" && attr.ngPattern.charAt(0) == "/") { + var match = attr.ngPattern.match(REGEX_STRING_REGEXP); + if (match) { + attr.$set("ngPattern", new RegExp(match[1], match[2])); + return; + } + } + + scope.$watch(attr[ngAttr], function ngAttrAliasWatchAction(value) { + attr.$set(ngAttr, value); + }); + } + }; + }; +}); + +// ng-src, ng-srcset, ng-href are interpolated +forEach(['src', 'srcset', 'href'], function(attrName) { + var normalized = directiveNormalize('ng-' + attrName); + ngAttributeAliasDirectives[normalized] = function() { + return { + priority: 99, // it needs to run after the attributes are interpolated + link: function(scope, element, attr) { + var propName = attrName, + name = attrName; + + if (attrName === 'href' && + toString.call(element.prop('href')) === '[object SVGAnimatedString]') { + name = 'xlinkHref'; + attr.$attr[name] = 'xlink:href'; + propName = null; + } + + attr.$observe(normalized, function(value) { + if (!value) { + if (attrName === 'href') { + attr.$set(name, null); + } + return; + } + + attr.$set(name, value); + + // on IE, if "ng:src" directive declaration is used and "src" attribute doesn't exist + // then calling element.setAttribute('src', 'foo') doesn't do anything, so we need + // to set the property as well to achieve the desired effect. + // we use attr[attrName] value since $set can sanitize the url. + if (msie && propName) element.prop(propName, attr[name]); + }); + } + }; + }; +}); + +/* global -nullFormCtrl, -SUBMITTED_CLASS, addSetValidityMethod: true + */ +var nullFormCtrl = { + $addControl: noop, + $$renameControl: nullFormRenameControl, + $removeControl: noop, + $setValidity: noop, + $setDirty: noop, + $setPristine: noop, + $setSubmitted: noop +}, +SUBMITTED_CLASS = 'ng-submitted'; + +function nullFormRenameControl(control, name) { + control.$name = name; +} + +/** + * @ngdoc type + * @name form.FormController + * + * @property {boolean} $pristine True if user has not interacted with the form yet. + * @property {boolean} $dirty True if user has already interacted with the form. + * @property {boolean} $valid True if all of the containing forms and controls are valid. + * @property {boolean} $invalid True if at least one containing control or form is invalid. + * @property {boolean} $pending True if at least one containing control or form is pending. + * @property {boolean} $submitted True if user has submitted the form even if its invalid. + * + * @property {Object} $error Is an object hash, containing references to controls or + * forms with failing validators, where: + * + * - keys are validation tokens (error names), + * - values are arrays of controls or forms that have a failing validator for given error name. + * + * Built-in validation tokens: + * + * - `email` + * - `max` + * - `maxlength` + * - `min` + * - `minlength` + * - `number` + * - `pattern` + * - `required` + * - `url` + * - `date` + * - `datetimelocal` + * - `time` + * - `week` + * - `month` + * + * @description + * `FormController` keeps track of all its controls and nested forms as well as the state of them, + * such as being valid/invalid or dirty/pristine. + * + * Each {@link ng.directive:form form} directive creates an instance + * of `FormController`. + * + */ +//asks for $scope to fool the BC controller module +FormController.$inject = ['$element', '$attrs', '$scope', '$animate', '$interpolate']; +function FormController(element, attrs, $scope, $animate, $interpolate) { + var form = this, + controls = []; + + // init state + form.$error = {}; + form.$$success = {}; + form.$pending = undefined; + form.$name = $interpolate(attrs.name || attrs.ngForm || '')($scope); + form.$dirty = false; + form.$pristine = true; + form.$valid = true; + form.$invalid = false; + form.$submitted = false; + form.$$parentForm = nullFormCtrl; + + /** + * @ngdoc method + * @name form.FormController#$rollbackViewValue + * + * @description + * Rollback all form controls pending updates to the `$modelValue`. + * + * Updates may be pending by a debounced event or because the input is waiting for a some future + * event defined in `ng-model-options`. This method is typically needed by the reset button of + * a form that uses `ng-model-options` to pend updates. + */ + form.$rollbackViewValue = function() { + forEach(controls, function(control) { + control.$rollbackViewValue(); + }); + }; + + /** + * @ngdoc method + * @name form.FormController#$commitViewValue + * + * @description + * Commit all form controls pending updates to the `$modelValue`. + * + * Updates may be pending by a debounced event or because the input is waiting for a some future + * event defined in `ng-model-options`. This method is rarely needed as `NgModelController` + * usually handles calling this in response to input events. + */ + form.$commitViewValue = function() { + forEach(controls, function(control) { + control.$commitViewValue(); + }); + }; + + /** + * @ngdoc method + * @name form.FormController#$addControl + * @param {object} control control object, either a {@link form.FormController} or an + * {@link ngModel.NgModelController} + * + * @description + * Register a control with the form. Input elements using ngModelController do this automatically + * when they are linked. + * + * Note that the current state of the control will not be reflected on the new parent form. This + * is not an issue with normal use, as freshly compiled and linked controls are in a `$pristine` + * state. + * + * However, if the method is used programmatically, for example by adding dynamically created controls, + * or controls that have been previously removed without destroying their corresponding DOM element, + * it's the developers responsibility to make sure the current state propagates to the parent form. + * + * For example, if an input control is added that is already `$dirty` and has `$error` properties, + * calling `$setDirty()` and `$validate()` afterwards will propagate the state to the parent form. + */ + form.$addControl = function(control) { + // Breaking change - before, inputs whose name was "hasOwnProperty" were quietly ignored + // and not added to the scope. Now we throw an error. + assertNotHasOwnProperty(control.$name, 'input'); + controls.push(control); + + if (control.$name) { + form[control.$name] = control; + } + + control.$$parentForm = form; + }; + + // Private API: rename a form control + form.$$renameControl = function(control, newName) { + var oldName = control.$name; + + if (form[oldName] === control) { + delete form[oldName]; + } + form[newName] = control; + control.$name = newName; + }; + + /** + * @ngdoc method + * @name form.FormController#$removeControl + * @param {object} control control object, either a {@link form.FormController} or an + * {@link ngModel.NgModelController} + * + * @description + * Deregister a control from the form. + * + * Input elements using ngModelController do this automatically when they are destroyed. + * + * Note that only the removed control's validation state (`$errors`etc.) will be removed from the + * form. `$dirty`, `$submitted` states will not be changed, because the expected behavior can be + * different from case to case. For example, removing the only `$dirty` control from a form may or + * may not mean that the form is still `$dirty`. + */ + form.$removeControl = function(control) { + if (control.$name && form[control.$name] === control) { + delete form[control.$name]; + } + forEach(form.$pending, function(value, name) { + form.$setValidity(name, null, control); + }); + forEach(form.$error, function(value, name) { + form.$setValidity(name, null, control); + }); + forEach(form.$$success, function(value, name) { + form.$setValidity(name, null, control); + }); + + arrayRemove(controls, control); + control.$$parentForm = nullFormCtrl; + }; + + + /** + * @ngdoc method + * @name form.FormController#$setValidity + * + * @description + * Sets the validity of a form control. + * + * This method will also propagate to parent forms. + */ + addSetValidityMethod({ + ctrl: this, + $element: element, + set: function(object, property, controller) { + var list = object[property]; + if (!list) { + object[property] = [controller]; + } else { + var index = list.indexOf(controller); + if (index === -1) { + list.push(controller); + } + } + }, + unset: function(object, property, controller) { + var list = object[property]; + if (!list) { + return; + } + arrayRemove(list, controller); + if (list.length === 0) { + delete object[property]; + } + }, + $animate: $animate + }); + + /** + * @ngdoc method + * @name form.FormController#$setDirty + * + * @description + * Sets the form to a dirty state. + * + * This method can be called to add the 'ng-dirty' class and set the form to a dirty + * state (ng-dirty class). This method will also propagate to parent forms. + */ + form.$setDirty = function() { + $animate.removeClass(element, PRISTINE_CLASS); + $animate.addClass(element, DIRTY_CLASS); + form.$dirty = true; + form.$pristine = false; + form.$$parentForm.$setDirty(); + }; + + /** + * @ngdoc method + * @name form.FormController#$setPristine + * + * @description + * Sets the form to its pristine state. + * + * This method can be called to remove the 'ng-dirty' class and set the form to its pristine + * state (ng-pristine class). This method will also propagate to all the controls contained + * in this form. + * + * Setting a form back to a pristine state is often useful when we want to 'reuse' a form after + * saving or resetting it. + */ + form.$setPristine = function() { + $animate.setClass(element, PRISTINE_CLASS, DIRTY_CLASS + ' ' + SUBMITTED_CLASS); + form.$dirty = false; + form.$pristine = true; + form.$submitted = false; + forEach(controls, function(control) { + control.$setPristine(); + }); + }; + + /** + * @ngdoc method + * @name form.FormController#$setUntouched + * + * @description + * Sets the form to its untouched state. + * + * This method can be called to remove the 'ng-touched' class and set the form controls to their + * untouched state (ng-untouched class). + * + * Setting a form controls back to their untouched state is often useful when setting the form + * back to its pristine state. + */ + form.$setUntouched = function() { + forEach(controls, function(control) { + control.$setUntouched(); + }); + }; + + /** + * @ngdoc method + * @name form.FormController#$setSubmitted + * + * @description + * Sets the form to its submitted state. + */ + form.$setSubmitted = function() { + $animate.addClass(element, SUBMITTED_CLASS); + form.$submitted = true; + form.$$parentForm.$setSubmitted(); + }; +} + +/** + * @ngdoc directive + * @name ngForm + * @restrict EAC + * + * @description + * Nestable alias of {@link ng.directive:form `form`} directive. HTML + * does not allow nesting of form elements. It is useful to nest forms, for example if the validity of a + * sub-group of controls needs to be determined. + * + * Note: the purpose of `ngForm` is to group controls, + * but not to be a replacement for the `
` tag with all of its capabilities + * (e.g. posting to the server, ...). + * + * @param {string=} ngForm|name Name of the form. If specified, the form controller will be published into + * related scope, under this name. + * + */ + + /** + * @ngdoc directive + * @name form + * @restrict E + * + * @description + * Directive that instantiates + * {@link form.FormController FormController}. + * + * If the `name` attribute is specified, the form controller is published onto the current scope under + * this name. + * + * # Alias: {@link ng.directive:ngForm `ngForm`} + * + * In Angular, forms can be nested. This means that the outer form is valid when all of the child + * forms are valid as well. However, browsers do not allow nesting of `` elements, so + * Angular provides the {@link ng.directive:ngForm `ngForm`} directive, which behaves identically to + * `form` but can be nested. Nested forms can be useful, for example, if the validity of a sub-group + * of controls needs to be determined. + * + * # CSS classes + * - `ng-valid` is set if the form is valid. + * - `ng-invalid` is set if the form is invalid. + * - `ng-pending` is set if the form is pending. + * - `ng-pristine` is set if the form is pristine. + * - `ng-dirty` is set if the form is dirty. + * - `ng-submitted` is set if the form was submitted. + * + * Keep in mind that ngAnimate can detect each of these classes when added and removed. + * + * + * # Submitting a form and preventing the default action + * + * Since the role of forms in client-side Angular applications is different than in classical + * roundtrip apps, it is desirable for the browser not to translate the form submission into a full + * page reload that sends the data to the server. Instead some javascript logic should be triggered + * to handle the form submission in an application-specific way. + * + * For this reason, Angular prevents the default action (form submission to the server) unless the + * `` element has an `action` attribute specified. + * + * You can use one of the following two ways to specify what javascript method should be called when + * a form is submitted: + * + * - {@link ng.directive:ngSubmit ngSubmit} directive on the form element + * - {@link ng.directive:ngClick ngClick} directive on the first + * button or input field of type submit (input[type=submit]) + * + * To prevent double execution of the handler, use only one of the {@link ng.directive:ngSubmit ngSubmit} + * or {@link ng.directive:ngClick ngClick} directives. + * This is because of the following form submission rules in the HTML specification: + * + * - If a form has only one input field then hitting enter in this field triggers form submit + * (`ngSubmit`) + * - if a form has 2+ input fields and no buttons or input[type=submit] then hitting enter + * doesn't trigger submit + * - if a form has one or more input fields and one or more buttons or input[type=submit] then + * hitting enter in any of the input fields will trigger the click handler on the *first* button or + * input[type=submit] (`ngClick`) *and* a submit handler on the enclosing form (`ngSubmit`) + * + * Any pending `ngModelOptions` changes will take place immediately when an enclosing form is + * submitted. Note that `ngClick` events will occur before the model is updated. Use `ngSubmit` + * to have access to the updated model. + * + * ## Animation Hooks + * + * Animations in ngForm are triggered when any of the associated CSS classes are added and removed. + * These classes are: `.ng-pristine`, `.ng-dirty`, `.ng-invalid` and `.ng-valid` as well as any + * other validations that are performed within the form. Animations in ngForm are similar to how + * they work in ngClass and animations can be hooked into using CSS transitions, keyframes as well + * as JS animations. + * + * The following example shows a simple way to utilize CSS transitions to style a form element + * that has been rendered as invalid after it has been validated: + * + *
+ * //be sure to include ngAnimate as a module to hook into more
+ * //advanced animations
+ * .my-form {
+ *   transition:0.5s linear all;
+ *   background: white;
+ * }
+ * .my-form.ng-invalid {
+ *   background: red;
+ *   color:white;
+ * }
+ * 
+ * + * @example + + + + + + userType: + Required!
+ userType = {{userType}}
+ myForm.input.$valid = {{myForm.input.$valid}}
+ myForm.input.$error = {{myForm.input.$error}}
+ myForm.$valid = {{myForm.$valid}}
+ myForm.$error.required = {{!!myForm.$error.required}}
+ +
+ + it('should initialize to model', function() { + var userType = element(by.binding('userType')); + var valid = element(by.binding('myForm.input.$valid')); + + expect(userType.getText()).toContain('guest'); + expect(valid.getText()).toContain('true'); + }); + + it('should be invalid if empty', function() { + var userType = element(by.binding('userType')); + var valid = element(by.binding('myForm.input.$valid')); + var userInput = element(by.model('userType')); + + userInput.clear(); + userInput.sendKeys(''); + + expect(userType.getText()).toEqual('userType ='); + expect(valid.getText()).toContain('false'); + }); + +
+ * + * @param {string=} name Name of the form. If specified, the form controller will be published into + * related scope, under this name. + */ +var formDirectiveFactory = function(isNgForm) { + return ['$timeout', '$parse', function($timeout, $parse) { + var formDirective = { + name: 'form', + restrict: isNgForm ? 'EAC' : 'E', + require: ['form', '^^?form'], //first is the form's own ctrl, second is an optional parent form + controller: FormController, + compile: function ngFormCompile(formElement, attr) { + // Setup initial state of the control + formElement.addClass(PRISTINE_CLASS).addClass(VALID_CLASS); + + var nameAttr = attr.name ? 'name' : (isNgForm && attr.ngForm ? 'ngForm' : false); + + return { + pre: function ngFormPreLink(scope, formElement, attr, ctrls) { + var controller = ctrls[0]; + + // if `action` attr is not present on the form, prevent the default action (submission) + if (!('action' in attr)) { + // we can't use jq events because if a form is destroyed during submission the default + // action is not prevented. see #1238 + // + // IE 9 is not affected because it doesn't fire a submit event and try to do a full + // page reload if the form was destroyed by submission of the form via a click handler + // on a button in the form. Looks like an IE9 specific bug. + var handleFormSubmission = function(event) { + scope.$apply(function() { + controller.$commitViewValue(); + controller.$setSubmitted(); + }); + + event.preventDefault(); + }; + + addEventListenerFn(formElement[0], 'submit', handleFormSubmission); + + // unregister the preventDefault listener so that we don't not leak memory but in a + // way that will achieve the prevention of the default action. + formElement.on('$destroy', function() { + $timeout(function() { + removeEventListenerFn(formElement[0], 'submit', handleFormSubmission); + }, 0, false); + }); + } + + var parentFormCtrl = ctrls[1] || controller.$$parentForm; + parentFormCtrl.$addControl(controller); + + var setter = nameAttr ? getSetter(controller.$name) : noop; + + if (nameAttr) { + setter(scope, controller); + attr.$observe(nameAttr, function(newValue) { + if (controller.$name === newValue) return; + setter(scope, undefined); + controller.$$parentForm.$$renameControl(controller, newValue); + setter = getSetter(controller.$name); + setter(scope, controller); + }); + } + formElement.on('$destroy', function() { + controller.$$parentForm.$removeControl(controller); + setter(scope, undefined); + extend(controller, nullFormCtrl); //stop propagating child destruction handlers upwards + }); + } + }; + } + }; + + return formDirective; + + function getSetter(expression) { + if (expression === '') { + //create an assignable expression, so forms with an empty name can be renamed later + return $parse('this[""]').assign; + } + return $parse(expression).assign || noop; + } + }]; +}; + +var formDirective = formDirectiveFactory(); +var ngFormDirective = formDirectiveFactory(true); + +/* global VALID_CLASS: false, + INVALID_CLASS: false, + PRISTINE_CLASS: false, + DIRTY_CLASS: false, + UNTOUCHED_CLASS: false, + TOUCHED_CLASS: false, + ngModelMinErr: false, +*/ + +// Regex code was initially obtained from SO prior to modification: https://stackoverflow.com/questions/3143070/javascript-regex-iso-datetime#answer-3143231 +var ISO_DATE_REGEXP = /^\d{4,}-[01]\d-[0-3]\dT[0-2]\d:[0-5]\d:[0-5]\d\.\d+(?:[+-][0-2]\d:[0-5]\d|Z)$/; +// See valid URLs in RFC3987 (http://tools.ietf.org/html/rfc3987) +// Note: We are being more lenient, because browsers are too. +// 1. Scheme +// 2. Slashes +// 3. Username +// 4. Password +// 5. Hostname +// 6. Port +// 7. Path +// 8. Query +// 9. Fragment +// 1111111111111111 222 333333 44444 555555555555555555555555 666 77777777 8888888 999 +var URL_REGEXP = /^[a-z][a-z\d.+-]*:\/*(?:[^:@]+(?::[^@]+)?@)?(?:[^\s:/?#]+|\[[a-f\d:]+\])(?::\d+)?(?:\/[^?#]*)?(?:\?[^#]*)?(?:#.*)?$/i; +var EMAIL_REGEXP = /^[a-z0-9!#$%&'*+\/=?^_`{|}~.-]+@[a-z0-9]([a-z0-9-]*[a-z0-9])?(\.[a-z0-9]([a-z0-9-]*[a-z0-9])?)*$/i; +var NUMBER_REGEXP = /^\s*(\-|\+)?(\d+|(\d*(\.\d*)))([eE][+-]?\d+)?\s*$/; +var DATE_REGEXP = /^(\d{4,})-(\d{2})-(\d{2})$/; +var DATETIMELOCAL_REGEXP = /^(\d{4,})-(\d\d)-(\d\d)T(\d\d):(\d\d)(?::(\d\d)(\.\d{1,3})?)?$/; +var WEEK_REGEXP = /^(\d{4,})-W(\d\d)$/; +var MONTH_REGEXP = /^(\d{4,})-(\d\d)$/; +var TIME_REGEXP = /^(\d\d):(\d\d)(?::(\d\d)(\.\d{1,3})?)?$/; + +var PARTIAL_VALIDATION_EVENTS = 'keydown wheel mousedown'; +var PARTIAL_VALIDATION_TYPES = createMap(); +forEach('date,datetime-local,month,time,week'.split(','), function(type) { + PARTIAL_VALIDATION_TYPES[type] = true; +}); + +var inputType = { + + /** + * @ngdoc input + * @name input[text] + * + * @description + * Standard HTML text input with angular data binding, inherited by most of the `input` elements. + * + * + * @param {string} ngModel Assignable angular expression to data-bind to. + * @param {string=} name Property name of the form under which the control is published. + * @param {string=} required Adds `required` validation error key if the value is not entered. + * @param {string=} ngRequired Adds `required` attribute and `required` validation constraint to + * the element when the ngRequired expression evaluates to true. Use `ngRequired` instead of + * `required` when you want to data-bind to the `required` attribute. + * @param {number=} ngMinlength Sets `minlength` validation error key if the value is shorter than + * minlength. + * @param {number=} ngMaxlength Sets `maxlength` validation error key if the value is longer than + * maxlength. Setting the attribute to a negative or non-numeric value, allows view values of + * any length. + * @param {string=} pattern Similar to `ngPattern` except that the attribute value is the actual string + * that contains the regular expression body that will be converted to a regular expression + * as in the ngPattern directive. + * @param {string=} ngPattern Sets `pattern` validation error key if the ngModel {@link ngModel.NgModelController#$viewValue $viewValue} + * does not match a RegExp found by evaluating the Angular expression given in the attribute value. + * If the expression evaluates to a RegExp object, then this is used directly. + * If the expression evaluates to a string, then it will be converted to a RegExp + * after wrapping it in `^` and `$` characters. For instance, `"abc"` will be converted to + * `new RegExp('^abc$')`.
+ * **Note:** Avoid using the `g` flag on the RegExp, as it will cause each successive search to + * start at the index of the last search's match, thus not taking the whole input value into + * account. + * @param {string=} ngChange Angular expression to be executed when input changes due to user + * interaction with the input element. + * @param {boolean=} [ngTrim=true] If set to false Angular will not automatically trim the input. + * This parameter is ignored for input[type=password] controls, which will never trim the + * input. + * + * @example + + + +
+ +
+ + Required! + + Single word only! +
+ text = {{example.text}}
+ myForm.input.$valid = {{myForm.input.$valid}}
+ myForm.input.$error = {{myForm.input.$error}}
+ myForm.$valid = {{myForm.$valid}}
+ myForm.$error.required = {{!!myForm.$error.required}}
+
+
+ + var text = element(by.binding('example.text')); + var valid = element(by.binding('myForm.input.$valid')); + var input = element(by.model('example.text')); + + it('should initialize to model', function() { + expect(text.getText()).toContain('guest'); + expect(valid.getText()).toContain('true'); + }); + + it('should be invalid if empty', function() { + input.clear(); + input.sendKeys(''); + + expect(text.getText()).toEqual('text ='); + expect(valid.getText()).toContain('false'); + }); + + it('should be invalid if multi word', function() { + input.clear(); + input.sendKeys('hello world'); + + expect(valid.getText()).toContain('false'); + }); + +
+ */ + 'text': textInputType, + + /** + * @ngdoc input + * @name input[date] + * + * @description + * Input with date validation and transformation. In browsers that do not yet support + * the HTML5 date input, a text element will be used. In that case, text must be entered in a valid ISO-8601 + * date format (yyyy-MM-dd), for example: `2009-01-06`. Since many + * modern browsers do not yet support this input type, it is important to provide cues to users on the + * expected input format via a placeholder or label. + * + * The model must always be a Date object, otherwise Angular will throw an error. + * Invalid `Date` objects (dates whose `getTime()` is `NaN`) will be rendered as an empty string. + * + * The timezone to be used to read/write the `Date` instance in the model can be defined using + * {@link ng.directive:ngModelOptions ngModelOptions}. By default, this is the timezone of the browser. + * + * @param {string} ngModel Assignable angular expression to data-bind to. + * @param {string=} name Property name of the form under which the control is published. + * @param {string=} min Sets the `min` validation error key if the value entered is less than `min`. This must be a + * valid ISO date string (yyyy-MM-dd). You can also use interpolation inside this attribute + * (e.g. `min="{{minDate | date:'yyyy-MM-dd'}}"`). Note that `min` will also add native HTML5 + * constraint validation. + * @param {string=} max Sets the `max` validation error key if the value entered is greater than `max`. This must be + * a valid ISO date string (yyyy-MM-dd). You can also use interpolation inside this attribute + * (e.g. `max="{{maxDate | date:'yyyy-MM-dd'}}"`). Note that `max` will also add native HTML5 + * constraint validation. + * @param {(date|string)=} ngMin Sets the `min` validation constraint to the Date / ISO date string + * the `ngMin` expression evaluates to. Note that it does not set the `min` attribute. + * @param {(date|string)=} ngMax Sets the `max` validation constraint to the Date / ISO date string + * the `ngMax` expression evaluates to. Note that it does not set the `max` attribute. + * @param {string=} required Sets `required` validation error key if the value is not entered. + * @param {string=} ngRequired Adds `required` attribute and `required` validation constraint to + * the element when the ngRequired expression evaluates to true. Use `ngRequired` instead of + * `required` when you want to data-bind to the `required` attribute. + * @param {string=} ngChange Angular expression to be executed when input changes due to user + * interaction with the input element. + * + * @example + + + +
+ + +
+ + Required! + + Not a valid date! +
+ value = {{example.value | date: "yyyy-MM-dd"}}
+ myForm.input.$valid = {{myForm.input.$valid}}
+ myForm.input.$error = {{myForm.input.$error}}
+ myForm.$valid = {{myForm.$valid}}
+ myForm.$error.required = {{!!myForm.$error.required}}
+
+
+ + var value = element(by.binding('example.value | date: "yyyy-MM-dd"')); + var valid = element(by.binding('myForm.input.$valid')); + var input = element(by.model('example.value')); + + // currently protractor/webdriver does not support + // sending keys to all known HTML5 input controls + // for various browsers (see https://github.com/angular/protractor/issues/562). + function setInput(val) { + // set the value of the element and force validation. + var scr = "var ipt = document.getElementById('exampleInput'); " + + "ipt.value = '" + val + "';" + + "angular.element(ipt).scope().$apply(function(s) { s.myForm[ipt.name].$setViewValue('" + val + "'); });"; + browser.executeScript(scr); + } + + it('should initialize to model', function() { + expect(value.getText()).toContain('2013-10-22'); + expect(valid.getText()).toContain('myForm.input.$valid = true'); + }); + + it('should be invalid if empty', function() { + setInput(''); + expect(value.getText()).toEqual('value ='); + expect(valid.getText()).toContain('myForm.input.$valid = false'); + }); + + it('should be invalid if over max', function() { + setInput('2015-01-01'); + expect(value.getText()).toContain(''); + expect(valid.getText()).toContain('myForm.input.$valid = false'); + }); + +
+ */ + 'date': createDateInputType('date', DATE_REGEXP, + createDateParser(DATE_REGEXP, ['yyyy', 'MM', 'dd']), + 'yyyy-MM-dd'), + + /** + * @ngdoc input + * @name input[datetime-local] + * + * @description + * Input with datetime validation and transformation. In browsers that do not yet support + * the HTML5 date input, a text element will be used. In that case, the text must be entered in a valid ISO-8601 + * local datetime format (yyyy-MM-ddTHH:mm:ss), for example: `2010-12-28T14:57:00`. + * + * The model must always be a Date object, otherwise Angular will throw an error. + * Invalid `Date` objects (dates whose `getTime()` is `NaN`) will be rendered as an empty string. + * + * The timezone to be used to read/write the `Date` instance in the model can be defined using + * {@link ng.directive:ngModelOptions ngModelOptions}. By default, this is the timezone of the browser. + * + * @param {string} ngModel Assignable angular expression to data-bind to. + * @param {string=} name Property name of the form under which the control is published. + * @param {string=} min Sets the `min` validation error key if the value entered is less than `min`. + * This must be a valid ISO datetime format (yyyy-MM-ddTHH:mm:ss). You can also use interpolation + * inside this attribute (e.g. `min="{{minDatetimeLocal | date:'yyyy-MM-ddTHH:mm:ss'}}"`). + * Note that `min` will also add native HTML5 constraint validation. + * @param {string=} max Sets the `max` validation error key if the value entered is greater than `max`. + * This must be a valid ISO datetime format (yyyy-MM-ddTHH:mm:ss). You can also use interpolation + * inside this attribute (e.g. `max="{{maxDatetimeLocal | date:'yyyy-MM-ddTHH:mm:ss'}}"`). + * Note that `max` will also add native HTML5 constraint validation. + * @param {(date|string)=} ngMin Sets the `min` validation error key to the Date / ISO datetime string + * the `ngMin` expression evaluates to. Note that it does not set the `min` attribute. + * @param {(date|string)=} ngMax Sets the `max` validation error key to the Date / ISO datetime string + * the `ngMax` expression evaluates to. Note that it does not set the `max` attribute. + * @param {string=} required Sets `required` validation error key if the value is not entered. + * @param {string=} ngRequired Adds `required` attribute and `required` validation constraint to + * the element when the ngRequired expression evaluates to true. Use `ngRequired` instead of + * `required` when you want to data-bind to the `required` attribute. + * @param {string=} ngChange Angular expression to be executed when input changes due to user + * interaction with the input element. + * + * @example + + + +
+ + +
+ + Required! + + Not a valid date! +
+ value = {{example.value | date: "yyyy-MM-ddTHH:mm:ss"}}
+ myForm.input.$valid = {{myForm.input.$valid}}
+ myForm.input.$error = {{myForm.input.$error}}
+ myForm.$valid = {{myForm.$valid}}
+ myForm.$error.required = {{!!myForm.$error.required}}
+
+
+ + var value = element(by.binding('example.value | date: "yyyy-MM-ddTHH:mm:ss"')); + var valid = element(by.binding('myForm.input.$valid')); + var input = element(by.model('example.value')); + + // currently protractor/webdriver does not support + // sending keys to all known HTML5 input controls + // for various browsers (https://github.com/angular/protractor/issues/562). + function setInput(val) { + // set the value of the element and force validation. + var scr = "var ipt = document.getElementById('exampleInput'); " + + "ipt.value = '" + val + "';" + + "angular.element(ipt).scope().$apply(function(s) { s.myForm[ipt.name].$setViewValue('" + val + "'); });"; + browser.executeScript(scr); + } + + it('should initialize to model', function() { + expect(value.getText()).toContain('2010-12-28T14:57:00'); + expect(valid.getText()).toContain('myForm.input.$valid = true'); + }); + + it('should be invalid if empty', function() { + setInput(''); + expect(value.getText()).toEqual('value ='); + expect(valid.getText()).toContain('myForm.input.$valid = false'); + }); + + it('should be invalid if over max', function() { + setInput('2015-01-01T23:59:00'); + expect(value.getText()).toContain(''); + expect(valid.getText()).toContain('myForm.input.$valid = false'); + }); + +
+ */ + 'datetime-local': createDateInputType('datetimelocal', DATETIMELOCAL_REGEXP, + createDateParser(DATETIMELOCAL_REGEXP, ['yyyy', 'MM', 'dd', 'HH', 'mm', 'ss', 'sss']), + 'yyyy-MM-ddTHH:mm:ss.sss'), + + /** + * @ngdoc input + * @name input[time] + * + * @description + * Input with time validation and transformation. In browsers that do not yet support + * the HTML5 time input, a text element will be used. In that case, the text must be entered in a valid ISO-8601 + * local time format (HH:mm:ss), for example: `14:57:00`. Model must be a Date object. This binding will always output a + * Date object to the model of January 1, 1970, or local date `new Date(1970, 0, 1, HH, mm, ss)`. + * + * The model must always be a Date object, otherwise Angular will throw an error. + * Invalid `Date` objects (dates whose `getTime()` is `NaN`) will be rendered as an empty string. + * + * The timezone to be used to read/write the `Date` instance in the model can be defined using + * {@link ng.directive:ngModelOptions ngModelOptions}. By default, this is the timezone of the browser. + * + * @param {string} ngModel Assignable angular expression to data-bind to. + * @param {string=} name Property name of the form under which the control is published. + * @param {string=} min Sets the `min` validation error key if the value entered is less than `min`. + * This must be a valid ISO time format (HH:mm:ss). You can also use interpolation inside this + * attribute (e.g. `min="{{minTime | date:'HH:mm:ss'}}"`). Note that `min` will also add + * native HTML5 constraint validation. + * @param {string=} max Sets the `max` validation error key if the value entered is greater than `max`. + * This must be a valid ISO time format (HH:mm:ss). You can also use interpolation inside this + * attribute (e.g. `max="{{maxTime | date:'HH:mm:ss'}}"`). Note that `max` will also add + * native HTML5 constraint validation. + * @param {(date|string)=} ngMin Sets the `min` validation constraint to the Date / ISO time string the + * `ngMin` expression evaluates to. Note that it does not set the `min` attribute. + * @param {(date|string)=} ngMax Sets the `max` validation constraint to the Date / ISO time string the + * `ngMax` expression evaluates to. Note that it does not set the `max` attribute. + * @param {string=} required Sets `required` validation error key if the value is not entered. + * @param {string=} ngRequired Adds `required` attribute and `required` validation constraint to + * the element when the ngRequired expression evaluates to true. Use `ngRequired` instead of + * `required` when you want to data-bind to the `required` attribute. + * @param {string=} ngChange Angular expression to be executed when input changes due to user + * interaction with the input element. + * + * @example + + + +
+ + +
+ + Required! + + Not a valid date! +
+ value = {{example.value | date: "HH:mm:ss"}}
+ myForm.input.$valid = {{myForm.input.$valid}}
+ myForm.input.$error = {{myForm.input.$error}}
+ myForm.$valid = {{myForm.$valid}}
+ myForm.$error.required = {{!!myForm.$error.required}}
+
+
+ + var value = element(by.binding('example.value | date: "HH:mm:ss"')); + var valid = element(by.binding('myForm.input.$valid')); + var input = element(by.model('example.value')); + + // currently protractor/webdriver does not support + // sending keys to all known HTML5 input controls + // for various browsers (https://github.com/angular/protractor/issues/562). + function setInput(val) { + // set the value of the element and force validation. + var scr = "var ipt = document.getElementById('exampleInput'); " + + "ipt.value = '" + val + "';" + + "angular.element(ipt).scope().$apply(function(s) { s.myForm[ipt.name].$setViewValue('" + val + "'); });"; + browser.executeScript(scr); + } + + it('should initialize to model', function() { + expect(value.getText()).toContain('14:57:00'); + expect(valid.getText()).toContain('myForm.input.$valid = true'); + }); + + it('should be invalid if empty', function() { + setInput(''); + expect(value.getText()).toEqual('value ='); + expect(valid.getText()).toContain('myForm.input.$valid = false'); + }); + + it('should be invalid if over max', function() { + setInput('23:59:00'); + expect(value.getText()).toContain(''); + expect(valid.getText()).toContain('myForm.input.$valid = false'); + }); + +
+ */ + 'time': createDateInputType('time', TIME_REGEXP, + createDateParser(TIME_REGEXP, ['HH', 'mm', 'ss', 'sss']), + 'HH:mm:ss.sss'), + + /** + * @ngdoc input + * @name input[week] + * + * @description + * Input with week-of-the-year validation and transformation to Date. In browsers that do not yet support + * the HTML5 week input, a text element will be used. In that case, the text must be entered in a valid ISO-8601 + * week format (yyyy-W##), for example: `2013-W02`. + * + * The model must always be a Date object, otherwise Angular will throw an error. + * Invalid `Date` objects (dates whose `getTime()` is `NaN`) will be rendered as an empty string. + * + * The timezone to be used to read/write the `Date` instance in the model can be defined using + * {@link ng.directive:ngModelOptions ngModelOptions}. By default, this is the timezone of the browser. + * + * @param {string} ngModel Assignable angular expression to data-bind to. + * @param {string=} name Property name of the form under which the control is published. + * @param {string=} min Sets the `min` validation error key if the value entered is less than `min`. + * This must be a valid ISO week format (yyyy-W##). You can also use interpolation inside this + * attribute (e.g. `min="{{minWeek | date:'yyyy-Www'}}"`). Note that `min` will also add + * native HTML5 constraint validation. + * @param {string=} max Sets the `max` validation error key if the value entered is greater than `max`. + * This must be a valid ISO week format (yyyy-W##). You can also use interpolation inside this + * attribute (e.g. `max="{{maxWeek | date:'yyyy-Www'}}"`). Note that `max` will also add + * native HTML5 constraint validation. + * @param {(date|string)=} ngMin Sets the `min` validation constraint to the Date / ISO week string + * the `ngMin` expression evaluates to. Note that it does not set the `min` attribute. + * @param {(date|string)=} ngMax Sets the `max` validation constraint to the Date / ISO week string + * the `ngMax` expression evaluates to. Note that it does not set the `max` attribute. + * @param {string=} required Sets `required` validation error key if the value is not entered. + * @param {string=} ngRequired Adds `required` attribute and `required` validation constraint to + * the element when the ngRequired expression evaluates to true. Use `ngRequired` instead of + * `required` when you want to data-bind to the `required` attribute. + * @param {string=} ngChange Angular expression to be executed when input changes due to user + * interaction with the input element. + * + * @example + + + +
+ +
+ + Required! + + Not a valid date! +
+ value = {{example.value | date: "yyyy-Www"}}
+ myForm.input.$valid = {{myForm.input.$valid}}
+ myForm.input.$error = {{myForm.input.$error}}
+ myForm.$valid = {{myForm.$valid}}
+ myForm.$error.required = {{!!myForm.$error.required}}
+
+
+ + var value = element(by.binding('example.value | date: "yyyy-Www"')); + var valid = element(by.binding('myForm.input.$valid')); + var input = element(by.model('example.value')); + + // currently protractor/webdriver does not support + // sending keys to all known HTML5 input controls + // for various browsers (https://github.com/angular/protractor/issues/562). + function setInput(val) { + // set the value of the element and force validation. + var scr = "var ipt = document.getElementById('exampleInput'); " + + "ipt.value = '" + val + "';" + + "angular.element(ipt).scope().$apply(function(s) { s.myForm[ipt.name].$setViewValue('" + val + "'); });"; + browser.executeScript(scr); + } + + it('should initialize to model', function() { + expect(value.getText()).toContain('2013-W01'); + expect(valid.getText()).toContain('myForm.input.$valid = true'); + }); + + it('should be invalid if empty', function() { + setInput(''); + expect(value.getText()).toEqual('value ='); + expect(valid.getText()).toContain('myForm.input.$valid = false'); + }); + + it('should be invalid if over max', function() { + setInput('2015-W01'); + expect(value.getText()).toContain(''); + expect(valid.getText()).toContain('myForm.input.$valid = false'); + }); + +
+ */ + 'week': createDateInputType('week', WEEK_REGEXP, weekParser, 'yyyy-Www'), + + /** + * @ngdoc input + * @name input[month] + * + * @description + * Input with month validation and transformation. In browsers that do not yet support + * the HTML5 month input, a text element will be used. In that case, the text must be entered in a valid ISO-8601 + * month format (yyyy-MM), for example: `2009-01`. + * + * The model must always be a Date object, otherwise Angular will throw an error. + * Invalid `Date` objects (dates whose `getTime()` is `NaN`) will be rendered as an empty string. + * If the model is not set to the first of the month, the next view to model update will set it + * to the first of the month. + * + * The timezone to be used to read/write the `Date` instance in the model can be defined using + * {@link ng.directive:ngModelOptions ngModelOptions}. By default, this is the timezone of the browser. + * + * @param {string} ngModel Assignable angular expression to data-bind to. + * @param {string=} name Property name of the form under which the control is published. + * @param {string=} min Sets the `min` validation error key if the value entered is less than `min`. + * This must be a valid ISO month format (yyyy-MM). You can also use interpolation inside this + * attribute (e.g. `min="{{minMonth | date:'yyyy-MM'}}"`). Note that `min` will also add + * native HTML5 constraint validation. + * @param {string=} max Sets the `max` validation error key if the value entered is greater than `max`. + * This must be a valid ISO month format (yyyy-MM). You can also use interpolation inside this + * attribute (e.g. `max="{{maxMonth | date:'yyyy-MM'}}"`). Note that `max` will also add + * native HTML5 constraint validation. + * @param {(date|string)=} ngMin Sets the `min` validation constraint to the Date / ISO week string + * the `ngMin` expression evaluates to. Note that it does not set the `min` attribute. + * @param {(date|string)=} ngMax Sets the `max` validation constraint to the Date / ISO week string + * the `ngMax` expression evaluates to. Note that it does not set the `max` attribute. + + * @param {string=} required Sets `required` validation error key if the value is not entered. + * @param {string=} ngRequired Adds `required` attribute and `required` validation constraint to + * the element when the ngRequired expression evaluates to true. Use `ngRequired` instead of + * `required` when you want to data-bind to the `required` attribute. + * @param {string=} ngChange Angular expression to be executed when input changes due to user + * interaction with the input element. + * + * @example + + + +
+ + +
+ + Required! + + Not a valid month! +
+ value = {{example.value | date: "yyyy-MM"}}
+ myForm.input.$valid = {{myForm.input.$valid}}
+ myForm.input.$error = {{myForm.input.$error}}
+ myForm.$valid = {{myForm.$valid}}
+ myForm.$error.required = {{!!myForm.$error.required}}
+
+
+ + var value = element(by.binding('example.value | date: "yyyy-MM"')); + var valid = element(by.binding('myForm.input.$valid')); + var input = element(by.model('example.value')); + + // currently protractor/webdriver does not support + // sending keys to all known HTML5 input controls + // for various browsers (https://github.com/angular/protractor/issues/562). + function setInput(val) { + // set the value of the element and force validation. + var scr = "var ipt = document.getElementById('exampleInput'); " + + "ipt.value = '" + val + "';" + + "angular.element(ipt).scope().$apply(function(s) { s.myForm[ipt.name].$setViewValue('" + val + "'); });"; + browser.executeScript(scr); + } + + it('should initialize to model', function() { + expect(value.getText()).toContain('2013-10'); + expect(valid.getText()).toContain('myForm.input.$valid = true'); + }); + + it('should be invalid if empty', function() { + setInput(''); + expect(value.getText()).toEqual('value ='); + expect(valid.getText()).toContain('myForm.input.$valid = false'); + }); + + it('should be invalid if over max', function() { + setInput('2015-01'); + expect(value.getText()).toContain(''); + expect(valid.getText()).toContain('myForm.input.$valid = false'); + }); + +
+ */ + 'month': createDateInputType('month', MONTH_REGEXP, + createDateParser(MONTH_REGEXP, ['yyyy', 'MM']), + 'yyyy-MM'), + + /** + * @ngdoc input + * @name input[number] + * + * @description + * Text input with number validation and transformation. Sets the `number` validation + * error if not a valid number. + * + *
+ * The model must always be of type `number` otherwise Angular will throw an error. + * Be aware that a string containing a number is not enough. See the {@link ngModel:numfmt} + * error docs for more information and an example of how to convert your model if necessary. + *
+ * + * ## Issues with HTML5 constraint validation + * + * In browsers that follow the + * [HTML5 specification](https://html.spec.whatwg.org/multipage/forms.html#number-state-%28type=number%29), + * `input[number]` does not work as expected with {@link ngModelOptions `ngModelOptions.allowInvalid`}. + * If a non-number is entered in the input, the browser will report the value as an empty string, + * which means the view / model values in `ngModel` and subsequently the scope value + * will also be an empty string. + * + * + * @param {string} ngModel Assignable angular expression to data-bind to. + * @param {string=} name Property name of the form under which the control is published. + * @param {string=} min Sets the `min` validation error key if the value entered is less than `min`. + * @param {string=} max Sets the `max` validation error key if the value entered is greater than `max`. + * @param {string=} required Sets `required` validation error key if the value is not entered. + * @param {string=} ngRequired Adds `required` attribute and `required` validation constraint to + * the element when the ngRequired expression evaluates to true. Use `ngRequired` instead of + * `required` when you want to data-bind to the `required` attribute. + * @param {number=} ngMinlength Sets `minlength` validation error key if the value is shorter than + * minlength. + * @param {number=} ngMaxlength Sets `maxlength` validation error key if the value is longer than + * maxlength. Setting the attribute to a negative or non-numeric value, allows view values of + * any length. + * @param {string=} pattern Similar to `ngPattern` except that the attribute value is the actual string + * that contains the regular expression body that will be converted to a regular expression + * as in the ngPattern directive. + * @param {string=} ngPattern Sets `pattern` validation error key if the ngModel {@link ngModel.NgModelController#$viewValue $viewValue} + * does not match a RegExp found by evaluating the Angular expression given in the attribute value. + * If the expression evaluates to a RegExp object, then this is used directly. + * If the expression evaluates to a string, then it will be converted to a RegExp + * after wrapping it in `^` and `$` characters. For instance, `"abc"` will be converted to + * `new RegExp('^abc$')`.
+ * **Note:** Avoid using the `g` flag on the RegExp, as it will cause each successive search to + * start at the index of the last search's match, thus not taking the whole input value into + * account. + * @param {string=} ngChange Angular expression to be executed when input changes due to user + * interaction with the input element. + * + * @example + + + +
+ +
+ + Required! + + Not valid number! +
+ value = {{example.value}}
+ myForm.input.$valid = {{myForm.input.$valid}}
+ myForm.input.$error = {{myForm.input.$error}}
+ myForm.$valid = {{myForm.$valid}}
+ myForm.$error.required = {{!!myForm.$error.required}}
+
+
+ + var value = element(by.binding('example.value')); + var valid = element(by.binding('myForm.input.$valid')); + var input = element(by.model('example.value')); + + it('should initialize to model', function() { + expect(value.getText()).toContain('12'); + expect(valid.getText()).toContain('true'); + }); + + it('should be invalid if empty', function() { + input.clear(); + input.sendKeys(''); + expect(value.getText()).toEqual('value ='); + expect(valid.getText()).toContain('false'); + }); + + it('should be invalid if over max', function() { + input.clear(); + input.sendKeys('123'); + expect(value.getText()).toEqual('value ='); + expect(valid.getText()).toContain('false'); + }); + +
+ */ + 'number': numberInputType, + + + /** + * @ngdoc input + * @name input[url] + * + * @description + * Text input with URL validation. Sets the `url` validation error key if the content is not a + * valid URL. + * + *
+ * **Note:** `input[url]` uses a regex to validate urls that is derived from the regex + * used in Chromium. If you need stricter validation, you can use `ng-pattern` or modify + * the built-in validators (see the {@link guide/forms Forms guide}) + *
+ * + * @param {string} ngModel Assignable angular expression to data-bind to. + * @param {string=} name Property name of the form under which the control is published. + * @param {string=} required Sets `required` validation error key if the value is not entered. + * @param {string=} ngRequired Adds `required` attribute and `required` validation constraint to + * the element when the ngRequired expression evaluates to true. Use `ngRequired` instead of + * `required` when you want to data-bind to the `required` attribute. + * @param {number=} ngMinlength Sets `minlength` validation error key if the value is shorter than + * minlength. + * @param {number=} ngMaxlength Sets `maxlength` validation error key if the value is longer than + * maxlength. Setting the attribute to a negative or non-numeric value, allows view values of + * any length. + * @param {string=} pattern Similar to `ngPattern` except that the attribute value is the actual string + * that contains the regular expression body that will be converted to a regular expression + * as in the ngPattern directive. + * @param {string=} ngPattern Sets `pattern` validation error key if the ngModel {@link ngModel.NgModelController#$viewValue $viewValue} + * does not match a RegExp found by evaluating the Angular expression given in the attribute value. + * If the expression evaluates to a RegExp object, then this is used directly. + * If the expression evaluates to a string, then it will be converted to a RegExp + * after wrapping it in `^` and `$` characters. For instance, `"abc"` will be converted to + * `new RegExp('^abc$')`.
+ * **Note:** Avoid using the `g` flag on the RegExp, as it will cause each successive search to + * start at the index of the last search's match, thus not taking the whole input value into + * account. + * @param {string=} ngChange Angular expression to be executed when input changes due to user + * interaction with the input element. + * + * @example + + + +
+
+ + var text = element(by.binding('url.text')); + var valid = element(by.binding('myForm.input.$valid')); + var input = element(by.model('url.text')); + + it('should initialize to model', function() { + expect(text.getText()).toContain('http://google.com'); + expect(valid.getText()).toContain('true'); + }); + + it('should be invalid if empty', function() { + input.clear(); + input.sendKeys(''); + + expect(text.getText()).toEqual('text ='); + expect(valid.getText()).toContain('false'); + }); + + it('should be invalid if not url', function() { + input.clear(); + input.sendKeys('box'); + + expect(valid.getText()).toContain('false'); + }); + +
+ */ + 'url': urlInputType, + + + /** + * @ngdoc input + * @name input[email] + * + * @description + * Text input with email validation. Sets the `email` validation error key if not a valid email + * address. + * + *
+ * **Note:** `input[email]` uses a regex to validate email addresses that is derived from the regex + * used in Chromium. If you need stricter validation (e.g. requiring a top-level domain), you can + * use `ng-pattern` or modify the built-in validators (see the {@link guide/forms Forms guide}) + *
+ * + * @param {string} ngModel Assignable angular expression to data-bind to. + * @param {string=} name Property name of the form under which the control is published. + * @param {string=} required Sets `required` validation error key if the value is not entered. + * @param {string=} ngRequired Adds `required` attribute and `required` validation constraint to + * the element when the ngRequired expression evaluates to true. Use `ngRequired` instead of + * `required` when you want to data-bind to the `required` attribute. + * @param {number=} ngMinlength Sets `minlength` validation error key if the value is shorter than + * minlength. + * @param {number=} ngMaxlength Sets `maxlength` validation error key if the value is longer than + * maxlength. Setting the attribute to a negative or non-numeric value, allows view values of + * any length. + * @param {string=} pattern Similar to `ngPattern` except that the attribute value is the actual string + * that contains the regular expression body that will be converted to a regular expression + * as in the ngPattern directive. + * @param {string=} ngPattern Sets `pattern` validation error key if the ngModel {@link ngModel.NgModelController#$viewValue $viewValue} + * does not match a RegExp found by evaluating the Angular expression given in the attribute value. + * If the expression evaluates to a RegExp object, then this is used directly. + * If the expression evaluates to a string, then it will be converted to a RegExp + * after wrapping it in `^` and `$` characters. For instance, `"abc"` will be converted to + * `new RegExp('^abc$')`.
+ * **Note:** Avoid using the `g` flag on the RegExp, as it will cause each successive search to + * start at the index of the last search's match, thus not taking the whole input value into + * account. + * @param {string=} ngChange Angular expression to be executed when input changes due to user + * interaction with the input element. + * + * @example + + + +
+ +
+ + Required! + + Not valid email! +
+ text = {{email.text}}
+ myForm.input.$valid = {{myForm.input.$valid}}
+ myForm.input.$error = {{myForm.input.$error}}
+ myForm.$valid = {{myForm.$valid}}
+ myForm.$error.required = {{!!myForm.$error.required}}
+ myForm.$error.email = {{!!myForm.$error.email}}
+
+
+ + var text = element(by.binding('email.text')); + var valid = element(by.binding('myForm.input.$valid')); + var input = element(by.model('email.text')); + + it('should initialize to model', function() { + expect(text.getText()).toContain('me@example.com'); + expect(valid.getText()).toContain('true'); + }); + + it('should be invalid if empty', function() { + input.clear(); + input.sendKeys(''); + expect(text.getText()).toEqual('text ='); + expect(valid.getText()).toContain('false'); + }); + + it('should be invalid if not email', function() { + input.clear(); + input.sendKeys('xxx'); + + expect(valid.getText()).toContain('false'); + }); + +
+ */ + 'email': emailInputType, + + + /** + * @ngdoc input + * @name input[radio] + * + * @description + * HTML radio button. + * + * @param {string} ngModel Assignable angular expression to data-bind to. + * @param {string} value The value to which the `ngModel` expression should be set when selected. + * Note that `value` only supports `string` values, i.e. the scope model needs to be a string, + * too. Use `ngValue` if you need complex models (`number`, `object`, ...). + * @param {string=} name Property name of the form under which the control is published. + * @param {string=} ngChange Angular expression to be executed when input changes due to user + * interaction with the input element. + * @param {string} ngValue Angular expression to which `ngModel` will be be set when the radio + * is selected. Should be used instead of the `value` attribute if you need + * a non-string `ngModel` (`boolean`, `array`, ...). + * + * @example + + + +
+
+
+
+ color = {{color.name | json}}
+
+ Note that `ng-value="specialValue"` sets radio item's value to be the value of `$scope.specialValue`. +
+ + it('should change state', function() { + var color = element(by.binding('color.name')); + + expect(color.getText()).toContain('blue'); + + element.all(by.model('color.name')).get(0).click(); + + expect(color.getText()).toContain('red'); + }); + +
+ */ + 'radio': radioInputType, + + + /** + * @ngdoc input + * @name input[checkbox] + * + * @description + * HTML checkbox. + * + * @param {string} ngModel Assignable angular expression to data-bind to. + * @param {string=} name Property name of the form under which the control is published. + * @param {expression=} ngTrueValue The value to which the expression should be set when selected. + * @param {expression=} ngFalseValue The value to which the expression should be set when not selected. + * @param {string=} ngChange Angular expression to be executed when input changes due to user + * interaction with the input element. + * + * @example + + + +
+
+
+ value1 = {{checkboxModel.value1}}
+ value2 = {{checkboxModel.value2}}
+
+
+ + it('should change state', function() { + var value1 = element(by.binding('checkboxModel.value1')); + var value2 = element(by.binding('checkboxModel.value2')); + + expect(value1.getText()).toContain('true'); + expect(value2.getText()).toContain('YES'); + + element(by.model('checkboxModel.value1')).click(); + element(by.model('checkboxModel.value2')).click(); + + expect(value1.getText()).toContain('false'); + expect(value2.getText()).toContain('NO'); + }); + +
+ */ + 'checkbox': checkboxInputType, + + 'hidden': noop, + 'button': noop, + 'submit': noop, + 'reset': noop, + 'file': noop +}; + +function stringBasedInputType(ctrl) { + ctrl.$formatters.push(function(value) { + return ctrl.$isEmpty(value) ? value : value.toString(); + }); +} + +function textInputType(scope, element, attr, ctrl, $sniffer, $browser) { + baseInputType(scope, element, attr, ctrl, $sniffer, $browser); + stringBasedInputType(ctrl); +} + +function baseInputType(scope, element, attr, ctrl, $sniffer, $browser) { + var type = lowercase(element[0].type); + + // In composition mode, users are still inputing intermediate text buffer, + // hold the listener until composition is done. + // More about composition events: https://developer.mozilla.org/en-US/docs/Web/API/CompositionEvent + if (!$sniffer.android) { + var composing = false; + + element.on('compositionstart', function() { + composing = true; + }); + + element.on('compositionend', function() { + composing = false; + listener(); + }); + } + + var timeout; + + var listener = function(ev) { + if (timeout) { + $browser.defer.cancel(timeout); + timeout = null; + } + if (composing) return; + var value = element.val(), + event = ev && ev.type; + + // By default we will trim the value + // If the attribute ng-trim exists we will avoid trimming + // If input type is 'password', the value is never trimmed + if (type !== 'password' && (!attr.ngTrim || attr.ngTrim !== 'false')) { + value = trim(value); + } + + // If a control is suffering from bad input (due to native validators), browsers discard its + // value, so it may be necessary to revalidate (by calling $setViewValue again) even if the + // control's value is the same empty value twice in a row. + if (ctrl.$viewValue !== value || (value === '' && ctrl.$$hasNativeValidators)) { + ctrl.$setViewValue(value, event); + } + }; + + // if the browser does support "input" event, we are fine - except on IE9 which doesn't fire the + // input event on backspace, delete or cut + if ($sniffer.hasEvent('input')) { + element.on('input', listener); + } else { + var deferListener = function(ev, input, origValue) { + if (!timeout) { + timeout = $browser.defer(function() { + timeout = null; + if (!input || input.value !== origValue) { + listener(ev); + } + }); + } + }; + + element.on('keydown', function(event) { + var key = event.keyCode; + + // ignore + // command modifiers arrows + if (key === 91 || (15 < key && key < 19) || (37 <= key && key <= 40)) return; + + deferListener(event, this, this.value); + }); + + // if user modifies input value using context menu in IE, we need "paste" and "cut" events to catch it + if ($sniffer.hasEvent('paste')) { + element.on('paste cut', deferListener); + } + } + + // if user paste into input using mouse on older browser + // or form autocomplete on newer browser, we need "change" event to catch it + element.on('change', listener); + + // Some native input types (date-family) have the ability to change validity without + // firing any input/change events. + // For these event types, when native validators are present and the browser supports the type, + // check for validity changes on various DOM events. + if (PARTIAL_VALIDATION_TYPES[type] && ctrl.$$hasNativeValidators && type === attr.type) { + element.on(PARTIAL_VALIDATION_EVENTS, function(ev) { + if (!timeout) { + var validity = this[VALIDITY_STATE_PROPERTY]; + var origBadInput = validity.badInput; + var origTypeMismatch = validity.typeMismatch; + timeout = $browser.defer(function() { + timeout = null; + if (validity.badInput !== origBadInput || validity.typeMismatch !== origTypeMismatch) { + listener(ev); + } + }); + } + }); + } + + ctrl.$render = function() { + // Workaround for Firefox validation #12102. + var value = ctrl.$isEmpty(ctrl.$viewValue) ? '' : ctrl.$viewValue; + if (element.val() !== value) { + element.val(value); + } + }; +} + +function weekParser(isoWeek, existingDate) { + if (isDate(isoWeek)) { + return isoWeek; + } + + if (isString(isoWeek)) { + WEEK_REGEXP.lastIndex = 0; + var parts = WEEK_REGEXP.exec(isoWeek); + if (parts) { + var year = +parts[1], + week = +parts[2], + hours = 0, + minutes = 0, + seconds = 0, + milliseconds = 0, + firstThurs = getFirstThursdayOfYear(year), + addDays = (week - 1) * 7; + + if (existingDate) { + hours = existingDate.getHours(); + minutes = existingDate.getMinutes(); + seconds = existingDate.getSeconds(); + milliseconds = existingDate.getMilliseconds(); + } + + return new Date(year, 0, firstThurs.getDate() + addDays, hours, minutes, seconds, milliseconds); + } + } + + return NaN; +} + +function createDateParser(regexp, mapping) { + return function(iso, date) { + var parts, map; + + if (isDate(iso)) { + return iso; + } + + if (isString(iso)) { + // When a date is JSON'ified to wraps itself inside of an extra + // set of double quotes. This makes the date parsing code unable + // to match the date string and parse it as a date. + if (iso.charAt(0) == '"' && iso.charAt(iso.length - 1) == '"') { + iso = iso.substring(1, iso.length - 1); + } + if (ISO_DATE_REGEXP.test(iso)) { + return new Date(iso); + } + regexp.lastIndex = 0; + parts = regexp.exec(iso); + + if (parts) { + parts.shift(); + if (date) { + map = { + yyyy: date.getFullYear(), + MM: date.getMonth() + 1, + dd: date.getDate(), + HH: date.getHours(), + mm: date.getMinutes(), + ss: date.getSeconds(), + sss: date.getMilliseconds() / 1000 + }; + } else { + map = { yyyy: 1970, MM: 1, dd: 1, HH: 0, mm: 0, ss: 0, sss: 0 }; + } + + forEach(parts, function(part, index) { + if (index < mapping.length) { + map[mapping[index]] = +part; + } + }); + return new Date(map.yyyy, map.MM - 1, map.dd, map.HH, map.mm, map.ss || 0, map.sss * 1000 || 0); + } + } + + return NaN; + }; +} + +function createDateInputType(type, regexp, parseDate, format) { + return function dynamicDateInputType(scope, element, attr, ctrl, $sniffer, $browser, $filter) { + badInputChecker(scope, element, attr, ctrl); + baseInputType(scope, element, attr, ctrl, $sniffer, $browser); + var timezone = ctrl && ctrl.$options && ctrl.$options.timezone; + var previousDate; + + ctrl.$$parserName = type; + ctrl.$parsers.push(function(value) { + if (ctrl.$isEmpty(value)) return null; + if (regexp.test(value)) { + // Note: We cannot read ctrl.$modelValue, as there might be a different + // parser/formatter in the processing chain so that the model + // contains some different data format! + var parsedDate = parseDate(value, previousDate); + if (timezone) { + parsedDate = convertTimezoneToLocal(parsedDate, timezone); + } + return parsedDate; + } + return undefined; + }); + + ctrl.$formatters.push(function(value) { + if (value && !isDate(value)) { + throw ngModelMinErr('datefmt', 'Expected `{0}` to be a date', value); + } + if (isValidDate(value)) { + previousDate = value; + if (previousDate && timezone) { + previousDate = convertTimezoneToLocal(previousDate, timezone, true); + } + return $filter('date')(value, format, timezone); + } else { + previousDate = null; + return ''; + } + }); + + if (isDefined(attr.min) || attr.ngMin) { + var minVal; + ctrl.$validators.min = function(value) { + return !isValidDate(value) || isUndefined(minVal) || parseDate(value) >= minVal; + }; + attr.$observe('min', function(val) { + minVal = parseObservedDateValue(val); + ctrl.$validate(); + }); + } + + if (isDefined(attr.max) || attr.ngMax) { + var maxVal; + ctrl.$validators.max = function(value) { + return !isValidDate(value) || isUndefined(maxVal) || parseDate(value) <= maxVal; + }; + attr.$observe('max', function(val) { + maxVal = parseObservedDateValue(val); + ctrl.$validate(); + }); + } + + function isValidDate(value) { + // Invalid Date: getTime() returns NaN + return value && !(value.getTime && value.getTime() !== value.getTime()); + } + + function parseObservedDateValue(val) { + return isDefined(val) && !isDate(val) ? parseDate(val) || undefined : val; + } + }; +} + +function badInputChecker(scope, element, attr, ctrl) { + var node = element[0]; + var nativeValidation = ctrl.$$hasNativeValidators = isObject(node.validity); + if (nativeValidation) { + ctrl.$parsers.push(function(value) { + var validity = element.prop(VALIDITY_STATE_PROPERTY) || {}; + return validity.badInput || validity.typeMismatch ? undefined : value; + }); + } +} + +function numberInputType(scope, element, attr, ctrl, $sniffer, $browser) { + badInputChecker(scope, element, attr, ctrl); + baseInputType(scope, element, attr, ctrl, $sniffer, $browser); + + ctrl.$$parserName = 'number'; + ctrl.$parsers.push(function(value) { + if (ctrl.$isEmpty(value)) return null; + if (NUMBER_REGEXP.test(value)) return parseFloat(value); + return undefined; + }); + + ctrl.$formatters.push(function(value) { + if (!ctrl.$isEmpty(value)) { + if (!isNumber(value)) { + throw ngModelMinErr('numfmt', 'Expected `{0}` to be a number', value); + } + value = value.toString(); + } + return value; + }); + + if (isDefined(attr.min) || attr.ngMin) { + var minVal; + ctrl.$validators.min = function(value) { + return ctrl.$isEmpty(value) || isUndefined(minVal) || value >= minVal; + }; + + attr.$observe('min', function(val) { + if (isDefined(val) && !isNumber(val)) { + val = parseFloat(val, 10); + } + minVal = isNumber(val) && !isNaN(val) ? val : undefined; + // TODO(matsko): implement validateLater to reduce number of validations + ctrl.$validate(); + }); + } + + if (isDefined(attr.max) || attr.ngMax) { + var maxVal; + ctrl.$validators.max = function(value) { + return ctrl.$isEmpty(value) || isUndefined(maxVal) || value <= maxVal; + }; + + attr.$observe('max', function(val) { + if (isDefined(val) && !isNumber(val)) { + val = parseFloat(val, 10); + } + maxVal = isNumber(val) && !isNaN(val) ? val : undefined; + // TODO(matsko): implement validateLater to reduce number of validations + ctrl.$validate(); + }); + } +} + +function urlInputType(scope, element, attr, ctrl, $sniffer, $browser) { + // Note: no badInputChecker here by purpose as `url` is only a validation + // in browsers, i.e. we can always read out input.value even if it is not valid! + baseInputType(scope, element, attr, ctrl, $sniffer, $browser); + stringBasedInputType(ctrl); + + ctrl.$$parserName = 'url'; + ctrl.$validators.url = function(modelValue, viewValue) { + var value = modelValue || viewValue; + return ctrl.$isEmpty(value) || URL_REGEXP.test(value); + }; +} + +function emailInputType(scope, element, attr, ctrl, $sniffer, $browser) { + // Note: no badInputChecker here by purpose as `url` is only a validation + // in browsers, i.e. we can always read out input.value even if it is not valid! + baseInputType(scope, element, attr, ctrl, $sniffer, $browser); + stringBasedInputType(ctrl); + + ctrl.$$parserName = 'email'; + ctrl.$validators.email = function(modelValue, viewValue) { + var value = modelValue || viewValue; + return ctrl.$isEmpty(value) || EMAIL_REGEXP.test(value); + }; +} + +function radioInputType(scope, element, attr, ctrl) { + // make the name unique, if not defined + if (isUndefined(attr.name)) { + element.attr('name', nextUid()); + } + + var listener = function(ev) { + if (element[0].checked) { + ctrl.$setViewValue(attr.value, ev && ev.type); + } + }; + + element.on('click', listener); + + ctrl.$render = function() { + var value = attr.value; + element[0].checked = (value == ctrl.$viewValue); + }; + + attr.$observe('value', ctrl.$render); +} + +function parseConstantExpr($parse, context, name, expression, fallback) { + var parseFn; + if (isDefined(expression)) { + parseFn = $parse(expression); + if (!parseFn.constant) { + throw ngModelMinErr('constexpr', 'Expected constant expression for `{0}`, but saw ' + + '`{1}`.', name, expression); + } + return parseFn(context); + } + return fallback; +} + +function checkboxInputType(scope, element, attr, ctrl, $sniffer, $browser, $filter, $parse) { + var trueValue = parseConstantExpr($parse, scope, 'ngTrueValue', attr.ngTrueValue, true); + var falseValue = parseConstantExpr($parse, scope, 'ngFalseValue', attr.ngFalseValue, false); + + var listener = function(ev) { + ctrl.$setViewValue(element[0].checked, ev && ev.type); + }; + + element.on('click', listener); + + ctrl.$render = function() { + element[0].checked = ctrl.$viewValue; + }; + + // Override the standard `$isEmpty` because the $viewValue of an empty checkbox is always set to `false` + // This is because of the parser below, which compares the `$modelValue` with `trueValue` to convert + // it to a boolean. + ctrl.$isEmpty = function(value) { + return value === false; + }; + + ctrl.$formatters.push(function(value) { + return equals(value, trueValue); + }); + + ctrl.$parsers.push(function(value) { + return value ? trueValue : falseValue; + }); +} + + +/** + * @ngdoc directive + * @name textarea + * @restrict E + * + * @description + * HTML textarea element control with angular data-binding. The data-binding and validation + * properties of this element are exactly the same as those of the + * {@link ng.directive:input input element}. + * + * @param {string} ngModel Assignable angular expression to data-bind to. + * @param {string=} name Property name of the form under which the control is published. + * @param {string=} required Sets `required` validation error key if the value is not entered. + * @param {string=} ngRequired Adds `required` attribute and `required` validation constraint to + * the element when the ngRequired expression evaluates to true. Use `ngRequired` instead of + * `required` when you want to data-bind to the `required` attribute. + * @param {number=} ngMinlength Sets `minlength` validation error key if the value is shorter than + * minlength. + * @param {number=} ngMaxlength Sets `maxlength` validation error key if the value is longer than + * maxlength. Setting the attribute to a negative or non-numeric value, allows view values of any + * length. + * @param {string=} ngPattern Sets `pattern` validation error key if the ngModel {@link ngModel.NgModelController#$viewValue $viewValue} + * does not match a RegExp found by evaluating the Angular expression given in the attribute value. + * If the expression evaluates to a RegExp object, then this is used directly. + * If the expression evaluates to a string, then it will be converted to a RegExp + * after wrapping it in `^` and `$` characters. For instance, `"abc"` will be converted to + * `new RegExp('^abc$')`.
+ * **Note:** Avoid using the `g` flag on the RegExp, as it will cause each successive search to + * start at the index of the last search's match, thus not taking the whole input value into + * account. + * @param {string=} ngChange Angular expression to be executed when input changes due to user + * interaction with the input element. + * @param {boolean=} [ngTrim=true] If set to false Angular will not automatically trim the input. + */ + + +/** + * @ngdoc directive + * @name input + * @restrict E + * + * @description + * HTML input element control. When used together with {@link ngModel `ngModel`}, it provides data-binding, + * input state control, and validation. + * Input control follows HTML5 input types and polyfills the HTML5 validation behavior for older browsers. + * + *
+ * **Note:** Not every feature offered is available for all input types. + * Specifically, data binding and event handling via `ng-model` is unsupported for `input[file]`. + *
+ * + * @param {string} ngModel Assignable angular expression to data-bind to. + * @param {string=} name Property name of the form under which the control is published. + * @param {string=} required Sets `required` validation error key if the value is not entered. + * @param {boolean=} ngRequired Sets `required` attribute if set to true + * @param {number=} ngMinlength Sets `minlength` validation error key if the value is shorter than + * minlength. + * @param {number=} ngMaxlength Sets `maxlength` validation error key if the value is longer than + * maxlength. Setting the attribute to a negative or non-numeric value, allows view values of any + * length. + * @param {string=} ngPattern Sets `pattern` validation error key if the ngModel {@link ngModel.NgModelController#$viewValue $viewValue} + * value does not match a RegExp found by evaluating the Angular expression given in the attribute value. + * If the expression evaluates to a RegExp object, then this is used directly. + * If the expression evaluates to a string, then it will be converted to a RegExp + * after wrapping it in `^` and `$` characters. For instance, `"abc"` will be converted to + * `new RegExp('^abc$')`.
+ * **Note:** Avoid using the `g` flag on the RegExp, as it will cause each successive search to + * start at the index of the last search's match, thus not taking the whole input value into + * account. + * @param {string=} ngChange Angular expression to be executed when input changes due to user + * interaction with the input element. + * @param {boolean=} [ngTrim=true] If set to false Angular will not automatically trim the input. + * This parameter is ignored for input[type=password] controls, which will never trim the + * input. + * + * @example + + + +
+
+ +
+ + Required! +
+ +
+ + Too short! + + Too long! +
+
+
+ user = {{user}}
+ myForm.userName.$valid = {{myForm.userName.$valid}}
+ myForm.userName.$error = {{myForm.userName.$error}}
+ myForm.lastName.$valid = {{myForm.lastName.$valid}}
+ myForm.lastName.$error = {{myForm.lastName.$error}}
+ myForm.$valid = {{myForm.$valid}}
+ myForm.$error.required = {{!!myForm.$error.required}}
+ myForm.$error.minlength = {{!!myForm.$error.minlength}}
+ myForm.$error.maxlength = {{!!myForm.$error.maxlength}}
+
+
+ + var user = element(by.exactBinding('user')); + var userNameValid = element(by.binding('myForm.userName.$valid')); + var lastNameValid = element(by.binding('myForm.lastName.$valid')); + var lastNameError = element(by.binding('myForm.lastName.$error')); + var formValid = element(by.binding('myForm.$valid')); + var userNameInput = element(by.model('user.name')); + var userLastInput = element(by.model('user.last')); + + it('should initialize to model', function() { + expect(user.getText()).toContain('{"name":"guest","last":"visitor"}'); + expect(userNameValid.getText()).toContain('true'); + expect(formValid.getText()).toContain('true'); + }); + + it('should be invalid if empty when required', function() { + userNameInput.clear(); + userNameInput.sendKeys(''); + + expect(user.getText()).toContain('{"last":"visitor"}'); + expect(userNameValid.getText()).toContain('false'); + expect(formValid.getText()).toContain('false'); + }); + + it('should be valid if empty when min length is set', function() { + userLastInput.clear(); + userLastInput.sendKeys(''); + + expect(user.getText()).toContain('{"name":"guest","last":""}'); + expect(lastNameValid.getText()).toContain('true'); + expect(formValid.getText()).toContain('true'); + }); + + it('should be invalid if less than required min length', function() { + userLastInput.clear(); + userLastInput.sendKeys('xx'); + + expect(user.getText()).toContain('{"name":"guest"}'); + expect(lastNameValid.getText()).toContain('false'); + expect(lastNameError.getText()).toContain('minlength'); + expect(formValid.getText()).toContain('false'); + }); + + it('should be invalid if longer than max length', function() { + userLastInput.clear(); + userLastInput.sendKeys('some ridiculously long name'); + + expect(user.getText()).toContain('{"name":"guest"}'); + expect(lastNameValid.getText()).toContain('false'); + expect(lastNameError.getText()).toContain('maxlength'); + expect(formValid.getText()).toContain('false'); + }); + +
+ */ +var inputDirective = ['$browser', '$sniffer', '$filter', '$parse', + function($browser, $sniffer, $filter, $parse) { + return { + restrict: 'E', + require: ['?ngModel'], + link: { + pre: function(scope, element, attr, ctrls) { + if (ctrls[0]) { + (inputType[lowercase(attr.type)] || inputType.text)(scope, element, attr, ctrls[0], $sniffer, + $browser, $filter, $parse); + } + } + } + }; +}]; + + + +var CONSTANT_VALUE_REGEXP = /^(true|false|\d+)$/; +/** + * @ngdoc directive + * @name ngValue + * + * @description + * Binds the given expression to the value of `