From 09417c56bdc381e0879bcf8a379f6df8957dbecc Mon Sep 17 00:00:00 2001 From: Eike Ziller Date: Mon, 9 Nov 2015 10:39:08 +0100 Subject: [PATCH] OS X: Use autoreleasepool blocks in Objective-C(++) code And get rid of the helper class from utils. All supported platforms support this. Change-Id: Ic4307a42fc55ac4673438ea4325bca14ed33849b Reviewed-by: Erik Verbruggen --- src/libs/utils/autoreleasepool.h | 51 --- src/libs/utils/fileutils_mac.mm | 62 ++-- src/libs/utils/utils-lib.pri | 2 +- .../locator/spotlightlocatorfilter.mm | 86 ++--- src/plugins/help/macwebkithelpviewer.mm | 309 ++++++++++-------- 5 files changed, 240 insertions(+), 270 deletions(-) delete mode 100644 src/libs/utils/autoreleasepool.h diff --git a/src/libs/utils/autoreleasepool.h b/src/libs/utils/autoreleasepool.h deleted file mode 100644 index e60411443e6..00000000000 --- a/src/libs/utils/autoreleasepool.h +++ /dev/null @@ -1,51 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2015 The Qt Company Ltd. -** Contact: http://www.qt.io/licensing -** -** This file is part of Qt Creator. -** -** Commercial License Usage -** Licensees holding valid commercial Qt licenses may use this file in -** accordance with the commercial license agreement provided with the -** Software or, alternatively, in accordance with the terms contained in -** a written agreement between you and The Qt Company. For licensing terms and -** conditions see http://www.qt.io/terms-conditions. For further information -** use the contact form at http://www.qt.io/contact-us. -** -** GNU Lesser General Public License Usage -** Alternatively, this file may be used under the terms of the GNU Lesser -** General Public License version 2.1 or version 3 as published by the Free -** Software Foundation and appearing in the file LICENSE.LGPLv21 and -** LICENSE.LGPLv3 included in the packaging of this file. Please review the -** following information to ensure the GNU Lesser General Public License -** requirements will be met: https://www.gnu.org/licenses/lgpl.html and -** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. -** -** In addition, as a special exception, The Qt Company gives you certain additional -** rights. These rights are described in The Qt Company LGPL Exception -** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. -** -****************************************************************************/ - - -#ifndef AUTORELEASEPOOL_H -#define AUTORELEASEPOOL_H - -#import - -namespace Utils { - -class AutoreleasePool -{ -public: - AutoreleasePool() { pool = [[NSAutoreleasePool alloc] init]; } - ~AutoreleasePool() { [pool release]; } -private: - NSAutoreleasePool *pool; -}; - -} // Utils - -#endif // AUTORELEASEPOOL_H - diff --git a/src/libs/utils/fileutils_mac.mm b/src/libs/utils/fileutils_mac.mm index 27c0f127b87..dc31c80f884 100644 --- a/src/libs/utils/fileutils_mac.mm +++ b/src/libs/utils/fileutils_mac.mm @@ -30,7 +30,6 @@ #include "fileutils_mac.h" -#include "autoreleasepool.h" #include "qtcassert.h" #include @@ -44,45 +43,46 @@ namespace Internal { QUrl filePathUrl(const QUrl &url) { - Utils::AutoreleasePool pool; Q_UNUSED(pool) QUrl ret = url; - NSURL *nsurl = url.toNSURL(); - if ([nsurl isFileReferenceURL]) - ret = QUrl::fromNSURL([nsurl filePathURL]); + @autoreleasepool { + NSURL *nsurl = url.toNSURL(); + if ([nsurl isFileReferenceURL]) + ret = QUrl::fromNSURL([nsurl filePathURL]); + } return ret; } QString normalizePathName(const QString &filePath) { - AutoreleasePool pool; Q_UNUSED(pool) - - // NSURL getResourceValue returns values based on the cleaned path so we need to work on that. - // It also returns the disk name for "/" and "/.." and errors on "" and relative paths, - // so avoid that - - // we cannot know the normalized name for relative paths - if (QFileInfo(filePath).isRelative()) - return filePath; - QString result; - QString path = QDir::cleanPath(filePath); - // avoid empty paths and paths like "/../foo" or "/.." - if (path.isEmpty() || path.contains(QLatin1String("/../")) || path.endsWith(QLatin1String("/.."))) - return filePath; + @autoreleasepool { + // NSURL getResourceValue returns values based on the cleaned path so we need to work on that. + // It also returns the disk name for "/" and "/.." and errors on "" and relative paths, + // so avoid that - while (path != QLatin1String("/") /*be defensive->*/&& path != QLatin1String(".") && !path.isEmpty()) { - QFileInfo info(path); - NSURL *nsurl = [NSURL fileURLWithPath:path.toNSString()]; - NSString *out; - QString component; - if ([nsurl getResourceValue:(NSString **)&out forKey:NSURLNameKey error:nil]) - component = QString::fromNSString(out); - else // e.g. if the full path does not exist - component = info.fileName(); - result.prepend(QLatin1Char('/') + component); - path = info.path(); + // we cannot know the normalized name for relative paths + if (QFileInfo(filePath).isRelative()) + return filePath; + + QString path = QDir::cleanPath(filePath); + // avoid empty paths and paths like "/../foo" or "/.." + if (path.isEmpty() || path.contains(QLatin1String("/../")) || path.endsWith(QLatin1String("/.."))) + return filePath; + + while (path != QLatin1String("/") /*be defensive->*/&& path != QLatin1String(".") && !path.isEmpty()) { + QFileInfo info(path); + NSURL *nsurl = [NSURL fileURLWithPath:path.toNSString()]; + NSString *out; + QString component; + if ([nsurl getResourceValue:(NSString **)&out forKey:NSURLNameKey error:nil]) + component = QString::fromNSString(out); + else // e.g. if the full path does not exist + component = info.fileName(); + result.prepend(QLatin1Char('/') + component); + path = info.path(); + } + QTC_ASSERT(path == QLatin1String("/"), return filePath); } - QTC_ASSERT(path == QLatin1String("/"), return filePath); return result; } diff --git a/src/libs/utils/utils-lib.pri b/src/libs/utils/utils-lib.pri index ded0ca3caee..9c5be39c030 100644 --- a/src/libs/utils/utils-lib.pri +++ b/src/libs/utils/utils-lib.pri @@ -208,7 +208,7 @@ FORMS += $$PWD/filewizardpage.ui \ RESOURCES += $$PWD/utils.qrc osx { - HEADERS += $$PWD/autoreleasepool.h \ + HEADERS += \ $$PWD/fileutils_mac.h OBJECTIVE_SOURCES += \ $$PWD/fileutils_mac.mm diff --git a/src/plugins/coreplugin/locator/spotlightlocatorfilter.mm b/src/plugins/coreplugin/locator/spotlightlocatorfilter.mm index cb29e2c3c70..3744ce79ca9 100644 --- a/src/plugins/coreplugin/locator/spotlightlocatorfilter.mm +++ b/src/plugins/coreplugin/locator/spotlightlocatorfilter.mm @@ -30,7 +30,6 @@ #include "spotlightlocatorfilter.h" -#include #include #include @@ -38,7 +37,6 @@ #include #include -#include #include #include #include @@ -85,33 +83,34 @@ SpotlightIterator::SpotlightIterator(const QString &expression) m_queueIndex(-1), m_finished(false) { - Utils::AutoreleasePool pool; Q_UNUSED(pool) - NSPredicate *predicate = [NSPredicate predicateWithFormat:expression.toNSString()]; - m_query = [[NSMetadataQuery alloc] init]; - m_query.predicate = predicate; - m_query.searchScopes = [NSArray arrayWithObject:NSMetadataQueryLocalComputerScope]; - m_queue = [[NSMutableArray alloc] init]; - m_progressObserver = [[[NSNotificationCenter defaultCenter] - addObserverForName:NSMetadataQueryGatheringProgressNotification - object:m_query - queue:nil - usingBlock:^(NSNotification *note) { - [m_query disableUpdates]; - QMutexLocker lock(&m_mutex); Q_UNUSED(lock) - [m_queue addObjectsFromArray:[note.userInfo objectForKey:(NSString *)kMDQueryUpdateAddedItems]]; - [m_query enableUpdates]; - m_waitForItems.wakeAll(); - }] retain]; - m_finishObserver = [[[NSNotificationCenter defaultCenter] - addObserverForName:NSMetadataQueryDidFinishGatheringNotification - object:m_query - queue:nil - usingBlock:^(NSNotification *) { - QMutexLocker lock(&m_mutex); Q_UNUSED(lock) - m_finished = true; - m_waitForItems.wakeAll(); - }] retain]; - [m_query startQuery]; + @autoreleasepool { + NSPredicate *predicate = [NSPredicate predicateWithFormat:expression.toNSString()]; + m_query = [[NSMetadataQuery alloc] init]; + m_query.predicate = predicate; + m_query.searchScopes = [NSArray arrayWithObject:NSMetadataQueryLocalComputerScope]; + m_queue = [[NSMutableArray alloc] init]; + m_progressObserver = [[[NSNotificationCenter defaultCenter] + addObserverForName:NSMetadataQueryGatheringProgressNotification + object:m_query + queue:nil + usingBlock:^(NSNotification *note) { + [m_query disableUpdates]; + QMutexLocker lock(&m_mutex); Q_UNUSED(lock) + [m_queue addObjectsFromArray:[note.userInfo objectForKey:(NSString *)kMDQueryUpdateAddedItems]]; + [m_query enableUpdates]; + m_waitForItems.wakeAll(); + }] retain]; + m_finishObserver = [[[NSNotificationCenter defaultCenter] + addObserverForName:NSMetadataQueryDidFinishGatheringNotification + object:m_query + queue:nil + usingBlock:^(NSNotification *) { + QMutexLocker lock(&m_mutex); Q_UNUSED(lock) + m_finished = true; + m_waitForItems.wakeAll(); + }] retain]; + [m_query startQuery]; + } } SpotlightIterator::~SpotlightIterator() @@ -163,22 +162,23 @@ void SpotlightIterator::ensureNext() return; if (m_index >= 10000) // limit the amount of data that is passed on return; - Utils::AutoreleasePool pool; Q_UNUSED(pool) - // check if there are items in the queue, otherwise wait for some - m_mutex.lock(); - bool itemAvailable = (m_queueIndex + 1 < m_queue.count); - if (!itemAvailable && !m_finished) { - m_waitForItems.wait(&m_mutex); - itemAvailable = (m_queueIndex + 1 < m_queue.count); - } - if (itemAvailable) { - ++m_queueIndex; - NSMetadataItem *item = [m_queue objectAtIndex:m_queueIndex]; - m_filePaths.append(QString::fromNSString([item valueForAttribute:NSMetadataItemPathKey])); - m_fileNames.append(QString::fromNSString([item valueForAttribute:NSMetadataItemFSNameKey])); + @autoreleasepool { + // check if there are items in the queue, otherwise wait for some + m_mutex.lock(); + bool itemAvailable = (m_queueIndex + 1 < m_queue.count); + if (!itemAvailable && !m_finished) { + m_waitForItems.wait(&m_mutex); + itemAvailable = (m_queueIndex + 1 < m_queue.count); + } + if (itemAvailable) { + ++m_queueIndex; + NSMetadataItem *item = [m_queue objectAtIndex:m_queueIndex]; + m_filePaths.append(QString::fromNSString([item valueForAttribute:NSMetadataItemPathKey])); + m_fileNames.append(QString::fromNSString([item valueForAttribute:NSMetadataItemFSNameKey])); + } + m_mutex.unlock(); } - m_mutex.unlock(); } // #pragma mark -- SpotlightLocatorFilter diff --git a/src/plugins/help/macwebkithelpviewer.mm b/src/plugins/help/macwebkithelpviewer.mm index b5476d32f73..05cf062e9c6 100644 --- a/src/plugins/help/macwebkithelpviewer.mm +++ b/src/plugins/help/macwebkithelpviewer.mm @@ -34,7 +34,6 @@ #include "openpagesmanager.h" #include -#include #include #include @@ -437,18 +436,19 @@ MacWebKitHelpWidget::MacWebKitHelpWidget(MacWebKitHelpViewer *parent) { d->m_toolTipTimer.setSingleShot(true); connect(&d->m_toolTipTimer, &QTimer::timeout, this, &MacWebKitHelpWidget::showToolTip); - AutoreleasePool pool; Q_UNUSED(pool) - d->m_webView = [[MyWebView alloc] init]; - // Turn layered rendering on. - // Otherwise the WebView will render empty after any QQuickWidget was shown. - d->m_webView.wantsLayer = YES; - d->m_frameLoadDelegate = [[FrameLoadDelegate alloc] initWithMainFrame:d->m_webView.mainFrame - viewer:parent]; - [d->m_webView setFrameLoadDelegate:d->m_frameLoadDelegate]; - d->m_uiDelegate = [[UIDelegate alloc] initWithWidget:this]; - [d->m_webView setUIDelegate:d->m_uiDelegate]; + @autoreleasepool { + d->m_webView = [[MyWebView alloc] init]; + // Turn layered rendering on. + // Otherwise the WebView will render empty after any QQuickWidget was shown. + d->m_webView.wantsLayer = YES; + d->m_frameLoadDelegate = [[FrameLoadDelegate alloc] initWithMainFrame:d->m_webView.mainFrame + viewer:parent]; + [d->m_webView setFrameLoadDelegate:d->m_frameLoadDelegate]; + d->m_uiDelegate = [[UIDelegate alloc] initWithWidget:this]; + [d->m_webView setUIDelegate:d->m_uiDelegate]; - setCocoaView(d->m_webView); + setCocoaView(d->m_webView); + } } MacWebKitHelpWidget::~MacWebKitHelpWidget() @@ -507,11 +507,12 @@ MacWebKitHelpViewer::MacWebKitHelpViewer(QWidget *parent) new MacResponderHack(qApp); } - AutoreleasePool pool; Q_UNUSED(pool) - QVBoxLayout *layout = new QVBoxLayout; - setLayout(layout); - layout->setContentsMargins(0, 0, 0, 0); - layout->addWidget(m_widget, 10); + @autoreleasepool { + QVBoxLayout *layout = new QVBoxLayout; + setLayout(layout); + layout->setContentsMargins(0, 0, 0, 0); + layout->addWidget(m_widget, 10); + } } MacWebKitHelpViewer::~MacWebKitHelpViewer() @@ -521,43 +522,49 @@ MacWebKitHelpViewer::~MacWebKitHelpViewer() QFont MacWebKitHelpViewer::viewerFont() const { - AutoreleasePool pool; Q_UNUSED(pool) - WebPreferences *preferences = m_widget->webView().preferences; - QString family = QString::fromNSString([preferences standardFontFamily]); - int size = [preferences defaultFontSize]; - return QFont(family, size); + @autoreleasepool { + WebPreferences *preferences = m_widget->webView().preferences; + QString family = QString::fromNSString([preferences standardFontFamily]); + int size = [preferences defaultFontSize]; + return QFont(family, size); + } } void MacWebKitHelpViewer::setViewerFont(const QFont &font) { - AutoreleasePool pool; Q_UNUSED(pool) - WebPreferences *preferences = m_widget->webView().preferences; - [preferences setStandardFontFamily:font.family().toNSString()]; - [preferences setDefaultFontSize:font.pointSize()]; + @autoreleasepool { + WebPreferences *preferences = m_widget->webView().preferences; + [preferences setStandardFontFamily:font.family().toNSString()]; + [preferences setDefaultFontSize:font.pointSize()]; + } } void MacWebKitHelpViewer::scaleUp() { - AutoreleasePool pool; Q_UNUSED(pool) - m_widget->webView().textSizeMultiplier += 0.1; + @autoreleasepool { + m_widget->webView().textSizeMultiplier += 0.1; + } } void MacWebKitHelpViewer::scaleDown() { - AutoreleasePool pool; Q_UNUSED(pool) - m_widget->webView().textSizeMultiplier = qMax(0.1, m_widget->webView().textSizeMultiplier - 0.1); + @autoreleasepool { + m_widget->webView().textSizeMultiplier = qMax(0.1, m_widget->webView().textSizeMultiplier - 0.1); + } } void MacWebKitHelpViewer::resetScale() { - AutoreleasePool pool; Q_UNUSED(pool) - m_widget->webView().textSizeMultiplier = 1.0; + @autoreleasepool { + m_widget->webView().textSizeMultiplier = 1.0; + } } qreal MacWebKitHelpViewer::scale() const { - AutoreleasePool pool; Q_UNUSED(pool) - return m_widget->webView().textSizeMultiplier; + @autoreleasepool { + return m_widget->webView().textSizeMultiplier; + } } void MacWebKitHelpViewer::setScale(qreal scale) @@ -567,24 +574,27 @@ void MacWebKitHelpViewer::setScale(qreal scale) QString MacWebKitHelpViewer::title() const { - AutoreleasePool pool; Q_UNUSED(pool) - return QString::fromNSString(m_widget->webView().mainFrameTitle); + @autoreleasepool { + return QString::fromNSString(m_widget->webView().mainFrameTitle); + } } QUrl MacWebKitHelpViewer::source() const { - AutoreleasePool pool; Q_UNUSED(pool) - WebDataSource *dataSource = m_widget->webView().mainFrame.dataSource; - if (!dataSource) - dataSource = m_widget->webView().mainFrame.provisionalDataSource; - return QUrl::fromNSURL(dataSource.request.URL); + @autoreleasepool { + WebDataSource *dataSource = m_widget->webView().mainFrame.dataSource; + if (!dataSource) + dataSource = m_widget->webView().mainFrame.provisionalDataSource; + return QUrl::fromNSURL(dataSource.request.URL); + } } void MacWebKitHelpViewer::setSource(const QUrl &url) { - AutoreleasePool pool; Q_UNUSED(pool) - ensureProtocolHandler(); - [m_widget->webView().mainFrame loadRequest:[NSURLRequest requestWithURL:url.toNSURL()]]; + @autoreleasepool { + ensureProtocolHandler(); + [m_widget->webView().mainFrame loadRequest:[NSURLRequest requestWithURL:url.toNSURL()]]; + } } void MacWebKitHelpViewer::scrollToAnchor(const QString &anchor) @@ -596,57 +606,63 @@ void MacWebKitHelpViewer::scrollToAnchor(const QString &anchor) void MacWebKitHelpViewer::setHtml(const QString &html) { - AutoreleasePool pool; Q_UNUSED(pool) - [m_widget->webView().mainFrame - loadHTMLString:html.toNSString() - baseURL:[NSURL fileURLWithPath:Core::ICore::resourcePath().toNSString()]]; + @autoreleasepool { + [m_widget->webView().mainFrame + loadHTMLString:html.toNSString() + baseURL:[NSURL fileURLWithPath:Core::ICore::resourcePath().toNSString()]]; + } } QString MacWebKitHelpViewer::selectedText() const { - AutoreleasePool pool; Q_UNUSED(pool) - return QString::fromNSString(m_widget->webView().selectedDOMRange.text); + @autoreleasepool { + return QString::fromNSString(m_widget->webView().selectedDOMRange.text); + } } bool MacWebKitHelpViewer::isForwardAvailable() const { - AutoreleasePool pool; Q_UNUSED(pool) - return m_widget->webView().canGoForward; + @autoreleasepool { + return m_widget->webView().canGoForward; + } } bool MacWebKitHelpViewer::isBackwardAvailable() const { - AutoreleasePool pool; Q_UNUSED(pool) - return m_widget->webView().canGoBack; + @autoreleasepool { + return m_widget->webView().canGoBack; + } } void MacWebKitHelpViewer::addBackHistoryItems(QMenu *backMenu) { - AutoreleasePool pool; Q_UNUSED(pool) - WebBackForwardList *list = m_widget->webView().backForwardList; - int backListCount = list.backListCount; - for (int i = 0; i < backListCount; ++i) { - int historyIndex = -(i+1); - QAction *action = new QAction(backMenu); - action->setText(QString::fromNSString([list itemAtIndex:historyIndex].title)); - action->setData(historyIndex); - connect(action, SIGNAL(triggered()), this, SLOT(goToHistoryItem())); - backMenu->addAction(action); + @autoreleasepool { + WebBackForwardList *list = m_widget->webView().backForwardList; + int backListCount = list.backListCount; + for (int i = 0; i < backListCount; ++i) { + int historyIndex = -(i+1); + QAction *action = new QAction(backMenu); + action->setText(QString::fromNSString([list itemAtIndex:historyIndex].title)); + action->setData(historyIndex); + connect(action, SIGNAL(triggered()), this, SLOT(goToHistoryItem())); + backMenu->addAction(action); + } } } void MacWebKitHelpViewer::addForwardHistoryItems(QMenu *forwardMenu) { - AutoreleasePool pool; Q_UNUSED(pool) - WebBackForwardList *list = m_widget->webView().backForwardList; - int forwardListCount = list.forwardListCount; - for (int i = 0; i < forwardListCount; ++i) { - int historyIndex = i + 1; - QAction *action = new QAction(forwardMenu); - action->setText(QString::fromNSString([list itemAtIndex:historyIndex].title)); - action->setData(historyIndex); - connect(action, SIGNAL(triggered()), this, SLOT(goToHistoryItem())); - forwardMenu->addAction(action); + @autoreleasepool { + WebBackForwardList *list = m_widget->webView().backForwardList; + int forwardListCount = list.forwardListCount; + for (int i = 0; i < forwardListCount; ++i) { + int historyIndex = i + 1; + QAction *action = new QAction(forwardMenu); + action->setText(QString::fromNSString([list itemAtIndex:historyIndex].title)); + action->setData(historyIndex); + connect(action, SIGNAL(triggered()), this, SLOT(goToHistoryItem())); + forwardMenu->addAction(action); + } } } @@ -728,55 +744,56 @@ bool MacWebKitHelpViewer::findText(const QString &text, Core::FindFlags flags, b { Q_UNUSED(incremental); Q_UNUSED(fromSearch); - AutoreleasePool pool; Q_UNUSED(pool) - if (wrapped) - *wrapped = false; - bool forward = !(flags & Core::FindBackward); - bool caseSensitive = (flags & Core::FindCaseSensitively); - WebView *webView = m_widget->webView(); + @autoreleasepool { + if (wrapped) + *wrapped = false; + bool forward = !(flags & Core::FindBackward); + bool caseSensitive = (flags & Core::FindCaseSensitively); + WebView *webView = m_widget->webView(); - // WebView searchFor:.... grabs first responder, and when losing first responder afterwards, - // it removes the selection and forgets the search state, making it pretty useless for us + // WebView searchFor:.... grabs first responder, and when losing first responder afterwards, + // it removes the selection and forgets the search state, making it pretty useless for us - // define the start node and offset for the search - DOMNode *start = nil; // default is search whole body - int startOffset = -1; - DOMRange *selection = webView.selectedDOMRange; - if (selection) { - if (QString::fromNSString(selection.text).compare( - text, caseSensitive ? Qt::CaseSensitive : Qt::CaseInsensitive) != 0) { - // for incremental search we want to search from the beginning of the selection - start = selection.startContainer; - startOffset = selection.startOffset; - } else { - // search for next occurrence - if (forward) { - start = selection.endContainer; - startOffset = selection.endOffset; - } else { + // define the start node and offset for the search + DOMNode *start = nil; // default is search whole body + int startOffset = -1; + DOMRange *selection = webView.selectedDOMRange; + if (selection) { + if (QString::fromNSString(selection.text).compare( + text, caseSensitive ? Qt::CaseSensitive : Qt::CaseInsensitive) != 0) { + // for incremental search we want to search from the beginning of the selection start = selection.startContainer; startOffset = selection.startOffset; + } else { + // search for next occurrence + if (forward) { + start = selection.endContainer; + startOffset = selection.endOffset; + } else { + start = selection.startContainer; + startOffset = selection.startOffset; + } } } - } - DOMRange *newSelection = findText(text.toNSString(), forward, caseSensitive, - start, startOffset); - if (!newSelection && start != nil) { // wrap - start = nil; - startOffset = -1; - newSelection = findText(text.toNSString(), forward, caseSensitive, - start, startOffset); - if (newSelection && wrapped) - *wrapped = true; - } - if (newSelection) { - // found, select and scroll there - [webView setSelectedDOMRange:newSelection affinity:NSSelectionAffinityDownstream]; - if (forward) - [newSelection.endContainer.parentElement scrollIntoViewIfNeeded:YES]; - else - [newSelection.startContainer.parentElement scrollIntoViewIfNeeded:YES]; - return true; + DOMRange *newSelection = findText(text.toNSString(), forward, caseSensitive, + start, startOffset); + if (!newSelection && start != nil) { // wrap + start = nil; + startOffset = -1; + newSelection = findText(text.toNSString(), forward, caseSensitive, + start, startOffset); + if (newSelection && wrapped) + *wrapped = true; + } + if (newSelection) { + // found, select and scroll there + [webView setSelectedDOMRange:newSelection affinity:NSSelectionAffinityDownstream]; + if (forward) + [newSelection.endContainer.parentElement scrollIntoViewIfNeeded:YES]; + else + [newSelection.startContainer.parentElement scrollIntoViewIfNeeded:YES]; + return true; + } } return false; } @@ -793,18 +810,20 @@ void MacWebKitHelpViewer::stop() void MacWebKitHelpViewer::forward() { - AutoreleasePool pool; Q_UNUSED(pool) - [m_widget->webView() goForward]; - emit forwardAvailable(isForwardAvailable()); - emit backwardAvailable(isBackwardAvailable()); + @autoreleasepool { + [m_widget->webView() goForward]; + emit forwardAvailable(isForwardAvailable()); + emit backwardAvailable(isBackwardAvailable()); + } } void MacWebKitHelpViewer::backward() { - AutoreleasePool pool; Q_UNUSED(pool) - [m_widget->webView() goBack]; - emit forwardAvailable(isForwardAvailable()); - emit backwardAvailable(isBackwardAvailable()); + @autoreleasepool { + [m_widget->webView() goBack]; + emit forwardAvailable(isForwardAvailable()); + emit backwardAvailable(isBackwardAvailable()); + } } void MacWebKitHelpViewer::print(QPrinter *printer) @@ -826,18 +845,19 @@ void MacWebKitHelpViewer::slotLoadFinished() void MacWebKitHelpViewer::goToHistoryItem() { - AutoreleasePool pool; Q_UNUSED(pool) - QAction *action = qobject_cast(sender()); - QTC_ASSERT(action, return); - bool ok = false; - int index = action->data().toInt(&ok); - QTC_ASSERT(ok, return); - WebBackForwardList *list = m_widget->webView().backForwardList; - WebHistoryItem *item = [list itemAtIndex:index]; - QTC_ASSERT(item, return); - [m_widget->webView() goToBackForwardItem:item]; - emit forwardAvailable(isForwardAvailable()); - emit backwardAvailable(isBackwardAvailable()); + @autoreleasepool { + QAction *action = qobject_cast(sender()); + QTC_ASSERT(action, return); + bool ok = false; + int index = action->data().toInt(&ok); + QTC_ASSERT(ok, return); + WebBackForwardList *list = m_widget->webView().backForwardList; + WebHistoryItem *item = [list itemAtIndex:index]; + QTC_ASSERT(item, return); + [m_widget->webView() goToBackForwardItem:item]; + emit forwardAvailable(isForwardAvailable()); + emit backwardAvailable(isBackwardAvailable()); + } } // #pragma mark -- MacResponderHack @@ -858,13 +878,14 @@ void MacResponderHack::responderHack(QWidget *old, QWidget *now) Q_UNUSED(old) if (!now) return; - AutoreleasePool pool; Q_UNUSED(pool) - NSView *view; - if (QMacCocoaViewContainer *viewContainer = qobject_cast(now)) - view = viewContainer->cocoaView(); - else - view = (NSView *)now->effectiveWinId(); - [view.window makeFirstResponder:view]; + @autoreleasepool { + NSView *view; + if (QMacCocoaViewContainer *viewContainer = qobject_cast(now)) + view = viewContainer->cocoaView(); + else + view = (NSView *)now->effectiveWinId(); + [view.window makeFirstResponder:view]; + } } } // Internal