Merge lp:~gerboland/qtmir/duplicate-open-apps into lp:qtmir

Proposed by Gerry Boland
Status: Merged
Approved by: Michael Zanetti
Approved revision: 251
Merged at revision: 253
Proposed branch: lp:~gerboland/qtmir/duplicate-open-apps
Merge into: lp:qtmir
Diff against target: 134 lines (+73/-18)
4 files modified
src/modules/Unity/Application/application.cpp (+5/-0)
src/modules/Unity/Application/application.h (+1/-0)
src/modules/Unity/Application/application_manager.cpp (+24/-18)
tests/modules/ApplicationManager/application_manager_test.cpp (+43/-0)
To merge this branch: bzr merge lp:~gerboland/qtmir/duplicate-open-apps
Reviewer Review Type Date Requested Status
Michael Zanetti (community) Approve
PS Jenkins bot (community) continuous-integration Approve
Review via email: mp+235109@code.launchpad.net

Commit message

TaskController may call processStarted synchronously, so check for that in startApplication before adding

Description of the change

TaskController may call processStarted synchronously, so check for that in startApplication before adding

* Are there any related MPs required for this MP to build/function as expected? Please list.
N
 * Did you perform an exploratory manual test run of your code change and any related functionality?
Y
 * If you changed the packaging (debian), did you subscribe the ubuntu-unity team to this MP?
N/A

To post a comment you must log in.
Revision history for this message
PS Jenkins bot (ps-jenkins) wrote :
review: Approve (continuous-integration)
Revision history for this message
Michael Zanetti (mzanetti) wrote :

 * Did you perform an exploratory manual test run of the code change and any related functionality?

yes

 * Did CI run pass? If not, please explain why.

waiting...

review: Approve

Preview Diff

[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
=== modified file 'src/modules/Unity/Application/application.cpp'
--- src/modules/Unity/Application/application.cpp 2014-09-11 16:18:40 +0000
+++ src/modules/Unity/Application/application.cpp 2014-09-18 12:02:01 +0000
@@ -162,6 +162,11 @@
162 m_pid = pid;162 m_pid = pid;
163}163}
164164
165void Application::setArguments(const QStringList arguments)
166{
167 m_arguments = arguments;
168}
169
165void Application::setSession(Session *newSession)170void Application::setSession(Session *newSession)
166{171{
167 qCDebug(QTMIR_APPLICATIONS) << "Application::setSession - appId=" << appId() << "session=" << newSession;172 qCDebug(QTMIR_APPLICATIONS) << "Application::setSession - appId=" << appId() << "session=" << newSession;
168173
=== modified file 'src/modules/Unity/Application/application.h'
--- src/modules/Unity/Application/application.h 2014-08-29 11:01:20 +0000
+++ src/modules/Unity/Application/application.h 2014-09-18 12:02:01 +0000
@@ -116,6 +116,7 @@
116 QString longAppId() const;116 QString longAppId() const;
117 pid_t pid() const;117 pid_t pid() const;
118 void setPid(pid_t pid);118 void setPid(pid_t pid);
119 void setArguments(const QStringList arguments);
119 void setFocused(bool focus);120 void setFocused(bool focus);
120 void setSession(Session *session);121 void setSession(Session *session);
121122
122123
=== modified file 'src/modules/Unity/Application/application_manager.cpp'
--- src/modules/Unity/Application/application_manager.cpp 2014-09-04 11:11:26 +0000
+++ src/modules/Unity/Application/application_manager.cpp 2014-09-18 12:02:01 +0000
@@ -439,24 +439,30 @@
439 return nullptr;439 return nullptr;
440 }440 }
441441
442 application = new Application(442 // The TaskController may synchroneously callback onProcessStarting, so check if application already added
443 m_taskController,443 application = findApplication(appId);
444 m_desktopFileReaderFactory->createInstance(appId, m_taskController->findDesktopFileForAppId(appId)),444 if (application) {
445 Application::Starting,445 application->setArguments(arguments);
446 arguments,446 } else {
447 this);447 application = new Application(
448448 m_taskController,
449 if (!application->isValid()) {449 m_desktopFileReaderFactory->createInstance(appId, m_taskController->findDesktopFileForAppId(appId)),
450 qWarning() << "Unable to instantiate application with appId" << appId;450 Application::Starting,
451 return nullptr;451 arguments,
452 }452 this);
453453
454 // override stage if necessary454 if (!application->isValid()) {
455 if (application->stage() == Application::SideStage && flags.testFlag(ApplicationManager::ForceMainStage)) {455 qWarning() << "Unable to instantiate application with appId" << appId;
456 application->setStage(Application::MainStage);456 return nullptr;
457 }457 }
458458
459 add(application);459 // override stage if necessary
460 if (application->stage() == Application::SideStage && flags.testFlag(ApplicationManager::ForceMainStage)) {
461 application->setStage(Application::MainStage);
462 }
463
464 add(application);
465 }
460 return application;466 return application;
461}467}
462468
463469
=== modified file 'tests/modules/ApplicationManager/application_manager_test.cpp'
--- tests/modules/ApplicationManager/application_manager_test.cpp 2014-09-11 16:18:40 +0000
+++ tests/modules/ApplicationManager/application_manager_test.cpp 2014-09-18 12:02:01 +0000
@@ -687,6 +687,49 @@
687}687}
688688
689/*689/*
690 * Test that if TaskController synchronously calls back processStarted, that ApplicationManager
691 * does not add the app to the model twice.
692 */
693TEST_F(ApplicationManagerTests,synchronousProcessStartedCallDoesNotDuplicateEntryInModel)
694{
695 using namespace ::testing;
696 const QString appId("testAppId");
697 const QString name("Test App");
698
699 // Set up Mocks & signal watcher
700 auto mockDesktopFileReader = new NiceMock<MockDesktopFileReader>(appId, QFileInfo());
701 ON_CALL(*mockDesktopFileReader, loaded()).WillByDefault(Return(true));
702 ON_CALL(*mockDesktopFileReader, appId()).WillByDefault(Return(appId));
703 ON_CALL(*mockDesktopFileReader, name()).WillByDefault(Return(name));
704
705 ON_CALL(desktopFileReaderFactory, createInstance(appId, _)).WillByDefault(Return(mockDesktopFileReader));
706
707 ON_CALL(appController, startApplicationWithAppIdAndArgs(appId, _))
708 .WillByDefault(Invoke(
709 [&](const QString &appId, Unused) {
710 applicationManager.onProcessStarting(appId);
711 return true;
712 }
713 ));
714
715 // start the application
716 Application *theApp = applicationManager.startApplication(appId, ApplicationManager::NoFlag);
717
718 // check application data
719 EXPECT_EQ(theApp->state(), Application::Starting);
720 EXPECT_EQ(theApp->appId(), appId);
721 EXPECT_EQ(theApp->name(), name);
722 EXPECT_EQ(theApp->canBeResumed(), true);
723
724 // check only once instance in the model
725 EXPECT_EQ(applicationManager.count(), 1);
726
727 // check application in list of apps
728 Application *theAppAgain = applicationManager.findApplication(appId);
729 EXPECT_EQ(theAppAgain, theApp);
730}
731
732/*
690 * Test that the child sessions of a webapp process are accepted733 * Test that the child sessions of a webapp process are accepted
691 */734 */
692TEST_F(ApplicationManagerTests,webAppSecondarySessionsAccepted)735TEST_F(ApplicationManagerTests,webAppSecondarySessionsAccepted)

Subscribers

People subscribed via source and target branches