summaryrefslogtreecommitdiffstats
path: root/WebKit/gtk/webkit
diff options
context:
space:
mode:
Diffstat (limited to 'WebKit/gtk/webkit')
-rw-r--r--WebKit/gtk/webkit/webkitdownload.cpp7
-rw-r--r--WebKit/gtk/webkit/webkitprivate.cpp10
-rw-r--r--WebKit/gtk/webkit/webkitprivate.h44
-rw-r--r--WebKit/gtk/webkit/webkitwebsettings.cpp56
-rw-r--r--WebKit/gtk/webkit/webkitwebview.cpp357
5 files changed, 209 insertions, 265 deletions
diff --git a/WebKit/gtk/webkit/webkitdownload.cpp b/WebKit/gtk/webkit/webkitdownload.cpp
index 9bcb739..1e45250 100644
--- a/WebKit/gtk/webkit/webkitdownload.cpp
+++ b/WebKit/gtk/webkit/webkitdownload.cpp
@@ -60,7 +60,7 @@ class DownloadClient : public Noncopyable, public ResourceHandleClient {
virtual void didReceiveResponse(ResourceHandle*, const ResourceResponse&);
virtual void didReceiveData(ResourceHandle*, const char*, int, int);
- virtual void didFinishLoading(ResourceHandle*);
+ virtual void didFinishLoading(ResourceHandle*, double);
virtual void didFail(ResourceHandle*, const ResourceError&);
virtual void wasBlocked(ResourceHandle*);
virtual void cannotShowURL(ResourceHandle*);
@@ -485,8 +485,9 @@ void webkit_download_start(WebKitDownload* download)
g_return_if_fail(priv->status == WEBKIT_DOWNLOAD_STATUS_CREATED);
g_return_if_fail(priv->timer == NULL);
+ // For GTK, when downloading a file NetworkingContext is null
if (!priv->resourceHandle)
- priv->resourceHandle = ResourceHandle::create(core(priv->networkRequest), priv->downloadClient, 0, false, false);
+ priv->resourceHandle = ResourceHandle::create(/* Null NetworkingContext */ NULL, core(priv->networkRequest), priv->downloadClient, false, false);
else {
priv->resourceHandle->setClient(priv->downloadClient);
@@ -929,7 +930,7 @@ void DownloadClient::didReceiveData(ResourceHandle*, const char* data, int lengt
webkit_download_received_data(m_download, data, length);
}
-void DownloadClient::didFinishLoading(ResourceHandle*)
+void DownloadClient::didFinishLoading(ResourceHandle*, double)
{
webkit_download_finished_loading(m_download);
}
diff --git a/WebKit/gtk/webkit/webkitprivate.cpp b/WebKit/gtk/webkit/webkitprivate.cpp
index 1b7f7a3..aa3d3da 100644
--- a/WebKit/gtk/webkit/webkitprivate.cpp
+++ b/WebKit/gtk/webkit/webkitprivate.cpp
@@ -27,6 +27,7 @@
#include "Frame.h"
#include "FrameLoader.h"
#include "FrameLoaderClientGtk.h"
+#include "FrameNetworkingContextGtk.h"
#include "GtkVersioning.h"
#include "HTMLMediaElement.h"
#include "HTMLNames.h"
@@ -205,11 +206,14 @@ static GtkWidget* currentToplevelCallback(WebKitSoupAuthDialog* feature, SoupMes
if (!d)
return NULL;
- WebCore::Frame* frame = d->m_frame;
- if (!frame)
+ WebKit::FrameNetworkingContextGtk* context = static_cast<WebKit::FrameNetworkingContextGtk*>(d->m_context.get());
+ if (!context)
+ return NULL;
+
+ if (!context->coreFrame())
return NULL;
- GtkWidget* toplevel = gtk_widget_get_toplevel(GTK_WIDGET(frame->page()->chrome()->platformPageClient()));
+ GtkWidget* toplevel = gtk_widget_get_toplevel(GTK_WIDGET(context->coreFrame()->page()->chrome()->platformPageClient()));
if (gtk_widget_is_toplevel(toplevel))
return toplevel;
else
diff --git a/WebKit/gtk/webkit/webkitprivate.h b/WebKit/gtk/webkit/webkitprivate.h
index bde5b55..616ee6b 100644
--- a/WebKit/gtk/webkit/webkitprivate.h
+++ b/WebKit/gtk/webkit/webkitprivate.h
@@ -59,6 +59,7 @@
#include "FullscreenVideoController.h"
#include "Node.h"
#include "Page.h"
+#include "PlatformString.h"
#include "ResourceHandle.h"
#include "ResourceRequest.h"
#include "ResourceResponse.h"
@@ -133,32 +134,32 @@ extern "C" {
typedef struct _WebKitWebViewPrivate WebKitWebViewPrivate;
struct _WebKitWebViewPrivate {
WebCore::Page* corePage;
- WebKitWebSettings* webSettings;
- WebKitWebInspector* webInspector;
- WebKitWebWindowFeatures* webWindowFeatures;
+ PlatformRefPtr<WebKitWebSettings> webSettings;
+ PlatformRefPtr<WebKitWebInspector> webInspector;
+ PlatformRefPtr<WebKitWebWindowFeatures> webWindowFeatures;
WebKitWebFrame* mainFrame;
- WebKitWebBackForwardList* backForwardList;
+ PlatformRefPtr<WebKitWebBackForwardList> backForwardList;
- GtkMenu* currentMenu;
+ PlatformRefPtr<GtkMenu> currentMenu;
gint lastPopupXPosition;
gint lastPopupYPosition;
HashSet<GtkWidget*> children;
bool editable;
- GtkIMContext* imContext;
+ PlatformRefPtr<GtkIMContext> imContext;
gboolean transparent;
- GtkAdjustment* horizontalAdjustment;
- GtkAdjustment* verticalAdjustment;
+ PlatformRefPtr<GtkAdjustment> horizontalAdjustment;
+ PlatformRefPtr<GtkAdjustment> verticalAdjustment;
gboolean zoomFullContent;
WebKitLoadStatus loadStatus;
- char* encoding;
- char* customEncoding;
+ CString encoding;
+ CString customEncoding;
- char* iconURI;
+ CString iconURI;
gboolean disposing;
gboolean usePrimaryForPaste;
@@ -169,18 +170,17 @@ extern "C" {
// These are hosted here because the DataSource object is
// created too late in the frame loading process.
- WebKitWebResource* mainResource;
- char* mainResourceIdentifier;
- GHashTable* subResources;
- char* tooltipText;
+ PlatformRefPtr<WebKitWebResource> mainResource;
+ CString mainResourceIdentifier;
+ PlatformRefPtr<GHashTable> subResources;
+ CString tooltipText;
int currentClickCount;
- WebCore::IntPoint* previousClickPoint;
+ WebCore::IntPoint previousClickPoint;
guint previousClickButton;
guint32 previousClickTime;
-
- HashMap<GdkDragContext*, RefPtr<WebCore::DataObjectGtk> >* draggingDataObjects;
- HashMap<GdkDragContext*, WebKit::DroppingContext*>* droppingContexts;
+ HashMap<GdkDragContext*, RefPtr<WebCore::DataObjectGtk> > draggingDataObjects;
+ HashMap<GdkDragContext*, WebKit::DroppingContext*> droppingContexts;
};
#define WEBKIT_WEB_FRAME_GET_PRIVATE(obj) (G_TYPE_INSTANCE_GET_PRIVATE((obj), WEBKIT_TYPE_WEB_FRAME, WebKitWebFramePrivate))
@@ -206,6 +206,9 @@ extern "C" {
gboolean disposed;
};
+ WTF::String
+ webkitUserAgent();
+
void
webkit_web_frame_core_frame_gone(WebKitWebFrame*);
@@ -283,6 +286,9 @@ extern "C" {
void
webkit_web_view_set_tooltip_text(WebKitWebView*, const char*);
+ GtkMenu*
+ webkit_web_view_get_context_menu(WebKitWebView*);
+
WEBKIT_API void
webkit_web_view_execute_core_command_by_name(WebKitWebView* webView, const gchar* name, const gchar* value);
diff --git a/WebKit/gtk/webkit/webkitwebsettings.cpp b/WebKit/gtk/webkit/webkitwebsettings.cpp
index 71a338c..767fce1 100644
--- a/WebKit/gtk/webkit/webkitwebsettings.cpp
+++ b/WebKit/gtk/webkit/webkitwebsettings.cpp
@@ -163,56 +163,62 @@ enum {
// Create a default user agent string
// This is a liberal interpretation of http://www.mozilla.org/build/revised-user-agent-strings.html
// See also http://developer.apple.com/internet/safari/faq.html#anchor2
-static String webkit_get_user_agent()
+static String webkitPlatform()
{
- gchar* platform;
- gchar* osVersion;
-
#if PLATFORM(X11)
- platform = g_strdup("X11");
+ DEFINE_STATIC_LOCAL(const String, uaPlatform, (String("X11")));
#elif OS(WINDOWS)
- platform = g_strdup("Windows");
+ DEFINE_STATIC_LOCAL(const String, uaPlatform, (String("Windows")));
#elif PLATFORM(MAC)
- platform = g_strdup("Macintosh");
+ DEFINE_STATIC_LOCAL(const String, uaPlatform, (String("Macintosh")));
#elif defined(GDK_WINDOWING_DIRECTFB)
- platform = g_strdup("DirectFB");
+ DEFINE_STATIC_LOCAL(const String, uaPlatform, (String("DirectFB")));
#else
- platform = g_strdup("Unknown");
+ DEFINE_STATIC_LOCAL(const String, uaPlatform, (String("Unknown")));
#endif
+ return uaPlatform;
+}
+
+static String webkitOSVersion()
+{
// FIXME: platform/version detection can be shared.
#if OS(DARWIN)
#if CPU(X86)
- osVersion = g_strdup("Intel Mac OS X");
+ DEFINE_STATIC_LOCAL(const String, uaOSVersion, (String("Intel Mac OS X")));
#else
- osVersion = g_strdup("PPC Mac OS X");
+ DEFINE_STATIC_LOCAL(const String, uaOSVersion, (String("PPC Mac OS X")));
#endif
#elif OS(UNIX)
+ DEFINE_STATIC_LOCAL(String, uaOSVersion, (String()));
+
+ if (!uaOSVersion.isEmpty())
+ return uaOSVersion;
+
struct utsname name;
if (uname(&name) != -1)
- osVersion = g_strdup_printf("%s %s", name.sysname, name.machine);
+ uaOSVersion = String::format("%s %s", name.sysname, name.machine);
else
- osVersion = g_strdup("Unknown");
-
+ uaOSVersion = String("Unknown");
#elif OS(WINDOWS)
- // FIXME: Compute the Windows version
- osVersion = g_strdup("Windows");
-
+ DEFINE_STATIC_LOCAL(const String, uaOSVersion, (String("Windows")));
#else
- osVersion = g_strdup("Unknown");
+ DEFINE_STATIC_LOCAL(const String, uaOSVersion, (String("Unknown")));
#endif
+ return uaOSVersion;
+}
+
+String webkitUserAgent()
+{
// We mention Safari since many broken sites check for it (OmniWeb does this too)
// We re-use the WebKit version, though it doesn't seem to matter much in practice
DEFINE_STATIC_LOCAL(const String, uaVersion, (String::format("%d.%d+", WEBKIT_USER_AGENT_MAJOR_VERSION, WEBKIT_USER_AGENT_MINOR_VERSION)));
- DEFINE_STATIC_LOCAL(const String, staticUA, (String::format("Mozilla/5.0 (%s; U; %s; %s) AppleWebKit/%s (KHTML, like Gecko) Safari/%s",
- platform, osVersion, defaultLanguage().utf8().data(), uaVersion.utf8().data(), uaVersion.utf8().data())));
-
- g_free(osVersion);
- g_free(platform);
+ DEFINE_STATIC_LOCAL(const String, staticUA, (String::format("Mozilla/5.0 (%s; U; %s; %s) AppleWebKit/%s (KHTML, like Gecko) Version/5.0 Safari/%s",
+ webkitPlatform().utf8().data(), webkitOSVersion().utf8().data(), defaultLanguage().utf8().data(), uaVersion.utf8().data(), uaVersion.utf8().data())));
return staticUA;
}
@@ -607,7 +613,7 @@ static void webkit_web_settings_class_init(WebKitWebSettingsClass* klass)
g_param_spec_string("user-agent",
_("User Agent"),
_("The User-Agent string used by WebKitGtk"),
- webkit_get_user_agent().utf8().data(),
+ webkitUserAgent().utf8().data(),
flags));
/**
@@ -1034,7 +1040,7 @@ static void webkit_web_settings_set_property(GObject* object, guint prop_id, con
case PROP_USER_AGENT:
g_free(priv->user_agent);
if (!g_value_get_string(value) || !strlen(g_value_get_string(value)))
- priv->user_agent = g_strdup(webkit_get_user_agent().utf8().data());
+ priv->user_agent = g_strdup(webkitUserAgent().utf8().data());
else
priv->user_agent = g_strdup(g_value_get_string(value));
break;
diff --git a/WebKit/gtk/webkit/webkitwebview.cpp b/WebKit/gtk/webkit/webkitwebview.cpp
index 480983f..3212450 100644
--- a/WebKit/gtk/webkit/webkitwebview.cpp
+++ b/WebKit/gtk/webkit/webkitwebview.cpp
@@ -210,11 +210,7 @@ static GtkIMContext* webkit_web_view_get_im_context(WebKitWebView*);
static void destroy_menu_cb(GtkObject* object, gpointer data)
{
- WebKitWebView* webView = WEBKIT_WEB_VIEW(data);
- WebKitWebViewPrivate* priv = WEBKIT_WEB_VIEW_GET_PRIVATE(webView);
-
- g_object_unref(priv->currentMenu);
- priv->currentMenu = NULL;
+ WEBKIT_WEB_VIEW(data)->priv->currentMenu = 0;
}
static void PopupMenuPositionFunc(GtkMenu* menu, gint *x, gint *y, gboolean *pushIn, gpointer userData)
@@ -224,7 +220,11 @@ static void PopupMenuPositionFunc(GtkMenu* menu, gint *x, gint *y, gboolean *pus
GdkScreen* screen = gtk_widget_get_screen(GTK_WIDGET(view));
GtkRequisition menuSize;
+#ifdef GTK_API_VERSION_2
gtk_widget_size_request(GTK_WIDGET(menu), &menuSize);
+#else
+ gtk_size_request_get_size(GTK_SIZE_REQUEST(menu), &menuSize, NULL);
+#endif
*x = priv->lastPopupXPosition;
if ((*x + menuSize.width) >= gdk_screen_get_width(screen))
@@ -304,7 +304,7 @@ static gboolean webkit_web_view_forward_context_menu_event(WebKitWebView* webVie
return FALSE;
WebKitWebViewPrivate* priv = WEBKIT_WEB_VIEW_GET_PRIVATE(webView);
- priv->currentMenu = GTK_MENU(g_object_ref(menu));
+ priv->currentMenu = menu;
priv->lastPopupXPosition = event.globalX();
priv->lastPopupYPosition = event.globalY();
@@ -592,7 +592,7 @@ static gboolean webkit_web_view_key_release_event(GtkWidget* widget, GdkEventKey
// the event if we don't have a pending composition, because that means we
// are using a context like 'simple' which marks every keystroke as filtered.
WebKit::EditorClient* client = static_cast<WebKit::EditorClient*>(core(webView)->editorClient());
- if (gtk_im_context_filter_keypress(webView->priv->imContext, event) && !client->hasPendingComposition())
+ if (gtk_im_context_filter_keypress(webView->priv->imContext.get(), event) && !client->hasPendingComposition())
return TRUE;
Frame* frame = core(webView)->focusController()->focusedOrMainFrame();
@@ -651,8 +651,8 @@ static gboolean webkit_web_view_button_press_event(GtkWidget* widget, GdkEventBu
// GDK logic for counting clicks.
guint32 eventTime = getEventTime(reinterpret_cast<GdkEvent*>(event));
if ((event->type == GDK_2BUTTON_PRESS || event->type == GDK_3BUTTON_PRESS)
- || ((abs(event->x - priv->previousClickPoint->x()) < doubleClickDistance)
- && (abs(event->y - priv->previousClickPoint->y()) < doubleClickDistance)
+ || ((abs(event->x - priv->previousClickPoint.x()) < doubleClickDistance)
+ && (abs(event->y - priv->previousClickPoint.y()) < doubleClickDistance)
&& (eventTime - priv->previousClickTime < static_cast<guint>(doubleClickTime))
&& (event->button == priv->previousClickButton)))
priv->currentClickCount++;
@@ -661,7 +661,7 @@ static gboolean webkit_web_view_button_press_event(GtkWidget* widget, GdkEventBu
PlatformMouseEvent platformEvent(event);
platformEvent.setClickCount(priv->currentClickCount);
- *priv->previousClickPoint = platformEvent.pos();
+ priv->previousClickPoint = platformEvent.pos();
priv->previousClickButton = event->button;
priv->previousClickTime = eventTime;
@@ -702,7 +702,7 @@ static gboolean webkit_web_view_button_release_event(GtkWidget* widget, GdkEvent
if (focusedFrame && focusedFrame->editor()->canEdit()) {
#ifdef MAEMO_CHANGES
WebKitWebViewPrivate* priv = webView->priv;
- hildon_gtk_im_context_filter_event(priv->imContext, (GdkEvent*)event);
+ hildon_gtk_im_context_filter_event(priv->imContext.get(), (GdkEvent*)event);
#endif
}
@@ -806,7 +806,7 @@ static gboolean webkit_web_view_focus_in_event(GtkWidget* widget, GdkEventFocus*
focusController->setFocusedFrame(core(webView)->mainFrame());
if (focusController->focusedFrame()->editor()->canEdit())
- gtk_im_context_focus_in(webView->priv->imContext);
+ gtk_im_context_focus_in(webView->priv->imContext.get());
}
return GTK_WIDGET_CLASS(webkit_web_view_parent_class)->focus_in_event(widget, event);
}
@@ -824,7 +824,7 @@ static gboolean webkit_web_view_focus_out_event(GtkWidget* widget, GdkEventFocus
}
if (webView->priv->imContext)
- gtk_im_context_focus_out(webView->priv->imContext);
+ gtk_im_context_focus_out(webView->priv->imContext.get());
return GTK_WIDGET_CLASS(webkit_web_view_parent_class)->focus_out_event(widget, event);
}
@@ -875,7 +875,7 @@ static void webkit_web_view_realize(GtkWidget* widget)
WebKitWebView* webView = WEBKIT_WEB_VIEW(widget);
WebKitWebViewPrivate* priv = webView->priv;
- gtk_im_context_set_client_window(priv->imContext, window);
+ gtk_im_context_set_client_window(priv->imContext.get(), window);
}
static void webkit_web_view_set_scroll_adjustments(WebKitWebView* webView, GtkAdjustment* hadj, GtkAdjustment* vadj)
@@ -883,26 +883,12 @@ static void webkit_web_view_set_scroll_adjustments(WebKitWebView* webView, GtkAd
if (!core(webView))
return;
- FrameView* view = core(webkit_web_view_get_main_frame(webView))->view();
-
- if (hadj)
- g_object_ref(hadj);
- if (vadj)
- g_object_ref(vadj);
-
- WebKitWebViewPrivate* priv = webView->priv;
-
- if (priv->horizontalAdjustment)
- g_object_unref(priv->horizontalAdjustment);
- if (priv->verticalAdjustment)
- g_object_unref(priv->verticalAdjustment);
-
- priv->horizontalAdjustment = hadj;
- priv->verticalAdjustment = vadj;
+ webView->priv->horizontalAdjustment = hadj;
+ webView->priv->verticalAdjustment = vadj;
+ FrameView* view = core(webkit_web_view_get_main_frame(webView))->view();
if (!view)
return;
-
view->setGtkAdjustments(hadj, vadj);
}
@@ -1158,78 +1144,42 @@ static void webkit_web_view_dispose(GObject* object)
priv->disposing = TRUE;
- if (priv->horizontalAdjustment) {
- g_object_unref(priv->horizontalAdjustment);
- priv->horizontalAdjustment = NULL;
- }
-
- if (priv->verticalAdjustment) {
- g_object_unref(priv->verticalAdjustment);
- priv->verticalAdjustment = NULL;
- }
-
- if (priv->backForwardList) {
- g_object_unref(priv->backForwardList);
- priv->backForwardList = NULL;
- }
+ // These smart pointers are cleared manually, because some cleanup operations are
+ // very sensitive to their value. We may crash if these are done in the wrong order.
+ priv->horizontalAdjustment.clear();
+ priv->verticalAdjustment.clear();
+ priv->backForwardList.clear();
if (priv->corePage) {
webkit_web_view_stop_loading(WEBKIT_WEB_VIEW(object));
-
core(priv->mainFrame)->loader()->detachFromParent();
delete priv->corePage;
- priv->corePage = NULL;
+ priv->corePage = 0;
}
if (priv->webSettings) {
- g_signal_handlers_disconnect_by_func(priv->webSettings, (gpointer)webkit_web_view_settings_notify, webView);
- g_object_unref(priv->webSettings);
- priv->webSettings = NULL;
-
- g_object_unref(priv->webInspector);
- priv->webInspector = NULL;
-
- g_object_unref(priv->webWindowFeatures);
- priv->webWindowFeatures = NULL;
-
- g_object_unref(priv->imContext);
- priv->imContext = NULL;
- }
-
- if (priv->mainResource) {
- g_object_unref(priv->mainResource);
- priv->mainResource = NULL;
+ g_signal_handlers_disconnect_by_func(priv->webSettings.get(), (gpointer)webkit_web_view_settings_notify, webView);
+ priv->webSettings.clear();
}
- if (priv->subResources) {
- g_hash_table_unref(priv->subResources);
- priv->subResources = NULL;
- }
+ priv->webInspector.clear();
+ priv->webWindowFeatures.clear();
+ priv->mainResource.clear();
+ priv->subResources.clear();
- priv->draggingDataObjects->clear();
- HashMap<GdkDragContext*, DroppingContext*>::iterator endDroppingContexts = priv->droppingContexts->end();
- for (HashMap<GdkDragContext*, DroppingContext*>::iterator iter = priv->droppingContexts->begin(); iter != endDroppingContexts; ++iter)
+ HashMap<GdkDragContext*, DroppingContext*>::iterator endDroppingContexts = priv->droppingContexts.end();
+ for (HashMap<GdkDragContext*, DroppingContext*>::iterator iter = priv->droppingContexts.begin(); iter != endDroppingContexts; ++iter)
delete (iter->second);
- priv->droppingContexts->clear();
+ priv->droppingContexts.clear();
G_OBJECT_CLASS(webkit_web_view_parent_class)->dispose(object);
}
static void webkit_web_view_finalize(GObject* object)
{
- WebKitWebView* webView = WEBKIT_WEB_VIEW(object);
- WebKitWebViewPrivate* priv = webView->priv;
-
- g_free(priv->tooltipText);
- g_free(priv->mainResourceIdentifier);
- g_free(priv->encoding);
- g_free(priv->customEncoding);
- g_free(priv->iconURI);
-
- delete priv->previousClickPoint;
- delete priv->draggingDataObjects;
- delete priv->droppingContexts;
-
+ // We need to manually call the destructor here, since this object's memory is managed
+ // by GLib. This calls all C++ members' destructors and prevents memory leaks.
+ WEBKIT_WEB_VIEW(object)->priv->~WebKitWebViewPrivate();
G_OBJECT_CLASS(webkit_web_view_parent_class)->finalize(object);
}
@@ -1279,7 +1229,7 @@ static AtkObject* webkit_web_view_get_accessible(GtkWidget* widget)
static gdouble webViewGetDPI(WebKitWebView* webView)
{
WebKitWebViewPrivate* priv = webView->priv;
- WebKitWebSettings* webSettings = priv->webSettings;
+ WebKitWebSettings* webSettings = priv->webSettings.get();
gboolean enforce96DPI;
g_object_get(webSettings, "enforce-96-dpi", &enforce96DPI, NULL);
if (enforce96DPI)
@@ -1305,7 +1255,7 @@ static void webkit_web_view_screen_changed(GtkWidget* widget, GdkScreen* previou
if (priv->disposing)
return;
- WebKitWebSettings* webSettings = priv->webSettings;
+ WebKitWebSettings* webSettings = priv->webSettings.get();
Settings* settings = core(webView)->settings();
gdouble DPI = webViewGetDPI(webView);
@@ -1339,10 +1289,10 @@ static void webkit_web_view_drag_end(GtkWidget* widget, GdkDragContext* context)
// This might happen if a drag is still in progress after a WebKitWebView
// is disposed and before it is finalized.
- if (!priv->draggingDataObjects->contains(context))
+ if (!priv->draggingDataObjects.contains(context))
return;
- priv->draggingDataObjects->remove(context);
+ priv->draggingDataObjects.remove(context);
Frame* frame = core(webView)->focusController()->focusedOrMainFrame();
if (!frame)
@@ -1377,10 +1327,10 @@ static void webkit_web_view_drag_data_get(GtkWidget* widget, GdkDragContext* con
// This might happen if a drag is still in progress after a WebKitWebView
// is diposed and before it is finalized.
- if (!priv->draggingDataObjects->contains(context))
+ if (!priv->draggingDataObjects.contains(context))
return;
- pasteboardHelperInstance()->fillSelectionData(selectionData, info, priv->draggingDataObjects->get(context).get());
+ pasteboardHelperInstance()->fillSelectionData(selectionData, info, priv->draggingDataObjects.get(context).get());
}
static gboolean doDragLeaveLater(DroppingContext* context)
@@ -1388,7 +1338,7 @@ static gboolean doDragLeaveLater(DroppingContext* context)
WebKitWebView* webView = context->webView;
WebKitWebViewPrivate* priv = webView->priv;
- if (!priv->droppingContexts->contains(context->gdkContext))
+ if (!priv->droppingContexts.contains(context->gdkContext))
return FALSE;
// If the view doesn't know about the drag yet (there are still pending data)
@@ -1405,7 +1355,7 @@ static gboolean doDragLeaveLater(DroppingContext* context)
}
core(webView)->dragController()->dragEnded();
- priv->droppingContexts->remove(context->gdkContext);
+ priv->droppingContexts.remove(context->gdkContext);
delete context;
return FALSE;
}
@@ -1415,13 +1365,13 @@ static void webkit_web_view_drag_leave(GtkWidget* widget, GdkDragContext* contex
WebKitWebView* webView = WEBKIT_WEB_VIEW(widget);
WebKitWebViewPrivate* priv = webView->priv;
- if (!priv->droppingContexts->contains(context))
+ if (!priv->droppingContexts.contains(context))
return;
// During a drop GTK+ will fire a drag-leave signal right before firing
// the drag-drop signal. We want the actions for drag-leave to happen after
// those for drag-drop, so schedule them to happen asynchronously here.
- g_timeout_add(0, reinterpret_cast<GSourceFunc>(doDragLeaveLater), priv->droppingContexts->get(context));
+ g_timeout_add(0, reinterpret_cast<GSourceFunc>(doDragLeaveLater), priv->droppingContexts.get(context));
}
static gboolean webkit_web_view_drag_motion(GtkWidget* widget, GdkDragContext* context, gint x, gint y, guint time)
@@ -1431,21 +1381,21 @@ static gboolean webkit_web_view_drag_motion(GtkWidget* widget, GdkDragContext* c
DroppingContext* droppingContext = 0;
IntPoint position = IntPoint(x, y);
- if (!priv->droppingContexts->contains(context)) {
+ if (!priv->droppingContexts.contains(context)) {
droppingContext = new DroppingContext;
droppingContext->webView = webView;
droppingContext->gdkContext = context;
droppingContext->dataObject = WebCore::DataObjectGtk::create();
droppingContext->dropHappened = false;
droppingContext->lastMotionPosition = position;
- priv->droppingContexts->set(context, droppingContext);
+ priv->droppingContexts.set(context, droppingContext);
Vector<GdkAtom> acceptableTargets(pasteboardHelperInstance()->dropAtomsForContext(widget, context));
droppingContext->pendingDataRequests = acceptableTargets.size();
for (size_t i = 0; i < acceptableTargets.size(); i++)
gtk_drag_get_data(widget, context, acceptableTargets.at(i), time);
} else {
- droppingContext = priv->droppingContexts->get(context);
+ droppingContext = priv->droppingContexts.get(context);
droppingContext->lastMotionPosition = position;
}
@@ -1468,10 +1418,10 @@ static void webkit_web_view_drag_data_received(GtkWidget* widget, GdkDragContext
WebKitWebView* webView = WEBKIT_WEB_VIEW(widget);
WebKitWebViewPrivate* priv = webView->priv;
- if (!priv->droppingContexts->contains(context))
+ if (!priv->droppingContexts.contains(context))
return;
- DroppingContext* droppingContext = priv->droppingContexts->get(context);
+ DroppingContext* droppingContext = priv->droppingContexts.get(context);
droppingContext->pendingDataRequests--;
pasteboardHelperInstance()->fillDataObjectFromDropData(selectionData, info, droppingContext->dataObject.get());
@@ -1493,10 +1443,10 @@ static gboolean webkit_web_view_drag_drop(GtkWidget* widget, GdkDragContext* con
WebKitWebView* webView = WEBKIT_WEB_VIEW(widget);
WebKitWebViewPrivate* priv = webView->priv;
- if (!priv->droppingContexts->contains(context))
+ if (!priv->droppingContexts.contains(context))
return FALSE;
- DroppingContext* droppingContext = priv->droppingContexts->get(context);
+ DroppingContext* droppingContext = priv->droppingContexts.get(context);
droppingContext->dropHappened = true;
IntPoint position(x, y);
@@ -1512,8 +1462,8 @@ static gboolean webkit_web_view_query_tooltip(GtkWidget *widget, gint x, gint y,
{
WebKitWebViewPrivate* priv = WEBKIT_WEB_VIEW_GET_PRIVATE(widget);
- if (priv->tooltipText) {
- gtk_tooltip_set_text(tooltip, priv->tooltipText);
+ if (priv->tooltipText.length() > 0) {
+ gtk_tooltip_set_text(tooltip, priv->tooltipText.data());
return TRUE;
}
@@ -1524,7 +1474,7 @@ static gboolean webkit_web_view_query_tooltip(GtkWidget *widget, gint x, gint y,
static GtkIMContext* webkit_web_view_get_im_context(WebKitWebView* webView)
{
g_return_val_if_fail(WEBKIT_IS_WEB_VIEW(webView), 0);
- return GTK_IM_CONTEXT(webView->priv->imContext);
+ return GTK_IM_CONTEXT(webView->priv->imContext.get());
}
static void webkit_web_view_class_init(WebKitWebViewClass* webViewClass)
@@ -2892,7 +2842,7 @@ static void webkit_web_view_class_init(WebKitWebViewClass* webViewClass)
static void webkit_web_view_update_settings(WebKitWebView* webView)
{
WebKitWebViewPrivate* priv = webView->priv;
- WebKitWebSettings* webSettings = priv->webSettings;
+ WebKitWebSettings* webSettings = priv->webSettings.get();
Settings* settings = core(webView)->settings();
gchar* defaultEncoding, *cursiveFontFamily, *defaultFontFamily, *fantasyFontFamily, *monospaceFontFamily, *sansSerifFontFamily, *serifFontFamily, *userStylesheetUri;
@@ -3095,8 +3045,14 @@ static void webkit_web_view_init(WebKitWebView* webView)
{
WebKitWebViewPrivate* priv = WEBKIT_WEB_VIEW_GET_PRIVATE(webView);
webView->priv = priv;
+ // This is the placement new syntax: http://www.parashift.com/c++-faq-lite/dtors.html#faq-11.10
+ // It allows us to call a constructor on manually allocated locations in memory. We must use it
+ // in this case, because GLib manages the memory for the private data section, but we wish it
+ // to contain C++ object members. The use of placement new calls the constructor on all C++ data
+ // members, which ensures they are initialized properly.
+ new (priv) WebKitWebViewPrivate();
- priv->imContext = gtk_im_multicontext_new();
+ priv->imContext = adoptPlatformRef(gtk_im_multicontext_new());
Page::PageClients pageClients;
pageClients.chromeClient = new WebKit::ChromeClient(webView);
@@ -3108,40 +3064,33 @@ static void webkit_web_view_init(WebKitWebView* webView)
// We also add a simple wrapper class to provide the public
// interface for the Web Inspector.
- priv->webInspector = WEBKIT_WEB_INSPECTOR(g_object_new(WEBKIT_TYPE_WEB_INSPECTOR, NULL));
- webkit_web_inspector_set_inspector_client(priv->webInspector, priv->corePage);
+ priv->webInspector = adoptPlatformRef(WEBKIT_WEB_INSPECTOR(g_object_new(WEBKIT_TYPE_WEB_INSPECTOR, NULL)));
+ webkit_web_inspector_set_inspector_client(priv->webInspector.get(), priv->corePage);
+ // The smart pointer will call g_object_ref_sink on these adjustments.
priv->horizontalAdjustment = GTK_ADJUSTMENT(gtk_adjustment_new(0.0, 0.0, 0.0, 0.0, 0.0, 0.0));
priv->verticalAdjustment = GTK_ADJUSTMENT(gtk_adjustment_new(0.0, 0.0, 0.0, 0.0, 0.0, 0.0));
- g_object_ref_sink(priv->horizontalAdjustment);
- g_object_ref_sink(priv->verticalAdjustment);
-
gtk_widget_set_can_focus(GTK_WIDGET(webView), TRUE);
priv->mainFrame = WEBKIT_WEB_FRAME(webkit_web_frame_new(webView));
priv->lastPopupXPosition = priv->lastPopupYPosition = -1;
priv->editable = false;
- priv->backForwardList = webkit_web_back_forward_list_new_with_web_view(webView);
+ priv->backForwardList = adoptPlatformRef(webkit_web_back_forward_list_new_with_web_view(webView));
priv->zoomFullContent = FALSE;
- priv->webSettings = webkit_web_settings_new();
+ priv->webSettings = adoptPlatformRef(webkit_web_settings_new());
webkit_web_view_update_settings(webView);
- g_signal_connect(priv->webSettings, "notify", G_CALLBACK(webkit_web_view_settings_notify), webView);
+ g_signal_connect(priv->webSettings.get(), "notify", G_CALLBACK(webkit_web_view_settings_notify), webView);
- priv->webWindowFeatures = webkit_web_window_features_new();
+ priv->webWindowFeatures = adoptPlatformRef(webkit_web_window_features_new());
- priv->subResources = g_hash_table_new_full(g_str_hash, g_str_equal, g_free, g_object_unref);
+ priv->subResources = adoptPlatformRef(g_hash_table_new_full(g_str_hash, g_str_equal, g_free, g_object_unref));
- priv->tooltipText = 0;
priv->currentClickCount = 0;
- priv->previousClickPoint = new IntPoint(0, 0);
priv->previousClickButton = 0;
priv->previousClickTime = 0;
-
- priv->draggingDataObjects = new HashMap<GdkDragContext*, RefPtr<WebCore::DataObjectGtk> >();
- priv->droppingContexts = new HashMap<GdkDragContext*, DroppingContext*>();
gtk_drag_dest_set(GTK_WIDGET(webView), static_cast<GtkDestDefaults>(0), 0, 0, static_cast<GdkDragAction>(GDK_ACTION_COPY | GDK_ACTION_COPY | GDK_ACTION_MOVE | GDK_ACTION_LINK | GDK_ACTION_PRIVATE));
gtk_drag_dest_set_target_list(GTK_WIDGET(webView), pasteboardHelperInstance()->targetList());
}
@@ -3211,9 +3160,7 @@ void webkit_web_view_set_settings(WebKitWebView* webView, WebKitWebSettings* web
g_return_if_fail(WEBKIT_IS_WEB_SETTINGS(webSettings));
WebKitWebViewPrivate* priv = webView->priv;
- g_signal_handlers_disconnect_by_func(priv->webSettings, (gpointer)webkit_web_view_settings_notify, webView);
- g_object_unref(priv->webSettings);
- g_object_ref(webSettings);
+ g_signal_handlers_disconnect_by_func(priv->webSettings.get(), (gpointer)webkit_web_view_settings_notify, webView);
priv->webSettings = webSettings;
webkit_web_view_update_settings(webView);
g_signal_connect(webSettings, "notify", G_CALLBACK(webkit_web_view_settings_notify), webView);
@@ -3235,10 +3182,8 @@ void webkit_web_view_set_settings(WebKitWebView* webView, WebKitWebSettings* web
*/
WebKitWebSettings* webkit_web_view_get_settings(WebKitWebView* webView)
{
- g_return_val_if_fail(WEBKIT_IS_WEB_VIEW(webView), NULL);
-
- WebKitWebViewPrivate* priv = webView->priv;
- return priv->webSettings;
+ g_return_val_if_fail(WEBKIT_IS_WEB_VIEW(webView), 0);
+ return webView->priv->webSettings.get();
}
/**
@@ -3257,26 +3202,18 @@ WebKitWebSettings* webkit_web_view_get_settings(WebKitWebView* webView)
*/
WebKitWebInspector* webkit_web_view_get_inspector(WebKitWebView* webView)
{
- g_return_val_if_fail(WEBKIT_IS_WEB_VIEW(webView), NULL);
-
- WebKitWebViewPrivate* priv = webView->priv;
- return priv->webInspector;
+ g_return_val_if_fail(WEBKIT_IS_WEB_VIEW(webView), 0);
+ return webView->priv->webInspector.get();
}
// internal
static void webkit_web_view_set_window_features(WebKitWebView* webView, WebKitWebWindowFeatures* webWindowFeatures)
{
- WebKitWebViewPrivate* priv = webView->priv;
-
if (!webWindowFeatures)
return;
-
- if (webkit_web_window_features_equal(priv->webWindowFeatures, webWindowFeatures))
+ if (webkit_web_window_features_equal(webView->priv->webWindowFeatures.get(), webWindowFeatures))
return;
-
- g_object_unref(priv->webWindowFeatures);
- g_object_ref(webWindowFeatures);
- priv->webWindowFeatures = webWindowFeatures;
+ webView->priv->webWindowFeatures = webWindowFeatures;
}
/**
@@ -3292,10 +3229,8 @@ static void webkit_web_view_set_window_features(WebKitWebView* webView, WebKitWe
*/
WebKitWebWindowFeatures* webkit_web_view_get_window_features(WebKitWebView* webView)
{
- g_return_val_if_fail(WEBKIT_IS_WEB_VIEW(webView), NULL);
-
- WebKitWebViewPrivate* priv = webView->priv;
- return priv->webWindowFeatures;
+ g_return_val_if_fail(WEBKIT_IS_WEB_VIEW(webView), 0);
+ return webView->priv->webWindowFeatures.get();
}
/**
@@ -3359,14 +3294,10 @@ void webkit_web_view_set_maintains_back_forward_list(WebKitWebView* webView, gbo
*/
WebKitWebBackForwardList* webkit_web_view_get_back_forward_list(WebKitWebView* webView)
{
- g_return_val_if_fail(WEBKIT_IS_WEB_VIEW(webView), NULL);
-
- WebKitWebViewPrivate* priv = webView->priv;
-
+ g_return_val_if_fail(WEBKIT_IS_WEB_VIEW(webView), 0);
if (!core(webView) || !core(webView)->backForwardList()->enabled())
- return NULL;
-
- return priv->backForwardList;
+ return 0;
+ return webView->priv->backForwardList.get();
}
/**
@@ -4075,11 +4006,8 @@ gfloat webkit_web_view_get_zoom_level(WebKitWebView* webView)
if (!frame)
return 1.0f;
- FrameView* view = frame->view();
- if (!view)
- return 1;
-
- return view->zoomFactor();
+ WebKitWebViewPrivate* priv = webView->priv;
+ return priv->zoomFullContent ? frame->pageZoomFactor() : frame->textZoomFactor();
}
static void webkit_web_view_apply_zoom_level(WebKitWebView* webView, gfloat zoomLevel)
@@ -4088,12 +4016,11 @@ static void webkit_web_view_apply_zoom_level(WebKitWebView* webView, gfloat zoom
if (!frame)
return;
- FrameView* view = frame->view();
- if (!view)
- return;
-
WebKitWebViewPrivate* priv = webView->priv;
- view->setZoomFactor(zoomLevel, priv->zoomFullContent ? ZoomPage : ZoomTextOnly);
+ if (priv->zoomFullContent)
+ frame->setPageZoomFactor(zoomLevel);
+ else
+ frame->setTextZoomFactor(zoomLevel);
}
/**
@@ -4133,7 +4060,7 @@ void webkit_web_view_zoom_in(WebKitWebView* webView)
WebKitWebViewPrivate* priv = webView->priv;
gfloat zoomMultiplierRatio;
- g_object_get(priv->webSettings, "zoom-step", &zoomMultiplierRatio, NULL);
+ g_object_get(priv->webSettings.get(), "zoom-step", &zoomMultiplierRatio, NULL);
webkit_web_view_set_zoom_level(webView, webkit_web_view_get_zoom_level(webView) + zoomMultiplierRatio);
}
@@ -4154,7 +4081,7 @@ void webkit_web_view_zoom_out(WebKitWebView* webView)
WebKitWebViewPrivate* priv = webView->priv;
gfloat zoomMultiplierRatio;
- g_object_get(priv->webSettings, "zoom-step", &zoomMultiplierRatio, NULL);
+ g_object_get(priv->webSettings.get(), "zoom-step", &zoomMultiplierRatio, NULL);
webkit_web_view_set_zoom_level(webView, webkit_web_view_get_zoom_level(webView) - zoomMultiplierRatio);
}
@@ -4196,8 +4123,17 @@ void webkit_web_view_set_full_content_zoom(WebKitWebView* webView, gboolean zoom
if (priv->zoomFullContent == zoomFullContent)
return;
+ Frame* frame = core(webView)->mainFrame();
+ if (!frame)
+ return;
+
+ gfloat zoomLevel = priv->zoomFullContent ? frame->pageZoomFactor() : frame->textZoomFactor();
+
priv->zoomFullContent = zoomFullContent;
- webkit_web_view_apply_zoom_level(webView, webkit_web_view_get_zoom_level(webView));
+ if (priv->zoomFullContent)
+ frame->setPageAndTextZoomFactors(zoomLevel, 1);
+ else
+ frame->setPageAndTextZoomFactors(1, zoomLevel);
g_object_notify(G_OBJECT(webView), "full-content-zoom");
}
@@ -4246,16 +4182,11 @@ gdouble webkit_web_view_get_progress(WebKitWebView* webView)
const gchar* webkit_web_view_get_encoding(WebKitWebView* webView)
{
g_return_val_if_fail(WEBKIT_IS_WEB_VIEW(webView), NULL);
-
String encoding = core(webView)->mainFrame()->loader()->writer()->encoding();
-
- if (!encoding.isEmpty()) {
- WebKitWebViewPrivate* priv = webView->priv;
- g_free(priv->encoding);
- priv->encoding = g_strdup(encoding.utf8().data());
- return priv->encoding;
- } else
- return NULL;
+ if (encoding.isEmpty())
+ return 0;
+ webView->priv->encoding = encoding.utf8();
+ return webView->priv->encoding.data();
}
/**
@@ -4289,16 +4220,11 @@ void webkit_web_view_set_custom_encoding(WebKitWebView* webView, const char* enc
const char* webkit_web_view_get_custom_encoding(WebKitWebView* webView)
{
g_return_val_if_fail(WEBKIT_IS_WEB_VIEW(webView), NULL);
-
String overrideEncoding = core(webView)->mainFrame()->loader()->documentLoader()->overrideEncoding();
-
- if (!overrideEncoding.isEmpty()) {
- WebKitWebViewPrivate* priv = webView->priv;
- g_free (priv->customEncoding);
- priv->customEncoding = g_strdup(overrideEncoding.utf8().data());
- return priv->customEncoding;
- } else
- return NULL;
+ if (overrideEncoding.isEmpty())
+ return 0;
+ webView->priv->customEncoding = overrideEncoding.utf8();
+ return webView->priv->customEncoding.data();
}
/**
@@ -4520,27 +4446,26 @@ void webkit_web_view_add_resource(WebKitWebView* webView, const char* identifier
WebKitWebViewPrivate* priv = webView->priv;
if (!priv->mainResource) {
- priv->mainResource = webResource;
- priv->mainResourceIdentifier = g_strdup(identifier);
+ priv->mainResource = adoptPlatformRef(webResource);
+ priv->mainResourceIdentifier = identifier;
return;
}
- g_hash_table_insert(priv->subResources, g_strdup(identifier), webResource);
+ g_hash_table_insert(priv->subResources.get(), g_strdup(identifier), webResource);
}
WebKitWebResource* webkit_web_view_get_resource(WebKitWebView* webView, char* identifier)
{
WebKitWebViewPrivate* priv = webView->priv;
- gpointer webResource = NULL;
-
- gboolean resourceFound = g_hash_table_lookup_extended(priv->subResources, identifier, NULL, &webResource);
+ gpointer webResource = 0;
+ gboolean resourceFound = g_hash_table_lookup_extended(priv->subResources.get(), identifier, NULL, &webResource);
// The only resource we do not store in this hash table is the
// main! If we did not find a request, it probably means the load
// has been interrupted while while a resource was still being
// loaded.
- if (!resourceFound && !g_str_equal(identifier, priv->mainResourceIdentifier))
- return NULL;
+ if (!resourceFound && !g_str_equal(identifier, priv->mainResourceIdentifier.data()))
+ return 0;
if (!webResource)
return webkit_web_view_get_main_resource(webView);
@@ -4550,30 +4475,24 @@ WebKitWebResource* webkit_web_view_get_resource(WebKitWebView* webView, char* id
WebKitWebResource* webkit_web_view_get_main_resource(WebKitWebView* webView)
{
- return webView->priv->mainResource;
+ return webView->priv->mainResource.get();
}
void webkit_web_view_clear_resources(WebKitWebView* webView)
{
WebKitWebViewPrivate* priv = webView->priv;
-
- g_free(priv->mainResourceIdentifier);
- priv->mainResourceIdentifier = NULL;
-
- if (priv->mainResource) {
- g_object_unref(priv->mainResource);
- priv->mainResource = NULL;
- }
+ priv->mainResourceIdentifier = "";
+ priv->mainResource = 0;
if (priv->subResources)
- g_hash_table_remove_all(priv->subResources);
+ g_hash_table_remove_all(priv->subResources.get());
}
GList* webkit_web_view_get_subresources(WebKitWebView* webView)
{
WebKitWebViewPrivate* priv = webView->priv;
- GList* subResources = g_hash_table_get_values(priv->subResources);
- return g_list_remove(subResources, priv->mainResource);
+ GList* subResources = g_hash_table_get_values(priv->subResources.get());
+ return g_list_remove(subResources, priv->mainResource.get());
}
/* From EventHandler.cpp */
@@ -4589,12 +4508,11 @@ void webkit_web_view_set_tooltip_text(WebKitWebView* webView, const char* toolti
{
#if GTK_CHECK_VERSION(2, 12, 0)
WebKitWebViewPrivate* priv = webView->priv;
- g_free(priv->tooltipText);
if (tooltip && *tooltip != '\0') {
- priv->tooltipText = g_strdup(tooltip);
+ priv->tooltipText = tooltip;
gtk_widget_set_has_tooltip(GTK_WIDGET(webView), TRUE);
} else {
- priv->tooltipText = 0;
+ priv->tooltipText = "";
gtk_widget_set_has_tooltip(GTK_WIDGET(webView), FALSE);
}
@@ -4646,15 +4564,10 @@ WebKitHitTestResult* webkit_web_view_get_hit_test_result(WebKitWebView* webView,
*/
G_CONST_RETURN gchar* webkit_web_view_get_icon_uri(WebKitWebView* webView)
{
- g_return_val_if_fail(WEBKIT_IS_WEB_VIEW(webView), NULL);
-
- Page* corePage = core(webView);
- String iconURL = iconDatabase()->iconURLForPageURL(corePage->mainFrame()->loader()->url().prettyURL());
-
- WebKitWebViewPrivate* priv = webView->priv;
- g_free(priv->iconURI);
- priv->iconURI = g_strdup(iconURL.utf8().data());
- return priv->iconURI;
+ g_return_val_if_fail(WEBKIT_IS_WEB_VIEW(webView), 0);
+ String iconURL = iconDatabase()->iconURLForPageURL(core(webView)->mainFrame()->loader()->url().prettyURL());
+ webView->priv->iconURI = iconURL.utf8();
+ return webView->priv->iconURI.data();
}
/**
@@ -4805,3 +4718,17 @@ gboolean webkit_web_view_is_command_enabled(WebKitWebView* webView, const gchar*
return core(webView)->focusController()->focusedOrMainFrame()->editor()->command(name).isEnabled();
}
+
+GtkMenu* webkit_web_view_get_context_menu(WebKitWebView* webView)
+{
+ g_return_val_if_fail(WEBKIT_IS_WEB_VIEW(webView), 0);
+
+#if ENABLE(CONTEXT_MENUS)
+ ContextMenu* menu = core(webView)->contextMenuController()->contextMenu();
+ if (!menu)
+ return 0;
+ return menu->platformDescription();
+#else
+ return 0;
+#endif
+}