WindowHistoryInformation QtWebKitWebWidget::getHistory() const { QVariantHash data; data[QLatin1String("position")] = m_webView->page()->mainFrame()->scrollPosition(); data[QLatin1String("zoom")] = getZoom(); m_webView->history()->currentItem().setUserData(data); QWebHistory *history = m_webView->history(); WindowHistoryInformation information; information.index = history->currentItemIndex(); for (int i = 0; i < history->count(); ++i) { const QWebHistoryItem item = history->itemAt(i); WindowHistoryEntry entry; entry.url = item.url().toString(); entry.title = item.title(); entry.position = item.userData().toHash().value(QLatin1String("position"), QPoint(0, 0)).toPoint(); entry.zoom = item.userData().toHash().value(QLatin1String("zoom")).toInt(); information.entries.append(entry); } return information; }
void KWebKitPart::slotRestoreFrameState(QWebFrame *frame) { QWebPage* page = (frame ? frame->page() : 0); QWebHistory* history = (page ? page->history() : 0); // No history item... if (!history || history->count() < 1) return; QWebHistoryItem currentHistoryItem (history->currentItem()); // Update the scroll position if needed. See comment in slotSaveFrameState above. if (frame->baseUrl().resolved(frame->url()) == currentHistoryItem.url()) { const QPoint currentPos (frame->scrollPosition()); const QPoint desiredPos (currentHistoryItem.userData().toPoint()); if (currentPos.isNull() && !desiredPos.isNull()) { frame->setScrollPosition(desiredPos); } } }
void WebKitBrowserExtension::restoreState(QDataStream &stream) { KUrl u; QByteArray historyData; qint32 xOfs = -1, yOfs = -1, historyItemIndex = -1; stream >> u >> xOfs >> yOfs >> historyItemIndex >> historyData; QWebHistory* history = (view() ? view()->page()->history() : 0); if (history) { bool success = false; if (history->count() == 0) { // Handle restoration: crash recovery, tab close undo, session restore if (!historyData.isEmpty()) { historyData = qUncompress(historyData); // uncompress the history data... QBuffer buffer (&historyData); if (buffer.open(QIODevice::ReadOnly)) { QDataStream stream (&buffer); view()->page()->setProperty("HistoryNavigationLocked", true); stream >> *history; QWebHistoryItem currentItem (history->currentItem()); if (currentItem.isValid()) { if (currentItem.userData().isNull() && (xOfs != -1 || yOfs != -1)) { const QPoint scrollPos (xOfs, yOfs); currentItem.setUserData(scrollPos); } // NOTE 1: The following Konqueror specific workaround is necessary // because Konqueror only preserves information for the last visited // page. However, we save the entire history content in saveState and // and hence need to elimiate all but the current item here. // NOTE 2: This condition only applies when Konqueror is restored from // abnormal termination ; a crash and/or a session restoration. if (QCoreApplication::applicationName() == QLatin1String("konqueror")) { history->clear(); } //kDebug() << "Restoring URL:" << currentItem.url(); m_part->setProperty("NoEmitOpenUrlNotification", true); history->goToItem(currentItem); } } } success = (history->count() > 0); } else { // Handle navigation: back and forward button navigation.