on xenial help sign in
Support switching the indicator profile on the fly, as the greeter appears and disappears. (But don't use it yet, not until the settings panel to control this is in place.)

These changes are mostly two types: adding support for switching profiles at all after startup and caching previous results for a moment while we do the switching. Fixes: #1358340 Approved by: PS Jenkins bot, Nick Dedekind

commit7754b789d6e7a7f821b69daf8ef9fe56edf6b417 authorMichael Terry <michael.terry@canonical.com> dateWed 11 Feb 2015, 17:12 (12 years ago) parentd6b7ae584782df
17 files changed+201−43
plugins/Unity/Indicators/indicator.cpp+23−8 plugins/Unity/Indicators/indicator.h+5−1 plugins/Unity/Indicators/indicatorsmanager.cpp+17−3 plugins/Unity/Indicators/indicatorsmanager.h+6−1 plugins/Unity/Indicators/indicatorsmodel.cpp+25−2 plugins/Unity/Indicators/indicatorsmodel.h+6−1 plugins/Unity/Indicators/modelactionrootstate.cpp+4−2 plugins/Unity/Indicators/unitymenumodelcache.cpp+8−11 plugins/Unity/Indicators/unitymenumodelcache.h+2−2 qml/Shell.qml+3−1 tests/mocks/Unity/Indicators/fakeindicatorsmodel.cpp+13−1 tests/mocks/Unity/Indicators/fakeindicatorsmodel.h+6 tests/plugins/Unity/Indicators/indicatorsmanagertest.cpp+30−5 tests/plugins/Unity/Indicators/indicatorsmodeltest.cpp+6−3 tests/plugins/Unity/Indicators/sharedunitymenumodeltest.cpp+2−2 tests/qmltests/tst_Shell.qml+29 tests/qmltests/tst_ShellWithPin.qml+16
plugins/Unity/Indicators/indicator.cpp+23−8
@@ -31,24 +31,26 @@ Indicator::~Indicator()
3131{
3232}
3333
34−void Indicator::init(const QString &profile, const QString& busName, const QSettings& settings)
34+void Indicator::init(const QString& busName, const QSettings& settings)
3535{
36− setId(settings.value("Indicator Service/Name").toString());
36+ // Save all keys we care about from the QSettings object. It's annoying
37+ // that we can't just copy the object.
38+ m_settings.clear();
39+ Q_FOREACH(const QString& key, settings.allKeys()) {
40+ if (key.endsWith("/Position") || key.endsWith("/ObjectPath")) {
41+ m_settings.insert(key, settings.value(key));
42+ }
43+ }
3744
38− QVariant pos = settings.value(profile + "/Position");
39− if (!pos.isValid())
40− pos = settings.value("Indicator Service/Position", QVariant::fromValue(0));
41− setPosition(pos.toInt());
45+ setId(settings.value("Indicator Service/Name").toString());
4246
4347 QString actionObjectPath = settings.value("Indicator Service/ObjectPath").toString();
44− QString menuObjectPath = settings.value(profile + "/ObjectPath").toString();
4548
4649 QVariantMap properties;
4750 properties.clear();
4851 properties.insert("busType", 1);
4952 properties.insert("busName", busName);
5053 properties.insert("actionsObjectPath", actionObjectPath);
51− properties.insert("menuObjectPath", menuObjectPath);
5254 setIndicatorProperties(properties);
5355}
5456
@@ -78,6 +80,19 @@ void Indicator::setPosition(int position)
7880 }
7981}
8082
83+void Indicator::setProfile(const QString& profile)
84+{
85+ QVariant pos = m_settings.value(profile + "/Position");
86+ if (!pos.isValid())
87+ pos = m_settings.value("Indicator Service/Position", QVariant::fromValue(0));
88+ setPosition(pos.toInt());
89+
90+ QString menuObjectPath = m_settings.value(profile + "/ObjectPath").toString();
91+ QVariantMap map = m_properties.toMap();
92+ map.insert("menuObjectPath", menuObjectPath);
93+ setIndicatorProperties(map);
94+}
95+
8196QVariant Indicator::indicatorProperties() const
8297{
8398 return m_properties;
plugins/Unity/Indicators/indicator.h+5−1
@@ -35,12 +35,15 @@ public:
3535 Indicator(QObject *parent = 0);
3636 virtual ~Indicator();
3737
38− void init(const QString &profile, const QString& busName, const QSettings& settings);
38+ void init(const QString& busName, const QSettings& settings);
3939
4040 QString identifier() const;
4141 int position() const;
4242 QVariant indicatorProperties() const;
4343
44+public Q_SLOTS:
45+ void setProfile(const QString& profile);
46+
4447Q_SIGNALS:
4548 void identifierChanged(const QString &identifier);
4649 void positionChanged(int position);
@@ -55,6 +58,7 @@ private:
5558 QString m_identifier;
5659 int m_position;
5760 QVariant m_properties;
61+ QVariantMap m_settings;
5862};
5963
6064#endif // INDICATOR_H
plugins/Unity/Indicators/indicatorsmanager.cpp+17−3
@@ -54,10 +54,9 @@ IndicatorsManager::~IndicatorsManager()
5454
5555}
5656
57−void IndicatorsManager::load(const QString& profile)
57+void IndicatorsManager::load()
5858{
5959 unload();
60− m_profile = profile;
6160
6261 QStringList xdgLocations = shellDataDirs();//QStandardPaths::standardLocations(QStandardPaths::GenericDataLocation);
6362
@@ -216,6 +215,19 @@ void IndicatorsManager::setLoaded(bool loaded)
216215 }
217216}
218217
218+QString IndicatorsManager::profile() const
219+{
220+ return m_profile;
221+}
222+
223+void IndicatorsManager::setProfile(const QString& profile)
224+{
225+ if (m_profile != profile) {
226+ m_profile = profile;
227+ Q_EMIT profileChanged(m_profile);
228+ }
229+}
230+
219231void IndicatorsManager::startVerify(const QString& path)
220232{
221233 QHashIterator<QString, IndicatorData*> iter(m_indicatorsData);
@@ -268,7 +280,9 @@ Indicator::Ptr IndicatorsManager::indicator(const QString& indicator_name)
268280 Indicator::Ptr new_indicator(new Indicator(this));
269281 data->m_indicator = new_indicator;
270282 QSettings settings(data->m_fileInfo.absoluteFilePath(), QSettings::IniFormat, this);
271− new_indicator->init(m_profile, data->m_fileInfo.fileName(), settings);
283+ new_indicator->init(data->m_fileInfo.fileName(), settings);
284+ new_indicator->setProfile(m_profile);
285+ QObject::connect(this, SIGNAL(profileChanged(const QString&)), new_indicator.data(), SLOT(setProfile(const QString&)));
272286 return new_indicator;
273287}
274288
plugins/Unity/Indicators/indicatorsmanager.h+6−1
@@ -32,13 +32,17 @@ class UNITYINDICATORS_EXPORT IndicatorsManager : public QObject
3232{
3333 Q_OBJECT
3434 Q_PROPERTY(bool loaded READ isLoaded NOTIFY loadedChanged)
35+ Q_PROPERTY(QString profile READ profile WRITE setProfile NOTIFY profileChanged)
3536public:
3637 explicit IndicatorsManager(QObject* parent = 0);
3738 ~IndicatorsManager();
3839
39− Q_INVOKABLE void load(const QString& profile);
40+ Q_INVOKABLE void load();
4041 Q_INVOKABLE void unload();
4142
43+ QString profile() const;
44+ void setProfile(const QString& profile);
45+
4246 Indicator::Ptr indicator(const QString& indicator_name);
4347
4448 QList<Indicator::Ptr> indicators();
@@ -47,6 +51,7 @@ public:
4751
4852Q_SIGNALS:
4953 void loadedChanged(bool);
54+ void profileChanged(const QString&);
5055
5156 void indicatorLoaded(const QString& indicator_name);
5257 void indicatorAboutToBeUnloaded(const QString& indicator_name);
plugins/Unity/Indicators/indicatorsmodel.cpp+25−2
@@ -56,6 +56,7 @@ IndicatorsModel::IndicatorsModel(QObject *parent)
5656 m_manager = new IndicatorsManager(this);
5757 QObject::connect(m_manager, SIGNAL(indicatorLoaded(const QString&)), this, SLOT(onIndicatorLoaded(const QString&)));
5858 QObject::connect(m_manager, SIGNAL(indicatorAboutToBeUnloaded(const QString&)), this, SLOT(onIndicatorAboutToBeUnloaded(const QString&)));
59+ QObject::connect(m_manager, SIGNAL(profileChanged(const QString&)), this, SIGNAL(profileChanged()));
5960
6061 QObject::connect(this, SIGNAL(rowsInserted(const QModelIndex &, int, int)), this, SIGNAL(countChanged()));
6162 QObject::connect(this, SIGNAL(rowsRemoved(const QModelIndex &, int, int)), this, SIGNAL(countChanged()));
@@ -80,15 +81,37 @@ int IndicatorsModel::count() const
8081 return rowCount();
8182}
8283
84+/*!
85+ \qmlproperty IndicatorsModel::profile
86+ The indicator profile to use for the model.
87+
88+ \b Note: methods should only be called after the Component has completed.
89+*/
90+QString IndicatorsModel::profile() const
91+{
92+ return m_manager->profile();
93+}
94+
95+/*!
96+ \qmlproperty IndicatorsModel::setProfile
97+ Set the indicator profile to use for the model.
98+
99+ \b Note: methods should only be called after the Component has completed.
100+*/
101+void IndicatorsModel::setProfile(const QString &profile)
102+{
103+ m_manager->setProfile(profile);
104+}
105+
83106/*!
84107 \qmlmethod IndicatorsModel::unload()
85108
86109 Load all indicators.
87110*/
88−void IndicatorsModel::load(const QString& profile)
111+void IndicatorsModel::load()
89112{
90113 m_indicators.clear();
91− m_manager->load(profile);
114+ m_manager->load();
92115}
93116
94117/*!
plugins/Unity/Indicators/indicatorsmodel.h+6−1
@@ -34,17 +34,21 @@ class UNITYINDICATORS_EXPORT IndicatorsModel : public QAbstractListModel
3434 Q_OBJECT
3535 Q_ENUMS(Roles)
3636 Q_PROPERTY(int count READ count NOTIFY countChanged)
37+ Q_PROPERTY(QString profile READ profile WRITE setProfile NOTIFY profileChanged)
3738
3839public:
3940
4041 IndicatorsModel(QObject *parent=0);
4142 ~IndicatorsModel();
4243
43− Q_INVOKABLE void load(const QString& profile);
44+ Q_INVOKABLE void load();
4445 Q_INVOKABLE void unload();
4546
4647 Q_INVOKABLE QVariant data(int row, int role) const;
4748
49+ QString profile() const;
50+ void setProfile(const QString& profile);
51+
4852 /* QAbstractItemModel */
4953 QHash<int, QByteArray> roleNames() const;
5054 int columnCount(const QModelIndex &parent = QModelIndex()) const;
@@ -55,6 +59,7 @@ public:
5559
5660Q_SIGNALS:
5761 void countChanged();
62+ void profileChanged();
5863 void indicatorDataChanged(const QVariant& data);
5964
6065private Q_SLOTS:
plugins/Unity/Indicators/modelactionrootstate.cpp+4−2
@@ -71,7 +71,7 @@ void ModelActionRootState::setMenu(UnityMenuModel* menu)
7171
7272bool ModelActionRootState::valid() const
7373{
74− return m_menu && m_menu->rowCount() > 0;
74+ return !currentState().empty();
7575}
7676
7777void ModelActionRootState::onModelRowsAdded(const QModelIndex& parent, int start, int end)
@@ -121,7 +121,9 @@ void ModelActionRootState::updateActionState()
121121 m_menu->setActionStateParser(oldParser);
122122
123123 setCurrentState(state);
124− } else {
124+ } else if (!m_menu) {
125125 setCurrentState(QVariantMap());
126126 }
127+ // else if m_menu->rowCount() == 0, let's leave existing cache in place
128+ // until the new menu comes in, to avoid flashing the UI empty for a moment
127129}
plugins/Unity/Indicators/unitymenumodelcache.cpp+8−11
@@ -46,17 +46,14 @@ QSharedPointer<UnityMenuModel> UnityMenuModelCache::model(const QByteArray& path
4646 QQmlEngine::setObjectOwnership(model, QQmlEngine::CppOwnership);
4747
4848 QSharedPointer<UnityMenuModel> menuModel(model);
49− connect(model, &QObject::destroyed, this, [this] {
50− QMutableHashIterator<QByteArray, QWeakPointer<UnityMenuModel>> iter(m_registry);
51− while(iter.hasNext()) {
52− auto keyVal = iter.next();
53− if (keyVal.value().isNull()) {
54− iter.remove();
55− break;
56− }
57− }
58− });
59− m_registry[path] = menuModel.toWeakRef();
49+
50+ // Keep a shared pointer (rather than weak pointer which would cause the
51+ // model to be deleted when all shared pointers we give out are deleted).
52+ // We want to keep all models cached because when we switch indicator
53+ // profiles, we will be switching paths often. And we want to keep the
54+ // old model around, ready to be used. Otherwise the UI might momentarily
55+ // wait as we populate the model from DBus yet again.
56+ m_registry[path] = menuModel;
6057
6158 menuModel->setMenuObjectPath(path);
6259 return menuModel;
plugins/Unity/Indicators/unitymenumodelcache.h+2−2
@@ -25,7 +25,7 @@
2525#include <QObject>
2626#include <QHash>
2727#include <QPointer>
28−#include <QWeakPointer>
28+#include <QSharedPointer>
2929
3030class UnityMenuModel;
3131
@@ -43,7 +43,7 @@ public:
4343 Q_INVOKABLE virtual bool contains(const QByteArray& path);
4444
4545protected:
46− QHash<QByteArray, QWeakPointer<UnityMenuModel>> m_registry;
46+ QHash<QByteArray, QSharedPointer<UnityMenuModel>> m_registry;
4747 static QPointer<UnityMenuModelCache> theCache;
4848};
4949
qml/Shell.qml+3−1
@@ -766,7 +766,9 @@ Item {
766766 expandedPanelHeight: units.gu(7)
767767
768768 indicatorsModel: Indicators.IndicatorsModel {
769− Component.onCompleted: load(indicatorProfile);
769+ // TODO: This should be sourced by device type (e.g. "desktop", "tablet", "phone"...)
770+ profile: indicatorProfile
771+ Component.onCompleted: load()
770772 }
771773 }
772774 callHint {
tests/mocks/Unity/Indicators/fakeindicatorsmodel.cpp+13−1
@@ -21,7 +21,8 @@
2121#include "indicators.h"
2222
2323FakeIndicatorsModel::FakeIndicatorsModel(QObject *parent)
24− : QAbstractListModel(parent)
24+ : QAbstractListModel(parent),
25+ m_profile("phone")
2526{
2627 QObject::connect(this, SIGNAL(rowsInserted(const QModelIndex &, int, int)), this, SIGNAL(countChanged()));
2728 QObject::connect(this, SIGNAL(rowsRemoved(const QModelIndex &, int, int)), this, SIGNAL(countChanged()));
@@ -38,6 +39,17 @@ int FakeIndicatorsModel::count() const
3839 return rowCount();
3940}
4041
42+QString FakeIndicatorsModel::profile() const
43+{
44+ return m_profile;
45+}
46+
47+void FakeIndicatorsModel::setProfile(const QString& profile)
48+{
49+ m_profile = profile;
50+ Q_EMIT profileChanged();
51+}
52+
4153void FakeIndicatorsModel::load(const QString&)
4254{
4355}
tests/mocks/Unity/Indicators/fakeindicatorsmodel.h+6
@@ -27,7 +27,9 @@ class FakeIndicatorsModel : public QAbstractListModel
2727 Q_OBJECT
2828 Q_ENUMS(Roles)
2929 Q_PROPERTY(int count READ count NOTIFY countChanged)
30+ Q_PROPERTY(QString profile READ profile WRITE setProfile NOTIFY profileChanged)
3031 Q_PROPERTY(QVariant modelData READ modelData WRITE setModelData NOTIFY modelDataChanged)
32+
3133public:
3234
3335 FakeIndicatorsModel(QObject *parent=0);
@@ -42,6 +44,8 @@ public:
4244
4345 Q_INVOKABLE QVariant data(int row, int role) const;
4446
47+ QString profile() const;
48+ void setProfile(const QString& profile);
4549 void setModelData(const QVariant& data);
4650 QVariant modelData() const { return m_modelData; }
4751
@@ -54,11 +58,13 @@ public:
5458
5559Q_SIGNALS:
5660 void countChanged();
61+ void profileChanged();
5762 void modelDataChanged();
5863
5964private:
6065 int count() const;
6166
67+ QString m_profile;
6268 QVariant m_modelData;
6369};
6470
tests/plugins/Unity/Indicators/indicatorsmanagertest.cpp+30−5
@@ -50,7 +50,8 @@ private Q_SLOTS:
5050 QVERIFY(!manager.isLoaded());
5151 QCOMPARE(manager.indicators().count(), 0);
5252
53− manager.load("test1");
53+ manager.setProfile("test1");
54+ manager.load();
5455
5556 QVERIFY(manager.isLoaded());
5657 QCOMPARE(manager.indicators().count(), 4);
@@ -67,7 +68,8 @@ private Q_SLOTS:
6768 void testPluginInterfaceProfile1()
6869 {
6970 IndicatorsManager manager;
70− manager.load("test1");
71+ manager.setProfile("test1");
72+ manager.load();
7173
7274 Indicator::Ptr indicator = manager.indicator("indicator-fake1");
7375 QVERIFY(indicator ? true : false);
@@ -90,7 +92,8 @@ private Q_SLOTS:
9092 void testPluginInterfaceProfile2()
9193 {
9294 IndicatorsManager manager;
93− manager.load("test2");
95+ manager.setProfile("test2");
96+ manager.load();
9497
9598 Indicator::Ptr indicator = manager.indicator("indicator-fake1");
9699 QVERIFY(indicator ? true : false);
@@ -107,13 +110,34 @@ private Q_SLOTS:
107110 QCOMPARE(props["menuObjectPath"].toString(), QString("/com/canonical/indicator/fake1/test2"));
108111 }
109112
113+ /*
114+ * Test switching the indicator profile data
115+ */
116+ void testPluginInterfaceProfileSwitch()
117+ {
118+ IndicatorsManager manager;
119+ manager.setProfile("test1");
120+ manager.load();
121+
122+ Indicator::Ptr indicator = manager.indicator("indicator-fake1");
123+ QVERIFY(indicator ? true : false);
124+
125+ QVariantMap props = indicator->indicatorProperties().toMap();
126+ QCOMPARE(props["menuObjectPath"].toString(), QString("/com/canonical/indicator/fake1/test1"));
127+
128+ manager.setProfile("test2");
129+ props = indicator->indicatorProperties().toMap();
130+ QCOMPARE(props["menuObjectPath"].toString(), QString("/com/canonical/indicator/fake1/test2"));
131+ }
132+
110133 /*
111134 * Test if a new plugin object is create for each different plugin
112135 */
113136 void testPluginInstance()
114137 {
115138 IndicatorsManager manager;
116− manager.load("test2");
139+ manager.setProfile("test2");
140+ manager.load();
117141
118142 Indicator::Ptr i0 = manager.indicator("indicator-fake1");
119143 Indicator::Ptr i1 = manager.indicator("indicator-fake1");
@@ -133,7 +157,8 @@ private Q_SLOTS:
133157 void testPluginInitAndShutdown()
134158 {
135159 IndicatorsManager manager;
136− manager.load("test1");
160+ manager.setProfile("test1");
161+ manager.load();
137162
138163 QWeakPointer<Indicator> wp0;
139164 QWeakPointer<Indicator> wp1;
tests/plugins/Unity/Indicators/indicatorsmodeltest.cpp+6−3
@@ -47,10 +47,11 @@ private Q_SLOTS:
4747 void testLoad()
4848 {
4949 IndicatorsModel model;
50+ model.setProfile("test1");
5051
5152 QCOMPARE(model.property("count").toInt(), 0);
5253
53− model.load("test1");
54+ model.load();
5455
5556 QCOMPARE(model.property("count").toInt(), 4);
5657
@@ -67,7 +68,8 @@ private Q_SLOTS:
6768 {
6869 // Priority order. (2, 1, 4, 3)
6970 IndicatorsModel model;
70− model.load("test1");
71+ model.setProfile("test1");
72+ model.load();
7173
7274 // should be in order:
7375 // fake3, fake4, fake1, fake2
@@ -104,7 +106,8 @@ private Q_SLOTS:
104106 {
105107 // Priority order. (2, 1, 4, 3)
106108 IndicatorsModel model;
107− model.load("test2");
109+ model.setProfile("test2");
110+ model.load();
108111
109112 // should be in order:
110113 // fake3, fake4, fake1, fake2
tests/plugins/Unity/Indicators/sharedunitymenumodeltest.cpp+2−2
@@ -61,7 +61,7 @@ private Q_SLOTS:
6161 QCOMPARE(model1->model(), model2->model());
6262 }
6363
64− void testSharedOwnership()
64+ void testSavedData()
6565 {
6666 QSharedPointer<SharedUnityMenuModel> model1(createFullModel("test1"));
6767 QSharedPointer<SharedUnityMenuModel> model2(createFullModel("test1"));
@@ -70,7 +70,7 @@ private Q_SLOTS:
7070 model1.clear();
7171 QCOMPARE(UnityMenuModelCache::singleton()->contains("/com/canonical/test1"), true);
7272 model2.clear();
73− QCOMPARE(UnityMenuModelCache::singleton()->contains("/com/canonical/test1"), false);
73+ QCOMPARE(UnityMenuModelCache::singleton()->contains("/com/canonical/test1"), true);
7474 }
7575
7676 // Tests that changing cached model data does not change the model path of others
tests/qmltests/tst_Shell.qml+29
@@ -25,6 +25,7 @@ import Ubuntu.Components 1.1
2525import Ubuntu.Telephony 0.1 as Telephony
2626import Unity.Application 0.1
2727import Unity.Connectivity 0.1
28+import Unity.Indicators 0.1
2829import Unity.Notifications 1.0
2930import Unity.Test 0.1 as UT
3031import Powerd 0.1
@@ -172,6 +173,7 @@ Item {
172173
173174 function init() {
174175 tryCompare(shell, "enabled", true); // enabled by greeter when ready
176+ shell.indicatorProfile = "phone";
175177
176178 swipeAwayGreeter();
177179
@@ -567,6 +569,33 @@ Item {
567569 && itemRectInShell.y + itemRectInShell.height <= shell.height;
568570 }
569571
572+ function test_greeterDoesNotChangeIndicatorProfile() {
573+ var panel = findChild(shell, "panel");
574+ tryCompare(panel.indicators.indicatorsModel, "profile", shell.indicatorProfile);
575+
576+ LightDM.Greeter.showGreeter();
577+ tryCompare(panel.indicators.indicatorsModel, "profile", shell.indicatorProfile);
578+
579+ LightDM.Greeter.hideGreeter();
580+ tryCompare(panel.indicators.indicatorsModel, "profile", shell.indicatorProfile);
581+ }
582+
583+ function test_shellProfileChangesReachIndicators() {
584+ var panel = findChild(shell, "panel");
585+
586+ shell.indicatorProfile = "test1";
587+ for (var i = 0; i < panel.indicators.indicatorsModel.count; ++i) {
588+ var properties = panel.indicators.indicatorsModel.data(i, IndicatorsModelRole.IndicatorProperties);
589+ verify(properties["menuObjectPath"].substr(-5), "test1");
590+ }
591+
592+ shell.indicatorProfile = "test2";
593+ for (var i = 0; i < panel.indicators.indicatorsModel.count; ++i) {
594+ var properties = panel.indicators.indicatorsModel.data(i, IndicatorsModelRole.IndicatorProperties);
595+ verify(properties["menuObjectPath"].substr(-5), "test2");
596+ }
597+ }
598+
570599 function test_focusRequestedHidesGreeter() {
571600 var greeter = findChild(shell, "greeter");
572601
tests/qmltests/tst_ShellWithPin.qml+16
@@ -232,6 +232,22 @@ Item {
232232 tryCompare(ApplicationManager, "focusedApplicationId", app)
233233 }
234234
235+ function test_greeterChangesIndicatorProfile() {
236+ skip("Not supported yet, waiting on design for new settings panel");
237+
238+ var panel = findChild(shell, "panel");
239+ tryCompare(panel.indicators.indicatorsModel, "profile", shell.indicatorProfile + "_greeter");
240+
241+ LightDM.Greeter.hideGreeter();
242+ tryCompare(panel.indicators.indicatorsModel, "profile", shell.indicatorProfile);
243+
244+ LightDM.Greeter.showGreeter();
245+ tryCompare(panel.indicators.indicatorsModel, "profile", shell.indicatorProfile + "_greeter");
246+
247+ LightDM.Greeter.hideGreeter();
248+ tryCompare(panel.indicators.indicatorsModel, "profile", shell.indicatorProfile);
249+ }
250+
235251 function test_login() {
236252 sessionSpy.clear()
237253 tryCompare(sessionSpy, "count", 0)