From 0e00663d9f452a6d55b5c6bfb0a335067d21015d Mon Sep 17 00:00:00 2001 From: Alina To Date: Mon, 12 Oct 2015 22:18:12 -0700 Subject: [PATCH 01/39] Refactor week 6 project into new file structure --- gulp/config.js | 15 ++-- gulp/tasks/default.js | 2 +- gulp/tasks/markup.js | 8 -- gulp/tasks/production.js | 2 +- gulp/tasks/sass.js | 17 +++- gulp/tasks/watch.js | 6 +- package.json | 6 ++ src/js/app.js | 45 +++++++++++ src/js/blog-ctrl.js | 18 +++++ src/js/blog-details-directive.js | 15 ++++ src/js/blog-form-ctrl.js | 39 +++++++++ src/js/blog-service.js | 29 +++++++ src/js/blogposts-ctrl.js | 30 +++++++ src/js/entry.js | 2 + src/js/index.js | 5 ++ src/sass/base/_index.scss | 3 + src/sass/base/_reset.scss | 51 ++++++++++++ src/sass/base/_typography.scss | 66 +++++++++++++++ src/sass/base/_variables.scss | 40 +++++++++ src/sass/components/_blogContainer.scss | 16 ++++ src/sass/components/_blogSummary.scss | 81 +++++++++++++++++++ src/sass/components/_footer.scss | 30 +++++++ src/sass/components/_form.scss | 61 ++++++++++++++ src/sass/components/_index.scss | 11 +++ src/sass/components/_learn-more.scss | 42 ++++++++++ src/sass/components/_pageBanner.scss | 23 ++++++ src/sass/components/_share-social-icons.scss | 35 ++++++++ src/sass/components/_sub-nav.scss | 45 +++++++++++ src/sass/components/buttons/_INDEX.scss | 2 + src/sass/components/buttons/_buttons.scss | 37 +++++++++ src/sass/components/buttons/_mixins.scss | 20 +++++ .../contact/_contact-social-links.scss | 61 ++++++++++++++ src/sass/components/contact/_contact.scss | 39 +++++++++ src/sass/components/contact/_index.scss | 2 + src/sass/components/header/_header-logo.scss | 5 ++ src/sass/components/header/_header-nav.scss | 78 ++++++++++++++++++ src/sass/components/header/_header.scss | 21 +++++ src/sass/components/header/_index.scss | 3 + src/sass/main.scss | 6 ++ src/sass/typography/_icons.scss | 28 +++++++ src/sass/typography/_index.scss | 1 + src/sass/utils/_functions.scss | 17 ++++ src/sass/utils/_globalMixins.scss | 15 ++++ src/sass/utils/_index.scss | 2 + src/templates/blog.html | 37 +++++++++ src/templates/blogpost.html | 41 ++++++++++ src/templates/form.html | 31 +++++++ 47 files changed, 1166 insertions(+), 23 deletions(-) delete mode 100755 gulp/tasks/markup.js create mode 100644 src/js/app.js create mode 100644 src/js/blog-ctrl.js create mode 100644 src/js/blog-details-directive.js create mode 100644 src/js/blog-form-ctrl.js create mode 100644 src/js/blog-service.js create mode 100644 src/js/blogposts-ctrl.js create mode 100644 src/js/entry.js create mode 100644 src/js/index.js create mode 100644 src/sass/base/_index.scss create mode 100644 src/sass/base/_reset.scss create mode 100644 src/sass/base/_typography.scss create mode 100644 src/sass/base/_variables.scss create mode 100644 src/sass/components/_blogContainer.scss create mode 100644 src/sass/components/_blogSummary.scss create mode 100644 src/sass/components/_footer.scss create mode 100644 src/sass/components/_form.scss create mode 100644 src/sass/components/_index.scss create mode 100644 src/sass/components/_learn-more.scss create mode 100644 src/sass/components/_pageBanner.scss create mode 100644 src/sass/components/_share-social-icons.scss create mode 100644 src/sass/components/_sub-nav.scss create mode 100644 src/sass/components/buttons/_INDEX.scss create mode 100644 src/sass/components/buttons/_buttons.scss create mode 100644 src/sass/components/buttons/_mixins.scss create mode 100644 src/sass/components/contact/_contact-social-links.scss create mode 100644 src/sass/components/contact/_contact.scss create mode 100644 src/sass/components/contact/_index.scss create mode 100644 src/sass/components/header/_header-logo.scss create mode 100644 src/sass/components/header/_header-nav.scss create mode 100644 src/sass/components/header/_header.scss create mode 100644 src/sass/components/header/_index.scss create mode 100644 src/sass/main.scss create mode 100644 src/sass/typography/_icons.scss create mode 100644 src/sass/typography/_index.scss create mode 100644 src/sass/utils/_functions.scss create mode 100644 src/sass/utils/_globalMixins.scss create mode 100644 src/sass/utils/_index.scss create mode 100644 src/templates/blog.html create mode 100644 src/templates/blogpost.html create mode 100644 src/templates/form.html diff --git a/gulp/config.js b/gulp/config.js index b58ac80..4b8b4d9 100755 --- a/gulp/config.js +++ b/gulp/config.js @@ -5,24 +5,20 @@ module.exports = { javascript: { src: src + '/js/**/*.js', dest: dest + '/js/', - entry: src + '/js/app.js', - outputFilename: 'app.js' + entry: src + '/js/entry.js', + outputFilename: 'packed.js' }, assets: { src: src + "/assets/**/*", dest: dest + '/assets/' }, sass: { - src: src + "/css/**/*.{sass,scss}", + src: src + "/sass/**/*.{sass,scss}", dest: dest + '/css/', settings: { - indentedSyntax: true, // Enable .sass syntax! + indentedSyntax: true, } }, - html: { - src: src + '/**/*.html', - dest: dest - }, server: { src: dest, livereload: true, @@ -33,7 +29,6 @@ module.exports = { production: { cssSrc: dest + '/css/*.css', jsSrc: dest + '/js/*.js', - cssDest: dest + '/css/', - jsDest: dest + '/js/', + dest: dest } }; diff --git a/gulp/tasks/default.js b/gulp/tasks/default.js index 7bcae83..895d489 100644 --- a/gulp/tasks/default.js +++ b/gulp/tasks/default.js @@ -1,4 +1,4 @@ var gulp = require('gulp'); -gulp.task('default', ['sass', 'markup', 'webpack', 'watch', 'serve']); +gulp.task('default', ['sass', 'webpack', 'watch', 'serve']); diff --git a/gulp/tasks/markup.js b/gulp/tasks/markup.js deleted file mode 100755 index 89b3eb3..0000000 --- a/gulp/tasks/markup.js +++ /dev/null @@ -1,8 +0,0 @@ -var gulp = require('gulp'); -var config = require('../config').html; - -gulp.task('markup', function() { - return gulp.src(config.src) - .pipe(gulp.dest(config.dest)); -}); - diff --git a/gulp/tasks/production.js b/gulp/tasks/production.js index d9f5efd..7f55a6d 100755 --- a/gulp/tasks/production.js +++ b/gulp/tasks/production.js @@ -3,5 +3,5 @@ var gulp = require('gulp'); // Run this to compress all the things! gulp.task('production', function(){ // This runs only if the karma tests pass - gulp.start(['markup', 'minifyCss', 'uglifyJs']) + gulp.start(['minifyCss', 'uglifyJs']) }); diff --git a/gulp/tasks/sass.js b/gulp/tasks/sass.js index 01b6bc6..b867c64 100755 --- a/gulp/tasks/sass.js +++ b/gulp/tasks/sass.js @@ -1,5 +1,7 @@ var gulp = require('gulp'); var sass = require('gulp-sass'); +var bourbon = require('node-bourbon'); +var neat = require('node-neat'); var sourcemaps = require('gulp-sourcemaps'); var handleErrors = require('../util/handleErrors'); var autoprefixer = require('gulp-autoprefixer'); @@ -7,11 +9,24 @@ var config = require('../config').sass; gulp.task('sass', function () { return gulp.src(config.src) + .pipe(sass({ + includePaths: require('node-neat').includePaths + })) + .pipe(sass({ + includePaths: require('node-bourbon').includePaths + })) + .pipe(sourcemaps.init()) + .pipe(sass(config.settings)) + .on('error', handleErrors) + .pipe(sourcemaps.write()) - .pipe(autoprefixer({ browsers: ['last 2 version'] })) + + .pipe(autoprefixer({ browsers: ['last 2 version'], cascade: false })) + .pipe(gulp.dest(config.dest)); }); + diff --git a/gulp/tasks/watch.js b/gulp/tasks/watch.js index 576e992..144fbe9 100755 --- a/gulp/tasks/watch.js +++ b/gulp/tasks/watch.js @@ -3,7 +3,9 @@ var config = require('../config'); gulp.task('watch', function() { gulp.watch(config.javascript.src, ['webpack']); - gulp.watch(config.sass.src, ['sass']); - gulp.watch(config.markup.src, ['markup']); + gulp.watch(config.sass.src, ['sass']); + + gulp.watch(['./node_modules/angular/angular.js', './node_modules/angular-route/angular-route.js']); // Watchify will watch and recompile our JS, so no need to gulp.watch it }); + diff --git a/package.json b/package.json index 50f838a..51dd28e 100644 --- a/package.json +++ b/package.json @@ -3,6 +3,9 @@ "version": "1.0.0", "description": "", "dependencies": { + "angular": "^1.4.7", + "angular-route": "^1.4.7", + "bourbon": "^4.2.5", "gulp": "^3.8.11", "gulp-autoprefixer": "^2.1.0", "gulp-changed": "^1.1.1", @@ -17,6 +20,9 @@ "gulp-webserver": "^0.9.0", "lodash": "^3.3.1", "merge-stream": "^0.1.7", + "node-bourbon": "^4.2.3", + "node-neat": "^1.7.2", + "node-sass": "^3.3.3", "pretty-hrtime": "~1.0.0", "require-dir": "^0.1.0", "vinyl-source-stream": "~1.0.0", diff --git a/src/js/app.js b/src/js/app.js new file mode 100644 index 0000000..dab2a3f --- /dev/null +++ b/src/js/app.js @@ -0,0 +1,45 @@ +require('angular'); +require('angular-route'); + +(function(){ + + 'use strict'; + // Declare app level module which depends on filters, and services + var AwesomeBlogApp = angular.module('AwesomeBlog', ['ngRoute']). + + config(["$routeProvider", function ($routeProvider) { + $routeProvider + + ////route home page blog posts////////// + .when("/blogposts", { + templateUrl: "templates/blogpost.html", + controller: "BlogpostsCtrl as vm", + }) + + /////form to make more blog posts/////// + .when("/blogposts/new", { + templateUrl: "templates/form.html", + controller: "BlogFormCtrl as vm", + }) + .when("/blogposts/:blogpost_id/edit", { + templateUrl: "templates/form.html", + controller: "BlogFormCtrl as vm", + }) + .when("/blogposts/:blogpost_id", { + templateUrl: "templates/blog.html", + controller: "BlogpostCtrl as vm", + }) + .otherwise({ + redirectTo: "/blogposts", + }); + + }]); + + // Controller to make DATE work! + AwesomeBlogApp.controller("DateCtrl", ["$scope", function($scope) { + $scope.date = new Date(); + }]); + +}()); + +require('./index.js'); diff --git a/src/js/blog-ctrl.js b/src/js/blog-ctrl.js new file mode 100644 index 0000000..fa782d3 --- /dev/null +++ b/src/js/blog-ctrl.js @@ -0,0 +1,18 @@ +require("./app"); + +angular.module("AwesomeBlog").controller("BlogpostCtrl", ["BlogpostService", "$routeParams", function(BlogpostService, $routeParams) { + var vm = this; + + start(); + + function start() { + BlogpostService.get($routeParams.blogpost_id).then(function(resp) { + vm.blogpost = resp.data; + }); + } +}]); + + +// GitHub Personal Access Token!!! +// 87c755928d2db694fc764b7517a049e992f392a0 + diff --git a/src/js/blog-details-directive.js b/src/js/blog-details-directive.js new file mode 100644 index 0000000..fb4013a --- /dev/null +++ b/src/js/blog-details-directive.js @@ -0,0 +1,15 @@ +require("./app"); + +(function() { + "use strict"; + + angular.module("AwesomeBlog") + .directive("bl", function () { + return { + scope: { + blogpost: "=blogpost", // functionally the same as ng-model + }, + templateUrl: "templates/blog.html", + }; + }); +})(); diff --git a/src/js/blog-form-ctrl.js b/src/js/blog-form-ctrl.js new file mode 100644 index 0000000..d896fc3 --- /dev/null +++ b/src/js/blog-form-ctrl.js @@ -0,0 +1,39 @@ +require("./app"); + + +(function() { +'use strict'; + + angular.module("AwesomeBlog").controller("BlogFormCtrl", ["BlogpostService", "$routeParams", "$location", function(BlogpostService, $routeParams, $location){ + var vm = this; + + vm.save = saveBlog; + + vm.blogpost = {}; + + start(); + + // IF statement only works when edit + function start() { + + vm.blogpost.date = new Date(Date.now()); + if ($routeParams.blogpost_id) { + BlogpostService.get($routeParams.blogpost_id).then(function (resp) { + + vm.blogpost = resp.data; + vm.blogpost.date = vm.blogpost.date || new Date(Date.now()); + }); + } + } + + function saveBlog () { + var method; + + method = $routeParams.blogpost_id ? "update" : "create"; + BlogpostService[method](vm.blogpost).then(function (resp) { + $location.path("/blogposts/" + resp.data._id); + }); + } + }]); + +}()); diff --git a/src/js/blog-service.js b/src/js/blog-service.js new file mode 100644 index 0000000..04a2af6 --- /dev/null +++ b/src/js/blog-service.js @@ -0,0 +1,29 @@ +require("./app"); + +(function () { + "use strict"; + + angular.module("AwesomeBlog").service("BlogpostService", ["$http", function ($http) { + var urlRoot = "/blogposts"; + + var Blog = { + get: function (id) { + if (angular.isDefined(id)) { + return $http.get(urlRoot + "/" + id); + } else { + return $http.get(urlRoot); + } + }, + update: function (blog) { + return $http.put(urlRoot + "/" + blog._id, blog); + }, + create: function (blog) { + return $http.post(urlRoot, blog); // ideal, but doesn't work + }, + delete: function (blog) { + return $http.delete(urlRoot + "/" + blog._id); + } + }; + return Blog; + }]); +}()); diff --git a/src/js/blogposts-ctrl.js b/src/js/blogposts-ctrl.js new file mode 100644 index 0000000..735c02e --- /dev/null +++ b/src/js/blogposts-ctrl.js @@ -0,0 +1,30 @@ +require("./app"); + +(function() { + 'use strict'; + + angular.module("AwesomeBlog").controller("BlogpostsCtrl", ["BlogpostService", function(BlogpostService) { + var vm = this; + + vm.blogposts = []; + vm.delete = deleteBlog; + + start(); + + function start() { + getBlogposts(); + } + + function getBlogposts() { + BlogpostService.get().then(function(resp) { + vm.blogposts = resp.data; + }); + } + + function deleteBlog (blog) { + BlogpostService.delete(blog).then(function() { + getBlogposts(); + }); + } + }]); +}()); diff --git a/src/js/entry.js b/src/js/entry.js new file mode 100644 index 0000000..d829c73 --- /dev/null +++ b/src/js/entry.js @@ -0,0 +1,2 @@ +require("./app.js"); +require("./index.js"); diff --git a/src/js/index.js b/src/js/index.js new file mode 100644 index 0000000..57866a7 --- /dev/null +++ b/src/js/index.js @@ -0,0 +1,5 @@ +require("./blog-ctrl.js"); +require("./blog-service.js"); +require("./blog-details-directive.js"); +require("./blog-form-ctrl.js"); +require("./blogposts-ctrl.js"); diff --git a/src/sass/base/_index.scss b/src/sass/base/_index.scss new file mode 100644 index 0000000..a2ce49e --- /dev/null +++ b/src/sass/base/_index.scss @@ -0,0 +1,3 @@ +@import "reset"; +@import "variables"; +@import "typography"; diff --git a/src/sass/base/_reset.scss b/src/sass/base/_reset.scss new file mode 100644 index 0000000..0c59b47 --- /dev/null +++ b/src/sass/base/_reset.scss @@ -0,0 +1,51 @@ +/* http://meyerweb.com/eric/tools/css/reset/ +v2.0 | 20110126 +License: none (public domain) +*/ + +html, body, div, span, applet, object, iframe, h1, h2, h3, h4, h5, h6, p, blockquote, pre, a, abbr, acronym, address, big, cite, code, del, dfn, em, img, ins, kbd, q, s, samp, small, strike, strong, sub, sup, tt, var, b, u, i, center, dl, dt, dd, ol, ul, li, fieldset, form, label, legend, table, caption, tbody, tfoot, thead, tr, th, td, article, aside, canvas, details, embed, figure, figcaption, footer, header, hgroup, menu, nav, output, ruby, section, summary, time, mark, audio, video { + margin: 0; + padding: 0; + border: 0; + font-size: 100%; + font: inherit; + vertical-align: baseline; } + +/* HTML5 display-role reset for older browsers */ + +article, aside, details, figcaption, figure, footer, header, hgroup, menu, nav, section { + display: block; } + +body { + width: 100%; + margin: 0 auto; + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; + line-height: 1; } + +ol, ul { + list-style: none; } + +blockquote, q { + quotes: none; } + +blockquote { + &:before, &:after { + content: ''; + content: none; } + } + +q { + &:before, &:after { + content: ''; + content: none; } + } + +li, a { + text-decoration: none; +} + +table { + border-collapse: collapse; + border-spacing: 0; +} diff --git a/src/sass/base/_typography.scss b/src/sass/base/_typography.scss new file mode 100644 index 0000000..403636c --- /dev/null +++ b/src/sass/base/_typography.scss @@ -0,0 +1,66 @@ +@font-face { + font-family: 'icomoon'; + src:url('fonts/icomoon.eot?xktnuc'); + src:url('fonts/icomoon.eot?xktnuc#iefix') format('embedded-opentype'), + url('fonts/icomoon.ttf?xktnuc') format('truetype'), + url('fonts/icomoon.woff?xktnuc') format('woff'), + url('fonts/icomoon.svg?xktnuc#icomoon') format('svg'); + font-weight: normal; + font-style: normal; +} + +// Ubuntu Light +@font-face { + font-family: 'Ubuntu-Light'; + src:url('fonts/Ubuntu-L.ttf'); + font-weight: normal; +} + +//Ubuntu Light Italic +@font-face { + font-family: 'Ubuntu-Light-Italic'; + src:url('fonts/Ubuntu-LI.ttf'); + font-weight: normal; + font-style: normal; +} + + +// Ubuntu Regular +@font-face { + font-family: 'Ubuntu-Regular'; + src:url('fonts/Ubuntu-R.ttf'); + font-weight: normal; + font-style: normal; +} + +// Ubuntu Medium +@font-face { + font-family: 'Ubuntu-Medium'; + src:url('fonts/Ubuntu-M.ttf'); + font-weight: normal; + font-style: normal; +} + +//Ubuntu Bold +@font-face { + font-family: 'Ubuntu-Bold'; + src:url('fonts/Ubuntu-B.ttf'); + font-weight: normal; + font-style: normal; +} + +//RobotoSlab Light +@font-face { + font-family: 'RobotoSlab-Light'; + src:url('fonts/RobotoSlab-Light.ttf'); + font-weight: normal; + font-style: normal; +} + +//RobotoSlab Regular +@font-face { + font-family: 'RobotoSlab-Regular'; + src:url('fonts/RobotoSlab-Regular.ttf'); + font-weight: normal; + font-style: normal; +} diff --git a/src/sass/base/_variables.scss b/src/sass/base/_variables.scss new file mode 100644 index 0000000..0f209e5 --- /dev/null +++ b/src/sass/base/_variables.scss @@ -0,0 +1,40 @@ +// Breakpoint for Media Queries +$break: 50em; + +// Color Maps + +$colors: ( + 'base': #fff, + 'primary': #1e1d24, + 'secondary': #b4b3b5, + 'accent': #97f1e7, +); + +//text size maps +$font-size: ( + 'x-small': em(14), + 'small': em(16), + 'medium': em(20), + 'large': em(24), + 'x-large': em(28), + 'xx-large': em(34), + 'mega-small': em(48), + 'mega-medium': em(64), + 'mega-large': em(72), +); + + +//font family map +$font-family: ( + 'primary': ( + 'light': 'Ubuntu-Light' sans-serif, + 'light-italic': 'Ubuntu-Light-Italic' sans-serif, + 'regular': 'Ubuntu-Regular' sans-serif, + 'medium': 'Ubuntu-Medium' sans-serif, + 'bold': 'Ubuntu-Bold' sans-serif + ), + 'secondary': ( + 'light': 'RobotoSlab-Light' serif, + 'regular': 'RobotoSlab-Regular' serif + ), +); diff --git a/src/sass/components/_blogContainer.scss b/src/sass/components/_blogContainer.scss new file mode 100644 index 0000000..6f4011b --- /dev/null +++ b/src/sass/components/_blogContainer.scss @@ -0,0 +1,16 @@ +.blog-container { + padding: 5% 10%; + @media only screen and (min-width: $break) { + padding: 0 20%; + } + h1 { + font-family: font-family('primary', 'regular'); + font-size: font-size('xx-large'); + text-align: center; + } + + .btn-primary-alt:last-child { + display: flex; + margin: 2em auto; + } +} diff --git a/src/sass/components/_blogSummary.scss b/src/sass/components/_blogSummary.scss new file mode 100644 index 0000000..024b935 --- /dev/null +++ b/src/sass/components/_blogSummary.scss @@ -0,0 +1,81 @@ +.blog-summary { + @include flex-box($align: center, $wrap: wrap, $direction: column, $justify: center); + margin: 1em auto; + padding-bottom: 3em; + border-bottom: 1px solid; + border-color: rgba(0, 0, 0, .1); + @media only screen and (min-width: $break) { + @include flex-box($align: center, $wrap: wrap, $direction: row, $justify: space-between); + } + + h1 { + font-family: font-family('primary', 'regular'); + font-size: font-size('x-large'); + text-align: left; + flex-basis: 100%; + order: 1; + @media only screen and (min-width: $break) { + flex-basis: 60%; + margin: 1em 0; + order: 1; + } + } + + p { + font-family: font-family('primary', 'light'); + font-size: font-size('medium'); + color: color('secondary'); + opacity: .7; + flex-basis: 100%; + order: 3; + @media only screen and (min-width: $break) { + order: 3; + } + } + + .blog-metadata { + display: inline-block; + flex-basis: 100%; + order: 2; + margin-bottom: 1em; + @media only screen and (min-width: $break) { + flex-basis: 50%; + order: 4; + } + + li { + font-family: font-family('primary', 'light-italic'); + font-size: font-size('small'); + color: color('secondary'); + display: inline-flex; + padding: 1em 1em 0 0; + &:last-child { + display: none; + } + @media only screen and (min-width: $break) { + &:last-child { + display: inline-flex; + } + } + } + } + + .btn-primary { + order: 4; + margin-top: 1em; + @media only screen and (min-width: $break) { + order: 5 + } + } + + .btn-small { + order: 5; + margin: 1em 0; + &:hover { + cursor: pointer; + } + @media only screen and (min-width: $break) { + order: 2 + } + } +} diff --git a/src/sass/components/_footer.scss b/src/sass/components/_footer.scss new file mode 100644 index 0000000..e6ff53a --- /dev/null +++ b/src/sass/components/_footer.scss @@ -0,0 +1,30 @@ +footer { + text-align: center; + border-top: 0.1em solid black; + padding: 1.5em; + clear: both; + font-family: font-family('primary', 'light'); + font-size: font-size('x-small'); + letter-spacing: 0.1em; + @media screen and (min-width: 50em) { + clear: both; + } + ul { + + } + li { + list-style-type: none; + padding: 0.1em; + @media screen and (min-width: 50em) { + display: inline; + padding: 0.5em; + } + } + a { + text-decoration: none; + color: color('primary'); + &:hover { + color: color('accent'); + } + } +} diff --git a/src/sass/components/_form.scss b/src/sass/components/_form.scss new file mode 100644 index 0000000..5540913 --- /dev/null +++ b/src/sass/components/_form.scss @@ -0,0 +1,61 @@ + +form { + text-align: center; + padding: 1em; + @media screen and (min-width: 50em) { + + } + h1 { + font-family: font-family('primary', 'regular'); + font-size: font-size($key: 'medium'); + } + textarea { + margin: 1em auto; + padding: 1em; + width: 20em; + height: 10em; + display: block; + font-family: font-family('primary', 'light'); + font-size: font-size('small'); + @media screen and (min-width: 50em) { + width: 40em; + height: 15em; + border: .1em solid #ddd; + border-radius: em(4); + &:focus { + outline-color: color('accent'); + outline-style: solid; + outline-width: .25em; + } + } + } + input { + padding: 1em; + width: 20em; + display: block; + margin: 1em auto; + font-family: font-family('primary', 'light'); + font-size: font-size('small'); + @media screen and (min-width: 50em) { + border: .1em solid #ddd; + border-radius: em(4); + &:focus { + outline-color: color('accent'); + outline-style: solid; + outline-width: .25em; + } + } + } + // input[type="submit"] { + // border: none; + // padding: 1em; + // width: 20em; + // display: block; + // margin: 1em auto; + // color: color($key: 'base'); + // &:hover { + // background-color: color($key: 'accent'); + // cursor: pointer; + // } + // } +} diff --git a/src/sass/components/_index.scss b/src/sass/components/_index.scss new file mode 100644 index 0000000..be4d4e6 --- /dev/null +++ b/src/sass/components/_index.scss @@ -0,0 +1,11 @@ +@import "header/index"; +@import "buttons/index"; +@import "pageBanner"; +@import "sub-nav"; +@import "share-social-icons"; +@import "blogContainer"; +@import "blogSummary"; +@import "contact/index"; +@import "learn-more"; +@import "footer"; +@import "form"; diff --git a/src/sass/components/_learn-more.scss b/src/sass/components/_learn-more.scss new file mode 100644 index 0000000..3d73e34 --- /dev/null +++ b/src/sass/components/_learn-more.scss @@ -0,0 +1,42 @@ +.learn-more-wrapper { + @include flex-box($align: center, $wrap: wrap, $direction: column, $justify: center); + text-align: center; + padding: 1em; + background: color('accent'); + color: color('base'); + margin: 0 0 1.5em 0; + @media only screen and (min-width: $break) { + padding: 2em 0 4em 0; + } + + h1 { + font-family: font-family('primary', 'bold'); + font-size: font-size('xx-large'); + padding-bottom: 1em; + padding-top: 1em; + @media only screen and (min-width: $break) { + padding-bottom: .5em; + } + } + p { + font-family: font-family('primary', 'regular'); + font-size: font-size('small'); + padding-bottom: 1em; + line-height: 1.5em; + @media screen and (min-width: $break) { + width: 50%; + // padding: 2em 10em; + } + } + + .learn-button-wrapper { + + .btn-secondary { + display: inline-flex; + margin: 1em auto; + @media only screen and (min-width: $break) { + margin: 1em .5em; + } + } + } +} diff --git a/src/sass/components/_pageBanner.scss b/src/sass/components/_pageBanner.scss new file mode 100644 index 0000000..93f2c21 --- /dev/null +++ b/src/sass/components/_pageBanner.scss @@ -0,0 +1,23 @@ +@mixin banner($background, $heading-family, $text-family, $heading-size, $text-size, $text-color) { + background-color: color($background); + h1 { + font-family: $heading-family; + font-size: font-size($heading-size); + margin: 0; + } + p { + font-family: $text-family; + font-size: font-size($text-size); + font-color: color($text-color); + opacity: .5; + margin: .5em 0 0 0; + } +} + +.page-banner { + @include banner('accent', font-family('secondary', 'regular'), font-family('secondary', 'light'), 'mega-small', 'large', 'secondary'); + padding: 1.5em; + @media screen and (min-width: 50em) { + padding: 5em 35% 5em 10%; + } +} diff --git a/src/sass/components/_share-social-icons.scss b/src/sass/components/_share-social-icons.scss new file mode 100644 index 0000000..ba41908 --- /dev/null +++ b/src/sass/components/_share-social-icons.scss @@ -0,0 +1,35 @@ +// share social icons +.share-social-icons { + font-size: font-size('x-small'); + font-family: font-family('primary', 'light'); + text-align: center; + padding: 0.5em; + //On media call do this: + @media screen and (min-width: 50em) { + @include flex-box($align: center, $direction: row); + align-content: flex-end; + float: right; + margin-right: 10%; + } + + p { + display: inline; + color: color('primary'); + opacity: .4; + } + ul { + display: inline; + padding-left: 0; + } + li { // icons + display: inline; + padding-left: 0.5em; + } + a { + opacity: .4; + &:hover { + color: color('accent'); + opacity: 1; + } + } +} diff --git a/src/sass/components/_sub-nav.scss b/src/sass/components/_sub-nav.scss new file mode 100644 index 0000000..331d512 --- /dev/null +++ b/src/sass/components/_sub-nav.scss @@ -0,0 +1,45 @@ +// mini nav section +.sub-nav { + font-size: font-size('x-small'); + font-family: font-family('primary', 'light'); + text-align: center; + padding: 0.5em; + @media screen and (min-width: 50em) { + float: left; + padding-left: 5em; + } + li { + display: inline; + } + li:after { + content:'\00B7'; + padding-left:5px; + font-weight: 700; + } + li:last-child { + font-family: font-family('primary', 'medium'); + text-transform: uppercase; + &:after { + content: ''; + } + } + a { + text-decoration: none; + color: color('primary'); + &:hover { + color: color('accent'); + } + } +} + +.sub-nav-wrapper { + padding: 0.5em; + border-bottom: 1px solid; + border-color: rgba(0, 0, 0, .1); + @media screen and (min-width: 50em) { + padding-left: 5em; + height: 2.5em; + } +} + + diff --git a/src/sass/components/buttons/_INDEX.scss b/src/sass/components/buttons/_INDEX.scss new file mode 100644 index 0000000..c858e41 --- /dev/null +++ b/src/sass/components/buttons/_INDEX.scss @@ -0,0 +1,2 @@ +@import "mixins"; +@import "buttons"; diff --git a/src/sass/components/buttons/_buttons.scss b/src/sass/components/buttons/_buttons.scss new file mode 100644 index 0000000..da57329 --- /dev/null +++ b/src/sass/components/buttons/_buttons.scss @@ -0,0 +1,37 @@ +.btn-primary { + @include button(color('primary'), color('base'), color('accent'), color('base'), 8em, 'small'); + @media only screen and (min-width: $break) { + width: 12em; + } +} + +.btn-primary-alt { + @include button(color('base'), color('primary'), color('primary'), color('base'), 8em, 'small'); + &:hover { + border-color: color('primary'); + } + @media only screen and (min-width: $break) { + width: 12em; + } +} + +.btn-secondary { + @include button(color('accent'), color('base'), color('base'), color('primary'), 10em, 'small'); + &:hover { + border-color: color('base'); + } + @media only screen and (min-width: $break) { + width: 12em; + } +} + +.btn-small { + @include button(color('base'), color('primary'), color('primary'), color('base'), 8em, 'x-small'); + padding: .5em; + &:hover { + border-color: color('primary'); + } + @media only screen and (min-width: $break) { + width: 6em; + } +} diff --git a/src/sass/components/buttons/_mixins.scss b/src/sass/components/buttons/_mixins.scss new file mode 100644 index 0000000..1dbeaa1 --- /dev/null +++ b/src/sass/components/buttons/_mixins.scss @@ -0,0 +1,20 @@ +@mixin button($background, $color, $hover-bg, $hover-color, $width, $f-size) { + font-family: font-family('primary', 'medium'); + font-size: font-size($f-size); + letter-spacing: .125em; + display: inline-flex; + justify-content: center; + text-transform: uppercase; + width: $width; + padding: 1em 0; + border: solid 1px; + background-color: $background; + color: $color; + border-color: $color; + border-radius: .5em; + &:hover{ + background-color: $hover-bg; + color: $hover-color; + border-color: $hover-color; + } +} diff --git a/src/sass/components/contact/_contact-social-links.scss b/src/sass/components/contact/_contact-social-links.scss new file mode 100644 index 0000000..c848cd3 --- /dev/null +++ b/src/sass/components/contact/_contact-social-links.scss @@ -0,0 +1,61 @@ +.contact-social-links-wrapper { + padding-bottom: 5em; + margin: 0 auto; + width: 20em; + @media screen and (min-width: 50em) { + float: right; + padding-right: 5em; + padding-bottom: 6em; + width: 30em; + display: inline; + margin-top: 0; + } + ul { + @include flex-box($align: center, $wrap: wrap, $direction: row, $justify: center); + padding-left: 0; + // margin-right: 2em; + // width: 100%; + } + li { + @include flexitem; + list-style-type: none; + display: inline; + padding: 0.5em; + } + a { + position: relative; + // Icon styles in a:before + &:before { + font-size: 1.5em; + background-color: color('base'); + border-radius: 50%; // Icon is in the box + border-color: transparent; + } + &:hover { + color: color('accent'); + } + } + // Span for text for text styles + span { + @extend %border-circle; + text-transform: uppercase; + font-size: 0.5em; + text-align: center; + padding-top: 3.5em; + } +} +// Code for the circle +%border-circle { + position: absolute; + border: 0.1em solid color('secondary'); + border-radius: 50%; + width: 8em; + height: 4.5em; + top: 0.1em; + left: 0; + content:""; + z-index: -1; +} + + + diff --git a/src/sass/components/contact/_contact.scss b/src/sass/components/contact/_contact.scss new file mode 100644 index 0000000..4ff458e --- /dev/null +++ b/src/sass/components/contact/_contact.scss @@ -0,0 +1,39 @@ +.contact-info-wrapper { + text-align: center; + padding: 1em; + font-family: font-family('primary', 'regular'); + line-height: 1.5em; + @media screen and (min-width: 50em) { + padding: 2em; + width: 50em; + display: inline; + } +} +.address-wrapper { + padding-bottom: 1em; + @media screen and (min-width: 50em) { + float: left; + padding-left: 5em; + text-align: left; + margin-top: 3em; + } + address { + font-style: normal; + } +} +.phone-email-wrapper { + @media screen and (min-width: 50em) { + float: left; + padding-left: 5em; + text-align: left; + margin-top: 3em; + } + a { + text-decoration: none; + color: color($key: 'primary'); + &:hover { + color: color($key: 'accent'); + } + } +} + diff --git a/src/sass/components/contact/_index.scss b/src/sass/components/contact/_index.scss new file mode 100644 index 0000000..dab668e --- /dev/null +++ b/src/sass/components/contact/_index.scss @@ -0,0 +1,2 @@ +@import "contact-social-links"; +@import "contact"; diff --git a/src/sass/components/header/_header-logo.scss b/src/sass/components/header/_header-logo.scss new file mode 100644 index 0000000..04c1a9a --- /dev/null +++ b/src/sass/components/header/_header-logo.scss @@ -0,0 +1,5 @@ +.logo { + font-family: font-family('primary', 'medium'); + font-size: font-size('large'); + color: color('primary'); +} diff --git a/src/sass/components/header/_header-nav.scss b/src/sass/components/header/_header-nav.scss new file mode 100644 index 0000000..5c66c6f --- /dev/null +++ b/src/sass/components/header/_header-nav.scss @@ -0,0 +1,78 @@ +//colors +$color_alto_approx: color('primary'); + +@media screen and (max-width: 50em) { + .primary-nav-wrap { + ul { + float: right; + margin: 0; + padding: 0; + a { + display: block; + line-height: 32px; + padding: 0 15px; + } + li { + padding: 0 1em 0 0; + margin: 0 1em 0 0; + &.current-menu-item { + background: $color_alto_approx; + } + &:hover { + background-color: $color_alto_approx; + position: absolute; + > ul { + -webkit-transition: 2s 2s; + float: right; + display: block; + padding: 0 1em 0 0; + margin: 0 1em 0 0; + } + } + } + ul { + -webkit-transition: 2s 2s; + background-color: $color_alto_approx; + position: relative; + display: none; + top: 100%; + left: 0; + padding: 0 1em 0 0; + margin: 0 1em 0 0; + li { + width: 200px; + } + a { + line-height: 120%; + padding: 10px 15px; + } + ul { + top: 0; + } + } + } + } +} + +@media screen and (min-width: 50em) { + .mobile-nav { + display: none; + } + .main-nav { + li { + ul:hover { + display: block; + position: absolute; + } + } + li { + display: inline-block; + padding-right: 1em; + ul { + li { + display: none; + } + } + } + } +} diff --git a/src/sass/components/header/_header.scss b/src/sass/components/header/_header.scss new file mode 100644 index 0000000..86480d7 --- /dev/null +++ b/src/sass/components/header/_header.scss @@ -0,0 +1,21 @@ +.header-container { + background-color: color('primary'); + @include flex-box($align: center, $wrap: wrap, $direction: row, $justify: space-between); + align-content: flex-start; + padding: 4em 3em 4em 2em; + + h1 { + color: color('base'); + } + + a { + color: color('base'); + font-family: font-family('primary', 'regular'); + font-size: font-size('x-small'); + &:hover { + color: color('accent'); + } + } +} + + diff --git a/src/sass/components/header/_index.scss b/src/sass/components/header/_index.scss new file mode 100644 index 0000000..dcfe642 --- /dev/null +++ b/src/sass/components/header/_index.scss @@ -0,0 +1,3 @@ +@import "header-logo"; +@import "header-nav"; +@import "header"; diff --git a/src/sass/main.scss b/src/sass/main.scss new file mode 100644 index 0000000..1255e52 --- /dev/null +++ b/src/sass/main.scss @@ -0,0 +1,6 @@ +@import "bourbon"; +@import "neat"; +@import "base/index"; +@import "typography/index"; +@import "utils/index"; +@import "components/index"; diff --git a/src/sass/typography/_icons.scss b/src/sass/typography/_icons.scss new file mode 100644 index 0000000..5e04f9e --- /dev/null +++ b/src/sass/typography/_icons.scss @@ -0,0 +1,28 @@ +%icon-font-base { + font-family: 'icomoon'; + speak: none; + font-style: normal; + font-weight: normal; + font-variant: normal; + text-transform: none; + line-height: 1; +} + +$iconPrimary: +(pinterest 1.5em "\e800") +(google 1.5em "\e801") +(twitter 1.5em "\e802") +(facebook 1.5em "\e803") +(linkedin 1.5em "\e804"); + +@each $iconP in $iconPrimary { + .icon-#{nth($iconP, 1)} { + @extend %icon-font-base; + font-size: #{nth($iconP, 2)}; + color: #1e1d24; + width: 100%; + &:before { + content: nth($iconP, 3); + } + } +} diff --git a/src/sass/typography/_index.scss b/src/sass/typography/_index.scss new file mode 100644 index 0000000..c8b0f44 --- /dev/null +++ b/src/sass/typography/_index.scss @@ -0,0 +1 @@ +@import "icons"; diff --git a/src/sass/utils/_functions.scss b/src/sass/utils/_functions.scss new file mode 100644 index 0000000..14b6f4f --- /dev/null +++ b/src/sass/utils/_functions.scss @@ -0,0 +1,17 @@ + +// Map-Get Function for Colors + +@function color($key: 'primary') { + @return map-get($colors, $key); +} + +//Map-Get Function for font-size: +@function font-size($key: 'x-small') { + @return map-get($font-size, $key); +} + +//Map-Get Function for Font-Family +@function font-family($font-name, $font-variant) { + @return map-get(map-get($font-family, $font-name), $font-variant); +} + diff --git a/src/sass/utils/_globalMixins.scss b/src/sass/utils/_globalMixins.scss new file mode 100644 index 0000000..3da3032 --- /dev/null +++ b/src/sass/utils/_globalMixins.scss @@ -0,0 +1,15 @@ +@mixin flex-box($align: null, $wrap: null, $direction: null, $justify: null, $basis: null) { + @include display(flex); + @include align-items($align); + @include flex-wrap($wrap); + @include flex-direction($direction); + @include justify-content($justify); + @include flex-basis($basis); +} + +@mixin flexitem { + -webkit-flex-grow: 1; + -webkit-flex-shrink: 0; + flex-grow: 1; + flex-shrink: 0; +} diff --git a/src/sass/utils/_index.scss b/src/sass/utils/_index.scss new file mode 100644 index 0000000..aa2ed81 --- /dev/null +++ b/src/sass/utils/_index.scss @@ -0,0 +1,2 @@ +@import "functions"; +@import "_globalMixins"; diff --git a/src/templates/blog.html b/src/templates/blog.html new file mode 100644 index 0000000..084a9e7 --- /dev/null +++ b/src/templates/blog.html @@ -0,0 +1,37 @@ + +
+

Blog

+
+ +
+
+ +
+

{{ vm.blogpost.title }}

+

{{ vm.blogpost.text }}

+ + View All + Edit +
+
diff --git a/src/templates/blogpost.html b/src/templates/blogpost.html new file mode 100644 index 0000000..cad79df --- /dev/null +++ b/src/templates/blogpost.html @@ -0,0 +1,41 @@ + +
+

Blog

+

The secular cooling that must someday overtake our planet has already gone far indeed with our neighbour. Its physical condition is still largely a mystery, but we know now that

+
+ + + + +
+ +
+

{{ blogpost.title }}

+

{{ blogpost.text | limitTo: 300 }}{{ blogpost.text.length > 300 ? '...' : '' }}

+ + Read More + Delete +
+ Add New +
diff --git a/src/templates/form.html b/src/templates/form.html new file mode 100644 index 0000000..fb7699d --- /dev/null +++ b/src/templates/form.html @@ -0,0 +1,31 @@ +
+

Add or Edit A Blogpost

+
+ + + + +
+ + + + + +
From 4179590c688d994ca7895e4e3f7c95240bdce55f Mon Sep 17 00:00:00 2001 From: Alina To Date: Mon, 12 Oct 2015 22:29:56 -0700 Subject: [PATCH 02/39] Continue refactor of Week 6 project, removed Node Express server and MongoDB features --- package.json | 1 + 1 file changed, 1 insertion(+) diff --git a/package.json b/package.json index 51dd28e..359a5d2 100644 --- a/package.json +++ b/package.json @@ -6,6 +6,7 @@ "angular": "^1.4.7", "angular-route": "^1.4.7", "bourbon": "^4.2.5", + "github-api": "^0.10.6", "gulp": "^3.8.11", "gulp-autoprefixer": "^2.1.0", "gulp-changed": "^1.1.1", From ae096af7261de35970cdc9cda489c921025e04b9 Mon Sep 17 00:00:00 2001 From: Alina To Date: Mon, 12 Oct 2015 22:36:27 -0700 Subject: [PATCH 03/39] Add gulp html task --- gulp/config.js | 4 ++++ gulp/tasks/default.js | 2 +- gulp/tasks/html.js | 7 +++++++ 3 files changed, 12 insertions(+), 1 deletion(-) create mode 100644 gulp/tasks/html.js diff --git a/gulp/config.js b/gulp/config.js index 4b8b4d9..d7179b3 100755 --- a/gulp/config.js +++ b/gulp/config.js @@ -19,6 +19,10 @@ module.exports = { indentedSyntax: true, } }, + html: { + src: src + "/templates/*.html", + dest: dest + "/templates/", + }, server: { src: dest, livereload: true, diff --git a/gulp/tasks/default.js b/gulp/tasks/default.js index 895d489..55a2a9c 100644 --- a/gulp/tasks/default.js +++ b/gulp/tasks/default.js @@ -1,4 +1,4 @@ var gulp = require('gulp'); -gulp.task('default', ['sass', 'webpack', 'watch', 'serve']); +gulp.task('default', ['sass', 'html', 'webpack', 'watch', 'serve']); diff --git a/gulp/tasks/html.js b/gulp/tasks/html.js new file mode 100644 index 0000000..0b29aff --- /dev/null +++ b/gulp/tasks/html.js @@ -0,0 +1,7 @@ +var gulp = require("gulp"); +var config = require('../config').html; + +gulp.task('html', function() { + return gulp.src(config.src) + .pipe(gulp.dest(config.dest)); +}); From c749ad2fbc30c91641e9831c25bef889e9f10d3d Mon Sep 17 00:00:00 2001 From: Alina To Date: Tue, 13 Oct 2015 07:41:26 -0700 Subject: [PATCH 04/39] Rename /templates to /html --- gulp/config.js | 4 +- gulp/tasks/sass.js | 2 +- package.json | 3 +- src/assets/.gitkeep | 0 src/{templates => html}/blog.html | 0 src/{templates => html}/blogpost.html | 0 src/{templates => html}/form.html | 0 src/html/index.html | 100 +++++++++ src/js/app.js | 11 +- src/js/blog-ctrl.js | 16 +- src/js/blog-service.js | 8 +- src/js/github-adapter.js | 282 ++++++++++++++++++++++++++ 12 files changed, 412 insertions(+), 14 deletions(-) delete mode 100644 src/assets/.gitkeep rename src/{templates => html}/blog.html (100%) rename src/{templates => html}/blogpost.html (100%) rename src/{templates => html}/form.html (100%) create mode 100644 src/html/index.html create mode 100644 src/js/github-adapter.js diff --git a/gulp/config.js b/gulp/config.js index d7179b3..d754466 100755 --- a/gulp/config.js +++ b/gulp/config.js @@ -20,8 +20,8 @@ module.exports = { } }, html: { - src: src + "/templates/*.html", - dest: dest + "/templates/", + src: src + "/html/*.html", + dest: dest + "/html/", }, server: { src: dest, diff --git a/gulp/tasks/sass.js b/gulp/tasks/sass.js index b867c64..0dbee54 100755 --- a/gulp/tasks/sass.js +++ b/gulp/tasks/sass.js @@ -24,7 +24,7 @@ gulp.task('sass', function () { .pipe(sourcemaps.write()) - .pipe(autoprefixer({ browsers: ['last 2 version'], cascade: false })) + // .pipe(autoprefixer({ browsers: ['last 2 version'], cascade: false })) .pipe(gulp.dest(config.dest)); }); diff --git a/package.json b/package.json index 359a5d2..7af262f 100644 --- a/package.json +++ b/package.json @@ -4,9 +4,10 @@ "description": "", "dependencies": { "angular": "^1.4.7", + "angular-cookies": "^1.4.7", "angular-route": "^1.4.7", "bourbon": "^4.2.5", - "github-api": "^0.10.6", + "github-api": "git+ssh://git@github.com/jedfoster/github.git", "gulp": "^3.8.11", "gulp-autoprefixer": "^2.1.0", "gulp-changed": "^1.1.1", diff --git a/src/assets/.gitkeep b/src/assets/.gitkeep deleted file mode 100644 index e69de29..0000000 diff --git a/src/templates/blog.html b/src/html/blog.html similarity index 100% rename from src/templates/blog.html rename to src/html/blog.html diff --git a/src/templates/blogpost.html b/src/html/blogpost.html similarity index 100% rename from src/templates/blogpost.html rename to src/html/blogpost.html diff --git a/src/templates/form.html b/src/html/form.html similarity index 100% rename from src/templates/form.html rename to src/html/form.html diff --git a/src/html/index.html b/src/html/index.html new file mode 100644 index 0000000..3e030bb --- /dev/null +++ b/src/html/index.html @@ -0,0 +1,100 @@ + + + + + + + AwesomeBlog! + + + +
+

intelly

+ +
+ + + +
+ + +
+
+

Serene in their assurance of their empire over matter

+

No one would have believed in the last years of the nine-teenth century that this world was being watched keenly and closely by intelligence grater than man's

+ +
+
+
+
+ 2319 Hilltop Haven Drive
+ Upper Greenwood Lake, NJ 07421 +
+
+ +
+ +
+ + + + + + + + + diff --git a/src/js/app.js b/src/js/app.js index dab2a3f..d209eb4 100644 --- a/src/js/app.js +++ b/src/js/app.js @@ -1,32 +1,33 @@ require('angular'); require('angular-route'); +require('./github-adapter.js'); (function(){ 'use strict'; // Declare app level module which depends on filters, and services - var AwesomeBlogApp = angular.module('AwesomeBlog', ['ngRoute']). + var AwesomeBlogApp = angular.module('AwesomeBlog', ['ngRoute', 'github-adapter']). config(["$routeProvider", function ($routeProvider) { $routeProvider ////route home page blog posts////////// .when("/blogposts", { - templateUrl: "templates/blogpost.html", + templateUrl: "html/blogpost.html", controller: "BlogpostsCtrl as vm", }) /////form to make more blog posts/////// .when("/blogposts/new", { - templateUrl: "templates/form.html", + templateUrl: "html/form.html", controller: "BlogFormCtrl as vm", }) .when("/blogposts/:blogpost_id/edit", { - templateUrl: "templates/form.html", + templateUrl: "html/form.html", controller: "BlogFormCtrl as vm", }) .when("/blogposts/:blogpost_id", { - templateUrl: "templates/blog.html", + templateUrl: "html/blog.html", controller: "BlogpostCtrl as vm", }) .otherwise({ diff --git a/src/js/blog-ctrl.js b/src/js/blog-ctrl.js index fa782d3..e9253f8 100644 --- a/src/js/blog-ctrl.js +++ b/src/js/blog-ctrl.js @@ -6,8 +6,20 @@ angular.module("AwesomeBlog").controller("BlogpostCtrl", ["BlogpostService", "$r start(); function start() { - BlogpostService.get($routeParams.blogpost_id).then(function(resp) { - vm.blogpost = resp.data; + BlogpostService + .get($routeParams.blogpost_id) + .then(function(resp) { + + console.log(resp); + + vm.blogpost = {}; + vm.blogpost.content = ''; + for (file in resp.files) { + vm.blog.content += resp.files[file].content; + } + + vm.blog.date = resp.updated_at; + vm.blog.author = resp.owner.login; }); } }]); diff --git a/src/js/blog-service.js b/src/js/blog-service.js index 04a2af6..a038bc6 100644 --- a/src/js/blog-service.js +++ b/src/js/blog-service.js @@ -1,17 +1,19 @@ require("./app"); +require("./github-adapter.js"); (function () { "use strict"; - angular.module("AwesomeBlog").service("BlogpostService", ["$http", function ($http) { + angular.module("AwesomeBlog").service("BlogpostService", ["$http", "$githubGist",function ($http, $githubGist) { var urlRoot = "/blogposts"; var Blog = { get: function (id) { if (angular.isDefined(id)) { - return $http.get(urlRoot + "/" + id); + return $githubGist(id).read(); } else { - return $http.get(urlRoot); + // return $http.get(urlRoot); + console.warn('root url'); } }, update: function (blog) { diff --git a/src/js/github-adapter.js b/src/js/github-adapter.js new file mode 100644 index 0000000..82479d9 --- /dev/null +++ b/src/js/github-adapter.js @@ -0,0 +1,282 @@ +'use strict' + +require('angular'); +require('angular-cookies'); + +var Github = require('github-api'); + +angular.module('github-adapter', ['ng', 'ngCookies']).factory('$githubUser', [ + '$q', '$rootScope', function($q, $rootScope) { + return function(user) { + var userPromiseAdapter; + userPromiseAdapter = { + notifications: function() { + var deferred; + deferred = $q.defer(); + user.notifications(function(err, data) { + $rootScope.$apply(function() { + if (err) { + deferred.reject(err); + } else { + deferred.resolve(data); + } + }); + }); + return deferred.promise; + }, + gists: function() { + var deferred; + deferred = $q.defer(); + user.gists(function(err, data) { + $rootScope.$apply(function() { + if (err) { + deferred.reject(err); + } else { + deferred.resolve(data); + } + }); + }); + return deferred.promise; + }, + orgRepos: function(name) { + var deferred; + deferred = $q.defer(); + user.orgRepos(name, function(err, data) { + $rootScope.$apply(function() { + if (err) { + deferred.reject(err); + } else { + deferred.resolve(data); + } + }); + }); + return deferred.promise; + }, + orgs: function() { + var deferred; + deferred = $q.defer(); + user.orgs(function(err, data) { + $rootScope.$apply(function() { + if (err) { + deferred.reject(err); + } else { + deferred.resolve(data); + } + }); + }); + return deferred.promise; + }, + repos: function() { + var deferred; + deferred = $q.defer(); + user.repos(function(err, data) { + $rootScope.$apply(function() { + if (err) { + deferred.reject(err); + } else { + deferred.resolve(data); + } + }); + }); + return deferred.promise; + }, + show: function(username) { + var deferred; + deferred = $q.defer(); + user.show(username, function(err, data) { + $rootScope.$apply(function() { + if (err) { + deferred.reject(err); + } else { + deferred.resolve(data); + } + }); + }); + return deferred.promise; + }, + userGists: function(username) { + var deferred; + deferred = $q.defer(); + user.userGists(username, function(err, data) { + $rootScope.$apply(function() { + if (err) { + deferred.reject(err); + } else { + deferred.resolve(data); + } + }); + }); + return deferred.promise; + }, + userRepos: function(username) { + var deferred; + deferred = $q.defer(); + user.userRepos(username, function(err, data) { + $rootScope.$apply(function() { + if (err) { + deferred.reject(err); + } else { + deferred.resolve(data); + } + }); + }); + return deferred.promise; + } + }; + return userPromiseAdapter; + }; + } +]).factory('$githubGist', [ + '$q', '$cookies', function($q, $cookies) { + return function(gistId) { + var gist, gistPromiseAdapter, github; + github = new Github({ + token: $cookies.get('gh') || '87c755928d2db694fc764b7517a049e992f392a0', + auth: 'oauth' + }); + gist = github.getGist(gistId); + gistPromiseAdapter = { + create: function(options) { + var deferred; + deferred = $q.defer(); + gist.create(options, function(err, res) { + if (err) { + deferred.reject(err); + } else { + deferred.resolve(res); + } + }); + return deferred.promise; + }, + "delete": function() { + var deferred; + deferred = $q.defer(); + gist["delete"](function(err, res) { + if (err) { + deferred.reject(err); + } else { + deferred.resolve(res); + } + }); + return deferred.promise; + }, + fork: function() { + var deferred; + deferred = $q.defer(); + gist.fork(function(err, gist) { + if (err) { + deferred.reject(err); + } else { + deferred.resolve(gist); + } + }); + return deferred.promise; + }, + read: function() { + var deferred; + deferred = $q.defer(); + gist.read(function(err, gist) { + if (err) { + deferred.reject(err); + } else { + deferred.resolve(gist); + } + }); + return deferred.promise; + }, + update: function(options) { + var deferred; + deferred = $q.defer(); + gist.update(options, function(err, gist) { + if (err) { + deferred.reject(err); + } else { + deferred.resolve(gist); + } + }); + return deferred.promise; + } + }; + return gistPromiseAdapter; + }; + } +]).factory('$sassMeisterGist', [ + '$q', '$cookies', '$githubGist', function($q, $cookies, $githubGist) { + return { + create: function(scope, cb) { + var content, files, sass; + files = {}; + sass = scope.app.sass; + sass = sass.replace(/(^\/\/ [\-]{3,4}\n(?:\/\/ .+\n)*\/\/ [\-]{3,4}\s*)*/, ''); + sass = "" + (buildFrontmatter(scope.app.dependencies)) + sass; + files["SassMeister-input." + scope.app.syntax] = { + content: sass + }; + if (scope.app.css.length !== 0) { + files['SassMeister-output.css'] = { + content: scope.app.css + }; + } + if (scope.app.html) { + files["SassMeister-input-HTML." + scope.app.htmlSyntax] = { + content: scope.app.html + }; + files['SassMeister-rendered.html'] = { + content: scope.app.renderedHTML + }; + } + content = { + description: 'Generated by SassMeister.com.', + files: files + }; + return $githubGist().create(content).then(cb); + }, + update: function(id, scope, cb) { + var content, ext, filename, files, sass; + files = {}; + sass = scope.app.sass; + sass = sass.replace(/(^\/\/ [\-]{3,4}\n(?:\/\/ .+\n)*\/\/ [\-]{3,4}\s*)*/, ''); + sass = "" + (buildFrontmatter(scope.app.dependencies)) + sass; + if (scope.sassFileName.substr(-4, 4) !== scope.app.syntax) { + files[scope.sassFileName] = { + content: null + }; + scope.sassFileName = "" + (scope.sassFileName.substr(0, scope.sassFileName.length - 4)) + scope.app.syntax; + } + files[scope.sassFileName] = { + content: sass + }; + files[scope.cssFileName] = { + content: scope.app.css + }; + if (scope.app.html) { + if (!scope.htmlFileName) { + scope.htmlFileName = "SassMeister-input-HTML." + scope.app.htmlSyntax; + } else { + filename = scope.htmlFileName.split('.'); + ext = filename.pop(); + if (ext !== scope.app.htmlSyntax) { + files[scope.htmlFileName] = { + content: null + }; + scope.htmlFileName = (filename.join('.')) + "." + scope.app.htmlSyntax; + } + } + files[scope.htmlFileName] = { + content: scope.app.html + }; + files[scope.renderedHtmlFileName] = { + content: scope.app.renderedHTML + }; + } + content = { + files: files + }; + return $githubGist(id).update(content).then(cb); + }, + fork: function(id, cb) { + return $githubGist(id).fork().then(cb); + } + }; + } +]); From 703f36247c0e2014d9cf16ea477bf617da154b65 Mon Sep 17 00:00:00 2001 From: Alina To Date: Tue, 13 Oct 2015 09:26:51 -0700 Subject: [PATCH 05/39] Add gulp/tasks/index.js to pipe index.html --- .gitignore | 2 +- build/css/fonts/RobotoSlab-Light.ttf | Bin 0 -> 179096 bytes build/css/fonts/RobotoSlab-Regular.ttf | Bin 0 -> 169064 bytes build/css/fonts/Ubuntu-B.ttf | Bin 0 -> 333612 bytes build/css/fonts/Ubuntu-L.ttf | Bin 0 -> 415552 bytes build/css/fonts/Ubuntu-LI.ttf | Bin 0 -> 409608 bytes build/css/fonts/Ubuntu-M.ttf | Bin 0 -> 341324 bytes build/css/fonts/Ubuntu-R.ttf | Bin 0 -> 353824 bytes build/css/fonts/icomoon.eot | Bin 0 -> 2320 bytes build/css/fonts/icomoon.svg | 15 + build/css/fonts/icomoon.ttf | Bin 0 -> 2156 bytes build/css/fonts/icomoon.woff | Bin 0 -> 2232 bytes build/html/blog.html | 37 + build/html/blogpost.html | 41 + build/html/form.html | 31 + build/js/app.js | 46 + build/js/blog-ctrl.js | 30 + build/js/blog-details-directive.js | 15 + build/js/blog-form-ctrl.js | 39 + build/js/blog-service.js | 31 + build/js/blogposts-ctrl.js | 30 + build/js/entry.js | 2 + build/js/github-adapter.js | 282 + build/js/index.js | 5 + build/js/packed.js | 35095 +++++++++++++++++++++++ gulp/config.js | 10 +- gulp/tasks/assets.js | 9 - gulp/tasks/default.js | 2 +- gulp/tasks/html.js | 1 + gulp/tasks/index.js | 7 + 30 files changed, 35714 insertions(+), 16 deletions(-) create mode 100755 build/css/fonts/RobotoSlab-Light.ttf create mode 100755 build/css/fonts/RobotoSlab-Regular.ttf create mode 100644 build/css/fonts/Ubuntu-B.ttf create mode 100644 build/css/fonts/Ubuntu-L.ttf create mode 100644 build/css/fonts/Ubuntu-LI.ttf create mode 100644 build/css/fonts/Ubuntu-M.ttf create mode 100644 build/css/fonts/Ubuntu-R.ttf create mode 100755 build/css/fonts/icomoon.eot create mode 100755 build/css/fonts/icomoon.svg create mode 100755 build/css/fonts/icomoon.ttf create mode 100755 build/css/fonts/icomoon.woff create mode 100644 build/html/blog.html create mode 100644 build/html/blogpost.html create mode 100644 build/html/form.html create mode 100644 build/js/app.js create mode 100644 build/js/blog-ctrl.js create mode 100644 build/js/blog-details-directive.js create mode 100644 build/js/blog-form-ctrl.js create mode 100644 build/js/blog-service.js create mode 100644 build/js/blogposts-ctrl.js create mode 100644 build/js/entry.js create mode 100644 build/js/github-adapter.js create mode 100644 build/js/index.js create mode 100644 build/js/packed.js delete mode 100644 gulp/tasks/assets.js create mode 100644 gulp/tasks/index.js diff --git a/.gitignore b/.gitignore index d16866a..8826134 100644 --- a/.gitignore +++ b/.gitignore @@ -25,4 +25,4 @@ build/Release # Dependency directory # https://www.npmjs.org/doc/misc/npm-faq.html#should-i-check-my-node_modules-folder-into-git node_modules -build + diff --git a/build/css/fonts/RobotoSlab-Light.ttf b/build/css/fonts/RobotoSlab-Light.ttf new file mode 100755 index 0000000000000000000000000000000000000000..ccb99cd02ba5c471de2f2c77b62feb6b595adcb4 GIT binary patch literal 179096 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%0A(fu) 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

Z8slMyX5 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 @!}{V+LbvSA)FIz(?$_ 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%0AC;aQRjSv_ruT9{*}0X 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⪚H(fOnv?M6)Y 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

E=@@7_QA{t=S~+oaXdBZ{_;)- zB7Z)a=>F%qT9?MYa^!rmF{`g8T={s*ijRI@*s}7PIZF?pOMF@T@|0_{i7zaVy_Ixm z+Q*CL-+b%Z#!f9e^jp3~ojzK1{rFCa`3~OA==|G^Yd3$4`TVs6AK=VWwvlR^fj0qo z**eMAEi3vc$dCg}7}&B`Qdr%Tuv&@TyT2S(H#KG8022$w+lpi4fCZy6gKH)yrlp0I za6nzUG>+LaAU$J=ailt}p&$!uDSq;3OKlOETy_&hc*O5x<|YAaj5 zO!*S!%3@AG8T)N1b|~-LQzIK)Em8VP=aubb``L*j+EpCTZQf5ODt{Zja!1JnFQ2XO zb0u5&sPRi|e#^gpV{_$6E%j+Xe0VZ}fe z=E$_$V%*!&?(1skd%mcu-@P{c=G^NEpY`r>Y<>O(9goHKxSYT5nsfP^HxR|^eLH2~ z(N#saU;DL3Kewq%Zv8R%)fvCeyt!=ityM!NZv5hWMBLOlKl>#0?{n9uR*M0)Nt>s} zw2i6kn%>~%`sRzid1GIrB5nIFE4}rTg#q!u=6>hef)Qn$-gKR^x5C1RH#XG2{KcO= z@6{gvL55%XGi63E8=AlDpZ<4W%=1yY&HsV#`!lPK@@Q&dzY^%FI0roT=lsMH?V^f~yG%?I6YU{6<@Gti_a zg{`E8J%HPa*oe5B*aWyOz!A4OfPt+JWmG_~Y6DuE4zxC=^wR@Q@t)l?(ON^wCrqzp zt6{6=tivg6wf!edCzM-a?fzCpf?+zH+6o4 z^hqstmEBdV{&klLeM^2n`Iq-wf9`8@sx-Pp!B=*C>o%wGtO=*;9Eb?_Q$06%A5QV= z_{xxsPq(&>-neC2!8z@3&7W20*0i(Tb`_s6t7uXAeQIpcAIi!iYnxu{b)euo8P7a<_xc(1&uKxK&y@`IcJu8$+IaYf~?HSc~96VC1NtIRU zFCCiU+bVY38#9-EINy2H8^Z=V|M87qBhQTfTYjj#!so@?7jHDLRw%0e>5ztR%qf-O zJmaKK`|rk->8?trqzvkR<>u&SQ##F4Ef!1+?^eKn>h4uvJ9Vq@%52xEPmWw} z6IlPV7p@%XTyM>07IRp4v62>(&A(o%7dNuQgAa^Hq3YpFakxFB=aVzWMig z?f>|!+N_=V{2zS1{d%V~k86Y0eRTKbDQg$I^qi5`z!35{^7IjGnco=51L-m*{{Qd(7=1Hvn#vh z`|XY4dHVN0J2}Aiu++qEspYO^1k0Hr??=swzdK}0%OiKs#kW;6GWK*m{(kMWW#81^ zQFz&*k=larmwS&}xxDe7y^VI348IsWcJ3!{RqyY=BkbIp({@)pHsIdS4XTK-Dd<=20HefJ0b zUDsY|61hAr=InvHjUGh4cqTDVdV_~;^1tCVuwLBW=Dh=^Yd(pS4t-bcYwt$aw#@gg zIs5ZzZigmy{m5hQ*pXXHxSx&rwDx(APot(TUKQQG&4RLC3qyt-U-v1b!)m|-Q3eih z(M!Ml$$Q_Q$<|ZDPM9KEHz78B!-5T*;=nU{F zuD;HVQu=pK>2G2{qU*B5zP6ybx#)*kN!y5JO*E>C_d%PK{at!@Tmgh{n z6%W?7UtamQVUgEno*kWkWzhD8pWJa@IQ_8Si2+61-_TP>w%haaul{Xv1;$o>HKTd+ z(`DUj53b_+kC?F~t2A2j=cZhPmZltTUua6rw7t7*Qya+m=i&K#q`vha)+HeW(F5m^L0m6i0n34nD>viK7ST@H*4c#*Wy#p27bjMah?h3SoK4Q%x+8LOXk3D9iiZDk#J zk{Bzmzh;t)+eQqxQi8uqx24(&Tkqhn0w2R)6}L6WjHQjK@(ktm?B2O||MaBPeo5VX zW1$7@O3%U;=EyhN#pBA8o7en4G{r5K`};55Irc@sHwQl|nhi5BAGLbf?7Riz23?Q7 zeB*=4PCj3Z9`;k0S<6y-hlQ!6SsAn6{-*of-@1G^q{iN)O~EmJCr+rj_TC5I4bd(R z{qE|lV+|XR-tcO}9ra6^wD!}$LCxF!_~nmV z3;Oil_R{@>V1))O+BUs!(?Q3oj!U~ex#n!mz>E3t{yQzMGZ_e)+~vYk_VEpTS( zI_14T^j_0^db|6#<3~D4;Lty@z-JqA`2Q5L)G{f8ecf{Uh%q*AhlNV_cv^k&bIxTh zW=6?)7llOxtcBY0WiB%2Qt|E%iF8}A!&~lnPmpT+YG_^v9@YYCE&`EG zdrt7ULE+~&Cmg8y<(_aySOm+agW#vXQm^^!f3%6Pm2^|<4-D+Ibn@ZS%SWvIef(D= zx3)X8_{$ZZKjg1{?BLv`7x#M3EdFqFzb@l$d@!~DzBv&OYX7wG%)NIK;`O2+u)6c@%SXM^)^rJ3?pJikfZ~hx-8tj3v4!uJNy|Id__WU#<=@;> zBmL&77C&D#n ze*3%HiI<85b?z7W^| zYVSSg_>o#Scy(szJn?^To!4PW+W|&9Vu2$Qf>eC&%oi64$jc0IiudAG;5ueHAB-FI7zs@ty7t4(jzPyYV>#;zqJ?^U>b zuziyj8H0y;f4XvFt-(D4A}hDeeg9OWxDP*^@Y(I#_eX_po3JTQjs2Ck?7Z7>f3f6i ztrjoTa@CfX+^@dbVdMO%(?e5Tf3CNo_I=s-?&`FP^D_os_;7Pv^%=F&s$Y#=Ttxr! zg7=LthP69)^T3Yd6HiTOU3+=i!j=0M8a#IU=yAK_C)8|yy2U3g+}*EknD|=l6IYW{ z-#NY^>g}zqhV9?Gb6#@z)Ed7Q`>4aJgw|CSyfCzxU)w@qzQ3+%_^{rCUrr=6_-*-( Kpfy)8+y5Un#ev@d literal 0 HcmV?d00001 diff --git a/build/css/fonts/Ubuntu-R.ttf b/build/css/fonts/Ubuntu-R.ttf new file mode 100644 index 0000000000000000000000000000000000000000..d748728a20789bf5f95e524f3d508f54c67f9475 GIT binary patch literal 353824 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 HZ~K1%`Nrw3 literal 0 HcmV?d00001 diff --git a/build/css/fonts/icomoon.eot b/build/css/fonts/icomoon.eot new file mode 100755 index 0000000000000000000000000000000000000000..a94b0fde704f2ad9d7126dc9410abe17b4935813 GIT binary patch literal 2320 zcmaJ@O>7%Q6n<}Zy=(8N2%1vW?bStzDUabnj$=>~#SC=0c@BCw}nWw*Uh9KyHBu@hEyuUy1p=)#5*(BWb^ou+opqh>Jeqx1Mcn89{`>#JKghpQpIp-$g+3a_-`2apaGh zE<1iN<`{Uk9&t~(`{03-H0_weR8NHIBV#O^Nixly#Ds!kJeQB>d|rk5yki(oBvCx=B&G+D49be^ysml#ky4Ie z3#cA1rE1_lP1UkmR?q6Hu39LDycAR;h6og_<*5!B6g?E8A2U1l%M$Vp+Zbc$TwDu~ zkjOJB>TW@CyDKO;kx*Iu3L_}s!gy^@iIz+3><{Z>CUHPL_(&;(Q z?2;UC1jCH$3kI~GqJHFD4#z=fP(vZ#O>1;#&7AL`uscL@Da?>`#H)|wNS6f3VS-VN zpsywLHqb}BK3YX2TkE}Fu%CO+%#Zg^_6T+%HX4YgC5w$09Rf+OKAP_oSJz2T{E}z47pZ^TfX(^F#prek^!nr)}>(v=NiWtwJ&8UP=NOg?qYd zhiiG*T0Jep2qW9`d^LL|+Sej*6_4NsK4nGoOE$PhdxcT9M>LK0OM$!X@eoAfj4TXK z5iYhdM>yBUJmIxAw$SOPwy{9`WE)Fx5I!~bZr(TzYOOSy(i?fZTMx(y>B%i6QtS&a{(R4D^`S|V_)sdX8RM%?dmA&_Zj-F>4 z^=7nMsaICY&B|Q#(v|4MY@d>Sts&tvCn-_{QG^w2fdBvi literal 0 HcmV?d00001 diff --git a/build/css/fonts/icomoon.svg b/build/css/fonts/icomoon.svg new file mode 100755 index 0000000..2a73939 --- /dev/null +++ b/build/css/fonts/icomoon.svg @@ -0,0 +1,15 @@ + + + +Generated by IcoMoon + + + + + + + + + + + \ No newline at end of file diff --git a/build/css/fonts/icomoon.ttf b/build/css/fonts/icomoon.ttf new file mode 100755 index 0000000000000000000000000000000000000000..e025ff23c1262bbb3b8bf5a52f3bead2002a42e2 GIT binary patch literal 2156 zcmaJ?OKcle6utM&c*dTw$4>3>rye_wC$XEKYiIoFFOl1nLWtd{p#%w#S~qr_h{TQ( zM@iv55M8vJf3fH1OOS{0S?l0FCCt6AK-r@%~v!pF0NJ9g9|@@2!I;N=j)Ztby__no2$LPdS&V1 zy^}?fw*mMY%e6{XeEZEW0R-}a{4y!TJKPT>zd-Wf@>*;AAV8JmRa0JVE>^e_{|U+0 zN%pN(w%5T8?~{C+M$7`{Y39_()?PWwO9LK`kX`~iF#1D? zJ?3|x?(SMqvBzLx-2EfSQ(X7H2uNP;E*%3X9JO4Y`Tf6+fp7OA_k_C-J~&Bf#}%gf zqRg0>V!3RJ>E0A36%-TsLLwjVD=grj!bCEK3I?Jmrm!%Dg}mRiBpEE-yLR^MwR=l@ zYdjeCO0gklLJ5o<)+Ci5Ok@L6ApUAOW9PL4WBrU^HZrN9@14kr{|2Ep&F`t*_}DxgJG{mbSccFbi!{;3DrSbH0=cq3{<2eKgIMw4^PVY1NIO`^x zJo*G3^;|YV+0Z47SU70}j47huAHn?zZC9&CK#K%}VT^?E)5T!e7ZMm&5f^MsN)KmF z?$7e+3>J4D;BrJ&HBD6`J2&q3CxR}UOZ?*ZsG*K|22Vf#HF0M4Aey)4@BVbbec~^W zd8?)UaxDC@3EFF?`%oh$j@yG`tX@h4n1g%L)#2J6j<%&Om|-OQ{yQzJM13s^SMdnm z#V4#}?c{)K)GN%fccLY9UJBgloQEKi&aA@p6yahAbAkk?)D9L%Kik0) z9E1dbA%^5m?!*J2iw38^mVdg1=7!VumoASy|UO`Yc?CO0*lau zHJVLmEYvnOSDKAjCY6Q-sKEwok^>oNpA4iR-7~7Ea=upITCHr*p*2c$3s#{58$CVG zG#jm0z1FC0R9dxa?9!Fk%wn@lxuxKYb#{wRuhTXSE29duXswd&5?rD8j8#CnT>$0S L{!&`R_kR5YV~lCQ literal 0 HcmV?d00001 diff --git a/build/css/fonts/icomoon.woff b/build/css/fonts/icomoon.woff new file mode 100755 index 0000000000000000000000000000000000000000..62db938c894923229afe40695127c5078e8dbb3d GIT binary patch literal 2232 zcmaJ?O>7%g5T1Fv-nDn_wNrcjQ~$*ACU*1Z###ULFOl1npb)!O0|W^wwQlS<5s6(T zj@k+&gw%or2M|K2y`UbrA$n*p0fFcNA%u`XZ~}3u=%ErlaN&fSFuUHUDYkgtdGDKf zKQr^~+wtYf>?|Nqvu}fJj%yv=z)!cz^M@w^&`#D1hPV&#zb>s;FOhA9^cM^XF8=gx zqq=F>z9ijPYlx?@c6FI--vID847q>zWO1cltpNz2hiox>T>u1hfzq`CQCW2wF6d!UXmB7g1h@|p^$!tIhBwj9O z?0n?FSU=;|iVN3d;lSw3D7RhSx0Q}4Kfc9$a_)Ti?3=~pt6q6}=9nnv&n^ZN!f+)M zj1EY}@%gIgm@kdJIFlkuZToUL1Ft|6uJy=>Q&1bh%tS&hxLDD=}EeR5~$tM9%u5u!_B2BnjJeKJqH zq=*g^OkoTI9isPuKIsq8Eh5@FeK%p>4bCpl49^b;P9ZTBif1I7gBM)_QQ&uagQ76l zm|}SJkUFS%`W2hstwdaokkU=XPLmV4iHnuVfDip%Oh$Bp@fk-qM3}ZBeA1?*NzL3DMhPY^B(!_A)WOtO0=dieQ4_Bh98i}ZCbmzvM{$$W) zbBUk-7Sq)+&*152zcT9+1q^U&;m(ie-6#GAnK!G{&&R?a7@#v+)yMdsph{&n+GEyI zBEV?eqkR?5w1A^C(@~6Vr2GCW=Bz|@Ee6-{2;RX*tYn_#fa_E%jJD^|RIE;c+m=5B zk!+nx$_QVuFh@9VVV>}og>Cc?s#;he`@DrEI0)|;wVQX4MWLAvW`r9S<_J$&m?!+Y zg>B%6xP=9>FIZTDEPS%M)LL(~ny?B>(1LZ67Bm;@8=I@GW;~OgfJLao25iy-nxJzs zkcNq#yLuWI>W!_n>IONjQ=nV0236STxpKDEY{wh*W__dDuGiuhug2$=T4jnY4YQ{2 lHhFK*F- +

+

Blog

+
+ +
+
+ +
+

{{ vm.blogpost.title }}

+

{{ vm.blogpost.text }}

+ + View All + Edit +
+
diff --git a/build/html/blogpost.html b/build/html/blogpost.html new file mode 100644 index 0000000..cad79df --- /dev/null +++ b/build/html/blogpost.html @@ -0,0 +1,41 @@ + +
+

Blog

+

The secular cooling that must someday overtake our planet has already gone far indeed with our neighbour. Its physical condition is still largely a mystery, but we know now that

+
+ + + + +
+ +
+

{{ blogpost.title }}

+

{{ blogpost.text | limitTo: 300 }}{{ blogpost.text.length > 300 ? '...' : '' }}

+ + Read More + Delete +
+ Add New +
diff --git a/build/html/form.html b/build/html/form.html new file mode 100644 index 0000000..fb7699d --- /dev/null +++ b/build/html/form.html @@ -0,0 +1,31 @@ +
+

Add or Edit A Blogpost

+
+ + + + +
+ + + + + +
diff --git a/build/js/app.js b/build/js/app.js new file mode 100644 index 0000000..d209eb4 --- /dev/null +++ b/build/js/app.js @@ -0,0 +1,46 @@ +require('angular'); +require('angular-route'); +require('./github-adapter.js'); + +(function(){ + + 'use strict'; + // Declare app level module which depends on filters, and services + var AwesomeBlogApp = angular.module('AwesomeBlog', ['ngRoute', 'github-adapter']). + + config(["$routeProvider", function ($routeProvider) { + $routeProvider + + ////route home page blog posts////////// + .when("/blogposts", { + templateUrl: "html/blogpost.html", + controller: "BlogpostsCtrl as vm", + }) + + /////form to make more blog posts/////// + .when("/blogposts/new", { + templateUrl: "html/form.html", + controller: "BlogFormCtrl as vm", + }) + .when("/blogposts/:blogpost_id/edit", { + templateUrl: "html/form.html", + controller: "BlogFormCtrl as vm", + }) + .when("/blogposts/:blogpost_id", { + templateUrl: "html/blog.html", + controller: "BlogpostCtrl as vm", + }) + .otherwise({ + redirectTo: "/blogposts", + }); + + }]); + + // Controller to make DATE work! + AwesomeBlogApp.controller("DateCtrl", ["$scope", function($scope) { + $scope.date = new Date(); + }]); + +}()); + +require('./index.js'); diff --git a/build/js/blog-ctrl.js b/build/js/blog-ctrl.js new file mode 100644 index 0000000..e9253f8 --- /dev/null +++ b/build/js/blog-ctrl.js @@ -0,0 +1,30 @@ +require("./app"); + +angular.module("AwesomeBlog").controller("BlogpostCtrl", ["BlogpostService", "$routeParams", function(BlogpostService, $routeParams) { + var vm = this; + + start(); + + function start() { + BlogpostService + .get($routeParams.blogpost_id) + .then(function(resp) { + + console.log(resp); + + vm.blogpost = {}; + vm.blogpost.content = ''; + for (file in resp.files) { + vm.blog.content += resp.files[file].content; + } + + vm.blog.date = resp.updated_at; + vm.blog.author = resp.owner.login; + }); + } +}]); + + +// GitHub Personal Access Token!!! +// 87c755928d2db694fc764b7517a049e992f392a0 + diff --git a/build/js/blog-details-directive.js b/build/js/blog-details-directive.js new file mode 100644 index 0000000..fb4013a --- /dev/null +++ b/build/js/blog-details-directive.js @@ -0,0 +1,15 @@ +require("./app"); + +(function() { + "use strict"; + + angular.module("AwesomeBlog") + .directive("bl", function () { + return { + scope: { + blogpost: "=blogpost", // functionally the same as ng-model + }, + templateUrl: "templates/blog.html", + }; + }); +})(); diff --git a/build/js/blog-form-ctrl.js b/build/js/blog-form-ctrl.js new file mode 100644 index 0000000..d896fc3 --- /dev/null +++ b/build/js/blog-form-ctrl.js @@ -0,0 +1,39 @@ +require("./app"); + + +(function() { +'use strict'; + + angular.module("AwesomeBlog").controller("BlogFormCtrl", ["BlogpostService", "$routeParams", "$location", function(BlogpostService, $routeParams, $location){ + var vm = this; + + vm.save = saveBlog; + + vm.blogpost = {}; + + start(); + + // IF statement only works when edit + function start() { + + vm.blogpost.date = new Date(Date.now()); + if ($routeParams.blogpost_id) { + BlogpostService.get($routeParams.blogpost_id).then(function (resp) { + + vm.blogpost = resp.data; + vm.blogpost.date = vm.blogpost.date || new Date(Date.now()); + }); + } + } + + function saveBlog () { + var method; + + method = $routeParams.blogpost_id ? "update" : "create"; + BlogpostService[method](vm.blogpost).then(function (resp) { + $location.path("/blogposts/" + resp.data._id); + }); + } + }]); + +}()); diff --git a/build/js/blog-service.js b/build/js/blog-service.js new file mode 100644 index 0000000..a038bc6 --- /dev/null +++ b/build/js/blog-service.js @@ -0,0 +1,31 @@ +require("./app"); +require("./github-adapter.js"); + +(function () { + "use strict"; + + angular.module("AwesomeBlog").service("BlogpostService", ["$http", "$githubGist",function ($http, $githubGist) { + var urlRoot = "/blogposts"; + + var Blog = { + get: function (id) { + if (angular.isDefined(id)) { + return $githubGist(id).read(); + } else { + // return $http.get(urlRoot); + console.warn('root url'); + } + }, + update: function (blog) { + return $http.put(urlRoot + "/" + blog._id, blog); + }, + create: function (blog) { + return $http.post(urlRoot, blog); // ideal, but doesn't work + }, + delete: function (blog) { + return $http.delete(urlRoot + "/" + blog._id); + } + }; + return Blog; + }]); +}()); diff --git a/build/js/blogposts-ctrl.js b/build/js/blogposts-ctrl.js new file mode 100644 index 0000000..735c02e --- /dev/null +++ b/build/js/blogposts-ctrl.js @@ -0,0 +1,30 @@ +require("./app"); + +(function() { + 'use strict'; + + angular.module("AwesomeBlog").controller("BlogpostsCtrl", ["BlogpostService", function(BlogpostService) { + var vm = this; + + vm.blogposts = []; + vm.delete = deleteBlog; + + start(); + + function start() { + getBlogposts(); + } + + function getBlogposts() { + BlogpostService.get().then(function(resp) { + vm.blogposts = resp.data; + }); + } + + function deleteBlog (blog) { + BlogpostService.delete(blog).then(function() { + getBlogposts(); + }); + } + }]); +}()); diff --git a/build/js/entry.js b/build/js/entry.js new file mode 100644 index 0000000..d829c73 --- /dev/null +++ b/build/js/entry.js @@ -0,0 +1,2 @@ +require("./app.js"); +require("./index.js"); diff --git a/build/js/github-adapter.js b/build/js/github-adapter.js new file mode 100644 index 0000000..82479d9 --- /dev/null +++ b/build/js/github-adapter.js @@ -0,0 +1,282 @@ +'use strict' + +require('angular'); +require('angular-cookies'); + +var Github = require('github-api'); + +angular.module('github-adapter', ['ng', 'ngCookies']).factory('$githubUser', [ + '$q', '$rootScope', function($q, $rootScope) { + return function(user) { + var userPromiseAdapter; + userPromiseAdapter = { + notifications: function() { + var deferred; + deferred = $q.defer(); + user.notifications(function(err, data) { + $rootScope.$apply(function() { + if (err) { + deferred.reject(err); + } else { + deferred.resolve(data); + } + }); + }); + return deferred.promise; + }, + gists: function() { + var deferred; + deferred = $q.defer(); + user.gists(function(err, data) { + $rootScope.$apply(function() { + if (err) { + deferred.reject(err); + } else { + deferred.resolve(data); + } + }); + }); + return deferred.promise; + }, + orgRepos: function(name) { + var deferred; + deferred = $q.defer(); + user.orgRepos(name, function(err, data) { + $rootScope.$apply(function() { + if (err) { + deferred.reject(err); + } else { + deferred.resolve(data); + } + }); + }); + return deferred.promise; + }, + orgs: function() { + var deferred; + deferred = $q.defer(); + user.orgs(function(err, data) { + $rootScope.$apply(function() { + if (err) { + deferred.reject(err); + } else { + deferred.resolve(data); + } + }); + }); + return deferred.promise; + }, + repos: function() { + var deferred; + deferred = $q.defer(); + user.repos(function(err, data) { + $rootScope.$apply(function() { + if (err) { + deferred.reject(err); + } else { + deferred.resolve(data); + } + }); + }); + return deferred.promise; + }, + show: function(username) { + var deferred; + deferred = $q.defer(); + user.show(username, function(err, data) { + $rootScope.$apply(function() { + if (err) { + deferred.reject(err); + } else { + deferred.resolve(data); + } + }); + }); + return deferred.promise; + }, + userGists: function(username) { + var deferred; + deferred = $q.defer(); + user.userGists(username, function(err, data) { + $rootScope.$apply(function() { + if (err) { + deferred.reject(err); + } else { + deferred.resolve(data); + } + }); + }); + return deferred.promise; + }, + userRepos: function(username) { + var deferred; + deferred = $q.defer(); + user.userRepos(username, function(err, data) { + $rootScope.$apply(function() { + if (err) { + deferred.reject(err); + } else { + deferred.resolve(data); + } + }); + }); + return deferred.promise; + } + }; + return userPromiseAdapter; + }; + } +]).factory('$githubGist', [ + '$q', '$cookies', function($q, $cookies) { + return function(gistId) { + var gist, gistPromiseAdapter, github; + github = new Github({ + token: $cookies.get('gh') || '87c755928d2db694fc764b7517a049e992f392a0', + auth: 'oauth' + }); + gist = github.getGist(gistId); + gistPromiseAdapter = { + create: function(options) { + var deferred; + deferred = $q.defer(); + gist.create(options, function(err, res) { + if (err) { + deferred.reject(err); + } else { + deferred.resolve(res); + } + }); + return deferred.promise; + }, + "delete": function() { + var deferred; + deferred = $q.defer(); + gist["delete"](function(err, res) { + if (err) { + deferred.reject(err); + } else { + deferred.resolve(res); + } + }); + return deferred.promise; + }, + fork: function() { + var deferred; + deferred = $q.defer(); + gist.fork(function(err, gist) { + if (err) { + deferred.reject(err); + } else { + deferred.resolve(gist); + } + }); + return deferred.promise; + }, + read: function() { + var deferred; + deferred = $q.defer(); + gist.read(function(err, gist) { + if (err) { + deferred.reject(err); + } else { + deferred.resolve(gist); + } + }); + return deferred.promise; + }, + update: function(options) { + var deferred; + deferred = $q.defer(); + gist.update(options, function(err, gist) { + if (err) { + deferred.reject(err); + } else { + deferred.resolve(gist); + } + }); + return deferred.promise; + } + }; + return gistPromiseAdapter; + }; + } +]).factory('$sassMeisterGist', [ + '$q', '$cookies', '$githubGist', function($q, $cookies, $githubGist) { + return { + create: function(scope, cb) { + var content, files, sass; + files = {}; + sass = scope.app.sass; + sass = sass.replace(/(^\/\/ [\-]{3,4}\n(?:\/\/ .+\n)*\/\/ [\-]{3,4}\s*)*/, ''); + sass = "" + (buildFrontmatter(scope.app.dependencies)) + sass; + files["SassMeister-input." + scope.app.syntax] = { + content: sass + }; + if (scope.app.css.length !== 0) { + files['SassMeister-output.css'] = { + content: scope.app.css + }; + } + if (scope.app.html) { + files["SassMeister-input-HTML." + scope.app.htmlSyntax] = { + content: scope.app.html + }; + files['SassMeister-rendered.html'] = { + content: scope.app.renderedHTML + }; + } + content = { + description: 'Generated by SassMeister.com.', + files: files + }; + return $githubGist().create(content).then(cb); + }, + update: function(id, scope, cb) { + var content, ext, filename, files, sass; + files = {}; + sass = scope.app.sass; + sass = sass.replace(/(^\/\/ [\-]{3,4}\n(?:\/\/ .+\n)*\/\/ [\-]{3,4}\s*)*/, ''); + sass = "" + (buildFrontmatter(scope.app.dependencies)) + sass; + if (scope.sassFileName.substr(-4, 4) !== scope.app.syntax) { + files[scope.sassFileName] = { + content: null + }; + scope.sassFileName = "" + (scope.sassFileName.substr(0, scope.sassFileName.length - 4)) + scope.app.syntax; + } + files[scope.sassFileName] = { + content: sass + }; + files[scope.cssFileName] = { + content: scope.app.css + }; + if (scope.app.html) { + if (!scope.htmlFileName) { + scope.htmlFileName = "SassMeister-input-HTML." + scope.app.htmlSyntax; + } else { + filename = scope.htmlFileName.split('.'); + ext = filename.pop(); + if (ext !== scope.app.htmlSyntax) { + files[scope.htmlFileName] = { + content: null + }; + scope.htmlFileName = (filename.join('.')) + "." + scope.app.htmlSyntax; + } + } + files[scope.htmlFileName] = { + content: scope.app.html + }; + files[scope.renderedHtmlFileName] = { + content: scope.app.renderedHTML + }; + } + content = { + files: files + }; + return $githubGist(id).update(content).then(cb); + }, + fork: function(id, cb) { + return $githubGist(id).fork().then(cb); + } + }; + } +]); diff --git a/build/js/index.js b/build/js/index.js new file mode 100644 index 0000000..57866a7 --- /dev/null +++ b/build/js/index.js @@ -0,0 +1,5 @@ +require("./blog-ctrl.js"); +require("./blog-service.js"); +require("./blog-details-directive.js"); +require("./blog-form-ctrl.js"); +require("./blogposts-ctrl.js"); diff --git a/build/js/packed.js b/build/js/packed.js new file mode 100644 index 0000000..2a6e2d5 --- /dev/null +++ b/build/js/packed.js @@ -0,0 +1,35095 @@ +/******/ (function(modules) { // webpackBootstrap +/******/ // The module cache +/******/ var installedModules = {}; + +/******/ // The require function +/******/ function __webpack_require__(moduleId) { + +/******/ // Check if module is in cache +/******/ if(installedModules[moduleId]) +/******/ return installedModules[moduleId].exports; + +/******/ // Create a new module (and put it into the cache) +/******/ var module = installedModules[moduleId] = { +/******/ exports: {}, +/******/ id: moduleId, +/******/ loaded: false +/******/ }; + +/******/ // Execute the module function +/******/ modules[moduleId].call(module.exports, module, module.exports, __webpack_require__); + +/******/ // Flag the module as loaded +/******/ module.loaded = true; + +/******/ // Return the exports of the module +/******/ return module.exports; +/******/ } + + +/******/ // expose the modules object (__webpack_modules__) +/******/ __webpack_require__.m = modules; + +/******/ // expose the module cache +/******/ __webpack_require__.c = installedModules; + +/******/ // __webpack_public_path__ +/******/ __webpack_require__.p = ""; + +/******/ // Load entry module and return exports +/******/ return __webpack_require__(0); +/******/ }) +/************************************************************************/ +/******/ ([ +/* 0 */ +/***/ function(module, exports, __webpack_require__) { + + __webpack_require__(1); + __webpack_require__(17); + + +/***/ }, +/* 1 */ +/***/ function(module, exports, __webpack_require__) { + + __webpack_require__(2); + __webpack_require__(4); + __webpack_require__(6); + + (function(){ + + 'use strict'; + // Declare app level module which depends on filters, and services + var AwesomeBlogApp = angular.module('AwesomeBlog', ['ngRoute', 'github-adapter']). + + config(["$routeProvider", function ($routeProvider) { + $routeProvider + + ////route home page blog posts////////// + .when("/blogposts", { + templateUrl: "html/blogpost.html", + controller: "BlogpostsCtrl as vm", + }) + + /////form to make more blog posts/////// + .when("/blogposts/new", { + templateUrl: "html/form.html", + controller: "BlogFormCtrl as vm", + }) + .when("/blogposts/:blogpost_id/edit", { + templateUrl: "html/form.html", + controller: "BlogFormCtrl as vm", + }) + .when("/blogposts/:blogpost_id", { + templateUrl: "html/blog.html", + controller: "BlogpostCtrl as vm", + }) + .otherwise({ + redirectTo: "/blogposts", + }); + + }]); + + // Controller to make DATE work! + AwesomeBlogApp.controller("DateCtrl", ["$scope", function($scope) { + $scope.date = new Date(); + }]); + + }()); + + __webpack_require__(17); + + +/***/ }, +/* 2 */ +/***/ function(module, exports, __webpack_require__) { + + __webpack_require__(3); + module.exports = angular; + + +/***/ }, +/* 3 */ +/***/ function(module, exports) { + + /** + * @license AngularJS v1.4.7 + * (c) 2010-2015 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.4.7/' + + (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'; + + /** + * @ngdoc function + * @name angular.lowercase + * @module ng + * @kind function + * + * @description Converts the specified string to lowercase. + * @param {string} string String to be converted to lowercase. + * @returns {string} Lowercased string. + */ + var lowercase = function(string) {return isString(string) ? string.toLowerCase() : string;}; + var hasOwnProperty = Object.prototype.hasOwnProperty; + + /** + * @ngdoc function + * @name angular.uppercase + * @module ng + * @kind function + * + * @description Converts the specified string to uppercase. + * @param {string} string String to be converted to uppercase. + * @returns {string} Uppercased 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. + 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) { + if (obj == null || isWindow(obj)) { + return false; + } + + // 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; + + if (obj.nodeType === NODE_TYPE_ELEMENT && length) { + return true; + } + + return isString(obj) || isArray(obj) || length === 0 || + typeof length === 'number' && length > 0 && (length - 1) in obj; + } + + /** + * @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 (!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() {return value;};} + + function hasCustomToString(obj) { + return isFunction(obj.toString) && obj.toString !== Object.prototype.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(Clamped)?)|(Uint16)|(Uint32)|(Int8)|(Int16)|(Int32)|(Float(32)|(64))Array\]$/; + function isTypedArray(value) { + return TYPED_ARRAY_REGEXP.test(toString.call(value)); + } + + + 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, stackSource, stackDest) { + if (isWindow(source) || isScope(source)) { + throw ngMinErr('cpws', + "Can't copy! Making copies of Window or Scope instances is not supported."); + } + if (isTypedArray(destination)) { + throw ngMinErr('cpta', + "Can't copy! TypedArray destination cannot be mutated."); + } + + if (!destination) { + destination = source; + if (isObject(source)) { + var index; + if (stackSource && (index = stackSource.indexOf(source)) !== -1) { + return stackDest[index]; + } + + // TypedArray, Date and RegExp have specific copy functionality and must be + // pushed onto the stack before returning. + // Array and other objects create the base object and recurse to copy child + // objects. The array/object will be pushed onto the stack when recursed. + if (isArray(source)) { + return copy(source, [], stackSource, stackDest); + } else if (isTypedArray(source)) { + destination = new source.constructor(source); + } else if (isDate(source)) { + destination = new Date(source.getTime()); + } else if (isRegExp(source)) { + destination = new RegExp(source.source, source.toString().match(/[^\/]*$/)[0]); + destination.lastIndex = source.lastIndex; + } else if (isFunction(source.cloneNode)) { + destination = source.cloneNode(true); + } else { + var emptyObject = Object.create(getPrototypeOf(source)); + return copy(source, emptyObject, stackSource, stackDest); + } + + if (stackDest) { + stackSource.push(source); + stackDest.push(destination); + } + } + } else { + if (source === destination) throw ngMinErr('cpi', + "Can't copy! Source and destination are identical."); + + stackSource = stackSource || []; + stackDest = stackDest || []; + + if (isObject(source)) { + stackSource.push(source); + stackDest.push(destination); + } + + var result, key; + if (isArray(source)) { + destination.length = 0; + for (var i = 0; i < source.length; i++) { + destination.push(copy(source[i], null, stackSource, stackDest)); + } + } else { + var h = destination.$$hashKey; + if (isArray(destination)) { + destination.length = 0; + } else { + forEach(destination, function(value, key) { + delete destination[key]; + }); + } + if (isBlankObject(source)) { + // createMap() fast path --- Safe to avoid hasOwnProperty check because prototype chain is empty + for (key in source) { + destination[key] = copy(source[key], null, stackSource, stackDest); + } + } else if (source && typeof source.hasOwnProperty === 'function') { + // Slow path, which must rely on hasOwnProperty + for (key in source) { + if (source.hasOwnProperty(key)) { + destination[key] = copy(source[key], null, stackSource, stackDest); + } + } + } else { + // Slowest path --- hasOwnProperty can't be called as a method + for (key in source) { + if (hasOwnProperty.call(source, key)) { + destination[key] = copy(source[key], null, stackSource, stackDest); + } + } + } + setHashKey(destination,h); + } + } + return destination; + } + + /** + * 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) { + if (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)) { + return isRegExp(o2) ? o1.toString() == o2.toString() : false; + } 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 (typeof obj === 'undefined') 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; + } + + + function timezoneToOffset(timezone, fallback) { + 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 timezoneOffset = timezoneToOffset(timezone, date.getTimezoneOffset()); + return addDateMinutes(date, reverse * (timezoneOffset - date.getTimezoneOffset())); + } + + + /** + * @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. + * + * 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. + * + * 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. + * + * See: {@link guide/bootstrap Bootstrap} + * + * Note that Protractor based end-to-end tests cannot use this function to bootstrap manually. + * They must use {@link ng.directive:ngApp ngApp}. + * + * 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. + * + * ```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; + var skipDestroyOnNextJQueryCleanData; + 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; + if (!skipDestroyOnNextJQueryCleanData) { + for (var i = 0, elem; (elem = elems[i]) != null; i++) { + events = jQuery._data(elem, "events"); + if (events && events.$destroy) { + jQuery(elem).triggerHandler('$destroy'); + } + } + } else { + skipDestroyOnNextJQueryCleanData = false; + } + 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 {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 constant 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#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, + $$CoreAnimateQueueProvider, + $$CoreAnimateRunnerProvider, + $BrowserProvider, + $CacheFactoryProvider, + $ControllerProvider, + $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.4.7', // all of these placeholder strings will be replaced by grunt's + major: 1, // package task + minor: 4, + dot: 7, + codeName: 'dark-luminescence' + }; + + + 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, + $$animateQueue: $$CoreAnimateQueueProvider, + $$AnimateRunner: $$CoreAnimateRunnerProvider, + $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. + * + *
**Note:** all element references in Angular are always wrapped with jQuery or + * jqLite; they are never raw DOM references.
+ * + * ## 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'. + * - [`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 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 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 { + forEach(type.split(' '), function(type) { + if (isDefined(fn)) { + var listenerFns = events[type]; + arrayRemove(listenerFns || [], fn); + if (listenerFns && listenerFns.length > 0) { + return; + } + } + + removeEventListenerFn(element, type, handle); + delete events[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 behaviour + // 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 + }, 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; + }; + + // 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()) { + eventFns[i].call(element, event); + } + } + }; + + // TODO: this is a hack for angularMocks/clearDataCache that makes it possible to deregister all + // events on `element` + eventHandler.elem = element; + return eventHandler; + } + + ////////////////////////////////////////// + // 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; + + while (i--) { + type = types[i]; + var eventFns = events[type]; + + if (!eventFns) { + events[type] = []; + + if (type === 'mouseenter' || type === 'mouseleave') { + // Refer to jQuery's implementation of mouseenter & mouseleave + // Read about mouseenter and mouseleave: + // http://www.quirksmode.org/js/events_mouse.html#link8 + + jqLiteOn(element, MOUSE_EVENT_MAP[type], function(event) { + var target = this, 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 && !target.contains(related))) { + handle(event, type); + } + }); + + } else { + if (type !== '$destroy') { + addEventListenerFn(element, type, handle); + } + } + eventFns = events[type]; + } + eventFns.push(fn); + } + }, + + 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) { + wrapNode = jqLite(wrapNode).eq(0).clone()[0]; + var parent = element.parentNode; + if (parent) { + parent.replaceChild(wrapNode, element); + } + wrapNode.appendChild(element); + }, + + 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 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 anonFn(fn) { + // For anonymous functions, showing at the very least the function signature can help in + // debugging. + var fnText = fn.toString().replace(STRIP_COMMENTS, ''), + args = fnText.match(FN_ARGS); + if (args) { + return 'function(' + (args[1] || '').replace(/[\s\r\n]+/, ' ') + ')'; + } + return 'fn'; + } + + function annotate(fn, strictDi, name) { + var $inject, + fnText, + 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); + } + fnText = fn.toString().replace(STRIP_COMMENTS, ''); + argDecl = fnText.match(FN_ARGS); + 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 the service + * constructor function that will be used to instantiate the service instance. + * + * 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**. + * + * 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**, such as a string, a number, an array, an object or a function, + * with the {@link auto.$injector $injector}. Unlike {@link auto.$provide#value value} it 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 behaviour 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 = {}, + instanceInjector = (instanceCache.$injector = + createInternalInjector(instanceCache, function(serviceName, caller) { + var provider = providerInjector.get(serviceName + providerSuffix, caller); + return instanceInjector.invoke(provider.$get, provider, undefined, serviceName); + })); + + + forEach(loadModules(modulesToLoad), 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 invoke(fn, self, locals, serviceName) { + if (typeof locals === 'string') { + serviceName = locals; + locals = null; + } + + var args = [], + $inject = createInjector.$$annotate(fn, strictDi, serviceName), + length, i, + key; + + for (i = 0, length = $inject.length; i < length; i++) { + 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) + ); + } + if (isArray(fn)) { + fn = fn[length]; + } + + // http://jsperf.com/angularjs-invoke-apply-vs-switch + // #5388 + return fn.apply(self, 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) {}]); + // Object creation: http://jsperf.com/create-constructor/2 + var instance = Object.create((isArray(Type) ? Type[Type.length - 1] : Type).prototype || null); + var returnedValue = invoke(Type, instance, locals, serviceName); + + return isObject(returnedValue) || isFunction(returnedValue) ? returnedValue : instance; + } + + 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://dev.w3.org/html5/spec/Overview.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 $$CoreAnimateRunnerProvider = function() { + this.$get = ['$q', '$$rAF', function($q, $$rAF) { + function AnimateRunner() {} + AnimateRunner.all = noop; + AnimateRunner.chain = noop; + AnimateRunner.prototype = { + end: noop, + cancel: noop, + resume: noop, + pause: noop, + complete: noop, + then: function(pass, fail) { + return $q(function(resolve) { + $$rAF(function() { + resolve(); + }); + }).then(pass, fail); + } + }; + return AnimateRunner; + }]; + }; + + // 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); + } + + return new $$AnimateRunner(); // jshint ignore:line + } + }; + + + 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 an 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 `listenerFn` that is set + * // to listen for `enter` on the given `element` 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 className then the provided from and + * to styles will be applied alongside the given transition. If a JavaScript animation is detected then the provided styles + * will be given in as function paramters into the `animate` method (or as apart of the `options` parameter). + * + * @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 appplied 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); + } + }; + }]; + }]; + + /** + * @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', function($$rAF, $q) { + + var RAFPromise = function() {}; + RAFPromise.prototype = { + done: function(cancel) { + this.defer && this.defer[cancel === true ? 'reject' : 'resolve'](); + }, + end: function() { + this.done(); + }, + cancel: function() { + this.done(true); + }, + getPromise: function() { + if (!this.defer) { + this.defer = $q.defer(); + } + return this.defer.promise; + }, + then: function(f1,f2) { + return this.getPromise().then(f1,f2); + }, + 'catch': function(f1) { + return this.getPromise()['catch'](f1); + }, + 'finally': function(f1) { + return this.getPromise()['finally'](f1); + } + }; + + return function(element, 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; + } + + var closed, runner = new RAFPromise(); + return { + start: run, + end: run + }; + + function run() { + $$rAF(function() { + close(); + if (!closed) { + runner.done(); + } + closed = true; + }); + return runner; + } + + function close() { + 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, + rawDocument = document[0], + 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; + + 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(); + } + + function getCurrentState() { + try { + return history.state; + } catch (e) { + // MSIE can reportedly throw when there is no state (UNCONFIRMED). + } + } + + // 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 = {}, + capacity = (options && options.capacity) || Number.MAX_VALUE, + lruHash = {}, + 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]; + } + + delete data[key]; + size--; + }, + + + /** + * @ngdoc method + * @name $cacheFactory.Cache#removeAll + * @kind function + * + * @description + * Clears the cache object of any entries. + */ + removeAll: function() { + data = {}; + size = 0; + lruHash = {}; + 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 behavioural (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 widget definition + * of `scope: { localName:'@myAttr' }`, then widget scope property `localName` will reflect + * the interpolated value of `hello {{name}}`. As the `name` attribute changes so will the + * `localName` property on the widget scope. The `name` is read from the parent scope (not + * component scope). + * + * * `=` or `=attr` - set up bi-directional binding between a local scope property and the + * parent scope property of name defined via the value of the `attr` attribute. If no `attr` + * name is specified then the attribute name is assumed to be the same as the local name. + * Given `` and widget definition of + * `scope: { localModel:'=myAttr' }`, then widget scope property `localModel` will reflect the + * value of `parentModel` on the parent scope. Any changes to `parentModel` will be reflected + * in `localModel` and any changes in `localModel` will reflect in `parentModel`. If the parent + * scope property doesn't exist, it will throw a NON_ASSIGNABLE_MODEL_EXPRESSION exception. You + * can avoid this behavior using `=?` or `=?attr` in order to flag the property as optional. If + * you want to shallow watch for changes (i.e. $watchCollection instead of $watch) you can use + * `=*` or `=*attr` (`=*?` or `=*?attr` if the property is optional). + * + * * `&` or `&attr` - provides a way to execute an expression 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 widget definition of + * `scope: { localFn:'&myAttr' }`, then 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` + * When an isolate scope is used for a component (see above), and `controllerAs` is used, `bindToController: true` will + * allow a component to have its properties bound to the controller, rather than to scope. When the controller + * is instantiated, the initial values of the isolate scope bindings are already available. + * + * #### `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)`. + * * `scope`: optional argument to override the scope. + * * `cloneLinkingFn`: optional argument to create clones of the original transcluded content. + * * `futureParentElement`: + * * 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. + * + * + * #### `require` + * Require another directive and inject its controller as the fourth argument to the linking function. The + * `require` takes a string name (or array of strings) of the directive(s) to pass in. If an array is used, the + * injected argument will be an array in corresponding order. If no such directive can be + * found, or if the directive does not have a controller, then an error is raised (unless no link function + * is specified, 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. + * + * There are two kinds of transclusion depending upon whether you want to transclude just the contents of the + * directive's element or the entire element: + * + * * `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. + * + * + * #### `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 a + * 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}. + *
+ * + * #### 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 translude 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 transluded 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 controller instances; if given, it will make the controllers + * available to directives. + * * `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)$/; + + function parseIsolateBindings(scope, directiveName, isController) { + var LOCAL_REGEXP = /^\s*([@&]|=(\*?))(\??)\s*(\w*)\s*$/; + + var bindings = {}; + + forEach(scope, function(definition, scopeName) { + 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 + }; + }); + + 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 name '{0}' is invalid. The first character must be a lowercase letter", name); + } + if (name !== name.trim()) { + throw $compileMinErr('baddir', + "Directive 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 + * {@link guide/directive} 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'; + var bindings = directive.$$bindings = + parseDirectiveBindings(directive, directive.name); + if (isObject(bindings.isolateScope)) { + directive.$$isolateBindings = bindings.isolateScope; + } + 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#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; + }; + + this.$get = [ + '$injector', '$interpolate', '$exceptionHandler', '$templateRequest', '$parse', + '$controller', '$rootScope', '$document', '$sce', '$animate', '$$sanitizeUri', + function($injector, $interpolate, $exceptionHandler, $templateRequest, $parse, + $controller, $rootScope, $document, $sce, $animate, $$sanitizeUri) { + + var Attributes = function(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') || + (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 { + this.$$element.attr(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/directive#text-and-attribute-bindings Directives} 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 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]/; + + 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; + + 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); + } + // 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 + forEach($compileNodes, function(node, index) { + if (node.nodeType == NODE_TYPE_TEXT && node.nodeValue.match(/\S+/) /* non-empty */ ) { + $compileNodes[index] = jqLite(node).wrap('').parent()[0]; + } + }); + var compositeLinkFn = + compileNodes($compileNodes, transcludeFn, $compileNodes, + maxPriority, ignoreDirective, previousCompileContext); + compile.$$addScopeClass($compileNodes); + var namespace = null; + return function publicLinkFn(scope, cloneConnectFn, options) { + assertArg(scope, 'scope'); + + 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' && node.toString().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); + var destroyBindings = nodeLinkFn.$$destroyBindings; + if (destroyBindings) { + nodeLinkFn.$$destroyBindings = null; + childScope.$on('$destroyed', destroyBindings); + } + } 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, + nodeLinkFn); + + } else if (childLinkFn) { + childLinkFn(scope, node.childNodes, undefined, parentBoundTranscludeFn); + } + } + } + } + + function createBoundTranscludeFn(scope, transcludeFn, previousBoundTranscludeFn) { + + var boundTranscludeFn = function(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 + }); + }; + + 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 directiveNName = ngAttrName.replace(/(Start|End)$/, ''); + if (directiveIsMultiElement(directiveNName)) { + if (ngAttrName === directiveNName + 'Start') { + 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(scope, element, attrs, controllers, transcludeFn) { + element = groupScan(element[0], attrStart, attrEnd); + return linkFn(scope, element, attrs, controllers, transcludeFn); + }; + } + + /** + * 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, + 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 (!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(document.createComment(' ' + directiveName + ': ' + + templateAttrs[directiveName] + ' ')); + compileNode = $compileNode[0]; + replaceWith(jqCollection, sliceArgs($template), compileNode); + + childTranscludeFn = compile($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 { + $template = jqLite(jqLiteClone(compileNode)).contents(); + $compileNode.empty(); // clear contents + childTranscludeFn = compile($template, transcludeFn); + } + } + + 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) { + markDirectivesAsIsolate(templateDirectives); + } + 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 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); + } + } + + return value || null; + } + + function setupControllers($element, attrs, transcludeFn, controllerDirectives, isolateScope, scope) { + 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, + // but jQuery .data doesn't support attaching data to comment nodes as it's hard to + // clean up (http://bugs.jquery.com/ticket/8335). + // 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; + if (!hasElementTranscludeDirective) { + $element.data('$' + directive.name + 'Controller', controllerInstance.instance); + } + } + return elementControllers; + } + + function nodeLinkFn(childLinkFn, scope, linkNode, $rootElement, boundTranscludeFn, + thisLinkFn) { + var i, ii, linkFn, controller, isolateScope, elementControllers, transcludeFn, $element, + attrs; + + if (compileNode === linkNode) { + attrs = templateAttrs; + $element = templateAttrs.$$element; + } else { + $element = jqLite(linkNode); + attrs = new Attributes($element, templateAttrs); + } + + if (newIsolateScopeDirective) { + isolateScope = scope.$new(true); + } + + if (boundTranscludeFn) { + // track `boundTranscludeFn` so it can be unwrapped if `transcludeFn` + // is later passed as `parentBoundTranscludeFn` to `publicLinkFn` + transcludeFn = controllersBoundTransclude; + transcludeFn.$$boundTransclude = boundTranscludeFn; + } + + if (controllerDirectives) { + elementControllers = setupControllers($element, attrs, transcludeFn, controllerDirectives, isolateScope, scope); + } + + 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; + initializeDirectiveBindings(scope, attrs, isolateScope, + isolateScope.$$isolateBindings, + newIsolateScopeDirective, isolateScope); + } + if (elementControllers) { + // Initialize bindToController bindings for new/isolate scopes + var scopeDirective = newIsolateScopeDirective || newScopeDirective; + var bindings; + var controllerForBindings; + if (scopeDirective && elementControllers[scopeDirective.name]) { + bindings = scopeDirective.$$bindings.bindToController; + controller = elementControllers[scopeDirective.name]; + + if (controller && controller.identifier && bindings) { + controllerForBindings = controller; + thisLinkFn.$$destroyBindings = + initializeDirectiveBindings(scope, attrs, controller.instance, + bindings, scopeDirective); + } + } + for (i in elementControllers) { + controller = elementControllers[i]; + var controllerResult = controller(); + + if (controllerResult !== controller.instance) { + // If the controller constructor has a return value, overwrite the instance + // from setupControllers and update the element data + controller.instance = controllerResult; + $element.data('$' + i + 'Controller', controllerResult); + if (controller === controllerForBindings) { + // Remove and re-install bindToController bindings + thisLinkFn.$$destroyBindings(); + thisLinkFn.$$destroyBindings = + initializeDirectiveBindings(scope, attrs, controllerResult, bindings, scopeDirective); + } + } + } + } + + // 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 + ); + } + + // This is the function that is injected as `$transclude`. + // Note: all arguments are optional! + function controllersBoundTransclude(scope, cloneAttachFn, futureParentElement) { + var transcludeControllers; + + // No scope passed in: + if (!isScope(scope)) { + futureParentElement = cloneAttachFn; + cloneAttachFn = scope; + scope = undefined; + } + + if (hasElementTranscludeDirective) { + transcludeControllers = elementControllers; + } + if (!futureParentElement) { + futureParentElement = hasElementTranscludeDirective ? $element.parent() : $element; + } + return boundTranscludeFn(scope, cloneAttachFn, transcludeControllers, futureParentElement, scopeToChild); + } + } + } + + function markDirectivesAsIsolate(directives) { + // mark all directives as needing isolate scope. + for (var j = 0, jj = directives.length; j < jj; j++) { + directives[j] = inherit(directives[j], {$$isolateScope: true}); + } + } + + /** + * 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}); + } + 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)) { + markDirectivesAsIsolate(templateDirectives); + } + 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, afterTemplateNodeLinkFn); + } + 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, + afterTemplateNodeLinkFn); + } + }; + } + + + /** + * 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); + } + + // TODO(perf): what's this document fragment for? is it needed? can we at least reuse it? + var fragment = document.createDocumentFragment(); + fragment.appendChild(firstElementToRemove); + + 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(newNode).data(jqLite(firstElementToRemove).data()); + + // Remove data of the replaced element. We cannot just call .remove() + // on the element it since that would deallocate scope that is needed + // for the new node. Instead, remove the data "manually". + if (!jQuery) { + delete jqLite.cache[firstElementToRemove[jqLite.expando]]; + } else { + // jQuery 2.x doesn't expose the data storage. Use jQuery.cleanData to clean up after + // the replaced element. The cleanData version monkey-patched by Angular would cause + // the scope to be trashed and we do need the very same scope to work with the new + // element. However, we cannot just cache the non-patched version and use it here as + // that would break if another library patches the method after Angular does (one + // example is jQuery UI). Instead, set a flag indicating scope destroying should be + // skipped this one time. + skipDestroyOnNextJQueryCleanData = true; + jQuery.cleanData([firstElementToRemove]); + } + } + + for (var k = 1, kk = elementsToRemove.length; k < kk; k++) { + var element = elementsToRemove[k]; + jqLite(element).remove(); // must do this way to clean up expando + fragment.appendChild(element); + delete elementsToRemove[k]; + } + + 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, newScope) { + var onNewScopeDestroyed; + forEach(bindings, function(definition, scopeName) { + var attrName = definition.attrName, + optional = definition.optional, + mode = definition.mode, // @, =, or & + lastValue, + parentGet, parentSet, compare; + + switch (mode) { + + case '@': + if (!optional && !hasOwnProperty.call(attrs, attrName)) { + destination[scopeName] = attrs[attrName] = void 0; + } + attrs.$observe(attrName, function(value) { + if (isString(value)) { + destination[scopeName] = value; + } + }); + attrs.$$observers[attrName].$$scope = scope; + if (isString(attrs[attrName])) { + // 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(attrs[attrName])(scope); + } + 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(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}' used with directive '{1}' is non-assignable!", + attrs[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; + var unwatch; + if (definition.collection) { + unwatch = scope.$watchCollection(attrs[attrName], parentValueWatch); + } else { + unwatch = scope.$watch($parse(attrs[attrName], parentValueWatch), null, parentGet.literal); + } + onNewScopeDestroyed = (onNewScopeDestroyed || []); + onNewScopeDestroyed.push(unwatch); + 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; + } + }); + var destroyBindings = onNewScopeDestroyed ? function destroyBindings() { + for (var i = 0, ii = onNewScopeDestroyed.length; i < ii; ++i) { + onNewScopeDestroyed[i](); + } + } : noop; + if (newScope && destroyBindings !== noop) { + newScope.$on('$destroy', destroyBindings); + return noop; + } + return destroyBindings; + } + }]; + } + + 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#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(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() { + 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, k) { + 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`** - {Object} - an object built with {@link ng.$cacheFactory `$cacheFactory`} + * that will provide the cache for all requests who set their `cache` property to `true`. + * If you set the `defaults.cache = false` then only requests that specify their own custom + * cache object will be cached. 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 false. If no value is specified, returns the current configured value. + * + * @param {boolean=} value If true, `$http` will return a normal promise without the `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. + * + * ### 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 + * + * To enable caching, set the request configuration `cache` property to `true` (to use default + * cache) or to a custom cache object (built with {@link ng.$cacheFactory `$cacheFactory`}). + * When the cache is enabled, `$http` stores the response from the server in the specified + * cache. The next time the same request is made, the response is served from the cache without + * sending a request to the server. + * + * Note that even if the response is served from cache, delivery of the data is asynchronous in + * the same way that real requests are. + * + * If there are multiple GET requests for the same URL that should be cached using the same + * cache, but the cache is not populated yet, only one request to the server will be made and + * the remaining requests will be fulfilled using the response from the first request. + * + * You can change the default cache to a new object (built with + * {@link ng.$cacheFactory `$cacheFactory`}) by updating the + * {@link ng.$http#defaults `$http.defaults.cache`} property. All requests who set + * their `cache` property to `true` will now use this cache object. + * + * If you set the default cache to `false` then only requests that specify their own custom + * cache object will be 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 a technique by which + * an unauthorized site can gain your user's private data. 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 TransformationjqLiks} + * - **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|Cache}` – If true, a default $http cache will be used to cache the + * GET request, otherwise if a cache instance built with + * {@link ng.$cacheFactory $cacheFactory}, this cache will be used for + * caching. + * - **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 (!angular.isObject(requestConfig)) { + throw minErr('$http')('badreq', 'Http request configuration must be an object. Received: {0}', requestConfig); + } + + 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); + if (!response.data) { + resp.data = response.data; + } else { + 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 unecessary 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 `}}`. + * + * @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; + } + + /** + * @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) { + 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', + function($rootScope, $window, $q, $$q) { + 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.then(null, null, (!hasParams) ? fn : function() { + fn.apply(null, args); + }); + + promise.$$intervalId = setInterval(function tick() { + 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; + } + + + /** + * @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. + * + * Return hash fragment when called without any parameter. + * + * Change hash fragment when called with parameter and return `$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 current `$digest` will be replacing current history + * record, instead of adding 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; + + $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, fullExpression) { + // From the JavaScript docs: + // 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. + // + // So, to ensure that we are checking the same `name` that JavaScript would use, + // we cast it to a string, if possible. + // Doing `name + ''` can cause a repl error if the result to `toString` is not a string, + // this is, this will handle objects that misbehave. + name = name + ''; + if (!isString(name)) { + throw $parseMinErr('iseccst', + 'Cannot convert object to primitive value! ' + + 'Expression: {0}', fullExpression); + } + 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'; + + // 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.constants.hasOwnProperty(this.peek().text)) { + primary = copy(this.constants[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; + }, + + + /* `undefined` is not a constant, it is an identifier, + * but using it as an identifier is not supported + */ + constants: { + 'true': { type: AST.Literal, value: true }, + 'false': { type: AST.Literal, value: false }, + 'null': { type: AST.Literal, value: null }, + 'undefined': {type: AST.Literal, value: undefined }, + 'this': {type: AST.ThisExpression } + } + }; + + 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; + } + } + + 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 (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 assing 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.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 + ',text)'); + }, + + 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 ? function() {} : + 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.NGValueParameter: + return function(scope, locals, assign, inputs) { + 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 && 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 && 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(this.lexer); + 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); + } + }; + + var getterFnCacheDefault = createMap(); + var getterFnCacheExpensive = createMap(); + + 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(); + + this.$get = ['$filter', function($filter) { + var noUnsafeEval = csp().noUnsafeEval; + var $parseOptions = { + csp: noUnsafeEval, + expensiveChecks: false + }, + $parseOptionsExpensive = { + csp: noUnsafeEval, + expensiveChecks: true + }; + + return function $parse(exp, interceptorFn, expensiveChecks) { + var parsedExpression, oneTime, cacheKey; + + 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; + } + cache[cacheKey] = parsedExpression; + } + return addInterceptor(parsedExpression, interceptorFn); + + case 'function': + return addInterceptor(exp, interceptorFn); + + default: + return noop; + } + }; + + 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) { + return parsedExpression(scope); + }, function constantListener(value, old, scope) { + if (isFunction(listener)) { + listener.apply(this, arguments); + } + unwatch(); + }, objectEquality); + } + + function addInterceptor(parsedExpression, interceptorFn) { + if (!interceptorFn) return parsedExpression; + var watchDelegate = parsedExpression.$$watchDelegate; + + var regularWatch = + watchDelegate !== oneTimeLiteralWatchDelegate && + watchDelegate !== oneTimeWatchDelegate; + + var fn = regularWatch ? function regularInterceptedExpression(scope, locals, assign, inputs) { + var value = 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; + 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 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 Harmony, + * 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 Harmony 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. + * + * 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); + function callOnce(self, resolveFn, rejectFn) { + var called = false; + function wrap(fn) { + return function(value) { + if (called) return; + called = true; + fn.call(self, value); + }; + } + + return [wrap(resolveFn), wrap(rejectFn)]; + } + + /** + * @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() { + return new Deferred(); + }; + + 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(); + //Necessary to support unbound execution :/ + this.resolve = simpleBind(this, this.resolve); + this.reject = simpleBind(this, this.reject); + this.notify = simpleBind(this, this.notify); + } + + 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, fns; + + fns = callOnce(this, this.$$resolve, this.$$reject); + try { + if ((isObject(val) || isFunction(val))) then = val && val.then; + if (isFunction(then)) { + this.promise.$$state.status = -1; + then.call(val, fns[0], fns[1], this.notify); + } else { + this.promise.$$state.value = val; + this.promise.$$state.status = 1; + scheduleProcessQueue(this.promise.$$state); + } + } catch (e) { + fns[1](e); + exceptionHandler(e); + } + }, + + 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); + } + + if (!(this instanceof Q)) { + // More useful when $Q is the Promise itself. + return new Q(resolver); + } + + var deferred = new Deferred(); + + function resolveFn(value) { + deferred.resolve(value); + } + + function rejectFn(reason) { + deferred.reject(reason); + } + + resolver(resolveFn, rejectFn); + + return deferred.promise; + }; + + $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 middle are expensive so we use linked list + * + * There are few watches then a lot of observers. This is why you don't want the observer to be + * implemented in the same way as watch. Watch requires return of initialization function which + * are 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 an 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 = ['$injector', '$exceptionHandler', '$parse', '$browser', + function($injector, $exceptionHandler, $parse, $browser) { + + function destroyChildScope($event) { + $event.currentScope.$$destroyed = true; + } + + /** + * @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 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, + watchers, + length, + dirty, ttl = TTL, + next, current, target = this, + watchLog = [], + logIdx, logMsg, 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) { + if ((value = watch.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; + watch.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 = {}; + + // All of the code below is bogus code that works around V8's memory leak via optimized code + // and inline caches. + // + // 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 + + this.$parent = this.$$nextSibling = this.$$prevSibling = this.$$childHead = + this.$$childTail = this.$root = this.$$watchers = null; + }, + + /** + * @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: 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); + 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); + }); + } + } + }]; + } + + /** + * @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. + * + * @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 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 = {}, + 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: !!($window.history && $window.history.pushState && !(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 $compileMinErr = minErr('$compile'); + + /** + * @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. + * + * @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. + */ + function $TemplateRequestProvider() { + 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; + } + + var httpOptions = { + cache: $templateCache, + transformResponse: transformResponse + }; + + return $http.get(tpl, httpOptions) + ['finally'](function() { + handleRequestFn.totalPendingRequests--; + }) + .then(function(response) { + $templateCache.put(tpl, response.data); + return response.data; + }, handleError); + + function handleError(resp) { + if (!ignoreRequestError) { + throw $compileMinErr('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 value this + * promise will be resolved with is 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; + } + + /** + * @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/-Infinity) the Infinity symbol '∞' is returned. + * 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 decimalPlaces 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); + }; + } + + var DECIMAL_SEP = '.'; + function formatNumber(number, pattern, groupSep, decimalSep, fractionSize) { + if (isObject(number)) return ''; + + var isNegative = number < 0; + number = Math.abs(number); + + var isInfinity = number === Infinity; + if (!isInfinity && !isFinite(number)) return ''; + + var numStr = number + '', + formatedText = '', + hasExponent = false, + parts = []; + + if (isInfinity) formatedText = '\u221e'; + + if (!isInfinity && numStr.indexOf('e') !== -1) { + var match = numStr.match(/([\d\.]+)e(-?)(\d+)/); + if (match && match[2] == '-' && match[3] > fractionSize + 1) { + number = 0; + } else { + formatedText = numStr; + hasExponent = true; + } + } + + if (!isInfinity && !hasExponent) { + var fractionLen = (numStr.split(DECIMAL_SEP)[1] || '').length; + + // determine fractionSize if it is not specified + if (isUndefined(fractionSize)) { + fractionSize = Math.min(Math.max(pattern.minFrac, fractionLen), pattern.maxFrac); + } + + // safely round numbers in JS without hitting imprecisions of floating-point arithmetics + // inspired by: + // https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Math/round + number = +(Math.round(+(number.toString() + 'e' + fractionSize)).toString() + 'e' + -fractionSize); + + var fraction = ('' + number).split(DECIMAL_SEP); + var whole = fraction[0]; + fraction = fraction[1] || ''; + + var i, pos = 0, + lgroup = pattern.lgSize, + group = pattern.gSize; + + if (whole.length >= (lgroup + group)) { + pos = whole.length - lgroup; + for (i = 0; i < pos; i++) { + if ((pos - i) % group === 0 && i !== 0) { + formatedText += groupSep; + } + formatedText += whole.charAt(i); + } + } + + for (i = pos; i < whole.length; i++) { + if ((whole.length - i) % lgroup === 0 && i !== 0) { + formatedText += groupSep; + } + formatedText += whole.charAt(i); + } + + // format fraction part. + while (fraction.length < fractionSize) { + fraction += '0'; + } + + if (fractionSize && fractionSize !== "0") formatedText += decimalSep + fraction.substr(0, fractionSize); + } else { + if (fractionSize > 0 && number < 1) { + formatedText = number.toFixed(fractionSize); + number = parseFloat(formatedText); + formatedText = formatedText.replace(DECIMAL_SEP, decimalSep); + } + } + + if (number === 0) { + isNegative = false; + } + + parts.push(isNegative ? pattern.negPre : pattern.posPre, + formatedText, + isNegative ? pattern.negSuf : pattern.posSuf); + return parts.join(''); + } + + function padNumber(num, digits, trim) { + var neg = ''; + if (num < 0) { + neg = '-'; + num = -num; + } + num = '' + num; + while (num.length < digits) num = '0' + num; + if (trim) { + num = num.substr(num.length - digits); + } + return neg + num; + } + + + function dateGetter(name, size, offset, trim) { + 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); + }; + } + + function dateStrGetter(name, shortForm) { + return function(date, formats) { + var value = date['get' + name](); + var get = uppercase(shortForm ? ('SHORT' + name) : 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), + yy: dateGetter('FullYear', 2, 0, true), + y: dateGetter('FullYear', 1), + MMMM: dateStrGetter('Month'), + MMM: dateStrGetter('Month', true), + MM: dateGetter('Month', 2, 1), + M: dateGetter('Month', 1, 1), + 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 = /((?:[^yMdHhmsaZEwG']+)|(?:'(?:[^']|'')*')|(?:E+|y+|M+|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) + * * `'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, date.getTimezoneOffset()); + date = convertTimezoneToLocal(date, timezone, true); + } + forEach(parts, function(value) { + fn = DATE_FORMATS[value]; + text += fn ? fn(date, $locale.DATETIME_FORMATS, dateTimezoneOffset) + : 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 && begin >= -input.length) ? 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. + * + * @param {Array} array The array 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}}
+
+
+
+ * + * The predicate and reverse parameters can be controlled dynamically through scope properties, + * as shown in the next example. + * @example + + + + +
+
Sorting predicate = {{predicate}}; reverse = {{reverse}}
+
+ [ unsorted ] + + + + + + + + + + + +
+ Name + + + Phone Number + + + Age + +
{{friend.name}}{{friend.phone}}{{friend.age}}
+
+
+
+ * + * 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 + + +
+ + + + + + + + + + + +
Name + (^)Phone NumberAge
{{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, reverse) { + $scope.friends = orderBy($scope.friends, predicate, reverse); + }; + $scope.order('-age',false); + }]); + +
+ */ + orderByFilter.$inject = ['$parse']; + function orderByFilter($parse) { + return function(array, sortPredicate, reverseOrder) { + + if (!(isArrayLike(array))) return 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. The following example would make the button enabled on Chrome/Firefox + * but not on older IEs: + * + * ```html + * + *
+ * + *
+ * ``` + * + * This is because the HTML specification does not require browsers to preserve the values of + * boolean attributes such as `disabled` (Their presence means true and their absence means false.) + * If we put an Angular interpolation expression into such an attribute then the + * binding information would be lost when the browser removes the attribute. + * + * @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. + * + * ### Why do we need `ngChecked`? + * + * The HTML specification does not require browsers to preserve the values of boolean attributes + * such as checked. (Their presence means true and their absence means false.) + * If we put an Angular interpolation expression into such an attribute then the + * binding information would be lost when the browser removes the attribute. + * The `ngChecked` directive solves this problem for the `checked` attribute. + * This complementary directive is not removed by the browser and so provides + * a permanent reliable place to store the binding information. + * @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 + * The HTML specification does not require browsers to preserve the values of boolean attributes + * such as readonly. (Their presence means true and their absence means false.) + * If we put an Angular interpolation expression into such an attribute then the + * binding information would be lost when the browser removes the attribute. + * The `ngReadonly` directive solves this problem for the `readonly` attribute. + * This complementary directive is not removed by the browser and so provides + * a permanent reliable place to store the binding information. + * @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 + * The HTML specification does not require browsers to preserve the values of boolean attributes + * such as selected. (Their presence means true and their absence means false.) + * If we put an Angular interpolation expression into such an attribute then the + * binding information would be lost when the browser removes the attribute. + * The `ngSelected` directive solves this problem for the `selected` attribute. + * This complementary directive is not removed by the browser and so provides + * a permanent reliable place to store the binding information. + * + * @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 + * The HTML specification does not require browsers to preserve the values of boolean attributes + * such as open. (Their presence means true and their absence means false.) + * If we put an Angular interpolation expression into such an attribute then the + * binding information would be lost when the browser removes the attribute. + * The `ngOpen` directive solves this problem for the `open` attribute. + * This complementary directive is not removed by the browser and so provides + * a permanent reliable place to store the binding information. + * @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 responsiblity 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 + * `` but can be nested. This allows you to have nested forms, which is very useful when + * using Angular validation directives in forms that are dynamically generated using the + * {@link ng.directive:ngRepeat `ngRepeat`} directive. Since you cannot dynamically generate the `name` + * attribute of input elements using interpolation, you have to wrap each set of repeated inputs in an + * `ngForm` directive and nest these in an outer `form` element. + * + * + * # 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 is obtained from SO: 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)/; + var URL_REGEXP = /^(ftp|http|https):\/\/(\w+:{0,1}\w*@)?(\S+)(:[0-9]+)?(\/|\/([\w#!:.?+=&%@!\-\/]))?$/; + 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 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 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! + + 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 date 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 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. + * + * @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 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. + * + * @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 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. + * + * @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(data) { + composing = true; + }); + + element.on('compositionend', function() { + composing = false; + listener(); + }); + } + + 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 timeout; + + 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); + + 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) || {}; + // Detect bug in FF35 for input[email] (https://bugzilla.mozilla.org/show_bug.cgi?id=1064430): + // - also sets validity.badInput (should only be validity.typeMismatch). + // - see http://www.whatwg.org/specs/web-apps/current-work/multipage/forms.html#e-mail-state-(type=email) + // - can ignore this case as we can still read out the erroneous email... + 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 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. + */ + + + /** + * @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 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 `

4Fsce1hJS-NZ# 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 literal 0 HcmV?d00001 diff --git a/build/css/fonts/Ubuntu-B.ttf b/build/css/fonts/Ubuntu-B.ttf new file mode 100644 index 0000000000000000000000000000000000000000..b173da27417c00101dff72617f9b9a2b80ecc8f3 GIT binary patch literal 333612 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 z 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