KURL DOMFileSystemBase::createFileSystemURL(const String& fullPath) const { ASSERT(DOMFilePath::isAbsolute(fullPath)); if (type() == FileSystemTypeExternal) { // For external filesystem originString could be different from what we have // in m_filesystemRootURL. StringBuilder result; result.append("filesystem:"); result.append(getSecurityOrigin()->toString()); result.append('/'); result.append(externalPathPrefix); result.append(m_filesystemRootURL.path()); // Remove the extra leading slash. result.append(encodeWithURLEscapeSequences(fullPath.substring(1))); return KURL(ParsedURLString, result.toString()); } // For regular types we can just append the entry's fullPath to the // m_filesystemRootURL that should look like // 'filesystem:<origin>/<typePrefix>'. ASSERT(!m_filesystemRootURL.isEmpty()); KURL url = m_filesystemRootURL; // Remove the extra leading slash. url.setPath(url.path() + encodeWithURLEscapeSequences(fullPath.substring(1))); return url; }
TEST(KURLTest, Encode) { struct EncodeCase { const char* input; const char* output; } encode_cases[] = { {"hello, world", "hello%2C%20world"}, {"\x01\x02\x03\x04\x05\x06\x07\x08\x09\x0A\x0B\x0C\x0D\x0E\x0F", "%01%02%03%04%05%06%07%08%09%0A%0B%0C%0D%0E%0F"}, {"\x10\x11\x12\x13\x14\x15\x16\x17\x18\x19\x1A\x1B\x1C\x1D\x1E\x1F", "%10%11%12%13%14%15%16%17%18%19%1A%1B%1C%1D%1E%1F"}, {" !\"#$%&'()*+,-./", "%20!%22%23%24%25%26%27()*%2B%2C-./"}, {"0123456789:;<=>?", "0123456789%3A%3B%3C%3D%3E%3F"}, {"@ABCDEFGHIJKLMNO", "%40ABCDEFGHIJKLMNO"}, {"PQRSTUVWXYZ[\\]^_", "PQRSTUVWXYZ%5B%5C%5D%5E_"}, {"`abcdefghijklmno", "%60abcdefghijklmno"}, {"pqrstuvwxyz{|}~\x7f", "pqrstuvwxyz%7B%7C%7D~%7F"}, }; for (size_t i = 0; i < arraysize(encode_cases); i++) { String input(encode_cases[i].input); String expectedOutput(encode_cases[i].output); String output = encodeWithURLEscapeSequences(input); EXPECT_EQ(expectedOutput, output); } // Our encode escapes NULLs for safety, so we need to check that too. String input("\x00\x01", 2); String reference("%00%01"); String output = encodeWithURLEscapeSequences(input); EXPECT_EQ(reference, output); // Also test that it gets converted to UTF-8 properly. UChar wideInputHelper[3] = { 0x4f60, 0x597d, 0 }; String wideInput(reinterpret_cast<const ::UChar*>(wideInputHelper), 2); String wideReference("%E4%BD%A0%E5%A5%BD"); String wideOutput = encodeWithURLEscapeSequences(wideInput); EXPECT_EQ(wideReference, wideOutput); // Encoding should not NFC-normalize the string. // Contain a combining character ('e' + COMBINING OGONEK). String combining(String::fromUTF8("\x65\xCC\xA8")); EXPECT_EQ(encodeWithURLEscapeSequences(combining), "e%CC%A8"); // Contain a precomposed character corresponding to |combining|. String precomposed(String::fromUTF8("\xC4\x99")); EXPECT_EQ(encodeWithURLEscapeSequences(precomposed), "%C4%99"); }
void InspectorProfilerAgent::addStartProfilingMessageToConsole(const String& title, unsigned lineNumber, const String& sourceURL) { if (!m_frontend) return; String message = makeString("Profile \"webkit-profile://", CPUProfileType, '/', encodeWithURLEscapeSequences(title), "#0\" started."); m_consoleAgent->addMessageToConsole(JSMessageSource, LogMessageType, LogMessageLevel, message, lineNumber, sourceURL); }
void InspectorProfilerAgent::addProfileFinishedMessageToConsole(PassRefPtr<ScriptProfile> prpProfile, unsigned lineNumber, const String& sourceURL) { RefPtr<ScriptProfile> profile = prpProfile; String title = profile->title(); String message = makeString("Profile \"webkit-profile://", CPUProfileType, '/', encodeWithURLEscapeSequences(title), '#', String::number(profile->uid()), "\" finished."); m_inspectorController->addMessageToConsole(JSMessageSource, LogMessageType, LogMessageLevel, message, lineNumber, sourceURL); }
void InspectorClientImpl::saveSettings() { String data; for (SettingsMap::iterator it = m_settings->begin(); it != m_settings->end(); ++it) { String name = encodeWithURLEscapeSequences(it->first); String value = it->second; String entry = String::format( "%s:string:%s", name.utf8().data(), encodeWithURLEscapeSequences(value).utf8().data()); data.append(entry); data.append("\n"); } m_inspectedWebView->setInspectorSettings(data); if (m_inspectedWebView->client()) m_inspectedWebView->client()->didUpdateInspectorSettings(); }
String DragData::asURL(String*) const { if (!m_platformDragData) return String(); QList<QUrl> urls = m_platformDragData->urls(); if (urls.isEmpty()) return String(); return encodeWithURLEscapeSequences(urls.first().toString()); }
KURL BlobURL::createBlobURL(const String& originString) { ASSERT(!originString.isEmpty()); if (originString == "null") return KURL(); String urlString = kBlobProtocol; urlString += ":"; urlString += encodeWithURLEscapeSequences(originString); urlString += "/"; urlString += createCanonicalUUIDString(); return KURL(ParsedURLString, urlString); }
void WebContextMenuClient::searchWithGoogle(const Frame* frame) { String searchString = frame->editor()->selectedText(); searchString.stripWhiteSpace(); String encoded = encodeWithURLEscapeSequences(searchString); encoded.replace("%20", "+"); String url = "http://www.google.com/search?q=" + encoded + "&ie=UTF-8&oe=UTF-8"; if (Page* page = frame->page()) { UserGestureIndicator indicator(DefinitelyProcessingNewUserGesture); page->mainFrame()->loader()->urlSelected(KURL(ParsedURLString, url), String(), 0, false, false, MaybeSendReferrer); } }
void WebContextMenuClient::searchWithGoogle(const Frame* frame) { String searchString = frame->editor().selectedText(); searchString.stripWhiteSpace(); String encoded = encodeWithURLEscapeSequences(searchString); encoded.replace("%20", "+"); String url = "http://www.google.com/search?q=" + encoded + "&ie=UTF-8&oe=UTF-8"; if (Page* page = frame->page()) { UserGestureIndicator indicator(DefinitelyProcessingUserGesture); page->mainFrame().loader().urlSelected(URL(ParsedURLString, url), String(), 0, LockHistory::No, LockBackForwardList::No, MaybeSendReferrer, ShouldOpenExternalURLsPolicy::ShouldNotAllow); } }
void ContextMenuClientMg::searchWithGoogle(const Frame* frame) { String searchString = frame->selectedText(); searchString.stripWhiteSpace(); String encoded = encodeWithURLEscapeSequences(searchString); encoded.replace("%20", "+"); String url("http://www.google.com/search?q="); url.append(encoded); url.append("&ie=UTF-8&oe=UTF-8"); ResourceRequest request = ResourceRequest(url); if (Page* page = frame->page()) page->mainFrame()->loader()->urlSelected(request, String(), 0, false, false, true, SendReferrer); }
void ResourceHandleManager::startJob(ResourceHandle* job) { KURL kurl = job->request().url(); if (kurl.protocolIs("data")) { parseDataUrl(job); return; } initializeHandle(job); m_runningJobs++; CURLMcode ret = curl_multi_add_handle(m_curlMultiHandle, job->getInternal()->m_handle); // don't call perform, because events must be async // timeout will occur and do curl_multi_perform if (ret && ret != CURLM_CALL_MULTI_PERFORM) { #ifndef NDEBUG printf("Error %d starting job %s\n", ret, encodeWithURLEscapeSequences(job->request().url().string()).latin1().data()); #endif job->cancel(); return; } }
String substituteVariableReferences(const String& reference, Document* document, WMLVariableEscapingMode escapeMode) { ASSERT(document); if (reference.isEmpty()) return reference; WMLPageState* pageState = wmlPageStateForDocument(document); if (!pageState) return reference; bool isValid = true; String remainingInput = reference; String result; while (!remainingInput.isEmpty()) { ASSERT(isValid); int start = remainingInput.find("$"); if (start == -1) { // Consume all remaining characters, as there's nothing more to substitute result += remainingInput; break; } // Consume all characters until the variable reference beginning result += remainingInput.left(start); remainingInput.remove(0, start); // Transform adjacent dollar signs into a single dollar sign as string literal if (remainingInput[1] == '$') { result += "$"; remainingInput.remove(0, 2); continue; } String variableName; String conversionMode; if (remainingInput[1] == '(') { int referenceEndPosition = remainingInput.find(")"); if (referenceEndPosition == -1) { isValid = false; break; } variableName = remainingInput.substring(2, referenceEndPosition - 2); remainingInput.remove(0, referenceEndPosition + 1); // Determine variable conversion mode string int pos = variableName.find(':'); if (pos != -1) { conversionMode = variableName.substring(pos + 1, variableName.length() - (pos + 1)); variableName = variableName.left(pos); } } else { int length = remainingInput.length(); int referenceEndPosition = 1; for (; referenceEndPosition < length; ++referenceEndPosition) { if (!isValidVariableNameCharacter(remainingInput[referenceEndPosition])) break; } variableName = remainingInput.substring(1, referenceEndPosition - 1); remainingInput.remove(0, referenceEndPosition); } isValid = isValidVariableName(variableName); if (!isValid) break; ASSERT(!variableName.isEmpty()); String variableValue = pageState->getVariable(variableName); if (variableValue.isEmpty()) continue; if (containsVariableReference(variableValue, isValid)) { if (!isValid) break; variableValue = substituteVariableReferences(variableValue, document, escapeMode); continue; } if (!conversionMode.isEmpty()) { // Override default escape mode, if desired WMLVariableEscapingMode specifiedEscapeMode = WMLVariableEscapingNone; if ((isValid = isValidVariableEscapingModeString(conversionMode, specifiedEscapeMode))) escapeMode = specifiedEscapeMode; if (!isValid) break; } switch (escapeMode) { case WMLVariableEscapingNone: break; case WMLVariableEscapingEscape: variableValue = encodeWithURLEscapeSequences(variableValue); break; case WMLVariableEscapingUnescape: variableValue = decodeURLEscapeSequences(variableValue); break; } result += variableValue; ASSERT(isValid); } if (!isValid) { reportWMLError(document, WMLErrorInvalidVariableReference); return reference; } return result; }
void SpeechGrammarList::addFromString(const String& string, double weight) { String urlString = String("data:application/xml,") + encodeWithURLEscapeSequences(string); m_grammars.append(SpeechGrammar::create(KURL(KURL(), urlString), weight)); }
void InspectorProfilerAgent::addStartProfilingMessageToConsole(const String& title, unsigned lineNumber, const String& sourceURL) { String message = String::format("Profile \"webkit-profile://%s/%s#0\" started.", CPUProfileType, encodeWithURLEscapeSequences(title).utf8().data()); m_inspectorController->addMessageToConsole(JSMessageSource, LogMessageType, LogMessageLevel, message, lineNumber, sourceURL); }
void InspectorProfilerAgent::addProfileFinishedMessageToConsole(PassRefPtr<ScriptProfile> prpProfile, unsigned lineNumber, const String& sourceURL) { RefPtr<ScriptProfile> profile = prpProfile; String title = profile->title(); String message = String::format("Profile \"webkit-profile://%s/%s#%d\" finished.", CPUProfileType, encodeWithURLEscapeSequences(title).utf8().data(), profile->uid()); m_inspectorController->addMessageToConsole(JSMessageSource, LogMessageType, LogMessageLevel, message, lineNumber, sourceURL); }
KURL BlobURL::createBlobURL(const String& originString) { ASSERT(!originString.isEmpty()); String urlString = "blob:" + encodeWithURLEscapeSequences(originString) + '/' + createCanonicalUUIDString(); return KURL::createIsolated(ParsedURLString, urlString); }