diff options
| author | Simon Hausmann <simon.hausmann@nokia.com> | 2012-02-03 09:55:33 +0100 |
|---|---|---|
| committer | Simon Hausmann <simon.hausmann@nokia.com> | 2012-02-03 09:55:33 +0100 |
| commit | cd44dc59cdfc39534aef4d417e9f3c412e3be139 (patch) | |
| tree | 8d89889ba95ed6ec9322e733846cc9cce9d7dff1 /Source/WebKit/gtk | |
| parent | d11f84f5b5cdc0d92a08af01b13472fdd5f9acb9 (diff) | |
| download | qtwebkit-cd44dc59cdfc39534aef4d417e9f3c412e3be139.tar.gz | |
Imported WebKit commit fce473cb4d55aa9fe9d0b0322a2fffecb731b961 (http://svn.webkit.org/repository/webkit/trunk@106560)
Diffstat (limited to 'Source/WebKit/gtk')
| -rw-r--r-- | Source/WebKit/gtk/ChangeLog | 227 | ||||
| -rw-r--r-- | Source/WebKit/gtk/GNUmakefile.am | 4 | ||||
| -rw-r--r-- | Source/WebKit/gtk/NEWS | 25 | ||||
| -rw-r--r-- | Source/WebKit/gtk/WebCoreSupport/ChromeClientGtk.cpp | 15 | ||||
| -rw-r--r-- | Source/WebKit/gtk/WebCoreSupport/DumpRenderTreeSupportGtk.cpp | 8 | ||||
| -rw-r--r-- | Source/WebKit/gtk/WebCoreSupport/FrameLoaderClientGtk.cpp | 49 | ||||
| -rw-r--r-- | Source/WebKit/gtk/tests/testatk.c | 100 | ||||
| -rw-r--r-- | Source/WebKit/gtk/tests/testwebview.c | 20 | ||||
| -rw-r--r-- | Source/WebKit/gtk/webkit/webkitglobals.cpp | 6 | ||||
| -rw-r--r-- | Source/WebKit/gtk/webkit/webkitwebframe.cpp | 135 | ||||
| -rw-r--r-- | Source/WebKit/gtk/webkit/webkitwebresource.cpp | 88 | ||||
| -rw-r--r-- | Source/WebKit/gtk/webkit/webkitwebview.cpp | 101 | ||||
| -rw-r--r-- | Source/WebKit/gtk/webkitmarshal.list | 6 |
13 files changed, 730 insertions, 54 deletions
diff --git a/Source/WebKit/gtk/ChangeLog b/Source/WebKit/gtk/ChangeLog index 2c50a1bac..6dbea6560 100644 --- a/Source/WebKit/gtk/ChangeLog +++ b/Source/WebKit/gtk/ChangeLog @@ -1,3 +1,230 @@ +2012-02-02 Claudio Saavedra <csaavedra@igalia.com> and Martin Robinson <mrobinson@igalia.com> + + [GTK] WebKitWebView won't work in a GtkOffscreenWindow + https://bugs.webkit.org/show_bug.cgi?id=76911 + + Reviewed by Philippe Normand. + + * WebCoreSupport/ChromeClientGtk.cpp: + (WebKit::ChromeClient::windowRect): Use the new widgetIsOnscreenToplevelWindow helper. + (WebKit::ChromeClient::setWindowRect): Ditto. + (WebKit::ChromeClient::unfocus): Ditto. + (WebKit::ChromeClient::runOpenPanel): Ditto. + * tests/testwebview.c: Added a test to ensure that loading a page in an offscreen window does not crash. + * webkit/webkitglobals.cpp: + (currentToplevelCallback): + * webkit/webkitwebframe.cpp: + (webkit_web_frame_print_full): + (webkit_web_frame_print): + * webkit/webkitwebview.cpp: + (webkit_web_view_focus_in_event): + (webkit_web_view_script_dialog): + +2012-02-02 Mario Sanchez Prada <msanchez@igalia.com> + + [Gtk] atk_text_get_text_at_offset() sometimes fails to provide the correct line + https://bugs.webkit.org/show_bug.cgi?id=72382 + + Reviewed by Martin Robinson. + + New unit test to ensure the right line is retrieved for the first + position of each line in a multiline preformatted portion of text. + + * tests/testatk.c: + (testWebkitAtkGetTextAtOffsetWithPreformattedText): New unit test. + (main): Add the new unit test. + +2012-02-01 Philippe Normand <pnormand@igalia.com> + + [GStreamer] FFTFrame implementation + https://bugs.webkit.org/show_bug.cgi?id=73545 + + Reviewed by Chris Rogers. + + * GNUmakefile.am: Remove libfftw compilation flags. + +2012-02-01 Philippe Normand <pnormand@igalia.com> + + [GTK] unittests/testloading crashes + https://bugs.webkit.org/show_bug.cgi?id=77544 + + Reviewed by Xan Lopez. + + * WebCoreSupport/FrameLoaderClientGtk.cpp: + (WebKit::FrameLoaderClient::dispatchDidFailLoading): Bail out + early from dispatchDidFailLoading if the error is the result of an + interrupted load. + +2012-02-01 Philippe Normand <pnormand@igalia.com> and Sergio Villar Senin <svillar@igalia.com> + + Reviewed by Martin Robinson. + + [GTK] Improve FrameLoader signals. Resource loading + https://bugs.webkit.org/show_bug.cgi?id=49543 + + New signals: + WebKitWebFrame::resource-request-starting + WebKitWebFrame::resource-response-received + WebKitWebFrame::resource-load-finished + WebKitWebFrame::resource-content-length-received + WebKitWebFrame::resource-load-failed + WebKitWebResource::response-received + WebKitWebResource::load-failed + WebKitWebResource::load-finished + WebKitWebResource::content-length-received + WebKitWebView::resource-response-received + WebKitWebView::resource-load-finished + WebKitWebView::resource-content-length-received + WebKitWebView::resource-load-failed + + * WebCoreSupport/FrameLoaderClientGtk.cpp: + (WebKit::FrameLoaderClient::dispatchWillSendRequest): + (WebKit::FrameLoaderClient::dispatchDidReceiveResponse): + (WebKit::FrameLoaderClient::dispatchDidReceiveContentLength): + (WebKit::FrameLoaderClient::dispatchDidFinishLoading): + (WebKit::FrameLoaderClient::dispatchDidFailLoading): + * webkit/webkitwebframe.cpp: + (webkit_web_frame_class_init): + * webkit/webkitwebresource.cpp: + (webkit_web_resource_class_init): + * webkit/webkitwebview.cpp: + (webkit_web_view_class_init): + * webkitmarshal.list: + +2012-01-23 Mario Sanchez Prada <msanchez@igalia.com> + + [GTK] Refactor GTK's accessibilitity code to be more modular + https://bugs.webkit.org/show_bug.cgi?id=76783 + + Reviewed by Martin Robinson. + + Update callers to WebKitAccessible's public functions. + + * WebCoreSupport/DumpRenderTreeSupportGtk.cpp: + (DumpRenderTreeSupportGtk::getFocusedAccessibleElement): + (modifyAccessibilityValue): + (DumpRenderTreeSupportGtk::accessibilityHelpText): + +2012-01-22 Mario Sanchez Prada <msanchez@igalia.com> + + [GTK] Refactor GTK's accessibilitity code to be more modular + https://bugs.webkit.org/show_bug.cgi?id=76783 + + Reviewed by Martin Robinson. + + Update the include for the AccessibilityObject wrapper header. + + * WebCoreSupport/DumpRenderTreeSupportGtk.cpp: Update include. + * webkit/webkitwebframe.cpp: Ditto. + +2012-01-22 Mario Sanchez Prada <msanchez@igalia.com> + + [GTK] ATK text-caret-moved and text-selection-changed events not being emitted + https://bugs.webkit.org/show_bug.cgi?id=76069 + + Reviewed by Martin Robinson. + + Update caret browsing related unit tests to check emissions of + 'text-caret-moved' and 'text-selection-changed' signals. + + * tests/testatk.c: + (textCaretMovedCallback): New callback for 'text-caret-moved'. + (testWebkitAtkCaretOffsets): Check emissions of 'text-caret-moved'. + (textSelectionChangedCallback): New callback for 'text-selection-changed'. + (testWebkitAtkTextSelections): Check emissions of 'text-selection-changed'. + +2012-01-18 Evan Nemerson <evan@coeus-group.com> + + [GTK] WebKit-3.0.gir does not include information about C includes or exported packages + https://bugs.webkit.org/show_bug.cgi?id=49875 + + Reviewed by Martin Robinson. + + * GNUmakefile.am: Add some information to the GIR generator to fix + Vala binding generation. + +2012-01-18 Carlos Garnacho <carlosg@gnome.org> + + [GTK] Listen to GDK_SCROLL_MASK + https://bugs.webkit.org/show_bug.cgi?id=76529 + + Set GDK_SCROLL_MASK explicitly, as WebKitWebView does handle + scroll events, scrolling currently works because GTK+ happens + to send such events to widgets listening to GDK_BUTTON_PRESS_MASK, + but this isn't the intended behavior, so it's subject to change. + + Reviewed by Martin Robinson. + + * webkit/webkitwebview.cpp: + (webkit_web_view_realize): + +2012-01-17 Martin Robinson <mrobinson@igalia.com> + + [Gtk] Input text field not repainted when value is changed + https://bugs.webkit.org/show_bug.cgi?id=76279 + + Reviewed by Gustavo Noronha Silva. + + Force pending relayouts before freezing the dirty region in a temporary. + This prevents the following code from throwing the dirty updates away + after the original paint is finished. + + * WebCoreSupport/ChromeClientGtk.cpp: + (WebKit::paintWebView): Remove the relayout. + (WebKit::ChromeClient::paint): Move the relayout here, before the + dirty region is frozen. + +2012-01-16 Carlos Garcia Campos <cgarcia@igalia.com> + + [GTK] Update NEWS and configure.ac for 1.7.4 release + https://bugs.webkit.org/show_bug.cgi?id=76375 + + Reviewed by Philippe Normand. + + * NEWS: Added release notes for 1.7.4. + +2012-01-13 Mario Sanchez Prada <msanchez@igalia.com> + + Unreviewed, rolling out r104905. + http://trac.webkit.org/changeset/104905 + https://bugs.webkit.org/show_bug.cgi?id=76267 + + This patch broke tests in the GTK 64bit Debug bot (Requested + by msanchez on #webkit). + + * tests/testatk.c: + (testWebkitAtkCaretOffsets): + (testWebkitAtkTextSelections): + +2012-01-13 Mario Sanchez Prada <msanchez@igalia.com> + + [GTK] ATK text-caret-moved and text-selection-changed events not being emitted + https://bugs.webkit.org/show_bug.cgi?id=76069 + + Reviewed by Martin Robinson. + + Update caret browsing related unit tests to check emissions of + 'text-caret-moved' and 'text-selection-changed' signals. + + * tests/testatk.c: + (textCaretMovedCallback): New callback for 'text-caret-moved'. + (testWebkitAtkCaretOffsets): Check emissions of 'text-caret-moved'. + (textSelectionChangedCallback): New callback for 'text-selection-changed'. + (testWebkitAtkTextSelections): Check emissions of 'text-selection-changed'. + +2012-01-12 Mario Sanchez Prada <msanchez@igalia.com> + + [Gtk] Removed duplicated unit test. + + The unit test testWebkitAtkGetTextAtOffsetForms is exactly the + same test case than testWebkitAtkGetTextAtOffset, so it makes no + sense to have it duplicated. + + Rubber-stamped by Martin Robinson. + + * tests/testatk.c: + (main): Removed testWebkitAtkGetTextAtOffsetForms. + 2012-01-10 Mario Sanchez Prada <msanchez@igalia.com> AX: support helpText() in DumpRenderTree diff --git a/Source/WebKit/gtk/GNUmakefile.am b/Source/WebKit/gtk/GNUmakefile.am index 0a3348685..2472212e9 100644 --- a/Source/WebKit/gtk/GNUmakefile.am +++ b/Source/WebKit/gtk/GNUmakefile.am @@ -68,7 +68,6 @@ libwebkitgtk_@WEBKITGTK_API_MAJOR_VERSION@_@WEBKITGTK_API_MINOR_VERSION@_la_CPPF $(GSTREAMER_CFLAGS) \ $(GTK_CFLAGS) \ $(HILDON_CFLAGS) \ - $(LIBFFTW_CFLAGS) \ $(LIBSOUP_CFLAGS) \ $(LIBXML_CFLAGS) \ $(LIBXSLT_CFLAGS) \ @@ -101,7 +100,6 @@ libwebkitgtk_@WEBKITGTK_API_MAJOR_VERSION@_@WEBKITGTK_API_MINOR_VERSION@_la_LIBA $(GTK_LIBS) \ $(HILDON_LIBS) \ $(JPEG_LIBS) \ - $(LIBFFTW_LIBS) \ $(LIBSOUP_LIBS) \ $(LIBXML_LIBS) \ $(LIBXSLT_LIBS) \ @@ -294,9 +292,11 @@ $(WEBKIT_GIRSOURCES): $(G_IR_SCANNER) $(JSCORE_GIRSOURCES) libwebkitgtk-@WEBKITG --pkg=gobject-2.0 \ --pkg=gtk+-@GTK_API_VERSION@ \ --pkg=libsoup-2.4 \ + --pkg-export=webkitgtk-@WEBKITGTK_API_VERSION@ \ --output=$@ \ --add-include-path=$(WebKit) \ --add-include-path=$(top_builddir) \ + --c-include="webkit/webkit.h" \ -I$(srcdir)/Source \ -I$(WebKit) \ -I$(GENSOURCES) \ diff --git a/Source/WebKit/gtk/NEWS b/Source/WebKit/gtk/NEWS index 54e7ceab3..94096480d 100644 --- a/Source/WebKit/gtk/NEWS +++ b/Source/WebKit/gtk/NEWS @@ -1,4 +1,29 @@ ================= +WebKitGTK+ 1.7.4 +================= + +What's new in WebKitGTK+ 1.7.4? + + - Fix a11y regression: text-inserted events lack text inserted and + current line. + - Fix scrollbars in WebKit2 that were drawn behind the window resize + grip. + - Fix a memory leak in WebKitWebSourceGStreamer. + - Slider thumb is not centered on the track with the unico theme. + - Fix context menu in WebKit2 to not dissapear right after it's shown. + - Use GtkOrientable style class in GTK+ 3 theming code. + - Change default WebSocket protocol to the latest one (hybi-17). + - Fix scrollbars size with GTK+ 3.x to follow the current theme. + - Use gdk_screen_get_monitor_workarea() when available for + screenAvailableRect(). + - Rename webkit_web_view_load_alternate_html as + webkit_web_view_replace_content in WebKit2 GTK+. + - Fix emission of ATK text-caret-moved and text-selection-changed events. + - Add methods to get/set the WebView zoom level to WebKit2 GTK+ API. + - Make WebProcess and PluginProcess use the same locale as the UI process. + - Simplify WebKit2 loader client API. + +================= WebKitGTK+ 1.7.3 ================= diff --git a/Source/WebKit/gtk/WebCoreSupport/ChromeClientGtk.cpp b/Source/WebKit/gtk/WebCoreSupport/ChromeClientGtk.cpp index 29a84a6fe..137b918ad 100644 --- a/Source/WebKit/gtk/WebCoreSupport/ChromeClientGtk.cpp +++ b/Source/WebKit/gtk/WebCoreSupport/ChromeClientGtk.cpp @@ -5,6 +5,7 @@ * Copyright (C) 2008 Alp Toker <alp@atoker.com> * Copyright (C) 2008 Gustavo Noronha Silva <gns@gnome.org> * Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies). + * Copyright (C) 2012 Igalia S. L. * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public @@ -99,7 +100,7 @@ void ChromeClient::chromeDestroyed() FloatRect ChromeClient::windowRect() { GtkWidget* window = gtk_widget_get_toplevel(GTK_WIDGET(m_webView)); - if (gtk_widget_is_toplevel(window)) { + if (widgetIsOnscreenToplevelWindow(window)) { gint left, top, width, height; gtk_window_get_position(GTK_WINDOW(window), &left, &top); gtk_window_get_size(GTK_WINDOW(window), &width, &height); @@ -128,7 +129,7 @@ void ChromeClient::setWindowRect(const FloatRect& rect) return; GtkWidget* window = gtk_widget_get_toplevel(GTK_WIDGET(m_webView)); - if (gtk_widget_is_toplevel(window)) { + if (widgetIsOnscreenToplevelWindow(window)) { gtk_window_move(GTK_WINDOW(window), intrect.x(), intrect.y()); gtk_window_resize(GTK_WINDOW(window), intrect.width(), intrect.height()); } @@ -153,7 +154,7 @@ void ChromeClient::focus() void ChromeClient::unfocus() { GtkWidget* window = gtk_widget_get_toplevel(GTK_WIDGET(m_webView)); - if (gtk_widget_is_toplevel(window)) + if (widgetIsOnscreenToplevelWindow(window)) gtk_window_set_focus(GTK_WINDOW(window), NULL); } @@ -504,7 +505,6 @@ static void paintWebView(WebKitWebView* webView, Frame* frame, Region dirtyRegio Vector<IntRect> rects = dirtyRegion.rects(); coalesceRectsIfPossible(dirtyRegion.bounds(), rects); - frame->view()->updateLayoutAndStyleIfNeededRecursive(); RefPtr<cairo_t> backingStoreContext = adoptRef(cairo_create(webView->priv->backingStore->cairoSurface())); GraphicsContext gc(backingStoreContext.get()); @@ -560,6 +560,7 @@ void ChromeClient::paint(WebCore::Timer<ChromeClient>*) return; performAllPendingScrolls(); + frame->view()->updateLayoutAndStyleIfNeededRecursive(); paintWebView(m_webView, frame, m_dirtyRegion); const IntRect& rect = m_dirtyRegion.bounds(); @@ -775,8 +776,12 @@ void ChromeClient::runOpenPanel(Frame*, PassRefPtr<FileChooser> prpFileChooser) { RefPtr<FileChooser> chooser = prpFileChooser; + GtkWidget* toplevel = gtk_widget_get_toplevel(GTK_WIDGET(m_webView)); + if (!widgetIsOnscreenToplevelWindow(toplevel)) + toplevel = 0; + GtkWidget* dialog = gtk_file_chooser_dialog_new(_("Upload File"), - GTK_WINDOW(gtk_widget_get_toplevel(GTK_WIDGET(m_webView))), + toplevel ? GTK_WINDOW(toplevel) : 0, GTK_FILE_CHOOSER_ACTION_OPEN, GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL, GTK_STOCK_OPEN, GTK_RESPONSE_ACCEPT, diff --git a/Source/WebKit/gtk/WebCoreSupport/DumpRenderTreeSupportGtk.cpp b/Source/WebKit/gtk/WebCoreSupport/DumpRenderTreeSupportGtk.cpp index 19fc6fb6d..c59e1f792 100644 --- a/Source/WebKit/gtk/WebCoreSupport/DumpRenderTreeSupportGtk.cpp +++ b/Source/WebKit/gtk/WebCoreSupport/DumpRenderTreeSupportGtk.cpp @@ -25,7 +25,6 @@ #include "APICast.h" #include "AXObjectCache.h" #include "AccessibilityObject.h" -#include "AccessibilityObjectWrapperAtk.h" #include "AnimationController.h" #include "DOMWrapperWorld.h" #include "Document.h" @@ -60,6 +59,7 @@ #include "SecurityPolicy.h" #include "Settings.h" #include "TextIterator.h" +#include "WebKitAccessibleWrapperAtk.h" #include "WebKitDOMRangePrivate.h" #include "WorkerThread.h" #include "webkitglobalsprivate.h" @@ -484,7 +484,7 @@ AtkObject* DumpRenderTreeSupportGtk::getFocusedAccessibleElement(WebKitWebFrame* if (!wrapper) return 0; - return webkit_accessible_get_focused_element(WEBKIT_ACCESSIBLE(wrapper)); + return webkitAccessibleGetFocusedElement(WEBKIT_ACCESSIBLE(wrapper)); #else return 0; #endif @@ -761,7 +761,7 @@ static void modifyAccessibilityValue(AtkObject* axObject, bool increment) if (!axObject || !WEBKIT_IS_ACCESSIBLE(axObject)) return; - AccessibilityObject* coreObject = webkit_accessible_get_accessibility_object(WEBKIT_ACCESSIBLE(axObject)); + AccessibilityObject* coreObject = webkitAccessibleGetAccessibilityObject(WEBKIT_ACCESSIBLE(axObject)); if (!coreObject) return; @@ -786,7 +786,7 @@ CString DumpRenderTreeSupportGtk::accessibilityHelpText(AtkObject* axObject) if (!axObject || !WEBKIT_IS_ACCESSIBLE(axObject)) return CString(); - AccessibilityObject* coreObject = webkit_accessible_get_accessibility_object(WEBKIT_ACCESSIBLE(axObject)); + AccessibilityObject* coreObject = webkitAccessibleGetAccessibilityObject(WEBKIT_ACCESSIBLE(axObject)); if (!coreObject) return CString(); diff --git a/Source/WebKit/gtk/WebCoreSupport/FrameLoaderClientGtk.cpp b/Source/WebKit/gtk/WebCoreSupport/FrameLoaderClientGtk.cpp index d907b2bcf..60b00e893 100644 --- a/Source/WebKit/gtk/WebCoreSupport/FrameLoaderClientGtk.cpp +++ b/Source/WebKit/gtk/WebCoreSupport/FrameLoaderClientGtk.cpp @@ -233,8 +233,9 @@ void FrameLoaderClient::dispatchWillSendRequest(WebCore::DocumentLoader* loader, g_free(webResource->priv->uri); webResource->priv->uri = g_strdup(request.url().string().utf8().data()); } - + g_signal_emit_by_name(webView, "resource-request-starting", m_frame, webResource, networkRequest.get(), networkResponse.get()); + g_signal_emit_by_name(m_frame, "resource-request-starting", webResource, networkRequest.get(), networkResponse.get()); // Feed any changes back into the ResourceRequest object. SoupMessage* message = webkit_network_request_get_message(networkRequest.get()); @@ -298,13 +299,22 @@ void FrameLoaderClient::frameLoaderDestroyed() delete this; } -void FrameLoaderClient::dispatchDidReceiveResponse(WebCore::DocumentLoader* loader, unsigned long, const ResourceResponse& response) +void FrameLoaderClient::dispatchDidReceiveResponse(WebCore::DocumentLoader* loader, unsigned long identifier, const ResourceResponse& response) { // Update our knowledge of request soup flags - some are only set // after the request is done. loader->request().setSoupMessageFlags(response.soupMessageFlags()); m_response = response; + + WebKitWebView* webView = getViewFromFrame(m_frame); + GOwnPtr<gchar> identifierString(toString(identifier)); + WebKitWebResource* webResource = webkit_web_view_get_resource(webView, identifierString.get()); + GRefPtr<WebKitNetworkResponse> networkResponse(adoptGRef(kitNew(response))); + + g_signal_emit_by_name(webResource, "response-received", networkResponse.get()); + g_signal_emit_by_name(m_frame, "resource-response-received", webResource, networkResponse.get()); + g_signal_emit_by_name(webView, "resource-response-received", m_frame, webResource, networkResponse.get()); } void FrameLoaderClient::dispatchDecidePolicyForResponse(FramePolicyFunction policyFunction, const ResourceResponse& response, const ResourceRequest& resourceRequest) @@ -992,7 +1002,13 @@ void FrameLoaderClient::setTitle(const StringWithDirection& title, const KURL& u void FrameLoaderClient::dispatchDidReceiveContentLength(WebCore::DocumentLoader*, unsigned long identifier, int dataLength) { - notImplemented(); + WebKitWebView* webView = getViewFromFrame(m_frame); + GOwnPtr<gchar> identifierString(toString(identifier)); + WebKitWebResource* webResource = webkit_web_view_get_resource(webView, identifierString.get()); + + g_signal_emit_by_name(webResource, "content-length-received", dataLength); + g_signal_emit_by_name(m_frame, "resource-content-length-received", webResource, dataLength); + g_signal_emit_by_name(webView, "resource-content-length-received", m_frame, webResource, dataLength); } void FrameLoaderClient::dispatchDidFinishLoading(WebCore::DocumentLoader* loader, unsigned long identifier) @@ -1021,20 +1037,31 @@ void FrameLoaderClient::dispatchDidFinishLoading(WebCore::DocumentLoader* loader webkit_web_resource_init_with_core_resource(webResource, coreResource.get()); - // FIXME: This function should notify the application that the resource - // finished loading, maybe using a load-status property in the - // WebKitWebResource object, similar to what we do for WebKitWebFrame' - // signal. - notImplemented(); + g_signal_emit_by_name(webResource, "load-finished"); + g_signal_emit_by_name(m_frame, "resource-load-finished", webResource); + g_signal_emit_by_name(webView, "resource-load-finished", m_frame, webResource); } void FrameLoaderClient::dispatchDidFailLoading(WebCore::DocumentLoader* loader, unsigned long identifier, const ResourceError& error) { static_cast<WebKit::DocumentLoader*>(loader)->decreaseLoadCount(identifier); - // FIXME: This function should notify the application that the resource failed - // loading, maybe a 'load-error' signal in the WebKitWebResource object. - notImplemented(); + WebKitWebView* webView = getViewFromFrame(m_frame); + GOwnPtr<gchar> identifierString(toString(identifier)); + WebKitWebResource* webResource = webkit_web_view_get_resource(webView, identifierString.get()); + + // A NULL WebResource means the load has been interrupted, and + // replaced by another one while this resource was being loaded. + if (!webResource) + return; + + GOwnPtr<GError> webError(g_error_new_literal(g_quark_from_string(error.domain().utf8().data()), + error.errorCode(), + error.localizedDescription().utf8().data())); + + g_signal_emit_by_name(webResource, "load-failed", webError.get()); + g_signal_emit_by_name(m_frame, "resource-load-failed", webResource, webError.get()); + g_signal_emit_by_name(webView, "resource-load-failed", m_frame, webResource, webError.get()); } bool FrameLoaderClient::dispatchDidLoadResourceFromMemoryCache(WebCore::DocumentLoader*, const ResourceRequest&, const ResourceResponse&, int length) diff --git a/Source/WebKit/gtk/tests/testatk.c b/Source/WebKit/gtk/tests/testatk.c index e852deeed..a79010175 100644 --- a/Source/WebKit/gtk/tests/testatk.c +++ b/Source/WebKit/gtk/tests/testatk.c @@ -33,6 +33,8 @@ static const char* contents = "<html><body><p>This is a test. This is the second static const char* contentsWithNewlines = "<html><body><p>This is a test. \n\nThis\n is the second sentence. And this the third.</p></body></html>"; +static const char* contentsWithPreformattedText = "<html><body><pre>\n\t\n\tfirst line\n\tsecond line\n</pre></body></html>"; + static const char* contentsWithSpecialChars = "<html><body><p>« This is a paragraph with “special” characters inside. »</p></body></html>"; static const char* contentsInTextarea = "<html><body><textarea cols='80'>This is a test. This is the second sentence. And this the third.</textarea></body></html>"; @@ -254,6 +256,17 @@ static void runGetTextTests(AtkText* textObject) } } +static gchar* textCaretMovedResult = 0; + +static void textCaretMovedCallback(AtkText* text, gint pos, gpointer data) +{ + g_assert(ATK_IS_TEXT(text)); + + g_free(textCaretMovedResult); + AtkRole role = atk_object_get_role(ATK_OBJECT(text)); + textCaretMovedResult = g_strdup_printf("|%s|%d|", atk_role_get_name(role), pos); +} + static void testWebkitAtkCaretOffsets() { WebKitWebView* webView = WEBKIT_WEB_VIEW(webkit_web_view_new()); @@ -267,6 +280,8 @@ static void testWebkitAtkCaretOffsets() AtkObject* header = atk_object_ref_accessible_child(object, 0); g_assert(ATK_IS_TEXT(header)); + g_signal_connect(header, "text-caret-moved", G_CALLBACK(textCaretMovedCallback), 0); + gchar* text = atk_text_get_text(ATK_TEXT(header), 0, -1); g_assert_cmpstr(text, ==, "A text header"); g_free (text); @@ -276,9 +291,12 @@ static void testWebkitAtkCaretOffsets() g_assert_cmpint(result, ==, TRUE); gint offset = atk_text_get_caret_offset(ATK_TEXT(header)); g_assert_cmpint(offset, ==, 5); + g_assert_cmpstr(textCaretMovedResult, ==, "|heading|5|"); AtkObject* paragraph = atk_object_ref_accessible_child(object, 1); g_assert(ATK_IS_TEXT(paragraph)); + g_signal_connect(paragraph, "text-caret-moved", G_CALLBACK(textCaretMovedCallback), 0); + text = atk_text_get_text(ATK_TEXT(paragraph), 0, -1); g_assert_cmpstr(text, ==, "A paragraph with a link in the middle"); g_free (text); @@ -288,16 +306,32 @@ static void testWebkitAtkCaretOffsets() g_assert_cmpint(result, ==, TRUE); offset = atk_text_get_caret_offset(ATK_TEXT(paragraph)); g_assert_cmpint(offset, ==, 5); + g_assert_cmpstr(textCaretMovedResult, ==, "|paragraph|5|"); result = atk_text_set_caret_offset(ATK_TEXT(paragraph), 20); g_assert_cmpint(result, ==, TRUE); offset = atk_text_get_caret_offset(ATK_TEXT(paragraph)); g_assert_cmpint(offset, ==, 20); + g_assert_cmpstr(textCaretMovedResult, ==, "|paragraph|20|"); result = atk_text_set_caret_offset(ATK_TEXT(paragraph), 30); g_assert_cmpint(result, ==, TRUE); offset = atk_text_get_caret_offset(ATK_TEXT(paragraph)); g_assert_cmpint(offset, ==, 30); + g_assert_cmpstr(textCaretMovedResult, ==, "|paragraph|30|"); + + AtkObject* link = atk_object_ref_accessible_child(paragraph, 0); + g_assert(ATK_IS_TEXT(link)); + text = atk_text_get_text(ATK_TEXT(link), 0, -1); + g_assert_cmpstr(text, ==, "with a link"); + g_free (text); + + result = atk_text_set_caret_offset(ATK_TEXT(link), 5); + g_assert_cmpint(result, ==, TRUE); + offset = atk_text_get_caret_offset(ATK_TEXT(link)); + g_assert_cmpint(offset, ==, 5); + /* Positions inside links are reported relative to the paragraph. */ + g_assert_cmpstr(textCaretMovedResult, ==, "|paragraph|17|"); AtkObject* list = atk_object_ref_accessible_child(object, 2); g_assert(ATK_OBJECT(list)); @@ -355,8 +389,11 @@ static void testWebkitAtkCaretOffsets() offset = atk_text_get_caret_offset(ATK_TEXT(textEntry)); g_assert_cmpint(offset, ==, 5); + g_free(textCaretMovedResult); + g_object_unref(header); g_object_unref(paragraph); + g_object_unref(link); g_object_unref(list); g_object_unref(listItem); g_object_unref(panel); @@ -642,7 +679,7 @@ static void testWebkitAtkEmbeddedObjects() g_object_unref(webView); } -static void testWebkitAtkGetTextAtOffsetForms() +static void testWebkitAtkGetTextAtOffset() { WebKitWebView* webView = WEBKIT_WEB_VIEW(webkit_web_view_new()); g_object_ref_sink(webView); @@ -664,13 +701,13 @@ static void testWebkitAtkGetTextAtOffsetForms() g_object_unref(webView); } -static void testWebkitAtkGetTextAtOffset() +static void testWebkitAtkGetTextAtOffsetNewlines() { WebKitWebView* webView = WEBKIT_WEB_VIEW(webkit_web_view_new()); g_object_ref_sink(webView); GtkAllocation allocation = { 0, 0, 800, 600 }; gtk_widget_size_allocate(GTK_WIDGET(webView), &allocation); - webkit_web_view_load_string(webView, contents, 0, 0, 0); + webkit_web_view_load_string(webView, contentsWithNewlines, 0, 0, 0); /* Get to the inner AtkText object. */ AtkObject* object = getWebAreaObject(webView); @@ -686,19 +723,21 @@ static void testWebkitAtkGetTextAtOffset() g_object_unref(webView); } -static void testWebkitAtkGetTextAtOffsetNewlines() +static void testWebkitAtkGetTextAtOffsetTextarea() { WebKitWebView* webView = WEBKIT_WEB_VIEW(webkit_web_view_new()); g_object_ref_sink(webView); GtkAllocation allocation = { 0, 0, 800, 600 }; gtk_widget_size_allocate(GTK_WIDGET(webView), &allocation); - webkit_web_view_load_string(webView, contentsWithNewlines, 0, 0, 0); + webkit_web_view_load_string(webView, contentsInTextarea, 0, 0, 0); /* Get to the inner AtkText object. */ AtkObject* object = getWebAreaObject(webView); g_assert(object); object = atk_object_ref_accessible_child(object, 0); g_assert(object); + object = atk_object_ref_accessible_child(object, 0); + g_assert(object); AtkText* textObject = ATK_TEXT(object); g_assert(ATK_IS_TEXT(textObject)); @@ -708,13 +747,13 @@ static void testWebkitAtkGetTextAtOffsetNewlines() g_object_unref(webView); } -static void testWebkitAtkGetTextAtOffsetTextarea() +static void testWebkitAtkGetTextAtOffsetTextInput() { WebKitWebView* webView = WEBKIT_WEB_VIEW(webkit_web_view_new()); g_object_ref_sink(webView); GtkAllocation allocation = { 0, 0, 800, 600 }; gtk_widget_size_allocate(GTK_WIDGET(webView), &allocation); - webkit_web_view_load_string(webView, contentsInTextarea, 0, 0, 0); + webkit_web_view_load_string(webView, contentsInTextInput, 0, 0, 0); /* Get to the inner AtkText object. */ AtkObject* object = getWebAreaObject(webView); @@ -732,27 +771,31 @@ static void testWebkitAtkGetTextAtOffsetTextarea() g_object_unref(webView); } -static void testWebkitAtkGetTextAtOffsetTextInput() +static void testWebkitAtkGetTextAtOffsetWithPreformattedText() { WebKitWebView* webView = WEBKIT_WEB_VIEW(webkit_web_view_new()); g_object_ref_sink(webView); GtkAllocation allocation = { 0, 0, 800, 600 }; gtk_widget_size_allocate(GTK_WIDGET(webView), &allocation); - webkit_web_view_load_string(webView, contentsInTextInput, 0, 0, 0); + webkit_web_view_load_string(webView, contentsWithPreformattedText, 0, 0, 0); - /* Get to the inner AtkText object. */ AtkObject* object = getWebAreaObject(webView); g_assert(object); - object = atk_object_ref_accessible_child(object, 0); - g_assert(object); - object = atk_object_ref_accessible_child(object, 0); - g_assert(object); - AtkText* textObject = ATK_TEXT(object); - g_assert(ATK_IS_TEXT(textObject)); + AtkObject* preformattedText = atk_object_ref_accessible_child(object, 0); + g_assert(ATK_IS_OBJECT(preformattedText)); + g_assert(atk_object_get_role(preformattedText) == ATK_ROLE_PANEL); + g_assert(ATK_IS_TEXT(preformattedText)); + char* text = atk_text_get_text(ATK_TEXT(preformattedText), 0, -1); + g_assert_cmpstr(text, ==, "\t\n\tfirst line\n\tsecond line\n"); + g_free(text); - runGetTextTests(textObject); + /* Try retrieving all the lines indicating the position of the offsets at the beginning of each of them. */ + testGetTextFunction(ATK_TEXT(preformattedText), atk_text_get_text_at_offset, ATK_TEXT_BOUNDARY_LINE_START, 0, "\t\n", 0, 2); + testGetTextFunction(ATK_TEXT(preformattedText), atk_text_get_text_at_offset, ATK_TEXT_BOUNDARY_LINE_START, 2, "\tfirst line\n", 2, 14); + testGetTextFunction(ATK_TEXT(preformattedText), atk_text_get_text_at_offset, ATK_TEXT_BOUNDARY_LINE_START, 14, "\tsecond line\n", 14, 27); + g_object_unref(preformattedText); g_object_unref(webView); } @@ -1109,6 +1152,20 @@ static void testWebkitAtkTextAttributes() atk_attribute_set_free(set3); } +static gchar* textSelectionChangedResult = 0; + +static void textSelectionChangedCallback(AtkText* text, gpointer data) +{ + g_assert(ATK_IS_TEXT(text)); + + g_free(textSelectionChangedResult); + AtkRole role = atk_object_get_role(ATK_OBJECT(text)); + int startOffset = 0; + int endOffset = 0; + atk_text_get_selection(ATK_TEXT(text), 0, &startOffset, &endOffset); + textSelectionChangedResult = g_strdup_printf("|%s|%d|%d|", atk_role_get_name(role), startOffset, endOffset); +} + static void testWebkitAtkTextSelections() { WebKitWebView* webView = WEBKIT_WEB_VIEW(webkit_web_view_new()); @@ -1122,9 +1179,11 @@ static void testWebkitAtkTextSelections() AtkText* paragraph1 = ATK_TEXT(atk_object_ref_accessible_child(object, 0)); g_assert(ATK_IS_TEXT(paragraph1)); + g_signal_connect(paragraph1, "text-selection-changed", G_CALLBACK(textSelectionChangedCallback), 0); AtkText* paragraph2 = ATK_TEXT(atk_object_ref_accessible_child(object, 1)); g_assert(ATK_IS_TEXT(paragraph2)); + g_signal_connect(paragraph2, "text-selection-changed", G_CALLBACK(textSelectionChangedCallback), 0); AtkText* link = ATK_TEXT(atk_object_ref_accessible_child(ATK_OBJECT(paragraph2), 0)); g_assert(ATK_IS_TEXT(link)); @@ -1160,11 +1219,13 @@ static void testWebkitAtkTextSelections() result = atk_text_set_selection(paragraph1, 0, 5, 25); g_assert(result); g_assert_cmpint(atk_text_get_n_selections(paragraph1), ==, 1); + g_assert_cmpstr(textSelectionChangedResult, ==, "|paragraph|5|25|"); selectedText = atk_text_get_selection(paragraph1, 0, &startOffset, &endOffset); g_assert_cmpint(startOffset, ==, 5); g_assert_cmpint(endOffset, ==, 25); g_assert_cmpstr(selectedText, ==, "agraph with plain te"); g_free (selectedText); + /* Try removing the selection from other AtkText object (should fail). */ result = atk_text_remove_selection(paragraph2, 0); g_assert(!result); @@ -1207,6 +1268,7 @@ static void testWebkitAtkTextSelections() result = atk_text_set_selection(paragraph2, 0, 27, 37); g_assert(result); g_assert_cmpint(atk_text_get_n_selections(paragraph2), ==, 1); + g_assert_cmpstr(textSelectionChangedResult, ==, "|paragraph|27|37|"); selectedText = atk_text_get_selection(paragraph2, 0, &startOffset, &endOffset); g_assert_cmpint(startOffset, ==, 27); g_assert_cmpint(endOffset, ==, 37); @@ -1256,6 +1318,8 @@ static void testWebkitAtkTextSelections() g_assert_cmpstr(selectedText, ==, "A list"); g_free (selectedText); + g_free(textSelectionChangedResult); + g_object_unref(paragraph1); g_object_unref(paragraph2); g_object_unref(list); @@ -1794,10 +1858,10 @@ int main(int argc, char** argv) g_test_add_func("/webkit/atk/documentLoadingEvents", testWebkitAtkDocumentLoadingEvents); g_test_add_func("/webkit/atk/embeddedObjects", testWebkitAtkEmbeddedObjects); g_test_add_func("/webkit/atk/getTextAtOffset", testWebkitAtkGetTextAtOffset); - g_test_add_func("/webkit/atk/getTextAtOffsetForms", testWebkitAtkGetTextAtOffsetForms); g_test_add_func("/webkit/atk/getTextAtOffsetNewlines", testWebkitAtkGetTextAtOffsetNewlines); g_test_add_func("/webkit/atk/getTextAtOffsetTextarea", testWebkitAtkGetTextAtOffsetTextarea); g_test_add_func("/webkit/atk/getTextAtOffsetTextInput", testWebkitAtkGetTextAtOffsetTextInput); + g_test_add_func("/webkit/atk/getTextAtOffsetWithPreformattedText", testWebkitAtkGetTextAtOffsetWithPreformattedText); g_test_add_func("/webkit/atk/getTextAtOffsetWithSpecialCharacters", testWebkitAtkGetTextAtOffsetWithSpecialCharacters); g_test_add_func("/webkit/atk/getTextInParagraphAndBodySimple", testWebkitAtkGetTextInParagraphAndBodySimple); g_test_add_func("/webkit/atk/getTextInParagraphAndBodyModerate", testWebkitAtkGetTextInParagraphAndBodyModerate); diff --git a/Source/WebKit/gtk/tests/testwebview.c b/Source/WebKit/gtk/tests/testwebview.c index 335ffdd22..41cf308f6 100644 --- a/Source/WebKit/gtk/tests/testwebview.c +++ b/Source/WebKit/gtk/tests/testwebview.c @@ -1,6 +1,7 @@ /* * Copyright (C) 2008 Holger Hans Peter Freyther * Copyright (C) 2009, 2010 Collabora Ltd. + * Copyright (C) 2012 Igalia S.L. * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Library General Public @@ -363,6 +364,24 @@ static void test_webkit_web_view_window_features() gtk_widget_destroy(window); } +static void test_webkit_web_view_in_offscreen_window_does_not_crash() +{ + loop = g_main_loop_new(NULL, TRUE); + + GtkWidget *window = gtk_offscreen_window_new(); + GtkWidget *web_view = webkit_web_view_new(); + + gtk_container_add(GTK_CONTAINER(window), web_view); + gtk_widget_show_all(window); + g_signal_connect(web_view, "notify::load-status", G_CALLBACK(idle_quit_loop_cb), NULL); + webkit_web_view_load_uri(WEBKIT_WEB_VIEW(web_view), base_uri); + + g_main_loop_run(loop); + + gtk_widget_destroy(window); + g_main_loop_unref(loop); +} + int main(int argc, char** argv) { SoupServer* server; @@ -390,6 +409,7 @@ int main(int argc, char** argv) g_test_add_func("/webkit/webview/destroy", test_webkit_web_view_destroy); g_test_add_func("/webkit/webview/grab_focus", test_webkit_web_view_grab_focus); g_test_add_func("/webkit/webview/window-features", test_webkit_web_view_window_features); + g_test_add_func("/webkit/webview/webview-in-offscreen-window-does-not-crash", test_webkit_web_view_in_offscreen_window_does_not_crash); return g_test_run (); } diff --git a/Source/WebKit/gtk/webkit/webkitglobals.cpp b/Source/WebKit/gtk/webkit/webkitglobals.cpp index 71433c893..3967c6376 100644 --- a/Source/WebKit/gtk/webkit/webkitglobals.cpp +++ b/Source/WebKit/gtk/webkit/webkitglobals.cpp @@ -24,6 +24,7 @@ #include "ApplicationCacheStorage.h" #include "Chrome.h" #include "FrameNetworkingContextGtk.h" +#include "GtkUtilities.h" #include "GOwnPtr.h" #include "GRefPtr.h" #include "IconDatabase.h" @@ -225,10 +226,7 @@ static GtkWidget* currentToplevelCallback(WebKitSoupAuthDialog* feature, SoupMes return NULL; GtkWidget* toplevel = gtk_widget_get_toplevel(GTK_WIDGET(context->coreFrame()->page()->chrome()->platformPageClient())); - if (gtk_widget_is_toplevel(toplevel)) - return toplevel; - else - return NULL; + return widgetIsOnscreenToplevelWindow(toplevel) ? toplevel : 0; } /** diff --git a/Source/WebKit/gtk/webkit/webkitwebframe.cpp b/Source/WebKit/gtk/webkit/webkitwebframe.cpp index 0ccddd1cd..4de192704 100644 --- a/Source/WebKit/gtk/webkit/webkitwebframe.cpp +++ b/Source/WebKit/gtk/webkit/webkitwebframe.cpp @@ -28,7 +28,6 @@ #include "webkitwebframe.h" #include "AXObjectCache.h" -#include "AccessibilityObjectWrapperAtk.h" #include "AnimationController.h" #include "DOMObjectCache.h" #include "DocumentFragment.h" @@ -41,6 +40,7 @@ #include "FrameView.h" #include "GCController.h" #include "GraphicsContext.h" +#include "GtkUtilities.h" #include "GtkVersioning.h" #include "HTMLFrameOwnerElement.h" #include "JSDOMBinding.h" @@ -55,15 +55,18 @@ #include "ScriptController.h" #include "SubstituteData.h" #include "TextIterator.h" +#include "WebKitAccessibleWrapperAtk.h" #include "markup.h" #include "webkit/WebKitDOMRangePrivate.h" #include "webkitenumtypes.h" #include "webkitglobalsprivate.h" #include "webkitmarshal.h" +#include "webkitnetworkresponse.h" #include "webkitnetworkrequestprivate.h" #include "webkitnetworkresponseprivate.h" #include "webkitsecurityoriginprivate.h" #include "webkitwebframeprivate.h" +#include "webkitwebresource.h" #include "webkitwebview.h" #include "webkitwebviewprivate.h" #include <JavaScriptCore/APICast.h> @@ -104,6 +107,13 @@ enum { TITLE_CHANGED, HOVERING_OVER_LINK, SCROLLBARS_POLICY_CHANGED, + // Resource loading signals + RESOURCE_REQUEST_STARTING, + RESOURCE_RESPONSE_RECEIVED, + RESOURCE_LOAD_FINISHED, + RESOURCE_CONTENT_LENGTH_RECEIVED, + RESOURCE_LOAD_FAILED, + LAST_SIGNAL }; @@ -301,6 +311,124 @@ static void webkit_web_frame_class_init(WebKitWebFrameClass* frameClass) webkit_marshal_BOOLEAN__VOID, G_TYPE_BOOLEAN, 0); + + /** + * WebKitWebFrame::resource-request-starting: + * @web_frame: the #WebKitWebFrame whose load dispatched this request + * @web_resource: an empty #WebKitWebResource object + * @request: the #WebKitNetworkRequest that will be dispatched + * @response: the #WebKitNetworkResponse representing the redirect + * response, if any + * + * Emitted when a request is about to be sent. You can modify the + * request while handling this signal. You can set the URI in the + * #WebKitNetworkRequest object itself, and add/remove/replace + * headers using the #SoupMessage object it carries, if it is + * present. See webkit_network_request_get_message(). Setting the + * request URI to "about:blank" will effectively cause the request + * to load nothing, and can be used to disable the loading of + * specific resources. + * + * Notice that information about an eventual redirect is available + * in @response's #SoupMessage, not in the #SoupMessage carried by + * the @request. If @response is %NULL, then this is not a + * redirected request. + * + * The #WebKitWebResource object will be the same throughout all + * the lifetime of the resource, but the contents may change + * between signal emissions. + * + * Since: 1.7.5 + */ + webkit_web_frame_signals[RESOURCE_REQUEST_STARTING] = g_signal_new("resource-request-starting", + G_TYPE_FROM_CLASS(frameClass), + G_SIGNAL_RUN_LAST, + 0, + 0, 0, + webkit_marshal_VOID__OBJECT_OBJECT_OBJECT, + G_TYPE_NONE, 3, + WEBKIT_TYPE_WEB_RESOURCE, + WEBKIT_TYPE_NETWORK_REQUEST, + WEBKIT_TYPE_NETWORK_RESPONSE); + + /* + * WebKitWebFrame::resource-response-received + * @webFrame: the #WebKitWebFrame the response was received for + * @webResource: the #WebKitWebResource being loaded + * @response: the #WebKitNetworkResponse that was received. + * + * Emitted when the first byte of data arrives + * + * Since: 1.7.5 + */ + webkit_web_frame_signals[RESOURCE_RESPONSE_RECEIVED] = g_signal_new("resource-response-received", + G_TYPE_FROM_CLASS(frameClass), + G_SIGNAL_RUN_LAST, + 0, + 0, 0, + webkit_marshal_VOID__OBJECT_OBJECT, + G_TYPE_NONE, 2, + WEBKIT_TYPE_WEB_RESOURCE, + WEBKIT_TYPE_NETWORK_RESPONSE); + + /* + * WebKitWebFrame::resource-load-finished + * @webFrame: the #WebKitWebFrame the response was received for + * @webResource: the #WebKitWebResource being loaded + * + * Emitted when all the data for the resource was loaded. + * + * Since: 1.7.5 + */ + webkit_web_frame_signals[RESOURCE_LOAD_FINISHED] = g_signal_new("resource-load-finished", + G_TYPE_FROM_CLASS(frameClass), + G_SIGNAL_RUN_LAST, + 0, + 0, 0, + g_cclosure_marshal_VOID__OBJECT, + G_TYPE_NONE, 1, + WEBKIT_TYPE_WEB_RESOURCE); + + /* + * WebKitWebFrame::resource-content-length-received + * @webFrame: the #WebKitWebFrame the response was received for + * @webResource: the #WebKitWebResource that was loaded + * @lengthReceived: the resource data length in bytes + * + * Emitted when all the data for the resource was loaded. + * + * Since: 1.7.5 + */ + webkit_web_frame_signals[RESOURCE_CONTENT_LENGTH_RECEIVED] = g_signal_new("resource-content-length-received", + G_TYPE_FROM_CLASS(frameClass), + G_SIGNAL_RUN_LAST, + 0, + 0, 0, + webkit_marshal_VOID__OBJECT_INT, + G_TYPE_NONE, 2, + WEBKIT_TYPE_WEB_RESOURCE, + G_TYPE_INT); + + /* + * WebKitWebFrame::resource-load-failed + * @webFrame: the #WebKitWebFrame the response was received for + * @webResource: the #WebKitWebResource that was loaded + * @webError: the #GError that was triggered + * + * Invoked when a resource failed to load. + * + * Since: 1.7.5 + */ + webkit_web_frame_signals[RESOURCE_LOAD_FAILED] = g_signal_new("resource-load-failed", + G_TYPE_FROM_CLASS(frameClass), + G_SIGNAL_RUN_LAST, + 0, + 0, 0, + webkit_marshal_VOID__OBJECT_POINTER, + G_TYPE_NONE, 2, + WEBKIT_TYPE_WEB_RESOURCE, + G_TYPE_POINTER); + /* * implementations of virtual methods */ @@ -813,8 +941,7 @@ GtkPrintOperationResult webkit_web_frame_print_full(WebKitWebFrame* frame, GtkPr g_return_val_if_fail(GTK_IS_PRINT_OPERATION(operation), GTK_PRINT_OPERATION_RESULT_ERROR); GtkWidget* topLevel = gtk_widget_get_toplevel(GTK_WIDGET(webkit_web_frame_get_web_view(frame))); - - if (!gtk_widget_is_toplevel(topLevel)) + if (!widgetIsOnscreenToplevelWindow(topLevel)) topLevel = 0; Frame* coreFrame = core(frame); @@ -853,7 +980,7 @@ void webkit_web_frame_print(WebKitWebFrame* frame) if (error) { GtkWidget* window = gtk_widget_get_toplevel(GTK_WIDGET(priv->webView)); - GtkWidget* dialog = gtk_message_dialog_new(gtk_widget_is_toplevel(window) ? GTK_WINDOW(window) : 0, + GtkWidget* dialog = gtk_message_dialog_new(widgetIsOnscreenToplevelWindow(window) ? GTK_WINDOW(window) : 0, GTK_DIALOG_DESTROY_WITH_PARENT, GTK_MESSAGE_ERROR, GTK_BUTTONS_CLOSE, diff --git a/Source/WebKit/gtk/webkit/webkitwebresource.cpp b/Source/WebKit/gtk/webkit/webkitwebresource.cpp index 870b9c87f..f3239626b 100644 --- a/Source/WebKit/gtk/webkit/webkitwebresource.cpp +++ b/Source/WebKit/gtk/webkit/webkitwebresource.cpp @@ -27,6 +27,7 @@ #include "webkitenumtypes.h" #include "webkitglobalsprivate.h" #include "webkitmarshal.h" +#include "webkitnetworkresponse.h" #include "webkitwebresourceprivate.h" #include <glib.h> #include <glib/gi18n-lib.h> @@ -45,14 +46,25 @@ using namespace WebCore; enum { - PROP_0, + // Resource loading + RESPONSE_RECEIVED, + LOAD_FINISHED, + CONTENT_LENGTH_RECEIVED, + LOAD_FAILED, + + LAST_SIGNAL +}; +enum { + PROP_0, PROP_URI, PROP_MIME_TYPE, PROP_ENCODING, PROP_FRAME_NAME }; +static guint webkit_web_resource_signals[LAST_SIGNAL] = { 0, }; + G_DEFINE_TYPE(WebKitWebResource, webkit_web_resource, G_TYPE_OBJECT); static void webkit_web_resource_get_property(GObject* object, guint prop_id, GValue* value, GParamSpec* pspec); @@ -101,15 +113,85 @@ static void webkit_web_resource_finalize(GObject* object) G_OBJECT_CLASS(webkit_web_resource_parent_class)->finalize(object); } -static void webkit_web_resource_class_init(WebKitWebResourceClass* klass) +static void webkit_web_resource_class_init(WebKitWebResourceClass* webResourceClass) { - GObjectClass* gobject_class = G_OBJECT_CLASS(klass); + GObjectClass* gobject_class = G_OBJECT_CLASS(webResourceClass); gobject_class->dispose = webkit_web_resource_dispose; gobject_class->finalize = webkit_web_resource_finalize; gobject_class->get_property = webkit_web_resource_get_property; gobject_class->set_property = webkit_web_resource_set_property; + /* + * WebKitWebResource::response-received + * @webResource: the #WebKitWebResource being loaded + * @response: the #WebKitNetworkResponse that was received + * + * Emitted when the first byte of data arrives + * + * Since: 1.7.5 + */ + webkit_web_resource_signals[RESPONSE_RECEIVED] = g_signal_new("response-received", + G_TYPE_FROM_CLASS(webResourceClass), + G_SIGNAL_RUN_LAST, + 0, + 0, 0, + g_cclosure_marshal_VOID__OBJECT, + G_TYPE_NONE, 1, + WEBKIT_TYPE_NETWORK_RESPONSE); + + /* + * WebKitWebResource::load-failed + * @webResource: the #WebKitWebResource that was loaded + * @webError: the #GError that was triggered + * + * Invoked when a resource failed to load + * + * Since: 1.7.5 + */ + webkit_web_resource_signals[LOAD_FAILED] = g_signal_new("load-failed", + G_TYPE_FROM_CLASS(webResourceClass), + G_SIGNAL_RUN_LAST, + 0, + 0, 0, + g_cclosure_marshal_VOID__OBJECT, + G_TYPE_NONE, 1, + G_TYPE_POINTER); + + /* + * WebKitWebResource::load-finished + * @webResource: the #WebKitWebResource being loaded + * + * Emitted when all the data for the resource was loaded + * + * Since: 1.7.5 + */ + webkit_web_resource_signals[LOAD_FINISHED] = g_signal_new("load-finished", + G_TYPE_FROM_CLASS(webResourceClass), + G_SIGNAL_RUN_LAST, + 0, + 0, 0, + g_cclosure_marshal_VOID__VOID, + G_TYPE_NONE, 0); + + /* + * WebKitWebResource::content-length-received + * @webResource: the #WebKitWebResource that was loaded + * @lengthReceived: the resource data length in bytes + * + * Emitted when all the data for the resource was loaded + * + * Since: 1.7.5 + */ + webkit_web_resource_signals[CONTENT_LENGTH_RECEIVED] = g_signal_new("content-length-received", + G_TYPE_FROM_CLASS(webResourceClass), + G_SIGNAL_RUN_LAST, + 0, + 0, 0, + g_cclosure_marshal_VOID__INT, + G_TYPE_NONE, 1, + G_TYPE_INT); + /** * WebKitWebResource:uri: * diff --git a/Source/WebKit/gtk/webkit/webkitwebview.cpp b/Source/WebKit/gtk/webkit/webkitwebview.cpp index 0868a4a22..ac6158b44 100644 --- a/Source/WebKit/gtk/webkit/webkitwebview.cpp +++ b/Source/WebKit/gtk/webkit/webkitwebview.cpp @@ -208,6 +208,10 @@ enum { EDITING_ENDED, VIEWPORT_ATTRIBUTES_RECOMPUTE_REQUESTED, VIEWPORT_ATTRIBUTES_CHANGED, + RESOURCE_RESPONSE_RECEIVED, + RESOURCE_LOAD_FINISHED, + RESOURCE_CONTENT_LENGTH_RECEIVED, + RESOURCE_LOAD_FAILED, LAST_SIGNAL }; @@ -900,7 +904,7 @@ static gboolean webkit_web_view_focus_in_event(GtkWidget* widget, GdkEventFocus* // TODO: Improve focus handling as suggested in // http://bugs.webkit.org/show_bug.cgi?id=16910 GtkWidget* toplevel = gtk_widget_get_toplevel(widget); - if (gtk_widget_is_toplevel(toplevel) && gtk_window_has_toplevel_focus(GTK_WINDOW(toplevel))) { + if (widgetIsOnscreenToplevelWindow(toplevel) && gtk_window_has_toplevel_focus(GTK_WINDOW(toplevel))) { WebKitWebView* webView = WEBKIT_WEB_VIEW(widget); FocusController* focusController = core(webView)->focusController(); @@ -961,6 +965,7 @@ static void webkit_web_view_realize(GtkWidget* widget) | GDK_EXPOSURE_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK + | GDK_SCROLL_MASK | GDK_POINTER_MOTION_MASK | GDK_KEY_PRESS_MASK | GDK_KEY_RELEASE_MASK @@ -1101,7 +1106,12 @@ static gboolean webkit_web_view_script_dialog(WebKitWebView* webView, WebKitWebF } window = gtk_widget_get_toplevel(GTK_WIDGET(webView)); - dialog = gtk_message_dialog_new(gtk_widget_is_toplevel(window) ? GTK_WINDOW(window) : 0, GTK_DIALOG_DESTROY_WITH_PARENT, messageType, buttons, "%s", message); + dialog = gtk_message_dialog_new(widgetIsOnscreenToplevelWindow(window) ? GTK_WINDOW(window) : 0, + GTK_DIALOG_DESTROY_WITH_PARENT, + messageType, + buttons, + "%s", + message); gchar* title = g_strconcat("JavaScript - ", webkit_web_frame_get_uri(frame), NULL); gtk_window_set_title(GTK_WINDOW(dialog), title); g_free(title); @@ -2607,6 +2617,93 @@ static void webkit_web_view_class_init(WebKitWebViewClass* webViewClass) WEBKIT_TYPE_VIEWPORT_ATTRIBUTES); /* + * WebKitWebView::resource-response-received + * @webView: the object which received the signal + * @webFrame: the #WebKitWebFrame the response was received for + * @webResource: the #WebKitWebResource being loaded + * @response: the #WebKitNetworkResponse that was received + * + * Emitted when the first byte of data arrives + * + * Since: 1.7.5 + */ + webkit_web_view_signals[RESOURCE_RESPONSE_RECEIVED] = g_signal_new("resource-response-received", + G_TYPE_FROM_CLASS(webViewClass), + G_SIGNAL_RUN_LAST, + 0, + 0, 0, + webkit_marshal_VOID__OBJECT_OBJECT_OBJECT, + G_TYPE_NONE, 3, + WEBKIT_TYPE_WEB_FRAME, + WEBKIT_TYPE_WEB_RESOURCE, + WEBKIT_TYPE_NETWORK_RESPONSE); + + /* + * WebKitWebView::resource-load-finished + * @webView: the object which received the signal + * @webFrame: the #WebKitWebFrame the response was received for + * @webResource: the #WebKitWebResource that was loaded + * + * Emitted when all the data for the resource was loaded + * + * Since: 1.7.5 + */ + webkit_web_view_signals[RESOURCE_LOAD_FINISHED] = g_signal_new("resource-load-finished", + G_TYPE_FROM_CLASS(webViewClass), + G_SIGNAL_RUN_LAST, + 0, + 0, 0, + webkit_marshal_VOID__OBJECT_OBJECT, + G_TYPE_NONE, 2, + WEBKIT_TYPE_WEB_FRAME, + WEBKIT_TYPE_WEB_RESOURCE); + + /* + * WebKitWebView::resource-content-length-received + * @webView: the object which received the signal + * @webFrame: the #WebKitWebFrame the response was received for + * @webResource: the #WebKitWebResource that was loaded + * @lengthReceived: the resource data length in bytes + * + * Emitted when the HTTP Content-Length response header has been + * received and parsed successfully. + * + * Since: 1.7.5 + */ + webkit_web_view_signals[RESOURCE_CONTENT_LENGTH_RECEIVED] = g_signal_new("resource-content-length-received", + G_TYPE_FROM_CLASS(webViewClass), + G_SIGNAL_RUN_LAST, + 0, + 0, 0, + webkit_marshal_VOID__OBJECT_OBJECT_INT, + G_TYPE_NONE, 3, + WEBKIT_TYPE_WEB_FRAME, + WEBKIT_TYPE_WEB_RESOURCE, + G_TYPE_INT); + + /* + * WebKitWebView::resource-load-failed + * @webView: the object which received the signal + * @webFrame: the #WebKitWebFrame the response was received for + * @webResource: the #WebKitWebResource that was loaded + * @webError: the #GError that was triggered + * + * Invoked when a resource failed to load + * + * Since: 1.7.5 + */ + webkit_web_view_signals[RESOURCE_LOAD_FAILED] = g_signal_new("resource-load-failed", + G_TYPE_FROM_CLASS(webViewClass), + G_SIGNAL_RUN_LAST, + 0, + 0, 0, + webkit_marshal_VOID__OBJECT_OBJECT_POINTER, + G_TYPE_NONE, 3, + WEBKIT_TYPE_WEB_FRAME, + WEBKIT_TYPE_WEB_RESOURCE, + G_TYPE_POINTER); + + /* * implementations of virtual methods */ webViewClass->create_web_view = webkit_web_view_real_create_web_view; diff --git a/Source/WebKit/gtk/webkitmarshal.list b/Source/WebKit/gtk/webkitmarshal.list index 5372c5763..b7890825d 100644 --- a/Source/WebKit/gtk/webkitmarshal.list +++ b/Source/WebKit/gtk/webkitmarshal.list @@ -17,9 +17,13 @@ OBJECT:OBJECT OBJECT:STRING,STRING,POINTER OBJECT:VOID VOID:OBJECT,OBJECT +VOID:OBJECT,OBJECT,INT +VOID:OBJECT,OBJECT,OBJECT +VOID:OBJECT,OBJECT,POINTER VOID:OBJECT,OBJECT,OBJECT,OBJECT VOID:OBJECT,POINTER,POINTER +VOID:OBJECT,INT +VOID:OBJECT,POINTER VOID:OBJECT,STRING VOID:STRING VOID:STRING,STRING - |
