407 if (isSchemeFirstChar(*p)) { 408 ++p; 409 while (isSchemeChar(*p)) { 410 ++p; 411 } 412 if (*p == ':') { 413 if (p[1] != '/' && equalIgnoringCase(base.protocol(), String(str, p - str)) && base.isHierarchical()) 414 str = p + 1; 415 else 416 absolute = true; 417 } 418 } 419 420 CharBuffer parseBuffer; 421 422 if (absolute) { 423 parse(str, &relative); 424 } else { 425 // If the base is empty or opaque (e.g. data: or javascript:), then the URL is invalid 426 // unless the relative URL is a single fragment. 427 if (!base.isHierarchical()) { 428 if (str[0] == '#') { 429 appendASCII(base.m_string.left(base.m_queryEnd), str, len, parseBuffer); 430 parse(parseBuffer.data(), &relative); 431 #if PLATFORM(JAVA) 432 } else if(base.isJarFile()) { 433 appendASCII(base.m_string.left(base.m_pathAfterLastSlash), str, len, parseBuffer); 434 parse(parseBuffer.data(), &relative); 435 #endif 436 } else { 437 m_string = relative; 438 invalidate(); 439 } 440 return; 441 } 442 443 switch (str[0]) { 444 case '\0': 445 // The reference is empty, so this is a reference to the same document with any fragment identifier removed. 446 *this = base; 447 removeFragmentIdentifier(); 448 break; 449 case '#': { 450 // must be fragment-only reference 451 appendASCII(base.m_string.left(base.m_queryEnd), str, len, parseBuffer); 452 parse(parseBuffer.data(), &relative); 453 break; 454 } 455 case '?': { | 407 if (isSchemeFirstChar(*p)) { 408 ++p; 409 while (isSchemeChar(*p)) { 410 ++p; 411 } 412 if (*p == ':') { 413 if (p[1] != '/' && equalIgnoringCase(base.protocol(), String(str, p - str)) && base.isHierarchical()) 414 str = p + 1; 415 else 416 absolute = true; 417 } 418 } 419 420 CharBuffer parseBuffer; 421 422 if (absolute) { 423 parse(str, &relative); 424 } else { 425 // If the base is empty or opaque (e.g. data: or javascript:), then the URL is invalid 426 // unless the relative URL is a single fragment. 427 #if PLATFORM(JAVA) 428 if (!base.isHierarchical() && !base.isJarFile()) { 429 #else 430 if (!base.isHierarchical()) { 431 #endif 432 if (str[0] == '#') { 433 appendASCII(base.m_string.left(base.m_queryEnd), str, len, parseBuffer); 434 parse(parseBuffer.data(), &relative); 435 } else { 436 m_string = relative; 437 invalidate(); 438 } 439 return; 440 } 441 442 switch (str[0]) { 443 case '\0': 444 // The reference is empty, so this is a reference to the same document with any fragment identifier removed. 445 *this = base; 446 removeFragmentIdentifier(); 447 break; 448 case '#': { 449 // must be fragment-only reference 450 appendASCII(base.m_string.left(base.m_queryEnd), str, len, parseBuffer); 451 parse(parseBuffer.data(), &relative); 452 break; 453 } 454 case '?': { |