diff -r 6aeb7a756187 -r 3c88a81ff781 browsercore/appfw/Api/Common/UiUtil.cpp --- a/browsercore/appfw/Api/Common/UiUtil.cpp Thu Sep 23 15:32:11 2010 -0400 +++ b/browsercore/appfw/Api/Common/UiUtil.cpp Fri Oct 15 17:30:59 2010 -0400 @@ -20,6 +20,8 @@ */ #include +#include +#include #include "UiUtil.h" #define GOOGLE_SEARCH_ENGINE "http://www.google.com/search?q=" @@ -52,48 +54,117 @@ QUrl UiUtil::searchUrl(const QString &string) { - QString urlStr = string.trimmed(); - QUrl url(QLatin1String(GOOGLE_SEARCH_ENGINE) + urlStr, QUrl::TolerantMode); + QUrl url = searchUrlWithoutCheck(string); if(url.isValid()) - return url; + return url; else return QUrl(); } +QUrl UiUtil::searchUrlWithoutCheck(const QString &string) +{ + QString urlStr = string.trimmed(); + QString urlStrEncoded = QUrl::toPercentEncoding(string); + QUrl url(QLatin1String(GOOGLE_SEARCH_ENGINE) + urlStrEncoded, QUrl::TolerantMode); + return url; +} + +QUrl UiUtil::encodeQueryItems(QUrl& url, bool encodeNonAscii) +{ + QList< QPair > queryItems = url.queryItems(); + if (queryItems.size() != 0) { + QString urlStr = url.toString(); + int queryIndex = urlStr.indexOf("?"); + int queryLength = urlStr.length() - queryIndex - 1; + Q_ASSERT(queryIndex != -1 && queryLength >= 0); + urlStr = urlStr.right(queryLength); + + QString queryStr; + bool hasValidQuery = false; + QStringList queryList = urlStr.split("&"); + //qDebug() << "queryList!!!!!!!!!!!!!!!:" << queryList; + for(int i = 0; i < queryList.size(); i++) { + QString query = queryList.at(i); + //qDebug() << "query!!!!!!!!!!!!:" << query; + + if (query.isEmpty()) { + if ((i == queryList.size() - 1) && queryList.at(i - 1).isEmpty()) // "&&" ==> ["","",""] ==> "%25%25" + continue; + queryStr += QUrl::toPercentEncoding("&"); // encode '&' since it is a part of the query text + } else { + int delimiterIndex = query.indexOf("="); + if (delimiterIndex == -1 || delimiterIndex == 0) { + // it is not a valid query, instead, it is a part of query + if (hasValidQuery) + queryStr += QUrl::toPercentEncoding("&"); // encode '&' since it is a part of the query text + queryStr += encodeNonAscii ? QUrl::toPercentEncoding(query, "%") : query; // "q=a&dc$da" ==> ["q=a","dc$da"] ==> for "dc$da", it is a part of the last query + } + else { + // it is a valid query, close last query before add a new one + // "q=a=c&z=dcda" ==> ["q=a=c","z=dcda"] ==> for "q=a=c", "q" is the key and "a=c" is the value + if (hasValidQuery) + queryStr += "&"; // don't encode this '&' since it is a part of the query delimiter + QString key = encodeNonAscii ? QUrl::toPercentEncoding(query.left(delimiterIndex), "%") : query.left(delimiterIndex); + QString value = encodeNonAscii ? QUrl::toPercentEncoding(query.right(query.length() - delimiterIndex - 1), "%") : query.right(query.length() - delimiterIndex - 1); + QString newQuery = key + "=" + value; + queryStr += newQuery; + hasValidQuery = true; + } + } + + } + QUrl encodedUrl = QUrl(url.toString().left(queryIndex + 1) + queryStr); + return encodedUrl; + //qDebug() << "new query url ---> " << url.toString(); + } + + return url; +} + QUrl UiUtil::guessUrlFromString(const QString &string) { QString urlStr = string.trimmed(); QRegExp schemaTest(QLatin1String("^[a-zA-Z]+\\:.*")); + QRegExp fileTest(QLatin1String("^[a-zA-Z]:/.*")); + + //remove new line character + if (urlStr.contains("\n")) + urlStr.replace(QLatin1String("\n"), QLatin1String("")); // Check if it looks like a qualified URL. Try parsing it and see. bool hasSchema = schemaTest.exactMatch(urlStr); + bool isFileUrl = fileTest.exactMatch(urlStr); bool hasSpaces = urlStr.contains(" "); + + // Is it a file path (ex. "c:/data/test.html")? + if (isFileUrl) { + if (QFile::exists(urlStr)) { + return QUrl::fromLocalFile(urlStr); + } + } + if (hasSchema) { if(!hasSpaces){ - QUrl url(urlStr, QUrl::TolerantMode); - if (url.isValid()) - return url; - } - else{ - if(urlStr.contains("https://")){ - urlStr.remove("https://" ,Qt::CaseInsensitive); - } - else if(urlStr.contains("http://")){ - urlStr.remove("http://" ,Qt::CaseInsensitive); - } - else if(urlStr.contains("rtsp://")){ - urlStr.remove("rtsp://" ,Qt::CaseInsensitive); - } - QUrl url(QLatin1String(GOOGLE_SEARCH_ENGINE) + urlStr, QUrl::TolerantMode); - if(url.isValid()) - return url; - } + QUrl url(urlStr, QUrl::TolerantMode); + if (url.isValid()) + return encodeQueryItems(url, false); + } + else{ + if(urlStr.contains("https://")){ + urlStr.remove("https://" ,Qt::CaseInsensitive); + } + else if(urlStr.contains("http://")){ + urlStr.remove("http://" ,Qt::CaseInsensitive); + } + else if(urlStr.contains("rtsp://")){ + urlStr.remove("rtsp://" ,Qt::CaseInsensitive); + } + QUrl url = searchUrlWithoutCheck(urlStr); + if(url.isValid()) + return url; + } } - // Might be a file. - if (hasSchema) { - if (QFile::exists(urlStr)) - return QUrl::fromLocalFile(urlStr); - } + // Might be a shorturl - try to detect the schema. if (!hasSchema) { int dotIndex = urlStr.indexOf(QLatin1Char('.')); @@ -101,25 +172,26 @@ QUrl url; urlStr.endsWith(".") ? ( url.setUrl(QLatin1String("http://") + urlStr + QLatin1String("com"), QUrl::TolerantMode) ) : ( url.setUrl(QLatin1String("http://") + urlStr, QUrl::TolerantMode) ); if (url.isValid()){ - return url; + return encodeQueryItems(url, false); } - //--Condition for Character DOT(.)-- + //--Condition for Character DOT(.)-- else { - QUrl url(QLatin1String(GOOGLE_SEARCH_ENGINE) + urlStr, QUrl::TolerantMode); + QUrl url = searchUrlWithoutCheck(urlStr); if(url.isValid()) return url; } } - //--The string parameter is simple text and a search should be performed. Like for Special Character :\ etc.-- - else { - QUrl url(QLatin1String(GOOGLE_SEARCH_ENGINE) + urlStr, QUrl::TolerantMode); + //--The string parameter is simple text and a search should be performed. Like for Special Character :\ etc.-- + else { + QUrl url = searchUrlWithoutCheck(urlStr); if(url.isValid()) return url; } } // Fall back to QUrl's own tolerant parser. - return QUrl(string, QUrl::TolerantMode); + QUrl url = QUrl(string, QUrl::TolerantMode); + return encodeQueryItems(url, false); } }