aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMisko Hevery2010-04-20 18:14:13 -0700
committerMisko Hevery2010-04-20 18:14:13 -0700
commit22d93e0a3bc2a6dc0f64c63c68bc8f8489ea9068 (patch)
tree5f65b04ac9fb5a69d87ac40434a14367e6c1d4fc
parent259c2bba4bf1fc4f0d4cf5bcda4ffef0fb5a615a (diff)
downloadangular.js-22d93e0a3bc2a6dc0f64c63c68bc8f8489ea9068.tar.bz2
fixes to enable ie
-rw-r--r--lib/nodeserver/server.js21
-rwxr-xr-xnodeserver.sh1
-rw-r--r--scenario/widgets.html13
-rw-r--r--src/Angular.js3
-rw-r--r--src/Browser.js9
-rw-r--r--src/Compiler.js2
-rw-r--r--src/directives.js15
-rw-r--r--src/jqLite.js24
-rw-r--r--src/scenario/Steps.js6
-rwxr-xr-xtest.sh2
-rw-r--r--test/BinderTest.js14
-rw-r--r--test/CompilerSpec.js9
-rw-r--r--test/directivesSpec.js2
-rw-r--r--test/widgetsSpec.js12
14 files changed, 82 insertions, 51 deletions
diff --git a/lib/nodeserver/server.js b/lib/nodeserver/server.js
new file mode 100644
index 00000000..306eeb7c
--- /dev/null
+++ b/lib/nodeserver/server.js
@@ -0,0 +1,21 @@
+var sys = require('sys'),
+ http = require('http'),
+ fs = require('fs');
+http.createServer(function (req, res) {
+ res.writeHead(200, {});
+ sys.p('GET ' + req.url);
+ var file = fs.createReadStream('.' + req.url);
+ file.addListener('data', bind(res, res.write));
+ file.addListener('error', function( error ){
+ sys.p(error);
+ res.end();
+ });
+ file.addListener('close', bind(res, res.end));
+}).listen(8000);
+sys.puts('Server running at http://127.0.0.1:8000/');
+
+function bind(_this, _fn) {
+ return function(){
+ return _fn.apply(_this, arguments);
+ };
+}
diff --git a/nodeserver.sh b/nodeserver.sh
new file mode 100755
index 00000000..a1662e12
--- /dev/null
+++ b/nodeserver.sh
@@ -0,0 +1 @@
+node lib/nodeserver/server.js
diff --git a/scenario/widgets.html b/scenario/widgets.html
index b83670b8..5449b218 100644
--- a/scenario/widgets.html
+++ b/scenario/widgets.html
@@ -1,11 +1,11 @@
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
<head>
- <link rel="stylesheet" type="text/css" href="style.css"></link>
+ <link rel="stylesheet" type="text/css" href="style.css"/><!--
<script type="text/javascript" src="../lib/jquery/jquery-1.4.2.js"></script>
- <script type="text/javascript" src="../src/angular-bootstrap.js#autobind"></script>
+ --><script type="text/javascript" src="../src/angular-bootstrap.js#autobind"></script>
</head>
- <body ng-init="$window.$scope = this">
+ <body ng:init="$window.$scope = this">
<table>
<tr>
<th width="330">Description</th>
@@ -72,12 +72,12 @@
<tr><th colspan="3">Buttons</th></tr>
<tr>
<td>ng-change<br/>ng-click</td>
- <td>
- <form ng-init="button.count = 0">
+ <td ng:init="button.count = 0">
+ <form>
<input type="button" value="button" ng-change="button.count = button.count + 1"/> <br/>
<input type="submit" value="submit" ng-change="button.count = button.count + 1"/><br/>
<input type="image" src="" ng-change="button.count = button.count + 1"/><br/>
- <a href="" ng-click="button.count = button.count + 1">action</a>
+ <a href="" ng:click="button.count = button.count + 1">action</a>
</form>
</td>
<td>button={{button}}</td>
@@ -93,5 +93,6 @@
<td></td>
</tr>
</table>
+-->
</body>
</html>
diff --git a/src/Angular.js b/src/Angular.js
index 005eeb19..613aee67 100644
--- a/src/Angular.js
+++ b/src/Angular.js
@@ -112,7 +112,8 @@ function uppercase(value){ return isString(value) ? value.toUpperCase() : value;
function trim(value) { return isString(value) ? value.replace(/^\s*/, '').replace(/\s*$/, '') : value; }
function nodeName(element) { return (element[0] || element).nodeName; }
function isElement(node) {
- if (node && node[0]) node = node[0];
+ if (node && !node.item && isDefined(node.length) && isDefined(node[0]))
+ node = node[0];
return node && node.nodeName;
}
diff --git a/src/Browser.js b/src/Browser.js
index ff8d9775..e00f73a5 100644
--- a/src/Browser.js
+++ b/src/Browser.js
@@ -29,7 +29,7 @@ Browser.prototype = {
bind: function() {
var self = this;
self.document.bind("mouseover", function(event){
- self.hoverListener(jqLite(event.target), true);
+ self.hoverListener(jqLite(msie ? event.srcElement : event.target), true);
return true;
});
self.document.bind("mouseleave mouseout click dblclick keypress keyup", function(event){
@@ -43,8 +43,11 @@ Browser.prototype = {
},
addCss: function(url) {
- var head = jqLite(this.document[0].getElementsByTagName('head')[0]),
- link = jqLite('<link rel="stylesheet" type="text/css"></link>');
+ var doc = this.document[0],
+ head = jqLite(doc.getElementsByTagName('head')[0]),
+ link = jqLite(doc.createElement('link'));
+ link.attr('rel', 'stylesheet');
+ link.attr('type', 'text/css');
link.attr('href', url);
head.append(link);
},
diff --git a/src/Compiler.js b/src/Compiler.js
index 96df88fb..21302054 100644
--- a/src/Compiler.js
+++ b/src/Compiler.js
@@ -185,7 +185,7 @@ function eachAttribute(element, fn){
var i, attrs = element[0].attributes || [], chld, attr, name, value, attrValue = {};
for (i = 0; i < attrs.length; i++) {
attr = attrs[i];
- name = attr.name;
+ name = attr.name.replace(':', '-');
value = attr.value;
if (msie && name == 'href') {
value = decodeURIComponent(element[0].getAttribute(name, 2));
diff --git a/src/directives.js b/src/directives.js
index a37076d4..2f393b5d 100644
--- a/src/directives.js
+++ b/src/directives.js
@@ -26,15 +26,20 @@ angularDirective("ng-bind", function(expression){
return function(element) {
var lastValue, lastError;
this.$onEval(function() {
- var error, value = this.$tryEval(expression, function(e){
- error = toJson(e);
- });
+ var error,
+ value = this.$tryEval(expression, function(e){
+ error = toJson(e);
+ }),
+ isElem = isElement(value);
+ if (!isElem && isObject(value)) {
+ value = toJson(value);
+ }
if (value != lastValue || error != lastError) {
lastValue = value;
lastError = error;
elementError(element, NG_EXCEPTION, error);
if (error) value = error;
- if (isElement(value)) {
+ if (isElem) {
element.html('');
element.append(value);
} else {
@@ -177,7 +182,7 @@ angularWidget("@ng-repeat", function(expression, element){
angularDirective("ng-click", function(expression, element){
return function(element){
var self = this;
- element.click(function(){
+ element.bind('click', function(){
self.$tryEval(expression, element);
self.$root.$eval();
return false;
diff --git a/src/jqLite.js b/src/jqLite.js
index 2d41a25c..1bf6e083 100644
--- a/src/jqLite.js
+++ b/src/jqLite.js
@@ -37,14 +37,14 @@ function jqClearData(element) {
}
function JQLite(element) {
- if (element.length && element.item) {
+ if (isElement(element)) {
+ this[0] = element;
+ this.length = 1;
+ } else if (isDefined(element.length) && element.item) {
for(var i=0; i < element.length; i++) {
this[i] = element[i];
}
this.length = element.length;
- } else {
- this[0] = element;
- this.length = 1;
}
}
@@ -92,8 +92,13 @@ JQLite.prototype = {
bubbleEvent = bubbleEvent || fn.call(self, event);
});
if (!bubbleEvent) {
- event.preventDefault();
- event.stopPropagation();
+ if (msie) {
+ event.returnValue = false;
+ event.cancelBubble = true;
+ } else {
+ event.preventDefault();
+ event.stopPropagation();
+ }
}
};
eventHandler.fns = [];
@@ -109,13 +114,6 @@ JQLite.prototype = {
this[0].dispatchEvent(evnt);
},
- click: function(fn) {
- if (fn)
- this.bind('click', fn);
- else
- this.trigger('click');
- },
-
replaceWith: function(replaceNode) {
this[0].parentNode.replaceChild(jqLite(replaceNode)[0], this[0]);
},
diff --git a/src/scenario/Steps.js b/src/scenario/Steps.js
index f8ac173f..ffe75933 100644
--- a/src/scenario/Steps.js
+++ b/src/scenario/Steps.js
@@ -29,14 +29,14 @@ angular.scenario.WHEN = {
// emulate the browser behavior which causes it
// to be overridden at the end.
var checked = input.checked = !input.checked;
- element.click();
+ element.trigger('click');
input.checked = checked;
},
select:function(){
var element = this.element(this.at);
var path = "option[value=" + this.option + "]";
var option = this.assert(element.find(path));
- option[0].selected = !option[0].selected;
+ option[0].selected = !option[0].selected;
element.change();
}
};
@@ -48,7 +48,7 @@ angular.scenario.THEN = {
if (_.isArray(this.should_be))
should_be = JSON.stringify(should_be);
if (element.text() != should_be)
- throw "Expected " + should_be +
+ throw "Expected " + should_be +
" but was " + element.text() + ".";
}
},
diff --git a/test.sh b/test.sh
index fd12cdff..8993c3ff 100755
--- a/test.sh
+++ b/test.sh
@@ -1 +1 @@
-java -jar lib/jstestdriver/JsTestDriver.jar --tests BinderTest
+java -jar lib/jstestdriver/JsTestDriver.jar --tests all
diff --git a/test/BinderTest.js b/test/BinderTest.js
index 50e1683a..31b2698d 100644
--- a/test/BinderTest.js
+++ b/test/BinderTest.js
@@ -151,7 +151,7 @@ BinderTest.prototype.testInputTypeButtonActionExecutesInScope = function(){
c.scope.$set("person.save", function(){
savedCalled = true;
});
- c.node.click();
+ c.node.trigger('click');
assertTrue(savedCalled);
};
@@ -162,7 +162,7 @@ BinderTest.prototype.testInputTypeButtonActionExecutesInScope2 = function(){
log += 'click;';
});
expect(log).toEqual('');
- c.node.click();
+ c.node.trigger('click');
expect(log).toEqual('click;');
};
@@ -172,7 +172,7 @@ BinderTest.prototype.testButtonElementActionExecutesInScope = function(){
c.scope.$set("person.save", function(){
savedCalled = true;
});
- c.node.click();
+ c.node.trigger('click');
assertTrue(savedCalled);
};
@@ -435,13 +435,13 @@ BinderTest.prototype.testActionOnAHrefThrowsError = function(){
throw {a:'abc', b:2};
};
var input = c.node;
- input.click();
+ input.trigger('click');
assertEquals({a:"abc", b:2}, fromJson(input.attr('ng-exception')));
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;
- //input.click();
+ //input.trigger('click');
//dump(input.attr('ng-error'));
//assertFalse('error class should be cleared', input.hasClass('ng-exception'));
};
@@ -574,10 +574,10 @@ BinderTest.prototype.testItShouldDisplayErrorWhenActionIsSyntacticlyIncorect = f
var first = jqLite(c.node[0].childNodes[0]);
var second = jqLite(c.node[0].childNodes[1]);
- first.click();
+ first.trigger('click');
assertEquals("ABC", c.scope.greeting);
- second.click();
+ second.trigger('click');
assertTrue(second.hasClass("ng-exception"));
};
diff --git a/test/CompilerSpec.js b/test/CompilerSpec.js
index fe61c520..e50f6ae7 100644
--- a/test/CompilerSpec.js
+++ b/test/CompilerSpec.js
@@ -75,21 +75,22 @@ describe('compiler', function(){
it('should allow creation of templates', function(){
directives.duplicate = function(expr, element){
+ var parent = element.parent();
element.replaceWith(document.createComment("marker"));
element.removeAttr("duplicate");
var template = this.compile(element);
return function(marker) {
this.$onEval(function() {
- marker.after(template(element.clone()).element);
+ marker.after(template(element.clone()).$element);
});
};
};
var scope = compile('before<span duplicate="expr">x</span>after');
- expect(sortedHtml(scope.$element)).toEqual('<div>before<#comment></#comment>after</div>');
+ expect(sortedHtml(scope.$element)).toEqual('<div>before<#comment></#comment><span>x</span>after</div>');
scope.$eval();
- expect(sortedHtml(scope.$element)).toEqual('<div>before<#comment></#comment>after</div>');
+ expect(sortedHtml(scope.$element)).toEqual('<div>before<#comment></#comment><span>x</span><span>x</span>after</div>');
scope.$eval();
- expect(sortedHtml(scope.$element)).toEqual('<div>before<#comment></#comment>after</div>');
+ expect(sortedHtml(scope.$element)).toEqual('<div>before<#comment></#comment><span>x</span><span>x</span><span>x</span>after</div>');
});
it('should process markup before directives', function(){
diff --git a/test/directivesSpec.js b/test/directivesSpec.js
index 1ddd7477..f7024bdb 100644
--- a/test/directivesSpec.js
+++ b/test/directivesSpec.js
@@ -133,7 +133,7 @@ describe("directives", function(){
scope.$eval();
expect(scope.$get('clicked')).toBeFalsy();
- element.click();
+ element.trigger('click');
expect(scope.$get('clicked')).toEqual(true);
});
diff --git a/test/widgetsSpec.js b/test/widgetsSpec.js
index ecc00d05..2cfe216c 100644
--- a/test/widgetsSpec.js
+++ b/test/widgetsSpec.js
@@ -136,23 +136,23 @@ describe("input widget", function(){
it('should call ng-change on button click', function(){
compile('<input type="button" value="Click Me" ng-change="clicked = true"/>');
- element.click();
+ element.trigger('click');
expect(scope.$get('clicked')).toEqual(true);
});
it('should support button alias', function(){
compile('<button ng-change="clicked = true">Click Me</button>');
- element.click();
+ element.trigger('click');
expect(scope.$get('clicked')).toEqual(true);
});
it('should type="checkbox"', function(){
compile('<input type="checkbox" name="checkbox" checked ng-change="action = true"/>');
expect(scope.checkbox).toEqual(true);
- trigger(element, 'click');
+ element.trigger('click');
expect(scope.checkbox).toEqual(false);
expect(scope.action).toEqual(true);
- trigger(element, 'click');
+ element.trigger('click');
expect(scope.checkbox).toEqual(true);
});
@@ -176,7 +176,7 @@ describe("input widget", function(){
expect(b.checked).toEqual(true);
expect(scope.clicked).not.toBeDefined();
- trigger(a, 'click');
+ jqLite(a).trigger('click');
expect(scope.chose).toEqual('A');
expect(scope.clicked).toEqual(1);
});
@@ -218,7 +218,7 @@ describe("input widget", function(){
it('should report error on ng-change exception', function(){
compile('<button ng-change="a-2=x">click</button>');
- element.click();
+ element.trigger('click');
expect(element.hasClass('ng-exception')).toBeTruthy();
});