diff options
author | Ashod Nakashian <ashod.nakashian@collabora.co.uk> | 2020-08-02 14:52:02 -0400 |
---|---|---|
committer | Tor Lillqvist <tml@collabora.com> | 2020-11-21 22:26:19 +0100 |
commit | e82335afd6e3e9a75275865661cf14a0a2959603 (patch) | |
tree | 8d2ff36b57485bc9e3244073f7741784e6743a32 /desktop/source | |
parent | 23951bdc3836b252aab0e7628d8839e89b5a9f6d (diff) |
sfx2: lok: reliably support multi-documents
Instead of using the current view to set
the DocId, we instead make sure that the ShellView
object has the DocId set at construction time.
This turned out to be necessary in at least one
case (which has a unit-test that failed), which
is when events fired during the creation of a
new view. The cursor position is notified
before we have a chance to set the DocId and
because of that we miss the notifications (or
worse, we end up sending them to all other
documents' views in an effort to fix this bug).
This approach is clean and always guarantees that
all views have the correct DocId set as soon as
possible and that all notifications are sent
as expected.
A unit-test is added to exercise mult-document
usage, which exposed a number of bugs and issues
that have been addressed in this patch.
Change-Id: Icf5145fb1dabd0d029368310c2b9bf73ae927ccc
Reviewed-on: https://gerrit.libreoffice.org/c/core/+/99975
Tested-by: Jenkins CollaboraOffice <jenkinscollaboraoffice@gmail.com>
Reviewed-by: Michael Meeks <michael.meeks@collabora.com>
Reviewed-by: Ashod Nakashian <ash@collabora.com>
Reviewed-on: https://gerrit.libreoffice.org/c/core/+/106252
Tested-by: Jenkins
Reviewed-by: Tor Lillqvist <tml@collabora.com>
Diffstat (limited to 'desktop/source')
-rw-r--r-- | desktop/source/lib/init.cxx | 36 |
1 files changed, 23 insertions, 13 deletions
diff --git a/desktop/source/lib/init.cxx b/desktop/source/lib/init.cxx index 6fe7347e9b70..9bcfff524bbf 100644 --- a/desktop/source/lib/init.cxx +++ b/desktop/source/lib/init.cxx @@ -1229,6 +1229,8 @@ LibLODocument_Impl::LibLODocument_Impl(const uno::Reference <css::lang::XCompone : mxComponent(xComponent) , mnDocumentId(nDocumentId) { + assert(nDocumentId != -1 && "Cannot set mnDocumentId to -1"); + m_pDocumentClass = gDocumentClass.lock(); if (!m_pDocumentClass) { @@ -2292,7 +2294,6 @@ static LibreOfficeKitDocument* lo_documentLoadWithOptions(LibreOfficeKit* pThis, LibLODocument_Impl* pDocument = new LibLODocument_Impl(xComponent, nDocumentIdCounter++); // After loading the document, its initial view is the "current" view. - SfxLokHelper::setDocumentIdOfView(pDocument->mnDocumentId); if (pLib->mpCallback) { int nState = doc_getSignatureState(pDocument); @@ -3358,13 +3359,13 @@ static void doc_registerCallback(LibreOfficeKitDocument* pThis, LibLODocument_Impl* pDocument = static_cast<LibLODocument_Impl*>(pThis); - int nView = SfxLokHelper::getView(); + const int nView = SfxLokHelper::getView(); if (nView < 0) return; + const size_t nId = nView; if (pCallback != nullptr) { - size_t nId = nView; for (auto& pair : pDocument->mpCallbackFlushHandlers) { if (pair.first == nId) @@ -3375,7 +3376,6 @@ static void doc_registerCallback(LibreOfficeKitDocument* pThis, } else { - size_t nId = nView; for (auto& pair : pDocument->mpCallbackFlushHandlers) { if (pair.first == nId) @@ -3389,7 +3389,6 @@ static void doc_registerCallback(LibreOfficeKitDocument* pThis, if (pCallback != nullptr) { - size_t nId = nView; for (const auto& pair : pDocument->mpCallbackFlushHandlers) { if (pair.first == nId) @@ -3397,11 +3396,19 @@ static void doc_registerCallback(LibreOfficeKitDocument* pThis, pDocument->mpCallbackFlushHandlers[nView]->addViewStates(pair.first); } - } - if (SfxViewShell* pViewShell = SfxViewShell::Current()) + if (SfxViewShell* pViewShell = SfxViewShell::Current()) + { + pViewShell->registerLibreOfficeKitViewCallback( + CallbackFlushHandler::callback, pDocument->mpCallbackFlushHandlers[nView].get()); + } + } + else { - pViewShell->registerLibreOfficeKitViewCallback(CallbackFlushHandler::callback, pDocument->mpCallbackFlushHandlers[nView].get()); + if (SfxViewShell* pViewShell = SfxViewShell::Current()) + { + pViewShell->registerLibreOfficeKitViewCallback(nullptr, nullptr); + } } } @@ -5145,7 +5152,8 @@ static int doc_createViewWithOptions(LibreOfficeKitDocument* pThis, const OUString aDeviceFormFactor = extractParameter(aOptions, "DeviceFormFactor"); SfxLokHelper::setDeviceFormFactor(aDeviceFormFactor); - int nId = SfxLokHelper::createView(); + LibLODocument_Impl* pDocument = static_cast<LibLODocument_Impl*>(pThis); + const int nId = SfxLokHelper::createView(pDocument->mnDocumentId); #ifdef IOS (void) pThis; @@ -5193,24 +5201,26 @@ static int doc_getView(SAL_UNUSED_PARAMETER LibreOfficeKitDocument* /*pThis*/) return SfxLokHelper::getView(); } -static int doc_getViewsCount(SAL_UNUSED_PARAMETER LibreOfficeKitDocument* /*pThis*/) +static int doc_getViewsCount(SAL_UNUSED_PARAMETER LibreOfficeKitDocument* pThis) { comphelper::ProfileZone aZone("doc_getViewsCount"); SolarMutexGuard aGuard; SetLastExceptionMsg(); - return SfxLokHelper::getViewsCount(); + LibLODocument_Impl* pDocument = static_cast<LibLODocument_Impl*>(pThis); + return SfxLokHelper::getViewsCount(pDocument->mnDocumentId); } -static bool doc_getViewIds(SAL_UNUSED_PARAMETER LibreOfficeKitDocument* /*pThis*/, int* pArray, size_t nSize) +static bool doc_getViewIds(SAL_UNUSED_PARAMETER LibreOfficeKitDocument* pThis, int* pArray, size_t nSize) { comphelper::ProfileZone aZone("doc_getViewsIds"); SolarMutexGuard aGuard; SetLastExceptionMsg(); - return SfxLokHelper::getViewIds(pArray, nSize); + LibLODocument_Impl* pDocument = static_cast<LibLODocument_Impl*>(pThis); + return SfxLokHelper::getViewIds(pDocument->mnDocumentId, pArray, nSize); } static void doc_setViewLanguage(SAL_UNUSED_PARAMETER LibreOfficeKitDocument* /*pThis*/, int nId, const char* language) |