ginebra/chromejsobject.cpp
changeset 0 1450b09d0cfd
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/ginebra/chromejsobject.cpp	Tue May 04 12:39:35 2010 +0300
@@ -0,0 +1,410 @@
+/*
+* 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".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description: 
+*
+*/
+
+#include "chromejsobject.h"
+#include "qwebpage.h"
+#include "qwebframe.h"
+#include "chromewidget.h"
+#include "chromeview.h"
+#include "webcontentview.h"
+#include <QNetworkReply>
+#include "scriptobjects.h"
+#include "UiUtil.h"
+#include "webpagecontroller.h"
+#include <qdesktopservices.h>
+
+#ifdef USE_DOWNLOAD_MANAGER
+#include "download.h"
+#endif
+
+ChromeJSObject::ChromeJSObject(ChromeView* chrome)
+ : m_chromeView(chrome)
+{
+  setObjectName("chrome");
+#ifdef ENABLE_LOG
+  initLogFile();
+#endif
+}
+
+void ChromeJSObject::loadChrome(const QString url)  // slot
+{
+  m_chromeView->loadChrome(url);
+}
+
+void ChromeJSObject::reloadChrome()  // slot
+{
+  m_chromeView->reloadChrome();
+}
+
+#ifdef USE_STATEMACHINE
+void ChromeJSObject::requestChrome(const QString &url)  // slot
+{
+  qDebug() << "ChromeJSObject::requestChrome: " << url;
+  emit onRequestChrome(url);
+}
+#endif
+
+void ChromeJSObject::updateViewPort(){
+  m_chromeView->updateViewPort();
+}
+
+void ChromeJSObject::setViewPort(int x1, int y1, int x2, int y2){
+  QRect viewPort(x1,y1,x2,y2);
+  m_chromeView->setViewPort(viewPort);
+}
+void ChromeJSObject::flipFromCurrentView(const QString& toId){
+  m_chromeView->flipFromCurrentView(toId);
+}
+
+void ChromeJSObject::flipToCurrentView(const QString& fromId){
+  m_chromeView->flipToCurrentView(fromId);
+}
+
+void ChromeJSObject::setLocation(const QString& id, int x, int y){
+  m_chromeView->setLocation(id,x,y);
+}
+
+void ChromeJSObject::setAnchor(const QString& id, const QString& anchor){
+  m_chromeView->setAnchor(id, anchor);
+}
+
+void ChromeJSObject::toggleVisibility(const QString& id){
+  m_chromeView->toggleVisibility(id);
+}
+
+void ChromeJSObject::show(const QString& id, int x, int y){
+  m_chromeView->show(id, x, y);
+}
+
+void ChromeJSObject::hide(const QString& id){
+  m_chromeView->hide(id);
+}
+
+
+void ChromeJSObject::toggleAttention(const QString& id){
+  m_chromeView->toggleAttention(id);
+
+}
+
+void ChromeJSObject::setVisibilityAnimator(const QString& elementId, const QString & animatorName){
+  m_chromeView->setVisibilityAnimator(elementId, animatorName);
+}
+
+void ChromeJSObject::setAttentionAnimator(const QString& elementId, const QString & animatorName){
+  qDebug() << "Set attention animator";
+  m_chromeView->setAttentionAnimator(elementId, animatorName);
+}
+
+QString ChromeJSObject::guessUrlFromString(const QString &s){
+    QUrl u = WRT::UiUtil::guessUrlFromString(s);
+    return u.toString();
+}
+
+QString ChromeJSObject::guessAndGotoUrl(const QString &s){
+    QString guessedUrl(guessUrlFromString(s));
+    WebPageController::getSingleton()->currentLoad(guessedUrl);
+    return guessedUrl;
+}
+
+QString ChromeJSObject::searchUrl(const QString &s){
+    QUrl u = WRT::UiUtil::searchUrl(s);
+    return u.toString();
+}
+
+void ChromeJSObject::loadFromHistory()
+{
+    int count = WebPageController::getSingleton()->historyWindowCount();
+        
+    if(!count)
+    {
+    		loadLocalFile(); // load start page for first startup of the browser
+    }
+    else
+    {	
+    	 int count2 = WebPageController::getSingleton()->restoreNumberOfWindows();
+    	 
+    	 // "sanity check" count shall be always equal to count2. If not, something wrong. Open only one window - start page in this case.
+    	 	
+    	 if((count > 0) && (count == count2)) // load all browser windows from the last session
+    	 {
+    	 	
+    	 	for(int i = 0; i < count2-1; i++) //all windows except current
+    	 	{
+    	 		WebPageController::getSingleton()->openPageFromHistory(i);
+    	 		WebPageController::getSingleton()->pageGotoCurrentItem(i);
+    	 		WebPageController::getSingleton()->pageReload(i);
+    	 	}		
+    	 
+    	 // current window
+    	 WebPageController::getSingleton()->currentLoad("");	
+    	 WebPageController::getSingleton()->gotoCurrentItem();
+    	 WebPageController::getSingleton()->currentReload();	
+    	     	 		
+    	 WebPageController::getSingleton()->deleteHistory();
+    	 	
+    	 }
+    	 else // browser did not close correctly; exception handler: delete all files and load start page as in first startup
+    	 {
+    	 	WebPageController::getSingleton()->deleteHistory();
+    	 	WebPageController::getSingleton()->deleteDataFiles();
+    	 	loadLocalFile();
+    	 }			    	 
+    }	 
+    
+    return ;
+}
+
+	
+	
+QString ChromeJSObject::getLastUrl()
+{
+	QString lastUrl = WebPageController::getSingleton()->getLastUrl();
+	if(lastUrl == "")
+		return "http://";
+	else
+		return lastUrl ;	
+}
+
+int ChromeJSObject::numberOfWindows()
+{
+	int numWin = WebPageController::getSingleton()->restoreNumberOfWindows();
+	
+	return numWin;
+}
+
+void ChromeJSObject::clearHistory()
+{
+	WebPageController::getSingleton()->deleteHistory();
+	WebPageController::getSingleton()->clearHistoryInMemory();
+	WebPageController::getSingleton()->deleteDataFiles();
+}
+
+void ChromeJSObject::clearCookies()
+{
+	WebPageController::getSingleton()->deleteCookies();
+}
+
+void ChromeJSObject::clearCache()
+{
+	WebPageController::getSingleton()->deleteCache();
+}
+
+void ChromeJSObject::loadLocalFile() {
+// for symbian deployment, local file root at C:/data/Others/
+    QString chromeBaseDir = BEDROCK_PROVISIONING::BedrockProvisioning::createBedrockProvisioning()->valueAsString("ChromeBaseDirectory");
+    QString startPage = BEDROCK_PROVISIONING::BedrockProvisioning::createBedrockProvisioning()->valueAsString("StartPage");
+    QString startPagePath = chromeBaseDir + startPage;
+    qDebug() << "ChromeJSObject::loadLocalFile: " << startPagePath;
+    WebPageController::getSingleton()->currentLoad(startPagePath);
+}
+
+void ChromeJSObject::setViewofCurrentPage() {
+    m_chromeView->setViewofCurrentPage();
+}
+
+QObject *ChromeJSObject::getContentViewRect() const {
+    ScriptRect *rect = new ScriptRect(m_chromeView->geometry());
+    m_chromeView->getChromeWidget()->chromePage()->mainFrame()->addToJavaScriptWindowObject(rect->objectName(), rect, QScriptEngine::ScriptOwnership);
+    return rect;
+}
+
+void ChromeJSObject::alert(const QString msg) {
+  // To do: open a dialog box showing msg.
+  qDebug() << msg;
+}
+
+#ifdef ENABLE_LOG
+
+
+QString ChromeJSObject::getLogPath()
+{
+#if defined(QT_NO_DESKTOPSERVICES)
+#ifdef Q_OS_SYMBIAN
+	static const QString LogPath("C:\\Data\\GinebraLog.txt");
+#else
+	static const QString LogPath("./GinebraLog.txt");
+#endif
+#else
+    static const QString LogPath(QDesktopServices::storageLocation(QDesktopServices::TempLocation) + "./GinebraLog.txt");
+#endif
+    return LogPath;
+}
+
+void ChromeJSObject::initLogFile() {
+    QFile file(getLogPath());
+    file.remove();
+    log("Log started " + QDate::currentDate().toString("dd.MM.yyyy"));
+}
+
+void ChromeJSObject::log(const QString msg) {
+    QFile file(getLogPath());
+    
+    if (!file.open(QIODevice::WriteOnly | QIODevice::Text | QIODevice::Append)) {
+        qDebug() << "ChromeJSObject::log: open failed";
+        return;
+    }
+    
+    QTextStream out(&file);
+    out << "\r\n" << QTime::currentTime ().toString("hh:mm:ss.zzz: ") << msg;
+    
+    file.flush();
+    file.close();
+}
+#endif   // ENABLE_LOG
+
+void ChromeJSObject::setBackgroundColor(int r, int g, int b){
+    m_chromeView->setBackgroundColor(QColor(r, g, b));
+}
+
+void ChromeJSObject::displayModeChanged(ChromeView::DisplayMode displayMode){
+    emit onDisplayModeChanged(displayMode == ChromeView::DisplayModePortrait ? "portrait" : "landscape");
+}
+
+void ChromeJSObject::displayModeChangeStart(ChromeView::DisplayMode displayMode) {
+
+    emit onDisplayModeChangeStart(displayMode == ChromeView::DisplayModePortrait ? "portrait" : "landscape");
+}
+
+//-------------------------------------
+// Property getters and setters
+//-------------------------------------
+
+QList<int> ChromeJSObject::getDisplaySize() const
+{
+    QList<int> list;
+    list.append(m_chromeView->size().width());
+    list.append(m_chromeView->size().height());
+    return list;
+}
+
+QString ChromeJSObject::getDisplayMode() const{
+    return m_chromeView->displayMode() == ChromeView::DisplayModePortrait ? "portrait" : "landscape";
+}
+/*
+int ChromeJSObject::getDisplayOrientation() const{
+    return m_chromeView->orientationAngle();
+}
+*/
+
+// Support downloads
+
+#ifdef USE_DOWNLOAD_MANAGER
+
+static int dlInt(Download * download, DownloadAttribute attribute)
+{
+    return download->getAttribute(attribute).toInt();
+}
+
+static QString dlStr(Download * download, DownloadAttribute attribute)
+{
+    return download->getAttribute(attribute).toString();
+}
+
+void ChromeJSObject::downloadCreated(Download * download)
+{
+    // Note: the DlFileName at this point has not been
+    // adjusted to account for duplicate file names in
+    // the destination directory.  That doesn't happen
+    // until the download starts.
+
+    emit onDownloadCreated(download->id());
+}
+
+void ChromeJSObject::downloadStarted(Download * download)
+{
+    emit onDownloadStarted(
+            download->id(),
+            dlStr(download, DlFileName),
+            dlInt(download, DlTotalSize));
+}
+
+void ChromeJSObject::downloadProgress(Download * download)
+{
+    emit onDownloadProgress(
+            download->id(),
+            dlStr(download, DlFileName),
+            dlInt(download, DlTotalSize),
+            dlInt(download, DlDownloadedSize),
+            dlInt(download, DlPercentage));
+}
+
+void ChromeJSObject::downloadFinished(Download * download)
+{
+    emit onDownloadFinished(
+            download->id(),
+            dlStr(download, DlFileName),
+            dlInt(download, DlTotalSize),
+            dlInt(download, DlDownloadedSize),
+            dlInt(download, DlPercentage));
+}
+
+void ChromeJSObject::downloadPaused(Download * download, const QString & error)
+{
+    emit onDownloadPaused(
+            download->id(),
+            dlStr(download, DlFileName),
+            dlInt(download, DlTotalSize),
+            dlInt(download, DlDownloadedSize),
+            dlInt(download, DlPercentage),
+            error);
+}
+
+void ChromeJSObject::downloadCancelled(Download * download, const QString & error)
+{
+    emit onDownloadCancelled(
+            download->id(),
+            dlStr(download, DlFileName),
+            dlInt(download, DlTotalSize),
+            dlInt(download, DlDownloadedSize),
+            dlInt(download, DlPercentage),
+            error);
+}
+
+void ChromeJSObject::downloadFailed(Download * download, const QString & error)
+{
+    emit onDownloadFailed(
+            download->id(),
+            dlStr(download, DlFileName),
+            dlInt(download, DlTotalSize),
+            dlInt(download, DlDownloadedSize),
+            dlInt(download, DlPercentage),
+            error);
+}
+
+void ChromeJSObject::downloadNetworkLoss(Download * download, const QString & error)
+{
+    emit onDownloadNetworkLoss(
+            download->id(),
+            dlStr(download, DlFileName),
+            dlInt(download, DlTotalSize),
+            dlInt(download, DlDownloadedSize),
+            dlInt(download, DlPercentage),
+            error);
+}
+
+void ChromeJSObject::downloadError(Download * download, const QString & error)
+{
+    emit onDownloadError(
+            download->id(),
+            dlStr(download, DlFileName),
+            dlInt(download, DlTotalSize),
+            dlInt(download, DlDownloadedSize),
+            dlInt(download, DlPercentage),
+            error);
+}
+
+#endif // USE_DOWNLOAD_MANAGER