Diff
Modified: trunk/Source/WebKit2/ChangeLog (111011 => 111012)
--- trunk/Source/WebKit2/ChangeLog 2012-03-16 16:04:44 UTC (rev 111011)
+++ trunk/Source/WebKit2/ChangeLog 2012-03-16 16:16:25 UTC (rev 111012)
@@ -1,5 +1,42 @@
2012-03-16 Dinu Jacob <[email protected]>
+ [Qt][Wk2] Assertion Failure and crash on file upload
+ https://bugs.webkit.org/show_bug.cgi?id=80854
+
+ Reviewed by Simon Hausmann.
+
+ Crash resulted from attempting to create QFileDialog, a QtWidget based dialog from a
+ QGuiApplication. Replace QFileDialog with a QML implementable component.
+ Added a new property 'filePicker' to WebView experimental to set the QML component for
+ file upload triggered by an input file element.
+
+ Co-authored with Kasthuri Nallappasoundararajan <[email protected]>
+
+ * UIProcess/API/qt/qquickwebview.cpp:
+ (QQuickWebViewPrivate::QQuickWebViewPrivate):
+ (QQuickWebViewPrivate::chooseFiles):
+ (QQuickWebViewExperimental::filePicker):
+ (QQuickWebViewExperimental::setFilePicker):
+ * UIProcess/API/qt/qquickwebview_p.h:
+ * UIProcess/API/qt/qquickwebview_p_p.h:
+ (QQuickWebViewPrivate):
+ * UIProcess/API/qt/tests/qmltests/DesktopBehavior.pro:
+ * UIProcess/API/qt/tests/qmltests/DesktopBehavior/tst_singleFileUpload.qml: Added.
+ * UIProcess/API/qt/tests/qmltests/common/singlefileupload.html: Added.
+ * UIProcess/qt/QtDialogRunner.cpp:
+ (FilePickerContextObject):
+ (FilePickerContextObject::FilePickerContextObject):
+ (FilePickerContextObject::fileList):
+ (FilePickerContextObject::reject):
+ (FilePickerContextObject::accept):
+ (QtDialogRunner::initForFilePicker):
+ * UIProcess/qt/QtDialogRunner.h:
+ (QtDialogRunner):
+ (QtDialogRunner::filePaths):
+ (QtDialogRunner::onFileSelected):
+
+2012-03-16 Dinu Jacob <[email protected]>
+
[Qt][WK2] Build failure when using --no-touch-events
https://bugs.webkit.org/show_bug.cgi?id=81241
Modified: trunk/Source/WebKit2/UIProcess/API/qt/qquickwebview.cpp (111011 => 111012)
--- trunk/Source/WebKit2/UIProcess/API/qt/qquickwebview.cpp 2012-03-16 16:04:44 UTC (rev 111011)
+++ trunk/Source/WebKit2/UIProcess/API/qt/qquickwebview.cpp 2012-03-16 16:16:25 UTC (rev 111012)
@@ -47,7 +47,6 @@
#include <private/qquickflickable_p.h>
#include <_javascript_Core/InitializeThreading.h>
#include <QDeclarativeEngine>
-#include <QFileDialog>
#include <QtQuick/QQuickCanvas>
#include <WebCore/IntPoint.h>
#include <WebCore/IntRect.h>
@@ -76,6 +75,7 @@
, certificateVerificationDialog(0)
, itemSelector(0)
, proxyAuthenticationDialog(0)
+ , filePicker(0)
, userDidOverrideContentWidth(false)
, userDidOverrideContentHeight(false)
, m_navigatorQtObjectEnabled(false)
@@ -375,52 +375,30 @@
void QQuickWebViewPrivate::chooseFiles(WKOpenPanelResultListenerRef listenerRef, const QStringList& selectedFileNames, QtWebPageUIClient::FileChooserType type)
{
-#ifndef QT_NO_FILEDIALOG
Q_Q(QQuickWebView);
- openPanelResultListener = listenerRef;
- // Qt does not support multiple files suggestion, so we get just the first suggestion.
- QString selectedFileName;
- if (!selectedFileNames.isEmpty())
- selectedFileName = selectedFileNames.at(0);
+ if (!filePicker || type == QtWebPageUIClient::MultipleFilesSelection)
+ return;
- Q_ASSERT(!fileDialog);
-
- QWindow* window = q->canvas();
- if (!window)
+ QtDialogRunner dialogRunner;
+ if (!dialogRunner.initForFilePicker(filePicker, q, selectedFileNames))
return;
- fileDialog = new QFileDialog(0, QString(), selectedFileName);
- fileDialog->window()->winId(); // Ensure that the dialog has a window
- Q_ASSERT(fileDialog->window()->windowHandle());
- fileDialog->window()->windowHandle()->setTransientParent(window);
+ execDialogRunner(dialogRunner);
- fileDialog->open(q, SLOT(_q_onOpenPanelFilesSelected()));
+ if (dialogRunner.wasAccepted()) {
+ QStringList selectedPaths = dialogRunner.filePaths();
- q->connect(fileDialog, SIGNAL(finished(int)), SLOT(_q_onOpenPanelFinished(int)));
-#endif
-}
+ Vector<RefPtr<APIObject> > wkFiles(selectedPaths.size());
+ for (unsigned i = 0; i < selectedPaths.size(); ++i)
+ wkFiles[i] = WebURL::create(QUrl::fromLocalFile(selectedPaths.at(i)).toString());
-void QQuickWebViewPrivate::_q_onOpenPanelFilesSelected()
-{
- const QStringList fileList = fileDialog->selectedFiles();
- Vector<RefPtr<APIObject> > wkFiles(fileList.size());
+ WKOpenPanelResultListenerChooseFiles(listenerRef, toAPI(ImmutableArray::adopt(wkFiles).leakRef()));
+ } else
+ WKOpenPanelResultListenerCancel(listenerRef);
- for (unsigned i = 0; i < fileList.size(); ++i)
- wkFiles[i] = WebURL::create(QUrl::fromLocalFile(fileList.at(i)).toString());
-
- WKOpenPanelResultListenerChooseFiles(openPanelResultListener, toAPI(ImmutableArray::adopt(wkFiles).leakRef()));
}
-void QQuickWebViewPrivate::_q_onOpenPanelFinished(int result)
-{
- if (result == QDialog::Rejected)
- WKOpenPanelResultListenerCancel(openPanelResultListener);
-
- fileDialog->deleteLater();
- fileDialog = 0;
-}
-
void QQuickWebViewPrivate::setViewInAttachedProperties(QObject* object)
{
Q_Q(QQuickWebView);
@@ -968,6 +946,21 @@
emit itemSelectorChanged();
}
+QDeclarativeComponent* QQuickWebViewExperimental::filePicker() const
+{
+ Q_D(const QQuickWebView);
+ return d->filePicker;
+}
+
+void QQuickWebViewExperimental::setFilePicker(QDeclarativeComponent* filePicker)
+{
+ Q_D(QQuickWebView);
+ if (d->filePicker == filePicker)
+ return;
+ d->filePicker = filePicker;
+ emit filePickerChanged();
+}
+
QQuickUrlSchemeDelegate* QQuickWebViewExperimental::schemeDelegates_At(QDeclarativeListProperty<QQuickUrlSchemeDelegate>* property, int index)
{
const QObjectList children = property->object->children();
Modified: trunk/Source/WebKit2/UIProcess/API/qt/qquickwebview_p.h (111011 => 111012)
--- trunk/Source/WebKit2/UIProcess/API/qt/qquickwebview_p.h 2012-03-16 16:04:44 UTC (rev 111011)
+++ trunk/Source/WebKit2/UIProcess/API/qt/qquickwebview_p.h 2012-03-16 16:16:25 UTC (rev 111012)
@@ -191,8 +191,6 @@
Q_PRIVATE_SLOT(d_func(), void _q_commitPositionChange(const QPointF&));
Q_PRIVATE_SLOT(d_func(), void _q_commitScaleChange());
- Q_PRIVATE_SLOT(d_func(), void _q_onOpenPanelFilesSelected());
- Q_PRIVATE_SLOT(d_func(), void _q_onOpenPanelFinished(int result));
Q_PRIVATE_SLOT(d_func(), void _q_onVisibleChanged());
Q_PRIVATE_SLOT(d_func(), void _q_onUrlChanged());
Q_PRIVATE_SLOT(d_func(), void _q_onReceivedResponseFromDownload(QWebDownloadItem*));
@@ -250,6 +248,7 @@
Q_PROPERTY(QDeclarativeComponent* proxyAuthenticationDialog READ proxyAuthenticationDialog WRITE setProxyAuthenticationDialog NOTIFY proxyAuthenticationDialogChanged)
Q_PROPERTY(QDeclarativeComponent* certificateVerificationDialog READ certificateVerificationDialog WRITE setCertificateVerificationDialog NOTIFY certificateVerificationDialogChanged)
Q_PROPERTY(QDeclarativeComponent* itemSelector READ itemSelector WRITE setItemSelector NOTIFY itemSelectorChanged)
+ Q_PROPERTY(QDeclarativeComponent* filePicker READ filePicker WRITE setFilePicker NOTIFY filePickerChanged)
Q_PROPERTY(QWebPreferences* preferences READ preferences CONSTANT FINAL)
Q_PROPERTY(QWebViewportInfo* viewportInfo READ viewportInfo CONSTANT FINAL)
Q_PROPERTY(QDeclarativeListProperty<QQuickUrlSchemeDelegate> urlSchemeDelegates READ schemeDelegates)
@@ -277,6 +276,8 @@
void setItemSelector(QDeclarativeComponent*);
QDeclarativeComponent* proxyAuthenticationDialog() const;
void setProxyAuthenticationDialog(QDeclarativeComponent*);
+ QDeclarativeComponent* filePicker() const;
+ void setFilePicker(QDeclarativeComponent*);
QWebViewportInfo* viewportInfo();
@@ -329,6 +330,7 @@
void authenticationDialogChanged();
void certificateVerificationDialogChanged();
void itemSelectorChanged();
+ void filePickerChanged();
void downloadRequested(QWebDownloadItem* downloadItem);
void permissionRequested(QWebPermissionRequest* permission);
void messageReceived(const QVariantMap& message);
Modified: trunk/Source/WebKit2/UIProcess/API/qt/qquickwebview_p_p.h (111011 => 111012)
--- trunk/Source/WebKit2/UIProcess/API/qt/qquickwebview_p_p.h 2012-03-16 16:04:44 UTC (rev 111011)
+++ trunk/Source/WebKit2/UIProcess/API/qt/qquickwebview_p_p.h 2012-03-16 16:16:25 UTC (rev 111012)
@@ -50,7 +50,6 @@
QT_BEGIN_NAMESPACE
class QDeclarativeComponent;
-class QFileDialog;
QT_END_NAMESPACE
class QQuickWebViewPrivate {
@@ -93,8 +92,6 @@
virtual void _q_commitScaleChange() { }
void _q_commitPositionChange(const QPointF&);
- void _q_onOpenPanelFilesSelected();
- void _q_onOpenPanelFinished(int result);
void _q_onVisibleChanged();
void _q_onUrlChanged();
void _q_onReceivedResponseFromDownload(QWebDownloadItem*);
@@ -158,10 +155,9 @@
QDeclarativeComponent* certificateVerificationDialog;
QDeclarativeComponent* itemSelector;
QDeclarativeComponent* proxyAuthenticationDialog;
+ QDeclarativeComponent* filePicker;
WebCore::ViewportArguments viewportArguments;
- QFileDialog* fileDialog;
- WKOpenPanelResultListenerRef openPanelResultListener;
bool userDidOverrideContentWidth;
bool userDidOverrideContentHeight;
Added: trunk/Source/WebKit2/UIProcess/API/qt/tests/qmltests/DesktopBehavior/tst_singleFileUpload.qml (0 => 111012)
--- trunk/Source/WebKit2/UIProcess/API/qt/tests/qmltests/DesktopBehavior/tst_singleFileUpload.qml (rev 0)
+++ trunk/Source/WebKit2/UIProcess/API/qt/tests/qmltests/DesktopBehavior/tst_singleFileUpload.qml 2012-03-16 16:16:25 UTC (rev 111012)
@@ -0,0 +1,65 @@
+import QtQuick 2.0
+import QtTest 1.0
+import QtWebKit 3.0
+import QtWebKit.experimental 1.0
+import "../common"
+
+// FIXME: Added to Desktop tests because we want to have mouseClick() to open the <input> tag. We can move it back
+// when TestCase starts supporting touch events, see https://bugreports.qt.nokia.com/browse/QTBUG-23083.
+TestWebView {
+ id: webView
+
+ width: 400
+ height: 400
+
+ property bool selectFile
+
+ experimental.filePicker: Item {
+ Timer {
+ running: true
+ interval: 1
+ onTriggered: {
+ if (selectFile)
+ model.accept("acceptedfilename");
+ else
+ model.reject();
+ }
+ }
+ }
+
+ SignalSpy {
+ id: titleSpy
+ target: webView
+ signalName: "titleChanged"
+ }
+
+ TestCase {
+ id: test
+ name: "WebViewSingleFilePicker"
+ when: windowShown
+
+ function init() {
+ webView.url = ""
+ verify(webView.waitForLoadSucceeded())
+ titleSpy.clear()
+ }
+
+ function openItemSelector() {
+ mouseClick(webView, 15, 15, Qt.LeftButton)
+ }
+
+ function test_accept() {
+ webView.selectFile = true;
+ openItemSelector()
+ titleSpy.wait()
+ compare(webView.title, "acceptedfilename")
+ }
+
+ function test_reject() {
+ var oldTitle = webView.title
+ webView.selectFile = false;
+ openItemSelector()
+ compare(webView.title, oldTitle)
+ }
+ }
+}
Modified: trunk/Source/WebKit2/UIProcess/API/qt/tests/qmltests/DesktopBehavior.pro (111011 => 111012)
--- trunk/Source/WebKit2/UIProcess/API/qt/tests/qmltests/DesktopBehavior.pro 2012-03-16 16:04:44 UTC (rev 111011)
+++ trunk/Source/WebKit2/UIProcess/API/qt/tests/qmltests/DesktopBehavior.pro 2012-03-16 16:16:25 UTC (rev 111012)
@@ -19,4 +19,5 @@
DesktopBehavior/tst_linkHovered.qml \
DesktopBehavior/tst_loadHtml.qml \
DesktopBehavior/tst_messaging.qml \
- DesktopBehavior/tst_navigationRequested.qml
+ DesktopBehavior/tst_navigationRequested.qml \
+ DesktopBehavior/tst_singlefileupload.qml
Added: trunk/Source/WebKit2/UIProcess/API/qt/tests/qmltests/common/singlefileupload.html (0 => 111012)
--- trunk/Source/WebKit2/UIProcess/API/qt/tests/qmltests/common/singlefileupload.html (rev 0)
+++ trunk/Source/WebKit2/UIProcess/API/qt/tests/qmltests/common/singlefileupload.html 2012-03-16 16:16:25 UTC (rev 111012)
@@ -0,0 +1,26 @@
+<html>
+<head>
+<meta name="viewport" initial-scale=1">
+<title>No file selected</title>
+<script>
+function updateTitle()
+{
+ var inp = document.getElementById("upfile");
+ var allfiles = new String("");
+ var name = new String("");
+ for (var i = 0; i < inp.files.length; ++i)
+ {
+ name = inp.files.item(i).name;
+ if (allfiles.length == 0)
+ allfiles = name;
+ else
+ allfiles = allfiles + "," + name;
+ }
+ document.title = allfiles;
+}
+</script>
+
+<body>
+<input type="file" name="file" id="upfile" _onchange_="updateTitle()"/>
+</body>
+</html>
Modified: trunk/Source/WebKit2/UIProcess/qt/QtDialogRunner.cpp (111011 => 111012)
--- trunk/Source/WebKit2/UIProcess/qt/QtDialogRunner.cpp 2012-03-16 16:04:44 UTC (rev 111011)
+++ trunk/Source/WebKit2/UIProcess/qt/QtDialogRunner.cpp 2012-03-16 16:16:25 UTC (rev 111012)
@@ -157,6 +157,31 @@
QString m_hostname;
};
+class FilePickerContextObject : public QObject {
+ Q_OBJECT
+ Q_PROPERTY(QStringList fileList READ fileList CONSTANT)
+
+public:
+ FilePickerContextObject(const QStringList& selectedFiles)
+ : QObject()
+ , m_fileList(selectedFiles)
+ {
+ }
+
+ QStringList fileList() const { return m_fileList; }
+
+public slots:
+ void reject() { emit rejected();}
+ void accept(const QVariant& path) { emit fileSelected(path.toStringList()); }
+
+signals:
+ void rejected();
+ void fileSelected(const QStringList&);
+
+private:
+ QStringList m_fileList;
+};
+
bool QtDialogRunner::initForAlert(QDeclarativeComponent* component, QQuickItem* dialogParent, const QString& message)
{
DialogContextObject* contextObject = new DialogContextObject(message);
@@ -230,6 +255,19 @@
return true;
}
+bool QtDialogRunner::initForFilePicker(QDeclarativeComponent* component, QQuickItem* dialogParent, const QStringList& selectedFiles)
+{
+ FilePickerContextObject* contextObject = new FilePickerContextObject(selectedFiles);
+ if (!createDialog(component, dialogParent, contextObject))
+ return false;
+
+ connect(contextObject, SIGNAL(fileSelected(QStringList)), SLOT(onFileSelected(QStringList)));
+ connect(contextObject, SIGNAL(fileSelected(QStringList)), SLOT(quit()));
+ connect(contextObject, SIGNAL(rejected()), SLOT(quit()));
+
+ return true;
+}
+
bool QtDialogRunner::createDialog(QDeclarativeComponent* component, QQuickItem* dialogParent, QObject* contextObject)
{
QDeclarativeContext* baseContext = component->creationContext();
Modified: trunk/Source/WebKit2/UIProcess/qt/QtDialogRunner.h (111011 => 111012)
--- trunk/Source/WebKit2/UIProcess/qt/QtDialogRunner.h 2012-03-16 16:04:44 UTC (rev 111011)
+++ trunk/Source/WebKit2/UIProcess/qt/QtDialogRunner.h 2012-03-16 16:16:25 UTC (rev 111012)
@@ -22,6 +22,7 @@
#define QtDialogRunner_h
#include <QtCore/QEventLoop>
+#include <QtCore/QStringList>
#include <wtf/OwnPtr.h>
class QDeclarativeComponent;
@@ -41,6 +42,7 @@
bool initForAuthentication(QDeclarativeComponent*, QQuickItem* dialogParent, const QString& hostname, const QString& realm, const QString& prefilledUsername);
bool initForCertificateVerification(QDeclarativeComponent*, QQuickItem*, const QString& hostname);
bool initForProxyAuthentication(QDeclarativeComponent*, QQuickItem*, const QString& hostname, uint16_t port, const QString& prefilledUsername);
+ bool initForFilePicker(QDeclarativeComponent*, QQuickItem*, const QStringList& selectedFiles);
QQuickItem* dialog() const { return m_dialog.get(); }
@@ -50,6 +52,8 @@
QString username() const { return m_username; }
QString password() const { return m_password; }
+ QStringList filePaths() const { return m_filepaths; }
+
public slots:
void onAccepted(const QString& result = QString())
{
@@ -63,6 +67,12 @@
m_password = password;
}
+ void onFileSelected(const QStringList& filePaths)
+ {
+ m_wasAccepted = true;
+ m_filepaths = filePaths;
+ }
+
private:
bool createDialog(QDeclarativeComponent*, QQuickItem* dialogParent, QObject* contextObject);
@@ -73,6 +83,7 @@
QString m_username;
QString m_password;
+ QStringList m_filepaths;
};
#endif // QtDialogRunner_h
Modified: trunk/Tools/ChangeLog (111011 => 111012)
--- trunk/Tools/ChangeLog 2012-03-16 16:04:44 UTC (rev 111011)
+++ trunk/Tools/ChangeLog 2012-03-16 16:16:25 UTC (rev 111012)
@@ -1,3 +1,19 @@
+2012-03-16 Dinu Jacob <[email protected]>
+
+ [Qt][Wk2] Assertion Failure and crash on file upload
+ https://bugs.webkit.org/show_bug.cgi?id=80854
+
+ Reviewed by Simon Hausmann.
+
+ Added filePicker to WebView using experimental API.
+
+ * MiniBrowser/qt/MiniBrowser.qrc:
+ * MiniBrowser/qt/icons/folder.png: Added.
+ * MiniBrowser/qt/icons/titlebar.png: Added.
+ * MiniBrowser/qt/icons/up.png: Added.
+ * MiniBrowser/qt/qml/BrowserWindow.qml:
+ * MiniBrowser/qt/qml/FilePicker.qml: Added.
+
2012-03-16 Mahesh Kulkarni <[email protected]>
Updating email for committer.py script.
Modified: trunk/Tools/MiniBrowser/qt/MiniBrowser.qrc (111011 => 111012)
--- trunk/Tools/MiniBrowser/qt/MiniBrowser.qrc 2012-03-16 16:04:44 UTC (rev 111011)
+++ trunk/Tools/MiniBrowser/qt/MiniBrowser.qrc 2012-03-16 16:16:25 UTC (rev 111012)
@@ -1,13 +1,17 @@
<RCC>
<qresource prefix="/">
+ <file>icons/favicon.png</file>
+ <file>icons/folder.png</file>
<file>icons/info.png</file>
<file>icons/next.png</file>
<file>icons/plus.png</file>
<file>icons/previous.png</file>
<file>icons/refresh.png</file>
<file>icons/stop.png</file>
+ <file>icons/titlebar.png</file>
<file>icons/touch.png</file>
<file>icons/touchpoint.png</file>
+ <file>icons/up.png</file>
<file>qml/AlertDialog.qml</file>
<file>qml/AuthenticationDialog.qml</file>
<file>qml/BrowserWindow.qml</file>
@@ -15,6 +19,7 @@
<file>qml/Dialog.qml</file>
<file>qml/DialogButton.qml</file>
<file>qml/DialogLineInput.qml</file>
+ <file>qml/FilePicker.qml</file>
<file>qml/ItemSelector.qml</file>
<file>qml/MockTouchPoint.qml</file>
<file>qml/PromptDialog.qml</file>
@@ -22,6 +27,5 @@
<file>qml/ScrollIndicator.qml</file>
<file>qml/ViewportInfoItem.qml</file>
<file>useragentlist.txt</file>
- <file>icons/favicon.png</file>
</qresource>
</RCC>
Added: trunk/Tools/MiniBrowser/qt/icons/folder.png (0 => 111012)
--- trunk/Tools/MiniBrowser/qt/icons/folder.png (rev 0)
+++ trunk/Tools/MiniBrowser/qt/icons/folder.png 2012-03-16 16:16:25 UTC (rev 111012)
@@ -0,0 +1,15 @@
+\x89PNG
+
+
+IHDR szz\xF4 sBIT|d\x88 pHYs ~ ~E\xFA\xFC\x9F tEXtSoftware www.inkscape.org\x9B\xEE< \xAEIDATX\x85\xBD\x96ilT\xD7\xC7\xFF\xE7\xBE7\xFB>^\xC03\xDB\xE3\xEF{\xC0)\xB6q3\x80\xA3\x925\x824RM\xA9[\x92,mS)R\x95\xA8\x94\xD2H\x91H\xDDT\x87$-\xA5$M-R\x94D)1[\xEA\x94\xD4\xC2\x85\x80<6\xB6\x99\xC5\xE3\xF1̛\xCFr\xFB\xC166fL<%\xEDOz\xAE\xEE{\xE7\xFD\xEE9\xE7\xBEw\x89s\x8E\xB9\x8Dڕ\xF9\xCF\xDAZ\xBD^\xAD\x81y<\xFE\xA1\xB3g.n\xEF\xBE\xE3\x81{@\x9C= "Sss\xE5\xC7?y\xEA\xE1eK\xB2\xD3&\xB3r\xB9 \xF0\x8DJ\xF9ii\x86\x8F\xCCf\xFDZ\xAF\xD7\xF6nA-\x96\xF4M\xA5ey\xCF(\xDE\xDF\xEF:\xF2\xF9玣\x9C\xF3\x81\xAF \xF0\xFB\x86\xBA\xE2\x82\xC2,қ\xE4P\xAAf\xA6YԐ+\xAB4D\xF8`\xD1"\xF3Ƒ\xEF?\xE6#"劕E\xC7\xDA\xDA\xEC
+\xB9\xB6L9@\xF3kGF|/lܴ\xD2{\xFAԅ\x9F/p\xF1n!Ϩ7f4\xD5\xCB)\xF4{\xA0\xD2H`1B^\xBEZ\xAB\xD5\x8D\xF2xEE\xFEK==W\xF7H+)\xC9ۼeK\xD3\xF3\xF5\xDF(\xD2-/\xCEbZ\x83 \xC5X8lQ\x95d[\x97,\xC9\xE8.)\xCD\xFBM\xEF\x85k\xCF\xCD'\xF6\x8D\x8DO\x88L'\xAB_\xB1>\x9Fk<\x85\xBD\x88s7[X\xDBR\xA6\xCA_f\xDD\xF5\xE0\x95\xA1\xA79\xE7\\xA7S\x919M'\xCB\xC9\xCB3\xB3Ԑ+p\x9E ȕr%\x83Vo\x82\xC1X\xA1\xB2Z\xD3~V^q\xDFҞ_\xFD~R\x81@ \x8F\xC5c \xA3\xD1\xA3\xB1\xF2\xD6d @\xE4\x82^\xEBa6۰\x8A\xC3&$ \x933\xA84\x80&&I\xAA
+\xCC2T\xAFȑ\xF9\xFD5\x8F\xD8lY'\xFB\xFA\x86^\xBD\xA3R0\x8BO \xCCE\xABբ\xA8\xA8\xEC\xD6X\x92$8\x9D\x8C\xFA\x86!I\x84\x83.\x90\xE0\xB1x\xD2\xE7@\x81\xBA\xFA<\xA5\xD7\xE3߯ө\xFFE\xD3ې\x88\x96x\xAC\xA88\xFB\xE7\x8BU\x95\x9B{?\xCAJ\xAB\xD0\xD0Ј\xF2\xF2\xF2y\xCE&\x89\xC09\xE0\x80\xDBsAɃpąh\xE2\xBBsAÃ\x8E\xFC\xE9\xD4Pdڴ\xA9ɞ\x9B\x97\xA64\x995\xA2٬\x85$E\xE0\xBA9\x86+W\\xB8ti \xAB\x9BZ\xD0\xD6\xF68\xD2\xD3\xD3$ \xD1h\x83\x83N\x8C\xB8\x9Cܐ\xC27\x89 \xBC\xB8縗l6\xCBk{~\xFD\xD46Sz\x88M7\xCE\q\x97\xBFp\xE3\xFDP]\xBD
+;w\xFEj\xB5z\xC1"\xD3\xC4b18}8\xD7\xFDp\xE6\xC1\x8E\xA7;\x86cB\xAB\xC1<\xFF\xCB\x80 1\xF1\xE3g\xA1չ\xD1\xFA\xD0\xBC\xF2J;\xE2\xF1\xF9k\x9DQa\xB1,A,\xAA@p\8\xF3\x8Fu~\xDA}yA\x88(\xABL\xC7\xCE\xDD\xEB04\xF2)\x9A\x9B\xEB\xD1\xD9ٙ\x92\x84 \x8B\xC5\xC1\xC1\xC1\7\xFD\xFB\xFE\xFA\xE6'\x9E\x94\x82\x88 <\xB8ʊ\xBBף\xAB\xEB(\xBE\xB9\xA6\x87#u0\xCEy\xEFu\x87\xCB36&\xA5\xB4 P\xAA8Z6\xDA\xF0ē\xF5x\xE2ɭ8r\xE4pJ \x80P8\xBA\xFF\xFD=\xE1\x94
+\xA6Hːa\xE7n;\xFE\xD9\xFD.\xDA\xDAC(\x9A\xF7^"@\x88\xC5\xE0\xC4 z\xF7\xD8\xF9\xB1\xFFV \x88E\xB1\xA1\xB5
+MK\xB1\xAE\xA5\xBD\xBD\xBD\xF3\xDE\xCBH@<>\xD9\xF4 8\xE7\xFE\xC8D\xAC\xFB\xF2C\xF7\xE2\x80D"k6ó\xBF\xF86\x9Ea\xDA\xDB_N.Kl\xAA\xA6J n\x97\xEF\xDBo\xA5\xF3!Ȃ\xF8\xC1\x8F\x9A\xD1\xD7w{\xF7\xEEIf\x80\xF8d f8\xE7]\x97.\xBD\xEE\x89;OI\xA92\xF5\xA3\xF5[\xA5\xEE\xC5\xC1\x83n\x9B\x9B)\xC1\xAC @ \xEA\xB8\xF2\xE5M8\xAF\x85\xE0qM :\xCF_m\xA1D&xxK
+\xCE\xF6:;\xFF6#\xC0\xA6\xE8v\x81\xF1\xF1Ћ\xBF\xDDw\xF4\xB3Ç?\xE4\x83>\xF6\x871r#\x82\x90\x94\xDAo6\xA1\xB0\xDBmıw\xDE\xC0\xA9S] &\xB7\xE2\xA4\xBB\xFD<\xC09\xF7\xA8"\xA2\x8C3g.\xFE\xAE\xB00g\xB3}C\xAD\x90\x97k\x81LΠ7\x8A\xD0\xEAD\xA5&\x90n`\xFB\xE3-صc\xBA\xBA>\x81(ʦ\x88\xCD=L\x8B\xB8 l!"\xEA\xE9\xB9\xFA\x8C͖\xF5\xCBU
+\xA5\xDAX\x8EQ\x8F\x9D^\x84\xDE Bn
+\xA0\xA44\xDD\xDDݷ2@\xC4@Ɏ\xE5\xC9 \xA2\x95\x99\x86\x83\xD5U\xF7\xAFk\xA9!\xADF
+\x8DN\x84\xDE(B\xA1`_ \x80\xF3\xBA}8\x8C\xAD\xDB\xC1ɮ\xB7q\xA8\xE3W\xD2$\x83s~\xC0r"2\x9D<ٳ\xBF\xB88\xF7\xBB\xEB\xED\xB5\xC2\xD2\xEC\xC5P(F\xD4Z\xE1\xAE1\xB2s\xF4=I\x92\xA6\x95B\x92AD?\xCCϷ\xFE\xAA\xA9\xA9L_SS\xB9\\x98\xEC\xBDƒ\x97\xE7\xCCi\x86e0\x9Acx\xE3\xB5\xF7\xDC\xF7$0K\xA4*#\xD3\xD0QW[X\xBAv]5i\xD4*\xE8\xF4"tFd\xB2\xDBE"\xE18\xFE\xD0~E\xA59\xF8\xE3\xEB'\xBE\x81Y"z\xA5R\xF6RY\xF9}\x8F\xDA\xD7Vk&Ԛɬ(U3\xE59q\xFCK8\xDD8w\xBA\xF7\xEB\x98#\xB3\xBD\xA0\xC0\xBAo\xF5\xEAJcU\xD52(\x93
+\xABщp^\xC7\xEF\xDB\xFF\xB7\xCB\xEF^p\xA6
+\xE7\xFC \x80DT\xB6x\xB1\xA9\xA3\xAE\xAE\xB0r͚jR\xAB\xD0h\x950\x99\xB4\xF0z\xC6\xE9\x96\x81\xB9\x91V\xA5\x96\xEF\xAB(\xCF\xDFn\xB7\xBE\xB1 \xFE|\xF8c?8\xE7\xFF\x{1CB23E}g\xB3-r\xCB\xE5\xE2\xC4 Ϧ\xF5\xFF\xBF\xECF\x8A IEND\xAEB`\x82
\ No newline at end of file
Added: trunk/Tools/MiniBrowser/qt/icons/titlebar.png (0 => 111012)
--- trunk/Tools/MiniBrowser/qt/icons/titlebar.png (rev 0)
+++ trunk/Tools/MiniBrowser/qt/icons/titlebar.png 2012-03-16 16:16:25 UTC (rev 111012)
@@ -0,0 +1,4 @@
+\x89PNG
+
+
+IHDR 0 , \xACt\xAC0 sRGB \xAE\xCE\xE9 gAMA \xB1\x8F\xFCa pHYs t t\xDEfx ZIDATXG\xEDұ 0\xC40d\xFFyA-\x85Ӻᔟ}\xF6\xE6\xD9=\xDBA\xFA\x91\x84\x92\x80zJH\xEAm(! \xA8\xB7\xA1\x84$\xA0ކ\x92\x80zJH\xEAm(! \xA8\xB7\xA1\x84$\xA0ކ\x92\x80zJH\xEA|\x98YjC\xE8\x9F\xDA IEND\xAEB`\x82
\ No newline at end of file
Added: trunk/Tools/MiniBrowser/qt/icons/up.png (0 => 111012)
--- trunk/Tools/MiniBrowser/qt/icons/up.png (rev 0)
+++ trunk/Tools/MiniBrowser/qt/icons/up.png 2012-03-16 16:16:25 UTC (rev 111012)
@@ -0,0 +1,8 @@
+\x89PNG
+
+
+IHDR VΎW sRGB \xAE\xCE\xE9 bKGD \xFF \xFF \xFF\xA0\xBD\xA7\x93 pHYs \x9A\x9C tIME\xD9 7\x91\x81 IDAT8˽\x94\xCFkA\xC7?of7٘\xF2\xA3ML\xB5\x8A\xF5d\xB5CU,z\xF0\xE0\xA0Gۋԓ+x\xEF\xCD?\xC0\xFF@<HQē\xA0*UI5i~l\x93\x9A\xEC\xECz\xE8n\xD26\xEA\xC5\x8F\x98\x99\xCF\xFB\xBE\x99\xF7\xFE\xA3Y\xA1\x8F4\xFD\x87\xF5R,\xAEok[./\xE8 +\x80\xF9W%\xA9\xB4\xBDx\xF1\xEA\xC1\xCE\xF5[\x93\xBD\xC3\xC7\xF4S\xA0\xC4\xFEV\x91h-'a\xDD97\xBB\xFFfy6\xED\xEC\xC9Uu:\xD3;\xE0\xB69\xBA\xD6\xE4\x83o\xF8>\xAClHk)dr\xCEéJqn\xFABR\xFBz\xE3\xBBd\xF2\xA8\xEC\x93n\x93\xED\xEF|\xC37\xC0\xDF
+TL\xA6컧ʅ\xB9\xCA\xE5$bW\xF1\x8C\x8BRZC.ټ\x94\x9A\xAB\xA9\xAF\xF0\xB6`\x83\xA0\xBD\xA9\xB4}\xAF|\xBE4?=\x93\xD4:\xBE\x82\xE7\xB5P\xE2c)С\xE7\xF2\x90\x97\x89f\x9DC\xF5|\xBEft\xE5\xF4Ll\xE1\xE4T'K4\x80J\xFCM@[w\xC17\xA8TJ\xF6u\xBB\xE45\xDE \xB5AP\xE7\xCBG\xEF\xD7\xCBg\xDExuYϜM =\xAC"`+h\xAE\xC2\xE2\xFD\xC0\xBC]\xE2U\xA3\xC6#\xE05\xD0W\xA0\xCF\xC0\xE0\x9A\xAD\x92N[\xC0
+\xDD\x81\x96\x80M`x\xAC\xFE`\xC5\x80tE\xC0\x92 K\xA80%\xA5@Be\xE1^X\xFA@0\\xFAAT:\x8CA\x94\xA5\xC1V\x82DAM\xF4j;\xF6\x90 \xBEA|s-\xC1\xAE
+9l~\xAB\xD5\xFE\xF9\xE2y{\xCCu7\x8B
+\x81\xFD>C-Ji+\xF8vs\x80\xC0\xF1\xB0\xAF\xF4\xE9/\x8F\x81vt2\xE2\xEB\x88q\xC0V\xF4\xC2\xD7\xDAT%#\xBA_F\xACC#\xBF\xFD\xBA\xA42\xD6\xE1\xA2I IEND\xAEB`\x82
\ No newline at end of file
Modified: trunk/Tools/MiniBrowser/qt/qml/BrowserWindow.qml (111011 => 111012)
--- trunk/Tools/MiniBrowser/qt/qml/BrowserWindow.qml 2012-03-16 16:04:44 UTC (rev 111011)
+++ trunk/Tools/MiniBrowser/qt/qml/BrowserWindow.qml 2012-03-16 16:16:25 UTC (rev 111012)
@@ -313,6 +313,7 @@
experimental.promptDialog: PromptDialog { }
experimental.authenticationDialog: AuthenticationDialog { }
experimental.proxyAuthenticationDialog: ProxyAuthenticationDialog { }
+ experimental.filePicker: FilePicker { }
ScrollIndicator {
flickableItem: webView.experimental.flickable
Added: trunk/Tools/MiniBrowser/qt/qml/FilePicker.qml (0 => 111012)
--- trunk/Tools/MiniBrowser/qt/qml/FilePicker.qml (rev 0)
+++ trunk/Tools/MiniBrowser/qt/qml/FilePicker.qml 2012-03-16 16:16:25 UTC (rev 111012)
@@ -0,0 +1,182 @@
+/*
+ * Copyright (C) 2012 Nokia Corporation and/or its subsidiary(-ies)
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public License
+ * along with this program; see the file COPYING.LIB. If not, write to
+ * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ * Boston, MA 02110-1301, USA.
+ *
+ */
+
+import QtQuick 2.0
+import Qt.labs.folderlistmodel 1.0
+
+Rectangle {
+ id: filePicker
+
+ property QtObject fileModel: model
+ property alias folder: folders.folder
+
+ color: "white"
+ width: 400
+ height: 500
+
+ smooth: true
+ radius: 5
+ anchors.centerIn: parent
+
+ border {
+ width: 1
+ color: "#bfbfbf"
+ }
+
+ BorderImage {
+ source: "../icons/titlebar.png";
+ width: parent.width;
+ height: 50
+ y: -7
+ id: titleBar
+
+ anchors {
+ top: parent.top
+ bottom: folderListView.top
+ }
+ Rectangle {
+ id: upButton
+ width: 48
+ height: titleBar.height - 7
+ color: "transparent"
+ Image { anchors.centerIn: parent; source: "../icons/up.png" }
+ MouseArea { id: upRegion; anchors.centerIn: parent
+ width: 48
+ height: 48
+ onClicked: if (folders.parentFolder != "") up()
+ }
+ }
+
+ Rectangle {
+ color: "gray"
+ x: 48
+ width: 1
+ height: 44
+ }
+
+ Text {
+ anchors {
+ left: upButton.right
+ right: parent.right
+ leftMargin: 4
+ rightMargin: 4
+ }
+
+ height: parent.height
+ text: folders.folder
+ color: "white"
+ elide: Text.ElideLeft;
+ horizontalAlignment: Text.AlignLeft;
+ verticalAlignment: Text.AlignVCenter
+ font.pixelSize: 24
+ }
+ }
+
+ ListView {
+ id: folderListView
+
+ width: parent.width
+ height: 400
+ anchors.centerIn: parent
+ spacing: 2
+ clip: true
+
+ FolderListModel {
+ id: folders
+ }
+
+ Component {
+ id: fileDelegate
+
+ Rectangle {
+ function selected() {
+ if (folders.isFolder(index))
+ openFolder(filePath);
+ else
+ fileModel.accept(filePath);
+ }
+
+ height: 50
+ width: parent.width
+ color: folders.isFolder(index) ? "lightgray": "darkgray"
+
+ Item {
+ width: 48;
+ height: 48
+ Image {
+ source: "../icons/folder.png"
+ anchors.centerIn: parent
+ visible: folders.isFolder(index)
+ }
+ }
+
+ Text {
+ anchors.centerIn: parent
+ anchors.leftMargin: 50
+ text: fileName
+ }
+
+ MouseArea {
+ anchors.fill: parent
+ onClicked: selected();
+ }
+ }
+ }
+ model: folders
+ delegate: fileDelegate
+ }
+
+ Rectangle {
+ id: button
+
+ height: 50
+
+ border {
+ width: 1
+ color: "#bfbfbf"
+ }
+
+ anchors {
+ bottom: parent.bottom
+ top: folderListView.bottom
+ left: parent.left
+ right: parent.right
+ }
+
+ DialogButton {
+ id: cancel
+ text: "Cancel"
+ anchors {
+ horizontalCenter: parent.horizontalCenter;
+ verticalCenter: parent.verticalCenter
+ }
+
+ onClicked: fileModel.reject()
+ }
+ }
+
+ function openFolder(path) {
+ folders.folder = path;
+ }
+
+ function up() {
+ folders.folder = folders.parentFolder;
+ }
+}