summaryrefslogtreecommitdiff
path: root/Tools/MiniBrowser
diff options
context:
space:
mode:
authorSimon Hausmann <simon.hausmann@nokia.com>2012-05-07 11:21:11 +0200
committerSimon Hausmann <simon.hausmann@nokia.com>2012-05-07 11:21:11 +0200
commit2cf6c8816a73e0132bd8fa3b509d62d7c51b6e47 (patch)
tree988e8c5b116dd0466244ae2fe5af8ee9be926d76 /Tools/MiniBrowser
parentdd91e772430dc294e3bf478c119ef8d43c0a3358 (diff)
downloadqtwebkit-2cf6c8816a73e0132bd8fa3b509d62d7c51b6e47.tar.gz
Imported WebKit commit 7e538425aa020340619e927792f3d895061fb54b (http://svn.webkit.org/repository/webkit/trunk@116286)
Diffstat (limited to 'Tools/MiniBrowser')
-rw-r--r--Tools/MiniBrowser/Configurations/Base.xcconfig2
-rw-r--r--Tools/MiniBrowser/gtk/BrowserDownloadsBar.c276
-rw-r--r--Tools/MiniBrowser/gtk/BrowserDownloadsBar.h51
-rw-r--r--Tools/MiniBrowser/gtk/BrowserWindow.c34
-rw-r--r--Tools/MiniBrowser/gtk/BrowserWindow.h1
-rw-r--r--Tools/MiniBrowser/gtk/GNUmakefile.am6
-rw-r--r--Tools/MiniBrowser/gtk/main.c2
-rw-r--r--Tools/MiniBrowser/mac/BrowserWindowController.m1
-rw-r--r--Tools/MiniBrowser/qt/BrowserWindow.cpp77
-rw-r--r--Tools/MiniBrowser/qt/BrowserWindow.h15
-rw-r--r--Tools/MiniBrowser/qt/MiniBrowser.pro2
-rw-r--r--Tools/MiniBrowser/qt/MiniBrowser.qrc12
-rw-r--r--Tools/MiniBrowser/qt/MiniBrowserApplication.cpp4
-rw-r--r--Tools/MiniBrowser/qt/MiniBrowserApplication.h3
-rw-r--r--Tools/MiniBrowser/qt/icons/checkbox_checked.pngbin0 -> 263 bytes
-rw-r--r--Tools/MiniBrowser/qt/icons/checkbox_unchecked.pngbin0 -> 159 bytes
-rw-r--r--Tools/MiniBrowser/qt/icons/folder.pngbin0 -> 1841 bytes
-rw-r--r--Tools/MiniBrowser/qt/icons/titlebar.pngbin0 -> 197 bytes
-rw-r--r--Tools/MiniBrowser/qt/icons/up.pngbin0 -> 662 bytes
-rw-r--r--Tools/MiniBrowser/qt/js/MultiSelect.js44
-rw-r--r--Tools/MiniBrowser/qt/main.cpp2
-rw-r--r--Tools/MiniBrowser/qt/qml/BrowserWindow.qml31
-rw-r--r--Tools/MiniBrowser/qt/qml/CheckBox.qml35
-rw-r--r--Tools/MiniBrowser/qt/qml/FilePicker.qml217
-rw-r--r--Tools/MiniBrowser/qt/qml/ScrollIndicator.qml141
-rw-r--r--Tools/MiniBrowser/qt/useragentlist.txt13
26 files changed, 939 insertions, 30 deletions
diff --git a/Tools/MiniBrowser/Configurations/Base.xcconfig b/Tools/MiniBrowser/Configurations/Base.xcconfig
index 72079287f..eb3a4d2ce 100644
--- a/Tools/MiniBrowser/Configurations/Base.xcconfig
+++ b/Tools/MiniBrowser/Configurations/Base.xcconfig
@@ -23,7 +23,7 @@
#include "CompilerVersion.xcconfig"
-DEBUG_INFORMATION_FORMAT = dwarf
+DEBUG_INFORMATION_FORMAT = dwarf-with-dsym;
PREBINDING = NO
GCC_C_LANGUAGE_STANDARD = gnu99
GCC_ENABLE_CPP_EXCEPTIONS = NO;
diff --git a/Tools/MiniBrowser/gtk/BrowserDownloadsBar.c b/Tools/MiniBrowser/gtk/BrowserDownloadsBar.c
new file mode 100644
index 000000000..5f0e620e5
--- /dev/null
+++ b/Tools/MiniBrowser/gtk/BrowserDownloadsBar.c
@@ -0,0 +1,276 @@
+/*
+ * Copyright (C) 2011 Igalia S.L.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS''
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
+ * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS
+ * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
+ * THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#include "BrowserDownloadsBar.h"
+
+#include <glib/gi18n.h>
+
+#define BROWSER_TYPE_DOWNLOAD (browser_download_get_type())
+#define BROWSER_DOWNLOAD(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj), BROWSER_TYPE_DOWNLOAD, BrowserDownload))
+
+typedef struct _BrowserDownload BrowserDownload;
+typedef struct _BrowserDownloadClass BrowserDownloadClass;
+
+static GType browser_download_get_type();
+
+struct _BrowserDownloadsBar {
+ GtkInfoBar parent;
+};
+
+struct _BrowserDownloadsBarClass {
+ GtkInfoBarClass parentClass;
+};
+
+G_DEFINE_TYPE(BrowserDownloadsBar, browser_downloads_bar, GTK_TYPE_INFO_BAR)
+
+static void
+browserDownloadsBarChildRemoved(GtkContainer *infoBar, GtkWidget *widget, BrowserDownloadsBar *downloadsBar)
+{
+ GList *children = gtk_container_get_children(infoBar);
+ if (g_list_length(children) == 1)
+ gtk_info_bar_response(GTK_INFO_BAR(downloadsBar), GTK_RESPONSE_CLOSE);
+ g_list_free(children);
+}
+
+static void browserDownloadsBarResponse(GtkInfoBar *infoBar, gint responseId)
+{
+ gtk_widget_destroy(GTK_WIDGET(infoBar));
+}
+
+static void browser_downloads_bar_init(BrowserDownloadsBar *downloadsBar)
+{
+ GtkWidget *contentBox = gtk_info_bar_get_content_area(GTK_INFO_BAR(downloadsBar));
+ g_signal_connect_after(contentBox, "remove", G_CALLBACK(browserDownloadsBarChildRemoved), downloadsBar);
+ gtk_orientable_set_orientation(GTK_ORIENTABLE(contentBox), GTK_ORIENTATION_VERTICAL);
+
+ GtkWidget *title = gtk_label_new(NULL);
+ gtk_label_set_markup(GTK_LABEL(title), "<span size='xx-large' weight='bold'>Downloads</span>");
+ gtk_misc_set_alignment(GTK_MISC(title), 0., 0.5);
+ gtk_box_pack_start(GTK_BOX(contentBox), title, FALSE, FALSE, 12);
+ gtk_widget_show(title);
+}
+
+static void browser_downloads_bar_class_init(BrowserDownloadsBarClass *klass)
+{
+ GtkInfoBarClass *infoBarClass = GTK_INFO_BAR_CLASS(klass);
+ infoBarClass->response = browserDownloadsBarResponse;
+}
+
+GtkWidget *browser_downloads_bar_new()
+{
+ GtkInfoBar *downloadsBar = GTK_INFO_BAR(g_object_new(BROWSER_TYPE_DOWNLOADS_BAR, NULL));
+ gtk_info_bar_add_buttons(downloadsBar, GTK_STOCK_CLOSE, GTK_RESPONSE_CLOSE, NULL);
+ return GTK_WIDGET(downloadsBar);
+}
+
+struct _BrowserDownload {
+ GtkBox parent;
+
+ WebKitDownload *download;
+ guint64 contentLength;
+ guint64 downloadedSize;
+ gboolean finished;
+
+ GtkWidget *statusLabel;
+ GtkWidget *remainingLabel;
+ GtkWidget *progressBar;
+ GtkWidget *actionButton;
+};
+
+struct _BrowserDownloadClass {
+ GtkBoxClass parentClass;
+};
+
+G_DEFINE_TYPE(BrowserDownload, browser_download, GTK_TYPE_BOX)
+
+static void actionButtonClicked(GtkButton *button, BrowserDownload *browserDownload)
+{
+ if (!browserDownload->finished) {
+ webkit_download_cancel(browserDownload->download);
+ return;
+ }
+
+ gtk_show_uri(gtk_widget_get_screen(GTK_WIDGET(browserDownload)),
+ webkit_download_get_destination(browserDownload->download),
+ gtk_get_current_event_time(), NULL);
+ gtk_widget_destroy(GTK_WIDGET(browserDownload));
+}
+
+static void browserDownloadFinalize(GObject *object)
+{
+ BrowserDownload *browserDownload = BROWSER_DOWNLOAD(object);
+
+ if (browserDownload->download) {
+ g_object_unref(browserDownload->download);
+ browserDownload->download = NULL;
+ }
+
+ G_OBJECT_CLASS(browser_download_parent_class)->finalize(object);
+}
+
+static void browser_download_init(BrowserDownload *download)
+{
+ GtkWidget *mainBox = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 6);
+ gtk_box_pack_start(GTK_BOX(download), mainBox, FALSE, FALSE, 0);
+ gtk_widget_show(mainBox);
+
+ GtkWidget *vbox = gtk_box_new(GTK_ORIENTATION_VERTICAL, 0);
+ gtk_box_pack_start(GTK_BOX(mainBox), vbox, TRUE, TRUE, 0);
+ gtk_widget_show(vbox);
+
+ GtkWidget *statusBox = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 0);
+ gtk_box_pack_start(GTK_BOX(vbox), statusBox, TRUE, TRUE, 0);
+ gtk_widget_show(statusBox);
+
+ download->statusLabel = gtk_label_new("Starting Download");
+ gtk_label_set_ellipsize(GTK_LABEL(download->statusLabel), PANGO_ELLIPSIZE_END);
+ gtk_misc_set_alignment(GTK_MISC(download->statusLabel), 0., 0.5);
+ gtk_box_pack_start(GTK_BOX(statusBox), download->statusLabel, TRUE, TRUE, 0);
+ gtk_widget_show(download->statusLabel);
+
+ download->remainingLabel = gtk_label_new(NULL);
+ gtk_misc_set_alignment(GTK_MISC(download->remainingLabel), 1., 0.5);
+ gtk_box_pack_end(GTK_BOX(statusBox), download->remainingLabel, TRUE, TRUE, 0);
+ gtk_widget_show(download->remainingLabel);
+
+ download->progressBar = gtk_progress_bar_new();
+ gtk_box_pack_start(GTK_BOX(vbox), download->progressBar, FALSE, FALSE, 0);
+ gtk_widget_show(download->progressBar);
+
+ download->actionButton = gtk_button_new_from_stock(GTK_STOCK_CANCEL);
+ g_signal_connect(download->actionButton, "clicked", G_CALLBACK(actionButtonClicked), download);
+ gtk_box_pack_end(GTK_BOX(mainBox), download->actionButton, FALSE, FALSE, 0);
+ gtk_widget_show(download->actionButton);
+}
+
+static void browser_download_class_init(BrowserDownloadClass *klass)
+{
+ GObjectClass *objectClass = G_OBJECT_CLASS(klass);
+
+ objectClass->finalize = browserDownloadFinalize;
+}
+
+static void downloadReceivedResponse(WebKitDownload *download, GParamSpec *paramSpec, BrowserDownload *browserDownload)
+{
+ WebKitURIResponse *response = webkit_download_get_response(download);
+ browserDownload->contentLength = webkit_uri_response_get_content_length(response);
+ char *text = g_strdup_printf("Downloading %s", webkit_uri_response_get_uri(response));
+ gtk_label_set_text(GTK_LABEL(browserDownload->statusLabel), text);
+ g_free(text);
+}
+
+static gchar *remainingTime(BrowserDownload *browserDownload)
+{
+ guint64 total = browserDownload->contentLength;
+ guint64 current = browserDownload->downloadedSize;
+ gdouble elapsedTime = webkit_download_get_elapsed_time(browserDownload->download);
+
+ if (current <= 0)
+ return NULL;
+
+ gdouble perByteTime = elapsedTime / current;
+ gdouble interval = perByteTime * (total - current);
+
+ int hours = (int) (interval / 3600);
+ interval -= hours * 3600;
+ int mins = (int) (interval / 60);
+ interval -= mins * 60;
+ int secs = (int) interval;
+
+ if (hours > 0) {
+ if (mins > 0)
+ return g_strdup_printf (ngettext ("%u:%02u hour left", "%u:%02u hours left", hours), hours, mins);
+ return g_strdup_printf (ngettext ("%u hour left", "%u hours left", hours), hours);
+ }
+
+ if (mins > 0)
+ return g_strdup_printf (ngettext ("%u:%02u minute left", "%u:%02u minutes left", mins), mins, secs);
+ return g_strdup_printf (ngettext ("%u second left", "%u seconds left", secs), secs);
+}
+
+static void downloadProgress(WebKitDownload *download, GParamSpec *paramSpec, BrowserDownload *browserDownload)
+{
+ gtk_progress_bar_set_fraction(GTK_PROGRESS_BAR(browserDownload->progressBar),
+ webkit_download_get_estimated_progress(download));
+ char *remaining = remainingTime(browserDownload);
+ gtk_label_set_text(GTK_LABEL(browserDownload->remainingLabel), remaining);
+ g_free(remaining);
+}
+
+static void downloadReceivedData(WebKitDownload *download, guint64 dataLength, BrowserDownload *browserDownload)
+{
+ browserDownload->downloadedSize += dataLength;
+}
+
+static void downloadFinished(WebKitDownload *download, BrowserDownload *browserDownload)
+{
+ gchar *text = g_strdup_printf("Download completed: %s", webkit_download_get_destination(download));
+ gtk_label_set_text(GTK_LABEL(browserDownload->statusLabel), text);
+ g_free(text);
+ gtk_label_set_text(GTK_LABEL(browserDownload->remainingLabel), NULL);
+ gtk_button_set_image(GTK_BUTTON(browserDownload->actionButton),
+ gtk_image_new_from_stock(GTK_STOCK_OPEN, GTK_ICON_SIZE_BUTTON));
+ gtk_button_set_label(GTK_BUTTON(browserDownload->actionButton), "Open ...");
+ browserDownload->finished = TRUE;
+}
+
+static void downloadFailed(WebKitDownload *download, GError *error, BrowserDownload *browserDownload)
+{
+ g_signal_handlers_disconnect_by_func(browserDownload->download, downloadFinished, browserDownload);
+ if (g_error_matches(error, WEBKIT_DOWNLOAD_ERROR, WEBKIT_DOWNLOAD_ERROR_CANCELLED_BY_USER)) {
+ gtk_widget_destroy(GTK_WIDGET(browserDownload));
+ return;
+ }
+
+ char *errorMessage = g_strdup_printf("Download failed: %s", error->message);
+ gtk_label_set_text(GTK_LABEL(browserDownload->statusLabel), errorMessage);
+ g_free(errorMessage);
+ gtk_label_set_text(GTK_LABEL(browserDownload->remainingLabel), NULL);
+ gtk_widget_set_sensitive(browserDownload->actionButton, FALSE);
+}
+
+GtkWidget *browserDownloadNew(WebKitDownload *download)
+{
+ BrowserDownload *browserDownload = BROWSER_DOWNLOAD(g_object_new(BROWSER_TYPE_DOWNLOAD,
+ "orientation", GTK_ORIENTATION_VERTICAL,
+ NULL));
+
+ browserDownload->download = g_object_ref(download);
+ g_signal_connect(browserDownload->download, "notify::response", G_CALLBACK(downloadReceivedResponse), browserDownload);
+ g_signal_connect(browserDownload->download, "notify::estimated-progress", G_CALLBACK(downloadProgress), browserDownload);
+ g_signal_connect(browserDownload->download, "received-data", G_CALLBACK(downloadReceivedData), browserDownload);
+ g_signal_connect(browserDownload->download, "finished", G_CALLBACK(downloadFinished), browserDownload);
+ g_signal_connect(browserDownload->download, "failed", G_CALLBACK(downloadFailed), browserDownload);
+
+ return GTK_WIDGET(browserDownload);
+}
+
+void browser_downloads_bar_add_download(BrowserDownloadsBar *downloadsBar, WebKitDownload *download)
+{
+ GtkWidget *browserDownload = browserDownloadNew(download);
+ GtkWidget *contentBox = gtk_info_bar_get_content_area(GTK_INFO_BAR(downloadsBar));
+ gtk_box_pack_start(GTK_BOX(contentBox), browserDownload, FALSE, TRUE, 0);
+ gtk_widget_show(browserDownload);
+}
diff --git a/Tools/MiniBrowser/gtk/BrowserDownloadsBar.h b/Tools/MiniBrowser/gtk/BrowserDownloadsBar.h
new file mode 100644
index 000000000..1704a5d01
--- /dev/null
+++ b/Tools/MiniBrowser/gtk/BrowserDownloadsBar.h
@@ -0,0 +1,51 @@
+/*
+ * Copyright (C) 2011 Igalia S.L.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS''
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
+ * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS
+ * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
+ * THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#ifndef BrowserDownloadsBar_h
+#define BrowserDownloadsBar_h
+
+#include <gtk/gtk.h>
+#include <webkit2/webkit2.h>
+
+G_BEGIN_DECLS
+
+#define BROWSER_TYPE_DOWNLOADS_BAR (browser_downloads_bar_get_type())
+#define BROWSER_DOWNLOADS_BAR(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj), BROWSER_TYPE_DOWNLOADS_BAR, BrowserDownloadsBar))
+#define BROWSER_IS_DOWNLOADS_BAR(obj) (G_TYPE_CHECK_INSTANCE_TYPE((obj), BROWSER_TYPE_DOWNLOADS_BAR))
+#define BROWSER_DOWNLOADS_BAR_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST((klass), BROWSER_TYPE_DOWNLOADS_BAR, BrowserDownloadsBarClass))
+#define BROWSER_IS_DOWNLOADS_BAR_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE((klass), BROWSER_TYPE_DOWNLOADS_BAR))
+#define BROWSER_DOWNLOADS_BAR_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS((obj), BROWSER_TYPE_DOWNLOADS_BAR, BrowserDownloadsBarClass))
+
+typedef struct _BrowserDownloadsBar BrowserDownloadsBar;
+typedef struct _BrowserDownloadsBarClass BrowserDownloadsBarClass;
+
+GType browser_downloads_bar_get_type(void);
+
+GtkWidget *browser_downloads_bar_new(void);
+void browser_downloads_bar_add_download(BrowserDownloadsBar *, WebKitDownload *);
+
+G_END_DECLS
+
+#endif
diff --git a/Tools/MiniBrowser/gtk/BrowserWindow.c b/Tools/MiniBrowser/gtk/BrowserWindow.c
index 74518444c..da2333212 100644
--- a/Tools/MiniBrowser/gtk/BrowserWindow.c
+++ b/Tools/MiniBrowser/gtk/BrowserWindow.c
@@ -26,7 +26,10 @@
*/
#include "BrowserWindow.h"
+
+#include "BrowserDownloadsBar.h"
#include "BrowserSettingsDialog.h"
+#include <string.h>
enum {
PROP_0,
@@ -47,7 +50,7 @@ struct _BrowserWindow {
GtkWidget *statusLabel;
GtkWidget *settingsDialog;
WebKitWebView *webView;
-
+ GtkWidget *downloadsBar;
};
struct _BrowserWindowClass {
@@ -77,7 +80,7 @@ static void resetStatusText(GtkWidget *widget, BrowserWindow *window)
static void activateUriEntryCallback(BrowserWindow *window)
{
- webkit_web_view_load_uri(window->webView, gtk_entry_get_text(GTK_ENTRY(window->uriEntry)));
+ browser_window_load_uri(window, gtk_entry_get_text(GTK_ENTRY(window->uriEntry)));
}
static void reloadCallback(BrowserWindow *window)
@@ -133,6 +136,18 @@ static void webViewLoadProgressChanged(WebKitWebView *webView, GParamSpec *pspec
g_timeout_add(500, (GSourceFunc)resetEntryProgress, window->uriEntry);
}
+static void downloadStarted(WebKitWebContext *webContext, WebKitDownload *download, BrowserWindow *window)
+{
+ if (!window->downloadsBar) {
+ window->downloadsBar = browser_downloads_bar_new();
+ gtk_box_pack_start(GTK_BOX(window->mainBox), window->downloadsBar, FALSE, FALSE, 0);
+ gtk_box_reorder_child(GTK_BOX(window->mainBox), window->downloadsBar, 0);
+ g_object_add_weak_pointer(G_OBJECT(window->downloadsBar), (gpointer *)&(window->downloadsBar));
+ gtk_widget_show(window->downloadsBar);
+ }
+ browser_downloads_bar_add_download(BROWSER_DOWNLOADS_BAR(window->downloadsBar), download);
+}
+
static void browserWindowHistoryItemSelected(BrowserWindow *window, GtkMenuItem *item)
{
GtkAction *action = gtk_activatable_get_related_action(GTK_ACTIVATABLE(item));
@@ -422,6 +437,8 @@ static void browserWindowConstructed(GObject *gObject)
g_signal_connect(window->webView, "mouse-target-changed", G_CALLBACK(webViewMouseTargetChanged), window);
g_signal_connect(window->webView, "notify::zoom-level", G_CALLBACK(webViewZoomLevelChanged), window);
+ g_signal_connect(webkit_web_view_get_context(window->webView), "download-started", G_CALLBACK(downloadStarted), window);
+
WebKitBackForwardList *backForwadlist = webkit_web_view_get_back_forward_list(window->webView);
g_signal_connect(backForwadlist, "changed", G_CALLBACK(backForwadlistChanged), window);
@@ -480,3 +497,16 @@ WebKitWebView *browser_window_get_view(BrowserWindow *window)
return window->webView;
}
+
+void browser_window_load_uri(BrowserWindow *window, const char *uri)
+{
+ g_return_if_fail(BROWSER_IS_WINDOW(window));
+ g_return_if_fail(uri);
+
+ if (!g_str_has_prefix(uri, "javascript:")) {
+ webkit_web_view_load_uri(window->webView, uri);
+ return;
+ }
+
+ webkit_web_view_run_javascript(window->webView, strstr(uri, "javascript:"), NULL, NULL);
+}
diff --git a/Tools/MiniBrowser/gtk/BrowserWindow.h b/Tools/MiniBrowser/gtk/BrowserWindow.h
index 46a06c21c..06397a5cc 100644
--- a/Tools/MiniBrowser/gtk/BrowserWindow.h
+++ b/Tools/MiniBrowser/gtk/BrowserWindow.h
@@ -45,6 +45,7 @@ GType browser_window_get_type(void);
GtkWidget* browser_window_new(WebKitWebView*);
WebKitWebView* browser_window_get_view(BrowserWindow*);
+void browser_window_load_uri(BrowserWindow *, const char *uri);
G_END_DECLS
diff --git a/Tools/MiniBrowser/gtk/GNUmakefile.am b/Tools/MiniBrowser/gtk/GNUmakefile.am
index 9e42e194f..50974ae2f 100644
--- a/Tools/MiniBrowser/gtk/GNUmakefile.am
+++ b/Tools/MiniBrowser/gtk/GNUmakefile.am
@@ -10,12 +10,15 @@ Programs_MiniBrowser_CPPFLAGS = \
-I$(top_builddir)/DerivedSources/WebKit2/webkit2gtk/include \
-DWEBKIT_EXEC_PATH=\"${shell pwd}/$(top_builddir)/Programs/\" \
$(global_cppflags) \
+ $(javascriptcore_cppflags) \
$(GLIB_CFLAGS) \
$(GTK_CFLAGS)
Programs_MiniBrowser_SOURCES = \
Tools/MiniBrowser/gtk/BrowserCellRendererVariant.h \
Tools/MiniBrowser/gtk/BrowserCellRendererVariant.c \
+ Tools/MiniBrowser/gtk/BrowserDownloadsBar.h \
+ Tools/MiniBrowser/gtk/BrowserDownloadsBar.c \
Tools/MiniBrowser/gtk/BrowserSettingsDialog.h \
Tools/MiniBrowser/gtk/BrowserSettingsDialog.c \
Tools/MiniBrowser/gtk/BrowserWindow.h \
@@ -31,7 +34,8 @@ nodist_Programs_MiniBrowser_SOURCES = \
Programs_MiniBrowser_LDADD = \
libwebkit2gtk-@WEBKITGTK_API_MAJOR_VERSION@.@WEBKITGTK_API_MINOR_VERSION@.la \
$(GLIB_LIBS) \
- $(GTK_LIBS)
+ $(GTK_LIBS) \
+ $(LIBSOUP_LIBS)
Programs_MiniBrowser_LDFLAGS = \
-no-fast-install \
diff --git a/Tools/MiniBrowser/gtk/main.c b/Tools/MiniBrowser/gtk/main.c
index 96748a627..b266cdc42 100644
--- a/Tools/MiniBrowser/gtk/main.c
+++ b/Tools/MiniBrowser/gtk/main.c
@@ -53,7 +53,7 @@ static void createBrowserWindow(const gchar *uri, WebKitSettings *webkitSettings
g_object_unref(webkitSettings);
}
- webkit_web_view_load_uri(WEBKIT_WEB_VIEW(webView), url);
+ browser_window_load_uri(BROWSER_WINDOW(mainWindow), url);
g_free(url);
gtk_widget_grab_focus(webView);
diff --git a/Tools/MiniBrowser/mac/BrowserWindowController.m b/Tools/MiniBrowser/mac/BrowserWindowController.m
index 5dbd5a7dd..5144f5393 100644
--- a/Tools/MiniBrowser/mac/BrowserWindowController.m
+++ b/Tools/MiniBrowser/mac/BrowserWindowController.m
@@ -610,6 +610,7 @@ static void runOpenPanel(WKPageRef page, WKFrameRef frame, WKOpenPanelParameters
didDetectXSSForFrame,
0, // didNewFirstVisuallyNonEmptyLayout
0, // willGoToBackForwardListItem
+ 0, // interactionOccurredWhileProcessUnresponsive
};
WKPageSetPageLoaderClient(_webView.pageRef, &loadClient);
diff --git a/Tools/MiniBrowser/qt/BrowserWindow.cpp b/Tools/MiniBrowser/qt/BrowserWindow.cpp
index 6ccd963bc..27946d5d5 100644
--- a/Tools/MiniBrowser/qt/BrowserWindow.cpp
+++ b/Tools/MiniBrowser/qt/BrowserWindow.cpp
@@ -32,7 +32,7 @@
#include "private/qquickwebview_p.h"
#include "utils.h"
-#include <QDeclarativeEngine>
+#include <QQmlEngine>
#include <QDir>
#include <QPointF>
@@ -52,7 +52,7 @@ BrowserWindow::BrowserWindow(WindowOptions* options)
engine()->rootContext()->setContextProperty("utils", utils);
engine()->rootContext()->setContextProperty("options", options);
setSource(QUrl("qrc:/qml/BrowserWindow.qml"));
- connect(rootObject(), SIGNAL(pageTitleChanged(QString)), this, SLOT(setWindowTitle(QString)));
+ connect(rootObject(), SIGNAL(pageTitleChanged(QString)), this, SLOT(onTitleChanged(QString)));
connect(rootObject(), SIGNAL(newWindow(QString)), this, SLOT(newWindow(QString)));
if (options->startFullScreen())
showFullScreen();
@@ -63,6 +63,19 @@ BrowserWindow::BrowserWindow(WindowOptions* options)
resize(options->requestedWindowSize());
show();
}
+
+ QQmlContext* context = rootContext();
+ context->setContextProperty("Window", this);
+
+ if (!options->userAgent().isNull())
+ webViewExperimental()->setUserAgent(options->userAgent());
+
+ // Zoom values are chosen to be like in Mozilla Firefox 3.
+ m_zoomLevels << 0.3 << 0.5 << 0.67 << 0.8 << 0.9
+ << 1
+ << 1.11 << 1.22 << 1.33 << 1.5 << 1.7 << 2 << 2.4 << 3;
+
+ m_currentZoomLevel = m_zoomLevels.indexOf(1);
}
QQuickWebView* BrowserWindow::webView() const
@@ -70,6 +83,11 @@ QQuickWebView* BrowserWindow::webView() const
return rootObject()->property("webview").value<QQuickWebView*>();
}
+QQuickWebViewExperimental* BrowserWindow::webViewExperimental() const
+{
+ return webView()->property("experimental").value<QQuickWebViewExperimental*>();
+}
+
void BrowserWindow::load(const QString& url)
{
QUrl completedUrl = Utils::urlFromUserInput(url);
@@ -100,7 +118,7 @@ void BrowserWindow::updateVisualMockTouchPoints(const QList<QTouchEvent::TouchPo
QQuickItem* mockTouchPointItem = rootObject()->findChild<QQuickItem*>(mockTouchPointIdentifier, Qt::FindDirectChildrenOnly);
if (!mockTouchPointItem) {
- QDeclarativeComponent touchMockPointComponent(engine(), QUrl("qrc:/qml/MockTouchPoint.qml"));
+ QQmlComponent touchMockPointComponent(engine(), QUrl("qrc:/qml/MockTouchPoint.qml"));
mockTouchPointItem = qobject_cast<QQuickItem*>(touchMockPointComponent.create());
mockTouchPointItem->setObjectName(mockTouchPointIdentifier);
mockTouchPointItem->setProperty("pointId", QVariant(touchPoint.id()));
@@ -121,10 +139,59 @@ void BrowserWindow::screenshot()
{
}
-void BrowserWindow::updateUserAgentList()
+BrowserWindow::~BrowserWindow()
{
}
-BrowserWindow::~BrowserWindow()
+void BrowserWindow::onTitleChanged(QString title)
+{
+ if (title.isEmpty())
+ title = QLatin1String("MiniBrowser");
+ setWindowTitle(title);
+}
+
+void BrowserWindow::zoomIn()
+{
+ if (m_currentZoomLevel < m_zoomLevels.size() - 1)
+ ++m_currentZoomLevel;
+ webView()->setZoomFactor(m_zoomLevels[m_currentZoomLevel]);
+}
+
+void BrowserWindow::zoomOut()
+{
+ if (m_currentZoomLevel > 0)
+ --m_currentZoomLevel;
+ webView()->setZoomFactor(m_zoomLevels[m_currentZoomLevel]);
+}
+
+void BrowserWindow::keyPressEvent(QKeyEvent* event)
+{
+
+ if (event->modifiers() & Qt::ControlModifier) {
+ bool handled;
+ if ((handled = event->key() == Qt::Key_Plus))
+ zoomIn();
+ else if ((handled = event->key() == Qt::Key_Minus))
+ zoomOut();
+
+ if (handled) {
+ event->accept();
+ return;
+ }
+ }
+ QQuickView::keyPressEvent(event);
+}
+
+void BrowserWindow::wheelEvent(QWheelEvent* event)
{
+ if (event->modifiers() & Qt::ControlModifier && event->orientation() == Qt::Vertical) {
+ if (event->delta() > 0)
+ zoomIn();
+ else
+ zoomOut();
+
+ event->accept();
+ return;
+ }
+ QQuickView::wheelEvent(event);
}
diff --git a/Tools/MiniBrowser/qt/BrowserWindow.h b/Tools/MiniBrowser/qt/BrowserWindow.h
index 0156167d1..1e7f7f52d 100644
--- a/Tools/MiniBrowser/qt/BrowserWindow.h
+++ b/Tools/MiniBrowser/qt/BrowserWindow.h
@@ -34,6 +34,7 @@
#include <QtQuick/QQuickView>
class QQuickWebView;
+class QQuickWebViewExperimental;
class BrowserWindow : public QQuickView {
Q_OBJECT
@@ -45,6 +46,7 @@ public:
void reload();
void focusAddressBar();
QQuickWebView* webView() const;
+ QQuickWebViewExperimental* webViewExperimental() const;
void updateVisualMockTouchPoints(const QList<QTouchEvent::TouchPoint>& touchPoints);
@@ -54,10 +56,19 @@ public slots:
protected slots:
void screenshot();
+private slots:
+ void onTitleChanged(QString);
+
private:
- void updateUserAgentList();
+ void zoomIn();
+ void zoomOut();
+
+ virtual void keyPressEvent(QKeyEvent*);
+ virtual void wheelEvent(QWheelEvent*);
+
WindowOptions* m_windowOptions;
- QStringList m_userAgentList;
+ QVector<qreal> m_zoomLevels;
+ unsigned m_currentZoomLevel;
};
#endif
diff --git a/Tools/MiniBrowser/qt/MiniBrowser.pro b/Tools/MiniBrowser/qt/MiniBrowser.pro
index bf426452a..f7b83cf15 100644
--- a/Tools/MiniBrowser/qt/MiniBrowser.pro
+++ b/Tools/MiniBrowser/qt/MiniBrowser.pro
@@ -22,7 +22,7 @@ HEADERS += \
TARGET = MiniBrowser
DESTDIR = $${ROOT_BUILD_DIR}/bin
-QT += network declarative quick webkit webkit-private
+QT += network declarative quick quick-private webkit webkit-private
macx: QT += xml
RESOURCES += MiniBrowser.qrc
diff --git a/Tools/MiniBrowser/qt/MiniBrowser.qrc b/Tools/MiniBrowser/qt/MiniBrowser.qrc
index 272350e7d..b5490bec1 100644
--- a/Tools/MiniBrowser/qt/MiniBrowser.qrc
+++ b/Tools/MiniBrowser/qt/MiniBrowser.qrc
@@ -1,26 +1,34 @@
<RCC>
<qresource prefix="/">
+ <file>icons/checkbox_checked.png</file>
+ <file>icons/checkbox_unchecked.png</file>
+ <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>js/MultiSelect.js</file>
<file>qml/AlertDialog.qml</file>
<file>qml/AuthenticationDialog.qml</file>
<file>qml/BrowserWindow.qml</file>
+ <file>qml/CheckBox.qml</file>
<file>qml/ConfirmDialog.qml</file>
<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>
<file>qml/ProxyAuthenticationDialog.qml</file>
+ <file>qml/ScrollIndicator.qml</file>
<file>qml/ViewportInfoItem.qml</file>
- <file>useragentlist.txt</file>
- <file>icons/favicon.png</file>
</qresource>
</RCC>
diff --git a/Tools/MiniBrowser/qt/MiniBrowserApplication.cpp b/Tools/MiniBrowser/qt/MiniBrowserApplication.cpp
index 95891a463..e42c558d2 100644
--- a/Tools/MiniBrowser/qt/MiniBrowserApplication.cpp
+++ b/Tools/MiniBrowser/qt/MiniBrowserApplication.cpp
@@ -261,6 +261,7 @@ static void printHelp(const QString& programName)
<< "[--window-size (width)x(height)]"
<< "[--maximize]"
<< "[-f] Full screen mode."
+ << "[--user-agent string]"
<< "[-v]"
<< "URL";
}
@@ -289,6 +290,9 @@ void MiniBrowserApplication::handleUserOptions()
m_windowOptions.setStartMaximized(takeOptionFlag(&args, "--maximize"));
m_windowOptions.setStartFullScreen(takeOptionFlag(&args, "-f"));
+ if (args.contains("--user-agent"))
+ m_windowOptions.setUserAgent(takeOptionValue(&args, "--user-agent"));
+
if (args.contains("--window-size")) {
QString value = takeOptionValue(&args, "--window-size");
QStringList list = value.split(QRegExp("\\D+"), QString::SkipEmptyParts);
diff --git a/Tools/MiniBrowser/qt/MiniBrowserApplication.h b/Tools/MiniBrowser/qt/MiniBrowserApplication.h
index dd6f8314c..6ca2c8f7f 100644
--- a/Tools/MiniBrowser/qt/MiniBrowserApplication.h
+++ b/Tools/MiniBrowser/qt/MiniBrowserApplication.h
@@ -64,6 +64,8 @@ public:
bool startFullScreen() const { return m_startFullScreen; }
void setRequestedWindowSize(const QSize& size) { m_windowSize = size; }
QSize requestedWindowSize() const { return m_windowSize; }
+ void setUserAgent(const QString& userAgent) { m_userAgent = userAgent; }
+ QString userAgent() const { return m_userAgent; }
bool touchMockingEnabled() const { return m_touchMockingEnabled; }
void setTouchMockingEnabled(bool enabled)
{
@@ -82,6 +84,7 @@ private:
bool m_startFullScreen;
bool m_touchMockingEnabled;
QSize m_windowSize;
+ QString m_userAgent;
};
class MiniBrowserApplication : public QGuiApplication {
diff --git a/Tools/MiniBrowser/qt/icons/checkbox_checked.png b/Tools/MiniBrowser/qt/icons/checkbox_checked.png
new file mode 100644
index 000000000..cbf06f651
--- /dev/null
+++ b/Tools/MiniBrowser/qt/icons/checkbox_checked.png
Binary files differ
diff --git a/Tools/MiniBrowser/qt/icons/checkbox_unchecked.png b/Tools/MiniBrowser/qt/icons/checkbox_unchecked.png
new file mode 100644
index 000000000..5f5465582
--- /dev/null
+++ b/Tools/MiniBrowser/qt/icons/checkbox_unchecked.png
Binary files differ
diff --git a/Tools/MiniBrowser/qt/icons/folder.png b/Tools/MiniBrowser/qt/icons/folder.png
new file mode 100644
index 000000000..e53e2ad46
--- /dev/null
+++ b/Tools/MiniBrowser/qt/icons/folder.png
Binary files differ
diff --git a/Tools/MiniBrowser/qt/icons/titlebar.png b/Tools/MiniBrowser/qt/icons/titlebar.png
new file mode 100644
index 000000000..f3d18aa82
--- /dev/null
+++ b/Tools/MiniBrowser/qt/icons/titlebar.png
Binary files differ
diff --git a/Tools/MiniBrowser/qt/icons/up.png b/Tools/MiniBrowser/qt/icons/up.png
new file mode 100644
index 000000000..b05f8025d
--- /dev/null
+++ b/Tools/MiniBrowser/qt/icons/up.png
Binary files differ
diff --git a/Tools/MiniBrowser/qt/js/MultiSelect.js b/Tools/MiniBrowser/qt/js/MultiSelect.js
new file mode 100644
index 000000000..9e87f5dcc
--- /dev/null
+++ b/Tools/MiniBrowser/qt/js/MultiSelect.js
@@ -0,0 +1,44 @@
+/*
+ * 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.
+ *
+ */
+
+
+var values = []
+
+function selectedValues() {
+ return values
+}
+
+function isSelected(value) {
+ return (values.indexOf(value) != -1)
+}
+
+function addValue(value) {
+ if (values.indexOf(value) != -1)
+ return
+ values.push(value)
+}
+
+function removeValue(value) {
+ var index = values.indexOf(value)
+
+ if (index == -1)
+ return
+ values.splice(index, 1)
+}
diff --git a/Tools/MiniBrowser/qt/main.cpp b/Tools/MiniBrowser/qt/main.cpp
index 3663773ab..4c8cd92ab 100644
--- a/Tools/MiniBrowser/qt/main.cpp
+++ b/Tools/MiniBrowser/qt/main.cpp
@@ -31,7 +31,7 @@
#include "MiniBrowserApplication.h"
#include "UrlLoader.h"
-#include <qdeclarative.h>
+#include <qqml.h>
#include <QDir>
#include <QLatin1String>
diff --git a/Tools/MiniBrowser/qt/qml/BrowserWindow.qml b/Tools/MiniBrowser/qt/qml/BrowserWindow.qml
index ae1f9f284..b2917cb80 100644
--- a/Tools/MiniBrowser/qt/qml/BrowserWindow.qml
+++ b/Tools/MiniBrowser/qt/qml/BrowserWindow.qml
@@ -34,6 +34,7 @@ Rectangle {
// Do not define anchors or an initial size here! This would mess up with QSGView::SizeRootObjectToView.
property alias webview: webView
+ color: "#333"
signal pageTitleChanged(string title)
signal newWindow(string url)
@@ -302,16 +303,44 @@ Rectangle {
onUrlChanged: {
addressLine.text = url
if (options.printLoadedUrls)
- console.log("Loaded:", webView.url);
+ console.log("Loaded:", webView.url.toString());
forceActiveFocus();
}
+ experimental.devicePixelRatio: 1.5
+ experimental.preferences.fullScreenEnabled: true
+ experimental.preferredMinimumContentsWidth: 980
experimental.itemSelector: ItemSelector { }
experimental.alertDialog: AlertDialog { }
experimental.confirmDialog: ConfirmDialog { }
experimental.promptDialog: PromptDialog { }
experimental.authenticationDialog: AuthenticationDialog { }
experimental.proxyAuthenticationDialog: ProxyAuthenticationDialog { }
+ experimental.filePicker: FilePicker { }
+ experimental.preferences.developerExtrasEnabled: true
+ experimental.databaseQuotaDialog: Item {
+ Timer {
+ interval: 1
+ running: true
+ onTriggered: {
+ var size = model.expectedUsage / 1024 / 1024
+ console.log("Creating database '" + model.displayName + "' of size " + size.toFixed(2) + " MB for " + model.origin.scheme + "://" + model.origin.host + ":" + model.origin.port)
+ model.accept(model.expectedUsage)
+ }
+ }
+ }
+ experimental.onEnterFullScreenRequested : {
+ navigationBar.visible = false;
+ Window.showFullScreen();
+ }
+ experimental.onExitFullScreenRequested : {
+ Window.showNormal();
+ navigationBar.visible = true;
+ }
+ }
+
+ ScrollIndicator {
+ flickableItem: webView
}
ViewportInfoItem {
diff --git a/Tools/MiniBrowser/qt/qml/CheckBox.qml b/Tools/MiniBrowser/qt/qml/CheckBox.qml
new file mode 100644
index 000000000..085b81113
--- /dev/null
+++ b/Tools/MiniBrowser/qt/qml/CheckBox.qml
@@ -0,0 +1,35 @@
+/*
+ * 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
+
+Item {
+ id: checkbox
+ width: 50
+ height: parent.height
+ property bool checked
+
+ Image {
+ width: 24
+ height: 24
+ source: parent.checked ? '../icons/checkbox_checked.png' : '../icons/checkbox_unchecked.png'
+ anchors.verticalCenter: parent.verticalCenter
+ }
+}
diff --git a/Tools/MiniBrowser/qt/qml/FilePicker.qml b/Tools/MiniBrowser/qt/qml/FilePicker.qml
new file mode 100644
index 000000000..222d4c31f
--- /dev/null
+++ b/Tools/MiniBrowser/qt/qml/FilePicker.qml
@@ -0,0 +1,217 @@
+/*
+ * 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
+import "../js/MultiSelect.js" as MultiSelect
+
+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 {
+
+ if (fileModel.allowMultipleFiles) {
+ checkbox.checked = !checkbox.checked
+
+ if (checkbox.checked)
+ MultiSelect.addValue(filePath)
+ else
+ MultiSelect.removeValue(filePath)
+ }
+ else
+ fileModel.accept(filePath)
+ }
+ }
+
+ height: 50
+ width: parent.width
+ color: folders.isFolder(index) ? "lightgray": "darkgray"
+
+ Item {
+ width: 50
+ height: 48
+ Image {
+ source: "../icons/folder.png"
+ anchors.centerIn: parent
+ visible: folders.isFolder(index)
+ }
+ }
+
+ Text {
+ id: fileNameText
+ anchors.centerIn: parent
+ anchors.leftMargin: 20
+ width: 300
+ text: fileName
+ elide: Text.ElideLeft;
+ }
+
+ CheckBox {
+ id: checkbox
+
+ anchors.right: parent.right
+ anchors.verticalCenter: parent.verticalCenter
+
+ checked: MultiSelect.isSelected(filePath)
+ visible: fileModel.allowMultipleFiles && !folders.isFolder(index)
+ }
+
+ 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
+ }
+
+ Row {
+ id: buttonRow
+ spacing: 10
+ anchors.horizontalCenter: parent.horizontalCenter
+ anchors.verticalCenter: parent.verticalCenter
+
+ DialogButton {
+ id: cancel
+ text: "Cancel"
+ onClicked: fileModel.reject()
+ }
+
+ DialogButton {
+ id: accept
+ text: "Ok"
+ visible: fileModel.allowMultipleFiles
+ onClicked:
+ fileModel.accept(MultiSelect.selectedValues());
+ }
+ }
+ }
+
+ function openFolder(path) {
+ folders.folder = path;
+ }
+
+ function up() {
+ folders.folder = folders.parentFolder;
+ }
+}
diff --git a/Tools/MiniBrowser/qt/qml/ScrollIndicator.qml b/Tools/MiniBrowser/qt/qml/ScrollIndicator.qml
new file mode 100644
index 000000000..9f100bed2
--- /dev/null
+++ b/Tools/MiniBrowser/qt/qml/ScrollIndicator.qml
@@ -0,0 +1,141 @@
+/*
+ * Copyright (C) 2012 Nokia Corporation and/or its subsidiary(-ies)
+ *
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE COMPUTER, INC. ``AS IS'' AND ANY
+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE COMPUTER, INC. OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
+ * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+import QtQuick 2.0
+
+Item {
+ id: root
+
+ property Flickable flickableItem
+
+ anchors {
+ fill: flickableItem
+ margins: 5
+ }
+
+ property bool __movingHorizontally: flickableItem ? flickableItem.movingHorizontally : false
+ property bool __movingVertically: flickableItem ? flickableItem.movingVertically : false
+
+ property real __viewWidth: flickableItem ? flickableItem.width - (anchors.margins * 2) : 0
+ property real __viewHeight: flickableItem ? flickableItem.height - (anchors.margins * 2) : 0
+
+ property int __hideTimeout: 800
+ property real __indicatorSize: 5
+ property real __indicatorBorder: 1
+
+ Item {
+ id: horizontalIndicator
+ opacity: 0
+
+ width: __viewWidth - __indicatorSize
+ height: __indicatorSize
+
+ anchors.bottom: root.bottom
+
+ Rectangle {
+ radius: 10
+ color: "black"
+ border.color: "gray"
+ border.width: 1
+ opacity: 0.5
+ smooth: true
+
+ width: flickableItem ? flickableItem.visibleArea.widthRatio * horizontalIndicator.width: 0;
+ height: __indicatorSize
+
+ x: flickableItem ? Math.min(parent.width - width, Math.max(0, flickableItem.visibleArea.xPosition * horizontalIndicator.width)) : 0;
+ y: 0
+ }
+
+ states: [
+ State {
+ name: "show"
+ when: __movingHorizontally
+ PropertyChanges {
+ target: horizontalIndicator
+ opacity: 1
+ }
+ }
+ ]
+
+ transitions: [
+ Transition {
+ NumberAnimation {
+ target: horizontalIndicator
+ properties: "opacity"
+ duration: __hideTimeout
+ }
+ }
+ ]
+ }
+
+ Item {
+ id: verticalIndicator
+ opacity: 0
+
+ width: __indicatorSize
+ height: __viewHeight - __indicatorSize
+
+ anchors.right: root.right
+
+ Rectangle {
+ radius: 10
+ color: "black"
+ border.color: "gray"
+ border.width: 1
+ opacity: 0.5
+ smooth: true;
+
+ width: __indicatorSize
+ height: flickableItem ? flickableItem.visibleArea.heightRatio * verticalIndicator.height : 0;
+
+ x: 0
+ y: flickableItem ? Math.min(parent.height - height, Math.max(0, flickableItem.visibleArea.yPosition * verticalIndicator.height)) : 0
+ }
+
+ states: [
+ State {
+ name: "show"
+ when: __movingVertically
+ PropertyChanges {
+ target: verticalIndicator
+ opacity: 1
+ }
+ }
+ ]
+
+ transitions: [
+ Transition {
+ NumberAnimation {
+ target: verticalIndicator
+ properties: "opacity"
+ duration: __hideTimeout
+ }
+ }
+ ]
+ }
+}
diff --git a/Tools/MiniBrowser/qt/useragentlist.txt b/Tools/MiniBrowser/qt/useragentlist.txt
deleted file mode 100644
index decf1043e..000000000
--- a/Tools/MiniBrowser/qt/useragentlist.txt
+++ /dev/null
@@ -1,13 +0,0 @@
-Mozilla/5.0 (X11; Linux i686) AppleWebKit/535.1 (KHTML, like Gecko) QtTestBrowser/0.1 Safari/535.1
-Mozilla/5.0 (SymbianOS/9.4; U; Series60/5.0) AppleWebKit/535.1 (KHTML, like Gecko) QtTestBrowser/0.1 Mobile Safari/535.1
-Mozilla/5.0 (Macintosh; PPC Mac OS X) AppleWebKit/125.2 (KHTML, like Gecko) Safari/125.8
-Mozilla/5.0 (Unknown; like Android 2.2; Intel Mac OS X 10_6) AppleWebKit/533.3 (KHTML, like Gecko) Version/4.0.3 Mobile Safari/533.3
-Mozilla/5.0 (iPhone; CPU OS 3_2 like Mac OS X) AppleWebKit/531.21.10 (KHTML, like Gecko) Version/4.0.4 Mobile/7B334b Safari/531.21.10
-Mozilla/5.0 (iPhone; U; CPU iPhone OS 4_0 like Mac OS X; en-us) AppleWebKit/532.9 (KHTML, like Gecko) Version/4.0.5 Mobile/8A293 Safari/6531.22.7
-Mozilla/5.0 (iPad; U; CPU OS 3_2 like Mac OS X; en-us) AppleWebKit/531.21.10 (KHTML, like Gecko) Version/4.0.4 Mobile/7B334b Safari/531.21.10
-Opera/9.80 (Windows NT 6.0; U; en) Presto/2.8.99 Version/11.10
-Mozilla/5.0 (SymbianOS/9.4; U; Series60/5.0 Nokia5800d-1b/20.2.014; Profile/MIDP-2.1 Configuration/CLDC-1.1) AppleWebKit/413 (KHTML, like Gecko) Safari/413
-Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.2; Trident/4.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; Media Center PC 6.0)
-Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)
-Mozilla/5.0 (Windows; Windows NT 5.1) AppleWebKit/534.24 (KHTML, like Gecko) Chrome/11.0.696.68 Safari/534.24
-Mozilla/5.0 (Windows NT 6.1; rv:2.0.1) Gecko/20100101 Firefox/4.0.1