7
7
// exactly the behavior needed here. There is little value is mocking these out for this
8
8
// service.
9
9
var urlParsingNode = document . createElement ( "a" ) ;
10
+ /*
11
+ Matches paths for file protocol on windows,
12
+ such as /C:/foo/bar, and captures only /foo/bar.
13
+ */
14
+ var windowsFilePathExp = / ^ \/ ? .* ?: ( \/ .* ) / ;
10
15
var originUrl = urlResolve ( window . location . href , true ) ;
11
16
17
+
12
18
/**
13
19
*
14
20
* Implementation Notes for non-IE browsers
@@ -27,7 +33,7 @@ var originUrl = urlResolve(window.location.href, true);
27
33
* browsers. However, the parsed components will not be set if the URL assigned did not specify
28
34
* them. (e.g. if you assign a.href = "foo", then a.protocol, a.host, etc. will be empty.) We
29
35
* work around that by performing the parsing in a 2nd step by taking a previously normalized
30
- * URL (e.g. by assining to a.href) and assigning it a.href again. This correctly populates the
36
+ * URL (e.g. by assigning to a.href) and assigning it a.href again. This correctly populates the
31
37
* properties such as protocol, hostname, port, etc.
32
38
*
33
39
* IE7 does not normalize the URL when assigned to an anchor node. (Apparently, it does, if one
@@ -62,7 +68,9 @@ var originUrl = urlResolve(window.location.href, true);
62
68
*
63
69
*/
64
70
function urlResolve ( url ) {
65
- var href = url ;
71
+ var href = url ,
72
+ pathname ;
73
+
66
74
if ( msie ) {
67
75
// Normalize before parse. Refer Implementation Notes on why this is
68
76
// done in two steps on IE.
@@ -72,7 +80,34 @@ function urlResolve(url) {
72
80
73
81
urlParsingNode . setAttribute ( 'href' , href ) ;
74
82
75
- // $$urlParsingNode provides the UrlUtils interface - http://url.spec.whatwg.org/#urlutils
83
+ // ":"" protocol occurs on IE/Win for file://
84
+ /* jeffbcross and tbosch say:
85
+ Per section 3.3 of http://www.ietf.org/rfc/rfc3986.txt,
86
+ the first path segment of a relative path reference
87
+ cannot contain a colon, so it is right to assume that
88
+ if the first section of the path contains a colon, it
89
+ is invalid.
90
+
91
+ However, to be safe, this check is only obliberating
92
+ the first segment if the LAST character of the segment
93
+ is a colon.
94
+
95
+ In Windows, on an anchor node on documents loaded from
96
+ the filesystem, the browser will return a pathname
97
+ prefixed with the drive name ('/C:/path') when a
98
+ pathname without a drive is set:
99
+ * a.setAttribute('href', '/foo')
100
+ * a.pathname === '/C:/foo' //true
101
+
102
+ Inside of Angular, we're always using pathnames that
103
+ do not include drive names for routing.
104
+ */
105
+
106
+ pathname = removeWindowsDriveName ( urlParsingNode . pathname ) ;
107
+ pathname = ( pathname . charAt ( 0 ) === '/' ) ? pathname : '/' + pathname ;
108
+
109
+
110
+ // urlParsingNode provides the UrlUtils interface - http://url.spec.whatwg.org/#urlutils
76
111
return {
77
112
href : urlParsingNode . href ,
78
113
protocol : urlParsingNode . protocol ? urlParsingNode . protocol . replace ( / : $ / , '' ) : '' ,
@@ -81,9 +116,15 @@ function urlResolve(url) {
81
116
hash : urlParsingNode . hash ? urlParsingNode . hash . replace ( / ^ # / , '' ) : '' ,
82
117
hostname : urlParsingNode . hostname ,
83
118
port : urlParsingNode . port ,
84
- pathname : urlParsingNode . pathname && urlParsingNode . pathname . charAt ( 0 ) === '/' ?
85
- urlParsingNode . pathname : '/' + urlParsingNode . pathname
119
+ pathname : pathname
86
120
} ;
121
+
122
+ function removeWindowsDriveName ( path ) {
123
+ var firstPathSegmentMatch ;
124
+
125
+ firstPathSegmentMatch = windowsFilePathExp . exec ( path ) ;
126
+ return firstPathSegmentMatch ? firstPathSegmentMatch [ 1 ] : path ;
127
+ }
87
128
}
88
129
89
130
0 commit comments