summaryrefslogtreecommitdiff
path: root/Source/WebKit/gtk
diff options
context:
space:
mode:
authorSimon Hausmann <simon.hausmann@nokia.com>2012-02-03 09:55:33 +0100
committerSimon Hausmann <simon.hausmann@nokia.com>2012-02-03 09:55:33 +0100
commitcd44dc59cdfc39534aef4d417e9f3c412e3be139 (patch)
tree8d89889ba95ed6ec9322e733846cc9cce9d7dff1 /Source/WebKit/gtk
parentd11f84f5b5cdc0d92a08af01b13472fdd5f9acb9 (diff)
downloadqtwebkit-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/ChangeLog227
-rw-r--r--Source/WebKit/gtk/GNUmakefile.am4
-rw-r--r--Source/WebKit/gtk/NEWS25
-rw-r--r--Source/WebKit/gtk/WebCoreSupport/ChromeClientGtk.cpp15
-rw-r--r--Source/WebKit/gtk/WebCoreSupport/DumpRenderTreeSupportGtk.cpp8
-rw-r--r--Source/WebKit/gtk/WebCoreSupport/FrameLoaderClientGtk.cpp49
-rw-r--r--Source/WebKit/gtk/tests/testatk.c100
-rw-r--r--Source/WebKit/gtk/tests/testwebview.c20
-rw-r--r--Source/WebKit/gtk/webkit/webkitglobals.cpp6
-rw-r--r--Source/WebKit/gtk/webkit/webkitwebframe.cpp135
-rw-r--r--Source/WebKit/gtk/webkit/webkitwebresource.cpp88
-rw-r--r--Source/WebKit/gtk/webkit/webkitwebview.cpp101
-rw-r--r--Source/WebKit/gtk/webkitmarshal.list6
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>&laquo;&nbsp;This is a paragraph with &ldquo;special&rdquo; characters inside.&nbsp;&raquo;</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
-