@@ -6,11 +6,9 @@ import { isNode } from './common.js';
66function throwResolveError ( relUrl , parentUrl ) {
77 throw new RangeError ( 'Unable to resolve "' + relUrl + '" to ' + parentUrl ) ;
88}
9- var protocolRegEx = / ^ [ ^ / ] + : / ;
109export function resolveIfNotPlain ( relUrl , parentUrl ) {
1110 relUrl = relUrl . trim ( ) ;
12- if ( parentUrl )
13- var parentProtocol = parentUrl . match ( protocolRegEx ) ;
11+ var parentProtocol = parentUrl && parentUrl . substr ( 0 , parentUrl . indexOf ( ':' ) + 1 ) ;
1412
1513 var firstChar = relUrl [ 0 ] ;
1614 var secondChar = relUrl [ 1 ] ;
@@ -19,12 +17,13 @@ export function resolveIfNotPlain (relUrl, parentUrl) {
1917 if ( firstChar === '/' && secondChar === '/' ) {
2018 if ( ! parentProtocol )
2119 throwResolveError ( relUrl , parentUrl ) ;
22- return parentProtocol [ 0 ] + relUrl ;
20+ return parentProtocol + relUrl ;
2321 }
2422 // relative-url
25- else if ( firstChar === '.' && ( secondChar === '/' || secondChar === '.' && ( relUrl [ 2 ] === '/' || relUrl . length === 2 ) || relUrl . length === 1 )
26- || firstChar === '/' ) {
27- var parentIsPlain = ! parentProtocol || parentUrl [ parentProtocol [ 0 ] . length ] !== '/' ;
23+ else if ( firstChar === '.' && ( secondChar === '/' || secondChar === '.' && ( relUrl [ 2 ] === '/' || relUrl . length === 2 && ( relUrl += '/' ) ) ||
24+ relUrl . length === 1 && ( relUrl += '/' ) ) ||
25+ firstChar === '/' ) {
26+ var parentIsPlain = ! parentProtocol || parentUrl [ parentProtocol . length ] !== '/' ;
2827
2928 // read pathname from parent if a URL
3029 // pathname taken to be part after leading "/"
@@ -35,10 +34,10 @@ export function resolveIfNotPlain (relUrl, parentUrl) {
3534 throwResolveError ( relUrl , parentUrl ) ;
3635 pathname = parentUrl ;
3736 }
38- else if ( parentUrl [ parentProtocol [ 0 ] . length + 1 ] === '/' ) {
37+ else if ( parentUrl [ parentProtocol . length + 1 ] === '/' ) {
3938 // resolving to a :// so we need to read out the auth and host
40- if ( parentProtocol [ 0 ] !== 'file:' ) {
41- pathname = parentUrl . substr ( parentProtocol [ 0 ] . length + 2 ) ;
39+ if ( parentProtocol !== 'file:' ) {
40+ pathname = parentUrl . substr ( parentProtocol . length + 2 ) ;
4241 pathname = pathname . substr ( pathname . indexOf ( '/' ) + 1 ) ;
4342 }
4443 else {
@@ -47,7 +46,7 @@ export function resolveIfNotPlain (relUrl, parentUrl) {
4746 }
4847 else {
4948 // resolving to :/ so pathname is the /... part
50- pathname = parentUrl . substr ( parentProtocol [ 0 ] . length + 1 ) ;
49+ pathname = parentUrl . substr ( parentProtocol . length + 1 ) ;
5150 }
5251
5352 if ( firstChar === '/' ) {
@@ -63,27 +62,27 @@ export function resolveIfNotPlain (relUrl, parentUrl) {
6362 var segmented = pathname . substr ( 0 , pathname . lastIndexOf ( '/' ) + 1 ) + relUrl ;
6463
6564 var output = [ ] ;
66- var segmentIndex = undefined ;
65+ var segmentIndex = - 1 ;
6766
6867 for ( var i = 0 ; i < segmented . length ; i ++ ) {
6968 // busy reading a segment - only terminate on '/'
70- if ( segmentIndex !== undefined ) {
69+ if ( segmentIndex !== - 1 ) {
7170 if ( segmented [ i ] === '/' ) {
72- output . push ( segmented . substr ( segmentIndex , i - segmentIndex + 1 ) ) ;
73- segmentIndex = undefined ;
71+ output . push ( segmented . substring ( segmentIndex , i + 1 ) ) ;
72+ segmentIndex = - 1 ;
7473 }
7574 continue ;
7675 }
7776
7877 // new segment - check if it is relative
7978 if ( segmented [ i ] === '.' ) {
8079 // ../ segment
81- if ( segmented [ i + 1 ] === '.' && ( segmented [ i + 2 ] === '/' || i === segmented . length - 2 ) ) {
80+ if ( segmented [ i + 1 ] === '.' && segmented [ i + 2 ] === '/' ) {
8281 output . pop ( ) ;
8382 i += 2 ;
8483 }
8584 // ./ segment
86- else if ( segmented [ i + 1 ] === '/' || i === segmented . length - 1 ) {
85+ else if ( segmented [ i + 1 ] === '/' ) {
8786 i += 1 ;
8887 }
8988 else {
@@ -106,8 +105,8 @@ export function resolveIfNotPlain (relUrl, parentUrl) {
106105 segmentIndex = i ;
107106 }
108107 // finish reading out the last segment
109- if ( segmentIndex !== undefined )
110- output . push ( segmented . substr ( segmentIndex , segmented . length - segmentIndex ) ) ;
108+ if ( segmentIndex !== - 1 )
109+ output . push ( segmented . substr ( segmentIndex ) ) ;
111110
112111 return parentUrl . substr ( 0 , parentUrl . length - pathname . length ) + output . join ( '' ) ;
113112 }
0 commit comments