diff options
Diffstat (limited to 'WebKit/gtk/webkit/webkitwebview.cpp')
-rw-r--r-- | WebKit/gtk/webkit/webkitwebview.cpp | 213 |
1 files changed, 148 insertions, 65 deletions
diff --git a/WebKit/gtk/webkit/webkitwebview.cpp b/WebKit/gtk/webkit/webkitwebview.cpp index ca72665..f3bb5e6 100644 --- a/WebKit/gtk/webkit/webkitwebview.cpp +++ b/WebKit/gtk/webkit/webkitwebview.cpp @@ -44,6 +44,7 @@ #include "BackForwardList.h" #include "Cache.h" #include "ChromeClientGtk.h" +#include "ClipboardUtilitiesGtk.h" #include "ContextMenuClientGtk.h" #include "ContextMenuController.h" #include "ContextMenu.h" @@ -204,7 +205,9 @@ static void destroy_menu_cb(GtkObject* object, gpointer data) { WebKitWebView* webView = WEBKIT_WEB_VIEW(data); WebKitWebViewPrivate* priv = WEBKIT_WEB_VIEW_GET_PRIVATE(webView); - priv->currentMenu = 0; + + g_object_unref(priv->currentMenu); + priv->currentMenu = NULL; } static void PopupMenuPositionFunc(GtkMenu* menu, gint *x, gint *y, gboolean *pushIn, gpointer userData) @@ -294,7 +297,7 @@ static gboolean webkit_web_view_forward_context_menu_event(WebKitWebView* webVie return FALSE; WebKitWebViewPrivate* priv = WEBKIT_WEB_VIEW_GET_PRIVATE(webView); - priv->currentMenu = menu; + priv->currentMenu = GTK_MENU(g_object_ref(menu)); priv->lastPopupXPosition = event.globalX(); priv->lastPopupYPosition = event.globalY(); @@ -568,7 +571,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.get(), event) && !client->hasPendingComposition()) + if (gtk_im_context_filter_keypress(webView->priv->imContext, event) && !client->hasPendingComposition()) return TRUE; Frame* frame = core(webView)->focusController()->focusedOrMainFrame(); @@ -625,7 +628,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.get(), (GdkEvent*)event); + hildon_gtk_im_context_filter_event(priv->imContext, (GdkEvent*)event); #endif } @@ -728,7 +731,7 @@ static gboolean webkit_web_view_focus_in_event(GtkWidget* widget, GdkEventFocus* else focusController->setFocusedFrame(core(webView)->mainFrame()); - gtk_im_context_focus_in(webView->priv->imContext.get()); + gtk_im_context_focus_in(webView->priv->imContext); } return GTK_WIDGET_CLASS(webkit_web_view_parent_class)->focus_in_event(widget, event); } @@ -746,7 +749,7 @@ static gboolean webkit_web_view_focus_out_event(GtkWidget* widget, GdkEventFocus } if (webView->priv->imContext) - gtk_im_context_focus_out(webView->priv->imContext.get()); + gtk_im_context_focus_out(webView->priv->imContext); return GTK_WIDGET_CLASS(webkit_web_view_parent_class)->focus_out_event(widget, event); } @@ -785,7 +788,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.get(), widget->window); + gtk_im_context_set_client_window(priv->imContext, widget->window); } static void webkit_web_view_set_scroll_adjustments(WebKitWebView* webView, GtkAdjustment* hadj, GtkAdjustment* vadj) @@ -794,7 +797,19 @@ static void webkit_web_view_set_scroll_adjustments(WebKitWebView* webView, GtkAd 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; @@ -1062,6 +1077,21 @@ 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; + } + if (priv->corePage) { webkit_web_view_stop_loading(WEBKIT_WEB_VIEW(object)); @@ -1071,18 +1101,30 @@ static void webkit_web_view_dispose(GObject* object) } if (priv->webSettings) { - g_signal_handlers_disconnect_by_func(priv->webSettings.get(), (gpointer)webkit_web_view_settings_notify, webView); - priv->webSettings.clear(); + 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; + } + + if (priv->subResources) { + g_hash_table_unref(priv->subResources); + priv->subResources = NULL; } - priv->horizontalAdjustment.clear(); - priv->verticalAdjustment.clear(); - priv->backForwardList.clear(); - priv->webInspector.clear(); - priv->webWindowFeatures.clear(); - priv->imContext.clear(); - priv->mainResource.clear(); - priv->subResources.clear(); priv->draggingDataObjects.clear(); G_OBJECT_CLASS(webkit_web_view_parent_class)->dispose(object); @@ -1093,11 +1135,11 @@ static void webkit_web_view_finalize(GObject* object) WebKitWebView* webView = WEBKIT_WEB_VIEW(object); WebKitWebViewPrivate* priv = webView->priv; - priv->tooltipText.clear(); - priv->mainResourceIdentifier.clear(); - priv->encoding.clear(); - priv->customEncoding.clear(); - priv->iconURI.clear(); + g_free(priv->tooltipText); + g_free(priv->mainResourceIdentifier); + g_free(priv->encoding); + g_free(priv->customEncoding); + g_free(priv->iconURI); G_OBJECT_CLASS(webkit_web_view_parent_class)->finalize(object); } @@ -1148,7 +1190,7 @@ static AtkObject* webkit_web_view_get_accessible(GtkWidget* widget) static gdouble webViewGetDPI(WebKitWebView* webView) { WebKitWebViewPrivate* priv = webView->priv; - WebKitWebSettings* webSettings = priv->webSettings.get(); + WebKitWebSettings* webSettings = priv->webSettings; gboolean enforce96DPI; g_object_get(webSettings, "enforce-96-dpi", &enforce96DPI, NULL); if (enforce96DPI) @@ -1174,7 +1216,7 @@ static void webkit_web_view_screen_changed(GtkWidget* widget, GdkScreen* previou if (priv->disposing) return; - WebKitWebSettings* webSettings = priv->webSettings.get(); + WebKitWebSettings* webSettings = priv->webSettings; Settings* settings = core(webView)->settings(); gdouble DPI = webViewGetDPI(webView); @@ -1195,14 +1237,37 @@ static void webkit_web_view_screen_changed(GtkWidget* widget, GdkScreen* previou static void webkit_web_view_drag_end(GtkWidget* widget, GdkDragContext* context) { - WebKitWebViewPrivate* priv = WEBKIT_WEB_VIEW_GET_PRIVATE(WEBKIT_WEB_VIEW(widget)); + WebKitWebView* webView = WEBKIT_WEB_VIEW(widget); + WebKitWebViewPrivate* priv = WEBKIT_WEB_VIEW_GET_PRIVATE(webView); // This might happen if a drag is still in progress after a WebKitWebView - // is diposed and before it is finalized. + // is disposed and before it is finalized. if (!priv->draggingDataObjects.contains(context)) return; priv->draggingDataObjects.remove(context); + + Frame* frame = core(webView)->focusController()->focusedOrMainFrame(); + if (!frame) + return; + + GdkEvent* event = gdk_event_new(GDK_BUTTON_RELEASE); + int x, y, xRoot, yRoot; + GdkModifierType modifiers; + GdkDisplay* display = gdk_display_get_default(); + gdk_display_get_pointer(display, 0, &xRoot, &yRoot, &modifiers); + + event->button.window = static_cast<GdkWindow*>(g_object_ref(gdk_display_get_window_at_pointer(display, &x, &y))); + event->button.x = x; + event->button.y = y; + event->button.x_root = xRoot; + event->button.y_root = yRoot; + event->button.state = modifiers; + + PlatformMouseEvent platformEvent(&event->button); + frame->eventHandler()->dragSourceEndedAt(platformEvent, gdkDragActionToDragOperation(context->action)); + + gdk_event_free(event); } static void webkit_web_view_drag_data_get(GtkWidget* widget, GdkDragContext* context, GtkSelectionData* selectionData, guint info, guint) @@ -1223,7 +1288,7 @@ 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.get()); + gtk_tooltip_set_text(tooltip, priv->tooltipText); return TRUE; } @@ -1234,7 +1299,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.get()); + return GTK_IM_CONTEXT(webView->priv->imContext); } static void webkit_web_view_class_init(WebKitWebViewClass* webViewClass) @@ -2550,7 +2615,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.get(); + WebKitWebSettings* webSettings = priv->webSettings; Settings* settings = core(webView)->settings(); gchar* defaultEncoding, *cursiveFontFamily, *defaultFontFamily, *fantasyFontFamily, *monospaceFontFamily, *sansSerifFontFamily, *serifFontFamily, *userStylesheetUri; @@ -2754,36 +2819,40 @@ static void webkit_web_view_init(WebKitWebView* webView) WebKitWebViewPrivate* priv = WEBKIT_WEB_VIEW_GET_PRIVATE(webView); webView->priv = priv; - priv->imContext = adoptGRef(gtk_im_multicontext_new()); + priv->imContext = gtk_im_multicontext_new(); WebKit::InspectorClient* inspectorClient = new WebKit::InspectorClient(webView); - priv->corePage = new Page(new WebKit::ChromeClient(webView), new WebKit::ContextMenuClient(webView), new WebKit::EditorClient(webView), new WebKit::DragClient(webView), inspectorClient, 0, 0); + priv->corePage = new Page(new WebKit::ChromeClient(webView), new WebKit::ContextMenuClient(webView), new WebKit::EditorClient(webView), new WebKit::DragClient(webView), inspectorClient, 0, 0, 0); // We also add a simple wrapper class to provide the public // interface for the Web Inspector. - priv->webInspector = adoptGRef(WEBKIT_WEB_INSPECTOR(g_object_new(WEBKIT_TYPE_WEB_INSPECTOR, NULL))); - webkit_web_inspector_set_inspector_client(priv->webInspector.get(), priv->corePage); + priv->webInspector = WEBKIT_WEB_INSPECTOR(g_object_new(WEBKIT_TYPE_WEB_INSPECTOR, NULL)); + webkit_web_inspector_set_inspector_client(priv->webInspector, priv->corePage); - // These are create with floating references, so they should not be wrapped in adoptGref. 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_FLAGS(webView, GTK_CAN_FOCUS); priv->mainFrame = WEBKIT_WEB_FRAME(webkit_web_frame_new(webView)); priv->lastPopupXPosition = priv->lastPopupYPosition = -1; priv->editable = false; - priv->backForwardList = adoptGRef(webkit_web_back_forward_list_new_with_web_view(webView)); + priv->backForwardList = webkit_web_back_forward_list_new_with_web_view(webView); priv->zoomFullContent = FALSE; - priv->webSettings = adoptGRef(webkit_web_settings_new()); + priv->webSettings = webkit_web_settings_new(); webkit_web_view_update_settings(webView); - g_signal_connect(priv->webSettings.get(), "notify", G_CALLBACK(webkit_web_view_settings_notify), webView); + g_signal_connect(priv->webSettings, "notify", G_CALLBACK(webkit_web_view_settings_notify), webView); - priv->webWindowFeatures = adoptGRef(webkit_web_window_features_new()); + priv->webWindowFeatures = webkit_web_window_features_new(); - priv->subResources = adoptGRef(g_hash_table_new_full(g_str_hash, g_str_equal, g_free, g_object_unref)); + priv->subResources = g_hash_table_new_full(g_str_hash, g_str_equal, g_free, g_object_unref); + + priv->tooltipText = 0; } GtkWidget* webkit_web_view_new(void) @@ -2839,7 +2908,9 @@ 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.get(), (gpointer)webkit_web_view_settings_notify, webView); + g_signal_handlers_disconnect_by_func(priv->webSettings, (gpointer)webkit_web_view_settings_notify, webView); + g_object_unref(priv->webSettings); + g_object_ref(webSettings); priv->webSettings = webSettings; webkit_web_view_update_settings(webView); g_signal_connect(webSettings, "notify", G_CALLBACK(webkit_web_view_settings_notify), webView); @@ -2851,7 +2922,7 @@ 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.get(); + return priv->webSettings; } /** @@ -2875,7 +2946,7 @@ 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.get(); + return priv->webInspector; } // internal @@ -2886,9 +2957,11 @@ static void webkit_web_view_set_window_features(WebKitWebView* webView, WebKitWe if (!webWindowFeatures) return; - if (webkit_web_window_features_equal(priv->webWindowFeatures.get(), webWindowFeatures)) + if (webkit_web_window_features_equal(priv->webWindowFeatures, webWindowFeatures)) return; + g_object_unref(priv->webWindowFeatures); + g_object_ref(webWindowFeatures); priv->webWindowFeatures = webWindowFeatures; } @@ -2908,7 +2981,7 @@ WebKitWebWindowFeatures* webkit_web_view_get_window_features(WebKitWebView* webV g_return_val_if_fail(WEBKIT_IS_WEB_VIEW(webView), NULL); WebKitWebViewPrivate* priv = webView->priv; - return priv->webWindowFeatures.get(); + return priv->webWindowFeatures; } /** @@ -2978,7 +3051,7 @@ WebKitWebBackForwardList* webkit_web_view_get_back_forward_list(WebKitWebView* w if (!core(webView) || !core(webView)->backForwardList()->enabled()) return NULL; - return priv->backForwardList.get(); + return priv->backForwardList; } /** @@ -3738,7 +3811,7 @@ void webkit_web_view_zoom_in(WebKitWebView* webView) WebKitWebViewPrivate* priv = webView->priv; gfloat zoomMultiplierRatio; - g_object_get(priv->webSettings.get(), "zoom-step", &zoomMultiplierRatio, NULL); + g_object_get(priv->webSettings, "zoom-step", &zoomMultiplierRatio, NULL); webkit_web_view_set_zoom_level(webView, webkit_web_view_get_zoom_level(webView) + zoomMultiplierRatio); } @@ -3759,7 +3832,7 @@ void webkit_web_view_zoom_out(WebKitWebView* webView) WebKitWebViewPrivate* priv = webView->priv; gfloat zoomMultiplierRatio; - g_object_get(priv->webSettings.get(), "zoom-step", &zoomMultiplierRatio, NULL); + g_object_get(priv->webSettings, "zoom-step", &zoomMultiplierRatio, NULL); webkit_web_view_set_zoom_level(webView, webkit_web_view_get_zoom_level(webView) - zoomMultiplierRatio); } @@ -3874,8 +3947,9 @@ const gchar* webkit_web_view_get_encoding(WebKitWebView* webView) if (!encoding.isEmpty()) { WebKitWebViewPrivate* priv = webView->priv; - priv->encoding.set(g_strdup(encoding.utf8().data())); - return priv->encoding.get(); + g_free(priv->encoding); + priv->encoding = g_strdup(encoding.utf8().data()); + return priv->encoding; } else return NULL; } @@ -3916,8 +3990,9 @@ const char* webkit_web_view_get_custom_encoding(WebKitWebView* webView) if (!overrideEncoding.isEmpty()) { WebKitWebViewPrivate* priv = webView->priv; - priv->customEncoding.set(g_strdup(overrideEncoding.utf8().data())); - return priv->customEncoding.get(); + g_free (priv->customEncoding); + priv->customEncoding = g_strdup(overrideEncoding.utf8().data()); + return priv->customEncoding; } else return NULL; } @@ -4072,11 +4147,11 @@ void webkit_web_view_add_resource(WebKitWebView* webView, char* identifier, WebK if (!priv->mainResource) { priv->mainResource = webResource; - priv->mainResourceIdentifier.set(g_strdup(identifier)); + priv->mainResourceIdentifier = g_strdup(identifier); return; } - g_hash_table_insert(priv->subResources.get(), identifier, webResource); + g_hash_table_insert(priv->subResources, identifier, webResource); } WebKitWebResource* webkit_web_view_get_resource(WebKitWebView* webView, char* identifier) @@ -4084,13 +4159,13 @@ WebKitWebResource* webkit_web_view_get_resource(WebKitWebView* webView, char* id WebKitWebViewPrivate* priv = webView->priv; gpointer webResource = NULL; - gboolean resourceFound = g_hash_table_lookup_extended(priv->subResources.get(), identifier, NULL, &webResource); + gboolean resourceFound = g_hash_table_lookup_extended(priv->subResources, 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.get())) + if (!resourceFound && !g_str_equal(identifier, priv->mainResourceIdentifier)) return NULL; if (!webResource) @@ -4101,24 +4176,30 @@ WebKitWebResource* webkit_web_view_get_resource(WebKitWebView* webView, char* id WebKitWebResource* webkit_web_view_get_main_resource(WebKitWebView* webView) { - return webView->priv->mainResource.get(); + return webView->priv->mainResource; } void webkit_web_view_clear_resources(WebKitWebView* webView) { WebKitWebViewPrivate* priv = webView->priv; - priv->mainResourceIdentifier.clear(); - priv->mainResource.clear(); + + g_free(priv->mainResourceIdentifier); + priv->mainResourceIdentifier = NULL; + + if (priv->mainResource) { + g_object_unref(priv->mainResource); + priv->mainResource = NULL; + } if (priv->subResources) - g_hash_table_remove_all(priv->subResources.get()); + g_hash_table_remove_all(priv->subResources); } GList* webkit_web_view_get_subresources(WebKitWebView* webView) { WebKitWebViewPrivate* priv = webView->priv; - GList* subResources = g_hash_table_get_values(priv->subResources.get()); - return g_list_remove(subResources, priv->mainResource.get()); + GList* subResources = g_hash_table_get_values(priv->subResources); + return g_list_remove(subResources, priv->mainResource); } /* From EventHandler.cpp */ @@ -4134,11 +4215,12 @@ 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.set(g_strdup(tooltip)); + priv->tooltipText = g_strdup(tooltip); gtk_widget_set_has_tooltip(GTK_WIDGET(webView), TRUE); } else { - priv->tooltipText.clear(); + priv->tooltipText = 0; gtk_widget_set_has_tooltip(GTK_WIDGET(webView), FALSE); } @@ -4196,8 +4278,9 @@ G_CONST_RETURN gchar* webkit_web_view_get_icon_uri(WebKitWebView* webView) String iconURL = iconDatabase()->iconURLForPageURL(corePage->mainFrame()->loader()->url().prettyURL()); WebKitWebViewPrivate* priv = webView->priv; - priv->iconURI.set(g_strdup(iconURL.utf8().data())); - return priv->iconURI.get(); + g_free(priv->iconURI); + priv->iconURI = g_strdup(iconURL.utf8().data()); + return priv->iconURI; } /** |