static JSValueRef zoomPageOutCallback(JSContextRef context, JSObjectRef function, JSObjectRef thisObject, size_t argumentCount, const JSValueRef arguments[], JSValueRef* exception) { WebKitWebView* view = webkit_web_frame_get_web_view(mainFrame); if (!view) return JSValueMakeUndefined(context); webkit_web_view_zoom_out(view); return JSValueMakeUndefined(context); }
GtkClipboard* PasteboardHelperGtk::getCurrentTarget(Frame* frame) const { WebKitWebView* webView = webkit_web_frame_get_web_view(kit(frame)); if (webkit_web_view_use_primary_for_paste(webView)) return getPrimary(frame); else return getClipboard(frame); }
void LayoutTestController::evaluateInWebInspector(long callId, JSStringRef script) { WebKitWebView* webView = webkit_web_frame_get_web_view(mainFrame); WebKitWebInspector* inspector = webkit_web_view_get_inspector(webView); char* scriptString = JSStringCopyUTF8CString(script); webkit_web_inspector_execute_script(inspector, callId, scriptString); g_free(scriptString); }
void LayoutTestController::setPopupBlockingEnabled(bool flag) { WebKitWebView* view = webkit_web_frame_get_web_view(mainFrame); ASSERT(view); WebKitWebSettings* settings = webkit_web_view_get_settings(view); g_object_set(G_OBJECT(settings), "javascript-can-open-windows-automatically", !flag, NULL); }
void LayoutTestController::setMockGeolocationPosition(double latitude, double longitude, double accuracy) { WebKitWebView* view = WEBKIT_WEB_VIEW(g_slist_nth_data(webViewList, 0)); if (!view) view = webkit_web_frame_get_web_view(mainFrame); ASSERT(view); DumpRenderTreeSupportGtk::setMockGeolocationPosition(view, latitude, longitude, accuracy); }
void TestRunner::setMockGeolocationPositionUnavailableError(JSStringRef message) { WebKitWebView* view = WEBKIT_WEB_VIEW(g_slist_nth_data(webViewList, 0)); if (!view) view = webkit_web_frame_get_web_view(mainFrame); ASSERT(view); GOwnPtr<gchar> cMessage(JSStringCopyUTF8CString(message)); DumpRenderTreeSupportGtk::setMockGeolocationPositionUnavailableError(view, cMessage.get()); }
void LayoutTestController::setMockGeolocationError(int code, JSStringRef message) { WebKitWebView* view = WEBKIT_WEB_VIEW(g_slist_nth_data(webViewList, 0)); if (!view) view = webkit_web_frame_get_web_view(mainFrame); ASSERT(view); GOwnPtr<gchar> cMessage(JSStringCopyUTF8CString(message)); DumpRenderTreeSupportGtk::setMockGeolocationError(view, code, cMessage.get()); }
void LayoutTestController::setGeolocationPermission(bool allow) { setGeolocationPermissionCommon(allow); WebKitWebView* view = WEBKIT_WEB_VIEW(g_slist_nth_data(webViewList, 0)); if (!view) view = webkit_web_frame_get_web_view(mainFrame); ASSERT(view); DumpRenderTreeSupportGtk::setMockGeolocationPermission(view, allow); }
static void zoomOut(gboolean fullContentsZoom) { WebKitWebView* view = webkit_web_frame_get_web_view(mainFrame); if (!view) return; webkit_web_view_set_full_content_zoom(view, fullContentsZoom); gfloat currentZoom = webkit_web_view_get_zoom_level(view); webkit_web_view_set_zoom_level(view, currentZoom / zoomMultiplierRatio); }
void LayoutTestController::setJavaScriptProfilingEnabled(bool flag) { WebKitWebView* view = webkit_web_frame_get_web_view(mainFrame); ASSERT(view); setDeveloperExtrasEnabled(flag); WebKitWebInspector* inspector = webkit_web_view_get_inspector(view); g_object_set(G_OBJECT(inspector), "javascript-profiling-enabled", flag, NULL); }
bool LayoutTestController::isCommandEnabled(JSStringRef name) { WebKitWebView* view = webkit_web_frame_get_web_view(mainFrame); ASSERT(view); gchar* cName = JSStringCopyUTF8CString(name); bool result = DumpRenderTreeSupportGtk::isCommandEnabled(view, cName); g_free(cName); return result; }
AccessibilityUIElement AccessibilityController::rootElement() { WebKitWebView* view = webkit_web_frame_get_web_view(mainFrame); // The presumed, desired rootElement is the parent of the web view. GtkWidget* webViewParent = gtk_widget_get_parent(GTK_WIDGET(view)); AtkObject* axObject = gtk_widget_get_accessible(webViewParent); return AccessibilityUIElement(axObject); }
static JSValueRef mouseDownCallback(JSContextRef context, JSObjectRef function, JSObjectRef thisObject, size_t argumentCount, const JSValueRef arguments[], JSValueRef* exception) { WebKitWebView* view = webkit_web_frame_get_web_view(mainFrame); if (!view) return JSValueMakeUndefined(context); down = true; GdkEvent event; memset(&event, 0, sizeof(event)); event.type = GDK_BUTTON_PRESS; event.button.button = 1; if (argumentCount == 1) { event.button.button = (int)JSValueToNumber(context, arguments[0], exception) + 1; g_return_val_if_fail((!exception || !*exception), JSValueMakeUndefined(context)); } currentEventButton = event.button.button; event.button.x = lastMousePositionX; event.button.y = lastMousePositionY; event.button.window = GTK_WIDGET(view)->window; event.button.time = GDK_CURRENT_TIME; event.button.device = gdk_device_get_core_pointer(); int x_root, y_root; #if GTK_CHECK_VERSION(2,17,3) gdk_window_get_root_coords(GTK_WIDGET(view)->window, lastMousePositionX, lastMousePositionY, &x_root, &y_root); #else getRootCoords(GTK_WIDGET(view), &x_root, &y_root); #endif event.button.x_root = x_root; event.button.y_root = y_root; updateClickCount(event.button.button); if (!msgQueue[endOfQueue].delay) { webkit_web_frame_layout(mainFrame); gboolean return_val; g_signal_emit_by_name(view, "button_press_event", &event, &return_val); if (clickCount == 2) { event.type = GDK_2BUTTON_PRESS; g_signal_emit_by_name(view, "button_press_event", &event, &return_val); } } else { // replaySavedEvents should have the required logic to make leapForward delays work msgQueue[endOfQueue++].event = event; replaySavedEvents(); } return JSValueMakeUndefined(context); }
void LayoutTestController::overridePreference(JSStringRef key, JSStringRef value) { GOwnPtr<gchar> originalName(JSStringCopyUTF8CString(key)); GOwnPtr<gchar> valueAsString(JSStringCopyUTF8CString(value)); WebKitWebView* view = webkit_web_frame_get_web_view(mainFrame); ASSERT(view); // This transformation could be handled by a hash table (and it once was), but // having it prominent, makes it easier for people from other ports to keep the // list up to date. const gchar* propertyName = 0; if (g_str_equal(originalName.get(), "WebKitJavaScriptEnabled")) propertyName = "enable-scripts"; else if (g_str_equal(originalName.get(), "WebKitDefaultFontSize")) propertyName = "default-font-size"; else if (g_str_equal(originalName.get(), "WebKitEnableCaretBrowsing")) propertyName = "enable-caret-browsing"; else if (g_str_equal(originalName.get(), "WebKitUsesPageCachePreferenceKey")) propertyName = "enable-page-cache"; else if (g_str_equal(originalName.get(), "WebKitPluginsEnabled")) propertyName = "enable-plugins"; else if (g_str_equal(originalName.get(), "WebKitHyperlinkAuditingEnabled")) propertyName = "enable-hyperlink-auditing"; else if (g_str_equal(originalName.get(), "WebKitWebGLEnabled")) propertyName = "enable-webgl"; else if (g_str_equal(originalName.get(), "WebKitTabToLinksPreferenceKey")) { DumpRenderTreeSupportGtk::setLinksIncludedInFocusChain(!g_ascii_strcasecmp(valueAsString.get(), "true") || !g_ascii_strcasecmp(valueAsString.get(), "1")); return; } else { fprintf(stderr, "LayoutTestController::overridePreference tried to override " "unknown preference '%s'.\n", originalName.get()); return; } WebKitWebSettings* settings = webkit_web_view_get_settings(view); GParamSpec* pspec = g_object_class_find_property(G_OBJECT_CLASS( WEBKIT_WEB_SETTINGS_GET_CLASS(settings)), propertyName); GValue currentPropertyValue = { 0, { { 0 } } }; g_value_init(¤tPropertyValue, pspec->value_type); if (G_VALUE_HOLDS_STRING(¤tPropertyValue)) g_object_set(settings, propertyName, valueAsString.get(), NULL); else if (G_VALUE_HOLDS_BOOLEAN(¤tPropertyValue)) g_object_set(G_OBJECT(settings), propertyName, !g_ascii_strcasecmp(valueAsString.get(), "true") || !g_ascii_strcasecmp(valueAsString.get(), "1"), NULL); else if (G_VALUE_HOLDS_INT(¤tPropertyValue)) g_object_set(G_OBJECT(settings), propertyName, atoi(valueAsString.get()), NULL); else if (G_VALUE_HOLDS_FLOAT(¤tPropertyValue)) { gfloat newValue = g_ascii_strtod(valueAsString.get(), 0); g_object_set(G_OBJECT(settings), propertyName, newValue, NULL); } else fprintf(stderr, "LayoutTestController::overridePreference failed to override " "preference '%s'.\n", originalName.get()); }
static JSValueRef mouseUpCallback(JSContextRef context, JSObjectRef function, JSObjectRef thisObject, size_t argumentCount, const JSValueRef arguments[], JSValueRef* exception) { WebKitWebView* view = webkit_web_frame_get_web_view(mainFrame); if (!view) return JSValueMakeUndefined(context); GdkEvent event; memset(&event, 0, sizeof(event)); event.type = GDK_BUTTON_RELEASE; event.button.button = 1; if (argumentCount == 1) { event.button.button = (int)JSValueToNumber(context, arguments[0], exception) + 1; g_return_val_if_fail((!exception || !*exception), JSValueMakeUndefined(context)); } currentEventButton = event.button.button; event.button.x = lastMousePositionX; event.button.y = lastMousePositionY; event.button.window = GTK_WIDGET(view)->window; event.button.time = GDK_CURRENT_TIME; event.button.device = gdk_device_get_core_pointer(); event.button.state = getStateFlags(); down = false; int x_root, y_root; #if GTK_CHECK_VERSION(2,17,3) gdk_window_get_root_coords(GTK_WIDGET(view)->window, lastMousePositionX, lastMousePositionY, &x_root, &y_root); #else getRootCoords(GTK_WIDGET(view), &x_root, &y_root); #endif event.button.x_root = x_root; event.button.y_root = y_root; if ((dragMode && !replayingSavedEvents) || msgQueue[endOfQueue].delay) { msgQueue[endOfQueue].event = event; msgQueue[endOfQueue++].isDragEvent = true; replaySavedEvents(); } else { webkit_web_frame_layout(mainFrame); gboolean return_val; g_signal_emit_by_name(view, "button_release_event", &event, &return_val); } lastClickPositionX = lastMousePositionX; lastClickPositionY = lastMousePositionY; return JSValueMakeUndefined(context); }
static JSValueRef textZoomOutCallback(JSContextRef context, JSObjectRef function, JSObjectRef thisObject, size_t argumentCount, const JSValueRef arguments[], JSValueRef* exception) { WebKitWebView* view = webkit_web_frame_get_web_view(mainFrame); if (!view) return JSValueMakeUndefined(context); gfloat currentZoom = webkit_web_view_get_zoom_level(view); webkit_web_view_set_zoom_level(view, currentZoom / zoomMultiplierRatio); return JSValueMakeUndefined(context); }
void LayoutTestController::setUserStyleSheetEnabled(bool flag) { userStyleSheetEnabled = flag; WebKitWebView* webView = webkit_web_frame_get_web_view(mainFrame); WebKitWebSettings* settings = webkit_web_view_get_settings(webView); if (flag && userStyleSheet) g_object_set(G_OBJECT(settings), "user-stylesheet-uri", userStyleSheet, NULL); else g_object_set(G_OBJECT(settings), "user-stylesheet-uri", "", NULL); }
void LayoutTestController::execCommand(JSStringRef name, JSStringRef value) { WebKitWebView* view = webkit_web_frame_get_web_view(mainFrame); ASSERT(view); gchar* cName = JSStringCopyUTF8CString(name); gchar* cValue = JSStringCopyUTF8CString(value); DumpRenderTreeSupportGtk::executeCoreCommandByName(view, cName, cValue); g_free(cName); g_free(cValue); }
void LayoutTestController::setEditingBehavior(const char* editingBehavior) { WebKitWebView* webView = webkit_web_frame_get_web_view(mainFrame); WebKitWebSettings* settings = webkit_web_view_get_settings(webView); if (!strcmp(editingBehavior, "win")) g_object_set(G_OBJECT(settings), "editing-behavior", WEBKIT_EDITING_BEHAVIOR_WINDOWS, NULL); else if (!strcmp(editingBehavior, "mac")) g_object_set(G_OBJECT(settings), "editing-behavior", WEBKIT_EDITING_BEHAVIOR_MAC, NULL); else if (!strcmp(editingBehavior, "unix")) g_object_set(G_OBJECT(settings), "editing-behavior", WEBKIT_EDITING_BEHAVIOR_UNIX, NULL); }
size_t LayoutTestController::webHistoryItemCount() { WebKitWebView* webView = webkit_web_frame_get_web_view(mainFrame); WebKitWebBackForwardList* list = webkit_web_view_get_back_forward_list(webView); if (!list) return -1; // We do not add the current page to the total count as it's not // considered in DRT tests return webkit_web_back_forward_list_get_back_length(list) + webkit_web_back_forward_list_get_forward_length(list); }
bool BackForwardItem::invoke() const { WebKitWebView* webView = webkit_web_frame_get_web_view(mainFrame); if (m_howFar == 1) webkit_web_view_go_forward(webView); else if (m_howFar == -1) webkit_web_view_go_back(webView); else { WebKitWebBackForwardList* webBackForwardList = webkit_web_view_get_back_forward_list(webView); WebKitWebHistoryItem* item = webkit_web_back_forward_list_get_nth_item(webBackForwardList, m_howFar); webkit_web_view_go_to_back_forward_item(webView, item); } return true; }
void TestRunner::setPageVisibility(const char* visibility) { WebKitWebView* webView = webkit_web_frame_get_web_view(mainFrame); String visibilityString(visibility); WebCore::PageVisibilityState visibilityState = WebCore::PageVisibilityStateVisible; if (visibilityString == "visible") visibilityState = WebCore::PageVisibilityStateVisible; else if (visibilityString == "hidden") visibilityState = WebCore::PageVisibilityStateHidden; else return; DumpRenderTreeSupportGtk::setPageVisibility(webView, visibilityState, false); }
void LayoutTestController::clearBackForwardList() { WebKitWebView* webView = webkit_web_frame_get_web_view(mainFrame); WebKitWebBackForwardList* list = webkit_web_view_get_back_forward_list(webView); WebKitWebHistoryItem* item = webkit_web_back_forward_list_get_current_item(list); g_object_ref(item); // We clear the history by setting the back/forward list's capacity to 0 // then restoring it back and adding back the current item. gint limit = webkit_web_back_forward_list_get_limit(list); webkit_web_back_forward_list_set_limit(list, 0); webkit_web_back_forward_list_set_limit(list, limit); webkit_web_back_forward_list_add_item(list, item); webkit_web_back_forward_list_go_to_item(list, item); g_object_unref(item); }
void TestRunner::setTextDirection(JSStringRef direction) { GUniquePtr<gchar> writingDirection(JSStringCopyUTF8CString(direction)); WebKitWebView* view = webkit_web_frame_get_web_view(mainFrame); ASSERT(view); if (g_str_equal(writingDirection.get(), "auto")) gtk_widget_set_direction(GTK_WIDGET(view), GTK_TEXT_DIR_NONE); else if (g_str_equal(writingDirection.get(), "ltr")) gtk_widget_set_direction(GTK_WIDGET(view), GTK_TEXT_DIR_LTR); else if (g_str_equal(writingDirection.get(), "rtl")) gtk_widget_set_direction(GTK_WIDGET(view), GTK_TEXT_DIR_RTL); else fprintf(stderr, "TestRunner::setTextDirection called with unknown direction: '%s'.\n", writingDirection.get()); }
static void dispatchEvent(GdkEvent event) { webkit_web_frame_layout(mainFrame); WebKitWebView* view = webkit_web_frame_get_web_view(mainFrame); if (!view) return; gboolean returnValue; if (event.type == GDK_BUTTON_PRESS || event.type == GDK_2BUTTON_PRESS || event.type == GDK_3BUTTON_PRESS) g_signal_emit_by_name(view, "button_press_event", &event, &returnValue); else if (event.type == GDK_BUTTON_RELEASE) g_signal_emit_by_name(view, "button_release_event", &event, &returnValue); else if (event.type == GDK_MOTION_NOTIFY) g_signal_emit_by_name(view, "motion_notify_event", &event, &returnValue); else if (event.type == GDK_SCROLL) gtk_main_do_event(&event); }
static JSValueRef mouseWheelToCallback(JSContextRef context, JSObjectRef function, JSObjectRef thisObject, size_t argumentCount, const JSValueRef arguments[], JSValueRef* exception) { WebKitWebView* view = webkit_web_frame_get_web_view(mainFrame); if (!view) return JSValueMakeUndefined(context); if (argumentCount < 2) return JSValueMakeUndefined(context); int horizontal = (int)JSValueToNumber(context, arguments[0], exception); g_return_val_if_fail((!exception || !*exception), JSValueMakeUndefined(context)); int vertical = (int)JSValueToNumber(context, arguments[1], exception); g_return_val_if_fail((!exception || !*exception), JSValueMakeUndefined(context)); // GTK+ doesn't support multiple direction scrolls in the same event! g_return_val_if_fail((!vertical || !horizontal), JSValueMakeUndefined(context)); GdkEvent event; event.type = GDK_SCROLL; event.scroll.x = lastMousePositionX; event.scroll.y = lastMousePositionY; event.scroll.time = GDK_CURRENT_TIME; event.scroll.window = GTK_WIDGET(view)->window; if (horizontal < 0) event.scroll.direction = GDK_SCROLL_LEFT; else if (horizontal > 0) event.scroll.direction = GDK_SCROLL_RIGHT; else if (vertical < 0) event.scroll.direction = GDK_SCROLL_UP; else if (vertical > 0) event.scroll.direction = GDK_SCROLL_DOWN; else g_assert_not_reached(); if (dragMode && down && !replayingSavedEvents) { msgQueue[endOfQueue].event = event; msgQueue[endOfQueue++].isDragEvent = true; } else { webkit_web_frame_layout(mainFrame); gtk_main_do_event(&event); } return JSValueMakeUndefined(context); }
static JSValueRef selectedRangeCallback(JSContextRef context, JSObjectRef function, JSObjectRef thisObject, size_t argumentCount, const JSValueRef arguments[], JSValueRef* exception) { WebKitWebView* view = webkit_web_frame_get_web_view(mainFrame); if (!view) return JSValueMakeUndefined(context); int start, end; if (!DumpRenderTreeSupportGtk::selectedRange(view, &start, &end)) return JSValueMakeUndefined(context); JSValueRef arrayValues[2]; arrayValues[0] = JSValueMakeNumber(context, start); arrayValues[1] = JSValueMakeNumber(context, end); JSObjectRef arrayObject = JSObjectMakeArray(context, 2, arrayValues, exception); g_return_val_if_fail((!exception || !*exception), JSValueMakeUndefined(context)); return arrayObject; }
void replaySavedEvents() { // FIXME: This doesn't deal with forward leaps, but it should. WebKitWebView* view = webkit_web_frame_get_web_view(mainFrame); if (!view) return; replayingSavedEvents = true; for (unsigned queuePos = 0; queuePos < endOfQueue; queuePos++) { GdkEvent event = msgQueue[queuePos].event; gboolean return_val; switch (event.type) { case GDK_BUTTON_RELEASE: g_signal_emit_by_name(view, "button_release_event", &event, &return_val); break; case GDK_BUTTON_PRESS: g_signal_emit_by_name(view, "button_press_event", &event, &return_val); break; case GDK_MOTION_NOTIFY: g_signal_emit_by_name(view, "motion_notify_event", &event, &return_val); break; default: continue; } startOfQueue++; } int numQueuedMessages = endOfQueue - startOfQueue; if (!numQueuedMessages) { startOfQueue = 0; endOfQueue = 0; replayingSavedEvents = false; return; } startOfQueue = 0; endOfQueue = 0; replayingSavedEvents = false; }
static void dispatchEvent(GdkEvent* event) { webkit_web_frame_layout(mainFrame); WebKitWebView* view = webkit_web_frame_get_web_view(mainFrame); if (!view) { gdk_event_free(event); return; } gtk_main_do_event(event); if (!currentDragSourceContext) { gdk_event_free(event); return; } if (event->type == GDK_MOTION_NOTIFY) { // WebKit has called gtk_drag_start(), but because the main loop isn't // running GDK internals don't know that the drag has started yet. Pump // the main loop a little bit so that GDK is in the correct state. while (gtk_events_pending()) gtk_main_iteration(); // Simulate a drag motion on the top-level GDK window. GtkWidget* parentWidget = gtk_widget_get_parent(GTK_WIDGET(view)); GdkWindow* parentWidgetWindow = gtk_widget_get_window(parentWidget); gdk_drag_motion(currentDragSourceContext, parentWidgetWindow, GDK_DRAG_PROTO_XDND, event->motion.x_root, event->motion.y_root, gdk_drag_context_get_selected_action(currentDragSourceContext), gdk_drag_context_get_actions(currentDragSourceContext), GDK_CURRENT_TIME); } else if (currentDragSourceContext && event->type == GDK_BUTTON_RELEASE) { // We've released the mouse button, we should just be able to spin the // event loop here and have GTK+ send the appropriate notifications for // the end of the drag. while (gtk_events_pending()) gtk_main_iteration(); } gdk_event_free(event); }
void LayoutTestController::setViewModeMediaFeature(JSStringRef mode) { WebKitWebView* view = webkit_web_frame_get_web_view(mainFrame); ASSERT(view); char* viewMode = JSStringCopyUTF8CString(mode); if (!g_strcmp0(viewMode, "windowed")) webkit_web_view_set_view_mode(view, WEBKIT_WEB_VIEW_VIEW_MODE_WINDOWED); else if (!g_strcmp0(viewMode, "floating")) webkit_web_view_set_view_mode(view, WEBKIT_WEB_VIEW_VIEW_MODE_FLOATING); else if (!g_strcmp0(viewMode, "fullscreen")) webkit_web_view_set_view_mode(view, WEBKIT_WEB_VIEW_VIEW_MODE_FULLSCREEN); else if (!g_strcmp0(viewMode, "maximized")) webkit_web_view_set_view_mode(view, WEBKIT_WEB_VIEW_VIEW_MODE_MAXIMIZED); else if (!g_strcmp0(viewMode, "minimized")) webkit_web_view_set_view_mode(view, WEBKIT_WEB_VIEW_VIEW_MODE_MINIMIZED); g_free(viewMode); }