on xenial help sign in
Fix ownership of QML singletons
commit23ca9d69ea7abb3f6531324e63e730f4a0449a91 authorDaniel d'Andrada <daniel.dandrada@canonical.com> dateWed 13 Apr 2016, 15:33 (11 years ago) parent21fcbe6
9 files changed+60−27
tests/mocks/Unity/Application/ApplicationInfo.cpp+6−1 tests/mocks/Unity/Application/ApplicationManager.cpp+7−2 tests/mocks/Unity/Application/MirSurface.cpp+23−8 tests/mocks/Unity/Application/MirSurface.h+3−3 tests/mocks/Unity/Application/SurfaceManager.cpp+11−5 tests/mocks/Unity/Application/SurfaceManager.h+3−2 tests/mocks/Unity/Application/VirtualKeyboard.cpp+2−3 tests/mocks/Unity/Application/VirtualKeyboard.h+1−1 tests/mocks/Unity/Application/plugin.cpp+4−2
tests/mocks/Unity/Application/ApplicationInfo.cpp+6−1
@@ -80,7 +80,12 @@ void ApplicationInfo::createSurface()
8080 surfaceName.append(QString(" %1").arg(m_surfaceList.count()+1));
8181 }
8282
83− auto surface = SurfaceManager::singleton()->createSurface(surfaceName,
83+ auto surfaceManager = SurfaceManager::instance();
84+ if (!surfaceManager) {
85+ return;
86+ }
87+
88+ auto surface = surfaceManager->createSurface(surfaceName,
8489 Mir::NormalType,
8590 fullscreen() ? Mir::FullscreenState : Mir::MaximizedState,
8691 m_screenshotFileName);
tests/mocks/Unity/Application/ApplicationManager.cpp+7−2
@@ -474,12 +474,17 @@ void ApplicationManager::updateFocusedApplication()
474474 ApplicationInfo *focusedApplication = nullptr;
475475 ApplicationInfo *previouslyFocusedApplication = nullptr;
476476
477− MirSurface *surface = static_cast<MirSurface*>(MirFocusController::instance()->focusedSurface());
477+ auto controller = MirFocusController::instance();
478+ if (!controller) {
479+ return;
480+ }
481+
482+ MirSurface *surface = static_cast<MirSurface*>(controller->focusedSurface());
478483 if (surface) {
479484 focusedApplication = findApplication(surface);
480485 }
481486
482− surface = static_cast<MirSurface*>(MirFocusController::instance()->previouslyFocusedSurface());
487+ surface = static_cast<MirSurface*>(controller->previouslyFocusedSurface());
483488 if (surface) {
484489 previouslyFocusedApplication = findApplication(surface);
485490 }
tests/mocks/Unity/Application/MirSurface.cpp+23−8
@@ -60,9 +60,8 @@ MirSurface::MirSurface(const QString& name,
6060 Mir::Type type,
6161 Mir::State state,
6262 const QUrl& screenshot,
63− const QUrl &qmlFilePath,
64− QObject *parent)
65− : unity::shell::application::MirSurfaceInterface(parent)
63+ const QUrl &qmlFilePath)
64+ : unity::shell::application::MirSurfaceInterface(nullptr)
6665 , m_name(name)
6766 , m_type(type)
6867 , m_state(state)
@@ -95,7 +94,7 @@ MirSurface::~MirSurface()
9594 DEBUG_MSG("");
9695
9796 auto controller = MirFocusController::instance();
98− if (controller->focusedSurface() == this) {
97+ if (controller && controller->focusedSurface() == this) {
9998 controller->clear();
10099 }
101100}
@@ -436,7 +435,12 @@ void MirSurface::requestFocus()
436435void MirSurface::setFocused(bool value)
437436{
438437 DEBUG_MSG(value);
438+
439439 auto controller = MirFocusController::instance();
440+ if (!controller) {
441+ return;
442+ }
443+
440444 if (value) {
441445 controller->setFocusedSurface(this);
442446 } else if (controller->focusedSurface() == this) {
@@ -446,7 +450,9 @@ void MirSurface::setFocused(bool value)
446450
447451bool MirSurface::focused() const
448452{
449− return MirFocusController::instance()->focusedSurface() == this;
453+ auto controller = MirFocusController::instance();
454+
455+ return controller ? controller->focusedSurface() == this : false;
450456}
451457
452458#if MIRSURFACE_DEBUG
@@ -479,12 +485,21 @@ void MirFocusController::setFocusedSurface(MirSurfaceInterface *surface)
479485
480486MirFocusController* MirFocusController::instance()
481487{
482− if (!m_instance) {
483− m_instance = new MirFocusController;
484− }
485488 return m_instance;
486489}
487490
491+MirFocusController::MirFocusController()
492+{
493+ Q_ASSERT(m_instance == nullptr);
494+ m_instance = this;
495+}
496+
497+MirFocusController::~MirFocusController()
498+{
499+ Q_ASSERT(m_instance == this);
500+ m_instance = nullptr;
501+}
502+
488503void MirFocusController::clear()
489504{
490505 m_focusedSurface = m_previouslyFocusedSurface = nullptr;
tests/mocks/Unity/Application/MirSurface.h+3−3
@@ -34,7 +34,8 @@ class MirFocusController : public unity::shell::application::MirFocusControllerI
3434{
3535 Q_OBJECT
3636public:
37− MirFocusController(){}
37+ MirFocusController();
38+ virtual ~MirFocusController();
3839 static MirFocusController* instance();
3940
4041 void setFocusedSurface(unity::shell::application::MirSurfaceInterface *surface) override;
@@ -63,8 +64,7 @@ public:
6364 Mir::Type type,
6465 Mir::State state,
6566 const QUrl& screenshot,
66− const QUrl &qmlFilePath = QUrl(),
67− QObject *parent = nullptr);
67+ const QUrl &qmlFilePath = QUrl());
6868 virtual ~MirSurface();
6969
7070 ////
tests/mocks/Unity/Application/SurfaceManager.cpp+11−5
@@ -23,11 +23,8 @@
2323
2424SurfaceManager *SurfaceManager::the_surface_manager = nullptr;
2525
26−SurfaceManager *SurfaceManager::singleton()
26+SurfaceManager *SurfaceManager::instance()
2727{
28− if (!the_surface_manager) {
29− the_surface_manager = new SurfaceManager();
30− }
3128 return the_surface_manager;
3229}
3330
@@ -35,7 +32,10 @@ SurfaceManager::SurfaceManager(QObject *parent) :
3532 QObject(parent)
3633 , m_virtualKeyboard(nullptr)
3734{
38− m_virtualKeyboard = new VirtualKeyboard(this);
35+ Q_ASSERT(the_surface_manager == nullptr);
36+ the_surface_manager = this;
37+
38+ m_virtualKeyboard = new VirtualKeyboard;
3939 connect(m_virtualKeyboard, &QObject::destroyed, this, [this](QObject *obj) {
4040 MirSurface* surface = qobject_cast<MirSurface*>(obj);
4141 m_virtualKeyboard = nullptr;
@@ -44,6 +44,12 @@ SurfaceManager::SurfaceManager(QObject *parent) :
4444 });
4545}
4646
47+SurfaceManager::~SurfaceManager()
48+{
49+ Q_ASSERT(the_surface_manager == this);
50+ the_surface_manager = nullptr;
51+}
52+
4753MirSurface *SurfaceManager::createSurface(const QString& name,
4854 Mir::Type type,
4955 Mir::State state,
tests/mocks/Unity/Application/SurfaceManager.h+3−2
@@ -1,5 +1,5 @@
11/*
2− * Copyright (C) 2014-2015 Canonical, Ltd.
2+ * Copyright (C) 2014-2016 Canonical, Ltd.
33 *
44 * This program is free software; you can redistribute it and/or modify
55 * it under the terms of the GNU General Public License as published by
@@ -37,8 +37,9 @@ class SurfaceManager : public QObject
3737
3838public:
3939 explicit SurfaceManager(QObject *parent = 0);
40+ virtual ~SurfaceManager();
4041
41− static SurfaceManager *singleton();
42+ static SurfaceManager *instance();
4243
4344 Q_INVOKABLE MirSurface* createSurface(const QString& name,
4445 Mir::Type type,
tests/mocks/Unity/Application/VirtualKeyboard.cpp+2−3
@@ -22,13 +22,12 @@
2222
2323#include <QDebug>
2424
25−VirtualKeyboard::VirtualKeyboard(QObject *parent)
25+VirtualKeyboard::VirtualKeyboard()
2626 : MirSurface("input-method",
2727 Mir::InputMethodType,
2828 Mir::MinimizedState,
2929 QUrl("qrc:///Unity/Application/vkb_portrait.png"),
30− QUrl("qrc:///Unity/Application/VirtualKeyboard.qml"),
31− parent)
30+ QUrl("qrc:///Unity/Application/VirtualKeyboard.qml"))
3231{
3332}
3433
tests/mocks/Unity/Application/VirtualKeyboard.h+1−1
@@ -25,7 +25,7 @@ class VirtualKeyboard : public MirSurface
2525{
2626 Q_OBJECT
2727public:
28− explicit VirtualKeyboard(QObject *parent = nullptr);
28+ explicit VirtualKeyboard();
2929 ~VirtualKeyboard();
3030};
3131
tests/mocks/Unity/Application/plugin.cpp+4−2
@@ -36,7 +36,8 @@ static QObject* applicationManagerSingleton(QQmlEngine* engine, QJSEngine* scrip
3636static QObject* surfaceManagerSingleton(QQmlEngine* engine, QJSEngine* scriptEngine) {
3737 Q_UNUSED(engine);
3838 Q_UNUSED(scriptEngine);
39− return SurfaceManager::singleton();
39+ // QQmlEngine takes ownership over it (ie, it's deleted on ~QQmlEngine)
40+ return new SurfaceManager;
4041}
4142
4243static QObject* ubuntuKeyboardInfoSingleton(QQmlEngine*, QJSEngine*) {
@@ -45,7 +46,8 @@ static QObject* ubuntuKeyboardInfoSingleton(QQmlEngine*, QJSEngine*) {
4546
4647static QObject* mirFocusControllerSingleton(QQmlEngine*, QJSEngine*)
4748{
48− return MirFocusController::instance();
49+ // QQmlEngine takes ownership over it (ie, it's deleted on ~QQmlEngine)
50+ return new MirFocusController;
4951}
5052
5153void FakeUnityApplicationQmlPlugin::registerTypes(const char *uri)