aboutsummaryrefslogtreecommitdiffstats
path: root/test
AgeCommit message (Collapse)Author
2013-07-26feat(ngMock): $timeout.flushNext can expect specific timeout delaysMatias Niemelä
the $timeout mock's flush method allows flushing queued up requests but doesn't allow to for checking with what delay a task was queued up. flushNext flushes the next queued up task and can asserts the scheduled delay.
2013-07-26feat(ngMock): support delay limit for $timeout.flushMatias Niemelä
2013-07-25feat(ngMobile): emit 'swipeleft' and 'swiperight' eventsBraden Shepherdson
Similar to ngMobile clicks, these events were not capturable by other directives. Now they emit 'swipeleft' and 'swiperight' events that can be follow with element.on('swipeleft', ...).
2013-07-25feat(ngBindHtml, sce): combine ng-bind-html and ng-bind-html-unsafeChirayu Krishnappa
Changes: - remove ng-bind-html-unsafe - ng-bind-html is now in core - ng-bind-html is secure - supports SCE - so you can bind to an arbitrary trusted string - automatic sanitization if $sanitize is available BREAKING CHANGE: ng-html-bind-unsafe has been removed and replaced by ng-html-bind (which has been removed from ngSanitize.) ng-bind-html provides ng-html-bind-unsafe like behavior (innerHTML's the result without sanitization) when bound to the result of $sce.trustAsHtml(string). When bound to a plain string, the string is sanitized via $sanitize before being innerHTML'd. If $sanitize isn't available, it's logs an exception.
2013-07-25feat($sce): new $sce service for Strict Contextual Escaping.Chirayu Krishnappa
$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-unsafe. 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), IE8 in quirks mode is not supported. In this mode, IE8 allows one to execute arbitrary javascript by the use of the expression() syntax. Refer http://blogs.msdn.com/b/ie/archive/2008/10/16/ending-expressions.aspx to learn more about them. You can ensure your document is in standards mode and not quirks mode by adding <!doctype html> 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: <input ng-model="userHtml"> <div ng-bind-html-unsafe="{{userHtml}}"> Notice that ng-bind-html-unsafe 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 $sce.trustAs (and shorthand methods such as $sce.trustAsHtml, etc.) to obtain values that will be accepted by SCE / privileged contexts. In privileged contexts, directives and code will bind to the result of $sce.getTrusted(context, value) rather than to the value directly. Directives use $sce.parseAs rather than $parse to watch attribute bindings, which performs the $sce.getTrusted behind the scenes on non-constant literals. As an example, ngBindHtmlUnsafe uses $sce.parseAsHtml(binding expression). Here's the actual code (slightly simplified): var ngBindHtmlUnsafeDirective = ['$sce', function($sce) { return function(scope, element, attr) { scope.$watch($sce.parseAsHtml(attr.ngBindHtmlUnsafe), function(value) { element.html(value || ''); }); }; }]; Impact on loading templates --------------------------- This applies both to the ng-include directive as well as templateUrl's specified by directives. By default, Angular only loads templates from the same domain and protocol as the application document. This is done by calling $sce.getTrustedResourceUrl on the template URL. To load templates from other domains and/or protocols, you may either either whitelist them or wrap it into a trusted value. *Please note*: The browser's Same Origin Policy and Cross-Origin Resource Sharing (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 for the developer? ---------------------------------------------------- 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. e.g. <div ng-html-bind-unsafe="'<b>implicitly trusted</b>'"></div> just works. Additionally, a[href] and img[src] automatically sanitize their URLs and do not pass them through $sce.getTrusted. SCE doesn't play a role here. The included $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 whitelists and 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.
2013-07-24fix(ngMobile): emit click event for touchy clicksBraden Shepherdson
Previously, no handlers for the click event would be called for the fast, touch-based ngMobile clicks, only for desktop browser clicks. Now the event will fire properly for all clicks. Closes #3219 Closes #3218 Closes #3137
2013-07-24fix(select): don't support binding to select[multiple]Igor Minar
changing the type of select box from single to multiple or the other way around at runtime is currently not supported and the two-way binding does odd stuff when such situation happens. we might eventually support this, but for now we are just going to not allow binding to select[multiple] to prevent people from relying on something that doesn't work. BREAKING CHANGE: binding to select[multiple] directly or via ngMultiple (ng-multiple) directive is not supported. This feature never worked with two-way data-binding, so it's not expected that anybody actually depends on it. Closes #3230
2013-07-24fix(ngMobile): prevent ngClick when item disabledJulien Bouquillon
- the ngClick attribute was always triggered, regardless the ngDisabled/disabled attributes - we now check the DOM disabled status before triggering the original click event Closes #3124 Closes #3132
2013-07-24feat(ngRepeat): add $even and $odd props to iteratorP. Envall
2013-07-24fix(form): pick the right attribute name for ngFormPawel Kozlowski
Closes #2997
2013-07-24fix(ngRepeat): handle iteration over identical obj valuesRory Douglas
Modifies default trackByIdFn to factor both key and value into hashKey for non-array primitive (i.e. index not provided) values Closes #2787 Closes #2806
2013-07-24fix(numberFilter): always convert scientific notation to decimalPaul Meskers
Previously, the number filter would format small and large numbers as scientific notation. It now uses toFixed() to ensure that all requested digits are shown.
2013-07-24fix(equals): {} and [] should not be considered equivalentBrenton
angular.equals was returning inconsistent values for the comparison between {} and []: angular.equals({}, []) // true angular.equals([], {}]) // false Since these object are not of the same type, they should not be considered equivalent.
2013-07-23fix(dump): Prevented window.dump from being overridden by karma-jasmine.Jeff Cross
In commit 6820322db562382fac903be35831275948825317 of Karma-Jasmine, the dependency on angular.dump was removed. This caused two undesirable side effects in the angular.js project. 1) Tests for presence of mock dump were failing, and 2) the default window.dump was not outputting valuable angular-aware info. This simple fix adds window.dump in testabilityPatch, to preprocess dumped input prior to passing it to the global dump method.
2013-07-22chore(dump): remove dead codeIgor Minar
This code is not being used any more and the test is now failing due to Karma changes. Karma used to expose window.dump but that changed recently and that's why our build is now failing. I'm removing the code and test, but we still need to figure out how to route window.dump through angular.mock.dump, but that will have to be a separate commit.
2013-07-22fix($compile): always instantiate controllers in parent->child orderIgor Minar
Previously it was possible to get into a situation where child controller was being instantiated before parent which resulted in an error. Closes #2738
2013-07-22fix(Scope): ensure that isolate scopes use the main evalAsync queueIgor Minar
Previously any $evalAsync task scheduled from a isolate scope or a child of an isolate scope would never execute because we never flushed this queue
2013-07-19fix(core): parse URLs using the browser's DOM APIChirayu Krishnappa
2013-07-18test(ngRepeat): add a test for ngRepeat when using 'track by' and a filterBrian Ford
2013-07-18fix($compile): allow data: image URIs in img[src]Chirayu Krishnappa
Ref: 1adf29af13890d61286840177607edd552a9df97 BREAKING CHANGE: img[src] URLs are now sanitized via a separate whitelist regex instead of sharing the whitelist regex with a[href]. With this change, img[src] URLs may also be data: URI's matching mime types image/*. mailto: URLs are disallowed (and do not make sense for img[src] but were allowed under the a[href] whitelist used before.)
2013-07-18feat(directive): ng:focus, ng:blurAndreas Sander
Added directives for focus and blur events. Closes #1277
2013-07-16test(utils): Adds a missing test for snake_caseJames deBoer
2013-07-15fix($animator): ensure animations are always disabled for an element that is ↵Matias Niemelä
not attached to the DOM
2013-07-14feat($q): added support to promise notificationCaio Cunha
It is now possible to notify a promise through deferred.notify() method. Notifications are useful to provide a way to send progress information to promise holders.
2013-07-14test($q): improve logging of callback invocationsChirayu Krishnappa
2013-07-14feat(ngPluralize): add alternative mapping using attributesLucas Galfasó
Add an alternative way to define a mapping for ng:pluralize using attributes instead of the `when` attribute Closes #2454
2013-07-13fix(angular.equals): add support for regular expressionsBen Ripkens
Regular expression objects didn't used to be considered to be equal when using 'angular.equals'. Dirty checking therefore failed to recognize a property modification. Closes #2685
2013-07-12fix($http): allow interceptors to completely override headersIgor Minar
Closes #2770
2013-07-12feat(Angular.js): skip JSON.stringify for undefinedGreg Thornton
Return early in `angular.toJson` if the object to be stringified is `undefined`. IE8 stringifies `undefined` to `'undefined'` whereas other browsers return `undefined`. This normalizes behavior and passes currently broken unit tests in IE8.
2013-07-12feat($resource): support an unescaped URL portLeandro Ostera
The colon character is used to identify parameters in $resource. This meant that we had to escape the colon used in a port. It turns out that this is not necessary if we assume that parameter names cannot consist of only digits. If the parameter consists only of numbers, then it's a port. Closes #2778
2013-07-12fix(ngScenario): select().option(val) should prefer exact value matchStephen Merity
With select(...).option(val) it previously would select the first node which contains the value, even if an exact match was available. This fix prefers exact matches if available, otherwise it reverts to the previous 'contains' behaviour for backwards compatibility. Closes #2856
2013-07-12fix(sanitize): match URI schemes case-insensitivelyPete Bacon Darwin
According to RFC 3986 (http://tools.ietf.org/html/rfc3986#section-3.1) schemes such as http or mailto are case-insensitive. So links such as http://server/ and HTTP://server/ are valid and equivalent. Closes #3210
2013-07-11fix(ngSubmit): expose $event to ngSubmit callbackWesley Cho
2013-07-11fix(ngValue): made ngValue to write value attribute to elementMikk Kirstein
2013-07-11fix(scope): watches can be safely unregistered inside watch handlersPaulo Scardine
Closes #2915
2013-07-11fix($injector): improve $injector:nomod error messageIgor Minar
Closes #2695
2013-07-11test(ngList): remove disabled testIgor Minar
this test fails and we don't have intentions on making it pass since we never made a commitment to implement this feature.
2013-07-08feat($http): accept function as headers valuebolasblack
So we can request with dynamic header value. module.factory('Res', [ '$resource' '$routeParams' 'globalConfig' function($resource, $routeParams, globalConfig) { resource('/url/:id', {id: "@id"}, { patch: { method: 'patch', headers: { 'Authorization': function() { return "token " + globalConfig.token; } } } }); }]);
2013-07-08fix(angular.equals): do not match keys defined in the prototype chainDaniel Luz
Merely testing for object[key] will give incorrect results on keys defined in Object.prototype. Note: IE8 is generally broken in this regard since `for...in` never returns certain property keys even if they are defined directly on the object. See #2141 - partially merges this PR
2013-07-03fix($sniffer): detect transition/animation on older Android browsersJulien Bouquillon
The stock Android browser doesn't support the current for-in body/style detection for animations and transitions but we can manually fix this. This is useful for PhoneGap web-views or traditional web-apps using the stock browser.
2013-07-03fix($parse): disallow access to Function constructorChirayu Krishnappa
Enhances sandboxing of Angular Expressions to prevent attacks via: {}.toString.constructor(alert("evil JS code"))
2013-07-02fix(jqLite): prepend array in correct orderJoao Sa
Match jQuery behavior when prepending array into empty element
2013-07-02fix($compile): prevent infinite loop w/ replace+transclude directivesIgor Minar
Previously if a template contained a directive that had a template (sync or async) and the directive template was to replace the original element and the directive template contained another directive on the root element of this template and this new directive was an element transclude directive then an infinite recursion would follow because the compiler kept on re-adding and reapplying the original directive to the replaced node. This change fixes that. Closes #2155
2013-07-02revert: fix(compiler): corrects component transclusion on ...Igor Minar
This reverts commit 15e1a29cd08993b599f390e83a249ec17f753972. The original commit was fixing two issues - one of them was preventing attributes that triggered directives that replaced the compiled node to be merged into the new node. This change was a breaking change (as seen in the diff of the tests in this commit) and that's why it's being removed. A proper fix will follow.
2013-07-02test(ngRepeat): disable an element directive test on IE8Igor Minar
2013-07-02revert: test(ngRepeat): fix IE8 test compatibility issueIgor Minar
This reverts commit 0c6fb665a4e2e1e7ceb11372153963658d4b53b1. The change invalidated the test because the point of the the test was to test that an element directive works. Changing it to attribute directive was wrong.
2013-07-02fix($injector): refactor module loading code and use minErrIgor Minar
2013-07-01test(ngRepeat): fix IE8 test compatibility issueIgor Minar
2013-07-01fix(Angular.js): handle duplicate params in parseKeyValue/toKeyValuejoshkurz
parseKeyValue and toKeyValue can now handle duplicate values in the query. ``` ?x=1&x=2 <-> {x:[1,2]} ``` The algorithm looks like: 1)parseKeyValue looks for presence of obj[key] 2)detects and replaces obj[key] with [obj[key],val] 3)then pushes more duplicates if necessary 4)toKeyValue decodes array correctly 5)(not changed)$location.search({param: 'key'}) still replaces if necessary 6)(not changed)$location.search({param: ['key1', 'key2']}) sets the url with duplicates BREAKING CHANGE: Before this change: - `parseKeyValue` only took the last key overwriting all the previous keys; - `toKeyValue` joined the keys together in a comma delimited string. This was deemed buggy behavior. If your server relied on this behavior then either the server should be fixed or a simple serialization of the array should be done on the client before passing it to $location.
2013-06-28test($compile): use FQDN for img[src]Chirayu Krishnappa
img[src]="https://foo" has the unfortunate problem that the browser will actually try retrieving the resource the non FQDN foo. The local DNS might suffix a domain to this, resolve it, and try to present a certificate for the https request and prompt the user to pick a certificate. This commit avoids that by making foo a FQDN. Note that it might be better to replace foo with example.com (ref http://tools.ietf.org/html/rfc2606#section-3).