summaryrefslogtreecommitdiff
path: root/framework
AgeCommit message (Collapse)Author
2017-01-21move GetXGraphic to its only userCaolán McNamara
Change-Id: I72ec4a7e72ca3355a97f987fab70b3e3a8e45168
2017-01-20empty Image is an empty XGraphicCaolán McNamara
Change-Id: I43fa17c2ef9324c841344554b093500d0fb26165
2017-01-20don't need an intermediate ImageCaolán McNamara
Change-Id: Ibdc4b94e284a1d54b94abfdeb99df393b6a7bf59
2017-01-19New loplugin:dynexcspec: Add @throws documentation, frameworkStephan Bergmann
Change-Id: I19a4517449be3defe97fe0d78dd1a16b08b79247
2017-01-19Expand and improve the output log in Session-ManagementJuergen Funk
in dependency of tdf#104101 Change-Id: I799f81adf4e4751fb505c84aa075363acf70f5a7 Reviewed-on: https://gerrit.libreoffice.org/33034 Reviewed-by: Samuel Mehrbrodt <Samuel.Mehrbrodt@cib.de> Tested-by: Samuel Mehrbrodt <Samuel.Mehrbrodt@cib.de>
2017-01-19framework: AutoRecovery uses Timer without SolarMutexMichael Stahl
This results in a SolarMutex assert when creating a new Base document. ... and also implts_startListening() is looking less thread safe than advertised. Change-Id: I4635064733c16416f903dab4caee59fb2de3cb00
2017-01-17Change Idle to be a Timer subclassJan-Marek Glogowski
Drops a lot of duplicated code, as Idle is just a convenience class for instant, mostly low priority timers. Change-Id: I847592e92e86d15ab1cab168bf0e667322e48048
2017-01-17tdf#97087 GDB pretty print the Scheduler task listJan-Marek Glogowski
In addition to the GDB pretty printer, this annotates a lot more Timers and Idles. Change-Id: I5b93fab02161b23bb753e65ef92643a04fb0789c
2017-01-17manage m_xInplaceMenuBar with rtl::ReferenceNoel Grandin
instead of both a raw pointer and an uno::Reference Change-Id: I44111694671371fac5c4207d1c46f99761bf10eb
2017-01-17manage m_xToolbarManager with rtl::ReferenceNoel Grandin
instead of both a raw pointer and an uno::Reference Change-Id: Idcdbbcd4f01c21bd32b4f00d3cfc3febd70e9194
2017-01-17use rtl::Reference in RequestFilterSelect_ImplNoel Grandin
instead of raw pointers Change-Id: I86e929d71afc1ce9852d2b01339f7623cc119fcb
2017-01-17new loplugin: useuniqueptr: forms..frameworkNoel Grandin
Change-Id: I4300a13f455148b7156ac3f444c7102d63ae6db3 Reviewed-on: https://gerrit.libreoffice.org/33164 Reviewed-by: Noel Grandin <noel.grandin@collabora.co.uk> Tested-by: Noel Grandin <noel.grandin@collabora.co.uk>
2017-01-16e*, f*: load BitmapEx resources instead of Image onesCaolán McNamara
Change-Id: I3383e222829042557a8fd9f575049c47aeddeb09
2017-01-14move Image(Bitmap, MaskBitmap) code to last user of itCaolán McNamara
the last use looks rather dubious to me, I wonder if anything can really end up here Change-Id: I13314610405463122891b3ed0f311da65fd1d542
2017-01-11framework: call disposing from disposing, not notifyTerminationMichael Stahl
Don't rely on current implementation details of TerminateListener. Change-Id: I7977c73669f0ab5afac1c93be620e7aeebfe68a2
2017-01-10tdf#104830, need an own termination listener for lib objectsMarkus Mohrhard
The destruction of the SwDLL object happens already through the normal termination listener but the other termination listeners might still depend on it. Also the outstanding events might need the SwDLL instance to be still around. This makes the destruction of the instance explicit and at a time when it should be safe. We should use the same code for calc, impress, math and base as well. Change-Id: I50b8f30426f5a4a54e362e748fe962839abca73e Reviewed-on: https://gerrit.libreoffice.org/32856 Reviewed-by: Noel Grandin <noel.grandin@collabora.co.uk> Tested-by: Jenkins <ci@libreoffice.org> Reviewed-by: Markus Mohrhard <markus.mohrhard@googlemail.com>
2017-01-10loplugin:unusedmethodsNoel Grandin
Change-Id: Ibe11923601760ded53a277c48631e4893606b2d6 Reviewed-on: https://gerrit.libreoffice.org/32875 Tested-by: Jenkins <ci@libreoffice.org> Reviewed-by: Noel Grandin <noel.grandin@collabora.co.uk>
2017-01-09New loplugin:externvar: frameworkStephan Bergmann
Change-Id: Idcc4e0bb8065d7a9b30d38463470a67b1921c6cb
2017-01-08loplugin:salboolStephan Bergmann
Change-Id: I1c71cdbd4cc36bd048277d9b52a7f74e709ca125
2017-01-05finish moving ImageList to frameworkCaolán McNamara
Change-Id: I9d9f292066321174af8b0bcd96c58de5fc7566b8
2017-01-05move ImageList to frameworkCaolán McNamara
this can probably be replaced by a std::*map<Image> Change-Id: Ic36c5f406f5ea51cb9ff135858e319e0877179c7
2017-01-05move CommandImageResolver out of vcl and beside its only userCaolán McNamara
Change-Id: I2bd70d87bb12d5750d8427b8a8fe786cfce8961b
2016-12-30hidden use of removed RID_SVXIMGLIST_FMEXPL resourceCaolán McNamara
Change-Id: I23c64f0071640cb9946340151b7648f47894a113
2016-12-30include header instead of duplicating definesCaolán McNamara
Change-Id: Iee47a90071cb988d5b9fc434569bf91035d52007 Reviewed-on: https://gerrit.libreoffice.org/32510 Reviewed-by: Caolán McNamara <caolanm@redhat.com> Tested-by: Caolán McNamara <caolanm@redhat.com>
2016-12-29process all outstanding events before shutdown, tdf#104969, tdf#104286, ↵Markus Mohrhard
tdf#104399 Change-Id: Id09c3dfdc94c430d5dcb2aebb017f17db80f17e6 Reviewed-on: https://gerrit.libreoffice.org/32486 Tested-by: Jenkins <ci@libreoffice.org> Reviewed-by: Markus Mohrhard <markus.mohrhard@googlemail.com>
2016-12-29add a crashreporter entry when we start the shutdownMarkus Mohrhard
This will help us identify shutdown related crashes. Change-Id: Id09c3dfdc94c430d5dcb2aebb017f17db80f17e5 Reviewed-on: https://gerrit.libreoffice.org/32485 Tested-by: Jenkins <ci@libreoffice.org> Reviewed-by: Markus Mohrhard <markus.mohrhard@googlemail.com>
2016-12-28fix indentationMarkus Mohrhard
Change-Id: I37c3864ad3c7293f46190d6492a47f640e0dcb81 Reviewed-on: https://gerrit.libreoffice.org/32484 Reviewed-by: Markus Mohrhard <markus.mohrhard@googlemail.com> Tested-by: Markus Mohrhard <markus.mohrhard@googlemail.com>
2016-12-24unused Image in framework, luckily because uses GetImage on pos not idCaolán McNamara
Change-Id: I97dab3bc1025cd4804910c228235b49216f3afe7
2016-12-22tdf#104818 Show the right label when a11y enabledMaxim Monastirsky
Change-Id: If4da5b9435e96e3830bac3d01e06f7ddc87754eb
2016-12-21convert EnumContext::Application to scoped enumNoel Grandin
Change-Id: Ia289a7b63bf8797085315218785e2a2a4c45d232 Reviewed-on: https://gerrit.libreoffice.org/32230 Reviewed-by: Noel Grandin <noel.grandin@collabora.co.uk> Tested-by: Noel Grandin <noel.grandin@collabora.co.uk>
2016-12-15tdf#104621 framework: Redo commit 84f2ff67a7e404febf710b1dc7f66d06745c503fMichael Stahl
The fix was silly and wrong, need to check m_xUIElement, not m_aName, which may be set independently, see the confusing code in ToolbarLayoutManager::requestToolbar(). Change-Id: I279088cb2516b0a19619b5647f15f738a2624edf
2016-12-15teach sallogareas plugin to catch inconsistenciesNoel Grandin
Change-Id: I8bcea5ffc74d48148bea78da8c17744e288c069a Reviewed-on: https://gerrit.libreoffice.org/32004 Tested-by: Jenkins <ci@libreoffice.org> Reviewed-by: Noel Grandin <noel.grandin@collabora.co.uk>
2016-12-13Revert "verify SolarMutex when ref-counting VclPtr" seriesNoel Grandin
This reverts the following commits: commit 722f4e1d86710f2facd37d7e040df9e1fd585e26 tdf#104573 - Assertion failed: SolarMutex not locked commit f04ec99f5e6a543b8191ced61db4710c3c0de356 tdf#104573 - Assertion failed: SolarMutex not locked commit 71b1e3ff6374c23e65200d3bcafca387d29af04f tdf#104573 - Assertion failed: SolarMutex not locked when trying commit e794ce1eef6730e5a46d5fb0aa6db2895ede85e7 verify that we hold the SolarMutex when ref-counting VclPtr IRC discussion: <noelgrandin> sberg, maybe I should revert this whole "VclPtr assert" series, I don't have mental bandwidth to sort this out properly now <sberg> noelgrandin, what I fear is that you'll end up adding lots of SolarMutex locks to small places, where the proper fix would be to add it further out; and once such a dreaded recursive SolarMutex lock is in place (but needlessly so, once the proper fix is done), it's hard to clean that up again <noelgrandin> sberg, yeah, in that case I'll just remove all of this, leave it for another day Change-Id: Ie4f84b72b79a1b7e80164b5c7693af398c2c569a Reviewed-on: https://gerrit.libreoffice.org/31946 Tested-by: Jenkins <ci@libreoffice.org> Reviewed-by: Noel Grandin <noel.grandin@collabora.co.uk>
2016-12-13OSL_TRACE->SAL in framework..salNoel Grandin
Change-Id: I9a897af88aa9f6f7ca98ce521c69b5a4ee8462e9 Reviewed-on: https://gerrit.libreoffice.org/31903 Reviewed-by: Noel Grandin <noel.grandin@collabora.co.uk> Tested-by: Noel Grandin <noel.grandin@collabora.co.uk>
2016-12-10framework: fix race in ToolBarManager creationMichael Stahl
ToolbarLayoutManager::createToolbar() may be called concurrently on different threads, and then it can happen that both threads want to create the same toolbar URL, see that it does not exist in line 457, then both release the SolarMutex and create a new ToolBarManager and the first inserts it and then the second overwrites it on line 514 without disposing the first one. The non-disposed extra ToolBarManager is kept alive because it is registered as a listener on the Frame. When the Frame::close() is called, the ToolbarLayoutManager is disposed, and that disposes all the ToolBarManagers it knows about, but not the extra one, which is then un-ref'd and then has a live VclPtr m_pToolBar, which asserts because the SolarMutex is not locked since commit e794ce1eef6730e5a46d5fb0aa6db2895ede85e7. (This commit is thanks to rr, which recorded the JunitTest_framework_complex execution and allowed debugging this.) Change-Id: I8f5333e8e36ac8ea347ef545e014ffc10501aebb
2016-12-09vcl: set toolbox size correctly when using 32px iconsTomaž Vajngerl
Change-Id: Ifacff75f80bc8401ccff2a4d4dc90e56e3b4aa84 Reviewed-on: https://gerrit.libreoffice.org/31801 Reviewed-by: Tomaž Vajngerl <quikee@gmail.com> Tested-by: Tomaž Vajngerl <quikee@gmail.com>
2016-12-08verify that we hold the SolarMutex when ref-counting VclPtrNoel Grandin
Change-Id: If0c5a8c99f0f853c9ecad0f1a4a7299d69805b34 Reviewed-on: https://gerrit.libreoffice.org/31755 Reviewed-by: Michael Stahl <mstahl@redhat.com> Tested-by: Noel Grandin <noel.grandin@collabora.co.uk>
2016-12-07Monkey business: Fix typo in comments: et -> ed :)Mike Kaganski
Change-Id: I91440e8582108b9121ac6525c8ac88ad6f218a60 Reviewed-on: https://gerrit.libreoffice.org/31721 Reviewed-by: Mike Kaganski <mike.kaganski@collabora.com> Tested-by: Mike Kaganski <mike.kaganski@collabora.com>
2016-12-07convert VCLEVENT constants to scoped enumNoel Grandin
Change-Id: Ic8ccb0a9715ec05182dacddab2c015b0de6a0fba Reviewed-on: https://gerrit.libreoffice.org/31675 Tested-by: Jenkins <ci@libreoffice.org> Reviewed-by: Noel Grandin <noel.grandin@collabora.co.uk>
2016-12-05convert FSysStyle to o3tl::typed_flagsNoel Grandin
Change-Id: I58a63a0e6f619442f21827064644ecd8ca57b8ff
2016-12-05convert DecodeMechanism to scoped enumNoel Grandin
Change-Id: I5c56634b1bca8e37fa73d02d2428645301b6c547
2016-12-05convert INetURLObject::EncodeMechanism to scoped enumNoel Grandin
Change-Id: I50ea17c7779c7b5cacddf548f1773fd7d6c8bade
2016-12-05loplugin:unnecessaryoverride (dtors) in frameworkStephan Bergmann
Change-Id: I52b12e390b97f15f9af07edd511fa36288f31fbd
2016-11-29loplugin:vclwidgets check for assigning from VclPt<T> to T*Noel Grandin
Inspired by a recent bug report where we were assigning the result of VclPtr<T>::Create to a raw pointer. As a consequence, we also need to change various methods that were returning newly created Window subclasses via raw pointer, to instead return those via VclPtr Change-Id: I8118e0195a5b2b4780e646cfb0e151692e54ae2b Reviewed-on: https://gerrit.libreoffice.org/31318 Reviewed-by: Noel Grandin <noel.grandin@collabora.co.uk> Tested-by: Noel Grandin <noel.grandin@collabora.co.uk>
2016-11-28orcus is mandatory nowMarkus Mohrhard
We use it as a json parser, for calc cell styles and tests. Making it optional is just making the code more complex and introduces more sources for errors. Change-Id: I8769628a4ab9519cafc3d43db7c0007e0aa265dc Reviewed-on: https://gerrit.libreoffice.org/31307 Tested-by: Jenkins <ci@libreoffice.org> Reviewed-by: Markus Mohrhard <markus.mohrhard@googlemail.com>
2016-11-22Revert "Timer::Start must be called with SolarMutex locked"Stephan Bergmann
This reverts commit 1c3e88a4ffd927d4dda8bb9e0d05cddc6cd685c0; the static AutoRecovery instance is only destroyed during exit, but wants to use SolarMutex; that causes crashes at least in CppunitTest_services. Apparently needs more thought.
2016-11-22Timer::Start must be called with SolarMutex lockedStephan Bergmann
cf. DBG_TESTSOLARMUTEX added to Scheduler::Start in c00d8271ba443c4f0acf657c226eea4824597f95 "vcl: assert solar mutex is held for various timer / scheduler ops." So cover operations on AutoRecovery::m_aTimer with SolarMutexGuard instead of AutoRecovery's own mutex. Is it safe to split guarding like that here? Hopefully. Would it be better to exclusively use SolarMutexGuard? Maybe. The DBG_TESTSOLARMUTEX assert fired at least on macOS when opening some .odb file: > frame #19: 0x00007fffc80e5893 libsystem_c.dylib`__assert_rtn + 320 > frame #20: 0x000000010f5e4dae libvcllo.dylib`ImplDbgTestSolarMutex() + 110 at vcl/source/app/dbggui.cxx:47 > frame #21: 0x000000010e6a5d62 libtllo.dylib`DbgTestSolarMutex() + 130 at tools/source/debug/debug.cxx:74 > frame #22: 0x000000010f5eeb3a libvcllo.dylib`Scheduler::Start(this=0x00000001489233a8) + 58 at vcl/source/app/scheduler.cxx:287 > frame #23: 0x000000010f62f03f libvcllo.dylib`Timer::Start(this=0x00000001489233a8) + 31 at vcl/source/app/timer.cxx:93 > frame #24: 0x00000001481b7483 libfwklo.dylib`(anonymous namespace)::AutoRecovery::implts_updateTimer(this=0x00000001489232a0) + 259 at framework/source/services/autorecovery.cxx:2274 > frame #25: 0x00000001481b3009 libfwklo.dylib`(anonymous namespace)::AutoRecovery::changesOccurred(this=0x00000001489232a0, aEvent=0x00007f92d87d0ec8) + 649 at framework/source/services/autorecovery.cxx:1678 > frame #26: 0x000000014807e04b libfwklo.dylib`framework::WeakChangesListener::changesOccurred(this=0x0000000148c42488, rEvent=0x00007f92d87d0ec8) + 155 at framework/inc/helper/mischelper.hxx:222 > frame #27: 0x000000011c13f29e libconfigmgrlo.dylib`configmgr::Broadcaster::send(this=0x00007000082f9e70) + 5694 at configmgr/source/broadcaster.cxx:187 > frame #28: 0x000000011c0fd9bc libconfigmgrlo.dylib`configmgr::Access::insertByName(this=0x0000000148c118e0, aName=0x00007000082fa258, aElement=0x00007000082fa118) + 3196 at configmgr/source/access.cxx:1232 > frame #29: 0x00000001481bdd23 libfwklo.dylib`(anonymous namespace)::AutoRecovery::implts_flushConfigItem(this=0x00000001489232a0, rInfo=0x00007000082fa600, bRemoveIt=false)::AutoRecovery::TDocumentInfo const&, bool) + 2483 at framework/source/services/autorecovery.cxx:2092 > frame #30: 0x00000001481bb09d libfwklo.dylib`(anonymous namespace)::AutoRecovery::implts_registerDocument(this=0x00000001489232a0, xDocument=0x00007000082fa790) + 3597 at framework/source/services/autorecovery.cxx:2519 > frame #31: 0x00000001481b2a35 libfwklo.dylib`(anonymous namespace)::AutoRecovery::documentEventOccured(this=0x00000001489232a0, aEvent=0x00007f92db3d8620) + 165 at framework/source/services/autorecovery.cxx:1571 > frame #32: 0x00000001481d025b libfwklo.dylib`framework::WeakDocumentEventListener::documentEventOccured(this=0x0000000148c42548, rEvent=0x00007f92db3d8620) + 155 at framework/inc/helper/mischelper.hxx:258 > frame #33: 0x0000000109fca69e libsfxlo.dylib`comphelper::OInterfaceContainerHelper2::NotifySingleListener<com::sun::star::document::XDocumentEventListener, com::sun::star::document::DocumentEvent>::operator(this=0x00007000082fa910, listener=0x00007000082fa880)(com::sun::star::uno::Reference<com::sun::star::document::XDocumentEventListener> const&) const + 126 at include/comphelper/interfacecontainer2.hxx:272 > frame #34: 0x0000000109fca4a3 libsfxlo.dylib`void comphelper::OInterfaceContainerHelper2::forEach<com::sun::star::document::XDocumentEventListener, comphelper::OInterfaceContainerHelper2::NotifySingleListener<com::sun::star::document::XDocumentEventListener, com::sun::star::document::DocumentEvent> >(this=0x00000001489186b8, func=0x00007000082fa910) + 163 at include/comphelper/interfacecontainer2.hxx:285 > frame #35: 0x0000000109fca0de libsfxlo.dylib`void comphelper::OInterfaceContainerHelper2::notifyEach<com::sun::star::document::XDocumentEventListener, com::sun::star::document::DocumentEvent>(this=0x00000001489186b8, NotificationMethod=21 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00, Event=0x00007f92db3d8620)(com::sun::star::document::DocumentEvent const&), com::sun::star::document::DocumentEvent const&) + 126 at include/comphelper/interfacecontainer2.hxx:298 > frame #36: 0x0000000109fc9f08 libsfxlo.dylib`(anonymous namespace)::SfxGlobalEvents_Impl::implts_notifyListener(this=0x0000000148918628, aEvent=0x00007f92db3d8620) + 168 at sfx2/source/notify/globalevents.cxx:438 > frame #37: 0x0000000109fc6874 libsfxlo.dylib`(anonymous namespace)::SfxGlobalEvents_Impl::documentEventOccured(this=0x0000000148918628, Event=0x00007f92db3d8620) + 132 at sfx2/source/notify/globalevents.cxx:243 > frame #38: 0x000000014957597e libdbalo.dylib`comphelper::OInterfaceContainerHelper2::NotifySingleListener<com::sun::star::document::XDocumentEventListener, com::sun::star::document::DocumentEvent>::operator(this=0x00007000082fab30, listener=0x00007000082faaa0)(com::sun::star::uno::Reference<com::sun::star::document::XDocumentEventListener> const&) const + 126 at include/comphelper/interfacecontainer2.hxx:272 > frame #39: 0x0000000149575753 libdbalo.dylib`void comphelper::OInterfaceContainerHelper2::forEach<com::sun::star::document::XDocumentEventListener, comphelper::OInterfaceContainerHelper2::NotifySingleListener<com::sun::star::document::XDocumentEventListener, com::sun::star::document::DocumentEvent> >(this=0x00007f92db0965f0, func=0x00007000082fab30) + 163 at include/comphelper/interfacecontainer2.hxx:285 > frame #40: 0x000000014957407e libdbalo.dylib`void comphelper::OInterfaceContainerHelper2::notifyEach<com::sun::star::document::XDocumentEventListener, com::sun::star::document::DocumentEvent>(this=0x00007f92db0965f0, NotificationMethod=21 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00, Event=0x00007f92db3d8620)(com::sun::star::document::DocumentEvent const&), com::sun::star::document::DocumentEvent const&) + 126 at include/comphelper/interfacecontainer2.hxx:298 > frame #41: 0x0000000149573dfb libdbalo.dylib`dbaccess::DocumentEventNotifier_Impl::impl_notifyEvent_nothrow(this=0x00007f92db0965a0, _rEvent=0x00007f92db3d8620) + 379 at dbaccess/source/core/dataaccess/documenteventnotifier.cxx:196 > frame #42: 0x0000000149574580 libdbalo.dylib`dbaccess::DocumentEventNotifier_Impl::processEvent(this=0x00007f92db0965a0, _rEvent=0x00007f92db3d8610) + 224 at dbaccess/source/core/dataaccess/documenteventnotifier.cxx:229 > frame #43: 0x000000010832ba30 libcomphelper.dylib`comphelper::AsyncEventNotifierBase::execute(this=0x000000014df32dd0) + 1184 at comphelper/source/misc/asyncnotification.cxx:163 > frame #44: 0x000000010832e28a libcomphelper.dylib`comphelper::AsyncEventNotifierAutoJoin::run(this=0x000000014df32dd0) + 90 at comphelper/source/misc/asyncnotification.cxx:263 > frame #45: 0x000000010832f23e libcomphelper.dylib`::threadFunc(param=0x000000014df32dd0) + 30 at include/osl/thread.hxx:185 > frame #46: 0x0000000107e9bc27 libuno_sal.dylib.3`osl_thread_start_Impl(pData=0x00007f92db351d30) + 295 at sal/osl/unx/thread.cxx:240 > frame #47: 0x00007fffc82a1aab libsystem_pthread.dylib`_pthread_body + 180 > frame #48: 0x00007fffc82a19f7 libsystem_pthread.dylib`_pthread_start + 286 > frame #49: 0x00007fffc82a1221 libsystem_pthread.dylib`thread_start + 13 Change-Id: I58fe8d61bfc491fa635b75d471a221bbb55c0f6e
2016-11-22Resolves: rhbz#1397181 toolbar layout manager not respecting drag cancelCaolán McNamara
plus restore original mbDockCanceled state after wayland-enforced cancel otherwise next drag won't work Change-Id: Idefed25b925b36d0bf72b77609c4fc2eb47f71b9
2016-11-18includes should be at the top of the fileNoel Grandin
not randomly scattered through the code found with something like: git ls-files *.cpp | xargs grep -Pzl "(?s){.*#include" Change-Id: I9c242fa4ef99e8677f2800d7ec9f16d16e488351 Reviewed-on: https://gerrit.libreoffice.org/30952 Tested-by: Jenkins <ci@libreoffice.org> Reviewed-by: Noel Grandin <noel.grandin@collabora.co.uk>
2016-11-16new loplugin finalprotectedNoel Grandin
look for final classes, and make sure they don't have protected members Change-Id: I1fa810659bba02b61a5160dbfd8e24185ec9abf4 Reviewed-on: https://gerrit.libreoffice.org/30895 Reviewed-by: Noel Grandin <noel.grandin@collabora.co.uk> Tested-by: Noel Grandin <noel.grandin@collabora.co.uk>