diff -r 6aeb7a756187 -r 3c88a81ff781 ginebra2/emulator/browsermaemo.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/ginebra2/emulator/browsermaemo.cpp Fri Oct 15 17:30:59 2010 -0400 @@ -0,0 +1,366 @@ +/* +* Copyright (c) 2010 Nokia Corporation and/or its subsidiary(-ies). +* All rights reserved. +* +* 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. +* +* 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. +* +* 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: +* +*/ + +#include "browser.h" +#ifndef NO_QSTM_GESTURE +#include "WebGestureHelper.h" +#endif +#include "../ChromeLayout.h" +#include "../ChromeWidget.h" +#include "../ChromeDOM.h" +#include "../Application.h" +#include "HistoryFlowView.h" +#include "WindowFlowView.h" +#include "webpagecontroller.h" +#include "bedrockprovisioning.h" +#include "Utilities.h" +#include "mostvisitedpagestore.h" + +#include +#include +#ifdef _GVA_INSPECT_CHROME_ +#include +#endif +#include + +#ifndef Q_OS_SYMBIAN +// Uncomment the next line to enable the javascript console dialog. +//#define CHROME_CONSOLE 1 +#ifdef CHROME_CONSOLE +#include "ChromeConsole.h" +#endif +#endif + + +#ifdef Q_WS_MAEMO_5 +#include "../ContentViews/WindowsView.h" +#include "../ContentViews/BrowserWindow.h" +#endif + +GinebraBrowser::GinebraBrowser(QObject * parent, QString *url) + : QObject(parent) + , m_scene(new QGraphicsScene()) + , m_app(0) +#ifdef Q_WS_MAEMO_5 + , m_mainWindow(0) + , m_menu(new QMenu(tr("Menu"))) + , m_splashScreenM5(0) +#else + , m_splashScreen(0) +#endif +{ + + + // Create the chrome widget + m_chrome = new GVA::ChromeWidget(); + + platformSpecificInit(); + + // 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("ChromeBaseDirectory") + + startUpChrome.section('/', 0, -2) + "/"; + m_chromeUrl = startUpChrome.section('/', -1); + m_contentUrl = BEDROCK_PROVISIONING::BedrockProvisioning::createBedrockProvisioning()->valueAsString("StartPage"); + + setApplicationNameVersion(); + + m_app = new GVA::GinebraApplication(); + + // Instantiate Most Visited Page store. + MostVisitedPageStoreSingleton::Instance(); + +#ifdef Q_WS_MAEMO_5 + safe_connect(m_app, SIGNAL(addMenuBarActionRequest(QAction *)), + this, SLOT(addMenuBarAction(QAction *))); + safe_connect(m_app, SIGNAL(setMenuBarEnabledRequest(bool)), + this, SLOT(setMenuBarEnabled(bool))); +#endif + + m_chrome->setApp(m_app); + +#ifdef _GVA_INSPECT_CHROME_ + QWebSettings * s = m_chrome->page()->settings(); + s->setAttribute(QWebSettings::DeveloperExtrasEnabled, true ); + QWebInspector *inspector = new QWebInspector; + inspector->setPage(m_chrome->page()); + inspector->resize(400,600); + inspector->show(); + connect(m_chrome->page(), SIGNAL(webInspectorTriggered(QWebElement)), inspector, SLOT(show())); +#endif + +#ifndef Q_WS_MAEMO_5 //In maemo5 views, gesture handling are per window + //Create a view onto the 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 +#if defined(Q_OS_SYMBIAN) + m_view->showFullScreen(); +#else + m_view->setGeometry(0,0,360,640); +#endif +#endif //End non-Maemo5 initialization + + showSplashScreen(); + +#ifndef __gva_no_chrome__ + QObject::connect(m_chrome, SIGNAL(internalChromeComplete()), this, SLOT(onChromeComplete())); + //Load the chrome + m_chrome->setChromeBaseDirectory(m_install); + m_chrome->setChromeFile(m_chromeUrl); +#ifdef CHROME_CONSOLE + // Show the javascript console. + ChromeConsole *console = new ChromeConsole(m_chrome); + console->show(); + //console->move(m_view->geometry().topLeft() + QPoint(m_view->width()+6, 0)); +#endif +#else + onChromeComplete(); +#endif + + // Handle openUrl signals + connect(this, SIGNAL(openUrlRequested(QString)), this, SLOT(openUrl(QString))); +} + +GinebraBrowser::~GinebraBrowser() +{ + delete m_chrome; + delete WebPageController::getSingleton(); + //delete m_view; + destroySplashScreen(); + delete m_scene; + delete m_app; +#ifdef Q_WS_MAEMO_5 + delete m_windows; +#endif + +#ifndef NO_QSTM_GESTURE + WebGestureHelper* gh = browserApp->gestureHelper(); + delete gh; +#endif +} + +void GinebraBrowser::platformSpecificInit() { +#ifdef Q_WS_MAEMO_5 + m_windows = new GVA::WindowsView(m_chrome); + m_windows->setMenu(m_menu); + m_windows->handlePageEvents(true); +#else + // Add initialization code for other platforms here... +#endif +} + +void GinebraBrowser::show() +{ + //m_view->show(); +} + +void GinebraBrowser::onChromeComplete() +{ +#ifndef __gva_no_chrome__ +#ifndef Q_WS_MAEMO_5 + 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 +#endif + + //Create a content window and add it to the chrome + + GVA::GWebContentView *content = new GVA::GWebContentView(m_chrome, 0, "WebView"); + m_chrome->addView(content); + +#ifndef Q_WS_MAEMO_5 + safe_connect(content, SIGNAL(titleChanged(const QString &)), + this, SLOT(onTitleChanged(const QString &))); +#endif + + QString chromeBaseDir = BEDROCK_PROVISIONING::BedrockProvisioning::createBedrockProvisioning()->valueAsString("LocalPagesBaseDirectory"); + QString startPage = chromeBaseDir + m_contentUrl; + + bool enabled = (bool) BEDROCK_PROVISIONING::BedrockProvisioning::createBedrockProvisioning()->valueAsInt("SaveSession"); + + // 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(); + } + // Otherwise, load the start page + else { + content->loadUrlToCurrentPage(startPage); + } + m_chrome->showView("WebView"); + destroySplashScreen(); + } + +#ifdef Q_WS_MAEMO_5 + +void GinebraBrowser::addMenuBarAction(QAction *action) { + m_menu->addAction(action); +} + +/// Hack to hide the menu bar arrow when the menu is disabled. +void GinebraBrowser::fixupWindowTitle() { + /* QString title = m_mainWindow->windowTitle(); + title = title.trimmed(); + if(m_menu && !m_menu->isEnabled()) { + // The menu is disabled, add some spaces to the title to push the down arrow out of view. + title += QString(60, ' '); + } + m_mainWindow->setWindowTitle(title);*/ +} + +void GinebraBrowser::setMenuBarEnabled(bool value) { + // m_menu->setEnabled(value); + m_windows->setMenuEnabled(value); + fixupWindowTitle(); +} + +void GinebraBrowser::onTitleChanged(const QString &title) { + // Update the title in the Maemo status bar. + if(m_mainWindow) { + if(title.isEmpty()) { + m_mainWindow->setWindowTitle(QApplication::applicationName()); + } + else { + m_mainWindow->setWindowTitle(title); + } + fixupWindowTitle(); + } +} + +#endif + +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("ChromeBaseDirectory"); + QString imagePath = baseDir + splashImage; + +#ifdef Q_WS_MAEMO_5 + m_splashScreenM5 = new QSplashScreen(m_mainWindow, QPixmap(imagePath)); + m_splashScreenM5->show(); +#else + + 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()) { + ;//qDebug() << "ChromeView::chromeLoaded: ERROR splashscreen creation failed. " << imagePath; + } + else { +#ifdef Q_OS_SYMBIAN + m_splashScreen->showFullScreen(); + m_view->showFullScreen(); +#else + m_splashScreen->setGeometry(0,0,360,640); + m_splashScreen->show(); +#endif + } + } +#endif +} + +void GinebraBrowser::destroySplashScreen() +{ +#ifdef Q_WS_MAEMO_5 + if(m_splashScreenM5) { + delete m_splashScreenM5; + m_splashScreenM5 = 0; + } +#else + if (m_splashScreen) { + delete m_splashScreen; + m_splashScreen = NULL; + } +#endif +} + +void GinebraBrowser::setApplicationNameVersion() +{ + QCoreApplication::setApplicationName(BEDROCK_APPLICATION_NAME); + QString browserAppVersion = BEDROCK_PROVISIONING::BedrockProvisioning::createBedrockProvisioning()->valueAsString("BedrockVersion"); + QCoreApplication::setApplicationVersion(browserAppVersion); +}