browsercore/appfw/Api/Common/UiUtil.cpp
changeset 16 3c88a81ff781
parent 12 afcd8e6d025b
--- 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 <QRegExp>
+#include <QDebug>
+#include <QStringList>
 #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<QString, QString> > 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);
 }
 
 }