Trolltech Home | Qt-interest Home | Recent Threads | All Threads | Author | Date
All threads index page 1

Qt-interest Archive, May 2008
DemoBrowser: addToJavaScriptWindowObject


Message 1 in thread

HI!

Continuing my experiments with the QtWebKit integration, I tried to use the download manager in the demo browser through a Java Script.
For this I made small changes to the demo browser code to export the Download Manager object and the DownloadItem objects.

I am able to call the method download() of DownloadManager from the Java script, and hence start the download. The call to stop() method of DownloadItem does not succeed from Java script. The patch for my changes is here. Can I get some hint on what might be going wrong here?

diff -Nru browser/browserapplication.cpp mybrowser/browserapplication.cpp
--- browser/browserapplication.cpp	2008-04-02 22:05:40.000000000 +0530
+++ mybrowser/browserapplication.cpp	2008-05-01 15:11:48.000000000 +0530
@@ -404,6 +404,7 @@
 {
     if (!s_downloadManager) {
         s_downloadManager = new DownloadManager();
+		s_downloadManager->setObjectName("dlmgr");
     }
     return s_downloadManager;
 }
diff -Nru browser/downloadmanager.cpp mybrowser/downloadmanager.cpp
--- browser/downloadmanager.cpp	2008-04-02 22:05:40.000000000 +0530
+++ mybrowser/downloadmanager.cpp	2008-05-01 18:15:34.000000000 +0530
@@ -46,7 +46,7 @@
 #include "autosaver.h"
 #include "browserapplication.h"
 #include "networkaccessmanager.h"
-
+#include "browsermainwindow.h"
 #include <math.h>
 
 #include <QtCore/QMetaEnum>
@@ -60,7 +60,7 @@
 #include <QtCore/QDebug>
 
 #include <QtWebKit/QWebSettings>
-
+#include <QtWebKit/QWebFrame>
 /*!
     DownloadItem is a widget that is displayed in the download manager list.
     It moves the data from the QNetworkReply into the QFile as well
@@ -168,7 +168,8 @@
 
 void DownloadItem::stop()
 {
-    setUpdatesEnabled(false);
+    qDebug() << "Stop was called ";
+	setUpdatesEnabled(false);
     stopButton->setEnabled(false);
     stopButton->hide();
     tryAgainButton->setEnabled(true);
@@ -403,10 +404,12 @@
 void DownloadManager::addItem(DownloadItem *item)
 {
     connect(item, SIGNAL(statusChanged()), this, SLOT(updateRow()));
-    int row = m_downloads.count();
+    BrowserMainWindow *mainWindow = BrowserApplication::instance()->mainWindow();
+	int row = m_downloads.count();
     m_model->beginInsertRows(QModelIndex(), row, row);
     m_downloads.append(item);
-    m_model->endInsertRows();
+    item->setObjectName(QString(QLatin1String("dlitem_%1")).arg(m_downloads.indexOf(item)));
+	m_model->endInsertRows();
     updateItemCount();
     if (row == 0)
         show();
@@ -521,6 +524,28 @@
     cleanupButton->setEnabled(m_downloads.count() - activeDownloads() > 0);
 }
 
+/*void DownloadManager::addDownloadItemToJavaScript()
+{
+	foreach(DownloadItem *dlitem, this->m_downloads)
+	{
+		qDebug() << "Object Name:" << dlitem->objectName() ;
+		((QWebFrame *)sender())->addToJavaScriptWindowObject(dlitem->objectName(), dlitem);
+	}
+}
+*/
+void DownloadManager::addDownloadItemToJavaScript()
+{
+	DownloadItem *dlitem;
+	for(int i = 0; i < m_downloads.size() ; ++i)
+	{
+		dlitem = m_downloads.at(i);
+		qDebug() << "Object Name:" << dlitem->objectName() ;
+		((QWebFrame *)sender())->addToJavaScriptWindowObject(dlitem->objectName(), dlitem);
+	}
+}
+
+
+
 void DownloadManager::cleanup()
 {
     if (m_downloads.isEmpty())
diff -Nru browser/downloadmanager.h mybrowser/downloadmanager.h
--- browser/downloadmanager.h	2008-04-02 22:05:40.000000000 +0530
+++ mybrowser/downloadmanager.h	2008-05-01 17:00:32.000000000 +0530
@@ -123,8 +123,11 @@
     void download(const QNetworkRequest &request, bool requestFileName = false);
     inline void download(const QUrl &url, bool requestFileName = false)
         { download(QNetworkRequest(url), requestFileName); }
-    void handleUnsupportedContent(QNetworkReply *reply, bool requestFileName = false);
+    inline void download(const QString &url, bool requestFileName = false)
+		{ download(QUrl(url, QUrl::TolerantMode), requestFileName); }
+	void handleUnsupportedContent(QNetworkReply *reply, bool requestFileName = false);
     void cleanup();
+    void addDownloadItemToJavaScript();
 
 private slots:
     void save() const;
diff -Nru browser/webview.cpp mybrowser/webview.cpp
--- browser/webview.cpp	2008-04-02 22:05:40.000000000 +0530
+++ mybrowser/webview.cpp	2008-05-01 17:05:46.000000000 +0530
@@ -70,6 +70,10 @@
     setNetworkAccessManager(BrowserApplication::networkAccessManager());
     connect(this, SIGNAL(unsupportedContent(QNetworkReply *)),
             this, SLOT(handleUnsupportedContent(QNetworkReply *)));
+    connect(mainFrame(), SIGNAL(javaScriptWindowObjectCleared()),
+            this, SLOT(addDownloadManagerToJavaScript()));
+    connect(mainFrame(), SIGNAL(javaScriptWindowObjectCleared()),
+            BrowserApplication::downloadManager(), SLOT(addDownloadItemToJavaScript()));
 }
 
 BrowserMainWindow *WebPage::mainWindow()
@@ -115,6 +119,13 @@
     }
     return QWebPage::acceptNavigationRequest(frame, request, type);
 }
+void WebPage::addDownloadManagerToJavaScript()
+{
+	DownloadManager *dlManager;
+	qDebug() << "addDownloadManagerToJavaScript called()";
+	dlManager = BrowserApplication::downloadManager();
+	((QWebFrame *)sender())->addToJavaScriptWindowObject(dlManager->objectName(), dlManager);
+}
 
 QWebPage *WebPage::createWindow(QWebPage::WebWindowType type)
 {
@@ -175,8 +186,11 @@
             return;
         }
         QList<QWebFrame *> children = frame->childFrames();
-        foreach(QWebFrame *frame, children)
+        foreach(QWebFrame *frame, children){
             frames.append(frame);
+		//connect(frame, SIGNAL(javaScriptWindowObjectCleared()),
+		//		this, SLOT(addDownloadManagerToJavaScript()));
+		}
     }
     if (m_loadingUrl == reply->url()) {
         mainFrame()->setHtml(html, reply->url());
diff -Nru browser/webview.h mybrowser/webview.h
--- browser/webview.h	2008-04-02 22:05:40.000000000 +0530
+++ mybrowser/webview.h	2008-05-01 15:04:07.000000000 +0530
@@ -71,7 +71,8 @@
 #if !defined(QT_NO_UITOOLS)
     QObject *createPlugin(const QString &classId, const QUrl &url, const QStringList &paramNames, const QStringList &paramValues);
 #endif
-
+public slots:
+	void addDownloadManagerToJavaScript();
 private slots:
     void handleUnsupportedContent(QNetworkReply *reply);
 
Thanks in advance

regards

-Nitin 


Send instant messages to your online friends http://uk.messenger.yahoo.com

--
 [ signature omitted ]