summary |
shortlog |
log |
commit | commitdiff |
tree
raw |
patch |
inline | side by side (from parent 1:
b8bed24)
[Title] Fixed when user tap on linkable contents, somtimes focus ring is not shown.
[Issue#] P130508-1455
[Problem] When user tap on linkable contents, somtimes focus ring is not shown
[Cause] 1. When user tap quickly, hide() function was called before show() function is called by timer for showing focus ring.
- timing issue
2. When user tap any point that is not linkable contents around linkable contents,
tap operation is worked by touch adjust feature and focus ring is not shown.
[Solution] 1. Added routine to call hide() function by timer.
2. Added touch adjust feature to routine for getting focus ring rect.
Change-Id: I56263a00a5e1f3a42cfb7522a1541bb623066005
impl->focusRing->requestToShow(IntPoint(event->position.x, event->position.y));
} else if (event->type == EWK_GESTURE_PAN) {
if (impl->exceedTouchMoveThreshold)
impl->focusRing->requestToShow(IntPoint(event->position.x, event->position.y));
} else if (event->type == EWK_GESTURE_PAN) {
if (impl->exceedTouchMoveThreshold)
- impl->focusRing->hide();
+ impl->focusRing->requestToHide();
} else {
if (event->type != EWK_GESTURE_LONG_PRESS) {
#if ENABLE(TIZEN_CONTEXT_MENU_WEBKIT_2)
if (!impl->pageClient->isContextMenuVisible())
#endif
} else {
if (event->type != EWK_GESTURE_LONG_PRESS) {
#if ENABLE(TIZEN_CONTEXT_MENU_WEBKIT_2)
if (!impl->pageClient->isContextMenuVisible())
#endif
- impl->focusRing->hide();
+ impl->focusRing->requestToHide();
#if ENABLE(TIZEN_CONTEXT_MENU_WEBKIT_2)
if (!impl->pageClient->isContextMenuVisible() || impl->pageClient->isTextSelectionMode())
#endif
#if ENABLE(TIZEN_CONTEXT_MENU_WEBKIT_2)
if (!impl->pageClient->isContextMenuVisible() || impl->pageClient->isTextSelectionMode())
#endif
- impl->focusRing->hide();
+ impl->focusRing->requestToHide();
#if ENABLE(TIZEN_WEBKIT2_FOCUS_RING)
if (impl->focusRing && !(event->type == EWK_GESTURE_PAN && !impl->exceedTouchMoveThreshold))
#if ENABLE(TIZEN_WEBKIT2_FOCUS_RING)
if (impl->focusRing && !(event->type == EWK_GESTURE_PAN && !impl->exceedTouchMoveThreshold))
- impl->focusRing->hide();
+ impl->focusRing->requestToHide(true);
#endif
switch (event->type) {
#endif
switch (event->type) {
#if ENABLE(TIZEN_WEBKIT2_FOCUS_RING)
#include "PageClientImpl.h"
#if ENABLE(TIZEN_WEBKIT2_FOCUS_RING)
#include "PageClientImpl.h"
+#if ENABLE(TOUCH_ADJUSTMENT)
+#include <Elementary.h>
+#endif
+
using namespace WebKit;
using namespace WebCore;
using namespace WebKit;
using namespace WebCore;
, m_imageOuterWidth(0)
, m_imageInnerWidth(0)
, m_showTimer(0)
, m_imageOuterWidth(0)
, m_imageInnerWidth(0)
, m_showTimer(0)
if (m_showTimer)
ecore_timer_del(m_showTimer);
if (m_showTimer)
ecore_timer_del(m_showTimer);
+ if (m_hideTimer)
+ ecore_timer_del(m_hideTimer);
+
if (m_focusRingObject)
evas_object_del(m_focusRingObject);
}
if (m_focusRingObject)
evas_object_del(m_focusRingObject);
}
void FocusRing::show(const IntRect& rect, const bool includeOnlyImage)
{
void FocusRing::show(const IntRect& rect, const bool includeOnlyImage)
{
- if (rect.isEmpty())
- m_showTimer = 0;
+ if (rect.isEmpty()) {
+ if (m_showTimer) {
+ ecore_timer_del(m_showTimer);
+ m_showTimer = 0;
+ }
+ }
PageClientImpl* pageClientImpl = m_viewImpl->pageClient.get();
EINA_SAFETY_ON_NULL_RETURN(pageClientImpl);
PageClientImpl* pageClientImpl = m_viewImpl->pageClient.get();
EINA_SAFETY_ON_NULL_RETURN(pageClientImpl);
if (rect.isEmpty()) {
#if ENABLE(TIZEN_WEBKIT2_HIT_TEST)
IntPoint contentsPosition = m_viewImpl->transformFromScene().mapPoint(m_position);
if (rect.isEmpty()) {
#if ENABLE(TIZEN_WEBKIT2_HIT_TEST)
IntPoint contentsPosition = m_viewImpl->transformFromScene().mapPoint(m_position);
+#if ENABLE(TOUCH_ADJUSTMENT)
+ Evas_Coord size = elm_config_finger_size_get();
+ IntSize fingerSize = IntSize(size, size);
+#if ENABLE(TIZEN_WEBKIT2_TILED_BACKING_STORE)
+ double scaleFactor = pageClientImpl->scaleFactor();
+ if (scaleFactor - 1 > numeric_limits<float>::epsilon())
+ fingerSize.scale(1 / scaleFactor, 1 / scaleFactor);
+#endif
+ WebHitTestResult::Data hitTestResultData = m_viewImpl->page()->hitTestResultAtPoint(contentsPosition, WebHitTestResult::HitTestModeDefault, fingerSize);
+#else
WebHitTestResult::Data hitTestResultData = m_viewImpl->page()->hitTestResultAtPoint(contentsPosition);
WebHitTestResult::Data hitTestResultData = m_viewImpl->page()->hitTestResultAtPoint(contentsPosition);
if (hitTestResultData.focusedRect.isEmpty())
return;
if (hitTestResultData.focusedRect.isEmpty())
return;
evas_object_show(m_focusRingObject);
}
evas_object_show(m_focusRingObject);
}
+void FocusRing::requestToHide(bool immediately)
+{
+ if (immediately) {
+ hide();
+ return;
+ }
+
+ if (m_hideTimer)
+ ecore_timer_del(m_hideTimer);
+ m_hideTimer = ecore_timer_add((double)s_hideTimerTime/1000.0, hideTimerCallback, this);
+}
+
+Eina_Bool FocusRing::hideTimerCallback(void* data)
+{
+ static_cast<FocusRing*>(data)->hide();
+ return ECORE_CALLBACK_CANCEL;
+}
+
void FocusRing::hide(bool onlyColorDrawing)
{
if (!m_imagePath.isNull() && onlyColorDrawing)
void FocusRing::hide(bool onlyColorDrawing)
{
if (!m_imagePath.isNull() && onlyColorDrawing)
+ if (m_hideTimer) {
+ ecore_timer_del(m_hideTimer);
+ m_hideTimer = 0;
+ }
+
if (m_focusRingObject && evas_object_visible_get(m_focusRingObject))
evas_object_hide(m_focusRingObject);
if (m_focusRingObject && evas_object_visible_get(m_focusRingObject))
evas_object_hide(m_focusRingObject);
void setImage(const String&, int, int);
void requestToShow(const WebCore::IntPoint&);
void setImage(const String&, int, int);
void requestToShow(const WebCore::IntPoint&);
+ void requestToHide(bool immediately = false);
void show(const WebCore::IntRect&, const bool includeOnlyImage = false);
void hide(bool = true);
void show(const WebCore::IntRect&, const bool includeOnlyImage = false);
void hide(bool = true);
static const int s_showTimerTime = 100;
static Eina_Bool showTimerCallback(void* data);
static const int s_showTimerTime = 100;
static Eina_Bool showTimerCallback(void* data);
+ static const int s_hideTimerTime = 200;
+ static Eina_Bool hideTimerCallback(void* data);
+
private:
FocusRing(EwkViewImpl* viewImpl);
void internalShow(bool, const WebCore::IntRect&);
private:
FocusRing(EwkViewImpl* viewImpl);
void internalShow(bool, const WebCore::IntRect&);
int m_imageInnerWidth;
Ecore_Timer* m_showTimer;
int m_imageInnerWidth;
Ecore_Timer* m_showTimer;
+ Ecore_Timer* m_hideTimer;
WebCore::IntPoint m_position;
WebCore::IntRect m_rect;
WebCore::IntPoint m_position;
WebCore::IntRect m_rect;
#endif
#if ENABLE(TIZEN_WEBKIT2_HIT_TEST)
#endif
#if ENABLE(TIZEN_WEBKIT2_HIT_TEST)
+#if ENABLE(TOUCH_ADJUSTMENT)
+ WebHitTestResult::Data hitTestResultAtPoint(const WebCore::IntPoint&, int hitTestMode = WebHitTestResult::HitTestModeDefault, const WebCore::IntSize& area = WebCore::IntSize());
+#else
WebHitTestResult::Data hitTestResultAtPoint(const WebCore::IntPoint&, int hitTestMode = WebHitTestResult::HitTestModeDefault);
#endif
WebHitTestResult::Data hitTestResultAtPoint(const WebCore::IntPoint&, int hitTestMode = WebHitTestResult::HitTestModeDefault);
#endif
#if ENABLE(TIZEN_CONTEXT_MENU_WEBKIT_2)
void hideContextMenu();
String contextMenuAbsoluteLinkURLString();
#if ENABLE(TIZEN_CONTEXT_MENU_WEBKIT_2)
void hideContextMenu();
String contextMenuAbsoluteLinkURLString();
}
#if ENABLE(TIZEN_WEBKIT2_HIT_TEST)
}
#if ENABLE(TIZEN_WEBKIT2_HIT_TEST)
+#if ENABLE(TOUCH_ADJUSTMENT)
+WebHitTestResult::Data WebPageProxy::hitTestResultAtPoint(const IntPoint& point, int hitTestMode, const IntSize& area)
+#else
WebHitTestResult::Data WebPageProxy::hitTestResultAtPoint(const IntPoint& point, int hitTestMode)
WebHitTestResult::Data WebPageProxy::hitTestResultAtPoint(const IntPoint& point, int hitTestMode)
{
WebHitTestResult::Data hitTestResultData;
if (!isValid())
return hitTestResultData;
{
WebHitTestResult::Data hitTestResultData;
if (!isValid())
return hitTestResultData;
+#if ENABLE(TOUCH_ADJUSTMENT)
+ process()->sendSync(Messages::WebPage::HitTestResultAtPoint(point, hitTestMode, area),
+ Messages::WebPage::HitTestResultAtPoint::Reply(hitTestResultData), m_pageID);
+#else
process()->sendSync(Messages::WebPage::HitTestResultAtPoint(point, hitTestMode),
Messages::WebPage::HitTestResultAtPoint::Reply(hitTestResultData), m_pageID);
process()->sendSync(Messages::WebPage::HitTestResultAtPoint(point, hitTestMode),
Messages::WebPage::HitTestResultAtPoint::Reply(hitTestResultData), m_pageID);
return hitTestResultData;
}
return hitTestResultData;
}
void createPagesToPDF(const WebCore::IntSize&, const WebCore::IntSize&, const String&);
#endif
#if ENABLE(TIZEN_WEBKIT2_HIT_TEST)
void createPagesToPDF(const WebCore::IntSize&, const WebCore::IntSize&, const String&);
#endif
#if ENABLE(TIZEN_WEBKIT2_HIT_TEST)
+#if ENABLE(TOUCH_ADJUSTMENT)
+ void hitTestResultAtPoint(const WebCore::IntPoint&, int hitTestMode, const WebCore::IntSize&, WebHitTestResult::Data&);
+#else
void hitTestResultAtPoint(const WebCore::IntPoint&, int hitTestMode, WebHitTestResult::Data&);
#endif
void hitTestResultAtPoint(const WebCore::IntPoint&, int hitTestMode, WebHitTestResult::Data&);
#endif
#if ENABLE(TIZEN_WEB_STORAGE)
void getStorageQuotaBytes(uint64_t callbackID);
#if ENABLE(TIZEN_WEB_STORAGE)
void getStorageQuotaBytes(uint64_t callbackID);
RequestUpdateFormNavigation()
MoveFocus(int newIndex)
#if ENABLE(TIZEN_WEBKIT2_HIT_TEST)
RequestUpdateFormNavigation()
MoveFocus(int newIndex)
#if ENABLE(TIZEN_WEBKIT2_HIT_TEST)
+#if ENABLE(TOUCH_ADJUSTMENT)
+ HitTestResultAtPoint(WebCore::IntPoint point, int hitTestMode, WebCore::IntSize area) -> (WebKit::WebHitTestResult::Data hitTestResultData)
+#endif
+#if !ENABLE(TOUCH_ADJUSTMENT)
HitTestResultAtPoint(WebCore::IntPoint point, int hitTestMode) -> (WebKit::WebHitTestResult::Data hitTestResultData)
#endif
HitTestResultAtPoint(WebCore::IntPoint point, int hitTestMode) -> (WebKit::WebHitTestResult::Data hitTestResultData)
#endif
SuspendJavaScriptAndResources()
ResumeJavaScriptAndResources()
SuspendJavaScriptAndResources()
ResumeJavaScriptAndResources()
#if ENABLE(TIZEN_WEBKIT2_HIT_TEST)
#if ENABLE(TIZEN_WEBKIT2_FOCUS_RING)
#if ENABLE(TIZEN_WEBKIT2_HIT_TEST)
#if ENABLE(TIZEN_WEBKIT2_FOCUS_RING)
+#if ENABLE(TOUCH_ADJUSTMENT)
+static IntRect getFocusedRect(HitTestResult hitTestResult, Page* page, const IntSize& area)
+#else
static IntRect getFocusedRect(HitTestResult hitTestResult, Page* page)
static IntRect getFocusedRect(HitTestResult hitTestResult, Page* page)
{
Node* node = hitTestResult.innerNode();
{
Node* node = hitTestResult.innerNode();
+#if ENABLE(TOUCH_ADJUSTMENT)
+ Node* adjustedNode = 0;
+ IntPoint adustedPoint;
+ Frame* mainFrame = page->mainFrame();
+ mainFrame->eventHandler()->bestClickableNodeForTouchPoint(hitTestResult.roundedPoint(), IntSize(area.width() / 2, area.height() / 2), adustedPoint, adjustedNode);
+
+ if (adjustedNode)
+ node = adjustedNode;
+#endif
if (!node)
return IntRect();
if (!node)
return IntRect();
+#if ENABLE(TOUCH_ADJUSTMENT)
+void WebPage::hitTestResultAtPoint(const IntPoint& point, int hitTestMode, const IntSize& area, WebHitTestResult::Data& hitTestResultData)
+#else
void WebPage::hitTestResultAtPoint(const IntPoint& point, int hitTestMode, WebHitTestResult::Data& hitTestResultData)
void WebPage::hitTestResultAtPoint(const IntPoint& point, int hitTestMode, WebHitTestResult::Data& hitTestResultData)
{
Frame* frame = m_page->mainFrame();
FrameView* frameView = frame->view();
{
Frame* frame = m_page->mainFrame();
FrameView* frameView = frame->view();
hitTestResultData.hitTestMode = hitTestMode;
#if ENABLE(TIZEN_WEBKIT2_FOCUS_RING)
hitTestResultData.hitTestMode = hitTestMode;
#if ENABLE(TIZEN_WEBKIT2_FOCUS_RING)
+#if ENABLE(TOUCH_ADJUSTMENT)
+ hitTestResultData.focusedRect = getFocusedRect(hitTestResult, m_page.get(), area);
+#else
hitTestResultData.focusedRect = getFocusedRect(hitTestResult, m_page.get());
hitTestResultData.focusedRect = getFocusedRect(hitTestResult, m_page.get());
if (hitTestResult.innerNode() && hitTestResult.innerNode()->renderer() && hitTestResult.innerNode()->renderer()->style()) {
hitTestResultData.focusedColor = hitTestResult.innerNode()->renderer()->style()->tapHighlightColor();
if (!hitTestResultData.focusedColor.hasAlpha())
if (hitTestResult.innerNode() && hitTestResult.innerNode()->renderer() && hitTestResult.innerNode()->renderer()->style()) {
hitTestResultData.focusedColor = hitTestResult.innerNode()->renderer()->style()->tapHighlightColor();
if (!hitTestResultData.focusedColor.hasAlpha())