/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ /* * This file is part of the LibreOffice project. * * This Source Code Form is subject to the terms of the Mozilla Public * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include using namespace ::com::sun::star; namespace { /// Covers embeddedobj/source/msole/ fixes. class Test : public test::BootstrapFixture, public unotest::MacrosTest, public XmlTestTools { private: uno::Reference mxComponent; public: void setUp() override; void tearDown() override; uno::Reference& getComponent() { return mxComponent; } void registerNamespaces(xmlXPathContextPtr& pXmlXpathCtx) override; }; } void Test::setUp() { test::BootstrapFixture::setUp(); mxDesktop.set(frame::Desktop::create(mxComponentContext)); } void Test::tearDown() { if (mxComponent.is()) mxComponent->dispose(); test::BootstrapFixture::tearDown(); } void Test::registerNamespaces(xmlXPathContextPtr& pXmlXpathCtx) { XmlTestTools::registerODFNamespaces(pXmlXpathCtx); } namespace { class OdtExportThread : public osl::Thread { uno::Reference mxComponent; OUString maURL; public: OdtExportThread(const uno::Reference& xComponent, const OUString& rURL); virtual void SAL_CALL run() override; }; OdtExportThread::OdtExportThread(const uno::Reference& xComponent, const OUString& rURL) : mxComponent(xComponent) , maURL(rURL) { } void OdtExportThread::run() { uno::Reference xStorable(mxComponent, uno::UNO_QUERY); uno::Sequence aStoreProperties = { comphelper::makePropertyValue("FilterName", OUString("writer8")), }; xStorable->storeToURL(maURL, aStoreProperties); } } CPPUNIT_TEST_FIXTURE(Test, testSaveOnThread) { // Given an embedded object which hosts mspaint data: if (Application::GetDefaultDevice()->GetDPIX() != 96) { return; } DBG_TESTSOLARMUTEX(); OUString aURL = m_directories.getURLFromSrc(u"embeddedobj/qa/cppunit/data/reqif-ole2.xhtml"); uno::Sequence aLoadProperties = { comphelper::makePropertyValue("FilterName", OUString("HTML (StarWriter)")), comphelper::makePropertyValue("FilterOptions", OUString("xhtmlns=reqif-xhtml")), }; getComponent().set(loadFromDesktop(aURL, "com.sun.star.text.TextDocument", aLoadProperties)); // When saving that document on a thread: utl::TempFileNamed aTempFile; aTempFile.EnableKillingFile(); OdtExportThread aThread(getComponent(), aTempFile.GetURL()); aThread.create(); { SolarMutexReleaser r; while (aThread.isRunning()) { SolarMutexGuard g; Application::Reschedule(/*bHandleAllCurrentEvents=*/true); } } // Then make sure its visible area's width is correct. uno::Reference xNameAccess = packages::zip::ZipFileAccess::createWithURL(mxComponentContext, aTempFile.GetURL()); uno::Reference xInputStream(xNameAccess->getByName("content.xml"), uno::UNO_QUERY); std::unique_ptr pStream(utl::UcbStreamHelper::CreateStream(xInputStream, true)); xmlDocUniquePtr pXmlDoc = parseXmlStream(pStream.get()); // 16 pixels, assuming 96 DPI. // Without the accompanying fix in place, this test would have failed with: // - Expected: 0.1665in // - Actual : 1.9685in // i.e. we wrote a hardcoded 5cm width, not the real one. assertXPath(pXmlDoc, "//style:graphic-properties", "visible-area-width", "0.1665in"); } CPPUNIT_PLUGIN_IMPLEMENT(); /* vim:set shiftwidth=4 softtabstop=4 expandtab: */