aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--docs/angular.formatter.ngdoc16
-rw-r--r--docs/angular.service.ngdoc10
-rw-r--r--docs/angular.validator.ngdoc18
-rw-r--r--docs/angular.widget.ngdoc18
-rw-r--r--docs/service.template2
-rw-r--r--docs/spec/domSpec.js24
-rw-r--r--docs/spec/ngdocSpec.js10
-rw-r--r--docs/spec/writerSpec.js8
-rw-r--r--docs/src/gen-docs.js2
-rw-r--r--docs/src/ngdoc.js5
-rw-r--r--docs/src/reader.js2
-rw-r--r--docs/src/templates/doc_widgets.css2
-rw-r--r--docs/src/templates/doc_widgets.js16
-rw-r--r--docs/src/templates/docs-scenario.html2
-rw-r--r--docs/src/templates/docs.js8
-rw-r--r--docs/src/templates/syntaxhighlighter/shBrushJScript.js6
-rw-r--r--docs/src/templates/syntaxhighlighter/shBrushXml.js10
-rw-r--r--docs/src/templates/syntaxhighlighter/shCore.css2
-rw-r--r--docs/src/templates/syntaxhighlighter/shCore.js2
-rw-r--r--docs/src/templates/syntaxhighlighter/shThemeDefault.css2
-rw-r--r--docs/src/writer.js12
-rw-r--r--src/AngularPublic.js2
-rw-r--r--src/Browser.js48
-rw-r--r--src/Compiler.js14
-rw-r--r--src/Injector.js2
-rw-r--r--src/markups.js18
-rw-r--r--src/parser.js42
-rw-r--r--src/sanitizer.js2
-rw-r--r--src/scenario/output/Json.js2
-rw-r--r--src/services.js170
-rw-r--r--src/validators.js124
-rw-r--r--test/AngularSpec.js10
-rw-r--r--test/BinderSpec.js238
-rw-r--r--test/CompilerSpec.js2
-rw-r--r--test/FiltersSpec.js10
-rw-r--r--test/FormattersSpec.js4
-rw-r--r--test/ParserSpec.js20
-rw-r--r--test/ScenarioSpec.js18
-rw-r--r--test/ScopeSpec.js4
-rw-r--r--test/ValidatorsSpec.js42
-rw-r--r--test/jquery_alias.js2
-rw-r--r--test/jquery_remove.js2
-rw-r--r--test/markupSpec.js2
-rw-r--r--test/sanitizerSpec.js22
-rw-r--r--test/scenario/mocks.js2
-rw-r--r--test/servicesSpec.js10
46 files changed, 512 insertions, 477 deletions
diff --git a/docs/angular.formatter.ngdoc b/docs/angular.formatter.ngdoc
index ba28471f..2f4433cf 100644
--- a/docs/angular.formatter.ngdoc
+++ b/docs/angular.formatter.ngdoc
@@ -8,13 +8,13 @@ The formatters are responsible for translating user readable text in an input wi
data model stored in an application.
# Writting your own Formatter
-Writing your own formatter is easy. Just register a pair of JavaScript functions with
-`angular.formatter`. One function for parsing user input text to the stored form,
+Writing your own formatter is easy. Just register a pair of JavaScript functions with
+`angular.formatter`. One function for parsing user input text to the stored form,
and one for formatting the stored data to user-visible text.
-Here is an example of a "reverse" formatter: The data is stored in uppercase and in
-reverse, while it is displayed in lower case and non-reversed. User edits are
-automatically parsed into the internal form and data changes are automatically
+Here is an example of a "reverse" formatter: The data is stored in uppercase and in
+reverse, while it is displayed in lower case and non-reversed. User edits are
+automatically parsed into the internal form and data changes are automatically
formatted to the viewed form.
<pre>
@@ -56,11 +56,11 @@ angular.formatter('reverse', {
});
</script>
-Formatted:
+Formatted:
<input type="text" name="data" value="angular" ng:format="reverse"/>
<br/>
-Stored:
+Stored:
<input type="text" name="data"/><br/>
<pre>{{data}}</pre>
@@ -69,7 +69,7 @@ Stored:
it('should store reverse', function(){
expect(element('.doc-example input:first').val()).toEqual('angular');
expect(element('.doc-example input:last').val()).toEqual('RALUGNA');
-
+
this.addFutureAction('change to XYZ', function($window, $document, done){
$document.elements('.doc-example input:last').val('XYZ').trigger('change');
done();
diff --git a/docs/angular.service.ngdoc b/docs/angular.service.ngdoc
index a34142bb..4e4810f9 100644
--- a/docs/angular.service.ngdoc
+++ b/docs/angular.service.ngdoc
@@ -76,7 +76,7 @@ window alert.
};
}, {$inject: ['$window']});
</pre>
-
+
And here is a unit test for this service. We use Jasmine spy (mock) instead of real browser's alert.
<pre>
var mock, notify;
@@ -85,7 +85,7 @@ beforeEach(function() {
mock = {alert: jasmine.createSpy()};
notify = angular.service('notify')(mock);
});
-
+
it('should not alert first two notifications', function() {
notify('one');
notify('two');
@@ -134,7 +134,7 @@ function myController($loc, $log) {
};
}
// which services to inject ?
-myController.$inject = ['$location', '$log'];
+myController.$inject = ['$location', '$log'];
</pre>
@example
@@ -149,13 +149,13 @@ myController.$inject = ['$location', '$log'];
}
};
}, {$inject: ['$window']});
-
+
function myController(notifyService) {
this.callNotify = function(msg) {
notifyService(msg);
};
}
-
+
myController.$inject = ['notify'];
</script>
diff --git a/docs/angular.validator.ngdoc b/docs/angular.validator.ngdoc
index acd3caf2..fccdc5a0 100644
--- a/docs/angular.validator.ngdoc
+++ b/docs/angular.validator.ngdoc
@@ -4,7 +4,7 @@
@namespace Namespace for all filters.
@description
# Overview
-Validators are a standard way to check the user input against a specific criteria. For
+Validators are a standard way to check the user input against a specific criteria. For
example, you might need to check that an input field contains a well-formed phone number.
# Syntax
@@ -29,10 +29,10 @@ Attach a validator on user input widgets using the `ng:validate` attribute.
# Writing your own Validators
-Writing your own validator is easy. To make a function available as a
-validator, just define the JavaScript function on the `angular.validator`
-object. <angular/> passes in the input to validate as the first argument
-to your function. Any additional validator arguments are passed in as
+Writing your own validator is easy. To make a function available as a
+validator, just define the JavaScript function on the `angular.validator`
+object. <angular/> passes in the input to validate as the first argument
+to your function. Any additional validator arguments are passed in as
additional arguments to your function.
You can use these variables in the function:
@@ -40,9 +40,9 @@ You can use these variables in the function:
* `this` — The current scope.
* `this.$element` — The DOM element containing the binding. This allows the filter to manipulate
the DOM in addition to transforming the input.
-
-In this example we have written a upsTrackingNo validator.
-It marks the input text "valid" only when the user enters a well-formed
+
+In this example we have written a upsTrackingNo validator.
+It marks the input text "valid" only when the user enters a well-formed
UPS tracking number.
@css ng-validation-error
@@ -57,7 +57,7 @@ UPS tracking number.
});
</script>
<input type="text" name="trackNo" size="40"
- ng:validate="upsTrackingNo:'1Z 999 999 99 9999 999 9'"
+ ng:validate="upsTrackingNo:'1Z 999 999 99 9999 999 9'"
value="1Z 123 456 78 9012 345 6"/>
@scenario
diff --git a/docs/angular.widget.ngdoc b/docs/angular.widget.ngdoc
index 5f15398f..5942d933 100644
--- a/docs/angular.widget.ngdoc
+++ b/docs/angular.widget.ngdoc
@@ -4,19 +4,19 @@
@namespace Namespace for all widgets.
@description
# Overview
-Widgets allow you to create DOM elements that the browser doesn't
-already understand. You create the widget in your namespace and
-assign it behavior. You can only bind one widget per DOM element
-(unlike directives, in which you can use any number per DOM
-element). Widgets are expected to manipulate the DOM tree by
+Widgets allow you to create DOM elements that the browser doesn't
+already understand. You create the widget in your namespace and
+assign it behavior. You can only bind one widget per DOM element
+(unlike directives, in which you can use any number per DOM
+element). Widgets are expected to manipulate the DOM tree by
adding new elements whereas directives are expected to only modify
element properties.
Widgets come in two flavors: element and attribute.
# Element Widget
-Let's say we would like to create a new element type in the
-namespace `my` that can watch an expression and alert() the user
+Let's say we would like to create a new element type in the
+namespace `my` that can watch an expression and alert() the user
with each new value.
<pre>
@@ -38,7 +38,7 @@ angular.widget('my:watch', function(compileElement) {
</pre>
# Attribute Widget
-Let's implement the same widget, but this time as an attribute
+Let's implement the same widget, but this time as an attribute
that can be added to any existing DOM element.
<pre>
&lt;div my-watch="name"&gt;text&lt;/div&gt;
@@ -70,4 +70,4 @@ angular.widget('@my:watch', function(expression, compileElement) {
});
</script>
<my:time></my:time>
- \ No newline at end of file
+
diff --git a/docs/service.template b/docs/service.template
index c28bddc9..639990ed 100644
--- a/docs/service.template
+++ b/docs/service.template
@@ -54,4 +54,4 @@
</doc:source>
{{#scenario}}<doc:scenario>{{{scenario}}}</doc:scenario>{{/scenario}}
</doc:example>
-{{/example}} \ No newline at end of file
+{{/example}}
diff --git a/docs/spec/domSpec.js b/docs/spec/domSpec.js
new file mode 100644
index 00000000..af1a8faa
--- /dev/null
+++ b/docs/spec/domSpec.js
@@ -0,0 +1,24 @@
+var DOM = require('dom.js').DOM;
+
+describe('dom', function(){
+ describe('example', function(){
+ it('should render code, live, test', function(){
+ var dom = new DOM();
+ dom.example('desc', 'src', 'scenario');
+ expect(dom.toString()).toEqual('<h1>Example</h1>\ndesc<doc:example><doc:source>src</doc:source>\n<doc:scenario>scenario</doc:scenario>\n</doc:example>\n');
+ });
+
+ it('should render non-live, test with description', function(){
+ var dom = new DOM();
+ dom.example('desc', 'src', false);
+ expect(dom.toString()).toEqual('<h1>Example</h1>\ndesc<div ng:non-bindable=""><pre class="brush: js; html-script: true;">src</pre>\n</div>\n');
+ });
+
+ it('should render non-live, test', function(){
+ var dom = new DOM();
+ dom.example('desc', 'src', false);
+ expect(dom.toString()).toContain('<pre class="brush: js; html-script: true;">src</pre>');
+ });
+
+ });
+});
diff --git a/docs/spec/ngdocSpec.js b/docs/spec/ngdocSpec.js
index 7d024cb5..2bea6e9a 100644
--- a/docs/spec/ngdocSpec.js
+++ b/docs/spec/ngdocSpec.js
@@ -279,6 +279,16 @@ describe('ngdoc', function(){
doc.parse();
expect(doc.html()).toContain('<p>some\n text');
});
+
+ it('should render description in related method', function(){
+ var doc = new Doc();
+ doc.ngdoc = 'service';
+ doc.methods = [new Doc('@ngdoc method\n@exampleDescription MDesc\n@example MExmp').parse()];
+ doc.properties = [new Doc('@ngdoc property\n@exampleDescription PDesc\n@example PExmp').parse()];
+ expect(doc.html()).toContain('<p>MDesc</p><div ng:non-bindable=""><pre class="brush: js; html-script: true;">MExmp</pre>');
+ expect(doc.html()).toContain('<p>PDesc</p><div ng:non-bindable=""><pre class="brush: js; html-script: true;">PExmp</pre>');
+ });
+
});
describe('@deprecated', function() {
diff --git a/docs/spec/writerSpec.js b/docs/spec/writerSpec.js
index 1a722ca6..8354ad5d 100644
--- a/docs/spec/writerSpec.js
+++ b/docs/spec/writerSpec.js
@@ -2,17 +2,17 @@ var writer = require('writer.js');
describe('writer', function(){
describe('toString', function(){
var toString = writer.toString;
-
+
it('should merge string', function(){
expect(toString('abc')).toEqual('abc');
});
-
+
it('should merge obj', function(){
expect(toString({a:1})).toEqual('{"a":1}');
});
-
+
it('should merge array', function(){
expect(toString(['abc',{}])).toEqual('abc{}');
});
});
-}); \ No newline at end of file
+});
diff --git a/docs/src/gen-docs.js b/docs/src/gen-docs.js
index 0dee586b..1c03a0f1 100644
--- a/docs/src/gen-docs.js
+++ b/docs/src/gen-docs.js
@@ -38,7 +38,7 @@ var writes = callback.chain(function(){
writer.copy('jquery.min.js', writes.waitFor());
});
writes.onDone(function(){
- console.log('DONE. Generated ' + docs.length + ' pages in ' +
+ console.log('DONE. Generated ' + docs.length + ' pages in ' +
(now()-start) + 'ms.' );
});
work.onDone(writes);
diff --git a/docs/src/ngdoc.js b/docs/src/ngdoc.js
index 8481f7dc..daa44fef 100644
--- a/docs/src/ngdoc.js
+++ b/docs/src/ngdoc.js
@@ -76,6 +76,7 @@ Doc.prototype = {
this.description = markdown(this.description);
this['this'] = markdown(this['this']);
this.exampleDescription = markdown(this.exampleDescription || this.exampleDesc);
+ return this;
function flush(){
if (atName) {
@@ -144,13 +145,13 @@ Doc.prototype = {
dom.h(method.shortName + '(' + signature.join(', ') + ')', method, function(){
dom.html(method.description);
method.html_usage_parameters(dom);
- dom.example(method.example, false);
+ dom.example(method.exampleDescription, method.example, false);
});
});
dom.h('Properties', self.properties, function(property){
dom.h(property.name, function(){
dom.text(property.description);
- dom.example(property.example, false);
+ dom.example(property.exampleDescription, property.example, false);
});
});
diff --git a/docs/src/reader.js b/docs/src/reader.js
index 8f9f22c3..5a653cd6 100644
--- a/docs/src/reader.js
+++ b/docs/src/reader.js
@@ -88,4 +88,4 @@ function findNgDocInJsFile(file, callback) {
-exports.collect = collect; \ No newline at end of file
+exports.collect = collect;
diff --git a/docs/src/templates/doc_widgets.css b/docs/src/templates/doc_widgets.css
index 8361f105..9f007f0e 100644
--- a/docs/src/templates/doc_widgets.css
+++ b/docs/src/templates/doc_widgets.css
@@ -32,4 +32,4 @@ li.doc-example-live {
div.syntaxhighlighter {
padding-bottom: 1px !important; /* fix to remove unnecessary scrollbars http://is.gd/gSMgC */
-} \ No newline at end of file
+}
diff --git a/docs/src/templates/doc_widgets.js b/docs/src/templates/doc_widgets.js
index 18aeeacb..2d1ab8c6 100644
--- a/docs/src/templates/doc_widgets.js
+++ b/docs/src/templates/doc_widgets.js
@@ -1,5 +1,5 @@
(function(){
-
+
var angularJsUrl;
var scripts = document.getElementsByTagName("script");
var filename = /(.*\/)angular([^\/]*)/;
@@ -10,7 +10,7 @@
}
}
-
+
var HTML_TEMPLATE =
'<!doctype html>\n' +
'<html xmlns:ng="http://angularjs.org">\n' +
@@ -32,15 +32,15 @@
var tabs = angular.element(
'<ul class="doc-example">' +
'<li class="doc-example-heading"><h3>Source</h3></li>' +
- '<li class="doc-example-source" ng:non-bindable>' +
- '<pre class="brush: js; html-script: true; highlight: [' +
+ '<li class="doc-example-source" ng:non-bindable>' +
+ '<pre class="brush: js; html-script: true; highlight: [' +
code.hilite + ']; toolbar: false;"></pre></li>' +
'<li class="doc-example-heading"><h3>Live Preview</h3></li>' +
'<li class="doc-example-live">' + exampleSrc +'</li>' +
'<li class="doc-example-heading"><h3>Scenario Test</h3></li>' +
'<li class="doc-example-scenario"><pre class="brush: js">' + scenario.text() + '</pre></li>' +
'</ul>');
-
+
tabs.find('li.doc-example-source > pre').text(HTML_TEMPLATE.replace('_HTML_SOURCE_', code.html));
element.html('');
@@ -54,7 +54,7 @@
alert(e);
}
});
-
+
function indent(text) {
var lines = text.split(/\n/);
var lineNo = [];
@@ -66,5 +66,5 @@
}
return {html: lines.join('\n'), hilite: lineNo.join(',') };
};
-
-})(); \ No newline at end of file
+
+})();
diff --git a/docs/src/templates/docs-scenario.html b/docs/src/templates/docs-scenario.html
index c75155c5..bc244d5d 100644
--- a/docs/src/templates/docs-scenario.html
+++ b/docs/src/templates/docs-scenario.html
@@ -7,4 +7,4 @@
</head>
<body>
</body>
-</html> \ No newline at end of file
+</html>
diff --git a/docs/src/templates/docs.js b/docs/src/templates/docs.js
index 6bf86ed3..f1cfc3e7 100644
--- a/docs/src/templates/docs.js
+++ b/docs/src/templates/docs.js
@@ -2,7 +2,7 @@ DocsController.$inject = ['$location', '$browser', '$window'];
function DocsController($location, $browser, $window) {
this.pages = NG_PAGES;
window.$root = this.$root;
-
+
this.getUrl = function(page){
return '#!' + page.name;
};
@@ -10,7 +10,7 @@ function DocsController($location, $browser, $window) {
this.getCurrentPartial = function(){
return './' + this.getTitle() + '.html';
};
-
+
this.getTitle = function(){
var hashPath = $location.hashPath || '!angular';
if (hashPath.match(/^!angular/)) {
@@ -18,7 +18,7 @@ function DocsController($location, $browser, $window) {
}
return this.partialTitle;
};
-
+
this.getClass = function(page) {
var depth = page.name.split(/\./).length - 1,
cssClass = 'level-' + depth + (page.name == this.getTitle() ? ' selected' : '');
@@ -37,7 +37,7 @@ function DocsController($location, $browser, $window) {
"subject=" + escape("Feedback on " + $location.href) + "&" +
"body=" + escape("Hi there,\n\nI read " + $location.href + " and wanted to ask ....");
};
-
+
}
angular.filter('short', function(name){
diff --git a/docs/src/templates/syntaxhighlighter/shBrushJScript.js b/docs/src/templates/syntaxhighlighter/shBrushJScript.js
index ff98daba..d52a77b2 100644
--- a/docs/src/templates/syntaxhighlighter/shBrushJScript.js
+++ b/docs/src/templates/syntaxhighlighter/shBrushJScript.js
@@ -7,7 +7,7 @@
*
* @version
* 3.0.83 (July 02 2010)
- *
+ *
* @copyright
* Copyright (C) 2004-2010 Alex Gorbatchev.
*
@@ -29,7 +29,7 @@
;
var r = SyntaxHighlighter.regexLib;
-
+
this.regexList = [
{ regex: r.multiLineDoubleQuotedString, css: 'string' }, // double quoted strings
{ regex: r.multiLineSingleQuotedString, css: 'string' }, // single quoted strings
@@ -38,7 +38,7 @@
{ regex: /\s*#.*/gm, css: 'preprocessor' }, // preprocessor tags like #region and #endregion
{ regex: new RegExp(this.getKeywords(keywords), 'gm'), css: 'keyword' } // keywords
];
-
+
this.forHtmlScript(r.scriptScriptTags);
};
diff --git a/docs/src/templates/syntaxhighlighter/shBrushXml.js b/docs/src/templates/syntaxhighlighter/shBrushXml.js
index 69d9fd0b..ac879949 100644
--- a/docs/src/templates/syntaxhighlighter/shBrushXml.js
+++ b/docs/src/templates/syntaxhighlighter/shBrushXml.js
@@ -7,7 +7,7 @@
*
* @version
* 3.0.83 (July 02 2010)
- *
+ *
* @copyright
* Copyright (C) 2004-2010 Alex Gorbatchev.
*
@@ -28,8 +28,8 @@
tag = new XRegExp('(&lt;|<)[\\s\\/\\?]*(?<name>[:\\w-\\.]+)', 'xg').exec(code),
result = []
;
-
- if (match.attributes != null)
+
+ if (match.attributes != null)
{
var attributes,
regex = new XRegExp('(?<name> [\\w:\\-\\.]+)' +
@@ -37,7 +37,7 @@
'(?<value> ".*?"|\'.*?\'|\\w+)',
'xg');
- while ((attributes = regex.exec(code)) != null)
+ while ((attributes = regex.exec(code)) != null)
{
result.push(new constructor(attributes.name, match.index + attributes.index, 'color1'));
result.push(new constructor(attributes.value, match.index + attributes.index + attributes[0].indexOf(attributes.value), 'string'));
@@ -51,7 +51,7 @@
return result;
}
-
+
this.regexList = [
{ regex: new XRegExp('(\\&lt;|<)\\!\\[[\\w\\s]*?\\[(.|\\s)*?\\]\\](\\&gt;|>)', 'gm'), css: 'color2' }, // <![ ... [ ... ]]>
{ regex: SyntaxHighlighter.regexLib.xmlComments, css: 'comments' }, // <!-- ... -->
diff --git a/docs/src/templates/syntaxhighlighter/shCore.css b/docs/src/templates/syntaxhighlighter/shCore.css
index 34f6864a..4f0021e2 100644
--- a/docs/src/templates/syntaxhighlighter/shCore.css
+++ b/docs/src/templates/syntaxhighlighter/shCore.css
@@ -7,7 +7,7 @@
*
* @version
* 3.0.83 (July 02 2010)
- *
+ *
* @copyright
* Copyright (C) 2004-2010 Alex Gorbatchev.
*
diff --git a/docs/src/templates/syntaxhighlighter/shCore.js b/docs/src/templates/syntaxhighlighter/shCore.js
index b47b6454..effcf59d 100644
--- a/docs/src/templates/syntaxhighlighter/shCore.js
+++ b/docs/src/templates/syntaxhighlighter/shCore.js
@@ -7,7 +7,7 @@
*
* @version
* 3.0.83 (July 02 2010)
- *
+ *
* @copyright
* Copyright (C) 2004-2010 Alex Gorbatchev.
*
diff --git a/docs/src/templates/syntaxhighlighter/shThemeDefault.css b/docs/src/templates/syntaxhighlighter/shThemeDefault.css
index 13654117..8a870e4e 100644
--- a/docs/src/templates/syntaxhighlighter/shThemeDefault.css
+++ b/docs/src/templates/syntaxhighlighter/shThemeDefault.css
@@ -7,7 +7,7 @@
*
* @version
* 3.0.83 (July 02 2010)
- *
+ *
* @copyright
* Copyright (C) 2004-2010 Alex Gorbatchev.
*
diff --git a/docs/src/writer.js b/docs/src/writer.js
index eb1b190f..c72a54a4 100644
--- a/docs/src/writer.js
+++ b/docs/src/writer.js
@@ -13,17 +13,17 @@ function output(docs, content, callback){
exports.output = function(file, content, callback){
//console.log('writing', OUTPUT_DIR + file, '...');
fs.writeFile(
- OUTPUT_DIR + file,
- exports.toString(content),
+ OUTPUT_DIR + file,
+ exports.toString(content),
callback);
};
exports.toString = function toString(obj){
switch (typeof obj) {
- case 'string':
+ case 'string':
return obj;
- case 'object':
+ case 'object':
if (obj instanceof Array) {
obj.forEach(function (value, key){
obj[key] = toString(value);
@@ -54,8 +54,8 @@ exports.copy = function(filename, callback){
fs.readFile('docs/src/templates/' + filename, function(err, content){
if (err) return callback.error(err);
fs.writeFile(
- OUTPUT_DIR + filename,
- content,
+ OUTPUT_DIR + filename,
+ content,
callback);
});
};
diff --git a/src/AngularPublic.js b/src/AngularPublic.js
index ec41d0d9..4654acb1 100644
--- a/src/AngularPublic.js
+++ b/src/AngularPublic.js
@@ -4,7 +4,7 @@ var browserSingleton;
* @ngdoc service
* @name angular.service.$browser
* @requires $log
- *
+ *
* @description
* Represents the browser.
*/
diff --git a/src/Browser.js b/src/Browser.js
index 671ec1cc..c67608cd 100644
--- a/src/Browser.js
+++ b/src/Browser.js
@@ -67,12 +67,12 @@ function Browser(window, document, body, XHR, $log) {
* @ngdoc method
* @name angular.service.$browser#xhr
* @methodOf angular.service.$browser
- *
+ *
* @param {string} method Requested method (get|post|put|delete|head|json)
* @param {string} url Requested url
- * @param {string=} post Post data to send
+ * @param {string=} post Post data to send
* @param {function(number, string)} callback Function that will be called on response
- *
+ *
* @description
* Send ajax request
*/
@@ -113,7 +113,7 @@ function Browser(window, document, body, XHR, $log) {
* @ngdoc method
* @name angular.service.$browser#notifyWhenNoOutstandingRequests
* @methodOf angular.service.$browser
- *
+ *
* @param {function()} callback Function that will be called when no outstanding request
*/
self.notifyWhenNoOutstandingRequests = function(callback) {
@@ -144,12 +144,12 @@ function Browser(window, document, body, XHR, $log) {
* @ngdoc method
* @name angular.service.$browser#addPollFn
* @methodOf angular.service.$browser
- *
+ *
* @param {function()} fn Poll function to add
- *
+ *
* @description
* Adds a function to the list of functions that poller periodically executes
- *
+ *
* @returns {function()} the added function
*/
self.addPollFn = function(fn) {
@@ -162,10 +162,10 @@ function Browser(window, document, body, XHR, $log) {
* @ngdoc method
* @name angular.service.$browser#startPoller
* @methodOf angular.service.$browser
- *
+ *
* @param {number} interval How often should browser call poll functions (ms)
* @param {function()} setTimeout Reference to a real or fake `setTimeout` function.
- *
+ *
* @description
* Configures the poller to run in the specified intervals, using the specified
* setTimeout fn and kicks it off.
@@ -180,15 +180,15 @@ function Browser(window, document, body, XHR, $log) {
//////////////////////////////////////////////////////////////
// URL API
//////////////////////////////////////////////////////////////
-
+
/**
* @workInProgress
* @ngdoc method
* @name angular.service.$browser#setUrl
* @methodOf angular.service.$browser
- *
+ *
* @param {string} url New url
- *
+ *
* @description
* Sets browser's url
*/
@@ -204,10 +204,10 @@ function Browser(window, document, body, XHR, $log) {
* @ngdoc method
* @name angular.service.$browser#getUrl
* @methodOf angular.service.$browser
- *
+ *
* @description
* Get current browser's url
- *
+ *
* @returns {string} Browser's url
*/
self.getUrl = function() {
@@ -261,10 +261,10 @@ function Browser(window, document, body, XHR, $log) {
* @ngdoc method
* @name angular.service.$browser#cookies
* @methodOf angular.service.$browser
- *
+ *
* @param {string=} name Cookie name
* @param {string=} value Cokkie value
- *
+ *
* @description
* The cookies method provides a 'private' low level access to browser cookies.
* It is not meant to be used directly, use the $cookie service instead.
@@ -275,7 +275,7 @@ function Browser(window, document, body, XHR, $log) {
* <li>cookies(name, value) -> set name to value, if value is undefined delete the cookie</li>
* <li>cookies(name) -> the same as (name, undefined) == DELETES (no one calls it right now that way)</li>
* </ul>
- *
+ *
* @returns {Object} Hash of all cookies (if called without any parameter)
*/
self.cookies = function (name, value) {
@@ -342,7 +342,7 @@ function Browser(window, document, body, XHR, $log) {
// Misc API
//////////////////////////////////////////////////////////////
var hoverListener = noop;
-
+
/**
* @workInProgress
* @ngdoc method
@@ -356,13 +356,13 @@ function Browser(window, document, body, XHR, $log) {
* occurs.
*/
self.hover = function(listener) { hoverListener = listener; };
-
+
/**
* @workInProgress
* @ngdoc method
* @name angular.service.$browser#bind
* @methodOf angular.service.$browser
- *
+ *
* @description
* Register hover function to real browser
*/
@@ -383,7 +383,7 @@ function Browser(window, document, body, XHR, $log) {
* @ngdoc method
* @name angular.service.$browser#addCss
* @methodOf angular.service.$browser
- *
+ *
* @param {string} url Url to css file
* @description
* Adds a stylesheet tag to the head.
@@ -402,10 +402,10 @@ function Browser(window, document, body, XHR, $log) {
* @ngdoc method
* @name angular.service.$browser#addJs
* @methodOf angular.service.$browser
- *
+ *
* @param {string} url Url to js file
- * @param {string=} dom_id Optional id for the script tag
- *
+ * @param {string=} dom_id Optional id for the script tag
+ *
* @description
* Adds a script tag to the head.
*/
diff --git a/src/Compiler.js b/src/Compiler.js
index 58a7a47b..c2c56650 100644
--- a/src/Compiler.js
+++ b/src/Compiler.js
@@ -123,19 +123,19 @@ Compiler.prototype = {
};
},
-
+
/**
* @workInProgress
* @ngdoc directive
* @name angular.directive.ng:eval-order
*
* @description
- * Normally the view is updated from top to bottom. This usually is
- * not a problem, but under some circumstances the values for data
- * is not available until after the full view is computed. If such
- * values are needed before they are computed the order of
+ * Normally the view is updated from top to bottom. This usually is
+ * not a problem, but under some circumstances the values for data
+ * is not available until after the full view is computed. If such
+ * values are needed before they are computed the order of
* evaluation can be change using ng:eval-order
- *
+ *
* @element ANY
* @param {integer|string=} [priority=0] priority integer, or FIRST, LAST constant
*
@@ -164,7 +164,7 @@ Compiler.prototype = {
<td>{{ items.$sum('total') | currency }}</td>
</tr>
</table>
- *
+ *
* @scenario
it('should check ng:format', function(){
expect(using('.doc-example-live div:first').binding("items.$sum('total')")).toBe('$9.99');
diff --git a/src/Injector.js b/src/Injector.js
index cd9438e7..c7ee6f82 100644
--- a/src/Injector.js
+++ b/src/Injector.js
@@ -31,7 +31,7 @@ function createInjector(providerScope, providers, cache) {
* array of keys: returns an array of instances.
* function: look at $inject property of function to determine instances
* and then call the function with instances and `scope`. Any
- * additional arguments (`args`) are appended to the function
+ * additional arguments (`args`) are appended to the function
* arguments.
* object: initialize eager providers and publish them the ones with publish here.
* none: same as object but use providerScope as place to publish.
diff --git a/src/markups.js b/src/markups.js
index 16ca9ba8..21dab128 100644
--- a/src/markups.js
+++ b/src/markups.js
@@ -74,18 +74,18 @@ angularTextMarkup('OPTION', function(text, textNode, parentElement){
* @name angular.directive.ng:href
*
* @description
- * Using <angular/> markup like {{hash}} in an href attribute makes
- * the page open to a wrong URL, ff the user clicks that link before
- * angular has a chance to replace the {{hash}} with actual URL, the
- * link will be broken and will most likely return a 404 error.
- * The `ng:href` solves this problem by placing the `href` in the
+ * Using <angular/> markup like {{hash}} in an href attribute makes
+ * the page open to a wrong URL, ff the user clicks that link before
+ * angular has a chance to replace the {{hash}} with actual URL, the
+ * link will be broken and will most likely return a 404 error.
+ * The `ng:href` solves this problem by placing the `href` in the
* `ng:` namespace.
*
* The buggy way to write it:
* <pre>
* <a href="http://www.gravatar.com/avatar/{{hash}}"/>
* </pre>
- *
+ *
* The correct way to write it:
* <pre>
* <a ng:href="http://www.gravatar.com/avatar/{{hash}}"/>
@@ -101,8 +101,8 @@ angularTextMarkup('OPTION', function(text, textNode, parentElement){
* @name angular.directive.ng:src
*
* @description
- * Using <angular/> markup like `{{hash}}` in a `src` attribute doesn't
- * work right: The browser will fetch from the URL with the literal
+ * 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 `ng:src` attribute solves this problem by placing
* the `src` attribute in the `ng:` namespace.
@@ -111,7 +111,7 @@ angularTextMarkup('OPTION', function(text, textNode, parentElement){
* <pre>
* <img src="http://www.gravatar.com/avatar/{{hash}}"/>
* </pre>
- *
+ *
* The correct way to write it:
* <pre>
* <img ng:src="http://www.gravatar.com/avatar/{{hash}}"/>
diff --git a/src/parser.js b/src/parser.js
index ac62fb97..f2ca7a80 100644
--- a/src/parser.js
+++ b/src/parser.js
@@ -49,8 +49,8 @@ function lex(text, parseStringsForObjects){
}
} else if (is('(){}[].,;:')) {
tokens.push({
- index:index,
- text:ch,
+ index:index,
+ text:ch,
json:(was(':[,') && is('{[')) || is('}]:,')
});
if (is('{[')) json.unshift(ch);
@@ -108,8 +108,8 @@ function lex(text, parseStringsForObjects){
end = end || index;
throw Error("Lexer Error: " + error + " at column" +
(isDefined(start) ?
- "s " + start + "-" + index + " [" + text.substring(start, end) + "]" :
- " " + end) +
+ "s " + start + "-" + index + " [" + text.substring(start, end) + "]" :
+ " " + end) +
" in expression [" + text + "].");
}
@@ -157,8 +157,8 @@ function lex(text, parseStringsForObjects){
}
fn = OPERATORS[ident];
tokens.push({
- index:start,
- text:ident,
+ index:start,
+ text:ident,
json: fn,
fn:fn||extend(getterFn(ident), {
assign:function(self, value){
@@ -167,7 +167,7 @@ function lex(text, parseStringsForObjects){
})
});
}
-
+
function readString(quote) {
var start = index;
index++;
@@ -217,25 +217,25 @@ function lex(text, parseStringsForObjects){
function parser(text, json){
var ZERO = valueFn(0),
tokens = lex(text, json),
- assignment = _assignment,
+ assignment = _assignment,
assignable = logicalOR,
- functionCall = _functionCall,
- fieldAccess = _fieldAccess,
- objectIndex = _objectIndex,
- filterChain = _filterChain,
- functionIdent = _functionIdent,
+ functionCall = _functionCall,
+ fieldAccess = _fieldAccess,
+ objectIndex = _objectIndex,
+ filterChain = _filterChain,
+ functionIdent = _functionIdent,
pipeFunction = _pipeFunction;
if(json){
- // The extra level of aliasing is here, just in case the lexer misses something, so that
+ // The extra level of aliasing is here, just in case the lexer misses something, so that
// we prevent any accidental execution in JSON.
assignment = logicalOR;
- functionCall =
- fieldAccess =
- objectIndex =
+ functionCall =
+ fieldAccess =
+ objectIndex =
assignable =
- filterChain =
- functionIdent =
- pipeFunction =
+ filterChain =
+ functionIdent =
+ pipeFunction =
function (){ throwError("is not valid json", {text:text, index:0}); };
}
return {
@@ -368,7 +368,7 @@ function parser(text, json){
argFns.push(expression());
} else {
return valueFn({
- format:invokeFn(formatter.format),
+ format:invokeFn(formatter.format),
parse:invokeFn(formatter.parse)
});
}
diff --git a/src/sanitizer.js b/src/sanitizer.js
index 5e99ec71..c8a7b9f1 100644
--- a/src/sanitizer.js
+++ b/src/sanitizer.js
@@ -214,7 +214,7 @@ function decodeEntities(value) {
}
/**
- * Escapes all potentially dangerous characters, so that the
+ * Escapes all potentially dangerous characters, so that the
* resulting string can be safely inserted into attribute or
* element text.
* @param value
diff --git a/src/scenario/output/Json.js b/src/scenario/output/Json.js
index 94212301..2c852496 100644
--- a/src/scenario/output/Json.js
+++ b/src/scenario/output/Json.js
@@ -3,7 +3,7 @@
*/
angular.scenario.output('json', function(context, runner) {
var model = new angular.scenario.ObjectModel(runner);
-
+
runner.on('RunnerEnd', function() {
context.text(angular.toJson(model.value));
});
diff --git a/src/services.js b/src/services.js
index 1a7b91ac..aa4a2090 100644
--- a/src/services.js
+++ b/src/services.js
@@ -11,16 +11,16 @@ function angularServiceInject(name, fn, inject, eager) {
* @workInProgress
* @ngdoc service
* @name angular.service.$window
- *
+ *
* @description
* Is reference to the browser's <b>window</b> object. While <b>window</b>
* is globally available in JavaScript, it causes testability problems, because
* it is a global variable. In <b><angular/></b> we always refer to it through the
* $window service, so it may be overriden, removed or mocked for testing.
- *
+ *
* All expressions are evaluated with respect to current scope so they don't
* suffer from window globality.
- *
+ *
* @example
<input ng:init="greeting='Hello World!'" type="text" name="greeting" />
<button ng:click="$window.alert(greeting)">ALERT</button>
@@ -32,7 +32,7 @@ angularServiceInject("$window", bind(window, identity, window), [], EAGER);
* @ngdoc service
* @name angular.service.$document
* @requires $window
- *
+ *
* @description
* Reference to the browser window.document, but wrapped into angular.element().
*/
@@ -45,7 +45,7 @@ angularServiceInject("$document", function(window){
* @ngdoc service
* @name angular.service.$location
* @requires $browser
- *
+ *
* @property {string} href
* @property {string} protocol
* @property {string} host
@@ -55,15 +55,15 @@ angularServiceInject("$document", function(window){
* @property {string} hash
* @property {string} hashPath
* @property {Object.<string|boolean>} hashSearch
- *
+ *
* @description
* Parses the browser location url and makes it available to your application.
* Any changes to the url are reflected into $location service and changes to
* $location are reflected to url.
* Notice that using browser's forward/back buttons changes the $location.
- *
+ *
* @example
- <a href="#">clear hash</a> |
+ <a href="#">clear hash</a> |
<a href="#myPath?name=misko">test hash</a><br/>
<input type='text' name="$location.hash"/>
<pre>$location = {{$location}}</pre>
@@ -91,7 +91,7 @@ angularServiceInject("$location", function($browser) {
* @ngdoc method
* @name angular.service.$location#update
* @methodOf angular.service.$location
- *
+ *
* @description
* Update location object
* Does not immediately update the browser
@@ -127,7 +127,7 @@ angularServiceInject("$location", function($browser) {
* @ngdoc method
* @name angular.service.$location#updateHash
* @methodOf angular.service.$location
- *
+ *
* @description
* Update location hash part
* @see update()
@@ -288,13 +288,13 @@ angularServiceInject("$location", function($browser) {
* @ngdoc service
* @name angular.service.$log
* @requires $window
- *
+ *
* @description
* Is simple service for logging. Default implementation writes the message
* into the browser's console (if present).
- *
+ *
* This is useful for debugging.
- *
+ *
* @example
<p>Reload this page with open console, enter text and hit the log button...</p>
Message:
@@ -311,46 +311,46 @@ angularServiceInject("$log", function($window){
* @ngdoc method
* @name angular.service.$log#log
* @methodOf angular.service.$log
- *
+ *
* @description
* Write a log message
*/
log: consoleLog('log'),
-
+
/**
* @workInProgress
* @ngdoc method
* @name angular.service.$log#warn
* @methodOf angular.service.$log
- *
+ *
* @description
* Write a warning message
*/
warn: consoleLog('warn'),
-
+
/**
* @workInProgress
* @ngdoc method
* @name angular.service.$log#info
* @methodOf angular.service.$log
- *
+ *
* @description
* Write an information message
*/
info: consoleLog('info'),
-
+
/**
* @workInProgress
* @ngdoc method
* @name angular.service.$log#error
* @methodOf angular.service.$log
- *
+ *
* @description
* Write an error message
*/
error: consoleLog('error')
};
-
+
function consoleLog(type) {
var console = $window.console || {};
var logFn = console[type] || console.log || noop;
@@ -374,17 +374,17 @@ angularServiceInject("$log", function($window){
* @ngdoc service
* @name angular.service.$exceptionHandler
* @requires $log
- *
+ *
* @description
* Any uncaught exception in <angular/> is delegated to this service.
* The default implementation simply delegates to $log.error which logs it into
* the browser console.
- *
+ *
* When unit testing it is useful to have uncaught exceptions propagate
* to the test so the test will fail rather than silently log the exception
* to the browser console. For this purpose you can override this service with
- * a simple rethrow.
- *
+ * a simple rethrow.
+ *
* @example
*/
angularServiceInject('$exceptionHandler', function($log){
@@ -459,9 +459,9 @@ angularServiceInject('$updateView', serviceUpdateViewFactory, ['$browser']);
* @name angular.service.$hover
* @requires $browser
* @requires $document
- *
+ *
* @description
- *
+ *
* @example
*/
angularServiceInject("$hover", function(browser, document) {
@@ -514,11 +514,11 @@ angularServiceInject("$hover", function(browser, document) {
* @workInProgress
* @ngdoc service
* @name angular.service.$invalidWidgets
- *
+ *
* @description
* Keeps references to all invalid widgets found during validation.
* Can be queried to find whether there are any invalid widgets currently displayed.
- *
+ *
* @example
*/
angularServiceInject("$invalidWidgets", function(){
@@ -608,45 +608,45 @@ function switchRouteMatcher(on, when, dstName) {
* @ngdoc service
* @name angular.service.$route
* @requires $location
- *
+ *
* @property {Object} current Name of the current route
* @property {Array.<Object>} routes List of configured routes
- *
+ *
* @description
* Watches $location.hashPath and tries to map the hash to an existing route
* definition. It is used for deep-linking URLs to controllers and views (HTML partials).
- *
+ *
* $route is typically used in conjunction with {@link angular.widget.ng:view ng:view} widget.
- *
+ *
* @example
<p>
- This example shows how changing the URL hash causes the <tt>$route</tt>
- to match a route against the URL, and the <tt>[[ng:include]]</tt> pulls in the partial.
- Try changing the URL in the input box to see changes.
+ This example shows how changing the URL hash causes the <tt>$route</tt>
+ to match a route against the URL, and the <tt>[[ng:include]]</tt> pulls in the partial.
+ Try changing the URL in the input box to see changes.
</p>
-
+
<script>
- angular.service('myApp', function($route) {
- $route.when('/Book/:bookId', {template:'rsrc/book.html', controller:BookCntl});
- $route.when('/Book/:bookId/ch/:chapterId', {template:'rsrc/chapter.html', controller:ChapterCntl});
- $route.onChange(function() {
- $route.current.scope.params = $route.current.params;
- });
- }, {$inject: ['$route']});
-
- function BookCntl() {
- this.name = "BookCntl";
- }
-
- function ChapterCntl() {
- this.name = "ChapterCntl";
- }
+ angular.service('myApp', function($route) {
+ $route.when('/Book/:bookId', {template:'rsrc/book.html', controller:BookCntl});
+ $route.when('/Book/:bookId/ch/:chapterId', {template:'rsrc/chapter.html', controller:ChapterCntl});
+ $route.onChange(function() {
+ $route.current.scope.params = $route.current.params;
+ });
+ }, {$inject: ['$route']});
+
+ function BookCntl() {
+ this.name = "BookCntl";
+ }
+
+ function ChapterCntl() {
+ this.name = "ChapterCntl";
+ }
</script>
-Chose:
-<a href="#/Book/Moby">Moby</a> |
-<a href="#/Book/Moby/ch/1">Moby: Ch1</a> |
-<a href="#/Book/Gatsby">Gatsby</a> |
+Chose:
+<a href="#/Book/Moby">Moby</a> |
+<a href="#/Book/Moby/ch/1">Moby: Ch1</a> |
+<a href="#/Book/Gatsby">Gatsby</a> |
<a href="#/Book/Gatsby/ch/4?key=value">Gatsby: Ch4</a><br/>
<input type="text" name="$location.hashPath" size="80" />
<pre>$location={{$location}}</pre>
@@ -664,31 +664,31 @@ angularServiceInject('$route', function(location) {
dirty = 0,
$route = {
routes: routes,
-
+
/**
* @workInProgress
* @ngdoc method
* @name angular.service.$route#onChange
* @methodOf angular.service.$route
- *
+ *
* @param {function()} fn Function that will be called on route change
- *
+ *
* @description
* Register a handler function that will be called when route changes
*/
onChange: bind(onChange, onChange.push),
-
+
/**
* @workInProgress
* @ngdoc method
* @name angular.service.$route#when
* @methodOf angular.service.$route
- *
+ *
* @param {string} path Route path (matched against $location.hash)
* @param {Object} params Mapping information to be assigned to `$route.current` on route
* match.
* @returns {Object} route object
- *
+ *
* @description
* Add new route
*/
@@ -732,9 +732,9 @@ angularServiceInject('$route', function(location) {
* @requires $browser
* @requires $xhr.error
* @requires $log
- *
+ *
* @description
- *
+ *
* @example
*/
angularServiceInject('$xhr', function($browser, $error, $log){
@@ -773,9 +773,9 @@ angularServiceInject('$xhr', function($browser, $error, $log){
* @ngdoc service
* @name angular.service.$xhr.error
* @requires $log
- *
+ *
* @description
- *
+ *
* @example
*/
angularServiceInject('$xhr.error', function($log){
@@ -791,9 +791,9 @@ angularServiceInject('$xhr.error', function($log){
* @requires $xhr
* @requires $xhr.error
* @requires $log
- *
+ *
* @description
- *
+ *
* @example
*/
angularServiceInject('$xhr.bulk', function($xhr, $error, $log){
@@ -885,9 +885,9 @@ angularServiceInject('$defer', function($browser, $exceptionHandler, $updateView
* @ngdoc service
* @name angular.service.$xhr.cache
* @requires $xhr
- *
+ *
* @description
- *
+ *
* @example
*/
angularServiceInject('$xhr.cache', function($xhr, $defer, $log){
@@ -942,7 +942,7 @@ angularServiceInject('$xhr.cache', function($xhr, $defer, $log){
* @requires $xhr
*
* @description
- * Is a factory which creates a resource object which lets you interact with
+ * Is a factory which creates a resource object which lets you interact with
* <a href="http://en.wikipedia.org/wiki/Representational_State_Transfer" target="_blank">RESTful</a>
* server-side data sources.
* Resource object has action methods which provide high-level behaviors without
@@ -1051,7 +1051,7 @@ angularServiceInject('$xhr.cache', function($xhr, $defer, $log){
{get:{method:'JSON', params:{visibility:'@self'}}, replies: {method:'JSON', params:{visibility:'@self', comments:'@comments'}}}
);
}
-
+
BuzzController.prototype = {
fetch: function() {
this.activities = this.Activity.get({userId:this.userId});
@@ -1069,9 +1069,9 @@ angularServiceInject('$xhr.cache', function($xhr, $defer, $log){
<hr/>
<div ng:repeat="item in activities.data.items">
<h1 style="font-size: 15px;">
- <img src="{{item.actor.thumbnailUrl}}" style="max-height:30px;max-width:30px;"/>
- <a href="{{item.actor.profileUrl}}">{{item.actor.name}}</a>
- <a href ng:click="expandReplies(item)" style="float: right;">Expand replies: {{item.links.replies[0].count}}</a>
+ <img src="{{item.actor.thumbnailUrl}}" style="max-height:30px;max-width:30px;"/>
+ <a href="{{item.actor.profileUrl}}">{{item.actor.name}}</a>
+ <a href ng:click="expandReplies(item)" style="float: right;">Expand replies: {{item.links.replies[0].count}}</a>
</h1>
{{item.object.content | html}}
<div ng:repeat="reply in item.replies.data.items" style="margin-left: 20px;">
@@ -1091,13 +1091,13 @@ angularServiceInject('$resource', function($xhr){
* @ngdoc service
* @name angular.service.$cookies
* @requires $browser
- *
+ *
* @description
* Provides read/write access to browser's cookies.
- *
+ *
* Only a simple Object is exposed and by adding or removing properties to/from
* this object, new cookies are created/deleted at the end of current $eval.
- *
+ *
* @example
*/
angularServiceInject('$cookies', function($browser) {
@@ -1181,7 +1181,7 @@ angularServiceInject('$cookies', function($browser) {
* @ngdoc service
* @name angular.service.$cookieStore
* @requires $cookies
- *
+ *
* @description
* Provides a key-value (string-object) storage, that is backed by session cookies.
* Objects put or retrieved from this storage are automatically serialized or
@@ -1196,10 +1196,10 @@ angularServiceInject('$cookieStore', function($store) {
* @ngdoc method
* @name angular.service.$cookieStore#get
* @methodOf angular.service.$cookieStore
- *
+ *
* @description
* Returns the value of given cookie key
- *
+ *
* @param {string} key Id to use for lookup.
* @returns {Object} Deserialized cookie value.
*/
@@ -1212,10 +1212,10 @@ angularServiceInject('$cookieStore', function($store) {
* @ngdoc method
* @name angular.service.$cookieStore#put
* @methodOf angular.service.$cookieStore
- *
+ *
* @description
* Sets a value for given cookie key
- *
+ *
* @param {string} key Id for the `value`.
* @param {Object} value Value to be stored.
*/
@@ -1228,10 +1228,10 @@ angularServiceInject('$cookieStore', function($store) {
* @ngdoc method
* @name angular.service.$cookieStore#remove
* @methodOf angular.service.$cookieStore
- *
+ *
* @description
* Remove given cookie
- *
+ *
* @param {string} key Id of the key-value pair to delete.
*/
remove: function(key) {
diff --git a/src/validators.js b/src/validators.js
index 7d115518..30936574 100644
--- a/src/validators.js
+++ b/src/validators.js
@@ -7,32 +7,32 @@ extend(angularValidator, {
* @name angular.validator.regexp
* @description
* Use regexp validator to restrict the input to any Regular Expression.
- *
+ *
* @param {string} value value to validate
* @param {string|regexp} expression regular expression.
* @param {string=} msg error message to display.
* @css ng-validation-error
- *
+ *
* @example
* <script> function Cntl(){
- * this.ssnRegExp = /^\d\d\d-\d\d-\d\d\d\d$/;
+ * this.ssnRegExp = /^\d\d\d-\d\d-\d\d\d\d$/;
* }
* </script>
* Enter valid SSN:
* <div ng:controller="Cntl">
* <input name="ssn" value="123-45-6789" ng:validate="regexp:ssnRegExp" >
* </div>
- *
+ *
* @scenario
* it('should invalidate non ssn', function(){
* var textBox = element('.doc-example :input');
* expect(textBox.attr('className')).not().toMatch(/ng-validation-error/);
* expect(textBox.val()).toEqual('123-45-6789');
- *
+ *
* input('ssn').enter('123-45-67890');
* expect(textBox.attr('className')).toMatch(/ng-validation-error/);
* });
- *
+ *
*/
'regexp': function(value, regexp, msg) {
if (!value.match(regexp)) {
@@ -48,38 +48,38 @@ extend(angularValidator, {
* @ngdoc validator
* @name angular.validator.number
* @description
- * Use number validator to restrict the input to numbers with an
+ * Use number validator to restrict the input to numbers with an
* optional range. (See integer for whole numbers validator).
- *
+ *
* @param {string} value value to validate
* @param {int=} [min=MIN_INT] minimum value.
* @param {int=} [max=MAX_INT] maximum value.
* @css ng-validation-error
- *
+ *
* @example
* Enter number: <input name="n1" ng:validate="number" > <br>
* Enter number greater than 10: <input name="n2" ng:validate="number:10" > <br>
* Enter number between 100 and 200: <input name="n3" ng:validate="number:100:200" > <br>
- *
+ *
* @scenario
* it('should invalidate number', function(){
* var n1 = element('.doc-example :input[name=n1]');
* expect(n1.attr('className')).not().toMatch(/ng-validation-error/);
* input('n1').enter('1.x');
* expect(n1.attr('className')).toMatch(/ng-validation-error/);
- *
+ *
* var n2 = element('.doc-example :input[name=n2]');
* expect(n2.attr('className')).not().toMatch(/ng-validation-error/);
* input('n2').enter('9');
* expect(n2.attr('className')).toMatch(/ng-validation-error/);
- *
+ *
* var n3 = element('.doc-example :input[name=n3]');
* expect(n3.attr('className')).not().toMatch(/ng-validation-error/);
* input('n3').enter('201');
* expect(n3.attr('className')).toMatch(/ng-validation-error/);
- *
+ *
* });
- *
+ *
*/
'number': function(value, min, max) {
var num = 1 * value;
@@ -101,36 +101,36 @@ extend(angularValidator, {
* @ngdoc validator
* @name angular.validator.integer
* @description
- * Use number validator to restrict the input to integers with an
+ * Use number validator to restrict the input to integers with an
* optional range. (See integer for whole numbers validator).
- *
+ *
* @param {string} value value to validate
* @param {int=} [min=MIN_INT] minimum value.
* @param {int=} [max=MAX_INT] maximum value.
* @css ng-validation-error
- *
+ *
* @example
* Enter integer: <input name="n1" ng:validate="integer" > <br>
* Enter integer equal or greater than 10: <input name="n2" ng:validate="integer:10" > <br>
* Enter integer between 100 and 200 (inclusive): <input name="n3" ng:validate="integer:100:200" > <br>
- *
+ *
* @scenario
* it('should invalidate integer', function(){
* var n1 = element('.doc-example :input[name=n1]');
* expect(n1.attr('className')).not().toMatch(/ng-validation-error/);
* input('n1').enter('1.1');
* expect(n1.attr('className')).toMatch(/ng-validation-error/);
- *
+ *
* var n2 = element('.doc-example :input[name=n2]');
* expect(n2.attr('className')).not().toMatch(/ng-validation-error/);
* input('n2').enter('10.1');
* expect(n2.attr('className')).toMatch(/ng-validation-error/);
- *
+ *
* var n3 = element('.doc-example :input[name=n3]');
* expect(n3.attr('className')).not().toMatch(/ng-validation-error/);
* input('n3').enter('100.1');
* expect(n3.attr('className')).toMatch(/ng-validation-error/);
- *
+ *
* });
*/
'integer': function(value, min, max) {
@@ -149,14 +149,14 @@ extend(angularValidator, {
* @description
* Use date validator to restrict the user input to a valid date
* in format in format MM/DD/YYYY.
- *
+ *
* @param {string} value value to validate
* @css ng-validation-error
- *
+ *
* @example
* Enter valid date:
* <input name="text" value="1/1/2009" ng:validate="date" >
- *
+ *
* @scenario
* it('should invalidate date', function(){
* var n1 = element('.doc-example :input');
@@ -164,7 +164,7 @@ extend(angularValidator, {
* input('text').enter('123/123/123');
* expect(n1.attr('className')).toMatch(/ng-validation-error/);
* });
- *
+ *
*/
'date': function(value) {
var fields = /^(\d\d?)\/(\d\d?)\/(\d\d\d\d)$/.exec(value);
@@ -182,14 +182,14 @@ extend(angularValidator, {
* @name angular.validator.email
* @description
* Use email validator if you wist to restrict the user input to a valid email.
- *
+ *
* @param {string} value value to validate
* @css ng-validation-error
- *
+ *
* @example
* Enter valid email:
* <input name="text" ng:validate="email" value="me@example.com">
- *
+ *
* @scenario
* it('should invalidate email', function(){
* var n1 = element('.doc-example :input');
@@ -197,7 +197,7 @@ extend(angularValidator, {
* input('text').enter('a@b.c');
* expect(n1.attr('className')).toMatch(/ng-validation-error/);
* });
- *
+ *
*/
'email': function(value) {
if (value.match(/^[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Za-z]{2,4}$/)) {
@@ -212,14 +212,14 @@ extend(angularValidator, {
* @name angular.validator.phone
* @description
* Use phone validator to restrict the input phone numbers.
- *
+ *
* @param {string} value value to validate
* @css ng-validation-error
- *
+ *
* @example
* Enter valid phone number:
* <input name="text" value="1(234)567-8901" ng:validate="phone" >
- *
+ *
* @scenario
* it('should invalidate phone', function(){
* var n1 = element('.doc-example :input');
@@ -227,7 +227,7 @@ extend(angularValidator, {
* input('text').enter('+12345678');
* expect(n1.attr('className')).toMatch(/ng-validation-error/);
* });
- *
+ *
*/
'phone': function(value) {
if (value.match(/^1\(\d\d\d\)\d\d\d-\d\d\d\d$/)) {
@@ -245,14 +245,14 @@ extend(angularValidator, {
* @name angular.validator.url
* @description
* Use phone validator to restrict the input URLs.
- *
+ *
* @param {string} value value to validate
* @css ng-validation-error
- *
+ *
* @example
* Enter valid phone number:
* <input name="text" value="http://example.com/abc.html" size="40" ng:validate="url" >
- *
+ *
* @scenario
* it('should invalidate url', function(){
* var n1 = element('.doc-example :input');
@@ -260,7 +260,7 @@ extend(angularValidator, {
* input('text').enter('abc://server/path');
* expect(n1.attr('className')).toMatch(/ng-validation-error/);
* });
- *
+ *
*/
'url': function(value) {
if (value.match(/^(ftp|http|https):\/\/(\w+:{0,1}\w*@)?(\S+)(:[0-9]+)?(\/|\/([\w#!:.?+=&%@!\-\/]))?$/)) {
@@ -275,15 +275,15 @@ extend(angularValidator, {
* @name angular.validator.json
* @description
* Use json validator if you wish to restrict the user input to a valid JSON.
- *
+ *
* @param {string} value value to validate
* @css ng-validation-error
- *
+ *
* @example
* <textarea name="json" cols="60" rows="5" ng:validate="json">
* {name:'abc'}
* </textarea>
- *
+ *
* @scenario
* it('should invalidate json', function(){
* var n1 = element('.doc-example :input');
@@ -291,7 +291,7 @@ extend(angularValidator, {
* input('json').enter('{name}');
* expect(n1.attr('className')).toMatch(/ng-validation-error/);
* });
- *
+ *
*/
'json': function(value) {
try {
@@ -307,36 +307,36 @@ extend(angularValidator, {
* @ngdoc validator
* @name angular.validator.asynchronous
* @description
- * Use asynchronous validator if the validation can not be computed
- * immediately, but is provided through a callback. The widget
- * automatically shows a spinning indicator while the validity of
+ * Use asynchronous validator if the validation can not be computed
+ * immediately, but is provided through a callback. The widget
+ * automatically shows a spinning indicator while the validity of
* the widget is computed. This validator caches the result.
- *
+ *
* @param {string} value value to validate
* @param {function(inputToValidate,validationDone)} validate function to call to validate the state
* of the input.
- * @param {function(data)=} [update=noop] function to call when state of the
+ * @param {function(data)=} [update=noop] function to call when state of the
* validator changes
- *
+ *
* @paramDescription
- * The `validate` function (specified by you) is called as
+ * The `validate` function (specified by you) is called as
* `validate(inputToValidate, validationDone)`:
- *
+ *
* * `inputToValidate`: value of the input box.
* * `validationDone`: `function(error, data){...}`
* * `error`: error text to display if validation fails
* * `data`: data object to pass to update function
- *
+ *
* The `update` function is optionally specified by you and is
- * called by <angular/> on input change. Since the
- * asynchronous validator caches the results, the update
- * function can be called without a call to `validate`
+ * called by <angular/> on input change. Since the
+ * asynchronous validator caches the results, the update
+ * function can be called without a call to `validate`
* function. The function is called as `update(data)`:
- *
+ *
* * `data`: data object as passed from validate function
- *
+ *
* @css ng-input-indicator-wait, ng-validation-error
- *
+ *
* @example
* <script>
* function MyCntl(){
@@ -351,23 +351,23 @@ extend(angularValidator, {
* <div ng:controller="MyCntl">
* <input name="text" ng:validate="asynchronous:myValidator">
* </div>
- *
+ *
* @scenario
* it('should change color in delayed way', function(){
* var textBox = element('.doc-example :input');
* expect(textBox.attr('className')).not().toMatch(/ng-input-indicator-wait/);
* expect(textBox.attr('className')).not().toMatch(/ng-validation-error/);
- *
+ *
* input('text').enter('X');
* expect(textBox.attr('className')).toMatch(/ng-input-indicator-wait/);
- *
+ *
* pause(.6);
- *
+ *
* expect(textBox.attr('className')).not().toMatch(/ng-input-indicator-wait/);
* expect(textBox.attr('className')).toMatch(/ng-validation-error/);
- *
+ *
* });
- *
+ *
*/
/*
* cache is attached to the element
diff --git a/test/AngularSpec.js b/test/AngularSpec.js
index 0e6b2bfa..010dce7c 100644
--- a/test/AngularSpec.js
+++ b/test/AngularSpec.js
@@ -312,24 +312,24 @@ describe('angular service', function() {
var scope = createScope();
angular.service('fake', function() { return 'old'; });
angular.service('fake', function() { return 'new'; });
-
+
expect(scope.$service('fake')).toEqual('new');
});
-
+
it('should not preserve properties on override', function() {
angular.service('fake', {$one: true}, {$two: true}, {three: true});
var result = angular.service('fake', {$four: true});
-
+
expect(result.$one).toBeUndefined();
expect(result.$two).toBeUndefined();
expect(result.three).toBeUndefined();
expect(result.$four).toBe(true);
});
-
+
it('should not preserve non-angular properties on override', function() {
angular.service('fake', {one: true}, {two: true});
var result = angular.service('fake', {third: true});
-
+
expect(result.one).not.toBeDefined();
expect(result.two).not.toBeDefined();
expect(result.third).toBeTruthy();
diff --git a/test/BinderSpec.js b/test/BinderSpec.js
index 33bcb091..f12c1a74 100644
--- a/test/BinderSpec.js
+++ b/test/BinderSpec.js
@@ -1,16 +1,16 @@
describe('Binder', function(){
-
+
beforeEach(function(){
var self = this;
-
+
this.compile = function(html, initialScope, parent) {
var compiler = new Compiler(angularTextMarkup, angularAttrMarkup, angularDirective, angularWidget);
if (self.element) dealoc(self.element);
var element = self.element = jqLite(html);
var scope = compiler.compile(element)(element);
-
+
if (parent) parent.append(element);
-
+
extend(scope, initialScope);
scope.$init();
return {node:element, scope:scope};
@@ -19,48 +19,48 @@ describe('Binder', function(){
return sortedHtml(this.compile(content).node);
};
});
-
+
afterEach(function(){
if (this.element && this.element.dealoc) {
this.element.dealoc();
}
});
-
-
+
+
it('ChangingTextfieldUpdatesModel', function(){
var state = this.compile('<input type="text" name="model.price" value="abc">', {model:{}});
state.scope.$eval();
assertEquals('abc', state.scope.model.price);
});
-
+
it('ChangingTextareaUpdatesModel', function(){
var c = this.compile('<textarea name="model.note">abc</textarea>');
c.scope.$eval();
assertEquals(c.scope.model.note, 'abc');
});
-
+
it('ChangingRadioUpdatesModel', function(){
var c = this.compile('<input type="radio" name="model.price" value="A" checked>' +
'<input type="radio" name="model.price" value="B">');
c.scope.$eval();
assertEquals(c.scope.model.price, 'A');
});
-
+
it('ChangingCheckboxUpdatesModel', function(){
var form = this.compile('<input type="checkbox" name="model.price" value="true" checked ng:format="boolean"/>');
assertEquals(true, form.scope.model.price);
});
-
+
it('BindUpdate', function(){
var c = this.compile('<div ng:eval="a=123"/>');
assertEquals(123, c.scope.$get('a'));
});
-
+
it('ChangingSelectNonSelectedUpdatesModel', function(){
var form = this.compile('<select name="model.price"><option value="A">A</option><option value="B">B</option></select>');
assertEquals('A', form.scope.model.price);
});
-
+
it('ChangingMultiselectUpdatesModel', function(){
var form = this.compile('<select name="Invoice.options" multiple="multiple">' +
'<option value="A" selected>Gift wrap</option>' +
@@ -69,35 +69,35 @@ describe('Binder', function(){
'</select>');
assertJsonEquals(["A", "B"], form.scope.$get('Invoice').options);
});
-
+
it('ChangingSelectSelectedUpdatesModel', function(){
var form = this.compile('<select name="model.price"><option>A</option><option selected value="b">B</option></select>');
assertEquals(form.scope.model.price, 'b');
});
-
+
it('ExecuteInitialization', function(){
var c = this.compile('<div ng:init="a=123">');
assertEquals(c.scope.$get('a'), 123);
});
-
+
it('ExecuteInitializationStatements', function(){
var c = this.compile('<div ng:init="a=123;b=345">');
assertEquals(c.scope.$get('a'), 123);
assertEquals(c.scope.$get('b'), 345);
});
-
+
it('ApplyTextBindings', function(){
var form = this.compile('<div ng:bind="model.a">x</div>');
form.scope.$set('model', {a:123});
form.scope.$eval();
assertEquals('123', form.node.text());
});
-
+
it('ReplaceBindingInTextWithSpan', function(){
assertEquals(this.compileToHtml("<b>a{{b}}c</b>"), '<b>a<span ng:bind="b"></span>c</b>');
assertEquals(this.compileToHtml("<b>{{b}}</b>"), '<b><span ng:bind="b"></span></b>');
});
-
+
it('BindingSpaceConfusesIE', function(){
if (!msie) return;
var span = document.createElement("span");
@@ -110,7 +110,7 @@ describe('Binder', function(){
'<b><span ng:bind="A"></span><span>'+nbsp+'x </span><span ng:bind="B"></span><span>'+nbsp+'(</span><span ng:bind="C"></span>)</b>',
this.compileToHtml("<b>{{A}} x {{B}} ({{C}})</b>"));
});
-
+
it('BindingOfAttributes', function(){
var c = this.compile("<a href='http://s/a{{b}}c' foo='x'></a>");
var attrbinding = c.node.attr("ng:bind-attr");
@@ -118,7 +118,7 @@ describe('Binder', function(){
assertEquals("http://s/a{{b}}c", decodeURI(bindings.href));
assertTrue(!bindings.foo);
});
-
+
it('MarkMultipleAttributes', function(){
var c = this.compile('<a href="http://s/a{{b}}c" foo="{{d}}"></a>');
var attrbinding = c.node.attr("ng:bind-attr");
@@ -126,20 +126,20 @@ describe('Binder', function(){
assertEquals(bindings.foo, "{{d}}");
assertEquals(decodeURI(bindings.href), "http://s/a{{b}}c");
});
-
+
it('AttributesNoneBound', function(){
var c = this.compile("<a href='abc' foo='def'></a>");
var a = c.node;
assertEquals(a[0].nodeName, "A");
assertTrue(!a.attr("ng:bind-attr"));
});
-
+
it('ExistingAttrbindingIsAppended', function(){
var c = this.compile("<a href='http://s/{{abc}}' ng:bind-attr='{\"b\":\"{{def}}\"}'></a>");
var a = c.node;
assertEquals('{"b":"{{def}}","href":"http://s/{{abc}}"}', a.attr('ng:bind-attr'));
});
-
+
it('AttributesAreEvaluated', function(){
var c = this.compile('<a ng:bind-attr=\'{"a":"a", "b":"a+b={{a+b}}"}\'></a>');
var binder = c.binder, form = c.node;
@@ -149,7 +149,7 @@ describe('Binder', function(){
assertEquals(a.attr('a'), 'a');
assertEquals(a.attr('b'), 'a+b=3');
});
-
+
it('InputTypeButtonActionExecutesInScope', function(){
var savedCalled = false;
var c = this.compile('<input type="button" ng:click="person.save()" value="Apply">');
@@ -159,7 +159,7 @@ describe('Binder', function(){
browserTrigger(c.node, 'click');
assertTrue(savedCalled);
});
-
+
it('InputTypeButtonActionExecutesInScope2', function(){
var log = "";
var c = this.compile('<input type="image" ng:click="action()">');
@@ -170,7 +170,7 @@ describe('Binder', function(){
browserTrigger(c.node, 'click');
expect(log).toEqual('click;');
});
-
+
it('ButtonElementActionExecutesInScope', function(){
var savedCalled = false;
var c = this.compile('<button ng:click="person.save()">Apply</button>');
@@ -180,20 +180,20 @@ describe('Binder', function(){
browserTrigger(c.node, 'click');
assertTrue(savedCalled);
});
-
+
it('RepeaterUpdateBindings', function(){
var a = this.compile('<ul><LI ng:repeat="item in model.items" ng:bind="item.a"/></ul>');
var form = a.node;
var items = [{a:"A"}, {a:"B"}];
a.scope.$set('model', {items:items});
-
+
a.scope.$eval();
assertEquals('<ul>' +
'<#comment></#comment>' +
'<li ng:bind="item.a" ng:repeat-index="0">A</li>' +
'<li ng:bind="item.a" ng:repeat-index="1">B</li>' +
'</ul>', sortedHtml(form));
-
+
items.unshift({a:'C'});
a.scope.$eval();
assertEquals('<ul>' +
@@ -202,7 +202,7 @@ describe('Binder', function(){
'<li ng:bind="item.a" ng:repeat-index="1">A</li>' +
'<li ng:bind="item.a" ng:repeat-index="2">B</li>' +
'</ul>', sortedHtml(form));
-
+
items.shift();
a.scope.$eval();
assertEquals('<ul>' +
@@ -210,12 +210,12 @@ describe('Binder', function(){
'<li ng:bind="item.a" ng:repeat-index="0">A</li>' +
'<li ng:bind="item.a" ng:repeat-index="1">B</li>' +
'</ul>', sortedHtml(form));
-
+
items.shift();
items.shift();
a.scope.$eval();
});
-
+
it('RepeaterContentDoesNotBind', function(){
var a = this.compile('<ul><LI ng:repeat="item in model.items"><span ng:bind="item.a"></span></li></ul>');
a.scope.$set('model', {items:[{a:"A"}]});
@@ -225,18 +225,18 @@ describe('Binder', function(){
'<li ng:repeat-index="0"><span ng:bind="item.a">A</span></li>' +
'</ul>', sortedHtml(a.node));
});
-
+
it('ExpandEntityTag', function(){
assertEquals(
'<div ng-entity="Person" ng:watch="$anchor.a:1"></div>',
this.compileToHtml('<div ng-entity="Person" ng:watch="$anchor.a:1"/>'));
});
-
+
it('DoNotOverwriteCustomAction', function(){
var html = this.compileToHtml('<input type="submit" value="Save" action="foo();">');
assertTrue(html.indexOf('action="foo();"') > 0 );
});
-
+
it('RepeaterAdd', function(){
var c = this.compile('<div><input type="text" name="item.x" ng:repeat="item in items"></div>');
var doc = c.node;
@@ -246,81 +246,81 @@ describe('Binder', function(){
var second = childNode(c.node, 2);
assertEquals('a', first.val());
assertEquals('b', second.val());
-
+
first.val('ABC');
browserTrigger(first, 'keydown');
c.scope.$service('$browser').defer.flush();
assertEquals(c.scope.items[0].x, 'ABC');
});
-
+
it('ItShouldRemoveExtraChildrenWhenIteratingOverHash', function(){
var c = this.compile('<div><div ng:repeat="i in items">{{i}}</div></div>');
var items = {};
c.scope.$set("items", items);
-
+
c.scope.$eval();
expect(c.node[0].childNodes.length - 1).toEqual(0);
-
+
items.name = "misko";
c.scope.$eval();
expect(c.node[0].childNodes.length - 1).toEqual(1);
-
+
delete items.name;
c.scope.$eval();
expect(c.node[0].childNodes.length - 1).toEqual(0);
});
-
+
it('IfTextBindingThrowsErrorDecorateTheSpan', function(){
var a = this.compile('<div>{{error.throw()}}</div>');
var doc = a.node;
-
+
a.scope.$set('error.throw', function(){throw "ErrorMsg1";});
a.scope.$eval();
var span = childNode(doc, 0);
assertTrue(span.hasClass('ng-exception'));
assertTrue(!!span.text().match(/ErrorMsg1/));
assertTrue(!!span.attr('ng-exception').match(/ErrorMsg1/));
-
+
a.scope.$set('error.throw', function(){throw "MyError";});
a.scope.$eval();
span = childNode(doc, 0);
assertTrue(span.hasClass('ng-exception'));
assertTrue(span.text(), span.text().match('MyError') !== null);
assertEquals('MyError', span.attr('ng-exception'));
-
+
a.scope.$set('error.throw', function(){return "ok";});
a.scope.$eval();
assertFalse(span.hasClass('ng-exception'));
assertEquals('ok', span.text());
assertEquals(null, span.attr('ng-exception'));
});
-
+
it('IfAttrBindingThrowsErrorDecorateTheAttribute', function(){
var a = this.compile('<div attr="before {{error.throw()}} after"></div>');
var doc = a.node;
-
+
a.scope.$set('error.throw', function(){throw "ErrorMsg";});
a.scope.$eval();
assertTrue('ng-exception', doc.hasClass('ng-exception'));
assertEquals('"ErrorMsg"', doc.attr('ng-exception'));
assertEquals('before "ErrorMsg" after', doc.attr('attr'));
-
+
a.scope.$set('error.throw', function(){ return 'X';});
a.scope.$eval();
assertFalse('!ng-exception', doc.hasClass('ng-exception'));
assertEquals('before X after', doc.attr('attr'));
assertEquals(null, doc.attr('ng-exception'));
-
+
});
-
+
it('NestedRepeater', function(){
var a = this.compile('<div><div ng:repeat="m in model" name="{{m.name}}">' +
'<ul name="{{i}}" ng:repeat="i in m.item"></ul>' +
'</div></div>');
-
+
a.scope.$set('model', [{name:'a', item:['a1', 'a2']}, {name:'b', item:['b1', 'b2']}]);
a.scope.$eval();
-
+
assertEquals('<div>'+
'<#comment></#comment>'+
'<div name="a" ng:bind-attr="{"name":"{{m.name}}"}" ng:repeat-index="0">'+
@@ -334,82 +334,82 @@ describe('Binder', function(){
'<ul name="b2" ng:bind-attr="{"name":"{{i}}"}" ng:repeat-index="1"></ul>'+
'</div></div>', sortedHtml(a.node));
});
-
+
it('HideBindingExpression', function(){
var a = this.compile('<div ng:hide="hidden == 3"/>');
-
+
a.scope.$set('hidden', 3);
a.scope.$eval();
-
+
assertHidden(a.node);
-
+
a.scope.$set('hidden', 2);
a.scope.$eval();
-
+
assertVisible(a.node);
});
-
+
it('HideBinding', function(){
var c = this.compile('<div ng:hide="hidden"/>');
-
+
c.scope.$set('hidden', 'true');
c.scope.$eval();
-
+
assertHidden(c.node);
-
+
c.scope.$set('hidden', 'false');
c.scope.$eval();
-
+
assertVisible(c.node);
-
+
c.scope.$set('hidden', '');
c.scope.$eval();
-
+
assertVisible(c.node);
});
-
+
it('ShowBinding', function(){
var c = this.compile('<div ng:show="show"/>');
-
+
c.scope.$set('show', 'true');
c.scope.$eval();
-
+
assertVisible(c.node);
-
+
c.scope.$set('show', 'false');
c.scope.$eval();
-
+
assertHidden(c.node);
-
+
c.scope.$set('show', '');
c.scope.$eval();
-
+
assertHidden(c.node);
});
-
+
it('BindClassUndefined', function(){
var doc = this.compile('<div ng:class="undefined"/>');
doc.scope.$eval();
-
+
assertEquals(
'<div class="undefined" ng:class="undefined"></div>',
sortedHtml(doc.node));
});
-
+
it('BindClass', function(){
var c = this.compile('<div ng:class="class"/>');
-
+
c.scope.$set('class', 'testClass');
c.scope.$eval();
-
+
assertEquals('<div class="testClass" ng:class="class"></div>', sortedHtml(c.node));
-
+
c.scope.$set('class', ['a', 'b']);
c.scope.$eval();
-
+
assertEquals('<div class="a b" ng:class="class"></div>', sortedHtml(c.node));
});
-
+
it('BindClassEvenOdd', function(){
var x = this.compile('<div><div ng:repeat="i in [0,1]" ng:class-even="\'e\'" ng:class-odd="\'o\'"/></div>');
x.scope.$eval();
@@ -423,19 +423,19 @@ describe('Binder', function(){
'<div class="e" ng:class-even="\'e\'" ng:class-odd="\'o\'" ng:repeat-index="1"></div></div>',
sortedHtml(x.node));
});
-
+
it('BindStyle', function(){
var c = this.compile('<div ng:style="style"/>');
-
+
c.scope.$eval('style={color:"red"}');
c.scope.$eval();
-
+
assertEquals("red", c.node.css('color'));
-
+
c.scope.$eval('style={}');
c.scope.$eval();
});
-
+
it('ActionOnAHrefThrowsError', function(){
var model = {books:[]};
var c = this.compile('<a ng:click="action()">Add Phone</a>', model);
@@ -447,14 +447,14 @@ describe('Binder', function(){
var error = input.attr('ng-exception');
assertTrue(!!error.match(/MyError/));
assertTrue("should have an error class", input.hasClass('ng-exception'));
-
+
// TODO: I think that exception should never get cleared so this portion of test makes no sense
//c.scope.action = noop;
//browserTrigger(input, 'click');
//dump(input.attr('ng-error'));
//assertFalse('error class should be cleared', input.hasClass('ng-exception'));
});
-
+
it('ShoulIgnoreVbNonBindable', function(){
var c = this.compile("<div>{{a}}" +
"<div ng:non-bindable>{{a}}</div>" +
@@ -464,31 +464,31 @@ describe('Binder', function(){
c.scope.$eval();
assertEquals('123{{a}}{{b}}{{c}}', c.node.text());
});
-
+
it('OptionShouldUpdateParentToGetProperBinding', function(){
var c = this.compile('<select name="s"><option ng:repeat="i in [0,1]" value="{{i}}" ng:bind="i"></option></select>');
c.scope.$set('s', 1);
c.scope.$eval();
assertEquals(1, c.node[0].selectedIndex);
});
-
+
it('RepeaterShouldBindInputsDefaults', function () {
var c = this.compile('<div><input value="123" name="item.name" ng:repeat="item in items"></div>');
c.scope.$set('items', [{}, {name:'misko'}]);
c.scope.$eval();
-
+
assertEquals("123", c.scope.$eval('items[0].name'));
assertEquals("misko", c.scope.$eval('items[1].name'));
});
-
+
it('ShouldTemplateBindPreElements', function () {
var c = this.compile('<pre>Hello {{name}}!</pre>');
c.scope.$set("name", "World");
c.scope.$eval();
-
+
assertEquals('<pre ng:bind-template="Hello {{name}}!">Hello World!</pre>', sortedHtml(c.node));
});
-
+
it('FillInOptionValueWhenMissing', function(){
var c = this.compile(
'<select><option selected="true">{{a}}</option><option value="">{{b}}</option><option>C</option></select>');
@@ -498,17 +498,17 @@ describe('Binder', function(){
var optionA = childNode(c.node, 0);
var optionB = childNode(c.node, 1);
var optionC = childNode(c.node, 2);
-
+
expect(optionA.attr('value')).toEqual('A');
expect(optionA.text()).toEqual('A');
-
+
expect(optionB.attr('value')).toEqual('');
expect(optionB.text()).toEqual('B');
-
+
expect(optionC.attr('value')).toEqual('C');
expect(optionC.text()).toEqual('C');
});
-
+
it('ValidateForm', function(){
var c = this.compile('<div><input name="name" ng:required>' +
'<div ng:repeat="item in items"><input name="item.name" ng:required/></div></div>',
@@ -517,39 +517,39 @@ describe('Binder', function(){
c.scope.$set("items", items);
c.scope.$eval();
assertEquals(3, c.scope.$service('$invalidWidgets').length);
-
+
c.scope.$set('name', '');
c.scope.$eval();
assertEquals(3, c.scope.$service('$invalidWidgets').length);
-
+
c.scope.$set('name', ' ');
c.scope.$eval();
assertEquals(3, c.scope.$service('$invalidWidgets').length);
-
+
c.scope.$set('name', 'abc');
c.scope.$eval();
assertEquals(2, c.scope.$service('$invalidWidgets').length);
-
+
items[0].name = 'abc';
c.scope.$eval();
assertEquals(1, c.scope.$service('$invalidWidgets').length);
-
+
items[1].name = 'abc';
c.scope.$eval();
assertEquals(0, c.scope.$service('$invalidWidgets').length);
});
-
+
it('ValidateOnlyVisibleItems', function(){
var c = this.compile('<div><input name="name" ng:required><input ng:show="show" name="name" ng:required></div>', undefined, jqLite(document.body));
c.scope.$set("show", true);
c.scope.$eval();
assertEquals(2, c.scope.$service('$invalidWidgets').length);
-
+
c.scope.$set("show", false);
c.scope.$eval();
assertEquals(1, c.scope.$service('$invalidWidgets').visible());
});
-
+
it('DeleteAttributeIfEvaluatesFalse', function(){
var c = this.compile('<div>' +
'<input name="a0" ng:bind-attr="{disabled:\'{{true}}\'}"><input name="a1" ng:bind-attr="{disabled:\'{{false}}\'}">' +
@@ -560,7 +560,7 @@ describe('Binder', function(){
var child = childNode(c.node, index);
assertEquals(sortedHtml(child), disabled, !!child.attr('disabled'));
}
-
+
assertChild(0, true);
assertChild(1, false);
assertChild(2, true);
@@ -568,41 +568,41 @@ describe('Binder', function(){
assertChild(4, true);
assertChild(5, false);
});
-
+
it('ItShouldDisplayErrorWhenActionIsSyntacticlyIncorect', function(){
var c = this.compile('<div>' +
'<input type="button" ng:click="greeting=\'ABC\'"/>' +
'<input type="button" ng:click=":garbage:"/></div>');
var first = jqLite(c.node[0].childNodes[0]);
var second = jqLite(c.node[0].childNodes[1]);
-
+
browserTrigger(first, 'click');
assertEquals("ABC", c.scope.greeting);
-
+
browserTrigger(second, 'click');
assertTrue(second.hasClass("ng-exception"));
});
-
+
it('ItShouldSelectTheCorrectRadioBox', function(){
var c = this.compile('<div>' +
'<input type="radio" name="sex" value="female"/>' +
'<input type="radio" name="sex" value="male"/></div>');
var female = jqLite(c.node[0].childNodes[0]);
var male = jqLite(c.node[0].childNodes[1]);
-
+
browserTrigger(female);
assertEquals("female", c.scope.sex);
assertEquals(true, female[0].checked);
assertEquals(false, male[0].checked);
assertEquals("female", female.val());
-
+
browserTrigger(male);
assertEquals("male", c.scope.sex);
assertEquals(false, female[0].checked);
assertEquals(true, male[0].checked);
assertEquals("male", male.val());
});
-
+
it('ItShouldListenOnRightScope', function(){
var c = this.compile(
'<ul ng:init="counter=0; gCounter=0" ng:watch="w:counter=counter+1">' +
@@ -610,13 +610,13 @@ describe('Binder', function(){
c.scope.$eval();
assertEquals(1, c.scope.$get("counter"));
assertEquals(7, c.scope.$get("gCounter"));
-
+
c.scope.$set("w", "something");
c.scope.$eval();
assertEquals(2, c.scope.$get("counter"));
assertEquals(14, c.scope.$get("gCounter"));
});
-
+
it('ItShouldRepeatOnHashes', function(){
var x = this.compile('<ul><li ng:repeat="(k,v) in {a:0,b:1}" ng:bind=\"k + v\"></li></ul>');
x.scope.$eval();
@@ -627,7 +627,7 @@ describe('Binder', function(){
'</ul>',
sortedHtml(x.node));
});
-
+
it('ItShouldFireChangeListenersBeforeUpdate', function(){
var x = this.compile('<div ng:bind="name"></div>');
x.scope.$set("name", "");
@@ -639,19 +639,19 @@ describe('Binder', function(){
'<div ng:bind="name">123</div>',
sortedHtml(x.node));
});
-
+
it('ItShouldHandleMultilineBindings', function(){
var x = this.compile('<div>{{\n 1 \n + \n 2 \n}}</div>');
x.scope.$eval();
assertEquals("3", x.node.text());
});
-
+
it('ItBindHiddenInputFields', function(){
var x = this.compile('<input type="hidden" name="myName" value="abc" />');
x.scope.$eval();
assertEquals("abc", x.scope.$get("myName"));
});
-
+
it('ItShouldUseFormaterForText', function(){
var x = this.compile('<input name="a" ng:format="list" value="a,b">');
x.scope.$eval();
@@ -665,4 +665,4 @@ describe('Binder', function(){
assertEquals('1, 2, 3', input[0].value);
});
-}); \ No newline at end of file
+});
diff --git a/test/CompilerSpec.js b/test/CompilerSpec.js
index 76d3d1ca..498ee060 100644
--- a/test/CompilerSpec.js
+++ b/test/CompilerSpec.js
@@ -32,7 +32,7 @@ describe('compiler', function(){
return scope;
};
});
-
+
afterEach(function(){
dealoc(scope);
});
diff --git a/test/FiltersSpec.js b/test/FiltersSpec.js
index 7e824e0d..092f9b7b 100644
--- a/test/FiltersSpec.js
+++ b/test/FiltersSpec.js
@@ -1,17 +1,17 @@
describe('filter', function() {
var filter = angular.filter;
-
+
it('should called the filter when evaluating expression', function() {
var scope = createScope();
filter.fakeFilter = function(){};
spyOn(filter, 'fakeFilter');
-
+
scope.$eval('10|fakeFilter');
expect(filter.fakeFilter).toHaveBeenCalledWith(10);
delete filter['fakeFilter'];
});
-
+
it('should call filter on scope context', function() {
var scope = createScope();
scope.name = 'misko';
@@ -19,7 +19,7 @@ describe('filter', function() {
expect(this.name).toEqual('misko');
};
spyOn(filter, 'fakeFilter').andCallThrough();
-
+
scope.$eval('10|fakeFilter');
expect(filter.fakeFilter).toHaveBeenCalled();
delete filter['fakeFilter'];
@@ -39,7 +39,7 @@ describe('filter', function() {
expect(html.hasClass('ng-format-negative')).toBeFalsy();
});
});
-
+
describe('number', function() {
it('should do basic filter', function() {
var context = {jqElement:jqLite('<span/>')};
diff --git a/test/FormattersSpec.js b/test/FormattersSpec.js
index 1ebd8e22..234a81d6 100644
--- a/test/FormattersSpec.js
+++ b/test/FormattersSpec.js
@@ -33,13 +33,13 @@ describe("formatter", function(){
assertEquals('a', angular.formatter.trim.format(" a "));
assertEquals('a', angular.formatter.trim.parse(' a '));
});
-
+
describe('json', function(){
it('should treat empty string as null', function(){
expect(angular.formatter.json.parse('')).toEqual(null);
});
});
-
+
describe('index', function(){
it('should parse an object from array', function(){
expect(angular.formatter.index.parse('1', ['A', 'B', 'C'])).toEqual('B');
diff --git a/test/ParserSpec.js b/test/ParserSpec.js
index 4d0e14dc..62d6731a 100644
--- a/test/ParserSpec.js
+++ b/test/ParserSpec.js
@@ -58,7 +58,7 @@ describe('parser', function() {
expect(tokens[i].text).toEqual('undefined');
expect(undefined).toEqual(tokens[i].fn());
});
-
+
it('should tokenize quoted string', function() {
var str = "['\\'', \"\\\"\"]";
var tokens = lex(str);
@@ -134,7 +134,7 @@ describe('parser', function() {
expect(function() {
lex("0.5E-");
}).toThrow(new Error('Lexer Error: Invalid exponent at column 4 in expression [0.5E-].'));
-
+
expect(function() {
lex("0.5E-A");
}).toThrow(new Error('Lexer Error: Invalid exponent at column 4 in expression [0.5E-A].'));
@@ -151,7 +151,7 @@ describe('parser', function() {
}).toThrow(new Error("Lexer Error: Invalid unicode escape [\\u1''b] at column 2 in expression ['\\u1''bla']."));
});
});
-
+
var scope;
beforeEach(function () {
scope = createScope();
@@ -201,7 +201,7 @@ describe('parser', function() {
expect(function() {
scope.$eval("1|nonExistant");
}).toThrow(new Error("Parse Error: Token 'nonExistant' should be a function at column 3 of expression [1|nonExistant] starting at [nonExistant]."));
-
+
scope.$set('offset', 3);
expect(scope.$eval("'abcd'|upper._case")).toEqual("ABCD");
expect(scope.$eval("'abcd'|substring:1:offset")).toEqual("bc");
@@ -298,7 +298,7 @@ describe('parser', function() {
scope.$set("obj", new C());
expect(scope.$eval("obj.getA()")).toEqual(123);
});
-
+
it('should evaluate methods in correct context (this) in argument', function() {
var C = function () {
this.a = 123;
@@ -388,7 +388,7 @@ describe('parser', function() {
expect(scope.$eval("a=undefined")).not.toBeDefined();
expect(scope.$get("a")).not.toBeDefined();
});
-
+
it('should allow assignment after array dereference', function(){
scope = angular.scope();
scope.obj = [{}];
@@ -396,21 +396,21 @@ describe('parser', function() {
expect(scope.obj.name).toBeUndefined();
expect(scope.obj[0].name).toEqual(1);
});
-
+
describe('formatter', function(){
it('should return no argument function', function() {
var noop = parser('noop').formatter()();
expect(noop.format(null, 'abc')).toEqual('abc');
expect(noop.parse(null, '123')).toEqual('123');
});
-
+
it('should delegate arguments', function(){
var index = parser('index:objs').formatter()();
expect(index.format({objs:['A','B']}, 'B')).toEqual('1');
expect(index.parse({objs:['A','B']}, '1')).toEqual('B');
});
});
-
+
describe('assignable', function(){
it('should expose assignment function', function(){
var fn = parser('a').assignable();
@@ -420,5 +420,5 @@ describe('parser', function() {
expect(scope).toEqual({a:123});
});
});
-
+
});
diff --git a/test/ScenarioSpec.js b/test/ScenarioSpec.js
index 30a3d72a..50b5e51c 100644
--- a/test/ScenarioSpec.js
+++ b/test/ScenarioSpec.js
@@ -1,14 +1,14 @@
describe("ScenarioSpec: Compilation", function(){
var scope;
-
+
beforeEach(function(){
scope = null;
});
-
+
afterEach(function(){
dealoc(scope);
});
-
+
describe('compilation', function(){
it("should compile dom node and return scope", function(){
var node = jqLite('<div ng:init="a=1">{{b=a+1}}</div>')[0];
@@ -17,18 +17,18 @@ describe("ScenarioSpec: Compilation", function(){
expect(scope.a).toEqual(1);
expect(scope.b).toEqual(2);
});
-
+
it("should compile jQuery node and return scope", function(){
scope = compile(jqLite('<div>{{a=123}}</div>')).$init();
expect(jqLite(scope.$element).text()).toEqual('123');
});
-
+
it("should compile text node and return scope", function(){
scope = compile('<div>{{a=123}}</div>').$init();
expect(jqLite(scope.$element).text()).toEqual('123');
});
});
-
+
describe('scope', function(){
it("should have set, get, eval, $init, updateView methods", function(){
scope = compile('<div>{{a}}</div>').$init();
@@ -39,7 +39,7 @@ describe("ScenarioSpec: Compilation", function(){
scope.$eval();
expect(jqLite(scope.$element).text()).toEqual('3');
});
-
+
it("should have $ objects", function(){
scope = compile('<div></div>', {$config: {a:"b"}});
expect(scope.$service('$location')).toBeDefined();
@@ -48,7 +48,7 @@ describe("ScenarioSpec: Compilation", function(){
expect(scope.$get('$config.a')).toEqual("b");
});
});
-
+
describe("configuration", function(){
it("should take location object", function(){
var url = "http://server/#?book=moby";
@@ -61,4 +61,4 @@ describe("ScenarioSpec: Compilation", function(){
expect($location.hashSearch.book).toEqual('moby');
});
});
-}); \ No newline at end of file
+});
diff --git a/test/ScopeSpec.js b/test/ScopeSpec.js
index 354ddc72..ee7c1c47 100644
--- a/test/ScopeSpec.js
+++ b/test/ScopeSpec.js
@@ -52,7 +52,7 @@ describe('scope/model', function(){
model.$eval('name="works"');
expect(model.name).toEqual('works');
});
-
+
it('should not bind regexps', function(){
model.exp = /abc/;
expect(model.$eval('exp')).toEqual(model.exp);
@@ -158,7 +158,7 @@ describe('scope/model', function(){
var element = jqLite('<div></div>');
var scope = createScope();
scope.$tryEval(function(){throw "myError";}, element);
- expect(element.attr('ng-exception')).toEqual('myError');
+ expect(element.attr('ng-exception')).toEqual('myError');
expect(element.hasClass('ng-exception')).toBeTruthy();
});
diff --git a/test/ValidatorsSpec.js b/test/ValidatorsSpec.js
index ffd65c5b..60d20418 100644
--- a/test/ValidatorsSpec.js
+++ b/test/ValidatorsSpec.js
@@ -1,5 +1,5 @@
describe('ValidatorTest', function(){
-
+
it('ShouldHaveThisSet', function() {
var validator = {};
angular.validator.myValidator = function(first, last){
@@ -16,7 +16,7 @@ describe('ValidatorTest', function(){
delete angular.validator.myValidator;
scope.$element.remove();
});
-
+
it('Regexp', function() {
assertEquals(angular.validator.regexp("abc", /x/, "E1"), "E1");
assertEquals(angular.validator.regexp("abc", '/x/'),
@@ -24,7 +24,7 @@ describe('ValidatorTest', function(){
assertEquals(angular.validator.regexp("ab", '^ab$'), null);
assertEquals(angular.validator.regexp("ab", '^axb$', "E3"), "E3");
});
-
+
it('Number', function() {
assertEquals(angular.validator.number("ab"), "Not a number");
assertEquals(angular.validator.number("-0.1",0), "Value can not be less than 0.");
@@ -32,7 +32,7 @@ describe('ValidatorTest', function(){
assertEquals(angular.validator.number("1.2"), null);
assertEquals(angular.validator.number(" 1 ", 1, 1), null);
});
-
+
it('Integer', function() {
assertEquals(angular.validator.integer("ab"), "Not a number");
assertEquals(angular.validator.integer("1.1"), "Not a whole number");
@@ -43,7 +43,7 @@ describe('ValidatorTest', function(){
assertEquals(angular.validator.integer("1"), null);
assertEquals(angular.validator.integer(" 1 ", 1, 1), null);
});
-
+
it('Date', function() {
var error = "Value is not a date. (Expecting format: 12/31/2009).";
expect(angular.validator.date("ab")).toEqual(error);
@@ -60,7 +60,7 @@ describe('ValidatorTest', function(){
expect(angular.validator.date("1/32/2010")).toEqual(error);
expect(angular.validator.date("001/031/2009")).toEqual(error);
});
-
+
it('Phone', function() {
var error = "Phone number needs to be in 1(987)654-3210 format in North America or +999 (123) 45678 906 internationaly.";
assertEquals(angular.validator.phone("ab"), error);
@@ -68,30 +68,30 @@ describe('ValidatorTest', function(){
assertEquals(null, angular.validator.phone("+421 (0905) 933 297"));
assertEquals(null, angular.validator.phone("+421 0905 933 297"));
});
-
+
it('URL', function() {
var error = "URL needs to be in http://server[:port]/path format.";
assertEquals(angular.validator.url("ab"), error);
assertEquals(angular.validator.url("http://server:123/path"), null);
});
-
+
it('Email', function() {
var error = "Email needs to be in username@host.com format.";
assertEquals(error, angular.validator.email("ab"));
assertEquals(null, angular.validator.email("misko@hevery.com"));
});
-
+
it('Json', function() {
assertNotNull(angular.validator.json("'"));
assertNotNull(angular.validator.json("''X"));
assertNull(angular.validator.json("{}"));
});
-
+
describe('asynchronous', function(){
var asynchronous = angular.validator.asynchronous;
var self;
var value, fn;
-
+
beforeEach(function(){
value = null;
fn = null;
@@ -101,11 +101,11 @@ describe('ValidatorTest', function(){
self.$root = self;
self.$init();
});
-
+
afterEach(function(){
if (self.$element) self.$element.remove();
});
-
+
it('should make a request and show spinner', function(){
var value, fn;
var scope = compile('<input type="text" name="name" ng:validate="asynchronous:asyncFn"/>');
@@ -124,32 +124,32 @@ describe('ValidatorTest', function(){
expect(input.attr(NG_VALIDATION_ERROR)).toEqual("myError");
scope.$element.remove();
});
-
+
it("should not make second request to same value", function(){
asynchronous.call(self, "kai", function(v,f){value=v; fn=f;});
expect(value).toEqual('kai');
expect(self.$service('$invalidWidgets')[0]).toEqual(self.$element);
-
+
var spy = jasmine.createSpy();
asynchronous.call(self, "kai", spy);
expect(spy).wasNotCalled();
-
+
asynchronous.call(self, "misko", spy);
expect(spy).wasCalled();
});
-
+
it("should ignore old callbacks, and not remove spinner", function(){
var firstCb, secondCb;
asynchronous.call(self, "first", function(v,f){value=v; firstCb=f;});
asynchronous.call(self, "second", function(v,f){value=v; secondCb=f;});
-
+
firstCb();
expect(self.$element.hasClass('ng-input-indicator-wait')).toBeTruthy();
-
+
secondCb();
expect(self.$element.hasClass('ng-input-indicator-wait')).toBeFalsy();
});
-
+
it("should handle update function", function(){
var scope = angular.compile('<input name="name" ng:validate="asynchronous:asyncFn:updateFn"/>');
scope.asyncFn = jasmine.createSpy();
@@ -165,6 +165,6 @@ describe('ValidatorTest', function(){
expect(scope.updateFn.mostRecentCall.args[0]).toEqual({id: 1234, data:'data'});
scope.$element.remove();
});
-
+
});
});
diff --git a/test/jquery_alias.js b/test/jquery_alias.js
index 4b3fad00..0d884a39 100644
--- a/test/jquery_alias.js
+++ b/test/jquery_alias.js
@@ -1 +1 @@
-var _jQuery = jQuery; \ No newline at end of file
+var _jQuery = jQuery;
diff --git a/test/jquery_remove.js b/test/jquery_remove.js
index 5283c340..9e717240 100644
--- a/test/jquery_remove.js
+++ b/test/jquery_remove.js
@@ -1 +1 @@
-var _jQuery = jQuery.noConflict(true); \ No newline at end of file
+var _jQuery = jQuery.noConflict(true);
diff --git a/test/markupSpec.js b/test/markupSpec.js
index 3234bf2f..f78112d7 100644
--- a/test/markupSpec.js
+++ b/test/markupSpec.js
@@ -147,6 +147,6 @@ describe("markups", function(){
assertTrue(!hasBindings(parseBindings("a")));
assertTrue(hasBindings(parseBindings("{{b}}x{{c}}")));
});
-
+
});
diff --git a/test/sanitizerSpec.js b/test/sanitizerSpec.js
index 3ad6c1c9..57eedec9 100644
--- a/test/sanitizerSpec.js
+++ b/test/sanitizerSpec.js
@@ -50,11 +50,11 @@ describe('HTML', function(){
});
it('should handle entities', function(){
- var everything = '<div rel="!@#$%^&amp;*()_+-={}[]:&#34;;\'&lt;&gt;?,./`~ &#295;">' +
+ var everything = '<div rel="!@#$%^&amp;*()_+-={}[]:&#34;;\'&lt;&gt;?,./`~ &#295;">' +
'!@#$%^&amp;*()_+-={}[]:&#34;;\'&lt;&gt;?,./`~ &#295;</div>';
expectHTML(everything).toEqual(everything);
});
-
+
it('should handle improper html', function(){
expectHTML('< div rel="</div>" alt=abc dir=\'"\' >text< /div>').
toEqual('<div rel="&lt;/div&gt;" alt="abc" dir="&#34;">text</div>');
@@ -64,19 +64,19 @@ describe('HTML', function(){
expectHTML('< div rel="</div>" / >').
toEqual('<div rel="&lt;/div&gt;"/>');
});
-
+
it('should ignore back slash as escape', function(){
expectHTML('<img alt="xxx\\" title="><script>....">').
toEqual('<img alt="xxx\\" title="&gt;&lt;script&gt;...."/>');
});
-
+
it('should ignore object attributes', function(){
expectHTML('<a constructor="hola">:)</a>').
toEqual('<a>:)</a>');
expectHTML('<constructor constructor="hola">:)</constructor>').
toEqual('');
});
-
+
describe('htmlSanitizerWriter', function(){
var writer, html;
beforeEach(function(){
@@ -118,13 +118,13 @@ describe('HTML', function(){
writer.start('div', {unknown:""});
expect(html).toEqual('<div>');
});
-
+
describe('explicitly dissallow', function(){
it('should not allow attributes', function(){
writer.start('div', {id:'a', name:'a', style:'a'});
expect(html).toEqual('<div>');
});
-
+
it('should not allow tags', function(){
function tag(name) {
writer.start(name, {});
@@ -149,13 +149,13 @@ describe('HTML', function(){
expect(html).toEqual('');
});
});
-
+
describe('isUri', function(){
-
+
function isUri(value) {
return value.match(URI_REGEXP);
}
-
+
it('should be URI', function(){
expect(isUri('http://abc')).toBeTruthy();
expect(isUri('https://abc')).toBeTruthy();
@@ -163,7 +163,7 @@ describe('HTML', function(){
expect(isUri('mailto:me@example.com')).toBeTruthy();
expect(isUri('#anchor')).toBeTruthy();
});
-
+
it('should not be UIR', function(){
expect(isUri('')).toBeFalsy();
expect(isUri('javascript:alert')).toBeFalsy();
diff --git a/test/scenario/mocks.js b/test/scenario/mocks.js
index 616e5d63..e023b6b0 100644
--- a/test/scenario/mocks.js
+++ b/test/scenario/mocks.js
@@ -32,7 +32,7 @@ angular.scenario.testing.MockRunner.prototype.on = function(eventName, fn) {
this.listeners[eventName] = this.listeners[eventName] || [];
this.listeners[eventName].push(fn);
};
-
+
angular.scenario.testing.MockRunner.prototype.emit = function(eventName) {
var args = Array.prototype.slice.call(arguments, 1);
angular.forEach(this.listeners[eventName] || [], function(fn) {
diff --git a/test/servicesSpec.js b/test/servicesSpec.js
index 0569c54a..e9b16621 100644
--- a/test/servicesSpec.js
+++ b/test/servicesSpec.js
@@ -60,7 +60,7 @@ describe("service", function(){
$log.info();
$log.error();
});
-
+
describe('Error', function(){
var e, $log, $console, errorArgs;
beforeEach(function(){
@@ -69,12 +69,12 @@ describe("service", function(){
e.sourceURL = undefined;
e.line = undefined;
e.stack = undefined;
-
+
$console = angular.service('$log')({console:{error:function(){
errorArgs = arguments;
}}});
});
-
+
it('should pass error if does not have trace', function(){
$console.error('abc', e);
expect(errorArgs).toEqual(['abc', e]);
@@ -93,9 +93,9 @@ describe("service", function(){
$console.error('abc', e);
expect(errorArgs).toEqual(['abc', 'message\nsourceURL:123']);
});
-
+
});
-
+
});
describe("$exceptionHandler", function(){