ソースを参照

Respecting `allowLocal` & refactoring tests

troymccabe 11 年 前
コミット
1c133d0ad8
3 ファイル変更267 行追加670 行削除
  1. 5 2
      src/js/validator/uri.js
  2. 131 334
      test/spec.js
  3. 131 334
      test/spec/validator/uri.js

+ 5 - 2
src/js/validator/uri.js

@@ -46,7 +46,7 @@
             // Notes on possible differences from a standard/generic validation:
             //
             // - utf-8 char class take in consideration the full Unicode range
-            // - TLDs have been made mandatory so single names like "localhost" fails
+            // - TLDs are mandatory unless `allowLocal` is true
             // - protocols have been restricted to ftp, http and https only as requested
             //
             // Changes:
@@ -56,6 +56,7 @@
             //   (since they are broadcast/network addresses)
             //
             // - Added exclusion of private, reserved and/or local networks ranges
+			//   unless `allowLocal` is true
             //
             var allowLocal = options.allowLocal === true || options.allowLocal === 'true',
                 urlExp     = new RegExp(
@@ -86,7 +87,9 @@
                     // domain name
                     "(?:\\.(?:[a-z\\u00a1-\\uffff0-9]+-?)*[a-z\\u00a1-\\uffff0-9]+)*" +
                     // TLD identifier
-                    "(?:\\.(?:[a-z\\u00a1-\\uffff]{2,}))?" +
+                    "(?:\\.(?:[a-z\\u00a1-\\uffff]{2,}))" +
+					// Allow intranet sites (no TLD) if `allowLocal` is true
+					(allowLocal ? '?' : '') +
                     ")" +
                     // port number
                     "(?::\\d{2,5})?" +

+ 131 - 334
test/spec.js

@@ -3582,344 +3582,141 @@ describe('uri', function() {
 		$('#uriForm').bootstrapValidator('destroy').remove();
 	});
 
-	it('Valid URIs', function() {
-		this.$uri.val('http://foo.com/blah_blah');
-		this.bv.validate();
-		expect(this.bv.isValid()).toBeTruthy();
-
-		this.$uri.val('http://foo.com/blah_blah');
-		this.bv.validate();
-		expect(this.bv.isValid()).toBeTruthy();
-
-		this.$uri.val('http://foo.com/blah_blah/');
-		this.bv.validate();
-		expect(this.bv.isValid()).toBeTruthy();
-
-		this.$uri.val('http://foo.com/blah_blah_(wikipedia)');
-		this.bv.validate();
-		expect(this.bv.isValid()).toBeTruthy();
-
-		this.$uri.val('http://foo.com/blah_blah_(wikipedia)_(again)');
-		this.bv.validate();
-		expect(this.bv.isValid()).toBeTruthy();
-
-		this.$uri.val('http://www.example.com/wpstyle/?p=364');
-		this.bv.validate();
-		expect(this.bv.isValid()).toBeTruthy();
-
-		this.$uri.val('https://www.example.com/foo/?bar=baz&inga=42&quux');
-		this.bv.validate();
-		expect(this.bv.isValid()).toBeTruthy();
-
-		this.$uri.val('http://✪df.ws/123');
-		this.bv.validate();
-		expect(this.bv.isValid()).toBeTruthy();
-
-		this.$uri.val('http://userid:password@example.com:8080');
-		this.bv.validate();
-		expect(this.bv.isValid()).toBeTruthy();
-
-		this.$uri.val('http://userid:password@example.com:8080/');
-		this.bv.validate();
-		expect(this.bv.isValid()).toBeTruthy();
-
-		this.$uri.val('http://userid@example.com');
-		this.bv.validate();
-		expect(this.bv.isValid()).toBeTruthy();
-
-		this.$uri.val('http://userid@example.com/');
-		this.bv.validate();
-		expect(this.bv.isValid()).toBeTruthy();
-
-		this.$uri.val('http://userid@example.com:8080');
-		this.bv.validate();
-		expect(this.bv.isValid()).toBeTruthy();
-
-		this.$uri.val('http://userid@example.com:8080/');
-		this.bv.validate();
-		expect(this.bv.isValid()).toBeTruthy();
-
-		this.$uri.val('http://userid:password@example.com');
-		this.bv.validate();
-		expect(this.bv.isValid()).toBeTruthy();
-
-		this.$uri.val('http://userid:password@example.com/');
-		this.bv.validate();
-		expect(this.bv.isValid()).toBeTruthy();
-
-		this.$uri.val('http://142.42.1.1/');
-		this.bv.validate();
-		expect(this.bv.isValid()).toBeTruthy();
-
-		this.$uri.val('http://142.42.1.1:8080/');
-		this.bv.validate();
-		expect(this.bv.isValid()).toBeTruthy();
-
-		this.$uri.val('http://➡.ws/䨹');
-		this.bv.validate();
-		expect(this.bv.isValid()).toBeTruthy();
-
-		this.$uri.val('http://⌘.ws');
-		this.bv.validate();
-		expect(this.bv.isValid()).toBeTruthy();
-
-		this.$uri.val('http://⌘.ws/');
-		this.bv.validate();
-		expect(this.bv.isValid()).toBeTruthy();
-
-		this.$uri.val('http://foo.com/blah_(wikipedia)#cite-1');
-		this.bv.validate();
-		expect(this.bv.isValid()).toBeTruthy();
-
-		this.$uri.val('http://foo.com/blah_(wikipedia)_blah#cite-1');
-		this.bv.validate();
-		expect(this.bv.isValid()).toBeTruthy();
-
-		this.$uri.val('http://foo.com/unicode_(✪)_in_parens');
-		this.bv.validate();
-		expect(this.bv.isValid()).toBeTruthy();
-
-		this.$uri.val('http://foo.com/(something)?after=parens');
-		this.bv.validate();
-		expect(this.bv.isValid()).toBeTruthy();
-
-		this.$uri.val('http://☺.damowmow.com/');
-		this.bv.validate();
-		expect(this.bv.isValid()).toBeTruthy();
-
-		this.$uri.val('http://code.google.com/events/#&product=browser');
-		this.bv.validate();
-		expect(this.bv.isValid()).toBeTruthy();
-
-		this.$uri.val('http://j.mp');
-		this.bv.validate();
-		expect(this.bv.isValid()).toBeTruthy();
-
-		this.$uri.val('ftp://foo.bar/baz');
-		this.bv.validate();
-		expect(this.bv.isValid()).toBeTruthy();
-
-		this.$uri.val('http://foo.bar/?q=Test%20URL-encoded%20stuff');
-		this.bv.validate();
-		expect(this.bv.isValid()).toBeTruthy();
-
-		this.$uri.val('http://مثال.إختبار');
-		this.bv.validate();
-		expect(this.bv.isValid()).toBeTruthy();
-
-		this.$uri.val('http://例子.测试');
-		this.bv.validate();
-		expect(this.bv.isValid()).toBeTruthy();
-
-		this.$uri.val('http://उदाहरण.परीक्षा');
-		this.bv.validate();
-		expect(this.bv.isValid()).toBeTruthy();
-
-		this.$uri.val("http://-.~_!$&'()*+,;=:%40:80%2f::::::@example.com");
-		this.bv.validate();
-		expect(this.bv.isValid()).toBeTruthy();
-
-		this.$uri.val('http://1337.net');
-		this.bv.validate();
-		expect(this.bv.isValid()).toBeTruthy();
-
-		this.$uri.val('http://a.b-c.de');
-		this.bv.validate();
-		expect(this.bv.isValid()).toBeTruthy();
-
-		this.$uri.val('http://223.255.255.254');
-		this.bv.validate();
-		expect(this.bv.isValid()).toBeTruthy();
-
-		this.$uri.val('http://intranetsite');
-		this.bv.validate();
-		expect(this.bv.isValid()).toBeTruthy();
-
-		this.$uri.val('http://intranetsite/test');
-		this.bv.validate();
-		expect(this.bv.isValid()).toBeTruthy();
-
-		this.$uri.val('http://intranetsite:80');
-		this.bv.validate();
-		expect(this.bv.isValid()).toBeTruthy();
-
-		this.$uri.val('http://intranetsite:80/test');
-		this.bv.validate();
-		expect(this.bv.isValid()).toBeTruthy();
-
-		this.$uri.val('http://user:pass@intranetsite');
-		this.bv.validate();
-		expect(this.bv.isValid()).toBeTruthy();
-
-		this.$uri.val('http://user:pass@intranetsite/test');
-		this.bv.validate();
-		expect(this.bv.isValid()).toBeTruthy();
-
-		this.$uri.val('http://user:pass@intranetsite:80');
-		this.bv.validate();
-		expect(this.bv.isValid()).toBeTruthy();
-
-		this.$uri.val('http://user:pass@intranetsite:80/test');
-		this.bv.validate();
-		expect(this.bv.isValid()).toBeTruthy();
+	var validGlobalURIs = [
+		'http://foo.com/blah_blah',
+		'http://foo.com/blah_blah',
+		'http://foo.com/blah_blah/',
+		'http://foo.com/blah_blah_(wikipedia)',
+		'http://foo.com/blah_blah_(wikipedia)_(again)',
+		'http://www.example.com/wpstyle/?p=364',
+		'https://www.example.com/foo/?bar=baz&inga=42&quux',
+		'http://✪df.ws/123',
+		'http://userid:password@example.com:8080',
+		'http://userid:password@example.com:8080/',
+		'http://userid@example.com',
+		'http://userid@example.com/',
+		'http://userid@example.com:8080',
+		'http://userid@example.com:8080/',
+		'http://userid:password@example.com',
+		'http://userid:password@example.com/',
+		'http://142.42.1.1/',
+		'http://142.42.1.1:8080/',
+		'http://➡.ws/䨹',
+		'http://⌘.ws',
+		'http://⌘.ws/',
+		'http://foo.com/blah_(wikipedia)#cite-1',
+		'http://foo.com/blah_(wikipedia)_blah#cite-1',
+		'http://foo.com/unicode_(✪)_in_parens',
+		'http://foo.com/(something)?after=parens',
+		'http://☺.damowmow.com/',
+		'http://code.google.com/events/#&product=browser',
+		'http://j.mp',
+		'ftp://foo.bar/baz',
+		'http://foo.bar/?q=Test%20URL-encoded%20stuff',
+		'http://مثال.إختبار',
+		'http://例子.测试',
+		'http://उदाहरण.परीक्षा',
+		"http://-.~_!$&'()*+,;=:%40:80%2f::::::@example.com",
+		'http://1337.net',
+		'http://a.b-c.de',
+		'http://223.255.255.254'
+	];
+
+	var invalidGlobalURIs = [
+		'http://',
+		'http://.',
+		'http://..',
+		'http://../',
+		'http://?',
+		'http://??',
+		'http://??/',
+		'http://#',
+		'http://##',
+		'http://##/',
+		'http://foo.bar?q=Spaces should be encoded',
+		'//',
+		'//a',
+		'///a',
+		'///',
+		'http:///a',
+		'foo.com',
+		'rdar://1234',
+		'h://test',
+		'http:// shouldfail.com',
+		':// should fail',
+		'http://foo.bar/foo(bar)baz quux',
+		'ftps://foo.bar/',
+		'http://-error-.invalid/',
+		'http://a.b--c.de/',
+		'http://-a.b.co',
+		'http://a.b-.co',
+		'http://.www.foo.bar/',
+		'http://www.foo.bar./',
+		'http://.www.foo.bar./'
+	];
+
+	var localURIs = [
+		'http://intranetsite',
+		'http://intranetsite/test',
+		'http://intranetsite:80',
+		'http://intranetsite:80/test',
+		'http://user:pass@intranetsite',
+		'http://user:pass@intranetsite/test',
+		'http://user:pass@intranetsite:80',
+		'http://user:pass@intranetsite:80/test',
+		'http://10.1.1.0',
+		'http://10.1.1.255',
+		'http://10.1.1.1',
+		'http://10.1.1.254',
+		'http://127.0.0.1',
+		'http://192.168.0.1',
+		'http://0.0.0.0',
+		'http://224.1.1.1',
+		'http://1.1.1.1.1',
+		'http://123.123.123',
+		'http://3628126748'
+	];
+
+	it('Valid URIs (allowLocal=false)', function() {
+		var me = this;
+		$.each(validGlobalURIs, function(index, uri) {
+			me.bv.resetForm();
+			me.$uri.val(uri);
+			me.bv.validate();
+			expect(me.bv.isValid()).toBeTruthy();
+		});
 	});
 
-	it('Invalid URIs', function() {
-		this.$uri.val('http://');
-		this.bv.validate();
-		expect(this.bv.isValid()).toEqual(false);
-
-		this.$uri.val('http://.');
-		this.bv.validate();
-		expect(this.bv.isValid()).toEqual(false);
-
-		this.$uri.val('http://..');
-		this.bv.validate();
-		expect(this.bv.isValid()).toEqual(false);
-
-		this.$uri.val('http://../');
-		this.bv.validate();
-		expect(this.bv.isValid()).toEqual(false);
-
-		this.$uri.val('http://?');
-		this.bv.validate();
-		expect(this.bv.isValid()).toEqual(false);
-
-		this.$uri.val('http://??');
-		this.bv.validate();
-		expect(this.bv.isValid()).toEqual(false);
-
-		this.$uri.val('http://??/');
-		this.bv.validate();
-		expect(this.bv.isValid()).toEqual(false);
-
-		this.$uri.val('http://#');
-		this.bv.validate();
-		expect(this.bv.isValid()).toEqual(false);
-
-		this.$uri.val('http://##');
-		this.bv.validate();
-		expect(this.bv.isValid()).toEqual(false);
-
-		this.$uri.val('http://##/');
-		this.bv.validate();
-		expect(this.bv.isValid()).toEqual(false);
-
-		this.$uri.val('http://foo.bar?q=Spaces should be encoded');
-		this.bv.validate();
-		expect(this.bv.isValid()).toEqual(false);
-
-		this.$uri.val('//');
-		this.bv.validate();
-		expect(this.bv.isValid()).toEqual(false);
-
-		this.$uri.val('//a');
-		this.bv.validate();
-		expect(this.bv.isValid()).toEqual(false);
-
-		this.$uri.val('///a');
-		this.bv.validate();
-		expect(this.bv.isValid()).toEqual(false);
-
-		this.$uri.val('///');
-		this.bv.validate();
-		expect(this.bv.isValid()).toEqual(false);
-
-		this.$uri.val('http:///a');
-		this.bv.validate();
-		expect(this.bv.isValid()).toEqual(false);
-
-		this.$uri.val('foo.com');
-		this.bv.validate();
-		expect(this.bv.isValid()).toEqual(false);
-
-		this.$uri.val('rdar://1234');
-		this.bv.validate();
-		expect(this.bv.isValid()).toEqual(false);
-
-		this.$uri.val('h://test');
-		this.bv.validate();
-		expect(this.bv.isValid()).toEqual(false);
-
-		this.$uri.val('http:// shouldfail.com');
-		this.bv.validate();
-		expect(this.bv.isValid()).toEqual(false);
-
-		this.$uri.val(':// should fail');
-		this.bv.validate();
-		expect(this.bv.isValid()).toEqual(false);
-
-		this.$uri.val('http://foo.bar/foo(bar)baz quux');
-		this.bv.validate();
-		expect(this.bv.isValid()).toEqual(false);
-
-		this.$uri.val('ftps://foo.bar/');
-		this.bv.validate();
-		expect(this.bv.isValid()).toEqual(false);
-
-		this.$uri.val('http://-error-.invalid/');
-		this.bv.validate();
-		expect(this.bv.isValid()).toEqual(false);
-
-		this.$uri.val('http://a.b--c.de/');
-		this.bv.validate();
-		expect(this.bv.isValid()).toEqual(false);
-
-		this.$uri.val('http://-a.b.co');
-		this.bv.validate();
-		expect(this.bv.isValid()).toEqual(false);
-
-		this.$uri.val('http://a.b-.co');
-		this.bv.validate();
-		expect(this.bv.isValid()).toEqual(false);
-
-		this.$uri.val('http://0.0.0.0');
-		this.bv.validate();
-		expect(this.bv.isValid()).toEqual(false);
-
-		this.$uri.val('http://10.1.1.0');
-		this.bv.validate();
-		expect(this.bv.isValid()).toEqual(false);
-
-		this.$uri.val('http://10.1.1.255');
-		this.bv.validate();
-		expect(this.bv.isValid()).toEqual(false);
-
-		this.$uri.val('http://224.1.1.1');
-		this.bv.validate();
-		expect(this.bv.isValid()).toEqual(false);
-
-		this.$uri.val('http://1.1.1.1.1');
-		this.bv.validate();
-		expect(this.bv.isValid()).toEqual(false);
-
-		this.$uri.val('http://123.123.123');
-		this.bv.validate();
-		expect(this.bv.isValid()).toEqual(false);
-
-		this.$uri.val('http://3628126748');
-		this.bv.validate();
-		expect(this.bv.isValid()).toEqual(false);
-
-		this.$uri.val('http://.www.foo.bar/');
-		this.bv.validate();
-		expect(this.bv.isValid()).toEqual(false);
-
-		this.$uri.val('http://www.foo.bar./');
-		this.bv.validate();
-		expect(this.bv.isValid()).toEqual(false);
-
-		this.$uri.val('http://.www.foo.bar./');
-		this.bv.validate();
-		expect(this.bv.isValid()).toEqual(false);
+	it('Invalid URIs (allowLocal=false)', function() {
+		var me = this;
+		$.each(invalidGlobalURIs.concat(localURIs), function(index, uri) {
+			me.bv.resetForm();
+			me.$uri.val(uri);
+			me.bv.validate();
+			expect(me.bv.isValid()).toEqual(false);
+		});
+	});
 
-		this.$uri.val('http://10.1.1.1');
-		this.bv.validate();
-		expect(this.bv.isValid()).toEqual(false);
+	it('Valid URIs (allowLocal=true)', function() {
+		var me = this;
+		me.bv.updateOption('uri', 'uri', 'allowLocal', true);
+		$.each(validGlobalURIs.concat(localURIs), function(index, uri) {
+			me.bv.resetForm();
+			me.$uri.val(uri);
+			me.bv.validate();
+			expect(me.bv.isValid()).toBeTruthy();
+		});
+	});
 
-		this.$uri.val('http://10.1.1.254');
-		this.bv.validate();
-		expect(this.bv.isValid()).toEqual(false);
+	it('Invalid URIs (allowLocal=true)', function() {
+		var me = this;
+		me.bv.updateOption('uri', 'uri', 'allowLocal', true);
+		$.each(invalidGlobalURIs, function(index, uri) {
+			me.bv.resetForm();
+			me.$uri.val(uri);
+			me.bv.validate();
+			expect(me.bv.isValid()).toEqual(false);
+		});
 	});
 });
 

+ 131 - 334
test/spec/validator/uri.js

@@ -19,343 +19,140 @@ describe('uri', function() {
 		$('#uriForm').bootstrapValidator('destroy').remove();
 	});
 
-	it('Valid URIs', function() {
-		this.$uri.val('http://foo.com/blah_blah');
-		this.bv.validate();
-		expect(this.bv.isValid()).toBeTruthy();
-
-		this.$uri.val('http://foo.com/blah_blah');
-		this.bv.validate();
-		expect(this.bv.isValid()).toBeTruthy();
-
-		this.$uri.val('http://foo.com/blah_blah/');
-		this.bv.validate();
-		expect(this.bv.isValid()).toBeTruthy();
-
-		this.$uri.val('http://foo.com/blah_blah_(wikipedia)');
-		this.bv.validate();
-		expect(this.bv.isValid()).toBeTruthy();
-
-		this.$uri.val('http://foo.com/blah_blah_(wikipedia)_(again)');
-		this.bv.validate();
-		expect(this.bv.isValid()).toBeTruthy();
-
-		this.$uri.val('http://www.example.com/wpstyle/?p=364');
-		this.bv.validate();
-		expect(this.bv.isValid()).toBeTruthy();
-
-		this.$uri.val('https://www.example.com/foo/?bar=baz&inga=42&quux');
-		this.bv.validate();
-		expect(this.bv.isValid()).toBeTruthy();
-
-		this.$uri.val('http://✪df.ws/123');
-		this.bv.validate();
-		expect(this.bv.isValid()).toBeTruthy();
-
-		this.$uri.val('http://userid:password@example.com:8080');
-		this.bv.validate();
-		expect(this.bv.isValid()).toBeTruthy();
-
-		this.$uri.val('http://userid:password@example.com:8080/');
-		this.bv.validate();
-		expect(this.bv.isValid()).toBeTruthy();
-
-		this.$uri.val('http://userid@example.com');
-		this.bv.validate();
-		expect(this.bv.isValid()).toBeTruthy();
-
-		this.$uri.val('http://userid@example.com/');
-		this.bv.validate();
-		expect(this.bv.isValid()).toBeTruthy();
-
-		this.$uri.val('http://userid@example.com:8080');
-		this.bv.validate();
-		expect(this.bv.isValid()).toBeTruthy();
-
-		this.$uri.val('http://userid@example.com:8080/');
-		this.bv.validate();
-		expect(this.bv.isValid()).toBeTruthy();
-
-		this.$uri.val('http://userid:password@example.com');
-		this.bv.validate();
-		expect(this.bv.isValid()).toBeTruthy();
-
-		this.$uri.val('http://userid:password@example.com/');
-		this.bv.validate();
-		expect(this.bv.isValid()).toBeTruthy();
-
-		this.$uri.val('http://142.42.1.1/');
-		this.bv.validate();
-		expect(this.bv.isValid()).toBeTruthy();
-
-		this.$uri.val('http://142.42.1.1:8080/');
-		this.bv.validate();
-		expect(this.bv.isValid()).toBeTruthy();
-
-		this.$uri.val('http://➡.ws/䨹');
-		this.bv.validate();
-		expect(this.bv.isValid()).toBeTruthy();
-
-		this.$uri.val('http://⌘.ws');
-		this.bv.validate();
-		expect(this.bv.isValid()).toBeTruthy();
-
-		this.$uri.val('http://⌘.ws/');
-		this.bv.validate();
-		expect(this.bv.isValid()).toBeTruthy();
-
-		this.$uri.val('http://foo.com/blah_(wikipedia)#cite-1');
-		this.bv.validate();
-		expect(this.bv.isValid()).toBeTruthy();
-
-		this.$uri.val('http://foo.com/blah_(wikipedia)_blah#cite-1');
-		this.bv.validate();
-		expect(this.bv.isValid()).toBeTruthy();
-
-		this.$uri.val('http://foo.com/unicode_(✪)_in_parens');
-		this.bv.validate();
-		expect(this.bv.isValid()).toBeTruthy();
-
-		this.$uri.val('http://foo.com/(something)?after=parens');
-		this.bv.validate();
-		expect(this.bv.isValid()).toBeTruthy();
-
-		this.$uri.val('http://☺.damowmow.com/');
-		this.bv.validate();
-		expect(this.bv.isValid()).toBeTruthy();
-
-		this.$uri.val('http://code.google.com/events/#&product=browser');
-		this.bv.validate();
-		expect(this.bv.isValid()).toBeTruthy();
-
-		this.$uri.val('http://j.mp');
-		this.bv.validate();
-		expect(this.bv.isValid()).toBeTruthy();
-
-		this.$uri.val('ftp://foo.bar/baz');
-		this.bv.validate();
-		expect(this.bv.isValid()).toBeTruthy();
-
-		this.$uri.val('http://foo.bar/?q=Test%20URL-encoded%20stuff');
-		this.bv.validate();
-		expect(this.bv.isValid()).toBeTruthy();
-
-		this.$uri.val('http://مثال.إختبار');
-		this.bv.validate();
-		expect(this.bv.isValid()).toBeTruthy();
-
-		this.$uri.val('http://例子.测试');
-		this.bv.validate();
-		expect(this.bv.isValid()).toBeTruthy();
-
-		this.$uri.val('http://उदाहरण.परीक्षा');
-		this.bv.validate();
-		expect(this.bv.isValid()).toBeTruthy();
-
-		this.$uri.val("http://-.~_!$&'()*+,;=:%40:80%2f::::::@example.com");
-		this.bv.validate();
-		expect(this.bv.isValid()).toBeTruthy();
-
-		this.$uri.val('http://1337.net');
-		this.bv.validate();
-		expect(this.bv.isValid()).toBeTruthy();
-
-		this.$uri.val('http://a.b-c.de');
-		this.bv.validate();
-		expect(this.bv.isValid()).toBeTruthy();
-
-		this.$uri.val('http://223.255.255.254');
-		this.bv.validate();
-		expect(this.bv.isValid()).toBeTruthy();
-
-		this.$uri.val('http://intranetsite');
-		this.bv.validate();
-		expect(this.bv.isValid()).toBeTruthy();
-
-		this.$uri.val('http://intranetsite/test');
-		this.bv.validate();
-		expect(this.bv.isValid()).toBeTruthy();
-
-		this.$uri.val('http://intranetsite:80');
-		this.bv.validate();
-		expect(this.bv.isValid()).toBeTruthy();
-
-		this.$uri.val('http://intranetsite:80/test');
-		this.bv.validate();
-		expect(this.bv.isValid()).toBeTruthy();
-
-		this.$uri.val('http://user:pass@intranetsite');
-		this.bv.validate();
-		expect(this.bv.isValid()).toBeTruthy();
-
-		this.$uri.val('http://user:pass@intranetsite/test');
-		this.bv.validate();
-		expect(this.bv.isValid()).toBeTruthy();
-
-		this.$uri.val('http://user:pass@intranetsite:80');
-		this.bv.validate();
-		expect(this.bv.isValid()).toBeTruthy();
-
-		this.$uri.val('http://user:pass@intranetsite:80/test');
-		this.bv.validate();
-		expect(this.bv.isValid()).toBeTruthy();
+	var validGlobalURIs = [
+		'http://foo.com/blah_blah',
+		'http://foo.com/blah_blah',
+		'http://foo.com/blah_blah/',
+		'http://foo.com/blah_blah_(wikipedia)',
+		'http://foo.com/blah_blah_(wikipedia)_(again)',
+		'http://www.example.com/wpstyle/?p=364',
+		'https://www.example.com/foo/?bar=baz&inga=42&quux',
+		'http://✪df.ws/123',
+		'http://userid:password@example.com:8080',
+		'http://userid:password@example.com:8080/',
+		'http://userid@example.com',
+		'http://userid@example.com/',
+		'http://userid@example.com:8080',
+		'http://userid@example.com:8080/',
+		'http://userid:password@example.com',
+		'http://userid:password@example.com/',
+		'http://142.42.1.1/',
+		'http://142.42.1.1:8080/',
+		'http://➡.ws/䨹',
+		'http://⌘.ws',
+		'http://⌘.ws/',
+		'http://foo.com/blah_(wikipedia)#cite-1',
+		'http://foo.com/blah_(wikipedia)_blah#cite-1',
+		'http://foo.com/unicode_(✪)_in_parens',
+		'http://foo.com/(something)?after=parens',
+		'http://☺.damowmow.com/',
+		'http://code.google.com/events/#&product=browser',
+		'http://j.mp',
+		'ftp://foo.bar/baz',
+		'http://foo.bar/?q=Test%20URL-encoded%20stuff',
+		'http://مثال.إختبار',
+		'http://例子.测试',
+		'http://उदाहरण.परीक्षा',
+		"http://-.~_!$&'()*+,;=:%40:80%2f::::::@example.com",
+		'http://1337.net',
+		'http://a.b-c.de',
+		'http://223.255.255.254'
+	];
+
+	var invalidGlobalURIs = [
+		'http://',
+		'http://.',
+		'http://..',
+		'http://../',
+		'http://?',
+		'http://??',
+		'http://??/',
+		'http://#',
+		'http://##',
+		'http://##/',
+		'http://foo.bar?q=Spaces should be encoded',
+		'//',
+		'//a',
+		'///a',
+		'///',
+		'http:///a',
+		'foo.com',
+		'rdar://1234',
+		'h://test',
+		'http:// shouldfail.com',
+		':// should fail',
+		'http://foo.bar/foo(bar)baz quux',
+		'ftps://foo.bar/',
+		'http://-error-.invalid/',
+		'http://a.b--c.de/',
+		'http://-a.b.co',
+		'http://a.b-.co',
+		'http://.www.foo.bar/',
+		'http://www.foo.bar./',
+		'http://.www.foo.bar./'
+	];
+
+	var localURIs = [
+		'http://intranetsite',
+		'http://intranetsite/test',
+		'http://intranetsite:80',
+		'http://intranetsite:80/test',
+		'http://user:pass@intranetsite',
+		'http://user:pass@intranetsite/test',
+		'http://user:pass@intranetsite:80',
+		'http://user:pass@intranetsite:80/test',
+		'http://10.1.1.0',
+		'http://10.1.1.255',
+		'http://10.1.1.1',
+		'http://10.1.1.254',
+		'http://127.0.0.1',
+		'http://192.168.0.1',
+		'http://0.0.0.0',
+		'http://224.1.1.1',
+		'http://1.1.1.1.1',
+		'http://123.123.123',
+		'http://3628126748'
+	];
+
+	it('Valid URIs (allowLocal=false)', function() {
+		var me = this;
+		$.each(validGlobalURIs, function(index, uri) {
+			me.bv.resetForm();
+			me.$uri.val(uri);
+			me.bv.validate();
+			expect(me.bv.isValid()).toBeTruthy();
+		});
 	});
 
-	it('Invalid URIs', function() {
-		this.$uri.val('http://');
-		this.bv.validate();
-		expect(this.bv.isValid()).toEqual(false);
-
-		this.$uri.val('http://.');
-		this.bv.validate();
-		expect(this.bv.isValid()).toEqual(false);
-
-		this.$uri.val('http://..');
-		this.bv.validate();
-		expect(this.bv.isValid()).toEqual(false);
-
-		this.$uri.val('http://../');
-		this.bv.validate();
-		expect(this.bv.isValid()).toEqual(false);
-
-		this.$uri.val('http://?');
-		this.bv.validate();
-		expect(this.bv.isValid()).toEqual(false);
-
-		this.$uri.val('http://??');
-		this.bv.validate();
-		expect(this.bv.isValid()).toEqual(false);
-
-		this.$uri.val('http://??/');
-		this.bv.validate();
-		expect(this.bv.isValid()).toEqual(false);
-
-		this.$uri.val('http://#');
-		this.bv.validate();
-		expect(this.bv.isValid()).toEqual(false);
-
-		this.$uri.val('http://##');
-		this.bv.validate();
-		expect(this.bv.isValid()).toEqual(false);
-
-		this.$uri.val('http://##/');
-		this.bv.validate();
-		expect(this.bv.isValid()).toEqual(false);
-
-		this.$uri.val('http://foo.bar?q=Spaces should be encoded');
-		this.bv.validate();
-		expect(this.bv.isValid()).toEqual(false);
-
-		this.$uri.val('//');
-		this.bv.validate();
-		expect(this.bv.isValid()).toEqual(false);
-
-		this.$uri.val('//a');
-		this.bv.validate();
-		expect(this.bv.isValid()).toEqual(false);
-
-		this.$uri.val('///a');
-		this.bv.validate();
-		expect(this.bv.isValid()).toEqual(false);
-
-		this.$uri.val('///');
-		this.bv.validate();
-		expect(this.bv.isValid()).toEqual(false);
-
-		this.$uri.val('http:///a');
-		this.bv.validate();
-		expect(this.bv.isValid()).toEqual(false);
-
-		this.$uri.val('foo.com');
-		this.bv.validate();
-		expect(this.bv.isValid()).toEqual(false);
-
-		this.$uri.val('rdar://1234');
-		this.bv.validate();
-		expect(this.bv.isValid()).toEqual(false);
-
-		this.$uri.val('h://test');
-		this.bv.validate();
-		expect(this.bv.isValid()).toEqual(false);
-
-		this.$uri.val('http:// shouldfail.com');
-		this.bv.validate();
-		expect(this.bv.isValid()).toEqual(false);
-
-		this.$uri.val(':// should fail');
-		this.bv.validate();
-		expect(this.bv.isValid()).toEqual(false);
-
-		this.$uri.val('http://foo.bar/foo(bar)baz quux');
-		this.bv.validate();
-		expect(this.bv.isValid()).toEqual(false);
-
-		this.$uri.val('ftps://foo.bar/');
-		this.bv.validate();
-		expect(this.bv.isValid()).toEqual(false);
-
-		this.$uri.val('http://-error-.invalid/');
-		this.bv.validate();
-		expect(this.bv.isValid()).toEqual(false);
-
-		this.$uri.val('http://a.b--c.de/');
-		this.bv.validate();
-		expect(this.bv.isValid()).toEqual(false);
-
-		this.$uri.val('http://-a.b.co');
-		this.bv.validate();
-		expect(this.bv.isValid()).toEqual(false);
-
-		this.$uri.val('http://a.b-.co');
-		this.bv.validate();
-		expect(this.bv.isValid()).toEqual(false);
-
-		this.$uri.val('http://0.0.0.0');
-		this.bv.validate();
-		expect(this.bv.isValid()).toEqual(false);
-
-		this.$uri.val('http://10.1.1.0');
-		this.bv.validate();
-		expect(this.bv.isValid()).toEqual(false);
-
-		this.$uri.val('http://10.1.1.255');
-		this.bv.validate();
-		expect(this.bv.isValid()).toEqual(false);
-
-		this.$uri.val('http://224.1.1.1');
-		this.bv.validate();
-		expect(this.bv.isValid()).toEqual(false);
-
-		this.$uri.val('http://1.1.1.1.1');
-		this.bv.validate();
-		expect(this.bv.isValid()).toEqual(false);
-
-		this.$uri.val('http://123.123.123');
-		this.bv.validate();
-		expect(this.bv.isValid()).toEqual(false);
-
-		this.$uri.val('http://3628126748');
-		this.bv.validate();
-		expect(this.bv.isValid()).toEqual(false);
-
-		this.$uri.val('http://.www.foo.bar/');
-		this.bv.validate();
-		expect(this.bv.isValid()).toEqual(false);
-
-		this.$uri.val('http://www.foo.bar./');
-		this.bv.validate();
-		expect(this.bv.isValid()).toEqual(false);
-
-		this.$uri.val('http://.www.foo.bar./');
-		this.bv.validate();
-		expect(this.bv.isValid()).toEqual(false);
+	it('Invalid URIs (allowLocal=false)', function() {
+		var me = this;
+		$.each(invalidGlobalURIs.concat(localURIs), function(index, uri) {
+			me.bv.resetForm();
+			me.$uri.val(uri);
+			me.bv.validate();
+			expect(me.bv.isValid()).toEqual(false);
+		});
+	});
 
-		this.$uri.val('http://10.1.1.1');
-		this.bv.validate();
-		expect(this.bv.isValid()).toEqual(false);
+	it('Valid URIs (allowLocal=true)', function() {
+		var me = this;
+		me.bv.updateOption('uri', 'uri', 'allowLocal', true);
+		$.each(validGlobalURIs.concat(localURIs), function(index, uri) {
+			me.bv.resetForm();
+			me.$uri.val(uri);
+			me.bv.validate();
+			expect(me.bv.isValid()).toBeTruthy();
+		});
+	});
 
-		this.$uri.val('http://10.1.1.254');
-		this.bv.validate();
-		expect(this.bv.isValid()).toEqual(false);
+	it('Invalid URIs (allowLocal=true)', function() {
+		var me = this;
+		me.bv.updateOption('uri', 'uri', 'allowLocal', true);
+		$.each(invalidGlobalURIs, function(index, uri) {
+			me.bv.resetForm();
+			me.$uri.val(uri);
+			me.bv.validate();
+			expect(me.bv.isValid()).toEqual(false);
+		});
 	});
 });