WebKit Bugzilla
New
Browse
Search+
Log In
×
Sign in with GitHub
or
Remember my login
Create Account
·
Forgot Password
Forgotten password account recovery
[patch]
WIP patch
bug108026_WIP (text/plain), 57.60 KB, created by
Mikhail Pozdnyakov
on 2013-01-30 14:10:54 PST
(
hide
)
Description:
WIP patch
Filename:
MIME Type:
Creator:
Mikhail Pozdnyakov
Created:
2013-01-30 14:10:54 PST
Size:
57.60 KB
patch
obsolete
>commit 71a6c5748017c86bc9712a4b839de202e2ec1a51 >Author: Mikhail Pozdnyakov <mikhail.pozdnyakov@intel.com> >Date: Wed Jan 30 22:28:16 2013 +0200 > > bug108062 > >diff --git a/Source/WebKit2/UIProcess/API/C/efl/WKView.cpp b/Source/WebKit2/UIProcess/API/C/efl/WKView.cpp >index 32b9d8f..21c19b3 100644 >--- a/Source/WebKit2/UIProcess/API/C/efl/WKView.cpp >+++ b/Source/WebKit2/UIProcess/API/C/efl/WKView.cpp >@@ -22,19 +22,32 @@ > > #include "EwkView.h" > #include "WKAPICast.h" >-#include "ewk_view_private.h" >+#include "ewk_context_private.h" > #include <WebKit2/WKImageCairo.h> > > using namespace WebKit; > >+static inline PassRefPtr<EwkContext> ewkContext(WKContextRef contextRef) >+{ >+ return contextRef ? EwkContext::create(toImpl(contextRef)) : EwkContext::defaultContext(); >+} >+ > WKViewRef WKViewCreate(Evas* canvas, WKContextRef contextRef, WKPageGroupRef pageGroupRef) > { >- return toAPI(ewk_view_base_add(canvas, contextRef, pageGroupRef, EwkView::LegacyBehavior)); >+ EwkView* view = EwkView::create(canvas, ewkContext(contextRef), pageGroupRef, EwkView::LegacyBehavior); >+ if (!view) >+ return 0; >+ >+ return toAPI(view->evasObject()); > } > > WKViewRef WKViewCreateWithFixedLayout(Evas* canvas, WKContextRef contextRef, WKPageGroupRef pageGroupRef) > { >- return toAPI(ewk_view_base_add(canvas, contextRef, pageGroupRef, EwkView::DefaultBehavior)); >+ EwkView* view = EwkView::create(canvas, ewkContext(contextRef), pageGroupRef, EwkView::DefaultBehavior); >+ if (!view) >+ return 0; >+ >+ return toAPI(view->evasObject()); > } > > WKPageRef WKViewGetPage(WKViewRef viewRef) >diff --git a/Source/WebKit2/UIProcess/API/efl/EwkView.cpp b/Source/WebKit2/UIProcess/API/efl/EwkView.cpp >index 7f238f8..348fe58 100644 >--- a/Source/WebKit2/UIProcess/API/efl/EwkView.cpp >+++ b/Source/WebKit2/UIProcess/API/efl/EwkView.cpp >@@ -28,6 +28,9 @@ > #include "FormClientEfl.h" > #include "InputMethodContextEfl.h" > #include "LayerTreeRenderer.h" >+#include "NativeWebKeyboardEvent.h" >+#include "NativeWebMouseEvent.h" >+#include "NativeWebWheelEvent.h" > #include "PageClientBase.h" > #include "PageClientDefaultImpl.h" > #include "PageClientLegacyImpl.h" >@@ -56,7 +59,6 @@ > #include "ewk_security_origin_private.h" > #include "ewk_settings_private.h" > #include "ewk_view.h" >-#include "ewk_view_private.h" > #include "ewk_window_features_private.h" > #include <Ecore_Evas.h> > #include <Ecore_X.h> >@@ -85,15 +87,154 @@ static const int defaultCursorSize = 16; > > typedef HashMap<WKPageRef, Evas_Object*> PageViewMap; > >-static inline PageViewMap& pageViewMap() >+// Aux functions. >+ >+static PageViewMap& pageViewMap() > { > DEFINE_STATIC_LOCAL(PageViewMap, map, ()); > return map; > } > >+static inline void smartDataChanged(Ewk_View_Smart_Data* smartData) >+{ >+ ASSERT(smartData); >+ >+ if (smartData->changed.any) >+ return; >+ >+ smartData->changed.any = true; >+ evas_object_smart_changed(smartData->self); >+} >+ >+static Evas_Smart* defaultSmartClassInstance() >+{ >+ static Ewk_View_Smart_Class api = EWK_VIEW_SMART_CLASS_INIT_NAME_VERSION("Ewk_View"); >+ static Evas_Smart* smart = 0; >+ >+ if (EINA_UNLIKELY(!smart)) { >+ EwkView::initSmartClassInterface(api); >+ smart = evas_smart_class_new(&api.sc); >+ } >+ >+ return smart; >+} >+ >+template <_Evas_Callback_Type EventType> >+class EwkViewEventHandler { >+public: >+ static void subscribe(Evas_Object* evasObject) >+ { >+ evas_object_event_callback_add(evasObject, EventType, onEvent, EwkView::smartData(evasObject)); >+ } >+ >+ static void unsubscribe(Evas_Object* evasObject) >+ { >+ evas_object_event_callback_del(evasObject, EventType, onEvent); >+ } >+ >+ static void onEvent(void* data, Evas*, Evas_Object*, void* eventInfo); >+}; >+ >+template <> >+void EwkViewEventHandler<EVAS_CALLBACK_MOUSE_DOWN>::onEvent(void* data, Evas*, Evas_Object*, void* eventInfo) >+{ >+ Evas_Event_Mouse_Down* downEvent = static_cast<Evas_Event_Mouse_Down*>(eventInfo); >+ Ewk_View_Smart_Data* smartData = static_cast<Ewk_View_Smart_Data*>(data); >+ EINA_SAFETY_ON_NULL_RETURN(smartData->api); >+ EINA_SAFETY_ON_NULL_RETURN(smartData->api->mouse_down); >+ smartData->api->mouse_down(smartData, downEvent); >+} >+ >+template <> >+void EwkViewEventHandler<EVAS_CALLBACK_MOUSE_UP>::onEvent(void* data, Evas*, Evas_Object*, void* eventInfo) >+{ >+ Evas_Event_Mouse_Up* upEvent = static_cast<Evas_Event_Mouse_Up*>(eventInfo); >+ Ewk_View_Smart_Data* smartData = static_cast<Ewk_View_Smart_Data*>(data); >+ EINA_SAFETY_ON_NULL_RETURN(smartData->api); >+ EINA_SAFETY_ON_NULL_RETURN(smartData->api->mouse_up); >+ smartData->api->mouse_up(smartData, upEvent); >+} >+ >+template <> >+void EwkViewEventHandler<EVAS_CALLBACK_MOUSE_MOVE>::onEvent(void* data, Evas*, Evas_Object*, void* eventInfo) >+{ >+ Evas_Event_Mouse_Move* moveEvent = static_cast<Evas_Event_Mouse_Move*>(eventInfo); >+ Ewk_View_Smart_Data* smartData = static_cast<Ewk_View_Smart_Data*>(data); >+ EINA_SAFETY_ON_NULL_RETURN(smartData->api); >+ EINA_SAFETY_ON_NULL_RETURN(smartData->api->mouse_move); >+ smartData->api->mouse_move(smartData, moveEvent); >+} >+ >+template <> >+void EwkViewEventHandler<EVAS_CALLBACK_FOCUS_IN>::onEvent(void* data, Evas*, Evas_Object*, void*) >+{ >+ Ewk_View_Smart_Data* smartData = static_cast<Ewk_View_Smart_Data*>(data); >+ EINA_SAFETY_ON_NULL_RETURN(smartData->api); >+ EINA_SAFETY_ON_NULL_RETURN(smartData->api->focus_in); >+ smartData->api->focus_in(smartData); >+} >+ >+template <> >+void EwkViewEventHandler<EVAS_CALLBACK_FOCUS_OUT>::onEvent(void* data, Evas*, Evas_Object*, void*) >+{ >+ Ewk_View_Smart_Data* smartData = static_cast<Ewk_View_Smart_Data*>(data); >+ EINA_SAFETY_ON_NULL_RETURN(smartData->api); >+ EINA_SAFETY_ON_NULL_RETURN(smartData->api->focus_out); >+ smartData->api->focus_out(smartData); >+} >+ >+template <> >+void EwkViewEventHandler<EVAS_CALLBACK_MOUSE_WHEEL>::onEvent(void* data, Evas*, Evas_Object*, void* eventInfo) >+{ >+ Evas_Event_Mouse_Wheel* wheelEvent = static_cast<Evas_Event_Mouse_Wheel*>(eventInfo); >+ Ewk_View_Smart_Data* smartData = static_cast<Ewk_View_Smart_Data*>(data); >+ EINA_SAFETY_ON_NULL_RETURN(smartData->api); >+ EINA_SAFETY_ON_NULL_RETURN(smartData->api->mouse_wheel); >+ smartData->api->mouse_wheel(smartData, wheelEvent); >+} >+ >+template <> >+void EwkViewEventHandler<EVAS_CALLBACK_KEY_DOWN>::onEvent(void* data, Evas*, Evas_Object*, void* eventInfo) >+{ >+ Evas_Event_Key_Down* downEvent = static_cast<Evas_Event_Key_Down*>(eventInfo); >+ Ewk_View_Smart_Data* smartData = static_cast<Ewk_View_Smart_Data*>(data); >+ EINA_SAFETY_ON_NULL_RETURN(smartData->api); >+ EINA_SAFETY_ON_NULL_RETURN(smartData->api->key_down); >+ smartData->api->key_down(smartData, downEvent); >+} >+ >+template <> >+void EwkViewEventHandler<EVAS_CALLBACK_KEY_UP>::onEvent(void* data, Evas*, Evas_Object*, void* eventInfo) >+{ >+ Evas_Event_Key_Up* upEvent = static_cast<Evas_Event_Key_Up*>(eventInfo); >+ Ewk_View_Smart_Data* smartData = static_cast<Ewk_View_Smart_Data*>(data); >+ EINA_SAFETY_ON_NULL_RETURN(smartData->api); >+ EINA_SAFETY_ON_NULL_RETURN(smartData->api->key_up); >+ smartData->api->key_up(smartData, upEvent); >+} >+ >+template <> >+void EwkViewEventHandler<EVAS_CALLBACK_SHOW>::onEvent(void* data, Evas*, Evas_Object*, void*) >+{ >+ Ewk_View_Smart_Data* smartData = static_cast<Ewk_View_Smart_Data*>(data); >+ EwkView::fromSmartData(smartData)->page()->viewStateDidChange(WebPageProxy::ViewIsVisible); >+} >+ >+template <> >+void EwkViewEventHandler<EVAS_CALLBACK_HIDE>::onEvent(void* data, Evas*, Evas_Object*, void*) >+{ >+ Ewk_View_Smart_Data* smartData = static_cast<Ewk_View_Smart_Data*>(data); >+ >+ // This call may look wrong, but we really need to pass ViewIsVisible here. >+ // viewStateDidChange() itself is responsible for actually setting the visibility to Visible or Hidden >+ // depending on what WebPageProxy::isViewVisible() returns, this simply triggers the process. >+ EwkView::fromSmartData(smartData)->page()->viewStateDidChange(WebPageProxy::ViewIsVisible); >+} >+ >+// EwkView implementation. > void EwkView::addToPageViewMap(EwkView* view) > { >- PageViewMap::AddResult result = pageViewMap().add(view->wkPage(), view->view()); >+ PageViewMap::AddResult result = pageViewMap().add(view->wkPage(), view->evasObject()); > ASSERT_UNUSED(result, result.isNewEntry); > } > >@@ -103,7 +244,7 @@ void EwkView::removeFromPageViewMap(EwkView* view) > pageViewMap().remove(view->wkPage()); > } > >-const Evas_Object* EwkView::viewFromPageViewMap(const WKPageRef page) >+const Evas_Object* EwkView::viewFromPageViewMap(WKPageRef page) > { > ASSERT(page); > >@@ -181,7 +322,7 @@ EwkView::EwkView(Evas_Object* evasObject, PassRefPtr<EwkContext> context, PassRe > > iconDatabase->watchChanges(IconChangeCallbackData(EwkView::onFaviconChanged, this)); > >- EwkView::addToPageViewMap(this); >+ addToPageViewMap(this); > } > > EwkView::~EwkView() >@@ -197,18 +338,125 @@ EwkView::~EwkView() > EwkView::removeFromPageViewMap(this); > } > >+EwkView* EwkView::createWithSmartClass(Evas* canvas, Evas_Smart* smart, PassRefPtr<EwkContext> context, WKPageGroupRef pageGroupRef, EwkView::ViewBehavior behavior) >+{ >+ EINA_SAFETY_ON_NULL_RETURN_VAL(canvas, 0); >+ EINA_SAFETY_ON_NULL_RETURN_VAL(smart, 0); >+ EINA_SAFETY_ON_NULL_RETURN_VAL(context, 0); >+ >+ Evas_Object* evasObject = evas_object_smart_add(canvas, smart); >+ EINA_SAFETY_ON_NULL_RETURN_VAL(evasObject, 0); >+ >+ Ewk_View_Smart_Data* smartData = EwkView::smartData(evasObject); >+ if (!smartData) { >+ evas_object_del(evasObject); >+ return 0; >+ } >+ >+ ASSERT(!smartData->priv); >+ >+ // Default WebPageGroup is created in WebContext constructor if the pageGroupRef is 0, >+ // so we do not need to create it here. >+ smartData->priv = new EwkView(evasObject, context, toImpl(pageGroupRef), behavior); >+ return smartData->priv; >+} >+ >+EwkView* EwkView::create(Evas* canvas, PassRefPtr<EwkContext> context, WKPageGroupRef pageGroupRef, ViewBehavior behavior) >+{ >+ return createWithSmartClass(canvas, defaultSmartClassInstance(), context, pageGroupRef, behavior); >+} >+ >+EwkView* EwkView::fromEvasObject(const Evas_Object* evasObject) >+{ >+ if (!isFromEwkView(evasObject)) >+ return 0; >+ >+ return fromSmartData(static_cast<Ewk_View_Smart_Data*>(evas_object_smart_data_get(evasObject))); >+} >+ >+EwkView* EwkView::fromSmartData(const Ewk_View_Smart_Data* smartData) >+{ >+ EINA_SAFETY_ON_NULL_RETURN_VAL(smartData, 0); >+ >+ return smartData->priv; >+} >+ >+bool EwkView::initSmartClassInterface(Ewk_View_Smart_Class& api) >+{ >+ if (api.version != EWK_VIEW_SMART_CLASS_VERSION) { >+ EINA_LOG_CRIT("Ewk_View_Smart_Class %p is version %lu while %lu was expected.", >+ &api, api.version, EWK_VIEW_SMART_CLASS_VERSION); >+ return false; >+ } >+ >+ if (EINA_UNLIKELY(!parentSmartClass.add)) >+ evas_object_smart_clipped_smart_set(&parentSmartClass); >+ >+ evas_object_smart_clipped_smart_set(&api.sc); >+ >+ // Set Evas_Smart_Class functions. >+ api.sc.add = onEvasSmartAdd; >+ api.sc.del = onEvasSmartDelete; >+ api.sc.move = onEvasSmartMove; >+ api.sc.resize = onEvasSmartResize; >+ api.sc.show = onEvasSmartShow; >+ api.sc.hide = onEvasSmartHide; >+ api.sc.color_set = onEvasSmartColorSet; >+ api.sc.calculate = onEvasSmartCalculate; >+ api.sc.data = smartClassName; // It is used by type checking. >+ >+ // Set Ewk_View_Smart_Class functions. >+ api.focus_in = onViewSmartFocusIn; >+ api.focus_out = onViewSmartFocusOut; >+ api.mouse_wheel = onViewSmartMouseWheel; >+ api.mouse_down = onViewSmartMouseDown; >+ api.mouse_up = onViewSmartMouseUp; >+ api.mouse_move = onViewSmartMouseMove; >+ api.key_down = onViewSmartKeyDown; >+ api.key_up = onViewSmartKeyUp; >+ >+ return true; >+} >+ >+bool EwkView::isFromEwkView(const Evas_Object* evasObject) >+{ >+ EINA_SAFETY_ON_NULL_RETURN_VAL(evasObject, false); >+ >+ const char* evasObjectType = evas_object_type_get(evasObject); >+ const Evas_Smart* evasSmart = evas_object_smart_smart_get(evasObject); >+ if (EINA_UNLIKELY(!evasSmart)) { >+ EINA_LOG_CRIT("%p (%s) is not a smart object!", evasObject, evasObjectType ? evasObjectType : "(null)"); >+ return false; >+ } >+ >+ const Evas_Smart_Class* smartClass = evas_smart_class_get(evasSmart); >+ if (EINA_UNLIKELY(!smartClass)) { >+ EINA_LOG_CRIT("%p (%s) is not a smart class object!", evasObject, evasObjectType ? evasObjectType : "(null)"); >+ return false; >+ } >+ >+ if (EINA_UNLIKELY(smartClass->data != EwkView::smartClassName)) { >+ EINA_LOG_CRIT("%p (%s) is not of an ewk_view (need %p, got %p)!", evasObject, evasObjectType ? evasObjectType : "(null)", >+ EwkView::smartClassName, smartClass->data); >+ return false; >+ } >+ >+ return true; >+} >+ > Ewk_View_Smart_Data* EwkView::smartData() const > { >- return static_cast<Ewk_View_Smart_Data*>(evas_object_smart_data_get(m_evasObject)); >+ return smartData(m_evasObject); > } > >-EwkView* EwkView::fromEvasObject(const Evas_Object* view) >+Ewk_View_Smart_Data* EwkView::smartData(Evas_Object* evasObject) > { >- ASSERT(view); >- Ewk_View_Smart_Data* sd = static_cast<Ewk_View_Smart_Data*>(evas_object_smart_data_get(view)); >- ASSERT(sd); >- ASSERT(sd->priv); >- return sd->priv; >+ ASSERT(evasObject); >+ >+ if (!EwkView::isFromEwkView(evasObject)) >+ return 0; >+ >+ return static_cast<Ewk_View_Smart_Data*>(evas_object_smart_data_get(evasObject)); > } > > /** >@@ -577,14 +825,13 @@ void EwkView::setMouseEventsEnabled(bool enabled) > > m_mouseEventsEnabled = enabled; > if (enabled) { >- Ewk_View_Smart_Data* sd = smartData(); >- evas_object_event_callback_add(m_evasObject, EVAS_CALLBACK_MOUSE_DOWN, onMouseDown, sd); >- evas_object_event_callback_add(m_evasObject, EVAS_CALLBACK_MOUSE_UP, onMouseUp, sd); >- evas_object_event_callback_add(m_evasObject, EVAS_CALLBACK_MOUSE_MOVE, onMouseMove, sd); >+ EwkViewEventHandler<EVAS_CALLBACK_MOUSE_DOWN>::subscribe(m_evasObject); >+ EwkViewEventHandler<EVAS_CALLBACK_MOUSE_UP>::subscribe(m_evasObject); >+ EwkViewEventHandler<EVAS_CALLBACK_MOUSE_MOVE>::subscribe(m_evasObject); > } else { >- evas_object_event_callback_del(m_evasObject, EVAS_CALLBACK_MOUSE_DOWN, onMouseDown); >- evas_object_event_callback_del(m_evasObject, EVAS_CALLBACK_MOUSE_UP, onMouseUp); >- evas_object_event_callback_del(m_evasObject, EVAS_CALLBACK_MOUSE_MOVE, onMouseMove); >+ EwkViewEventHandler<EVAS_CALLBACK_MOUSE_DOWN>::unsubscribe(m_evasObject); >+ EwkViewEventHandler<EVAS_CALLBACK_MOUSE_UP>::unsubscribe(m_evasObject); >+ EwkViewEventHandler<EVAS_CALLBACK_MOUSE_MOVE>::unsubscribe(m_evasObject); > } > } > >@@ -950,31 +1197,241 @@ void EwkView::close() > sd->api->window_close(sd); > } > >-void EwkView::onMouseDown(void* data, Evas*, Evas_Object*, void* eventInfo) >+void EwkView::onEvasSmartAdd(Evas_Object* evasObject) > { >- Evas_Event_Mouse_Down* downEvent = static_cast<Evas_Event_Mouse_Down*>(eventInfo); >- Ewk_View_Smart_Data* sd = static_cast<Ewk_View_Smart_Data*>(data); >- EINA_SAFETY_ON_NULL_RETURN(sd->api); >- EINA_SAFETY_ON_NULL_RETURN(sd->api->mouse_down); >- sd->api->mouse_down(sd, downEvent); >+ const Evas_Smart* smart = evas_object_smart_smart_get(evasObject); >+ const Evas_Smart_Class* smartClass = evas_smart_class_get(smart); >+ const Ewk_View_Smart_Class* api = reinterpret_cast<const Ewk_View_Smart_Class*>(smartClass); >+ >+ Ewk_View_Smart_Data* smartData = EwkView::smartData(evasObject); >+ >+ if (!smartData) { >+ smartData = new Ewk_View_Smart_Data; >+ evas_object_smart_data_set(evasObject, smartData); >+ } >+ >+ smartData->self = evasObject; >+ smartData->api = api; >+ >+ parentSmartClass.add(evasObject); >+ >+ smartData->priv = 0; >+ >+ // Create evas_object_image to draw web contents. >+ smartData->image = evas_object_image_add(smartData->base.evas); >+ evas_object_image_alpha_set(smartData->image, false); >+ evas_object_image_filled_set(smartData->image, true); >+ evas_object_smart_member_add(smartData->image, evasObject); >+ evas_object_show(smartData->image); >+ >+ EwkViewEventHandler<EVAS_CALLBACK_FOCUS_IN>::subscribe(evasObject); >+ EwkViewEventHandler<EVAS_CALLBACK_FOCUS_OUT>::subscribe(evasObject); >+ EwkViewEventHandler<EVAS_CALLBACK_MOUSE_WHEEL>::subscribe(evasObject); >+ EwkViewEventHandler<EVAS_CALLBACK_KEY_DOWN>::subscribe(evasObject); >+ EwkViewEventHandler<EVAS_CALLBACK_KEY_UP>::subscribe(evasObject); >+ EwkViewEventHandler<EVAS_CALLBACK_SHOW>::subscribe(evasObject); >+ EwkViewEventHandler<EVAS_CALLBACK_HIDE>::subscribe(evasObject); > } > >-void EwkView::onMouseUp(void* data, Evas*, Evas_Object*, void* eventInfo) >+void EwkView::onEvasSmartDelete(Evas_Object* evasObject) > { >- Evas_Event_Mouse_Up* upEvent = static_cast<Evas_Event_Mouse_Up*>(eventInfo); >- Ewk_View_Smart_Data* sd = static_cast<Ewk_View_Smart_Data*>(data); >- EINA_SAFETY_ON_NULL_RETURN(sd->api); >- EINA_SAFETY_ON_NULL_RETURN(sd->api->mouse_up); >- sd->api->mouse_up(sd, upEvent); >+ Ewk_View_Smart_Data* smartData = EwkView::smartData(evasObject); >+ if (smartData) { >+ ASSERT(smartData->priv); // smartData->priv is EwkView instance to delete. >+ delete smartData->priv; >+ } >+ >+ parentSmartClass.del(evasObject); > } > >-void EwkView::onMouseMove(void* data, Evas*, Evas_Object*, void* eventInfo) >+void EwkView::onEvasSmartResize(Evas_Object* evasObject, Evas_Coord width, Evas_Coord height) > { >- Evas_Event_Mouse_Move* moveEvent = static_cast<Evas_Event_Mouse_Move*>(eventInfo); >- Ewk_View_Smart_Data* sd = static_cast<Ewk_View_Smart_Data*>(data); >- EINA_SAFETY_ON_NULL_RETURN(sd->api); >- EINA_SAFETY_ON_NULL_RETURN(sd->api->mouse_move); >- sd->api->mouse_move(sd, moveEvent); >+ Ewk_View_Smart_Data* smartData = EwkView::smartData(evasObject); >+ EINA_SAFETY_ON_NULL_RETURN(smartData); >+ >+ evas_object_resize(smartData->image, width, height); >+ evas_object_image_size_set(smartData->image, width, height); >+ evas_object_image_fill_set(smartData->image, 0, 0, width, height); >+ >+ smartData->changed.size = true; >+ smartDataChanged(smartData); >+} >+ >+void EwkView::onEvasSmartMove(Evas_Object* evasObject, Evas_Coord /*x*/, Evas_Coord /*y*/) >+{ >+ Ewk_View_Smart_Data* smartData = EwkView::smartData(evasObject); >+ EINA_SAFETY_ON_NULL_RETURN(smartData); >+ >+ smartData->changed.position = true; >+ smartDataChanged(smartData); >+} >+ >+void EwkView::onEvasSmartCalculate(Evas_Object* evasObject) >+{ >+ Ewk_View_Smart_Data* smartData = EwkView::smartData(evasObject); >+ EINA_SAFETY_ON_NULL_RETURN(smartData); >+ >+ EwkView* view = fromSmartData(smartData); >+ EINA_SAFETY_ON_NULL_RETURN(view); >+ >+ smartData->changed.any = false; >+ >+ Evas_Coord x, y, width, height; >+ evas_object_geometry_get(evasObject, &x, &y, &width, &height); >+ >+ if (smartData->changed.position) { >+ smartData->changed.position = false; >+ smartData->view.x = x; >+ smartData->view.y = y; >+ evas_object_move(smartData->image, x, y); >+ } >+ >+ if (smartData->changed.size) { >+ smartData->changed.size = false; >+ smartData->view.w = width; >+ smartData->view.h = height; >+ >+ if (view->page()->drawingArea()) >+ view->page()->drawingArea()->setSize(IntSize(width, height), IntSize()); >+ >+#if USE(ACCELERATED_COMPOSITING) >+ view->setNeedsSurfaceResize(); >+#endif >+#if USE(TILED_BACKING_STORE) >+ view->pageClient()->updateViewportSize(); >+#endif >+ } >+} >+ >+void EwkView::onEvasSmartShow(Evas_Object* evasObject) >+{ >+ Ewk_View_Smart_Data* smartData = EwkView::smartData(evasObject); >+ EINA_SAFETY_ON_NULL_RETURN(smartData); >+ >+ if (evas_object_clipees_get(smartData->base.clipper)) >+ evas_object_show(smartData->base.clipper); >+ evas_object_show(smartData->image); >+} >+ >+void EwkView::onEvasSmartHide(Evas_Object* evasObject) >+{ >+ Ewk_View_Smart_Data* smartData = EwkView::smartData(evasObject); >+ EINA_SAFETY_ON_NULL_RETURN(smartData); >+ >+ evas_object_hide(smartData->base.clipper); >+ evas_object_hide(smartData->image); >+} >+ >+void EwkView::onEvasSmartColorSet(Evas_Object* evasObject, int red, int green, int blue, int alpha) >+{ >+ Ewk_View_Smart_Data* smartData = EwkView::smartData(evasObject); >+ EINA_SAFETY_ON_NULL_RETURN(smartData); >+ >+ EwkView* view = fromSmartData(smartData); >+ EINA_SAFETY_ON_NULL_RETURN(view); >+ >+ if (alpha < 0) >+ alpha = 0; >+ else if (alpha > 255) >+ alpha = 255; >+ >+#define CHECK_COLOR(color, alpha) \ >+ if (color < 0) \ >+ color = 0; \ >+ else if (color > alpha) \ >+ color = alpha; >+ CHECK_COLOR(red, alpha); >+ CHECK_COLOR(green, alpha); >+ CHECK_COLOR(blue, alpha); >+#undef CHECK_COLOR >+ >+ evas_object_image_alpha_set(smartData->image, alpha < 255); >+ view->page()->setDrawsBackground(red || green || blue); >+ view->page()->setDrawsTransparentBackground(alpha < 255); >+ >+ parentSmartClass.color_set(evasObject, red, green, blue, alpha); >+} >+ >+Eina_Bool EwkView::onViewSmartFocusIn(Ewk_View_Smart_Data* smartData) >+{ >+ EwkView* self = EwkView::fromSmartData(smartData); >+ ASSERT(self); >+ >+ self->page()->viewStateDidChange(WebPageProxy::ViewIsFocused | WebPageProxy::ViewWindowIsActive); >+ return true; >+} >+ >+Eina_Bool EwkView::onViewSmartFocusOut(Ewk_View_Smart_Data* smartData) >+{ >+ EwkView* self = EwkView::fromSmartData(smartData); >+ ASSERT(self); >+ >+ self->page()->viewStateDidChange(WebPageProxy::ViewIsFocused | WebPageProxy::ViewWindowIsActive); >+ return true; >+} >+ >+Eina_Bool EwkView::onViewSmartMouseWheel(Ewk_View_Smart_Data* smartData, const Evas_Event_Mouse_Wheel* wheelEvent) >+{ >+ EwkView* self = EwkView::fromSmartData(smartData); >+ ASSERT(self); >+ >+ self->page()->handleWheelEvent(NativeWebWheelEvent(wheelEvent, self->transformFromScene(), self->transformToScreen())); >+ return true; >+} >+ >+Eina_Bool EwkView::onViewSmartMouseDown(Ewk_View_Smart_Data* smartData, const Evas_Event_Mouse_Down* downEvent) >+{ >+ EwkView* self = EwkView::fromSmartData(smartData); >+ ASSERT(self); >+ >+ self->page()->handleMouseEvent(NativeWebMouseEvent(downEvent, self->transformFromScene(), self->transformToScreen())); >+ return true; >+} >+ >+Eina_Bool EwkView::onViewSmartMouseUp(Ewk_View_Smart_Data* smartData, const Evas_Event_Mouse_Up* upEvent) >+{ >+ EwkView* self = EwkView::fromSmartData(smartData); >+ ASSERT(self); >+ >+ self->page()->handleMouseEvent(NativeWebMouseEvent(upEvent, self->transformFromScene(), self->transformToScreen())); >+ >+ InputMethodContextEfl* inputMethodContext = self->inputMethodContext(); >+ if (inputMethodContext) >+ inputMethodContext->handleMouseUpEvent(upEvent); >+ >+ return true; >+} >+ >+Eina_Bool EwkView::onViewSmartMouseMove(Ewk_View_Smart_Data* smartData, const Evas_Event_Mouse_Move* moveEvent) >+{ >+ EwkView* self = EwkView::fromSmartData(smartData); >+ ASSERT(self); >+ >+ self->page()->handleMouseEvent(NativeWebMouseEvent(moveEvent, self->transformFromScene(), self->transformToScreen())); >+ return true; >+} >+ >+Eina_Bool EwkView::onViewSmartKeyDown(Ewk_View_Smart_Data* smartData, const Evas_Event_Key_Down* downEvent) >+{ >+ EwkView* self = EwkView::fromSmartData(smartData); >+ ASSERT(self); >+ >+ bool isFiltered = false; >+ InputMethodContextEfl* inputMethodContext = self->inputMethodContext(); >+ if (inputMethodContext) >+ inputMethodContext->handleKeyDownEvent(downEvent, &isFiltered); >+ >+ self->page()->handleKeyboardEvent(NativeWebKeyboardEvent(downEvent, isFiltered)); >+ return true; >+} >+ >+Eina_Bool EwkView::onViewSmartKeyUp(Ewk_View_Smart_Data* smartData, const Evas_Event_Key_Up* upEvent) >+{ >+ EwkView* self = EwkView::fromSmartData(smartData); >+ ASSERT(self); >+ >+ self->page()->handleKeyboardEvent(NativeWebKeyboardEvent(upEvent)); >+ return true; > } > > #if ENABLE(TOUCH_EVENTS) >@@ -1059,3 +1516,6 @@ PassRefPtr<cairo_surface_t> EwkView::takeSnapshot() > return snapshot.release(); > #endif > } >+ >+const char EwkView::smartClassName[] = "EWK2_View"; >+Evas_Smart_Class EwkView::parentSmartClass = EVAS_SMART_CLASS_INIT_NULL; >diff --git a/Source/WebKit2/UIProcess/API/efl/EwkView.h b/Source/WebKit2/UIProcess/API/efl/EwkView.h >index a213f97..7e597b4 100644 >--- a/Source/WebKit2/UIProcess/API/efl/EwkView.h >+++ b/Source/WebKit2/UIProcess/API/efl/EwkView.h >@@ -95,6 +95,7 @@ typedef struct _Evas_GL_Surface Evas_GL_Surface; > #endif > > typedef struct Ewk_View_Smart_Data Ewk_View_Smart_Data; >+typedef struct Ewk_View_Smart_Class Ewk_View_Smart_Class; > > class EwkView { > public: >@@ -103,11 +104,20 @@ public: > LegacyBehavior, > DefaultBehavior > }; >- EwkView(Evas_Object* view, PassRefPtr<EwkContext> context, PassRefPtr<WebKit::WebPageGroup> pageGroup, ViewBehavior); >- ~EwkView(); > >- static EwkView* fromEvasObject(const Evas_Object* view); >- Evas_Object* view() { return m_evasObject; } >+ static EwkView* createWithSmartClass(Evas* canvas, Evas_Smart* smart, PassRefPtr<EwkContext> context, WKPageGroupRef pageGroupRef = 0, ViewBehavior behavior = EwkView::DefaultBehavior); >+ static EwkView* create(Evas* canvas, PassRefPtr<EwkContext> context, WKPageGroupRef pageGroupRef = 0, ViewBehavior behavior = EwkView::DefaultBehavior); >+ >+ static EwkView* fromEvasObject(const Evas_Object*); >+ static EwkView* fromSmartData(const Ewk_View_Smart_Data*); >+ >+ Ewk_View_Smart_Data* smartData() const; >+ static Ewk_View_Smart_Data* smartData(Evas_Object* evasObject); >+ >+ static bool initSmartClassInterface(Ewk_View_Smart_Class&); >+ static bool isFromEwkView(const Evas_Object* evasObject); >+ >+ Evas_Object* evasObject() { return m_evasObject; } > > WKPageRef wkPage(); > WebKit::WebPageProxy* page() { return m_pageProxy.get(); } >@@ -149,9 +159,7 @@ public: > > void update(const WebCore::IntRect& rect = WebCore::IntRect()); > >- static void addToPageViewMap(EwkView* view); >- static void removeFromPageViewMap(EwkView* view); >- static const Evas_Object* viewFromPageViewMap(const WKPageRef); >+ static const Evas_Object* viewFromPageViewMap(WKPageRef); > > #if ENABLE(FULLSCREEN_API) > void enterFullScreen(); >@@ -215,7 +223,9 @@ public: > PassRefPtr<cairo_surface_t> takeSnapshot(); > > private: >- inline Ewk_View_Smart_Data* smartData() const; >+ EwkView(Evas_Object* evasObject, PassRefPtr<EwkContext> context, PassRefPtr<WebKit::WebPageGroup> pageGroup, ViewBehavior); >+ ~EwkView(); // Cannot be deleted from outside. >+ > void displayTimerFired(WebCore::Timer<EwkView>*); > > #if USE(COORDINATED_GRAPHICS) >@@ -224,17 +234,37 @@ private: > > void informIconChange(); > >- static void onMouseDown(void* data, Evas*, Evas_Object*, void* eventInfo); >- static void onMouseUp(void* data, Evas*, Evas_Object*, void* eventInfo); >- static void onMouseMove(void* data, Evas*, Evas_Object*, void* eventInfo); >+ // Evas_Smart_Class functions. >+ static void onEvasSmartAdd(Evas_Object*); >+ static void onEvasSmartDelete(Evas_Object*); >+ static void onEvasSmartMove(Evas_Object*, Evas_Coord x, Evas_Coord y); >+ static void onEvasSmartResize(Evas_Object*, Evas_Coord width, Evas_Coord height); >+ static void onEvasSmartShow(Evas_Object*); >+ static void onEvasSmartHide(Evas_Object*); >+ static void onEvasSmartColorSet(Evas_Object*, int red, int green, int blue, int alpha); >+ static void onEvasSmartCalculate(Evas_Object*); >+ >+ // Ewk_View_Smart_Class functions. >+ static Eina_Bool onViewSmartFocusIn(Ewk_View_Smart_Data* smartData); >+ static Eina_Bool onViewSmartFocusOut(Ewk_View_Smart_Data* smartData); >+ static Eina_Bool onViewSmartMouseWheel(Ewk_View_Smart_Data* smartData, const Evas_Event_Mouse_Wheel* wheelEvent); >+ static Eina_Bool onViewSmartMouseDown(Ewk_View_Smart_Data* smartData, const Evas_Event_Mouse_Down* downEvent); >+ static Eina_Bool onViewSmartMouseUp(Ewk_View_Smart_Data* smartData, const Evas_Event_Mouse_Up* upEvent); >+ static Eina_Bool onViewSmartMouseMove(Ewk_View_Smart_Data* smartData, const Evas_Event_Mouse_Move* moveEvent); >+ static Eina_Bool onViewSmartKeyDown(Ewk_View_Smart_Data* smartData, const Evas_Event_Key_Down* downEvent); >+ static Eina_Bool onViewSmartKeyUp(Ewk_View_Smart_Data* smartData, const Evas_Event_Key_Up* upEvent); >+ > #if ENABLE(TOUCH_EVENTS) > void feedTouchEvents(Ewk_Touch_Event_Type type); >- static void onTouchDown(void* /* data */, Evas* /* canvas */, Evas_Object* ewkView, void* /* eventInfo */); >- static void onTouchUp(void* /* data */, Evas* /* canvas */, Evas_Object* ewkView, void* /* eventInfo */); >- static void onTouchMove(void* /* data */, Evas* /* canvas */, Evas_Object* ewkView, void* /* eventInfo */); >+ static void onTouchDown(void* data, Evas*, Evas_Object*, void* eventInfo); >+ static void onTouchUp(void* data, Evas*, Evas_Object*, void* eventInfo); >+ static void onTouchMove(void* data, Evas*, Evas_Object*, void* eventInfo); > #endif > static void onFaviconChanged(const char* pageURL, void* eventInfo); > >+ static void addToPageViewMap(EwkView* view); >+ static void removeFromPageViewMap(EwkView* view); >+private: > // Note, initialization order matters. > Evas_Object* m_evasObject; > RefPtr<EwkContext> m_context; >@@ -281,6 +311,9 @@ private: > #endif > bool m_isHardwareAccelerated; > bool m_setDrawsBackground; >+ >+ static const char smartClassName[]; >+ static Evas_Smart_Class parentSmartClass; > }; > > #endif // EwkView_h >diff --git a/Source/WebKit2/UIProcess/API/efl/ewk_view.cpp b/Source/WebKit2/UIProcess/API/efl/ewk_view.cpp >index 72a6afa..4087b3d 100644 >--- a/Source/WebKit2/UIProcess/API/efl/ewk_view.cpp >+++ b/Source/WebKit2/UIProcess/API/efl/ewk_view.cpp >@@ -51,7 +51,6 @@ > #include "ewk_intent_private.h" > #include "ewk_private.h" > #include "ewk_settings_private.h" >-#include "ewk_view_private.h" > #include <Ecore_Evas.h> > #include <WebKit2/WKPageGroup.h> > #include <wtf/UnusedParam.h> >@@ -69,482 +68,37 @@ > using namespace WebKit; > using namespace WebCore; > >-static const char EWK_VIEW_TYPE_STR[] = "EWK2_View"; >- >-#define EWK_VIEW_TYPE_CHECK(ewkView, result) \ >- bool result = true; \ >- do { \ >- if (!ewkView) { \ >- EINA_LOG_CRIT("null is not a ewk_view"); \ >- result = false; \ >- break; \ >- } \ >- const char* _tmp_otype = evas_object_type_get(ewkView); \ >- const Evas_Smart* _tmp_s = evas_object_smart_smart_get(ewkView); \ >- if (EINA_UNLIKELY(!_tmp_s)) { \ >- EINA_LOG_CRIT \ >- ("%p (%s) is not a smart object!", \ >- ewkView, _tmp_otype ? _tmp_otype : "(null)"); \ >- result = false; \ >- break; \ >- } \ >- const Evas_Smart_Class* _tmp_sc = evas_smart_class_get(_tmp_s); \ >- if (EINA_UNLIKELY(!_tmp_sc)) { \ >- EINA_LOG_CRIT \ >- ("%p (%s) is not a smart object!", \ >- ewkView, _tmp_otype ? _tmp_otype : "(null)"); \ >- result = false; \ >- break; \ >- } \ >- if (EINA_UNLIKELY(_tmp_sc->data != EWK_VIEW_TYPE_STR)) { \ >- EINA_LOG_CRIT \ >- ("%p (%s) is not of an ewk_view (need %p, got %p)!", \ >- ewkView, _tmp_otype ? _tmp_otype : "(null)", \ >- EWK_VIEW_TYPE_STR, _tmp_sc->data); \ >- result = false; \ >- } \ >- } while (0) >- >-#define EWK_VIEW_SD_GET(ewkView, smartData) \ >- EWK_VIEW_TYPE_CHECK(ewkView, _tmp_result); \ >- Ewk_View_Smart_Data* smartData = 0; \ >- if (_tmp_result) \ >- smartData = (Ewk_View_Smart_Data*)evas_object_smart_data_get(ewkView) >- >-#define EWK_VIEW_SD_GET_OR_RETURN(ewkView, smartData, ...) \ >- EWK_VIEW_SD_GET(ewkView, smartData); \ >- do { \ >- if (!smartData) { \ >- EINA_LOG_CRIT("no smart data for object %p (%s)", \ >- ewkView, evas_object_type_get(ewkView)); \ >- return __VA_ARGS__; \ >- } \ >- } while (0) >- >-#define EWK_VIEW_IMPL_GET_BY_SD_OR_RETURN(smartData, impl, ...) \ >- if (!smartData) { \ >- EINA_LOG_CRIT("smart data is null"); \ >- return __VA_ARGS__; \ >- } \ >- EwkView* impl = smartData->priv; \ >- do { \ >- if (!impl) { \ >- EINA_LOG_CRIT("no private data for object %p (%s)", \ >- smartData->self, evas_object_type_get(smartData->self)); \ >- return __VA_ARGS__; \ >- } \ >- } while (0) >- > #define EWK_VIEW_IMPL_GET_OR_RETURN(ewkView, impl, ...) \ >- EwkView* impl = 0; \ >+ EwkView* impl = EwkView::fromEvasObject(ewkView); \ > do { \ >- EWK_VIEW_SD_GET_OR_RETURN(ewkView, smartData, __VA_ARGS__); \ >- impl = smartData->priv; \ > if (!impl) { \ >- EINA_LOG_CRIT("no private data for object %p (%s)", \ >- smartData->self, evas_object_type_get(smartData->self)); \ >+ EINA_LOG_CRIT("no private data for object %p", ewkView); \ > return __VA_ARGS__; \ > } \ > } while (0) > >-/// Creates a type name for Ewk_Page_Contents_Context. >-typedef struct Ewk_Page_Contents_Context Ewk_Page_Contents_Context; >- >-/* >- * @brief Structure containing page contents context used for ewk_view_page_contents_get() API. >- */ >-struct Ewk_Page_Contents_Context { >- Ewk_Page_Contents_Type type; >- Ewk_Page_Contents_Cb callback; >-}; >- >-static void _ewk_view_smart_changed(Ewk_View_Smart_Data* smartData) >-{ >- if (smartData->changed.any) >- return; >- smartData->changed.any = true; >- evas_object_smart_changed(smartData->self); >-} >- >-// Default Event Handling. >-static Eina_Bool _ewk_view_smart_focus_in(Ewk_View_Smart_Data* smartData) >-{ >- EWK_VIEW_IMPL_GET_BY_SD_OR_RETURN(smartData, impl, false); >- >- impl->page()->viewStateDidChange(WebPageProxy::ViewIsFocused | WebPageProxy::ViewWindowIsActive); >- return true; >-} >- >-static Eina_Bool _ewk_view_smart_focus_out(Ewk_View_Smart_Data* smartData) >-{ >- EWK_VIEW_IMPL_GET_BY_SD_OR_RETURN(smartData, impl, false); >- >- impl->page()->viewStateDidChange(WebPageProxy::ViewIsFocused | WebPageProxy::ViewWindowIsActive); >- return true; >-} >- >-static Eina_Bool _ewk_view_smart_mouse_wheel(Ewk_View_Smart_Data* smartData, const Evas_Event_Mouse_Wheel* wheelEvent) >-{ >- EWK_VIEW_IMPL_GET_BY_SD_OR_RETURN(smartData, impl, false); >- >- impl->page()->handleWheelEvent(NativeWebWheelEvent(wheelEvent, impl->transformFromScene(), impl->transformToScreen())); >- return true; >-} >- >-static Eina_Bool _ewk_view_smart_mouse_down(Ewk_View_Smart_Data* smartData, const Evas_Event_Mouse_Down* downEvent) >-{ >- EWK_VIEW_IMPL_GET_BY_SD_OR_RETURN(smartData, impl, false); >- >- impl->page()->handleMouseEvent(NativeWebMouseEvent(downEvent, impl->transformFromScene(), impl->transformToScreen())); >- return true; >-} >- >-static Eina_Bool _ewk_view_smart_mouse_up(Ewk_View_Smart_Data* smartData, const Evas_Event_Mouse_Up* upEvent) >-{ >- EWK_VIEW_IMPL_GET_BY_SD_OR_RETURN(smartData, impl, false); >- >- impl->page()->handleMouseEvent(NativeWebMouseEvent(upEvent, impl->transformFromScene(), impl->transformToScreen())); >- >- InputMethodContextEfl* inputMethodContext = impl->inputMethodContext(); >- if (inputMethodContext) >- inputMethodContext->handleMouseUpEvent(upEvent); >- >- return true; >-} >- >-static Eina_Bool _ewk_view_smart_mouse_move(Ewk_View_Smart_Data* smartData, const Evas_Event_Mouse_Move* moveEvent) >-{ >- EWK_VIEW_IMPL_GET_BY_SD_OR_RETURN(smartData, impl, false); >- >- impl->page()->handleMouseEvent(NativeWebMouseEvent(moveEvent, impl->transformFromScene(), impl->transformToScreen())); >- return true; >-} >- >-static Eina_Bool _ewk_view_smart_key_down(Ewk_View_Smart_Data* smartData, const Evas_Event_Key_Down* downEvent) >-{ >- EWK_VIEW_IMPL_GET_BY_SD_OR_RETURN(smartData, impl, false); >- >- bool isFiltered = false; >- InputMethodContextEfl* inputMethodContext = impl->inputMethodContext(); >- if (inputMethodContext) >- inputMethodContext->handleKeyDownEvent(downEvent, &isFiltered); >- >- impl->page()->handleKeyboardEvent(NativeWebKeyboardEvent(downEvent, isFiltered)); >- return true; >-} >- >-static Eina_Bool _ewk_view_smart_key_up(Ewk_View_Smart_Data* smartData, const Evas_Event_Key_Up* upEvent) >-{ >- EWK_VIEW_IMPL_GET_BY_SD_OR_RETURN(smartData, impl, false); >- >- impl->page()->handleKeyboardEvent(NativeWebKeyboardEvent(upEvent)); >- return true; >-} >- >-// Event Handling. >-static void _ewk_view_on_focus_in(void* data, Evas*, Evas_Object*, void* /*eventInfo*/) >-{ >- Ewk_View_Smart_Data* smartData = static_cast<Ewk_View_Smart_Data*>(data); >- EINA_SAFETY_ON_NULL_RETURN(smartData->api); >- EINA_SAFETY_ON_NULL_RETURN(smartData->api->focus_in); >- smartData->api->focus_in(smartData); >-} >- >-static void _ewk_view_on_focus_out(void* data, Evas*, Evas_Object*, void* /*eventInfo*/) >-{ >- Ewk_View_Smart_Data* smartData = static_cast<Ewk_View_Smart_Data*>(data); >- EINA_SAFETY_ON_NULL_RETURN(smartData->api); >- EINA_SAFETY_ON_NULL_RETURN(smartData->api->focus_out); >- smartData->api->focus_out(smartData); >-} >- >-static void _ewk_view_on_mouse_wheel(void* data, Evas*, Evas_Object*, void* eventInfo) >-{ >- Evas_Event_Mouse_Wheel* wheelEvent = static_cast<Evas_Event_Mouse_Wheel*>(eventInfo); >- Ewk_View_Smart_Data* smartData = static_cast<Ewk_View_Smart_Data*>(data); >- EINA_SAFETY_ON_NULL_RETURN(smartData->api); >- EINA_SAFETY_ON_NULL_RETURN(smartData->api->mouse_wheel); >- smartData->api->mouse_wheel(smartData, wheelEvent); >-} >- >-static void _ewk_view_on_key_down(void* data, Evas*, Evas_Object*, void* eventInfo) >-{ >- Evas_Event_Key_Down* downEvent = static_cast<Evas_Event_Key_Down*>(eventInfo); >- Ewk_View_Smart_Data* smartData = static_cast<Ewk_View_Smart_Data*>(data); >- EINA_SAFETY_ON_NULL_RETURN(smartData->api); >- EINA_SAFETY_ON_NULL_RETURN(smartData->api->key_down); >- smartData->api->key_down(smartData, downEvent); >-} >- >-static void _ewk_view_on_key_up(void* data, Evas*, Evas_Object*, void* eventInfo) >-{ >- Evas_Event_Key_Up* upEvent = static_cast<Evas_Event_Key_Up*>(eventInfo); >- Ewk_View_Smart_Data* smartData = static_cast<Ewk_View_Smart_Data*>(data); >- EINA_SAFETY_ON_NULL_RETURN(smartData->api); >- EINA_SAFETY_ON_NULL_RETURN(smartData->api->key_up); >- smartData->api->key_up(smartData, upEvent); >-} >- >-static void _ewk_view_on_show(void* data, Evas*, Evas_Object*, void* /*eventInfo*/) >-{ >- Ewk_View_Smart_Data* smartData = static_cast<Ewk_View_Smart_Data*>(data); >- EWK_VIEW_IMPL_GET_BY_SD_OR_RETURN(smartData, impl); >- impl->page()->viewStateDidChange(WebPageProxy::ViewIsVisible); >-} >- >-static void _ewk_view_on_hide(void* data, Evas*, Evas_Object*, void* /*eventInfo*/) >-{ >- Ewk_View_Smart_Data* smartData = static_cast<Ewk_View_Smart_Data*>(data); >- EWK_VIEW_IMPL_GET_BY_SD_OR_RETURN(smartData, impl); >- >- // This call may look wrong, but we really need to pass ViewIsVisible here. >- // viewStateDidChange() itself is responsible for actually setting the visibility to Visible or Hidden >- // depending on what WebPageProxy::isViewVisible() returns, this simply triggers the process. >- impl->page()->viewStateDidChange(WebPageProxy::ViewIsVisible); >-} >- >-static Evas_Smart_Class g_parentSmartClass = EVAS_SMART_CLASS_INIT_NULL; >- >-static void _ewk_view_smart_add(Evas_Object* ewkView) >-{ >- const Evas_Smart* smart = evas_object_smart_smart_get(ewkView); >- const Evas_Smart_Class* smartClass = evas_smart_class_get(smart); >- const Ewk_View_Smart_Class* api = reinterpret_cast<const Ewk_View_Smart_Class*>(smartClass); >- EWK_VIEW_SD_GET(ewkView, smartData); >- >- if (!smartData) { >- smartData = static_cast<Ewk_View_Smart_Data*>(calloc(1, sizeof(Ewk_View_Smart_Data))); >- if (!smartData) { >- EINA_LOG_CRIT("could not allocate Ewk_View_Smart_Data"); >- return; >- } >- evas_object_smart_data_set(ewkView, smartData); >- } >- >- smartData->self = ewkView; >- smartData->api = api; >- >- g_parentSmartClass.add(ewkView); >- >- smartData->priv = 0; >- >- // Create evas_object_image to draw web contents. >- smartData->image = evas_object_image_add(smartData->base.evas); >- evas_object_image_alpha_set(smartData->image, false); >- evas_object_image_filled_set(smartData->image, true); >- evas_object_smart_member_add(smartData->image, ewkView); >- evas_object_show(smartData->image); >- >-#define CONNECT(s, c) evas_object_event_callback_add(ewkView, s, c, smartData) >- CONNECT(EVAS_CALLBACK_FOCUS_IN, _ewk_view_on_focus_in); >- CONNECT(EVAS_CALLBACK_FOCUS_OUT, _ewk_view_on_focus_out); >- CONNECT(EVAS_CALLBACK_MOUSE_WHEEL, _ewk_view_on_mouse_wheel); >- CONNECT(EVAS_CALLBACK_KEY_DOWN, _ewk_view_on_key_down); >- CONNECT(EVAS_CALLBACK_KEY_UP, _ewk_view_on_key_up); >- CONNECT(EVAS_CALLBACK_SHOW, _ewk_view_on_show); >- CONNECT(EVAS_CALLBACK_HIDE, _ewk_view_on_hide); >-#undef CONNECT >-} >- >-static void _ewk_view_smart_del(Evas_Object* ewkView) >-{ >- EWK_VIEW_SD_GET(ewkView, smartData); >- if (smartData) >- delete smartData->priv; >- >- g_parentSmartClass.del(ewkView); >-} >- >-static void _ewk_view_smart_resize(Evas_Object* ewkView, Evas_Coord width, Evas_Coord height) >-{ >- EWK_VIEW_SD_GET_OR_RETURN(ewkView, smartData); >- >- evas_object_resize(smartData->image, width, height); >- evas_object_image_size_set(smartData->image, width, height); >- evas_object_image_fill_set(smartData->image, 0, 0, width, height); >- >- smartData->changed.size = true; >- _ewk_view_smart_changed(smartData); >-} >- >-static void _ewk_view_smart_move(Evas_Object* ewkView, Evas_Coord /*x*/, Evas_Coord /*y*/) >-{ >- EWK_VIEW_SD_GET_OR_RETURN(ewkView, smartData); >- >- smartData->changed.position = true; >- _ewk_view_smart_changed(smartData); >-} >- >-static void _ewk_view_smart_calculate(Evas_Object* ewkView) >-{ >- EWK_VIEW_SD_GET_OR_RETURN(ewkView, smartData); >- EWK_VIEW_IMPL_GET_BY_SD_OR_RETURN(smartData, impl); >- >- smartData->changed.any = false; >- >- Evas_Coord x, y, width, height; >- evas_object_geometry_get(ewkView, &x, &y, &width, &height); >- >- if (smartData->changed.position) { >- smartData->changed.position = false; >- smartData->view.x = x; >- smartData->view.y = y; >- evas_object_move(smartData->image, x, y); >- } >- >- if (smartData->changed.size) { >- smartData->changed.size = false; >- smartData->view.w = width; >- smartData->view.h = height; >- >- if (impl->page()->drawingArea()) >- impl->page()->drawingArea()->setSize(IntSize(width, height), IntSize()); >- >-#if USE(ACCELERATED_COMPOSITING) >- impl->setNeedsSurfaceResize(); >-#endif >-#if USE(TILED_BACKING_STORE) >- impl->pageClient()->updateViewportSize(); >-#endif >- } >-} >- >-static void _ewk_view_smart_show(Evas_Object* ewkView) >-{ >- EWK_VIEW_SD_GET_OR_RETURN(ewkView, smartData); >- >- if (evas_object_clipees_get(smartData->base.clipper)) >- evas_object_show(smartData->base.clipper); >- evas_object_show(smartData->image); >-} >- >-static void _ewk_view_smart_hide(Evas_Object* ewkView) >-{ >- EWK_VIEW_SD_GET_OR_RETURN(ewkView, smartData); >- >- evas_object_hide(smartData->base.clipper); >- evas_object_hide(smartData->image); >-} >- >-static void _ewk_view_smart_color_set(Evas_Object* ewkView, int red, int green, int blue, int alpha) >-{ >- EWK_VIEW_SD_GET_OR_RETURN(ewkView, smartData); >- EWK_VIEW_IMPL_GET_BY_SD_OR_RETURN(smartData, impl); >- >- if (alpha < 0) >- alpha = 0; >- else if (alpha > 255) >- alpha = 255; >- >-#define CHECK_COLOR(color, alpha) \ >- if (color < 0) \ >- color = 0; \ >- else if (color > alpha) \ >- color = alpha; >- CHECK_COLOR(red, alpha); >- CHECK_COLOR(green, alpha); >- CHECK_COLOR(blue, alpha); >-#undef CHECK_COLOR >- >- evas_object_image_alpha_set(smartData->image, alpha < 255); >- impl->page()->setDrawsBackground(red || green || blue); >- impl->page()->setDrawsTransparentBackground(alpha < 255); >- >- g_parentSmartClass.color_set(ewkView, red, green, blue, alpha); >-} > > Eina_Bool ewk_view_smart_class_set(Ewk_View_Smart_Class* api) > { > EINA_SAFETY_ON_NULL_RETURN_VAL(api, false); > >- if (api->version != EWK_VIEW_SMART_CLASS_VERSION) { >- EINA_LOG_CRIT("Ewk_View_Smart_Class %p is version %lu while %lu was expected.", >- api, api->version, EWK_VIEW_SMART_CLASS_VERSION); >- return false; >- } >- >- if (EINA_UNLIKELY(!g_parentSmartClass.add)) >- evas_object_smart_clipped_smart_set(&g_parentSmartClass); >- >- evas_object_smart_clipped_smart_set(&api->sc); >- >- // Set Evas_Smart_Class functions. >- api->sc.add = _ewk_view_smart_add; >- api->sc.del = _ewk_view_smart_del; >- api->sc.move = _ewk_view_smart_move; >- api->sc.resize = _ewk_view_smart_resize; >- api->sc.show = _ewk_view_smart_show; >- api->sc.hide = _ewk_view_smart_hide; >- api->sc.color_set = _ewk_view_smart_color_set; >- api->sc.calculate = _ewk_view_smart_calculate; >- api->sc.data = EWK_VIEW_TYPE_STR; // It is used by type checking. >- >- // Set Ewk_View_Smart_Class functions. >- api->focus_in = _ewk_view_smart_focus_in; >- api->focus_out = _ewk_view_smart_focus_out; >- api->mouse_wheel = _ewk_view_smart_mouse_wheel; >- api->mouse_down = _ewk_view_smart_mouse_down; >- api->mouse_up = _ewk_view_smart_mouse_up; >- api->mouse_move = _ewk_view_smart_mouse_move; >- api->key_down = _ewk_view_smart_key_down; >- api->key_up = _ewk_view_smart_key_up; >- >- return true; >-} >- >-static inline Evas_Smart* createEwkViewSmartClass(void) >-{ >- static Ewk_View_Smart_Class api = EWK_VIEW_SMART_CLASS_INIT_NAME_VERSION("Ewk_View"); >- static Evas_Smart* smart = 0; >- >- if (EINA_UNLIKELY(!smart)) { >- ewk_view_smart_class_set(&api); >- smart = evas_smart_class_new(&api.sc); >- } >- >- return smart; >-} >- >-static inline Evas_Object* createEwkView(Evas* canvas, Evas_Smart* smart, PassRefPtr<EwkContext> context, WKPageGroupRef pageGroupRef = 0, EwkView::ViewBehavior behavior = EwkView::DefaultBehavior) >-{ >- EINA_SAFETY_ON_NULL_RETURN_VAL(canvas, 0); >- EINA_SAFETY_ON_NULL_RETURN_VAL(smart, 0); >- EINA_SAFETY_ON_NULL_RETURN_VAL(context, 0); >- >- Evas_Object* ewkView = evas_object_smart_add(canvas, smart); >- EINA_SAFETY_ON_NULL_RETURN_VAL(ewkView, 0); >- >- EWK_VIEW_SD_GET(ewkView, smartData); >- if (!smartData) { >- evas_object_del(ewkView); >- return 0; >- } >- >- ASSERT(!smartData->priv); >- >- // Default WebPageGroup is created in WebContext constructor if the pageGroupRef is 0, >- // so we do not need to create it here. >- smartData->priv = new EwkView(ewkView, context, toImpl(pageGroupRef), behavior); >- return ewkView; >-} >- >-/** >- * @internal >- * Constructs a ewk_view Evas_Object with WKType parameters. >- */ >-Evas_Object* ewk_view_base_add(Evas* canvas, WKContextRef contextRef, WKPageGroupRef pageGroupRef, EwkView::ViewBehavior behavior) >-{ >- return createEwkView(canvas, createEwkViewSmartClass(), contextRef ? EwkContext::create(toImpl(contextRef)) : EwkContext::defaultContext(), pageGroupRef, behavior); >+ return EwkView::initSmartClassInterface(*api); > } > > Evas_Object* ewk_view_smart_add(Evas* canvas, Evas_Smart* smart, Ewk_Context* context) > { >- return createEwkView(canvas, smart, ewk_object_cast<EwkContext*>(context)); >+ EwkView* view = EwkView::createWithSmartClass(canvas, smart, ewk_object_cast<EwkContext*>(context)); >+ EINA_SAFETY_ON_NULL_RETURN_VAL(view, 0); >+ >+ return view->evasObject(); > } > > Evas_Object* ewk_view_add_with_context(Evas* canvas, Ewk_Context* context) > { >- return ewk_view_smart_add(canvas, createEwkViewSmartClass(), ewk_object_cast<EwkContext*>(context)); >+ EwkView* view = EwkView::create(canvas, ewk_object_cast<EwkContext*>(context)); >+ EINA_SAFETY_ON_NULL_RETURN_VAL(view, 0); >+ >+ return view->evasObject(); > } > > Evas_Object* ewk_view_add(Evas* canvas) >@@ -839,8 +393,7 @@ Eina_Bool ewk_view_feed_touch_event(Evas_Object* ewkView, Ewk_Touch_Event_Type t > { > #if ENABLE(TOUCH_EVENTS) > EINA_SAFETY_ON_NULL_RETURN_VAL(points, false); >- EWK_VIEW_SD_GET_OR_RETURN(ewkView, smartData, false); >- EWK_VIEW_IMPL_GET_BY_SD_OR_RETURN(smartData, impl, false); >+ EWK_VIEW_IMPL_GET_OR_RETURN(ewkView, impl, false); > > impl->page()->handleTouchEvent(NativeWebTouchEvent(type, points, modifiers, impl->transformFromScene(), impl->transformToScreen(), ecore_time_get())); > >@@ -957,6 +510,17 @@ void ewk_view_draws_page_background_set(Evas_Object *ewkView, Eina_Bool enabled) > impl->setDrawsBackground(enabled); > } > >+/// Creates a type name for Ewk_Page_Contents_Context. >+typedef struct Ewk_Page_Contents_Context Ewk_Page_Contents_Context; >+ >+/* >+ * @brief Structure containing page contents context used for ewk_view_page_contents_get() API. >+ */ >+struct Ewk_Page_Contents_Context { >+ Ewk_Page_Contents_Type type; >+ Ewk_Page_Contents_Cb callback; >+}; >+ > /** > * @internal > * Callback function used for ewk_view_page_contents_get(). >diff --git a/Source/WebKit2/UIProcess/API/efl/ewk_view_private.h b/Source/WebKit2/UIProcess/API/efl/ewk_view_private.h >deleted file mode 100644 >index 83b4c97..0000000 >--- a/Source/WebKit2/UIProcess/API/efl/ewk_view_private.h >+++ /dev/null >@@ -1,30 +0,0 @@ >-/* >- * Copyright (C) 2012 Samsung Electronics >- * >- * This library is free software; you can redistribute it and/or >- * modify it under the terms of the GNU Library General Public >- * License as published by the Free Software Foundation; either >- * version 2 of the License, or (at your option) any later version. >- * >- * This library 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 >- * Library General Public License for more details. >- * >- * You should have received a copy of the GNU Library General Public License >- * along with this library; see the file COPYING.LIB. If not, write to >- * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, >- * Boston, MA 02110-1301, USA. >- * >- */ >- >-#ifndef ewk_view_private_h >-#define ewk_view_private_h >- >-#include "EwkView.h" >-#include <Evas.h> >-#include <WebKit2/WKBase.h> >- >-Evas_Object* ewk_view_base_add(Evas* canvas, WKContextRef, WKPageGroupRef, EwkView::ViewBehavior); >- >-#endif // ewk_view_private_h >diff --git a/Source/WebKit2/UIProcess/efl/PageClientBase.cpp b/Source/WebKit2/UIProcess/efl/PageClientBase.cpp >index 2efdbd0..1111ff7 100644 >--- a/Source/WebKit2/UIProcess/efl/PageClientBase.cpp >+++ b/Source/WebKit2/UIProcess/efl/PageClientBase.cpp >@@ -118,7 +118,7 @@ bool PageClientBase::isViewInWindow() > void PageClientBase::processDidCrash() > { > // Check if loading was ongoing, when web process crashed. >- double loadProgress = ewk_view_load_progress_get(m_view->view()); >+ double loadProgress = ewk_view_load_progress_get(m_view->evasObject()); > if (loadProgress >= 0 && loadProgress < 1) { > loadProgress = 1; > m_view->smartCallback<LoadProgress>().call(&loadProgress); >@@ -134,7 +134,7 @@ void PageClientBase::processDidCrash() > WARN("WARNING: The web process experienced a crash on '%s'.\n", url.data()); > > // Display an error page >- ewk_view_html_string_load(m_view->view(), "The web process has crashed.", 0, url.data()); >+ ewk_view_html_string_load(m_view->evasObject(), "The web process has crashed.", 0, url.data()); > } > } > >diff --git a/Source/WebKit2/UIProcess/efl/PageLoadClientEfl.cpp b/Source/WebKit2/UIProcess/efl/PageLoadClientEfl.cpp >index 7495110..28cfaa1 100644 >--- a/Source/WebKit2/UIProcess/efl/PageLoadClientEfl.cpp >+++ b/Source/WebKit2/UIProcess/efl/PageLoadClientEfl.cpp >@@ -147,7 +147,7 @@ void PageLoadClientEfl::didChangeBackForwardList(WKPageRef, WKBackForwardListIte > EwkView* view = toPageLoadClientEfl(clientInfo)->view(); > ASSERT(view); > >- Ewk_Back_Forward_List* list = ewk_view_back_forward_list_get(view->view()); >+ Ewk_Back_Forward_List* list = ewk_view_back_forward_list_get(view->evasObject()); > ASSERT(list); > list->update(addedItem, removedItems); > >diff --git a/Source/WebKit2/UIProcess/efl/PageUIClientEfl.cpp b/Source/WebKit2/UIProcess/efl/PageUIClientEfl.cpp >index 811db06..1fe9125 100644 >--- a/Source/WebKit2/UIProcess/efl/PageUIClientEfl.cpp >+++ b/Source/WebKit2/UIProcess/efl/PageUIClientEfl.cpp >@@ -94,17 +94,17 @@ void PageUIClientEfl::close(WKPageRef, const void* clientInfo) > void PageUIClientEfl::takeFocus(WKPageRef, WKFocusDirection, const void* clientInfo) > { > // FIXME: this is only a partial implementation. >- evas_object_focus_set(toPageUIClientEfl(clientInfo)->m_view->view(), false); >+ evas_object_focus_set(toPageUIClientEfl(clientInfo)->m_view->evasObject(), false); > } > > void PageUIClientEfl::focus(WKPageRef, const void* clientInfo) > { >- evas_object_focus_set(toPageUIClientEfl(clientInfo)->m_view->view(), true); >+ evas_object_focus_set(toPageUIClientEfl(clientInfo)->m_view->evasObject(), true); > } > > void PageUIClientEfl::unfocus(WKPageRef, const void* clientInfo) > { >- evas_object_focus_set(toPageUIClientEfl(clientInfo)->m_view->view(), false); >+ evas_object_focus_set(toPageUIClientEfl(clientInfo)->m_view->evasObject(), false); > } > > void PageUIClientEfl::runJavaScriptAlert(WKPageRef, WKStringRef alertText, WKFrameRef, const void* clientInfo) >diff --git a/Source/WebKit2/UIProcess/efl/WebInspectorProxyEfl.cpp b/Source/WebKit2/UIProcess/efl/WebInspectorProxyEfl.cpp >index 462b26d..ab3c627 100644 >--- a/Source/WebKit2/UIProcess/efl/WebInspectorProxyEfl.cpp >+++ b/Source/WebKit2/UIProcess/efl/WebInspectorProxyEfl.cpp >@@ -30,9 +30,9 @@ > > #include "EwkView.h" > #include "WebProcessProxy.h" >+#include "ewk_context_private.h" > #include "ewk_settings.h" > #include "ewk_view.h" >-#include "ewk_view_private.h" > #include <WebCore/EflInspectorUtilities.h> > #include <WebCore/NotImplemented.h> > #include <wtf/text/CString.h> >@@ -82,6 +82,11 @@ void WebInspectorProxy::createInspectorWindow() > > evas_object_focus_set(m_inspectorView, true); > } >+// FIXME: should have this in some generic place >+static inline PassRefPtr<EwkContext> ewkContext(WKContextRef contextRef) >+{ >+ return contextRef ? EwkContext::create(toImpl(contextRef)) : EwkContext::defaultContext(); >+} > > WebPageProxy* WebInspectorProxy::platformCreateInspectorPage() > { >@@ -98,8 +103,11 @@ WebPageProxy* WebInspectorProxy::platformCreateInspectorPage() > if (!m_inspectorWindow) > return 0; > >- m_inspectorView = ewk_view_base_add(ecore_evas_get(m_inspectorWindow), toAPI(page()->process()->context()), toAPI(inspectorPageGroup()), EwkView::LegacyBehavior); >- EwkView* inspectorViewImpl = EwkView::fromEvasObject(m_inspectorView); >+ EwkView* inspectorViewImpl = EwkView::create(ecore_evas_get(m_inspectorWindow), ewkContext(toAPI(page()->process()->context())), toAPI(inspectorPageGroup()), EwkView::LegacyBehavior); >+ if (!inspectorViewImpl) >+ return 0; >+ >+ m_inspectorView = inspectorViewImpl->evasObject(); > inspectorViewImpl->setThemePath(TEST_THEME_DIR "/default.edj"); > > Ewk_Settings* settings = inspectorViewImpl->settings(); >diff --git a/Source/WebKit2/UIProcess/efl/WebPageProxyEfl.cpp b/Source/WebKit2/UIProcess/efl/WebPageProxyEfl.cpp >index a332724..de70ca1 100644 >--- a/Source/WebKit2/UIProcess/efl/WebPageProxyEfl.cpp >+++ b/Source/WebKit2/UIProcess/efl/WebPageProxyEfl.cpp >@@ -40,7 +40,7 @@ namespace WebKit { > > Evas_Object* WebPageProxy::viewWidget() > { >- return static_cast<PageClientBase*>(m_pageClient)->view()->view(); >+ return static_cast<PageClientBase*>(m_pageClient)->view()->evasObject(); > } > > String WebPageProxy::standardUserAgent(const String& /*applicationNameForUserAgent*/)
You cannot view the attachment while viewing its details because your browser does not support IFRAMEs.
View the attachment on a separate page
.
View Attachment As Diff
View Attachment As Raw
Actions:
View
|
Formatted Diff
|
Diff
Attachments on
bug 108062
:
185561
|
186010
|
186042
|
186054
|
186595
|
186622
|
186634
|
186638
|
186724