31 #include "WebCursor.h" |
31 #include "WebCursor.h" |
32 #include "WebPopupDrawer.h" |
32 #include "WebPopupDrawer.h" |
33 #include "WebFormFillPopup.h" |
33 #include "WebFormFillPopup.h" |
34 #include "WebPageScrollHandler.h" |
34 #include "WebPageScrollHandler.h" |
35 #include "WebFepTextEditor.h" |
35 #include "WebFepTextEditor.h" |
36 #include "WebCoreFrameBridge.h" |
|
37 #include "StaticObjectsContainer.h" |
|
38 #include "PluginSkin.h" |
36 #include "PluginSkin.h" |
39 #include "WebUtil.h" |
37 #include "WebUtil.h" |
40 #include "Element.h" |
|
41 #include "Document.h" |
|
42 #include "Frame.h" |
|
43 #include "FrameView.h" |
|
44 #include "EventHandler.h" |
|
45 #include "EventNames.h" |
|
46 #include "HitTestResult.h" |
|
47 #include "MouseEvent.h" |
|
48 #include "WebPageFullScreenHandler.h" |
38 #include "WebPageFullScreenHandler.h" |
49 #include "PluginSkin.h" |
|
50 #include "PluginWin.h" |
39 #include "PluginWin.h" |
51 #include "WebFrameBridge.h" |
40 #include "WebFrameBridge.h" |
52 #include "Page.h" |
41 #include "Page.h" |
53 #include "Chrome.h" |
42 #include "Chrome.h" |
54 #include "ChromeClient.h" |
43 #include "ChromeClient.h" |
59 #include "WebGestureInterface.h" |
48 #include "WebGestureInterface.h" |
60 #include "WebPagePinchZoomHandler.h" |
49 #include "WebPagePinchZoomHandler.h" |
61 #include "WebScrollingDeceleratorGH.h" |
50 #include "WebScrollingDeceleratorGH.h" |
62 |
51 |
63 #include "WebKitLogger.h" |
52 #include "WebKitLogger.h" |
64 using namespace WebCore; |
53 |
65 using namespace EventNames; |
|
66 |
|
67 static const int KMinScrollAndTapInterval = 200000; // 200 ms |
|
68 static const int KDoubleTapMinActivationInterval = 100000; // 100 ms |
|
69 static const int KDoubleTapMaxActivationInterval = 500000; // 500 ms |
|
70 static const int KDoubleTapIdleInterval = 700000; // 700 ms, to prevent triple-tap effects |
|
71 #define IS_NAVIGATION_NONE (m_webview->brCtl()->settings()->getNavigationType() == SettingsContainer::NavigationTypeNone) |
54 #define IS_NAVIGATION_NONE (m_webview->brCtl()->settings()->getNavigationType() == SettingsContainer::NavigationTypeNone) |
72 #define IS_TABBED_NAVIGATION (m_webview->brCtl()->settings()->getNavigationType() == SettingsContainer::NavigationTypeTabbed) |
55 #define IS_TABBED_NAVIGATION (m_webview->brCtl()->settings()->getNavigationType() == SettingsContainer::NavigationTypeTabbed) |
73 |
56 |
74 //----------------------------------------------------------------------------- |
57 //----------------------------------------------------------------------------- |
75 // WebPointerEventHandler::NewL |
58 // WebPointerEventHandler::NewL |
88 //----------------------------------------------------------------------------- |
71 //----------------------------------------------------------------------------- |
89 WebPointerEventHandler::WebPointerEventHandler(WebView* view) |
72 WebPointerEventHandler::WebPointerEventHandler(WebView* view) |
90 : m_webview(view), |
73 : m_webview(view), |
91 m_isHighlighted(false), |
74 m_isHighlighted(false), |
92 m_highlightedNode(NULL), |
75 m_highlightedNode(NULL), |
93 m_buttonDownTimer( this, &WebPointerEventHandler::buttonDownTimerCB ), |
|
94 m_ignoreTap(false), |
76 m_ignoreTap(false), |
95 m_gestureInterface(NULL) |
77 m_gestureInterface(NULL) |
96 { |
78 { |
97 } |
79 } |
98 |
80 |
100 // WebPointerEventHandler::~WebPointerEventHandler |
82 // WebPointerEventHandler::~WebPointerEventHandler |
101 //----------------------------------------------------------------------------- |
83 //----------------------------------------------------------------------------- |
102 WebPointerEventHandler::~WebPointerEventHandler() |
84 WebPointerEventHandler::~WebPointerEventHandler() |
103 { |
85 { |
104 delete m_gestureInterface; |
86 delete m_gestureInterface; |
105 delete m_waiter; |
|
106 } |
87 } |
107 |
88 |
108 //----------------------------------------------------------------------------- |
89 //----------------------------------------------------------------------------- |
109 // WebPointerEventHandler::ConstructL |
90 // WebPointerEventHandler::ConstructL |
110 //----------------------------------------------------------------------------- |
91 //----------------------------------------------------------------------------- |
113 #ifdef BRDO_USE_GESTURE_HELPER |
94 #ifdef BRDO_USE_GESTURE_HELPER |
114 m_gestureInterface = WebGestureInterface::NewL(m_webview); |
95 m_gestureInterface = WebGestureInterface::NewL(m_webview); |
115 #else |
96 #else |
116 m_gestureInterface = NULL; |
97 m_gestureInterface = NULL; |
117 #endif |
98 #endif |
118 m_waiter = new(ELeave) CActiveSchedulerWait(); |
|
119 } |
99 } |
120 |
100 |
121 |
101 |
122 // ====================================================================== |
102 // ====================================================================== |
123 // WebPointerEventHandler::HandleGestureEventL |
103 // WebPointerEventHandler::HandleGestureEventL |
182 |
162 |
183 case stmGesture::EGestureUidRelease: |
163 case stmGesture::EGestureUidRelease: |
184 { |
164 { |
185 m_ignoreTap = false; |
165 m_ignoreTap = false; |
186 handleTouchUp(aGesture); |
166 handleTouchUp(aGesture); |
|
167 m_webview->setScrolling(false); |
187 break; |
168 break; |
188 } |
169 } |
189 |
170 |
190 case stmGesture::EGestureUidPan: |
171 case stmGesture::EGestureUidPan: |
191 { |
172 { |
|
173 if(!m_webview->isScrolling()) |
|
174 m_webview->setScrolling(true); |
192 handleMove(aGesture); |
175 handleMove(aGesture); |
193 break; |
176 break; |
194 } |
177 } |
195 case stmGesture::EGestureUidFlick: |
178 case stmGesture::EGestureUidFlick: |
196 { |
179 { |
224 // ====================================================================== |
207 // ====================================================================== |
225 // WebPointerEventHandler::handleTap |
208 // WebPointerEventHandler::handleTap |
226 // ====================================================================== |
209 // ====================================================================== |
227 void WebPointerEventHandler::handleTapL(const TStmGestureEvent& aGesture) |
210 void WebPointerEventHandler::handleTapL(const TStmGestureEvent& aGesture) |
228 { |
211 { |
229 m_buttonDownTimer.stop(); |
|
230 m_lastTapEvent = m_currentEvent; |
212 m_lastTapEvent = m_currentEvent; |
231 if(!m_webview->inPageViewMode()){ |
213 if(!m_webview->inPageViewMode()){ |
232 doTapL(); |
214 doTapL(); |
233 } |
215 } |
234 } |
216 } |
258 PluginHandler* pluginHandler = WebCore::StaticObjectsContainer::instance()->pluginHandler(); |
240 PluginHandler* pluginHandler = WebCore::StaticObjectsContainer::instance()->pluginHandler(); |
259 PluginSkin* pluginToActivate = pluginHandler->pluginToActivate(); |
241 PluginSkin* pluginToActivate = pluginHandler->pluginToActivate(); |
260 m_buttonDownEvent = m_currentEvent; |
242 m_buttonDownEvent = m_currentEvent; |
261 m_highlightPos = aGesture.CurrentPos(); |
243 m_highlightPos = aGesture.CurrentPos(); |
262 |
244 |
263 if ( !m_buttonDownTimer.isActive() && !m_webview->inPageViewMode()){ |
|
264 m_buttonDownTimer.startOneShot(0.1f); |
|
265 } |
|
266 |
245 |
267 if (!IS_NAVIGATION_NONE) { |
246 if (!IS_NAVIGATION_NONE) { |
268 m_webview->pageScrollHandler()->handleTouchDownGH(aGesture); |
247 m_webview->pageScrollHandler()->handleTouchDownGH(aGesture); |
269 } |
248 } |
270 |
249 |
277 else { |
256 else { |
278 plugin->pluginWin()->HandlePointerEventL(m_buttonDownEvent); |
257 plugin->pluginWin()->HandlePointerEventL(m_buttonDownEvent); |
279 } |
258 } |
280 } |
259 } |
281 } |
260 } |
282 |
261 |
283 /* |
262 doTouchDownL(); |
284 * After introducing "link selection" pointer down action is done in |
|
285 * buttondown timer callback. When "down" gesture event is arrived we start |
|
286 * timer end exit, so gesture helper is ready to deliver next gesture event. |
|
287 * Meanwhile the processing of the first gesture event hasn't been finished yet. |
|
288 * The gesture helper doesn't "know" about our plans to handle the event inside |
|
289 * timer callback and only way for us to "tell" about this is to stop RunL() |
|
290 * of CGestureEventSender (HandleGestureL() is inside it) and finish buttondown |
|
291 * timer callback first. |
|
292 */ |
|
293 if ( m_buttonDownTimer.isActive()){ |
|
294 m_waiter->Start(); |
|
295 } |
|
296 } |
263 } |
297 |
264 |
298 // ====================================================================== |
265 // ====================================================================== |
299 // WebPointerEventHandler::handleTouchUp |
266 // WebPointerEventHandler::handleTouchUp |
300 // ====================================================================== |
267 // ====================================================================== |
316 { |
283 { |
317 TBrCtlDefs::TBrCtlElementType elType = m_webview->focusedElementType(); |
284 TBrCtlDefs::TBrCtlElementType elType = m_webview->focusedElementType(); |
318 TPoint curPos = aGesture.CurrentPos(); |
285 TPoint curPos = aGesture.CurrentPos(); |
319 PluginHandler* pluginHandler = WebCore::StaticObjectsContainer::instance()->pluginHandler(); |
286 PluginHandler* pluginHandler = WebCore::StaticObjectsContainer::instance()->pluginHandler(); |
320 pluginHandler->setPluginToActivate(NULL); |
287 pluginHandler->setPluginToActivate(NULL); |
321 m_buttonDownTimer.stop(); |
288 |
322 if (IS_NAVIGATION_NONE) { |
289 if (IS_NAVIGATION_NONE) { |
323 Frame* frm = m_webview->page()->focusController()->focusedOrMainFrame(); |
290 Frame* frm = m_webview->page()->focusController()->focusedOrMainFrame(); |
324 m_webview->sendMouseEventToEngine(TPointerEvent::EMove, curPos, frm); |
291 m_webview->sendMouseEventToEngine(TPointerEvent::EMove, curPos, frm); |
325 } |
292 } |
326 else { |
293 else { |
376 |
343 |
377 if (!canDehighlight(aPoint)) return; |
344 if (!canDehighlight(aPoint)) return; |
378 |
345 |
379 dehighlight(); |
346 dehighlight(); |
380 } |
347 } |
381 |
|
382 //----------------------------------------------------------------------------- |
|
383 // WebPointerEventHandler::checkForEventListener |
|
384 //----------------------------------------------------------------------------- |
|
385 bool WebPointerEventHandler::checkForEventListener(WebCore::Node* node) |
|
386 { |
|
387 EventTargetNode* etnfound = NULL; |
|
388 for (Node* np = node; np; np = np->parentNode()) { |
|
389 //check for a mouseover event listener |
|
390 if (np->isEventTargetNode()) { |
|
391 if (m_webview->page()->chrome()->client()->elementVisibilityChanged()) { |
|
392 return true; |
|
393 } |
|
394 } |
|
395 } |
|
396 return false; |
|
397 } |
|
398 |
|
399 |
348 |
400 //----------------------------------------------------------------------------- |
349 //----------------------------------------------------------------------------- |
401 // WebPointerEventHandler::highlitableElement |
350 // WebPointerEventHandler::highlitableElement |
402 //----------------------------------------------------------------------------- |
351 //----------------------------------------------------------------------------- |
403 TBrCtlDefs::TBrCtlElementType WebPointerEventHandler::highlitableElement() |
352 TBrCtlDefs::TBrCtlElementType WebPointerEventHandler::highlitableElement() |
582 |
531 |
583 |
532 |
584 //----------------------------------------------------------------------------- |
533 //----------------------------------------------------------------------------- |
585 // WebPointerEventHandler::buttonDownTimerCallback |
534 // WebPointerEventHandler::buttonDownTimerCallback |
586 //----------------------------------------------------------------------------- |
535 //----------------------------------------------------------------------------- |
587 void WebPointerEventHandler::buttonDownTimerCB(Timer<WebPointerEventHandler>* t) |
536 void WebPointerEventHandler::doTouchDownL() |
588 { |
537 { |
589 m_buttonDownTimer.stop(); |
|
590 |
|
591 Frame* coreFrame = core(m_webview->mainFrame()); |
538 Frame* coreFrame = core(m_webview->mainFrame()); |
592 TPointerEvent event; |
539 TPointerEvent event; |
593 |
540 |
594 TBrCtlDefs::TBrCtlElementType elType = highlitableElement(); |
541 TBrCtlDefs::TBrCtlElementType elType = highlitableElement(); |
595 |
542 |
605 * wouldn't do anything and setEditable won't be called. |
552 * wouldn't do anything and setEditable won't be called. |
606 * So we are setting focused node to NULL here and let mouse event handler |
553 * So we are setting focused node to NULL here and let mouse event handler |
607 * set it through FocuseController::setFocusedNode() |
554 * set it through FocuseController::setFocusedNode() |
608 */ |
555 */ |
609 if (IS_TABBED_NAVIGATION && |
556 if (IS_TABBED_NAVIGATION && |
610 elType == TBrCtlDefs::EElementInputBox || |
557 (elType == TBrCtlDefs::EElementInputBox || elType == TBrCtlDefs::EElementTextAreaBox)) { |
611 elType == TBrCtlDefs::EElementTextAreaBox) { |
558 coreFrame->document()->setFocusedNode(NULL); |
612 coreFrame->document()->setFocusedNode(NULL); |
|
613 } |
559 } |
614 |
560 |
615 if (!IS_NAVIGATION_NONE) { |
561 if (!IS_NAVIGATION_NONE) { |
616 m_webview->sendMouseEventToEngine(TPointerEvent::EMove, m_highlightPos, coreFrame); |
562 m_webview->sendMouseEventToEngine(TPointerEvent::EMove, m_highlightPos, coreFrame); |
617 } |
563 } |
618 else { |
564 else { |
619 m_webview->sendMouseEventToEngine(TPointerEvent::EButton1Down, m_highlightPos, coreFrame); |
565 m_webview->sendMouseEventToEngine(TPointerEvent::EButton1Down, m_highlightPos, coreFrame); |
620 } |
566 } |
621 |
567 |
622 if (m_waiter->IsStarted()) { |
|
623 m_waiter->AsyncStop(); |
|
624 } |
|
625 } |
568 } |
626 |
569 |
627 |
570 |
628 //----------------------------------------------------------------------------- |
571 //----------------------------------------------------------------------------- |
629 // WebPointerEventHandler::updateCursor |
572 // WebPointerEventHandler::updateCursor |