Merge lp:~nick-dedekind/unity8/sharedunitymenumodel into lp:unity8

Proposed by Nick Dedekind
Status: Merged
Approved by: Albert Astals Cid
Approved revision: 1278
Merged at revision: 1373
Proposed branch: lp:~nick-dedekind/unity8/sharedunitymenumodel
Merge into: lp:unity8
Diff against target: 2734 lines (+958/-783)
66 files modified
plugins/AccountsService/AccountsService.qmltypes (+2/-0)
plugins/Dash/Dash.qmltypes (+3/-0)
plugins/LightDM/LightDM.qmltypes (+1/-0)
plugins/Ubuntu/Payments/Payments.qmltypes (+1/-0)
plugins/Unity/DashCommunicator/DashCommunicator.qmltypes (+17/-4)
plugins/Unity/Indicators/CMakeLists.txt (+1/-0)
plugins/Unity/Indicators/Indicators.qmltypes (+10/-7)
plugins/Unity/Indicators/plugin.cpp (+8/-2)
plugins/Unity/Indicators/plugin.h (+1/-1)
plugins/Unity/Indicators/sharedunitymenumodel.cpp (+87/-0)
plugins/Unity/Indicators/sharedunitymenumodel.h (+66/-0)
plugins/Unity/Indicators/unitymenumodelcache.cpp (+28/-13)
plugins/Unity/Indicators/unitymenumodelcache.h (+15/-9)
plugins/Unity/Launcher/Launcher.qmltypes (+17/-12)
plugins/Unity/Session/Session.qmltypes (+10/-0)
plugins/Utils/Utils.qmltypes (+6/-0)
qml/Greeter/Clock.qml (+9/-9)
qml/Panel/Indicators/CachedUnityMenuModel.qml (+0/-39)
qml/Panel/Indicators/IndicatorBase.qml (+2/-2)
tests/mocks/AccountsService/AccountsService.qmltypes (+2/-0)
tests/mocks/LightDM/LightDM.qmltypes (+1/-0)
tests/mocks/QMenuModel/QMenuModel.qmltypes (+1/-1)
tests/mocks/QMenuModel/unitymenumodel.cpp (+1/-2)
tests/mocks/QMenuModel/unitymenumodel.h (+6/-2)
tests/mocks/Ubuntu/Payments/Payments.qmltypes (+2/-0)
tests/mocks/Ubuntu/Telephony/Telephony.qmltypes (+2/-1)
tests/mocks/Unity/Application/Application.qmltypes (+13/-0)
tests/mocks/Unity/DashCommunicator/DashCommunicator.qmltypes (+2/-2)
tests/mocks/Unity/Indicators/CMakeLists.txt (+3/-10)
tests/mocks/Unity/Indicators/FakeMenuPage.qml (+0/-27)
tests/mocks/Unity/Indicators/Indicators.qmltypes (+41/-11)
tests/mocks/Unity/Indicators/IndicatorsModel.qml (+143/-35)
tests/mocks/Unity/Indicators/RootActionState.qml (+17/-9)
tests/mocks/Unity/Indicators/fakeindicatorsmodel.cpp (+60/-29)
tests/mocks/Unity/Indicators/fakeindicatorsmodel.h (+8/-2)
tests/mocks/Unity/Indicators/fakeplugin.cpp (+8/-4)
tests/mocks/Unity/Indicators/fakeunitymenumodelcache.cpp (+57/-0)
tests/mocks/Unity/Indicators/fakeunitymenumodelcache.h (+49/-0)
tests/mocks/Unity/Indicators/indicators_fake.qrc (+0/-14)
tests/mocks/Unity/Indicators/qml/fake_menu_page1.qml (+0/-35)
tests/mocks/Unity/Indicators/qml/fake_menu_page2.qml (+0/-35)
tests/mocks/Unity/Indicators/qml/fake_menu_page3.qml (+0/-35)
tests/mocks/Unity/Indicators/qml/fake_menu_page4.qml (+0/-35)
tests/mocks/Unity/Indicators/qml/fake_menu_page5.qml (+0/-35)
tests/mocks/Unity/Indicators/qml/fake_menu_widget1.qml (+0/-23)
tests/mocks/Unity/Indicators/qml/fake_menu_widget2.qml (+0/-23)
tests/mocks/Unity/Indicators/qml/fake_menu_widget3.qml (+0/-23)
tests/mocks/Unity/Indicators/qml/fake_menu_widget4.qml (+0/-23)
tests/mocks/Unity/Indicators/qml/fake_menu_widget5.qml (+0/-23)
tests/mocks/Unity/Indicators/qmldir (+0/-1)
tests/mocks/Unity/Launcher/Launcher.qmltypes (+13/-0)
tests/mocks/Unity/Unity.qmltypes (+32/-0)
tests/plugins/Unity/Indicators/CMakeLists.txt (+1/-0)
tests/plugins/Unity/Indicators/sharedunitymenumodeltest.cpp (+102/-0)
tests/qmltests/CMakeLists.txt (+7/-8)
tests/qmltests/Greeter/tst_Clock.qml (+57/-40)
tests/qmltests/Panel/Indicators/tst_CachedUnityMenuModel.qml (+0/-137)
tests/qmltests/Panel/Indicators/tst_DefaultIndicatorPage.qml (+21/-24)
tests/qmltests/Panel/Indicators/tst_DefaultIndicatorWidget.qml (+0/-8)
tests/qmltests/Panel/tst_IndicatorItem.qml (+1/-1)
tests/qmltests/Panel/tst_IndicatorRow.qml (+17/-19)
tests/qmltests/Panel/tst_Indicators.qml (+1/-0)
tests/qmltests/Panel/tst_MenuContent.qml (+0/-8)
tests/qmltests/tst_Shell.qml (+2/-0)
tests/qmltests/tst_ShellWithPin.qml (+2/-0)
tests/qmltests/tst_TabletShell.qml (+2/-0)
To merge this branch: bzr merge lp:~nick-dedekind/unity8/sharedunitymenumodel
Reviewer Review Type Date Requested Status
PS Jenkins bot (community) continuous-integration Needs Fixing
Albert Astals Cid (community) Approve
Michael Terry Pending
Review via email: mp+234460@code.launchpad.net

Commit message

remove qml ownership confusion for caching unitymenumodels

Description of the change

Changed to use QSharedPointers for unitymenumodel owenership.
Renamed CachedUnityMenuModel -> SharedUnityMenuModel

Uses new method for mocking Indicators & menu content.

* Are there any related MPs required for this MP to build/function as expected? Please list.
No

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

 * Did you make sure that your branch does not contain spurious tags?
Yes

 * If you changed the packaging (debian), did you subscribe the ubuntu-unity team to this MP?
n/a

 * If you changed the UI, has there been a design review?
n/a

To post a comment you must log in.
Revision history for this message
PS Jenkins bot (ps-jenkins) wrote :
review: Needs Fixing (continuous-integration)
Revision history for this message
PS Jenkins bot (ps-jenkins) wrote :
review: Needs Fixing (continuous-integration)
Revision history for this message
PS Jenkins bot (ps-jenkins) wrote :
review: Needs Fixing (continuous-integration)
Revision history for this message
Michael Terry (mterry) :
Revision history for this message
Albert Astals Cid (aacid) wrote :

Text conflict in plugins/Unity/Indicators/plugin.cpp
1 conflicts encountered.

Revision history for this message
PS Jenkins bot (ps-jenkins) wrote :
review: Needs Fixing (continuous-integration)
Revision history for this message
PS Jenkins bot (ps-jenkins) wrote :
review: Needs Fixing (continuous-integration)
Revision history for this message
PS Jenkins bot (ps-jenkins) wrote :
review: Needs Fixing (continuous-integration)
Revision history for this message
PS Jenkins bot (ps-jenkins) wrote :
review: Needs Fixing (continuous-integration)
Revision history for this message
Albert Astals Cid (aacid) wrote :

Text conflict in tests/qmltests/CMakeLists.txt
Text conflict in tests/qmltests/tst_ShellWithPin.qml
2 conflicts encountered.

Revision history for this message
Michael Terry (mterry) wrote :

I looked at this briefly today. My comment from earlier still stands -- it's unsafe to assume Qml won't delete the singleton object you pass it. For example, if the Qml that loaded the plugin is destroyed, so will the plugin's objects.

Since you use ::singleton() calls elsewhere in code, you can't just give Qml a new object when it asks and outsource singleton-enforcement to Qml. But can you use a QPointer object as a return? I think it expects a QObject * pointer directly...

Revision history for this message
Albert Astals Cid (aacid) wrote :

if (keyVal.value().toStrongRef().isNull()) {

Can we just use

if (keyVal.value().isNull()) {

?

review: Needs Information
Revision history for this message
Nick Dedekind (nick-dedekind) wrote :

> if (keyVal.value().toStrongRef().isNull()) {
>
> Can we just use
>
> if (keyVal.value().isNull()) {
>
> ?

As far as I'm aware QWeakPointer::isNull only checks if the internal data is set, not if the shared data is still valid.

Revision history for this message
Albert Astals Cid (aacid) wrote :

> > if (keyVal.value().toStrongRef().isNull()) {
> >
> > Can we just use
> >
> > if (keyVal.value().isNull()) {
> >
> > ?
>
> As far as I'm aware QWeakPointer::isNull only checks if the internal data is
> set, not if the shared data is still valid.

The docu says

***
Returns true if this object is holding a reference to a null pointer.

Note that, due to the nature of weak references, the pointer that QWeakPointer references can become null at any moment, so the value returned from this function can change from false to true from one call to the next.
***

And the code does

***
return d == 0 || d->strongref.load() == 0 || value == 0;
***

So it seems to me it does work on the shared data too.

Revision history for this message
Nick Dedekind (nick-dedekind) wrote :

> I looked at this briefly today. My comment from earlier still stands -- it's
> unsafe to assume Qml won't delete the singleton object you pass it. For
> example, if the Qml that loaded the plugin is destroyed, so will the plugin's
> objects.
>
> Since you use ::singleton() calls elsewhere in code, you can't just give Qml a
> new object when it asks and outsource singleton-enforcement to Qml. But can
> you use a QPointer object as a return? I think it expects a QObject * pointer
> directly...

The only places that use the singleton are in the plugin, so I don't think plugin unloading is an issue? All the SharedUnityMenuModels will have been destroyed by then. I need to merge this with your greeter branch soon anyway, so i'm guessing the shared models will be parented to the cache anyway...

Might be able to use QPointer as the static and give Qml the raw one...

Revision history for this message
Albert Astals Cid (aacid) wrote :

> > I looked at this briefly today. My comment from earlier still stands --
> it's
> > unsafe to assume Qml won't delete the singleton object you pass it. For
> > example, if the Qml that loaded the plugin is destroyed, so will the
> plugin's
> > objects.
> >
> > Since you use ::singleton() calls elsewhere in code, you can't just give Qml
> a
> > new object when it asks and outsource singleton-enforcement to Qml. But can
> > you use a QPointer object as a return? I think it expects a QObject *
> pointer
> > directly...
>
> The only places that use the singleton are in the plugin, so I don't think
> plugin unloading is an issue? All the SharedUnityMenuModels will have been
> destroyed by then. I need to merge this with your greeter branch soon anyway,
> so i'm guessing the shared models will be parented to the cache anyway...

Exactly what I was going to say, you can't call the function that uses the singleton without the plugin so i don't think this is a problem either.

Revision history for this message
Albert Astals Cid (aacid) wrote :

Shall we add a break inside the if in
  connect(model, &QObject::destroyed, this, [this] {
?

As far as i understand the code once it this delete has found a value that is null there should not be any other since every delete clears it's own "null", no?

review: Needs Information
Revision history for this message
Nick Dedekind (nick-dedekind) wrote :

> > > if (keyVal.value().toStrongRef().isNull()) {
> > >
> > > Can we just use
> > >
> > > if (keyVal.value().isNull()) {
> > >
> > > ?
> >
> > As far as I'm aware QWeakPointer::isNull only checks if the internal data is
> > set, not if the shared data is still valid.
>
> The docu says
>
> ***
> Returns true if this object is holding a reference to a null pointer.
>
> Note that, due to the nature of weak references, the pointer that QWeakPointer
> references can become null at any moment, so the value returned from this
> function can change from false to true from one call to the next.
> ***
>
> And the code does
>
> ***
> return d == 0 || d->strongref.load() == 0 || value == 0;
> ***
>
> So it seems to me it does work on the shared data too.

My bad. I hate inline code; was looking at the shared pointer impl for isNull...
Fixed.

Revision history for this message
Nick Dedekind (nick-dedekind) wrote :

> Shall we add a break inside the if in
> connect(model, &QObject::destroyed, this, [this] {
> ?
>
> As far as i understand the code once it this delete has found a value that is
> null there should not be any other since every delete clears it's own "null",
> no?

Yep.
Fixed.

Revision history for this message
Albert Astals Cid (aacid) wrote :

Code looks good to me, and i've played with it in the phone and have not been able to find anything wrong with it either.

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

 * Did CI run pass?
Waiting before top approval

 * Did you make sure that the branch does not contain spurious tags?
Yes

review: Approve
Revision history for this message
PS Jenkins bot (ps-jenkins) wrote :
review: Needs Fixing (continuous-integration)
Revision history for this message
Albert Astals Cid (aacid) wrote :

CI doesn't seem more broken than on other runs, top approving.

Revision history for this message
PS Jenkins bot (ps-jenkins) wrote :
review: Needs Fixing (continuous-integration)
Revision history for this message
Albert Astals Cid (aacid) wrote :

Text conflict in tests/qmltests/tst_ShellWithPin.qml
1 conflicts encountered.

review: Needs Fixing
1277. By Nick Dedekind

merged with trunk

Revision history for this message
Nick Dedekind (nick-dedekind) wrote :

> Text conflict in tests/qmltests/tst_ShellWithPin.qml
> 1 conflicts encountered.

Fixed.

Revision history for this message
Albert Astals Cid (aacid) wrote :

Ok, let's wait for CI run again

review: Approve
Revision history for this message
PS Jenkins bot (ps-jenkins) wrote :
review: Needs Fixing (continuous-integration)
Revision history for this message
Michael Terry (mterry) wrote :

> The only places that use the singleton are in the plugin, so I don't think plugin unloading is an issue?

But the Qml that loaded the plugin could be destroyed and created again, eh? The second time the plugin is loaded, it will hand back an invalid pointer. Stuff like that happens with loaders that contain plugin imports.

I had to fix a crasher in the wizard a while back due to a similar issue is all, that's why I'm sensitive to it. :) The wizard drops references to pages as you press 'back' so it's more likely to hit the issue. But even if we don't hit the issue now in unity8, it's a hidden gotcha waiting to crash us.

Revision history for this message
Albert Astals Cid (aacid) wrote :

I am not still sure i totally understand how this can happen but then maybe we can turn

  UnityMenuModelCache* UnityMenuModelCache::theCache = nullptr;

into
  QPointer<UnityMenuModelCache> UnityMenuModelCache::theCache;

and rely on QPointer magic set to 0 when QObjects are destroyed?

Revision history for this message
Michael Terry (mterry) wrote :

This is how it might happen:

====

main.qml:

Loader {
 source: loadit ? "test.qml" : ""
}

test.qml:

import Unity.Indicators 0.1

====

As test.qml is loaded/unloaded, if it was the only reference to that plugin, Qml would destroy/create the plugin too.

The first time it destroyed the plugin, it would call 'delete' on the singletons the plugin made. Which would leave theCache pointer dangling. So the next time the plugin is loaded, it will pass the Qml a dangling pointer.

Revision history for this message
Michael Terry (mterry) wrote :

One easy fix for this is a destructor for the class that if (this == theCache) { theCache = nullptr; }

1278. By Nick Dedekind

use QPointer to track singleton destruction

Revision history for this message
Nick Dedekind (nick-dedekind) wrote :

> One easy fix for this is a destructor for the class that if (this == theCache)
> { theCache = nullptr; }

went with the QPointer in the end. Gives better encapsulation of the singleton pattern.

Revision history for this message
Albert Astals Cid (aacid) wrote :

Looks good.

review: Approve
Revision history for this message
PS Jenkins bot (ps-jenkins) wrote :
review: Needs Fixing (continuous-integration)
Revision history for this message
PS Jenkins bot (ps-jenkins) wrote :
review: Needs Fixing (continuous-integration)

Preview Diff

[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
1=== modified file 'plugins/AccountsService/AccountsService.qmltypes'
2--- plugins/AccountsService/AccountsService.qmltypes 2014-09-01 12:18:53 +0000
3+++ plugins/AccountsService/AccountsService.qmltypes 2014-10-14 14:19:22 +0000
4@@ -23,6 +23,8 @@
5 }
6 Property { name: "user"; type: "string" }
7 Property { name: "demoEdges"; type: "bool" }
8+ Property { name: "enableLauncherWhileLocked"; type: "bool"; isReadonly: true }
9+ Property { name: "enableIndicatorsWhileLocked"; type: "bool"; isReadonly: true }
10 Property { name: "backgroundFile"; type: "string"; isReadonly: true }
11 Property { name: "statsWelcomeScreen"; type: "bool"; isReadonly: true }
12 Property { name: "passwordDisplayHint"; type: "PasswordDisplayHint"; isReadonly: true }
13
14=== modified file 'plugins/Dash/Dash.qmltypes'
15--- plugins/Dash/Dash.qmltypes 2014-08-14 01:28:06 +0000
16+++ plugins/Dash/Dash.qmltypes 2014-10-14 14:19:22 +0000
17@@ -40,9 +40,12 @@
18 Property { name: "forceNoClip"; type: "bool" }
19 Property { name: "stickyHeaderHeight"; type: "int"; isReadonly: true }
20 Property { name: "headerItemShownHeight"; type: "double"; isReadonly: true }
21+ Property { name: "cacheBuffer"; type: "double" }
22 Signal { name: "headerChanged" }
23 Method { name: "positionAtBeginning" }
24 Method { name: "showHeader" }
25+ Method { name: "firstCreatedIndex"; type: "int" }
26+ Method { name: "createdItemCount"; type: "int" }
27 Method {
28 name: "item"
29 type: "QQuickItem*"
30
31=== modified file 'plugins/LightDM/LightDM.qmltypes'
32--- plugins/LightDM/LightDM.qmltypes 2014-09-01 12:18:53 +0000
33+++ plugins/LightDM/LightDM.qmltypes 2014-10-14 14:19:22 +0000
34@@ -37,6 +37,7 @@
35 Signal { name: "isActiveChanged" }
36 Signal { name: "isAuthenticatedChanged" }
37 Signal { name: "showGreeter" }
38+ Signal { name: "hideGreeter" }
39 Signal {
40 name: "requestAuthenticationUser"
41 Parameter { name: "user"; type: "string" }
42
43=== modified file 'plugins/Ubuntu/Payments/Payments.qmltypes'
44--- plugins/Ubuntu/Payments/Payments.qmltypes 2014-06-27 20:53:24 +0000
45+++ plugins/Ubuntu/Payments/Payments.qmltypes 2014-10-14 14:19:22 +0000
46@@ -37,6 +37,7 @@
47 Parameter { name: "error"; type: "string" }
48 }
49 Signal { name: "purchaseCompleted" }
50+ Signal { name: "purchaseCancelled" }
51 Method { name: "start" }
52 }
53 }
54
55=== modified file 'plugins/Unity/DashCommunicator/DashCommunicator.qmltypes'
56--- plugins/Unity/DashCommunicator/DashCommunicator.qmltypes 2014-08-14 13:33:28 +0000
57+++ plugins/Unity/DashCommunicator/DashCommunicator.qmltypes 2014-10-14 14:19:22 +0000
58@@ -9,14 +9,14 @@
59 Module {
60 Component {
61 name: "DashCommunicator"
62- prototype: "QObject"
63+ prototype: "QThread"
64 exports: ["Unity.DashCommunicator/DashCommunicator 0.1"]
65 exportMetaObjectRevisions: [0]
66 Method {
67 name: "setCurrentScope"
68 Parameter { name: "scopeId"; type: "string" }
69 Parameter { name: "animate"; type: "bool" }
70- Parameter { name: "reset"; type: "bool" }
71+ Parameter { name: "isSwipe"; type: "bool" }
72 }
73 }
74 Component {
75@@ -28,7 +28,20 @@
76 name: "setCurrentScopeRequested"
77 Parameter { name: "scopeId"; type: "string" }
78 Parameter { name: "animate"; type: "bool" }
79- Parameter { name: "reset"; type: "bool" }
80- }
81+ Parameter { name: "isSwipe"; type: "bool" }
82+ }
83+ }
84+ Component {
85+ name: "QThread"
86+ prototype: "QObject"
87+ Signal { name: "started" }
88+ Signal { name: "finished" }
89+ Method {
90+ name: "start"
91+ Parameter { type: "Priority" }
92+ }
93+ Method { name: "start" }
94+ Method { name: "terminate" }
95+ Method { name: "quit" }
96 }
97 }
98
99=== modified file 'plugins/Unity/Indicators/CMakeLists.txt'
100--- plugins/Unity/Indicators/CMakeLists.txt 2014-07-30 16:00:55 +0000
101+++ plugins/Unity/Indicators/CMakeLists.txt 2014-10-14 14:19:22 +0000
102@@ -24,6 +24,7 @@
103 modelprinter.cpp
104 plugin.cpp
105 rootactionstate.cpp
106+ sharedunitymenumodel.cpp
107 unitymenumodelcache.cpp
108 unitymenumodelstack.cpp
109 visibleindicatorsmodel.cpp
110
111=== modified file 'plugins/Unity/Indicators/Indicators.qmltypes'
112--- plugins/Unity/Indicators/Indicators.qmltypes 2014-09-01 12:18:53 +0000
113+++ plugins/Unity/Indicators/Indicators.qmltypes 2014-10-14 14:19:22 +0000
114@@ -210,6 +210,16 @@
115 Signal { name: "indexChanged" }
116 }
117 Component {
118+ name: "SharedUnityMenuModel"
119+ prototype: "QObject"
120+ exports: ["Unity.Indicators/SharedUnityMenuModel 0.1"]
121+ exportMetaObjectRevisions: [0]
122+ Property { name: "busName"; type: "QByteArray" }
123+ Property { name: "menuObjectPath"; type: "QByteArray" }
124+ Property { name: "actions"; type: "QVariantMap" }
125+ Property { name: "model"; type: "UnityMenuModel"; isReadonly: true; isPointer: true }
126+ }
127+ Component {
128 name: "UnityMenuModelCache"
129 prototype: "QObject"
130 exports: ["Unity.Indicators/UnityMenuModelCache 0.1"]
131@@ -217,13 +227,6 @@
132 isSingleton: true
133 exportMetaObjectRevisions: [0]
134 Method {
135- name: "model"
136- type: "UnityMenuModel*"
137- Parameter { name: "bus"; type: "QByteArray" }
138- Parameter { name: "path"; type: "QByteArray" }
139- Parameter { name: "actions"; type: "QVariantMap" }
140- }
141- Method {
142 name: "contains"
143 type: "bool"
144 Parameter { name: "path"; type: "QByteArray" }
145
146=== modified file 'plugins/Unity/Indicators/plugin.cpp'
147--- plugins/Unity/Indicators/plugin.cpp 2014-07-30 16:00:55 +0000
148+++ plugins/Unity/Indicators/plugin.cpp 2014-10-14 14:19:22 +0000
149@@ -30,18 +30,23 @@
150 #include "menucontentactivator.h"
151 #include "modelprinter.h"
152 #include "rootactionstate.h"
153+#include "sharedunitymenumodel.h"
154 #include "unitymenumodelcache.h"
155 #include "unitymenumodelstack.h"
156 #include "visibleindicatorsmodel.h"
157
158+#include <unitymenumodel.h>
159+
160 static QObject* menuModelCacheSingleton(QQmlEngine* engine, QJSEngine* scriptEngine) {
161 Q_UNUSED(engine);
162 Q_UNUSED(scriptEngine);
163- return new UnityMenuModelCache;
164+ return UnityMenuModelCache::singleton();
165 }
166
167-void Indicators2Plugin::registerTypes(const char *uri)
168+void IndicatorsPlugin::registerTypes(const char *uri)
169 {
170+ qRegisterMetaType<UnityMenuModel*>("UnityMenuModel*");
171+
172 qmlRegisterType<IndicatorsManager>(uri, 0, 1, "IndicatorsManager");
173 qmlRegisterType<IndicatorsModel>(uri, 0, 1, "IndicatorsModel");
174 qmlRegisterType<MenuContentActivator>(uri, 0, 1, "MenuContentActivator");
175@@ -49,6 +54,7 @@
176 qmlRegisterType<RootActionState>(uri, 0, 1, "RootActionState");
177 qmlRegisterType<ModelPrinter>(uri, 0, 1, "ModelPrinter");
178 qmlRegisterType<VisibleIndicatorsModel>(uri, 0, 1, "VisibleIndicatorsModel");
179+ qmlRegisterType<SharedUnityMenuModel>(uri, 0, 1, "SharedUnityMenuModel");
180
181 qmlRegisterSingletonType<UnityMenuModelCache>(uri, 0, 1, "UnityMenuModelCache", menuModelCacheSingleton);
182
183
184=== modified file 'plugins/Unity/Indicators/plugin.h'
185--- plugins/Unity/Indicators/plugin.h 2013-08-14 09:07:45 +0000
186+++ plugins/Unity/Indicators/plugin.h 2014-10-14 14:19:22 +0000
187@@ -22,7 +22,7 @@
188
189 #include <QtQml/QQmlExtensionPlugin>
190
191-class Indicators2Plugin : public QQmlExtensionPlugin
192+class IndicatorsPlugin : public QQmlExtensionPlugin
193 {
194 Q_OBJECT
195 Q_PLUGIN_METADATA(IID "org.qt-project.Qt.QQmlExtensionInterface")
196
197=== added file 'plugins/Unity/Indicators/sharedunitymenumodel.cpp'
198--- plugins/Unity/Indicators/sharedunitymenumodel.cpp 1970-01-01 00:00:00 +0000
199+++ plugins/Unity/Indicators/sharedunitymenumodel.cpp 2014-10-14 14:19:22 +0000
200@@ -0,0 +1,87 @@
201+/*
202+ * Copyright 2014 Canonical Ltd.
203+ *
204+ * This program is free software; you can redistribute it and/or modify
205+ * it under the terms of the GNU Lesser General Public License as published by
206+ * the Free Software Foundation; version 3.
207+ *
208+ * This program is distributed in the hope that it will be useful,
209+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
210+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
211+ * GNU Lesser General Public License for more details.
212+ *
213+ * You should have received a copy of the GNU Lesser General Public License
214+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
215+ *
216+ */
217+
218+#include "sharedunitymenumodel.h"
219+#include "unitymenumodelcache.h"
220+
221+SharedUnityMenuModel::SharedUnityMenuModel(QObject* parent)
222+ : QObject(parent)
223+{
224+}
225+
226+QByteArray SharedUnityMenuModel::busName() const
227+{
228+ return m_busName;
229+}
230+
231+void SharedUnityMenuModel::setBusName(const QByteArray& busName)
232+{
233+ if (m_busName != busName) {
234+ m_busName = busName;
235+ Q_EMIT busNameChanged();
236+ initialize();
237+ }
238+}
239+
240+QByteArray SharedUnityMenuModel::menuObjectPath() const
241+{
242+ return m_menuObjectPath;
243+}
244+
245+void SharedUnityMenuModel::setMenuObjectPath(const QByteArray& menuObjectPath)
246+{
247+ if (m_menuObjectPath != menuObjectPath) {
248+ m_menuObjectPath = menuObjectPath;
249+ Q_EMIT menuObjectPathChanged();
250+ initialize();
251+ }
252+}
253+
254+QVariantMap SharedUnityMenuModel::actions() const
255+{
256+ return m_actions;
257+}
258+
259+void SharedUnityMenuModel::setActions(const QVariantMap& actions)
260+{
261+ if (m_actions != actions) {
262+ m_actions = actions;
263+ Q_EMIT actionsChanged();
264+ initialize();
265+ }
266+}
267+
268+UnityMenuModel* SharedUnityMenuModel::model() const
269+{
270+ return m_model ? m_model.data() : nullptr;
271+}
272+
273+void SharedUnityMenuModel::initialize()
274+{
275+ if (m_busName.isEmpty() || m_menuObjectPath.isEmpty() || m_actions.isEmpty()) {
276+ if (!m_model.isNull()) {
277+ m_model.clear();
278+ Q_EMIT modelChanged();
279+ }
280+ } else {
281+ QSharedPointer<UnityMenuModel> model = UnityMenuModelCache::singleton()->model(m_busName, m_menuObjectPath, m_actions);
282+ if (model != m_model) {
283+ m_model = model;
284+ Q_EMIT modelChanged();
285+ }
286+ }
287+}
288
289=== added file 'plugins/Unity/Indicators/sharedunitymenumodel.h'
290--- plugins/Unity/Indicators/sharedunitymenumodel.h 1970-01-01 00:00:00 +0000
291+++ plugins/Unity/Indicators/sharedunitymenumodel.h 2014-10-14 14:19:22 +0000
292@@ -0,0 +1,66 @@
293+/*
294+ * Copyright 2014 Canonical Ltd.
295+ *
296+ * This program is free software; you can redistribute it and/or modify
297+ * it under the terms of the GNU Lesser General Public License as published by
298+ * the Free Software Foundation; version 3.
299+ *
300+ * This program is distributed in the hope that it will be useful,
301+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
302+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
303+ * GNU Lesser General Public License for more details.
304+ *
305+ * You should have received a copy of the GNU Lesser General Public License
306+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
307+ *
308+ */
309+
310+#ifndef SHAREDUNITYMENUMODEL_H
311+#define SHAREDUNITYMENUMODEL_H
312+
313+#include "unityindicatorsglobal.h"
314+
315+#include <QObject>
316+#include <QSharedPointer>
317+#include <QVariantMap>
318+
319+class UnityMenuModel;
320+
321+class UNITYINDICATORS_EXPORT SharedUnityMenuModel : public QObject
322+{
323+ Q_OBJECT
324+ Q_PROPERTY(QByteArray busName READ busName WRITE setBusName NOTIFY busNameChanged)
325+ Q_PROPERTY(QByteArray menuObjectPath READ menuObjectPath WRITE setMenuObjectPath NOTIFY menuObjectPathChanged)
326+ Q_PROPERTY(QVariantMap actions READ actions WRITE setActions NOTIFY actionsChanged)
327+ Q_PROPERTY(UnityMenuModel* model READ model NOTIFY modelChanged)
328+
329+public:
330+ SharedUnityMenuModel(QObject* parent = nullptr);
331+
332+ QByteArray busName() const;
333+ void setBusName(const QByteArray&);
334+
335+ QByteArray menuObjectPath() const;
336+ void setMenuObjectPath(const QByteArray&);
337+
338+ QVariantMap actions() const;
339+ void setActions(const QVariantMap&);
340+
341+ UnityMenuModel* model() const;
342+
343+Q_SIGNALS:
344+ void busNameChanged();
345+ void menuObjectPathChanged();
346+ void actionsChanged();
347+ void modelChanged();
348+
349+private:
350+ void initialize();
351+
352+ QByteArray m_busName;
353+ QByteArray m_menuObjectPath;
354+ QVariantMap m_actions;
355+ QSharedPointer<UnityMenuModel> m_model;
356+};
357+
358+#endif // SHAREDUNITYMENUMODEL_H
359
360=== modified file 'plugins/Unity/Indicators/unitymenumodelcache.cpp'
361--- plugins/Unity/Indicators/unitymenumodelcache.cpp 2014-08-20 09:16:28 +0000
362+++ plugins/Unity/Indicators/unitymenumodelcache.cpp 2014-10-14 14:19:22 +0000
363@@ -20,30 +20,45 @@
364 #include "unitymenumodelcache.h"
365 #include <unitymenumodel.h>
366
367+#include <QQmlEngine>
368+
369+QPointer<UnityMenuModelCache> UnityMenuModelCache::theCache = nullptr;
370+
371+UnityMenuModelCache* UnityMenuModelCache::singleton()
372+{
373+ if (theCache.isNull()) {
374+ theCache = new UnityMenuModelCache();
375+ }
376+ return theCache.data();
377+}
378+
379 UnityMenuModelCache::UnityMenuModelCache(QObject* parent)
380 : QObject(parent)
381 {
382 }
383
384-UnityMenuModelCache::~UnityMenuModelCache()
385-{
386-}
387-
388-UnityMenuModel* UnityMenuModelCache::model(const QByteArray& bus,
389- const QByteArray& path,
390- const QVariantMap& actions)
391+QSharedPointer<UnityMenuModel> UnityMenuModelCache::model(const QByteArray& bus,
392+ const QByteArray& path,
393+ const QVariantMap& actions)
394 {
395 if (m_registry.contains(path))
396 return m_registry[path];
397
398- UnityMenuModel* menuModel = new UnityMenuModel;
399- connect(menuModel, &QObject::destroyed, this, [menuModel, this](QObject*) {
400- QList<QByteArray> keys = m_registry.keys(menuModel);
401- Q_FOREACH(const QByteArray& key, keys) {
402- m_registry.remove(key);
403+ UnityMenuModel* model = new UnityMenuModel;
404+ QQmlEngine::setObjectOwnership(model, QQmlEngine::CppOwnership);
405+
406+ QSharedPointer<UnityMenuModel> menuModel(model);
407+ connect(model, &QObject::destroyed, this, [this] {
408+ QMutableHashIterator<QByteArray, QWeakPointer<UnityMenuModel>> iter(m_registry);
409+ while(iter.hasNext()) {
410+ auto keyVal = iter.next();
411+ if (keyVal.value().isNull()) {
412+ iter.remove();
413+ break;
414+ }
415 }
416 });
417- m_registry[path] = menuModel;
418+ m_registry[path] = menuModel.toWeakRef();
419
420 menuModel->setBusName(bus);
421 menuModel->setMenuObjectPath(path);
422
423=== modified file 'plugins/Unity/Indicators/unitymenumodelcache.h'
424--- plugins/Unity/Indicators/unitymenumodelcache.h 2014-08-26 08:14:44 +0000
425+++ plugins/Unity/Indicators/unitymenumodelcache.h 2014-10-14 14:19:22 +0000
426@@ -24,6 +24,8 @@
427
428 #include <QObject>
429 #include <QHash>
430+#include <QPointer>
431+#include <QWeakPointer>
432
433 class UnityMenuModel;
434
435@@ -32,15 +34,19 @@
436 Q_OBJECT
437 public:
438 UnityMenuModelCache(QObject*parent=nullptr);
439- ~UnityMenuModelCache();
440-
441- Q_INVOKABLE UnityMenuModel* model(const QByteArray& bus,
442- const QByteArray& path,
443- const QVariantMap& actions);
444- Q_INVOKABLE bool contains(const QByteArray& path);
445-
446-private:
447- QHash<QByteArray, UnityMenuModel*> m_registry;
448+
449+ static UnityMenuModelCache* singleton();
450+
451+ virtual QSharedPointer<UnityMenuModel> model(const QByteArray& bus,
452+ const QByteArray& path,
453+ const QVariantMap& actions);
454+
455+ // for tests use
456+ Q_INVOKABLE virtual bool contains(const QByteArray& path);
457+
458+protected:
459+ QHash<QByteArray, QWeakPointer<UnityMenuModel>> m_registry;
460+ static QPointer<UnityMenuModelCache> theCache;
461 };
462
463 #endif // UNITYMENUMODELCACHE_H
464
465=== modified file 'plugins/Unity/Launcher/Launcher.qmltypes'
466--- plugins/Unity/Launcher/Launcher.qmltypes 2014-06-26 07:47:57 +0000
467+++ plugins/Unity/Launcher/Launcher.qmltypes 2014-10-14 14:19:22 +0000
468@@ -13,14 +13,6 @@
469 exports: ["Unity.Launcher/LauncherItem 0.1"]
470 isCreatable: false
471 exportMetaObjectRevisions: [0]
472- Signal {
473- name: "favoriteChanged"
474- Parameter { name: "favorite"; type: "bool" }
475- }
476- Signal {
477- name: "runningChanged"
478- Parameter { name: "running"; type: "bool" }
479- }
480 }
481 Component {
482 name: "LauncherModel"
483@@ -30,6 +22,10 @@
484 isSingleton: true
485 exportMetaObjectRevisions: [0]
486 Method {
487+ name: "requestRemove"
488+ Parameter { name: "appId"; type: "string" }
489+ }
490+ Method {
491 name: "get"
492 type: "unity::shell::launcher::LauncherItemInterface*"
493 Parameter { name: "index"; type: "int" }
494@@ -49,10 +45,6 @@
495 Parameter { name: "appId"; type: "string" }
496 }
497 Method {
498- name: "requestRemove"
499- Parameter { name: "appId"; type: "string" }
500- }
501- Method {
502 name: "quickListActionInvoked"
503 Parameter { name: "appId"; type: "string" }
504 Parameter { name: "actionIndex"; type: "int" }
505@@ -88,6 +80,7 @@
506 Property { name: "recent"; type: "bool"; isReadonly: true }
507 Property { name: "progress"; type: "int"; isReadonly: true }
508 Property { name: "count"; type: "int"; isReadonly: true }
509+ Property { name: "countVisible"; type: "bool"; isReadonly: true }
510 Property { name: "focused"; type: "bool"; isReadonly: true }
511 Property {
512 name: "quickList"
513@@ -96,6 +89,14 @@
514 isPointer: true
515 }
516 Signal {
517+ name: "nameChanged"
518+ Parameter { name: "name"; type: "string" }
519+ }
520+ Signal {
521+ name: "iconChanged"
522+ Parameter { name: "icon"; type: "string" }
523+ }
524+ Signal {
525 name: "pinnedChanged"
526 Parameter { name: "pinned"; type: "bool" }
527 }
528@@ -116,6 +117,10 @@
529 Parameter { name: "count"; type: "int" }
530 }
531 Signal {
532+ name: "countVisibleChanged"
533+ Parameter { name: "countVisible"; type: "bool" }
534+ }
535+ Signal {
536 name: "focusedChanged"
537 Parameter { name: "focused"; type: "bool" }
538 }
539
540=== modified file 'plugins/Unity/Session/Session.qmltypes'
541--- plugins/Unity/Session/Session.qmltypes 2014-08-14 01:28:06 +0000
542+++ plugins/Unity/Session/Session.qmltypes 2014-10-14 14:19:22 +0000
543@@ -34,4 +34,14 @@
544 Method { name: "RequestReboot" }
545 Method { name: "RequestShutdown" }
546 }
547+ Component {
548+ name: "OrientationLock"
549+ prototype: "QObject"
550+ exports: ["Unity.Session/OrientationLock 0.1"]
551+ isCreatable: false
552+ isSingleton: true
553+ exportMetaObjectRevisions: [0]
554+ Property { name: "enabled"; type: "bool"; isReadonly: true }
555+ Property { name: "savedOrientation"; type: "Qt::ScreenOrientation" }
556+ }
557 }
558
559=== modified file 'plugins/Utils/Utils.qmltypes'
560--- plugins/Utils/Utils.qmltypes 2014-08-14 01:28:06 +0000
561+++ plugins/Utils/Utils.qmltypes 2014-10-14 14:19:22 +0000
562@@ -107,6 +107,12 @@
563 }
564 }
565 Component {
566+ name: "RelativeTimeFormatter"
567+ prototype: "TimeFormatter"
568+ exports: ["Utils/RelativeTimeFormatter 0.1"]
569+ exportMetaObjectRevisions: [0]
570+ }
571+ Component {
572 name: "TimeFormatter"
573 prototype: "QObject"
574 exports: ["Utils/GDateTimeFormatter 0.1", "Utils/TimeFormatter 0.1"]
575
576=== modified file 'qml/Greeter/Clock.qml'
577--- qml/Greeter/Clock.qml 2014-08-20 08:39:09 +0000
578+++ qml/Greeter/Clock.qml 2014-10-14 14:19:22 +0000
579@@ -34,21 +34,21 @@
580 }
581 }
582
583- CachedUnityMenuModel {
584+ Indicators.SharedUnityMenuModel {
585 id: timeModel
586 objectName: "timeModel"
587
588 busName: "com.canonical.indicator.datetime"
589- actionsObjectPath: "/com/canonical/indicator/datetime"
590+ actions: { "indicator": "/com/canonical/indicator/datetime" }
591 menuObjectPath: clock.visible ? "/com/canonical/indicator/datetime/phone" : ""
592+ }
593
594- Indicators.RootActionState {
595- menu: timeModel.model
596- onUpdated: {
597- if (timeLabel.text != rightLabel) {
598- timeLabel.text = rightLabel;
599- clock.currentDate = new Date();
600- }
601+ Indicators.RootActionState {
602+ menu: timeModel.model
603+ onUpdated: {
604+ if (timeLabel.text != rightLabel) {
605+ if (rightLabel != "") timeLabel.text = rightLabel;
606+ clock.currentDate = new Date();
607 }
608 }
609 }
610
611=== removed file 'qml/Panel/Indicators/CachedUnityMenuModel.qml'
612--- qml/Panel/Indicators/CachedUnityMenuModel.qml 2014-08-20 08:39:09 +0000
613+++ qml/Panel/Indicators/CachedUnityMenuModel.qml 1970-01-01 00:00:00 +0000
614@@ -1,39 +0,0 @@
615-/*
616- * Copyright 2013 Canonical Ltd.
617- *
618- * This program is free software; you can redistribute it and/or modify
619- * it under the terms of the GNU Lesser General Public License as published by
620- * the Free Software Foundation; version 3.
621- *
622- * This program is distributed in the hope that it will be useful,
623- * but WITHOUT ANY WARRANTY; without even the implied warranty of
624- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
625- * GNU Lesser General Public License for more details.
626- *
627- * You should have received a copy of the GNU Lesser General Public License
628- * along with this program. If not, see <http://www.gnu.org/licenses/>.
629- *
630- * Authors:
631- * Nick Dedekind <nick.dedekind@canonical.com>
632- */
633-
634-import QtQuick 2.0
635-import QMenuModel 0.1
636-import Unity.Indicators 0.1 as Indicators
637-
638-// Make sure we don't duplicate models.
639-Item {
640- id: cachedModel
641- property string busName
642- property string actionsObjectPath
643- property string menuObjectPath
644- readonly property bool ready: busName!=="" && actionsObjectPath!=="" && menuObjectPath!==""
645-
646- property var model: {
647- if (!ready) return null;
648-
649- return Indicators.UnityMenuModelCache.model(cachedModel.busName,
650- cachedModel.menuObjectPath,
651- { "indicator": cachedModel.actionsObjectPath });
652- }
653-}
654
655=== modified file 'qml/Panel/Indicators/IndicatorBase.qml'
656--- qml/Panel/Indicators/IndicatorBase.qml 2014-09-29 10:24:58 +0000
657+++ qml/Panel/Indicators/IndicatorBase.qml 2014-10-14 14:19:22 +0000
658@@ -37,10 +37,10 @@
659 property alias menuModel: cachedModel.model
660 property alias rootActionState: rootAction
661
662- CachedUnityMenuModel {
663+ SharedUnityMenuModel {
664 id: cachedModel
665 busName: indicatorItem.busName
666- actionsObjectPath: indicatorItem.actionsObjectPath
667+ actions: { "indicator": indicatorItem.actionsObjectPath }
668 menuObjectPath: indicatorItem.deviceMenuObjectPath
669 }
670
671
672=== modified file 'tests/mocks/AccountsService/AccountsService.qmltypes'
673--- tests/mocks/AccountsService/AccountsService.qmltypes 2014-09-01 12:18:53 +0000
674+++ tests/mocks/AccountsService/AccountsService.qmltypes 2014-10-14 14:19:22 +0000
675@@ -23,6 +23,8 @@
676 }
677 Property { name: "user"; type: "string" }
678 Property { name: "demoEdges"; type: "bool" }
679+ Property { name: "enableLauncherWhileLocked"; type: "bool" }
680+ Property { name: "enableIndicatorsWhileLocked"; type: "bool" }
681 Property { name: "backgroundFile"; type: "string" }
682 Property { name: "statsWelcomeScreen"; type: "bool" }
683 Property { name: "passwordDisplayHint"; type: "PasswordDisplayHint"; isReadonly: true }
684
685=== modified file 'tests/mocks/LightDM/LightDM.qmltypes'
686--- tests/mocks/LightDM/LightDM.qmltypes 2014-09-01 12:18:53 +0000
687+++ tests/mocks/LightDM/LightDM.qmltypes 2014-10-14 14:19:22 +0000
688@@ -37,6 +37,7 @@
689 Signal { name: "isActiveChanged" }
690 Signal { name: "isAuthenticatedChanged" }
691 Signal { name: "showGreeter" }
692+ Signal { name: "hideGreeter" }
693 Signal {
694 name: "requestAuthenticationUser"
695 Parameter { name: "user"; type: "string" }
696
697=== modified file 'tests/mocks/QMenuModel/QMenuModel.qmltypes'
698--- tests/mocks/QMenuModel/QMenuModel.qmltypes 2014-08-14 01:28:06 +0000
699+++ tests/mocks/QMenuModel/QMenuModel.qmltypes 2014-10-14 14:19:22 +0000
700@@ -18,12 +18,12 @@
701 prototype: "QAbstractListModel"
702 exports: ["QMenuModel/UnityMenuModel 0.1"]
703 exportMetaObjectRevisions: [0]
704- Property { name: "modelData"; type: "QVariant" }
705 Property { name: "busName"; type: "QByteArray" }
706 Property { name: "actions"; type: "QVariantMap" }
707 Property { name: "menuObjectPath"; type: "QByteArray" }
708 Property { name: "actionStateParser"; type: "ActionStateParser"; isPointer: true }
709 Property { name: "nameOwner"; type: "string"; isReadonly: true }
710+ Property { name: "modelData"; type: "QVariant" }
711 Method {
712 name: "insertRow"
713 Parameter { name: "row"; type: "int" }
714
715=== modified file 'tests/mocks/QMenuModel/unitymenumodel.cpp'
716--- tests/mocks/QMenuModel/unitymenumodel.cpp 2014-08-26 08:14:44 +0000
717+++ tests/mocks/QMenuModel/unitymenumodel.cpp 2014-10-14 14:19:22 +0000
718@@ -50,13 +50,12 @@
719 {
720 beginResetModel();
721
722- m_modelData.clear();
723 m_modelData = data.toList();
724+ Q_EMIT modelDataChanged();
725
726 endResetModel();
727 }
728
729-
730 void UnityMenuModel::insertRow(int row, const QVariant& data)
731 {
732 row = qMin(row, rowCount());
733
734=== modified file 'tests/mocks/QMenuModel/unitymenumodel.h'
735--- tests/mocks/QMenuModel/unitymenumodel.h 2014-08-26 08:14:44 +0000
736+++ tests/mocks/QMenuModel/unitymenumodel.h 2014-10-14 14:19:22 +0000
737@@ -27,13 +27,15 @@
738 class Q_DECL_EXPORT UnityMenuModel : public QAbstractListModel
739 {
740 Q_OBJECT
741- Q_PROPERTY(QVariant modelData READ modelData WRITE setModelData NOTIFY modelDataChanged)
742 Q_PROPERTY(QByteArray busName READ busName WRITE setBusName NOTIFY busNameChanged)
743 Q_PROPERTY(QVariantMap actions READ actions WRITE setActions NOTIFY actionsChanged)
744 Q_PROPERTY(QByteArray menuObjectPath READ menuObjectPath WRITE setMenuObjectPath NOTIFY menuObjectPathChanged)
745 Q_PROPERTY(ActionStateParser* actionStateParser READ actionStateParser WRITE setActionStateParser NOTIFY actionStateParserChanged)
746 Q_PROPERTY(QString nameOwner READ nameOwner NOTIFY nameOwnerChanged)
747
748+ // internal mock properties
749+ Q_PROPERTY(QVariant modelData READ modelData WRITE setModelData NOTIFY modelDataChanged)
750+
751 public:
752 UnityMenuModel(QObject *parent = nullptr);
753 virtual ~UnityMenuModel();
754@@ -81,8 +83,10 @@
755 void actionsChanged();
756 void menuObjectPathChanged();
757 void actionStateParserChanged();
758+ void nameOwnerChanged();
759+
760+ // Internal mock usage
761 void modelDataChanged();
762- void nameOwnerChanged();
763
764 private:
765 QVariantMap rowData(int row) const;
766
767=== modified file 'tests/mocks/Ubuntu/Payments/Payments.qmltypes'
768--- tests/mocks/Ubuntu/Payments/Payments.qmltypes 2014-06-27 20:53:24 +0000
769+++ tests/mocks/Ubuntu/Payments/Payments.qmltypes 2014-10-14 14:19:22 +0000
770@@ -37,6 +37,8 @@
771 Parameter { name: "error"; type: "string" }
772 }
773 Signal { name: "purchaseCompleted" }
774+ Signal { name: "purchaseCancelled" }
775 Method { name: "start" }
776+ Method { name: "process" }
777 }
778 }
779
780=== modified file 'tests/mocks/Ubuntu/Telephony/Telephony.qmltypes'
781--- tests/mocks/Ubuntu/Telephony/Telephony.qmltypes 2014-08-14 13:33:28 +0000
782+++ tests/mocks/Ubuntu/Telephony/Telephony.qmltypes 2014-10-14 14:19:22 +0000
783@@ -22,7 +22,8 @@
784 exportMetaObjectRevisions: [0]
785 Property { name: "phoneNumber"; type: "string" }
786 Property { name: "isConference"; type: "bool" }
787- Property { name: "elapsedTime"; type: "int"; isReadonly: true }
788+ Property { name: "elapsedTime"; type: "int" }
789+ Property { name: "elapsedTimerRunning"; type: "bool" }
790 }
791 Component {
792 name: "MockCallManager"
793
794=== modified file 'tests/mocks/Unity/Application/Application.qmltypes'
795--- tests/mocks/Unity/Application/Application.qmltypes 2014-09-01 12:24:06 +0000
796+++ tests/mocks/Unity/Application/Application.qmltypes 2014-10-14 14:19:22 +0000
797@@ -238,6 +238,7 @@
798 Property { name: "state"; type: "State"; isReadonly: true }
799 Property { name: "name"; type: "string"; isReadonly: true }
800 Property { name: "live"; type: "bool"; isReadonly: true }
801+ Property { name: "orientation"; type: "Qt::ScreenOrientation" }
802 Signal {
803 name: "typeChanged"
804 Parameter { type: "Type" }
805@@ -268,10 +269,15 @@
806 exportMetaObjectRevisions: [0]
807 Property { name: "name"; type: "string"; isReadonly: true }
808 Property { name: "surface"; type: "MirSurfaceItem"; isReadonly: true; isPointer: true }
809+ Property { name: "application"; type: "ApplicationInfo"; isReadonly: true; isPointer: true }
810 Property { name: "parentSession"; type: "Session"; isReadonly: true; isPointer: true }
811 Property { name: "childSessions"; type: "SessionModel"; isReadonly: true; isPointer: true }
812 Property { name: "live"; type: "bool"; isReadonly: true }
813 Signal {
814+ name: "applicationChanged"
815+ Parameter { type: "ApplicationInfo"; isPointer: true }
816+ }
817+ Signal {
818 name: "surfaceChanged"
819 Parameter { type: "MirSurfaceItem"; isPointer: true }
820 }
821@@ -368,6 +374,12 @@
822 Property { name: "stage"; type: "Stage"; isReadonly: true }
823 Property { name: "state"; type: "State"; isReadonly: true }
824 Property { name: "focused"; type: "bool"; isReadonly: true }
825+ Property { name: "splashTitle"; type: "string"; isReadonly: true }
826+ Property { name: "splashImage"; type: "QUrl"; isReadonly: true }
827+ Property { name: "splashShowHeader"; type: "bool"; isReadonly: true }
828+ Property { name: "splashColor"; type: "QColor"; isReadonly: true }
829+ Property { name: "splashColorHeader"; type: "QColor"; isReadonly: true }
830+ Property { name: "splashColorFooter"; type: "QColor"; isReadonly: true }
831 Signal {
832 name: "nameChanged"
833 Parameter { name: "name"; type: "string" }
834@@ -414,6 +426,7 @@
835 Property { name: "count"; type: "int"; isReadonly: true }
836 Property { name: "focusedApplicationId"; type: "string"; isReadonly: true }
837 Property { name: "suspended"; type: "bool" }
838+ Property { name: "forceDashActive"; type: "bool" }
839 Signal {
840 name: "focusRequested"
841 Parameter { name: "appId"; type: "string" }
842
843=== modified file 'tests/mocks/Unity/DashCommunicator/DashCommunicator.qmltypes'
844--- tests/mocks/Unity/DashCommunicator/DashCommunicator.qmltypes 2014-08-14 13:33:28 +0000
845+++ tests/mocks/Unity/DashCommunicator/DashCommunicator.qmltypes 2014-10-14 14:19:22 +0000
846@@ -34,13 +34,13 @@
847 name: "setCurrentScopeRequested"
848 Parameter { name: "scopeId"; type: "string" }
849 Parameter { name: "animate"; type: "bool" }
850- Parameter { name: "reset"; type: "bool" }
851+ Parameter { name: "isSwipe"; type: "bool" }
852 }
853 Method {
854 name: "mockSetCurrentScope"
855 Parameter { name: "scopeId"; type: "string" }
856 Parameter { name: "animate"; type: "bool" }
857- Parameter { name: "reset"; type: "bool" }
858+ Parameter { name: "isSwipe"; type: "bool" }
859 }
860 }
861 }
862
863=== modified file 'tests/mocks/Unity/Indicators/CMakeLists.txt'
864--- tests/mocks/Unity/Indicators/CMakeLists.txt 2014-08-20 08:39:09 +0000
865+++ tests/mocks/Unity/Indicators/CMakeLists.txt 2014-10-14 14:19:22 +0000
866@@ -12,24 +12,17 @@
867
868 set(IndicatorsFakeQml_SOURCES
869 fakeplugin.cpp
870+ fakeindicatorsmodel.cpp
871+ fakeunitymenumodelcache.cpp
872 ${CMAKE_SOURCE_DIR}/plugins/Unity/Indicators/indicators.h
873 ${CMAKE_SOURCE_DIR}/plugins/Unity/Indicators/menucontentactivator.cpp
874+ ${CMAKE_SOURCE_DIR}/plugins/Unity/Indicators/sharedunitymenumodel.cpp
875 ${CMAKE_SOURCE_DIR}/plugins/Unity/Indicators/unitymenumodelcache.cpp
876 ${CMAKE_SOURCE_DIR}/plugins/Unity/Indicators/unitymenumodelstack.cpp
877 ${CMAKE_SOURCE_DIR}/plugins/Unity/Indicators/visibleindicatorsmodel.cpp
878- fakeindicatorsmodel.cpp
879-)
880-
881-set(IndicatorsFakeQml_RESOURCES
882- indicators_fake.qrc
883-)
884-
885-qt5_add_resources(IndicatorsFakeQml_RESOURCES_RCC
886- ${IndicatorsFakeQml_RESOURCES}
887 )
888
889 add_library(IndicatorsFakeQml SHARED
890- ${IndicatorsFakeQml_RESOURCES_RCC}
891 ${IndicatorsFakeQml_SOURCES}
892 )
893 add_definitions(-DUNITYINDICATORS_LIBRARY)
894
895=== removed file 'tests/mocks/Unity/Indicators/FakeMenuPage.qml'
896--- tests/mocks/Unity/Indicators/FakeMenuPage.qml 2014-09-09 15:10:52 +0000
897+++ tests/mocks/Unity/Indicators/FakeMenuPage.qml 1970-01-01 00:00:00 +0000
898@@ -1,27 +0,0 @@
899-/*
900- * Copyright 2013 Canonical Ltd.
901- *
902- * This program is free software; you can redistribute it and/or modify
903- * it under the terms of the GNU General Public License as published by
904- * the Free Software Foundation; version 3.
905- *
906- * This program is distributed in the hope that it will be useful,
907- * but WITHOUT ANY WARRANTY; without even the implied warranty of
908- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
909- * GNU General Public License for more details.
910- *
911- * You should have received a copy of the GNU General Public License
912- * along with this program. If not, see <http://www.gnu.org/licenses/>.
913- */
914-
915-import QtQuick 2.0
916-
917-Flickable {
918- objectName: "fakeMenuPlugin"
919- // Make it compatible with the PluginItem interface
920- function reset() {
921- if (shell != undefined && shell.indicator_status != undefined) {
922- shell.indicator_status[objectName].reset++;
923- }
924- }
925-}
926
927=== modified file 'tests/mocks/Unity/Indicators/Indicators.qmltypes'
928--- tests/mocks/Unity/Indicators/Indicators.qmltypes 2014-09-01 12:18:53 +0000
929+++ tests/mocks/Unity/Indicators/Indicators.qmltypes 2014-10-14 14:19:22 +0000
930@@ -29,6 +29,7 @@
931 exports: ["Unity.Indicators/FakeIndicatorsModel 0.1"]
932 exportMetaObjectRevisions: [0]
933 Property { name: "count"; type: "int"; isReadonly: true }
934+ Property { name: "modelData"; type: "QVariant" }
935 Method {
936 name: "load"
937 Parameter { name: "profile"; type: "string" }
938@@ -39,6 +40,15 @@
939 Parameter { name: "row"; type: "QVariantMap" }
940 }
941 Method {
942+ name: "insert"
943+ Parameter { name: "row"; type: "int" }
944+ Parameter { name: "data"; type: "QVariantMap" }
945+ }
946+ Method {
947+ name: "remove"
948+ Parameter { name: "row"; type: "int" }
949+ }
950+ Method {
951 name: "data"
952 type: "QVariant"
953 Parameter { name: "row"; type: "int" }
954@@ -46,6 +56,27 @@
955 }
956 }
957 Component {
958+ name: "FakeUnityMenuModelCache"
959+ prototype: "UnityMenuModelCache"
960+ exports: ["Unity.Indicators/UnityMenuModelCache 0.1"]
961+ isCreatable: false
962+ isSingleton: true
963+ exportMetaObjectRevisions: [0]
964+ Method {
965+ name: "setCachedModelData"
966+ Parameter { name: "bus"; type: "QByteArray" }
967+ Parameter { name: "path"; type: "QByteArray" }
968+ Parameter { name: "actions"; type: "QVariantMap" }
969+ Parameter { name: "data"; type: "QVariant" }
970+ }
971+ Method {
972+ name: "setCachedModelData"
973+ Parameter { name: "bus"; type: "QByteArray" }
974+ Parameter { name: "path"; type: "QByteArray" }
975+ Parameter { name: "actions"; type: "QVariantMap" }
976+ }
977+ }
978+ Component {
979 name: "FlatMenuProxyModelRole"
980 prototype: "QObject"
981 exports: ["Unity.Indicators/FlatMenuProxyModelRole 0.1"]
982@@ -160,19 +191,18 @@
983 }
984 Component { name: "QIdentityProxyModel"; prototype: "QAbstractProxyModel" }
985 Component {
986+ name: "SharedUnityMenuModel"
987+ prototype: "QObject"
988+ exports: ["Unity.Indicators/SharedUnityMenuModel 0.1"]
989+ exportMetaObjectRevisions: [0]
990+ Property { name: "busName"; type: "QByteArray" }
991+ Property { name: "menuObjectPath"; type: "QByteArray" }
992+ Property { name: "actions"; type: "QVariantMap" }
993+ Property { name: "model"; type: "UnityMenuModel"; isReadonly: true; isPointer: true }
994+ }
995+ Component {
996 name: "UnityMenuModelCache"
997 prototype: "QObject"
998- exports: ["Unity.Indicators/UnityMenuModelCache 0.1"]
999- isCreatable: false
1000- isSingleton: true
1001- exportMetaObjectRevisions: [0]
1002- Method {
1003- name: "model"
1004- type: "UnityMenuModel*"
1005- Parameter { name: "bus"; type: "QByteArray" }
1006- Parameter { name: "path"; type: "QByteArray" }
1007- Parameter { name: "actions"; type: "QVariantMap" }
1008- }
1009 Method {
1010 name: "contains"
1011 type: "bool"
1012
1013=== modified file 'tests/mocks/Unity/Indicators/IndicatorsModel.qml'
1014--- tests/mocks/Unity/Indicators/IndicatorsModel.qml 2014-03-03 11:55:00 +0000
1015+++ tests/mocks/Unity/Indicators/IndicatorsModel.qml 2014-10-14 14:19:22 +0000
1016@@ -18,43 +18,151 @@
1017 import Unity.Indicators 0.1 as Indicators
1018
1019 Indicators.FakeIndicatorsModel {
1020+ id: root
1021+
1022+ Component.onCompleted: {
1023+ Indicators.UnityMenuModelCache.setCachedModelData("com.canonical.indicators.fake1",
1024+ "/com/canonical/indicators/fake1",
1025+ "/com/canonical/indicators/fake1",
1026+ getUnityMenuModelData("fake-indicator-bluetooth",
1027+ "Bluetooth (F)",
1028+ "",
1029+ [ "image://theme/bluetooth-active" ]));
1030+ Indicators.UnityMenuModelCache.setCachedModelData("com.canonical.indicators.fake2",
1031+ "/com/canonical/indicators/fake2",
1032+ "/com/canonical/indicators/fake2",
1033+ getUnityMenuModelData("fake-indicator-network",
1034+ "Network (F)",
1035+ "",
1036+ [ "image://theme/simcard-error", "image://theme/wifi-high" ]));
1037+ Indicators.UnityMenuModelCache.setCachedModelData("com.canonical.indicators.fake3",
1038+ "/com/canonical/indicators/fake3",
1039+ "/com/canonical/indicators/fake3",
1040+ getUnityMenuModelData("fake-indicator-sound",
1041+ "Messages (F)",
1042+ "",
1043+ [ "image://theme/messages-new" ]));
1044+ Indicators.UnityMenuModelCache.setCachedModelData("com.canonical.indicators.fake4",
1045+ "/com/canonical/indicators/fake4",
1046+ "/com/canonical/indicators/fake4",
1047+ getUnityMenuModelData("fake-indicator-power",
1048+ "Sound (F)",
1049+ "",
1050+ [ "image://theme/audio-volume-high" ]));
1051+ Indicators.UnityMenuModelCache.setCachedModelData("com.canonical.indicators.fake5",
1052+ "/com/canonical/indicators/fake5",
1053+ "/com/canonical/indicators/fake5",
1054+ getUnityMenuModelData("fake-indicator-power",
1055+ "Battery (F)",
1056+ "",
1057+ [ "image://theme/battery-020" ]));
1058+ }
1059+
1060+ function getUnityMenuModelData(identifier, title, label, icons) {
1061+ var root = [{
1062+ "rowData": { // 1
1063+ "label": "",
1064+ "sensitive": true,
1065+ "isSeparator": false,
1066+ "icon": "",
1067+ "type": "com.canonical.indicator.root",
1068+ "ext": {},
1069+ "action": "",
1070+ "actionState": {
1071+ "title": title,
1072+ "label": label,
1073+ "icons": icons
1074+ },
1075+ "isCheck": false,
1076+ "isRadio": false,
1077+ "isToggled": false,
1078+ },
1079+ "submenu": []
1080+ }];
1081+
1082+ var submenus = [];
1083+ for (var i = 0; i < 8; i++) {
1084+ var submenu = {
1085+ "rowData": { // 1.1
1086+ "label": identifier,
1087+ "sensitive": true,
1088+ "isSeparator": false,
1089+ "icon": "",
1090+ "type": undefined,
1091+ "ext": {},
1092+ "action": "",
1093+ "actionState": {},
1094+ "isCheck": false,
1095+ "isRadio": false,
1096+ "isToggled": false,
1097+ }};
1098+ submenus.push(submenu);
1099+ }
1100+ root[0]["submenu"] = submenus;
1101+
1102+ return root;
1103+ }
1104+
1105+ property var originalModelData: [
1106+ {
1107+ "identifier": "indicator-fake1",
1108+ "widgetSource": "Indicators/DefaultIndicatorWidget.qml",
1109+ "pageSource": "Indicators/DefaultIndicatorPage.qml",
1110+ "indicatorProperties": {
1111+ "enabled": true,
1112+ "busName": "com.canonical.indicators.fake1",
1113+ "menuObjectPath": "/com/canonical/indicators/fake1",
1114+ "actionsObjectPath": "/com/canonical/indicators/fake1"
1115+ }
1116+ },
1117+ {
1118+ "identifier": "indicator-fake2",
1119+ "widgetSource": "Indicators/DefaultIndicatorWidget.qml",
1120+ "pageSource": "Indicators/DefaultIndicatorPage.qml",
1121+ "indicatorProperties": {
1122+ "enabled": true,
1123+ "busName": "com.canonical.indicators.fake2",
1124+ "menuObjectPath": "/com/canonical/indicators/fake2",
1125+ "actionsObjectPath": "/com/canonical/indicators/fake2"
1126+ }
1127+ },
1128+ {
1129+ "identifier": "indicator-fake3",
1130+ "widgetSource": "Indicators/DefaultIndicatorWidget.qml",
1131+ "pageSource": "Indicators/DefaultIndicatorPage.qml",
1132+ "indicatorProperties": {
1133+ "enabled": true,
1134+ "busName": "com.canonical.indicators.fake3",
1135+ "menuObjectPath": "/com/canonical/indicators/fake3",
1136+ "actionsObjectPath": "/com/canonical/indicators/fake3"
1137+ }
1138+ },
1139+ {
1140+ "identifier": "indicator-fake4",
1141+ "widgetSource": "Indicators/DefaultIndicatorWidget.qml",
1142+ "pageSource": "Indicators/DefaultIndicatorPage.qml",
1143+ "indicatorProperties": {
1144+ "enabled": true,
1145+ "busName": "com.canonical.indicators.fake4",
1146+ "menuObjectPath": "/com/canonical/indicators/fake4",
1147+ "actionsObjectPath": "/com/canonical/indicators/fake4"
1148+ }
1149+ },
1150+ {
1151+ "identifier": "indicator-fake5",
1152+ "widgetSource": "Indicators/DefaultIndicatorWidget.qml",
1153+ "pageSource": "Indicators/DefaultIndicatorPage.qml",
1154+ "indicatorProperties": {
1155+ "enabled": true,
1156+ "busName": "com.canonical.indicators.fake5",
1157+ "menuObjectPath": "/com/canonical/indicators/fake5",
1158+ "actionsObjectPath": "/com/canonical/indicators/fake5"
1159+ }
1160+ }
1161+ ]
1162
1163 function load(profile) {
1164 unload();
1165-
1166- append({ "identifier": "indicator-fake1",
1167- "position": 0,
1168- "widgetSource": "qrc:/tests/indciators/qml/fake_menu_widget1.qml",
1169- "pageSource": "qrc:/tests/indciators/qml/fake_menu_page1.qml",
1170- "indicatorProperties": { enabled: true }
1171- });
1172-
1173- append({ "identifier": "indicator-fake2",
1174- "position": 1,
1175- "widgetSource": "qrc:/tests/indciators/qml/fake_menu_widget2.qml",
1176- "pageSource": "qrc:/tests/indciators/qml/fake_menu_page2.qml",
1177- "indicatorProperties": { enabled: true }
1178- });
1179-
1180- append({ "identifier": "indicator-fake3",
1181- "position": 2,
1182- "widgetSource": "qrc:/tests/indciators/qml/fake_menu_widget3.qml",
1183- "pageSource": "qrc:/tests/indciators/qml/fake_menu_page3.qml",
1184- "indicatorProperties": { enabled: true }
1185- });
1186-
1187- append({ "identifier": "indicator-fake4",
1188- "position": 3,
1189- "widgetSource": "qrc:/tests/indciators/qml/fake_menu_widget4.qml",
1190- "pageSource": "qrc:/tests/indciators/qml/fake_menu_page4.qml",
1191- "indicatorProperties": { enabled: true }
1192- });
1193-
1194- append({ "identifier": "indicator-fake5",
1195- "position": 4,
1196- "widgetSource": "qrc:/tests/indciators/qml/fake_menu_widget5.qml",
1197- "pageSource": "qrc:/tests/indciators/qml/fake_menu_page5.qml",
1198- "indicatorProperties": { enabled: true }
1199- });
1200+ root.modelData = originalModelData;
1201 }
1202 }
1203
1204=== modified file 'tests/mocks/Unity/Indicators/RootActionState.qml'
1205--- tests/mocks/Unity/Indicators/RootActionState.qml 2013-10-28 18:19:15 +0000
1206+++ tests/mocks/Unity/Indicators/RootActionState.qml 2014-10-14 14:19:22 +0000
1207@@ -19,15 +19,23 @@
1208
1209 import QtQuick 2.0
1210
1211-QtObject {
1212- property var menu
1213- property bool valid: false
1214- property string title
1215- property string leftLabel
1216- property string rightLabel
1217- property var icons
1218- property string accessibleName
1219- property bool visible: true
1220+Item {
1221+ property var menu: null
1222+ property bool valid: cachedState !== undefined
1223+ property string title: cachedState && cachedState.hasOwnProperty("title") ? cachedState["title"] : ""
1224+ property string leftLabel: cachedState && cachedState.hasOwnProperty("pre-label") ? cachedState["pre-label"] : ""
1225+ property string rightLabel: cachedState && cachedState.hasOwnProperty("label") ? cachedState["label"] : ""
1226+ property var icons: cachedState && cachedState.hasOwnProperty("icons") ? cachedState["icons"] : []
1227+ property string accessibleName: cachedState && cachedState.hasOwnProperty("accessible-desc") ? cachedState["accessible-desc"] : ""
1228+ visible: cachedState && cachedState.hasOwnProperty("visible") ? cachedState["visible"] : true
1229+
1230+ property var cachedState: menu ? menu.get(0, "actionState") : undefined
1231+ Connections {
1232+ target: menu
1233+ onModelDataChanged: {
1234+ cachedState = menu.get(0, "actionState");
1235+ }
1236+ }
1237
1238 signal updated
1239
1240
1241=== modified file 'tests/mocks/Unity/Indicators/fakeindicatorsmodel.cpp'
1242--- tests/mocks/Unity/Indicators/fakeindicatorsmodel.cpp 2014-07-01 09:49:24 +0000
1243+++ tests/mocks/Unity/Indicators/fakeindicatorsmodel.cpp 2014-10-14 14:19:22 +0000
1244@@ -31,7 +31,6 @@
1245 /*! \internal */
1246 FakeIndicatorsModel::~FakeIndicatorsModel()
1247 {
1248- qDeleteAll(m_indicators);
1249 }
1250
1251 int FakeIndicatorsModel::count() const
1252@@ -47,29 +46,61 @@
1253 {
1254 beginResetModel();
1255
1256- qDeleteAll(m_indicators);
1257- m_indicators.clear();
1258-
1259- endResetModel();
1260-}
1261-
1262-
1263-void FakeIndicatorsModel::append(const QVariantMap& row)
1264-{
1265- Indicator* new_row = new QHash<int, QVariant>();
1266- for (auto iter = row.begin(); iter != row.end(); ++iter )
1267- {
1268- int key = roleNames().key(iter.key().toUtf8(), -1);
1269- if (key != -1) {
1270- new_row->insert(key, iter.value());
1271- }
1272- }
1273-
1274- beginInsertRows(QModelIndex(), m_indicators.count(), m_indicators.count());
1275-
1276- m_indicators.append(new_row);
1277-
1278- endInsertRows();
1279+ m_modelData.clear();
1280+ Q_EMIT modelDataChanged();
1281+
1282+ endResetModel();
1283+}
1284+
1285+
1286+void FakeIndicatorsModel::append(const QVariantMap& data)
1287+{
1288+ QList<QVariant> allData = m_modelData.toList();
1289+ beginInsertRows(QModelIndex(), allData.count(), allData.count());
1290+
1291+ allData.append(data);
1292+ m_modelData = allData;
1293+ Q_EMIT modelDataChanged();
1294+
1295+ endInsertRows();
1296+}
1297+
1298+void FakeIndicatorsModel::insert(int row, const QVariantMap& data)
1299+{
1300+ QList<QVariant> allData = m_modelData.toList();
1301+ row = qMax(0, qMin(row, allData.count()));
1302+
1303+ beginInsertRows(QModelIndex(), row, row);
1304+
1305+ allData.insert(row, data);
1306+ m_modelData = allData;
1307+ Q_EMIT modelDataChanged();
1308+
1309+ endInsertRows();
1310+}
1311+
1312+void FakeIndicatorsModel::remove(int row)
1313+{
1314+ QList<QVariant> allData = m_modelData.toList();
1315+ row = qMax(0, qMin(row, allData.count()));
1316+
1317+ beginRemoveRows(QModelIndex(), row, row);
1318+
1319+ allData.removeAt(row);
1320+ m_modelData = allData;
1321+ Q_EMIT modelDataChanged();
1322+
1323+ endRemoveRows();
1324+}
1325+
1326+void FakeIndicatorsModel::setModelData(const QVariant& modelData)
1327+{
1328+ beginResetModel();
1329+
1330+ m_modelData = modelData;
1331+ Q_EMIT modelDataChanged();
1332+
1333+ endResetModel();
1334 }
1335
1336 QHash<int, QByteArray> FakeIndicatorsModel::roleNames() const
1337@@ -91,18 +122,18 @@
1338 return 1;
1339 }
1340
1341-Q_INVOKABLE QVariant FakeIndicatorsModel::data(int row, int role) const
1342+QVariant FakeIndicatorsModel::data(int row, int role) const
1343 {
1344 return data(index(row, 0), role);
1345 }
1346
1347 QVariant FakeIndicatorsModel::data(const QModelIndex &index, int role) const
1348 {
1349- if (!index.isValid() || index.row() >= m_indicators.size())
1350+ QList<QVariant> dataList = m_modelData.toList();
1351+ if (!index.isValid() || index.row() >= dataList.size())
1352 return QVariant();
1353
1354- Indicator* indicator = m_indicators[index.row()];
1355- return indicator->value(role, QVariant());
1356+ return dataList[index.row()].toMap()[roleNames()[role]];
1357 }
1358
1359 QModelIndex FakeIndicatorsModel::parent(const QModelIndex&) const
1360@@ -112,5 +143,5 @@
1361
1362 int FakeIndicatorsModel::rowCount(const QModelIndex&) const
1363 {
1364- return m_indicators.count();
1365+ return m_modelData.toList().count();
1366 }
1367
1368=== modified file 'tests/mocks/Unity/Indicators/fakeindicatorsmodel.h'
1369--- tests/mocks/Unity/Indicators/fakeindicatorsmodel.h 2014-03-03 12:01:09 +0000
1370+++ tests/mocks/Unity/Indicators/fakeindicatorsmodel.h 2014-10-14 14:19:22 +0000
1371@@ -27,6 +27,7 @@
1372 Q_OBJECT
1373 Q_ENUMS(Roles)
1374 Q_PROPERTY(int count READ count NOTIFY countChanged)
1375+ Q_PROPERTY(QVariant modelData READ modelData WRITE setModelData NOTIFY modelDataChanged)
1376 public:
1377
1378 FakeIndicatorsModel(QObject *parent=0);
1379@@ -36,9 +37,14 @@
1380 Q_INVOKABLE void unload();
1381
1382 Q_INVOKABLE void append(const QVariantMap& row);
1383+ Q_INVOKABLE void insert(int row, const QVariantMap& data);
1384+ Q_INVOKABLE void remove(int row);
1385
1386 Q_INVOKABLE QVariant data(int row, int role) const;
1387
1388+ void setModelData(const QVariant& data);
1389+ QVariant modelData() const { return m_modelData; }
1390+
1391 /* QAbstractItemModel */
1392 QHash<int, QByteArray> roleNames() const;
1393 int columnCount(const QModelIndex &parent = QModelIndex()) const;
1394@@ -48,12 +54,12 @@
1395
1396 Q_SIGNALS:
1397 void countChanged();
1398+ void modelDataChanged();
1399
1400 private:
1401 int count() const;
1402
1403- typedef QHash<int, QVariant> Indicator;
1404- QList<Indicator*> m_indicators;
1405+ QVariant m_modelData;
1406 };
1407
1408 #endif // FAKE_INDICATORSMODEL_H
1409
1410=== modified file 'tests/mocks/Unity/Indicators/fakeplugin.cpp'
1411--- tests/mocks/Unity/Indicators/fakeplugin.cpp 2014-08-20 08:39:09 +0000
1412+++ tests/mocks/Unity/Indicators/fakeplugin.cpp 2014-10-14 14:19:22 +0000
1413@@ -26,19 +26,22 @@
1414 #include "fakeindicatorsmodel.h"
1415 #include "indicators.h"
1416 #include "menucontentactivator.h"
1417-#include "unitymenumodelcache.h"
1418+#include "sharedunitymenumodel.h"
1419+#include "fakeunitymenumodelcache.h"
1420 #include "unitymenumodelstack.h"
1421 #include "visibleindicatorsmodel.h"
1422
1423+#include <unitymenumodel.h>
1424+
1425 static QObject* menuModelCacheSingleton(QQmlEngine* engine, QJSEngine* scriptEngine) {
1426 Q_UNUSED(engine);
1427 Q_UNUSED(scriptEngine);
1428- return new UnityMenuModelCache;
1429+ return FakeUnityMenuModelCache::singleton();
1430 }
1431
1432 void IndicatorsFakePlugin::registerTypes(const char * uri)
1433 {
1434- Q_INIT_RESOURCE(indicators_fake);
1435+ qRegisterMetaType<UnityMenuModel*>("UnityMenuModel*");
1436
1437 // internal
1438 qmlRegisterType<FakeIndicatorsModel>(uri, 0, 1, "FakeIndicatorsModel");
1439@@ -47,8 +50,9 @@
1440 qmlRegisterType<MenuContentActivator>(uri, 0, 1, "MenuContentActivator");
1441 qmlRegisterType<UnityMenuModelStack>(uri, 0, 1, "UnityMenuModelStack");
1442 qmlRegisterType<VisibleIndicatorsModel>(uri, 0, 1, "VisibleIndicatorsModel");
1443+ qmlRegisterType<SharedUnityMenuModel>(uri, 0, 1, "SharedUnityMenuModel");
1444
1445- qmlRegisterSingletonType<UnityMenuModelCache>(uri, 0, 1, "UnityMenuModelCache", menuModelCacheSingleton);
1446+ qmlRegisterSingletonType<FakeUnityMenuModelCache>(uri, 0, 1, "UnityMenuModelCache", menuModelCacheSingleton);
1447
1448 // external uncreatables
1449 qmlRegisterUncreatableType<MenuContentState>(uri, 0, 1, "MenuContentState", "Can't create MenuContentState class");
1450
1451=== added file 'tests/mocks/Unity/Indicators/fakeunitymenumodelcache.cpp'
1452--- tests/mocks/Unity/Indicators/fakeunitymenumodelcache.cpp 1970-01-01 00:00:00 +0000
1453+++ tests/mocks/Unity/Indicators/fakeunitymenumodelcache.cpp 2014-10-14 14:19:22 +0000
1454@@ -0,0 +1,57 @@
1455+/*
1456+ * Copyright 2014 Canonical Ltd.
1457+ *
1458+ * This program is free software; you can redistribute it and/or modify
1459+ * it under the terms of the GNU Lesser General Public License as published by
1460+ * the Free Software Foundation; version 3.
1461+ *
1462+ * This program is distributed in the hope that it will be useful,
1463+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
1464+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
1465+ * GNU Lesser General Public License for more details.
1466+ *
1467+ * You should have received a copy of the GNU Lesser General Public License
1468+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
1469+ */
1470+
1471+#include "fakeunitymenumodelcache.h"
1472+#include <unitymenumodel.h>
1473+
1474+QPointer<FakeUnityMenuModelCache> FakeUnityMenuModelCache::theFakeCache = nullptr;
1475+
1476+FakeUnityMenuModelCache* FakeUnityMenuModelCache::singleton()
1477+{
1478+ if (theFakeCache.isNull()) {
1479+ theFakeCache = new FakeUnityMenuModelCache();
1480+ }
1481+ return theFakeCache.data();
1482+}
1483+
1484+FakeUnityMenuModelCache::FakeUnityMenuModelCache(QObject* parent)
1485+ : UnityMenuModelCache(parent)
1486+{
1487+}
1488+
1489+QSharedPointer<UnityMenuModel> FakeUnityMenuModelCache::model(const QByteArray& bus,
1490+ const QByteArray& path,
1491+ const QVariantMap& actions)
1492+{
1493+ return UnityMenuModelCache::singleton()->model(bus, path, actions);
1494+}
1495+
1496+bool FakeUnityMenuModelCache::contains(const QByteArray& path)
1497+{
1498+ return UnityMenuModelCache::singleton()->contains(path);
1499+}
1500+
1501+void FakeUnityMenuModelCache::setCachedModelData(const QByteArray& bus,
1502+ const QByteArray& path,
1503+ const QVariantMap& actions,
1504+ const QVariant& data)
1505+{
1506+ // keep a ref forever!
1507+ if (!m_models.contains(path)) {
1508+ m_models[path] = model(bus, path, actions);
1509+ }
1510+ m_models[path]->setModelData(data);
1511+}
1512
1513=== added file 'tests/mocks/Unity/Indicators/fakeunitymenumodelcache.h'
1514--- tests/mocks/Unity/Indicators/fakeunitymenumodelcache.h 1970-01-01 00:00:00 +0000
1515+++ tests/mocks/Unity/Indicators/fakeunitymenumodelcache.h 2014-10-14 14:19:22 +0000
1516@@ -0,0 +1,49 @@
1517+/*
1518+ * Copyright 2014 Canonical Ltd.
1519+ *
1520+ * This program is free software; you can redistribute it and/or modify
1521+ * it under the terms of the GNU Lesser General Public License as published by
1522+ * the Free Software Foundation; version 3.
1523+ *
1524+ * This program is distributed in the hope that it will be useful,
1525+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
1526+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
1527+ * GNU Lesser General Public License for more details.
1528+ *
1529+ * You should have received a copy of the GNU Lesser General Public License
1530+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
1531+ */
1532+
1533+#ifndef FAKEUNITYMENUMODELCACHE_H
1534+#define FAKEUNITYMENUMODELCACHE_H
1535+
1536+#include "unitymenumodelcache.h"
1537+
1538+#include <QVariantMap>
1539+
1540+class FakeUnityMenuModelCache : public UnityMenuModelCache
1541+{
1542+ Q_OBJECT
1543+public:
1544+ FakeUnityMenuModelCache(QObject* parent = nullptr);
1545+
1546+ static FakeUnityMenuModelCache* singleton();
1547+
1548+ QSharedPointer<UnityMenuModel> model(const QByteArray& bus,
1549+ const QByteArray& path,
1550+ const QVariantMap& actions) override;
1551+ bool contains(const QByteArray& path) override;
1552+
1553+
1554+
1555+ Q_INVOKABLE void setCachedModelData(const QByteArray& bus,
1556+ const QByteArray& path,
1557+ const QVariantMap& actions,
1558+ const QVariant& data = QVariant());
1559+
1560+private:
1561+ static QPointer<FakeUnityMenuModelCache> theFakeCache;
1562+ QHash<QByteArray, QSharedPointer<UnityMenuModel>> m_models;
1563+};
1564+
1565+#endif // FAKEUNITYMENUMODELCACHE_H
1566
1567=== removed file 'tests/mocks/Unity/Indicators/indicators_fake.qrc'
1568--- tests/mocks/Unity/Indicators/indicators_fake.qrc 2013-06-17 09:02:14 +0000
1569+++ tests/mocks/Unity/Indicators/indicators_fake.qrc 1970-01-01 00:00:00 +0000
1570@@ -1,14 +0,0 @@
1571-<RCC>
1572- <qresource prefix="/tests/indciators">
1573- <file>qml/fake_menu_widget1.qml</file>
1574- <file>qml/fake_menu_widget2.qml</file>
1575- <file>qml/fake_menu_widget3.qml</file>
1576- <file>qml/fake_menu_widget4.qml</file>
1577- <file>qml/fake_menu_widget5.qml</file>
1578- <file>qml/fake_menu_page1.qml</file>
1579- <file>qml/fake_menu_page2.qml</file>
1580- <file>qml/fake_menu_page3.qml</file>
1581- <file>qml/fake_menu_page4.qml</file>
1582- <file>qml/fake_menu_page5.qml</file>
1583- </qresource>
1584-</RCC>
1585
1586=== removed directory 'tests/mocks/Unity/Indicators/qml'
1587=== removed file 'tests/mocks/Unity/Indicators/qml/fake_menu_page1.qml'
1588--- tests/mocks/Unity/Indicators/qml/fake_menu_page1.qml 2014-01-14 16:44:35 +0000
1589+++ tests/mocks/Unity/Indicators/qml/fake_menu_page1.qml 1970-01-01 00:00:00 +0000
1590@@ -1,35 +0,0 @@
1591-/*
1592- * Copyright 2013 Canonical Ltd.
1593- *
1594- * This program is free software; you can redistribute it and/or modify
1595- * it under the terms of the GNU General Public License as published by
1596- * the Free Software Foundation; version 3.
1597- *
1598- * This program is distributed in the hope that it will be useful,
1599- * but WITHOUT ANY WARRANTY; without even the implied warranty of
1600- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
1601- * GNU General Public License for more details.
1602- *
1603- * You should have received a copy of the GNU General Public License
1604- * along with this program. If not, see <http://www.gnu.org/licenses/>.
1605- */
1606-
1607-import QtQuick 2.0
1608-import Unity.Indicators 0.1 as Indicators
1609-
1610-Indicators.FakeMenuPage {
1611- id: menu_plugin1
1612-
1613- Rectangle {
1614- id: contents
1615- color: "red"
1616-
1617- height: 150
1618- width: 150
1619-
1620- anchors {
1621- horizontalCenter: parent.horizontalCenter
1622- verticalCenter: parent.verticalCenter
1623- }
1624- }
1625-}
1626
1627=== removed file 'tests/mocks/Unity/Indicators/qml/fake_menu_page2.qml'
1628--- tests/mocks/Unity/Indicators/qml/fake_menu_page2.qml 2014-01-14 16:44:35 +0000
1629+++ tests/mocks/Unity/Indicators/qml/fake_menu_page2.qml 1970-01-01 00:00:00 +0000
1630@@ -1,35 +0,0 @@
1631-/*
1632- * Copyright 2013 Canonical Ltd.
1633- *
1634- * This program is free software; you can redistribute it and/or modify
1635- * it under the terms of the GNU General Public License as published by
1636- * the Free Software Foundation; version 3.
1637- *
1638- * This program is distributed in the hope that it will be useful,
1639- * but WITHOUT ANY WARRANTY; without even the implied warranty of
1640- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
1641- * GNU General Public License for more details.
1642- *
1643- * You should have received a copy of the GNU General Public License
1644- * along with this program. If not, see <http://www.gnu.org/licenses/>.
1645- */
1646-
1647-import QtQuick 2.0
1648-import Unity.Indicators 0.1 as Indicators
1649-
1650-Indicators.FakeMenuPage {
1651- id: menu_plugin2
1652-
1653- Rectangle {
1654- id: contents
1655- color: "blue"
1656-
1657- height: 150
1658- width: 150
1659-
1660- anchors {
1661- horizontalCenter: parent.horizontalCenter
1662- verticalCenter: parent.verticalCenter
1663- }
1664- }
1665-}
1666
1667=== removed file 'tests/mocks/Unity/Indicators/qml/fake_menu_page3.qml'
1668--- tests/mocks/Unity/Indicators/qml/fake_menu_page3.qml 2014-01-14 16:44:35 +0000
1669+++ tests/mocks/Unity/Indicators/qml/fake_menu_page3.qml 1970-01-01 00:00:00 +0000
1670@@ -1,35 +0,0 @@
1671-/*
1672- * Copyright 2013 Canonical Ltd.
1673- *
1674- * This program is free software; you can redistribute it and/or modify
1675- * it under the terms of the GNU General Public License as published by
1676- * the Free Software Foundation; version 3.
1677- *
1678- * This program is distributed in the hope that it will be useful,
1679- * but WITHOUT ANY WARRANTY; without even the implied warranty of
1680- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
1681- * GNU General Public License for more details.
1682- *
1683- * You should have received a copy of the GNU General Public License
1684- * along with this program. If not, see <http://www.gnu.org/licenses/>.
1685- */
1686-
1687-import QtQuick 2.0
1688-import Unity.Indicators 0.1 as Indicators
1689-
1690-Indicators.FakeMenuPage {
1691- id: menu_plugin3
1692-
1693- Rectangle {
1694- id: contents
1695- color: "yellow"
1696-
1697- height: 150
1698- width: 150
1699-
1700- anchors {
1701- horizontalCenter: parent.horizontalCenter
1702- verticalCenter: parent.verticalCenter
1703- }
1704- }
1705-}
1706
1707=== removed file 'tests/mocks/Unity/Indicators/qml/fake_menu_page4.qml'
1708--- tests/mocks/Unity/Indicators/qml/fake_menu_page4.qml 2014-01-14 16:44:35 +0000
1709+++ tests/mocks/Unity/Indicators/qml/fake_menu_page4.qml 1970-01-01 00:00:00 +0000
1710@@ -1,35 +0,0 @@
1711-/*
1712- * Copyright 2013 Canonical Ltd.
1713- *
1714- * This program is free software; you can redistribute it and/or modify
1715- * it under the terms of the GNU General Public License as published by
1716- * the Free Software Foundation; version 3.
1717- *
1718- * This program is distributed in the hope that it will be useful,
1719- * but WITHOUT ANY WARRANTY; without even the implied warranty of
1720- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
1721- * GNU General Public License for more details.
1722- *
1723- * You should have received a copy of the GNU General Public License
1724- * along with this program. If not, see <http://www.gnu.org/licenses/>.
1725- */
1726-
1727-import QtQuick 2.0
1728-import Unity.Indicators 0.1 as Indicators
1729-
1730-Indicators.FakeMenuPage {
1731- id: menu_plugin4
1732-
1733- Rectangle {
1734- id: contents
1735- color: "green"
1736-
1737- height: 150
1738- width: 150
1739-
1740- anchors {
1741- horizontalCenter: parent.horizontalCenter
1742- verticalCenter: parent.verticalCenter
1743- }
1744- }
1745-}
1746
1747=== removed file 'tests/mocks/Unity/Indicators/qml/fake_menu_page5.qml'
1748--- tests/mocks/Unity/Indicators/qml/fake_menu_page5.qml 2014-01-14 16:44:35 +0000
1749+++ tests/mocks/Unity/Indicators/qml/fake_menu_page5.qml 1970-01-01 00:00:00 +0000
1750@@ -1,35 +0,0 @@
1751-/*
1752- * Copyright 2013 Canonical Ltd.
1753- *
1754- * This program is free software; you can redistribute it and/or modify
1755- * it under the terms of the GNU General Public License as published by
1756- * the Free Software Foundation; version 3.
1757- *
1758- * This program is distributed in the hope that it will be useful,
1759- * but WITHOUT ANY WARRANTY; without even the implied warranty of
1760- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
1761- * GNU General Public License for more details.
1762- *
1763- * You should have received a copy of the GNU General Public License
1764- * along with this program. If not, see <http://www.gnu.org/licenses/>.
1765- */
1766-
1767-import QtQuick 2.0
1768-import Unity.Indicators 0.1 as Indicators
1769-
1770-Indicators.FakeMenuPage {
1771- id: menu_plugin5
1772-
1773- Rectangle {
1774- id: contents
1775- color: "orange"
1776-
1777- height: 150
1778- width: 150
1779-
1780- anchors {
1781- horizontalCenter: parent.horizontalCenter
1782- verticalCenter: parent.verticalCenter
1783- }
1784- }
1785-}
1786
1787=== removed file 'tests/mocks/Unity/Indicators/qml/fake_menu_widget1.qml'
1788--- tests/mocks/Unity/Indicators/qml/fake_menu_widget1.qml 2013-06-17 09:02:14 +0000
1789+++ tests/mocks/Unity/Indicators/qml/fake_menu_widget1.qml 1970-01-01 00:00:00 +0000
1790@@ -1,23 +0,0 @@
1791-/*
1792- * Copyright 2013 Canonical Ltd.
1793- *
1794- * This program is free software; you can redistribute it and/or modify
1795- * it under the terms of the GNU General Public License as published by
1796- * the Free Software Foundation; version 3.
1797- *
1798- * This program is distributed in the hope that it will be useful,
1799- * but WITHOUT ANY WARRANTY; without even the implied warranty of
1800- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
1801- * GNU General Public License for more details.
1802- *
1803- * You should have received a copy of the GNU General Public License
1804- * along with this program. If not, see <http://www.gnu.org/licenses/>.
1805- */
1806-
1807-import QtQuick 2.0
1808-
1809-Rectangle {
1810- width: 40
1811- height: 40
1812- color : "red"
1813-}
1814
1815=== removed file 'tests/mocks/Unity/Indicators/qml/fake_menu_widget2.qml'
1816--- tests/mocks/Unity/Indicators/qml/fake_menu_widget2.qml 2014-01-13 16:25:32 +0000
1817+++ tests/mocks/Unity/Indicators/qml/fake_menu_widget2.qml 1970-01-01 00:00:00 +0000
1818@@ -1,23 +0,0 @@
1819-/*
1820- * Copyright 2013 Canonical Ltd.
1821- *
1822- * This program is free software; you can redistribute it and/or modify
1823- * it under the terms of the GNU General Public License as published by
1824- * the Free Software Foundation; version 3.
1825- *
1826- * This program is distributed in the hope that it will be useful,
1827- * but WITHOUT ANY WARRANTY; without even the implied warranty of
1828- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
1829- * GNU General Public License for more details.
1830- *
1831- * You should have received a copy of the GNU General Public License
1832- * along with this program. If not, see <http://www.gnu.org/licenses/>.
1833- */
1834-
1835-import QtQuick 2.0
1836-
1837-Rectangle {
1838- width: 40
1839- height: 40
1840- color : "blue"
1841-}
1842
1843=== removed file 'tests/mocks/Unity/Indicators/qml/fake_menu_widget3.qml'
1844--- tests/mocks/Unity/Indicators/qml/fake_menu_widget3.qml 2014-01-13 16:25:32 +0000
1845+++ tests/mocks/Unity/Indicators/qml/fake_menu_widget3.qml 1970-01-01 00:00:00 +0000
1846@@ -1,23 +0,0 @@
1847-/*
1848- * Copyright 2013 Canonical Ltd.
1849- *
1850- * This program is free software; you can redistribute it and/or modify
1851- * it under the terms of the GNU General Public License as published by
1852- * the Free Software Foundation; version 3.
1853- *
1854- * This program is distributed in the hope that it will be useful,
1855- * but WITHOUT ANY WARRANTY; without even the implied warranty of
1856- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
1857- * GNU General Public License for more details.
1858- *
1859- * You should have received a copy of the GNU General Public License
1860- * along with this program. If not, see <http://www.gnu.org/licenses/>.
1861- */
1862-
1863-import QtQuick 2.0
1864-
1865-Rectangle {
1866- width: 40
1867- height: 40
1868- color : "yellow"
1869-}
1870
1871=== removed file 'tests/mocks/Unity/Indicators/qml/fake_menu_widget4.qml'
1872--- tests/mocks/Unity/Indicators/qml/fake_menu_widget4.qml 2013-06-17 09:02:14 +0000
1873+++ tests/mocks/Unity/Indicators/qml/fake_menu_widget4.qml 1970-01-01 00:00:00 +0000
1874@@ -1,23 +0,0 @@
1875-/*
1876- * Copyright 2013 Canonical Ltd.
1877- *
1878- * This program is free software; you can redistribute it and/or modify
1879- * it under the terms of the GNU General Public License as published by
1880- * the Free Software Foundation; version 3.
1881- *
1882- * This program is distributed in the hope that it will be useful,
1883- * but WITHOUT ANY WARRANTY; without even the implied warranty of
1884- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
1885- * GNU General Public License for more details.
1886- *
1887- * You should have received a copy of the GNU General Public License
1888- * along with this program. If not, see <http://www.gnu.org/licenses/>.
1889- */
1890-
1891-import QtQuick 2.0
1892-
1893-Rectangle {
1894- width: 40
1895- height: 40
1896- color : "green"
1897-}
1898
1899=== removed file 'tests/mocks/Unity/Indicators/qml/fake_menu_widget5.qml'
1900--- tests/mocks/Unity/Indicators/qml/fake_menu_widget5.qml 2013-06-17 09:02:14 +0000
1901+++ tests/mocks/Unity/Indicators/qml/fake_menu_widget5.qml 1970-01-01 00:00:00 +0000
1902@@ -1,23 +0,0 @@
1903-/*
1904- * Copyright 2013 Canonical Ltd.
1905- *
1906- * This program is free software; you can redistribute it and/or modify
1907- * it under the terms of the GNU General Public License as published by
1908- * the Free Software Foundation; version 3.
1909- *
1910- * This program is distributed in the hope that it will be useful,
1911- * but WITHOUT ANY WARRANTY; without even the implied warranty of
1912- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
1913- * GNU General Public License for more details.
1914- *
1915- * You should have received a copy of the GNU General Public License
1916- * along with this program. If not, see <http://www.gnu.org/licenses/>.
1917- */
1918-
1919-import QtQuick 2.0
1920-
1921-Rectangle {
1922- width: 40
1923- height: 40
1924- color : "orange"
1925-}
1926
1927=== modified file 'tests/mocks/Unity/Indicators/qmldir'
1928--- tests/mocks/Unity/Indicators/qmldir 2014-08-20 08:39:09 +0000
1929+++ tests/mocks/Unity/Indicators/qmldir 2014-10-14 14:19:22 +0000
1930@@ -3,5 +3,4 @@
1931 typeinfo Indicators.qmltypes
1932
1933 IndicatorsModel 0.1 IndicatorsModel.qml
1934-FakeMenuPage 0.1 FakeMenuPage.qml
1935 RootActionState 0.1 RootActionState.qml
1936
1937=== modified file 'tests/mocks/Unity/Launcher/Launcher.qmltypes'
1938--- tests/mocks/Unity/Launcher/Launcher.qmltypes 2014-06-26 07:47:57 +0000
1939+++ tests/mocks/Unity/Launcher/Launcher.qmltypes 2014-10-14 14:19:22 +0000
1940@@ -85,6 +85,7 @@
1941 Property { name: "recent"; type: "bool"; isReadonly: true }
1942 Property { name: "progress"; type: "int"; isReadonly: true }
1943 Property { name: "count"; type: "int"; isReadonly: true }
1944+ Property { name: "countVisible"; type: "bool"; isReadonly: true }
1945 Property { name: "focused"; type: "bool"; isReadonly: true }
1946 Property {
1947 name: "quickList"
1948@@ -93,6 +94,14 @@
1949 isPointer: true
1950 }
1951 Signal {
1952+ name: "nameChanged"
1953+ Parameter { name: "name"; type: "string" }
1954+ }
1955+ Signal {
1956+ name: "iconChanged"
1957+ Parameter { name: "icon"; type: "string" }
1958+ }
1959+ Signal {
1960 name: "pinnedChanged"
1961 Parameter { name: "pinned"; type: "bool" }
1962 }
1963@@ -113,6 +122,10 @@
1964 Parameter { name: "count"; type: "int" }
1965 }
1966 Signal {
1967+ name: "countVisibleChanged"
1968+ Parameter { name: "countVisible"; type: "bool" }
1969+ }
1970+ Signal {
1971 name: "focusedChanged"
1972 Parameter { name: "focused"; type: "bool" }
1973 }
1974
1975=== modified file 'tests/mocks/Unity/Unity.qmltypes'
1976--- tests/mocks/Unity/Unity.qmltypes 2014-09-01 12:18:53 +0000
1977+++ tests/mocks/Unity/Unity.qmltypes 2014-10-14 14:19:22 +0000
1978@@ -30,6 +30,25 @@
1979 Parameter { name: "row"; type: "int" }
1980 Parameter { name: "role"; type: "int" }
1981 }
1982+ Method {
1983+ name: "setCount"
1984+ Parameter { name: "count"; type: "int" }
1985+ }
1986+ Method {
1987+ name: "resultModel"
1988+ type: "ResultsModel*"
1989+ Parameter { name: "row"; type: "int" }
1990+ }
1991+ Method {
1992+ name: "setLayout"
1993+ Parameter { name: "row"; type: "int" }
1994+ Parameter { name: "layout"; type: "string" }
1995+ }
1996+ Method {
1997+ name: "setHeaderLink"
1998+ Parameter { name: "row"; type: "int" }
1999+ Parameter { name: "headerLink"; type: "string" }
2000+ }
2001 }
2002 Component {
2003 name: "PreviewModel"
2004@@ -66,6 +85,10 @@
2005 exports: ["Unity/FakeResultsModel 0.2", "Unity/ResultsModel 0.2"]
2006 isCreatable: false
2007 exportMetaObjectRevisions: [0, 0]
2008+ Method {
2009+ name: "setResultCount"
2010+ Parameter { name: "result_count"; type: "int" }
2011+ }
2012 }
2013 Component {
2014 name: "Scope"
2015@@ -76,6 +99,15 @@
2016 name: "performQuery"
2017 Parameter { name: "query"; type: "string" }
2018 }
2019+ Signal { name: "refreshed" }
2020+ Method {
2021+ name: "setId"
2022+ Parameter { name: "id"; type: "string" }
2023+ }
2024+ Method {
2025+ name: "setName"
2026+ Parameter { name: "name"; type: "string" }
2027+ }
2028 Method {
2029 name: "setSearchInProgress"
2030 Parameter { name: "inProg"; type: "bool" }
2031
2032=== modified file 'tests/plugins/Unity/Indicators/CMakeLists.txt'
2033--- tests/plugins/Unity/Indicators/CMakeLists.txt 2013-12-10 14:22:43 +0000
2034+++ tests/plugins/Unity/Indicators/CMakeLists.txt 2014-10-14 14:19:22 +0000
2035@@ -40,3 +40,4 @@
2036 indicator_test(menucontentactivatortest ADDITIONAL_CPPS ${INDICATORS_DIR}/menucontentactivator.cpp)
2037 indicator_test(unitymenumodelstacktest ADDITIONAL_CPPS ${TEST_DIR}/mocks/QMenuModel/unitymenumodel.cpp ${INDICATORS_DIR}/unitymenumodelstack.cpp)
2038 indicator_test(rootactionstatetest ADDITIONAL_LIBS IndicatorsQml)
2039+indicator_test(sharedunitymenumodeltest ADDITIONAL_LIBS IndicatorsQml)
2040
2041=== added file 'tests/plugins/Unity/Indicators/sharedunitymenumodeltest.cpp'
2042--- tests/plugins/Unity/Indicators/sharedunitymenumodeltest.cpp 1970-01-01 00:00:00 +0000
2043+++ tests/plugins/Unity/Indicators/sharedunitymenumodeltest.cpp 2014-10-14 14:19:22 +0000
2044@@ -0,0 +1,102 @@
2045+/*
2046+ * Copyright 2014 Canonical Ltd.
2047+ *
2048+ * This program is free software; you can redistribute it and/or modify
2049+ * it under the terms of the GNU Lesser General Public License as published by
2050+ * the Free Software Foundation; version 3.
2051+ *
2052+ * This program is distributed in the hope that it will be useful,
2053+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
2054+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
2055+ * GNU Lesser General Public License for more details.
2056+ *
2057+ * You should have received a copy of the GNU Lesser General Public License
2058+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
2059+ *
2060+ */
2061+
2062+#include "sharedunitymenumodel.h"
2063+#include "unitymenumodelcache.h"
2064+
2065+#include <QtTest>
2066+#include <unitymenumodel.h>
2067+
2068+class SharedUnityMenuModelTest : public QObject
2069+{
2070+ Q_OBJECT
2071+
2072+ SharedUnityMenuModel* createFullModel(const QByteArray& testId)
2073+ {
2074+ SharedUnityMenuModel* model = new SharedUnityMenuModel;
2075+ model->setBusName("com.canonical." + testId);
2076+ model->setMenuObjectPath("/com/canonical/" + testId);
2077+ QVariantMap actions;
2078+ actions["test"] = QString("/com/canonical/%1/actions").arg(QString(testId));
2079+ model->setActions(actions);
2080+
2081+ return model;
2082+ }
2083+
2084+private Q_SLOTS:
2085+
2086+ void testCreateModel()
2087+ {
2088+ QSharedPointer<SharedUnityMenuModel> model(createFullModel("test1"));
2089+ QVERIFY(model->model() != nullptr);
2090+ }
2091+
2092+ void testDifferentDataCreatesDifferentModels()
2093+ {
2094+ QSharedPointer<SharedUnityMenuModel> model1(createFullModel("test1"));
2095+ QSharedPointer<SharedUnityMenuModel> model2(createFullModel("test2"));
2096+
2097+ QVERIFY(model1->model() != model2->model());
2098+ }
2099+
2100+ void testSameDataCreatesSameModels()
2101+ {
2102+ QSharedPointer<SharedUnityMenuModel> model1(createFullModel("test1"));
2103+ QSharedPointer<SharedUnityMenuModel> model2(createFullModel("test1"));
2104+
2105+ QCOMPARE(model1->model(), model2->model());
2106+ }
2107+
2108+ void testSharedOwnership()
2109+ {
2110+ QSharedPointer<SharedUnityMenuModel> model1(createFullModel("test1"));
2111+ QSharedPointer<SharedUnityMenuModel> model2(createFullModel("test1"));
2112+
2113+ QCOMPARE(UnityMenuModelCache::singleton()->contains("/com/canonical/test1"), true);
2114+ model1.clear();
2115+ QCOMPARE(UnityMenuModelCache::singleton()->contains("/com/canonical/test1"), true);
2116+ model2.clear();
2117+ QCOMPARE(UnityMenuModelCache::singleton()->contains("/com/canonical/test1"), false);
2118+ }
2119+
2120+ // Tests that changing cached model data does not change the model path of others
2121+ void testLP1328646()
2122+ {
2123+ QSharedPointer<SharedUnityMenuModel> model1(createFullModel("test1"));
2124+ QSharedPointer<SharedUnityMenuModel> model2(createFullModel("test1"));
2125+
2126+ model2->setMenuObjectPath("/com/canonical/LP1328646");
2127+
2128+ QVERIFY(model1->model() != model2->model());
2129+ QCOMPARE(model1->model()->menuObjectPath(), QByteArray("/com/canonical/test1"));
2130+ QCOMPARE(model2->model()->menuObjectPath(), QByteArray("/com/canonical/LP1328646"));
2131+ }
2132+
2133+ // Tests that the cache is recreated if deleted.
2134+ void testDeletedCache()
2135+ {
2136+ QSharedPointer<SharedUnityMenuModel> model1(createFullModel("test1"));
2137+
2138+ QCOMPARE(UnityMenuModelCache::singleton()->contains("/com/canonical/test1"), true);
2139+ delete UnityMenuModelCache::singleton();
2140+ QCOMPARE(UnityMenuModelCache::singleton()->contains("/com/canonical/test1"), false);
2141+ }
2142+
2143+};
2144+
2145+QTEST_GUILESS_MAIN(SharedUnityMenuModelTest)
2146+#include "sharedunitymenumodeltest.moc"
2147
2148=== modified file 'tests/qmltests/CMakeLists.txt'
2149--- tests/qmltests/CMakeLists.txt 2014-10-01 13:22:00 +0000
2150+++ tests/qmltests/CMakeLists.txt 2014-10-14 14:19:22 +0000
2151@@ -19,9 +19,9 @@
2152 set(qmltest_DEFAULT_NO_ADD_TEST TRUE)
2153 set(qmltest_DEFAULT_PROPERTIES ENVIRONMENT "LC_ALL=C")
2154
2155-add_qml_test(. Shell ENVIRONMENT "LD_LIBRARY_PATH=${CMAKE_BINARY_DIR}/tests/mocks/LightDM/single")
2156-add_qml_test(. ShellWithPin ENVIRONMENT "LD_LIBRARY_PATH=${CMAKE_BINARY_DIR}/tests/mocks/LightDM/single-pin")
2157-add_qml_test(. TabletShell ENVIRONMENT "LD_LIBRARY_PATH=${CMAKE_BINARY_DIR}/tests/mocks/LightDM/full")
2158+add_qml_test(. Shell ENVIRONMENT "LD_LIBRARY_PATH=${CMAKE_BINARY_DIR}/tests/mocks/LightDM/single:${CMAKE_BINARY_DIR}/tests/mocks/QMenuModel")
2159+add_qml_test(. ShellWithPin ENVIRONMENT "LD_LIBRARY_PATH=${CMAKE_BINARY_DIR}/tests/mocks/LightDM/single-pin:${CMAKE_BINARY_DIR}/tests/mocks/QMenuModel")
2160+add_qml_test(. TabletShell ENVIRONMENT "LD_LIBRARY_PATH=${CMAKE_BINARY_DIR}/tests/mocks/LightDM/full:${CMAKE_BINARY_DIR}/tests/mocks/QMenuModel")
2161 add_qml_test(Components Background)
2162 add_qml_test(Components Carousel)
2163 add_qml_test(Components DraggingArea)
2164@@ -72,14 +72,13 @@
2165 add_qml_test(Notifications Notifications)
2166 add_qml_test(Notifications VisualSnapDecisionsQueue)
2167 add_qml_test(Panel ActiveCallHint)
2168-add_qml_test(Panel IndicatorRow)
2169-add_qml_test(Panel Indicators)
2170-add_qml_test(Panel MenuContent)
2171-add_qml_test(Panel Panel)
2172+add_qml_test(Panel IndicatorRow ENVIRONMENT "LD_LIBRARY_PATH=${CMAKE_BINARY_DIR}/tests/mocks/QMenuModel")
2173+add_qml_test(Panel Indicators ENVIRONMENT "LD_LIBRARY_PATH=${CMAKE_BINARY_DIR}/tests/mocks/QMenuModel")
2174+add_qml_test(Panel MenuContent ENVIRONMENT "LD_LIBRARY_PATH=${CMAKE_BINARY_DIR}/tests/mocks/QMenuModel")
2175+add_qml_test(Panel Panel ENVIRONMENT "LD_LIBRARY_PATH=${CMAKE_BINARY_DIR}/tests/mocks/QMenuModel")
2176 add_qml_test(Panel SearchIndicator)
2177 add_qml_test(Panel/Indicators DefaultIndicatorWidget ENVIRONMENT "LD_LIBRARY_PATH=${CMAKE_BINARY_DIR}/tests/mocks/QMenuModel")
2178 add_qml_test(Panel/Indicators DefaultIndicatorPage ENVIRONMENT "LD_LIBRARY_PATH=${CMAKE_BINARY_DIR}/tests/mocks/QMenuModel")
2179-add_qml_test(Panel/Indicators CachedUnityMenuModel ENVIRONMENT "LD_LIBRARY_PATH=${CMAKE_BINARY_DIR}/tests/mocks/QMenuModel")
2180 # These MenuItemFactory tests need the test/mocks/ to come before plugins/
2181 add_qml_test(Panel/Indicators MenuItemFactory IMPORT_PATHS ${CMAKE_BINARY_DIR}/tests/mocks ${qmltest_DEFAULT_IMPORT_PATHS})
2182 add_qml_test(Panel/Indicators MessageMenuItemFactory IMPORT_PATHS ${CMAKE_BINARY_DIR}/tests/mocks ${qmltest_DEFAULT_IMPORT_PATHS})
2183
2184=== modified file 'tests/qmltests/Greeter/tst_Clock.qml'
2185--- tests/qmltests/Greeter/tst_Clock.qml 2014-05-01 14:25:18 +0000
2186+++ tests/qmltests/Greeter/tst_Clock.qml 2014-10-14 14:19:22 +0000
2187@@ -19,7 +19,7 @@
2188 import ".."
2189 import "../../../qml/Greeter"
2190 import Ubuntu.Components 0.1
2191-import QMenuModel 0.1
2192+import Unity.Indicators 0.1 as Indicators
2193 import Unity.Test 0.1 as UT
2194
2195 Rectangle {
2196@@ -36,56 +36,73 @@
2197 }
2198 }
2199
2200- UnityMenuModel {
2201- id: menuModel
2202- modelData: [{
2203- "rowData": {
2204- "actionState": { "label": Qt.formatTime(new Date("October 13, 1975 11:13:00")) }
2205- }
2206- }]
2207+ function updateDatetimeModelTime(label) {
2208+ Indicators.UnityMenuModelCache.setCachedModelData("com.canonical.indicator.datetime",
2209+ "/com/canonical/indicator/datetime/phone",
2210+ "/com/canonical/indicator/datetime",
2211+ [{
2212+ "rowData": {
2213+ "actionState": { "label": label }
2214+ }
2215+ }]);
2216 }
2217
2218 UT.UnityTestCase {
2219 name: "Clock"
2220+ when: windowShown
2221
2222 function init() {
2223- var cachedModel = findChild(clock, "timeModel");
2224- verify(cachedModel !== undefined);
2225- cachedModel.model = menuModel;
2226- }
2227-
2228- function test_customDate() {
2229- var dateObj = new Date("October 13, 1975 11:13:00")
2230- var dateString = Qt.formatDate(dateObj, Qt.DefaultLocaleLongDate)
2231- var timeString = Qt.formatTime(dateObj)
2232-
2233- clock.currentDate = dateObj
2234- var dateLabel = findChild(clock, "dateLabel")
2235- compare(dateLabel.text, dateString, "Not the expected date")
2236- var timeLabel = findChild(clock, "timeLabel")
2237- compare(timeLabel.text, timeString, "Not the expected time")
2238- }
2239-
2240- function test_dateUpdate() {
2241- var dateObj = new Date("October 13, 1975 11:13:00")
2242- var dateString = Qt.formatDate(dateObj, Qt.DefaultLocaleLongDate)
2243- var timeString = Qt.formatTime(dateObj)
2244-
2245+ updateDatetimeModelTime(Qt.formatTime(new Date("October 13, 1975 12:14:00")));
2246+ clock.visible = true;
2247+ }
2248+
2249+ // Test that the date portion of the clock updates with custom value.
2250+ // Time portion is controlled by indicators
2251+ function test_updateDate() {
2252+ var dateLabel = findChild(clock, "dateLabel");
2253+ var timeLabel = findChild(clock, "timeLabel");
2254+
2255+ var timeString = Qt.formatTime(new Date("October 13, 1975 12:14:00"));
2256+
2257+ // initial date.
2258+ var dateObj = new Date("October 13, 1975 11:13:00");
2259+ var dateString = Qt.formatDate(dateObj, Qt.DefaultLocaleLongDate);
2260+ clock.currentDate = dateObj;
2261+
2262+ compare(dateLabel.text, dateString, "Not the expected date");
2263+ compare(timeLabel.text, timeString, "Time should come from indicators");
2264+
2265+ // update date.
2266+ var dateObj2 = new Date("October 14, 1976 13:15:00");
2267+ var dateString2 = Qt.formatDate(dateObj2, Qt.DefaultLocaleLongDate);
2268+ clock.currentDate = dateObj2;
2269+
2270+ compare(dateLabel.text, dateString2, "Not the expected date");
2271+ compare(timeLabel.text,timeString, "Time should come from indicators");
2272+ }
2273+
2274+ // Test that the date portion of the clock updates with custom value.
2275+ // Time portion is controlled by indicators
2276+ function test_updateTime() {
2277+ var timeLabel = findChild(clock, "timeLabel");
2278+
2279+ var timeString1 = Qt.formatTime(new Date("October 13, 1975 11:15:00"));
2280+ var timeString2 = Qt.formatTime(new Date("October 14, 1976 12:16:00"));
2281+
2282+ updateDatetimeModelTime(timeString1);
2283+ compare(timeLabel.text, timeString1, "Time should come from indicators");
2284+
2285+ updateDatetimeModelTime(timeString2);
2286+ compare(timeLabel.text, timeString2, "Time should come from indicators");
2287+ }
2288+
2289+ function test_indicatorDisconnect() {
2290 clock.visible = false
2291 var timeModel = findInvisibleChild(clock, "timeModel")
2292-
2293 compare(timeModel.menuObjectPath, "", "Clock shouldn't be connected to Indicators when not visible.")
2294
2295- clock.currentDate = dateObj
2296-
2297- var dateLabel = findChild(clock, "dateLabel")
2298- compare(dateLabel.text, dateString, "Not the expected date")
2299- var timeLabel = findChild(clock, "timeLabel")
2300- compare(timeLabel.text, timeString, "Not the expected time")
2301-
2302 clock.visible = true
2303-
2304- verify(timeModel.menuObjectPath != "", "Should be connected to Indicators.")
2305+ verify(timeModel.menuObjectPath !== "", "Should be connected to Indicators.")
2306 }
2307 }
2308 }
2309
2310=== removed file 'tests/qmltests/Panel/Indicators/tst_CachedUnityMenuModel.qml'
2311--- tests/qmltests/Panel/Indicators/tst_CachedUnityMenuModel.qml 2014-08-20 09:16:28 +0000
2312+++ tests/qmltests/Panel/Indicators/tst_CachedUnityMenuModel.qml 1970-01-01 00:00:00 +0000
2313@@ -1,137 +0,0 @@
2314-/*
2315- * Copyright 2014 Canonical Ltd.
2316- *
2317- * This program is free software; you can redistribute it and/or modify
2318- * it under the terms of the GNU General Public License as published by
2319- * the Free Software Foundation; version 3.
2320- *
2321- * This program is distributed in the hope that it will be useful,
2322- * but WITHOUT ANY WARRANTY; without even the implied warranty of
2323- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
2324- * GNU General Public License for more details.
2325- *
2326- * You should have received a copy of the GNU General Public License
2327- * along with this program. If not, see <http://www.gnu.org/licenses/>.
2328- */
2329-
2330-import QtQuick 2.0
2331-import QtTest 1.0
2332-import Unity.Test 0.1 as UT
2333-import QMenuModel 0.1
2334-import Unity.Indicators 0.1 as Indicators
2335-import "../../../../qml/Panel/Indicators"
2336-
2337-Item {
2338- id: root
2339- width: units.gu(40)
2340- height: units.gu(70)
2341-
2342- Component {
2343- id: model
2344- CachedUnityMenuModel {}
2345- }
2346-
2347- UT.UnityTestCase {
2348- name: "CachedUnityMenuModel"
2349- when: windowShown
2350-
2351- function cleanup() {
2352- doGC();
2353- }
2354-
2355- function doGC() {
2356- // need to put some wait cycles here to get gc going properly.
2357- wait(10);
2358- gc();
2359- wait(10);
2360- }
2361-
2362- function test_createDifferent() {
2363- var cachedObject = model.createObject(null,
2364- {
2365- "busName": "com.canonical.test1",
2366- "menuObjectPath": "/com/canonical/test1",
2367- "actionsObjectPath": "/com/canonical/test1"
2368- });
2369-
2370- var cachedObject2 = model.createObject(null,
2371- {
2372- "busName": "com.canonical.test2",
2373- "menuObjectPath": "/com/canonical/test2",
2374- "actionsObjectPath": "/com/canonical/test2"
2375- });
2376-
2377- verify(cachedObject.model !== cachedObject2.model);
2378- }
2379-
2380- function test_createSame() {
2381- var cachedObject = model.createObject(null,
2382- {
2383- "busName": "com.canonical.test3",
2384- "menuObjectPath": "/com/canonical/test3",
2385- "actionsObjectPath": "/com/canonical/test3"
2386- });
2387-
2388- var cachedObject2 = model.createObject(null,
2389- {
2390- "busName": "com.canonical.test3",
2391- "menuObjectPath": "/com/canonical/test3",
2392- "actionsObjectPath": "/com/canonical/test3"
2393- });
2394-
2395- verify(cachedObject.model === cachedObject2.model);
2396- }
2397-
2398- // Tests that changing cached model data does not change the model path of others
2399- function test_lp1328646() {
2400- var cachedObject = model.createObject(null,
2401- {
2402- "busName": "com.canonical.test4",
2403- "menuObjectPath": "/com/canonical/test4",
2404- "actionsObjectPath": "/com/canonical/test4"
2405- });
2406-
2407- var cachedObject2 = model.createObject(null,
2408- {
2409- "busName": "com.canonical.test4",
2410- "menuObjectPath": "/com/canonical/test4",
2411- "actionsObjectPath": "/com/canonical/test4"
2412- });
2413-
2414- cachedObject.menuObjectPath = "/com/canonical/test5";
2415- compare(cachedObject.model.menuObjectPath, "/com/canonical/test5");
2416- compare(cachedObject2.model.menuObjectPath, "/com/canonical/test4");
2417-
2418- verify(cachedObject.model !== cachedObject2.model);
2419- }
2420-
2421- function createAndDestroy(test) {
2422- var cachedObject = model.createObject(null,
2423- {
2424- "busName": "com.canonical."+test,
2425- "menuObjectPath": "/com/canonical/"+test,
2426- "actionsObjectPath": "/com/canonical/"+test
2427- });
2428- var cachedObject2 = model.createObject(null,
2429- {
2430- "busName": "com.canonical."+test,
2431- "menuObjectPath": "/com/canonical/"+test,
2432- "actionsObjectPath": "/com/canonical/"+test
2433- });
2434- cachedObject.destroy();
2435- return cachedObject2;
2436- }
2437-
2438- function test_destroyAllDeletesModel() {
2439- createAndDestroy("test6");
2440- doGC();
2441- compare(Indicators.UnityMenuModelCache.contains("/com/canonical/test6"), false);
2442- }
2443-
2444- function test_destroyPartialKeepsModel() {
2445- var model = createAndDestroy("test7");
2446- doGC();
2447- compare(Indicators.UnityMenuModelCache.contains("/com/canonical/test7"), true);
2448- }
2449- }
2450-}
2451
2452=== modified file 'tests/qmltests/Panel/Indicators/tst_DefaultIndicatorPage.qml'
2453--- tests/qmltests/Panel/Indicators/tst_DefaultIndicatorPage.qml 2014-09-29 10:24:58 +0000
2454+++ tests/qmltests/Panel/Indicators/tst_DefaultIndicatorPage.qml 2014-10-14 14:19:22 +0000
2455@@ -17,7 +17,7 @@
2456 import QtQuick 2.0
2457 import QtTest 1.0
2458 import Unity.Test 0.1 as UT
2459-import QMenuModel 0.1
2460+import Unity.Indicators 0.1 as Indicators
2461 import "../../../../qml/Panel/Indicators"
2462
2463 Item {
2464@@ -25,18 +25,14 @@
2465 width: units.gu(40)
2466 height: units.gu(70)
2467
2468- DefaultIndicatorPage {
2469+ DefaultIndicatorPage {
2470 id: page
2471-
2472 anchors.fill: parent
2473
2474- menuModel: UnityMenuModel {}
2475- busName: "test"
2476- actionsObjectPath: "test"
2477- menuObjectPath: "test"
2478-
2479 identifier: "test-indicator"
2480- rootMenuType: "com.canonical.indicator.root"
2481+ busName: "com.caninical.indicator.test"
2482+ actionsObjectPath: "/com/canonical/indicator/test"
2483+ menuObjectPath: "/com/canonical/indicator/test"
2484 }
2485
2486 property var fullMenuData: [{
2487@@ -113,29 +109,30 @@
2488 "submenu": []
2489 }]; // end row 1
2490
2491+ function initializeMenuData(data) {
2492+ Indicators.UnityMenuModelCache.setCachedModelData("com.canonical.indicator.test",
2493+ "/com/canonical/indicator/test",
2494+ "/com/canonical/indicator/test",
2495+ data);
2496+ }
2497+
2498 UT.UnityTestCase {
2499 name: "DefaultIndicatorPage"
2500
2501 function init() {
2502- var mainMenu = findChild(page, "mainMenu");
2503- page.menuModel.modelData = [];
2504- verify(mainMenu.model !== null);
2505+ initializeMenuData([]);
2506 }
2507
2508 function test_reloadData() {
2509 var mainMenu = findChild(page, "mainMenu");
2510
2511- page.menuModel.modelData = [];
2512- tryCompare(mainMenu, "count", 0);
2513-
2514- page.menuModel.modelData = fullMenuData;
2515- tryCompare(mainMenu, "count", 3);
2516-
2517- page.menuModel.modelData = [];
2518- tryCompare(mainMenu, "count", 0);
2519-
2520- page.menuModel.modelData = fullMenuData;
2521- tryCompare(mainMenu, "count", 3);
2522+ tryCompare(mainMenu, "count", 0);
2523+
2524+ initializeMenuData(fullMenuData);
2525+ tryCompare(mainMenu, "count", 3);
2526+
2527+ initializeMenuData([]);
2528+ tryCompare(mainMenu, "count", 0);
2529 }
2530
2531 function test_traverse_rootMenuType_data() {
2532@@ -147,7 +144,7 @@
2533
2534 function test_traverse_rootMenuType(data) {
2535 page.rootMenuType = data.rootMenuType;
2536- page.menuModel.modelData = fullMenuData;
2537+ initializeMenuData(fullMenuData);
2538
2539 var mainMenu = findChild(page, "mainMenu");
2540 tryCompare(mainMenu, "count", data.expectedCount);
2541
2542=== modified file 'tests/qmltests/Panel/Indicators/tst_DefaultIndicatorWidget.qml'
2543--- tests/qmltests/Panel/Indicators/tst_DefaultIndicatorWidget.qml 2014-07-03 13:46:51 +0000
2544+++ tests/qmltests/Panel/Indicators/tst_DefaultIndicatorWidget.qml 2014-10-14 14:19:22 +0000
2545@@ -33,7 +33,6 @@
2546 top: parent.top
2547 }
2548
2549- menuModel: UnityMenuModel {}
2550 busName: "test"
2551 actionsObjectPath: "test"
2552 deviceMenuObjectPath: "test"
2553@@ -48,13 +47,6 @@
2554 name: "DefaultIndicatorWidget"
2555 when: windowShown
2556
2557- function init() {
2558- widget.rootActionState.icons = [];
2559- widget.rootActionState.leftLabel = "";
2560- widget.rootActionState.rightLabel = "";
2561- waitForRendering(widget)
2562- }
2563-
2564 // FIXME: add tests
2565 }
2566 }
2567
2568=== modified file 'tests/qmltests/Panel/tst_IndicatorItem.qml'
2569--- tests/qmltests/Panel/tst_IndicatorItem.qml 2014-01-07 14:29:23 +0000
2570+++ tests/qmltests/Panel/tst_IndicatorItem.qml 2014-10-14 14:19:22 +0000
2571@@ -43,7 +43,7 @@
2572
2573 function test_empty() {
2574 compare(indicatorItem.indicatorVisible, false, "IndicatorItem should not be visible.");
2575- indicatorItem.widgetSource = "qrc:/tests/indciators/qml/fake_menu_widget1.qml";
2576+ indicatorItem.widgetSource = "../../../qml/Panel/Indicators/DefaultIndicatorWidget.qml";
2577 tryCompare(indicatorItem, "indicatorVisible", true);
2578 }
2579 }
2580
2581=== modified file 'tests/qmltests/Panel/tst_IndicatorRow.qml'
2582--- tests/qmltests/Panel/tst_IndicatorRow.qml 2014-03-03 11:55:00 +0000
2583+++ tests/qmltests/Panel/tst_IndicatorRow.qml 2014-10-14 14:19:22 +0000
2584@@ -30,15 +30,6 @@
2585 width: units.gu(40)
2586 height: units.gu(60)
2587
2588- function init_test()
2589- {
2590- indicatorModel.load("test1");
2591-
2592- indicatorRow.state = "initial";
2593- indicatorRow.setCurrentItemIndex(-1);
2594- indicatorRow.unitProgress = 0.0;
2595- }
2596-
2597 PanelBackground {
2598 anchors.fill: indicatorRow
2599 }
2600@@ -63,20 +54,33 @@
2601 name: "IndicatorRow"
2602 when: windowShown
2603
2604+ function init() {
2605+ indicatorModel.load("test1");
2606+
2607+ indicatorRow.state = "initial";
2608+ indicatorRow.setCurrentItemIndex(-1);
2609+ indicatorRow.unitProgress = 0.0;
2610+ }
2611+
2612 function get_indicator_item(index) {
2613 return findChild(indicatorRow.row, "item" + index);
2614 }
2615
2616 function test_set_current_item() {
2617- init_test();
2618 indicatorRow.setCurrentItemIndex(0);
2619- compare(indicatorRow.indicatorsModel.data(indicatorRow.currentItemIndex, Indicators.IndicatorsModelRole.Identifier), "indicator-fake1", "Incorrect item at position 0");
2620+ compare(indicatorRow.indicatorsModel.data(indicatorRow.currentItemIndex, Indicators.IndicatorsModelRole.Identifier),
2621+ "indicator-fake1",
2622+ "Incorrect item at position 0");
2623
2624 indicatorRow.setCurrentItemIndex(1);
2625- compare(indicatorRow.indicatorsModel.data(indicatorRow.currentItemIndex, Indicators.IndicatorsModelRole.Identifier), "indicator-fake2", "Incorrect item at position 1");
2626+ compare(indicatorRow.indicatorsModel.data(indicatorRow.currentItemIndex, Indicators.IndicatorsModelRole.Identifier),
2627+ "indicator-fake2",
2628+ "Incorrect item at position 1");
2629
2630 indicatorRow.setCurrentItemIndex(2);
2631- compare(indicatorRow.indicatorsModel.data(indicatorRow.currentItemIndex, Indicators.IndicatorsModelRole.Identifier), "indicator-fake3", "Incorrect item at position 2");
2632+ compare(indicatorRow.indicatorsModel.data(indicatorRow.currentItemIndex, Indicators.IndicatorsModelRole.Identifier),
2633+ "indicator-fake3",
2634+ "Incorrect item at position 2");
2635 }
2636
2637 function test_highlight_data() {
2638@@ -93,8 +97,6 @@
2639 }
2640
2641 function test_highlight(data) {
2642- init_test();
2643-
2644 indicatorRow.unitProgress = data.progress;
2645 indicatorRow.setCurrentItemIndex(data.index);
2646
2647@@ -119,8 +121,6 @@
2648 }
2649
2650 function test_opacity(data) {
2651- init_test();
2652-
2653 indicatorRow.unitProgress = data.progress;
2654 indicatorRow.setCurrentItemIndex(data.index);
2655
2656@@ -145,8 +145,6 @@
2657 }
2658
2659 function test_dimmed(data) {
2660- init_test();
2661-
2662 indicatorRow.unitProgress = data.progress;
2663 indicatorRow.setCurrentItemIndex(data.index);
2664
2665
2666=== modified file 'tests/qmltests/Panel/tst_Indicators.qml'
2667--- tests/qmltests/Panel/tst_Indicators.qml 2014-07-30 16:01:09 +0000
2668+++ tests/qmltests/Panel/tst_Indicators.qml 2014-10-14 14:19:22 +0000
2669@@ -158,6 +158,7 @@
2670 function init_invisible_indicator(identifier) {
2671 tryCompareFunction(function() { return findChild(indicators, identifier+"-delegate") !== undefined }, true);
2672 var item = findChild(indicators, identifier+"-delegate");
2673+ verify(item !== null);
2674
2675 item.enabled = false;
2676 }
2677
2678=== modified file 'tests/qmltests/Panel/tst_MenuContent.qml'
2679--- tests/qmltests/Panel/tst_MenuContent.qml 2014-09-09 15:10:52 +0000
2680+++ tests/qmltests/Panel/tst_MenuContent.qml 2014-10-14 14:19:22 +0000
2681@@ -26,14 +26,6 @@
2682 width: units.gu(40)
2683 height: units.gu(70)
2684
2685- property var indicator_status: {
2686- 'indicator-fake1-page': { 'started': false, 'reset': 0 },
2687- 'indicator-fake2-page': { 'started': false, 'reset': 0 },
2688- 'indicator-fake3-page': { 'started': false, 'reset': 0 },
2689- 'indicator-fake4-page': { 'started': false, 'reset': 0 },
2690- 'indicator-fake5-page': { 'started': false, 'reset': 0 }
2691- }
2692-
2693 // Dummy objects
2694 Item { id: greeter }
2695 Item { id: handle }
2696
2697=== modified file 'tests/qmltests/tst_Shell.qml'
2698--- tests/qmltests/tst_Shell.qml 2014-10-13 15:42:40 +0000
2699+++ tests/qmltests/tst_Shell.qml 2014-10-14 14:19:22 +0000
2700@@ -65,6 +65,8 @@
2701 property bool itemDestroyed: false
2702 sourceComponent: Component {
2703 Shell {
2704+ property string indicatorProfile: "phone"
2705+
2706 Component.onDestruction: {
2707 shellLoader.itemDestroyed = true;
2708 }
2709
2710=== modified file 'tests/qmltests/tst_ShellWithPin.qml'
2711--- tests/qmltests/tst_ShellWithPin.qml 2014-10-13 15:42:15 +0000
2712+++ tests/qmltests/tst_ShellWithPin.qml 2014-10-14 14:19:22 +0000
2713@@ -61,6 +61,8 @@
2714 property bool itemDestroyed: false
2715 sourceComponent: Component {
2716 Shell {
2717+ property string indicatorProfile: "phone"
2718+
2719 Component.onDestruction: {
2720 shellLoader.itemDestroyed = true
2721 }
2722
2723=== modified file 'tests/qmltests/tst_TabletShell.qml'
2724--- tests/qmltests/tst_TabletShell.qml 2014-10-09 13:05:21 +0000
2725+++ tests/qmltests/tst_TabletShell.qml 2014-10-14 14:19:22 +0000
2726@@ -57,6 +57,8 @@
2727 property bool itemDestroyed: false
2728 sourceComponent: Component {
2729 Shell {
2730+ property string indicatorProfile: "phone"
2731+
2732 Component.onDestruction: {
2733 shellLoader.itemDestroyed = true
2734 }

Subscribers

People subscribed via source and target branches