ginebra2/emulator/browser.cpp
changeset 3 0954f5dd2cd0
parent 0 1450b09d0cfd
child 9 b39122337a00
--- a/ginebra2/emulator/browser.cpp	Fri May 14 15:40:36 2010 +0300
+++ b/ginebra2/emulator/browser.cpp	Tue Jun 29 00:46:29 2010 -0400
@@ -1,29 +1,33 @@
 /*
 * Copyright (c) 2010 Nokia Corporation and/or its subsidiary(-ies).
 * All rights reserved.
-* This component and the accompanying materials are made available
-* under the terms of "Eclipse Public License v1.0"
-* which accompanies this distribution, and is available
-* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* This program is free software: you can redistribute it and/or modify
+* it under the terms of the GNU Lesser General Public License as published by
+* the Free Software Foundation, version 2.1 of the License.
 *
-* Initial Contributors:
-* Nokia Corporation - initial contribution.
+* This program is distributed in the hope that it will be useful,
+* but WITHOUT ANY WARRANTY; without even the implied warranty of
+* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+* GNU Lesser General Public License for more details.
 *
-* Contributors:
+* You should have received a copy of the GNU Lesser General Public License
+* along with this program.  If not,
+* see "http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html/".
 *
-* Description: 
+* Description:
 *
 */
 
-
 #include "browser.h"
 #ifndef NO_QSTM_GESTURE
 #include "WebGestureHelper.h"
 #endif
+#include "../ChromeLayout.h"
 #include "../ChromeWidget.h"
 #include "HistoryFlowView.h"
 #include "WindowFlowView.h"
-#include "WrtPageManager.h"
+#include "webpagecontroller.h"
 #include "bedrockprovisioning.h"
 
 #include <QDebug>
@@ -40,16 +44,23 @@
 #endif
 #endif
 
-GinebraBrowser::GinebraBrowser(QObject * parent)
+GinebraBrowser::GinebraBrowser(QObject * parent, QString *url)
   : QObject(parent),
+    m_scene(new QGraphicsScene()),
     m_splashScreen(NULL)
 {
+  // The initial url to go to when the browser is called from another app
+  if (url != 0) {
+      m_initialUrl = *url;
+  }
   QString startUpChrome(BEDROCK_PROVISIONING::BedrockProvisioning::createBedrockProvisioning()->valueAsString("StartUpChrome"));
-  m_install = BEDROCK_PROVISIONING::BedrockProvisioning::createBedrockProvisioning()->valueAsString("ChromeBaseDirectory2")
+  m_install = BEDROCK_PROVISIONING::BedrockProvisioning::createBedrockProvisioning()->valueAsString("ChromeBaseDirectory")
       + startUpChrome.section('/', 0, -2) + "/";
   m_chromeUrl = startUpChrome.section('/', -1);
   m_contentUrl = BEDROCK_PROVISIONING::BedrockProvisioning::createBedrockProvisioning()->valueAsString("StartPage");
 
+  setApplicationNameVersion();
+
   //qDebug() << "GinebraBrowser::GinebraBrowser: " << m_install << " " << m_chromeUrl;
   //GVA::Settings * settings = GVA::Settings::instance();
   //settings->setInstallRoot(m_install);
@@ -64,6 +75,7 @@
   QString iconDBPath = homeDir.absolutePath() + "/favicon";
   QWebSettings::globalSettings()->setIconDatabasePath(iconDBPath);*/
 
+
 #ifdef _GVA_INSPECT_CHROME_
   QWebSettings * s = m_chrome->page()->settings();
   s->setAttribute(QWebSettings::DeveloperExtrasEnabled, true );
@@ -74,21 +86,21 @@
   connect(m_chrome->page(), SIGNAL(webInspectorTriggered(QWebElement)), inspector, SLOT(show()));
 #endif
   //Create a view onto the chrome
-  m_view = new GVA::ChromeView(m_chrome);
+  m_view = new GVA::ChromeView(m_scene, m_chrome);
 #ifndef NO_QSTM_GESTURE
   WebGestureHelper* gh = new WebGestureHelper(m_view);
   browserApp->setGestureHelper(gh);
   browserApp->setMainWindow(m_view);
   m_view->grabGesture(QStm_Gesture::assignedType());
 #endif
- 
-#ifdef Q_OS_SYMBIAN
-  m_view->showFullScreen(); 
+
+#if defined(Q_OS_SYMBIAN) || defined(Q_WS_MAEMO_5)
+  m_view->showFullScreen();
 #else
   m_view->setGeometry(0,0,360,640);
 #endif
 
-  showSplashScreen(); 
+  showSplashScreen();
 
 #ifndef __gva_no_chrome__
   QObject::connect(m_chrome, SIGNAL(internalChromeComplete()), this, SLOT(onChromeComplete()));
@@ -103,17 +115,20 @@
 #endif
 #else
   onChromeComplete();
-  
-#endif                     
+
+#endif
 
+  // Handle openUrl signals
+  connect(this, SIGNAL(openUrlRequested(QString)), this, SLOT(openUrl(QString)));
 }
 
-GinebraBrowser::~GinebraBrowser() 
+GinebraBrowser::~GinebraBrowser()
 {
-  delete m_chrome; 
+  delete m_chrome;
   delete WebPageController::getSingleton();
   delete m_view;
   destroySplashScreen();
+  delete m_scene;
 
 #ifndef NO_QSTM_GESTURE
   WebGestureHelper* gh = browserApp->gestureHelper();
@@ -146,7 +161,7 @@
     homeDir.rmdir("favicon");
 }
 */
-void GinebraBrowser::show() 
+void GinebraBrowser::show()
 {
   m_view->show();
 }
@@ -154,66 +169,130 @@
 void GinebraBrowser::onChromeComplete()
 {
 #ifndef __gva_no_chrome__
-  ControllableViewBase *windowView = WRT::WindowFlowView::createNew(m_chrome);
+  ControllableViewBase *windowView = WRT::WindowFlowView::createNew(m_chrome->layout());
   windowView->setObjectName("WindowView");
   m_chrome->addView(windowView);
+
+  ControllableViewBase *historyView = WRT::HistoryFlowView::createNew(m_chrome->layout());
+  historyView->setObjectName("HistoryView");
+  m_chrome->addView(historyView);
+
 #endif
   //Create a content window and add it to the chrome
   GVA::GWebContentView *content = new GVA::GWebContentView(m_chrome, 0, "WebView");
-
   //Load the initial content after the chrome loads. This makes sure that an initial bad
   //content page won't hang up rendering the chrome.
   m_chrome->addView(content);
-  
-  QString startPage = m_install + m_contentUrl;
-  qDebug() << "GinebraBrowser::onChromeComplete: startPage: " << startPage;
+
+  QString chromeBaseDir = BEDROCK_PROVISIONING::BedrockProvisioning::createBedrockProvisioning()->valueAsString("LocalPagesBaseDirectory");
+  QString startPage = chromeBaseDir + m_contentUrl;
 
   bool enabled = (bool) BEDROCK_PROVISIONING::BedrockProvisioning::createBedrockProvisioning()->valueAsInt("SaveSession");
-  if (enabled)
+
+  // If the browser was launched by some other app calling QDesktopServices.openUrl, go to that url
+  if (!m_initialUrl.isEmpty()) {
+      openUrl(m_initialUrl);
+  }
+  // Otherwise, load the previous page from history (if that option is enabled)
+  else if (enabled && m_initialUrl.isEmpty()) {
     WebPageController::getSingleton()->loadFromHistory();
-  else
+  }
+  // Otherwise, load the start page
+  else {
     content->loadUrlToCurrentPage(startPage);
-    
-#ifndef __gva_no_chrome__
-  WRT::HistoryFlowView *historyView = new WRT::HistoryFlowView(WrtPageManager::getSingleton(), m_chrome);
-  historyView->setObjectName("HistoryView");
-  m_chrome->addView(historyView);
-#endif
+  }
+
   m_chrome->showView("WebView");
   destroySplashScreen();
 }
 
+void GinebraBrowser::queueOpenUrl(QString url)
+{
+    emit openUrlRequested(url);
+}
+
+void GinebraBrowser::openUrl(QString url)
+{
+#ifdef Q_OS_SYMBIAN
+    // Handle the url as per the old standard at
+    // http://wiki.forum.nokia.com/index.php/TSS000340_-_Launching_the_Web_browser_on_S60_3rd_Edition_to_open_a_specified_URL
+    QChar urlType = url.at(0);
+    // Bookmark (by uid) - not handled
+    if (urlType == '1') {
+        return;
+    }
+    // Saved deck (by uid) - not handled
+    else if (urlType == '2') {
+        return;
+    }
+    // Start page - not handled
+    else if (urlType == '5') {
+        return;
+    }
+    // Bookmark folder (by uid) - not handled
+    else if (urlType == '6') {
+        return;
+    }
+    // Url or Url + space + access point
+    else if (urlType == '4') {
+        url = url.mid(2); // Get the real url
+        if (url.contains(' ')) { // Chop off the access point if there is one because it's not currently handled
+            url = url.left(url.indexOf(' '));
+        }
+    }
+    // If no number then it's just a plain url
+#endif /* Q_OS_SYMBIAN */
+    // Bring the browser to the front (QDesktopServices openurl is supposed to do this but doesn't)
+    if (m_view) {
+        m_view->activateWindow();
+        m_view->raise();
+    }
+    m_contentUrl = url;
+    WebPageController::getSingleton()->loadInitialUrlFromOtherApp(url);
+//    GVA::GWebContentView *webView = (GVA::GWebContentView *)m_chrome->getView("WebView");
+//    if (webView != 0) {
+//        m_contentUrl = url;
+//        webView->loadUrlToCurrentPage(url);
+//    }
+}
+
 void GinebraBrowser::showSplashScreen() {
   QString splashImage = BEDROCK_PROVISIONING::BedrockProvisioning::createBedrockProvisioning()->valueAsString("SplashImage");
-  QString baseDir = BEDROCK_PROVISIONING::BedrockProvisioning::createBedrockProvisioning()->valueAsString("ChromeBaseDirectory2");
-  QString imagePath =	baseDir + splashImage;
-  
-  qDebug() << "ChromeView::showSplashScreen: " << imagePath; 
-  if(!imagePath.isNull()) {
+  QString baseDir = BEDROCK_PROVISIONING::BedrockProvisioning::createBedrockProvisioning()->valueAsString("ChromeBaseDirectory");
+  QString imagePath =   baseDir + splashImage;
+
+  if (!imagePath.isNull()) {
     m_splashScreen = new QLabel(NULL);
     m_splashScreen->setAlignment(Qt::AlignCenter);
     m_splashScreen->setStyleSheet("background-color: #FFF");
     m_splashScreen->setPixmap(QPixmap(imagePath));
-    if(m_splashScreen->pixmap()->isNull()) {
+    if (m_splashScreen->pixmap()->isNull()) {
         ;//qDebug() << "ChromeView::chromeLoaded: ERROR splashscreen creation failed. " << imagePath;
     }
     else {
-        m_splashScreen->show();         			
-  			#ifdef Q_OS_SYMBIAN
-    			m_splashScreen->showFullScreen();
-    			m_view->showFullScreen(); 					
-				#else
-  				m_splashScreen->setGeometry(0,0,360,640);
-				#endif
+        m_splashScreen->show();
+            #ifdef Q_OS_SYMBIAN
+                m_splashScreen->showFullScreen();
+                m_view->showFullScreen();
+                #else
+                m_splashScreen->setGeometry(0,0,360,640);
+                #endif
     }
   }
 }
 
 void GinebraBrowser::destroySplashScreen()
 {
-  if(m_splashScreen) 
+  if (m_splashScreen)
   {
     delete m_splashScreen;
     m_splashScreen = NULL;
   }
 }
+
+void GinebraBrowser::setApplicationNameVersion()
+{
+  QCoreApplication::setApplicationName(BEDROCK_APPLICATION_NAME);
+  QString browserAppVersion = BEDROCK_PROVISIONING::BedrockProvisioning::createBedrockProvisioning()->valueAsString("BedrockVersion");
+  QCoreApplication::setApplicationVersion(browserAppVersion);
+}