From d16508a285a5423ae9a5034e969801bce74ffb98 Mon Sep 17 00:00:00 2001 From: Eskil Abrahamsen Blomfeldt Date: Mon, 12 May 2014 09:09:24 +0200 Subject: Fix crash when loading invalid font data in QRawFont When passing invalid data to QRawFont, we need to fail gracefully and mark the font as invalid, instead of crashing. This crashed because of different missing sanity checks in the Windows and FontConfig font databases. [ChangeLog][Text] Fixed crash when trying to load a font from invalid data. Task-number: QTBUG-37190 Change-Id: I62c81217ec7d873350b575c9d4ae8e6f0a939540 Reviewed-by: Michael Bruning Reviewed-by: Konstantin Ritt --- src/platformsupport/fontdatabases/fontconfig/qfontconfigdatabase.cpp | 3 +++ 1 file changed, 3 insertions(+) (limited to 'src/platformsupport') diff --git a/src/platformsupport/fontdatabases/fontconfig/qfontconfigdatabase.cpp b/src/platformsupport/fontdatabases/fontconfig/qfontconfigdatabase.cpp index 17717dd53c..b8da9726d5 100644 --- a/src/platformsupport/fontdatabases/fontconfig/qfontconfigdatabase.cpp +++ b/src/platformsupport/fontdatabases/fontconfig/qfontconfigdatabase.cpp @@ -660,6 +660,9 @@ QFontEngine *QFontconfigDatabase::fontEngine(const QFontDef &f, void *usrPtr) QFontEngine *QFontconfigDatabase::fontEngine(const QByteArray &fontData, qreal pixelSize, QFont::HintingPreference hintingPreference) { QFontEngineFT *engine = static_cast(QBasicFontDatabase::fontEngine(fontData, pixelSize, hintingPreference)); + if (engine == 0) + return 0; + QFontDef fontDef = engine->fontDef; QFontEngineFT::GlyphFormat format; -- cgit v1.2.3 From 8df62598ac4ee3f90c7f4b80759a5fdbf23010ab Mon Sep 17 00:00:00 2001 From: Richard Moe Gustavsen Date: Thu, 24 Apr 2014 11:55:55 +0200 Subject: qmacmime: add support for public.text MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Copying a URL from Safari to Qt app does not work. The reason is that it lies on the pasteboard as public.text, which we don't support. This patch will implement support for public.text. The UTI public.text is documented as text with an unspecified encoding. On iOS, this turns out to be UTF8 (which also matches [UIPasteboard generalPasteboard].string). Task-number: QTBUG-38551 Change-Id: I216dab206d3bff2dde99927ed7e5a3d85309f2a2 Reviewed-by: Tor Arne Vestbø --- src/platformsupport/clipboard/qmacmime.mm | 65 +++++++++++++++++++++++++++++++ 1 file changed, 65 insertions(+) (limited to 'src/platformsupport') diff --git a/src/platformsupport/clipboard/qmacmime.mm b/src/platformsupport/clipboard/qmacmime.mm index 93d897503b..af94589c08 100644 --- a/src/platformsupport/clipboard/qmacmime.mm +++ b/src/platformsupport/clipboard/qmacmime.mm @@ -115,6 +115,7 @@ const QStringList& qt_mac_enabledDraggedTypes() \list \i public.utf8-plain-text - converts to "text/plain" \i public.utf16-plain-text - converts to "text/plain" + \i public.text - converts to "text/plain" \i public.html - converts to "text/html" \i public.url - converts to "text/uri-list" \i public.file-url - converts to "text/uri-list" @@ -343,6 +344,69 @@ QList QMacPasteboardMimePlainText::convertFromMime(const QString &, return ret; } +class QMacPasteboardMimePlainTextFallback : public QMacInternalPasteboardMime { +public: + QMacPasteboardMimePlainTextFallback() : QMacInternalPasteboardMime(MIME_ALL) { } + QString convertorName(); + + QString flavorFor(const QString &mime); + QString mimeFor(QString flav); + bool canConvert(const QString &mime, QString flav); + QVariant convertToMime(const QString &mime, QList data, QString flav); + QList convertFromMime(const QString &mime, QVariant data, QString flav); +}; + +QString QMacPasteboardMimePlainTextFallback::convertorName() +{ + return QLatin1String("PlainText (public.text)"); +} + +QString QMacPasteboardMimePlainTextFallback::flavorFor(const QString &mime) +{ + if (mime == QLatin1String("text/plain")) + return QLatin1String("public.text"); + return QString(); +} + +QString QMacPasteboardMimePlainTextFallback::mimeFor(QString flav) +{ + if (flav == QLatin1String("public.text")) + return QLatin1String("text/plain"); + return QString(); +} + +bool QMacPasteboardMimePlainTextFallback::canConvert(const QString &mime, QString flav) +{ + return mime == mimeFor(flav); +} + +QVariant QMacPasteboardMimePlainTextFallback::convertToMime(const QString &mimetype, QList data, QString flavor) +{ + if (data.count() > 1) + qWarning("QMacPasteboardMimePlainTextFallback: Cannot handle multiple member data"); + + if (flavor == QLatin1String("public.text")) { + // Note that public.text is documented by Apple to have an undefined encoding. From + // testing it seems that utf8 is normally used, at least by Safari on iOS. + const QByteArray &firstData = data.first(); + return QString::fromCFString(CFStringCreateWithBytes(kCFAllocatorDefault, + reinterpret_cast(firstData.constData()), + firstData.size(), kCFStringEncodingUTF8, false)); + } else { + qWarning("QMime::convertToMime: unhandled mimetype: %s", qPrintable(mimetype)); + } + return QVariant(); +} + +QList QMacPasteboardMimePlainTextFallback::convertFromMime(const QString &, QVariant data, QString flavor) +{ + QList ret; + QString string = data.toString(); + if (flavor == QLatin1String("public.text")) + ret.append(string.toUtf8()); + return ret; +} + class QMacPasteboardMimeUnicodeText : public QMacInternalPasteboardMime { public: QMacPasteboardMimeUnicodeText() : QMacInternalPasteboardMime(MIME_ALL) { } @@ -696,6 +760,7 @@ void QMacInternalPasteboardMime::initializeMimeTypes() new QMacPasteboardMimeAny; //standard types that we wrap + new QMacPasteboardMimePlainTextFallback; new QMacPasteboardMimeUnicodeText; new QMacPasteboardMimePlainText; new QMacPasteboardMimeHTMLText; -- cgit v1.2.3 From 514697893f5be4bbef18b1ae5c7b61531c689dbe Mon Sep 17 00:00:00 2001 From: Richard Moe Gustavsen Date: Wed, 7 May 2014 15:03:34 +0200 Subject: qmacmime: add support for public.rtf MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Application like Safari on iOS posts rtf to the pasteboard when copying html. With this converter added, you can then paste rtf as html into Qt Change-Id: I6b62bcc9cfc0b16a47d44bd8d74062226522526d Reviewed-by: Morten Johan Sørvig --- src/platformsupport/clipboard/qmacmime.mm | 88 +++++++++++++++++++++++++++++++ 1 file changed, 88 insertions(+) (limited to 'src/platformsupport') diff --git a/src/platformsupport/clipboard/qmacmime.mm b/src/platformsupport/clipboard/qmacmime.mm index af94589c08..63675d7a32 100644 --- a/src/platformsupport/clipboard/qmacmime.mm +++ b/src/platformsupport/clipboard/qmacmime.mm @@ -39,6 +39,13 @@ ** ****************************************************************************/ +#include +#if defined(Q_OS_IOS) +#import +#elif defined(Q_OS_OSX) +#import +#endif + #include "qmacmime_p.h" #include "qguiapplication.h" @@ -541,6 +548,86 @@ QList QMacPasteboardMimeHTMLText::convertFromMime(const QString &mim return ret; } +class QMacPasteboardMimeRtfText : public QMacInternalPasteboardMime { +public: + QMacPasteboardMimeRtfText() : QMacInternalPasteboardMime(MIME_ALL) { } + QString convertorName(); + + QString flavorFor(const QString &mime); + QString mimeFor(QString flav); + bool canConvert(const QString &mime, QString flav); + QVariant convertToMime(const QString &mime, QList data, QString flav); + QList convertFromMime(const QString &mime, QVariant data, QString flav); +}; + +QString QMacPasteboardMimeRtfText::convertorName() +{ + return QLatin1String("Rtf"); +} + +QString QMacPasteboardMimeRtfText::flavorFor(const QString &mime) +{ + if (mime == QLatin1String("text/html")) + return QLatin1String("public.rtf"); + return QString(); +} + +QString QMacPasteboardMimeRtfText::mimeFor(QString flav) +{ + if (flav == QLatin1String("public.rtf")) + return QLatin1String("text/html"); + return QString(); +} + +bool QMacPasteboardMimeRtfText::canConvert(const QString &mime, QString flav) +{ +#if defined(Q_OS_IOS) + if (QSysInfo::MacintoshVersion < QSysInfo::MV_IOS_7_0) + return false; +#endif + + return mime == mimeFor(flav); +} + +QVariant QMacPasteboardMimeRtfText::convertToMime(const QString &mimeType, QList data, QString flavor) +{ + if (!canConvert(mimeType, flavor)) + return QVariant(); + if (data.count() > 1) + qWarning("QMacPasteboardMimeHTMLText: Cannot handle multiple member data"); + + // Read RTF into to NSAttributedString, then convert the string to HTML + NSAttributedString *string = [[NSAttributedString alloc] initWithData:data.at(0).toNSData() + options:[NSDictionary dictionaryWithObject:NSRTFTextDocumentType forKey:NSDocumentTypeDocumentAttribute] + documentAttributes:nil + error:nil]; + + NSError *error; + NSRange range = NSMakeRange(0, [string length]); + NSDictionary *dict = [NSDictionary dictionaryWithObject:NSHTMLTextDocumentType forKey:NSDocumentTypeDocumentAttribute]; + NSData *htmlData = [string dataFromRange:range documentAttributes:dict error:&error]; + return QByteArray::fromNSData(htmlData); +} + +QList QMacPasteboardMimeRtfText::convertFromMime(const QString &mime, QVariant data, QString flavor) +{ + QList ret; + if (!canConvert(mime, flavor)) + return ret; + + NSAttributedString *string = [[NSAttributedString alloc] initWithData:data.toByteArray().toNSData() + options:[NSDictionary dictionaryWithObject:NSHTMLTextDocumentType forKey:NSDocumentTypeDocumentAttribute] + documentAttributes:nil + error:nil]; + + NSError *error; + NSRange range = NSMakeRange(0, [string length]); + NSDictionary *dict = [NSDictionary dictionaryWithObject:NSRTFTextDocumentType forKey:NSDocumentTypeDocumentAttribute]; + NSData *rtfData = [string dataFromRange:range documentAttributes:dict error:&error]; + ret << QByteArray::fromNSData(rtfData); + return ret; +} + class QMacPasteboardMimeFileUri : public QMacInternalPasteboardMime { public: QMacPasteboardMimeFileUri() : QMacInternalPasteboardMime(MIME_ALL) { } @@ -763,6 +850,7 @@ void QMacInternalPasteboardMime::initializeMimeTypes() new QMacPasteboardMimePlainTextFallback; new QMacPasteboardMimeUnicodeText; new QMacPasteboardMimePlainText; + new QMacPasteboardMimeRtfText; new QMacPasteboardMimeHTMLText; new QMacPasteboardMimeFileUri; new QMacPasteboardMimeUrl; -- cgit v1.2.3 From 6388163df8f660ae38cb60e58afe9c9833b2512e Mon Sep 17 00:00:00 2001 From: Richard Moe Gustavsen Date: Mon, 28 Apr 2014 14:41:04 +0200 Subject: qmacmime: rename and move QMacPasteboardMimePlainText to the cocoa plugin MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit com.apple.traditional-mac-plain-text is not in use on iOS according to Apples UTType reference. So we enable it only for OS X by moving it into the cocoa port. The order in which we instanciate convertors matters when the application is reading data from the pasteboard. But since QMacPasteboardMimePlainText should come before the other "text/plain" convertors on OS X, moving it to the cocoa port is safe as those convertors are instanciated after those in qmacmime. Change-Id: I76b9b14e5ce78f34e0f1ecbfee71e48a27a4687b Reviewed-by: Morten Johan Sørvig --- src/platformsupport/clipboard/qmacmime.mm | 62 ------------------------------- 1 file changed, 62 deletions(-) (limited to 'src/platformsupport') diff --git a/src/platformsupport/clipboard/qmacmime.mm b/src/platformsupport/clipboard/qmacmime.mm index 63675d7a32..27a490335b 100644 --- a/src/platformsupport/clipboard/qmacmime.mm +++ b/src/platformsupport/clipboard/qmacmime.mm @@ -290,67 +290,6 @@ QList QMacPasteboardMimeTypeName::convertFromMime(const QString &, Q return ret; } -class QMacPasteboardMimePlainText : public QMacInternalPasteboardMime { -public: - QMacPasteboardMimePlainText() : QMacInternalPasteboardMime(MIME_ALL) { } - QString convertorName(); - - QString flavorFor(const QString &mime); - QString mimeFor(QString flav); - bool canConvert(const QString &mime, QString flav); - QVariant convertToMime(const QString &mime, QList data, QString flav); - QList convertFromMime(const QString &mime, QVariant data, QString flav); -}; - -QString QMacPasteboardMimePlainText::convertorName() -{ - return QLatin1String("PlainText"); -} - -QString QMacPasteboardMimePlainText::flavorFor(const QString &mime) -{ - if (mime == QLatin1String("text/plain")) - return QLatin1String("com.apple.traditional-mac-plain-text"); - return QString(); -} - -QString QMacPasteboardMimePlainText::mimeFor(QString flav) -{ - if (flav == QLatin1String("com.apple.traditional-mac-plain-text")) - return QLatin1String("text/plain"); - return QString(); -} - -bool QMacPasteboardMimePlainText::canConvert(const QString &mime, QString flav) -{ - return flavorFor(mime) == flav; -} - -QVariant QMacPasteboardMimePlainText::convertToMime(const QString &mimetype, QList data, QString flavor) -{ - if (data.count() > 1) - qWarning("QMacPasteboardMimePlainText: Cannot handle multiple member data"); - const QByteArray &firstData = data.first(); - QVariant ret; - if (flavor == QLatin1String("com.apple.traditional-mac-plain-text")) { - return QString::fromCFString(CFStringCreateWithBytes(kCFAllocatorDefault, - reinterpret_cast(firstData.constData()), - firstData.size(), CFStringGetSystemEncoding(), false)); - } else { - qWarning("QMime::convertToMime: unhandled mimetype: %s", qPrintable(mimetype)); - } - return ret; -} - -QList QMacPasteboardMimePlainText::convertFromMime(const QString &, QVariant data, QString flavor) -{ - QList ret; - QString string = data.toString(); - if (flavor == QLatin1String("com.apple.traditional-mac-plain-text")) - ret.append(string.toLatin1()); - return ret; -} - class QMacPasteboardMimePlainTextFallback : public QMacInternalPasteboardMime { public: QMacPasteboardMimePlainTextFallback() : QMacInternalPasteboardMime(MIME_ALL) { } @@ -849,7 +788,6 @@ void QMacInternalPasteboardMime::initializeMimeTypes() //standard types that we wrap new QMacPasteboardMimePlainTextFallback; new QMacPasteboardMimeUnicodeText; - new QMacPasteboardMimePlainText; new QMacPasteboardMimeRtfText; new QMacPasteboardMimeHTMLText; new QMacPasteboardMimeFileUri; -- cgit v1.2.3 From 679cd99f3d43ac624ad2683f6d3b1b97b3b2cb0d Mon Sep 17 00:00:00 2001 From: Frederik Gladhorn Date: Wed, 7 May 2014 16:06:22 +0200 Subject: Accessibility: Update ComboBox text on arrow keys MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Use ValueChanged to notify of changes in the ComboBox. On Linux we need to update name and then send selection-changed for Orca. Task-number: QTBUG-36814 Change-Id: Icdd34adddeac532476a6dd910d1e8bd33bcd590b Reviewed-by: Jan Arve Sæther --- .../linuxaccessibility/atspiadaptor.cpp | 27 ++++++++++++++++------ 1 file changed, 20 insertions(+), 7 deletions(-) (limited to 'src/platformsupport') diff --git a/src/platformsupport/linuxaccessibility/atspiadaptor.cpp b/src/platformsupport/linuxaccessibility/atspiadaptor.cpp index 1ccab0a859..0fa1d96242 100644 --- a/src/platformsupport/linuxaccessibility/atspiadaptor.cpp +++ b/src/platformsupport/linuxaccessibility/atspiadaptor.cpp @@ -1024,15 +1024,28 @@ void AtSpiAdaptor::notify(QAccessibleEvent *event) case QAccessible::ValueChanged: { if (sendObject || sendObject_value_changed || sendObject_property_change_accessible_value) { QAccessibleInterface * iface = event->accessibleInterface(); - if (!iface || !iface->valueInterface()) { - qWarning() << "ValueChanged event from invalid accessible: " << iface; + if (!iface) { + qWarning() << "ValueChanged event from invalid accessible."; return; } - - QString path = pathForInterface(iface); - QVariantList args = packDBusSignalArguments(QLatin1String("accessible-value"), 0, 0, variantForPath(path)); - sendDBusSignal(path, QLatin1String(ATSPI_DBUS_INTERFACE_EVENT_OBJECT), - QLatin1String("PropertyChange"), args); + if (iface->valueInterface()) { + QString path = pathForInterface(iface); + QVariantList args = packDBusSignalArguments(QLatin1String("accessible-value"), 0, 0, variantForPath(path)); + sendDBusSignal(path, QLatin1String(ATSPI_DBUS_INTERFACE_EVENT_OBJECT), + QLatin1String("PropertyChange"), args); + } else if (iface->role() == QAccessible::ComboBox) { + // Combo Box with AT-SPI likes to be special + // It requires a name-change to update caches and then selection-changed + QString path = pathForInterface(iface); + QVariantList args1 = packDBusSignalArguments(QLatin1String("accessible-name"), 0, 0, variantForPath(path)); + sendDBusSignal(path, QLatin1String(ATSPI_DBUS_INTERFACE_EVENT_OBJECT), + QLatin1String("PropertyChange"), args1); + QVariantList args2 = packDBusSignalArguments(QString(), 0, 0, QVariant::fromValue(QDBusVariant(QVariant(0)))); + sendDBusSignal(path, QLatin1String(ATSPI_DBUS_INTERFACE_EVENT_OBJECT), + QLatin1String("SelectionChanged"), args2); + } else { + qWarning() << "ValueChanged event and no ValueInterface or ComboBox: " << iface; + } } break; } -- cgit v1.2.3 From af16f88e970e3f6ceb32becca6b0e9baa61ae0e9 Mon Sep 17 00:00:00 2001 From: Laszlo Agocs Date: Fri, 16 May 2014 17:17:57 +0200 Subject: egl cursor: The sampler is a uniform not an attribute MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Change-Id: Ibae21653040f1d8dff2d2c0b7c1b2812d9e14551 Reviewed-by: Jørgen Lind --- src/platformsupport/eglconvenience/qeglplatformcursor.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'src/platformsupport') diff --git a/src/platformsupport/eglconvenience/qeglplatformcursor.cpp b/src/platformsupport/eglconvenience/qeglplatformcursor.cpp index e99581183e..b6293e60ec 100644 --- a/src/platformsupport/eglconvenience/qeglplatformcursor.cpp +++ b/src/platformsupport/eglconvenience/qeglplatformcursor.cpp @@ -171,7 +171,7 @@ void QEGLPlatformCursor::createShaderPrograms() m_vertexCoordEntry = m_program->attributeLocation("vertexCoordEntry"); m_textureCoordEntry = m_program->attributeLocation("textureCoordEntry"); - m_textureEntry = m_program->attributeLocation("texture"); + m_textureEntry = m_program->uniformLocation("texture"); } void QEGLPlatformCursor::createCursorTexture(uint *texture, const QImage &image) -- cgit v1.2.3