--- a/browsercore/appfw/Api/Managers/webpagecontroller.cpp Wed Jun 23 17:59:43 2010 +0300
+++ b/browsercore/appfw/Api/Managers/webpagecontroller.cpp Tue Jul 06 14:03:49 2010 +0300
@@ -41,6 +41,10 @@
#include <QDir>
#include <QtGui>
#include <QCoreApplication>
+#include <QWebSecurityOrigin>
+#include <QWebDatabase>
+#include <QWebSettings>
+#include <QtCore/QSettings>
using namespace WRT;
#if defined(Q_OS_SYMBIAN) // for shareToMail
@@ -143,9 +147,12 @@
m_networkError (false),
m_networkErrorMsg("No network error"),
m_networkErrorUrl("No Url"),
+ m_promptMsg("No message"),
+ m_promptReserved(""),
m_memoryHandler(new LowMemoryHandler(this)),
d(new WebPageControllerPrivate(this)),
- m_settingsLoaded(0)
+ m_settingsLoaded(0),
+ m_bErrorUrlMatches(false)
{
// Register a new MetaType WebPageData. It is needed to serialize history (starage)
qRegisterMetaTypeStreamOperators<WebPageData> ("WebPageData");
@@ -158,7 +165,9 @@
connect( d->m_actionBack, SIGNAL( triggered() ), this, SLOT( currentBack() ) );
connect( d->m_actionForward, SIGNAL( triggered() ), this, SLOT( currentForward() ) );
+ connect( m_memoryHandler, SIGNAL( lowMemory() ), this, SIGNAL( lowMemory() ) );
connect( m_memoryHandler, SIGNAL( lowMemory() ), this, SLOT( handleLowMemory() ) );
+ connect( m_memoryHandler, SIGNAL( outOfMemory() ), this, SIGNAL( outOfMemory() ) );
connect( m_memoryHandler, SIGNAL( outOfMemory() ), this, SLOT( handleOutOfMemory() ) );
m_memoryHandler->start();
@@ -197,7 +206,7 @@
Q_ASSERT( page );
page->settings()->setAttribute(QWebSettings::DeveloperExtrasEnabled, (bool) BEDROCK_PROVISIONING::BedrockProvisioning::createBedrockProvisioning()->valueAsInt("DeveloperExtras"));
-
+ connect( page, SIGNAL( loadFinished(bool) ), SLOT( onLoadFinishedForBackgroundWindow(bool) ) );
// emit signal indicating that new page is being created
emit creatingPage( page );
@@ -274,57 +283,59 @@
*/
void WebPageController::closePage ( WRT::WrtBrowserContainer *page )
{
- WRT::WrtBrowserContainer * theCurrentPage = currentPage();
- bool updateCurrentPageIndex = false;
+ if(pageCount() > 1) {
+ WRT::WrtBrowserContainer * theCurrentPage = currentPage();
+ bool updateCurrentPageIndex = false;
- // get index of page we want to remove
- int closeIndex = d->m_allPages.indexOf(page);
- if(closeIndex < 0)
- return;
+ // get index of page we want to remove
+ int closeIndex = d->m_allPages.indexOf(page);
+ if(closeIndex < 0)
+ return;
- // was this page the "current page?"
- // if so, we need to select the page to become the new one
- // select the previous page unless at the beginning, then select next
- if(page == theCurrentPage) {
- int newCurrIndex = closeIndex - 1;
- if(closeIndex == 0 ) {
- newCurrIndex = closeIndex + 1;
- }
+ // was this page the "current page?"
+ // if so, we need to select the page to become the new one
+ // select the previous page unless at the beginning, then select next
+ if(page == theCurrentPage) {
+ int newCurrIndex = closeIndex - 1;
+ if(closeIndex == 0 ) {
+ newCurrIndex = closeIndex + 1;
+ }
- // change the current page
- if(newCurrIndex >= 0) {
- theCurrentPage = d->m_allPages.at(newCurrIndex);
- setCurrentPage(theCurrentPage);
- updateCurrentPageIndex = true;
+ // change the current page
+ if(newCurrIndex >= 0) {
+ theCurrentPage = d->m_allPages.at(newCurrIndex);
+ setCurrentPage(theCurrentPage);
+ updateCurrentPageIndex = true;
+ }
+ else {
+ d->m_currentPage = -1;
+ emit pageChanged(page, NULL);
+ }
}
else {
- d->m_currentPage = -1;
- emit pageChanged(page, NULL);
+ /* Adjust m_currentPage if the index of the page deleted is less than
+ * current page
+ */
+ if (closeIndex < d->m_currentPage )
+ updateCurrentPageIndex = true;
}
- }
- else {
- /* Adjust m_currentPage if the index of the page deleted is less than
- * current page
- */
- if (closeIndex < d->m_currentPage )
- updateCurrentPageIndex = true;
- }
+
+ // actually delete the page from the list
+ d->m_allPages.removeAt(closeIndex);
- // actually delete the page from the list
- d->m_allPages.removeAt(closeIndex);
+ // update the current page index if necessary
+ // (this will just update the index now that we've removed the page from the list)
+ if(updateCurrentPageIndex) {
+ int index = d->m_allPages.indexOf(theCurrentPage);
+ if(index >= 0)
+ d->m_currentPage = index;
+ }
- // update the current page index if necessary
- // (this will just update the index now that we've removed the page from the list)
- if(updateCurrentPageIndex) {
- int index = d->m_allPages.indexOf(theCurrentPage);
- if(index >= 0)
- d->m_currentPage = index;
+ // and emit sig that it was done
+ emit pageDeleted(page);
+
+ delete page;
}
-
- // and emit sig that it was done
- emit pageDeleted(page);
-
- delete page;
}
/*!
@@ -358,7 +369,7 @@
disconnect(oldPage->networkAccessManager(), 0, this, 0);
disconnect(oldPage->loadController(), 0, this, 0);
connect(oldPage, SIGNAL(createNewWindow(WrtBrowserContainer*)), this, SLOT(createWindow(WrtBrowserContainer*)));
-
+ connect(oldPage, SIGNAL(loadFinished(bool)), SLOT(onLoadFinishedForBackgroundWindow(bool)));
}
// aggregate "current page" signalling from this page to PageMgr clients
connect(page, SIGNAL(secureStateChange(int)), this, SLOT(secureStateChange(int)));
@@ -367,6 +378,9 @@
connect( page->mainFrame(), SIGNAL(initialLayoutCompleted() ), SIGNAL( initialLayoutCompleted() ) );
connect( page, SIGNAL( loadProgress(int) ), SIGNAL( loadProgress(int) ) );
connect( page, SIGNAL( loadFinished(bool) ), SLOT( onLoadFinished(bool) ) );
+
+ connect( page, SIGNAL( databaseQuotaExceeded (QWebFrame *,QString) ), SLOT( onDatabaseQuotaExceeded (QWebFrame *,QString)) );
+
connect( page->mainFrame(), SIGNAL( iconChanged() ), SIGNAL( pageIconChanged() ) );
connect( page->loadController(), SIGNAL( pageLoadStarted() ), SIGNAL( pageLoadStarted() ) );
connect( page->loadController(), SIGNAL( pageLoadFailed() ), SIGNAL( pageLoadFailed() ) );
@@ -416,6 +430,37 @@
}
}
+
+void WebPageController::onDatabaseQuotaExceeded (QWebFrame *frame, QString database)
+{
+ QString dbdir = QWebSettings::offlineStoragePath ();
+ QDir dir(dbdir);
+
+ if(!dir.exists()||(dir.count() <= 1)) // empty DB
+ return;
+
+
+ if(frame)
+ {
+ QWebSecurityOrigin qwso = frame->securityOrigin();
+ qint64 quota = qwso.databaseQuota() ;
+ qint64 usage = qwso.databaseUsage() ;
+ }
+ m_promptMsg = "Database Quota Error";
+ emit databaseQuotaExceeded (frame, database);
+
+ return;
+}
+
+void WebPageController::onLoadFinishedForBackgroundWindow(bool ok)
+{
+ if (!ok)
+ return;
+ WRT::WrtBrowserContainer* page = qobject_cast<WRT::WrtBrowserContainer*> (sender());
+ if (page)
+ page->setUpdateThumbnail(true);
+}
+
void WebPageController::updateHistory()
{
BookmarksManager::getSingleton()->addHistory(currentDocUrl(), currentDocTitle());
@@ -441,11 +486,14 @@
void WebPageController::processNetworkErrorUrl(const QUrl & url )
{
QString errorUrl = url.toString();
- QString currentUrl = currentDocUrl();
+ QString requestedUrl = currentRequestedUrl();
m_networkErrorUrl = url.toString();
-// TODO: may not necessary
-// Here we should be able to do various handling of the error url, such
-// as comparing with QWebPage URL, ... etc
+
+ // Check if requestedUrl matches the URL from the network error
+ // This is to resolve the problems when error popups occur when they shouldn't
+ // especially during download.
+ int matches = m_networkErrorUrl.compare(requestedUrl);
+ if (matches == 0) m_bErrorUrlMatches = true;
}
//void QWEBKIT_EXPORT qt_drt_garbageCollector_collect();
@@ -778,6 +826,9 @@
{
updateActions(true);
+ // Reset to false for new page
+ m_bErrorUrlMatches = false;
+
// This is needed for loading a restored window (otherwise url bar is empty)
currentPage()->loadController()->setUrlText(currentPage()->history()->currentItem().url().toString());
}
@@ -797,7 +848,7 @@
{
d->m_actionReload->setEnabled(!pageIsLoading);
d->m_actionStop->setEnabled(pageIsLoading);
-
+
WRT::WrtBrowserContainer* activePage = currentPage();
if(activePage) {
@@ -891,9 +942,10 @@
void WebPageController::loadLocalFile()
{
- QString chromeBaseDir = BEDROCK_PROVISIONING::BedrockProvisioning::createBedrockProvisioning()->valueAsString("ChromeBaseDirectory");
+ QString chromeBaseDir = BEDROCK_PROVISIONING::BedrockProvisioning::createBedrockProvisioning()->valueAsString("LocalPagesBaseDirectory");
QString startPage = BEDROCK_PROVISIONING::BedrockProvisioning::createBedrockProvisioning()->valueAsString("StartPage");
QString startPagePath = chromeBaseDir + startPage;
+
currentLoad(startPagePath);
}
@@ -1271,6 +1323,37 @@
}
}
+
+bool WebPageController::removeDirectory(QDir &aDir)
+{
+ bool has_err = false;
+ if (aDir.exists())
+ {
+ QFileInfoList entries = aDir.entryInfoList(QDir::NoDotAndDotDot |
+ QDir::Dirs | QDir::Files);
+ int count = entries.size();
+ for (int idx = 0; ((idx < count) && (0 == has_err)); idx++)
+ {
+ QFileInfo entryInfo = entries[idx];
+ QString path = entryInfo.absoluteFilePath();
+ if (entryInfo.isDir())
+ {
+ QDir dir(path);
+ has_err = removeDirectory(dir);
+ }
+ else
+ {
+ QFile file(path);
+ if (!file.remove())
+ has_err = true;
+ }
+ }
+ if (!aDir.rmdir(aDir.absolutePath()))
+ has_err = true;
+ }
+ return(has_err);
+}
+
void WebPageController::clearHistoryInMemory()
{
WRT::WrtBrowserContainer * activePage = currentPage();
@@ -1324,6 +1407,30 @@
void WebPageController::deleteCache()
{
+
+ QWebDatabase::removeAllDatabases();
+
+ QString str1 = QWebSettings::offlineStoragePath ();
+ QString str2 = QWebSettings::offlineWebApplicationCachePath ();
+ QWebSettings * globalSettings = QWebSettings::globalSettings();
+ QString LocalStoragePath = globalSettings->localStoragePath();
+
+ /*QString deleteFlag = d->m_historyDir + QLatin1String("/deleteOfflineStorage");
+ QFile deleteFileFlag(deleteFlag);
+ if(deleteFileFlag.open(QIODevice::WriteOnly)) { // create indicator that marks offline storage for deletion while next browser startup
+ deleteFileFlag.close();
+ }*/
+
+ QDir LocalStorage(LocalStoragePath);
+ removeDirectory(LocalStorage);
+
+ QString applicationCacheFile = d->m_historyDir + QLatin1String("/ApplicationCache.db");
+ QFile file(applicationCacheFile);
+ if(file.open(QIODevice::ReadOnly)) {
+ file.remove(); // may fail if file in usage; will be deleted in next browser startup
+ file.close();
+ }
+
if ( !BEDROCK_PROVISIONING::BedrockProvisioning::createBedrockProvisioning()->value("DiskCacheEnabled").toBool() )
return;
@@ -1377,7 +1484,6 @@
}
-
void WebPageController::urlChanged(const QUrl& url)
{
//private slot
@@ -1385,7 +1491,6 @@
emit partialUrlChanged(urlString);
}
-
QString WebPageController::partialUrl(const QUrl& url)
{
@@ -1420,31 +1525,31 @@
bool needRestore = false;
for (int i = 0; i < allPages()->count(); i++) {
- WRT::WrtBrowserContainer* page = allPages()->at(i);
- QWebHistoryItem item = page->history()->currentItem();
-
- WebPageData data = item.userData().value<WebPageData>();
+ WRT::WrtBrowserContainer* page = allPages()->at(i);
+ QWebHistoryItem item = page->history()->currentItem();
+ WebPageData data = item.userData().value<WebPageData>();
// If not still a blank window, check whether we need to update the img
if (!page->emptyWindow() ){
QImage img = data.m_thumbnail;
-
- bool isSameMode = ( (img.size().width() > img.size().height()) == (currSize.width() > currSize.height()) );
- if (img.isNull() || !isSameMode) {
-
- qDebug() << "need new thumbnail!!!" << img.size() << ":" << currSize;
- needRestore = true;
- view->setPage(page);
- page->setWebWidget(view);
- QCoreApplication::sendEvent(view, new WebPageControllerUpdateViewPortEvent());
- page->savePageDataToHistoryItem(page->mainFrame(), &item);
- }
+ bool isSameMode = ( (img.size().width() > img.size().height()) == (currSize.width() > currSize.height()) );
+ if (img.isNull() || !isSameMode) {
+ needRestore = true;
+ view->setPage(page);
+ page->setWebWidget(view);
+ QCoreApplication::sendEvent(view, new WebPageControllerUpdateViewPortEvent());
+ page->savePageDataToHistoryItem(page->mainFrame(), &item);
+ page->setUpdateThumbnail(false);
+ }
+ if (page->needUpdateThumbnail()) {
+ page->savePageDataToHistoryItem(page->mainFrame(), &item);
+ page->setUpdateThumbnail(false);
+ }
}
}
// restore
- if (needRestore)
- {
+ if (needRestore) {
view->setPage(savedPage);
savedPage->setWebWidget(view);
}
@@ -1452,14 +1557,11 @@
void WebPageController::updatePageThumbnails()
{
- // update current page's thumbnail forcely
+ // update current page's thumbnail forcely since the scrolling position may change
WRT::WrtBrowserContainer *page = currentPage();
QWebHistoryItem item = page->history()->currentItem();
-
page->savePageDataToHistoryItem(page->mainFrame(), &item);
-
- WebPageData data = item.userData().value<WebPageData>();
-
+ page->setUpdateThumbnail(false);
checkAndUpdatePageThumbnails();
}
@@ -1521,6 +1623,18 @@
return m_networkErrorUrl;
}
+bool WebPageController::errorUrlMatches() {
+ return m_bErrorUrlMatches;
+}
+
+QString WebPageController::promptMsg() {
+ return m_promptMsg;
+}
+
+QString WebPageController::promptReserved() {
+ return m_promptReserved;
+}
+
/*!
\fn void WebPageController::pageCreated(WrtPage* newPage);
emitted when a page is created