summaryrefslogtreecommitdiff
path: root/Source/WebKit2/UIProcess/API/gtk/WebKitWebViewBase.cpp
diff options
context:
space:
mode:
authorSimon Hausmann <simon.hausmann@nokia.com>2012-05-07 11:21:11 +0200
committerSimon Hausmann <simon.hausmann@nokia.com>2012-05-07 11:21:11 +0200
commit2cf6c8816a73e0132bd8fa3b509d62d7c51b6e47 (patch)
tree988e8c5b116dd0466244ae2fe5af8ee9be926d76 /Source/WebKit2/UIProcess/API/gtk/WebKitWebViewBase.cpp
parentdd91e772430dc294e3bf478c119ef8d43c0a3358 (diff)
downloadqtwebkit-2cf6c8816a73e0132bd8fa3b509d62d7c51b6e47.tar.gz
Imported WebKit commit 7e538425aa020340619e927792f3d895061fb54b (http://svn.webkit.org/repository/webkit/trunk@116286)
Diffstat (limited to 'Source/WebKit2/UIProcess/API/gtk/WebKitWebViewBase.cpp')
-rw-r--r--Source/WebKit2/UIProcess/API/gtk/WebKitWebViewBase.cpp149
1 files changed, 146 insertions, 3 deletions
diff --git a/Source/WebKit2/UIProcess/API/gtk/WebKitWebViewBase.cpp b/Source/WebKit2/UIProcess/API/gtk/WebKitWebViewBase.cpp
index adcc34ae3..b2cdde564 100644
--- a/Source/WebKit2/UIProcess/API/gtk/WebKitWebViewBase.cpp
+++ b/Source/WebKit2/UIProcess/API/gtk/WebKitWebViewBase.cpp
@@ -35,6 +35,7 @@
#include "PageClientImpl.h"
#include "WebContext.h"
#include "WebEventFactory.h"
+#include "WebFullScreenClientGtk.h"
#include "WebKitPrivate.h"
#include "WebKitWebViewBaseAccessible.h"
#include "WebKitWebViewBasePrivate.h"
@@ -52,14 +53,24 @@
#include <WebCore/PasteboardHelper.h>
#include <WebCore/RefPtrCairo.h>
#include <WebCore/Region.h>
+#include <gdk/gdk.h>
+#include <gdk/gdkkeysyms.h>
+#include <wtf/HashMap.h>
#include <wtf/gobject/GOwnPtr.h>
#include <wtf/gobject/GRefPtr.h>
#include <wtf/text/CString.h>
+#if ENABLE(FULLSCREEN_API)
+#include "WebFullScreenManagerProxy.h"
+#endif
+
using namespace WebKit;
using namespace WebCore;
+typedef HashMap<GtkWidget*, IntRect> WebKitWebViewChildrenMap;
+
struct _WebKitWebViewBasePrivate {
+ WebKitWebViewChildrenMap children;
OwnPtr<PageClientImpl> pageClient;
RefPtr<WebPageProxy> pageProxy;
bool isPageActive;
@@ -72,6 +83,10 @@ struct _WebKitWebViewBasePrivate {
IntSize resizerSize;
GRefPtr<AtkObject> accessible;
bool needsResizeOnMap;
+#if ENABLE(FULLSCREEN_API)
+ bool fullScreenModeActive;
+ WebFullScreenClientGtk fullScreenClient;
+#endif
};
G_DEFINE_TYPE(WebKitWebViewBase, webkit_web_view_base, GTK_TYPE_CONTAINER)
@@ -152,9 +167,53 @@ static void webkitWebViewBaseRealize(GtkWidget* widget)
static void webkitWebViewBaseContainerAdd(GtkContainer* container, GtkWidget* widget)
{
+ WebKitWebViewBase* webView = WEBKIT_WEB_VIEW_BASE(container);
+ WebKitWebViewBasePrivate* priv = webView->priv;
+
+ GtkAllocation childAllocation;
+ gtk_widget_get_allocation(widget, &childAllocation);
+ priv->children.set(widget, childAllocation);
+
gtk_widget_set_parent(widget, GTK_WIDGET(container));
}
+static void webkitWebViewBaseContainerRemove(GtkContainer* container, GtkWidget* widget)
+{
+ WebKitWebViewBase* webView = WEBKIT_WEB_VIEW_BASE(container);
+ WebKitWebViewBasePrivate* priv = webView->priv;
+ GtkWidget* widgetContainer = GTK_WIDGET(container);
+
+ ASSERT(priv->children.contains(widget));
+ gboolean wasVisible = gtk_widget_get_visible(widget);
+ gtk_widget_unparent(widget);
+
+ priv->children.remove(widget);
+ if (wasVisible && gtk_widget_get_visible(widgetContainer))
+ gtk_widget_queue_resize(widgetContainer);
+}
+
+static void webkitWebViewBaseContainerForall(GtkContainer* container, gboolean includeInternals, GtkCallback callback, gpointer callbackData)
+{
+ WebKitWebViewBase* webView = WEBKIT_WEB_VIEW_BASE(container);
+ WebKitWebViewBasePrivate* priv = webView->priv;
+
+ WebKitWebViewChildrenMap children = priv->children;
+ WebKitWebViewChildrenMap::const_iterator end = children.end();
+ for (WebKitWebViewChildrenMap::const_iterator current = children.begin(); current != end; ++current)
+ (*callback)(current->first, callbackData);
+}
+
+void webkitWebViewBaseChildMoveResize(WebKitWebViewBase* webView, GtkWidget* child, const IntRect& childRect)
+{
+ const IntRect& geometry = webView->priv->children.get(child);
+
+ if (geometry == childRect)
+ return;
+
+ webView->priv->children.set(child, childRect);
+ gtk_widget_queue_resize_no_redraw(GTK_WIDGET(webView));
+}
+
static void webkitWebViewBaseFinalize(GObject* gobject)
{
WebKitWebViewBase* webkitWebViewBase = WEBKIT_WEB_VIEW_BASE(gobject);
@@ -203,10 +262,27 @@ static gboolean webkitWebViewBaseDraw(GtkWidget* widget, cairo_t* cr)
return FALSE;
}
-static void resizeWebKitWebViewBaseFromAllocation(WebKitWebViewBase* webViewBase, GtkAllocation* allocation)
+static void webkitWebViewBaseChildAllocate(GtkWidget* child, gpointer userData)
{
+ if (!gtk_widget_get_visible(child))
+ return;
+
+ WebKitWebViewBase* webViewBase = WEBKIT_WEB_VIEW_BASE(userData);
WebKitWebViewBasePrivate* priv = webViewBase->priv;
+ const IntRect& geometry = priv->children.get(child);
+ if (geometry.isEmpty())
+ return;
+
+ GtkAllocation childAllocation = geometry;
+ gtk_widget_size_allocate(child, &childAllocation);
+ priv->children.set(child, IntRect());
+}
+
+static void resizeWebKitWebViewBaseFromAllocation(WebKitWebViewBase* webViewBase, GtkAllocation* allocation)
+{
+ gtk_container_foreach(GTK_CONTAINER(webViewBase), webkitWebViewBaseChildAllocate, webViewBase);
+ WebKitWebViewBasePrivate* priv = webViewBase->priv;
if (priv->pageProxy->drawingArea())
priv->pageProxy->drawingArea()->setSize(IntSize(allocation->width, allocation->height), IntSize());
@@ -239,7 +315,6 @@ static void webkitWebViewBaseMap(GtkWidget* widget)
gtk_widget_get_allocation(widget, &allocation);
resizeWebKitWebViewBaseFromAllocation(webViewBase, &allocation);
webViewBase->priv->needsResizeOnMap = false;
-
}
static gboolean webkitWebViewBaseFocusInEvent(GtkWidget* widget, GdkEventFocus* event)
@@ -277,6 +352,20 @@ static gboolean webkitWebViewBaseKeyPressEvent(GtkWidget* widget, GdkEventKey* e
WebKitWebViewBase* webViewBase = WEBKIT_WEB_VIEW_BASE(widget);
WebKitWebViewBasePrivate* priv = webViewBase->priv;
+#if ENABLE(FULLSCREEN_API)
+ if (priv->fullScreenModeActive) {
+ switch (event->keyval) {
+ case GDK_KEY_Escape:
+ case GDK_KEY_f:
+ case GDK_KEY_F:
+ webkitWebViewBaseExitFullScreen(webViewBase);
+ return TRUE;
+ default:
+ break;
+ }
+ }
+#endif
+
// Since WebProcess key event handling is not synchronous, handle the event in two passes.
// When WebProcess processes the input event, it will call PageClientImpl::doneWithKeyEvent
// with event handled status which determines whether to pass the input event to parent or not
@@ -467,7 +556,8 @@ static gboolean webkitWebViewBaseDragDrop(GtkWidget* widget, GdkDragContext* con
return FALSE;
SandboxExtension::Handle handle;
- webViewBase->priv->pageProxy->performDrag(dragData.get(), String(), handle);
+ SandboxExtension::HandleArray sandboxExtensionForUpload;
+ webViewBase->priv->pageProxy->performDrag(dragData.get(), String(), handle, sandboxExtensionForUpload);
gtk_drag_finish(context, TRUE, FALSE, time);
return TRUE;
}
@@ -501,6 +591,8 @@ static void webkit_web_view_base_class_init(WebKitWebViewBaseClass* webkitWebVie
GtkContainerClass* containerClass = GTK_CONTAINER_CLASS(webkitWebViewBaseClass);
containerClass->add = webkitWebViewBaseContainerAdd;
+ containerClass->remove = webkitWebViewBaseContainerRemove;
+ containerClass->forall = webkitWebViewBaseContainerForall;
g_type_class_add_private(webkitWebViewBaseClass, sizeof(WebKitWebViewBasePrivate));
}
@@ -528,6 +620,10 @@ void webkitWebViewBaseCreateWebPage(WebKitWebViewBase* webkitWebViewBase, WKCont
priv->pageProxy = toImpl(context)->createWebPage(priv->pageClient.get(), toImpl(pageGroup));
priv->pageProxy->initializeWebPage();
+
+#if ENABLE(FULLSCREEN_API)
+ priv->pageProxy->fullScreenManager()->setWebView(webkitWebViewBase);
+#endif
}
void webkitWebViewBaseSetTooltipText(WebKitWebViewBase* webViewBase, const char* tooltip)
@@ -575,3 +671,50 @@ void webkitWebViewBaseForwardNextKeyEvent(WebKitWebViewBase* webkitWebViewBase)
{
webkitWebViewBase->priv->shouldForwardNextKeyEvent = TRUE;
}
+
+void webkitWebViewBaseEnterFullScreen(WebKitWebViewBase* webkitWebViewBase)
+{
+#if ENABLE(FULLSCREEN_API)
+ WebKitWebViewBasePrivate* priv = webkitWebViewBase->priv;
+ if (priv->fullScreenModeActive)
+ return;
+
+ if (!priv->fullScreenClient.willEnterFullScreen())
+ return;
+
+ WebFullScreenManagerProxy* fullScreenManagerProxy = priv->pageProxy->fullScreenManager();
+ fullScreenManagerProxy->willEnterFullScreen();
+
+ GtkWidget* topLevelWindow = gtk_widget_get_toplevel(GTK_WIDGET(webkitWebViewBase));
+ if (gtk_widget_is_toplevel(topLevelWindow))
+ gtk_window_fullscreen(GTK_WINDOW(topLevelWindow));
+ fullScreenManagerProxy->didEnterFullScreen();
+ priv->fullScreenModeActive = true;
+#endif
+}
+
+void webkitWebViewBaseExitFullScreen(WebKitWebViewBase* webkitWebViewBase)
+{
+#if ENABLE(FULLSCREEN_API)
+ WebKitWebViewBasePrivate* priv = webkitWebViewBase->priv;
+ if (!priv->fullScreenModeActive)
+ return;
+
+ if (!priv->fullScreenClient.willExitFullScreen())
+ return;
+
+ WebFullScreenManagerProxy* fullScreenManagerProxy = priv->pageProxy->fullScreenManager();
+ fullScreenManagerProxy->willExitFullScreen();
+
+ GtkWidget* topLevelWindow = gtk_widget_get_toplevel(GTK_WIDGET(webkitWebViewBase));
+ if (gtk_widget_is_toplevel(topLevelWindow))
+ gtk_window_unfullscreen(GTK_WINDOW(topLevelWindow));
+ fullScreenManagerProxy->didExitFullScreen();
+ priv->fullScreenModeActive = false;
+#endif
+}
+
+void webkitWebViewBaseInitializeFullScreenClient(WebKitWebViewBase* webkitWebViewBase, const WKFullScreenClientGtk* wkClient)
+{
+ webkitWebViewBase->priv->fullScreenClient.initialize(wkClient);
+}