diff options
author | Cosimo Cecchi <cosimoc@src.gnome.org> | 2007-10-23 01:46:22 +0800 |
---|---|---|
committer | Cosimo Cecchi <cosimoc@src.gnome.org> | 2007-10-23 01:46:22 +0800 |
commit | 62b46e98c7697c93677452ecde31c3c1ddb8b6b9 (patch) | |
tree | 20b969d58098f5501f1d0d6616393080b8cbf252 | |
parent | 51088dcca08b8899ce5c3d22a9869a44960e3e26 (diff) | |
download | gsoc2013-epiphany-62b46e98c7697c93677452ecde31c3c1ddb8b6b9.tar gsoc2013-epiphany-62b46e98c7697c93677452ecde31c3c1ddb8b6b9.tar.gz gsoc2013-epiphany-62b46e98c7697c93677452ecde31c3c1ddb8b6b9.tar.bz2 gsoc2013-epiphany-62b46e98c7697c93677452ecde31c3c1ddb8b6b9.tar.lz gsoc2013-epiphany-62b46e98c7697c93677452ecde31c3c1ddb8b6b9.tar.xz gsoc2013-epiphany-62b46e98c7697c93677452ecde31c3c1ddb8b6b9.tar.zst gsoc2013-epiphany-62b46e98c7697c93677452ecde31c3c1ddb8b6b9.zip |
Update WebKit backend to EphyEmbed and EphyTab changes, and implements load progress for WebKit.
svn path=/trunk/; revision=7551
-rw-r--r-- | embed/webkit/webkit-embed.cpp | 209 |
1 files changed, 203 insertions, 6 deletions
diff --git a/embed/webkit/webkit-embed.cpp b/embed/webkit/webkit-embed.cpp index 204b6dfe5..08d1e5bff 100644 --- a/embed/webkit/webkit-embed.cpp +++ b/embed/webkit/webkit-embed.cpp @@ -56,6 +56,29 @@ struct WebKitEmbedPrivate WebKitPage *page; WebKitEmbedLoadState load_state; char *loading_uri; + + EphyEmbedSecurityLevel security_level; + /* guint security_level : 3; ? */ + EphyEmbedDocumentType document_type; + EphyEmbedNavigationFlags nav_flags; + float zoom; + + /* Flags */ + guint is_loading : 1; + guint is_setting_zoom : 1; + + gint8 load_percent; +}; + +enum +{ + PROP_0, + PROP_DOCUMENT_TYPE, + PROP_LOAD_PROGRESS, + PROP_LOAD_STATUS, + PROP_NAVIGATION, + PROP_SECURITY, + PROP_ZOOM }; static void @@ -148,6 +171,19 @@ webkit_embed_load_started_cb (WebKitPage *page, } static void +webkit_embed_set_load_percent (WebKitEmbed *embed, + int progress) +{ + WebKitEmbedPrivate *wpriv = embed->priv; + if (progress != wpriv->load_percent) + { + wpriv->load_percent = progress; + + g_object_notify (G_OBJECT (embed), "load-progress"); + } +} + +static void webkit_embed_load_progress_changed_cb (WebKitPage *page, int progress, EphyEmbed *embed) @@ -157,11 +193,7 @@ webkit_embed_load_progress_changed_cb (WebKitPage *page, if (wembed->priv->load_state == WEBKIT_EMBED_LOAD_STARTED) wembed->priv->load_state = WEBKIT_EMBED_LOAD_LOADING; - /* FIXME: EphyTab seems to have a strange way of calculating progress, - * and it's not compatible with the simple integer value WebKit emits. - * EphyTab IMHO should use "progress" signal from GtkMozEmbed. That way, - * we could use the same functions for WebKit too. - */ + webkit_embed_set_load_percent (wembed, progress); update_load_state (wembed, page); } @@ -178,6 +210,63 @@ webkit_embed_load_finished_cb (WebKitPage *page, } static void +webkit_embed_get_property (GObject *object, + guint prop_id, + GValue *value, + GParamSpec *pspec) +{ + WebKitEmbed *embed = WEBKIT_EMBED (object); + WebKitEmbedPrivate *priv = embed->priv; + + switch (prop_id) + { + case PROP_DOCUMENT_TYPE: + g_value_set_enum (value, priv->document_type); + break; + case PROP_SECURITY: + g_value_set_enum (value, priv->security_level); + break; + case PROP_ZOOM: + g_value_set_float (value, priv->zoom); + break; + case PROP_LOAD_PROGRESS: + g_value_set_int (value, priv->load_percent); + break; + case PROP_LOAD_STATUS: + g_value_set_boolean (value, priv->is_loading); + break; + case PROP_NAVIGATION: + g_value_set_flags (value, priv->nav_flags); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + break; + } +} + +static void +webkit_embed_set_property (GObject *object, + guint prop_id, + const GValue *value, + GParamSpec *pspec) +{ + switch (prop_id) + { + case PROP_DOCUMENT_TYPE: + case PROP_LOAD_PROGRESS: + case PROP_LOAD_STATUS: + case PROP_NAVIGATION: + case PROP_SECURITY: + case PROP_ZOOM: + /* read only */ + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + break; + } +} + +static void webkit_embed_class_init (WebKitEmbedClass *klass) { GObjectClass *object_class = G_OBJECT_CLASS (klass); @@ -185,10 +274,20 @@ webkit_embed_class_init (WebKitEmbedClass *klass) GtkWidgetClass *widget_class = GTK_WIDGET_CLASS (klass); object_class->finalize = webkit_embed_finalize; + + object_class->get_property = webkit_embed_get_property; + object_class->set_property = webkit_embed_set_property; gtk_object_class->destroy = webkit_embed_destroy; widget_class->grab_focus = webkit_embed_grab_focus; + + g_object_class_override_property (object_class, PROP_LOAD_PROGRESS, "load-progress"); + g_object_class_override_property (object_class, PROP_LOAD_STATUS, "load-status"); + g_object_class_override_property (object_class, PROP_DOCUMENT_TYPE, "document-type"); + g_object_class_override_property (object_class, PROP_SECURITY, "security-level"); + g_object_class_override_property (object_class, PROP_ZOOM, "zoom"); + g_object_class_override_property (object_class, PROP_NAVIGATION, "navigation"); g_type_class_add_private (object_class, sizeof(WebKitEmbedPrivate)); } @@ -220,6 +319,13 @@ webkit_embed_init (WebKitEmbed *embed) G_CALLBACK (webkit_embed_title_changed_cb), embed); g_signal_connect (G_OBJECT (page), "load-progress-changed", G_CALLBACK (webkit_embed_load_progress_changed_cb), embed); + + embed->priv->document_type = EPHY_EMBED_DOCUMENT_HTML; + embed->priv->security_level = EPHY_EMBED_STATE_IS_UNKNOWN; + embed->priv->zoom = 1.0; + embed->priv->is_setting_zoom = FALSE; + embed->priv->load_percent = 0; + embed->priv->is_loading = FALSE; } static void @@ -367,7 +473,9 @@ impl_set_zoom (EphyEmbed *embed, static float impl_get_zoom (EphyEmbed *embed) { - return 0.0; + WebKitEmbedPrivate *wpriv = WEBKIT_EMBED (embed)->priv; + + return wpriv->zoom; } static void @@ -487,6 +595,88 @@ impl_has_modified_forms (EphyEmbed *embed) return FALSE; } +static int +impl_get_load_percent (EphyEmbed *embed) +{ + WebKitEmbedPrivate *wpriv = WEBKIT_EMBED(embed)->priv; + + return wpriv->load_percent; +} + +static void +impl_set_load_percent (EphyEmbed *embed, int percent) +{ + webkit_embed_set_load_percent (WEBKIT_EMBED (embed), percent); +} + +static gboolean +impl_get_load_status (EphyEmbed *embed) +{ + WebKitEmbedPrivate *wpriv = WEBKIT_EMBED (embed)->priv; + + return wpriv->is_loading; +} + +static void +impl_set_load_status (EphyEmbed *embed, gboolean status) +{ + WebKitEmbedPrivate *wpriv = WEBKIT_EMBED (embed)->priv; + guint is_loading; + + is_loading = status != FALSE; + + if (is_loading != wpriv->is_loading) + { + wpriv->is_loading = is_loading; + + g_object_notify (G_OBJECT (embed), "load-status"); + } +} + +static EphyEmbedDocumentType +impl_get_document_type (EphyEmbed *embed) +{ + WebKitEmbedPrivate *wpriv = WEBKIT_EMBED (embed)->priv; + + return wpriv->document_type; +} + +static EphyEmbedNavigationFlags +impl_get_navigation_flags (EphyEmbed *embed) +{ + WebKitEmbedPrivate *wpriv = WEBKIT_EMBED (embed)->priv; + return wpriv->nav_flags; +} + +static void +impl_update_navigation_flags (EphyEmbed *embed) +{ + WebKitEmbedPrivate *priv = WEBKIT_EMBED (embed)->priv; + guint flags = 0; + + if (ephy_embed_can_go_up (embed)) + { + flags |= EPHY_EMBED_NAV_UP; + } + + if (ephy_embed_can_go_back (embed)) + { + flags |= EPHY_EMBED_NAV_BACK; + } + + if (ephy_embed_can_go_forward (embed)) + { + flags |= EPHY_EMBED_NAV_FORWARD; + } + + if (priv->nav_flags != (EphyEmbedNavigationFlags)flags) + { + priv->nav_flags = (EphyEmbedNavigationFlags)flags; + + g_object_notify (G_OBJECT (embed), "navigation"); + } +} + static void ephy_embed_iface_init (EphyEmbedIface *iface) { @@ -526,4 +716,11 @@ ephy_embed_iface_init (EphyEmbedIface *iface) iface->print_preview_n_pages = impl_print_preview_n_pages; iface->print_preview_navigate = impl_print_preview_navigate; iface->has_modified_forms = impl_has_modified_forms; + iface->get_load_percent = impl_get_load_percent; + iface->set_load_percent = impl_set_load_percent; + iface->get_load_status = impl_get_load_status; + iface->set_load_status = impl_set_load_status; + iface->get_document_type = impl_get_document_type; + iface->get_navigation_flags = impl_get_navigation_flags; + iface->update_navigation_flags = impl_update_navigation_flags; } |