/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ /* * Pix * * Copyright (C) 2010 Free Software Foundation, Inc. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ #include #include #include #include "oauth-ask-authorization-dialog.h" #define GET_WIDGET(x) (_gtk_builder_get_widget (self->priv->builder, (x))) #define _LOADING_PAGE 1 #define _WEB_VIEW_PAGE 0 /* Signals */ enum { LOAD_REQUEST, LOADED, REDIRECTED, LAST_SIGNAL }; static guint oauth_ask_authorization_dialog_signals[LAST_SIGNAL] = { 0 }; struct _OAuthAskAuthorizationDialogPrivate { GtkWidget *view; GtkBuilder *builder; }; G_DEFINE_TYPE_WITH_CODE (OAuthAskAuthorizationDialog, oauth_ask_authorization_dialog, GTK_TYPE_DIALOG, G_ADD_PRIVATE (OAuthAskAuthorizationDialog)) static void oauth_ask_authorization_dialog_finalize (GObject *obj) { OAuthAskAuthorizationDialog *self; self = OAUTH_ASK_AUTHORIZATION_DIALOG (obj); _g_object_unref (self->priv->builder); G_OBJECT_CLASS (oauth_ask_authorization_dialog_parent_class)->finalize (obj); } static void oauth_ask_authorization_dialog_class_init (OAuthAskAuthorizationDialogClass *klass) { GObjectClass *object_class; object_class = G_OBJECT_CLASS (klass); object_class->finalize = oauth_ask_authorization_dialog_finalize; oauth_ask_authorization_dialog_signals[LOAD_REQUEST] = g_signal_new ("load-request", G_TYPE_FROM_CLASS (klass), G_SIGNAL_RUN_LAST, G_STRUCT_OFFSET (OAuthAskAuthorizationDialogClass, load_request), NULL, NULL, g_cclosure_marshal_VOID__VOID, G_TYPE_NONE, 0); oauth_ask_authorization_dialog_signals[LOADED] = g_signal_new ("loaded", G_TYPE_FROM_CLASS (klass), G_SIGNAL_RUN_LAST, G_STRUCT_OFFSET (OAuthAskAuthorizationDialogClass, loaded), NULL, NULL, g_cclosure_marshal_VOID__VOID, G_TYPE_NONE, 0); oauth_ask_authorization_dialog_signals[REDIRECTED] = g_signal_new ("redirected", G_TYPE_FROM_CLASS (klass), G_SIGNAL_RUN_LAST, G_STRUCT_OFFSET (OAuthAskAuthorizationDialogClass, redirected), NULL, NULL, g_cclosure_marshal_VOID__VOID, G_TYPE_NONE, 0); } static void webkit_view_load_changed_cb (WebKitWebView *web_view, WebKitLoadEvent load_event, gpointer user_data) { OAuthAskAuthorizationDialog *self = user_data; switch (load_event) { case WEBKIT_LOAD_STARTED: case WEBKIT_LOAD_COMMITTED: gtk_notebook_set_current_page (GTK_NOTEBOOK(GET_WIDGET ("dialog_content")), _LOADING_PAGE); g_signal_emit (self, oauth_ask_authorization_dialog_signals[LOAD_REQUEST], 0); break; case WEBKIT_LOAD_REDIRECTED: g_signal_emit (self, oauth_ask_authorization_dialog_signals[REDIRECTED], 0); break; case WEBKIT_LOAD_FINISHED: gtk_notebook_set_current_page (GTK_NOTEBOOK(GET_WIDGET ("dialog_content")), _WEB_VIEW_PAGE); gtk_widget_grab_focus (self->priv->view); g_signal_emit (self, oauth_ask_authorization_dialog_signals[LOADED], 0); break; default: break; } } static GtkWidget * _webkit_web_view_new (OAuthAskAuthorizationDialog *self); static GtkWidget * webkit_view_create_cb (WebKitWebView *web_view, gpointer user_data) { return oauth_ask_authorization_dialog_get_view (OAUTH_ASK_AUTHORIZATION_DIALOG (user_data)); } static void webkit_view_ready_to_show_cb (WebKitWebView *web_view, gpointer user_data) { GtkWindow *window; WebKitWindowProperties *prop; GdkRectangle geometry; window = _gtk_widget_get_toplevel_if_window (GTK_WIDGET (web_view)); if (window == NULL) return; prop = webkit_web_view_get_window_properties (web_view); webkit_window_properties_get_geometry (prop, &geometry); gtk_window_set_default_size (window, geometry.width, geometry.height); gtk_widget_show_all (GTK_WIDGET (window)); } static GtkWidget * _webkit_web_view_new (OAuthAskAuthorizationDialog *self) { WebKitWebContext *context; GtkWidget *view; WebKitSettings *settings; WebKitCookieManager *cookie_manager; GFile *file; char *cookie_filename; context = webkit_web_context_get_default (); view = webkit_web_view_new_with_context (context); settings = webkit_settings_new (); webkit_settings_set_enable_javascript (settings, TRUE); webkit_settings_set_javascript_can_open_windows_automatically (settings, TRUE); webkit_web_view_set_settings (WEBKIT_WEB_VIEW (view), settings); file = gth_user_dir_get_file_for_write (GTH_DIR_CACHE, PIX_DIR, "cookies", NULL); cookie_filename = g_file_get_path (file); cookie_manager = webkit_web_context_get_cookie_manager (context); webkit_cookie_manager_set_accept_policy (cookie_manager, WEBKIT_COOKIE_POLICY_ACCEPT_ALWAYS); webkit_cookie_manager_set_persistent_storage (cookie_manager, cookie_filename, WEBKIT_COOKIE_PERSISTENT_STORAGE_TEXT); webkit_web_context_set_cache_model (context, WEBKIT_CACHE_MODEL_DOCUMENT_BROWSER); g_free (cookie_filename); g_object_unref (file); g_signal_connect (view, "create", G_CALLBACK (webkit_view_create_cb), self); g_signal_connect (view, "ready-to-show", G_CALLBACK (webkit_view_ready_to_show_cb), self); return view; } static void oauth_ask_authorization_dialog_init (OAuthAskAuthorizationDialog *self) { GtkWidget *dialog_content; self->priv = oauth_ask_authorization_dialog_get_instance_private (self); self->priv->builder = _gtk_builder_new_from_file ("oauth-ask-authorization.ui", "oauth"); gtk_window_set_default_size (GTK_WINDOW (self), 500, 500); dialog_content = GET_WIDGET ("dialog_content"); gtk_widget_show (dialog_content); gtk_box_pack_start (GTK_BOX (gtk_dialog_get_content_area (GTK_DIALOG (self))), dialog_content, TRUE, TRUE, 0); self->priv->view = _webkit_web_view_new (self); gtk_widget_show (self->priv->view); gtk_box_pack_start (GTK_BOX (GET_WIDGET ("webkit_view_container")), self->priv->view, TRUE, TRUE, 0); g_signal_connect (self->priv->view, "load-changed", G_CALLBACK (webkit_view_load_changed_cb), self); gtk_dialog_add_button (GTK_DIALOG (self), _GTK_LABEL_CANCEL, GTK_RESPONSE_CANCEL); } GtkWidget * oauth_ask_authorization_dialog_new (const char *uri) { OAuthAskAuthorizationDialog *self; self = g_object_new (OAUTH_TYPE_ASK_AUTHORIZATION_DIALOG, "title", _("Authorization Required"), "resizable", TRUE, "use-header-bar", _gtk_settings_get_dialogs_use_header (), NULL); if (uri != NULL) webkit_web_view_load_uri (WEBKIT_WEB_VIEW (self->priv->view), uri); return (GtkWidget *) self; } GtkWidget * oauth_ask_authorization_dialog_get_view (OAuthAskAuthorizationDialog *self) { return self->priv->view; } const char * oauth_ask_authorization_dialog_get_uri (OAuthAskAuthorizationDialog *self) { return webkit_web_view_get_uri (WEBKIT_WEB_VIEW (self->priv->view)); } const char * oauth_ask_authorization_dialog_get_title (OAuthAskAuthorizationDialog *self) { return webkit_web_view_get_title (WEBKIT_WEB_VIEW (self->priv->view)); }