diff options
author | Simon Hausmann <simon.hausmann@nokia.com> | 2012-05-07 11:21:11 +0200 |
---|---|---|
committer | Simon Hausmann <simon.hausmann@nokia.com> | 2012-05-07 11:21:11 +0200 |
commit | 2cf6c8816a73e0132bd8fa3b509d62d7c51b6e47 (patch) | |
tree | 988e8c5b116dd0466244ae2fe5af8ee9be926d76 /Tools/MiniBrowser | |
parent | dd91e772430dc294e3bf478c119ef8d43c0a3358 (diff) | |
download | qtwebkit-2cf6c8816a73e0132bd8fa3b509d62d7c51b6e47.tar.gz |
Imported WebKit commit 7e538425aa020340619e927792f3d895061fb54b (http://svn.webkit.org/repository/webkit/trunk@116286)
Diffstat (limited to 'Tools/MiniBrowser')
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 Binary files differnew file mode 100644 index 000000000..cbf06f651 --- /dev/null +++ b/Tools/MiniBrowser/qt/icons/checkbox_checked.png diff --git a/Tools/MiniBrowser/qt/icons/checkbox_unchecked.png b/Tools/MiniBrowser/qt/icons/checkbox_unchecked.png Binary files differnew file mode 100644 index 000000000..5f5465582 --- /dev/null +++ b/Tools/MiniBrowser/qt/icons/checkbox_unchecked.png diff --git a/Tools/MiniBrowser/qt/icons/folder.png b/Tools/MiniBrowser/qt/icons/folder.png Binary files differnew file mode 100644 index 000000000..e53e2ad46 --- /dev/null +++ b/Tools/MiniBrowser/qt/icons/folder.png diff --git a/Tools/MiniBrowser/qt/icons/titlebar.png b/Tools/MiniBrowser/qt/icons/titlebar.png Binary files differnew file mode 100644 index 000000000..f3d18aa82 --- /dev/null +++ b/Tools/MiniBrowser/qt/icons/titlebar.png diff --git a/Tools/MiniBrowser/qt/icons/up.png b/Tools/MiniBrowser/qt/icons/up.png Binary files differnew file mode 100644 index 000000000..b05f8025d --- /dev/null +++ b/Tools/MiniBrowser/qt/icons/up.png 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 |