Skip to content

Commit

Permalink
Fixing issue #52 - fragmentQuery and fragmentURI would cause errors o…
Browse files Browse the repository at this point in the history
…n undefined fragments

(also adding tests)
  • Loading branch information
rodneyrehm committed Nov 10, 2012
1 parent 695a4b1 commit daadac8
Show file tree
Hide file tree
Showing 6 changed files with 137 additions and 10 deletions.
6 changes: 3 additions & 3 deletions src/URI.fragmentQuery.js
Original file line number Diff line number Diff line change
Expand Up @@ -45,7 +45,7 @@ var prefix = '?';
// add fragment(true) and fragment({key: value}) signatures
p.fragment = function(v, build) {
if (v === true) {
return URI.parseQuery(this._parts.fragment.substring(prefix.length));
return URI.parseQuery((this._parts.fragment || "").substring(prefix.length));
} else if (v !== undefined && typeof v !== "string") {
this._parts.fragment = prefix + URI.buildQuery(v);
this.build(!build);
Expand All @@ -55,7 +55,7 @@ p.fragment = function(v, build) {
}
};
p.addFragment = function(name, value, build) {
var data = URI.parseQuery(this._parts.fragment.substring(prefix.length));
var data = URI.parseQuery((this._parts.fragment || "").substring(prefix.length));
URI.addQuery(data, name, value);
this._parts.fragment = prefix + URI.buildQuery(data);
if (typeof name !== "string") {
Expand All @@ -66,7 +66,7 @@ p.addFragment = function(name, value, build) {
return this;
};
p.removeFragment = function(name, value, build) {
var data = URI.parseQuery(this._parts.fragment.substring(prefix.length));
var data = URI.parseQuery((this._parts.fragment || "").substring(prefix.length));
URI.removeQuery(data, name, value);
this._parts.fragment = prefix + URI.buildQuery(data);
if (typeof name !== "string") {
Expand Down
19 changes: 12 additions & 7 deletions src/URI.fragmentURI.js
Original file line number Diff line number Diff line change
Expand Up @@ -43,28 +43,33 @@ var prefix = '!';
// add fragment(true) and fragment(URI) signatures
p.fragment = function(v, build) {
if (v === true) {
var furi = new URI(this._parts.fragment.substring(prefix.length));
this._furi = furi;
var furi = new URI((this._parts.fragment || "").substring(prefix.length));
this._fragmentURI = furi;
furi._parentURI = this;
return furi;
} else if (v !== undefined && typeof v !== "string") {
this._furi = furi;
this._fragmentURI = v;
v._parentURI = v;
this._parts.fragment = prefix + v.toString();
this.build(!build);
return this;
} else if (typeof v === "string") {
this._furi = undefined;
this._fragmentURI = undefined;
}

return f.call(this, v, build);
};

// make .build() of the actual URI aware of the FragmentURI
p.build = function(deferBuild) {
if (this._furi) {
this._parts.fragment = prefix + this._furi.toString();
var t = b.call(this, deferBuild);

if (deferBuild !== false && this._parentURI) {
// update the parent
this._parentURI.fragment(this);
}

return b.call(this, deferBuild);
return t;
};

// extending existing object rather than defining something new
Expand Down
30 changes: 30 additions & 0 deletions test/test.fragmentQuery.html
Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8" />
<title>URI Test Suite</title>
<link rel="stylesheet" href="qunit/qunit.css" type="text/css" media="screen">
<script type="text/javascript" src="../src/punycode.js"></script>
<script type="text/javascript" src="../src/IPv6.js"></script>
<script type="text/javascript" src="../src/SecondLevelDomains.js"></script>
<script type="text/javascript" src="../src/URI.js"></script>
<script type="text/javascript" src="../src/URITemplate.js"></script>
<script type="text/javascript" src="../src/URI.fragmentQuery.js"></script>
<script type="text/javascript" src="../jquery-1.8.2.min.js"></script>
<script type="text/javascript" src="qunit/qunit.js"></script>

<!--
as the plugins alter core URI functionality,
it is necessary to re-test URI itself was well
-->
<script type="text/javascript" src="urls.js"></script>
<script type="text/javascript" src="test.js"></script>
<script type="text/javascript" src="test_jim.js"></script>
<script type="text/javascript" src="test_template.js"></script>
<script type="text/javascript" src="test_fragmentQuery.js"></script>
</head>
<body>
<div id="qunit"></div>
<div id="qunit-fixture"></div>
</body>
</html>
30 changes: 30 additions & 0 deletions test/test.fragmentURI.html
Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8" />
<title>URI Test Suite</title>
<link rel="stylesheet" href="qunit/qunit.css" type="text/css" media="screen">
<script type="text/javascript" src="../src/punycode.js"></script>
<script type="text/javascript" src="../src/IPv6.js"></script>
<script type="text/javascript" src="../src/SecondLevelDomains.js"></script>
<script type="text/javascript" src="../src/URI.js"></script>
<script type="text/javascript" src="../src/URITemplate.js"></script>
<script type="text/javascript" src="../src/URI.fragmentURI.js"></script>
<script type="text/javascript" src="../jquery-1.8.2.min.js"></script>
<script type="text/javascript" src="qunit/qunit.js"></script>

<!--
as the plugins alter core URI functionality,
it is necessary to re-test URI itself was well
-->
<script type="text/javascript" src="urls.js"></script>
<script type="text/javascript" src="test.js"></script>
<script type="text/javascript" src="test_jim.js"></script>
<script type="text/javascript" src="test_template.js"></script>
<script type="text/javascript" src="test_fragmentURI.js"></script>
</head>
<body>
<div id="qunit"></div>
<div id="qunit-fixture"></div>
</body>
</html>
32 changes: 32 additions & 0 deletions test/test_fragmentQuery.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,32 @@
(function(){

module("URI.fragmentQuery");
test("storing query-data in fragment", function() {
var u = URI("http://example.org");

deepEqual(u.fragment(true), {}, "empty map for missing fragment");

u = URI("http://example.org/#");
deepEqual(u.fragment(true), {}, "empty map for empty fragment");

u = URI("http://example.org/#?hello=world");
deepEqual(u.fragment(true), {hello: "world"}, "reading data object");

u.fragment({bar: "foo"});
deepEqual(u.fragment(true), {bar: "foo"}, "setting data object");
equal(u.toString(), "http://example.org/#?bar=foo", "setting data object serialized");

u.addFragment("name", "value");
deepEqual(u.fragment(true), {bar: "foo", name: "value"}, "adding value");
equal(u.toString(), "http://example.org/#?bar=foo&name=value", "adding value serialized");

u.removeFragment("bar");
deepEqual(u.fragment(true), {name: "value"}, "removing value bar");
equal(u.toString(), "http://example.org/#?name=value", "removing value bar serialized");

u.removeFragment("name");
deepEqual(u.fragment(true), {}, "removing value name");
equal(u.toString(), "http://example.org/#?", "removing value name serialized");
});

})();
30 changes: 30 additions & 0 deletions test/test_fragmentURI.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@
(function(){

module("URI.fragmentURI");
test("storing URLs in fragment", function() {
var u = URI("http://example.org");
var f;

// var uri = URI("http://example.org/#!/foo/bar/baz.html");
// var furi = uri.fragment(true);
// furi.pathname() === '/foo/bar/baz.html';
// furi.pathname('/hello.html');
// uri.toString() === "http://example.org/#!/hello.html"

ok(u.fragment(true) instanceof URI, "URI instance for missing fragment");

u = URI("http://example.org/#");
ok(u.fragment(true) instanceof URI, "URI instance for empty fragment");

u = URI("http://example.org/#!/foo/bar/baz.html");
f = u.fragment(true);
equal(f.pathname(), "/foo/bar/baz.html", "reading path of FragmentURI");
equal(f.filename(), "baz.html", "reading filename of FragmentURI");

f.filename('foobar.txt');
equal(f.pathname(), "/foo/bar/foobar.txt", "modifying filename of FragmentURI");
equal(u.fragment(), "!/foo/bar/foobar.txt", "modifying fragment() through FragmentURI on original");
equal(u.toString(), "http://example.org/#!/foo/bar/foobar.txt", "modifying filename of FragmentURI on original");
});

})();

0 comments on commit daadac8

Please sign in to comment.