Esempio n. 1
0
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;
}
Esempio n. 2
0
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");
}
Esempio n. 3
0
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);
}
Esempio n. 4
0
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();
}
Esempio n. 6
0
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);
    }
}
Esempio n. 9
0
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);
    }
}
Esempio n. 10
0
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);
}
Esempio n. 11
0
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;
    }
}
Esempio n. 12
0
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));
}
Esempio n. 14
0
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);
}
Esempio n. 15
0
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);
}
Esempio n. 16
0
KURL BlobURL::createBlobURL(const String& originString)
{
    ASSERT(!originString.isEmpty());
    String urlString = "blob:" + encodeWithURLEscapeSequences(originString) + '/' + createCanonicalUUIDString();
    return KURL::createIsolated(ParsedURLString, urlString);
}