ParsedURL::ParsedURL(const ParsedURL& base, const String& relative, URLQueryCharsetConverter* queryCharsetConverter) { if (!base.isValid()) return; unsigned relativeLength = relative.length(); if (!relativeLength) { *this = base.withoutFragment(); return; } RawURLBuffer<char> outputBuffer; const CString& baseStr = base.m_spec.m_string.utf8(); bool isValid = false; if (relative.is8Bit()) isValid = URLUtilities::resolveRelative(baseStr.data(), base.m_segments, reinterpret_cast<const char*>(relative.characters8()), relativeLength, queryCharsetConverter, outputBuffer, &m_segments); else isValid = URLUtilities::resolveRelative(baseStr.data(), base.m_segments, relative.characters16(), relativeLength, queryCharsetConverter, outputBuffer, &m_segments); if (isValid) m_spec = URLString(String(outputBuffer.data(), outputBuffer.length())); }
ParsedURL::ParsedURL(const String& urlString, ParsedURLStringTag) { unsigned urlStringLength = urlString.length(); if (!urlStringLength) return; // FIXME: we should ASSERT on this, but people use KURL incorrectly with ParsedURLStringTag :(. RawURLBuffer<char> outputBuffer; String base; const CString& baseStr = base.utf8(); bool isValid = false; URLSegments baseSegments; // FIXME: we should take shortcuts here! We do not have to resolve the relative part. if (urlString.is8Bit()) isValid = URLUtilities::resolveRelative(baseStr.data(), baseSegments, reinterpret_cast<const char*>(urlString.characters8()), urlStringLength, /* charsetConverter */ 0, outputBuffer, &m_segments); else isValid = URLUtilities::resolveRelative(baseStr.data(), baseSegments, urlString.characters16(), urlStringLength, /* charsetConverter */ 0, outputBuffer, &m_segments); // FIXME: we should ASSERT on isValid, but people use KURL incorrectly with ParsedURLStringTag :(. if (isValid) m_spec = URLString(String(outputBuffer.data(), outputBuffer.length())); }
ParsedURL::ParsedURL(const String& urlString, URLQueryCharsetConverter* queryCharsetConverter) { unsigned urlStringLength = urlString.length(); if (!urlStringLength) return; RawURLBuffer<char> outputBuffer; String base; const CString& baseStr = base.utf8(); bool isValid = false; URLSegments baseSegments; // FIXME: we should take shortcuts here! We do not have to resolve the relative part. if (urlString.is8Bit()) isValid = URLUtilities::resolveRelative(baseStr.data(), baseSegments, reinterpret_cast<const char*>(urlString.characters8()), urlStringLength, queryCharsetConverter, outputBuffer, &m_segments); else isValid = URLUtilities::resolveRelative(baseStr.data(), baseSegments, urlString.characters16(), urlStringLength, queryCharsetConverter, outputBuffer, &m_segments); if (isValid) m_spec = URLString(String(outputBuffer.data(), outputBuffer.length())); }
ParsedURL::ParsedURL(const ParsedURL& base, const String& relative) { if (!base.isValid()) return; if (relative.isEmpty()) { *this = base.withoutFragment(); return; } // FIXME: handle invalid URLs. const String& baseString = base.m_spec.string(); RawURLBuffer<char, 1024> outputBuffer; if (relative.is8Bit()) { if (baseString.is8Bit()) { URLParser<LChar, LChar>::parseURLWithBase(relative.characters8(), relative.length(), baseString.characters8(), baseString.length(), base.m_segments, outputBuffer, m_segments); } else { URLParser<LChar, UChar>::parseURLWithBase(relative.characters8(), relative.length(), baseString.characters16(), baseString.length(), base.m_segments, outputBuffer, m_segments); } } else { if (baseString.is8Bit()) { URLParser<UChar, LChar>::parseURLWithBase(relative.characters16(), relative.length(), baseString.characters8(), baseString.length(), base.m_segments, outputBuffer, m_segments); } else { URLParser<UChar, UChar>::parseURLWithBase(relative.characters16(), relative.length(), baseString.characters16(), baseString.length(), base.m_segments, outputBuffer, m_segments); } } m_spec = URLString(String(outputBuffer.data(), outputBuffer.length())); }