void ScreenReaderProxy::enable(EwkViewImpl* viewImpl)
{
- Evas_Object* accesibleObject = elm_access_object_get(viewImpl->view());
- if (!accesibleObject)
+ Evas_Object* accessObject = elm_access_object_get(viewImpl->view());
+ if (!accessObject)
return;
- elm_access_action_cb_set(accesibleObject, ELM_ACCESS_ACTION_HIGHLIGHT, highlightHandler, viewImpl);
- elm_access_action_cb_set(accesibleObject, ELM_ACCESS_ACTION_UNHIGHLIGHT, unhighlightHandler, viewImpl);
- elm_access_action_cb_set(accesibleObject, ELM_ACCESS_ACTION_HIGHLIGHT_NEXT, highlightNextHandler, viewImpl);
- elm_access_action_cb_set(accesibleObject, ELM_ACCESS_ACTION_HIGHLIGHT_PREV, highlightPrevHandler, viewImpl);
- elm_access_action_cb_set(accesibleObject, ELM_ACCESS_ACTION_ACTIVATE, activateHandler, viewImpl);
- elm_access_action_cb_set(accesibleObject, ELM_ACCESS_ACTION_READ, readHandler, viewImpl);
+ elm_access_action_cb_set(accessObject, ELM_ACCESS_ACTION_HIGHLIGHT, highlightHandler, viewImpl);
+ elm_access_action_cb_set(accessObject, ELM_ACCESS_ACTION_UNHIGHLIGHT, unhighlightHandler, viewImpl);
+ elm_access_action_cb_set(accessObject, ELM_ACCESS_ACTION_HIGHLIGHT_NEXT, highlightNextHandler, viewImpl);
+ elm_access_action_cb_set(accessObject, ELM_ACCESS_ACTION_HIGHLIGHT_PREV, highlightPrevHandler, viewImpl);
+ elm_access_action_cb_set(accessObject, ELM_ACCESS_ACTION_ACTIVATE, activateHandler, viewImpl);
+ elm_access_action_cb_set(accessObject, ELM_ACCESS_ACTION_SCROLL, scrollHandler, viewImpl);
+ elm_access_action_cb_set(accessObject, ELM_ACCESS_ACTION_MOUSE, mouseHandler, viewImpl);
+ elm_access_action_cb_set(accessObject, ELM_ACCESS_ACTION_UP, upHandler, viewImpl);
+ elm_access_action_cb_set(accessObject, ELM_ACCESS_ACTION_DOWN, downHandler, viewImpl);
+ elm_access_action_cb_set(accessObject, ELM_ACCESS_ACTION_BACK, backHandler, viewImpl);
+ elm_access_action_cb_set(accessObject, ELM_ACCESS_ACTION_READ, readHandler, viewImpl);
addViewImpl(viewImpl);
}
void ScreenReaderProxy::disable(EwkViewImpl* viewImpl)
{
- Evas_Object* accesibleObject = elm_access_object_get(viewImpl->view());
- if (accesibleObject) {
- elm_access_action_cb_set(accesibleObject, ELM_ACCESS_ACTION_HIGHLIGHT, 0, 0);
- elm_access_action_cb_set(accesibleObject, ELM_ACCESS_ACTION_UNHIGHLIGHT, 0, 0);
- elm_access_action_cb_set(accesibleObject, ELM_ACCESS_ACTION_HIGHLIGHT_NEXT, 0, 0);
- elm_access_action_cb_set(accesibleObject, ELM_ACCESS_ACTION_HIGHLIGHT_PREV, 0, 0);
- elm_access_action_cb_set(accesibleObject, ELM_ACCESS_ACTION_ACTIVATE, 0, 0);
- elm_access_action_cb_set(accesibleObject, ELM_ACCESS_ACTION_READ, 0, 0);
+ Evas_Object* accessObject = elm_access_object_get(viewImpl->view());
+ if (accessObject) {
+ elm_access_action_cb_set(accessObject, ELM_ACCESS_ACTION_HIGHLIGHT, 0, 0);
+ elm_access_action_cb_set(accessObject, ELM_ACCESS_ACTION_UNHIGHLIGHT, 0, 0);
+ elm_access_action_cb_set(accessObject, ELM_ACCESS_ACTION_HIGHLIGHT_NEXT, 0, 0);
+ elm_access_action_cb_set(accessObject, ELM_ACCESS_ACTION_HIGHLIGHT_PREV, 0, 0);
+ elm_access_action_cb_set(accessObject, ELM_ACCESS_ACTION_ACTIVATE, 0, 0);
+ elm_access_action_cb_set(accessObject, ELM_ACCESS_ACTION_SCROLL, 0, 0);
+ elm_access_action_cb_set(accessObject, ELM_ACCESS_ACTION_MOUSE, 0, 0);
+ elm_access_action_cb_set(accessObject, ELM_ACCESS_ACTION_UP, 0, 0);
+ elm_access_action_cb_set(accessObject, ELM_ACCESS_ACTION_DOWN, 0, 0);
+ elm_access_action_cb_set(accessObject, ELM_ACCESS_ACTION_BACK, 0, 0);
+ elm_access_action_cb_set(accessObject, ELM_ACCESS_ACTION_READ, 0, 0);
}
removeViewImpl(viewImpl);
{
addViewImpl(viewImpl);
- if (actionInfo->action_type == ELM_ACCESS_ACTION_HIGHLIGHT_NEXT) {
- if (!viewImpl->page()->moveScreenReaderFocus(true))
- return false;
- } else if (actionInfo->action_type == ELM_ACCESS_ACTION_HIGHLIGHT_PREV) {
- if (!viewImpl->page()->moveScreenReaderFocus(false))
- return false;
- } else if (actionInfo->action_type == ELM_ACCESS_ACTION_READ) {
- IntPoint localPoint = viewImpl->transformFromScene().mapPoint(IntPoint(actionInfo->x, actionInfo->y));
- viewImpl->page()->moveScreenReaderFocusByPoint(localPoint);
- } else if (actionInfo->action_type == ELM_ACCESS_ACTION_ACTIVATE) {
- IntPoint point(viewImpl->focusRing->centerPointInScreen());
- if (point.x() < 0 || point.y() < 0)
- return false;
-
- point = viewImpl->transformFromScene().mapPoint(point);
- viewImpl->page()->raiseTapEvent(point);
- }
+ if (actionInfo->action_type == ELM_ACCESS_ACTION_UNHIGHLIGHT)
+ unhighlightHandler(viewImpl, 0, 0);
+ else if (actionInfo->action_type == ELM_ACCESS_ACTION_HIGHLIGHT_NEXT)
+ return highlightNextHandler(viewImpl, 0, 0);
+ else if (actionInfo->action_type == ELM_ACCESS_ACTION_HIGHLIGHT_PREV)
+ return highlightPrevHandler(viewImpl, 0, 0);
+ else if (actionInfo->action_type == ELM_ACCESS_ACTION_ACTIVATE)
+ activateHandler(viewImpl, 0, 0);
+ else if (actionInfo->action_type == ELM_ACCESS_ACTION_SCROLL)
+ scrollHandler(viewImpl, 0, actionInfo);
+ else if (actionInfo->action_type == ELM_ACCESS_ACTION_MOUSE)
+ mouseHandler(viewImpl, 0, actionInfo);
+ else if (actionInfo->action_type == ELM_ACCESS_ACTION_UP)
+ upHandler(viewImpl, 0, 0);
+ else if (actionInfo->action_type == ELM_ACCESS_ACTION_DOWN)
+ downHandler(viewImpl, 0, 0);
+ else if (actionInfo->action_type == ELM_ACCESS_ACTION_BACK)
+ backHandler(viewImpl, 0, 0);
+ else if (actionInfo->action_type == ELM_ACCESS_ACTION_READ)
+ readHandler(viewImpl, 0, actionInfo);
return true;
}
if (!actionInfo)
return false;
- if (actionInfo->action_type == ELM_ACCESS_ACTION_HIGHLIGHT_NEXT)
+ if (actionInfo->action_by == ELM_ACCESS_ACTION_HIGHLIGHT_NEXT)
return highlightNextHandler(data, 0, 0);
- if (actionInfo->action_type == ELM_ACCESS_ACTION_HIGHLIGHT_PREV)
+ if (actionInfo->action_by == ELM_ACCESS_ACTION_HIGHLIGHT_PREV)
return highlightPrevHandler(data, 0, 0);
return true;
{
EwkViewImpl* viewImpl = static_cast<EwkViewImpl*>(data);
+ viewImpl->page()->clearScreenReader();
viewImpl->focusRing->hide(false);
tts_stop(screenReader().m_ttsHandle);
if (point.x() < 0 || point.y() < 0)
return false;
- viewImpl->page()->raiseTapEvent(viewImpl->transformFromScene().mapPoint(point));
+ if (viewImpl->page()->raiseTapEvent(viewImpl->transformFromScene().mapPoint(point)) && viewImpl->page()->isViewVisible())
+ evas_object_focus_set(viewImpl->view(), true);
+
+ return true;
+}
+
+Eina_Bool ScreenReaderProxy::scrollHandler(void* data, Evas_Object*, Elm_Access_Action_Info* actionInfo)
+{
+ if (!actionInfo)
+ return false;
+
+ EwkViewImpl* viewImpl = static_cast<EwkViewImpl*>(data);
+
+ if (actionInfo->mouse_type == 0) {
+ viewImpl->gestureClient->reset();
+ viewImpl->gestureClient->setGestureEnabled(true);
+ viewImpl->gestureClient->setMovingEnabled(true);
+ viewImpl->gestureClient->startPan(IntPoint(actionInfo->x, actionInfo->y));
+ } else if (actionInfo->mouse_type == 1)
+ viewImpl->gestureClient->movePan(IntPoint(actionInfo->x, actionInfo->y));
+ else if (actionInfo->mouse_type == 2)
+ viewImpl->gestureClient->endPan(IntPoint(actionInfo->x, actionInfo->y));
+
+ return true;
+}
+
+Eina_Bool ScreenReaderProxy::mouseHandler(void* data, Evas_Object*, Elm_Access_Action_Info* actionInfo)
+{
+ return scrollHandler(data, 0, actionInfo);
+}
+
+Eina_Bool ScreenReaderProxy::upHandler(void* data, Evas_Object*, Elm_Access_Action_Info*)
+{
+ EwkViewImpl* viewImpl = static_cast<EwkViewImpl*>(data);
+ viewImpl->page()->adjustScreenReaderFocusedObjectValue(true);
+
+ return true;
+}
+
+Eina_Bool ScreenReaderProxy::downHandler(void* data, Evas_Object*, Elm_Access_Action_Info*)
+{
+ EwkViewImpl* viewImpl = static_cast<EwkViewImpl*>(data);
+ viewImpl->page()->adjustScreenReaderFocusedObjectValue(false);
+
+ return true;
+}
+
+Eina_Bool ScreenReaderProxy::backHandler(void* data, Evas_Object*, Elm_Access_Action_Info*)
+{
+ EwkViewImpl* viewImpl = static_cast<EwkViewImpl*>(data);
+ if (!viewImpl->pageProxy->canGoBack())
+ return false;
+ viewImpl->pageProxy->goBack();
return true;
}
#endif
#if ENABLE(TIZEN_SCREEN_READER)
-void WebPage::raiseTapEvent(const IntPoint& position, const IntPoint& globalPosition)
-{
- Frame* frame = m_page->mainFrame();
- if (!frame->view())
- return;
-
- Vector<WebPlatformTouchPoint> touchPoints;
- touchPoints.append(WebPlatformTouchPoint(0, WebPlatformTouchPoint::TouchPressed, globalPosition, position));
-
- WebTouchEvent touchStartEvent(WebEvent::TouchStart, touchPoints, WebEvent::Modifiers(0), ecore_time_get());
- if (!frame->eventHandler()->handleTouchEvent(platform(touchStartEvent))) {
- WebGestureEvent gestureEvent(WebEvent::GestureSingleTap, position, globalPosition, WebEvent::Modifiers(0), ecore_time_get());
- frame->eventHandler()->handleGestureEvent(platform(gestureEvent));
- }
-
- touchPoints.at(0).setState(WebPlatformTouchPoint::TouchReleased);
- WebTouchEvent touchEndEvent(WebEvent::TouchEnd, touchPoints, WebEvent::Modifiers(0), ecore_time_get());
- frame->eventHandler()->handleTouchEvent(platform(touchEndEvent));
-}
-
static void sendScreenReaderFocusRect(WebPage* page, Node* node)
{
bool isImage = false;
sendScreenReaderFocusRect(this, m_screenReader->getFocusedNode());
}
+void WebPage::clearScreenReaderFocus()
+{
+ if (!m_screenReader)
+ return;
+
+ m_screenReader->clearFocus();
+}
+
+void WebPage::raiseTapEvent(const IntPoint& position, const IntPoint& globalPosition, bool& result)
+{
+ result = false;
+
+#if ENABLE(GESTURE_EVENTS)
+ Frame* frame = m_page->mainFrame();
+ if (!frame->view())
+ return;
+
+ Vector<WebPlatformTouchPoint> touchPoints;
+ touchPoints.append(WebPlatformTouchPoint(0, WebPlatformTouchPoint::TouchPressed, globalPosition, position));
+
+ WebTouchEvent touchStartEvent(WebEvent::TouchStart, touchPoints, WebEvent::Modifiers(0), ecore_time_get());
+ bool handled = frame->eventHandler()->handleTouchEvent(platform(touchStartEvent));
+
+ touchPoints.at(0).setState(WebPlatformTouchPoint::TouchReleased);
+
+ WebTouchEvent touchEndEvent(WebEvent::TouchEnd, touchPoints, WebEvent::Modifiers(0), ecore_time_get());
+ handled |= frame->eventHandler()->handleTouchEvent(platform(touchEndEvent));
+
+ if (!handled) {
+ WebGestureEvent gestureEvent(WebEvent::GestureSingleTap, position, globalPosition, WebEvent::Modifiers(0), ecore_time_get());
+ frame->eventHandler()->handleGestureEvent(platform(gestureEvent));
+ result = true;
+ }
+#endif
+}
+
+void WebPage::adjustScreenReaderFocusedObjectValue(bool up)
+{
+ if (!m_screenReader || !m_screenReader->getFocusedNode() || !m_screenReader->getFocusedNode()->toInputElement())
+ return;
+
+ ExceptionCode ec;
+ if (up)
+ m_screenReader->getFocusedNode()->toInputElement()->stepUp(ec);
+ else
+ m_screenReader->getFocusedNode()->toInputElement()->stepDown(ec);
+}
+
void WebPage::recalcScreenReaderFocusRect()
{
if (!m_screenReader || !m_screenReader->getFocusedNode())