browsercore/core/wrtbrowsercontainer.cpp
changeset 16 3c88a81ff781
parent 12 afcd8e6d025b
--- a/browsercore/core/wrtbrowsercontainer.cpp	Thu Sep 23 15:32:11 2010 -0400
+++ b/browsercore/core/wrtbrowsercontainer.cpp	Fri Oct 15 17:30:59 2010 -0400
@@ -38,15 +38,44 @@
 #include <QWebFrame>
 #include <QGraphicsWebView>
 
+#ifdef QT_GEOLOCATION
+#include "geolocationManager.h"
+
+/* Declare the user defined meta type for use with QVariant in geolocation. */
+Q_DECLARE_METATYPE(QWebPage::PermissionPolicy);
+#endif // QT_GEOLOCATION
+
 QDataStream &operator<<(QDataStream &out, const WebPageData &myObj)
 {
-   out << myObj.m_thumbnail << myObj.m_zoomFactor << myObj.m_contentsPos;
+    out << myObj.magic
+        << myObj.minScale
+        << myObj.maxScale
+        << myObj.userScalable
+        << myObj.initialScale
+        << myObj.rect
+        << myObj.webViewRect
+        << myObj.scale
+        << myObj.viewportSize
+        << myObj.specifiedWidth
+        << myObj.specifiedHeight
+        << myObj.fitToScreen;
    return out;
 }
 
 QDataStream &operator>>(QDataStream &in, WebPageData &myObj)
 {
-   in >> myObj.m_thumbnail >> myObj.m_zoomFactor >> myObj.m_contentsPos;
+    in >> myObj.magic
+       >> myObj.minScale
+       >> myObj.maxScale
+       >> myObj.userScalable
+       >> myObj.initialScale
+       >> myObj.rect
+       >> myObj.webViewRect
+       >> myObj.scale
+       >> myObj.viewportSize
+       >> myObj.specifiedWidth
+       >> myObj.specifiedHeight
+       >> myObj.fitToScreen;
    return in;
 }
 
@@ -109,11 +138,16 @@
 {
     
   settings()->setAttribute(QWebSettings::PluginsEnabled, true);
-  settings()->setAttribute(QWebSettings::JavascriptCanOpenWindows, !BEDROCK_PROVISIONING::BedrockProvisioning::createBedrockProvisioning()->value("PopupBlocking").toInt());
-	// Download related enable "forwardUnsupportedContent" to redirect unsupported content to download manager
+  BEDROCK_PROVISIONING::BedrockProvisioning * provisioning = BEDROCK_PROVISIONING::BedrockProvisioning::createBedrockProvisioning();
+  settings()->setAttribute(QWebSettings::JavascriptCanOpenWindows, !provisioning->value("PopupBlocking").toInt());
+
+  // Download related enable "forwardUnsupportedContent" to redirect unsupported content to download manager
 	setForwardUnsupportedContent(true);
 #ifdef BEDROCK_TILED_BACKING_STORE
-    settings()->setAttribute(QWebSettings::TiledBackingStoreEnabled, true);
+#ifndef OWN_BACKING_STORE
+	bool enableTiling = BEDROCK_PROVISIONING::BedrockProvisioning::createBedrockProvisioning()->value("EnableTiling").toBool(); 
+    settings()->setAttribute(QWebSettings::TiledBackingStoreEnabled, enableTiling);
+#endif // OWN_BACKING_STORE
     settings()->setAttribute(QWebSettings::ZoomTextOnly, false);
     settings()->setAttribute(QWebSettings::FrameFlatteningEnabled, true);
 
@@ -123,11 +157,17 @@
     //of the current viewport (centered to the viewport) with tiles and would drop tiles
     //after they are outside an area 2x the width and 2.5x the height of the viewport.
     //Refer https://bugs.webkit.org/show_bug.cgi?id=39874
-
-    setProperty("_q_TiledBackingStoreTileSize", QSize(256, 256));
-    setProperty("_q_TiledBackingStoreTileCreationDelay", 25);
-    setProperty("_q_TiledBackingStoreCoverAreaMultiplier", QSizeF(1.5, 1.5));
-    setProperty("_q_TiledBackingStoreKeepAreaMultiplier", QSizeF(2., 2.5));
+    
+    BEDROCK_PROVISIONING::BedrockProvisioning* brSettings = BEDROCK_PROVISIONING::BedrockProvisioning::createBedrockProvisioning();
+    int tileW = brSettings->value("TilesWidth").toInt();
+    int tileH = brSettings->value("TilesHeight").toInt();
+    int tileCreationDelay = brSettings->value("TileCreationDelay").toInt();
+    qreal coverAreaMultiplier = brSettings->value("TileCoverAreaMultiplier").toDouble();
+    qreal keepAreaMultiplier = brSettings->value("TileKeepAreaMultiplier").toDouble();
+    setProperty("_q_TiledBackingStoreTileSize", QSize(tileW, tileH));
+    setProperty("_q_TiledBackingStoreTileCreationDelay", tileCreationDelay);
+    setProperty("_q_TiledBackingStoreCoverAreaMultiplier", QSizeF(coverAreaMultiplier, coverAreaMultiplier));
+    setProperty("_q_TiledBackingStoreKeepAreaMultiplier", QSizeF(keepAreaMultiplier, keepAreaMultiplier));
 #endif
 
 #ifndef NO_NETWORK_ACCESS_MANAGER	
@@ -146,8 +186,17 @@
     connect(this, SIGNAL(loadProgress(int)), d->m_loadController, SLOT(loadProgress(int)));
     connect(this, SIGNAL(loadFinished(bool)), d->m_loadController, SLOT(loadFinished(bool)));
     connect(mainFrame(), SIGNAL(urlChanged(QUrl)), d->m_loadController, SLOT(urlChanged(QUrl)));
-	connect(mainFrame(), SIGNAL(initialLayoutCompleted()), d->m_loadController, SLOT(initialLayoutCompleted()));
+    connect(mainFrame(), SIGNAL(initialLayoutCompleted()), d->m_loadController, SLOT(initialLayoutCompleted()));
+	  
+#ifdef QT_GEOLOCATION 
+    d->m_geolocationManager = GeolocationManager::getSingleton();
     
+    /* Register user defined Meta Types used in geolocation API. */
+    qRegisterMetaType<QWebPage::PermissionPolicy>("QWebPage::PermissionPolicy");
+    /* Connect the geolocation permission signal to the geolocation handler. */
+    connect(this, SIGNAL(requestPermissionFromUser(QWebFrame*, QWebPage::PermissionDomain)),
+        this, SLOT(handleRequestPermissionFromUser(QWebFrame*, QWebPage::PermissionDomain)));
+#endif // QT_GEOLOCATION
 }
 
 /*!
@@ -212,14 +261,51 @@
 }
 
 /*!
- * This function page thumbnail for this page as specified by X & Y co-ordinate scale factors
+ *  This function returns a thumbnail image for this page as specified by X & Y co-ordinate scale factors
  * @param  scaleX :  X Co-ordinate scale factor for the page thumbnail
  * @param  scaleY :  y Co-ordinate scale factor for the page thumbnail
  */
+QImage WrtBrowserContainer::thumbnail(QSize s)
+{
+    QImage image(s, QImage::Format_RGB32);
+    qreal fitWidth = s.width();
+    QPoint renderPos(0, 0);
+    WebPageData* d = pageZoomMetaData();
+    qreal scale = 1.0;
+    if(d->isValid())
+    {
+        fitWidth = d->rect.width();
+        if(fitWidth > d->webViewRect.width() * d->scale)
+            fitWidth = d->webViewRect.width() * d->scale;
+        renderPos = d->webViewRect.topLeft().toPoint();
+        scale = s.width() / (fitWidth / d->scale);
+    }
+
+    if (image.isNull()) {
+        return QImage();
+    }
+    QPainter painter(&image);
+    QRect r(QPoint(0,0),s);
+    QRegion clip(r);
+    painter.setBrush(Qt::white);
+    painter.fillRect(r,Qt::white);
+
+    QTransform transform;
+    transform.scale(scale,scale);
+    renderPos /= scale;
+    transform.translate(renderPos.x(),renderPos.y());
+    painter.setTransform(transform);
+
+    mainFrame()->render(&painter);
+    return image;
+}
 QImage WrtBrowserContainer::pageThumbnail(qreal scaleX, qreal scaleY)
 {
-    qDebug() << "WrtBrowserContainer::pageThumbnail:" << webWidget()->size();
-    QSize size = webWidget()->size().toSize();
+    #ifdef Q_WS_MAEMO_5
+    QSize size(800,424);
+    #else
+    QSize size(640,360);
+    #endif
     QImage image(size, QImage::Format_RGB32);
 
     QPainter painter(&image);
@@ -229,8 +315,11 @@
     painter.setBrush(Qt::white);
     painter.drawRect(r);
     painter.restore();
+    qreal saveZoomFactor = mainFrame()->zoomFactor();
+    mainFrame()->setZoomFactor(1.0);
     mainFrame()->render(&painter, clip);
-    QImage thumbnail = image.scaled(scaleX * size.width(), scaleY * size.height());
+    mainFrame()->setZoomFactor(saveZoomFactor);
+    QImage thumbnail = image.scaled(scaleX * size.width(), scaleY * size.height(),Qt::KeepAspectRatio,Qt::SmoothTransformation);
     return thumbnail;
 }
 
@@ -255,8 +344,9 @@
         return;
     }
     if (restoreSession()) return;
-    	
-    WebPageData data(this);
+
+//    item->setUserData(QVariant::fromValue(d->m_zoomData));
+/*    WebPageData data(this);
     //   WebPageData data = item->userData().value<WebPageData>();
     data.m_zoomFactor = 1.0; // Need to find a way to get this.  Not used right now anyway
     data.m_thumbnail = pageThumbnail(0.5, 0.5);//data.m_zoomFactor, data.m_zoomFactor);
@@ -267,7 +357,7 @@
     data.m_contentsPos = pos;
     QVariant variant;
     variant.setValue(data);
-    item->setUserData(variant);
+    item->setUserData(variant); */
     //ii++;
 }
 
@@ -304,6 +394,62 @@
     }
 }
 
+#ifdef QT_GEOLOCATION
+void WrtBrowserContainer::handleRequestPermissionFromUser(QWebFrame* frame, QWebPage::PermissionDomain permissionDomain)
+{
+    QList<QVariant> attributes;
+    QUrl baseUrl = frame->baseUrl();
+    QString domain = baseUrl.host();
+    
+    qDebug() << "handleRequestPermissionFromUser";
+    
+    // Check if the domian from the frame already exisit in the database
+    attributes = d->m_geolocationManager->findGeodomain(domain);
+    
+    if (!attributes.isEmpty())
+    {
+        QWebPage::PermissionPolicy permission
+            = attributes.at(0).value<QWebPage::PermissionPolicy>();
+       
+        setUserPermission(frame, permissionDomain, permission);
+    }
+    else
+    {
+        // If the domain is empty string, provide whole base url
+        if (domain == "")
+            domain = baseUrl.toString();
+	          
+        emit requestGeolocationPermission(frame, permissionDomain, domain);
+    }
+}
+
+void WrtBrowserContainer::setGeolocationPermission(QWebFrame* frame, QWebPage::PermissionDomain permissionDomain, 
+	       bool permissionGranted, bool saveSetting)
+{
+    QWebPage::PermissionPolicy permission = QWebPage::PermissionUnknown;
+    	
+    if (permissionGranted == true)
+        permission = QWebPage::PermissionGranted;
+    else
+        permission = QWebPage::PermissionDenied;
+	  	  	
+    setUserPermission(frame, permissionDomain, permission);
+    
+    // save the geolocation permission setting (granted/denied) in the data base
+    if (saveSetting)
+    {
+        QUrl baseUrl = frame->baseUrl();
+        QString domain = baseUrl.host();
+	      
+        // If the domain is empty string, provide whole base url
+        if (domain == "")
+            domain = baseUrl.toString();
+	          
+        d->m_geolocationManager->addGeodomain(domain, permission);
+    }
+}
+#endif // QT_GEOLOCATION 
+
 void WrtBrowserContainer::setPageFactory(BrowserPageFactory* f)
 {
     d->m_pageFactory = f;
@@ -358,13 +504,23 @@
     return result;
 }
 
-ZoomMetaData WrtBrowserContainer::pageZoomMetaData() {
-    return d->m_zoomData ;
+WebPageData* WrtBrowserContainer::pageZoomMetaData()
+{
+    QVariant userData = history()->currentItem().userData();
+    QVariant::Type t = userData.type();
+    int ut = userData.userType();
 
+    if(userData.isValid() && t == QVariant::UserType &&
+       ut == QMetaTypeId<WebPageData>::qt_metatype_id())
+       return (WebPageData*)(history()->currentItem().userData().constData());
+    else {
+        static WebPageData dummyData;
+        return &dummyData;
+    }
 }
-void WrtBrowserContainer::setPageZoomMetaData( ZoomMetaData  zoomData ){
 
-    d->m_zoomData = zoomData;
+void WrtBrowserContainer::setPageZoomMetaData(const WebPageData &zoomData ){
+    history()->currentItem().setUserData(qVariantFromValue(zoomData));
 }
 
 
@@ -420,6 +576,11 @@
     return wrtPage;
 }
 
+void WrtBrowserContainer::requestPageDataUpdate()
+{
+    QWebHistoryItem i = history()->currentItem();
+    emit saveFrameStateRequested(mainFrame(),&i);
+}
 
 } // namespace WRT