summaryrefslogtreecommitdiff
path: root/Source/WebKit2/UIProcess/API
diff options
context:
space:
mode:
authorSimon Hausmann <simon.hausmann@nokia.com>2012-05-11 09:43:24 +0200
committerSimon Hausmann <simon.hausmann@nokia.com>2012-05-11 09:43:24 +0200
commit1b914638db989aaa98631a1c1e02c7b2d44805d8 (patch)
tree87f4fd2c7b38db320079a5de8877890d2ca3c485 /Source/WebKit2/UIProcess/API
parent2cf6c8816a73e0132bd8fa3b509d62d7c51b6e47 (diff)
downloadqtwebkit-1b914638db989aaa98631a1c1e02c7b2d44805d8.tar.gz
Imported WebKit commit 9a52e27980f47e8b0d8f8b7cc0fd7b5741bceb92 (http://svn.webkit.org/repository/webkit/trunk@116736)
New snapshot to include QDeclarative* -> QQml* build fixes
Diffstat (limited to 'Source/WebKit2/UIProcess/API')
-rw-r--r--Source/WebKit2/UIProcess/API/C/WKPage.h22
-rw-r--r--Source/WebKit2/UIProcess/API/gtk/WebKitLoaderClient.cpp4
-rw-r--r--Source/WebKit2/UIProcess/API/gtk/WebKitSettings.cpp122
-rw-r--r--Source/WebKit2/UIProcess/API/gtk/WebKitSettings.h13
-rw-r--r--Source/WebKit2/UIProcess/API/gtk/docs/webkit2gtk-sections.txt4
-rw-r--r--Source/WebKit2/UIProcess/API/gtk/tests/TestResources.cpp2
-rw-r--r--Source/WebKit2/UIProcess/API/gtk/tests/TestWebKitSettings.cpp10
-rw-r--r--Source/WebKit2/UIProcess/API/qt/qquickwebview.cpp315
-rw-r--r--Source/WebKit2/UIProcess/API/qt/qquickwebview_p.h72
-rw-r--r--Source/WebKit2/UIProcess/API/qt/qquickwebview_p_p.h45
-rw-r--r--Source/WebKit2/UIProcess/API/qt/qwebiconimageprovider.cpp2
-rw-r--r--Source/WebKit2/UIProcess/API/qt/qwebiconimageprovider_p.h2
-rw-r--r--Source/WebKit2/UIProcess/API/qt/qwebviewportinfo.cpp6
-rw-r--r--Source/WebKit2/UIProcess/API/qt/qwebviewportinfo_p.h2
-rw-r--r--Source/WebKit2/UIProcess/API/qt/tests/qmltests/WebView/tst_evaluateJavaScript.qml87
-rw-r--r--Source/WebKit2/UIProcess/API/qt/tests/tests.pri2
16 files changed, 560 insertions, 150 deletions
diff --git a/Source/WebKit2/UIProcess/API/C/WKPage.h b/Source/WebKit2/UIProcess/API/C/WKPage.h
index a6d8a661a..aeefee796 100644
--- a/Source/WebKit2/UIProcess/API/C/WKPage.h
+++ b/Source/WebKit2/UIProcess/API/C/WKPage.h
@@ -27,6 +27,7 @@
#define WKPage_h
#include <WebKit2/WKBase.h>
+#include <WebKit2/WKError.h>
#include <WebKit2/WKEvent.h>
#include <WebKit2/WKFindOptions.h>
#include <WebKit2/WKGeometry.h>
@@ -69,9 +70,12 @@ typedef bool (*WKPageCanAuthenticateAgainstProtectionSpaceInFrameCallback)(WKPag
typedef void (*WKPageDidReceiveAuthenticationChallengeInFrameCallback)(WKPageRef page, WKFrameRef frame, WKAuthenticationChallengeRef authenticationChallenge, const void *clientInfo);
typedef void (*WKPageDidChangeBackForwardListCallback)(WKPageRef page, WKBackForwardListItemRef addedItem, WKArrayRef removedItems, const void *clientInfo);
typedef bool (*WKPageShouldGoToBackForwardListItemCallback)(WKPageRef page, WKBackForwardListItemRef item, const void *clientInfo);
-typedef void (*WKPageDidFailToInitializePluginCallback)(WKPageRef page, WKStringRef mimeType, const void* clientInfo);
typedef void (*WKPageDidNewFirstVisuallyNonEmptyLayoutCallback)(WKPageRef page, WKTypeRef userData, const void *clientInfo);
typedef void (*WKPageWillGoToBackForwardListItemCallback)(WKPageRef page, WKBackForwardListItemRef item, WKTypeRef userData, const void *clientInfo);
+typedef void (*WKPagePluginDidFailCallback)(WKPageRef page, WKErrorCode errorCode, WKStringRef mimeType, const void* clientInfo);
+
+// Deprecated
+typedef void (*WKPageDidFailToInitializePluginCallback_deprecatedForUseWithV0)(WKPageRef page, WKStringRef mimeType, const void* clientInfo);
struct WKPageLoaderClient {
int version;
@@ -104,7 +108,7 @@ struct WKPageLoaderClient {
WKPageCallback processDidCrash;
WKPageDidChangeBackForwardListCallback didChangeBackForwardList;
WKPageShouldGoToBackForwardListItemCallback shouldGoToBackForwardListItem;
- WKPageDidFailToInitializePluginCallback didFailToInitializePlugin;
+ WKPageDidFailToInitializePluginCallback_deprecatedForUseWithV0 didFailToInitializePlugin_deprecatedForUseWithV0;
// Version 1
WKPageDidDetectXSSForFrameCallback didDetectXSSForFrame;
@@ -115,6 +119,7 @@ struct WKPageLoaderClient {
WKPageWillGoToBackForwardListItemCallback willGoToBackForwardListItem;
WKPageCallback interactionOccurredWhileProcessUnresponsive;
+ WKPagePluginDidFailCallback pluginDidFail;
};
typedef struct WKPageLoaderClient WKPageLoaderClient;
@@ -172,6 +177,13 @@ typedef struct WKPageResourceLoadClient WKPageResourceLoadClient;
enum { kWKPageResourceLoadClientCurrentVersion = 0 };
+enum {
+ kWKPluginUnavailabilityReasonPluginMissing,
+ kWKPluginUnavailabilityReasonPluginCrashed,
+ kWKPluginUnavailabilityReasonInsecurePluginVersion
+};
+typedef uint32_t WKPluginUnavailabilityReason;
+
// UI Client
typedef WKPageRef (*WKPageCreateNewPageCallback)(WKPageRef page, WKURLRequestRef urlRequest, WKDictionaryRef features, WKEventModifiers modifiers, WKEventMouseButton mouseButton, const void *clientInfo);
typedef void (*WKPageRunJavaScriptAlertCallback)(WKPageRef page, WKStringRef alertText, WKFrameRef frame, const void *clientInfo);
@@ -182,7 +194,6 @@ typedef void (*WKPageFocusCallback)(WKPageRef page, const void *clientInfo);
typedef void (*WKPageUnfocusCallback)(WKPageRef page, const void *clientInfo);
typedef void (*WKPageSetStatusTextCallback)(WKPageRef page, WKStringRef text, const void *clientInfo);
typedef void (*WKPageMouseDidMoveOverElementCallback)(WKPageRef page, WKHitTestResultRef hitTestResult, WKEventModifiers modifiers, WKTypeRef userData, const void *clientInfo);
-typedef void (*WKPageMissingPluginButtonClickedCallback)(WKPageRef page, WKStringRef mimeType, WKStringRef url, WKStringRef pluginsPageURL, const void* clientInfo);
typedef void (*WKPageDidNotHandleKeyEventCallback)(WKPageRef page, WKNativeEventPtr event, const void *clientInfo);
typedef void (*WKPageDidNotHandleWheelEventCallback)(WKPageRef page, WKNativeEventPtr event, const void *clientInfo);
typedef bool (*WKPageGetToolbarsAreVisibleCallback)(WKPageRef page, const void *clientInfo);
@@ -207,10 +218,12 @@ typedef void (*WKPagePrintFrameCallback)(WKPageRef page, WKFrameRef frame, const
typedef void (*WKPageSaveDataToFileInDownloadsFolderCallback)(WKPageRef page, WKStringRef suggestedFilename, WKStringRef mimeType, WKURLRef originatingURL, WKDataRef data, const void* clientInfo);
typedef bool (*WKPageShouldInterruptJavaScriptCallback)(WKPageRef page, const void *clientInfo);
typedef void (*WKPageDecidePolicyForNotificationPermissionRequestCallback)(WKPageRef page, WKSecurityOriginRef origin, WKNotificationPermissionRequestRef permissionRequest, const void *clientInfo);
+typedef void (*WKPageUnavailablePluginButtonClickedCallback)(WKPageRef page, WKPluginUnavailabilityReason pluginUnavailabilityReason, WKStringRef mimeType, WKStringRef url, WKStringRef pluginsPageURL, const void* clientInfo);
// Deprecated
typedef WKPageRef (*WKPageCreateNewPageCallback_deprecatedForUseWithV0)(WKPageRef page, WKDictionaryRef features, WKEventModifiers modifiers, WKEventMouseButton mouseButton, const void *clientInfo);
typedef void (*WKPageMouseDidMoveOverElementCallback_deprecatedForUseWithV0)(WKPageRef page, WKEventModifiers modifiers, WKTypeRef userData, const void *clientInfo);
+typedef void (*WKPageMissingPluginButtonClickedCallback_deprecatedForUseWithV0)(WKPageRef page, WKStringRef mimeType, WKStringRef url, WKStringRef pluginsPageURL, const void* clientInfo);
struct WKPageUIClient {
int version;
@@ -228,7 +241,7 @@ struct WKPageUIClient {
WKPageRunJavaScriptPromptCallback runJavaScriptPrompt;
WKPageSetStatusTextCallback setStatusText;
WKPageMouseDidMoveOverElementCallback_deprecatedForUseWithV0 mouseDidMoveOverElement_deprecatedForUseWithV0;
- WKPageMissingPluginButtonClickedCallback missingPluginButtonClicked;
+ WKPageMissingPluginButtonClickedCallback_deprecatedForUseWithV0 missingPluginButtonClicked_deprecatedForUseWithV0;
WKPageDidNotHandleKeyEventCallback didNotHandleKeyEvent;
WKPageDidNotHandleWheelEventCallback didNotHandleWheelEvent;
WKPageGetToolbarsAreVisibleCallback toolbarsAreVisible;
@@ -261,6 +274,7 @@ struct WKPageUIClient {
WKPageCreateNewPageCallback createNewPage;
WKPageMouseDidMoveOverElementCallback mouseDidMoveOverElement;
WKPageDecidePolicyForNotificationPermissionRequestCallback decidePolicyForNotificationPermissionRequest;
+ WKPageUnavailablePluginButtonClickedCallback unavailablePluginButtonClicked;
};
typedef struct WKPageUIClient WKPageUIClient;
diff --git a/Source/WebKit2/UIProcess/API/gtk/WebKitLoaderClient.cpp b/Source/WebKit2/UIProcess/API/gtk/WebKitLoaderClient.cpp
index c26d8ebe9..9476255c8 100644
--- a/Source/WebKit2/UIProcess/API/gtk/WebKitLoaderClient.cpp
+++ b/Source/WebKit2/UIProcess/API/gtk/WebKitLoaderClient.cpp
@@ -145,7 +145,9 @@ void attachLoaderClientToView(WebKitWebView* webView)
0, // shouldGoToBackForwardListItem
0, // didFailToInitializePlugin
0, // didDetectXSSForFrame
- 0 // didFirstVisuallyNonEmptyLayoutForFrame
+ 0, // didFirstVisuallyNonEmptyLayoutForFrame
+ 0, // willGoToBackForwardListItem
+ 0 // interactionOccurredWhileProcessUnresponsive
};
WKPageRef wkPage = toAPI(webkitWebViewBaseGetPage(WEBKIT_WEB_VIEW_BASE(webView)));
WKPageSetPageLoaderClient(wkPage, &wkLoaderClient);
diff --git a/Source/WebKit2/UIProcess/API/gtk/WebKitSettings.cpp b/Source/WebKit2/UIProcess/API/gtk/WebKitSettings.cpp
index 8bec722b3..5c027044b 100644
--- a/Source/WebKit2/UIProcess/API/gtk/WebKitSettings.cpp
+++ b/Source/WebKit2/UIProcess/API/gtk/WebKitSettings.cpp
@@ -106,7 +106,9 @@ enum {
PROP_ENABLE_WEBAUDIO,
PROP_ENABLE_WEBGL,
PROP_ZOOM_TEXT_ONLY,
- PROP_JAVASCRIPT_CAN_ACCESS_CLIPBOARD
+ PROP_JAVASCRIPT_CAN_ACCESS_CLIPBOARD,
+ PROP_MEDIA_PLAYBACK_REQUIRES_USER_GESTURE,
+ PROP_MEDIA_PLAYBACK_ALLOWS_INLINE
};
static void webKitSettingsSetProperty(GObject* object, guint propId, const GValue* value, GParamSpec* paramSpec)
@@ -219,6 +221,12 @@ static void webKitSettingsSetProperty(GObject* object, guint propId, const GValu
case PROP_JAVASCRIPT_CAN_ACCESS_CLIPBOARD:
webkit_settings_set_javascript_can_access_clipboard(settings, g_value_get_boolean(value));
break;
+ case PROP_MEDIA_PLAYBACK_REQUIRES_USER_GESTURE:
+ webkit_settings_set_media_playback_requires_user_gesture(settings, g_value_get_boolean(value));
+ break;
+ case PROP_MEDIA_PLAYBACK_ALLOWS_INLINE:
+ webkit_settings_set_media_playback_allows_inline(settings, g_value_get_boolean(value));
+ break;
default:
G_OBJECT_WARN_INVALID_PROPERTY_ID(object, propId, paramSpec);
break;
@@ -335,6 +343,12 @@ static void webKitSettingsGetProperty(GObject* object, guint propId, GValue* val
case PROP_JAVASCRIPT_CAN_ACCESS_CLIPBOARD:
g_value_set_boolean(value, webkit_settings_get_javascript_can_access_clipboard(settings));
break;
+ case PROP_MEDIA_PLAYBACK_REQUIRES_USER_GESTURE:
+ g_value_set_boolean(value, webkit_settings_get_media_playback_requires_user_gesture(settings));
+ break;
+ case PROP_MEDIA_PLAYBACK_ALLOWS_INLINE:
+ g_value_set_boolean(value, webkit_settings_get_media_playback_allows_inline(settings));
+ break;
default:
G_OBJECT_WARN_INVALID_PROPERTY_ID(object, propId, paramSpec);
break;
@@ -862,6 +876,38 @@ static void webkit_settings_class_init(WebKitSettingsClass* klass)
FALSE,
readWriteConstructParamFlags));
+ /**
+ * WebKitSettings:media-playback-requires-user-gesture:
+ *
+ * Whether a user gesture (such as clicking the play button)
+ * would be required to start media playback or load media. This is off
+ * by default, so media playback could start automatically.
+ * Setting it on requires a gesture by the user to start playback, or to
+ * load the media.
+ */
+ g_object_class_install_property(gObjectClass,
+ PROP_MEDIA_PLAYBACK_REQUIRES_USER_GESTURE,
+ g_param_spec_boolean("media-playback-requires-user-gesture",
+ _("Media playback requires user gesture"),
+ _("Whether media playback requires user gesture"),
+ FALSE,
+ readWriteConstructParamFlags));
+
+ /**
+ * WebKitSettings:media-playback-allows-inline
+ *
+ * Whether media playback is full-screen only or inline playback is allowed.
+ * This is %TRUE by default, so media playback can be inline. Setting it to
+ * %FALSE allows specifying that media playback should be always fullscreen.
+ */
+ g_object_class_install_property(gObjectClass,
+ PROP_MEDIA_PLAYBACK_ALLOWS_INLINE,
+ g_param_spec_boolean("media-playback-allows-inline",
+ _("Media playback allows inline"),
+ _("Whether media playback allows inline"),
+ TRUE,
+ readWriteConstructParamFlags));
+
g_type_class_add_private(klass, sizeof(WebKitSettingsPrivate));
}
@@ -2193,3 +2239,77 @@ void webkit_settings_set_javascript_can_access_clipboard(WebKitSettings* setting
g_object_notify(G_OBJECT(settings), "javascript-can-access-clipboard");
}
+
+/**
+ * webkit_settings_set_media_playback_requires_user_gesture:
+ * @settings: a #WebKitSettings
+ * @enabled: Value to be set
+ *
+ * Set the #WebKitSettings:media-playback-requires-user-gesture property.
+ */
+void webkit_settings_set_media_playback_requires_user_gesture(WebKitSettings* settings, gboolean enabled)
+{
+ g_return_if_fail(WEBKIT_IS_SETTINGS(settings));
+
+ WebKitSettingsPrivate* priv = settings->priv;
+ bool currentValue = WKPreferencesGetMediaPlaybackRequiresUserGesture(priv->preferences.get());
+ if (currentValue == enabled)
+ return;
+
+ WKPreferencesSetMediaPlaybackRequiresUserGesture(priv->preferences.get(), enabled);
+
+ g_object_notify(G_OBJECT(settings), "media-playback-requires-user-gesture");
+}
+
+/**
+ * webkit_settings_get_media_playback_requires_user_gesture:
+ * @settings: a #WebKitSettings
+ *
+ * Get the #WebKitSettings:media-playback-requires-user-gesture property.
+ *
+ * Returns: %TRUE If an user gesture is needed to play or load media
+ * or %FALSE if no user gesture is needed.
+ */
+gboolean webkit_settings_get_media_playback_requires_user_gesture(WebKitSettings* settings)
+{
+ g_return_val_if_fail(WEBKIT_IS_SETTINGS(settings), FALSE);
+
+ return WKPreferencesGetMediaPlaybackRequiresUserGesture(settings->priv->preferences.get());
+}
+
+/**
+ * webkit_settings_set_media_playback_allows_inline:
+ * @settings: a #WebKitSettings
+ * @enabled: Value to be set
+ *
+ * Set the #WebKitSettings:media-playback-allows-inline property.
+ */
+void webkit_settings_set_media_playback_allows_inline(WebKitSettings* settings, gboolean enabled)
+{
+ g_return_if_fail(WEBKIT_IS_SETTINGS(settings));
+
+ WebKitSettingsPrivate* priv = settings->priv;
+ bool currentValue = WKPreferencesGetMediaPlaybackAllowsInline(priv->preferences.get());
+ if (currentValue == enabled)
+ return;
+
+ WKPreferencesSetMediaPlaybackAllowsInline(priv->preferences.get(), enabled);
+
+ g_object_notify(G_OBJECT(settings), "media-playback-allows-inline");
+}
+
+/**
+ * webkit_settings_get_media_playback_allows_inline:
+ * @settings: a #WebKitSettings
+ *
+ * Get the #WebKitSettings:media-playback-allows-inline property.
+ *
+ * Returns: %TRUE If inline playback is allowed for media
+ * or %FALSE if only fullscreen playback is allowed.
+ */
+gboolean webkit_settings_get_media_playback_allows_inline(WebKitSettings* settings)
+{
+ g_return_val_if_fail(WEBKIT_IS_SETTINGS(settings), TRUE);
+
+ return WKPreferencesGetMediaPlaybackAllowsInline(settings->priv->preferences.get());
+}
diff --git a/Source/WebKit2/UIProcess/API/gtk/WebKitSettings.h b/Source/WebKit2/UIProcess/API/gtk/WebKitSettings.h
index 57bf3f17d..fda7089d0 100644
--- a/Source/WebKit2/UIProcess/API/gtk/WebKitSettings.h
+++ b/Source/WebKit2/UIProcess/API/gtk/WebKitSettings.h
@@ -321,6 +321,19 @@ WEBKIT_API void
webkit_settings_set_javascript_can_access_clipboard (WebKitSettings *settings,
gboolean enabled);
+WEBKIT_API gboolean
+webkit_settings_get_media_playback_requires_user_gesture (WebKitSettings *settings);
+
+WEBKIT_API void
+webkit_settings_set_media_playback_requires_user_gesture (WebKitSettings *settings,
+ gboolean enabled);
+
+WEBKIT_API gboolean
+webkit_settings_get_media_playback_allows_inline (WebKitSettings *settings);
+
+WEBKIT_API void
+webkit_settings_set_media_playback_allows_inline (WebKitSettings *settings,
+ gboolean enabled);
G_END_DECLS
#endif /* WebKitSettings_h */
diff --git a/Source/WebKit2/UIProcess/API/gtk/docs/webkit2gtk-sections.txt b/Source/WebKit2/UIProcess/API/gtk/docs/webkit2gtk-sections.txt
index dc5e65ac6..f5e15d9b2 100644
--- a/Source/WebKit2/UIProcess/API/gtk/docs/webkit2gtk-sections.txt
+++ b/Source/WebKit2/UIProcess/API/gtk/docs/webkit2gtk-sections.txt
@@ -251,6 +251,10 @@ webkit_settings_get_zoom_text_only
webkit_settings_set_zoom_text_only
webkit_settings_get_javascript_can_access_clipboard
webkit_settings_set_javascript_can_access_clipboard
+webkit_settings_get_media_playback_requires_user_gesture
+webkit_settings_set_media_playback_requires_user_gesture
+webkit_settings_get_media_playback_allows_inline
+webkit_settings_set_media_playback_allows_inline
<SUBSECTION Standard>
WebKitSettingsClass
diff --git a/Source/WebKit2/UIProcess/API/gtk/tests/TestResources.cpp b/Source/WebKit2/UIProcess/API/gtk/tests/TestResources.cpp
index cc272c9e8..e08cfb9c9 100644
--- a/Source/WebKit2/UIProcess/API/gtk/tests/TestResources.cpp
+++ b/Source/WebKit2/UIProcess/API/gtk/tests/TestResources.cpp
@@ -207,7 +207,7 @@ static void testWebViewResources(ResourcesTest* test, gconstpointer)
#endif
// Reload.
- webkit_web_view_reload(test->m_webView);
+ webkit_web_view_reload_bypass_cache(test->m_webView);
test->waitUntilResourcesLoaded(4);
}
diff --git a/Source/WebKit2/UIProcess/API/gtk/tests/TestWebKitSettings.cpp b/Source/WebKit2/UIProcess/API/gtk/tests/TestWebKitSettings.cpp
index 19491c201..ad03444ae 100644
--- a/Source/WebKit2/UIProcess/API/gtk/tests/TestWebKitSettings.cpp
+++ b/Source/WebKit2/UIProcess/API/gtk/tests/TestWebKitSettings.cpp
@@ -209,6 +209,16 @@ static void testWebKitSettings(Test*, gconstpointer)
webkit_settings_set_javascript_can_access_clipboard(settings, TRUE);
g_assert(webkit_settings_get_javascript_can_access_clipboard(settings));
+ // By default, media playback doesn't require user gestures.
+ g_assert(!webkit_settings_get_media_playback_requires_user_gesture(settings));
+ webkit_settings_set_media_playback_requires_user_gesture(settings, TRUE);
+ g_assert(webkit_settings_get_media_playback_requires_user_gesture(settings));
+
+ // By default, inline media playback is allowed
+ g_assert(webkit_settings_get_media_playback_allows_inline(settings));
+ webkit_settings_set_media_playback_allows_inline(settings, FALSE);
+ g_assert(!webkit_settings_get_media_playback_allows_inline(settings));
+
g_object_unref(G_OBJECT(settings));
}
diff --git a/Source/WebKit2/UIProcess/API/qt/qquickwebview.cpp b/Source/WebKit2/UIProcess/API/qt/qquickwebview.cpp
index b1b465526..167c50f6a 100644
--- a/Source/WebKit2/UIProcess/API/qt/qquickwebview.cpp
+++ b/Source/WebKit2/UIProcess/API/qt/qquickwebview.cpp
@@ -27,6 +27,7 @@
#include "QtDownloadManager.h"
#include "QtViewportInteractionEngine.h"
#include "QtWebContext.h"
+#include "QtWebError.h"
#include "QtWebIconDatabaseClient.h"
#include "QtWebPageEventHandler.h"
#include "QtWebPageLoadClient.h"
@@ -52,10 +53,14 @@
#include "qwebviewportinfo_p.h"
#include <JavaScriptCore/InitializeThreading.h>
+#include <JavaScriptCore/JSBase.h>
+#include <JavaScriptCore/JSRetainPtr.h>
#include <QDateTime>
+#include <QtQml/QJSValue>
+#include <WKOpenPanelResultListener.h>
+#include <WKSerializedScriptValue.h>
#include <WebCore/IntPoint.h>
#include <WebCore/IntRect.h>
-#include <WKOpenPanelResultListener.h>
#include <wtf/Assertions.h>
#include <wtf/MainThread.h>
#include <wtf/text/WTFString.h>
@@ -68,6 +73,105 @@ static const int kAxisLockSampleCount = 5;
static const qreal kAxisLockVelocityThreshold = 300;
static const qreal kAxisLockVelocityDirectionThreshold = 50;
+struct JSCallbackClosure {
+ QPointer<QObject> receiver;
+ QByteArray method;
+ QJSValue value;
+};
+
+static inline QString toQString(JSStringRef string)
+{
+ return QString(reinterpret_cast<const QChar*>(JSStringGetCharactersPtr(string)), JSStringGetLength(string));
+}
+
+static inline QJSValue toQJSValue(JSStringRef string)
+{
+ return QJSValue(toQString(string));
+}
+
+static QJSValue buildQJSValue(QJSEngine* engine, JSGlobalContextRef context, JSValueRef value, int depth)
+{
+ QJSValue var;
+ JSValueRef exception = 0;
+
+ if (depth > 10)
+ return var;
+
+ switch (JSValueGetType(context, value)) {
+ case kJSTypeBoolean:
+ var = QJSValue(JSValueToBoolean(context, value));
+ break;
+ case kJSTypeNumber:
+ {
+ double number = JSValueToNumber(context, value, &exception);
+ if (!exception)
+ var = QJSValue(number);
+ }
+ break;
+ case kJSTypeString:
+ {
+ JSRetainPtr<JSStringRef> string = JSValueToStringCopy(context, value, &exception);
+ if (!exception)
+ var = toQJSValue(string.get());
+ }
+ break;
+ case kJSTypeObject:
+ {
+ JSObjectRef obj = JSValueToObject(context, value, &exception);
+
+ JSPropertyNameArrayRef names = JSObjectCopyPropertyNames(context, obj);
+ size_t length = JSPropertyNameArrayGetCount(names);
+
+ var = engine->newObject();
+
+ for (size_t i = 0; i < length; ++i) {
+ JSRetainPtr<JSStringRef> name = JSPropertyNameArrayGetNameAtIndex(names, i);
+ JSValueRef property = JSObjectGetProperty(context, obj, name.get(), &exception);
+
+ if (!exception) {
+ QJSValue value = buildQJSValue(engine, context, property, depth + 1);
+ var.setProperty(toQString(name.get()), value);
+ }
+ }
+ }
+ break;
+ }
+ return var;
+}
+
+static void javaScriptCallback(WKSerializedScriptValueRef valueRef, WKErrorRef, void* data)
+{
+ JSCallbackClosure* closure = reinterpret_cast<JSCallbackClosure*>(data);
+
+ if (closure->method.size())
+ QMetaObject::invokeMethod(closure->receiver, closure->method);
+ else {
+ QJSValue function = closure->value;
+
+ // If a callable function is supplied, we build a JavaScript value accessible
+ // in the QML engine, and calls the function with that.
+ if (function.isCallable()) {
+ QJSValue var;
+ if (valueRef) {
+ // FIXME: Slow but OK for now.
+ JSGlobalContextRef context = JSGlobalContextCreate(0);
+
+ JSValueRef exception = 0;
+ JSValueRef value = WKSerializedScriptValueDeserialize(valueRef, context, &exception);
+ var = buildQJSValue(function.engine(), context, value, /* depth */ 0);
+
+ JSGlobalContextRelease(context);
+ }
+
+ QList<QJSValue> args;
+ args.append(var);
+ function.call(args);
+ }
+ }
+
+ delete closure;
+}
+
static QQuickWebViewPrivate* createPrivateObject(QQuickWebView* publicObject)
{
if (s_flickableViewportEnabled)
@@ -162,6 +266,7 @@ QQuickWebViewPrivate::QQuickWebViewPrivate(QQuickWebView* viewport)
, m_navigatorQtObjectEnabled(false)
, m_renderToOffscreenBuffer(false)
, m_dialogActive(false)
+ , m_loadProgress(0)
{
viewport->setClip(true);
viewport->setPixelAligned(true);
@@ -230,20 +335,72 @@ QPointF QQuickWebViewPrivate::pageItemPos()
\qmlsignal WebView::loadingChanged(WebLoadRequest request)
*/
+void QQuickWebViewPrivate::provisionalLoadDidStart(const QUrl& url)
+{
+ Q_Q(QQuickWebView);
+
+ QWebLoadRequest loadRequest(url, QQuickWebView::LoadStartedStatus);
+ emit q->loadingChanged(&loadRequest);
+}
+
+void QQuickWebViewPrivate::loadDidCommit()
+{
+ Q_Q(QQuickWebView);
+ ASSERT(q->loading());
+
+ emit q->navigationHistoryChanged();
+ emit q->urlChanged();
+ emit q->titleChanged();
+}
+
+void QQuickWebViewPrivate::didSameDocumentNavigation()
+{
+ Q_Q(QQuickWebView);
+
+ emit q->navigationHistoryChanged();
+ emit q->urlChanged();
+}
+
+void QQuickWebViewPrivate::titleDidChange()
+{
+ Q_Q(QQuickWebView);
+
+ emit q->titleChanged();
+}
+
+void QQuickWebViewPrivate::loadProgressDidChange(int loadProgress)
+{
+ Q_Q(QQuickWebView);
+
+ if (!loadProgress)
+ setIcon(QUrl());
+
+ m_loadProgress = loadProgress;
+
+ emit q->loadProgressChanged();
+}
+
+void QQuickWebViewPrivate::backForwardListDidChange()
+{
+ navigationHistory->d->reset();
+}
+
void QQuickWebViewPrivate::loadDidSucceed()
{
Q_Q(QQuickWebView);
ASSERT(!q->loading());
+
QWebLoadRequest loadRequest(q->url(), QQuickWebView::LoadSucceededStatus);
emit q->loadingChanged(&loadRequest);
}
-void QQuickWebViewPrivate::onComponentComplete()
+void QQuickWebViewPrivate::loadDidFail(const QtWebError& error)
{
- if (m_deferedUrlToLoad.isEmpty())
- return;
+ Q_Q(QQuickWebView);
+ ASSERT(!q->loading());
- q_ptr->setUrl(m_deferedUrlToLoad);
+ QWebLoadRequest loadRequest(error.url(), QQuickWebView::LoadFailedStatus, error.description(), static_cast<QQuickWebView::ErrorDomain>(error.type()), error.errorCode());
+ emit q->loadingChanged(&loadRequest);
}
void QQuickWebViewPrivate::setNeedsDisplay()
@@ -269,18 +426,22 @@ void QQuickWebViewPrivate::_q_onIconChangedForPageURL(const QUrl& pageURL, const
setIcon(iconURL);
}
-void QQuickWebViewPrivate::didChangeBackForwardList()
-{
- navigationHistory->d->reset();
-}
-
void QQuickWebViewPrivate::processDidCrash()
{
- pageView->eventHandler()->resetGestureRecognizers();
- pageLoadClient->completeLoadWhenProcessDidCrashIfNeeded();
+ Q_Q(QQuickWebView);
QUrl url(KURL(WebCore::ParsedURLString, webPageProxy->urlAtProcessExit()));
qWarning("WARNING: The web process experienced a crash on '%s'.", qPrintable(url.toString(QUrl::RemoveUserInfo)));
+
+ pageView->eventHandler()->resetGestureRecognizers();
+
+ // Check if loading was ongoing, when process crashed.
+ if (m_loadProgress > 0 && m_loadProgress < 100) {
+ QWebLoadRequest loadRequest(url, QQuickWebView::LoadFailedStatus, QLatin1String("The web process crashed."), QQuickWebView::InternalErrorDomain, 0);
+
+ loadProgressDidChange(100);
+ emit q->loadingChanged(&loadRequest);
+ }
}
void QQuickWebViewPrivate::didRelaunchProcess()
@@ -328,7 +489,7 @@ void QQuickWebViewPrivate::_q_onReceivedResponseFromDownload(QWebDownloadItem* d
return;
Q_Q(QQuickWebView);
- QDeclarativeEngine::setObjectOwnership(downloadItem, QDeclarativeEngine::JavaScriptOwnership);
+ QQmlEngine::setObjectOwnership(downloadItem, QQmlEngine::JavaScriptOwnership);
emit q->experimental()->downloadRequested(downloadItem);
}
@@ -626,7 +787,6 @@ void QQuickWebViewLegacyPrivate::setZoomFactor(qreal factor)
QQuickWebViewFlickablePrivate::QQuickWebViewFlickablePrivate(QQuickWebView* viewport)
: QQuickWebViewPrivate(viewport)
, pageIsSuspended(true)
- , loadSuccessDispatchIsPending(false)
{
// Disable mouse events on the flickable web view so we do not
// select text during pan gestures on platforms which send both
@@ -689,44 +849,16 @@ void QQuickWebViewFlickablePrivate::onComponentComplete()
_q_resume();
- if (loadSuccessDispatchIsPending) {
- QQuickWebViewPrivate::loadDidSucceed();
- loadSuccessDispatchIsPending = false;
- }
-
// Trigger setting of correct visibility flags after everything was allocated and initialized.
_q_onVisibleChanged();
-
- QQuickWebViewPrivate::onComponentComplete();
-}
-
-void QQuickWebViewFlickablePrivate::loadDidSucceed()
-{
- if (interactionEngine)
- QQuickWebViewPrivate::loadDidSucceed();
- else
- loadSuccessDispatchIsPending = true;
-}
-
-void QQuickWebViewFlickablePrivate::loadDidCommit()
-{
- // Due to entering provisional load before committing, we
- // might actually be suspended here.
-}
-
-void QQuickWebViewFlickablePrivate::didFinishFirstNonEmptyLayout()
-{
}
void QQuickWebViewFlickablePrivate::didChangeViewportProperties(const WebCore::ViewportAttributes& newAttributes)
{
Q_Q(QQuickWebView);
- QSize viewportSize = q->boundingRect().size().toSize();
-
// FIXME: Revise these when implementing fit-to-width.
WebCore::ViewportAttributes attr = newAttributes;
- WebCore::restrictMinimumScaleFactorToViewportSize(attr, viewportSize);
WebCore::restrictScaleFactorToInitialScaleIfNotUserScalable(attr);
// FIXME: Resetting here can reset more than needed. For instance it will end deferrers.
@@ -814,8 +946,20 @@ void QQuickWebViewFlickablePrivate::pageDidRequestScroll(const QPoint& pos)
void QQuickWebViewFlickablePrivate::didChangeContentsSize(const QSize& newSize)
{
Q_Q(QQuickWebView);
+ QSize viewportSize = q->boundingRect().size().toSize();
+
pageView->setContentsSize(newSize);
q->experimental()->viewportInfo()->didUpdateContentsSize();
+
+ float minimumScale = WebCore::computeMinimumScaleFactorForContentContained(attributes, viewportSize, newSize);
+
+ if (!qFuzzyCompare(minimumScale, attributes.minimumScale)) {
+ interactionEngine->setCSSScaleBounds(minimumScale, attributes.maximumScale);
+ q->experimental()->viewportInfo()->didUpdateViewportConstraints();
+
+ if (!interactionEngine->hadUserInteraction() && !pageIsSuspended)
+ interactionEngine->setCSSScale(minimumScale);
+ }
}
/*!
@@ -955,13 +1099,13 @@ void QQuickWebViewExperimental::postMessage(const QString& message)
d->context->postMessageToNavigatorQtObject(d->webPageProxy.get(), message);
}
-QDeclarativeComponent* QQuickWebViewExperimental::alertDialog() const
+QQmlComponent* QQuickWebViewExperimental::alertDialog() const
{
Q_D(const QQuickWebView);
return d->alertDialog;
}
-void QQuickWebViewExperimental::setAlertDialog(QDeclarativeComponent* alertDialog)
+void QQuickWebViewExperimental::setAlertDialog(QQmlComponent* alertDialog)
{
Q_D(QQuickWebView);
if (d->alertDialog == alertDialog)
@@ -970,13 +1114,13 @@ void QQuickWebViewExperimental::setAlertDialog(QDeclarativeComponent* alertDialo
emit alertDialogChanged();
}
-QDeclarativeComponent* QQuickWebViewExperimental::confirmDialog() const
+QQmlComponent* QQuickWebViewExperimental::confirmDialog() const
{
Q_D(const QQuickWebView);
return d->confirmDialog;
}
-void QQuickWebViewExperimental::setConfirmDialog(QDeclarativeComponent* confirmDialog)
+void QQuickWebViewExperimental::setConfirmDialog(QQmlComponent* confirmDialog)
{
Q_D(QQuickWebView);
if (d->confirmDialog == confirmDialog)
@@ -990,7 +1134,7 @@ QWebNavigationHistory* QQuickWebViewExperimental::navigationHistory() const
return d_ptr->navigationHistory.get();
}
-QDeclarativeComponent* QQuickWebViewExperimental::promptDialog() const
+QQmlComponent* QQuickWebViewExperimental::promptDialog() const
{
Q_D(const QQuickWebView);
return d->promptDialog;
@@ -1004,7 +1148,7 @@ QWebPreferences* QQuickWebViewExperimental::preferences() const
return d->preferences.get();
}
-void QQuickWebViewExperimental::setPromptDialog(QDeclarativeComponent* promptDialog)
+void QQuickWebViewExperimental::setPromptDialog(QQmlComponent* promptDialog)
{
Q_D(QQuickWebView);
if (d->promptDialog == promptDialog)
@@ -1013,13 +1157,13 @@ void QQuickWebViewExperimental::setPromptDialog(QDeclarativeComponent* promptDia
emit promptDialogChanged();
}
-QDeclarativeComponent* QQuickWebViewExperimental::authenticationDialog() const
+QQmlComponent* QQuickWebViewExperimental::authenticationDialog() const
{
Q_D(const QQuickWebView);
return d->authenticationDialog;
}
-void QQuickWebViewExperimental::setAuthenticationDialog(QDeclarativeComponent* authenticationDialog)
+void QQuickWebViewExperimental::setAuthenticationDialog(QQmlComponent* authenticationDialog)
{
Q_D(QQuickWebView);
if (d->authenticationDialog == authenticationDialog)
@@ -1028,13 +1172,13 @@ void QQuickWebViewExperimental::setAuthenticationDialog(QDeclarativeComponent* a
emit authenticationDialogChanged();
}
-QDeclarativeComponent* QQuickWebViewExperimental::proxyAuthenticationDialog() const
+QQmlComponent* QQuickWebViewExperimental::proxyAuthenticationDialog() const
{
Q_D(const QQuickWebView);
return d->proxyAuthenticationDialog;
}
-void QQuickWebViewExperimental::setProxyAuthenticationDialog(QDeclarativeComponent* proxyAuthenticationDialog)
+void QQuickWebViewExperimental::setProxyAuthenticationDialog(QQmlComponent* proxyAuthenticationDialog)
{
Q_D(QQuickWebView);
if (d->proxyAuthenticationDialog == proxyAuthenticationDialog)
@@ -1042,13 +1186,13 @@ void QQuickWebViewExperimental::setProxyAuthenticationDialog(QDeclarativeCompone
d->proxyAuthenticationDialog = proxyAuthenticationDialog;
emit proxyAuthenticationDialogChanged();
}
-QDeclarativeComponent* QQuickWebViewExperimental::certificateVerificationDialog() const
+QQmlComponent* QQuickWebViewExperimental::certificateVerificationDialog() const
{
Q_D(const QQuickWebView);
return d->certificateVerificationDialog;
}
-void QQuickWebViewExperimental::setCertificateVerificationDialog(QDeclarativeComponent* certificateVerificationDialog)
+void QQuickWebViewExperimental::setCertificateVerificationDialog(QQmlComponent* certificateVerificationDialog)
{
Q_D(QQuickWebView);
if (d->certificateVerificationDialog == certificateVerificationDialog)
@@ -1057,13 +1201,13 @@ void QQuickWebViewExperimental::setCertificateVerificationDialog(QDeclarativeCom
emit certificateVerificationDialogChanged();
}
-QDeclarativeComponent* QQuickWebViewExperimental::itemSelector() const
+QQmlComponent* QQuickWebViewExperimental::itemSelector() const
{
Q_D(const QQuickWebView);
return d->itemSelector;
}
-void QQuickWebViewExperimental::setItemSelector(QDeclarativeComponent* itemSelector)
+void QQuickWebViewExperimental::setItemSelector(QQmlComponent* itemSelector)
{
Q_D(QQuickWebView);
if (d->itemSelector == itemSelector)
@@ -1072,13 +1216,13 @@ void QQuickWebViewExperimental::setItemSelector(QDeclarativeComponent* itemSelec
emit itemSelectorChanged();
}
-QDeclarativeComponent* QQuickWebViewExperimental::filePicker() const
+QQmlComponent* QQuickWebViewExperimental::filePicker() const
{
Q_D(const QQuickWebView);
return d->filePicker;
}
-void QQuickWebViewExperimental::setFilePicker(QDeclarativeComponent* filePicker)
+void QQuickWebViewExperimental::setFilePicker(QQmlComponent* filePicker)
{
Q_D(QQuickWebView);
if (d->filePicker == filePicker)
@@ -1087,13 +1231,13 @@ void QQuickWebViewExperimental::setFilePicker(QDeclarativeComponent* filePicker)
emit filePickerChanged();
}
-QDeclarativeComponent* QQuickWebViewExperimental::databaseQuotaDialog() const
+QQmlComponent* QQuickWebViewExperimental::databaseQuotaDialog() const
{
Q_D(const QQuickWebView);
return d->databaseQuotaDialog;
}
-void QQuickWebViewExperimental::setDatabaseQuotaDialog(QDeclarativeComponent* databaseQuotaDialog)
+void QQuickWebViewExperimental::setDatabaseQuotaDialog(QQmlComponent* databaseQuotaDialog)
{
Q_D(QQuickWebView);
if (d->databaseQuotaDialog == databaseQuotaDialog)
@@ -1171,7 +1315,25 @@ void QQuickWebViewExperimental::setDevicePixelRatio(double devicePixelRatio)
emit devicePixelRatioChanged();
}
-QQuickUrlSchemeDelegate* QQuickWebViewExperimental::schemeDelegates_At(QDeclarativeListProperty<QQuickUrlSchemeDelegate>* property, int index)
+/*!
+ \internal
+
+ \qmlmethod void WebViewExperimental::evaluateJavaScript(string script [, function(result)])
+
+ \brief Evaluates the specified JavaScript and, if supplied, calls a function with the result.
+*/
+
+void QQuickWebViewExperimental::evaluateJavaScript(const QString& script, const QJSValue& value)
+{
+ JSCallbackClosure* closure = new JSCallbackClosure;
+
+ closure->receiver = this;
+ closure->value = value;
+
+ d_ptr->webPageProxy.get()->runJavaScriptInMainFrame(script, ScriptValueCallback::create(closure, javaScriptCallback));
+}
+
+QQuickUrlSchemeDelegate* QQuickWebViewExperimental::schemeDelegates_At(QQmlListProperty<QQuickUrlSchemeDelegate>* property, int index)
{
const QObjectList children = property->object->children();
if (index < children.count())
@@ -1179,7 +1341,7 @@ QQuickUrlSchemeDelegate* QQuickWebViewExperimental::schemeDelegates_At(QDeclarat
return 0;
}
-void QQuickWebViewExperimental::schemeDelegates_Append(QDeclarativeListProperty<QQuickUrlSchemeDelegate>* property, QQuickUrlSchemeDelegate *scheme)
+void QQuickWebViewExperimental::schemeDelegates_Append(QQmlListProperty<QQuickUrlSchemeDelegate>* property, QQuickUrlSchemeDelegate *scheme)
{
QObject* schemeParent = property->object;
scheme->setParent(schemeParent);
@@ -1191,12 +1353,12 @@ void QQuickWebViewExperimental::schemeDelegates_Append(QDeclarativeListProperty<
d->webPageProxy->registerApplicationScheme(scheme->scheme());
}
-int QQuickWebViewExperimental::schemeDelegates_Count(QDeclarativeListProperty<QQuickUrlSchemeDelegate>* property)
+int QQuickWebViewExperimental::schemeDelegates_Count(QQmlListProperty<QQuickUrlSchemeDelegate>* property)
{
return property->object->children().count();
}
-void QQuickWebViewExperimental::schemeDelegates_Clear(QDeclarativeListProperty<QQuickUrlSchemeDelegate>* property)
+void QQuickWebViewExperimental::schemeDelegates_Clear(QQmlListProperty<QQuickUrlSchemeDelegate>* property)
{
const QObjectList children = property->object->children();
for (int index = 0; index < children.count(); index++) {
@@ -1206,9 +1368,9 @@ void QQuickWebViewExperimental::schemeDelegates_Clear(QDeclarativeListProperty<Q
}
}
-QDeclarativeListProperty<QQuickUrlSchemeDelegate> QQuickWebViewExperimental::schemeDelegates()
+QQmlListProperty<QQuickUrlSchemeDelegate> QQuickWebViewExperimental::schemeDelegates()
{
- return QDeclarativeListProperty<QQuickUrlSchemeDelegate>(schemeParent, 0,
+ return QQmlListProperty<QQuickUrlSchemeDelegate>(schemeParent, 0,
QQuickWebViewExperimental::schemeDelegates_Append,
QQuickWebViewExperimental::schemeDelegates_Count,
QQuickWebViewExperimental::schemeDelegates_At,
@@ -1336,11 +1498,6 @@ void QQuickWebView::setUrl(const QUrl& url)
if (url.isEmpty())
return;
- if (!isComponentComplete()) {
- d->m_deferedUrlToLoad = url;
- return;
- }
-
d->webPageProxy->loadURL(url.toString());
}
@@ -1360,7 +1517,7 @@ QUrl QQuickWebView::icon() const
int QQuickWebView::loadProgress() const
{
Q_D(const QQuickWebView);
- return d->pageLoadClient->loadProgress();
+ return d->loadProgress();
}
bool QQuickWebView::canGoBack() const
@@ -1725,24 +1882,14 @@ void QQuickWebView::setZoomFactor(qreal factor)
d->setZoomFactor(factor);
}
-struct JSCallbackClosure {
- QPointer<QObject> receiver;
- QByteArray method;
-};
-
-static void javaScriptCallback(WKSerializedScriptValueRef, WKErrorRef, void* context)
-{
- JSCallbackClosure* closure = reinterpret_cast<JSCallbackClosure*>(context);
- QMetaObject::invokeMethod(closure->receiver, closure->method);
- delete closure;
-}
-
void QQuickWebView::runJavaScriptInMainFrame(const QString &script, QObject *receiver, const char *method)
{
Q_D(QQuickWebView);
+
JSCallbackClosure* closure = new JSCallbackClosure;
closure->receiver = receiver;
closure->method = method;
+
d->webPageProxy.get()->runJavaScriptInMainFrame(script, ScriptValueCallback::create(closure, javaScriptCallback));
}
diff --git a/Source/WebKit2/UIProcess/API/qt/qquickwebview_p.h b/Source/WebKit2/UIProcess/API/qt/qquickwebview_p.h
index 916f2282d..4bdd0fbbd 100644
--- a/Source/WebKit2/UIProcess/API/qt/qquickwebview_p.h
+++ b/Source/WebKit2/UIProcess/API/qt/qquickwebview_p.h
@@ -28,7 +28,7 @@
#include <private/qquickflickable_p.h>
class QWebNavigationRequest;
-class QDeclarativeComponent;
+class QQmlComponent;
class QQuickWebPage;
class QQuickWebViewAttached;
class QWebLoadRequest;
@@ -65,11 +65,12 @@ QT_BEGIN_NAMESPACE
class QPainter;
class QUrl;
class QQuickFlickable;
+class QJSValue;
QT_END_NAMESPACE
// Instantiating the WebView in C++ is only possible by creating
-// a QDeclarativeComponent as the initialization depends on the
+// a QQmlComponent as the initialization depends on the
// componentComplete method being called.
class QWEBKIT_EXPORT QQuickWebView : public QQuickFlickable {
Q_OBJECT
@@ -252,18 +253,18 @@ class QWEBKIT_EXPORT QQuickWebViewExperimental : public QObject {
Q_PROPERTY(int preferredMinimumContentsWidth WRITE setPreferredMinimumContentsWidth READ preferredMinimumContentsWidth)
Q_PROPERTY(QWebNavigationHistory* navigationHistory READ navigationHistory CONSTANT FINAL)
- Q_PROPERTY(QDeclarativeComponent* alertDialog READ alertDialog WRITE setAlertDialog NOTIFY alertDialogChanged)
- Q_PROPERTY(QDeclarativeComponent* confirmDialog READ confirmDialog WRITE setConfirmDialog NOTIFY confirmDialogChanged)
- Q_PROPERTY(QDeclarativeComponent* promptDialog READ promptDialog WRITE setPromptDialog NOTIFY promptDialogChanged)
- Q_PROPERTY(QDeclarativeComponent* authenticationDialog READ authenticationDialog WRITE setAuthenticationDialog NOTIFY authenticationDialogChanged)
- 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(QDeclarativeComponent* databaseQuotaDialog READ databaseQuotaDialog WRITE setDatabaseQuotaDialog NOTIFY databaseQuotaDialogChanged)
+ Q_PROPERTY(QQmlComponent* alertDialog READ alertDialog WRITE setAlertDialog NOTIFY alertDialogChanged)
+ Q_PROPERTY(QQmlComponent* confirmDialog READ confirmDialog WRITE setConfirmDialog NOTIFY confirmDialogChanged)
+ Q_PROPERTY(QQmlComponent* promptDialog READ promptDialog WRITE setPromptDialog NOTIFY promptDialogChanged)
+ Q_PROPERTY(QQmlComponent* authenticationDialog READ authenticationDialog WRITE setAuthenticationDialog NOTIFY authenticationDialogChanged)
+ Q_PROPERTY(QQmlComponent* proxyAuthenticationDialog READ proxyAuthenticationDialog WRITE setProxyAuthenticationDialog NOTIFY proxyAuthenticationDialogChanged)
+ Q_PROPERTY(QQmlComponent* certificateVerificationDialog READ certificateVerificationDialog WRITE setCertificateVerificationDialog NOTIFY certificateVerificationDialogChanged)
+ Q_PROPERTY(QQmlComponent* itemSelector READ itemSelector WRITE setItemSelector NOTIFY itemSelectorChanged)
+ Q_PROPERTY(QQmlComponent* filePicker READ filePicker WRITE setFilePicker NOTIFY filePickerChanged)
+ Q_PROPERTY(QQmlComponent* databaseQuotaDialog READ databaseQuotaDialog WRITE setDatabaseQuotaDialog NOTIFY databaseQuotaDialogChanged)
Q_PROPERTY(QWebPreferences* preferences READ preferences CONSTANT FINAL)
Q_PROPERTY(QWebViewportInfo* viewportInfo READ viewportInfo CONSTANT FINAL)
- Q_PROPERTY(QDeclarativeListProperty<QQuickUrlSchemeDelegate> urlSchemeDelegates READ schemeDelegates)
+ Q_PROPERTY(QQmlListProperty<QQuickUrlSchemeDelegate> urlSchemeDelegates READ schemeDelegates)
Q_PROPERTY(QString userAgent READ userAgent WRITE setUserAgent NOTIFY userAgentChanged)
Q_PROPERTY(double devicePixelRatio READ devicePixelRatio WRITE setDevicePixelRatio NOTIFY devicePixelRatioChanged)
Q_ENUMS(NavigationRequestActionExperimental)
@@ -276,24 +277,24 @@ public:
QQuickWebViewExperimental(QQuickWebView* webView);
virtual ~QQuickWebViewExperimental();
- QDeclarativeComponent* alertDialog() const;
- void setAlertDialog(QDeclarativeComponent*);
- QDeclarativeComponent* confirmDialog() const;
- void setConfirmDialog(QDeclarativeComponent*);
- QDeclarativeComponent* promptDialog() const;
- void setPromptDialog(QDeclarativeComponent*);
- QDeclarativeComponent* authenticationDialog() const;
- void setAuthenticationDialog(QDeclarativeComponent*);
- QDeclarativeComponent* certificateVerificationDialog() const;
- void setCertificateVerificationDialog(QDeclarativeComponent*);
- QDeclarativeComponent* itemSelector() const;
- void setItemSelector(QDeclarativeComponent*);
- QDeclarativeComponent* proxyAuthenticationDialog() const;
- void setProxyAuthenticationDialog(QDeclarativeComponent*);
- QDeclarativeComponent* filePicker() const;
- void setFilePicker(QDeclarativeComponent*);
- QDeclarativeComponent* databaseQuotaDialog() const;
- void setDatabaseQuotaDialog(QDeclarativeComponent*);
+ QQmlComponent* alertDialog() const;
+ void setAlertDialog(QQmlComponent*);
+ QQmlComponent* confirmDialog() const;
+ void setConfirmDialog(QQmlComponent*);
+ QQmlComponent* promptDialog() const;
+ void setPromptDialog(QQmlComponent*);
+ QQmlComponent* authenticationDialog() const;
+ void setAuthenticationDialog(QQmlComponent*);
+ QQmlComponent* certificateVerificationDialog() const;
+ void setCertificateVerificationDialog(QQmlComponent*);
+ QQmlComponent* itemSelector() const;
+ void setItemSelector(QQmlComponent*);
+ QQmlComponent* proxyAuthenticationDialog() const;
+ void setProxyAuthenticationDialog(QQmlComponent*);
+ QQmlComponent* filePicker() const;
+ void setFilePicker(QQmlComponent*);
+ QQmlComponent* databaseQuotaDialog() const;
+ void setDatabaseQuotaDialog(QQmlComponent*);
QString userAgent() const;
void setUserAgent(const QString& userAgent);
double devicePixelRatio() const;
@@ -305,11 +306,11 @@ public:
QWebNavigationHistory* navigationHistory() const;
QQuickWebPage* page();
- static QQuickUrlSchemeDelegate* schemeDelegates_At(QDeclarativeListProperty<QQuickUrlSchemeDelegate>*, int index);
- static void schemeDelegates_Append(QDeclarativeListProperty<QQuickUrlSchemeDelegate>*, QQuickUrlSchemeDelegate*);
- static int schemeDelegates_Count(QDeclarativeListProperty<QQuickUrlSchemeDelegate>*);
- static void schemeDelegates_Clear(QDeclarativeListProperty<QQuickUrlSchemeDelegate>*);
- QDeclarativeListProperty<QQuickUrlSchemeDelegate> schemeDelegates();
+ static QQuickUrlSchemeDelegate* schemeDelegates_At(QQmlListProperty<QQuickUrlSchemeDelegate>*, int index);
+ static void schemeDelegates_Append(QQmlListProperty<QQuickUrlSchemeDelegate>*, QQuickUrlSchemeDelegate*);
+ static int schemeDelegates_Count(QQmlListProperty<QQuickUrlSchemeDelegate>*);
+ static void schemeDelegates_Clear(QQmlListProperty<QQuickUrlSchemeDelegate>*);
+ QQmlListProperty<QQuickUrlSchemeDelegate> schemeDelegates();
void invokeApplicationSchemeHandler(WTF::PassRefPtr<WebKit::QtRefCountedNetworkRequestData>);
void sendApplicationSchemeReply(QQuickNetworkReply*);
@@ -332,6 +333,7 @@ public Q_SLOTS:
void goBackTo(int index);
void goForwardTo(int index);
void postMessage(const QString&);
+ void evaluateJavaScript(const QString& script, const QJSValue& value = QJSValue());
Q_SIGNALS:
void alertDialogChanged();
diff --git a/Source/WebKit2/UIProcess/API/qt/qquickwebview_p_p.h b/Source/WebKit2/UIProcess/API/qt/qquickwebview_p_p.h
index 417618d0a..de62d39bb 100644
--- a/Source/WebKit2/UIProcess/API/qt/qquickwebview_p_p.h
+++ b/Source/WebKit2/UIProcess/API/qt/qquickwebview_p_p.h
@@ -41,6 +41,7 @@ class DrawingAreaProxy;
class QtDialogRunner;
class QtViewportInteractionEngine;
class QtWebContext;
+class QtWebError;
class QtWebPageLoadClient;
class QtWebPagePolicyClient;
class WebPageProxy;
@@ -50,7 +51,7 @@ class QWebNavigationHistory;
class QWebViewportInfo;
QT_BEGIN_NAMESPACE
-class QDeclarativeComponent;
+class QQmlComponent;
QT_END_NAMESPACE
class QQuickWebViewPrivate {
@@ -67,19 +68,26 @@ public:
virtual void initialize(WKContextRef contextRef = 0, WKPageGroupRef pageGroupRef = 0);
+ virtual void onComponentComplete() { }
+
virtual void enableMouseEvents() { }
virtual void disableMouseEvents() { }
virtual QPointF pageItemPos();
virtual void updateContentsSize(const QSizeF&) { }
+ virtual void provisionalLoadDidStart(const QUrl& url);
+ virtual void loadDidCommit();
+ virtual void didSameDocumentNavigation();
+ virtual void titleDidChange();
+ virtual void loadProgressDidChange(int loadProgress);
+ virtual void backForwardListDidChange();
virtual void loadDidSucceed();
- virtual void onComponentComplete();
- virtual void loadDidCommit() { }
- virtual void didFinishFirstNonEmptyLayout() { }
+ virtual void loadDidFail(const WebKit::QtWebError& error);
+
virtual void didChangeViewportProperties(const WebCore::ViewportAttributes& attr) { }
- void didChangeBackForwardList();
+ int loadProgress() const { return m_loadProgress; }
void setNeedsDisplay();
virtual WebKit::QtViewportInteractionEngine* viewportInteractionEngine() { return 0; }
@@ -175,15 +183,15 @@ protected:
FlickableAxisLocker axisLocker;
- QDeclarativeComponent* alertDialog;
- QDeclarativeComponent* confirmDialog;
- QDeclarativeComponent* promptDialog;
- QDeclarativeComponent* authenticationDialog;
- QDeclarativeComponent* certificateVerificationDialog;
- QDeclarativeComponent* itemSelector;
- QDeclarativeComponent* proxyAuthenticationDialog;
- QDeclarativeComponent* filePicker;
- QDeclarativeComponent* databaseQuotaDialog;
+ QQmlComponent* alertDialog;
+ QQmlComponent* confirmDialog;
+ QQmlComponent* promptDialog;
+ QQmlComponent* authenticationDialog;
+ QQmlComponent* certificateVerificationDialog;
+ QQmlComponent* itemSelector;
+ QQmlComponent* proxyAuthenticationDialog;
+ QQmlComponent* filePicker;
+ QQmlComponent* databaseQuotaDialog;
WebCore::ViewportAttributes attributes;
@@ -192,7 +200,7 @@ protected:
bool m_renderToOffscreenBuffer;
bool m_dialogActive;
QUrl m_iconURL;
- QUrl m_deferedUrlToLoad;
+ int m_loadProgress;
};
class QQuickWebViewLegacyPrivate : public QQuickWebViewPrivate {
@@ -216,13 +224,11 @@ public:
virtual ~QQuickWebViewFlickablePrivate();
virtual void initialize(WKContextRef contextRef = 0, WKPageGroupRef pageGroupRef = 0);
+ virtual void onComponentComplete();
+
virtual QPointF pageItemPos();
virtual void updateContentsSize(const QSizeF&);
- virtual void loadDidSucceed();
- virtual void onComponentComplete();
- virtual void loadDidCommit();
- virtual void didFinishFirstNonEmptyLayout();
virtual void didChangeViewportProperties(const WebCore::ViewportAttributes&);
virtual WebKit::QtViewportInteractionEngine* viewportInteractionEngine() { return interactionEngine.data(); }
virtual void updateViewportSize();
@@ -237,7 +243,6 @@ public:
private:
QScopedPointer<WebKit::QtViewportInteractionEngine> interactionEngine;
bool pageIsSuspended;
- bool loadSuccessDispatchIsPending;
};
#endif // qquickwebview_p_p_h
diff --git a/Source/WebKit2/UIProcess/API/qt/qwebiconimageprovider.cpp b/Source/WebKit2/UIProcess/API/qt/qwebiconimageprovider.cpp
index dce6ee9df..71342a1e3 100644
--- a/Source/WebKit2/UIProcess/API/qt/qwebiconimageprovider.cpp
+++ b/Source/WebKit2/UIProcess/API/qt/qwebiconimageprovider.cpp
@@ -29,7 +29,7 @@
using namespace WebKit;
QWebIconImageProvider::QWebIconImageProvider()
- : QDeclarativeImageProvider(QDeclarativeImageProvider::Image)
+ : QQuickImageProvider(QQuickImageProvider::Image)
{
}
diff --git a/Source/WebKit2/UIProcess/API/qt/qwebiconimageprovider_p.h b/Source/WebKit2/UIProcess/API/qt/qwebiconimageprovider_p.h
index 74f55995f..a54008a2c 100644
--- a/Source/WebKit2/UIProcess/API/qt/qwebiconimageprovider_p.h
+++ b/Source/WebKit2/UIProcess/API/qt/qwebiconimageprovider_p.h
@@ -23,7 +23,7 @@
#include "qwebkitglobal.h"
#include <QtQuick/QQuickImageProvider>
-class QWEBKIT_EXPORT QWebIconImageProvider : public QDeclarativeImageProvider {
+class QWEBKIT_EXPORT QWebIconImageProvider : public QQuickImageProvider {
public:
QWebIconImageProvider();
~QWebIconImageProvider();
diff --git a/Source/WebKit2/UIProcess/API/qt/qwebviewportinfo.cpp b/Source/WebKit2/UIProcess/API/qt/qwebviewportinfo.cpp
index 170604d1d..ea16732f5 100644
--- a/Source/WebKit2/UIProcess/API/qt/qwebviewportinfo.cpp
+++ b/Source/WebKit2/UIProcess/API/qt/qwebviewportinfo.cpp
@@ -62,11 +62,17 @@ QVariant QWebViewportInfo::initialScale() const
QVariant QWebViewportInfo::minimumScale() const
{
+ if (QtViewportInteractionEngine* interactionEngine = m_webViewPrivate->viewportInteractionEngine())
+ return interactionEngine->m_minimumScale;
+
return m_webViewPrivate->attributes.minimumScale;
}
QVariant QWebViewportInfo::maximumScale() const
{
+ if (QtViewportInteractionEngine* interactionEngine = m_webViewPrivate->viewportInteractionEngine())
+ return interactionEngine->m_maximumScale;
+
return m_webViewPrivate->attributes.maximumScale;
}
diff --git a/Source/WebKit2/UIProcess/API/qt/qwebviewportinfo_p.h b/Source/WebKit2/UIProcess/API/qt/qwebviewportinfo_p.h
index ab422e4e7..d3060bbe6 100644
--- a/Source/WebKit2/UIProcess/API/qt/qwebviewportinfo_p.h
+++ b/Source/WebKit2/UIProcess/API/qt/qwebviewportinfo_p.h
@@ -27,7 +27,7 @@
#include <QtCore/QPointer>
#include <QtCore/QSize>
#include <QtCore/QVariant>
-#include <QtDeclarative/QtDeclarative>
+#include <QtQml/QtQml>
class QQuickWebViewPrivate;
diff --git a/Source/WebKit2/UIProcess/API/qt/tests/qmltests/WebView/tst_evaluateJavaScript.qml b/Source/WebKit2/UIProcess/API/qt/tests/qmltests/WebView/tst_evaluateJavaScript.qml
new file mode 100644
index 000000000..a3083144d
--- /dev/null
+++ b/Source/WebKit2/UIProcess/API/qt/tests/qmltests/WebView/tst_evaluateJavaScript.qml
@@ -0,0 +1,87 @@
+import QtQuick 2.0
+import QtTest 1.0
+import QtWebKit 3.0
+import QtWebKit.experimental 1.0
+import "../common"
+
+Item {
+ TestWebView {
+ id: webView
+ property variant lastMessage
+ property variant lastResult
+
+ signal resultReceived
+
+ experimental.preferences.navigatorQtObjectEnabled: true
+ experimental.onMessageReceived: {
+ lastMessage = message
+ }
+ }
+
+ SignalSpy {
+ id: messageSpy
+ target: webView.experimental
+ signalName: "messageReceived"
+ }
+
+ SignalSpy {
+ id: resultSpy
+ target: webView
+ signalName: "resultReceived"
+ }
+
+ TestCase {
+ name: "JavaScriptEvaluation"
+
+ function init() {
+ messageSpy.clear()
+ webView.lastMessage = null
+
+ resultSpy.clear()
+ webView.lastResult = null
+ }
+
+ function test_basic() {
+ messageSpy.clear()
+ webView.url = "about:blank"
+ verify(webView.waitForLoadSucceeded())
+
+ webView.experimental.evaluateJavaScript(
+ "navigator.qt.onmessage = function(message) {" +
+ " var result = message.data.split('');" +
+ " result = result.reverse().join('');" +
+ " navigator.qt.postMessage(result);" +
+ "}");
+
+ webView.experimental.postMessage("DLROW OLLEH");
+ messageSpy.wait()
+ compare(webView.lastMessage.data, "HELLO WORLD")
+ }
+
+ function test_propertyObjectWithChild() {
+ messageSpy.clear()
+ webView.url = "about:blank"
+ verify(webView.waitForLoadSucceeded())
+
+ webView.experimental.evaluateJavaScript(
+ "(function() {" +
+ " var parent = new Object;" +
+ " var child = new Object;" +
+ " parent['level'] = '1';" +
+ " child['level'] = 2;" +
+ " parent['child'] = child;" +
+ " return parent;" +
+ "})()",
+
+ function(result) {
+ webView.lastResult = result
+ webView.resultReceived()
+ });
+
+ resultSpy.wait()
+
+ compare(JSON.stringify(webView.lastResult),
+ '{"child":{"level":2},"level":"1"}')
+ }
+ }
+}
diff --git a/Source/WebKit2/UIProcess/API/qt/tests/tests.pri b/Source/WebKit2/UIProcess/API/qt/tests/tests.pri
index ded493f88..358a2328c 100644
--- a/Source/WebKit2/UIProcess/API/qt/tests/tests.pri
+++ b/Source/WebKit2/UIProcess/API/qt/tests/tests.pri
@@ -10,7 +10,7 @@ SOURCES += ../util.cpp \
../bytearraytestdata.cpp
INCLUDEPATH += $$PWD
-QT += testlib declarative quick quick-private webkit
+QT += testlib qml quick quick-private webkit
DEFINES += TESTS_SOURCE_DIR=\\\"$$PWD\\\" \
QWP_PATH=\\\"$${ROOT_BUILD_DIR}/bin\\\"