From kde-commits Fri Oct 16 11:50:29 2009 From: David Faure Date: Fri, 16 Oct 2009 11:50:29 +0000 To: kde-commits Subject: branches/KDE/4.3/kdebase/apps/konqueror/src Message-Id: <1255693829.869486.7311.nullmailer () svn ! kde ! org> X-MARC-Message: https://marc.info/?l=kde-commits&m=125569384307858 SVN commit 1036044 by dfaure: Fix "Adding tab (Ctrl+T) in detached (tab) window crashes Konqueror". Excellent investigation, unit-test, and suggested fixes by Frank Reininghaus. BUG 203069. M +11 -2 konqviewmanager.cpp M +3 -2 konqviewmanager.h M +60 -0 tests/konqviewmgrtest.cpp M +2 -0 tests/konqviewmgrtest.h --- branches/KDE/4.3/kdebase/apps/konqueror/src/konqviewmanager.cpp #1036043:1036044 @@ -295,7 +295,7 @@ #endif } -void KonqViewManager::breakOffTab( KonqFrameBase* currentFrame, const QSize& windowSize ) +KonqMainWindow* KonqViewManager::breakOffTab( KonqFrameBase* currentFrame, const QSize& windowSize ) { #ifdef DEBUG_VIEWMGR kDebug(1202) << currentFrame; @@ -316,7 +316,9 @@ KonqMainWindow *mainWindow = new KonqMainWindow(KUrl(), m_pMainWindow->xmlFile()); - mainWindow->viewManager()->loadRootItem( profileGroup, mainWindow->viewManager()->tabContainer(), KUrl(), true, KUrl() ); + KonqFrameTabs* newTabContainer = mainWindow->viewManager()->tabContainer(); + mainWindow->viewManager()->loadRootItem( profileGroup, newTabContainer, KUrl(), true, KUrl() ); + mainWindow->viewManager()->setCurrentProfile( currentProfile() ); removeTab( currentFrame, false ); @@ -329,6 +331,8 @@ m_pMainWindow->dumpViewList(); printFullHierarchy(); #endif + + return mainWindow; } void KonqViewManager::openClosedWindow(const KonqClosedWindowItem& closedWindowItem) @@ -1187,6 +1191,11 @@ childView->frame()->show(); + if (parent == m_tabContainer && m_tabContainer->count() == 1) { + // First tab, make it the active one + parent->setActiveChild(childView->frame()); + } + if (openUrl) { const QString keyHistoryItems = QString::fromLatin1( "NumberOfHistoryItems" ).prepend( prefix ); if( cfg.hasKey(keyHistoryItems) ) { --- branches/KDE/4.3/kdebase/apps/konqueror/src/konqviewmanager.h #1036043:1036044 @@ -109,9 +109,10 @@ /** * Break the current tab off into a new window, - * if none is specified, the current one is used + * if none is specified, the current one is used. + * Returns the newly created window. */ - void breakOffTab( KonqFrameBase* tab, const QSize& windowSize ); + KonqMainWindow* breakOffTab( KonqFrameBase* tab, const QSize& windowSize ); /** * Guess!:-) --- branches/KDE/4.3/kdebase/apps/konqueror/src/tests/konqviewmgrtest.cpp #1036043:1036044 @@ -234,13 +234,18 @@ // Split again + int widthFrame2 = frame2->width(); KonqView* view3 = viewManager->splitView( view, Qt::Horizontal ); QVERIFY( view3 ); QCOMPARE( DebugFrameVisitor::inspect(&mainWindow), QString("MT[C(C(FF)F)].") ); + // Check that the width of the second frame has not changed (bug 160407) + QCOMPARE( frame2->width(), widthFrame2 ); // Now test removing the first view viewManager->removeView( view ); QCOMPARE( DebugFrameVisitor::inspect(&mainWindow), QString("MT[C(FF)].") ); // mainWindow, tab widget, one splitter, two frames + // Check again that the width of the second frame has not changed (bug 160407 comments 18-20) + QCOMPARE( frame2->width(), widthFrame2 ); // Now test removing the last view viewManager->removeView( view3 ); @@ -623,4 +628,59 @@ // QCOMPARE(view->url(), KUrl("data:text/html,

Second tab test

")); } +void ViewMgrTest::testBreakOffTab() +{ + KonqMainWindow mainWindow; + KonqViewManager* viewManager = mainWindow.viewManager(); + KonqView* view = viewManager->createFirstView( "KonqAboutPage", "konq_aboutpage" ); + + KonqFrameBase* tab = view->frame(); + viewManager->duplicateTab( tab ); + QCOMPARE( DebugFrameVisitor::inspect(&mainWindow), QString("MT[FF].") ); // mainWindow, tab widget, two tabs + + // Break off a tab + + KonqMainWindow* mainWindow2 = viewManager->breakOffTab( tab, mainWindow.size() ); + QCOMPARE( DebugFrameVisitor::inspect(&mainWindow), QString("MT[F].") ); // mainWindow, one tab, one frame + QCOMPARE( DebugFrameVisitor::inspect(mainWindow2), QString("MT[F].") ); // mainWindow, one tab, one frame + + // Verify that the new tab container has an active child and that duplicating the tab in the new window does not crash (bug 203069) + + QVERIFY( mainWindow2->viewManager()->tabContainer()->activeChild() ); + mainWindow2->viewManager()->duplicateTab( mainWindow2->activeChildView()->frame() ); + QCOMPARE( DebugFrameVisitor::inspect(mainWindow2), QString("MT[FF].") ); // mainWindow, tab widget, two tabs + + delete mainWindow2; + + // Now split the remaining view, duplicate the tab and verify that breaking off a split tab does not crash (bug 174292). + // Also check that the tab container of the new main window has an active child. + + view = mainWindow.activeChildView(); + viewManager->splitView( view, Qt::Vertical ); + QCOMPARE( DebugFrameVisitor::inspect(&mainWindow), QString("MT[C(FF)].") ); // mainWindow, tab widget, one splitter, two frames + KonqFrameContainerBase* container = view->frame()->parentContainer(); + viewManager->duplicateTab( container ); + QCOMPARE( DebugFrameVisitor::inspect(&mainWindow), QString("MT[C(FF)C(FF)].") ); // mainWindow, tab widget, two tabs with split views + mainWindow2 = viewManager->breakOffTab( container, mainWindow.size() ); + QCOMPARE( DebugFrameVisitor::inspect(&mainWindow), QString("MT[C(FF)].") ); // mainWindow, tab widget, one splitter, two frames + QCOMPARE( DebugFrameVisitor::inspect(mainWindow2), QString("MT[C(FF)].") ); // mainWindow, tab widget, one splitter, two frames + QVERIFY( mainWindow2->viewManager()->tabContainer()->activeChild() ); + + delete mainWindow2; + + // Verify that breaking off a tab preserves the view profile (bug 210686) + + const QString profile = KStandardDirs::locate("data", "konqueror/profiles/webbrowsing"); + QVERIFY(!profile.isEmpty()); + const QString path = QDir::homePath(); + mainWindow.viewManager()->loadViewProfileFromFile(profile, "webbrowsing"); + view = mainWindow.activeChildView(); + tab = view->frame(); + viewManager->duplicateTab( tab ); + mainWindow2 = viewManager->breakOffTab( tab, mainWindow.size() ); + QCOMPARE( viewManager->currentProfile(), mainWindow2->viewManager()->currentProfile() ); + + delete mainWindow2; +} + #include "konqviewmgrtest.moc" --- branches/KDE/4.3/kdebase/apps/konqueror/src/tests/konqviewmgrtest.h #1036043:1036044 @@ -55,6 +55,8 @@ void testBrowserArgumentsNewTab(); + void testBreakOffTab(); + static void sendAllPendingResizeEvents(QWidget*); private: