WebKit Bugzilla
New
Browse
Search+
Log In
×
Sign in with GitHub
or
Remember my login
Create Account
·
Forgot Password
Forgotten password account recovery
[patch]
patch
bug108062 (text/plain), 72.70 KB, created by
Mikhail Pozdnyakov
on 2013-02-01 07:23:01 PST
(
hide
)
Description:
patch
Filename:
MIME Type:
Creator:
Mikhail Pozdnyakov
Created:
2013-02-01 07:23:01 PST
Size:
72.70 KB
patch
obsolete
>commit 4f57f81f3eb15b1b22b9860057bb566fe4724384 >Author: Mikhail Pozdnyakov <mikhail.pozdnyakov@intel.com> >Date: Wed Jan 30 22:28:16 2013 +0200 > > bug108062 > >diff --git a/Source/WebKit2/ChangeLog b/Source/WebKit2/ChangeLog >index 73de433..70d8e53 100644 >--- a/Source/WebKit2/ChangeLog >+++ b/Source/WebKit2/ChangeLog >@@ -1,5 +1,96 @@ > 2013-02-01 Mikhail Pozdnyakov <mikhail.pozdnyakov@intel.com> > >+ [EFL][WK2] Encapsulate Ewk View evas smart object code inside EwkView class >+ https://bugs.webkit.org/show_bug.cgi?id=108062 >+ >+ Reviewed by NOBODY (OOPS!). >+ >+ The Ewk View implementation is encapsulated within EwkView class. >+ Besides multiple refactoring of Ewk View evas smart object code was made. >+ >+ * UIProcess/API/C/efl/WKView.cpp: >+ (WKViewCreate): >+ (WKViewCreateWithFixedLayout): >+ (WKViewGetPage): >+ (WKViewCreateSnapshot): >+ * UIProcess/API/efl/EwkView.cpp: >+ (smartDataChanged): >+ (defaultSmartClassInstance): >+ (EwkViewEventHandler): >+ (EwkViewEventHandler::subscribe): >+ (EwkViewEventHandler::unsubscribe): >+ (::onEvent): >+ (EwkView::EwkView): >+ (EwkView::~EwkView): >+ (EwkView::createViewObject): >+ (EwkView::initSmartClassInterface): >+ (EwkView::viewObjectFromPage): >+ (EwkView::smartData): >+ (EwkView::size): >+ (EwkView::isFocused): >+ (EwkView::isVisible): >+ (EwkView::setMouseEventsEnabled): >+ (EwkView::setTouchEventsEnabled): >+ (EwkView::createGLSurface): >+ (EwkView::createNewPage): >+ (EwkView::onEvasSmartAdd): >+ (EwkView::onEvasSmartDelete): >+ (EwkView::onEvasSmartResize): >+ (EwkView::onEvasSmartMove): >+ (EwkView::onEvasSmartCalculate): >+ (EwkView::onEvasSmartShow): >+ (EwkView::onEvasSmartHide): >+ (EwkView::onEvasSmartColorSet): >+ (EwkView::onViewSmartFocusIn): >+ (EwkView::onViewSmartFocusOut): >+ (EwkView::onViewSmartMouseWheel): >+ (EwkView::onViewSmartMouseDown): >+ (EwkView::onViewSmartMouseUp): >+ (EwkView::onViewSmartMouseMove): >+ (EwkView::onViewSmartKeyDown): >+ (EwkView::onViewSmartKeyUp): >+ (EwkView::feedTouchEvents): >+ (EwkView::onTouchDown): >+ (EwkView::onTouchUp): >+ (EwkView::onTouchMove): >+ (toEwkView): >+ (isViewObject): >+ * UIProcess/API/efl/EwkView.h: >+ (EwkView::viewObject): >+ (EwkView): >+ (EwkView::smartCallback): >+ * UIProcess/API/efl/ewk_view.cpp: >+ (ewk_view_smart_class_set): >+ (ewk_view_smart_add): >+ (ewk_view_add_with_context): >+ (ewk_view_feed_touch_event): >+ (Ewk_Page_Contents_Context): >+ * UIProcess/API/efl/ewk_view_private.h: Removed. >+ * UIProcess/cairo/BackingStoreCairo.cpp: >+ (WebKit::BackingStore::incorporateUpdate): >+ * UIProcess/efl/ContextHistoryClientEfl.cpp: >+ (WebKit::ContextHistoryClientEfl::didNavigateWithNavigationData): >+ (WebKit::ContextHistoryClientEfl::didPerformClientRedirect): >+ (WebKit::ContextHistoryClientEfl::didPerformServerRedirect): >+ (WebKit::ContextHistoryClientEfl::didUpdateHistoryTitle): >+ * UIProcess/efl/PageClientBase.cpp: >+ (WebKit::PageClientBase::processDidCrash): >+ * UIProcess/efl/PageLoadClientEfl.cpp: >+ (WebKit::PageLoadClientEfl::didChangeBackForwardList): >+ * UIProcess/efl/PageUIClientEfl.cpp: >+ (WebKit::PageUIClientEfl::takeFocus): >+ (WebKit::PageUIClientEfl::focus): >+ (WebKit::PageUIClientEfl::unfocus): >+ * UIProcess/efl/WebFullScreenManagerProxyEfl.cpp: >+ (WebKit::WebFullScreenManagerProxy::enterFullScreen): >+ (WebKit::WebFullScreenManagerProxy::exitFullScreen): >+ * UIProcess/efl/WebInspectorProxyEfl.cpp: >+ (WebKit::WebInspectorProxy::platformCreateInspectorPage): >+ * UIProcess/efl/WebPageProxyEfl.cpp: >+ (WebKit::WebPageProxy::viewWidget): >+ >+2013-02-01 Mikhail Pozdnyakov <mikhail.pozdnyakov@intel.com> >+ > [EFL][WK2] EwkContext should be based on C WK2 API > https://bugs.webkit.org/show_bug.cgi?id=107666 > >diff --git a/Source/WebKit2/UIProcess/API/C/efl/WKView.cpp b/Source/WebKit2/UIProcess/API/C/efl/WKView.cpp >index 32b9d8f..e53f3da 100644 >--- a/Source/WebKit2/UIProcess/API/C/efl/WKView.cpp >+++ b/Source/WebKit2/UIProcess/API/C/efl/WKView.cpp >@@ -22,31 +22,31 @@ > > #include "EwkView.h" > #include "WKAPICast.h" >-#include "ewk_view_private.h" >+#include "ewk_context_private.h" > #include <WebKit2/WKImageCairo.h> > > using namespace WebKit; > > WKViewRef WKViewCreate(Evas* canvas, WKContextRef contextRef, WKPageGroupRef pageGroupRef) >-{ >- return toAPI(ewk_view_base_add(canvas, contextRef, pageGroupRef, EwkView::LegacyBehavior)); >+{ >+ return toAPI(EwkView::createViewObject(canvas, contextRef ? EwkContext::create(contextRef) : EwkContext::defaultContext(), pageGroupRef, EwkView::LegacyBehavior)); > } > > WKViewRef WKViewCreateWithFixedLayout(Evas* canvas, WKContextRef contextRef, WKPageGroupRef pageGroupRef) > { >- return toAPI(ewk_view_base_add(canvas, contextRef, pageGroupRef, EwkView::DefaultBehavior)); >+ return toAPI(EwkView::createViewObject(canvas, contextRef ? EwkContext::create(contextRef) : EwkContext::defaultContext(), pageGroupRef, EwkView::DefaultBehavior)); > } > > WKPageRef WKViewGetPage(WKViewRef viewRef) > { >- EwkView* view = EwkView::fromEvasObject(toImpl(viewRef)); >+ EwkView* view = toEwkView(toImpl(viewRef)); > > return view->wkPage(); > } > > WKImageRef WKViewCreateSnapshot(WKViewRef viewRef) > { >- EwkView* view = EwkView::fromEvasObject(toImpl(viewRef)); >+ EwkView* view = toEwkView(toImpl(viewRef)); > > return WKImageCreateFromCairoSurface(view->takeSnapshot().get(), 0 /* options */); > } >diff --git a/Source/WebKit2/UIProcess/API/efl/EwkView.cpp b/Source/WebKit2/UIProcess/API/efl/EwkView.cpp >index 79626e6..85b31f8 100644 >--- a/Source/WebKit2/UIProcess/API/efl/EwkView.cpp >+++ b/Source/WebKit2/UIProcess/API/efl/EwkView.cpp >@@ -27,6 +27,9 @@ > #include "FindClientEfl.h" > #include "FormClientEfl.h" > #include "InputMethodContextEfl.h" >+#include "NativeWebKeyboardEvent.h" >+#include "NativeWebMouseEvent.h" >+#include "NativeWebWheelEvent.h" > #include "PageClientBase.h" > #include "PageClientDefaultImpl.h" > #include "PageClientLegacyImpl.h" >@@ -55,7 +58,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> >@@ -64,6 +66,8 @@ > #include <WebCore/CoordinatedGraphicsScene.h> > #include <WebCore/Cursor.h> > #include <WebKit2/WKImageCairo.h> >+#include <wtf/Compiler.h> >+#include <wtf/MathExtras.h> > > #if ENABLE(VIBRATION) > #include "VibrationClientEfl.h" >@@ -81,37 +85,152 @@ using namespace EwkViewCallbacks; > using namespace WebCore; > using namespace WebKit; > >+static const char smartClassName[] = "EWK2_View"; > static const int defaultCursorSize = 16; > >-typedef HashMap<WKPageRef, Evas_Object*> PageViewMap; >+// Auxiliary functions. > >-static inline PageViewMap& pageViewMap() >+static inline void smartDataChanged(Ewk_View_Smart_Data* smartData) > { >- DEFINE_STATIC_LOCAL(PageViewMap, map, ()); >- return map; >+ ASSERT(smartData); >+ >+ if (smartData->changed.any) >+ return; >+ >+ smartData->changed.any = true; >+ evas_object_smart_changed(smartData->self); > } > >-void EwkView::addToPageViewMap(EwkView* view) >+static Evas_Smart* defaultSmartClassInstance() > { >- PageViewMap::AddResult result = pageViewMap().add(view->wkPage(), view->view()); >- ASSERT_UNUSED(result, result.isNewEntry); >+ static Ewk_View_Smart_Class api = EWK_VIEW_SMART_CLASS_INIT_NAME_VERSION("Ewk_View"); >+ static Evas_Smart* smart = 0; >+ >+ if (!smart) { >+ EwkView::initSmartClassInterface(api); >+ smart = evas_smart_class_new(&api.sc); >+ } >+ >+ return smart; > } > >-void EwkView::removeFromPageViewMap(EwkView* view) >+// EwkViewEventHandler implementation. >+ >+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) > { >- ASSERT(pageViewMap().contains(view->wkPage())); >- pageViewMap().remove(view->wkPage()); >+ 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); > } > >-const Evas_Object* EwkView::viewFromPageViewMap(const WKPageRef page) >+template <> >+void EwkViewEventHandler<EVAS_CALLBACK_MOUSE_UP>::onEvent(void* data, Evas*, Evas_Object*, void* eventInfo) > { >- ASSERT(page); >+ 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); >+} > >- return pageViewMap().get(page); >+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); >+ toEwkView(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); >+ >+ // We 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. >+ toEwkView(smartData)->page()->viewStateDidChange(WebPageProxy::ViewIsVisible); >+} >+ >+// EwkView implementation. >+ > EwkView::EwkView(Evas_Object* evasObject, PassRefPtr<EwkContext> context, PassRefPtr<WebPageGroup> pageGroup, ViewBehavior behavior) >- : m_evasObject(evasObject) >+ : m_viewObject(evasObject) > , m_context(context) > #if USE(ACCELERATED_COMPOSITING) > , m_pendingSurfaceResize(false) >@@ -142,7 +261,7 @@ EwkView::EwkView(Evas_Object* evasObject, PassRefPtr<EwkContext> context, PassRe > , m_isHardwareAccelerated(true) > , m_setDrawsBackground(false) > { >- ASSERT(m_evasObject); >+ ASSERT(m_viewObject); > ASSERT(m_context); > ASSERT(m_pageProxy); > >@@ -163,7 +282,7 @@ EwkView::EwkView(Evas_Object* evasObject, PassRefPtr<EwkContext> context, PassRe > m_pageProxy->initializeWebPage(); > > #if ENABLE(FULLSCREEN_API) >- m_pageProxy->fullScreenManager()->setWebView(m_evasObject); >+ m_pageProxy->fullScreenManager()->setWebView(m_viewObject); > m_pageProxy->pageGroup()->preferences()->setFullScreenEnabled(true); > #endif > #if ENABLE(WEB_AUDIO) >@@ -180,8 +299,6 @@ EwkView::EwkView(Evas_Object* evasObject, PassRefPtr<EwkContext> context, PassRe > ASSERT(iconDatabase); > > iconDatabase->watchChanges(IconChangeCallbackData(EwkView::onFaviconChanged, this)); >- >- EwkView::addToPageViewMap(this); > } > > EwkView::~EwkView() >@@ -193,22 +310,92 @@ EwkView::~EwkView() > ASSERT(iconDatabase); > > iconDatabase->unwatchChanges(EwkView::onFaviconChanged); >+} >+ >+Evas_Object* EwkView::createViewObject(Evas* canvas, Evas_Smart* smart, PassRefPtr<EwkContext> context, WKPageGroupRef pageGroupRef, 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); > >- EwkView::removeFromPageViewMap(this); >+ Evas_Object* viewObject = evas_object_smart_add(canvas, smart); >+ EINA_SAFETY_ON_NULL_RETURN_VAL(viewObject, 0); >+ >+ Ewk_View_Smart_Data* smartData = EwkView::smartData(viewObject); >+ if (!smartData) { >+ evas_object_del(viewObject); >+ 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(viewObject, context, toImpl(pageGroupRef), behavior); >+ return viewObject; > } > >-Ewk_View_Smart_Data* EwkView::smartData() const >+Evas_Object* EwkView::createViewObject(Evas* canvas, PassRefPtr<EwkContext> context, WKPageGroupRef pageGroupRef, ViewBehavior behavior) > { >- return static_cast<Ewk_View_Smart_Data*>(evas_object_smart_data_get(m_evasObject)); >+ return createViewObject(canvas, defaultSmartClassInstance(), context, pageGroupRef, behavior); > } > >-EwkView* EwkView::fromEvasObject(const Evas_Object* view) >+bool EwkView::initSmartClassInterface(Ewk_View_Smart_Class& api) > { >- 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; >+ 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 (!parentSmartClass.add) >+ evas_object_smart_clipped_smart_set(&parentSmartClass); >+ >+ evas_object_smart_clipped_smart_set(&api.sc); >+ >+ // Set Evas_Smart_Class interface. >+ 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 for type checking. >+ >+ // Set Ewk_View_Smart_Class interface. >+ 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; >+} >+ >+const Evas_Object* EwkView::viewObjectFromPage(WKPageRef page) >+{ >+ ASSERT(page); >+ return toImpl(page)->viewWidget(); >+} >+ >+inline Ewk_View_Smart_Data* EwkView::smartData() const >+{ >+ return smartData(m_viewObject); >+} >+ >+Ewk_View_Smart_Data* EwkView::smartData(Evas_Object* evasObject) >+{ >+ ASSERT(evasObject); >+ >+ if (!isViewObject(evasObject)) >+ return 0; >+ >+ return static_cast<Ewk_View_Smart_Data*>(evas_object_smart_data_get(evasObject)); > } > > /** >@@ -511,18 +698,18 @@ void EwkView::setImageData(void* imageData, const IntSize& size) > IntSize EwkView::size() const > { > int width, height; >- evas_object_geometry_get(m_evasObject, 0, 0, &width, &height); >+ evas_object_geometry_get(m_viewObject, 0, 0, &width, &height); > return IntSize(width, height); > } > > bool EwkView::isFocused() const > { >- return evas_object_focus_get(m_evasObject); >+ return evas_object_focus_get(m_viewObject); > } > > bool EwkView::isVisible() const > { >- return evas_object_visible_get(m_evasObject); >+ return evas_object_visible_get(m_viewObject); > } > > const char* EwkView::title() const >@@ -577,14 +764,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_viewObject); >+ EwkViewEventHandler<EVAS_CALLBACK_MOUSE_UP>::subscribe(m_viewObject); >+ EwkViewEventHandler<EVAS_CALLBACK_MOUSE_MOVE>::subscribe(m_viewObject); > } 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_viewObject); >+ EwkViewEventHandler<EVAS_CALLBACK_MOUSE_UP>::unsubscribe(m_viewObject); >+ EwkViewEventHandler<EVAS_CALLBACK_MOUSE_MOVE>::unsubscribe(m_viewObject); > } > } > >@@ -603,19 +789,19 @@ void EwkView::setTouchEventsEnabled(bool enabled) > // supports the touch events. > // See https://bugs.webkit.org/show_bug.cgi?id=97785 for details. > Ewk_View_Smart_Data* sd = smartData(); >- evas_object_event_callback_add(m_evasObject, EVAS_CALLBACK_MOUSE_DOWN, onTouchDown, sd); >- evas_object_event_callback_add(m_evasObject, EVAS_CALLBACK_MOUSE_UP, onTouchUp, sd); >- evas_object_event_callback_add(m_evasObject, EVAS_CALLBACK_MOUSE_MOVE, onTouchMove, sd); >- evas_object_event_callback_add(m_evasObject, EVAS_CALLBACK_MULTI_DOWN, onTouchDown, sd); >- evas_object_event_callback_add(m_evasObject, EVAS_CALLBACK_MULTI_UP, onTouchUp, sd); >- evas_object_event_callback_add(m_evasObject, EVAS_CALLBACK_MULTI_MOVE, onTouchMove, sd); >+ evas_object_event_callback_add(m_viewObject, EVAS_CALLBACK_MOUSE_DOWN, onTouchDown, sd); >+ evas_object_event_callback_add(m_viewObject, EVAS_CALLBACK_MOUSE_UP, onTouchUp, sd); >+ evas_object_event_callback_add(m_viewObject, EVAS_CALLBACK_MOUSE_MOVE, onTouchMove, sd); >+ evas_object_event_callback_add(m_viewObject, EVAS_CALLBACK_MULTI_DOWN, onTouchDown, sd); >+ evas_object_event_callback_add(m_viewObject, EVAS_CALLBACK_MULTI_UP, onTouchUp, sd); >+ evas_object_event_callback_add(m_viewObject, EVAS_CALLBACK_MULTI_MOVE, onTouchMove, sd); > } else { >- evas_object_event_callback_del(m_evasObject, EVAS_CALLBACK_MOUSE_DOWN, onTouchDown); >- evas_object_event_callback_del(m_evasObject, EVAS_CALLBACK_MOUSE_UP, onTouchUp); >- evas_object_event_callback_del(m_evasObject, EVAS_CALLBACK_MOUSE_MOVE, onTouchMove); >- evas_object_event_callback_del(m_evasObject, EVAS_CALLBACK_MULTI_DOWN, onTouchDown); >- evas_object_event_callback_del(m_evasObject, EVAS_CALLBACK_MULTI_UP, onTouchUp); >- evas_object_event_callback_del(m_evasObject, EVAS_CALLBACK_MULTI_MOVE, onTouchMove); >+ evas_object_event_callback_del(m_viewObject, EVAS_CALLBACK_MOUSE_DOWN, onTouchDown); >+ evas_object_event_callback_del(m_viewObject, EVAS_CALLBACK_MOUSE_UP, onTouchUp); >+ evas_object_event_callback_del(m_viewObject, EVAS_CALLBACK_MOUSE_MOVE, onTouchMove); >+ evas_object_event_callback_del(m_viewObject, EVAS_CALLBACK_MULTI_DOWN, onTouchDown); >+ evas_object_event_callback_del(m_viewObject, EVAS_CALLBACK_MULTI_UP, onTouchUp); >+ evas_object_event_callback_del(m_viewObject, EVAS_CALLBACK_MULTI_MOVE, onTouchMove); > } > } > #endif >@@ -644,7 +830,7 @@ bool EwkView::createGLSurface(const IntSize& viewSize) > return true; > > if (!m_evasGL) { >- Evas* evas = evas_object_evas_get(m_evasObject); >+ Evas* evas = evas_object_evas_get(m_viewObject); > m_evasGL = adoptPtr(evas_gl_new(evas)); > if (!m_evasGL) { > WARN("Failed to create Evas_GL, falling back to software mode."); >@@ -931,7 +1117,7 @@ WKPageRef EwkView::createNewPage(PassRefPtr<EwkUrlRequest> request, WKDictionary > if (!newEwkView) > return 0; > >- EwkView* newViewImpl = EwkView::fromEvasObject(newEwkView); >+ EwkView* newViewImpl = toEwkView(newEwkView); > ASSERT(newViewImpl); > > newViewImpl->m_windowFeatures = ewkWindowFeatures; >@@ -950,31 +1136,213 @@ 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) { >+ // Allocating with 'calloc' as the API contract is that it should be deleted with 'free()'. >+ smartData = static_cast<Ewk_View_Smart_Data*>(calloc(1, sizeof(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. >+ 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 = toEwkView(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 = toEwkView(smartData); >+ EINA_SAFETY_ON_NULL_RETURN(view); >+ >+ alpha = clampTo(alpha, 0, 255); >+ red = clampTo(red, 0, alpha); >+ green = clampTo(green, 0, alpha); >+ blue = clampTo(blue, 0, alpha); >+ >+ 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) >+{ >+ toEwkView(smartData)->page()->viewStateDidChange(WebPageProxy::ViewIsFocused | WebPageProxy::ViewWindowIsActive); >+ return true; >+} >+ >+Eina_Bool EwkView::onViewSmartFocusOut(Ewk_View_Smart_Data* smartData) >+{ >+ toEwkView(smartData)->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 = toEwkView(smartData); >+ 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 = toEwkView(smartData); >+ 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 = toEwkView(smartData); >+ 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 = toEwkView(smartData); >+ 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) >+{ >+ bool isFiltered = false; >+ EwkView* self = toEwkView(smartData); >+ 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) >+{ >+ toEwkView(smartData)->page()->handleKeyboardEvent(NativeWebKeyboardEvent(upEvent)); >+ return true; > } > > #if ENABLE(TOUCH_EVENTS) >@@ -995,7 +1363,7 @@ void EwkView::feedTouchEvents(Ewk_Touch_Event_Type type) > points = eina_list_append(points, point); > } > >- ewk_view_feed_touch_event(m_evasObject, type, points, evas_key_modifier_get(sd->base.evas)); >+ ewk_view_feed_touch_event(m_viewObject, type, points, evas_key_modifier_get(sd->base.evas)); > > void* data; > EINA_LIST_FREE(points, data) >@@ -1004,20 +1372,17 @@ void EwkView::feedTouchEvents(Ewk_Touch_Event_Type type) > > void EwkView::onTouchDown(void* /* data */, Evas* /* canvas */, Evas_Object* ewkView, void* /* eventInfo */) > { >- EwkView* view = EwkView::fromEvasObject(ewkView); >- view->feedTouchEvents(EWK_TOUCH_START); >+ toEwkView(ewkView)->feedTouchEvents(EWK_TOUCH_START); > } > > void EwkView::onTouchUp(void* /* data */, Evas* /* canvas */, Evas_Object* ewkView, void* /* eventInfo */) > { >- EwkView* view = EwkView::fromEvasObject(ewkView); >- view->feedTouchEvents(EWK_TOUCH_END); >+ toEwkView(ewkView)->feedTouchEvents(EWK_TOUCH_END); > } > > void EwkView::onTouchMove(void* /* data */, Evas* /* canvas */, Evas_Object* ewkView, void* /* eventInfo */) >-{ >- EwkView* view = EwkView::fromEvasObject(ewkView); >- view->feedTouchEvents(EWK_TOUCH_MOVE); >+{ >+ toEwkView(ewkView)->feedTouchEvents(EWK_TOUCH_MOVE); > } > #endif > >@@ -1059,3 +1424,46 @@ PassRefPtr<cairo_surface_t> EwkView::takeSnapshot() > return snapshot.release(); > #endif > } >+ >+Evas_Smart_Class EwkView::parentSmartClass = EVAS_SMART_CLASS_INIT_NULL; >+ >+// Free Ewk View functions. >+ >+EwkView* toEwkView(const Evas_Object* evasObject) >+{ >+ if (!isViewObject(evasObject)) >+ return 0; >+ >+ return toEwkView(static_cast<Ewk_View_Smart_Data*>(evas_object_smart_data_get(evasObject))); >+} >+ >+EwkView* toEwkView(const Ewk_View_Smart_Data* smartData) >+{ >+ return smartData ? smartData->priv : 0; >+} >+ >+bool isViewObject(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 (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 (UNLIKELY(!smartClass)) { >+ EINA_LOG_CRIT("%p (%s) is not a smart class object!", evasObject, evasObjectType ? evasObjectType : "(null)"); >+ return false; >+ } >+ >+ if (UNLIKELY(smartClass->data != smartClassName)) { >+ EINA_LOG_CRIT("%p (%s) is not of an ewk_view (need %p, got %p)!", evasObject, evasObjectType ? evasObjectType : "(null)", >+ smartClassName, smartClass->data); >+ return false; >+ } >+ >+ return true; >+} >diff --git a/Source/WebKit2/UIProcess/API/efl/EwkView.h b/Source/WebKit2/UIProcess/API/efl/EwkView.h >index 99ce8ed..68cc872 100644 >--- a/Source/WebKit2/UIProcess/API/efl/EwkView.h >+++ b/Source/WebKit2/UIProcess/API/efl/EwkView.h >@@ -94,6 +94,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: >@@ -102,11 +103,18 @@ 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 Evas_Object* createViewObject(Evas* canvas, Evas_Smart* smart, PassRefPtr<EwkContext> context, WKPageGroupRef pageGroupRef = 0, ViewBehavior behavior = EwkView::DefaultBehavior); >+ static Evas_Object* createViewObject(Evas* canvas, PassRefPtr<EwkContext> context, WKPageGroupRef pageGroupRef = 0, ViewBehavior behavior = EwkView::DefaultBehavior); >+ >+ static bool initSmartClassInterface(Ewk_View_Smart_Class&); >+ >+ static const Evas_Object* viewObjectFromPage(WKPageRef); >+ >+ Ewk_View_Smart_Data* smartData() const; >+ static Ewk_View_Smart_Data* smartData(Evas_Object* viewObject); >+ >+ Evas_Object* viewObject() { return m_viewObject; } > > WKPageRef wkPage(); > WebKit::WebPageProxy* page() { return m_pageProxy.get(); } >@@ -146,11 +154,7 @@ public: > void setCursor(const WebCore::Cursor& cursor); > void setImageData(void* imageData, const WebCore::IntSize& size); > >- 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); >+ void update(const WebCore::IntRect& rect = WebCore::IntRect()); > > #if ENABLE(FULLSCREEN_API) > void enterFullScreen(); >@@ -190,7 +194,7 @@ public: > template<EwkViewCallbacks::CallbackType callbackType> > EwkViewCallbacks::CallBack<callbackType> smartCallback() const > { >- return EwkViewCallbacks::CallBack<callbackType>(m_evasObject); >+ return EwkViewCallbacks::CallBack<callbackType>(m_viewObject); > } > > unsigned long long informDatabaseQuotaReached(const String& databaseName, const String& displayName, unsigned long long currentQuota, unsigned long long currentOriginUsage, unsigned long long currentDatabaseUsage, unsigned long long expectedUsage); >@@ -214,7 +218,10 @@ public: > PassRefPtr<cairo_surface_t> takeSnapshot(); > > private: >- inline Ewk_View_Smart_Data* smartData() const; >+ EwkView(Evas_Object* viewObject, PassRefPtr<EwkContext> context, PassRefPtr<WebKit::WebPageGroup> pageGroup, ViewBehavior); >+ // Will be deleted when Evas Object is deleted. >+ ~EwkView(); >+ > void displayTimerFired(WebCore::Timer<EwkView>*); > > #if USE(COORDINATED_GRAPHICS) >@@ -223,19 +230,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 interface. >+ 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 interface. >+ 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); > >+private: > // Note, initialization order matters. >- Evas_Object* m_evasObject; >+ Evas_Object* m_viewObject; > RefPtr<EwkContext> m_context; > #if USE(ACCELERATED_COMPOSITING) > OwnPtr<Evas_GL> m_evasGL; >@@ -280,6 +305,13 @@ private: > #endif > bool m_isHardwareAccelerated; > bool m_setDrawsBackground; >+ >+ static Evas_Smart_Class parentSmartClass; > }; > >+EwkView* toEwkView(const Evas_Object*); >+EwkView* toEwkView(const Ewk_View_Smart_Data* smartData); >+ >+bool isViewObject(const Evas_Object* viewObject); >+ > #endif // EwkView_h >diff --git a/Source/WebKit2/UIProcess/API/efl/ewk_view.cpp b/Source/WebKit2/UIProcess/API/efl/ewk_view.cpp >index f0cf1d6..bf8554a 100644 >--- a/Source/WebKit2/UIProcess/API/efl/ewk_view.cpp >+++ b/Source/WebKit2/UIProcess/API/efl/ewk_view.cpp >@@ -25,9 +25,6 @@ > #include "FindClientEfl.h" > #include "FormClientEfl.h" > #include "InputMethodContextEfl.h" >-#include "NativeWebKeyboardEvent.h" >-#include "NativeWebMouseEvent.h" >-#include "NativeWebWheelEvent.h" > #include "PageClientBase.h" > #include "PageLoadClientEfl.h" > #include "PagePolicyClientEfl.h" >@@ -50,7 +47,6 @@ > #include "ewk_favicon_database_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> >@@ -68,482 +64,31 @@ > 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 = toEwkView(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(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)); >+ return EwkView::createViewObject(canvas, smart, ewk_object_cast<EwkContext*>(context)); > } > > Evas_Object* ewk_view_add_with_context(Evas* canvas, Ewk_Context* context) > { >- return ewk_view_smart_add(canvas, createEwkViewSmartClass(), ewk_object_cast<EwkContext*>(context)); >+ return EwkView::createViewObject(canvas, ewk_object_cast<EwkContext*>(context)); > } > > Evas_Object* ewk_view_add(Evas* canvas) >@@ -820,8 +365,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())); > >@@ -938,6 +482,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/cairo/BackingStoreCairo.cpp b/Source/WebKit2/UIProcess/cairo/BackingStoreCairo.cpp >index efd6d32..e48df76 100644 >--- a/Source/WebKit2/UIProcess/cairo/BackingStoreCairo.cpp >+++ b/Source/WebKit2/UIProcess/cairo/BackingStoreCairo.cpp >@@ -71,7 +71,7 @@ void BackingStore::incorporateUpdate(ShareableBitmap* bitmap, const UpdateInfo& > > #if PLATFORM(EFL) > // Update ewk_view with new backingStore image. >- EwkView* view = EwkView::fromEvasObject(m_webPageProxy->viewWidget()); >+ EwkView* view = toEwkView(m_webPageProxy->viewWidget()); > view->setImageData(cairo_image_surface_get_data(m_backingStore->cairoSurface()), m_size); > #endif > } >diff --git a/Source/WebKit2/UIProcess/efl/ContextHistoryClientEfl.cpp b/Source/WebKit2/UIProcess/efl/ContextHistoryClientEfl.cpp >index 259e412..ac0d73f 100644 >--- a/Source/WebKit2/UIProcess/efl/ContextHistoryClientEfl.cpp >+++ b/Source/WebKit2/UIProcess/efl/ContextHistoryClientEfl.cpp >@@ -53,7 +53,7 @@ void ContextHistoryClientEfl::didNavigateWithNavigationData(WKContextRef, WKPage > return; > > RefPtr<EwkNavigationData> navigationDataEwk = EwkNavigationData::create(navigationData); >- historyClient->m_navigate(EwkView::viewFromPageViewMap(page), navigationDataEwk.get(), historyClient->m_userData); >+ historyClient->m_navigate(EwkView::viewObjectFromPage(page), navigationDataEwk.get(), historyClient->m_userData); > } > > void ContextHistoryClientEfl::didPerformClientRedirect(WKContextRef, WKPageRef page, WKURLRef sourceURL, WKURLRef destinationURL, WKFrameRef, const void* clientInfo) >@@ -66,7 +66,7 @@ void ContextHistoryClientEfl::didPerformClientRedirect(WKContextRef, WKPageRef p > WKEinaSharedString sourceURLString(sourceURL); > WKEinaSharedString destinationURLString(destinationURL); > >- historyClient->m_clientRedirect(EwkView::viewFromPageViewMap(page), sourceURLString, destinationURLString, historyClient->m_userData); >+ historyClient->m_clientRedirect(EwkView::viewObjectFromPage(page), sourceURLString, destinationURLString, historyClient->m_userData); > } > > void ContextHistoryClientEfl::didPerformServerRedirect(WKContextRef, WKPageRef page, WKURLRef sourceURL, WKURLRef destinationURL, WKFrameRef, const void* clientInfo) >@@ -79,7 +79,7 @@ void ContextHistoryClientEfl::didPerformServerRedirect(WKContextRef, WKPageRef p > WKEinaSharedString sourceURLString(sourceURL); > WKEinaSharedString destinationURLString(destinationURL); > >- historyClient->m_serverRedirect(EwkView::viewFromPageViewMap(page), sourceURLString, destinationURLString, historyClient->m_userData); >+ historyClient->m_serverRedirect(EwkView::viewObjectFromPage(page), sourceURLString, destinationURLString, historyClient->m_userData); > } > > void ContextHistoryClientEfl::didUpdateHistoryTitle(WKContextRef, WKPageRef page, WKStringRef title, WKURLRef URL, WKFrameRef, const void* clientInfo) >@@ -92,7 +92,7 @@ void ContextHistoryClientEfl::didUpdateHistoryTitle(WKContextRef, WKPageRef page > WKEinaSharedString titleString(title); > WKEinaSharedString stringURL(URL); > >- historyClient->m_titleUpdated(EwkView::viewFromPageViewMap(page), titleString, stringURL, historyClient->m_userData); >+ historyClient->m_titleUpdated(EwkView::viewObjectFromPage(page), titleString, stringURL, historyClient->m_userData); > } > > void ContextHistoryClientEfl::populateVisitedLinks(WKContextRef, const void* clientInfo) >diff --git a/Source/WebKit2/UIProcess/efl/PageClientBase.cpp b/Source/WebKit2/UIProcess/efl/PageClientBase.cpp >index 568e4ae..d89a51f 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->viewObject()); > 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->viewObject(), "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 599be34..8c3e712 100644 >--- a/Source/WebKit2/UIProcess/efl/PageLoadClientEfl.cpp >+++ b/Source/WebKit2/UIProcess/efl/PageLoadClientEfl.cpp >@@ -127,7 +127,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->viewObject()); > ASSERT(list); > list->update(addedItem, removedItems); > >diff --git a/Source/WebKit2/UIProcess/efl/PageUIClientEfl.cpp b/Source/WebKit2/UIProcess/efl/PageUIClientEfl.cpp >index 1e008c4..9973b30 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->viewObject(), 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->viewObject(), 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->viewObject(), false); > } > > void PageUIClientEfl::runJavaScriptAlert(WKPageRef, WKStringRef alertText, WKFrameRef, const void* clientInfo) >diff --git a/Source/WebKit2/UIProcess/efl/WebFullScreenManagerProxyEfl.cpp b/Source/WebKit2/UIProcess/efl/WebFullScreenManagerProxyEfl.cpp >index 0050283..e6eb572 100644 >--- a/Source/WebKit2/UIProcess/efl/WebFullScreenManagerProxyEfl.cpp >+++ b/Source/WebKit2/UIProcess/efl/WebFullScreenManagerProxyEfl.cpp >@@ -57,7 +57,7 @@ void WebFullScreenManagerProxy::enterFullScreen() > return; > > willEnterFullScreen(); >- EwkView::fromEvasObject(m_webView)->enterFullScreen(); >+ toEwkView(m_webView)->enterFullScreen(); > didEnterFullScreen(); > } > >@@ -68,7 +68,7 @@ void WebFullScreenManagerProxy::exitFullScreen() > > > willExitFullScreen(); >- EwkView::fromEvasObject(m_webView)->exitFullScreen(); >+ toEwkView(m_webView)->exitFullScreen(); > didExitFullScreen(); > } > >diff --git a/Source/WebKit2/UIProcess/efl/WebInspectorProxyEfl.cpp b/Source/WebKit2/UIProcess/efl/WebInspectorProxyEfl.cpp >index 462b26d..1e277b9 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> >@@ -94,12 +94,17 @@ WebPageProxy* WebInspectorProxy::platformCreateInspectorPage() > // Gracefully fall back to software if evas_gl engine is not available. > if (!m_inspectorWindow) > #endif >- m_inspectorWindow = ecore_evas_new(0, 0, 0, initialWindowWidth, initialWindowHeight, 0); >+ m_inspectorWindow = ecore_evas_new(0, 0, 0, initialWindowWidth, initialWindowHeight, 0); > 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); >+ WKContextRef contextRef = toAPI(page()->process()->context()); >+ m_inspectorView = EwkView::createViewObject(ecore_evas_get(m_inspectorWindow), contextRef ? EwkContext::create(contextRef) : EwkContext::defaultContext(), toAPI(inspectorPageGroup()), EwkView::LegacyBehavior); >+ if (!m_inspectorView) >+ return 0; >+ >+ EwkView* inspectorViewImpl = toEwkView(m_inspectorView); >+ ASSERT(inspectorViewImpl); > 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..c69c5c2 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()->viewObject(); > } > > 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