elementary: starting work for using WebKit2 as an alternative to WebKit.

Patch by ryuan Choi <ryuan.choi@gmail.com>


SVN revision: 78219
This commit is contained in:
Cedric BAIL 2012-10-19 03:08:45 +00:00
parent 87bc405a68
commit c824f30090
5 changed files with 660 additions and 20 deletions

View File

@ -614,37 +614,56 @@ fi
AC_SUBST(ELM_ETHUMB_DEF)
ELM_WEB_DEF="#undef"
have_elementary_web="no"
want_elementary_web="auto"
AC_ARG_ENABLE([web],
[AC_HELP_STRING([--disable-web], [disable web (WebKit) support. @<:@default=detect@:>@])],
[want_elementary_web=$enableval], [])
if test "x$want_elementary_web" != "xno"; then
elementary_web_backend="detect"
elementary_web="none"
want_elementary_web=""
AC_ARG_WITH([elementary-web-backend],
[AC_HELP_STRING([--with-elementary-web-backend=@<:@ewebkit/ewebkit2/detect/none@:>@], [Select the WebKit backend for Elementary to support web @<:@default=detect@:>@])],
[
elementary_web_backend=${withval}
],
[elementary_web_backend="detect"])
case "$elementary_web_backend" in
ewebkit|ewebkit2|detect|none) ;;
*) AC_MSG_ERROR([Invalid web backend: must be ewebkit, ewebkit2, detect or none]) ;;
esac
if test "x$elementary_web_backend" = "xdetect"; then
# FIXME : detect option should check both ewebkit and ewebkit2.
want_elementary_web="ewebkit"
else
want_elementary_web=$elementary_web_backend
fi
if test "x$want_elementary_web" != "xnone"; then
PKG_CHECK_MODULES([ELEMENTARY_WEB],
[
ewebkit
],
[$want_elementary_web],
[
AC_DEFINE(HAVE_ELEMENTARY_WEB, 1, [Web support for Elementary])
webkit_datadir=$($PKG_CONFIG ewebkit --variable=datadir)
webkit_datadir=$($PKG_CONFIG $want_elementary_web --variable=datadir)
AC_DEFINE_UNQUOTED(WEBKIT_DATADIR,
"$webkit_datadir",
"WebKit's data dir")
have_elementary_web="yes"
if test "x$elementary_web_backend" = "xewebkit2"; then
AC_DEFINE(USE_WEBKIT2, 1, [Use ewebkit2 as Elementary web backend])
fi
elementary_web=$want_elementary_web
ELM_WEB_DEF="#define"
## web_client? how about ewebkit? at least in current upstreak webkit
## there is no web_client.pc
# requirement_elm="web_client ${requirement_elm}"
requirement_elm="ewebkit ${requirement_elm}"
requirement_elm="${want_elementary_web} ${requirement_elm}"
],
[have_elementary_web="no"]
[elementary_web="none"]
)
else
have_elementary_web="no"
elementary_web="none"
fi
if test "x$want_elementary_web" = "xyes" -a "x$have_elementary_web" = "xno"; then
AC_MSG_ERROR([Web support requested, but no ewebkit found by pkg-config.])
if test "x$elementary_web_backend" = "xewebkit" -o "x$elementary_web_backend" = "xewebkit2"; then
if test "x$elementary_web" = "xnone"; then
AC_MSG_ERROR([Web support requested, but no $elementary_web_backend found by pkg-config.])
fi
fi
AC_SUBST(ELM_WEB_DEF)
@ -797,7 +816,7 @@ echo " EFreet.................: ${have_elementary_efreet}"
echo " EWeather...............: ${have_elementary_eweather}"
echo " EMap...................: ${have_elementary_emap}"
echo " Ethumb.................: ${have_elementary_ethumb}"
echo " Web (WebKit)...........: ${have_elementary_web}"
echo " Web (WebKit)...........: ${elementary_web}"
echo " Quick Launch...........: ${have_fork}"
echo " EIO....................: ${have_eio}"
echo " Emotion................: ${have_emotion}"

View File

@ -281,6 +281,7 @@ elm_transit.c \
elm_util.c \
elm_video.c \
elm_web.c \
elm_web2.c \
elm_widget.c \
elm_win.c \
els_box.c \

View File

@ -7,6 +7,8 @@
// 2 - review scrolling to match elm_scroller. Maybe in future use
// elm_interface_scroller
#if !defined(HAVE_ELEMENTARY_WEB) || !defined(USE_WEBKIT2)
#ifdef HAVE_ELEMENTARY_WEB
#include <EWebKit.h>
@ -2173,3 +2175,5 @@ elm_web_window_features_region_get(const Elm_Web_Window_Features *wf,
// TODO: use all ewk_view_zoom stuff to implement bring-in and
// animated zoom like elm_photocam. Should be simple to use, must not
// expose every single bit to users!
#endif

View File

@ -0,0 +1,612 @@
#include <Elementary.h>
#include "elm_priv.h"
#include "elm_widget_web.h"
#if defined(HAVE_ELEMENTARY_WEB) && defined(USE_WEBKIT2)
#include <EWebKit2.h>
EAPI const char ELM_WEB_SMART_NAME[] = "elm_web";
static Ewk_View_Smart_Class _ewk_view_parent_sc =
EWK_VIEW_SMART_CLASS_INIT_NULL;
static const Evas_Smart_Cb_Description _elm_web_smart_callbacks[] = {
{ "url,changed", "s" },
{ NULL, NULL }
};
EVAS_SMART_SUBCLASS_NEW
(ELM_WEB_SMART_NAME, _elm_web, Elm_Web_Smart_Class, Elm_Widget_Smart_Class,
elm_widget_smart_class_get, _elm_web_smart_callbacks);
static void
_view_smart_add(Evas_Object *obj)
{
View_Smart_Data *sd;
sd = calloc(1, sizeof(View_Smart_Data));
evas_object_smart_data_set(obj, sd);
_ewk_view_parent_sc.sc.add(obj);
}
static void
_view_smart_del(Evas_Object *obj)
{
_ewk_view_parent_sc.sc.del(obj);
}
/**
* Creates a new view object given the parent.
*
* @param parent object to use as parent.
*
* @return newly added Evas_Object or @c NULL on errors.
*/
Evas_Object *
_view_add(Evas_Object *parent)
{
Evas *canvas = evas_object_evas_get(parent);
static Evas_Smart *smart = NULL;
Evas_Object *view;
if (!smart)
{
static Ewk_View_Smart_Class api =
EWK_VIEW_SMART_CLASS_INIT_NAME_VERSION("EWK_View_Elementary");
ewk_view_smart_class_set(&api);
ewk_view_smart_class_set(&_ewk_view_parent_sc);
// TODO: check every api method and provide overrides with hooks!
// TODO: hooks should provide extension points
// TODO: extension should have some kind of "default implementation",
// TODO: that can be replaced or controlled by hooks.
// TODO: ie: run_javascript_alert() should present an elm_win
// TODO: by default, but user could override it to show as inwin.
api.sc.add = _view_smart_add;
api.sc.del = _view_smart_del;
smart = evas_smart_class_new(&api.sc);
if (!smart)
{
CRITICAL("Could not create smart class");
return NULL;
}
}
view = ewk_view_smart_add(canvas, smart, ewk_context_default_get());
if (!view)
{
ERR("Could not create smart object object for view");
return NULL;
}
return view;
}
static int _elm_need_web = 0;
EAPI Eina_Bool
elm_need_web(void)
{
if (_elm_need_web++) return EINA_TRUE;
ewk_init();
return EINA_TRUE;
}
static void
_elm_web_smart_add(Evas_Object *obj)
{
EVAS_SMART_DATA_ALLOC(obj, Elm_Web_Smart_Data);
ELM_WIDGET_DATA(priv)->resize_obj = _view_add(obj);
_elm_web_parent_sc->base.add(obj);
elm_widget_can_focus_set(obj, EINA_TRUE);
}
static void
_elm_web_smart_del(Evas_Object *obj)
{
_elm_web_parent_sc->base.del(obj); /* handles freeing sd */
}
static void
_elm_web_smart_set_user(Elm_Web_Smart_Class *sc)
{
ELM_WIDGET_CLASS(sc)->base.add = _elm_web_smart_add;
ELM_WIDGET_CLASS(sc)->base.del = _elm_web_smart_del;
}
EAPI const Elm_Web_Smart_Class *
elm_web_smart_class_get(void)
{
static Elm_Web_Smart_Class _sc =
ELM_WEB_SMART_CLASS_INIT_NAME_VERSION(ELM_WEB_SMART_NAME);
static const Elm_Web_Smart_Class *class = NULL;
Evas_Smart_Class *esc = (Evas_Smart_Class *)&_sc;
if (class) return class;
_elm_web_smart_set(&_sc);
esc->callbacks = _elm_web_smart_callbacks;
class = &_sc;
return class;
}
EAPI Evas_Object *
elm_web_add(Evas_Object *parent)
{
Evas_Object *obj;
EINA_SAFETY_ON_NULL_RETURN_VAL(parent, NULL);
obj = elm_widget_add(_elm_web_smart_class_new(), parent);
if (!obj) return NULL;
if (!elm_widget_sub_object_add(parent, obj))
ERR("could not add %p as sub object of %p", obj, parent);
return obj;
}
EAPI Evas_Object *
elm_web_webkit_view_get(const Evas_Object *obj)
{
ELM_WEB_CHECK(obj) NULL;
ELM_WEB_DATA_GET(obj, sd);
return ELM_WIDGET_DATA(sd)->resize_obj;
}
EAPI void
elm_web_window_create_hook_set(Evas_Object *obj,
Elm_Web_Window_Open func,
void *data)
{
ELM_WEB_CHECK(obj);
(void)func;
(void)data;
}
EAPI void
elm_web_dialog_alert_hook_set(Evas_Object *obj,
Elm_Web_Dialog_Alert func,
void *data)
{
ELM_WEB_CHECK(obj);
(void)func;
(void)data;
}
EAPI void
elm_web_dialog_confirm_hook_set(Evas_Object *obj,
Elm_Web_Dialog_Confirm func,
void *data)
{
ELM_WEB_CHECK(obj);
(void)func;
(void)data;
}
EAPI void
elm_web_dialog_prompt_hook_set(Evas_Object *obj,
Elm_Web_Dialog_Prompt func,
void *data)
{
ELM_WEB_CHECK(obj);
(void)func;
(void)data;
}
EAPI void
elm_web_dialog_file_selector_hook_set(Evas_Object *obj,
Elm_Web_Dialog_File_Selector func,
void *data)
{
ELM_WEB_CHECK(obj);
(void)func;
(void)data;
}
EAPI void
elm_web_console_message_hook_set(Evas_Object *obj,
Elm_Web_Console_Message func,
void *data)
{
ELM_WEB_CHECK(obj);
(void)func;
(void)data;
}
EAPI void
elm_web_useragent_set(Evas_Object *obj,
const char *user_agent)
{
ELM_WEB_CHECK(obj);
// FIXME : need to implement
(void)user_agent;
}
EAPI const char *
elm_web_useragent_get(const Evas_Object *obj)
{
ELM_WEB_CHECK(obj) NULL;
// FIXME : need to implement
return NULL;
}
EAPI Eina_Bool
elm_web_uri_set(Evas_Object *obj,
const char *uri)
{
ELM_WEB_CHECK(obj) EINA_FALSE;
ELM_WEB_DATA_GET(obj, sd);
return ewk_view_url_set(ELM_WIDGET_DATA(sd)->resize_obj, uri);
}
EAPI const char *
elm_web_uri_get(const Evas_Object *obj)
{
ELM_WEB_CHECK(obj) NULL;
ELM_WEB_DATA_GET(obj, sd);
return ewk_view_url_get(ELM_WIDGET_DATA(sd)->resize_obj);
}
EAPI const char *
elm_web_title_get(const Evas_Object *obj)
{
ELM_WEB_CHECK(obj) NULL;
ELM_WEB_DATA_GET(obj, sd);
return ewk_view_title_get(ELM_WIDGET_DATA(sd)->resize_obj);
}
EAPI void
elm_web_bg_color_set(Evas_Object *obj,
int r,
int g,
int b,
int a)
{
ELM_WEB_CHECK(obj);
(void)r;
(void)g;
(void)b;
(void)a;
}
EAPI void
elm_web_bg_color_get(const Evas_Object *obj,
int *r,
int *g,
int *b,
int *a)
{
ELM_WEB_CHECK(obj);
if (r) *r = 0;
if (g) *g = 0;
if (b) *b = 0;
if (a) *a = 0;
}
EAPI const char *
elm_web_selection_get(const Evas_Object *obj)
{
ELM_WEB_CHECK(obj) NULL;
return NULL;
}
EAPI void
elm_web_popup_selected_set(Evas_Object *obj,
int idx)
{
ELM_WEB_CHECK(obj);
(void)idx;
}
EAPI Eina_Bool
elm_web_popup_destroy(Evas_Object *obj)
{
ELM_WEB_CHECK(obj) EINA_FALSE;
return EINA_FALSE;
}
EAPI Eina_Bool
elm_web_text_search(const Evas_Object *obj,
const char *string,
Eina_Bool case_sensitive,
Eina_Bool forward,
Eina_Bool wrap)
{
ELM_WEB_CHECK(obj) EINA_FALSE;
(void)string;
(void)case_sensitive;
(void)forward;
(void)wrap;
return EINA_FALSE;
}
EAPI unsigned int
elm_web_text_matches_mark(Evas_Object *obj,
const char *string,
Eina_Bool case_sensitive,
Eina_Bool highlight,
unsigned int limit)
{
ELM_WEB_CHECK(obj) 0;
(void)string;
(void)case_sensitive;
(void)highlight;
(void)limit;
return 0;
}
EAPI Eina_Bool
elm_web_text_matches_unmark_all(Evas_Object *obj)
{
ELM_WEB_CHECK(obj) EINA_FALSE;
return EINA_FALSE;
}
EAPI Eina_Bool
elm_web_text_matches_highlight_set(Evas_Object *obj,
Eina_Bool highlight)
{
ELM_WEB_CHECK(obj) EINA_FALSE;
(void)highlight;
return EINA_FALSE;
}
EAPI Eina_Bool
elm_web_text_matches_highlight_get(const Evas_Object *obj)
{
ELM_WEB_CHECK(obj) EINA_FALSE;
return EINA_FALSE;
}
EAPI double
elm_web_load_progress_get(const Evas_Object *obj)
{
ELM_WEB_CHECK(obj) - 1.0;
return EINA_FALSE;
}
EAPI Eina_Bool
elm_web_stop(Evas_Object *obj)
{
ELM_WEB_CHECK(obj) EINA_FALSE;
return EINA_FALSE;
}
EAPI Eina_Bool
elm_web_reload(Evas_Object *obj)
{
ELM_WEB_CHECK(obj) EINA_FALSE;
return EINA_FALSE;
}
EAPI Eina_Bool
elm_web_reload_full(Evas_Object *obj)
{
ELM_WEB_CHECK(obj) EINA_FALSE;
return EINA_FALSE;
}
EAPI Eina_Bool
elm_web_back(Evas_Object *obj)
{
ELM_WEB_CHECK(obj) EINA_FALSE;
return EINA_FALSE;
}
EAPI Eina_Bool
elm_web_forward(Evas_Object *obj)
{
ELM_WEB_CHECK(obj) EINA_FALSE;
return EINA_FALSE;
}
EAPI Eina_Bool
elm_web_navigate(Evas_Object *obj,
int steps)
{
ELM_WEB_CHECK(obj) EINA_FALSE;
return EINA_FALSE;
(void)steps;
}
EAPI Eina_Bool
elm_web_back_possible_get(Evas_Object *obj)
{
ELM_WEB_CHECK(obj) EINA_FALSE;
return EINA_FALSE;
}
EAPI Eina_Bool
elm_web_forward_possible_get(Evas_Object *obj)
{
ELM_WEB_CHECK(obj) EINA_FALSE;
return EINA_FALSE;
}
EAPI Eina_Bool
elm_web_navigate_possible_get(Evas_Object *obj,
int steps)
{
ELM_WEB_CHECK(obj) EINA_FALSE;
(void)steps;
return EINA_FALSE;
}
EAPI Eina_Bool
elm_web_history_enabled_get(const Evas_Object *obj)
{
ELM_WEB_CHECK(obj) EINA_FALSE;
return EINA_FALSE;
}
EAPI void
elm_web_history_enabled_set(Evas_Object *obj,
Eina_Bool enable)
{
ELM_WEB_CHECK(obj);
(void)enable;
}
EAPI void
elm_web_zoom_set(Evas_Object *obj,
double zoom)
{
ELM_WEB_CHECK(obj);
(void)zoom;
}
EAPI double
elm_web_zoom_get(const Evas_Object *obj)
{
ELM_WEB_CHECK(obj) - 1.0;
return -1.0;
}
EAPI void
elm_web_zoom_mode_set(Evas_Object *obj,
Elm_Web_Zoom_Mode mode)
{
ELM_WEB_CHECK(obj);
(void)mode;
}
EAPI Elm_Web_Zoom_Mode
elm_web_zoom_mode_get(const Evas_Object *obj)
{
ELM_WEB_CHECK(obj) ELM_WEB_ZOOM_MODE_LAST;
return ELM_WEB_ZOOM_MODE_LAST;
}
EAPI void
elm_web_region_show(Evas_Object *obj,
int x,
int y,
int w __UNUSED__,
int h __UNUSED__)
{
ELM_WEB_CHECK(obj);
(void)x;
(void)y;
}
EAPI void
elm_web_region_bring_in(Evas_Object *obj,
int x,
int y,
int w __UNUSED__,
int h __UNUSED__)
{
ELM_WEB_CHECK(obj);
(void)x;
(void)y;
}
EAPI void
elm_web_inwin_mode_set(Evas_Object *obj,
Eina_Bool value)
{
ELM_WEB_CHECK(obj);
(void)value;
}
EAPI Eina_Bool
elm_web_inwin_mode_get(const Evas_Object *obj)
{
ELM_WEB_CHECK(obj) EINA_FALSE;
return EINA_FALSE;
}
EAPI void
elm_web_window_features_ref(Elm_Web_Window_Features *wf)
{
// FIXME : need to implement
(void)wf;
}
EAPI void
elm_web_window_features_unref(Elm_Web_Window_Features *wf)
{
// FIXME : need to implement
(void)wf;
}
EAPI Eina_Bool
elm_web_window_features_property_get(const Elm_Web_Window_Features *wf,
Elm_Web_Window_Feature_Flag flag)
{
// FIXME : need to implement
(void)wf;
(void)flag;
return EINA_FALSE;
}
EAPI void
elm_web_window_features_region_get(const Elm_Web_Window_Features *wf,
Evas_Coord *x,
Evas_Coord *y,
Evas_Coord *w,
Evas_Coord *h)
{
// FIXME : need to implement
(void)wf;
(void)x;
(void)y;
(void)w;
(void)h;
return;
}
#endif

View File

@ -2,8 +2,12 @@
#define ELM_WIDGET_WEB_H
#ifdef HAVE_ELEMENTARY_WEB
#ifdef USE_WEBKIT2
#include <EWebKit2.h>
#else
#include <EWebKit.h>
#endif
#endif
/**
* @addtogroup Widget